Merge branch 'upstream' into tizen
authorBowon Ryu <bowon.ryu@samsung.com>
Fri, 18 Feb 2022 02:42:48 +0000 (11:42 +0900)
committerBowon Ryu <bowon.ryu@samsung.com>
Fri, 18 Feb 2022 02:42:48 +0000 (11:42 +0900)
3447 files changed:
BUILD.md
CMakeLists.txt
CONFIG.md
COPYING
ChangeLog
Makefile.am
Makefile.in
NEWS
README
README.md
README.python.md
RELEASING.md
TESTING.md
aclocal.m4
ar-lib
autogen.sh
compile
config.guess
config.h.in
config.sub
configure
configure.ac
depcomp
docs/HarfBuzz.png
docs/Makefile.am
docs/Makefile.in
docs/harfbuzz-docs.xml
docs/harfbuzz-sections.txt
docs/html/HarfBuzz.png
docs/html/a-clustering-example-for-levels-0-and-1.html
docs/html/a-simple-shaping-example.html [new file with mode: 0644]
docs/html/aat-shaping.html
docs/html/adding-text-to-the-buffer.html
docs/html/annotation-glossary.html
docs/html/api-index-0-6-0.html [new file with mode: 0644]
docs/html/api-index-0-9-10.html [new file with mode: 0644]
docs/html/api-index-0-9-11.html [new file with mode: 0644]
docs/html/api-index-0-9-2.html [new file with mode: 0644]
docs/html/api-index-0-9-20.html [new file with mode: 0644]
docs/html/api-index-0-9-21.html [new file with mode: 0644]
docs/html/api-index-0-9-22.html [new file with mode: 0644]
docs/html/api-index-0-9-26.html [new file with mode: 0644]
docs/html/api-index-0-9-28.html [new file with mode: 0644]
docs/html/api-index-0-9-30.html [new file with mode: 0644]
docs/html/api-index-0-9-31.html [new file with mode: 0644]
docs/html/api-index-0-9-33.html [new file with mode: 0644]
docs/html/api-index-0-9-38.html [new file with mode: 0644]
docs/html/api-index-0-9-39.html [new file with mode: 0644]
docs/html/api-index-0-9-41.html [new file with mode: 0644]
docs/html/api-index-0-9-42.html [new file with mode: 0644]
docs/html/api-index-0-9-5.html [new file with mode: 0644]
docs/html/api-index-0-9-7.html [new file with mode: 0644]
docs/html/api-index-0-9-8.html [new file with mode: 0644]
docs/html/api-index-1-0-5.html [new file with mode: 0644]
docs/html/api-index-1-1-2.html [new file with mode: 0644]
docs/html/api-index-1-1-3.html [new file with mode: 0644]
docs/html/api-index-1-2-3.html [new file with mode: 0644]
docs/html/api-index-1-3-3.html [new file with mode: 0644]
docs/html/api-index-1-4-0.html [new file with mode: 0644]
docs/html/api-index-1-4-2.html [new file with mode: 0644]
docs/html/api-index-1-4-3.html [new file with mode: 0644]
docs/html/api-index-1-5-0.html [new file with mode: 0644]
docs/html/api-index-1-6-0.html [new file with mode: 0644]
docs/html/api-index-1-7-2.html [new file with mode: 0644]
docs/html/api-index-1-7-5.html [new file with mode: 0644]
docs/html/api-index-1-7-7.html [new file with mode: 0644]
docs/html/api-index-1-8-0.html [new file with mode: 0644]
docs/html/api-index-1-8-1.html [new file with mode: 0644]
docs/html/api-index-1-8-5.html [new file with mode: 0644]
docs/html/api-index-1-8-6.html [new file with mode: 0644]
docs/html/api-index-1-9-0.html [new file with mode: 0644]
docs/html/api-index-2-0-0.html [new file with mode: 0644]
docs/html/api-index-2-1-0.html [new file with mode: 0644]
docs/html/api-index-2-2-0.html [new file with mode: 0644]
docs/html/api-index-2-3-0.html [new file with mode: 0644]
docs/html/api-index-2-4-0.html [new file with mode: 0644]
docs/html/api-index-2-5-0.html [new file with mode: 0644]
docs/html/api-index-2-6-0.html [new file with mode: 0644]
docs/html/api-index-2-6-3.html [new file with mode: 0644]
docs/html/api-index-2-6-5.html [new file with mode: 0644]
docs/html/api-index-2-6-8.html [new file with mode: 0644]
docs/html/api-index-2-7-3.html [new file with mode: 0644]
docs/html/api-index-2-8-2.html [new file with mode: 0644]
docs/html/api-index-2-9-0.html [new file with mode: 0644]
docs/html/api-index-2-9-1.html [new file with mode: 0644]
docs/html/api-index-3-0-0.html [new file with mode: 0644]
docs/html/api-index-3-1-0.html [new file with mode: 0644]
docs/html/api-index-3-3-0.html [new file with mode: 0644]
docs/html/api-index-3-4-0.html [new file with mode: 0644]
docs/html/api-index-full.html
docs/html/apple-advanced-typography-api.html [new file with mode: 0644]
docs/html/buffers-language-script-and-direction.html
docs/html/building.html
docs/html/ch01s03.html [deleted file]
docs/html/ch03s02.html [deleted file]
docs/html/ch03s03.html [deleted file]
docs/html/ch12.html [deleted file]
docs/html/ch13.html [deleted file]
docs/html/ch14.html [deleted file]
docs/html/ch15.html [deleted file]
docs/html/clusters.html
docs/html/complex-scripts.html
docs/html/core-api.html [new file with mode: 0644]
docs/html/customizing-unicode-functions.html
docs/html/deprecated-api-index.html [new file with mode: 0644]
docs/html/fonts-and-faces-custom-functions.html
docs/html/fonts-and-faces-native-opentype.html
docs/html/fonts-and-faces-variable.html
docs/html/fonts-and-faces.html
docs/html/getting-started.html
docs/html/graphite-shaping.html
docs/html/harfbuzz-hb-aat-layout.html
docs/html/harfbuzz-hb-blob.html
docs/html/harfbuzz-hb-buffer.html
docs/html/harfbuzz-hb-common.html
docs/html/harfbuzz-hb-coretext.html
docs/html/harfbuzz-hb-deprecated.html
docs/html/harfbuzz-hb-directwrite.html [new file with mode: 0644]
docs/html/harfbuzz-hb-face.html
docs/html/harfbuzz-hb-font.html
docs/html/harfbuzz-hb-ft.html
docs/html/harfbuzz-hb-gdi.html [new file with mode: 0644]
docs/html/harfbuzz-hb-glib.html
docs/html/harfbuzz-hb-gobject.html [deleted file]
docs/html/harfbuzz-hb-graphite2.html
docs/html/harfbuzz-hb-icu.html
docs/html/harfbuzz-hb-map.html
docs/html/harfbuzz-hb-ot-color.html
docs/html/harfbuzz-hb-ot-font.html
docs/html/harfbuzz-hb-ot-layout.html
docs/html/harfbuzz-hb-ot-math.html
docs/html/harfbuzz-hb-ot-meta.html [new file with mode: 0644]
docs/html/harfbuzz-hb-ot-metrics.html [new file with mode: 0644]
docs/html/harfbuzz-hb-ot-name.html
docs/html/harfbuzz-hb-ot-shape.html
docs/html/harfbuzz-hb-ot-var.html
docs/html/harfbuzz-hb-set.html
docs/html/harfbuzz-hb-shape-plan.html
docs/html/harfbuzz-hb-shape.html
docs/html/harfbuzz-hb-style.html [new file with mode: 0644]
docs/html/harfbuzz-hb-subset.html [new file with mode: 0644]
docs/html/harfbuzz-hb-unicode.html
docs/html/harfbuzz-hb-uniscribe.html
docs/html/harfbuzz-hb-version.html
docs/html/harfbuzz.devhelp2
docs/html/home.png
docs/html/index.html
docs/html/install-harfbuzz.html
docs/html/integration-api.html [new file with mode: 0644]
docs/html/integration-coretext.html
docs/html/integration-freetype.html
docs/html/integration-icu.html
docs/html/integration-python.html
docs/html/integration-uniscribe.html
docs/html/integration.html
docs/html/left-insensitive.png
docs/html/left.png
docs/html/level-2.html
docs/html/object-model-blobs.html
docs/html/object-model-lifecycle.html
docs/html/object-model-object-types.html
docs/html/object-model-user-data.html
docs/html/object-model.html
docs/html/opentype-api.html [new file with mode: 0644]
docs/html/opentype-shaping-models.html
docs/html/pt01.html [deleted file]
docs/html/pt02.html [deleted file]
docs/html/reference-manual.html [new file with mode: 0644]
docs/html/reordering-in-levels-0-and-1.html
docs/html/right-insensitive.png
docs/html/right.png
docs/html/setting-buffer-properties.html
docs/html/shaping-and-shape-plans.html
docs/html/shaping-concepts.html
docs/html/shaping-opentype-features.html
docs/html/shaping-operations.html
docs/html/shaping-plans-and-caching.html
docs/html/shaping-shaper-selection.html
docs/html/style-api.html [new file with mode: 0644]
docs/html/subset-api.html [new file with mode: 0644]
docs/html/terminology.html [new file with mode: 0644]
docs/html/text-runs.html
docs/html/the-distinction-between-levels-0-and-1.html
docs/html/unicode-character-categories.html
docs/html/up-insensitive.png
docs/html/up.png
docs/html/user-manual.html [new file with mode: 0644]
docs/html/utilities-common-types-apis.html
docs/html/utilities-ucdn.html [deleted file]
docs/html/utilities.html
docs/html/what-does-harfbuzz-do.html [new file with mode: 0644]
docs/html/what-harfbuzz-doesnt-do.html
docs/html/what-is-harfbuzz.html
docs/html/why-do-i-need-a-shaping-engine.html
docs/html/why-is-it-called-harfbuzz.html
docs/html/working-with-harfbuzz-clusters.html
docs/meson.build
docs/usermanual-buffers-language-script-and-direction.xml
docs/usermanual-fonts-and-faces.xml
docs/usermanual-getting-started.xml
docs/usermanual-install-harfbuzz.xml
docs/usermanual-integration.xml
docs/usermanual-object-model.xml
docs/usermanual-opentype-features.xml
docs/usermanual-utilities.xml
docs/usermanual-what-is-harfbuzz.xml
docs/version.xml
install-sh
ltmain.sh
m4/libtool.m4
m4/ltoptions.m4
m4/ltsugar.m4
m4/ltversion.m4
m4/lt~obsolete.m4
meson-cc-tests/intel-atomic-primitives-test.c [deleted file]
meson-cc-tests/solaris-atomic-operations.c [deleted file]
meson.build
meson_options.txt
mingw-configure.sh [new file with mode: 0755]
missing
perf/fonts/Amiri-Regular.ttf [new file with mode: 0644]
perf/fonts/NotoNastaliqUrdu-Regular.ttf [new file with mode: 0644]
perf/fonts/NotoSansDevanagari-Regular.ttf [new file with mode: 0644]
perf/fonts/Roboto-Regular.ttf [new file with mode: 0644]
perf/meson.build [new file with mode: 0644]
perf/perf-draw.hh [new file with mode: 0644]
perf/perf-extents.hh [new file with mode: 0644]
perf/perf-shaping.hh [new file with mode: 0644]
perf/perf.cc [new file with mode: 0644]
perf/texts/en-thelittleprince.txt [new file with mode: 0644]
perf/texts/en-words.txt [new file with mode: 0644]
perf/texts/fa-monologue.txt [new file with mode: 0644]
perf/texts/fa-thelittleprince.txt [new file with mode: 0644]
src/Makefile.am
src/Makefile.in
src/Makefile.sources
src/check-c-linkage-decls.py
src/check-externs.py
src/check-header-guards.py
src/check-includes.py
src/check-libstdc++.py
src/check-static-inits.py
src/check-symbols.py
src/dump-indic-data.cc [deleted file]
src/dump-khmer-data.cc [deleted file]
src/dump-myanmar-data.cc [deleted file]
src/dump-use-data.cc [deleted file]
src/gen-arabic-joining-list.py [new file with mode: 0755]
src/gen-arabic-table.py
src/gen-def.py
src/gen-emoji-table.py
src/gen-harfbuzzcc.py
src/gen-hb-version.py
src/gen-indic-table.py
src/gen-os2-unicode-ranges.py
src/gen-ragel-artifacts.py
src/gen-tag-table.py
src/gen-ucd-table.py
src/gen-use-table.py
src/gen-vowel-constraints.py
src/harfbuzz.cc
src/hb-aat-fdsc-table.hh [deleted file]
src/hb-aat-layout-ankr-table.hh
src/hb-aat-layout-bsln-table.hh
src/hb-aat-layout-common.hh
src/hb-aat-layout-feat-table.hh
src/hb-aat-layout-just-table.hh
src/hb-aat-layout-kerx-table.hh
src/hb-aat-layout-lcar-table.hh [deleted file]
src/hb-aat-layout-morx-table.hh
src/hb-aat-layout-opbd-table.hh
src/hb-aat-layout-trak-table.hh
src/hb-aat-layout.cc
src/hb-aat-layout.h
src/hb-aat-ltag-table.hh
src/hb-algs.hh
src/hb-array.hh
src/hb-atomic.hh
src/hb-bimap.hh
src/hb-bit-page.hh [new file with mode: 0644]
src/hb-bit-set-invertible.hh [new file with mode: 0644]
src/hb-bit-set.hh [new file with mode: 0644]
src/hb-blob.cc
src/hb-blob.h
src/hb-blob.hh
src/hb-buffer-deserialize-json.hh
src/hb-buffer-deserialize-json.rl
src/hb-buffer-deserialize-text.hh
src/hb-buffer-deserialize-text.rl
src/hb-buffer-serialize.cc
src/hb-buffer-verify.cc [new file with mode: 0644]
src/hb-buffer.cc
src/hb-buffer.h
src/hb-buffer.hh
src/hb-cache.hh
src/hb-cff-interp-common.hh
src/hb-cff-interp-cs-common.hh
src/hb-cff2-interp-cs.hh
src/hb-common.cc
src/hb-common.h
src/hb-config.hh
src/hb-coretext.cc
src/hb-debug.hh
src/hb-deprecated.h
src/hb-directwrite.cc
src/hb-dispatch.hh
src/hb-draw.cc
src/hb-draw.h
src/hb-face.cc
src/hb-face.h
src/hb-face.hh
src/hb-fallback-shape.cc
src/hb-font.cc
src/hb-font.h
src/hb-font.hh
src/hb-ft.cc
src/hb-gdi.cc
src/hb-glib.cc
src/hb-gobject-enums.cc.tmpl
src/hb-gobject-enums.h.tmpl
src/hb-gobject-structs.cc
src/hb-gobject-structs.h
src/hb-graphite2.cc
src/hb-icu.cc
src/hb-iter.hh
src/hb-kern.hh
src/hb-machinery.hh
src/hb-map.cc
src/hb-map.h
src/hb-map.hh
src/hb-meta.hh
src/hb-ms-feature-ranges.hh [new file with mode: 0644]
src/hb-mutex.hh
src/hb-null.hh
src/hb-object.hh
src/hb-open-file.hh
src/hb-open-type.hh
src/hb-ot-cff-common.hh
src/hb-ot-cff1-table.cc
src/hb-ot-cff1-table.hh
src/hb-ot-cff2-table.cc
src/hb-ot-cff2-table.hh
src/hb-ot-cmap-table.hh
src/hb-ot-color-cbdt-table.hh
src/hb-ot-color-colr-table.hh
src/hb-ot-color-colrv1-closure.hh [new file with mode: 0644]
src/hb-ot-color-cpal-table.hh
src/hb-ot-color-sbix-table.hh
src/hb-ot-color-svg-table.hh
src/hb-ot-color.cc
src/hb-ot-color.h
src/hb-ot-deprecated.h
src/hb-ot-face-table-list.hh
src/hb-ot-font.cc
src/hb-ot-font.h
src/hb-ot-gasp-table.hh
src/hb-ot-glyf-table.hh
src/hb-ot-hdmx-table.hh
src/hb-ot-head-table.hh
src/hb-ot-hmtx-table.hh
src/hb-ot-kern-table.hh
src/hb-ot-layout-base-table.hh
src/hb-ot-layout-common.hh
src/hb-ot-layout-gdef-table.hh
src/hb-ot-layout-gpos-table.hh
src/hb-ot-layout-gsub-table.hh
src/hb-ot-layout-gsubgpos.hh
src/hb-ot-layout-jstf-table.hh
src/hb-ot-layout.cc
src/hb-ot-layout.h
src/hb-ot-layout.hh
src/hb-ot-map.cc
src/hb-ot-map.hh
src/hb-ot-math-table.hh
src/hb-ot-math.cc
src/hb-ot-math.h
src/hb-ot-maxp-table.hh
src/hb-ot-meta-table.hh
src/hb-ot-meta.cc
src/hb-ot-meta.h
src/hb-ot-metrics.cc
src/hb-ot-metrics.h
src/hb-ot-name-table.hh
src/hb-ot-name.cc
src/hb-ot-name.h
src/hb-ot-os2-table.hh
src/hb-ot-post-table-v2subset.hh [new file with mode: 0644]
src/hb-ot-post-table.hh
src/hb-ot-shape-complex-arabic-fallback.hh
src/hb-ot-shape-complex-arabic-joining-list.hh [new file with mode: 0644]
src/hb-ot-shape-complex-arabic-table.hh
src/hb-ot-shape-complex-arabic-win1256.hh
src/hb-ot-shape-complex-arabic.cc
src/hb-ot-shape-complex-hangul.cc
src/hb-ot-shape-complex-indic-machine.hh
src/hb-ot-shape-complex-indic-machine.rl
src/hb-ot-shape-complex-indic-table.cc
src/hb-ot-shape-complex-indic.cc
src/hb-ot-shape-complex-indic.hh
src/hb-ot-shape-complex-khmer-machine.hh
src/hb-ot-shape-complex-khmer-machine.rl
src/hb-ot-shape-complex-khmer.cc
src/hb-ot-shape-complex-khmer.hh
src/hb-ot-shape-complex-myanmar-machine.hh
src/hb-ot-shape-complex-myanmar-machine.rl
src/hb-ot-shape-complex-myanmar.cc
src/hb-ot-shape-complex-myanmar.hh
src/hb-ot-shape-complex-syllabic.cc [new file with mode: 0644]
src/hb-ot-shape-complex-syllabic.hh [new file with mode: 0644]
src/hb-ot-shape-complex-thai.cc
src/hb-ot-shape-complex-use-machine.hh
src/hb-ot-shape-complex-use-machine.rl
src/hb-ot-shape-complex-use-table.cc [deleted file]
src/hb-ot-shape-complex-use-table.hh [new file with mode: 0644]
src/hb-ot-shape-complex-use.cc
src/hb-ot-shape-complex-use.hh [deleted file]
src/hb-ot-shape-complex-vowel-constraints.cc
src/hb-ot-shape-complex.hh
src/hb-ot-shape-fallback.cc
src/hb-ot-shape-normalize.cc
src/hb-ot-shape-normalize.hh
src/hb-ot-shape.cc
src/hb-ot-shape.h
src/hb-ot-shape.hh
src/hb-ot-stat-table.hh
src/hb-ot-tag-table.hh
src/hb-ot-tag.cc
src/hb-ot-var-avar-table.hh
src/hb-ot-var-common.hh [new file with mode: 0644]
src/hb-ot-var-fvar-table.hh
src/hb-ot-var-gvar-table.hh
src/hb-ot-var-hvar-table.hh
src/hb-ot-var-mvar-table.hh
src/hb-ot-var.cc
src/hb-ot-var.h
src/hb-ot-vorg-table.hh
src/hb-pool.hh
src/hb-priority-queue.hh [new file with mode: 0644]
src/hb-repacker.hh [new file with mode: 0644]
src/hb-sanitize.hh
src/hb-serialize.hh
src/hb-set-digest.hh
src/hb-set.cc
src/hb-set.h
src/hb-set.hh
src/hb-shape-plan.cc
src/hb-shape-plan.h
src/hb-shape-plan.hh
src/hb-shape.cc
src/hb-shape.h
src/hb-shaper.cc
src/hb-static.cc
src/hb-style.cc [new file with mode: 0644]
src/hb-style.h [new file with mode: 0644]
src/hb-subset-cff-common.cc
src/hb-subset-cff-common.hh
src/hb-subset-cff1.cc
src/hb-subset-cff2.cc
src/hb-subset-input.cc
src/hb-subset-input.hh
src/hb-subset-plan.cc
src/hb-subset-plan.hh
src/hb-subset.cc
src/hb-subset.h
src/hb-subset.hh
src/hb-ucd-table.hh
src/hb-ucd.cc
src/hb-unicode-emoji-table.hh
src/hb-unicode.cc
src/hb-unicode.h
src/hb-unicode.hh
src/hb-uniscribe.cc
src/hb-vector.hh
src/hb-version.h
src/hb-version.h.in
src/hb.h
src/hb.hh
src/main.cc
src/meson.build
src/test-buffer-serialize.cc
src/test-gpos-size-params.cc
src/test-gsub-would-substitute.cc
src/test-iter.cc
src/test-machinery.cc [new file with mode: 0644]
src/test-map.cc [new file with mode: 0644]
src/test-meta.cc [deleted file]
src/test-ot-glyphname.cc
src/test-ot-meta.cc
src/test-ot-name.cc
src/test-priority-queue.cc [new file with mode: 0644]
src/test-repacker.cc [new file with mode: 0644]
src/test-serialize.cc [new file with mode: 0644]
src/test-set.cc [new file with mode: 0644]
src/test-vector.cc [new file with mode: 0644]
src/test.cc
subprojects/cairo.wrap [new file with mode: 0644]
subprojects/expat.wrap [deleted file]
subprojects/fontconfig.wrap [deleted file]
subprojects/freetype2.wrap
subprojects/glib.wrap
subprojects/google-benchmark.wrap [new file with mode: 0644]
subprojects/libffi.wrap [deleted file]
subprojects/packagefiles/ragel/meson.build [new file with mode: 0644]
subprojects/proxy-libintl.wrap [deleted file]
subprojects/ragel.wrap [new file with mode: 0644]
subprojects/ttf-parser.wrap [new file with mode: 0644]
subprojects/zlib.wrap [deleted file]
test-driver
test/Makefile.am
test/Makefile.in
test/api/Makefile.am
test/api/Makefile.in
test/api/fonts/AdobeVFPrototype.WA.gpos.otf
test/api/fonts/AdobeVFPrototype.abc.otf
test/api/fonts/AdobeVFPrototype.ac.nohints.otf
test/api/fonts/AdobeVFPrototype.ac.nosubrs.nohints.otf
test/api/fonts/AdobeVFPrototype.ac.nosubrs.otf
test/api/fonts/AdobeVFPrototype.ac.otf
test/api/fonts/AdobeVFPrototype.ac.retaingids.otf
test/api/fonts/Cantarell.A.otf [new file with mode: 0644]
test/api/fonts/Qahiri-Regular.ttf [new file with mode: 0644]
test/api/fonts/Roboto-Regular-gpos-aw.ttf
test/api/fonts/Roboto-Regular.D7,D8,D9,DA,DE.ttf
test/api/fonts/Roboto-Regular.abc.ttf
test/api/fonts/Roboto-Regular.abcAE.ttf [new file with mode: 0644]
test/api/fonts/Roboto-Regular.ac.ttf
test/api/fonts/Roboto-Regular.bAE.ttf [new file with mode: 0644]
test/api/fonts/SourceSansVariable-Roman-modHVAR.abc.ttf
test/api/fonts/SourceSansVariable-Roman-modHVAR.ac.ttf
test/api/fonts/SourceSansVariable-Roman.abc.ttf
test/api/fonts/SourceSansVariable-Roman.ac.retaingids.ttf
test/api/fonts/SourceSansVariable-Roman.ac.ttf
test/api/fonts/SourceSerifVariable-Roman-VVAR.abc.ttf
test/api/fonts/SourceSerifVariable-Roman-VVAR.ac.retaingids.ttf
test/api/fonts/SourceSerifVariable-Roman-VVAR.ac.ttf
test/api/fonts/TwemojiMozilla.subset.default.32,3299.ttf
test/api/fonts/TwemojiMozilla.subset.default.32.ttf
test/api/fonts/TwemojiMozilla.subset.default.3297.ttf
test/api/fonts/TwemojiMozilla.subset.ttf
test/api/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5753845452636160 [new file with mode: 0644]
test/api/fonts/lcar.ttf [deleted file]
test/api/hb-subset-test.h
test/api/hb-test.h
test/api/meson.build
test/api/test-buffer.c
test/api/test-draw.c
test/api/test-font-scale.c [new file with mode: 0644]
test/api/test-map.c
test/api/test-ot-alternates.c [new file with mode: 0644]
test/api/test-ot-collect-glyphs.c [new file with mode: 0644]
test/api/test-ot-extents-cff.c
test/api/test-ot-face.c
test/api/test-ot-layout.c [new file with mode: 0644]
test/api/test-ot-ligature-carets.c
test/api/test-ot-math.c
test/api/test-ot-metrics-tt-var.c
test/api/test-ot-name.c
test/api/test-ot-tag.c
test/api/test-set.c
test/api/test-style.c [new file with mode: 0644]
test/api/test-subset-cff1.c
test/api/test-subset-cff2.c
test/api/test-subset-drop-tables.c
test/api/test-subset-glyf.c
test/api/test-subset-gpos.c
test/api/test-subset-gvar.c
test/api/test-subset-hdmx.c
test/api/test-subset-hmtx.c
test/api/test-subset-hvar.c
test/api/test-subset-vvar.c
test/api/test-subset.c
test/api/test-unicode.c
test/fuzzing/Makefile.in
test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5754958982021120 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-draw-fuzzer-4856957815619584 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-draw-fuzzer-5103082208493568 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-draw-fuzzer-5641612227772416 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-draw-fuzzer-6231698648596480 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5061207689134080 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5138182937772032 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-4681956043390976 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-4880059756969984 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-4901143794810880 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-4961171477233664 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-4979711393005568 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5001604901240832 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5041767803125760 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5072358514753536 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5127321313476608 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5137462782066688 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5141317848530944.fuzz [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5179935334465536 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5181909018345472 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5205038086094848 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5229304507138048 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5241922561114112 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5250795600740352 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5269686781607936 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5345734743031808 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5362189182566400 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5363902507515904 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5416421032067072 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5417934246772736 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5422577634377728 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5443213648330752 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5522792714993664 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5549945449480192 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5609112151916544 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5616763250278400 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5617065093365760 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5641892164009984 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5661567174311936 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5684542900535296 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5689082504806400 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5707809174585344 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5708623339323392 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5715464591376384 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5741295280848896 [deleted file]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5741735372914688 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5858518134554624 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5887968763052032 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5927551890096128 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5965777994907648 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5991762219892736 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6173520787800064 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6231212713312256 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6241118484955136 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6246465148813312 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6254792024915968 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6315334756335616 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6316256152780800 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6372147008241664 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6382598554255360 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6421315436281856 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6616166961905664 [new file with mode: 0644]
test/fuzzing/fonts/crash-d223bc42a8226c4d655c417d63d9a76760d05985 [new file with mode: 0644]
test/fuzzing/fonts/leak-34f1798a142fd0dfdd71a96fb6aa7de19a62865e [new file with mode: 0644]
test/fuzzing/hb-draw-fuzzer.cc
test/fuzzing/hb-fuzzer.hh
test/fuzzing/hb-set-fuzzer.cc
test/fuzzing/hb-shape-fuzzer.cc
test/fuzzing/hb-subset-fuzzer.cc
test/fuzzing/main.cc
test/fuzzing/meson.build
test/fuzzing/run-draw-fuzzer-tests.py
test/fuzzing/run-shape-fuzzer-tests.py
test/fuzzing/run-subset-fuzzer-tests.py
test/meson.build
test/shape/Makefile.am [moved from test/shaping/Makefile.am with 100% similarity]
test/shape/Makefile.in [new file with mode: 0644]
test/shape/README.md [moved from test/shaping/README.md with 100% similarity]
test/shape/data/Makefile.am [moved from test/shaping/data/Makefile.am with 100% similarity]
test/shape/data/Makefile.in [new file with mode: 0644]
test/shape/data/aots/COPYING [moved from test/shaping/data/aots/COPYING with 100% similarity]
test/shape/data/aots/Makefile.am [new file with mode: 0644]
test/shape/data/aots/Makefile.in [new file with mode: 0644]
test/shape/data/aots/Makefile.sources [new file with mode: 0644]
test/shape/data/aots/fonts/classdef1_font1.otf [moved from test/shaping/data/aots/fonts/classdef1_font1.otf with 100% similarity]
test/shape/data/aots/fonts/classdef1_font2.otf [moved from test/shaping/data/aots/fonts/classdef1_font2.otf with 100% similarity]
test/shape/data/aots/fonts/classdef1_font3.otf [moved from test/shaping/data/aots/fonts/classdef1_font3.otf with 100% similarity]
test/shape/data/aots/fonts/classdef1_font4.otf [moved from test/shaping/data/aots/fonts/classdef1_font4.otf with 100% similarity]
test/shape/data/aots/fonts/classdef2_font1.otf [moved from test/shaping/data/aots/fonts/classdef2_font1.otf with 100% similarity]
test/shape/data/aots/fonts/classdef2_font2.otf [moved from test/shaping/data/aots/fonts/classdef2_font2.otf with 100% similarity]
test/shape/data/aots/fonts/classdef2_font3.otf [moved from test/shaping/data/aots/fonts/classdef2_font3.otf with 100% similarity]
test/shape/data/aots/fonts/classdef2_font4.otf [moved from test/shaping/data/aots/fonts/classdef2_font4.otf with 100% similarity]
test/shape/data/aots/fonts/cmap0_font1.otf [moved from test/shaping/data/aots/fonts/cmap0_font1.otf with 100% similarity]
test/shape/data/aots/fonts/cmap10_font1.otf [moved from test/shaping/data/aots/fonts/cmap10_font1.otf with 100% similarity]
test/shape/data/aots/fonts/cmap10_font2.otf [moved from test/shaping/data/aots/fonts/cmap10_font2.otf with 100% similarity]
test/shape/data/aots/fonts/cmap12_font1.otf [moved from test/shaping/data/aots/fonts/cmap12_font1.otf with 100% similarity]
test/shape/data/aots/fonts/cmap14_font1.otf [moved from test/shaping/data/aots/fonts/cmap14_font1.otf with 100% similarity]
test/shape/data/aots/fonts/cmap2_font1.otf [moved from test/shaping/data/aots/fonts/cmap2_font1.otf with 100% similarity]
test/shape/data/aots/fonts/cmap4_font1.otf [moved from test/shaping/data/aots/fonts/cmap4_font1.otf with 100% similarity]
test/shape/data/aots/fonts/cmap4_font2.otf [moved from test/shaping/data/aots/fonts/cmap4_font2.otf with 100% similarity]
test/shape/data/aots/fonts/cmap4_font3.otf [moved from test/shaping/data/aots/fonts/cmap4_font3.otf with 100% similarity]
test/shape/data/aots/fonts/cmap4_font4.otf [moved from test/shaping/data/aots/fonts/cmap4_font4.otf with 100% similarity]
test/shape/data/aots/fonts/cmap6_font1.otf [moved from test/shaping/data/aots/fonts/cmap6_font1.otf with 100% similarity]
test/shape/data/aots/fonts/cmap6_font2.otf [moved from test/shaping/data/aots/fonts/cmap6_font2.otf with 100% similarity]
test/shape/data/aots/fonts/cmap8_font1.otf [moved from test/shaping/data/aots/fonts/cmap8_font1.otf with 100% similarity]
test/shape/data/aots/fonts/cmap_composition_font1.otf [moved from test/shaping/data/aots/fonts/cmap_composition_font1.otf with 100% similarity]
test/shape/data/aots/fonts/cmap_subtableselection_font1.otf [moved from test/shaping/data/aots/fonts/cmap_subtableselection_font1.otf with 100% similarity]
test/shape/data/aots/fonts/cmap_subtableselection_font2.otf [moved from test/shaping/data/aots/fonts/cmap_subtableselection_font2.otf with 100% similarity]
test/shape/data/aots/fonts/cmap_subtableselection_font3.otf [moved from test/shaping/data/aots/fonts/cmap_subtableselection_font3.otf with 100% similarity]
test/shape/data/aots/fonts/cmap_subtableselection_font4.otf [moved from test/shaping/data/aots/fonts/cmap_subtableselection_font4.otf with 100% similarity]
test/shape/data/aots/fonts/cmap_subtableselection_font5.otf [moved from test/shaping/data/aots/fonts/cmap_subtableselection_font5.otf with 100% similarity]
test/shape/data/aots/fonts/gpos1_1_lookupflag_f1.otf [moved from test/shaping/data/aots/fonts/gpos1_1_lookupflag_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gpos1_1_simple_f1.otf [moved from test/shaping/data/aots/fonts/gpos1_1_simple_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gpos1_1_simple_f2.otf [moved from test/shaping/data/aots/fonts/gpos1_1_simple_f2.otf with 100% similarity]
test/shape/data/aots/fonts/gpos1_1_simple_f3.otf [moved from test/shaping/data/aots/fonts/gpos1_1_simple_f3.otf with 100% similarity]
test/shape/data/aots/fonts/gpos1_1_simple_f4.otf [moved from test/shaping/data/aots/fonts/gpos1_1_simple_f4.otf with 100% similarity]
test/shape/data/aots/fonts/gpos1_2_font1.otf [moved from test/shaping/data/aots/fonts/gpos1_2_font1.otf with 100% similarity]
test/shape/data/aots/fonts/gpos1_2_font2.otf [moved from test/shaping/data/aots/fonts/gpos1_2_font2.otf with 100% similarity]
test/shape/data/aots/fonts/gpos2_1_font6.otf [moved from test/shaping/data/aots/fonts/gpos2_1_font6.otf with 100% similarity]
test/shape/data/aots/fonts/gpos2_1_font7.otf [moved from test/shaping/data/aots/fonts/gpos2_1_font7.otf with 100% similarity]
test/shape/data/aots/fonts/gpos2_1_lookupflag_f1.otf [moved from test/shaping/data/aots/fonts/gpos2_1_lookupflag_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gpos2_1_lookupflag_f2.otf [moved from test/shaping/data/aots/fonts/gpos2_1_lookupflag_f2.otf with 100% similarity]
test/shape/data/aots/fonts/gpos2_1_next_glyph_f1.otf [moved from test/shaping/data/aots/fonts/gpos2_1_next_glyph_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gpos2_1_next_glyph_f2.otf [moved from test/shaping/data/aots/fonts/gpos2_1_next_glyph_f2.otf with 100% similarity]
test/shape/data/aots/fonts/gpos2_1_simple_f1.otf [moved from test/shaping/data/aots/fonts/gpos2_1_simple_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gpos2_2_font1.otf [moved from test/shaping/data/aots/fonts/gpos2_2_font1.otf with 100% similarity]
test/shape/data/aots/fonts/gpos2_2_font2.otf [moved from test/shaping/data/aots/fonts/gpos2_2_font2.otf with 100% similarity]
test/shape/data/aots/fonts/gpos2_2_font3.otf [moved from test/shaping/data/aots/fonts/gpos2_2_font3.otf with 100% similarity]
test/shape/data/aots/fonts/gpos2_2_font4.otf [moved from test/shaping/data/aots/fonts/gpos2_2_font4.otf with 100% similarity]
test/shape/data/aots/fonts/gpos2_2_font5.otf [moved from test/shaping/data/aots/fonts/gpos2_2_font5.otf with 100% similarity]
test/shape/data/aots/fonts/gpos3_font1.otf [moved from test/shaping/data/aots/fonts/gpos3_font1.otf with 100% similarity]
test/shape/data/aots/fonts/gpos3_font2.otf [moved from test/shaping/data/aots/fonts/gpos3_font2.otf with 100% similarity]
test/shape/data/aots/fonts/gpos3_font3.otf [moved from test/shaping/data/aots/fonts/gpos3_font3.otf with 100% similarity]
test/shape/data/aots/fonts/gpos4_lookupflag_f1.otf [moved from test/shaping/data/aots/fonts/gpos4_lookupflag_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gpos4_lookupflag_f2.otf [moved from test/shaping/data/aots/fonts/gpos4_lookupflag_f2.otf with 100% similarity]
test/shape/data/aots/fonts/gpos4_multiple_anchors_1.otf [moved from test/shaping/data/aots/fonts/gpos4_multiple_anchors_1.otf with 100% similarity]
test/shape/data/aots/fonts/gpos4_simple_1.otf [moved from test/shaping/data/aots/fonts/gpos4_simple_1.otf with 100% similarity]
test/shape/data/aots/fonts/gpos5_font1.otf [moved from test/shaping/data/aots/fonts/gpos5_font1.otf with 100% similarity]
test/shape/data/aots/fonts/gpos6_font1.otf [moved from test/shaping/data/aots/fonts/gpos6_font1.otf with 100% similarity]
test/shape/data/aots/fonts/gpos7_1_font1.otf [moved from test/shaping/data/aots/fonts/gpos7_1_font1.otf with 100% similarity]
test/shape/data/aots/fonts/gpos9_font1.otf [moved from test/shaping/data/aots/fonts/gpos9_font1.otf with 100% similarity]
test/shape/data/aots/fonts/gpos9_font2.otf [moved from test/shaping/data/aots/fonts/gpos9_font2.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_chaining1_boundary_f1.otf [moved from test/shaping/data/aots/fonts/gpos_chaining1_boundary_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_chaining1_boundary_f2.otf [moved from test/shaping/data/aots/fonts/gpos_chaining1_boundary_f2.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_chaining1_boundary_f3.otf [moved from test/shaping/data/aots/fonts/gpos_chaining1_boundary_f3.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_chaining1_boundary_f4.otf [moved from test/shaping/data/aots/fonts/gpos_chaining1_boundary_f4.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_chaining1_lookupflag_f1.otf [moved from test/shaping/data/aots/fonts/gpos_chaining1_lookupflag_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_chaining1_multiple_subrules_f1.otf [moved from test/shaping/data/aots/fonts/gpos_chaining1_multiple_subrules_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_chaining1_multiple_subrules_f2.otf [moved from test/shaping/data/aots/fonts/gpos_chaining1_multiple_subrules_f2.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_chaining1_next_glyph_f1.otf [moved from test/shaping/data/aots/fonts/gpos_chaining1_next_glyph_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_chaining1_simple_f1.otf [moved from test/shaping/data/aots/fonts/gpos_chaining1_simple_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_chaining1_simple_f2.otf [moved from test/shaping/data/aots/fonts/gpos_chaining1_simple_f2.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_chaining1_successive_f1.otf [moved from test/shaping/data/aots/fonts/gpos_chaining1_successive_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_chaining2_boundary_f1.otf [moved from test/shaping/data/aots/fonts/gpos_chaining2_boundary_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_chaining2_boundary_f2.otf [moved from test/shaping/data/aots/fonts/gpos_chaining2_boundary_f2.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_chaining2_boundary_f3.otf [moved from test/shaping/data/aots/fonts/gpos_chaining2_boundary_f3.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_chaining2_boundary_f4.otf [moved from test/shaping/data/aots/fonts/gpos_chaining2_boundary_f4.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_chaining2_lookupflag_f1.otf [moved from test/shaping/data/aots/fonts/gpos_chaining2_lookupflag_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_chaining2_multiple_subrules_f1.otf [moved from test/shaping/data/aots/fonts/gpos_chaining2_multiple_subrules_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_chaining2_multiple_subrules_f2.otf [moved from test/shaping/data/aots/fonts/gpos_chaining2_multiple_subrules_f2.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_chaining2_next_glyph_f1.otf [moved from test/shaping/data/aots/fonts/gpos_chaining2_next_glyph_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_chaining2_simple_f1.otf [moved from test/shaping/data/aots/fonts/gpos_chaining2_simple_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_chaining2_simple_f2.otf [moved from test/shaping/data/aots/fonts/gpos_chaining2_simple_f2.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_chaining2_successive_f1.otf [moved from test/shaping/data/aots/fonts/gpos_chaining2_successive_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_chaining3_boundary_f1.otf [moved from test/shaping/data/aots/fonts/gpos_chaining3_boundary_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_chaining3_boundary_f2.otf [moved from test/shaping/data/aots/fonts/gpos_chaining3_boundary_f2.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_chaining3_boundary_f3.otf [moved from test/shaping/data/aots/fonts/gpos_chaining3_boundary_f3.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_chaining3_boundary_f4.otf [moved from test/shaping/data/aots/fonts/gpos_chaining3_boundary_f4.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_chaining3_lookupflag_f1.otf [moved from test/shaping/data/aots/fonts/gpos_chaining3_lookupflag_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_chaining3_next_glyph_f1.otf [moved from test/shaping/data/aots/fonts/gpos_chaining3_next_glyph_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_chaining3_simple_f1.otf [moved from test/shaping/data/aots/fonts/gpos_chaining3_simple_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_chaining3_simple_f2.otf [moved from test/shaping/data/aots/fonts/gpos_chaining3_simple_f2.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_chaining3_successive_f1.otf [moved from test/shaping/data/aots/fonts/gpos_chaining3_successive_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_context1_boundary_f1.otf [moved from test/shaping/data/aots/fonts/gpos_context1_boundary_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_context1_boundary_f2.otf [moved from test/shaping/data/aots/fonts/gpos_context1_boundary_f2.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_context1_expansion_f1.otf [moved from test/shaping/data/aots/fonts/gpos_context1_expansion_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_context1_lookupflag_f1.otf [moved from test/shaping/data/aots/fonts/gpos_context1_lookupflag_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_context1_lookupflag_f2.otf [moved from test/shaping/data/aots/fonts/gpos_context1_lookupflag_f2.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_context1_multiple_subrules_f1.otf [moved from test/shaping/data/aots/fonts/gpos_context1_multiple_subrules_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_context1_multiple_subrules_f2.otf [moved from test/shaping/data/aots/fonts/gpos_context1_multiple_subrules_f2.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_context1_next_glyph_f1.otf [moved from test/shaping/data/aots/fonts/gpos_context1_next_glyph_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_context1_simple_f1.otf [moved from test/shaping/data/aots/fonts/gpos_context1_simple_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_context1_simple_f2.otf [moved from test/shaping/data/aots/fonts/gpos_context1_simple_f2.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_context1_successive_f1.otf [moved from test/shaping/data/aots/fonts/gpos_context1_successive_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_context2_boundary_f1.otf [moved from test/shaping/data/aots/fonts/gpos_context2_boundary_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_context2_boundary_f2.otf [moved from test/shaping/data/aots/fonts/gpos_context2_boundary_f2.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_context2_classes_f1.otf [moved from test/shaping/data/aots/fonts/gpos_context2_classes_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_context2_classes_f2.otf [moved from test/shaping/data/aots/fonts/gpos_context2_classes_f2.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_context2_expansion_f1.otf [moved from test/shaping/data/aots/fonts/gpos_context2_expansion_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_context2_lookupflag_f1.otf [moved from test/shaping/data/aots/fonts/gpos_context2_lookupflag_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_context2_lookupflag_f2.otf [moved from test/shaping/data/aots/fonts/gpos_context2_lookupflag_f2.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_context2_multiple_subrules_f1.otf [moved from test/shaping/data/aots/fonts/gpos_context2_multiple_subrules_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_context2_multiple_subrules_f2.otf [moved from test/shaping/data/aots/fonts/gpos_context2_multiple_subrules_f2.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_context2_next_glyph_f1.otf [moved from test/shaping/data/aots/fonts/gpos_context2_next_glyph_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_context2_simple_f1.otf [moved from test/shaping/data/aots/fonts/gpos_context2_simple_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_context2_simple_f2.otf [moved from test/shaping/data/aots/fonts/gpos_context2_simple_f2.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_context2_successive_f1.otf [moved from test/shaping/data/aots/fonts/gpos_context2_successive_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_context3_boundary_f1.otf [moved from test/shaping/data/aots/fonts/gpos_context3_boundary_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_context3_boundary_f2.otf [moved from test/shaping/data/aots/fonts/gpos_context3_boundary_f2.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_context3_lookupflag_f1.otf [moved from test/shaping/data/aots/fonts/gpos_context3_lookupflag_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_context3_lookupflag_f2.otf [moved from test/shaping/data/aots/fonts/gpos_context3_lookupflag_f2.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_context3_next_glyph_f1.otf [moved from test/shaping/data/aots/fonts/gpos_context3_next_glyph_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_context3_simple_f1.otf [moved from test/shaping/data/aots/fonts/gpos_context3_simple_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gpos_context3_successive_f1.otf [moved from test/shaping/data/aots/fonts/gpos_context3_successive_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gsub1_1_lookupflag_f1.otf [moved from test/shaping/data/aots/fonts/gsub1_1_lookupflag_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gsub1_1_modulo_f1.otf [moved from test/shaping/data/aots/fonts/gsub1_1_modulo_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gsub1_1_simple_f1.otf [moved from test/shaping/data/aots/fonts/gsub1_1_simple_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gsub1_2_lookupflag_f1.otf [moved from test/shaping/data/aots/fonts/gsub1_2_lookupflag_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gsub1_2_simple_f1.otf [moved from test/shaping/data/aots/fonts/gsub1_2_simple_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gsub2_1_lookupflag_f1.otf [moved from test/shaping/data/aots/fonts/gsub2_1_lookupflag_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gsub2_1_multiple_sequences_f1.otf [moved from test/shaping/data/aots/fonts/gsub2_1_multiple_sequences_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gsub2_1_simple_f1.otf [moved from test/shaping/data/aots/fonts/gsub2_1_simple_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gsub3_1_lookupflag_f1.otf [moved from test/shaping/data/aots/fonts/gsub3_1_lookupflag_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gsub3_1_multiple_f1.otf [moved from test/shaping/data/aots/fonts/gsub3_1_multiple_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gsub3_1_simple_f1.otf [moved from test/shaping/data/aots/fonts/gsub3_1_simple_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gsub4_1_lookupflag_f1.otf [moved from test/shaping/data/aots/fonts/gsub4_1_lookupflag_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gsub4_1_multiple_ligatures_f1.otf [moved from test/shaping/data/aots/fonts/gsub4_1_multiple_ligatures_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gsub4_1_multiple_ligatures_f2.otf [moved from test/shaping/data/aots/fonts/gsub4_1_multiple_ligatures_f2.otf with 100% similarity]
test/shape/data/aots/fonts/gsub4_1_multiple_ligsets_f1.otf [moved from test/shaping/data/aots/fonts/gsub4_1_multiple_ligsets_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gsub4_1_simple_f1.otf [moved from test/shaping/data/aots/fonts/gsub4_1_simple_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gsub7_font1.otf [moved from test/shaping/data/aots/fonts/gsub7_font1.otf with 100% similarity]
test/shape/data/aots/fonts/gsub7_font2.otf [moved from test/shaping/data/aots/fonts/gsub7_font2.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_chaining1_boundary_f1.otf [moved from test/shaping/data/aots/fonts/gsub_chaining1_boundary_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_chaining1_boundary_f2.otf [moved from test/shaping/data/aots/fonts/gsub_chaining1_boundary_f2.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_chaining1_boundary_f3.otf [moved from test/shaping/data/aots/fonts/gsub_chaining1_boundary_f3.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_chaining1_boundary_f4.otf [moved from test/shaping/data/aots/fonts/gsub_chaining1_boundary_f4.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_chaining1_lookupflag_f1.otf [moved from test/shaping/data/aots/fonts/gsub_chaining1_lookupflag_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_chaining1_multiple_subrules_f1.otf [moved from test/shaping/data/aots/fonts/gsub_chaining1_multiple_subrules_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_chaining1_multiple_subrules_f2.otf [moved from test/shaping/data/aots/fonts/gsub_chaining1_multiple_subrules_f2.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_chaining1_next_glyph_f1.otf [moved from test/shaping/data/aots/fonts/gsub_chaining1_next_glyph_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_chaining1_simple_f1.otf [moved from test/shaping/data/aots/fonts/gsub_chaining1_simple_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_chaining1_simple_f2.otf [moved from test/shaping/data/aots/fonts/gsub_chaining1_simple_f2.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_chaining1_successive_f1.otf [moved from test/shaping/data/aots/fonts/gsub_chaining1_successive_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_chaining2_boundary_f1.otf [moved from test/shaping/data/aots/fonts/gsub_chaining2_boundary_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_chaining2_boundary_f2.otf [moved from test/shaping/data/aots/fonts/gsub_chaining2_boundary_f2.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_chaining2_boundary_f3.otf [moved from test/shaping/data/aots/fonts/gsub_chaining2_boundary_f3.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_chaining2_boundary_f4.otf [moved from test/shaping/data/aots/fonts/gsub_chaining2_boundary_f4.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_chaining2_lookupflag_f1.otf [moved from test/shaping/data/aots/fonts/gsub_chaining2_lookupflag_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_chaining2_multiple_subrules_f1.otf [moved from test/shaping/data/aots/fonts/gsub_chaining2_multiple_subrules_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_chaining2_multiple_subrules_f2.otf [moved from test/shaping/data/aots/fonts/gsub_chaining2_multiple_subrules_f2.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_chaining2_next_glyph_f1.otf [moved from test/shaping/data/aots/fonts/gsub_chaining2_next_glyph_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_chaining2_simple_f1.otf [moved from test/shaping/data/aots/fonts/gsub_chaining2_simple_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_chaining2_simple_f2.otf [moved from test/shaping/data/aots/fonts/gsub_chaining2_simple_f2.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_chaining2_successive_f1.otf [moved from test/shaping/data/aots/fonts/gsub_chaining2_successive_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_chaining3_boundary_f1.otf [moved from test/shaping/data/aots/fonts/gsub_chaining3_boundary_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_chaining3_boundary_f2.otf [moved from test/shaping/data/aots/fonts/gsub_chaining3_boundary_f2.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_chaining3_boundary_f3.otf [moved from test/shaping/data/aots/fonts/gsub_chaining3_boundary_f3.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_chaining3_boundary_f4.otf [moved from test/shaping/data/aots/fonts/gsub_chaining3_boundary_f4.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_chaining3_lookupflag_f1.otf [moved from test/shaping/data/aots/fonts/gsub_chaining3_lookupflag_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_chaining3_next_glyph_f1.otf [moved from test/shaping/data/aots/fonts/gsub_chaining3_next_glyph_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_chaining3_simple_f1.otf [moved from test/shaping/data/aots/fonts/gsub_chaining3_simple_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_chaining3_simple_f2.otf [moved from test/shaping/data/aots/fonts/gsub_chaining3_simple_f2.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_chaining3_successive_f1.otf [moved from test/shaping/data/aots/fonts/gsub_chaining3_successive_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_context1_boundary_f1.otf [moved from test/shaping/data/aots/fonts/gsub_context1_boundary_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_context1_boundary_f2.otf [moved from test/shaping/data/aots/fonts/gsub_context1_boundary_f2.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_context1_expansion_f1.otf [moved from test/shaping/data/aots/fonts/gsub_context1_expansion_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_context1_lookupflag_f1.otf [moved from test/shaping/data/aots/fonts/gsub_context1_lookupflag_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_context1_lookupflag_f2.otf [moved from test/shaping/data/aots/fonts/gsub_context1_lookupflag_f2.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_context1_multiple_subrules_f1.otf [moved from test/shaping/data/aots/fonts/gsub_context1_multiple_subrules_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_context1_multiple_subrules_f2.otf [moved from test/shaping/data/aots/fonts/gsub_context1_multiple_subrules_f2.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_context1_next_glyph_f1.otf [moved from test/shaping/data/aots/fonts/gsub_context1_next_glyph_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_context1_simple_f1.otf [moved from test/shaping/data/aots/fonts/gsub_context1_simple_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_context1_simple_f2.otf [moved from test/shaping/data/aots/fonts/gsub_context1_simple_f2.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_context1_successive_f1.otf [moved from test/shaping/data/aots/fonts/gsub_context1_successive_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_context2_boundary_f1.otf [moved from test/shaping/data/aots/fonts/gsub_context2_boundary_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_context2_boundary_f2.otf [moved from test/shaping/data/aots/fonts/gsub_context2_boundary_f2.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_context2_classes_f1.otf [moved from test/shaping/data/aots/fonts/gsub_context2_classes_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_context2_classes_f2.otf [moved from test/shaping/data/aots/fonts/gsub_context2_classes_f2.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_context2_expansion_f1.otf [moved from test/shaping/data/aots/fonts/gsub_context2_expansion_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_context2_lookupflag_f1.otf [moved from test/shaping/data/aots/fonts/gsub_context2_lookupflag_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_context2_lookupflag_f2.otf [moved from test/shaping/data/aots/fonts/gsub_context2_lookupflag_f2.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_context2_multiple_subrules_f1.otf [moved from test/shaping/data/aots/fonts/gsub_context2_multiple_subrules_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_context2_multiple_subrules_f2.otf [moved from test/shaping/data/aots/fonts/gsub_context2_multiple_subrules_f2.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_context2_next_glyph_f1.otf [moved from test/shaping/data/aots/fonts/gsub_context2_next_glyph_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_context2_simple_f1.otf [moved from test/shaping/data/aots/fonts/gsub_context2_simple_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_context2_simple_f2.otf [moved from test/shaping/data/aots/fonts/gsub_context2_simple_f2.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_context2_successive_f1.otf [moved from test/shaping/data/aots/fonts/gsub_context2_successive_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_context3_boundary_f1.otf [moved from test/shaping/data/aots/fonts/gsub_context3_boundary_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_context3_boundary_f2.otf [moved from test/shaping/data/aots/fonts/gsub_context3_boundary_f2.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_context3_lookupflag_f1.otf [moved from test/shaping/data/aots/fonts/gsub_context3_lookupflag_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_context3_lookupflag_f2.otf [moved from test/shaping/data/aots/fonts/gsub_context3_lookupflag_f2.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_context3_next_glyph_f1.otf [moved from test/shaping/data/aots/fonts/gsub_context3_next_glyph_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_context3_simple_f1.otf [moved from test/shaping/data/aots/fonts/gsub_context3_simple_f1.otf with 100% similarity]
test/shape/data/aots/fonts/gsub_context3_successive_f1.otf [moved from test/shaping/data/aots/fonts/gsub_context3_successive_f1.otf with 100% similarity]
test/shape/data/aots/fonts/lookupflag_ignore_attach_f1.otf [moved from test/shaping/data/aots/fonts/lookupflag_ignore_attach_f1.otf with 100% similarity]
test/shape/data/aots/fonts/lookupflag_ignore_base_f1.otf [moved from test/shaping/data/aots/fonts/lookupflag_ignore_base_f1.otf with 100% similarity]
test/shape/data/aots/fonts/lookupflag_ignore_combination_f1.otf [moved from test/shaping/data/aots/fonts/lookupflag_ignore_combination_f1.otf with 100% similarity]
test/shape/data/aots/fonts/lookupflag_ignore_ligatures_f1.otf [moved from test/shaping/data/aots/fonts/lookupflag_ignore_ligatures_f1.otf with 100% similarity]
test/shape/data/aots/fonts/lookupflag_ignore_marks_f1.otf [moved from test/shaping/data/aots/fonts/lookupflag_ignore_marks_f1.otf with 100% similarity]
test/shape/data/aots/meson.build [new file with mode: 0644]
test/shape/data/aots/tests/classdef1.tests [new file with mode: 0644]
test/shape/data/aots/tests/classdef1_empty.tests [new file with mode: 0644]
test/shape/data/aots/tests/classdef1_multiple.tests [new file with mode: 0644]
test/shape/data/aots/tests/classdef1_single.tests [new file with mode: 0644]
test/shape/data/aots/tests/classdef2.tests [new file with mode: 0644]
test/shape/data/aots/tests/classdef2_empty.tests [new file with mode: 0644]
test/shape/data/aots/tests/classdef2_multiple.tests [new file with mode: 0644]
test/shape/data/aots/tests/classdef2_single.tests [new file with mode: 0644]
test/shape/data/aots/tests/cmap0.tests [new file with mode: 0644]
test/shape/data/aots/tests/cmap10.tests [new file with mode: 0644]
test/shape/data/aots/tests/cmap12.tests [new file with mode: 0644]
test/shape/data/aots/tests/cmap2.tests [new file with mode: 0644]
test/shape/data/aots/tests/cmap4.tests [new file with mode: 0644]
test/shape/data/aots/tests/cmap6.tests [new file with mode: 0644]
test/shape/data/aots/tests/cmap8.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos1_1_lookupflag.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos1_1_simple.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos1_2.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos1_2_lookupflag.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos2_1.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos2_1_lookupflag.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos2_1_next_glyph.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos2_1_simple.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos2_2.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos3.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos3_lookupflag.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos4_lookupflag.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos4_multiple_anchors.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos4_simple.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos5.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos6.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos7_1.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos9.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos_chaining1_boundary.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos_chaining1_lookupflag.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos_chaining1_multiple_subrules.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos_chaining1_next_glyph.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos_chaining1_simple.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos_chaining1_successive.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos_chaining2_boundary.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos_chaining2_lookupflag.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos_chaining2_multiple_subrules.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos_chaining2_next_glyph.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos_chaining2_simple.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos_chaining2_successive.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos_chaining3_boundary.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos_chaining3_lookupflag.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos_chaining3_next_glyph.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos_chaining3_simple.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos_chaining3_successive.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos_context1_boundary.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos_context1_expansion.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos_context1_lookupflag.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos_context1_multiple_subrules.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos_context1_next_glyph.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos_context1_simple.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos_context1_successive.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos_context2_boundary.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos_context2_classes.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos_context2_expansion.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos_context2_lookupflag.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos_context2_multiple_subrules.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos_context2_next_glyph.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos_context2_simple.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos_context2_successive.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos_context3_boundary.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos_context3_lookupflag.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos_context3_next_glyph.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos_context3_simple.tests [new file with mode: 0644]
test/shape/data/aots/tests/gpos_context3_successive.tests [new file with mode: 0644]
test/shape/data/aots/tests/gsub1_1_lookupflag.tests [new file with mode: 0644]
test/shape/data/aots/tests/gsub1_1_modulo.tests [new file with mode: 0644]
test/shape/data/aots/tests/gsub1_1_simple.tests [new file with mode: 0644]
test/shape/data/aots/tests/gsub1_2_lookupflag.tests [new file with mode: 0644]
test/shape/data/aots/tests/gsub1_2_simple.tests [new file with mode: 0644]
test/shape/data/aots/tests/gsub2_1_lookupflag.tests [new file with mode: 0644]
test/shape/data/aots/tests/gsub2_1_multiple_sequences.tests [new file with mode: 0644]
test/shape/data/aots/tests/gsub2_1_simple.tests [new file with mode: 0644]
test/shape/data/aots/tests/gsub3_1_lookupflag.tests [new file with mode: 0644]
test/shape/data/aots/tests/gsub3_1_multiple.tests [new file with mode: 0644]
test/shape/data/aots/tests/gsub3_1_simple.tests [new file with mode: 0644]
test/shape/data/aots/tests/gsub4_1_lookupflag.tests [new file with mode: 0644]
test/shape/data/aots/tests/gsub4_1_multiple_ligatures.tests [new file with mode: 0644]
test/shape/data/aots/tests/gsub4_1_multiple_ligsets.tests [new file with mode: 0644]
test/shape/data/aots/tests/gsub4_1_simple.tests [new file with mode: 0644]
test/shape/data/aots/tests/gsub7.tests [new file with mode: 0644]
test/shape/data/aots/tests/gsub_chaining1_boundary.tests [new file with mode: 0644]
test/shape/data/aots/tests/gsub_chaining1_lookupflag.tests [new file with mode: 0644]
test/shape/data/aots/tests/gsub_chaining1_multiple_subrules.tests [new file with mode: 0644]
test/shape/data/aots/tests/gsub_chaining1_next_glyph.tests [new file with mode: 0644]
test/shape/data/aots/tests/gsub_chaining1_simple.tests [new file with mode: 0644]
test/shape/data/aots/tests/gsub_chaining1_successive.tests [new file with mode: 0644]
test/shape/data/aots/tests/gsub_chaining2_boundary.tests [new file with mode: 0644]
test/shape/data/aots/tests/gsub_chaining2_lookupflag.tests [new file with mode: 0644]
test/shape/data/aots/tests/gsub_chaining2_multiple_subrules.tests [new file with mode: 0644]
test/shape/data/aots/tests/gsub_chaining2_next_glyph.tests [new file with mode: 0644]
test/shape/data/aots/tests/gsub_chaining2_simple.tests [new file with mode: 0644]
test/shape/data/aots/tests/gsub_chaining2_successive.tests [new file with mode: 0644]
test/shape/data/aots/tests/gsub_chaining3_boundary.tests [new file with mode: 0644]
test/shape/data/aots/tests/gsub_chaining3_lookupflag.tests [new file with mode: 0644]
test/shape/data/aots/tests/gsub_chaining3_next_glyph.tests [new file with mode: 0644]
test/shape/data/aots/tests/gsub_chaining3_simple.tests [new file with mode: 0644]
test/shape/data/aots/tests/gsub_chaining3_successive.tests [new file with mode: 0644]
test/shape/data/aots/tests/gsub_context1_boundary.tests [new file with mode: 0644]
test/shape/data/aots/tests/gsub_context1_expansion.tests [new file with mode: 0644]
test/shape/data/aots/tests/gsub_context1_lookupflag.tests [new file with mode: 0644]
test/shape/data/aots/tests/gsub_context1_multiple_subrules.tests [new file with mode: 0644]
test/shape/data/aots/tests/gsub_context1_next_glyph.tests [new file with mode: 0644]
test/shape/data/aots/tests/gsub_context1_simple.tests [new file with mode: 0644]
test/shape/data/aots/tests/gsub_context1_successive.tests [new file with mode: 0644]
test/shape/data/aots/tests/gsub_context2_boundary.tests [new file with mode: 0644]
test/shape/data/aots/tests/gsub_context2_classes.tests [new file with mode: 0644]
test/shape/data/aots/tests/gsub_context2_expansion.tests [new file with mode: 0644]
test/shape/data/aots/tests/gsub_context2_lookupflag.tests [new file with mode: 0644]
test/shape/data/aots/tests/gsub_context2_multiple_subrules.tests [new file with mode: 0644]
test/shape/data/aots/tests/gsub_context2_next_glyph.tests [new file with mode: 0644]
test/shape/data/aots/tests/gsub_context2_simple.tests [new file with mode: 0644]
test/shape/data/aots/tests/gsub_context2_successive.tests [new file with mode: 0644]
test/shape/data/aots/tests/gsub_context3_boundary.tests [new file with mode: 0644]
test/shape/data/aots/tests/gsub_context3_lookupflag.tests [new file with mode: 0644]
test/shape/data/aots/tests/gsub_context3_next_glyph.tests [new file with mode: 0644]
test/shape/data/aots/tests/gsub_context3_simple.tests [new file with mode: 0644]
test/shape/data/aots/tests/gsub_context3_successive.tests [new file with mode: 0644]
test/shape/data/aots/tests/lookupflag_ignore_attach.tests [new file with mode: 0644]
test/shape/data/aots/tests/lookupflag_ignore_base.tests [new file with mode: 0644]
test/shape/data/aots/tests/lookupflag_ignore_combination.tests [new file with mode: 0644]
test/shape/data/aots/tests/lookupflag_ignore_ligatures.tests [new file with mode: 0644]
test/shape/data/aots/tests/lookupflag_ignore_marks.tests [new file with mode: 0644]
test/shape/data/aots/update.py [new file with mode: 0755]
test/shape/data/in-house/COPYING [moved from test/shaping/data/in-house/COPYING with 100% similarity]
test/shape/data/in-house/Makefile.am [new file with mode: 0644]
test/shape/data/in-house/Makefile.in [new file with mode: 0644]
test/shape/data/in-house/Makefile.sources [new file with mode: 0644]
test/shape/data/in-house/fonts/03e3f463c3a985bc42096620cc415342818454fb.ttf [moved from test/shaping/data/in-house/fonts/03e3f463c3a985bc42096620cc415342818454fb.ttf with 100% similarity]
test/shape/data/in-house/fonts/051d92f8bc6ff724511b296c27623f824de256e9.ttf [moved from test/shaping/data/in-house/fonts/051d92f8bc6ff724511b296c27623f824de256e9.ttf with 100% similarity]
test/shape/data/in-house/fonts/065b01e54f35f0d849fd43bd5b936212739a50cb.ttf [new file with mode: 0644]
test/shape/data/in-house/fonts/074a5ae6b19de8f29772fdd5df2d3d833f81f5e6.ttf [moved from test/shaping/data/in-house/fonts/074a5ae6b19de8f29772fdd5df2d3d833f81f5e6.ttf with 100% similarity]
test/shape/data/in-house/fonts/07f054357ff8638bac3711b422a1e31180bba863.ttf [moved from test/shaping/data/in-house/fonts/07f054357ff8638bac3711b422a1e31180bba863.ttf with 100% similarity]
test/shape/data/in-house/fonts/08b4b136f418add748dc641eb4a83033476f1170.ttf [new file with mode: 0644]
test/shape/data/in-house/fonts/15dfc433a135a658b9f4b1a861b5cdd9658ccbb9.ttf [moved from test/shaping/data/in-house/fonts/15dfc433a135a658b9f4b1a861b5cdd9658ccbb9.ttf with 100% similarity]
test/shape/data/in-house/fonts/1735326da89f0818cd8c51a0600e9789812c0f94.ttf [moved from test/shaping/data/in-house/fonts/1735326da89f0818cd8c51a0600e9789812c0f94.ttf with 100% similarity]
test/shape/data/in-house/fonts/191826b9643e3f124d865d617ae609db6a2ce203.ttf [moved from test/shaping/data/in-house/fonts/191826b9643e3f124d865d617ae609db6a2ce203.ttf with 100% similarity]
test/shape/data/in-house/fonts/1a3d8f381387dd29be1e897e4b5100ac8b4829e1.ttf [moved from test/shaping/data/in-house/fonts/1a3d8f381387dd29be1e897e4b5100ac8b4829e1.ttf with 100% similarity]
test/shape/data/in-house/fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf [moved from test/shaping/data/in-house/fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf with 100% similarity]
test/shape/data/in-house/fonts/1b66a1f4b076b734caa6397b3e57231af1feaafb.ttf [new file with mode: 0644]
test/shape/data/in-house/fonts/1c04a16f32a39c26c851b7fc014d2e8d298ba2b8.ttf [moved from test/shaping/data/in-house/fonts/1c04a16f32a39c26c851b7fc014d2e8d298ba2b8.ttf with 100% similarity]
test/shape/data/in-house/fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf [moved from test/shaping/data/in-house/fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf with 100% similarity]
test/shape/data/in-house/fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf [moved from test/shaping/data/in-house/fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf with 100% similarity]
test/shape/data/in-house/fonts/1ed7e9064f008f62de6ff0207bb4dd29409597a5.ttf [moved from test/shaping/data/in-house/fonts/1ed7e9064f008f62de6ff0207bb4dd29409597a5.ttf with 100% similarity]
test/shape/data/in-house/fonts/21b7fb9c1eeae260473809fbc1fe330f66a507cd.ttf [moved from test/shaping/data/in-house/fonts/21b7fb9c1eeae260473809fbc1fe330f66a507cd.ttf with 100% similarity]
test/shape/data/in-house/fonts/226bc2deab3846f1a682085f70c67d0421014144.ttf [moved from test/shaping/data/in-house/fonts/226bc2deab3846f1a682085f70c67d0421014144.ttf with 100% similarity]
test/shape/data/in-house/fonts/24b8d24d00ae86f49791b746da4c9d3f717a51a8.ttf [moved from test/shaping/data/in-house/fonts/24b8d24d00ae86f49791b746da4c9d3f717a51a8.ttf with 100% similarity]
test/shape/data/in-house/fonts/2681c1c72d6484ed3410417f521b1b819b4e2392.ttf [moved from test/shaping/data/in-house/fonts/2681c1c72d6484ed3410417f521b1b819b4e2392.ttf with 100% similarity]
test/shape/data/in-house/fonts/270b89df543a7e48e206a2d830c0e10e5265c630.ttf [moved from test/shaping/data/in-house/fonts/270b89df543a7e48e206a2d830c0e10e5265c630.ttf with 100% similarity]
test/shape/data/in-house/fonts/28f497629c04ceb15546c9a70e0730125ed6698d.ttf [moved from test/shaping/data/in-house/fonts/28f497629c04ceb15546c9a70e0730125ed6698d.ttf with 100% similarity]
test/shape/data/in-house/fonts/298c9e1d955f10f6f72c6915c3c6ff9bf9695cec.ttf [moved from test/shaping/data/in-house/fonts/298c9e1d955f10f6f72c6915c3c6ff9bf9695cec.ttf with 100% similarity]
test/shape/data/in-house/fonts/2a670df15b73a5dc75a5cc491bde5ac93c5077dc.ttf [moved from test/shaping/data/in-house/fonts/2a670df15b73a5dc75a5cc491bde5ac93c5077dc.ttf with 100% similarity]
test/shape/data/in-house/fonts/2c25beb56d9c556622d56b0b5d02b4670c034f89.ttf [moved from test/shaping/data/in-house/fonts/2c25beb56d9c556622d56b0b5d02b4670c034f89.ttf with 100% similarity]
test/shape/data/in-house/fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf [moved from test/shaping/data/in-house/fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf with 100% similarity]
test/shape/data/in-house/fonts/3105b51976b879032c66aa93a634b3b3672cd344.ttf [new file with mode: 0644]
test/shape/data/in-house/fonts/341421e629668b1a1242245d39238ca48432d35d.ttf [moved from test/shaping/data/in-house/fonts/341421e629668b1a1242245d39238ca48432d35d.ttf with 100% similarity]
test/shape/data/in-house/fonts/3493e92eaded2661cadde752a39f9d58b11f0326.ttf [moved from test/shaping/data/in-house/fonts/3493e92eaded2661cadde752a39f9d58b11f0326.ttf with 100% similarity]
test/shape/data/in-house/fonts/34da9aab7bee86c4dfc3b85e423435822fdf4b62.ttf [new file with mode: 0644]
test/shape/data/in-house/fonts/37033cc5cf37bb223d7355153016b6ccece93b28.ttf [moved from test/shaping/data/in-house/fonts/37033cc5cf37bb223d7355153016b6ccece93b28.ttf with 100% similarity]
test/shape/data/in-house/fonts/373e67bf41ca264e260a9716162b71a23549e885.ttf [moved from test/shaping/data/in-house/fonts/373e67bf41ca264e260a9716162b71a23549e885.ttf with 100% similarity]
test/shape/data/in-house/fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf [moved from test/shaping/data/in-house/fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf with 100% similarity]
test/shape/data/in-house/fonts/3b791518a9ba89675df02f1eefbc9026a50648a6.ttf [new file with mode: 0644]
test/shape/data/in-house/fonts/3c96e7a303c58475a8c750bf4289bbe73784f37d.ttf [moved from test/shaping/data/in-house/fonts/3c96e7a303c58475a8c750bf4289bbe73784f37d.ttf with 100% similarity]
test/shape/data/in-house/fonts/3cae6bfe5b57c07ba81ddbd54c02fe4f3a1e3bf6.ttf [moved from test/shaping/data/in-house/fonts/3cae6bfe5b57c07ba81ddbd54c02fe4f3a1e3bf6.ttf with 100% similarity]
test/shape/data/in-house/fonts/3cc01fede4debd4b7794ccb1b16cdb9987ea7571.ttf [moved from test/shaping/data/in-house/fonts/3cc01fede4debd4b7794ccb1b16cdb9987ea7571.ttf with 100% similarity]
test/shape/data/in-house/fonts/3cf6f8ac6d647473a43a3100e7494b202b2cfafe.ttf [moved from test/shaping/data/in-house/fonts/3cf6f8ac6d647473a43a3100e7494b202b2cfafe.ttf with 100% similarity]
test/shape/data/in-house/fonts/3d0b77a2360aa6faa1385aaa510509ab70dfbeff.ttf [moved from test/shaping/data/in-house/fonts/3d0b77a2360aa6faa1385aaa510509ab70dfbeff.ttf with 100% similarity]
test/shape/data/in-house/fonts/3e46c3b84c1370a06594736c7f8acebf810bbb3b.ttf [new file with mode: 0644]
test/shape/data/in-house/fonts/3f24aff8b768e586162e9b9d03b15c36508dd2ae.ttf [new file with mode: 0644]
test/shape/data/in-house/fonts/43ef465752be9af900745f72fe29cb853a1401a5.ttf [moved from test/shaping/data/in-house/fonts/43ef465752be9af900745f72fe29cb853a1401a5.ttf with 100% similarity]
test/shape/data/in-house/fonts/45855bc8d46332b39c4ab9e2ee1a26b1f896da6b.ttf [moved from test/shaping/data/in-house/fonts/45855bc8d46332b39c4ab9e2ee1a26b1f896da6b.ttf with 100% similarity]
test/shape/data/in-house/fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf [moved from test/shaping/data/in-house/fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf with 100% similarity]
test/shape/data/in-house/fonts/49c9f7485c1392fa09a1b801bc2ffea79275f22e.ttf [moved from test/shaping/data/in-house/fonts/49c9f7485c1392fa09a1b801bc2ffea79275f22e.ttf with 100% similarity]
test/shape/data/in-house/fonts/4afb0e8b9a86bb9bd73a1247de4e33fbe3c1fd93.ttf [moved from test/shaping/data/in-house/fonts/4afb0e8b9a86bb9bd73a1247de4e33fbe3c1fd93.ttf with 100% similarity]
test/shape/data/in-house/fonts/4cbbc461be066fccc611dcc634af6e8cb2705537.ttf [moved from test/shaping/data/in-house/fonts/4cbbc461be066fccc611dcc634af6e8cb2705537.ttf with 100% similarity]
test/shape/data/in-house/fonts/4cce528e99f600ed9c25a2b69e32eb94a03b4ae8.ttf [moved from test/shaping/data/in-house/fonts/4cce528e99f600ed9c25a2b69e32eb94a03b4ae8.ttf with 100% similarity]
test/shape/data/in-house/fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf [moved from test/shaping/data/in-house/fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf with 100% similarity]
test/shape/data/in-house/fonts/4fac3929fc3332834e93673780ec0fe94342d193.ttf [moved from test/shaping/data/in-house/fonts/4fac3929fc3332834e93673780ec0fe94342d193.ttf with 100% similarity]
test/shape/data/in-house/fonts/5028afb650b1bb718ed2131e872fbcce57828fff.ttf [moved from test/shaping/data/in-house/fonts/5028afb650b1bb718ed2131e872fbcce57828fff.ttf with 100% similarity]
test/shape/data/in-house/fonts/53374c7ca3657be37efde7ed02ae34229a56ae1f.ttf [moved from test/shaping/data/in-house/fonts/53374c7ca3657be37efde7ed02ae34229a56ae1f.ttf with 100% similarity]
test/shape/data/in-house/fonts/53a91c20e33a596f2be17fb68b382d6b7eb85d5c.ttf [moved from test/shaping/data/in-house/fonts/53a91c20e33a596f2be17fb68b382d6b7eb85d5c.ttf with 100% similarity]
test/shape/data/in-house/fonts/54674a3111d209fb6be0ed31745314b7a8d2c244.ttf [moved from test/shaping/data/in-house/fonts/54674a3111d209fb6be0ed31745314b7a8d2c244.ttf with 100% similarity]
test/shape/data/in-house/fonts/55c88ebbe938680b08f92c3de20713183e0c7481.ttf [moved from test/shaping/data/in-house/fonts/55c88ebbe938680b08f92c3de20713183e0c7481.ttf with 100% similarity]
test/shape/data/in-house/fonts/56cfd0e18d07f41c38e9598545a6d369127fc6f9.ttf [moved from test/shaping/data/in-house/fonts/56cfd0e18d07f41c38e9598545a6d369127fc6f9.ttf with 100% similarity]
test/shape/data/in-house/fonts/573d3a3177c9a8646e94c8a0d7b224334340946a.ttf [moved from test/shaping/data/in-house/fonts/573d3a3177c9a8646e94c8a0d7b224334340946a.ttf with 100% similarity]
test/shape/data/in-house/fonts/57a9d9f83020155cbb1d2be1f43d82388cbecc88.ttf [moved from test/shaping/data/in-house/fonts/57a9d9f83020155cbb1d2be1f43d82388cbecc88.ttf with 100% similarity]
test/shape/data/in-house/fonts/59a585a63b3df608fbeef00956c8c108deec7de6.ttf [moved from test/shaping/data/in-house/fonts/59a585a63b3df608fbeef00956c8c108deec7de6.ttf with 100% similarity]
test/shape/data/in-house/fonts/5af5361ed4d1e8305780b100e1730cb09132f8d1.ttf [moved from test/shaping/data/in-house/fonts/5af5361ed4d1e8305780b100e1730cb09132f8d1.ttf with 100% similarity]
test/shape/data/in-house/fonts/5bb74492f5e0ffa1fbb72e4c881be035120b6513.ttf [moved from test/shaping/data/in-house/fonts/5bb74492f5e0ffa1fbb72e4c881be035120b6513.ttf with 100% similarity]
test/shape/data/in-house/fonts/5dfad7735c6a67085f1b90d4d497e32907db4c78.ttf [moved from test/shaping/data/in-house/fonts/5dfad7735c6a67085f1b90d4d497e32907db4c78.ttf with 100% similarity]
test/shape/data/in-house/fonts/604026ae5aaca83c49cd8416909d71ba3e1c1194.ttf [moved from test/shaping/data/in-house/fonts/604026ae5aaca83c49cd8416909d71ba3e1c1194.ttf with 100% similarity]
test/shape/data/in-house/fonts/641ca9d7808b01cafa9a666c13811c9b56eb9c52.ttf [moved from test/shaping/data/in-house/fonts/641ca9d7808b01cafa9a666c13811c9b56eb9c52.ttf with 100% similarity]
test/shape/data/in-house/fonts/65984dfce552a785f564422aadf4715fa07795ad.ttf [new file with mode: 0644]
test/shape/data/in-house/fonts/663aef6b019dbf45ffd74089e2b5f2496ceceb18.ttf [moved from test/shaping/data/in-house/fonts/663aef6b019dbf45ffd74089e2b5f2496ceceb18.ttf with 100% similarity]
test/shape/data/in-house/fonts/6677074106f94a2644da6aaaacd5bbd48cbdc7de.ttf [new file with mode: 0644]
test/shape/data/in-house/fonts/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf [moved from test/shaping/data/in-house/fonts/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf with 100% similarity]
test/shape/data/in-house/fonts/6f36d056bad6d478fc0bf7397bd52dc3bd197d5f.ttf [new file with mode: 0644]
test/shape/data/in-house/fonts/6ff0fbead4462d9f229167b4e6839eceb8465058.ttf [moved from test/shaping/data/in-house/fonts/6ff0fbead4462d9f229167b4e6839eceb8465058.ttf with 100% similarity]
test/shape/data/in-house/fonts/706c5d7b625f207bc0d874c67237aad6f1e9cd6f.ttf [moved from test/shaping/data/in-house/fonts/706c5d7b625f207bc0d874c67237aad6f1e9cd6f.ttf with 100% similarity]
test/shape/data/in-house/fonts/738d9f3b8c2dfd03875bf35a61d28fd78faf17c8.ttf [moved from test/shaping/data/in-house/fonts/738d9f3b8c2dfd03875bf35a61d28fd78faf17c8.ttf with 100% similarity]
test/shape/data/in-house/fonts/73e84dac2fc6a2d1bc9250d1414353661088937d.ttf [moved from test/shaping/data/in-house/fonts/73e84dac2fc6a2d1bc9250d1414353661088937d.ttf with 100% similarity]
test/shape/data/in-house/fonts/757ebd573617a24aa9dfbf0b885c54875c6fe06b.ttf [moved from test/shaping/data/in-house/fonts/757ebd573617a24aa9dfbf0b885c54875c6fe06b.ttf with 100% similarity]
test/shape/data/in-house/fonts/7a37dc4d5bf018456aea291cee06daf004c0221c.ttf [moved from test/shaping/data/in-house/fonts/7a37dc4d5bf018456aea291cee06daf004c0221c.ttf with 100% similarity]
test/shape/data/in-house/fonts/7d18685e1529e4ceaad5b6095dfab2f9789e5bce.ttf [moved from test/shaping/data/in-house/fonts/7d18685e1529e4ceaad5b6095dfab2f9789e5bce.ttf with 100% similarity]
test/shape/data/in-house/fonts/7e14e7883ed152baa158b80e207b66114c823a8b.ttf [moved from test/shaping/data/in-house/fonts/7e14e7883ed152baa158b80e207b66114c823a8b.ttf with 100% similarity]
test/shape/data/in-house/fonts/8099955657a54e9ee38a6ba1d6f950ce58e3cc25.ttf [moved from test/shaping/data/in-house/fonts/8099955657a54e9ee38a6ba1d6f950ce58e3cc25.ttf with 100% similarity]
test/shape/data/in-house/fonts/8116e5d8fedfbec74e45dc350d2416d810bed8c4.ttf [moved from test/shaping/data/in-house/fonts/8116e5d8fedfbec74e45dc350d2416d810bed8c4.ttf with 100% similarity]
test/shape/data/in-house/fonts/813c2f8e5512187fd982417a7fb4286728e6f4a8.ttf [moved from test/shaping/data/in-house/fonts/813c2f8e5512187fd982417a7fb4286728e6f4a8.ttf with 100% similarity]
test/shape/data/in-house/fonts/81c368a33816fb20e9f647e8f24e2180f4720263.ttf [moved from test/shaping/data/in-house/fonts/81c368a33816fb20e9f647e8f24e2180f4720263.ttf with 100% similarity]
test/shape/data/in-house/fonts/8228d035fcd65d62ec9728fb34f42c63be93a5d3.ttf [moved from test/shaping/data/in-house/fonts/8228d035fcd65d62ec9728fb34f42c63be93a5d3.ttf with 100% similarity]
test/shape/data/in-house/fonts/82f4f3b57bb55344e72e70231380202a52af5805.ttf [moved from test/shaping/data/in-house/fonts/82f4f3b57bb55344e72e70231380202a52af5805.ttf with 100% similarity]
test/shape/data/in-house/fonts/8454d22037f892e76614e1645d066689a0200e61.ttf [moved from test/shaping/data/in-house/fonts/8454d22037f892e76614e1645d066689a0200e61.ttf with 100% similarity]
test/shape/data/in-house/fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf [moved from test/shaping/data/in-house/fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf with 100% similarity]
test/shape/data/in-house/fonts/856ff9562451293cbeff6f396d4e3877c4f0a436.ttf [moved from test/shaping/data/in-house/fonts/856ff9562451293cbeff6f396d4e3877c4f0a436.ttf with 100% similarity]
test/shape/data/in-house/fonts/85fe0be440c64ac77699e21c2f1bd933a919167e.ttf [moved from test/shaping/data/in-house/fonts/85fe0be440c64ac77699e21c2f1bd933a919167e.ttf with 100% similarity]
test/shape/data/in-house/fonts/86cdd983c4e4c4d7f27dd405d6ceb7d4b9ed3d35.ttf [moved from test/shaping/data/in-house/fonts/86cdd983c4e4c4d7f27dd405d6ceb7d4b9ed3d35.ttf with 100% similarity]
test/shape/data/in-house/fonts/872d2955d326bd6676a06f66b8238ebbaabc212f.ttf [new file with mode: 0644]
test/shape/data/in-house/fonts/87f85d17d26f1fe9ad28d7365101958edaefb967.ttf [moved from test/shaping/data/in-house/fonts/87f85d17d26f1fe9ad28d7365101958edaefb967.ttf with 100% similarity]
test/shape/data/in-house/fonts/881642af1667ae30a54e58de8be904566d00508f.ttf [moved from test/shaping/data/in-house/fonts/881642af1667ae30a54e58de8be904566d00508f.ttf with 100% similarity]
test/shape/data/in-house/fonts/8a9fea2a7384f2116e5b84a9b31f83be7850ce21.ttf [moved from test/shaping/data/in-house/fonts/8a9fea2a7384f2116e5b84a9b31f83be7850ce21.ttf with 100% similarity]
test/shape/data/in-house/fonts/8d9c4b193808b8bde94389ba7831c1fc6f9e794e.ttf [moved from test/shaping/data/in-house/fonts/8d9c4b193808b8bde94389ba7831c1fc6f9e794e.ttf with 100% similarity]
test/shape/data/in-house/fonts/932ad5132c2761297c74e9976fe25b08e5ffa10b.ttf [moved from test/shaping/data/in-house/fonts/932ad5132c2761297c74e9976fe25b08e5ffa10b.ttf with 100% similarity]
test/shape/data/in-house/fonts/94a5d6fb15a27521fba9ea4aee9cb39b2d03322a.ttf [moved from test/shaping/data/in-house/fonts/94a5d6fb15a27521fba9ea4aee9cb39b2d03322a.ttf with 100% similarity]
test/shape/data/in-house/fonts/96490dd2ff81233b335a650e7eb660e0e7b2eeea.ttf [moved from test/shaping/data/in-house/fonts/96490dd2ff81233b335a650e7eb660e0e7b2eeea.ttf with 100% similarity]
test/shape/data/in-house/fonts/98b7887cff91f722b92a8ff800120954606354f9.ttf [moved from test/shaping/data/in-house/fonts/98b7887cff91f722b92a8ff800120954606354f9.ttf with 100% similarity]
test/shape/data/in-house/fonts/9fc3e6960b3520e5304033ef5fd540285f72f14d.ttf [moved from test/shaping/data/in-house/fonts/9fc3e6960b3520e5304033ef5fd540285f72f14d.ttf with 100% similarity]
test/shape/data/in-house/fonts/AdobeBlank2.ttf [new file with mode: 0644]
test/shape/data/in-house/fonts/DFONT.dfont [moved from test/shaping/data/in-house/fonts/DFONT.dfont with 100% similarity]
test/shape/data/in-house/fonts/FallbackPlus-Javanese-no-GDEF.otf [new file with mode: 0644]
test/shape/data/in-house/fonts/HBTest-VF.ttf [new file with mode: 0644]
test/shape/data/in-house/fonts/MORXTwentyeight.ttf [moved from test/shaping/data/in-house/fonts/MORXTwentyeight.ttf with 100% similarity]
test/shape/data/in-house/fonts/NotoNastaliqUrdu-Regular.ttf [new file with mode: 0644]
test/shape/data/in-house/fonts/TRAK.ttf [moved from test/shaping/data/in-house/fonts/TRAK.ttf with 100% similarity]
test/shape/data/in-house/fonts/TTC.ttc [moved from test/shaping/data/in-house/fonts/TTC.ttc with 100% similarity]
test/shape/data/in-house/fonts/a014549f766436cf55b2ceb40e462038938ee899.ttf [moved from test/shaping/data/in-house/fonts/a014549f766436cf55b2ceb40e462038938ee899.ttf with 100% similarity]
test/shape/data/in-house/fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf [moved from test/shaping/data/in-house/fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf with 100% similarity]
test/shape/data/in-house/fonts/a34a7b00f22ffb5fd7eef6933b81c7e71bc2cdfb.ttf [moved from test/shaping/data/in-house/fonts/a34a7b00f22ffb5fd7eef6933b81c7e71bc2cdfb.ttf with 100% similarity]
test/shape/data/in-house/fonts/a6b17da98b9f1565ba428719777bbf94a66403c1.ttf [new file with mode: 0644]
test/shape/data/in-house/fonts/a6c76d1bafde4a0b1026ebcc932d2e5c6fd02442.ttf [moved from test/shaping/data/in-house/fonts/a6c76d1bafde4a0b1026ebcc932d2e5c6fd02442.ttf with 100% similarity]
test/shape/data/in-house/fonts/a706511c65fb278fda87eaf2180ca6684a80f423.ttf [new file with mode: 0644]
test/shape/data/in-house/fonts/a919b33197965846f21074b24e30250d67277bce.ttf [moved from test/shaping/data/in-house/fonts/a919b33197965846f21074b24e30250d67277bce.ttf with 100% similarity]
test/shape/data/in-house/fonts/a98e908e2ed21b22228ea59ebcc0f05034c86f2e.ttf [moved from test/shaping/data/in-house/fonts/a98e908e2ed21b22228ea59ebcc0f05034c86f2e.ttf with 100% similarity]
test/shape/data/in-house/fonts/ab14b4eb9d7a67e293f51d30d719add06c9d6e06.ttf [moved from test/shaping/data/in-house/fonts/ab14b4eb9d7a67e293f51d30d719add06c9d6e06.ttf with 100% similarity]
test/shape/data/in-house/fonts/ab40c89624a6104e5d0a2308e448a989302f515b.ttf [new file with mode: 0644]
test/shape/data/in-house/fonts/ad01ab2ea1cb1a4d3a2783e2675112ef11ae6404.ttf [moved from test/shaping/data/in-house/fonts/ad01ab2ea1cb1a4d3a2783e2675112ef11ae6404.ttf with 100% similarity]
test/shape/data/in-house/fonts/af3086380b743099c54a3b11b96766039ea62fcd.ttf [moved from test/shaping/data/in-house/fonts/af3086380b743099c54a3b11b96766039ea62fcd.ttf with 100% similarity]
test/shape/data/in-house/fonts/af85624080af5627fb050f570d148a62f04fda74.ttf [moved from test/shaping/data/in-house/fonts/af85624080af5627fb050f570d148a62f04fda74.ttf with 100% similarity]
test/shape/data/in-house/fonts/b082211be29a3e2cf91f0fd43497e40b2a27b344.ttf [new file with mode: 0644]
test/shape/data/in-house/fonts/b121d4306b2e3add5abbaad21d95fcf04aacbd64.ttf [new file with mode: 0644]
test/shape/data/in-house/fonts/b151cfcdaa77585d77f17a42158e0873fc8e2633.ttf [moved from test/shaping/data/in-house/fonts/b151cfcdaa77585d77f17a42158e0873fc8e2633.ttf with 100% similarity]
test/shape/data/in-house/fonts/b3075ca42b27dde7341c2d0ae16703c5b6640df0.ttf [new file with mode: 0644]
test/shape/data/in-house/fonts/b31e6c52a31edadc16f1bec9efe6019e2d59824a.ttf [new file with mode: 0644]
test/shape/data/in-house/fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf [moved from test/shaping/data/in-house/fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf with 100% similarity]
test/shape/data/in-house/fonts/b722a7d09e60421f3efbc706ad348ab47b88567b.ttf [moved from test/shaping/data/in-house/fonts/b722a7d09e60421f3efbc706ad348ab47b88567b.ttf with 100% similarity]
test/shape/data/in-house/fonts/bb0c53752e85c3d28973ebc913287b8987d3dfe8.ttf [moved from test/shaping/data/in-house/fonts/bb0c53752e85c3d28973ebc913287b8987d3dfe8.ttf with 100% similarity]
test/shape/data/in-house/fonts/bb9473d2403488714043bcfb946c9f78b86ad627.ttf [moved from test/shaping/data/in-house/fonts/bb9473d2403488714043bcfb946c9f78b86ad627.ttf with 100% similarity]
test/shape/data/in-house/fonts/bf39b0e91ef9807f15a9e283a21a14a209fd2cfc.ttf [moved from test/shaping/data/in-house/fonts/bf39b0e91ef9807f15a9e283a21a14a209fd2cfc.ttf with 100% similarity]
test/shape/data/in-house/fonts/bf962d3202883a820aed019d9b5c1838c2ff69c6.ttf [moved from test/shaping/data/in-house/fonts/bf962d3202883a820aed019d9b5c1838c2ff69c6.ttf with 100% similarity]
test/shape/data/in-house/fonts/c4e48b0886ef460f532fb49f00047ec92c432ec0.ttf [moved from test/shaping/data/in-house/fonts/c4e48b0886ef460f532fb49f00047ec92c432ec0.ttf with 100% similarity]
test/shape/data/in-house/fonts/cc5f3d2d717fb6bd4dfae1c16d48a2cb8e12233b.ttf [moved from test/shaping/data/in-house/fonts/cc5f3d2d717fb6bd4dfae1c16d48a2cb8e12233b.ttf with 100% similarity]
test/shape/data/in-house/fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf [moved from test/shaping/data/in-house/fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf with 100% similarity]
test/shape/data/in-house/fonts/d3129450fafe5e5c98cfc25a4e71809b1b4d2855.ttf [moved from test/shaping/data/in-house/fonts/d3129450fafe5e5c98cfc25a4e71809b1b4d2855.ttf with 100% similarity]
test/shape/data/in-house/fonts/d629e7fedc0b350222d7987345fe61613fa3929a.ttf [moved from test/shaping/data/in-house/fonts/d629e7fedc0b350222d7987345fe61613fa3929a.ttf with 100% similarity]
test/shape/data/in-house/fonts/d9b8bc10985f24796826c29f7ccba3d0ae11ec02.ttf [moved from test/shaping/data/in-house/fonts/d9b8bc10985f24796826c29f7ccba3d0ae11ec02.ttf with 100% similarity]
test/shape/data/in-house/fonts/dcf774ca21062e7439f98658b18974ea8b956d0c.ttf [moved from test/shaping/data/in-house/fonts/dcf774ca21062e7439f98658b18974ea8b956d0c.ttf with 100% similarity]
test/shape/data/in-house/fonts/df768b9c257e0c9c35786c47cae15c46571d56be.ttf [moved from test/shaping/data/in-house/fonts/df768b9c257e0c9c35786c47cae15c46571d56be.ttf with 100% similarity]
test/shape/data/in-house/fonts/e207635780b42f898d58654b65098763e340f5c7.ttf [moved from test/shaping/data/in-house/fonts/e207635780b42f898d58654b65098763e340f5c7.ttf with 100% similarity]
test/shape/data/in-house/fonts/e2b17207c4b7ad78d843e1b0c4d00b09398a1137.ttf [new file with mode: 0644]
test/shape/data/in-house/fonts/e39391c77a6321c2ac7a2d644de0396470cd4bfe.ttf [moved from test/shaping/data/in-house/fonts/e39391c77a6321c2ac7a2d644de0396470cd4bfe.ttf with 100% similarity]
test/shape/data/in-house/fonts/e5ff44940364c2247abed50bdda30d2ef5aedfe4.ttf [new file with mode: 0644]
test/shape/data/in-house/fonts/e6185e88b04432fbf373594d5971686bb7dd698d.ttf [new file with mode: 0644]
test/shape/data/in-house/fonts/e68a88939e0f06e34d2bc911f09b70890289c8fd.ttf [moved from test/shaping/data/in-house/fonts/e68a88939e0f06e34d2bc911f09b70890289c8fd.ttf with 100% similarity]
test/shape/data/in-house/fonts/e8691822f6a705e3e9fb48a0405c645b1a036590.ttf [new file with mode: 0644]
test/shape/data/in-house/fonts/ea3f63620511b2097200d23774ffef197e829e69.ttf [moved from test/shaping/data/in-house/fonts/ea3f63620511b2097200d23774ffef197e829e69.ttf with 100% similarity]
test/shape/data/in-house/fonts/ee39587d13b2afa5499cc79e45780aa79293bbd4.ttf [moved from test/shaping/data/in-house/fonts/ee39587d13b2afa5499cc79e45780aa79293bbd4.ttf with 100% similarity]
test/shape/data/in-house/fonts/ef86fe710cfea877bbe0dbb6946a1f88d0661031.ttf [moved from test/shaping/data/in-house/fonts/ef86fe710cfea877bbe0dbb6946a1f88d0661031.ttf with 100% similarity]
test/shape/data/in-house/fonts/f22416c692720a7d46fadf4af99f4c9e094f00b9.ttf [moved from test/shaping/data/in-house/fonts/f22416c692720a7d46fadf4af99f4c9e094f00b9.ttf with 100% similarity]
test/shape/data/in-house/fonts/f443753e8ffe8e8aae606cfba158e00334b6efb1.ttf [moved from test/shaping/data/in-house/fonts/f443753e8ffe8e8aae606cfba158e00334b6efb1.ttf with 100% similarity]
test/shape/data/in-house/fonts/f499fbc23865022234775c43503bba2e63978fe1.ttf [moved from test/shaping/data/in-house/fonts/f499fbc23865022234775c43503bba2e63978fe1.ttf with 100% similarity]
test/shape/data/in-house/fonts/f518eb6f6b5eec2946c9fbbbde44e45d46f5e2ac.ttf [moved from test/shaping/data/in-house/fonts/f518eb6f6b5eec2946c9fbbbde44e45d46f5e2ac.ttf with 100% similarity]
test/shape/data/in-house/fonts/f75c4b05a0a4d67c1a808081ae3d74a9c66509e8.ttf [moved from test/shaping/data/in-house/fonts/f75c4b05a0a4d67c1a808081ae3d74a9c66509e8.ttf with 100% similarity]
test/shape/data/in-house/fonts/f79eb71df4e4c9c273b67b89a06e5ff9e3c1f834.ttf [moved from test/shaping/data/in-house/fonts/f79eb71df4e4c9c273b67b89a06e5ff9e3c1f834.ttf with 100% similarity]
test/shape/data/in-house/fonts/f9b1dd4dcb515e757789a22cb4241107746fd3d0.ttf [moved from test/shaping/data/in-house/fonts/f9b1dd4dcb515e757789a22cb4241107746fd3d0.ttf with 100% similarity]
test/shape/data/in-house/fonts/fbb6c84c9e1fe0c39e152fbe845e51fd81f6748e.ttf [moved from test/shaping/data/in-house/fonts/fbb6c84c9e1fe0c39e152fbe845e51fd81f6748e.ttf with 100% similarity]
test/shape/data/in-house/fonts/fcbaa518d3cce441ed37ae3b1fed6a19e9b54efd.ttf [moved from test/shaping/data/in-house/fonts/fcbaa518d3cce441ed37ae3b1fed6a19e9b54efd.ttf with 100% similarity]
test/shape/data/in-house/fonts/fcdcffbdf1c4c97c05308d7600e4c283eb47dbca.ttf [moved from test/shaping/data/in-house/fonts/fcdcffbdf1c4c97c05308d7600e4c283eb47dbca.ttf with 100% similarity]
test/shape/data/in-house/fonts/fcea341ba6489536390384d8403ce5287ba71a4a.ttf [new file with mode: 0644]
test/shape/data/in-house/fonts/fd07ea46e4d8368ada1776208c07fd596f727852.ttf [new file with mode: 0644]
test/shape/data/in-house/fonts/ffa0f5d2d9025486d8469d8b1fdd983e7632499b.ttf [moved from test/shaping/data/in-house/fonts/ffa0f5d2d9025486d8469d8b1fdd983e7632499b.ttf with 100% similarity]
test/shape/data/in-house/meson.build [new file with mode: 0644]
test/shape/data/in-house/tests/aat-morx.tests [new file with mode: 0644]
test/shape/data/in-house/tests/aat-trak.tests [new file with mode: 0644]
test/shape/data/in-house/tests/arabic-fallback-shaping.tests [new file with mode: 0644]
test/shape/data/in-house/tests/arabic-feature-order.tests [new file with mode: 0644]
test/shape/data/in-house/tests/arabic-like-joining.tests [new file with mode: 0644]
test/shape/data/in-house/tests/arabic-mark-attach.tests [new file with mode: 0644]
test/shape/data/in-house/tests/arabic-mark-order.tests [new file with mode: 0644]
test/shape/data/in-house/tests/arabic-normalization.tests [new file with mode: 0644]
test/shape/data/in-house/tests/arabic-stch.tests [new file with mode: 0644]
test/shape/data/in-house/tests/automatic-fractions.tests [new file with mode: 0644]
test/shape/data/in-house/tests/cluster.tests [new file with mode: 0644]
test/shape/data/in-house/tests/collections.tests [new file with mode: 0644]
test/shape/data/in-house/tests/color-fonts.tests [new file with mode: 0644]
test/shape/data/in-house/tests/context-matching.tests [new file with mode: 0644]
test/shape/data/in-house/tests/cursive-positioning.tests [new file with mode: 0644]
test/shape/data/in-house/tests/default-ignorables.tests [new file with mode: 0644]
test/shape/data/in-house/tests/digits.tests [new file with mode: 0644]
test/shape/data/in-house/tests/emoji-clusters.tests [new file with mode: 0644]
test/shape/data/in-house/tests/emoji.tests [new file with mode: 0644]
test/shape/data/in-house/tests/fallback-positioning.tests [new file with mode: 0644]
test/shape/data/in-house/tests/glyph-props-no-gdef.tests [new file with mode: 0644]
test/shape/data/in-house/tests/hangul-jamo.tests [new file with mode: 0644]
test/shape/data/in-house/tests/hyphens.tests [new file with mode: 0644]
test/shape/data/in-house/tests/indic-consonant-with-stacker.tests [new file with mode: 0644]
test/shape/data/in-house/tests/indic-decompose.tests [new file with mode: 0644]
test/shape/data/in-house/tests/indic-init.tests [new file with mode: 0644]
test/shape/data/in-house/tests/indic-joiner-candrabindu.tests [new file with mode: 0644]
test/shape/data/in-house/tests/indic-joiners.tests [new file with mode: 0644]
test/shape/data/in-house/tests/indic-old-spec.tests [new file with mode: 0644]
test/shape/data/in-house/tests/indic-pref-blocking.tests [new file with mode: 0644]
test/shape/data/in-house/tests/indic-script-extensions.tests [new file with mode: 0644]
test/shape/data/in-house/tests/indic-special-cases.tests [new file with mode: 0644]
test/shape/data/in-house/tests/indic-syllable.tests [new file with mode: 0644]
test/shape/data/in-house/tests/indic-vowel-letter-spoofing.tests [new file with mode: 0644]
test/shape/data/in-house/tests/item-context.tests [new file with mode: 0644]
test/shape/data/in-house/tests/kern-format2.tests [new file with mode: 0644]
test/shape/data/in-house/tests/khmer-mark-order.tests [new file with mode: 0644]
test/shape/data/in-house/tests/khmer-misc.tests [new file with mode: 0644]
test/shape/data/in-house/tests/language-tags.tests [new file with mode: 0644]
test/shape/data/in-house/tests/ligature-id.tests [new file with mode: 0644]
test/shape/data/in-house/tests/macos.tests [new file with mode: 0644]
test/shape/data/in-house/tests/mark-attachment.tests [new file with mode: 0644]
test/shape/data/in-house/tests/mark-filtering-sets.tests [new file with mode: 0644]
test/shape/data/in-house/tests/mongolian-variation-selector.tests [new file with mode: 0644]
test/shape/data/in-house/tests/myanmar-misc.tests [new file with mode: 0644]
test/shape/data/in-house/tests/myanmar-syllable.tests [new file with mode: 0644]
test/shape/data/in-house/tests/myanmar-zawgyi.tests [new file with mode: 0644]
test/shape/data/in-house/tests/nested-mark-filtering-sets.tests [new file with mode: 0644]
test/shape/data/in-house/tests/none-directional.tests [new file with mode: 0644]
test/shape/data/in-house/tests/positioning-features.tests [new file with mode: 0644]
test/shape/data/in-house/tests/rand.tests [new file with mode: 0644]
test/shape/data/in-house/tests/reverse-sub.tests [new file with mode: 0644]
test/shape/data/in-house/tests/rotation.tests [new file with mode: 0644]
test/shape/data/in-house/tests/simple.tests [new file with mode: 0644]
test/shape/data/in-house/tests/sinhala.tests [new file with mode: 0644]
test/shape/data/in-house/tests/spaces.tests [new file with mode: 0644]
test/shape/data/in-house/tests/tibetan-contractions-1.tests [new file with mode: 0644]
test/shape/data/in-house/tests/tibetan-contractions-2.tests [new file with mode: 0644]
test/shape/data/in-house/tests/tibetan-vowels.tests [new file with mode: 0644]
test/shape/data/in-house/tests/tt-kern-gpos.tests [new file with mode: 0644]
test/shape/data/in-house/tests/unsafe-to-concat.tests [new file with mode: 0644]
test/shape/data/in-house/tests/use-indic3.tests [new file with mode: 0644]
test/shape/data/in-house/tests/use-marchen.tests [new file with mode: 0644]
test/shape/data/in-house/tests/use-syllable.tests [new file with mode: 0644]
test/shape/data/in-house/tests/use-vowel-letter-spoofing.tests [new file with mode: 0644]
test/shape/data/in-house/tests/use.tests [new file with mode: 0644]
test/shape/data/in-house/tests/variations-rvrn.tests [new file with mode: 0644]
test/shape/data/in-house/tests/variations.tests [new file with mode: 0644]
test/shape/data/in-house/tests/vertical.tests [new file with mode: 0644]
test/shape/data/in-house/tests/zero-width-marks.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/COPYING [moved from test/shaping/data/text-rendering-tests/COPYING with 100% similarity]
test/shape/data/text-rendering-tests/DISABLED [moved from test/shaping/data/text-rendering-tests/DISABLED with 100% similarity]
test/shape/data/text-rendering-tests/Makefile.am [new file with mode: 0644]
test/shape/data/text-rendering-tests/Makefile.in [new file with mode: 0644]
test/shape/data/text-rendering-tests/Makefile.sources [moved from test/shaping/data/text-rendering-tests/Makefile.sources with 100% similarity]
test/shape/data/text-rendering-tests/README [moved from test/shaping/data/text-rendering-tests/README with 100% similarity]
test/shape/data/text-rendering-tests/fonts/AdobeVFPrototype-Subset.otf [moved from test/shaping/data/text-rendering-tests/fonts/AdobeVFPrototype-Subset.otf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/FDArrayTest257.otf [moved from test/shaping/data/text-rendering-tests/fonts/FDArrayTest257.otf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/FDArrayTest65535.otf [moved from test/shaping/data/text-rendering-tests/fonts/FDArrayTest65535.otf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/NotoSansBalinese-Regular.ttf [moved from test/shaping/data/text-rendering-tests/fonts/NotoSansBalinese-Regular.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/NotoSansKannada-Regular.ttf [moved from test/shaping/data/text-rendering-tests/fonts/NotoSansKannada-Regular.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/NotoSerifKannada-Regular.ttf [moved from test/shaping/data/text-rendering-tests/fonts/NotoSerifKannada-Regular.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/Selawik-README.md [moved from test/shaping/data/text-rendering-tests/fonts/Selawik-README.md with 100% similarity]
test/shape/data/text-rendering-tests/fonts/Selawik-variable.ttf [moved from test/shaping/data/text-rendering-tests/fonts/Selawik-variable.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestAVAR.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestAVAR.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestCMAP14.otf [moved from test/shaping/data/text-rendering-tests/fonts/TestCMAP14.otf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestCMAPMacTurkish.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestCMAPMacTurkish.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestCVARGVAROne.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestCVARGVAROne.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestCVARGVARTwo.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestCVARGVARTwo.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestGLYFOne.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestGLYFOne.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestGPOSFour.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestGPOSFour.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestGPOSOne.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestGPOSOne.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestGPOSThree.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestGPOSThree.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestGPOSTwo.otf [moved from test/shaping/data/text-rendering-tests/fonts/TestGPOSTwo.otf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestGSUBOne.otf [moved from test/shaping/data/text-rendering-tests/fonts/TestGSUBOne.otf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestGSUBThree.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestGSUBThree.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestGVAR-Composite-0.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestGVAR-Composite-0.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestGVAR-Composite-Missing.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestGVAR-Composite-Missing.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestGVAREight.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestGVAREight.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestGVARFour.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestGVARFour.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestGVARNine.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestGVARNine.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestGVAROne.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestGVAROne.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestGVARThree.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestGVARThree.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestGVARTwo.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestGVARTwo.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestHVAROne.otf [moved from test/shaping/data/text-rendering-tests/fonts/TestHVAROne.otf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestHVARTwo.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestHVARTwo.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestKERNOne.otf [moved from test/shaping/data/text-rendering-tests/fonts/TestKERNOne.otf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestMORXEight.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestMORXEight.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestMORXEighteen.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestMORXEighteen.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestMORXEleven.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestMORXEleven.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestMORXForty.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestMORXForty.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestMORXFour.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestMORXFour.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestMORXFourteen.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestMORXFourteen.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestMORXFourtyone.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestMORXFourtyone.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestMORXNine.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestMORXNine.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestMORXOne.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestMORXOne.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestMORXSeventeen.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestMORXSeventeen.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestMORXSixteen.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestMORXSixteen.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestMORXTen.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestMORXTen.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestMORXThirteen.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestMORXThirteen.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestMORXThirtyeight.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestMORXThirtyeight.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestMORXThirtyfive.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestMORXThirtyfive.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestMORXThirtyfour.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestMORXThirtyfour.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestMORXThirtynine.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestMORXThirtynine.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestMORXThirtyone.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestMORXThirtyone.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestMORXThirtyseven.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestMORXThirtyseven.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestMORXThirtysix.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestMORXThirtysix.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestMORXThirtythree.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestMORXThirtythree.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestMORXThirtytwo.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestMORXThirtytwo.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestMORXThree.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestMORXThree.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestMORXTwelve.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestMORXTwelve.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestMORXTwenty.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestMORXTwenty.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestMORXTwentyeight.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestMORXTwentyeight.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestMORXTwentyfive.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestMORXTwentyfive.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestMORXTwentyfour.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestMORXTwentyfour.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestMORXTwentynine.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestMORXTwentynine.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestMORXTwentyone.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestMORXTwentyone.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestMORXTwentyseven.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestMORXTwentyseven.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestMORXTwentysix.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestMORXTwentysix.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestMORXTwentythree.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestMORXTwentythree.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestMORXTwentytwo.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestMORXTwentytwo.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestMORXTwo.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestMORXTwo.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestSFNTOne.otf [moved from test/shaping/data/text-rendering-tests/fonts/TestSFNTOne.otf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestSFNTTwo.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestSFNTTwo.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestSVGgradientTransform.otf [moved from test/shaping/data/text-rendering-tests/fonts/TestSVGgradientTransform.otf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestSVGgzip.otf [moved from test/shaping/data/text-rendering-tests/fonts/TestSVGgzip.otf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestSVGmultiGlyphs.otf [moved from test/shaping/data/text-rendering-tests/fonts/TestSVGmultiGlyphs.otf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestShapeAran.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestShapeAran.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestShapeEthi.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestShapeEthi.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestShapeKndaV3.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestShapeKndaV3.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestShapeLana.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestShapeLana.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/TestTRAKOne.ttf [moved from test/shaping/data/text-rendering-tests/fonts/TestTRAKOne.ttf with 100% similarity]
test/shape/data/text-rendering-tests/fonts/Zycon.ttf [moved from test/shaping/data/text-rendering-tests/fonts/Zycon.ttf with 100% similarity]
test/shape/data/text-rendering-tests/meson.build [moved from test/shaping/data/text-rendering-tests/meson.build with 100% similarity]
test/shape/data/text-rendering-tests/tests/AVAR-1.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/CFF-1.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/CFF-2.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/CFF2-1.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/CMAP-1.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/CMAP-2.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/CVAR-1.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/CVAR-2.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/GLYF-1.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/GPOS-1.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/GPOS-2.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/GPOS-3.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/GPOS-4.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/GPOS-5.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/GSUB-1.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/GSUB-2.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/GSUB-3.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/GVAR-1.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/GVAR-2.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/GVAR-3.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/GVAR-4.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/GVAR-5.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/GVAR-6.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/GVAR-7.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/GVAR-8.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/GVAR-9.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/HVAR-1.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/HVAR-2.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/KERN-1.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/KERN-2.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/MORX-1.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/MORX-10.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/MORX-11.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/MORX-12.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/MORX-13.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/MORX-14.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/MORX-16.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/MORX-17.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/MORX-18.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/MORX-19.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/MORX-2.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/MORX-20.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/MORX-21.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/MORX-22.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/MORX-23.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/MORX-24.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/MORX-25.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/MORX-26.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/MORX-27.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/MORX-28.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/MORX-29.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/MORX-3.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/MORX-30.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/MORX-31.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/MORX-32.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/MORX-33.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/MORX-34.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/MORX-35.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/MORX-36.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/MORX-37.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/MORX-38.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/MORX-39.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/MORX-4.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/MORX-40.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/MORX-41.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/MORX-5.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/MORX-6.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/MORX-7.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/MORX-8.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/MORX-9.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/SFNT-1.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/SFNT-2.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/SHBALI-3.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/tests/SHKNDA-1.tests [new file with mode: 0644]
test/shape/data/text-rendering-tests/update.py [new file with mode: 0755]
test/shape/hb-diff [moved from test/shaping/hb-diff with 100% similarity]
test/shape/hb-diff-colorize [moved from test/shaping/hb-diff-colorize with 100% similarity]
test/shape/hb-diff-filter-failures [moved from test/shaping/hb-diff-filter-failures with 100% similarity]
test/shape/hb-diff-stat [moved from test/shaping/hb-diff-stat with 100% similarity]
test/shape/hb-unicode-decode [moved from test/shaping/hb-unicode-decode with 100% similarity]
test/shape/hb-unicode-encode [moved from test/shaping/hb-unicode-encode with 100% similarity]
test/shape/hb-unicode-prettyname [moved from test/shaping/hb-unicode-prettyname with 100% similarity]
test/shape/hb_test_tools.py [new file with mode: 0644]
test/shape/meson.build [new file with mode: 0644]
test/shape/record-test.sh [new file with mode: 0755]
test/shape/run-tests.py [new file with mode: 0755]
test/shape/texts/in-house/shaper-arabic/script-arabic/language-persian/mehran.txt [moved from test/shaping/texts/in-house/shaper-arabic/script-arabic/language-persian/mehran.txt with 100% similarity]
test/shape/texts/in-house/shaper-arabic/script-arabic/language-urdu/crulp/ligatures/2grams.txt [moved from test/shaping/texts/in-house/shaper-arabic/script-arabic/language-urdu/crulp/ligatures/2grams.txt with 100% similarity]
test/shape/texts/in-house/shaper-arabic/script-arabic/language-urdu/crulp/ligatures/3grams.txt [moved from test/shaping/texts/in-house/shaper-arabic/script-arabic/language-urdu/crulp/ligatures/3grams.txt with 100% similarity]
test/shape/texts/in-house/shaper-arabic/script-arabic/language-urdu/crulp/ligatures/4grams.txt [moved from test/shaping/texts/in-house/shaper-arabic/script-arabic/language-urdu/crulp/ligatures/4grams.txt with 100% similarity]
test/shape/texts/in-house/shaper-arabic/script-arabic/language-urdu/crulp/ligatures/5grams.txt [moved from test/shaping/texts/in-house/shaper-arabic/script-arabic/language-urdu/crulp/ligatures/5grams.txt with 100% similarity]
test/shape/texts/in-house/shaper-arabic/script-arabic/language-urdu/crulp/ligatures/6grams.txt [moved from test/shaping/texts/in-house/shaper-arabic/script-arabic/language-urdu/crulp/ligatures/6grams.txt with 100% similarity]
test/shape/texts/in-house/shaper-arabic/script-arabic/language-urdu/crulp/ligatures/7grams.txt [moved from test/shaping/texts/in-house/shaper-arabic/script-arabic/language-urdu/crulp/ligatures/7grams.txt with 100% similarity]
test/shape/texts/in-house/shaper-arabic/script-arabic/language-urdu/crulp/ligatures/8grams.txt [moved from test/shaping/texts/in-house/shaper-arabic/script-arabic/language-urdu/crulp/ligatures/8grams.txt with 100% similarity]
test/shape/texts/in-house/shaper-arabic/script-arabic/language-urdu/crulp/ligatures/LICENSE [moved from test/shaping/texts/in-house/shaper-arabic/script-arabic/language-urdu/crulp/ligatures/LICENSE with 100% similarity]
test/shape/texts/in-house/shaper-arabic/script-arabic/language-urdu/crulp/ligatures/README [moved from test/shaping/texts/in-house/shaper-arabic/script-arabic/language-urdu/crulp/ligatures/README with 100% similarity]
test/shape/texts/in-house/shaper-arabic/script-arabic/language-urdu/crulp/ligatures/SOURCES [moved from test/shaping/texts/in-house/shaper-arabic/script-arabic/language-urdu/crulp/ligatures/SOURCES with 100% similarity]
test/shape/texts/in-house/shaper-arabic/script-arabic/misc/diacritics/lam-alef.txt [moved from test/shaping/texts/in-house/shaper-arabic/script-arabic/misc/diacritics/lam-alef.txt with 100% similarity]
test/shape/texts/in-house/shaper-arabic/script-arabic/misc/diacritics/language-arabic.txt [moved from test/shaping/texts/in-house/shaper-arabic/script-arabic/misc/diacritics/language-arabic.txt with 100% similarity]
test/shape/texts/in-house/shaper-arabic/script-arabic/misc/diacritics/language-persian.txt [moved from test/shaping/texts/in-house/shaper-arabic/script-arabic/misc/diacritics/language-persian.txt with 100% similarity]
test/shape/texts/in-house/shaper-arabic/script-arabic/misc/diacritics/language-urdu.txt [moved from test/shaping/texts/in-house/shaper-arabic/script-arabic/misc/diacritics/language-urdu.txt with 100% similarity]
test/shape/texts/in-house/shaper-arabic/script-arabic/misc/diacritics/ligature-components.txt [moved from test/shaping/texts/in-house/shaper-arabic/script-arabic/misc/diacritics/ligature-components.txt with 100% similarity]
test/shape/texts/in-house/shaper-arabic/script-arabic/misc/diacritics/ligature-diacritics.txt [moved from test/shaping/texts/in-house/shaper-arabic/script-arabic/misc/diacritics/ligature-diacritics.txt with 100% similarity]
test/shape/texts/in-house/shaper-arabic/script-arabic/misc/diacritics/mark-skipping.txt [moved from test/shaping/texts/in-house/shaper-arabic/script-arabic/misc/diacritics/mark-skipping.txt with 100% similarity]
test/shape/texts/in-house/shaper-arabic/script-mongolian/misc/misc.txt [moved from test/shaping/texts/in-house/shaper-arabic/script-mongolian/misc/misc.txt with 100% similarity]
test/shape/texts/in-house/shaper-arabic/script-mongolian/misc/non-joining.txt [moved from test/shaping/texts/in-house/shaper-arabic/script-mongolian/misc/non-joining.txt with 100% similarity]
test/shape/texts/in-house/shaper-arabic/script-mongolian/misc/poem.txt [moved from test/shaping/texts/in-house/shaper-arabic/script-mongolian/misc/poem.txt with 100% similarity]
test/shape/texts/in-house/shaper-arabic/script-mongolian/misc/variation-selectors.txt [moved from test/shaping/texts/in-house/shaper-arabic/script-mongolian/misc/variation-selectors.txt with 100% similarity]
test/shape/texts/in-house/shaper-arabic/script-nko/misc/misc.txt [moved from test/shaping/texts/in-house/shaper-arabic/script-nko/misc/misc.txt with 100% similarity]
test/shape/texts/in-house/shaper-arabic/script-phags-pa/misc/misc.txt [moved from test/shaping/texts/in-house/shaper-arabic/script-phags-pa/misc/misc.txt with 100% similarity]
test/shape/texts/in-house/shaper-arabic/script-syriac/misc/abbreviation-mark.txt [moved from test/shaping/texts/in-house/shaper-arabic/script-syriac/misc/abbreviation-mark.txt with 100% similarity]
test/shape/texts/in-house/shaper-arabic/script-syriac/misc/alaph.txt [moved from test/shaping/texts/in-house/shaper-arabic/script-syriac/misc/alaph.txt with 100% similarity]
test/shape/texts/in-house/shaper-default/script-ethiopic/misc/misc.txt [moved from test/shaping/texts/in-house/shaper-default/script-ethiopic/misc/misc.txt with 100% similarity]
test/shape/texts/in-house/shaper-default/script-han/misc/cjk-compat.txt [moved from test/shaping/texts/in-house/shaper-default/script-han/misc/cjk-compat.txt with 100% similarity]
test/shape/texts/in-house/shaper-default/script-hiragana/misc/kazuraki-liga-lines.txt [moved from test/shaping/texts/in-house/shaper-default/script-hiragana/misc/kazuraki-liga-lines.txt with 100% similarity]
test/shape/texts/in-house/shaper-default/script-hiragana/misc/kazuraki-liga.txt [moved from test/shaping/texts/in-house/shaper-default/script-hiragana/misc/kazuraki-liga.txt with 100% similarity]
test/shape/texts/in-house/shaper-default/script-linear-b/misc/misc.txt [moved from test/shaping/texts/in-house/shaper-default/script-linear-b/misc/misc.txt with 100% similarity]
test/shape/texts/in-house/shaper-default/script-tifinagh/misc/misc.txt [moved from test/shaping/texts/in-house/shaper-default/script-tifinagh/misc/misc.txt with 100% similarity]
test/shape/texts/in-house/shaper-hangul/script-hangul/misc/misc.txt [moved from test/shaping/texts/in-house/shaper-hangul/script-hangul/misc/misc.txt with 100% similarity]
test/shape/texts/in-house/shaper-hebrew/script-hebrew/misc/diacritics.txt [moved from test/shaping/texts/in-house/shaper-hebrew/script-hebrew/misc/diacritics.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-assamese/utrrs/LICENSE [moved from test/shaping/texts/in-house/shaper-indic/script-telugu/utrrs/LICENSE with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-assamese/utrrs/README [moved from test/shaping/texts/in-house/shaper-indic/script-telugu/utrrs/README with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-assamese/utrrs/SOURCES [moved from test/shaping/texts/in-house/shaper-indic/script-telugu/utrrs/SOURCES with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt [moved from test/shaping/texts/in-house/shaper-indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt [moved from test/shaping/texts/in-house/shaper-indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt [moved from test/shaping/texts/in-house/shaper-indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt [moved from test/shaping/texts/in-house/shaper-indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt [moved from test/shaping/texts/in-house/shaper-indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt [moved from test/shaping/texts/in-house/shaper-indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt [moved from test/shaping/texts/in-house/shaper-indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-assamese/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt [moved from test/shaping/texts/in-house/shaper-indic/script-assamese/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-assamese/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt [moved from test/shaping/texts/in-house/shaper-indic/script-assamese/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-assamese/utrrs/gsub/IndicFontFeatureGSUB.txt [moved from test/shaping/texts/in-house/shaper-indic/script-assamese/utrrs/gsub/IndicFontFeatureGSUB.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-bengali/bengali-vowel-letters.txt [moved from test/shaping/texts/in-house/shaper-indic/script-bengali/bengali-vowel-letters.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-bengali/misc/misc.txt [moved from test/shaping/texts/in-house/shaper-indic/script-bengali/misc/misc.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-bengali/misc/reph.txt [moved from test/shaping/texts/in-house/shaper-indic/script-bengali/misc/reph.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-bengali/utrrs/LICENSE [moved from test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/LICENSE with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-bengali/utrrs/README [moved from test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/README with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-bengali/utrrs/SOURCES [moved from test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/SOURCES with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt [moved from test/shaping/texts/in-house/shaper-indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt [moved from test/shaping/texts/in-house/shaper-indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt [moved from test/shaping/texts/in-house/shaper-indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt [moved from test/shaping/texts/in-house/shaper-indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt [moved from test/shaping/texts/in-house/shaper-indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt [moved from test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt [moved from test/shaping/texts/in-house/shaper-indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-bengali/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt [moved from test/shaping/texts/in-house/shaper-indic/script-bengali/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-bengali/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt [moved from test/shaping/texts/in-house/shaper-indic/script-bengali/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-bengali/utrrs/gsub/IndicFontFeatureGSUB.txt [moved from test/shaping/texts/in-house/shaper-indic/script-bengali/utrrs/gsub/IndicFontFeatureGSUB.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-devanagari/devanagari-atomic-consonants.txt [moved from test/shaping/texts/in-house/shaper-indic/script-devanagari/devanagari-atomic-consonants.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-devanagari/devanagari-vowel-letters.txt [moved from test/shaping/texts/in-house/shaper-indic/script-devanagari/devanagari-vowel-letters.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-devanagari/misc/dottedcircle.txt [moved from test/shaping/texts/in-house/shaper-indic/script-devanagari/misc/dottedcircle.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-devanagari/misc/eyelash.txt [moved from test/shaping/texts/in-house/shaper-indic/script-devanagari/misc/eyelash.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-devanagari/misc/joiners.txt [moved from test/shaping/texts/in-house/shaper-indic/script-devanagari/misc/joiners.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-devanagari/misc/misc.txt [moved from test/shaping/texts/in-house/shaper-indic/script-devanagari/misc/misc.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-devanagari/misc/spec-deviations.txt [moved from test/shaping/texts/in-house/shaper-indic/script-devanagari/misc/spec-deviations.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-devanagari/misc/tricky-reordering.txt [moved from test/shaping/texts/in-house/shaper-indic/script-devanagari/misc/tricky-reordering.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-devanagari/utrrs/LICENSE [moved from test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/LICENSE with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-devanagari/utrrs/README [moved from test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/README with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-devanagari/utrrs/SOURCES [moved from test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/SOURCES with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalConsonants.txt [moved from test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalConsonants.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt [moved from test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt [moved from test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt [moved from test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-DevnagariSpecificAddition.txt [moved from test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-DevnagariSpecificAddition.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt [moved from test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-GenericPunctuation.txt [moved from test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-GenericPunctuation.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt [moved from test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt [moved from test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-devanagari/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt [moved from test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-devanagari/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt [moved from test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-devanagari/utrrs/gsub/IndicFontFeatureGSUB.txt [moved from test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/gsub/IndicFontFeatureGSUB.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-gujarati/gujarati-vowel-letters.txt [moved from test/shaping/texts/in-house/shaper-indic/script-gujarati/gujarati-vowel-letters.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-gujarati/utrrs/LICENSE [moved from test/shaping/texts/in-house/shaper-indic/script-oriya/utrrs/LICENSE with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-gujarati/utrrs/README [moved from test/shaping/texts/in-house/shaper-indic/script-oriya/utrrs/README with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-gujarati/utrrs/SOURCES [moved from test/shaping/texts/in-house/shaper-indic/script-oriya/utrrs/SOURCES with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt [moved from test/shaping/texts/in-house/shaper-indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt [moved from test/shaping/texts/in-house/shaper-indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt [moved from test/shaping/texts/in-house/shaper-indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt [moved from test/shaping/texts/in-house/shaper-indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt [moved from test/shaping/texts/in-house/shaper-indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt [moved from test/shaping/texts/in-house/shaper-indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt [moved from test/shaping/texts/in-house/shaper-indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-gujarati/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt [moved from test/shaping/texts/in-house/shaper-indic/script-gujarati/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-gujarati/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt [moved from test/shaping/texts/in-house/shaper-indic/script-gujarati/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-gujarati/utrrs/gsub/IndicFontFeatureGSUB.txt [moved from test/shaping/texts/in-house/shaper-indic/script-gujarati/utrrs/gsub/IndicFontFeatureGSUB.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-gurmukhi/gurmukhi-vowel-letters.txt [moved from test/shaping/texts/in-house/shaper-indic/script-gurmukhi/gurmukhi-vowel-letters.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-gurmukhi/misc/misc.txt [moved from test/shaping/texts/in-house/shaper-indic/script-gurmukhi/misc/misc.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-gurmukhi/utrrs/LICENSE [moved from test/shaping/texts/in-house/shaper-indic/script-malayalam/utrrs/LICENSE with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-gurmukhi/utrrs/README [moved from test/shaping/texts/in-house/shaper-indic/script-malayalam/utrrs/README with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-gurmukhi/utrrs/SOURCES [moved from test/shaping/texts/in-house/shaper-indic/script-malayalam/utrrs/SOURCES with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt [moved from test/shaping/texts/in-house/shaper-indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt [moved from test/shaping/texts/in-house/shaper-indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt [moved from test/shaping/texts/in-house/shaper-indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-GurmukhiSpecific.txt [moved from test/shaping/texts/in-house/shaper-indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-GurmukhiSpecific.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt [moved from test/shaping/texts/in-house/shaper-indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt [moved from test/shaping/texts/in-house/shaper-indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt [moved from test/shaping/texts/in-house/shaper-indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-gurmukhi/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt [moved from test/shaping/texts/in-house/shaper-indic/script-gurmukhi/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-gurmukhi/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt [moved from test/shaping/texts/in-house/shaper-indic/script-gurmukhi/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-gurmukhi/utrrs/gsub/IndicFontFeatureGSUB.txt [moved from test/shaping/texts/in-house/shaper-indic/script-gurmukhi/utrrs/gsub/IndicFontFeatureGSUB.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-kannada/kannada-vowel-letters.txt [moved from test/shaping/texts/in-house/shaper-indic/script-kannada/kannada-vowel-letters.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-kannada/misc/misc.txt [moved from test/shaping/texts/in-house/shaper-indic/script-kannada/misc/misc.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-kannada/misc/right-matras.txt [moved from test/shaping/texts/in-house/shaper-indic/script-kannada/misc/right-matras.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-kannada/utrrs/LICENSE [moved from test/shaping/texts/in-house/shaper-indic/script-kannada/utrrs/LICENSE with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-kannada/utrrs/README [moved from test/shaping/texts/in-house/shaper-indic/script-kannada/utrrs/README with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-kannada/utrrs/SOURCES [moved from test/shaping/texts/in-house/shaper-indic/script-kannada/utrrs/SOURCES with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalConsonants.txt [moved from test/shaping/texts/in-house/shaper-indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalConsonants.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt [moved from test/shaping/texts/in-house/shaper-indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt [moved from test/shaping/texts/in-house/shaper-indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt [moved from test/shaping/texts/in-house/shaper-indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt [moved from test/shaping/texts/in-house/shaper-indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt [moved from test/shaping/texts/in-house/shaper-indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt [moved from test/shaping/texts/in-house/shaper-indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt [moved from test/shaping/texts/in-house/shaper-indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-kannada/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt [moved from test/shaping/texts/in-house/shaper-indic/script-kannada/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-kannada/utrrs/gsub/IndicFontFeatureGSUB.txt [moved from test/shaping/texts/in-house/shaper-indic/script-kannada/utrrs/gsub/IndicFontFeatureGSUB.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-malayalam/malayalam-vowel-letters.txt [moved from test/shaping/texts/in-house/shaper-indic/script-malayalam/malayalam-vowel-letters.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-malayalam/misc/cibu.txt [moved from test/shaping/texts/in-house/shaper-indic/script-malayalam/misc/cibu.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-malayalam/misc/dot-reph.txt [moved from test/shaping/texts/in-house/shaper-indic/script-malayalam/misc/dot-reph.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-malayalam/misc/misc.txt [moved from test/shaping/texts/in-house/shaper-indic/script-malayalam/misc/misc.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-malayalam/utrrs/LICENSE [moved from test/shaping/texts/in-house/shaper-indic/script-gurmukhi/utrrs/LICENSE with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-malayalam/utrrs/README [moved from test/shaping/texts/in-house/shaper-indic/script-gurmukhi/utrrs/README with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-malayalam/utrrs/SOURCES [moved from test/shaping/texts/in-house/shaper-indic/script-gurmukhi/utrrs/SOURCES with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt [moved from test/shaping/texts/in-house/shaper-indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt [moved from test/shaping/texts/in-house/shaper-indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt [moved from test/shaping/texts/in-house/shaper-indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt [moved from test/shaping/texts/in-house/shaper-indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt [moved from test/shaping/texts/in-house/shaper-indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt [moved from test/shaping/texts/in-house/shaper-indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt [moved from test/shaping/texts/in-house/shaper-indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-malayalam/utrrs/gsub/IndicFontFeatureGSUB.txt [moved from test/shaping/texts/in-house/shaper-indic/script-malayalam/utrrs/gsub/IndicFontFeatureGSUB.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-oriya/misc/bindu.txt [moved from test/shaping/texts/in-house/shaper-indic/script-oriya/misc/bindu.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-oriya/misc/misc.txt [moved from test/shaping/texts/in-house/shaper-indic/script-oriya/misc/misc.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-oriya/oriya-vowel-letters.txt [moved from test/shaping/texts/in-house/shaper-indic/script-oriya/oriya-vowel-letters.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-oriya/utrrs/LICENSE [moved from test/shaping/texts/in-house/shaper-indic/script-gujarati/utrrs/LICENSE with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-oriya/utrrs/README [moved from test/shaping/texts/in-house/shaper-indic/script-gujarati/utrrs/README with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-oriya/utrrs/SOURCES [moved from test/shaping/texts/in-house/shaper-indic/script-gujarati/utrrs/SOURCES with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalConsonants.txt [moved from test/shaping/texts/in-house/shaper-indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalConsonants.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt [moved from test/shaping/texts/in-house/shaper-indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt [moved from test/shaping/texts/in-house/shaper-indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt [moved from test/shaping/texts/in-house/shaper-indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt [moved from test/shaping/texts/in-house/shaper-indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt [moved from test/shaping/texts/in-house/shaper-indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-OriyaSpecific.txt [moved from test/shaping/texts/in-house/shaper-indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-OriyaSpecific.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt [moved from test/shaping/texts/in-house/shaper-indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt [moved from test/shaping/texts/in-house/shaper-indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-oriya/utrrs/gsub/IndicFontFeatureGSUB.txt [moved from test/shaping/texts/in-house/shaper-indic/script-oriya/utrrs/gsub/IndicFontFeatureGSUB.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-sinhala/misc/extensive.txt [moved from test/shaping/texts/in-house/shaper-indic/script-sinhala/misc/extensive.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-sinhala/misc/misc.txt [moved from test/shaping/texts/in-house/shaper-indic/script-sinhala/misc/misc.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-sinhala/misc/reph.txt [moved from test/shaping/texts/in-house/shaper-indic/script-sinhala/misc/reph.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-sinhala/misc/split-matras.txt [moved from test/shaping/texts/in-house/shaper-indic/script-sinhala/misc/split-matras.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-sinhala/utrrs/LICENSE [moved from test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/LICENSE with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-sinhala/utrrs/README [moved from test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/README with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-sinhala/utrrs/SOURCES [moved from test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/SOURCES with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-sinhala/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt [moved from test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-sinhala/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt [moved from test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-sinhala/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt [moved from test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-sinhala/utrrs/codepoint/IndicFontFeatureCodepoint-Punctuation.txt [moved from test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/codepoint/IndicFontFeatureCodepoint-Punctuation.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-sinhala/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt [moved from test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-sinhala/utrrs/gpos/IndicFontFeatureGPOS.txt [moved from test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/gpos/IndicFontFeatureGPOS.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Conjunct.txt [moved from test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Conjunct.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Rakaaraansaya.txt [moved from test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Rakaaraansaya.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Repaya.txt [moved from test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Repaya.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Special-Cases.txt [moved from test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Special-Cases.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-TouchingLetters.txt [moved from test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-TouchingLetters.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Yansaya.txt [moved from test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Yansaya.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB.txt [moved from test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-tamil/misc/misc.txt [moved from test/shaping/texts/in-house/shaper-indic/script-tamil/misc/misc.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-tamil/utrrs/LICENSE [moved from test/shaping/texts/in-house/shaper-indic/script-bengali/utrrs/LICENSE with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-tamil/utrrs/README [moved from test/shaping/texts/in-house/shaper-indic/script-bengali/utrrs/README with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-tamil/utrrs/SOURCES [moved from test/shaping/texts/in-house/shaper-indic/script-bengali/utrrs/SOURCES with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt [moved from test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-CurrencySymbols.txt [moved from test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-CurrencySymbols.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt [moved from test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt [moved from test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt [moved from test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Numerics.txt [moved from test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Numerics.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt [moved from test/shaping/texts/in-house/shaper-indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Symbols.txt [moved from test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Symbols.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-TamilSymbol.txt [moved from test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-TamilSymbol.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt [moved from test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-tamil/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt [moved from test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-tamil/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt [moved from test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-tamil/utrrs/gsub/IndicFontFeatureGSUB.txt [moved from test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/gsub/IndicFontFeatureGSUB.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-telugu/misc/misc.txt [moved from test/shaping/texts/in-house/shaper-indic/script-telugu/misc/misc.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-telugu/telugu-vowel-letters.txt [moved from test/shaping/texts/in-house/shaper-indic/script-telugu/telugu-vowel-letters.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-telugu/utrrs/LICENSE [moved from test/shaping/texts/in-house/shaper-indic/script-assamese/utrrs/LICENSE with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-telugu/utrrs/README [moved from test/shaping/texts/in-house/shaper-indic/script-assamese/utrrs/README with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-telugu/utrrs/SOURCES [moved from test/shaping/texts/in-house/shaper-indic/script-assamese/utrrs/SOURCES with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt [moved from test/shaping/texts/in-house/shaper-indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt [moved from test/shaping/texts/in-house/shaper-indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt [moved from test/shaping/texts/in-house/shaper-indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt [moved from test/shaping/texts/in-house/shaper-indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt [moved from test/shaping/texts/in-house/shaper-indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt [moved from test/shaping/texts/in-house/shaper-indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt [moved from test/shaping/texts/in-house/shaper-indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-telugu/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt [moved from test/shaping/texts/in-house/shaper-indic/script-telugu/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt with 100% similarity]
test/shape/texts/in-house/shaper-indic/script-telugu/utrrs/gsub/IndicFontFeatureGSUB.txt [moved from test/shaping/texts/in-house/shaper-indic/script-telugu/utrrs/gsub/IndicFontFeatureGSUB.txt with 100% similarity]
test/shape/texts/in-house/shaper-khmer/misc.txt [moved from test/shaping/texts/in-house/shaper-khmer/misc.txt with 100% similarity]
test/shape/texts/in-house/shaper-khmer/other-marks-invalid.txt [moved from test/shaping/texts/in-house/shaper-khmer/other-marks-invalid.txt with 100% similarity]
test/shape/texts/in-house/shaper-khmer/other-marks.txt [moved from test/shaping/texts/in-house/shaper-khmer/other-marks.txt with 100% similarity]
test/shape/texts/in-house/shaper-myanmar/script-myanmar/misc/misc.txt [moved from test/shaping/texts/in-house/shaper-myanmar/script-myanmar/misc/misc.txt with 100% similarity]
test/shape/texts/in-house/shaper-myanmar/script-myanmar/misc/otspec.txt [moved from test/shaping/texts/in-house/shaper-myanmar/script-myanmar/misc/otspec.txt with 100% similarity]
test/shape/texts/in-house/shaper-myanmar/script-myanmar/misc/utn11.txt [moved from test/shaping/texts/in-house/shaper-myanmar/script-myanmar/misc/utn11.txt with 100% similarity]
test/shape/texts/in-house/shaper-thai/script-lao/misc/sara-am.txt [moved from test/shaping/texts/in-house/shaper-thai/script-lao/misc/sara-am.txt with 100% similarity]
test/shape/texts/in-house/shaper-thai/script-thai/misc/misc.txt [moved from test/shaping/texts/in-house/shaper-thai/script-thai/misc/misc.txt with 100% similarity]
test/shape/texts/in-house/shaper-thai/script-thai/misc/phinthu.txt [moved from test/shaping/texts/in-house/shaper-thai/script-thai/misc/phinthu.txt with 100% similarity]
test/shape/texts/in-house/shaper-thai/script-thai/misc/pua-shaping.txt [moved from test/shaping/texts/in-house/shaper-thai/script-thai/misc/pua-shaping.txt with 100% similarity]
test/shape/texts/in-house/shaper-thai/script-thai/misc/sara-am.txt [moved from test/shaping/texts/in-house/shaper-thai/script-thai/misc/sara-am.txt with 100% similarity]
test/shape/texts/in-house/shaper-tibetan/script-tibetan/misc/contractions.txt [moved from test/shaping/texts/in-house/shaper-tibetan/script-tibetan/misc/contractions.txt with 100% similarity]
test/shape/texts/in-house/shaper-tibetan/script-tibetan/misc/misc.txt [moved from test/shaping/texts/in-house/shaper-tibetan/script-tibetan/misc/misc.txt with 100% similarity]
test/shape/texts/in-house/shaper-use/script-batak/misc.txt [moved from test/shaping/texts/in-house/shaper-use/script-batak/misc.txt with 100% similarity]
test/shape/texts/in-house/shaper-use/script-buginese/misc.txt [moved from test/shaping/texts/in-house/shaper-use/script-buginese/misc.txt with 100% similarity]
test/shape/texts/in-house/shaper-use/script-cham/misc.txt [moved from test/shaping/texts/in-house/shaper-use/script-cham/misc.txt with 100% similarity]
test/shape/texts/in-house/shaper-use/script-javanese/misc.txt [moved from test/shaping/texts/in-house/shaper-use/script-javanese/misc.txt with 100% similarity]
test/shape/texts/in-house/shaper-use/script-kaithi/misc.txt [moved from test/shaping/texts/in-house/shaper-use/script-kaithi/misc.txt with 100% similarity]
test/shape/texts/in-house/shaper-use/script-kharoshti/misc.txt [moved from test/shaping/texts/in-house/shaper-use/script-kharoshti/misc.txt with 100% similarity]
test/shape/texts/in-house/shaper-use/script-tai-tham/misc.txt [moved from test/shaping/texts/in-house/shaper-use/script-tai-tham/misc.txt with 100% similarity]
test/shape/texts/in-house/shaper-use/script-tai-tham/torture.txt [moved from test/shaping/texts/in-house/shaper-use/script-tai-tham/torture.txt with 100% similarity]
test/shaping/Makefile.in [deleted file]
test/shaping/data/Makefile.in [deleted file]
test/shaping/data/aots/Makefile.am [deleted file]
test/shaping/data/aots/Makefile.in [deleted file]
test/shaping/data/aots/Makefile.sources [deleted file]
test/shaping/data/aots/tests/classdef1.tests [deleted file]
test/shaping/data/aots/tests/classdef1_empty.tests [deleted file]
test/shaping/data/aots/tests/classdef1_multiple.tests [deleted file]
test/shaping/data/aots/tests/classdef1_single.tests [deleted file]
test/shaping/data/aots/tests/classdef2.tests [deleted file]
test/shaping/data/aots/tests/classdef2_empty.tests [deleted file]
test/shaping/data/aots/tests/classdef2_multiple.tests [deleted file]
test/shaping/data/aots/tests/classdef2_single.tests [deleted file]
test/shaping/data/aots/tests/gpos1_1_lookupflag.tests [deleted file]
test/shaping/data/aots/tests/gpos1_1_simple.tests [deleted file]
test/shaping/data/aots/tests/gpos1_2.tests [deleted file]
test/shaping/data/aots/tests/gpos1_2_lookupflag.tests [deleted file]
test/shaping/data/aots/tests/gpos2_1.tests [deleted file]
test/shaping/data/aots/tests/gpos2_1_lookupflag.tests [deleted file]
test/shaping/data/aots/tests/gpos2_1_next_glyph.tests [deleted file]
test/shaping/data/aots/tests/gpos2_1_simple.tests [deleted file]
test/shaping/data/aots/tests/gpos2_2.tests [deleted file]
test/shaping/data/aots/tests/gpos3.tests [deleted file]
test/shaping/data/aots/tests/gpos3_lookupflag.tests [deleted file]
test/shaping/data/aots/tests/gpos4_lookupflag.tests [deleted file]
test/shaping/data/aots/tests/gpos4_multiple_anchors.tests [deleted file]
test/shaping/data/aots/tests/gpos4_simple.tests [deleted file]
test/shaping/data/aots/tests/gpos5.tests [deleted file]
test/shaping/data/aots/tests/gpos6.tests [deleted file]
test/shaping/data/aots/tests/gpos7_1.tests [deleted file]
test/shaping/data/aots/tests/gpos9.tests [deleted file]
test/shaping/data/aots/tests/gpos_chaining1_boundary.tests [deleted file]
test/shaping/data/aots/tests/gpos_chaining1_lookupflag.tests [deleted file]
test/shaping/data/aots/tests/gpos_chaining1_multiple_subrules.tests [deleted file]
test/shaping/data/aots/tests/gpos_chaining1_next_glyph.tests [deleted file]
test/shaping/data/aots/tests/gpos_chaining1_simple.tests [deleted file]
test/shaping/data/aots/tests/gpos_chaining1_successive.tests [deleted file]
test/shaping/data/aots/tests/gpos_chaining2_boundary.tests [deleted file]
test/shaping/data/aots/tests/gpos_chaining2_lookupflag.tests [deleted file]
test/shaping/data/aots/tests/gpos_chaining2_multiple_subrules.tests [deleted file]
test/shaping/data/aots/tests/gpos_chaining2_next_glyph.tests [deleted file]
test/shaping/data/aots/tests/gpos_chaining2_simple.tests [deleted file]
test/shaping/data/aots/tests/gpos_chaining2_successive.tests [deleted file]
test/shaping/data/aots/tests/gpos_chaining3_boundary.tests [deleted file]
test/shaping/data/aots/tests/gpos_chaining3_lookupflag.tests [deleted file]
test/shaping/data/aots/tests/gpos_chaining3_next_glyph.tests [deleted file]
test/shaping/data/aots/tests/gpos_chaining3_simple.tests [deleted file]
test/shaping/data/aots/tests/gpos_chaining3_successive.tests [deleted file]
test/shaping/data/aots/tests/gpos_context1_boundary.tests [deleted file]
test/shaping/data/aots/tests/gpos_context1_expansion.tests [deleted file]
test/shaping/data/aots/tests/gpos_context1_lookupflag.tests [deleted file]
test/shaping/data/aots/tests/gpos_context1_multiple_subrules.tests [deleted file]
test/shaping/data/aots/tests/gpos_context1_next_glyph.tests [deleted file]
test/shaping/data/aots/tests/gpos_context1_simple.tests [deleted file]
test/shaping/data/aots/tests/gpos_context1_successive.tests [deleted file]
test/shaping/data/aots/tests/gpos_context2_boundary.tests [deleted file]
test/shaping/data/aots/tests/gpos_context2_classes.tests [deleted file]
test/shaping/data/aots/tests/gpos_context2_expansion.tests [deleted file]
test/shaping/data/aots/tests/gpos_context2_lookupflag.tests [deleted file]
test/shaping/data/aots/tests/gpos_context2_multiple_subrules.tests [deleted file]
test/shaping/data/aots/tests/gpos_context2_next_glyph.tests [deleted file]
test/shaping/data/aots/tests/gpos_context2_simple.tests [deleted file]
test/shaping/data/aots/tests/gpos_context2_successive.tests [deleted file]
test/shaping/data/aots/tests/gpos_context3_boundary.tests [deleted file]
test/shaping/data/aots/tests/gpos_context3_lookupflag.tests [deleted file]
test/shaping/data/aots/tests/gpos_context3_next_glyph.tests [deleted file]
test/shaping/data/aots/tests/gpos_context3_simple.tests [deleted file]
test/shaping/data/aots/tests/gpos_context3_successive.tests [deleted file]
test/shaping/data/aots/tests/gsub1_1_lookupflag.tests [deleted file]
test/shaping/data/aots/tests/gsub1_1_modulo.tests [deleted file]
test/shaping/data/aots/tests/gsub1_1_simple.tests [deleted file]
test/shaping/data/aots/tests/gsub1_2_lookupflag.tests [deleted file]
test/shaping/data/aots/tests/gsub1_2_simple.tests [deleted file]
test/shaping/data/aots/tests/gsub2_1_lookupflag.tests [deleted file]
test/shaping/data/aots/tests/gsub2_1_multiple_sequences.tests [deleted file]
test/shaping/data/aots/tests/gsub2_1_simple.tests [deleted file]
test/shaping/data/aots/tests/gsub3_1_lookupflag.tests [deleted file]
test/shaping/data/aots/tests/gsub3_1_multiple.tests [deleted file]
test/shaping/data/aots/tests/gsub3_1_simple.tests [deleted file]
test/shaping/data/aots/tests/gsub4_1_lookupflag.tests [deleted file]
test/shaping/data/aots/tests/gsub4_1_multiple_ligatures.tests [deleted file]
test/shaping/data/aots/tests/gsub4_1_multiple_ligsets.tests [deleted file]
test/shaping/data/aots/tests/gsub4_1_simple.tests [deleted file]
test/shaping/data/aots/tests/gsub7.tests [deleted file]
test/shaping/data/aots/tests/gsub_chaining1_boundary.tests [deleted file]
test/shaping/data/aots/tests/gsub_chaining1_lookupflag.tests [deleted file]
test/shaping/data/aots/tests/gsub_chaining1_multiple_subrules.tests [deleted file]
test/shaping/data/aots/tests/gsub_chaining1_next_glyph.tests [deleted file]
test/shaping/data/aots/tests/gsub_chaining1_simple.tests [deleted file]
test/shaping/data/aots/tests/gsub_chaining1_successive.tests [deleted file]
test/shaping/data/aots/tests/gsub_chaining2_boundary.tests [deleted file]
test/shaping/data/aots/tests/gsub_chaining2_lookupflag.tests [deleted file]
test/shaping/data/aots/tests/gsub_chaining2_multiple_subrules.tests [deleted file]
test/shaping/data/aots/tests/gsub_chaining2_next_glyph.tests [deleted file]
test/shaping/data/aots/tests/gsub_chaining2_simple.tests [deleted file]
test/shaping/data/aots/tests/gsub_chaining2_successive.tests [deleted file]
test/shaping/data/aots/tests/gsub_chaining3_boundary.tests [deleted file]
test/shaping/data/aots/tests/gsub_chaining3_lookupflag.tests [deleted file]
test/shaping/data/aots/tests/gsub_chaining3_next_glyph.tests [deleted file]
test/shaping/data/aots/tests/gsub_chaining3_simple.tests [deleted file]
test/shaping/data/aots/tests/gsub_chaining3_successive.tests [deleted file]
test/shaping/data/aots/tests/gsub_context1_boundary.tests [deleted file]
test/shaping/data/aots/tests/gsub_context1_expansion.tests [deleted file]
test/shaping/data/aots/tests/gsub_context1_lookupflag.tests [deleted file]
test/shaping/data/aots/tests/gsub_context1_multiple_subrules.tests [deleted file]
test/shaping/data/aots/tests/gsub_context1_next_glyph.tests [deleted file]
test/shaping/data/aots/tests/gsub_context1_simple.tests [deleted file]
test/shaping/data/aots/tests/gsub_context1_successive.tests [deleted file]
test/shaping/data/aots/tests/gsub_context2_boundary.tests [deleted file]
test/shaping/data/aots/tests/gsub_context2_classes.tests [deleted file]
test/shaping/data/aots/tests/gsub_context2_expansion.tests [deleted file]
test/shaping/data/aots/tests/gsub_context2_lookupflag.tests [deleted file]
test/shaping/data/aots/tests/gsub_context2_multiple_subrules.tests [deleted file]
test/shaping/data/aots/tests/gsub_context2_next_glyph.tests [deleted file]
test/shaping/data/aots/tests/gsub_context2_simple.tests [deleted file]
test/shaping/data/aots/tests/gsub_context2_successive.tests [deleted file]
test/shaping/data/aots/tests/gsub_context3_boundary.tests [deleted file]
test/shaping/data/aots/tests/gsub_context3_lookupflag.tests [deleted file]
test/shaping/data/aots/tests/gsub_context3_next_glyph.tests [deleted file]
test/shaping/data/aots/tests/gsub_context3_simple.tests [deleted file]
test/shaping/data/aots/tests/gsub_context3_successive.tests [deleted file]
test/shaping/data/aots/tests/lookupflag_ignore_attach.tests [deleted file]
test/shaping/data/aots/tests/lookupflag_ignore_base.tests [deleted file]
test/shaping/data/aots/tests/lookupflag_ignore_combination.tests [deleted file]
test/shaping/data/aots/tests/lookupflag_ignore_ligatures.tests [deleted file]
test/shaping/data/aots/tests/lookupflag_ignore_marks.tests [deleted file]
test/shaping/data/aots/update.py [deleted file]
test/shaping/data/in-house/Makefile.am [deleted file]
test/shaping/data/in-house/Makefile.in [deleted file]
test/shaping/data/in-house/Makefile.sources [deleted file]
test/shaping/data/in-house/tests/aat-morx.tests [deleted file]
test/shaping/data/in-house/tests/aat-trak.tests [deleted file]
test/shaping/data/in-house/tests/arabic-fallback-shaping.tests [deleted file]
test/shaping/data/in-house/tests/arabic-feature-order.tests [deleted file]
test/shaping/data/in-house/tests/arabic-like-joining.tests [deleted file]
test/shaping/data/in-house/tests/arabic-mark-attach.tests [deleted file]
test/shaping/data/in-house/tests/arabic-mark-order.tests [deleted file]
test/shaping/data/in-house/tests/arabic-stch.tests [deleted file]
test/shaping/data/in-house/tests/automatic-fractions.tests [deleted file]
test/shaping/data/in-house/tests/cluster.tests [deleted file]
test/shaping/data/in-house/tests/collections.tests [deleted file]
test/shaping/data/in-house/tests/color-fonts.tests [deleted file]
test/shaping/data/in-house/tests/context-matching.tests [deleted file]
test/shaping/data/in-house/tests/cursive-positioning.tests [deleted file]
test/shaping/data/in-house/tests/default-ignorables.tests [deleted file]
test/shaping/data/in-house/tests/emoji.tests [deleted file]
test/shaping/data/in-house/tests/fallback-positioning.tests [deleted file]
test/shaping/data/in-house/tests/hangul-jamo.tests [deleted file]
test/shaping/data/in-house/tests/hyphens.tests [deleted file]
test/shaping/data/in-house/tests/indic-consonant-with-stacker.tests [deleted file]
test/shaping/data/in-house/tests/indic-decompose.tests [deleted file]
test/shaping/data/in-house/tests/indic-init.tests [deleted file]
test/shaping/data/in-house/tests/indic-joiner-candrabindu.tests [deleted file]
test/shaping/data/in-house/tests/indic-joiners.tests [deleted file]
test/shaping/data/in-house/tests/indic-old-spec.tests [deleted file]
test/shaping/data/in-house/tests/indic-pref-blocking.tests [deleted file]
test/shaping/data/in-house/tests/indic-script-extensions.tests [deleted file]
test/shaping/data/in-house/tests/indic-special-cases.tests [deleted file]
test/shaping/data/in-house/tests/indic-syllable.tests [deleted file]
test/shaping/data/in-house/tests/indic-vowel-letter-spoofing.tests [deleted file]
test/shaping/data/in-house/tests/kern-format2.tests [deleted file]
test/shaping/data/in-house/tests/khmer-mark-order.tests [deleted file]
test/shaping/data/in-house/tests/khmer-misc.tests [deleted file]
test/shaping/data/in-house/tests/language-tags.tests [deleted file]
test/shaping/data/in-house/tests/ligature-id.tests [deleted file]
test/shaping/data/in-house/tests/macos.tests [deleted file]
test/shaping/data/in-house/tests/mark-attachment.tests [deleted file]
test/shaping/data/in-house/tests/mark-filtering-sets.tests [deleted file]
test/shaping/data/in-house/tests/mongolian-variation-selector.tests [deleted file]
test/shaping/data/in-house/tests/myanmar-syllable.tests [deleted file]
test/shaping/data/in-house/tests/myanmar-zawgyi.tests [deleted file]
test/shaping/data/in-house/tests/none-directional.tests [deleted file]
test/shaping/data/in-house/tests/positioning-features.tests [deleted file]
test/shaping/data/in-house/tests/rand.tests [deleted file]
test/shaping/data/in-house/tests/rotation.tests [deleted file]
test/shaping/data/in-house/tests/simple.tests [deleted file]
test/shaping/data/in-house/tests/sinhala.tests [deleted file]
test/shaping/data/in-house/tests/spaces.tests [deleted file]
test/shaping/data/in-house/tests/tibetan-contractions-1.tests [deleted file]
test/shaping/data/in-house/tests/tibetan-contractions-2.tests [deleted file]
test/shaping/data/in-house/tests/tibetan-vowels.tests [deleted file]
test/shaping/data/in-house/tests/use-indic3.tests [deleted file]
test/shaping/data/in-house/tests/use-marchen.tests [deleted file]
test/shaping/data/in-house/tests/use-syllable.tests [deleted file]
test/shaping/data/in-house/tests/use.tests [deleted file]
test/shaping/data/in-house/tests/variations-rvrn.tests [deleted file]
test/shaping/data/in-house/tests/vertical.tests [deleted file]
test/shaping/data/in-house/tests/zero-width-marks.tests [deleted file]
test/shaping/data/text-rendering-tests/Makefile.am [deleted file]
test/shaping/data/text-rendering-tests/Makefile.in [deleted file]
test/shaping/data/text-rendering-tests/tests/AVAR-1.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/CFF-1.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/CFF-2.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/CFF2-1.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/CMAP-1.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/CMAP-2.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/CVAR-1.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/CVAR-2.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/GLYF-1.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/GPOS-1.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/GPOS-2.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/GPOS-3.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/GPOS-4.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/GPOS-5.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/GSUB-1.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/GSUB-2.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/GSUB-3.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/GVAR-1.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/GVAR-2.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/GVAR-3.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/GVAR-4.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/GVAR-5.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/GVAR-6.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/GVAR-7.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/GVAR-8.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/GVAR-9.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/HVAR-1.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/HVAR-2.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/KERN-1.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/KERN-2.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/MORX-1.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/MORX-10.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/MORX-11.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/MORX-12.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/MORX-13.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/MORX-14.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/MORX-16.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/MORX-17.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/MORX-18.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/MORX-19.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/MORX-2.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/MORX-20.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/MORX-21.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/MORX-22.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/MORX-23.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/MORX-24.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/MORX-25.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/MORX-26.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/MORX-27.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/MORX-28.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/MORX-29.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/MORX-3.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/MORX-30.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/MORX-31.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/MORX-32.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/MORX-33.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/MORX-34.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/MORX-35.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/MORX-36.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/MORX-37.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/MORX-38.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/MORX-39.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/MORX-4.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/MORX-40.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/MORX-41.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/MORX-5.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/MORX-6.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/MORX-7.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/MORX-8.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/MORX-9.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/SFNT-1.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/SFNT-2.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/SHBALI-3.tests [deleted file]
test/shaping/data/text-rendering-tests/tests/SHKNDA-1.tests [deleted file]
test/shaping/data/text-rendering-tests/update.py [deleted file]
test/shaping/hb_test_tools.py [deleted file]
test/shaping/meson.build [deleted file]
test/shaping/record-test.sh [deleted file]
test/shaping/run-tests.py [deleted file]
test/subset/Makefile.am
test/subset/Makefile.in
test/subset/data/Makefile.am
test/subset/data/Makefile.in
test/subset/data/Makefile.sources
test/subset/data/expected/basics/Comfortaa-Regular-new.default.61,62,63.ttf
test/subset/data/expected/basics/Comfortaa-Regular-new.default.61,63.ttf
test/subset/data/expected/basics/Comfortaa-Regular-new.default.61.ttf
test/subset/data/expected/basics/Comfortaa-Regular-new.default.62.ttf
test/subset/data/expected/basics/Comfortaa-Regular-new.default.63.ttf
test/subset/data/expected/basics/Comfortaa-Regular-new.default.retain-all-codepoint.ttf
test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints-retain-gids.61,62,63.ttf
test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints-retain-gids.61,63.ttf
test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints-retain-gids.61.ttf
test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints-retain-gids.62.ttf
test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints-retain-gids.63.ttf
test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints-retain-gids.retain-all-codepoint.ttf
test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints.61,62,63.ttf
test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints.61,63.ttf
test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints.61.ttf
test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints.62.ttf
test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints.63.ttf
test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints.retain-all-codepoint.ttf
test/subset/data/expected/basics/Comfortaa-Regular-new.gids.61,62,63.ttf
test/subset/data/expected/basics/Comfortaa-Regular-new.gids.61,63.ttf
test/subset/data/expected/basics/Comfortaa-Regular-new.gids.61.ttf
test/subset/data/expected/basics/Comfortaa-Regular-new.gids.62.ttf
test/subset/data/expected/basics/Comfortaa-Regular-new.gids.63.ttf
test/subset/data/expected/basics/Comfortaa-Regular-new.gids.retain-all-codepoint.ttf
test/subset/data/expected/basics/Comfortaa-Regular-new.glyph-names.61,62,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Comfortaa-Regular-new.glyph-names.61,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Comfortaa-Regular-new.glyph-names.61.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Comfortaa-Regular-new.glyph-names.62.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Comfortaa-Regular-new.glyph-names.63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Comfortaa-Regular-new.glyph-names.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Comfortaa-Regular-new.keep-all-layout-features.61,62,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Comfortaa-Regular-new.keep-all-layout-features.61,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Comfortaa-Regular-new.keep-all-layout-features.61.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Comfortaa-Regular-new.keep-all-layout-features.62.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Comfortaa-Regular-new.keep-all-layout-features.63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Comfortaa-Regular-new.keep-all-layout-features.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Comfortaa-Regular-new.layout-features.61,62,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Comfortaa-Regular-new.layout-features.61,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Comfortaa-Regular-new.layout-features.61.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Comfortaa-Regular-new.layout-features.62.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Comfortaa-Regular-new.layout-features.63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Comfortaa-Regular-new.layout-features.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Comfortaa-Regular-new.name-ids.61,62,63.ttf
test/subset/data/expected/basics/Comfortaa-Regular-new.name-ids.61,63.ttf
test/subset/data/expected/basics/Comfortaa-Regular-new.name-ids.61.ttf
test/subset/data/expected/basics/Comfortaa-Regular-new.name-ids.62.ttf
test/subset/data/expected/basics/Comfortaa-Regular-new.name-ids.63.ttf
test/subset/data/expected/basics/Comfortaa-Regular-new.name-ids.retain-all-codepoint.ttf
test/subset/data/expected/basics/Comfortaa-Regular-new.name-languages.61,62,63.ttf
test/subset/data/expected/basics/Comfortaa-Regular-new.name-languages.61,63.ttf
test/subset/data/expected/basics/Comfortaa-Regular-new.name-languages.61.ttf
test/subset/data/expected/basics/Comfortaa-Regular-new.name-languages.62.ttf
test/subset/data/expected/basics/Comfortaa-Regular-new.name-languages.63.ttf
test/subset/data/expected/basics/Comfortaa-Regular-new.name-languages.retain-all-codepoint.ttf
test/subset/data/expected/basics/Comfortaa-Regular-new.name-legacy.61,62,63.ttf
test/subset/data/expected/basics/Comfortaa-Regular-new.name-legacy.61,63.ttf
test/subset/data/expected/basics/Comfortaa-Regular-new.name-legacy.61.ttf
test/subset/data/expected/basics/Comfortaa-Regular-new.name-legacy.62.ttf
test/subset/data/expected/basics/Comfortaa-Regular-new.name-legacy.63.ttf
test/subset/data/expected/basics/Comfortaa-Regular-new.name-legacy.retain-all-codepoint.ttf
test/subset/data/expected/basics/Comfortaa-Regular-new.no-prune-unicode-ranges.61,62,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Comfortaa-Regular-new.no-prune-unicode-ranges.61,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Comfortaa-Regular-new.no-prune-unicode-ranges.61.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Comfortaa-Regular-new.no-prune-unicode-ranges.62.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Comfortaa-Regular-new.no-prune-unicode-ranges.63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Comfortaa-Regular-new.no-prune-unicode-ranges.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Comfortaa-Regular-new.notdef-outline.61,62,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Comfortaa-Regular-new.notdef-outline.61,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Comfortaa-Regular-new.notdef-outline.61.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Comfortaa-Regular-new.notdef-outline.62.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Comfortaa-Regular-new.notdef-outline.63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Comfortaa-Regular-new.notdef-outline.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Comfortaa-Regular-new.retain-gids.61,62,63.ttf
test/subset/data/expected/basics/Comfortaa-Regular-new.retain-gids.61,63.ttf
test/subset/data/expected/basics/Comfortaa-Regular-new.retain-gids.61.ttf
test/subset/data/expected/basics/Comfortaa-Regular-new.retain-gids.62.ttf
test/subset/data/expected/basics/Comfortaa-Regular-new.retain-gids.63.ttf
test/subset/data/expected/basics/Comfortaa-Regular-new.retain-gids.retain-all-codepoint.ttf
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.default.61,62,63.ttf
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.default.61,63.ttf
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.default.61.ttf
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.default.62.ttf
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.default.63.ttf
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.default.retain-all-codepoint.ttf
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints-retain-gids.61,62,63.ttf
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints-retain-gids.61,63.ttf
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints-retain-gids.61.ttf
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints-retain-gids.62.ttf
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints-retain-gids.63.ttf
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints-retain-gids.retain-all-codepoint.ttf
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints.61,62,63.ttf
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints.61,63.ttf
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints.61.ttf
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints.62.ttf
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints.63.ttf
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints.retain-all-codepoint.ttf
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.gids.61,62,63.ttf
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.gids.61,63.ttf
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.gids.61.ttf
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.gids.62.ttf
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.gids.63.ttf
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.gids.retain-all-codepoint.ttf
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.glyph-names.61,62,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.glyph-names.61,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.glyph-names.61.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.glyph-names.62.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.glyph-names.63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.glyph-names.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.keep-all-layout-features.61,62,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.keep-all-layout-features.61,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.keep-all-layout-features.61.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.keep-all-layout-features.62.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.keep-all-layout-features.63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.keep-all-layout-features.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.layout-features.61,62,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.layout-features.61,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.layout-features.61.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.layout-features.62.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.layout-features.63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.layout-features.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-ids.61,62,63.ttf
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-ids.61,63.ttf
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-ids.61.ttf
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-ids.62.ttf
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-ids.63.ttf
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-ids.retain-all-codepoint.ttf
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-languages.61,62,63.ttf
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-languages.61,63.ttf
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-languages.61.ttf
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-languages.62.ttf
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-languages.63.ttf
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-languages.retain-all-codepoint.ttf
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-legacy.61,62,63.ttf
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-legacy.61,63.ttf
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-legacy.61.ttf
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-legacy.62.ttf
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-legacy.63.ttf
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-legacy.retain-all-codepoint.ttf
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.no-prune-unicode-ranges.61,62,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.no-prune-unicode-ranges.61,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.no-prune-unicode-ranges.61.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.no-prune-unicode-ranges.62.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.no-prune-unicode-ranges.63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.no-prune-unicode-ranges.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.notdef-outline.61,62,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.notdef-outline.61,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.notdef-outline.61.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.notdef-outline.62.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.notdef-outline.63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.notdef-outline.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.retain-gids.61,62,63.ttf
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.retain-gids.61,63.ttf
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.retain-gids.61.ttf
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.retain-gids.62.ttf
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.retain-gids.63.ttf
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.retain-gids.retain-all-codepoint.ttf
test/subset/data/expected/basics/Roboto-Regular.abc.default.61,62,63.ttf
test/subset/data/expected/basics/Roboto-Regular.abc.default.61,63.ttf
test/subset/data/expected/basics/Roboto-Regular.abc.default.61.ttf
test/subset/data/expected/basics/Roboto-Regular.abc.default.62.ttf
test/subset/data/expected/basics/Roboto-Regular.abc.default.63.ttf
test/subset/data/expected/basics/Roboto-Regular.abc.default.retain-all-codepoint.ttf
test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints-retain-gids.61,62,63.ttf
test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints-retain-gids.61,63.ttf
test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints-retain-gids.61.ttf
test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints-retain-gids.62.ttf
test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints-retain-gids.63.ttf
test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints-retain-gids.retain-all-codepoint.ttf
test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints.61,62,63.ttf
test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints.61,63.ttf
test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints.61.ttf
test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints.62.ttf
test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints.63.ttf
test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints.retain-all-codepoint.ttf
test/subset/data/expected/basics/Roboto-Regular.abc.gids.61,62,63.ttf
test/subset/data/expected/basics/Roboto-Regular.abc.gids.61,63.ttf
test/subset/data/expected/basics/Roboto-Regular.abc.gids.61.ttf
test/subset/data/expected/basics/Roboto-Regular.abc.gids.62.ttf
test/subset/data/expected/basics/Roboto-Regular.abc.gids.63.ttf
test/subset/data/expected/basics/Roboto-Regular.abc.gids.retain-all-codepoint.ttf
test/subset/data/expected/basics/Roboto-Regular.abc.glyph-names.61,62,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.glyph-names.61,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.glyph-names.61.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.glyph-names.62.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.glyph-names.63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.glyph-names.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.keep-all-layout-features.61,62,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.keep-all-layout-features.61,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.keep-all-layout-features.61.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.keep-all-layout-features.62.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.keep-all-layout-features.63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.keep-all-layout-features.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.layout-features.61,62,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.layout-features.61,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.layout-features.61.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.layout-features.62.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.layout-features.63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.layout-features.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.name-ids.61,62,63.ttf
test/subset/data/expected/basics/Roboto-Regular.abc.name-ids.61,63.ttf
test/subset/data/expected/basics/Roboto-Regular.abc.name-ids.61.ttf
test/subset/data/expected/basics/Roboto-Regular.abc.name-ids.62.ttf
test/subset/data/expected/basics/Roboto-Regular.abc.name-ids.63.ttf
test/subset/data/expected/basics/Roboto-Regular.abc.name-ids.retain-all-codepoint.ttf
test/subset/data/expected/basics/Roboto-Regular.abc.name-languages.61,62,63.ttf
test/subset/data/expected/basics/Roboto-Regular.abc.name-languages.61,63.ttf
test/subset/data/expected/basics/Roboto-Regular.abc.name-languages.61.ttf
test/subset/data/expected/basics/Roboto-Regular.abc.name-languages.62.ttf
test/subset/data/expected/basics/Roboto-Regular.abc.name-languages.63.ttf
test/subset/data/expected/basics/Roboto-Regular.abc.name-languages.retain-all-codepoint.ttf
test/subset/data/expected/basics/Roboto-Regular.abc.name-legacy.61,62,63.ttf
test/subset/data/expected/basics/Roboto-Regular.abc.name-legacy.61,63.ttf
test/subset/data/expected/basics/Roboto-Regular.abc.name-legacy.61.ttf
test/subset/data/expected/basics/Roboto-Regular.abc.name-legacy.62.ttf
test/subset/data/expected/basics/Roboto-Regular.abc.name-legacy.63.ttf
test/subset/data/expected/basics/Roboto-Regular.abc.name-legacy.retain-all-codepoint.ttf
test/subset/data/expected/basics/Roboto-Regular.abc.no-prune-unicode-ranges.61,62,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.no-prune-unicode-ranges.61,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.no-prune-unicode-ranges.61.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.no-prune-unicode-ranges.62.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.no-prune-unicode-ranges.63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.no-prune-unicode-ranges.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.notdef-outline.61,62,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.notdef-outline.61,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.notdef-outline.61.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.notdef-outline.62.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.notdef-outline.63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.notdef-outline.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.retain-gids.61,62,63.ttf
test/subset/data/expected/basics/Roboto-Regular.abc.retain-gids.61,63.ttf
test/subset/data/expected/basics/Roboto-Regular.abc.retain-gids.61.ttf
test/subset/data/expected/basics/Roboto-Regular.abc.retain-gids.62.ttf
test/subset/data/expected/basics/Roboto-Regular.abc.retain-gids.63.ttf
test/subset/data/expected/basics/Roboto-Regular.abc.retain-gids.retain-all-codepoint.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.default.2049.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.default.38,2049.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.default.38,20E3.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.default.38,39,AE,2049,38,20E3.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.default.38,AE,2049.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.default.39.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.default.AE.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints-retain-gids.2049.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints-retain-gids.38,2049.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints-retain-gids.38,20E3.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints-retain-gids.38,39,AE,2049,38,20E3.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints-retain-gids.38,AE,2049.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints-retain-gids.39.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints-retain-gids.AE.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints.2049.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints.38,2049.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints.38,20E3.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints.38,39,AE,2049,38,20E3.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints.38,AE,2049.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints.39.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints.AE.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.default.2049.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.default.38,2049.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.default.38,20E3.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.default.38,39,AE,2049,38,20E3.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.default.38,AE,2049.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.default.39.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.default.AE.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints-retain-gids.2049.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints-retain-gids.38,2049.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints-retain-gids.38,20E3.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints-retain-gids.38,39,AE,2049,38,20E3.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints-retain-gids.38,AE,2049.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints-retain-gids.39.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints-retain-gids.AE.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints.2049.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints.38,2049.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints.38,20E3.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints.38,39,AE,2049,38,20E3.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints.38,AE,2049.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints.39.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints.AE.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.retain-gids.2049.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.retain-gids.38,2049.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.retain-gids.38,20E3.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.retain-gids.38,39,AE,2049,38,20E3.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.retain-gids.38,AE,2049.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.retain-gids.39.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.retain-gids.AE.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.default.2049.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.default.38,2049.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.default.38,20E3.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.default.38,39,AE,2049,38,20E3.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.default.38,AE,2049.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.default.39.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.default.AE.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints-retain-gids.2049.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints-retain-gids.38,2049.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints-retain-gids.38,20E3.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints-retain-gids.38,39,AE,2049,38,20E3.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints-retain-gids.38,AE,2049.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints-retain-gids.39.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints-retain-gids.AE.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints.2049.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints.38,2049.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints.38,20E3.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints.38,39,AE,2049,38,20E3.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints.38,AE,2049.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints.39.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints.AE.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.retain-gids.2049.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.retain-gids.38,2049.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.retain-gids.38,20E3.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.retain-gids.38,39,AE,2049,38,20E3.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.retain-gids.38,AE,2049.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.retain-gids.39.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.retain-gids.AE.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.default.2049.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.default.38,2049.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.default.38,20E3.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.default.38,39,AE,2049,38,20E3.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.default.38,AE,2049.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.default.39.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.default.AE.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints-retain-gids.2049.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints-retain-gids.38,2049.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints-retain-gids.38,20E3.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints-retain-gids.38,39,AE,2049,38,20E3.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints-retain-gids.38,AE,2049.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints-retain-gids.39.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints-retain-gids.AE.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints.2049.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints.38,2049.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints.38,20E3.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints.38,39,AE,2049,38,20E3.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints.38,AE,2049.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints.39.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints.AE.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.retain-gids.2049.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.retain-gids.38,2049.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.retain-gids.38,20E3.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.retain-gids.38,39,AE,2049,38,20E3.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.retain-gids.38,AE,2049.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.retain-gids.39.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.retain-gids.AE.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.retain-gids.2049.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.retain-gids.38,2049.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.retain-gids.38,20E3.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.retain-gids.38,39,AE,2049,38,20E3.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.retain-gids.38,AE,2049.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.retain-gids.39.ttf
test/subset/data/expected/cbdt/NotoColorEmoji.subset.retain-gids.AE.ttf
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.default.1FC,21,41,20,62,63.otf [deleted file]
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.default.61,62,63.otf [deleted file]
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.default.D7,D8,D9,DA,DE.otf [deleted file]
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.desubroutinize-retain-gids.1FC,21,41,20,62,63.otf [deleted file]
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.desubroutinize-retain-gids.61,62,63.otf [deleted file]
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf [deleted file]
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.desubroutinize.1FC,21,41,20,62,63.otf [deleted file]
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.desubroutinize.61,62,63.otf [deleted file]
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.desubroutinize.D7,D8,D9,DA,DE.otf [deleted file]
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize-retain-gids.1FC,21,41,20,62,63.otf [deleted file]
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize-retain-gids.61,62,63.otf [deleted file]
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf [deleted file]
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize.1FC,21,41,20,62,63.otf [deleted file]
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize.61,62,63.otf [deleted file]
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize.D7,D8,D9,DA,DE.otf [deleted file]
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-retain-gids.1FC,21,41,20,62,63.otf [deleted file]
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-retain-gids.61,62,63.otf [deleted file]
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-retain-gids.D7,D8,D9,DA,DE.otf [deleted file]
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints.1FC,21,41,20,62,63.otf [deleted file]
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints.61,62,63.otf [deleted file]
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints.D7,D8,D9,DA,DE.otf [deleted file]
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-desubroutinize-retain-gids.1FC,21,41,20,62,63.otf [new file with mode: 0644]
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-desubroutinize-retain-gids.61,62,63.otf [new file with mode: 0644]
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf [new file with mode: 0644]
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-desubroutinize.1FC,21,41,20,62,63.otf [new file with mode: 0644]
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-desubroutinize.61,62,63.otf [new file with mode: 0644]
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-desubroutinize.D7,D8,D9,DA,DE.otf [new file with mode: 0644]
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-desubroutinize-retain-gids.1FC,21,41,20,62,63.otf [new file with mode: 0644]
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-desubroutinize-retain-gids.61,62,63.otf [new file with mode: 0644]
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf [new file with mode: 0644]
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-desubroutinize.1FC,21,41,20,62,63.otf [new file with mode: 0644]
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-desubroutinize.61,62,63.otf [new file with mode: 0644]
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-desubroutinize.D7,D8,D9,DA,DE.otf [new file with mode: 0644]
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-retain-gids.1FC,21,41,20,62,63.otf [new file with mode: 0644]
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-retain-gids.61,62,63.otf [new file with mode: 0644]
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-retain-gids.D7,D8,D9,DA,DE.otf [new file with mode: 0644]
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints.1FC,21,41,20,62,63.otf [new file with mode: 0644]
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints.61,62,63.otf [new file with mode: 0644]
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints.D7,D8,D9,DA,DE.otf [new file with mode: 0644]
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-retain-gids.1FC,21,41,20,62,63.otf [new file with mode: 0644]
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-retain-gids.61,62,63.otf [new file with mode: 0644]
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-retain-gids.D7,D8,D9,DA,DE.otf [new file with mode: 0644]
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline.1FC,21,41,20,62,63.otf [new file with mode: 0644]
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline.61,62,63.otf [new file with mode: 0644]
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline.D7,D8,D9,DA,DE.otf [new file with mode: 0644]
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.retain-gids.1FC,21,41,20,62,63.otf [deleted file]
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.retain-gids.61,62,63.otf [deleted file]
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.retain-gids.D7,D8,D9,DA,DE.otf [deleted file]
test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.default.3042,3044,3046,3048,304A,304B.otf
test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.default.3042,3044,3046,73E0,5EA6,8F38.otf
test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.default.61,63,65,6B.otf
test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.default.660E,6975,73E0,5EA6,8F38,6E05.otf
test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.default.660E.otf
test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.desubroutinize-retain-gids.3042,3044,3046,3048,304A,304B.otf
test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.desubroutinize-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf
test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.desubroutinize-retain-gids.61,63,65,6B.otf
test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.desubroutinize-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf
test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.desubroutinize-retain-gids.660E.otf
test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.desubroutinize.3042,3044,3046,3048,304A,304B.otf
test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.desubroutinize.3042,3044,3046,73E0,5EA6,8F38.otf
test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.desubroutinize.61,63,65,6B.otf
test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.desubroutinize.660E,6975,73E0,5EA6,8F38,6E05.otf
test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.desubroutinize.660E.otf
test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize-retain-gids.3042,3044,3046,3048,304A,304B.otf
test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf
test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize-retain-gids.61,63,65,6B.otf
test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf
test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize-retain-gids.660E.otf
test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize.3042,3044,3046,3048,304A,304B.otf
test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize.3042,3044,3046,73E0,5EA6,8F38.otf
test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize.61,63,65,6B.otf
test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize.660E,6975,73E0,5EA6,8F38,6E05.otf
test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize.660E.otf
test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-retain-gids.3042,3044,3046,3048,304A,304B.otf
test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf
test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-retain-gids.61,63,65,6B.otf
test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf
test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-retain-gids.660E.otf
test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints.3042,3044,3046,3048,304A,304B.otf
test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints.3042,3044,3046,73E0,5EA6,8F38.otf
test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints.61,63,65,6B.otf
test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints.660E,6975,73E0,5EA6,8F38,6E05.otf
test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints.660E.otf
test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.retain-gids.3042,3044,3046,3048,304A,304B.otf
test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf
test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.retain-gids.61,63,65,6B.otf
test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf
test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.retain-gids.660E.otf
test/subset/data/expected/cff.notoserifmyanmar/NotoSerifMyanmar-Regular.notdef-outline.1092.otf [new file with mode: 0644]
test/subset/data/expected/cmap/AdobeBlank-Regular.default.61,62.ttf
test/subset/data/expected/cmap/AdobeBlank-Regular.default.61,FEFA.ttf
test/subset/data/expected/cmap/AdobeBlank-Regular.default.FEE6,FECF.ttf
test/subset/data/expected/cmap/AdobeBlank-Regular.default.FEF9,FEFA.ttf
test/subset/data/expected/cmap/AdobeBlank-Regular.default.FEFA.ttf
test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints-retain-gids.61,62.ttf
test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints-retain-gids.61,FEFA.ttf
test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints-retain-gids.FEE6,FECF.ttf
test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints-retain-gids.FEF9,FEFA.ttf
test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints-retain-gids.FEFA.ttf
test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints.61,62.ttf
test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints.61,FEFA.ttf
test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints.FEE6,FECF.ttf
test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints.FEF9,FEFA.ttf
test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints.FEFA.ttf
test/subset/data/expected/cmap/AdobeBlank-Regular.name-ids.61,62.ttf
test/subset/data/expected/cmap/AdobeBlank-Regular.name-ids.61,FEFA.ttf
test/subset/data/expected/cmap/AdobeBlank-Regular.name-ids.FEE6,FECF.ttf
test/subset/data/expected/cmap/AdobeBlank-Regular.name-ids.FEF9,FEFA.ttf
test/subset/data/expected/cmap/AdobeBlank-Regular.name-ids.FEFA.ttf
test/subset/data/expected/cmap/AdobeBlank-Regular.retain-gids.61,62.ttf
test/subset/data/expected/cmap/AdobeBlank-Regular.retain-gids.61,FEFA.ttf
test/subset/data/expected/cmap/AdobeBlank-Regular.retain-gids.FEE6,FECF.ttf
test/subset/data/expected/cmap/AdobeBlank-Regular.retain-gids.FEF9,FEFA.ttf
test/subset/data/expected/cmap/AdobeBlank-Regular.retain-gids.FEFA.ttf
test/subset/data/expected/cmap14/cmap14_font1.default.4E00,4E02,4E03.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.default.4E00,4E03.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.default.4E00,4E05,4E07.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.default.4E02,4E03,4E08.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.default.4E02.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.default.4E03.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.default.4E05,4E07,4E08,4E09.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.default.4E08,4E09.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.default.4E08.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.default.retain-all-codepoint.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.drop-hints-retain-gids.4E00,4E02,4E03.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.drop-hints-retain-gids.4E00,4E03.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.drop-hints-retain-gids.4E00,4E05,4E07.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.drop-hints-retain-gids.4E02,4E03,4E08.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.drop-hints-retain-gids.4E02.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.drop-hints-retain-gids.4E03.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.drop-hints-retain-gids.4E05,4E07,4E08,4E09.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.drop-hints-retain-gids.4E08,4E09.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.drop-hints-retain-gids.4E08.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.drop-hints-retain-gids.retain-all-codepoint.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.drop-hints.4E00,4E02,4E03.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.drop-hints.4E00,4E03.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.drop-hints.4E00,4E05,4E07.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.drop-hints.4E02,4E03,4E08.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.drop-hints.4E02.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.drop-hints.4E03.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.drop-hints.4E05,4E07,4E08,4E09.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.drop-hints.4E08,4E09.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.drop-hints.4E08.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.drop-hints.retain-all-codepoint.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.gids.4E00,4E02,4E03.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.gids.4E00,4E03.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.gids.4E00,4E05,4E07.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.gids.4E02,4E03,4E08.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.gids.4E02.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.gids.4E03.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.gids.4E05,4E07,4E08,4E09.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.gids.4E08,4E09.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.gids.4E08.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.gids.retain-all-codepoint.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.name-ids.4E00,4E02,4E03.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.name-ids.4E00,4E03.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.name-ids.4E00,4E05,4E07.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.name-ids.4E02,4E03,4E08.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.name-ids.4E02.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.name-ids.4E03.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.name-ids.4E05,4E07,4E08,4E09.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.name-ids.4E08,4E09.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.name-ids.4E08.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.name-ids.retain-all-codepoint.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints-retain-gids.4E00,4E02,4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints-retain-gids.4E00,4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints-retain-gids.4E00,4E05,4E07.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints-retain-gids.4E02,4E03,4E08.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints-retain-gids.4E02.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints-retain-gids.4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints-retain-gids.4E05,4E07,4E08,4E09.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints-retain-gids.4E08,4E09.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints-retain-gids.4E08.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints-retain-gids.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints.4E00,4E02,4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints.4E00,4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints.4E00,4E05,4E07.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints.4E02,4E03,4E08.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints.4E02.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints.4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints.4E05,4E07,4E08,4E09.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints.4E08,4E09.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints.4E08.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-gids.4E00,4E02,4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-gids.4E00,4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-gids.4E00,4E05,4E07.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-gids.4E02,4E03,4E08.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-gids.4E02.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-gids.4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-gids.4E05,4E07,4E08,4E09.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-gids.4E08,4E09.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-gids.4E08.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-gids.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-name-ids.4E00,4E02,4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-name-ids.4E00,4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-name-ids.4E00,4E05,4E07.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-name-ids.4E02,4E03,4E08.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-name-ids.4E02.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-name-ids.4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-name-ids.4E05,4E07,4E08,4E09.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-name-ids.4E08,4E09.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-name-ids.4E08.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-name-ids.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-retain-gids.4E00,4E02,4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-retain-gids.4E00,4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-retain-gids.4E00,4E05,4E07.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-retain-gids.4E02,4E03,4E08.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-retain-gids.4E02.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-retain-gids.4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-retain-gids.4E05,4E07,4E08,4E09.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-retain-gids.4E08,4E09.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-retain-gids.4E08.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-retain-gids.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline.4E00,4E02,4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline.4E00,4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline.4E00,4E05,4E07.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline.4E02,4E03,4E08.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline.4E02.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline.4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline.4E05,4E07,4E08,4E09.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline.4E08,4E09.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline.4E08.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.notdef-outline.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.retain-gids.4E00,4E02,4E03.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.retain-gids.4E00,4E03.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.retain-gids.4E00,4E05,4E07.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.retain-gids.4E02,4E03,4E08.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.retain-gids.4E02.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.retain-gids.4E03.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.retain-gids.4E05,4E07,4E08,4E09.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.retain-gids.4E08,4E09.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.retain-gids.4E08.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font1.retain-gids.retain-all-codepoint.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.default.4E00,4E02,4E03.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.default.4E00,4E03.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.default.4E00,4E05,4E07.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.default.4E02,4E03,4E08.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.default.4E02.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.default.4E03.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.default.4E05,4E07,4E08,4E09.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.default.4E08,4E09.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.default.4E08.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.default.retain-all-codepoint.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E00,4E02,4E03.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E00,4E03.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E00,4E05,4E07.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E02,4E03,4E08.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E02.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E03.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E05,4E07,4E08,4E09.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E08,4E09.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E08.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.retain-all-codepoint.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E00,4E02,4E03.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E00,4E03.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E00,4E05,4E07.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E02,4E03,4E08.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E02.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E03.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E05,4E07,4E08,4E09.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E08,4E09.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E08.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.drop-hints.retain-all-codepoint.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.gids.4E00,4E02,4E03.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.gids.4E00,4E03.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.gids.4E00,4E05,4E07.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.gids.4E02,4E03,4E08.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.gids.4E02.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.gids.4E03.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.gids.4E05,4E07,4E08,4E09.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.gids.4E08,4E09.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.gids.4E08.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.gids.retain-all-codepoint.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E00,4E02,4E03.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E00,4E03.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E00,4E05,4E07.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E02,4E03,4E08.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E02.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E03.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E05,4E07,4E08,4E09.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E08,4E09.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E08.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.name-ids.retain-all-codepoint.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints-retain-gids.4E00,4E02,4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints-retain-gids.4E00,4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints-retain-gids.4E00,4E05,4E07.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints-retain-gids.4E02,4E03,4E08.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints-retain-gids.4E02.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints-retain-gids.4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints-retain-gids.4E05,4E07,4E08,4E09.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints-retain-gids.4E08,4E09.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints-retain-gids.4E08.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints-retain-gids.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints.4E00,4E02,4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints.4E00,4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints.4E00,4E05,4E07.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints.4E02,4E03,4E08.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints.4E02.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints.4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints.4E05,4E07,4E08,4E09.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints.4E08,4E09.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints.4E08.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-gids.4E00,4E02,4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-gids.4E00,4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-gids.4E00,4E05,4E07.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-gids.4E02,4E03,4E08.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-gids.4E02.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-gids.4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-gids.4E05,4E07,4E08,4E09.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-gids.4E08,4E09.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-gids.4E08.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-gids.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-name-ids.4E00,4E02,4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-name-ids.4E00,4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-name-ids.4E00,4E05,4E07.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-name-ids.4E02,4E03,4E08.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-name-ids.4E02.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-name-ids.4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-name-ids.4E05,4E07,4E08,4E09.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-name-ids.4E08,4E09.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-name-ids.4E08.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-name-ids.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-retain-gids.4E00,4E02,4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-retain-gids.4E00,4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-retain-gids.4E00,4E05,4E07.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-retain-gids.4E02,4E03,4E08.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-retain-gids.4E02.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-retain-gids.4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-retain-gids.4E05,4E07,4E08,4E09.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-retain-gids.4E08,4E09.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-retain-gids.4E08.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-retain-gids.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline.4E00,4E02,4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline.4E00,4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline.4E00,4E05,4E07.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline.4E02,4E03,4E08.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline.4E02.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline.4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline.4E05,4E07,4E08,4E09.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline.4E08,4E09.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline.4E08.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.notdef-outline.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E00,4E02,4E03.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E00,4E03.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E00,4E05,4E07.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E02,4E03,4E08.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E02.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E03.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E05,4E07,4E08,4E09.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E08,4E09.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E08.otf [deleted file]
test/subset/data/expected/cmap14/cmap14_font2.retain-gids.retain-all-codepoint.otf [deleted file]
test/subset/data/expected/colr/TwemojiMozilla.subset.default.32,3297,3299.ttf
test/subset/data/expected/colr/TwemojiMozilla.subset.default.32,3297.ttf
test/subset/data/expected/colr/TwemojiMozilla.subset.default.32,3299.ttf
test/subset/data/expected/colr/TwemojiMozilla.subset.default.32.ttf
test/subset/data/expected/colr/TwemojiMozilla.subset.default.3297,3299.ttf
test/subset/data/expected/colr/TwemojiMozilla.subset.default.3297.ttf
test/subset/data/expected/colr/TwemojiMozilla.subset.default.3299.ttf
test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints-retain-gids.32,3297,3299.ttf
test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints-retain-gids.32,3297.ttf
test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints-retain-gids.32,3299.ttf
test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints-retain-gids.32.ttf
test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints-retain-gids.3297,3299.ttf
test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints-retain-gids.3297.ttf
test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints-retain-gids.3299.ttf
test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints.32,3297,3299.ttf
test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints.32,3297.ttf
test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints.32,3299.ttf
test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints.32.ttf
test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints.3297,3299.ttf
test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints.3297.ttf
test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints.3299.ttf
test/subset/data/expected/colr/TwemojiMozilla.subset.retain-gids.32,3297,3299.ttf
test/subset/data/expected/colr/TwemojiMozilla.subset.retain-gids.32,3297.ttf
test/subset/data/expected/colr/TwemojiMozilla.subset.retain-gids.32,3299.ttf
test/subset/data/expected/colr/TwemojiMozilla.subset.retain-gids.32.ttf
test/subset/data/expected/colr/TwemojiMozilla.subset.retain-gids.3297,3299.ttf
test/subset/data/expected/colr/TwemojiMozilla.subset.retain-gids.3297.ttf
test/subset/data/expected/colr/TwemojiMozilla.subset.retain-gids.3299.ttf
test/subset/data/expected/colr_glyphs/BungeeColor-Regular.default.41.ttf [new file with mode: 0644]
test/subset/data/expected/colr_glyphs/BungeeColor-Regular.drop-hints-retain-gids.41.ttf [new file with mode: 0644]
test/subset/data/expected/colr_glyphs/BungeeColor-Regular.drop-hints.41.ttf [new file with mode: 0644]
test/subset/data/expected/colr_glyphs/BungeeColor-Regular.retain-gids.41.ttf [new file with mode: 0644]
test/subset/data/expected/colr_with_components/colr-table.default.6B.ttf [new file with mode: 0644]
test/subset/data/expected/colr_with_components/colr-table.drop-hints-retain-gids.6B.ttf [new file with mode: 0644]
test/subset/data/expected/colr_with_components/colr-table.drop-hints.6B.ttf [new file with mode: 0644]
test/subset/data/expected/colr_with_components/colr-table.retain-gids.6B.ttf [new file with mode: 0644]
test/subset/data/expected/colrv1/TestCOLRv1.default.E000,E001,E002,E003.ttf [new file with mode: 0644]
test/subset/data/expected/colrv1/TestCOLRv1.default.E000,E001,E002.ttf [new file with mode: 0644]
test/subset/data/expected/colrv1/TestCOLRv1.default.E000,E001.ttf [new file with mode: 0644]
test/subset/data/expected/colrv1/TestCOLRv1.default.E000,E004.ttf [new file with mode: 0644]
test/subset/data/expected/colrv1/TestCOLRv1.default.E000.ttf [new file with mode: 0644]
test/subset/data/expected/colrv1/TestCOLRv1.default.E001.ttf [new file with mode: 0644]
test/subset/data/expected/colrv1/TestCOLRv1.default.E002,E003,E004.ttf [new file with mode: 0644]
test/subset/data/expected/colrv1/TestCOLRv1.default.E002,E003.ttf [new file with mode: 0644]
test/subset/data/expected/colrv1/TestCOLRv1.default.E002.ttf [new file with mode: 0644]
test/subset/data/expected/colrv1/TestCOLRv1.default.E003,E004.ttf [new file with mode: 0644]
test/subset/data/expected/colrv1/TestCOLRv1.default.E003.ttf [new file with mode: 0644]
test/subset/data/expected/colrv1/TestCOLRv1.default.E004.ttf [new file with mode: 0644]
test/subset/data/expected/colrv1/TestCOLRv1.default.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/colrv1/TestCOLRv1.drop-hints-retain-gids.E000,E001,E002,E003.ttf [new file with mode: 0644]
test/subset/data/expected/colrv1/TestCOLRv1.drop-hints-retain-gids.E000,E001,E002.ttf [new file with mode: 0644]
test/subset/data/expected/colrv1/TestCOLRv1.drop-hints-retain-gids.E000,E001.ttf [new file with mode: 0644]
test/subset/data/expected/colrv1/TestCOLRv1.drop-hints-retain-gids.E000,E004.ttf [new file with mode: 0644]
test/subset/data/expected/colrv1/TestCOLRv1.drop-hints-retain-gids.E000.ttf [new file with mode: 0644]
test/subset/data/expected/colrv1/TestCOLRv1.drop-hints-retain-gids.E001.ttf [new file with mode: 0644]
test/subset/data/expected/colrv1/TestCOLRv1.drop-hints-retain-gids.E002,E003,E004.ttf [new file with mode: 0644]
test/subset/data/expected/colrv1/TestCOLRv1.drop-hints-retain-gids.E002,E003.ttf [new file with mode: 0644]
test/subset/data/expected/colrv1/TestCOLRv1.drop-hints-retain-gids.E002.ttf [new file with mode: 0644]
test/subset/data/expected/colrv1/TestCOLRv1.drop-hints-retain-gids.E003,E004.ttf [new file with mode: 0644]
test/subset/data/expected/colrv1/TestCOLRv1.drop-hints-retain-gids.E003.ttf [new file with mode: 0644]
test/subset/data/expected/colrv1/TestCOLRv1.drop-hints-retain-gids.E004.ttf [new file with mode: 0644]
test/subset/data/expected/colrv1/TestCOLRv1.drop-hints-retain-gids.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/colrv1/TestCOLRv1.drop-hints.E000,E001,E002,E003.ttf [new file with mode: 0644]
test/subset/data/expected/colrv1/TestCOLRv1.drop-hints.E000,E001,E002.ttf [new file with mode: 0644]
test/subset/data/expected/colrv1/TestCOLRv1.drop-hints.E000,E001.ttf [new file with mode: 0644]
test/subset/data/expected/colrv1/TestCOLRv1.drop-hints.E000,E004.ttf [new file with mode: 0644]
test/subset/data/expected/colrv1/TestCOLRv1.drop-hints.E000.ttf [new file with mode: 0644]
test/subset/data/expected/colrv1/TestCOLRv1.drop-hints.E001.ttf [new file with mode: 0644]
test/subset/data/expected/colrv1/TestCOLRv1.drop-hints.E002,E003,E004.ttf [new file with mode: 0644]
test/subset/data/expected/colrv1/TestCOLRv1.drop-hints.E002,E003.ttf [new file with mode: 0644]
test/subset/data/expected/colrv1/TestCOLRv1.drop-hints.E002.ttf [new file with mode: 0644]
test/subset/data/expected/colrv1/TestCOLRv1.drop-hints.E003,E004.ttf [new file with mode: 0644]
test/subset/data/expected/colrv1/TestCOLRv1.drop-hints.E003.ttf [new file with mode: 0644]
test/subset/data/expected/colrv1/TestCOLRv1.drop-hints.E004.ttf [new file with mode: 0644]
test/subset/data/expected/colrv1/TestCOLRv1.drop-hints.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/colrv1/TestCOLRv1.retain-gids.E000,E001,E002,E003.ttf [new file with mode: 0644]
test/subset/data/expected/colrv1/TestCOLRv1.retain-gids.E000,E001,E002.ttf [new file with mode: 0644]
test/subset/data/expected/colrv1/TestCOLRv1.retain-gids.E000,E001.ttf [new file with mode: 0644]
test/subset/data/expected/colrv1/TestCOLRv1.retain-gids.E000,E004.ttf [new file with mode: 0644]
test/subset/data/expected/colrv1/TestCOLRv1.retain-gids.E000.ttf [new file with mode: 0644]
test/subset/data/expected/colrv1/TestCOLRv1.retain-gids.E001.ttf [new file with mode: 0644]
test/subset/data/expected/colrv1/TestCOLRv1.retain-gids.E002,E003,E004.ttf [new file with mode: 0644]
test/subset/data/expected/colrv1/TestCOLRv1.retain-gids.E002,E003.ttf [new file with mode: 0644]
test/subset/data/expected/colrv1/TestCOLRv1.retain-gids.E002.ttf [new file with mode: 0644]
test/subset/data/expected/colrv1/TestCOLRv1.retain-gids.E003,E004.ttf [new file with mode: 0644]
test/subset/data/expected/colrv1/TestCOLRv1.retain-gids.E003.ttf [new file with mode: 0644]
test/subset/data/expected/colrv1/TestCOLRv1.retain-gids.E004.ttf [new file with mode: 0644]
test/subset/data/expected/colrv1/TestCOLRv1.retain-gids.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/full-font/Roboto-Regular.default.1FC,21,41,20,62,63.ttf
test/subset/data/expected/full-font/Roboto-Regular.default.61,62,63.ttf
test/subset/data/expected/full-font/Roboto-Regular.default.D7,D8,D9,DA,DE.ttf
test/subset/data/expected/full-font/Roboto-Regular.drop-hints.1FC,21,41,20,62,63.ttf
test/subset/data/expected/full-font/Roboto-Regular.drop-hints.61,62,63.ttf
test/subset/data/expected/full-font/Roboto-Regular.drop-hints.D7,D8,D9,DA,DE.ttf
test/subset/data/expected/full-font/SourceSerifVariable-Roman.default.1FC,21,41,20,62,63.ttf
test/subset/data/expected/full-font/SourceSerifVariable-Roman.default.61,62,63.ttf
test/subset/data/expected/full-font/SourceSerifVariable-Roman.default.D7,D8,D9,DA,DE.ttf
test/subset/data/expected/full-font/SourceSerifVariable-Roman.drop-hints.1FC,21,41,20,62,63.ttf
test/subset/data/expected/full-font/SourceSerifVariable-Roman.drop-hints.61,62,63.ttf
test/subset/data/expected/full-font/SourceSerifVariable-Roman.drop-hints.D7,D8,D9,DA,DE.ttf
test/subset/data/expected/glyf_bug_3131/glyf_bug_3131.drop-hints-retain-gids.63,64,65,6F,70,71,72.ttf [new file with mode: 0644]
test/subset/data/expected/glyf_bug_3131/glyf_bug_3131.drop-hints-retain-gids.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/glyf_bug_3131/glyf_bug_3131.retain-gids.63,64,65,6F,70,71,72.ttf [new file with mode: 0644]
test/subset/data/expected/glyf_bug_3131/glyf_bug_3131.retain-gids.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/glyph_names/Ubuntu-Regular.glyph-names.0x0,0x8,0x9,0x1d,0x20,0xb7.ttf [new file with mode: 0644]
test/subset/data/expected/glyph_names/Ubuntu-Regular.glyph-names.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/japanese/Mplus1p-Regular.default.1D715,1D7D8,41,42.ttf
test/subset/data/expected/japanese/Mplus1p-Regular.default.25771.ttf
test/subset/data/expected/japanese/Mplus1p-Regular.default.3042,3044,3046,3048,304A,304B.ttf
test/subset/data/expected/japanese/Mplus1p-Regular.default.3042,3044,3046,73E0,5EA6,8F38.ttf
test/subset/data/expected/japanese/Mplus1p-Regular.default.61,63,65,6B.ttf
test/subset/data/expected/japanese/Mplus1p-Regular.default.660E,6975,73E0,5EA6,8F38,6E05.ttf
test/subset/data/expected/japanese/Mplus1p-Regular.default.660E.ttf
test/subset/data/expected/japanese/Mplus1p-Regular.drop-hints.1D715,1D7D8,41,42.ttf
test/subset/data/expected/japanese/Mplus1p-Regular.drop-hints.25771.ttf
test/subset/data/expected/japanese/Mplus1p-Regular.drop-hints.3042,3044,3046,3048,304A,304B.ttf
test/subset/data/expected/japanese/Mplus1p-Regular.drop-hints.3042,3044,3046,73E0,5EA6,8F38.ttf
test/subset/data/expected/japanese/Mplus1p-Regular.drop-hints.61,63,65,6B.ttf
test/subset/data/expected/japanese/Mplus1p-Regular.drop-hints.660E,6975,73E0,5EA6,8F38,6E05.ttf
test/subset/data/expected/japanese/Mplus1p-Regular.drop-hints.660E.ttf
test/subset/data/expected/japanese/Mplus1p-Regular.keep-gdef.1D715,1D7D8,41,42.ttf
test/subset/data/expected/japanese/Mplus1p-Regular.keep-gdef.25771.ttf
test/subset/data/expected/japanese/Mplus1p-Regular.keep-gdef.3042,3044,3046,3048,304A,304B.ttf
test/subset/data/expected/japanese/Mplus1p-Regular.keep-gdef.3042,3044,3046,73E0,5EA6,8F38.ttf
test/subset/data/expected/japanese/Mplus1p-Regular.keep-gdef.61,63,65,6B.ttf
test/subset/data/expected/japanese/Mplus1p-Regular.keep-gdef.660E,6975,73E0,5EA6,8F38,6E05.ttf
test/subset/data/expected/japanese/Mplus1p-Regular.keep-gdef.660E.ttf
test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout-retain-gids.41,42,43.otf [deleted file]
test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout-retain-gids.41,42.otf [deleted file]
test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout-retain-gids.41,43.otf [deleted file]
test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout-retain-gids.41.otf [deleted file]
test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout-retain-gids.retain-all-codepoint.otf [deleted file]
test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout.41,42,43.otf [deleted file]
test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout.41,42.otf [deleted file]
test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout.41,43.otf [deleted file]
test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout.41.otf [deleted file]
test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout.retain-all-codepoint.otf [deleted file]
test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.layout-test-retain-gids.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.layout-test-retain-gids.41,42.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.layout-test-retain-gids.41,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.layout-test-retain-gids.41.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.layout-test-retain-gids.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.layout-test.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.layout-test.41,42.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.layout-test.41,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.layout-test.41.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.layout-test.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout-retain-gids.41,42,43.otf [deleted file]
test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout-retain-gids.41,42.otf [deleted file]
test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout-retain-gids.41,43.otf [deleted file]
test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout-retain-gids.41.otf [deleted file]
test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout-retain-gids.retain-all-codepoint.otf [deleted file]
test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout.41,42,43.otf [deleted file]
test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout.41,42.otf [deleted file]
test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout.41,43.otf [deleted file]
test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout.41.otf [deleted file]
test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout.retain-all-codepoint.otf [deleted file]
test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test-retain-gids.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test-retain-gids.41,42.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test-retain-gids.41,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test-retain-gids.41.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test-retain-gids.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test.41,42.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test.41,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test.41.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout-retain-gids.41,42,43.otf [deleted file]
test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout-retain-gids.41,42.otf [deleted file]
test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout-retain-gids.41,43.otf [deleted file]
test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout-retain-gids.41.otf [deleted file]
test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout-retain-gids.retain-all-codepoint.otf [deleted file]
test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout.41,42,43.otf [deleted file]
test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout.41,42.otf [deleted file]
test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout.41,43.otf [deleted file]
test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout.41.otf [deleted file]
test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout.retain-all-codepoint.otf [deleted file]
test/subset/data/expected/layout.context/gpos_context3_simple_f1.layout-test-retain-gids.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context3_simple_f1.layout-test-retain-gids.41,42.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context3_simple_f1.layout-test-retain-gids.41,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context3_simple_f1.layout-test-retain-gids.41.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context3_simple_f1.layout-test-retain-gids.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context3_simple_f1.layout-test.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context3_simple_f1.layout-test.41,42.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context3_simple_f1.layout-test.41,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context3_simple_f1.layout-test.41.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context3_simple_f1.layout-test.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.context_format2/NotoSansNewa-Regular.layout-test-retain-gids.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/layout.context_format2/NotoSansNewa-Regular.layout-test.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/layout.default_features/FranklinGothic-Regular.default.61,63,68,69.ttf [new file with mode: 0644]
test/subset/data/expected/layout.default_features/FranklinGothic-Regular.default.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/layout.default_features/FranklinGothic-Regular.layout-test.61,63,68,69.ttf [new file with mode: 0644]
test/subset/data/expected/layout.default_features/FranklinGothic-Regular.layout-test.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/layout.default_features/FranklinGothic-Regular.retain-gids.61,63,68,69.ttf [new file with mode: 0644]
test/subset/data/expected/layout.default_features/FranklinGothic-Regular.retain-gids.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/layout.drop_feature/SpectralSC-ExtraLightItalic.default.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/layout.drop_feature/SpectralSC-ExtraLightItalic.glyph-names.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/layout.drop_feature/SpectralSC-ExtraLightItalic.notdef-outline.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.default.20,2f,38,49,4c,51,53,66,67,6f,b4,2044.ttf [new file with mode: 0644]
test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.default.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.glyph-names.20,2f,38,49,4c,51,53,66,67,6f,b4,2044.ttf [new file with mode: 0644]
test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.glyph-names.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.notdef-outline.20,2f,38,49,4c,51,53,66,67,6f,b4,2044.ttf [new file with mode: 0644]
test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.notdef-outline.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.default.A01.ttf
test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.default.A05,A06.ttf
test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.default.A07,A1B.ttf
test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.default.retain-all-codepoint.ttf
test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.drop-hints.A01.ttf
test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.drop-hints.A05,A06.ttf
test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.drop-hints.A07,A1B.ttf
test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.drop-hints.retain-all-codepoint.ttf
test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.keep-gdef.A01.ttf
test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.keep-gdef.A05,A06.ttf
test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.keep-gdef.A07,A1B.ttf
test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.keep-gdef.retain-all-codepoint.ttf
test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.default.41,42,43,57.otf [deleted file]
test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.default.41,42,43.otf [deleted file]
test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.default.41,42.otf [deleted file]
test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.default.41,56,57.otf [deleted file]
test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.default.41.otf [deleted file]
test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.default.42,57.otf [deleted file]
test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.drop-hints.41,42,43,57.otf [deleted file]
test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.drop-hints.41,42,43.otf [deleted file]
test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.drop-hints.41,42.otf [deleted file]
test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.drop-hints.41,56,57.otf [deleted file]
test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.drop-hints.41.otf [deleted file]
test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.drop-hints.42,57.otf [deleted file]
test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.keep-gdef-gpos.41,42,43,57.otf [deleted file]
test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.keep-gdef-gpos.41,42,43.otf [deleted file]
test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.keep-gdef-gpos.41,42.otf [deleted file]
test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.keep-gdef-gpos.41,56,57.otf [deleted file]
test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.keep-gdef-gpos.41.otf [deleted file]
test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.keep-gdef-gpos.42,57.otf [deleted file]
test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.layout-test-retain-gids.41,42,43,57.otf [new file with mode: 0644]
test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.layout-test-retain-gids.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.layout-test-retain-gids.41,42.otf [new file with mode: 0644]
test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.layout-test-retain-gids.41,56,57.otf [new file with mode: 0644]
test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.layout-test-retain-gids.41.otf [new file with mode: 0644]
test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.layout-test-retain-gids.42,57.otf [new file with mode: 0644]
test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.layout-test.41,42,43,57.otf [new file with mode: 0644]
test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.layout-test.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.layout-test.41,42.otf [new file with mode: 0644]
test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.layout-test.41,56,57.otf [new file with mode: 0644]
test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.layout-test.41.otf [new file with mode: 0644]
test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.layout-test.42,57.otf [new file with mode: 0644]
test/subset/data/expected/layout.gdef.glyphset/IndicTestHowrah-Regular.default.9dd.ttf [new file with mode: 0644]
test/subset/data/expected/layout.gdef.glyphset/IndicTestHowrah-Regular.default.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/layout.gdef.glyphset/IndicTestHowrah-Regular.drop-hints.9dd.ttf [new file with mode: 0644]
test/subset/data/expected/layout.gdef.glyphset/IndicTestHowrah-Regular.drop-hints.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/layout.gdef.glyphset/IndicTestHowrah-Regular.retain-gids.9dd.ttf [new file with mode: 0644]
test/subset/data/expected/layout.gdef.glyphset/IndicTestHowrah-Regular.retain-gids.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/layout.gdef/Roboto-Regular.default.1E00,303.ttf
test/subset/data/expected/layout.gdef/Roboto-Regular.default.303.ttf
test/subset/data/expected/layout.gdef/Roboto-Regular.default.309,20,30F.ttf
test/subset/data/expected/layout.gdef/Roboto-Regular.default.323.ttf
test/subset/data/expected/layout.gdef/Roboto-Regular.default.41,42,43.ttf
test/subset/data/expected/layout.gdef/Roboto-Regular.drop-hints.1E00,303.ttf
test/subset/data/expected/layout.gdef/Roboto-Regular.drop-hints.303.ttf
test/subset/data/expected/layout.gdef/Roboto-Regular.drop-hints.309,20,30F.ttf
test/subset/data/expected/layout.gdef/Roboto-Regular.drop-hints.323.ttf
test/subset/data/expected/layout.gdef/Roboto-Regular.drop-hints.41,42,43.ttf
test/subset/data/expected/layout.gdef/Roboto-Regular.keep-gdef-gpos.1E00,303.ttf
test/subset/data/expected/layout.gdef/Roboto-Regular.keep-gdef-gpos.303.ttf
test/subset/data/expected/layout.gdef/Roboto-Regular.keep-gdef-gpos.309,20,30F.ttf
test/subset/data/expected/layout.gdef/Roboto-Regular.keep-gdef-gpos.323.ttf
test/subset/data/expected/layout.gdef/Roboto-Regular.keep-gdef-gpos.41,42,43.ttf
test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout-retain-gids.41,43.otf [deleted file]
test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout-retain-gids.41,46.otf [deleted file]
test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout-retain-gids.41.otf [deleted file]
test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout-retain-gids.42,44.otf [deleted file]
test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout-retain-gids.43,46.otf [deleted file]
test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout-retain-gids.retain-all-codepoint.otf [deleted file]
test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout.41,43.otf [deleted file]
test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout.41,46.otf [deleted file]
test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout.41.otf [deleted file]
test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout.42,44.otf [deleted file]
test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout.43,46.otf [deleted file]
test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout.retain-all-codepoint.otf [deleted file]
test/subset/data/expected/layout.gpos/gpos1_2_font.layout-test-retain-gids.41,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos/gpos1_2_font.layout-test-retain-gids.41,46.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos/gpos1_2_font.layout-test-retain-gids.41.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos/gpos1_2_font.layout-test-retain-gids.42,44.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos/gpos1_2_font.layout-test-retain-gids.43,46.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos/gpos1_2_font.layout-test-retain-gids.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos/gpos1_2_font.layout-test.41,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos/gpos1_2_font.layout-test.41,46.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos/gpos1_2_font.layout-test.41.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos/gpos1_2_font.layout-test.42,44.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos/gpos1_2_font.layout-test.43,46.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos/gpos1_2_font.layout-test.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos2/gpos2_1_font7.keep-layout-retain-gids.21,23,25.otf [deleted file]
test/subset/data/expected/layout.gpos2/gpos2_1_font7.keep-layout-retain-gids.21,23.otf [deleted file]
test/subset/data/expected/layout.gpos2/gpos2_1_font7.keep-layout-retain-gids.41,42,43.otf [deleted file]
test/subset/data/expected/layout.gpos2/gpos2_1_font7.keep-layout-retain-gids.retain-all-codepoint.otf [deleted file]
test/subset/data/expected/layout.gpos2/gpos2_1_font7.keep-layout.21,23,25.otf [deleted file]
test/subset/data/expected/layout.gpos2/gpos2_1_font7.keep-layout.21,23.otf [deleted file]
test/subset/data/expected/layout.gpos2/gpos2_1_font7.keep-layout.41,42,43.otf [deleted file]
test/subset/data/expected/layout.gpos2/gpos2_1_font7.keep-layout.retain-all-codepoint.otf [deleted file]
test/subset/data/expected/layout.gpos2/gpos2_1_font7.layout-test-retain-gids.21,23,25.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos2/gpos2_1_font7.layout-test-retain-gids.21,23.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos2/gpos2_1_font7.layout-test-retain-gids.2E,23.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos2/gpos2_1_font7.layout-test-retain-gids.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos2/gpos2_1_font7.layout-test-retain-gids.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos2/gpos2_1_font7.layout-test.21,23,25.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos2/gpos2_1_font7.layout-test.21,23.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos2/gpos2_1_font7.layout-test.2E,23.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos2/gpos2_1_font7.layout-test.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos2/gpos2_1_font7.layout-test.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos2/gpos2_2_font5.keep-layout-retain-gids.21,23,25.otf [deleted file]
test/subset/data/expected/layout.gpos2/gpos2_2_font5.keep-layout-retain-gids.21,23.otf [deleted file]
test/subset/data/expected/layout.gpos2/gpos2_2_font5.keep-layout-retain-gids.41,42,43.otf [deleted file]
test/subset/data/expected/layout.gpos2/gpos2_2_font5.keep-layout-retain-gids.retain-all-codepoint.otf [deleted file]
test/subset/data/expected/layout.gpos2/gpos2_2_font5.keep-layout.21,23,25.otf [deleted file]
test/subset/data/expected/layout.gpos2/gpos2_2_font5.keep-layout.21,23.otf [deleted file]
test/subset/data/expected/layout.gpos2/gpos2_2_font5.keep-layout.41,42,43.otf [deleted file]
test/subset/data/expected/layout.gpos2/gpos2_2_font5.keep-layout.retain-all-codepoint.otf [deleted file]
test/subset/data/expected/layout.gpos2/gpos2_2_font5.layout-test-retain-gids.21,23,25.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos2/gpos2_2_font5.layout-test-retain-gids.21,23.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos2/gpos2_2_font5.layout-test-retain-gids.2E,23.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos2/gpos2_2_font5.layout-test-retain-gids.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos2/gpos2_2_font5.layout-test-retain-gids.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos2/gpos2_2_font5.layout-test.21,23,25.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos2/gpos2_2_font5.layout-test.21,23.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos2/gpos2_2_font5.layout-test.2E,23.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos2/gpos2_2_font5.layout-test.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos2/gpos2_2_font5.layout-test.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos3/gpos3_font3.keep-layout-retain-gids.28,29.otf [deleted file]
test/subset/data/expected/layout.gpos3/gpos3_font3.keep-layout-retain-gids.28,2B.otf [deleted file]
test/subset/data/expected/layout.gpos3/gpos3_font3.keep-layout-retain-gids.29,2B.otf [deleted file]
test/subset/data/expected/layout.gpos3/gpos3_font3.keep-layout-retain-gids.41,42,43.otf [deleted file]
test/subset/data/expected/layout.gpos3/gpos3_font3.keep-layout-retain-gids.retain-all-codepoint.otf [deleted file]
test/subset/data/expected/layout.gpos3/gpos3_font3.keep-layout.28,29.otf [deleted file]
test/subset/data/expected/layout.gpos3/gpos3_font3.keep-layout.28,2B.otf [deleted file]
test/subset/data/expected/layout.gpos3/gpos3_font3.keep-layout.29,2B.otf [deleted file]
test/subset/data/expected/layout.gpos3/gpos3_font3.keep-layout.41,42,43.otf [deleted file]
test/subset/data/expected/layout.gpos3/gpos3_font3.keep-layout.retain-all-codepoint.otf [deleted file]
test/subset/data/expected/layout.gpos3/gpos3_font3.layout-test-retain-gids.28,29.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos3/gpos3_font3.layout-test-retain-gids.28,2B.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos3/gpos3_font3.layout-test-retain-gids.29,2B.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos3/gpos3_font3.layout-test-retain-gids.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos3/gpos3_font3.layout-test-retain-gids.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos3/gpos3_font3.layout-test.28,29.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos3/gpos3_font3.layout-test.28,2B.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos3/gpos3_font3.layout-test.29,2B.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos3/gpos3_font3.layout-test.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos3/gpos3_font3.layout-test.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,42,43,44.otf [deleted file]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,42,43,45.otf [deleted file]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,42,43.otf [deleted file]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,42.otf [deleted file]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,43,44,45,46.otf [deleted file]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,43,44.otf [deleted file]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,43,45.otf [deleted file]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,43.otf [deleted file]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41.otf [deleted file]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.retain-all-codepoint.otf [deleted file]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,42,43,44.otf [deleted file]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,42,43,45.otf [deleted file]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,42,43.otf [deleted file]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,42.otf [deleted file]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,43,44,45,46.otf [deleted file]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,43,44.otf [deleted file]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,43,45.otf [deleted file]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,43.otf [deleted file]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41.otf [deleted file]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.retain-all-codepoint.otf [deleted file]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test-retain-gids.41,42,43,44.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test-retain-gids.41,42,43,45.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test-retain-gids.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test-retain-gids.41,42.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test-retain-gids.41,43,44,45,46.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test-retain-gids.41,43,44.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test-retain-gids.41,43,45.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test-retain-gids.41,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test-retain-gids.41.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test-retain-gids.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test.41,42,43,44.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test.41,42,43,45.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test.41,42.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test.41,43,44,45,46.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test.41,43,44.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test.41,43,45.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test.41,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test.41.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test-retain-gids.41,42,43,44.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test-retain-gids.41,42,43,45.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test-retain-gids.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test-retain-gids.41,42,44.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test-retain-gids.41,42,45.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test-retain-gids.41,42.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test-retain-gids.41,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test-retain-gids.41.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test-retain-gids.42.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test-retain-gids.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test.41,42,43,44.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test.41,42,43,45.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test.41,42,44.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test.41,42,45.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test.41,42.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test.41,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test.41.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test.42.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.41,42,43,44.otf [deleted file]
test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.41,42,43,45.otf [deleted file]
test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.41,42,43.otf [deleted file]
test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.41,42.otf [deleted file]
test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.41,43,44,45,46.otf [deleted file]
test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.41,43,44.otf [deleted file]
test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.41,43,45.otf [deleted file]
test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.41,43.otf [deleted file]
test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.41.otf [deleted file]
test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.retain-all-codepoint.otf [deleted file]
test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41,42,43,44.otf [deleted file]
test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41,42,43,45.otf [deleted file]
test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41,42,43.otf [deleted file]
test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41,42.otf [deleted file]
test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41,43,44,45,46.otf [deleted file]
test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41,43,44.otf [deleted file]
test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41,43,45.otf [deleted file]
test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41,43.otf [deleted file]
test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41.otf [deleted file]
test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.retain-all-codepoint.otf [deleted file]
test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test-retain-gids.41,42,43,44.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test-retain-gids.41,42,43,45.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test-retain-gids.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test-retain-gids.41,42.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test-retain-gids.41,43,44,45,46.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test-retain-gids.41,43,44.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test-retain-gids.41,43,45.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test-retain-gids.41,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test-retain-gids.41.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test-retain-gids.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test.41,42,43,44.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test.41,42,43,45.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test.41,42.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test.41,43,44,45,46.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test.41,43,44.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test.41,43,45.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test.41,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test.41.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos8.amiri/Amiri-Regular.default.627,644,623,62D,644,627,645,2E.ttf [new file with mode: 0644]
test/subset/data/expected/layout.gpos8.amiri/Amiri-Regular.default.627,644,62D,628.ttf [new file with mode: 0644]
test/subset/data/expected/layout.gpos8.amiri/Amiri-Regular.default.627,644.ttf [new file with mode: 0644]
test/subset/data/expected/layout.gpos8.amiri/Amiri-Regular.default.633,645,627,621,20,644,627.ttf [new file with mode: 0644]
test/subset/data/expected/layout.gpos8.amiri/Amiri-Regular.default.63A,64A,631.ttf [new file with mode: 0644]
test/subset/data/expected/layout.gpos8.amiri/Amiri-Regular.retain-gids.627,644,623,62D,644,627,645,2E.ttf [new file with mode: 0644]
test/subset/data/expected/layout.gpos8.amiri/Amiri-Regular.retain-gids.627,644,62D,628.ttf [new file with mode: 0644]
test/subset/data/expected/layout.gpos8.amiri/Amiri-Regular.retain-gids.627,644.ttf [new file with mode: 0644]
test/subset/data/expected/layout.gpos8.amiri/Amiri-Regular.retain-gids.633,645,627,621,20,644,627.ttf [new file with mode: 0644]
test/subset/data/expected/layout.gpos8.amiri/Amiri-Regular.retain-gids.63A,64A,631.ttf [new file with mode: 0644]
test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.keep-layout-retain-gids.30,31,32,33.otf [deleted file]
test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.keep-layout-retain-gids.41,42,43.otf [deleted file]
test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.keep-layout-retain-gids.retain-all-codepoint.otf [deleted file]
test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.keep-layout.30,31,32,33.otf [deleted file]
test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.keep-layout.41,42,43.otf [deleted file]
test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.keep-layout.retain-all-codepoint.otf [deleted file]
test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.layout-test-retain-gids.30,31,32,33.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.layout-test-retain-gids.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.layout-test-retain-gids.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.layout-test.30,31,32,33.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.layout-test.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.layout-test.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.keep-layout-retain-gids.30,31,32,33.otf [deleted file]
test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.keep-layout-retain-gids.41,42,43.otf [deleted file]
test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.keep-layout-retain-gids.retain-all-codepoint.otf [deleted file]
test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.keep-layout.30,31,32,33.otf [deleted file]
test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.keep-layout.41,42,43.otf [deleted file]
test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.keep-layout.retain-all-codepoint.otf [deleted file]
test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.layout-test-retain-gids.30,31,32,33.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.layout-test-retain-gids.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.layout-test-retain-gids.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.layout-test.30,31,32,33.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.layout-test.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.layout-test.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.keep-layout-retain-gids.30,31,32,33.otf [deleted file]
test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.keep-layout-retain-gids.41,42,43.otf [deleted file]
test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.keep-layout-retain-gids.retain-all-codepoint.otf [deleted file]
test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.keep-layout.30,31,32,33.otf [deleted file]
test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.keep-layout.41,42,43.otf [deleted file]
test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.keep-layout.retain-all-codepoint.otf [deleted file]
test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.layout-test-retain-gids.30,31,32,33.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.layout-test-retain-gids.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.layout-test-retain-gids.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.layout-test.30,31,32,33.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.layout-test.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.layout-test.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos9/gpos9_font2.layout-test-retain-gids.41,42.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos9/gpos9_font2.layout-test-retain-gids.41.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos9/gpos9_font2.layout-test-retain-gids.42.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos9/gpos9_font2.layout-test.41,42.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos9/gpos9_font2.layout-test.41.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos9/gpos9_font2.layout-test.42.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.keep-layout-retain-gids.53A9,53F1.otf [deleted file]
test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.keep-layout-retain-gids.53A9.otf [deleted file]
test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.keep-layout-retain-gids.53F1.otf [deleted file]
test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.keep-layout-retain-gids.retain-all-codepoint.otf [deleted file]
test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.keep-layout.53A9,53F1.otf [deleted file]
test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.keep-layout.53A9.otf [deleted file]
test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.keep-layout.53F1.otf [deleted file]
test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.keep-layout.retain-all-codepoint.otf [deleted file]
test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.layout-test-retain-gids.53A9,53F1.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.layout-test-retain-gids.53A9.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.layout-test-retain-gids.53F1.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.layout-test-retain-gids.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.layout-test.53A9,53F1.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.layout-test.53A9.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.layout-test.53F1.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.layout-test.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub5/gsub_context1_multiple_subrules_f2.layout-test-retain-gids.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub5/gsub_context1_multiple_subrules_f2.layout-test-retain-gids.41,42.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub5/gsub_context1_multiple_subrules_f2.layout-test-retain-gids.41,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub5/gsub_context1_multiple_subrules_f2.layout-test-retain-gids.41.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub5/gsub_context1_multiple_subrules_f2.layout-test-retain-gids.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub5/gsub_context1_multiple_subrules_f2.layout-test.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub5/gsub_context1_multiple_subrules_f2.layout-test.41,42.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub5/gsub_context1_multiple_subrules_f2.layout-test.41,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub5/gsub_context1_multiple_subrules_f2.layout-test.41.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub5/gsub_context1_multiple_subrules_f2.layout-test.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test-retain-gids.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test-retain-gids.41,42.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test-retain-gids.41,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test-retain-gids.41.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test-retain-gids.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test.41,42.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test.41,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test.41.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub5/gsub_context3_successive_f1.layout-test-retain-gids.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub5/gsub_context3_successive_f1.layout-test-retain-gids.41,42.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub5/gsub_context3_successive_f1.layout-test-retain-gids.41,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub5/gsub_context3_successive_f1.layout-test-retain-gids.41.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub5/gsub_context3_successive_f1.layout-test-retain-gids.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub5/gsub_context3_successive_f1.layout-test.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub5/gsub_context3_successive_f1.layout-test.41,42.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub5/gsub_context3_successive_f1.layout-test.41,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub5/gsub_context3_successive_f1.layout-test.41.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub5/gsub_context3_successive_f1.layout-test.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub5_format2/Molengo-Regular.layout-test-retain-gids.268,301,302,324.ttf [new file with mode: 0644]
test/subset/data/expected/layout.gsub5_format2/Molengo-Regular.layout-test-retain-gids.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/layout.gsub5_format2/Molengo-Regular.layout-test.268,301,302,324.ttf [new file with mode: 0644]
test/subset/data/expected/layout.gsub5_format2/Molengo-Regular.layout-test.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.keep-layout-retain-gids.30,31,32,33.otf [deleted file]
test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.keep-layout-retain-gids.41,42,43.otf [deleted file]
test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.keep-layout-retain-gids.retain-all-codepoint.otf [deleted file]
test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.keep-layout.30,31,32,33.otf [deleted file]
test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.keep-layout.41,42,43.otf [deleted file]
test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.keep-layout.retain-all-codepoint.otf [deleted file]
test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.layout-test-retain-gids.30,31,32,33.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.layout-test-retain-gids.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.layout-test-retain-gids.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.layout-test.30,31,32,33.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.layout-test.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.layout-test.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.keep-layout-retain-gids.30,31,32,33.otf [deleted file]
test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.keep-layout-retain-gids.41,42,43.otf [deleted file]
test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.keep-layout-retain-gids.retain-all-codepoint.otf [deleted file]
test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.keep-layout.30,31,32,33.otf [deleted file]
test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.keep-layout.41,42,43.otf [deleted file]
test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.keep-layout.retain-all-codepoint.otf [deleted file]
test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.layout-test-retain-gids.30,31,32,33.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.layout-test-retain-gids.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.layout-test-retain-gids.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.layout-test.30,31,32,33.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.layout-test.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.layout-test.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.keep-layout-retain-gids.30,31,32,33.otf [deleted file]
test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.keep-layout-retain-gids.41,42,43.otf [deleted file]
test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.keep-layout-retain-gids.retain-all-codepoint.otf [deleted file]
test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.keep-layout.30,31,32,33.otf [deleted file]
test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.keep-layout.41,42,43.otf [deleted file]
test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.keep-layout.retain-all-codepoint.otf [deleted file]
test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.layout-test-retain-gids.30,31,32,33.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.layout-test-retain-gids.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.layout-test-retain-gids.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.layout-test.30,31,32,33.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.layout-test.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.layout-test.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test-retain-gids.41,42,43,44,45,46,47,48,49.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test-retain-gids.41,42,43,44,45,46,47.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test-retain-gids.41,42,43,44,45,46,4D.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test-retain-gids.41,42,43,44,45,46,51.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test-retain-gids.41,42,43,44,45,46.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test-retain-gids.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test-retain-gids.41.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test-retain-gids.61.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test-retain-gids.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test.41,42,43,44,45,46,47,48,49.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test.41,42,43,44,45,46,47.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test.41,42,43,44,45,46,4D.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test.41,42,43,44,45,46,51.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test.41,42,43,44,45,46.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test.41.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test.61.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.khmer/Khmer.default.1780.ttf [new file with mode: 0644]
test/subset/data/expected/layout.khmer/Khmer.default.1789,17BB,17C6,1794,17B6,1793,1798,17BE.ttf [new file with mode: 0644]
test/subset/data/expected/layout.khmer/Khmer.default.31.ttf [new file with mode: 0644]
test/subset/data/expected/layout.khmer/Khmer.retain-gids.1780.ttf [new file with mode: 0644]
test/subset/data/expected/layout.khmer/Khmer.retain-gids.1789,17BB,17C6,1794,17B6,1793,1798,17BE.ttf [new file with mode: 0644]
test/subset/data/expected/layout.khmer/Khmer.retain-gids.31.ttf [new file with mode: 0644]
test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.default.627,644,623,62D,644,627,645,2E.ttf [new file with mode: 0644]
test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.default.627,644,62D,628.ttf [new file with mode: 0644]
test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.default.627,644.ttf [new file with mode: 0644]
test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.default.633,645,627,621,20,644,627.ttf [new file with mode: 0644]
test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.default.633,6D2.ttf [new file with mode: 0644]
test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.default.63A,64A,631.ttf [new file with mode: 0644]
test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.default.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.retain-gids.627,644,623,62D,644,627,645,2E.ttf [new file with mode: 0644]
test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.retain-gids.627,644,62D,628.ttf [new file with mode: 0644]
test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.retain-gids.627,644.ttf [new file with mode: 0644]
test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.retain-gids.633,645,627,621,20,644,627.ttf [new file with mode: 0644]
test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.retain-gids.633,6D2.ttf [new file with mode: 0644]
test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.retain-gids.63A,64A,631.ttf [new file with mode: 0644]
test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.retain-gids.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.default.627,644,623,62D,644,627,645,2E.ttf [new file with mode: 0644]
test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.default.627,644,62D,628.ttf [new file with mode: 0644]
test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.default.627,644.ttf [new file with mode: 0644]
test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.default.633,645,627,621,20,644,627.ttf [new file with mode: 0644]
test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.default.633,6D2.ttf [new file with mode: 0644]
test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.default.63A,64A,631.ttf [new file with mode: 0644]
test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.default.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.retain-gids.627,644,623,62D,644,627,645,2E.ttf [new file with mode: 0644]
test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.retain-gids.627,644,62D,628.ttf [new file with mode: 0644]
test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.retain-gids.627,644.ttf [new file with mode: 0644]
test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.retain-gids.633,645,627,621,20,644,627.ttf [new file with mode: 0644]
test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.retain-gids.633,6D2.ttf [new file with mode: 0644]
test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.retain-gids.63A,64A,631.ttf [new file with mode: 0644]
test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.retain-gids.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/layout.tinos/Tinos-Italic.default.5bf,5f0,5f1,5f2,fb21,fb22,fb23,fb24,fb25,fb26,fb27,fb28.ttf [new file with mode: 0644]
test/subset/data/expected/layout.tinos/Tinos-Italic.default.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/layout.tinos/Tinos-Italic.glyph-names.5bf,5f0,5f1,5f2,fb21,fb22,fb23,fb24,fb25,fb26,fb27,fb28.ttf [new file with mode: 0644]
test/subset/data/expected/layout.tinos/Tinos-Italic.glyph-names.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/layout.tinos/Tinos-Italic.notdef-outline.5bf,5f0,5f1,5f2,fb21,fb22,fb23,fb24,fb25,fb26,fb27,fb28.ttf [new file with mode: 0644]
test/subset/data/expected/layout.tinos/Tinos-Italic.notdef-outline.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/layout.tinos/Tinos-Italic.retain-gids.5bf,5f0,5f1,5f2,fb21,fb22,fb23,fb24,fb25,fb26,fb27,fb28.ttf [new file with mode: 0644]
test/subset/data/expected/layout.tinos/Tinos-Italic.retain-gids.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/layout.unsorted_featurelist/NotoIKEAHebrewLatin-Regular.default.392,3a7,3b2,3c7.ttf [new file with mode: 0644]
test/subset/data/expected/layout.unsorted_featurelist/NotoIKEAHebrewLatin-Regular.default.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/layout.unsorted_featurelist/NotoIKEAHebrewLatin-Regular.layout-test.392,3a7,3b2,3c7.ttf [new file with mode: 0644]
test/subset/data/expected/layout.unsorted_featurelist/NotoIKEAHebrewLatin-Regular.layout-test.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/layout.unsorted_featurelist/NotoIKEAHebrewLatin-Regular.retain-gids.392,3a7,3b2,3c7.ttf [new file with mode: 0644]
test/subset/data/expected/layout.unsorted_featurelist/NotoIKEAHebrewLatin-Regular.retain-gids.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/layout/Roboto-Regular.smallcaps.default.41,42,43.ttf [new file with mode: 0644]
test/subset/data/expected/layout/Roboto-Regular.smallcaps.default.41,43.ttf [new file with mode: 0644]
test/subset/data/expected/layout/Roboto-Regular.smallcaps.default.41.ttf [new file with mode: 0644]
test/subset/data/expected/layout/Roboto-Regular.smallcaps.default.43.ttf [new file with mode: 0644]
test/subset/data/expected/layout/Roboto-Regular.smallcaps.default.CA,CB.ttf [new file with mode: 0644]
test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout-retain-gids.41,42,43.ttf [deleted file]
test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout-retain-gids.41,43.ttf [deleted file]
test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout-retain-gids.41.ttf [deleted file]
test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout-retain-gids.43.ttf [deleted file]
test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout-retain-gids.CA,CB.ttf [deleted file]
test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout.41,42,43.ttf [deleted file]
test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout.41,43.ttf [deleted file]
test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout.41.ttf [deleted file]
test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout.43.ttf [deleted file]
test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout.CA,CB.ttf [deleted file]
test/subset/data/expected/layout/Roboto-Regular.smallcaps.retain-gids.41,42,43.ttf [new file with mode: 0644]
test/subset/data/expected/layout/Roboto-Regular.smallcaps.retain-gids.41,43.ttf [new file with mode: 0644]
test/subset/data/expected/layout/Roboto-Regular.smallcaps.retain-gids.41.ttf [new file with mode: 0644]
test/subset/data/expected/layout/Roboto-Regular.smallcaps.retain-gids.43.ttf [new file with mode: 0644]
test/subset/data/expected/layout/Roboto-Regular.smallcaps.retain-gids.CA,CB.ttf [new file with mode: 0644]
test/subset/data/expected/math/STIXTwoMath-Regular.default.2f,7c,305.ttf [new file with mode: 0644]
test/subset/data/expected/math/STIXTwoMath-Regular.default.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/math/STIXTwoMath-Regular.glyph-names.2f,7c,305.ttf [new file with mode: 0644]
test/subset/data/expected/math/STIXTwoMath-Regular.glyph-names.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/math/STIXTwoMath-Regular.notdef-outline.2f,7c,305.ttf [new file with mode: 0644]
test/subset/data/expected/math/STIXTwoMath-Regular.notdef-outline.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/math/STIXTwoMath-Regular.retain-gids.2f,7c,305.ttf [new file with mode: 0644]
test/subset/data/expected/math/STIXTwoMath-Regular.retain-gids.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/math_coverage_offset/Caudex-Regular.default.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/math_coverage_offset/Caudex-Regular.glyph-names.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/math_coverage_offset/Caudex-Regular.keep-all-layout-features.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/math_coverage_offset/Caudex-Regular.notdef-outline.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/math_coverage_offset/Caudex-Regular.retain-gids.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/post/SreeKrushnadevaraya-Regular.default.c30,c36,c40,c4d.ttf [new file with mode: 0644]
test/subset/data/expected/post/SreeKrushnadevaraya-Regular.default.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/post/SreeKrushnadevaraya-Regular.glyph-names.c30,c36,c40,c4d.ttf [new file with mode: 0644]
test/subset/data/expected/post/SreeKrushnadevaraya-Regular.glyph-names.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/post/SreeKrushnadevaraya-Regular.notdef-outline.c30,c36,c40,c4d.ttf [new file with mode: 0644]
test/subset/data/expected/post/SreeKrushnadevaraya-Regular.notdef-outline.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/post/SreeKrushnadevaraya-Regular.retain-gids.c30,c36,c40,c4d.ttf [new file with mode: 0644]
test/subset/data/expected/post/SreeKrushnadevaraya-Regular.retain-gids.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/sbix/sbix.default.58,59.ttf
test/subset/data/expected/sbix/sbix.default.58.ttf
test/subset/data/expected/sbix/sbix.default.59.ttf
test/subset/data/expected/sbix/sbix.drop-hints-retain-gids.58,59.ttf
test/subset/data/expected/sbix/sbix.drop-hints-retain-gids.58.ttf
test/subset/data/expected/sbix/sbix.drop-hints-retain-gids.59.ttf
test/subset/data/expected/sbix/sbix.drop-hints.58,59.ttf
test/subset/data/expected/sbix/sbix.drop-hints.58.ttf
test/subset/data/expected/sbix/sbix.drop-hints.59.ttf
test/subset/data/expected/sbix/sbix.retain-gids.58,59.ttf
test/subset/data/expected/sbix/sbix.retain-gids.58.ttf
test/subset/data/expected/sbix/sbix.retain-gids.59.ttf
test/subset/data/expected/variable/Fraunces.default.26,66,69,124,125.ttf [new file with mode: 0644]
test/subset/data/expected/variable/Fraunces.default.61.ttf [new file with mode: 0644]
test/subset/data/fonts/AlegreyaSans-BlackItalic.ttf [new file with mode: 0644]
test/subset/data/fonts/Amiri-Regular.ttf [new file with mode: 0644]
test/subset/data/fonts/BungeeColor-Regular.ttf [new file with mode: 0644]
test/subset/data/fonts/Caudex-Regular.ttf [new file with mode: 0644]
test/subset/data/fonts/FranklinGothic-Regular.ttf [new file with mode: 0644]
test/subset/data/fonts/Fraunces.ttf [new file with mode: 0644]
test/subset/data/fonts/Harmattan-Regular.ttf [new file with mode: 0644]
test/subset/data/fonts/IndicTestHowrah-Regular.ttf [new file with mode: 0644]
test/subset/data/fonts/Khmer.ttf [new file with mode: 0644]
test/subset/data/fonts/Molengo-Regular.ttf [new file with mode: 0644]
test/subset/data/fonts/NotoColrEmojiGlyf-Regular.subset.ttf [new file with mode: 0644]
test/subset/data/fonts/NotoIKEAHebrewLatin-Regular.ttf [new file with mode: 0644]
test/subset/data/fonts/NotoNastaliqUrdu-Bold.ttf [new file with mode: 0644]
test/subset/data/fonts/NotoNastaliqUrdu-Regular.ttf [new file with mode: 0644]
test/subset/data/fonts/NotoSansNewa-Regular.ttf [new file with mode: 0644]
test/subset/data/fonts/NotoSerifMyanmar-Regular.otf [new file with mode: 0644]
test/subset/data/fonts/STIXTwoMath-Regular.ttf [new file with mode: 0644]
test/subset/data/fonts/SpectralSC-ExtraLightItalic.ttf [new file with mode: 0644]
test/subset/data/fonts/SreeKrushnadevaraya-Regular.ttf [new file with mode: 0644]
test/subset/data/fonts/TestCOLRv1.ttf [new file with mode: 0644]
test/subset/data/fonts/Tinos-Italic.ttf [new file with mode: 0644]
test/subset/data/fonts/Ubuntu-Regular.ttf [new file with mode: 0644]
test/subset/data/fonts/colr-table.ttf [new file with mode: 0644]
test/subset/data/fonts/glyf_bug_3131.ttf [new file with mode: 0644]
test/subset/data/fonts/gpos2_2_font5.otf
test/subset/data/fonts/gpos5_font1.otf [new file with mode: 0644]
test/subset/data/fonts/gpos9_font2.otf [new file with mode: 0644]
test/subset/data/fonts/gsub8_manually_created.otf [new file with mode: 0644]
test/subset/data/fonts/gsub_context1_multiple_subrules_f2.otf [new file with mode: 0644]
test/subset/data/fonts/gsub_context2_multiple_subrules_f2.otf [new file with mode: 0644]
test/subset/data/fonts/gsub_context3_successive_f1.otf [new file with mode: 0644]
test/subset/data/profiles/glyph-names.txt [new file with mode: 0644]
test/subset/data/profiles/keep-all-layout-features.txt [new file with mode: 0644]
test/subset/data/profiles/keep-layout-retain-gids.txt [deleted file]
test/subset/data/profiles/keep-layout.txt [deleted file]
test/subset/data/profiles/layout-features.txt [new file with mode: 0644]
test/subset/data/profiles/layout-test-retain-gids.txt [new file with mode: 0644]
test/subset/data/profiles/layout-test.txt [new file with mode: 0644]
test/subset/data/profiles/no-prune-unicode-ranges.txt [new file with mode: 0644]
test/subset/data/profiles/notdef-outline-desubroutinize-retain-gids.txt [new file with mode: 0644]
test/subset/data/profiles/notdef-outline-desubroutinize.txt [new file with mode: 0644]
test/subset/data/profiles/notdef-outline-drop-hints-desubroutinize-retain-gids.txt [new file with mode: 0644]
test/subset/data/profiles/notdef-outline-drop-hints-desubroutinize.txt [new file with mode: 0644]
test/subset/data/profiles/notdef-outline-drop-hints-retain-gids.txt [new file with mode: 0644]
test/subset/data/profiles/notdef-outline-drop-hints.txt [new file with mode: 0644]
test/subset/data/profiles/notdef-outline-gids.txt [new file with mode: 0644]
test/subset/data/profiles/notdef-outline-name-ids.txt [new file with mode: 0644]
test/subset/data/profiles/notdef-outline-retain-gids.txt [new file with mode: 0644]
test/subset/data/profiles/notdef-outline.txt [new file with mode: 0644]
test/subset/data/repack_tests/Makefile.am [new file with mode: 0644]
test/subset/data/repack_tests/Makefile.in [new file with mode: 0644]
test/subset/data/repack_tests/Makefile.sources [new file with mode: 0644]
test/subset/data/repack_tests/advanced_prioritization.tests [new file with mode: 0644]
test/subset/data/repack_tests/basic.tests [new file with mode: 0644]
test/subset/data/repack_tests/isolation.tests [new file with mode: 0644]
test/subset/data/repack_tests/prioritization.tests [new file with mode: 0644]
test/subset/data/repack_tests/space_splitting.tests [new file with mode: 0644]
test/subset/data/repack_tests/table_duplication.tests [new file with mode: 0644]
test/subset/data/tests/basics.tests
test/subset/data/tests/cff-full-font.tests
test/subset/data/tests/cff-japanese.tests
test/subset/data/tests/cff.notoserifmyanmar.tests [new file with mode: 0644]
test/subset/data/tests/cmap14.tests
test/subset/data/tests/colr_glyphs.tests [new file with mode: 0644]
test/subset/data/tests/colr_with_components.tests [new file with mode: 0644]
test/subset/data/tests/colrv1.tests [new file with mode: 0644]
test/subset/data/tests/glyf_bug_3131.tests [new file with mode: 0644]
test/subset/data/tests/glyph_names.tests [new file with mode: 0644]
test/subset/data/tests/japanese.tests
test/subset/data/tests/layout.context.tests [new file with mode: 0644]
test/subset/data/tests/layout.context_format2.tests [new file with mode: 0644]
test/subset/data/tests/layout.default_features.tests [new file with mode: 0644]
test/subset/data/tests/layout.drop_feature.tests [new file with mode: 0644]
test/subset/data/tests/layout.duplicate_features.tests [new file with mode: 0644]
test/subset/data/tests/layout.gdef-attachlist.tests [new file with mode: 0644]
test/subset/data/tests/layout.gdef-varstore.tests [new file with mode: 0644]
test/subset/data/tests/layout.gdef.glyphset.tests [new file with mode: 0644]
test/subset/data/tests/layout.gdef.tests [new file with mode: 0644]
test/subset/data/tests/layout.gpos.tests [new file with mode: 0644]
test/subset/data/tests/layout.gpos2.tests [new file with mode: 0644]
test/subset/data/tests/layout.gpos3.tests [new file with mode: 0644]
test/subset/data/tests/layout.gpos4.tests [new file with mode: 0644]
test/subset/data/tests/layout.gpos5.tests [new file with mode: 0644]
test/subset/data/tests/layout.gpos6.tests [new file with mode: 0644]
test/subset/data/tests/layout.gpos8.amiri.tests [new file with mode: 0644]
test/subset/data/tests/layout.gpos8.tests [new file with mode: 0644]
test/subset/data/tests/layout.gpos9.tests [new file with mode: 0644]
test/subset/data/tests/layout.gsub3.tests [new file with mode: 0644]
test/subset/data/tests/layout.gsub5.tests [new file with mode: 0644]
test/subset/data/tests/layout.gsub5_format2.tests [new file with mode: 0644]
test/subset/data/tests/layout.gsub6.tests [new file with mode: 0644]
test/subset/data/tests/layout.gsub8.tests [new file with mode: 0644]
test/subset/data/tests/layout.khmer.tests [new file with mode: 0644]
test/subset/data/tests/layout.notonastaliqurdu.tests [new file with mode: 0644]
test/subset/data/tests/layout.tests [new file with mode: 0644]
test/subset/data/tests/layout.tinos.tests [new file with mode: 0644]
test/subset/data/tests/layout.unsorted_featurelist.tests [new file with mode: 0644]
test/subset/data/tests/math.tests [new file with mode: 0644]
test/subset/data/tests/math_coverage_offset.tests [new file with mode: 0644]
test/subset/data/tests/post.tests [new file with mode: 0644]
test/subset/data/tests/variable.tests [new file with mode: 0644]
test/subset/meson.build
test/subset/repack_test.py [new file with mode: 0644]
test/subset/run-repack-tests.py [new file with mode: 0755]
test/subset/run-tests.py
test/subset/subset_test_suite.py
util/Makefile.am
util/Makefile.in
util/Makefile.sources
util/ansi-print.cc [deleted file]
util/ansi-print.hh
util/batch.hh [new file with mode: 0644]
util/face-options.hh [new file with mode: 0644]
util/font-options.hh [new file with mode: 0644]
util/hb-ot-shape-closure.cc
util/hb-shape.cc
util/hb-subset.cc
util/hb-view.cc
util/helper-cairo-ansi.cc [deleted file]
util/helper-cairo-ansi.hh
util/helper-cairo.cc [deleted file]
util/helper-cairo.hh
util/main-font-text.hh
util/meson.build
util/options-subset.cc [deleted file]
util/options.cc [deleted file]
util/options.hh
util/output-options.hh [new file with mode: 0644]
util/shape-consumer.hh
util/shape-format.hh [new file with mode: 0644]
util/shape-options.hh [new file with mode: 0644]
util/text-options.hh [new file with mode: 0644]
util/view-cairo.cc [deleted file]
util/view-cairo.hh
util/view-options.hh [new file with mode: 0644]

index 652d8af..f64f868 100644 (file)
--- a/BUILD.md
+++ b/BUILD.md
@@ -1,47 +1,27 @@
 On Linux, install the development packages for FreeType,
 Cairo, and GLib. For example, on Ubuntu / Debian, you would do:
 
-    sudo apt-get install gcc g++ libfreetype6-dev libglib2.0-dev libcairo2-dev
+    sudo apt-get install meson pkg-config ragel gtk-doc-tools gcc g++ libfreetype6-dev libglib2.0-dev libcairo2-dev
 
 whereas on Fedora, RHEL, CentOS, and other Red Hat based systems you would do:
 
-    sudo yum install gcc gcc-c++ freetype-devel glib2-devel cairo-devel
+    sudo dnf install meson pkgconfig gtk-doc gcc gcc-c++ freetype-devel glib2-devel cairo-dev
 
-on Windows, consider using [vcpkg](https://github.com/Microsoft/vcpkg)
-or `meson build && ninja -Cbuild`.
+and on ArchLinux and Manjaro:
 
-on macOS, using MacPorts:
+    sudo pacman -Suy meson pkg-config ragel gcc freetype2 glib2 cairo
 
-    sudo port install freetype glib2 cairo
+then use meson to build the project like `meson build && meson test -Cbuild`.
 
-or using Homebrew:
+On macOS, `brew install pkg-config ragel gtk-doc freetype glib cairo meson` then use
+meson like above.
 
-    brew install freetype glib cairo
+On Windows, meson can build the project like above if a working MSVC's cl.exe (`vcvarsall.bat`)
+or gcc/clang is already on your path, and if you use something like `meson build --wrap-mode=default`
+it fetches and compiles most of the dependencies also.
 
-If you are using a tarball, you can now proceed to running configure and make
-as with any other standard package. That should leave you with a shared
-library in `src/`, and a few utility programs including `hb-view` and `hb-shape`
-under `util/`.
+Our CI configurations is also a good source of learning how to build HarfBuzz.
 
-If you are bootstrapping from git, you need a few more tools before you can
-run `autogen.sh` for the first time. Namely, `pkg-config` and `ragel`.
-
-Again, on Ubuntu / Debian:
-
-    sudo apt-get install autoconf automake libtool pkg-config ragel gtk-doc-tools
-
-and on Fedora, RHEL, CentOS:
-
-    sudo yum install autoconf automake libtool pkgconfig ragel gtk-doc
-
-on the Mac, using MacPorts:
-
-    sudo port install autoconf automake libtool pkgconfig ragel gtk-doc
-
-or using Homebrew:
-
-    brew install autoconf automake libtool pkgconfig ragel gtk-doc
-
-To build the Python bindings, you also need:
-
-    brew install pygobject3
+There is also amalgam source provided with HarfBuzz which reduces whole process of building
+HarfBuzz like `g++ src/harfbuzz.cc -fno-exceptions` but there is not guarantee provided
+with buildability and reliability of features you get.
index 71830b6..3259ca9 100644 (file)
@@ -1,7 +1,7 @@
-cmake_minimum_required(VERSION 2.8.0)
+cmake_minimum_required(VERSION 3.1)
 project(harfbuzz)
 
-message("HarfBuzz has a Meson port also and tries to migrate all the other build systems to it, please consider using it.")
+message(WARN "HarfBuzz has a Meson port and tries to migrate all the other build systems to it, please consider using it as we might remove our cmake port soon.")
 
 ## Limit framework build to Xcode generator
 if (BUILD_FRAMEWORK)
@@ -37,6 +37,10 @@ option(HB_HAVE_FREETYPE "Enable freetype interop helpers" OFF)
 option(HB_HAVE_GRAPHITE2 "Enable Graphite2 complementary shaper" OFF)
 option(HB_HAVE_GLIB "Enable glib unicode functions" OFF)
 option(HB_HAVE_ICU "Enable icu unicode functions" OFF)
+if (TARGET freetype)
+  set (HB_HAVE_FREETYPE ON)
+  add_definitions(-DHAVE_FREETYPE=1)
+endif ()
 if (APPLE)
   option(HB_HAVE_CORETEXT "Enable CoreText shaper backend on macOS" ON)
   set (CMAKE_MACOSX_RPATH ON)
@@ -88,7 +92,7 @@ endmacro ()
 if (UNIX)
   list(APPEND CMAKE_REQUIRED_LIBRARIES m)
 endif ()
-check_funcs(atexit mprotect sysconf getpagesize mmap isatty roundf)
+check_funcs(atexit mprotect sysconf getpagesize mmap isatty)
 check_include_file(unistd.h HAVE_UNISTD_H)
 if (${HAVE_UNISTD_H})
   add_definitions(-DHAVE_UNISTD_H)
@@ -102,6 +106,14 @@ if (${HAVE_STDBOOL_H})
   add_definitions(-DHAVE_STDBOOL_H)
 endif ()
 
+if (NOT MSVC)
+  set(THREADS_PREFER_PTHREAD_FLAG ON)
+  find_package(Threads)
+  if (CMAKE_USE_PTHREADS_INIT)
+    add_definitions("-DHAVE_PTHREAD")
+    list(APPEND THIRD_PARTY_LIBS Threads::Threads)
+  endif ()
+endif ()
 
 if (MSVC)
   add_definitions(-wd4244 -wd4267 -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_WARNINGS)
@@ -176,7 +188,7 @@ set (project_headers ${HB_BASE_headers})
 set (subset_project_headers ${HB_SUBSET_headers})
 
 ## Find and include needed header folders and libraries
-if (HB_HAVE_FREETYPE)
+if (HB_HAVE_FREETYPE AND NOT TARGET freetype)
   include (FindFreetype)
   if (NOT FREETYPE_FOUND)
     message(FATAL_ERROR "HB_HAVE_FREETYPE was set, but we failed to find it. Maybe add a CMAKE_PREFIX_PATH= to your Freetype2 install prefix")
@@ -233,7 +245,7 @@ endif ()
 if (HB_HAVE_ICU)
   add_definitions(-DHAVE_ICU)
 
-  # https://github.com/WebKit/webkit/blob/master/Source/cmake/FindICU.cmake
+  # https://github.com/WebKit/webkit/blob/fdd7733f2f30eab7fe096a9791f98c60f62f49c0/Source/cmake/FindICU.cmake
   find_package(PkgConfig)
   pkg_check_modules(PC_ICU QUIET icu-uc)
 
@@ -302,6 +314,7 @@ if (WIN32 AND HB_HAVE_DIRECTWRITE)
 endif ()
 
 if (HB_HAVE_GOBJECT)
+  add_definitions(-DHAVE_GOBJECT)
   include (FindPerl)
 
   # Use the hints from glib-2.0.pc to find glib-mkenums
@@ -405,41 +418,16 @@ if (HB_HAVE_GOBJECT)
   )
 endif ()
 
-## Atomic ops availability detection
-file(WRITE "${PROJECT_BINARY_DIR}/try_compile_intel_atomic_primitives.c"
-"              void memory_barrier (void) { __sync_synchronize (); }
-               int atomic_add (int *i) { return __sync_fetch_and_add (i, 1); }
-               int mutex_trylock (int *m) { return __sync_lock_test_and_set (m, 1); }
-               void mutex_unlock (int *m) { __sync_lock_release (m); }
-               int main () { return 0; }
-")
-try_compile(HB_HAVE_INTEL_ATOMIC_PRIMITIVES
-  ${PROJECT_BINARY_DIR}/try_compile_intel_atomic_primitives
-  ${PROJECT_BINARY_DIR}/try_compile_intel_atomic_primitives.c)
-if (HB_HAVE_INTEL_ATOMIC_PRIMITIVES)
-  add_definitions(-DHAVE_INTEL_ATOMIC_PRIMITIVES)
-endif ()
-
-file(WRITE "${PROJECT_BINARY_DIR}/try_compile_solaris_atomic_ops.c"
-"              #include <atomic.h>
-               /* This requires Solaris Studio 12.2 or newer: */
-               #include <mbarrier.h>
-               void memory_barrier (void) { __machine_rw_barrier (); }
-               int atomic_add (volatile unsigned *i) { return atomic_add_int_nv (i, 1); }
-               void *atomic_ptr_cmpxchg (volatile void **target, void *cmp, void *newval) { return atomic_cas_ptr (target, cmp, newval); }
-               int main () { return 0; }
-")
-try_compile(HB_HAVE_SOLARIS_ATOMIC_OPS
-  ${PROJECT_BINARY_DIR}/try_compile_solaris_atomic_ops
-  ${PROJECT_BINARY_DIR}/try_compile_solaris_atomic_ops.c)
-if (HB_HAVE_SOLARIS_ATOMIC_OPS)
-  add_definitions(-DHAVE_SOLARIS_ATOMIC_OPS)
-endif ()
-
 
 ## Define harfbuzz library
 add_library(harfbuzz ${project_sources} ${project_extra_sources} ${project_headers})
 target_link_libraries(harfbuzz ${THIRD_PARTY_LIBS})
+target_include_directories(harfbuzz PUBLIC
+                           "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>"
+                           "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/harfbuzz>")
+if (HB_HAVE_FREETYPE AND TARGET freetype)
+  target_link_libraries(harfbuzz PUBLIC freetype)
+endif ()
 
 
 ## Define harfbuzz-icu library
@@ -457,6 +445,7 @@ endif ()
 ## Define harfbuzz-subset library
 if (HB_BUILD_SUBSET)
   add_library(harfbuzz-subset ${subset_project_sources} ${subset_project_headers})
+  list(APPEND project_headers ${PROJECT_SOURCE_DIR}/src/hb-subset.h)
   add_dependencies(harfbuzz-subset harfbuzz)
   target_link_libraries(harfbuzz-subset harfbuzz ${THIRD_PARTY_LIBS})
 
@@ -722,6 +711,11 @@ if (NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL)
       FRAMEWORK DESTINATION Library/Frameworks
     )
   endif ()
+  if (HB_BUILD_SUBSET)
+    install(TARGETS harfbuzz-subset
+      ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+  )
+  endif ()
   if (HB_BUILD_UTILS)
     if (WIN32 AND BUILD_SHARED_LIBS)
       install(TARGETS harfbuzz-subset
index 8aa9b1b..15b4ffa 100644 (file)
--- a/CONFIG.md
+++ b/CONFIG.md
@@ -1,9 +1,9 @@
 # Configuring HarfBuzz
 
 Most of the time you will not need any custom configuration.  The configuration
-options provided by `configure` or `meson` should be enough.  In particular,
-if you just want HarfBuzz library plus hb-shape / hb-view utilities, make sure
-FreeType and Cairo are available and found during configuration.
+options provided by `meson` should be enough.  In particular, if you just want
+HarfBuzz library plus hb-shape / hb-view utilities, make sure FreeType and Cairo
+are available and found during configuration.
 
 If you are building for distribution, you should more carefully consider whether
 you need Glib, ICU, Graphite2, as well as CoreText / Uniscribe / DWrite.  Make
@@ -18,9 +18,9 @@ binary size savings.
 ## Compiler Options
 
 Make sure you build with your compiler's "optimize for size" option.  On `gcc`
-this is `-Os`, and can be enabled by passing `CXXFLAGS=-Os` either to `configure`
-(sticky) or to `make` (non-sticky).  On clang there is an even more extreme flag,
-`-Oz`.
+this is `-Os`, and can be enabled by passing `CXXFLAGS=-Os`.  On clang there
+is an even more extreme flag, `-Oz`.  Meson also provides `--buildtype=minsize`
+for more convenience.
 
 HarfBuzz heavily uses inline functions and the optimize-size flag can make the
 library smaller by 20% or more.  Moreover, sometimes, based on the target CPU,
@@ -32,8 +32,7 @@ optimizations.  Search for `HB_OPTIMIZE_SIZE` for details, if you are using
 other compilers, or continue reading.
 
 Another compiler option to consider is "link-time optimization", also known as
-'lto'.  To enable that, with `gcc` or `clang`, add `-flto` to both `CXXFLAGS`
-and `LDFLAGS`, either on `configure` invocation (sticky) or on `make` (non-sticky).
+'lto'.  To enable that, feel free to use `-Db_lto=true` of meson.
 This, also, can have a huge impact on the final size, 20% or more.
 
 Finally, if you are making a static library build or otherwise linking the
@@ -109,7 +108,7 @@ Defining `HB_NO_FALLBACK_SHAPE` however is pretty harmless.  That removes the
 By default HarfBuzz builds as a thread-safe library.  The exception is that
 the `HB_TINY` predefined configuring (more below) disables thread-safety.
 
-If you do /not/ need thread-safety in the library (eg. you always call into
+If you do *not* need thread-safety in the library (eg. you always call into
 HarfBuzz from the same thread), you can disable thread-safety by defining
 `HB_NO_MT`.  As noted already, this is enabled by `HB_TINY`.
 
@@ -136,16 +135,23 @@ The pre-defined configurations are:
 Most of the time, one of the pre-defined configuration is exactly what one needs.
 Sometimes, however, the pre-defined configuration cuts out features that might
 be desired in the library.  Unfortunately there is no quick way to undo those
-configurations from the command-line.  But one can add a header file called
-`config-override.h` to undefine certain `HB_NO_*` symbols as desired.  Then
-define `HAVE_CONFIG_OVERRIDE_H` to make `hb-config.hh` include your configuration
-overrides at the end.
+configurations from the command-line.
+
+However, configuration can still be overridden from a file.  To do that, add your
+override instructions (mostly `undef` instructions) to a header file and define
+the macro `HB_CONFIG_OVERRIDE_H` to the string containing to that header file's
+name.  HarfBuzz will then include that file at appropriate right place during
+configuration.
+
+Up until HarfBuzz 3.1.2 the the configuration override header file's name was
+fixed and called `config-override.h`, and was activated by defining the macro
+`HAVE_CONFIG_OVERRIDE_H`.  That still works.
 
 
 ## Notes
 
 Note that the config option `HB_NO_CFF`, which is enabled by `HB_LEAN` and
-`HB_TINY` does /not/ mean that the resulting library won't work with CFF fonts.
+`HB_TINY` does *not* mean that the resulting library won't work with CFF fonts.
 The library can shape valid CFF fonts just fine, with or without this option.
-This option disables (among other things) the code to calculate glyph exntents
+This option disables (among other things) the code to calculate glyph extents
 for CFF fonts.
diff --git a/COPYING b/COPYING
index 5734316..48d1b30 100644 (file)
--- a/COPYING
+++ b/COPYING
@@ -4,14 +4,14 @@ files names COPYING in subdirectories where applicable.
 
 Copyright © 2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020  Google, Inc.
 Copyright © 2018,2019,2020  Ebrahim Byagowi
-Copyright © 2019,2020  Facebook, Inc. 
+Copyright © 2019,2020  Facebook, Inc.
 Copyright © 2012  Mozilla Foundation
 Copyright © 2011  Codethink Limited
 Copyright © 2008,2010  Nokia Corporation and/or its subsidiary(-ies)
 Copyright © 2009  Keith Stribley
 Copyright © 2009  Martin Hosken and SIL International
 Copyright © 2007  Chris Wilson
-Copyright © 2006  Behdad Esfahbod
+Copyright © 2005,2006,2020,2021  Behdad Esfahbod
 Copyright © 2005  David Turner
 Copyright © 2004,2007,2008,2009,2010  Red Hat, Inc.
 Copyright © 1998-2004  David Turner and Werner Lemberg
index 2817d07..efc2473 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
+commit 0a129961341da370ec82bfccdd11ec9b1094b5a2
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Sun Feb 13 00:30:50 2022 +0200
+
+    3.4.0
+
+ NEWS                   | 26 ++++++++++++++++++++++++++
+ configure.ac           |  2 +-
+ docs/harfbuzz-docs.xml |  1 +
+ meson.build            |  2 +-
+ src/hb-buffer.h        |  4 ++--
+ src/hb-common.h        |  4 ++--
+ src/hb-ot-deprecated.h |  2 +-
+ src/hb-ot-math.cc      |  2 +-
+ src/hb-ot-math.h       |  4 ++--
+ src/hb-version.h       |  6 +++---
+ 10 files changed, 40 insertions(+), 13 deletions(-)
+
+commit 41815a0d63512e11b2ff23f27e6906c44c0e9691
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Sun Feb 13 00:00:01 2022 +0200
+
+    [name] Extraneous (out) annotation in return value
+
+ src/hb-ot-name.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b263371b0959a2021e68b210d6b73e27c6fe64b0
+Merge: b3f8288cc b47b3b997
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 12 15:06:47 2022 -0600
+
+    Merge pull request #3398 from harfbuzz/buffer-verify
+    
+    Add HB_BUFFER_FLAG_VERIFY
+
+commit b3f8288cca1951310928e3ba919c32b0c968249a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 12 14:52:42 2022 -0600
+
+    [test/subset] Don't hash files without reason
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/3118#issuecomment-894021518
+
+ test/subset/run-tests.py | 7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
+
+commit 42b119edb5966793a51cdd9e7898fc90bd5036aa
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 12 14:18:02 2022 -0600
+
+    [hmtx] Remove other subset-specific method from hmtx accelerator
+
+ src/hb-ot-hmtx-table.hh | 28 +++++++++++++---------------
+ 1 file changed, 13 insertions(+), 15 deletions(-)
+
+commit 9ba520b5d1594f972c73eeb76d61d67255c07597
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 12 13:57:03 2022 -0600
+
+    [hmtx] Remove one subset-specific method from hmtx accelerator
+    
+    Looks ugly but is the right thing to do.
+
+ src/hb-ot-hmtx-table.hh | 18 +++---------------
+ 1 file changed, 3 insertions(+), 15 deletions(-)
+
+commit af407dd24d3f55ad279dfdbf21ec7c7c3cfb76ac
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 12 13:53:16 2022 -0600
+
+    Add a fuzzer font
+
+ .../fonts/crash-d223bc42a8226c4d655c417d63d9a76760d05985  | Bin 0 -> 316 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit 68937238791181b6172ea4cd3d127ff4f6bbdd98
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 11 13:16:25 2022 -0600
+
+    [machinery] Allow using lazy-loader with void*
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/3427
+
+ src/Makefile.am       | 29 +++++++++++++++++------------
+ src/hb-common.cc      |  2 +-
+ src/hb-machinery.hh   |  3 ++-
+ src/meson.build       |  5 +++--
+ src/test-machinery.cc | 46 ++++++++++++++++++++++++++++++++++++++++++++++
+ 5 files changed, 69 insertions(+), 16 deletions(-)
+
+commit 3d22dae5f854416939935f7cd913af7c21b4f490
+Author: Chun-wei Fan <fanchunwei@src.gnome.org>
+Date:   Thu Feb 10 16:30:36 2022 +0800
+
+    meson.build: Only use get_variable() on icu_dep with pkgconfig
+    
+    We might have found ICU via the .lib names, and get_variable() is only
+    available for pkg-config deps.
+
+ meson.build | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 52c536bb8d90cf0f09e13f5e9e21bf489cc08c23
+Author: Chun-wei Fan <fanchunwei@src.gnome.org>
+Date:   Thu Feb 10 16:39:40 2022 +0800
+
+    hb-algs.hh: Fix build on Visual Studio 2015
+    
+    The compiler does not recognize the std::hash call on
+    hb_decay<decltype (hb_deref (v)>, so give it a shove so that it is recognized
+    there.
+
+ src/hb-algs.hh | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit 81754a5a962ebefef848237ee218c019f85ef316
+Author: Alexis King <lexi.lambda@gmail.com>
+Date:   Wed Feb 9 12:00:47 2022 -0600
+
+    [ot-math] Add hb_ot_math_get_glyph_kernings
+    
+    closes #3396
+
+ docs/harfbuzz-sections.txt |  2 ++
+ src/hb-ot-math-table.hh    | 78 +++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-math.cc          | 45 +++++++++++++++++++++++++
+ src/hb-ot-math.h           | 22 +++++++++++++
+ test/api/test-ot-face.c    |  1 +
+ test/api/test-ot-math.c    | 82 ++++++++++++++++++++++++++++++++++++++++++++++
+ 6 files changed, 230 insertions(+)
+
+commit 1bc4bad7a59e9d4d79d8faeb9e695df19aa494da
+Author: Alexis King <lexi.lambda@gmail.com>
+Date:   Mon Feb 7 19:57:25 2022 -0600
+
+    [ot-tag] Add HB_SCRIPT_MATH (Zmth) and map it to OT ‘math’ tag
+    
+    The ISO 15924 code for mathematical notation is ‘Zmth’, but the
+    OpenType script is ‘math’.
+
+ docs/harfbuzz-sections.txt |  3 ++-
+ src/hb-common.h            |  6 ++++++
+ src/hb-ot-deprecated.h     | 15 +++++++++++++++
+ src/hb-ot-math.h           | 14 +++++++++-----
+ src/hb-ot-tag.cc           |  3 +++
+ test/api/test-ot-tag.c     |  2 ++
+ 6 files changed, 37 insertions(+), 6 deletions(-)
+
+commit 76cd8a47373e924d146e641f377065d3929b8e51
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Tue Feb 8 16:47:01 2022 +0200
+
+    [arabic] Update to AMTRA revision 6
+    
+    https://www.unicode.org/reports/tr53/tr53-6.html#Modifications
+
+ src/hb-ot-shape-complex-arabic.cc | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit c4cf5ddb272cb1c05a572db5b76629368f9054f5
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Sun Feb 6 16:32:05 2022 +0200
+
+    [ci] Downgrade pip on MSVC jobs
+    
+    Turns out, pip 22.0 is the source of the breakage:
+    https://github.com/mesonbuild/meson/issues/9955#issuecomment-1030843844
+    https://github.com/pypa/pip/issues/10875
+
+ .github/workflows/msvc-ci.yml | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit ac46c3248e8b0316235943175c4d4a11c24dd4a9
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Sun Feb 6 15:41:18 2022 +0200
+
+    3.3.2
+
+ NEWS             | 7 +++++++
+ configure.ac     | 2 +-
+ meson.build      | 2 +-
+ src/hb-version.h | 4 ++--
+ 4 files changed, 11 insertions(+), 4 deletions(-)
+
+commit 7657bdd91f93fb087c74b400e5864641317f91f5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 4 19:16:54 2022 -0600
+
+    Revert "Fix failing Mac test for previous commit"
+    
+    This reverts commit 070e30e6daba74fe62ea486dc97cd01a79f90541.
+
+ test/shape/data/in-house/tests/macos.tests | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 44da4e2a2751058bde1b2c465a1d2f3c5d617d93
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 4 19:16:47 2022 -0600
+
+    Revert "One more fix"
+    
+    This reverts commit cab943a015b1a3d4cd72f0c5dc4ff79e0aefa06f.
+
+ test/shape/data/in-house/tests/macos.tests | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 88798ee8bedcf464e4853fec67cf3648a3f39973
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 4 18:59:50 2022 -0600
+
+    [GPOS] Disable split-kerning
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/3408
+    Reverts https://github.com/harfbuzz/harfbuzz/pull/3235
+    Fixes https://github.com/harfbuzz/harfbuzz/pull/3235#issuecomment-1029814978
+
+ src/hb-ot-layout-gpos-table.hh                            | 10 +++++++++-
+ test/shape/data/aots/tests/gpos2_2.tests                  |  2 +-
+ test/shape/data/in-house/tests/positioning-features.tests |  2 +-
+ 3 files changed, 11 insertions(+), 3 deletions(-)
+
+commit 9177953720e2d10e8db47c079563d8656d6f5553
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 4 12:38:45 2022 -0600
+
+    [atexit] Allow hb_atexit redefinition
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/3412
+
+ src/hb.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 8670ffbf4ca809b954d69c52c27ab958c7d143ee
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 3 11:19:23 2022 -0600
+
+    [buffer] Comment
+
+ src/hb-buffer.hh | 37 ++++++++++++++++++++-----------------
+ 1 file changed, 20 insertions(+), 17 deletions(-)
+
+commit e59da2871a83f1f68ff1d3228e4fa419d8a9e1d6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 1 16:32:39 2022 -0600
+
+    [glyf] Don't store face in accelerator
+
+ src/hb-ot-glyf-table.hh | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit 0fb8e22406fb9253da3da0d9f6d7fedc861fe148
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Jan 28 10:39:51 2022 -0800
+
+    [serialize] document how the serializer works.
+
+ docs/serializer.md | 178 +++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 178 insertions(+)
+
+commit 45df259538c204540819d74456d30ffb40df488a
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Mon Jan 31 23:06:10 2022 +0200
+
+    3.3.1
+
+ NEWS             | 23 +++++++++++++++--------
+ configure.ac     |  2 +-
+ meson.build      |  2 +-
+ src/hb-version.h |  4 ++--
+ 4 files changed, 19 insertions(+), 12 deletions(-)
+
+commit 4e2f409bce77b97de2d098365977beeeb4447b1e
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Jan 31 12:20:32 2022 -0800
+
+    [subset] Don't hold references to members of the active_glyph_stack.
+    
+    These references may get invalidated after the vector for the stack is resized. Fixes: https://oss-fuzz.com/testcase-detail/5422577634377728
+
+ src/hb-ot-layout-gsubgpos.hh                       |  54 +++++++++++++--------
+ ...ase-minimized-hb-subset-fuzzer-5422577634377728 | Bin 0 -> 1700 bytes
+ 2 files changed, 34 insertions(+), 20 deletions(-)
+
+commit 98da3306384044c6c73904d9a2a5996da16504ea
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Mon Jan 31 18:12:01 2022 +0200
+
+    3.3.0
+
+ NEWS                   | 32 +++++++++++++++++++++++++++++++-
+ configure.ac           |  2 +-
+ docs/harfbuzz-docs.xml |  1 +
+ meson.build            |  2 +-
+ src/hb-buffer.cc       | 11 +++++------
+ src/hb-buffer.h        |  2 +-
+ src/hb-font.cc         | 19 ++++++++++++-------
+ src/hb-version.h       |  4 ++--
+ 8 files changed, 54 insertions(+), 19 deletions(-)
+
+commit 3e8742e37631e0570e6e635c02302e3df2b548a0
+Merge: bc899650c ae9afd977
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 30 17:19:46 2022 -0800
+
+    Merge pull request #3402 from harfbuzz/language-tags
+    
+    Make miscellaneous changes to hb-ot-tag-table.hh
+
+commit ae9afd9772e909476d28fb647d7f7aef6865f6cd
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Sun Oct 3 20:09:33 2021 -0400
+
+    Let BCP 47 tag "mo" fall back to OT tag 'ROM '
+
+ src/gen-tag-table.py   |  5 ++++-
+ src/hb-ot-tag-table.hh | 13 +++++++++++--
+ 2 files changed, 15 insertions(+), 3 deletions(-)
+
+commit a184c5f8518ab92b95947f23848ddde677e8cac1
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Sun Jan 30 13:28:23 2022 -0500
+
+    Don’t always inherit from macrolanguages
+    
+    If an OpenType tag maps to a BCP 47 macrolanguage, that is presumably to
+    support the use of the macrolanguage as a vague stand-in for one of its
+    individual languages. For example, "ar" and "zh" are often used for
+    "arb" and "cmn". When the OpenType tag maps to a macrolanguage and some
+    but not all of its individual languages, that indicates that the
+    OpenType tag only corresponds to the listed individual languages (which
+    may be referred to using the macrolanguage subtag) but not the missing
+    individual languages. In particular, INUK (Nunavik Inuktitut) is mapped
+    to "ike" (Eastern Canadian Inuktitut) and "iu" (Inuktitut) but not to
+    "ikt" (Inuinnaqtun), so "ikt" should not inherit the INUK mapping from
+    its macrolanguage "iu".
+
+ src/gen-tag-table.py   | 35 +++++++++++++++++++++++++++++++----
+ src/hb-ot-tag-table.hh | 12 ++----------
+ 2 files changed, 33 insertions(+), 14 deletions(-)
+
+commit b47b3b99725888fd27273d8d9b9ee3d5d6cf0400
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 29 10:24:38 2022 -0700
+
+    [fallback-kern] Move buffer message to correct position
+
+ src/hb-ot-shape-fallback.cc | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit e986c12075a69300a5e114fe139ae5acd762ef1b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 29 09:08:48 2022 -0700
+
+    [verify] Show buffer input text when verification fails
+
+ src/hb-buffer-verify.cc | 50 ++++++++++++++++++++++++++++++++++++++++---------
+ 1 file changed, 41 insertions(+), 9 deletions(-)
+
+commit d35f380126830872611c85d664c3710deb46cd6b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 29 09:08:20 2022 -0700
+
+    [util] Change "All shapers failed." message to "Shaping failed."
+    
+    Since we now emit this when verification fails as well.
+
+ util/shape-options.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 3972e0a8f1504783a509096e069ca718d25af8d9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 29 08:22:19 2022 -0700
+
+    [buffer] Whitespace
+
+ src/hb-buffer.h | 38 +++++++++++++++++++-------------------
+ 1 file changed, 19 insertions(+), 19 deletions(-)
+
+commit 0b1bf89cc2ee6a8782c007e2b7362a4485be249a
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Fri Jan 28 22:27:51 2022 -0500
+
+    Replace “[family]” with “[collection]”
+    
+    Not all language collections are language families.
+
+ src/gen-tag-table.py   |  4 ++--
+ src/hb-ot-tag-table.hh | 58 +++++++++++++++++++++++++-------------------------
+ 2 files changed, 31 insertions(+), 31 deletions(-)
+
+commit 0e31595e0d2e214262c4cf0d4136215bc4c89a0a
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Fri Jan 28 22:26:38 2022 -0500
+
+    Infer tag mappings for unregistered macrolanguages
+    
+    Every macrolanguage not mentioned in the OT language system tag registry
+    is mapped to every tag of its individual languages, if those have
+    registered tags.
+
+ src/gen-tag-table.py   | 34 +++++++++++++++++++---------------
+ src/hb-ot-tag-table.hh |  9 +++++++++
+ 2 files changed, 28 insertions(+), 15 deletions(-)
+
+commit 5a6545940ac0ed48bc8872424269e598388b7996
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Fri Jan 28 21:29:43 2022 -0500
+
+    Add the language system tag INUK
+
+ src/hb-ot-tag-table.hh | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+commit bc899650c7976df7bc62ed55da5268f1d10b9a43
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Jan 28 13:54:10 2022 -0800
+
+    [subset] Fix for issue #3397.
+    
+    cur_intersected_glyphs gets modified during recursion leading to incorrect filtering of sub tables in some cases. So don't use cur_intersected_glyphs. Instead just add an additional entry onto the parent_active_glyphs () stack.
+    
+    Additionaly expands NotoNastaliqUrdu tests to include coverage of the issue from #3397.
+
+ src/hb-ot-layout-gsubgpos.hh                       |  59 +++++++++++++--------
+ src/hb-ot-layout.cc                                |   6 +--
+ .../NotoNastaliqUrdu-Bold.default.633,6D2.ttf      | Bin 0 -> 14048 bytes
+ .../NotoNastaliqUrdu-Bold.retain-gids.633,6D2.ttf  | Bin 0 -> 19948 bytes
+ ...ular.default.627,644,623,62D,644,627,645,2E.ttf | Bin 0 -> 17564 bytes
+ ...astaliqUrdu-Regular.default.627,644,62D,628.ttf | Bin 0 -> 24564 bytes
+ .../NotoNastaliqUrdu-Regular.default.627,644.ttf   | Bin 0 -> 7776 bytes
+ ...-Regular.default.633,645,627,621,20,644,627.ttf | Bin 0 -> 23232 bytes
+ .../NotoNastaliqUrdu-Regular.default.633,6D2.ttf   | Bin 0 -> 14296 bytes
+ ...otoNastaliqUrdu-Regular.default.63A,64A,631.ttf | Bin 0 -> 26152 bytes
+ ...iqUrdu-Regular.default.retain-all-codepoint.ttf | Bin 0 -> 542388 bytes
+ ....retain-gids.627,644,623,62D,644,627,645,2E.ttf | Bin 0 -> 24224 bytes
+ ...liqUrdu-Regular.retain-gids.627,644,62D,628.ttf | Bin 0 -> 30464 bytes
+ ...otoNastaliqUrdu-Regular.retain-gids.627,644.ttf | Bin 0 -> 13380 bytes
+ ...ular.retain-gids.633,645,627,621,20,644,627.ttf | Bin 0 -> 28888 bytes
+ ...otoNastaliqUrdu-Regular.retain-gids.633,6D2.ttf | Bin 0 -> 20140 bytes
+ ...astaliqUrdu-Regular.retain-gids.63A,64A,631.ttf | Bin 0 -> 32012 bytes
+ ...du-Regular.retain-gids.retain-all-codepoint.ttf | Bin 0 -> 542424 bytes
+ .../subset/data/fonts/NotoNastaliqUrdu-Regular.ttf | Bin 570552 -> 1060612 bytes
+ .../data/tests/layout.notonastaliqurdu.tests       |   2 +
+ 20 files changed, 40 insertions(+), 27 deletions(-)
+
+commit f3c1f4f0dae03bfd4521b3b8965891d45c49d02f
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Jan 28 11:50:22 2022 -0800
+
+    [subset] convert active_glyphs_stack to be a vector of hb_set_t instead of hb_set_t*.
+
+ src/hb-ot-layout-gsubgpos.hh | 63 ++++++++++++++++++++++----------------------
+ 1 file changed, 32 insertions(+), 31 deletions(-)
+
+commit 476a6377a574291025ce8acc0cecfc53408c8d3c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 28 15:05:10 2022 -0700
+
+    [buffer] Document HB_BUFFER_FLAG_VERIFY
+
+ src/hb-buffer.h | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit 61856359cb90f4d53eced1159b0810defa342ec6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 28 14:07:29 2022 -0700
+
+    [fuzz] Disable verification for now.
+
+ test/fuzzing/hb-shape-fuzzer.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 6596e42d160a0ae2cd2cd3b42a9f8823197cd716
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 28 13:55:24 2022 -0700
+
+    [fuzz] Verify shape results
+
+ test/fuzzing/hb-shape-fuzzer.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 5b1d813b698488fb86b4f20a596bb1c046e61eed
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 28 13:49:21 2022 -0700
+
+    [config] Enable HB_NO_BUFFER_VERIFY in HB_LEAN
+
+ src/hb-config.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 61823838f9c3cdc93b2452451126dddcacfbe61d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 28 13:45:25 2022 -0700
+
+    [buffer] Add HB_BUFFER_FLAG_VERIFY
+    
+    Move buffer verification code inside the library, from util/.
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/3010
+
+ src/Makefile.sources    |   1 +
+ src/harfbuzz.cc         |   1 +
+ src/hb-buffer-verify.cc | 389 ++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-buffer.h         |   3 +-
+ src/hb-buffer.hh        |  14 ++
+ src/hb-shape.cc         |  18 +++
+ src/meson.build         |   1 +
+ util/shape-options.hh   | 344 +-----------------------------------------
+ 8 files changed, 427 insertions(+), 344 deletions(-)
+
+commit 7c704d898210cd88f6fbf1096b9a75123d33cccd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 28 12:38:32 2022 -0700
+
+    [buffer] Make hb_buffer_append() take a const argument
+
+ src/hb-buffer.cc | 2 +-
+ src/hb-buffer.h  | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 24650624c812368e3900e276aaca2dc94b737af8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 28 13:53:21 2022 -0700
+
+    [font] Fix build with no-var configs
+
+ src/hb-font.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 91b779e23cbaea5d9e3176f3a2c05b8ec10c89fb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 28 13:52:15 2022 -0700
+
+    Avoid redefinition of HB_NO_SETLOCALE in certain configs
+
+ src/hb-common.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit fa29006bfa3d5f84182b3a1c259ef4a3634da6b7
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Thu Jan 27 01:57:45 2022 +0200
+
+    [doc] Fix generation of hb_glyph_flags_t docs
+    
+    GTK-Doc does not like the empty lines here, and interprets everything
+    after the first empty line as the description of the enum itself not a
+    specific member and the generated text makes no sense.
+    
+    Removing the empty lines makes the text harder to read (both in source
+    and HTML), but at least it is correctly organized.
+
+ src/hb-buffer.h | 11 -----------
+ 1 file changed, 11 deletions(-)
+
+commit e9cc5f6cdb3e29f2e33e0f8a08cf821ebd654a8d
+Merge: bad5c9456 540af548d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 26 12:23:29 2022 -0800
+
+    Merge pull request #3297 from harfbuzz/unsafe-to-concat
+    
+    Implement UNSAFE_TO_CONCAT flag
+
+commit 540af548dc3926c4b9db059c9b20297df0802671
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 25 09:10:56 2022 -0700
+
+    [unsafe-to-concat] Clarify documentation as per feedback
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/pull/3297#discussion_r754395825
+
+ src/hb-buffer.h | 18 +++++++++++++++---
+ 1 file changed, 15 insertions(+), 3 deletions(-)
+
+commit bad5c94562fa07c4c10f8b3663ca29cc5210c13c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 23 10:53:19 2022 -0700
+
+    [test] Remove HB_UNUSED
+
+ src/test-serialize.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6c09a8b5b0cc3ecef19f1c5a031481d831374b5d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 23 10:52:13 2022 -0700
+
+    [test-serialize] Assert len
+
+ src/test-serialize.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 76c6f4164f133e056bd75378a4a2e912d153550e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 23 10:43:37 2022 -0700
+
+    [test] Add test-serialize
+
+ src/Makefile.am       |  5 +++++
+ src/meson.build       |  1 +
+ src/test-serialize.cc | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 57 insertions(+)
+
+commit 332460649268844bf93e147cc0b86a82c449a980
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 22 15:46:13 2022 -0700
+
+    [buffer] Oops
+
+ src/hb-buffer.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 20031ddbb814d46f8c988242d2ee0bd9b198dbe2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 22 11:41:30 2022 -0700
+
+    [unsafe-to-concat] Mark in all other shapers
+    
+    unsafe_to_break() implies unsafe-to-concat; but setting the flag
+    manually wasn't.
+
+ src/hb-coretext.cc    | 3 ++-
+ src/hb-directwrite.cc | 3 ++-
+ src/hb-graphite2.cc   | 3 ++-
+ src/hb-uniscribe.cc   | 3 ++-
+ 4 files changed, 8 insertions(+), 4 deletions(-)
+
+commit 6e345f709d4888ab10ed22afffb6661d695e052f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 22 11:40:37 2022 -0700
+
+    Cosmetic
+
+ src/hb-buffer.hh | 16 ++++++++--------
+ src/hb-kern.hh   |  2 +-
+ 2 files changed, 9 insertions(+), 9 deletions(-)
+
+commit 374a6f186d7094370ffd6aed80688203c8f5a067
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 22 11:29:00 2022 -0700
+
+    [fallback-shape] Add buffer trace log
+
+ src/hb-kern.hh              |  5 +++++
+ src/hb-ot-shape-fallback.cc | 10 ++++++++++
+ 2 files changed, 15 insertions(+)
+
+commit bcdfedbc09c308965239c4b7a750a9cc20618542
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 22 11:19:05 2022 -0700
+
+    [unsafe-to-concat] Mark as unsafe in kern machine
+    
+    Fixes that last test. Yay!
+
+ src/hb-aat-layout-kerx-table.hh | 1 -
+ src/hb-kern.hh                  | 2 +-
+ 2 files changed, 1 insertion(+), 2 deletions(-)
+
+commit 14d43d12359ba14e4bb95c24903be70808f66738
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 22 10:46:18 2022 -0700
+
+    [unsafe-to-concat] Adjust end conditions
+
+ src/hb-buffer.hh | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 8663eda4fde11d360cca15936e9d2ae07c357958
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 22 10:35:05 2022 -0700
+
+    [unsafe-to-concat] More annotations for MarkMarkPos
+    
+    Failures down to one:
+    
+    265/401 harfbuzz:shaping+aots / lookupflag_ignore_attach         FAIL
+
+ src/hb-ot-layout-gpos-table.hh | 13 +++++++++++--
+ 1 file changed, 11 insertions(+), 2 deletions(-)
+
+commit 6a7d6d4b64dd0eff7d0e7191ad30268a2502db5f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 22 10:33:35 2022 -0700
+
+    [unsafe-to-concat] More annotations for MarkLigaturePos
+
+ src/hb-ot-layout-gpos-table.hh | 12 ++++++++++--
+ 1 file changed, 10 insertions(+), 2 deletions(-)
+
+commit a575992057bcfab2ee3a720ad321c907cf20ff22
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 22 10:30:39 2022 -0700
+
+    [unsafe-to-concat] Mark LigatureSubst
+    
+    Failures down to two:
+    
+    209/401 harfbuzz:shaping+aots / gpos6                            FAIL             0.06s   exit status 1
+    265/401 harfbuzz:shaping+aots / lookupflag_ignore_attach         FAIL             0.06s   exit status 1
+
+ src/hb-ot-layout-gsub-table.hh | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit b443898cce2251ca2aaf332c13886577ab8db416
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 22 10:24:59 2022 -0700
+
+    [unsafe-to-concat] Adjust MarkBasePos
+    
+    A couple more aots tests down. Four failing:
+    
+    209/401 harfbuzz:shaping+aots / gpos6                            FAIL             0.06s   exit status 1
+    261/401 harfbuzz:shaping+aots / gsub4_1_multiple_ligatures       FAIL             0.07s   exit status 1
+    265/401 harfbuzz:shaping+aots / lookupflag_ignore_attach         FAIL             0.07s   exit status 1
+    267/401 harfbuzz:shaping+aots / lookupflag_ignore_combination    FAIL             0.07s   exit status 1
+
+ src/hb-ot-layout-gpos-table.hh | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit 95d052a791262ebccbfeb794b992525ba2cc0ffc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 22 10:16:23 2022 -0700
+
+    [unsafe-to-concat] Adjust GPOS lookbacks
+    
+    Fixes Cursive aots test, fails a couple new aots ones.
+
+ src/hb-ot-layout-gpos-table.hh | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit 909e34f68a969275bc9b14c63e03d5d131823d91
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 22 09:44:13 2022 -0700
+
+    [unsafe-to-concat] Adjust Arabic-joining start boundary condition more
+
+ src/hb-ot-shape-complex-arabic.cc                        |  14 ++++++++++++--
+ test/shape/data/in-house/Makefile.sources                |   1 +
+ .../fonts/34da9aab7bee86c4dfc3b85e423435822fdf4b62.ttf   | Bin 0 -> 1904 bytes
+ test/shape/data/in-house/meson.build                     |   1 +
+ test/shape/data/in-house/tests/unsafe-to-concat.tests    |   1 +
+ 5 files changed, 15 insertions(+), 2 deletions(-)
+
+commit 11bdd7a020d3e99c0ff43f34cf1724a95713b463
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 21 18:59:06 2022 -0700
+
+    [unsafe-to-concat] Adjust CursivePos
+    
+    Doesn't fix the test yet.
+
+ src/hb-ot-layout-gpos-table.hh | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit ea1b32c8c198da4475941f459b16dc6d7e28148a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 21 18:58:33 2022 -0700
+
+    [unsafe-to-concat] Adjust "interior"ness of "from_out_buffer"
+
+ src/hb-buffer.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 4f04baef17bf5b150c1594f6e80604974e6e95e4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 21 18:26:54 2022 -0700
+
+    [unsafe-to-concat] Further adjust Arabic joining logic at boundary
+
+ src/hb-ot-shape-complex-arabic.cc | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+commit 235c3a129581e96701fe055341e56699766df5fa
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 21 15:17:40 2022 -0700
+
+    [unsafe-to-concat] Adjust Arabic joining logic
+    
+    Test failures done one more. Fixed the mongolian-variation-selector
+    test.  Another test case:
+    
+    $ util/hb-shape NotoSansArabic-Regular.ttf -u 628,200c,628 --show-flags --verify
+
+ src/hb-ot-shape-complex-arabic.cc | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 48c5f26199808f40251cdaef7494456e9f23acb9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 21 12:18:50 2022 -0700
+
+    [unsafe-to-concat] Fix PairPos2 logic
+    
+    Test failures down from 8 to 6:
+    
+    113/400 harfbuzz:shaping+in-house / mongolian-variation-selector FAIL             0.06s   exit status 1
+    203/400 harfbuzz:shaping+aots / gpos3                            FAIL             0.06s   exit status 1
+    204/400 harfbuzz:shaping+aots / gpos4_lookupflag                 FAIL             0.06s   exit status 1
+    260/400 harfbuzz:shaping+aots / gsub4_1_multiple_ligatures       FAIL             0.06s   exit status 1
+    264/400 harfbuzz:shaping+aots / lookupflag_ignore_attach         FAIL             0.06s   exit status 1
+    266/400 harfbuzz:shaping+aots / lookupflag_ignore_combination    FAIL             0.06s   exit status 1
+
+ src/hb-ot-layout-gpos-table.hh | 10 +++++++---
+ 1 file changed, 7 insertions(+), 3 deletions(-)
+
+commit c0058892bec52e4f0346b1139ebb206c03e094e2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 20 15:51:04 2022 -0700
+
+    [unsafe-to-concat] Mark entire buffer unsafe-to-concat if kerx format2
+
+ src/hb-aat-layout-kerx-table.hh |  1 +
+ src/hb-buffer.hh                | 21 ++++++++++++++-------
+ 2 files changed, 15 insertions(+), 7 deletions(-)
+
+commit 60006d368770982c6a0d3bf06eb937773343cf5b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 20 15:29:28 2022 -0700
+
+    [gsubgpos] Adjust chaining unsafe-to-concat application
+    
+    Fixes three tests.
+
+ src/hb-ot-layout-gsubgpos.hh | 46 ++++++++++++++++++++++++--------------------
+ 1 file changed, 25 insertions(+), 21 deletions(-)
+
+commit d98a0fc88e8bcf7993c92425212cd6c57a632a01
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Dec 4 20:43:27 2021 -0800
+
+    [buffer] Consolidate glyph-flags implementation
+
+ src/hb-buffer.cc | 25 -------------------
+ src/hb-buffer.hh | 76 +++++++++++++++++++++++++++++++++++++++++++++-----------
+ 2 files changed, 62 insertions(+), 39 deletions(-)
+
+commit f91ce56e08ed9acdfaf5dfe994d950195dd10881
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Dec 4 20:07:05 2021 -0800
+
+    [buffer] Add default cluster value in find_min_cluster
+
+ src/hb-buffer.cc | 6 ++----
+ src/hb-buffer.hh | 2 +-
+ 2 files changed, 3 insertions(+), 5 deletions(-)
+
+commit 56d081955c768a4ed55354fe57577cb10706fb81
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Dec 4 19:59:55 2021 -0800
+
+    [buffer] Rename _unsafe_to_break_set_mask to _infos_set_glyph_flags
+
+ src/hb-buffer.cc |  6 +++---
+ src/hb-buffer.hh | 27 +++++++++++++--------------
+ 2 files changed, 16 insertions(+), 17 deletions(-)
+
+commit 78481b32c0a14f0ee1c4baec4d5208b385be0b2e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Nov 21 16:50:34 2021 -0700
+
+    [gsubgpos] Combine input/backtrack/lookahead unsafe-to-concat
+    
+    I feel like this is correct logic. Still have to prove.
+    
+    Errors unchanged at 10.
+
+ src/hb-ot-layout-gpos-table.hh |  2 +-
+ src/hb-ot-layout-gsub-table.hh | 15 ++++---
+ src/hb-ot-layout-gsubgpos.hh   | 93 +++++++++++++++++++++++-------------------
+ 3 files changed, 62 insertions(+), 48 deletions(-)
+
+commit 596bc7e939d927b4b211cdd847fbb1208789b999
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 20 12:02:47 2021 -0700
+
+    [unsafe-to-concat] Add to GPOS kerning
+
+ src/hb-ot-layout-gpos-table.hh | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit e1cbd4539f392034899353f55daffa32e6d62c87
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 20 11:46:48 2021 -0700
+
+    [unsafe-to-concat] Add annotations to GPOS and kern
+    
+    Failures from 13 to 14.
+
+ src/hb-kern.hh                 |  4 +++-
+ src/hb-ot-layout-gpos-table.hh | 43 ++++++++++++++++++++++++++++++++++++------
+ 2 files changed, 40 insertions(+), 7 deletions(-)
+
+commit 36b1561715737ff6608bf2eb6c21b64348abb226
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 19 14:10:34 2021 -0700
+
+    Implement hb-shape --verify unsafe-to-concat flag
+    
+    15 tests failing. Those look like legit places that unsafe-to-concat
+    needs more implementation.
+
+ util/shape-options.hh | 198 +++++++++++++++++++++++++++++++++++++++++++++++---
+ 1 file changed, 189 insertions(+), 9 deletions(-)
+
+commit 3122c2cdc45a964efedad8953a2df67205c3e3a8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Dec 4 19:50:33 2021 -0800
+
+    [buffer] Add HB_GLYPH_FLAG_UNSAFE_TO_CONCAT
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1463
+
+ src/hb-buffer.cc             | 10 +++---
+ src/hb-buffer.h              | 76 ++++++++++++++++++++++++++++++++++++--------
+ src/hb-buffer.hh             | 33 +++++++++++--------
+ src/hb-ot-layout-gsubgpos.hh | 39 ++++++++++++++++++++---
+ src/hb-ot-shape.cc           |  8 ++---
+ 5 files changed, 124 insertions(+), 42 deletions(-)
+
+commit a8b7f1880412c7f0c9ecdada0a4935011816c7dc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 21 07:38:33 2022 -0700
+
+    [cff] Initialize accelerator members
+
+ src/hb-ot-cff1-table.hh | 24 ++++++++++++------------
+ src/hb-ot-cff2-table.hh | 16 ++++++++--------
+ 2 files changed, 20 insertions(+), 20 deletions(-)
+
+commit cce37a6f10e0c7b06b5ead1223e92c85d88242c0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 21 07:31:21 2022 -0700
+
+    [gpos] Fix conditional
+
+ src/hb-ot-layout-gpos-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 773cf4fdd30cf9d4b8a7139ce2992156dc86bc00
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 21 07:30:09 2022 -0700
+
+    [post] Initialize variables
+
+ src/hb-ot-post-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit cab943a015b1a3d4cd72f0c5dc4ff79e0aefa06f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 20 14:32:30 2022 -0700
+
+    One more fix
+
+ test/shape/data/in-house/tests/macos.tests | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 070e30e6daba74fe62ea486dc97cd01a79f90541
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 20 14:31:31 2022 -0700
+
+    Fix failing Mac test for previous commit
+
+ test/shape/data/in-house/tests/macos.tests | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 84aa1a836c1440e862f58f0d5a23363825b5ac66
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 20 13:18:19 2022 -0800
+
+    [PairPos] Split GPOS kerning to both sides (#3235)
+
+ src/hb-ot-layout-gpos-table.hh                     | 66 +++++++++++++++++++++-
+ test/shape/data/aots/Makefile.sources              |  3 -
+ test/shape/data/aots/tests/gpos2_2.tests           |  2 +-
+ .../data/in-house/tests/positioning-features.tests |  2 +-
+ 4 files changed, 66 insertions(+), 7 deletions(-)
+
+commit ae9fc7f53335a42fe109ced01238fdaf2fc49b90
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 20 12:37:21 2022 -0700
+
+    Clean accelerators a bit more
+
+ src/hb-ot-color-colr-table.hh  | 12 ++++++------
+ src/hb-ot-layout-gdef-table.hh | 10 +++++-----
+ src/hb-ot-name-table.hh        |  2 --
+ src/hb-ot-post-table.hh        |  3 ---
+ src/hb-subset-plan.cc          |  4 +---
+ 5 files changed, 12 insertions(+), 19 deletions(-)
+
+commit 0ae66593987c54e2d8a03b2c2c49c76d0ba1a4bb
+Merge: 112cb9fe6 ac1bb3e39
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 20 11:28:59 2022 -0800
+
+    Merge pull request #3392 from harfbuzz/auto-accelerators
+    
+    Auto accelerators
+
+commit ac1bb3e39e4c0be675bd0f8a230bc75b57d22e98
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 20 11:47:17 2022 -0700
+
+    [machinery] Move accelerators to constructor/destructor
+
+ src/hb-machinery.hh              |  6 +++---
+ src/hb-ot-cff1-table.hh          | 10 ++++++----
+ src/hb-ot-cff2-table.hh          | 43 +++++++++++++++++++++++++---------------
+ src/hb-ot-cmap-table.hh          | 17 ++++++++--------
+ src/hb-ot-color-cbdt-table.hh    | 14 +++++++------
+ src/hb-ot-color-sbix-table.hh    |  9 ++++++---
+ src/hb-ot-color-svg-table.hh     |  8 +++++---
+ src/hb-ot-glyf-table.hh          | 15 +++++++-------
+ src/hb-ot-hmtx-table.hh          | 20 +++++++++----------
+ src/hb-ot-layout-gdef-table.hh   |  9 +++++----
+ src/hb-ot-layout-gpos-table.hh   |  4 +++-
+ src/hb-ot-layout-gsub-table.hh   |  4 +++-
+ src/hb-ot-layout-gsubgpos.hh     |  5 ++---
+ src/hb-ot-meta-table.hh          |  8 +++++---
+ src/hb-ot-name-table.hh          |  9 +++++----
+ src/hb-ot-post-table-v2subset.hh |  7 ++-----
+ src/hb-ot-post-table.hh          | 10 +++++++---
+ src/hb-ot-var-gvar-table.hh      |  8 +++++---
+ src/hb-subset-cff2.cc            |  8 ++------
+ src/hb-subset-plan.cc            | 22 ++++----------------
+ 20 files changed, 123 insertions(+), 113 deletions(-)
+
+commit 112cb9fe6927600018c61cd92577e01dbd8ed601
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Jan 19 15:31:35 2022 -0800
+
+    [repacker] Fix missing initilization of obj in vertex_t.
+
+ src/hb-repacker.hh | 23 +++++------------------
+ 1 file changed, 5 insertions(+), 18 deletions(-)
+
+commit e062376ef1ce0e8e303eefd3bf449c20ba1f3607
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 19 17:09:34 2022 -0700
+
+    [machinery] Make accelerator lazy-loader call Xinit/Xfini
+    
+    Instead of init/fini. To isolate those functions. To be turned into
+    constructor/destructors, ideally one per commit (after some SFINAE
+    foo.)
+
+ src/hb-machinery.hh              |  6 +++---
+ src/hb-ot-cff1-table.hh          |  4 ++--
+ src/hb-ot-cff2-table.hh          | 28 ++++++++++++++--------------
+ src/hb-ot-cmap-table.hh          | 14 +++++++-------
+ src/hb-ot-color-cbdt-table.hh    |  4 ++--
+ src/hb-ot-color-sbix-table.hh    |  4 ++--
+ src/hb-ot-color-svg-table.hh     |  4 ++--
+ src/hb-ot-glyf-table.hh          |  8 ++++----
+ src/hb-ot-hmtx-table.hh          |  8 ++++----
+ src/hb-ot-layout-gdef-table.hh   |  4 ++--
+ src/hb-ot-layout-gsubgpos.hh     |  4 ++--
+ src/hb-ot-meta-table.hh          |  4 ++--
+ src/hb-ot-name-table.hh          |  4 ++--
+ src/hb-ot-post-table-v2subset.hh |  4 ++--
+ src/hb-ot-post-table.hh          |  4 ++--
+ src/hb-ot-var-gvar-table.hh      |  4 ++--
+ src/hb-subset-cff2.cc            |  4 ++--
+ src/hb-subset-plan.cc            | 16 ++++++++--------
+ 18 files changed, 64 insertions(+), 64 deletions(-)
+
+commit 1522015bb2d140f199359c4e7cfcf342b93894a7
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Jan 19 23:13:50 2022 +0200
+
+    [test] Add --single-par to more places in hb-aots-tester [ci skip]
+
+ test/shape/data/aots/hb-aots-tester.cpp | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 2d12fc90a4b4d5b5ba847115c8ef76b16ec495ef
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 19 14:01:20 2022 -0700
+
+    [ms-feature-ranges] Pass reference to cmp function
+
+ src/hb-ms-feature-ranges.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ac109c9353292bfa474f57efdb43f9e0f2f735f6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 19 12:11:58 2022 -0700
+
+    [ms-feature-ranges] Inline code in header file
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/3387
+
+ src/Makefile.sources        |   1 -
+ src/harfbuzz.cc             |   1 -
+ src/hb-ms-feature-ranges.cc | 177 --------------------------------------------
+ src/hb-ms-feature-ranges.hh | 141 ++++++++++++++++++++++++++++++++++-
+ src/meson.build             |   1 -
+ 5 files changed, 137 insertions(+), 184 deletions(-)
+
+commit cfa00238e40cc3c8d1aac557539fd746bc70124b
+Merge: 7e160dc34 376738d41
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 19 11:10:22 2022 -0800
+
+    Merge pull request #3386 from harfbuzz/unify-sorted-vector
+    
+    Unify sorted vector
+
+commit 376738d41104dc10d483c8eb135d1befd5b18855
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 19 11:46:21 2022 -0700
+
+    [coretext] Fix lsearch
+
+ src/hb-coretext.cc | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 106388e7665984b545b2b47b0fac63ab2484a4f3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 19 11:38:37 2022 -0700
+
+    [vector] Merge sorted-vector into vector
+    
+    Was easier than I thought!
+    
+    Let's see what the bot gods think...
+
+ src/hb-vector.hh | 58 +++++++++++---------------------------------------------
+ 1 file changed, 11 insertions(+), 47 deletions(-)
+
+commit 294d50ff353f77be2b2f0a560a2a876e4a80d094
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 19 11:32:14 2022 -0700
+
+    [vector] Add sorted template argument
+
+ src/hb-vector.hh | 24 ++++++++++++++++++++++--
+ 1 file changed, 22 insertions(+), 2 deletions(-)
+
+commit cd9799784cc6deb8829a3c54a9dee654379cc03e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 19 11:14:25 2022 -0700
+
+    [vector] Remove old find() method
+
+ src/hb-algs.hh   | 12 +++++++++---
+ src/hb-object.hh |  6 +++---
+ src/hb-vector.hh | 17 -----------------
+ 3 files changed, 12 insertions(+), 23 deletions(-)
+
+commit 849e40b4db814bc6fe5defa5b802cc534aab209a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 19 11:06:33 2022 -0700
+
+    [ms-feature-ranges] Use preferred vector search API
+
+ src/hb-ms-feature-ranges.cc | 2 +-
+ src/hb-ms-feature-ranges.hh | 4 ++--
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 7e160dc347a77dc36a9bd9df6cb686eff8252f7c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 19 09:26:53 2022 -0700
+
+    [gpos] Fix unsafe-to-break of mark-attachment
+    
+    This was undetected because most of the time marks were in same
+    cluster of their base already.
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/3093
+
+ src/hb-ot-layout-gpos-table.hh                | 2 +-
+ test/shape/data/aots/tests/gpos4_simple.tests | 2 +-
+ test/shape/data/aots/tests/gpos5.tests        | 2 +-
+ 3 files changed, 3 insertions(+), 3 deletions(-)
+
+commit c8195dbc01f0b36f39ac6f087ee6891b09e31594
+Merge: 17cd4457b 282642311
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 19 06:56:05 2022 -0800
+
+    Merge pull request #3365 from harfbuzz/gdef-fix
+    
+    GDEF fix
+
+commit 17cd4457b7e456f3c99582a71c92b47ad572cd2f
+Author: Hugo Beauzée-Luyssen <hugo@beauzee.fr>
+Date:   Wed Jan 19 11:53:02 2022 +0100
+
+    meson: Enable big objects support when building for windows
+    
+    Fix cross compilation when targetting win64
+
+ meson.build | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit 282642311f1710d1b4ea223de21090211de57765
+Author: Simon Cozens <simon@simon-cozens.org>
+Date:   Wed Jul 8 14:39:31 2020 +0100
+
+    Test for #2140
+
+ test/shape/data/in-house/Makefile.sources                |   1 +
+ .../in-house/fonts/FallbackPlus-Javanese-no-GDEF.otf     | Bin 0 -> 4776 bytes
+ test/shape/data/in-house/meson.build                     |   1 +
+ test/shape/data/in-house/tests/glyph-props-no-gdef.tests |   1 +
+ 4 files changed, 3 insertions(+)
+
+commit fc5354c5e5e16105b46b7716065a9f1afac72e7b
+Author: Simon Cozens <simon@simon-cozens.org>
+Date:   Wed Jul 8 14:16:00 2020 +0100
+
+    Add test for #2516
+
+ test/shape/data/in-house/Makefile.sources              |   1 +
+ .../data/in-house/fonts/NotoNastaliqUrdu-Regular.ttf   | Bin 0 -> 457312 bytes
+ test/shape/data/in-house/meson.build                   |   1 +
+ .../in-house/tests/nested-mark-filtering-sets.tests    |   4 ++++
+ 4 files changed, 6 insertions(+)
+
+commit 94ba4d5a440c599694b0db73ab8e9344d83cb9ef
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Jan 18 16:35:30 2022 -0800
+
+    [subset] Fix bound check when setting overlap bit.
+    
+    length() shouldn't be used again as the end of instruction offset is already included in flags_offset.
+
+ src/hb-ot-glyf-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 10a20be397e47522f8d20f6247278a0770c5bf66
+Merge: daab4bf63 fe783ac09
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 18 13:46:35 2022 -0800
+
+    Merge pull request #3381 from harfbuzz/clean-vector-use
+    
+    Clean vector use
+
+commit fe783ac091b94ff6d0c9060fde229594b4e635e1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 18 13:38:28 2022 -0700
+
+    [cff] Remove op_str_t nop init/fini
+
+ src/hb-cff-interp-common.hh | 3 ---
+ src/hb-subset-cff-common.hh | 3 ---
+ 2 files changed, 6 deletions(-)
+
+commit 8d24ac26623f5645783b8e36e39c9f5c635e0191
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 18 13:14:42 2022 -0700
+
+    [cff] Remove init/fini from number_t
+
+ src/hb-cff-interp-common.hh    | 7 +------
+ src/hb-cff-interp-cs-common.hh | 9 +--------
+ 2 files changed, 2 insertions(+), 14 deletions(-)
+
+commit 6ef83c2c31b4355f2eeee7d241e2c6bb52f6d6b3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 18 13:08:34 2022 -0700
+
+    [vector] Remove .fini_deep()
+
+ src/hb-cff-interp-common.hh | 4 ++--
+ src/hb-vector.hh            | 7 -------
+ 2 files changed, 2 insertions(+), 9 deletions(-)
+
+commit daab4bf63a6ce1a519173aee5ddfbf17318cf2b8
+Author: James Hilliard <james.hilliard1@gmail.com>
+Date:   Mon Jan 17 18:28:39 2022 -0700
+
+    [meson] add icu DEFS required for compilation
+    
+    In some cases we need to add additionl defs to build against icu if
+    icu has certain options configured.
+    
+    ICU warns about this when building:
+    
+    *** WARNING: You must set the following flags before code compiled against this ICU will function properly:
+    
+        -DU_DISABLE_RENAMING=1
+    
+    We can fetch these flags from the icu pkgconfig and add them if
+    required.
+    
+    This fixes symbol errors if ICU is built without renaming.
+
+ meson.build | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+commit 4eb6e6ea16e0b4f6ac7271929849c3e8f52c8cc6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 18 12:07:05 2022 -0700
+
+    [cff] Remove some more fini_deep()
+
+ src/hb-ot-cff1-table.hh | 4 ++--
+ src/hb-ot-cff2-table.hh | 4 ++--
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 29f60d1eaad663b8519930145e7f4c4d88429dce
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 18 11:58:16 2022 -0700
+
+    [cff] Remove init/fini from blend_arg_t
+
+ src/hb-cff2-interp-cs.hh | 12 ------------
+ 1 file changed, 12 deletions(-)
+
+commit 213e3f09b11cd6fb67295ad758beffd490d62ed6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 18 09:39:46 2022 -0700
+
+    [vector] Add TODO Emplace?
+
+ src/hb-vector.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit f1dc8b087cf08970c6c96b0052ec46a10892cc66
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Jan 18 10:29:04 2022 -0800
+
+    [subset-cff] Convert subr_closures_t to constructor/destructor instead of init/fini.
+
+ src/hb-subset-cff-common.hh | 50 ++++++++++++---------------------------------
+ 1 file changed, 13 insertions(+), 37 deletions(-)
+
+commit a48aa9850acf89a1ba36fa812195d6428f80b9a6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 18 09:32:58 2022 -0700
+
+    [subset-cff] Remove another set of fini_deep
+
+ src/hb-subset-cff-common.hh | 30 ++++--------------------------
+ 1 file changed, 4 insertions(+), 26 deletions(-)
+
+commit 07474aa8c6f8a4d4bff92501e2e19143cfe8e91f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 18 09:29:43 2022 -0700
+
+    [subset-cff1] Remove a constructor/destructor pair
+
+ src/hb-subset-cff1.cc | 32 +++++---------------------------
+ 1 file changed, 5 insertions(+), 27 deletions(-)
+
+commit a1e9a276eb2dee1c1b0503072a0e6bbefc1dd62f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 18 09:27:32 2022 -0700
+
+    [subset-cff2] Drop an constructor/destructor pair
+
+ src/hb-subset-cff2.cc | 33 ++++++---------------------------
+ 1 file changed, 6 insertions(+), 27 deletions(-)
+
+commit 035f03346ddc673a3617822e45103d67a11cd62c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 18 09:26:30 2022 -0700
+
+    [str_buff_vec_t] Remove unused fini method
+
+ src/hb-ot-cff-common.hh | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit de2cef42b4b6fba68d5b7baa53019af257ba2110
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 18 09:21:31 2022 -0700
+
+    [bimap] Remove init/fini
+
+ src/hb-bimap.hh             | 14 --------------
+ src/hb-ot-layout-common.hh  |  9 ---------
+ src/hb-ot-var-hvar-table.hh |  7 ++-----
+ src/hb-subset-cff-common.hh | 19 +------------------
+ src/hb-subset-cff1.cc       |  8 --------
+ src/hb-subset-cff2.cc       |  2 --
+ 6 files changed, 3 insertions(+), 56 deletions(-)
+
+commit c3dd21f11087f1e4cda82dcd6667cae508ca4543
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 18 09:11:08 2022 -0700
+
+    [cff] Remove unneeded init/fini
+
+ src/hb-subset-cff1.cc | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 0b54f924160204e895ae832a1244a3d98e3b5252
+Merge: 92f179075 15cceff3d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 18 07:28:07 2022 -0800
+
+    Merge pull request #3376 from harfbuzz/auto-vector
+    
+    [vector] Automatic item allocation / destruction
+
+commit 15cceff3d779c0cfb6b4d613ec7b39e81c962c7d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 17 15:53:01 2022 -0700
+
+    [repacker] Replace fini_deep() with fini()
+    
+    Vector calls destructor now.
+
+ src/hb-repacker.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 1198fb24686d1ea268f9923d3238fe6c2afb2d97
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 16 06:29:35 2022 -0700
+
+    [vector] Adjust construction criteria
+
+ src/hb-vector.hh | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+commit c58bfa35fb9d6d8bebad94c2c6e24eaf18d5d1d5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 15 18:06:03 2022 -0700
+
+    [vector] Move semantics in vector remove()
+
+ src/hb-vector.hh | 23 +++++++++++++++++++----
+ 1 file changed, 19 insertions(+), 4 deletions(-)
+
+commit 5946e945d515bed8579caaac7fb79ee540fb22e8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 15 18:00:18 2022 -0700
+
+    [vector] Destruct in pop()
+
+ src/hb-vector.hh | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit 7171917b52880728b513168d946196331b7707d1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 15 17:16:40 2022 -0700
+
+    [vector] Construct items when enlarging
+
+ src/hb-vector.hh | 23 +++++++++++++++++++++--
+ 1 file changed, 21 insertions(+), 2 deletions(-)
+
+commit 813eaba6ea23544eea6bc6efcedada817b9c0b10
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 14 13:09:21 2022 -0700
+
+    [vector] Start adding destruction
+    
+    Now we need to remove manual destruction, ouch!
+
+ src/hb-vector.hh | 34 ++++++++++++++++++++++++++--------
+ 1 file changed, 26 insertions(+), 8 deletions(-)
+
+commit 65a22836f833c9ec0e5a3d11f3e5b9a2befaea54
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 14 12:55:48 2022 -0700
+
+    [vector] Add XXX markers for remaining places that need work
+
+ src/hb-vector.hh | 15 ++++++++++++---
+ 1 file changed, 12 insertions(+), 3 deletions(-)
+
+commit 92f179075fc264c9d999c6316193b8ac3e76746c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 16 07:51:35 2022 -0700
+
+    Make hb_coerce static inline
+    
+    That's the pattern we follow.
+    
+    https://github.com/harfbuzz/harfbuzz/commit/985b63b3eeee5be1f5234fc7f13077eacf5e5b94#commitcomment-63973544
+
+ src/hb-algs.hh | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit 19793f333b14208daecc911f4f6979ff7d393391
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 16 07:49:40 2022 -0700
+
+    Better try at previous commit
+    
+    https://github.com/harfbuzz/harfbuzz/commit/985b63b3eeee5be1f5234fc7f13077eacf5e5b94#commitcomment-63973544
+
+ src/hb-algs.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 1173ed1f7f401b0f21bacc0f35c4a18f6947a99d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 16 07:48:02 2022 -0700
+
+    Try fix Mac build
+    
+    https://github.com/harfbuzz/harfbuzz/commit/985b63b3eeee5be1f5234fc7f13077eacf5e5b94#commitcomment-63973544
+
+ src/hb-algs.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit c0f57ccc88b56c023bbb683449bb6627b697ccc2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 16 06:59:24 2022 -0700
+
+    [algs] Add default-construtor to hb_pair_t
+
+ src/hb-algs.hh | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit e2e305066a09b67670fff460d920d4a8aae81389
+Author: luz paz <luzpaz@users.noreply.github.com>
+Date:   Sun Jan 16 07:00:53 2022 -0500
+
+    Fix various typos
+    
+    Found via `codespell -q 3 -S ./perf/texts -L actualy,ba,beng,fo,gir,inout,nd,ot,pres,ro,te,teh,timne`
+
+ NEWS                                              |  6 +++---
+ RELEASING.md                                      |  2 +-
+ docs/Makefile.am                                  |  2 +-
+ docs/repacker.md                                  | 12 ++++++------
+ docs/usermanual-integration.xml                   |  4 ++--
+ src/gen-os2-unicode-ranges.py                     |  2 +-
+ src/hb-aat-layout-just-table.hh                   |  2 +-
+ src/hb-array.hh                                   |  2 +-
+ src/hb-cff2-interp-cs.hh                          |  2 +-
+ src/hb-draw.h                                     |  2 +-
+ src/hb-ot-color.cc                                |  2 +-
+ src/hb-ot-layout-common.hh                        |  2 +-
+ src/hb-ot-shape-complex-hangul.cc                 |  2 +-
+ src/hb-ot-shape.cc                                |  2 +-
+ src/hb-ot-var-gvar-table.hh                       |  2 +-
+ src/hb-ot-var.h                                   |  2 +-
+ src/hb-repacker.hh                                |  2 +-
+ src/hb-serialize.hh                               |  4 ++--
+ src/ms-use/IndicPositionalCategory-Additional.txt | 12 ++++++------
+ test/api/test-ot-math.c                           |  2 +-
+ test/fuzzing/hb-set-fuzzer.cc                     |  2 +-
+ util/ansi-print.hh                                |  2 +-
+ util/hb-subset.cc                                 |  2 +-
+ 23 files changed, 37 insertions(+), 37 deletions(-)
+
+commit 589bea15b790f36ec12c8f463ea1c333b6155958
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 15 17:55:10 2022 -0700
+
+    Fix previous commit
+
+ src/hb-common.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit b97e4f7084e3f2c3eea64163188da97734bbedef
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 15 17:47:51 2022 -0700
+
+    Further adjust setlocale
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/3375#issuecomment-1013783496
+
+ src/hb-common.cc | 17 +++++++++--------
+ 1 file changed, 9 insertions(+), 8 deletions(-)
+
+commit 63affc4eaea73a70667f346926a3a289c35773c5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 13 16:05:42 2022 -0700
+
+    [vector] Move semantics when resizing
+
+ src/hb-ot-color-cbdt-table.hh | 10 ++++++++++
+ src/hb-vector.hh              | 30 +++++++++++++++++++++++++++++-
+ src/test-vector.cc            | 14 ++++++++++++++
+ 3 files changed, 53 insertions(+), 1 deletion(-)
+
+commit 1c50106608cfa205fafa41e80c7f747e2e5b0730
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 15 13:08:21 2022 -0700
+
+    [meta] Include <memory>, for addressof
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/3375
+
+ src/hb-meta.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 71e6f742a8159640fff6b9ddee0fd34f277ce0e2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 13 16:19:44 2022 -0700
+
+    [meta] Remove unused hb_ref()
+
+ src/hb-meta.hh | 10 ----------
+ 1 file changed, 10 deletions(-)
+
+commit e30511a8de700224a22163cf6f0c29e18aaeb4fb
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Jan 14 16:20:31 2022 -0800
+
+    [map] Correct previous commit, if (...) was reversed.
+
+ src/hb-map.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ff4e8c7eac26f3183cb88a37dadb578362d44405
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Jan 14 16:20:31 2022 -0800
+
+    [map] Fix bad memory access if hb_map.fini() was called twice.
+
+ src/hb-map.hh   | 12 +++++++-----
+ src/test-map.cc |  8 ++++++++
+ 2 files changed, 15 insertions(+), 5 deletions(-)
+
+commit 8a69e0063936764cbd149985e0b57e1dc35935c2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 13 16:17:34 2022 -0700
+
+    [meta] Use std::addressof() instead of hb_addressof()
+
+ src/hb-algs.hh                    |  2 +-
+ src/hb-iter.hh                    |  2 +-
+ src/hb-map.hh                     |  4 ++--
+ src/hb-meta.hh                    | 20 ++------------------
+ src/hb-ot-cmap-table.hh           |  2 +-
+ src/hb-ot-color-colrv1-closure.hh |  2 +-
+ src/hb-ot-name-table.hh           |  2 +-
+ src/hb-serialize.hh               | 10 +++++-----
+ 8 files changed, 14 insertions(+), 30 deletions(-)
+
+commit b7b0a15f7eb8e753e6434c1fee66c2a2f75ea1bb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 13 15:33:27 2022 -0700
+
+    [meta] Remove hb_add_const
+
+ src/hb-iter.hh | 2 +-
+ src/hb-meta.hh | 1 -
+ 2 files changed, 1 insertion(+), 2 deletions(-)
+
+commit 3b2e604237d5c818dc9b24158e18bc556c566dce
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 13 15:32:46 2022 -0700
+
+    [meta] Use std::is_const instead of hb_is_const
+
+ src/hb-meta.hh | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+commit 909dde9df1b93a508258461ff8e00c5f6604f07b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 13 15:30:10 2022 -0700
+
+    [meta] Use std::is_reference instead of hb_is_reference
+
+ src/hb-iter.hh | 2 +-
+ src/hb-meta.hh | 5 +++--
+ 2 files changed, 4 insertions(+), 3 deletions(-)
+
+commit 47afb3ef04c97628d36a129e744b82303b1ca52a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 13 15:26:07 2022 -0700
+
+    [meta] Replace hb_is_pointer with std::is_pointer
+
+ src/hb-algs.hh | 2 +-
+ src/hb-map.hh  | 4 ++--
+ src/hb-meta.hh | 1 -
+ 3 files changed, 3 insertions(+), 4 deletions(-)
+
+commit 956e0a4d13c349ccaf64dd130211909fadc43637
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 13 15:06:58 2022 -0700
+
+    [map] Destruct objects
+
+ src/hb-map.hh   | 11 ++++++++---
+ src/test-map.cc |  2 --
+ 2 files changed, 8 insertions(+), 5 deletions(-)
+
+commit 726b1a8b2d0ce980e51dc7404c49906b44e73076
+Author: Jussi Pakkanen <jpakkane@gmail.com>
+Date:   Thu Jan 13 18:30:52 2022 +0200
+
+    Convert fallback kwargs to [provide] entries.
+
+ meson.build                | 11 ++++-------
+ subprojects/cairo.wrap     |  3 +++
+ subprojects/freetype2.wrap |  3 +++
+ subprojects/glib.wrap      |  4 ++++
+ 4 files changed, 14 insertions(+), 7 deletions(-)
+
+commit bc0a5fdf43c7932c9ca39fa64a5cd405ebb43da5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 13 13:34:22 2022 -0700
+
+    [test-map] Add disabled tests with std::string
+
+ src/test-map.cc | 21 +++++++++++++++++++++
+ 1 file changed, 21 insertions(+)
+
+commit 985b63b3eeee5be1f5234fc7f13077eacf5e5b94
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 13 13:33:07 2022 -0700
+
+    [map] Allow invalid items to be pointer to static object
+    
+    By derefencing them when necessary.
+    
+    Also, we do not rely on trivially-copyable, so remove that assertion.
+
+ src/hb-algs.hh |  7 +++++--
+ src/hb-map.hh  | 28 +++++++++++++---------------
+ 2 files changed, 18 insertions(+), 17 deletions(-)
+
+commit 98b26eedf5578b66f4ca1c173443942af831f195
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 13 13:12:10 2022 -0700
+
+    [check-static-inits] Only check library object files
+
+ src/check-static-inits.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 1e27f95dc1e8c35c9b2acd60a3460d8c6f8edf31
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 13 13:10:47 2022 -0700
+
+    [algs] Add hb_coerce()
+
+ src/hb-algs.hh | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 5a91db113507fa465f320438f1c68ca22bc0a2cd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 13 12:44:48 2022 -0700
+
+    [map] Remove constexpr invalid items
+    
+    These were non-workable in the general case, eg std::string.
+
+ src/hb-map.hh                | 3 ---
+ src/hb-ot-layout-gsubgpos.hh | 2 +-
+ 2 files changed, 1 insertion(+), 4 deletions(-)
+
+commit 114046dc27795514189f4af4e65be50238f3ca8e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 13 12:38:26 2022 -0700
+
+    [map] Construct objects
+
+ src/hb-map.hh | 9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+commit b15e497d4de5b04537217117137f7756dc535c2f
+Author: Matthias Clasen <mclasen@redhat.com>
+Date:   Thu Jan 13 14:10:23 2022 -0500
+
+    Fix the docs build
+    
+    This was inadvertendly broken in f956ecdbaffbb8643.
+    Sorry
+
+ docs/usermanual-object-model.xml | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit ca4f56bdc746d3d23f46898bd83c1b2c3d8250a1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 13 11:48:34 2022 -0700
+
+    [map] Massage some more
+    
+    Towards being able to store arbitrary types.
+
+ src/hb-map.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit cfe2b66114fdbc2b61566bdc086ce41286a78aec
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 13 11:42:48 2022 -0700
+
+    [algs] Fix hash chaining to std::hash()
+
+ src/hb-algs.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 87496bf63ea7644733cdcc08f330a522597509a1
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Jan 13 11:03:45 2022 -0800
+
+    [subset] fix fuzzer timeout if visisted_paint goes into error.
+
+ src/hb-ot-color-colr-table.hh                             |   2 +-
+ ...z-testcase-minimized-hb-subset-fuzzer-4979711393005568 | Bin 0 -> 349 bytes
+ 2 files changed, 1 insertion(+), 1 deletion(-)
+
+commit 4ced2e8a8ad224f9a4abcc418632600af1194c11
+Author: Matthias Clasen <mclasen@redhat.com>
+Date:   Thu Jan 13 09:05:04 2022 -0500
+
+    docs: Add some details
+    
+    Mention immutability in the object model section.
+
+ docs/usermanual-object-model.xml | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+commit bb330c6aa6d56e29d08a3d6358aec70561defa49
+Author: Matthias Clasen <mclasen@redhat.com>
+Date:   Thu Jan 13 08:57:56 2022 -0500
+
+    docs: Fix a typo
+
+ docs/usermanual-object-model.xml | 42 ++++++++++++++++++++--------------------
+ 1 file changed, 21 insertions(+), 21 deletions(-)
+
+commit 16cfe34ae85c90754f5171428e4709ff784f8139
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 13 11:01:22 2022 -0700
+
+    [git.mk] Update
+
+ git.mk | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+commit 0acf466c44143de2e9b9cc0375cb25ec67cb132f
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Thu Jan 13 01:29:22 2022 +0200
+
+    [doc] Fix hb_font_set_synthetic_slant param name
+
+ src/hb-font.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit fa12f1ae25014a8da9f1b8bef871f60460e27a6b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 12 15:08:34 2022 -0700
+
+    Rename method
+
+ src/hb-ot-layout-gsubgpos.hh | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit 9408e0d6d1a046fc6175eeca833852e86deb5d17
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 12 15:07:34 2022 -0700
+
+    Rename variable
+
+ src/hb-ot-layout-gsubgpos.hh | 20 ++++++++++----------
+ 1 file changed, 10 insertions(+), 10 deletions(-)
+
+commit 96c969c82046560859df5cdebddb91d0488c6919
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 12 15:06:40 2022 -0700
+
+    Preserve glyph props
+
+ src/hb-ot-layout-gsubgpos.hh | 11 +++++++++--
+ 1 file changed, 9 insertions(+), 2 deletions(-)
+
+commit 0b2c514fb48b26e2c8fc915b3702ba1b2c8b2b5e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 12 11:20:58 2022 -0700
+
+    More macro cleanup
+
+ src/hb-ot-shape-complex-arabic-win1256.hh | 24 +++++++++++++++++-------
+ 1 file changed, 17 insertions(+), 7 deletions(-)
+
+commit 0a42f46ce974bcc01b935f400ee2cdd9e3363e30
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 12 11:16:02 2022 -0700
+
+    Fix compiler warning
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/3364
+
+ src/hb-ot-shape-complex-arabic-win1256.hh | 16 ++++++++++++++++
+ 1 file changed, 16 insertions(+)
+
+commit 72f0b24ee3b138bc955430c5a7d71de669b219f0
+Author: Matthias Clasen <matthias.clasen@gmail.com>
+Date:   Wed Jan 12 13:08:02 2022 -0500
+
+    docs: Clarify variation apis (#3363)
+    
+    Make it explicit that the variations setters
+    replace all existing variations, even if
+    not all axes are included in the provided
+    values.
+    
+    Co-authored-by: Matthias Clasen <mclasen@redhat.com>
+
+ src/hb-font.cc | 12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+commit befe3b5d5ac4a88ffb880ca16ad1f3fbb225ae28
+Author: Matthias Clasen <matthias.clasen@gmail.com>
+Date:   Wed Jan 12 13:07:25 2022 -0500
+
+    color: Document empty returns (#3362)
+    
+    Document that the SVG and PNG getters return
+    the singleton empty blob if the glyph has no
+    color.
+    
+    Fixes: #1413
+    
+    Co-authored-by: Matthias Clasen <mclasen@redhat.com>
+
+ src/hb-ot-color.cc | 12 ++++++++----
+ 1 file changed, 8 insertions(+), 4 deletions(-)
+
+commit 13643934aa9c957831ae76dfad3a2a00ee85c42a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 12 10:54:28 2022 -0700
+
+    Clean up HB_NO_SETLOCALE
+    
+    https://github.com/harfbuzz/harfbuzz/pull/3358#pullrequestreview-850500143
+
+ src/hb-common.cc | 47 +++++++++++++++++++++++++++--------------------
+ 1 file changed, 27 insertions(+), 20 deletions(-)
+
+commit 53847dba92d59b0c457bd1b468751d20cbbe105b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 10 15:04:47 2022 -0700
+
+    [algs] Call std::hash from hb_hash()
+
+ src/hb-algs.hh | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit 74811c501d7876dc72d1ee821c1ce26cdaa0750e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 10 14:57:38 2022 -0700
+
+    [map] Map == / != use correct types
+
+ src/hb-map.hh | 26 +++++++++++++++++++++-----
+ 1 file changed, 21 insertions(+), 5 deletions(-)
+
+commit b8c2c1ab3778755a23ea449ba334959693388687
+Author: Timo Suoranta <tksuoran@gmail.com>
+Date:   Tue Jan 11 13:14:44 2022 +0100
+
+    Use freetype from CMake target when present (#3361)
+    
+    Add check for Freetype CMake target. If it is found:
+    - enable HB_HAVE_FREETYPE option
+    - add HAVE_FREETYPE=1 define
+    - bypass finding Freetype as cmake package
+    - add Freetype CMake target as dependency to harfbuzz
+
+ CMakeLists.txt | 10 +++++++++-
+ 1 file changed, 9 insertions(+), 1 deletion(-)
+
+commit ce7f19a2ccb04181b015005f9aa12381da606c63
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 10 14:40:27 2022 -0700
+
+    Revert "[map] Actually use k/v invalid types for declaration!"
+    
+    This reverts commit 6f559346ac70fd188cb22d41f4b03ec227feee25.
+    
+    Err. My bad.
+
+ src/hb-map.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 6f559346ac70fd188cb22d41f4b03ec227feee25
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 10 14:29:36 2022 -0700
+
+    [map] Actually use k/v invalid types for declaration!
+
+ src/hb-map.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit a45a630539edb1d8554608e76a7a03160ecbd3a8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 8 15:47:33 2022 -0800
+
+    Fix unintentional locale dependency (#3358)
+    
+    Avoid unintentional locale dependency
+    
+    hb_variation_to_string uses sprintf with %g, which will produce
+    a locale-dependent decimal point, which is not desired here.
+    
+    The output is supposed to be compatible with CSS syntax, and
+    that always uses '.' for the decimal point.
+    
+    Fix this by changing the per-thread locale to "C" around sprintf call.
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/3355
+    Fixes https://github.com/harfbuzz/harfbuzz/pull/3357
+    Fixes https://github.com/harfbuzz/harfbuzz/pull/3358
+    
+    Co-authored-by: Matthias Clasen <mclasen@redhat.com>
+
+ configure.ac     |  4 ++--
+ meson.build      |  3 +++
+ src/hb-common.cc | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++---
+ 3 files changed, 66 insertions(+), 5 deletions(-)
+
+commit d70825a6d18a4240876a75f107ef566f61bddf58
+Author: Matthias Clasen <mclasen@redhat.com>
+Date:   Sun Jan 2 11:28:28 2022 -0500
+
+    docs: Add some details about coordinates
+    
+    Mention what the effective values are when
+    coordinates have not been set.
+
+ src/hb-font.cc | 29 ++++++++++++++++++-----------
+ 1 file changed, 18 insertions(+), 11 deletions(-)
+
+commit 0a5c1c970581fb8639d45a6f5a12443af89b7e12
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 4 14:18:38 2022 -0700
+
+    [failing-alloc] Make it compile as C++ as well
+
+ src/failing-alloc.c | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit bea5369c6d8f138c1d3113a1b60e1c6ea097a6e3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 4 10:52:05 2022 -0700
+
+    [buffer] Rename swap_buffers() to sync()
+
+ src/gen-vowel-constraints.py                 | 2 +-
+ src/hb-aat-layout-common.hh                  | 2 +-
+ src/hb-buffer.cc                             | 6 +++---
+ src/hb-buffer.hh                             | 2 +-
+ src/hb-ot-layout.cc                          | 2 +-
+ src/hb-ot-shape-complex-hangul.cc            | 2 +-
+ src/hb-ot-shape-complex-syllabic.cc          | 2 +-
+ src/hb-ot-shape-complex-thai.cc              | 2 +-
+ src/hb-ot-shape-complex-vowel-constraints.cc | 2 +-
+ src/hb-ot-shape-normalize.cc                 | 4 ++--
+ src/hb-ot-shape.cc                           | 2 +-
+ 11 files changed, 14 insertions(+), 14 deletions(-)
+
+commit c5e5d5e0bcdeb9256b445fe6378bd503083d5204
+Merge: 165a6073f d1e7df5c3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 4 07:33:59 2022 -0700
+
+    Merge pull request #3353 from harfbuzz/buffer-create-similar
+    
+    Add `hb_buffer_create_similar()`; use it in util
+
+commit d1e7df5c3f214b0f199fc2aff3e5645281fc5caa
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 4 07:32:04 2022 -0700
+
+    [buffer] Add enter()/leave() pair around shape()
+
+ src/hb-buffer.cc   | 27 +++++++++++++++++++++++++++
+ src/hb-buffer.hh   | 13 +++++++++++--
+ src/hb-ot-shape.cc | 19 ++-----------------
+ 3 files changed, 40 insertions(+), 19 deletions(-)
+
+commit 43be5ba442548528c89ad31c0927cc68515b736e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 4 07:26:53 2022 -0700
+
+    [buffer] Group shape-related members together
+
+ src/hb-buffer.cc    |  5 ++---
+ src/hb-buffer.hh    | 14 ++++++--------
+ src/hb-ot-layout.hh |  5 ++---
+ src/hb-ot-shape.cc  |  2 ++
+ 4 files changed, 12 insertions(+), 14 deletions(-)
+
+commit 52f5711ed0354b0c5d396255886f03048997bbd9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 3 11:57:42 2022 -0700
+
+    [buffer] Add hb_buffer_create_similar()
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1555
+
+ docs/harfbuzz-sections.txt |  1 +
+ src/hb-buffer.cc           | 73 ++++++++++++++++++++++++++++++++++------------
+ src/hb-buffer.h            | 12 ++++++--
+ src/hb-buffer.hh           |  1 +
+ util/shape-options.hh      | 13 ++-------
+ 5 files changed, 68 insertions(+), 32 deletions(-)
+
+commit f643b81ffc4d4dd6a100f83ff7bc618dfb7f5b69
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 3 11:45:31 2022 -0700
+
+    [buffer] Clean up internal state bookkeeping
+    
+    hb_buffer_reset() was NOT resetting cluster_level. Ouch! Fix that.
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1555
+
+ src/hb-buffer.cc | 15 ++++++++-------
+ src/hb-buffer.hh | 25 ++++++++++++++++++-------
+ 2 files changed, 26 insertions(+), 14 deletions(-)
+
+commit d0c3515ce423f689123f96111b105e7e4141a6b9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 3 11:26:41 2022 -0700
+
+    [util] Copy unicode_funcs in copy_buffer_properties()
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1555
+
+ util/shape-options.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 34f5b855aa39cc5ac59fb7cd3e9e3a48507e1a08
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 3 11:25:06 2022 -0700
+
+    [util] Simplify copy_buffer_properties()
+    
+    Now that hb_buffer_append() overlays segment_properties we can do this.
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1555
+
+ util/shape-options.hh | 3 ---
+ 1 file changed, 3 deletions(-)
+
+commit 101d07efd9a11b1f215b913205d2560ee0df9135
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 3 11:24:07 2022 -0700
+
+    [util] Move copy_buffer_properties() out of loop
+    
+    Now that hb_buffer_append() overlays properties, we can do this.
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1555
+
+ util/shape-options.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 36e9f467a43d18f5b040e2bd47c87f271916a73f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 3 11:23:14 2022 -0700
+
+    [buffer] Overlay segment-properties in hb_buffer_append()
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1555
+
+ src/hb-buffer.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 6a66992842dea6e3ad9c717a3fa047341ab50af6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 3 11:21:29 2022 -0700
+
+    Add hb_segment_properties_overlay()
+    
+    New API:
+    + hb_segment_properties_overlay()
+
+ docs/harfbuzz-sections.txt |  1 +
+ src/hb-buffer.cc           | 39 +++++++++++++++++++++++++++++++++++++++
+ src/hb-buffer.h            |  3 +++
+ 3 files changed, 43 insertions(+)
+
+commit 165a6073faf347bb2d622472f1f104b7865398e5
+Merge: a3265e1e0 3fc2e654c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 2 12:02:20 2022 -0700
+
+    Merge pull request #3338 from harfbuzz/slant
+    
+    [font] Add public API for synthetic slant
+
+commit 3fc2e654c0eca9566b184fd64c682114f99b2093
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 2 11:56:45 2022 -0700
+
+    [metrics] Fix slant calc
+
+ src/hb-ot-metrics.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a7751277e9e8982093928e762ac9eecc42820444
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 2 11:50:02 2022 -0700
+
+    [docs] Add hb_font_[gs]et_synthetic_slant()
+
+ docs/harfbuzz-sections.txt |  2 ++
+ src/hb-font.cc             | 14 ++++++++++----
+ 2 files changed, 12 insertions(+), 4 deletions(-)
+
+commit 4ab94443bbe80a354daa2d94e496c13f096501ad
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 2 11:26:45 2022 -0700
+
+    [metrics] Ouch. Fix slant code
+
+ src/hb-ot-metrics.cc | 27 ++++++++++++++++++++++-----
+ 1 file changed, 22 insertions(+), 5 deletions(-)
+
+commit f7d49d9c2b9899f9caeeff766714631918129d2c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 2 11:16:33 2022 -0700
+
+    [metrics] Simplify
+
+ src/hb-ot-metrics.cc | 11 ++++++++---
+ 1 file changed, 8 insertions(+), 3 deletions(-)
+
+commit f1ba1f940f407efd192cb2d6bd4b7eee20aedf96
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 2 10:58:25 2022 -0700
+
+    [metrics] Only scale caret rise/run if font is slanted
+
+ src/hb-ot-metrics.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 45c2b6e384e3359a54f40e4b02df9fffe27b0def
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 2 10:55:11 2022 -0700
+
+    [metrics] Harden math
+
+ src/hb-ot-metrics.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit fa008a021fbd3c432499ac9316fa75a7f5a4ea02
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 2 10:46:38 2022 -0700
+
+    [metrics] Implement synthetic slant for caret slope
+    
+    Part of https://github.com/harfbuzz/harfbuzz/pull/3338
+
+ src/hb-ot-metrics.cc | 10 +++++++++-
+ 1 file changed, 9 insertions(+), 1 deletion(-)
+
+commit fc329f665fab56c2983ababf2ebc71088b2ecfcc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 2 10:41:41 2022 -0700
+
+    [metrics] Scale up horizontal caret rise/run
+    
+    Eg. if rise/run are 1/0, we now return upem/0. This is equivalent.
+    
+    Part of https://github.com/harfbuzz/harfbuzz/pull/3338
+
+ src/hb-ot-metrics.cc | 15 +++++++++++++--
+ 1 file changed, 13 insertions(+), 2 deletions(-)
+
+commit a3265e1e07f8d00e5dbd5ae89e0b500b1469575a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 2 10:02:41 2022 -0700
+
+    Typo
+
+ docs/harfbuzz-sections.txt | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0df83f52a126aa1c89e4dd8478f3a535805bd6ac
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 2 08:01:11 2022 -0700
+
+    Fix test
+
+ src/gen-def.py | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 6356da88ee4b0926b4fb2bc3b70352633124d05f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 2 07:55:56 2022 -0700
+
+    [docs] Update
+
+ docs/harfbuzz-sections.txt | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 5b87c30d6b192092008e578fb5f3148fb96ab09a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 2 07:53:45 2022 -0700
+
+    [font] Mark hb_font_get_var_coords_design() non-experimental
+    
+    Any remaining issue with the API will address later by deprecating it.
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1865
+
+ src/hb-font.cc | 4 +---
+ src/hb-font.h  | 2 --
+ 2 files changed, 1 insertion(+), 5 deletions(-)
+
+commit 2d42fc9fbb9ddb7c9bd53b06a7ef70ef6f459399
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 2 07:45:10 2022 -0700
+
+    [font] Load named-instance if face index top bits are set
+    
+    This matches FreeType behavior.
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/3348
+
+ src/hb-face.cc |  4 ++++
+ src/hb-font.cc | 10 ++++++++++
+ 2 files changed, 14 insertions(+)
+
+commit da7dba0002616eab73b7dd1621274992ce6eb2aa
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 1 11:20:20 2022 -0700
+
+    [face] Clarify face_index handling
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/3347
+
+ src/hb-face.cc | 19 +++++++++++++------
+ 1 file changed, 13 insertions(+), 6 deletions(-)
+
+commit 6da4b80e5f303bf40c295c4888ba3dc48bd28f4b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 22 21:51:03 2021 -0700
+
+    [hb-ot-var] Specify normalized 2.14 docs
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/3345
+
+ src/hb-ot-var.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 1b51be57dcd3f964ab7503b5261294e673892991
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 22 21:43:48 2021 -0700
+
+    [hb-ot-var] Actually set in/out argument
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/pull/3344
+
+ src/hb-ot-var-fvar-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 06ee40213cb98fe1589c1712d80380c19d2bbc50
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 21 14:14:09 2021 -0700
+
+    Use invisible-glyph for spaces if font has no ASCII space
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/3340
+    
+    Should add tests ideally.
+
+ src/hb-ot-shape-fallback.cc  | 9 +++++++++
+ src/hb-ot-shape-normalize.cc | 3 ++-
+ 2 files changed, 11 insertions(+), 1 deletion(-)
+
+commit 602bd39680e6c337309516d6b5086834a35a7609
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 19 21:40:25 2021 -0800
+
+    [style] Adjust font slant angle for synthetic slant value
+    
+    Part of https://github.com/harfbuzz/harfbuzz/pull/3338
+
+ src/hb-style.cc | 15 +++++++++++----
+ 1 file changed, 11 insertions(+), 4 deletions(-)
+
+commit ff697debd8e55d8858a2f199ae06f7a9f33a5991
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 19 07:25:37 2021 -0700
+
+    [GPOS] Apply font synthetic slant
+    
+    Part of fixing https://github.com/harfbuzz/harfbuzz/issues/3196
+
+ src/hb-font.cc                 |  1 +
+ src/hb-font.hh                 |  2 ++
+ src/hb-ot-layout-gpos-table.hh | 11 +++++++++--
+ 3 files changed, 12 insertions(+), 2 deletions(-)
+
+commit 810f5d71c71ab59f4b1257e18b81551de49f3ee5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Dec 18 15:12:26 2021 -0700
+
+    [font] Add public API for slant
+    
+    Not hooked up internally to anything.
+    
+    New API:
+    
+    + hb_font_set_synthetic_slant()
+    + hb_font_get_synthetic_slant()
+    
+    Part of fixing https://github.com/harfbuzz/harfbuzz/issues/3196
+
+ src/hb-font.cc | 41 ++++++++++++++++++++++++++++++++++++++++-
+ src/hb-font.h  |  6 ++++++
+ src/hb-font.hh |  1 +
+ 3 files changed, 47 insertions(+), 1 deletion(-)
+
+commit 067f90a82087a5feb1cf76625c54c60a10946fe1
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Dec 14 16:24:38 2021 -0800
+
+    [subset] Fix for fuzzer timeout.
+    
+    Fixes https://oss-fuzz.com/testcase-detail/5549945449480192
+    
+    In prune_langsys: move LangSys visited check up before any work is done for a LangSys. In this particular case the compare() method is responsible for the majority of the time spent and wasn't being guarded with a visisted check.
+
+ src/hb-ot-layout-common.hh                             |  10 +++++++---
+ ...estcase-minimized-hb-subset-fuzzer-5549945449480192 | Bin 0 -> 562733 bytes
+ 2 files changed, 7 insertions(+), 3 deletions(-)
+
+commit c4573c2ec793dc9a124654f0d0d349df7787fa45
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Dec 14 14:49:15 2021 -0800
+
+    [repacker] don't infinite loop if visited or roots is in error.
+    
+    Fixes https://oss-fuzz.com/testcase-detail/5205038086094848
+
+ src/hb-repacker.hh                                     |   7 +++++++
+ ...estcase-minimized-hb-subset-fuzzer-5205038086094848 | Bin 0 -> 129192 bytes
+ 2 files changed, 7 insertions(+)
+
+commit 449c4296a11a8b3d3882d4a4d6705281f5ff52e5
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Sun Dec 12 07:50:06 2021 +0200
+
+    [ci] Try harder to fix this randomly failing job
+    
+    The default --num-processes is the number of CPUs multiplied by 5,
+    which seems to give this VM a hard-time. Even the number of CPUs is too
+    much, so lets use half of that (I’m adding one just in case the division
+    gives zero).
+
+ .circleci/config.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 52a33a15a409550fdc6496cfcb16168b371e2aaf
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Sun Dec 12 07:43:58 2021 +0200
+
+    [ci] Try to fix the randomly failing valgrind job
+
+ .circleci/config.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit be91d2917d9860326cb5fd1d03ffe1042a72f6d3
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Sun Dec 12 04:45:54 2021 +0200
+
+    3.2.0
+
+ NEWS             | 16 ++++++++++++++++
+ configure.ac     |  2 +-
+ meson.build      |  2 +-
+ src/hb-version.h |  6 +++---
+ 4 files changed, 21 insertions(+), 5 deletions(-)
+
+commit 77507a1d8d872d8cd4f62b807e933cd3e2cdb110
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Dec 10 14:10:04 2021 -0800
+
+    [subset] Don't double count visit lookups in closure_lookups
+    
+    Each recursed lookup was getting counted once in closure_lookups() and then again in hb_closure_lookups_context_t::recurse.
+
+ src/hb-ot-layout-gsubgpos.hh | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit d67025705f0c4993cdd756bc47d942e14ceed0a1
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Dec 10 13:52:05 2021 -0800
+
+    [subset] reset the visited lookup count before each closure iteration.
+
+ src/hb-ot-layout-gsubgpos.hh | 3 +++
+ src/hb-ot-layout.cc          | 1 +
+ 2 files changed, 4 insertions(+)
+
+commit 23159084b43c1ce429d9e98035bf845919fd8a89
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 10 15:00:16 2021 -0700
+
+    [morx] Reverse graphemese, not whole buffer
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/3314
+    Supersedes https://github.com/harfbuzz/harfbuzz/pull/3315
+
+ src/hb-aat-layout-morx-table.hh            |  4 ++--
+ src/hb-ot-layout.hh                        |  6 ++++++
+ src/hb-ot-shape.cc                         | 15 +--------------
+ test/shape/data/in-house/tests/macos.tests |  3 +++
+ 4 files changed, 12 insertions(+), 16 deletions(-)
+
+commit 5b995526f7d0d1e688f68005b410a93cf1685544
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 10 14:59:56 2021 -0700
+
+    [buffer] Fix reverse_group() to reverse() at the end
+
+ src/hb-buffer.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 21c4fc1011854547edf564573fdbec4687e76e04
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 10 13:02:43 2021 -0700
+
+    [buffer] Add optional merge_clusters arg to reverse_groups()
+
+ src/hb-buffer.hh | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+commit e949e512181d04da1add14f6133a6d68f7a60fc2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 10 12:58:27 2021 -0700
+
+    [ot-layout] Port foreach_grapheme to buffer foreach_group
+
+ src/hb-ot-layout.hh | 22 ++++++----------------
+ 1 file changed, 6 insertions(+), 16 deletions(-)
+
+commit eb96e69d18aa45a623c05bf69e562b3918724f6f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 10 12:55:29 2021 -0700
+
+    [buffer] Add foreach_group()
+
+ src/hb-buffer.hh | 40 ++++++++++++++++++++--------------------
+ 1 file changed, 20 insertions(+), 20 deletions(-)
+
+commit 1b78e04c78338266c200226bccb21188355046ca
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 10 12:45:43 2021 -0700
+
+    [buffer] Add ::reverse_groups()
+
+ src/hb-buffer.cc | 23 -----------------------
+ src/hb-buffer.hh | 26 +++++++++++++++++++++++++-
+ 2 files changed, 25 insertions(+), 24 deletions(-)
+
+commit 4cd96e73e40acfa65b7d0726a7186bf31c169b2a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 10 12:33:21 2021 -0700
+
+    [buffer] Inline revers_range() / reverse()
+
+ src/hb-buffer.cc | 23 -----------------------
+ src/hb-buffer.hh | 10 ++++++++--
+ 2 files changed, 8 insertions(+), 25 deletions(-)
+
+commit 5914acb3cbb3634e9e94e0e571d96b806b7ecacf
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Dec 10 10:05:47 2021 -0800
+
+    [repacker] Clear distance and position cache when assigning a new space.
+    
+    A change in space will effect the distance assigned to the node and any of it's children so clear the distance cache.
+
+ src/hb-repacker.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 706014f69dc2cde140e17faf32d32a1cbd5d0000
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Wed Dec 1 20:20:12 2021 -0800
+
+    [subset] (Chain)ContextSubst glyph_closure fix
+    
+    - When pos_glyphs is empty, use current full glyphs set as input for
+    subsequent recursive closure process
+    - Also increase max_lookup_visit_count to 35000 cause a real font file hit
+    previous limit 20000 and some lookups are dropped unexpectedly
+
+ src/hb-ot-layout-common.hh                         |   6 +++---
+ src/hb-ot-layout-gsubgpos.hh                       |  24 +++++++++++++--------
+ ...Bold.default.627,644,623,62D,644,627,645,2E.ttf | Bin 11372 -> 19032 bytes
+ ...toNastaliqUrdu-Bold.default.627,644,62D,628.ttf | Bin 17640 -> 25608 bytes
+ .../NotoNastaliqUrdu-Bold.default.627,644.ttf      | Bin 3512 -> 8040 bytes
+ ...rdu-Bold.default.633,645,627,621,20,644,627.ttf | Bin 12360 -> 22776 bytes
+ .../NotoNastaliqUrdu-Bold.default.63A,64A,631.ttf  | Bin 19340 -> 27772 bytes
+ ...taliqUrdu-Bold.default.retain-all-codepoint.ttf | Bin 0 -> 543364 bytes
+ ....retain-gids.627,644,623,62D,644,627,645,2E.ttf | Bin 18208 -> 25868 bytes
+ ...staliqUrdu-Bold.retain-gids.627,644,62D,628.ttf | Bin 23704 -> 31676 bytes
+ .../NotoNastaliqUrdu-Bold.retain-gids.627,644.ttf  | Bin 9160 -> 13688 bytes
+ ...Bold.retain-gids.633,645,627,621,20,644,627.ttf | Bin 18164 -> 28580 bytes
+ ...toNastaliqUrdu-Bold.retain-gids.63A,64A,631.ttf | Bin 25392 -> 33824 bytes
+ ...qUrdu-Bold.retain-gids.retain-all-codepoint.ttf | Bin 0 -> 543364 bytes
+ test/subset/data/fonts/NotoNastaliqUrdu-Bold.ttf   | Bin 459600 -> 589224 bytes
+ .../data/tests/layout.notonastaliqurdu.tests       |   1 +
+ 16 files changed, 19 insertions(+), 12 deletions(-)
+
+commit 441877f56aa09bc848a8860007232a7be5e179d9
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Dec 9 16:38:05 2021 -0800
+
+    [repacker] add test case for using max priority to resolve an overflow.
+
+ src/test-repacker.cc | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 73 insertions(+)
+
+commit be2c488e5d20db18e3ee82dee6a22056ed526add
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Dec 9 15:44:06 2021 -0800
+
+    [repacker] Improve vertex priority packing.
+    
+    Previous priority implementation would move a node further back within it's layer, but at max priority was unable to move any further up than that. This updates the implementation to have 3 priority levels:
+    1. Distance is reduced by half of table size.
+    2. Distance is reduced by full table size (move to beginning of the layer).
+    3. Distance is set to 0. Vertex will be packed as soon as possible.
+    
+    Also makes the iterative resolutions aware of max priority, so it won't keep trying to raise priority beyond the maximum.
+
+ src/hb-repacker.hh | 38 +++++++++++++++++++++++++++++---------
+ 1 file changed, 29 insertions(+), 9 deletions(-)
+
+commit 2404617a605cd8c419fe67afa012ddc90a24c685
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Wed Dec 8 21:10:22 2021 -0500
+
+    Update language system tag registry to OT 1.9
+
+ src/gen-tag-table.py   | 11 +++++++++--
+ src/hb-ot-tag-table.hh | 14 +++++++++++++-
+ 2 files changed, 22 insertions(+), 3 deletions(-)
+
+commit 002a1f70b81d56b882bd5a68ebdc22c015e88f7f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 8 10:45:30 2021 -0800
+
+    [ft] Disable vertical funcs if HB_NO_VERTICAL
+
+ src/hb-ft.cc | 15 ++++++++++++---
+ 1 file changed, 12 insertions(+), 3 deletions(-)
+
+commit ef14cad736e499f42281e09d3835ad667245e4be
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 8 10:43:52 2021 -0800
+
+    [GPOS] Disable vertical advance if HB_NO_VERTICAL
+
+ src/hb-ot-layout-gpos-table.hh | 8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+commit 6ed22de1279f7e68666bd9f024a80a4a48a1a467
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 8 10:40:40 2021 -0800
+
+    [CONFIG] Fix HB_NO_VERTICAL build without HB_TINY
+
+ src/hb-ot-glyf-table.hh | 12 ++++++++++--
+ src/hb-ot-metrics.cc    |  2 ++
+ 2 files changed, 12 insertions(+), 2 deletions(-)
+
+commit 53eebc7cd2680a41c3e7c7ac363b7ecc1355d655
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 8 08:32:41 2021 -0800
+
+    [CONFIG] Add HB_NO_VERTICAL
+
+ src/hb-ot-face-table-list.hh |  2 ++
+ src/hb-ot-font.cc            | 18 +++++++++++++++---
+ src/hb-ot-glyf-table.hh      | 25 ++++++++++++++++++++++---
+ src/hb-ot-hmtx-table.hh      |  9 ++++++++-
+ src/hb-ot-metrics.cc         |  5 +++++
+ src/hb-ot-shape.cc           |  4 ++++
+ 6 files changed, 56 insertions(+), 7 deletions(-)
+
+commit 9bc5d2903a6c1669a3bd8aa47f42d34c6bbcf763
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 8 08:16:17 2021 -0800
+
+    [TINY] Don't disable VORG table in any config profile
+    
+    Is needed for vertical layout of CFF fonts.
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/discussions/3294#discussioncomment-1770313
+
+ src/hb-ot-face-table-list.hh | 2 +-
+ src/hb-ot-font.cc            | 2 --
+ 2 files changed, 1 insertion(+), 3 deletions(-)
+
+commit 3e4a25098df348c459f57829d84c4b0ebb3efc97
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Dec 6 16:00:15 2021 -0800
+
+    [repacker] add a maximum number of roots that can be moved in one iteration.
+    
+    Set to half of the roots in a space. This prevents the repacker from moving all roots in a space to a new space if their are overflows in every root.
+
+ src/hb-repacker.hh | 21 ++++++++++++---------
+ 1 file changed, 12 insertions(+), 9 deletions(-)
+
+commit 02b12d7965710de93fa4b42617113e66ddf19add
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Dec 6 15:23:35 2021 -0800
+
+    [repacker] Move all overflowing roots to a new space simultaneously.
+
+ src/hb-repacker.hh | 69 +++++++++++++++++++++++++++++++++++++-----------------
+ 1 file changed, 47 insertions(+), 22 deletions(-)
+
+commit fa966bcc29e84a579fc32af7663a50bfe7814b1a
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Dec 6 12:54:19 2021 -0800
+
+    [repacker] create repacker output buffer after final length is known.
+    
+    Don't rely on a buffer provided by the caller, as it may not be large enough.
+
+ src/hb-repacker.hh   | 60 ++++++++++++++++++++++++++----------
+ src/hb-subset.cc     | 18 +++++------
+ src/test-repacker.cc | 87 ++++++++++++++++++----------------------------------
+ 3 files changed, 80 insertions(+), 85 deletions(-)
+
+commit 51655a078e599c532b739c1e58556d873dabf6b0
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Sun Dec 5 19:27:57 2021 -0800
+
+    [subset] COLR : only include glyphs after COLR closure
+
+ src/hb-ot-color-colr-table.hh                         |  18 ++++++++++++------
+ src/hb-subset-plan.cc                                 |   4 +++-
+ src/hb-subset-plan.hh                                 |   1 +
+ test/subset/data/Makefile.am                          |   1 +
+ test/subset/data/Makefile.sources                     |   1 +
+ .../colr_glyphs/BungeeColor-Regular.default.41.ttf    | Bin 0 -> 1664 bytes
+ .../BungeeColor-Regular.drop-hints-retain-gids.41.ttf | Bin 0 -> 3384 bytes
+ .../colr_glyphs/BungeeColor-Regular.drop-hints.41.ttf | Bin 0 -> 1656 bytes
+ .../BungeeColor-Regular.retain-gids.41.ttf            | Bin 0 -> 3392 bytes
+ test/subset/data/fonts/BungeeColor-Regular.ttf        | Bin 0 -> 75348 bytes
+ test/subset/data/tests/colr_glyphs.tests              |  11 +++++++++++
+ test/subset/meson.build                               |   1 +
+ 12 files changed, 30 insertions(+), 7 deletions(-)
+
+commit 70f8c57e5c72697bdd2dc84b3573e1e90a94d681
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Dec 4 19:49:23 2021 -0800
+
+    [buffer] Rename find_min_cluster
+
+ src/hb-buffer.cc | 7 ++++---
+ src/hb-buffer.hh | 8 ++++----
+ 2 files changed, 8 insertions(+), 7 deletions(-)
+
+commit 94d43c008ab4ec2281b693af1f4014b1ebce1b14
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Dec 4 16:56:39 2021 -0800
+
+    [buffer] Merge and rename clear_glyph_flags()
+
+ src/hb-buffer.hh               | 5 ++---
+ src/hb-coretext.cc             | 2 +-
+ src/hb-directwrite.cc          | 2 +-
+ src/hb-fallback-shape.cc       | 2 +-
+ src/hb-graphite2.cc            | 2 +-
+ src/hb-ot-layout-gsub-table.hh | 2 +-
+ src/hb-uniscribe.cc            | 2 +-
+ 7 files changed, 8 insertions(+), 9 deletions(-)
+
+commit b95d252fabca73ded3c7529ba726499ec6dcda5d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 3 11:49:55 2021 -0700
+
+    [CONFIG] Add HB_CONFIG_OVERRIDE_H to simplify config overrides
+
+ CONFIG.md        | 15 +++++++++++----
+ src/hb-config.hh |  7 +++++--
+ 2 files changed, 16 insertions(+), 6 deletions(-)
+
+commit 74b46b29e7ebb8521fdbf92325a3798083381237
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Thu Dec 2 19:50:16 2021 -0800
+
+    [subset] MATH: don't serialize coverage table when iterator is empty
+    
+    when iterator is empty, just set coverage offset to 0.
+    serialize() in coverage will at lease write out a 16-bit format header.
+
+ src/hb-ot-math-table.hh                                |  10 +++++++---
+ test/subset/data/Makefile.am                           |   1 +
+ test/subset/data/Makefile.sources                      |   1 +
+ .../Caudex-Regular.default.retain-all-codepoint.ttf    | Bin 0 -> 417604 bytes
+ ...Caudex-Regular.glyph-names.retain-all-codepoint.ttf | Bin 0 -> 436712 bytes
+ ...r.keep-all-layout-features.retain-all-codepoint.ttf | Bin 0 -> 417604 bytes
+ ...dex-Regular.notdef-outline.retain-all-codepoint.ttf | Bin 0 -> 417780 bytes
+ ...Caudex-Regular.retain-gids.retain-all-codepoint.ttf | Bin 0 -> 417620 bytes
+ test/subset/data/fonts/Caudex-Regular.ttf              | Bin 0 -> 466324 bytes
+ test/subset/data/tests/math_coverage_offset.tests      |  12 ++++++++++++
+ test/subset/meson.build                                |   1 +
+ 11 files changed, 22 insertions(+), 3 deletions(-)
+
+commit 1d9ef3a75a445a52d084e805d4abdbaaa4c782d7
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Dec 1 10:30:27 2021 -0800
+
+    [subset] Actually fix end_cp unitialized warning.
+
+ src/hb-ot-cmap-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit d8635dfe5a06d1112ea563dcef788097b7b124af
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Dec 1 10:14:10 2021 -0800
+
+    [subset] Fix warning about uninitialized use of end_cp.
+
+ src/hb-ot-cmap-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 6c81cd9543f35cbc54e938b402355990a3b0859c
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Dec 1 19:29:34 2021 +0200
+
+    [tests] Add tests for platform shapers
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/3115
+
+ test/shape/data/in-house/meson.build             | 14 +++++++++++++-
+ test/shape/data/in-house/tests/coretext.tests    |  1 +
+ test/shape/data/in-house/tests/directwrite.tests |  1 +
+ test/shape/data/in-house/tests/uniscribe.tests   |  1 +
+ test/shape/meson.build                           | 11 +++++++++++
+ 5 files changed, 27 insertions(+), 1 deletion(-)
+
+commit 7608b191672972efdc69ce49c22001346f5470c0
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Dec 1 18:57:21 2021 +0200
+
+    [directwrite] Set unsafe to break flag
+    
+    Like the rest of platform shapers. Otherwise hb-shape --verify goes
+    crazy.
+
+ src/hb-directwrite.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 361a438658dcddea29d7c8b9c68bf2bc88109bde
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Dec 1 03:16:46 2021 +0200
+
+    Revert "Revert "[hb-directwrite] Don't load dwrit.dll dynamically""
+    
+    This reverts commit ecbe224743c205c99aa459b27e7fb241cc4b1dc5.
+    
+    It was causing directwrite shaper to crash in MSVC builds.
+
+ src/hb-directwrite.cc | 36 ++----------------------------------
+ 1 file changed, 2 insertions(+), 34 deletions(-)
+
+commit 549e2b7038282e34f83b54b36fabf02de0cbfcae
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Dec 1 03:16:26 2021 +0200
+
+    Revert "Remove direct link to dwrite from meson scripts"
+    
+    This reverts commit 6ea6c581edb3cecf1b4b42854e37b40d6d067cd3.
+
+ meson.build     | 7 ++++++-
+ src/meson.build | 1 +
+ 2 files changed, 7 insertions(+), 1 deletion(-)
+
+commit 071aea42c28e84e89b550de03cbd0094382f634c
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Nov 30 16:16:06 2021 -0800
+
+    [iter] add specialized implementation for hb_concat forward when iterators are not random access.
+
+ src/hb-iter.hh   | 20 +++++++++++++++-----
+ src/test-iter.cc | 19 +++++++++++++++++++
+ 2 files changed, 34 insertions(+), 5 deletions(-)
+
+commit 2e935514d9790f6f8a7f6639c9564b3d7237d6d3
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Nov 30 16:02:05 2021 -0800
+
+    [iter] fix forward implementation in hb_concat().
+    
+    Add test coverage for forward.
+
+ src/hb-iter.hh   |  6 ++++--
+ src/test-iter.cc | 22 ++++++++++++++++++++++
+ 2 files changed, 26 insertions(+), 2 deletions(-)
+
+commit 39e76af19ed6ab798d4671ff3e7a4b71e2abe6cf
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Nov 30 15:25:40 2021 -0800
+
+    [subset] add all_links () to object_t.
+    
+    Helper to provide easy access to concatenated real and virtual links iterator.
+
+ src/hb-repacker.hh  | 44 +++++++++++++++-----------------------------
+ src/hb-serialize.hh |  5 +++++
+ 2 files changed, 20 insertions(+), 29 deletions(-)
+
+commit 9121ed0cecab2296ee2a18042ed89c0ce95dbbaa
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Nov 30 13:45:22 2021 -0800
+
+    [subset] Improve sharing of Ligature subtables.
+    
+    Ligature subtables use virtual links to enforce an ordering constraint between the subtables and the coverage table. Unfortunately this has the sideeffect of prevent the subtables from being shared by another Ligature with a different coverage table since object equality compares all links real and virtual. This change makes virtual links stored separately from real links and updates the equality check to only check real links. If an object is de-duped any virtual links it has are merged into the object that replaces it.
+
+ src/hb-repacker.hh                                 |  84 +++++++-----
+ src/hb-serialize.hh                                |  50 ++++---
+ src/test-repacker.cc                               | 150 +++++++++++++--------
+ ...ic-Regular.layout-test.retain-all-codepoint.ttf | Bin 46544 -> 46524 bytes
+ ...Howrah-Regular.default.retain-all-codepoint.ttf | Bin 174024 -> 173756 bytes
+ ...rah-Regular.drop-hints.retain-all-codepoint.ttf | Bin 99288 -> 99020 bytes
+ ...ah-Regular.retain-gids.retain-all-codepoint.ttf | Bin 174324 -> 174056 bytes
+ ...toNastaliqUrdu-Bold.default.627,644,62D,628.ttf | Bin 17732 -> 17640 bytes
+ .../NotoNastaliqUrdu-Bold.default.63A,64A,631.ttf  | Bin 19432 -> 19340 bytes
+ ...staliqUrdu-Bold.retain-gids.627,644,62D,628.ttf | Bin 23792 -> 23704 bytes
+ ...toNastaliqUrdu-Bold.retain-gids.63A,64A,631.ttf | Bin 25484 -> 25392 bytes
+ ...hnadevaraya-Regular.default.c30,c36,c40,c4d.ttf | Bin 10860 -> 10848 bytes
+ ...varaya-Regular.default.retain-all-codepoint.ttf | Bin 572812 -> 572104 bytes
+ ...evaraya-Regular.glyph-names.c30,c36,c40,c4d.ttf | Bin 11292 -> 11280 bytes
+ ...ya-Regular.glyph-names.retain-all-codepoint.ttf | Bin 608460 -> 607752 bytes
+ ...raya-Regular.notdef-outline.c30,c36,c40,c4d.ttf | Bin 10940 -> 10928 bytes
+ ...Regular.notdef-outline.retain-all-codepoint.ttf | Bin 572892 -> 572184 bytes
+ ...evaraya-Regular.retain-gids.c30,c36,c40,c4d.ttf | Bin 16880 -> 16868 bytes
+ ...ya-Regular.retain-gids.retain-all-codepoint.ttf | Bin 572824 -> 572116 bytes
+ 19 files changed, 181 insertions(+), 103 deletions(-)
+
+commit ca227411102b615edb40a78d2355d2f6cf5291c5
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Nov 30 12:53:15 2021 -0800
+
+    [iter] add hb_concat (a, b).
+    
+    Iterates over a, and then over b.
+
+ src/hb-iter.hh   | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/test-iter.cc | 33 +++++++++++++++++++++++++
+ 2 files changed, 106 insertions(+)
+
+commit 95329081c2c6e7f763b466ea3cfc9630ddb23dcf
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Nov 26 16:18:42 2021 -0800
+
+    [subset] further optimize cmap4 packing.
+
+ src/hb-ot-cmap-table.hh                            |  48 +++++++++++++++------
+ ...aa-Regular-new.default.retain-all-codepoint.ttf | Bin 222692 -> 222684 bytes
+ ...drop-hints-retain-gids.retain-all-codepoint.ttf | Bin 191568 -> 191560 bytes
+ ...Regular-new.drop-hints.retain-all-codepoint.ttf | Bin 191520 -> 191512 bytes
+ ...ortaa-Regular-new.gids.retain-all-codepoint.ttf | Bin 222692 -> 222684 bytes
+ ...egular-new.glyph-names.retain-all-codepoint.ttf | Bin 229684 -> 229676 bytes
+ ...ep-all-layout-features.retain-all-codepoint.ttf | Bin 223388 -> 223380 bytes
+ ...ar-new.layout-features.retain-all-codepoint.ttf | Bin 220884 -> 220876 bytes
+ ...a-Regular-new.name-ids.retain-all-codepoint.ttf | Bin 222432 -> 222424 bytes
+ ...lar-new.name-languages.retain-all-codepoint.ttf | Bin 222692 -> 222684 bytes
+ ...egular-new.name-legacy.retain-all-codepoint.ttf | Bin 222692 -> 222684 bytes
+ ...o-prune-unicode-ranges.retain-all-codepoint.ttf | Bin 222692 -> 222684 bytes
+ ...lar-new.notdef-outline.retain-all-codepoint.ttf | Bin 223288 -> 223280 bytes
+ ...egular-new.retain-gids.retain-all-codepoint.ttf | Bin 222740 -> 222732 bytes
+ ...tu-Regular.glyph-names.retain-all-codepoint.ttf | Bin 280064 -> 280056 bytes
+ ...traLightItalic.default.retain-all-codepoint.ttf | Bin 134364 -> 134344 bytes
+ ...ightItalic.glyph-names.retain-all-codepoint.ttf | Bin 145640 -> 145620 bytes
+ ...tItalic.notdef-outline.retain-all-codepoint.ttf | Bin 134492 -> 134472 bytes
+ ...ns-BlackItalic.default.retain-all-codepoint.ttf | Bin 120040 -> 120020 bytes
+ ...lackItalic.glyph-names.retain-all-codepoint.ttf | Bin 132284 -> 132264 bytes
+ ...kItalic.notdef-outline.retain-all-codepoint.ttf | Bin 120040 -> 120020 bytes
+ .../Tinos-Italic.default.retain-all-codepoint.ttf  | Bin 410180 -> 410092 bytes
+ ...nos-Italic.glyph-names.retain-all-codepoint.ttf | Bin 435008 -> 434920 bytes
+ ...-Italic.notdef-outline.retain-all-codepoint.ttf | Bin 410180 -> 410092 bytes
+ ...nos-Italic.retain-gids.retain-all-codepoint.ttf | Bin 412556 -> 412468 bytes
+ ...wLatin-Regular.default.retain-all-codepoint.ttf | Bin 130076 -> 129952 bytes
+ ...in-Regular.layout-test.retain-all-codepoint.ttf | Bin 152052 -> 151928 bytes
+ ...in-Regular.retain-gids.retain-all-codepoint.ttf | Bin 133180 -> 133056 bytes
+ ...woMath-Regular.default.retain-all-codepoint.ttf | Bin 1033572 -> 1033528 bytes
+ ...th-Regular.glyph-names.retain-all-codepoint.ttf | Bin 1086348 -> 1086304 bytes
+ ...Regular.notdef-outline.retain-all-codepoint.ttf | Bin 1033820 -> 1033776 bytes
+ ...th-Regular.retain-gids.retain-all-codepoint.ttf | Bin 1048752 -> 1048716 bytes
+ 32 files changed, 36 insertions(+), 12 deletions(-)
+
+commit 599143824c39b3cf37c3cb714364b58d45fc0d3d
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Nov 26 14:19:39 2021 -0800
+
+    [subset] Don't pad glyphs when using long loca.
+
+ src/hb-ot-glyf-table.hh                            |  36 +++++++++++++--------
+ ...tu-Regular.glyph-names.retain-all-codepoint.ttf | Bin 280296 -> 280064 bytes
+ ...Howrah-Regular.default.retain-all-codepoint.ttf | Bin 174308 -> 174024 bytes
+ ...ah-Regular.retain-gids.retain-all-codepoint.ttf | Bin 174608 -> 174324 bytes
+ .../Tinos-Italic.default.retain-all-codepoint.ttf  | Bin 410932 -> 410180 bytes
+ ...nos-Italic.glyph-names.retain-all-codepoint.ttf | Bin 435760 -> 435008 bytes
+ ...-Italic.notdef-outline.retain-all-codepoint.ttf | Bin 410932 -> 410180 bytes
+ ...nos-Italic.retain-gids.retain-all-codepoint.ttf | Bin 413308 -> 412556 bytes
+ ...woMath-Regular.default.retain-all-codepoint.ttf | Bin 1035756 -> 1033572 bytes
+ ...th-Regular.glyph-names.retain-all-codepoint.ttf | Bin 1088532 -> 1086348 bytes
+ ...Regular.notdef-outline.retain-all-codepoint.ttf | Bin 1036004 -> 1033820 bytes
+ ...th-Regular.retain-gids.retain-all-codepoint.ttf | Bin 1050936 -> 1048752 bytes
+ ...varaya-Regular.default.retain-all-codepoint.ttf | Bin 573428 -> 572812 bytes
+ ...ya-Regular.glyph-names.retain-all-codepoint.ttf | Bin 609076 -> 608460 bytes
+ ...Regular.notdef-outline.retain-all-codepoint.ttf | Bin 573508 -> 572892 bytes
+ ...ya-Regular.retain-gids.retain-all-codepoint.ttf | Bin 573440 -> 572824 bytes
+ 16 files changed, 22 insertions(+), 14 deletions(-)
+
+commit d9660fd58a3ade1c8962e5cd3f7538a5b5189262
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Nov 25 18:15:35 2021 -0800
+
+    [subset] Make cmap4 packing more optimal.
+    
+    The current CMAP4 implementation uses whatever the current codepoint ranges are and then encodes them as indivudal glyph ids or as a delta if possible. However, it's often possible to save bytes by splitting up existing ranges and encoding parts of them using deltas where the cost of splitting the range is less than encoding each glyph individual.
+
+ src/hb-ot-cmap-table.hh                            | 246 ++++++++++++---------
+ ...aa-Regular-new.default.retain-all-codepoint.ttf | Bin 222756 -> 222692 bytes
+ ...drop-hints-retain-gids.retain-all-codepoint.ttf | Bin 191632 -> 191568 bytes
+ ...Regular-new.drop-hints.retain-all-codepoint.ttf | Bin 191584 -> 191520 bytes
+ ...ortaa-Regular-new.gids.retain-all-codepoint.ttf | Bin 222756 -> 222692 bytes
+ ...egular-new.glyph-names.retain-all-codepoint.ttf | Bin 229748 -> 229684 bytes
+ ...ep-all-layout-features.retain-all-codepoint.ttf | Bin 223452 -> 223388 bytes
+ ...ar-new.layout-features.retain-all-codepoint.ttf | Bin 220948 -> 220884 bytes
+ ...a-Regular-new.name-ids.retain-all-codepoint.ttf | Bin 222496 -> 222432 bytes
+ ...lar-new.name-languages.retain-all-codepoint.ttf | Bin 222756 -> 222692 bytes
+ ...egular-new.name-legacy.retain-all-codepoint.ttf | Bin 222756 -> 222692 bytes
+ ...o-prune-unicode-ranges.retain-all-codepoint.ttf | Bin 222756 -> 222692 bytes
+ ...lar-new.notdef-outline.retain-all-codepoint.ttf | Bin 223352 -> 223288 bytes
+ ...egular-new.retain-gids.retain-all-codepoint.ttf | Bin 222804 -> 222740 bytes
+ ...tu-Regular.glyph-names.retain-all-codepoint.ttf | Bin 281092 -> 280296 bytes
+ ...Gothic-Regular.default.retain-all-codepoint.ttf | Bin 44584 -> 44544 bytes
+ ...ic-Regular.layout-test.retain-all-codepoint.ttf | Bin 46584 -> 46544 bytes
+ ...ic-Regular.retain-gids.retain-all-codepoint.ttf | Bin 44592 -> 44552 bytes
+ ...traLightItalic.default.retain-all-codepoint.ttf | Bin 134520 -> 134364 bytes
+ ...ightItalic.glyph-names.retain-all-codepoint.ttf | Bin 145796 -> 145640 bytes
+ ...tItalic.notdef-outline.retain-all-codepoint.ttf | Bin 134648 -> 134492 bytes
+ ...ns-BlackItalic.default.retain-all-codepoint.ttf | Bin 120236 -> 120040 bytes
+ ...lackItalic.glyph-names.retain-all-codepoint.ttf | Bin 132480 -> 132284 bytes
+ ...kItalic.notdef-outline.retain-all-codepoint.ttf | Bin 120236 -> 120040 bytes
+ .../Tinos-Italic.default.retain-all-codepoint.ttf  | Bin 412764 -> 410932 bytes
+ ...nos-Italic.glyph-names.retain-all-codepoint.ttf | Bin 437592 -> 435760 bytes
+ ...-Italic.notdef-outline.retain-all-codepoint.ttf | Bin 412764 -> 410932 bytes
+ ...nos-Italic.retain-gids.retain-all-codepoint.ttf | Bin 415140 -> 413308 bytes
+ ...wLatin-Regular.default.retain-all-codepoint.ttf | Bin 131672 -> 130076 bytes
+ ...in-Regular.layout-test.retain-all-codepoint.ttf | Bin 153648 -> 152052 bytes
+ ...in-Regular.retain-gids.retain-all-codepoint.ttf | Bin 134776 -> 133180 bytes
+ ...woMath-Regular.default.retain-all-codepoint.ttf | Bin 1038580 -> 1035756 bytes
+ ...th-Regular.glyph-names.retain-all-codepoint.ttf | Bin 1091356 -> 1088532 bytes
+ ...Regular.notdef-outline.retain-all-codepoint.ttf | Bin 1038828 -> 1036004 bytes
+ ...th-Regular.retain-gids.retain-all-codepoint.ttf | Bin 1053656 -> 1050936 bytes
+ 35 files changed, 143 insertions(+), 103 deletions(-)
+
+commit 8aed5c21a31eece6a9f3cd775fda8facb6c28b9b
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Fri Nov 26 17:54:18 2021 +0200
+
+    3.1.2
+
+ NEWS             | 9 +++++++++
+ configure.ac     | 2 +-
+ meson.build      | 2 +-
+ src/hb-version.h | 4 ++--
+ 4 files changed, 13 insertions(+), 4 deletions(-)
+
+commit 720ab0883b4bd7daa32a3c46031a9d8adb5c8a5f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 25 11:49:16 2021 -0700
+
+    [util] Add --single-par
+    
+    Use it in aots tests
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/3129
+    Related https://github.com/harfbuzz/harfbuzz/issues/3298
+
+ test/shape/data/aots/hb-aots-tester.cpp            |  2 +-
+ test/shape/data/aots/tests/classdef1.tests         |  2 +-
+ test/shape/data/aots/tests/classdef1_empty.tests   |  2 +-
+ .../shape/data/aots/tests/classdef1_multiple.tests |  2 +-
+ test/shape/data/aots/tests/classdef1_single.tests  |  2 +-
+ test/shape/data/aots/tests/classdef2.tests         |  2 +-
+ test/shape/data/aots/tests/classdef2_empty.tests   |  2 +-
+ .../shape/data/aots/tests/classdef2_multiple.tests |  2 +-
+ test/shape/data/aots/tests/classdef2_single.tests  |  2 +-
+ test/shape/data/aots/tests/cmap0.tests             |  2 +-
+ test/shape/data/aots/tests/cmap10.tests            |  4 ++--
+ test/shape/data/aots/tests/cmap12.tests            |  2 +-
+ test/shape/data/aots/tests/cmap2.tests             |  2 +-
+ test/shape/data/aots/tests/cmap4.tests             | 12 ++++++------
+ test/shape/data/aots/tests/cmap6.tests             |  4 ++--
+ test/shape/data/aots/tests/cmap8.tests             |  2 +-
+ .../shape/data/aots/tests/gpos1_1_lookupflag.tests |  2 +-
+ test/shape/data/aots/tests/gpos1_1_simple.tests    |  8 ++++----
+ test/shape/data/aots/tests/gpos1_2.tests           |  2 +-
+ .../shape/data/aots/tests/gpos1_2_lookupflag.tests |  2 +-
+ test/shape/data/aots/tests/gpos2_1.tests           |  4 ++--
+ .../shape/data/aots/tests/gpos2_1_lookupflag.tests |  4 ++--
+ .../shape/data/aots/tests/gpos2_1_next_glyph.tests |  4 ++--
+ test/shape/data/aots/tests/gpos2_1_simple.tests    |  4 ++--
+ test/shape/data/aots/tests/gpos2_2.tests           | 10 +++++-----
+ test/shape/data/aots/tests/gpos3.tests             | 22 +++++++++++-----------
+ test/shape/data/aots/tests/gpos3_lookupflag.tests  |  4 ++--
+ test/shape/data/aots/tests/gpos4_lookupflag.tests  |  4 ++--
+ .../data/aots/tests/gpos4_multiple_anchors.tests   |  2 +-
+ test/shape/data/aots/tests/gpos4_simple.tests      | 10 +++++-----
+ test/shape/data/aots/tests/gpos5.tests             |  4 ++--
+ test/shape/data/aots/tests/gpos6.tests             |  6 +++---
+ test/shape/data/aots/tests/gpos7_1.tests           |  4 ++--
+ test/shape/data/aots/tests/gpos9.tests             |  4 ++--
+ .../data/aots/tests/gpos_chaining1_boundary.tests  |  8 ++++----
+ .../aots/tests/gpos_chaining1_lookupflag.tests     |  2 +-
+ .../tests/gpos_chaining1_multiple_subrules.tests   |  4 ++--
+ .../aots/tests/gpos_chaining1_next_glyph.tests     |  2 +-
+ .../data/aots/tests/gpos_chaining1_simple.tests    | 22 +++++++++++-----------
+ .../aots/tests/gpos_chaining1_successive.tests     |  2 +-
+ .../data/aots/tests/gpos_chaining2_boundary.tests  |  8 ++++----
+ .../aots/tests/gpos_chaining2_lookupflag.tests     |  2 +-
+ .../tests/gpos_chaining2_multiple_subrules.tests   |  4 ++--
+ .../aots/tests/gpos_chaining2_next_glyph.tests     |  2 +-
+ .../data/aots/tests/gpos_chaining2_simple.tests    | 22 +++++++++++-----------
+ .../aots/tests/gpos_chaining2_successive.tests     |  2 +-
+ .../data/aots/tests/gpos_chaining3_boundary.tests  |  8 ++++----
+ .../aots/tests/gpos_chaining3_lookupflag.tests     |  2 +-
+ .../aots/tests/gpos_chaining3_next_glyph.tests     |  2 +-
+ .../data/aots/tests/gpos_chaining3_simple.tests    | 22 +++++++++++-----------
+ .../aots/tests/gpos_chaining3_successive.tests     |  2 +-
+ .../data/aots/tests/gpos_context1_boundary.tests   |  4 ++--
+ .../data/aots/tests/gpos_context1_expansion.tests  |  2 +-
+ .../data/aots/tests/gpos_context1_lookupflag.tests |  4 ++--
+ .../tests/gpos_context1_multiple_subrules.tests    |  4 ++--
+ .../data/aots/tests/gpos_context1_next_glyph.tests |  2 +-
+ .../data/aots/tests/gpos_context1_simple.tests     |  6 +++---
+ .../data/aots/tests/gpos_context1_successive.tests |  2 +-
+ .../data/aots/tests/gpos_context2_boundary.tests   |  4 ++--
+ .../data/aots/tests/gpos_context2_classes.tests    |  4 ++--
+ .../data/aots/tests/gpos_context2_expansion.tests  |  2 +-
+ .../data/aots/tests/gpos_context2_lookupflag.tests |  4 ++--
+ .../tests/gpos_context2_multiple_subrules.tests    |  4 ++--
+ .../data/aots/tests/gpos_context2_next_glyph.tests |  2 +-
+ .../data/aots/tests/gpos_context2_simple.tests     |  6 +++---
+ .../data/aots/tests/gpos_context2_successive.tests |  2 +-
+ .../data/aots/tests/gpos_context3_boundary.tests   |  4 ++--
+ .../data/aots/tests/gpos_context3_lookupflag.tests |  4 ++--
+ .../data/aots/tests/gpos_context3_next_glyph.tests |  2 +-
+ .../data/aots/tests/gpos_context3_simple.tests     |  4 ++--
+ .../data/aots/tests/gpos_context3_successive.tests |  2 +-
+ .../shape/data/aots/tests/gsub1_1_lookupflag.tests |  2 +-
+ test/shape/data/aots/tests/gsub1_1_modulo.tests    |  2 +-
+ test/shape/data/aots/tests/gsub1_1_simple.tests    |  2 +-
+ .../shape/data/aots/tests/gsub1_2_lookupflag.tests |  2 +-
+ test/shape/data/aots/tests/gsub1_2_simple.tests    |  2 +-
+ .../shape/data/aots/tests/gsub2_1_lookupflag.tests |  2 +-
+ .../aots/tests/gsub2_1_multiple_sequences.tests    |  2 +-
+ test/shape/data/aots/tests/gsub2_1_simple.tests    |  4 ++--
+ .../shape/data/aots/tests/gsub3_1_lookupflag.tests |  2 +-
+ test/shape/data/aots/tests/gsub3_1_multiple.tests  |  2 +-
+ test/shape/data/aots/tests/gsub3_1_simple.tests    |  2 +-
+ .../shape/data/aots/tests/gsub4_1_lookupflag.tests |  2 +-
+ .../aots/tests/gsub4_1_multiple_ligatures.tests    |  4 ++--
+ .../data/aots/tests/gsub4_1_multiple_ligsets.tests |  2 +-
+ test/shape/data/aots/tests/gsub4_1_simple.tests    |  2 +-
+ test/shape/data/aots/tests/gsub7.tests             |  4 ++--
+ .../data/aots/tests/gsub_chaining1_boundary.tests  |  8 ++++----
+ .../aots/tests/gsub_chaining1_lookupflag.tests     |  2 +-
+ .../tests/gsub_chaining1_multiple_subrules.tests   |  4 ++--
+ .../aots/tests/gsub_chaining1_next_glyph.tests     |  2 +-
+ .../data/aots/tests/gsub_chaining1_simple.tests    | 22 +++++++++++-----------
+ .../aots/tests/gsub_chaining1_successive.tests     |  2 +-
+ .../data/aots/tests/gsub_chaining2_boundary.tests  |  8 ++++----
+ .../aots/tests/gsub_chaining2_lookupflag.tests     |  2 +-
+ .../tests/gsub_chaining2_multiple_subrules.tests   |  4 ++--
+ .../aots/tests/gsub_chaining2_next_glyph.tests     |  2 +-
+ .../data/aots/tests/gsub_chaining2_simple.tests    | 22 +++++++++++-----------
+ .../aots/tests/gsub_chaining2_successive.tests     |  2 +-
+ .../data/aots/tests/gsub_chaining3_boundary.tests  |  8 ++++----
+ .../aots/tests/gsub_chaining3_lookupflag.tests     |  2 +-
+ .../aots/tests/gsub_chaining3_next_glyph.tests     |  2 +-
+ .../data/aots/tests/gsub_chaining3_simple.tests    | 22 +++++++++++-----------
+ .../aots/tests/gsub_chaining3_successive.tests     |  2 +-
+ .../data/aots/tests/gsub_context1_boundary.tests   |  4 ++--
+ .../data/aots/tests/gsub_context1_expansion.tests  |  2 +-
+ .../data/aots/tests/gsub_context1_lookupflag.tests |  4 ++--
+ .../tests/gsub_context1_multiple_subrules.tests    |  4 ++--
+ .../data/aots/tests/gsub_context1_next_glyph.tests |  2 +-
+ .../data/aots/tests/gsub_context1_simple.tests     |  6 +++---
+ .../data/aots/tests/gsub_context1_successive.tests |  2 +-
+ .../data/aots/tests/gsub_context2_boundary.tests   |  4 ++--
+ .../data/aots/tests/gsub_context2_classes.tests    |  4 ++--
+ .../data/aots/tests/gsub_context2_expansion.tests  |  2 +-
+ .../data/aots/tests/gsub_context2_lookupflag.tests |  4 ++--
+ .../tests/gsub_context2_multiple_subrules.tests    |  4 ++--
+ .../data/aots/tests/gsub_context2_next_glyph.tests |  2 +-
+ .../data/aots/tests/gsub_context2_simple.tests     |  6 +++---
+ .../data/aots/tests/gsub_context2_successive.tests |  2 +-
+ .../data/aots/tests/gsub_context3_boundary.tests   |  4 ++--
+ .../data/aots/tests/gsub_context3_lookupflag.tests |  4 ++--
+ .../data/aots/tests/gsub_context3_next_glyph.tests |  2 +-
+ .../data/aots/tests/gsub_context3_simple.tests     |  4 ++--
+ .../data/aots/tests/gsub_context3_successive.tests |  2 +-
+ .../data/aots/tests/lookupflag_ignore_attach.tests | 10 +++++-----
+ .../data/aots/tests/lookupflag_ignore_base.tests   |  4 ++--
+ .../aots/tests/lookupflag_ignore_combination.tests |  6 +++---
+ .../aots/tests/lookupflag_ignore_ligatures.tests   |  6 +++---
+ .../data/aots/tests/lookupflag_ignore_marks.tests  |  2 +-
+ util/text-options.hh                               | 10 ++++++----
+ 130 files changed, 296 insertions(+), 294 deletions(-)
+
+commit b58afe586f6d100df94cc3a9b716befc68d8abec
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 25 11:34:24 2021 -0700
+
+    [util] Undo treat as single-paragraph text provided on cmdline
+    
+    Reverts d92ee726ce3b2fc2c249407d977433f0badcc918
+    except that it does so even in batch mode.
+    
+    Am going to add a --single-par mode that will affect all input
+    modes.
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/3129
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/3298
+
+ util/text-options.hh | 34 ++++++++++++++++++++++++++++------
+ 1 file changed, 28 insertions(+), 6 deletions(-)
+
+commit 903a6baecefdbb8a01caed77f215560549e7dd5e
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Mon Nov 15 19:58:33 2021 -0800
+
+    [subset] layout_features filtering fix
+    
+    we should not use get_size (), which returns length * item_size
+
+ src/hb-subset-plan.cc                                 |  18 +++++++++++++++---
+ test/subset/data/Makefile.am                          |   1 +
+ test/subset/data/Makefile.sources                     |   1 +
+ .../FranklinGothic-Regular.default.61,63,68,69.ttf    | Bin 0 -> 6856 bytes
+ ...linGothic-Regular.default.retain-all-codepoint.ttf | Bin 0 -> 44584 bytes
+ ...FranklinGothic-Regular.layout-test.61,63,68,69.ttf | Bin 0 -> 7928 bytes
+ ...othic-Regular.layout-test.retain-all-codepoint.ttf | Bin 0 -> 46584 bytes
+ ...FranklinGothic-Regular.retain-gids.61,63,68,69.ttf | Bin 0 -> 7288 bytes
+ ...othic-Regular.retain-gids.retain-all-codepoint.ttf | Bin 0 -> 44592 bytes
+ test/subset/data/fonts/FranklinGothic-Regular.ttf     | Bin 0 -> 71856 bytes
+ test/subset/data/tests/layout.default_features.tests  |  11 +++++++++++
+ test/subset/meson.build                               |   1 +
+ 12 files changed, 29 insertions(+), 3 deletions(-)
+
+commit 3160789701463bcd822c26010da4de33c92c85d9
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Mon Nov 22 03:31:50 2021 +0200
+
+    [ci] windows-2016 image is going away in a bit
+    
+    https://github.com/actions/virtual-environments/issues/4312
+    
+    windows-latest is the same as windows-2019, but we are using explicit
+    windows-2019 image for when they become different.
+
+ .github/workflows/msvc-ci.yml | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit ed65577e3d896a2393aa6a92d76da1f81677d45e
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Sat Nov 20 20:51:26 2021 +0200
+
+    [ci] Split sanitizers job
+    
+    It was running four different builds sequentially. Each should have been
+    its own job.
+
+ .circleci/config.yml | 41 ++++++++++++++++++++++++++++++++++-------
+ 1 file changed, 34 insertions(+), 7 deletions(-)
+
+commit 69d8f27c69b30f2c3726f279c2daa183d954c6b0
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Sat Nov 20 17:09:15 2021 +0200
+
+    [meson] Require 0.55.0
+    
+    We implicitly require it for building ragel subproject. This new version
+    requirement should satisfied in both Fedora 33 and Debian bullseye, and
+    not be too cutting edge for us.
+
+ .circleci/config.yml     |  5 +++--
+ docs/meson.build         |  4 ++--
+ meson.build              | 39 ++++++++++-----------------------------
+ perf/meson.build         | 10 ++--------
+ src/meson.build          | 32 ++++++++------------------------
+ test/fuzzing/meson.build |  6 +++---
+ test/shape/meson.build   | 12 ++++++------
+ test/subset/meson.build  |  8 ++++----
+ 8 files changed, 38 insertions(+), 78 deletions(-)
+
+commit 84dc4e85e889d4b24cca7bb8ef04563fc6d1c3e6
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Mon Nov 8 09:36:31 2021 -0800
+
+    [subset] avoid writing out duplicate extra glyph names in post table
+    
+    Add check for possible duplicate with other name index
+
+ src/hb-ot-post-table-v2subset.hh                   |  31 +++++++++++++--------
+ test/subset/data/Makefile.am                       |   1 +
+ test/subset/data/Makefile.sources                  |   1 +
+ ...hnadevaraya-Regular.default.c30,c36,c40,c4d.ttf | Bin 0 -> 10860 bytes
+ ...varaya-Regular.default.retain-all-codepoint.ttf | Bin 0 -> 573428 bytes
+ ...evaraya-Regular.glyph-names.c30,c36,c40,c4d.ttf | Bin 0 -> 11292 bytes
+ ...ya-Regular.glyph-names.retain-all-codepoint.ttf | Bin 0 -> 609076 bytes
+ ...raya-Regular.notdef-outline.c30,c36,c40,c4d.ttf | Bin 0 -> 10940 bytes
+ ...Regular.notdef-outline.retain-all-codepoint.ttf | Bin 0 -> 573508 bytes
+ ...evaraya-Regular.retain-gids.c30,c36,c40,c4d.ttf | Bin 0 -> 16880 bytes
+ ...ya-Regular.retain-gids.retain-all-codepoint.ttf | Bin 0 -> 573440 bytes
+ .../data/fonts/SreeKrushnadevaraya-Regular.ttf     | Bin 0 -> 612636 bytes
+ test/subset/data/tests/post.tests                  |  12 ++++++++
+ test/subset/meson.build                            |   1 +
+ 14 files changed, 34 insertions(+), 12 deletions(-)
+
+commit 325f26290eef9b001df4b750f33698d2a81a47f0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 19 17:19:09 2021 -0700
+
+    [array] Fix a couple constexpr warnings
+    
+    ./subprojects/harfbuzz/src/hb-array.hh:71:25: warning: 'constexpr' non-static member function will not be implicitly 'const' in C++14; add 'const' to avoid a change in behavior [-Wconstexpr-not-const]
+      constexpr hb_array_t& operator = (const hb_array_t<U> &o)
+                            ^
+                                                                const
+    ../subprojects/harfbuzz/src/hb-array.hh:72:5: warning: use of this statement in a constexpr function is a C++14 extension [-Wc++14-extensions]
+      { arrayZ = o.arrayZ; length = o.length; backwards_length = o.backwards_length; return *this; }
+        ^
+    ../subprojects/harfbuzz/src/hb-array.hh:329:32: warning: 'constexpr' non-static member function will not be implicitly 'const' in C++14; add 'const' to avoid a change in behavior [-Wconstexpr-not-const]
+      constexpr hb_sorted_array_t& operator = (const hb_array_t<U> &o)
+                                   ^
+                                                                       const
+    ../subprojects/harfbuzz/src/hb-array.hh:330:5: warning: use of this statement in a constexpr function is a C++14 extension [-Wc++14-extensions]
+      { hb_array_t<Type> (*this) = o; return *this; }
+        ^
+    4 warnings generated.
+
+ src/hb-array.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 98fefd5dedf912aebb58990f8d74fa5fad0ddb2c
+Merge: ca418cac7 4731b1073
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 19 13:34:53 2021 -0700
+
+    Merge pull request #3301 from harfbuzz/hashmap-classes
+    
+    Hashmap classes
+
+commit ca418cac74189dbda1abf433bda4618853107f1f
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Wed Nov 17 16:42:08 2021 -0800
+
+    [subset] keep features that have FeatureParams and the tag is "size"
+
+ src/hb-ot-layout-gsubgpos.hh                           |   8 ++++++--
+ test/subset/data/Makefile.am                           |   1 +
+ test/subset/data/Makefile.sources                      |   3 ++-
+ ...C-ExtraLightItalic.default.retain-all-codepoint.ttf | Bin 0 -> 134520 bytes
+ ...traLightItalic.glyph-names.retain-all-codepoint.ttf | Bin 0 -> 145796 bytes
+ ...LightItalic.notdef-outline.retain-all-codepoint.ttf | Bin 0 -> 134648 bytes
+ test/subset/data/fonts/SpectralSC-ExtraLightItalic.ttf | Bin 0 -> 275612 bytes
+ test/subset/data/tests/layout.drop_feature.tests       |  10 ++++++++++
+ test/subset/meson.build                                |   1 +
+ 9 files changed, 20 insertions(+), 3 deletions(-)
+
+commit e88fc41ef323cf1105e30b88f726f171504cb85e
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Thu Nov 18 16:53:36 2021 -0800
+
+    [subset] inputSequence could be empty, change the sanity check
+
+ src/hb-ot-layout-gsubgpos.hh                           |   5 ++---
+ test/subset/data/Makefile.am                           |   1 +
+ test/subset/data/Makefile.sources                      |   1 +
+ ...ar.layout-test-retain-gids.retain-all-codepoint.ttf | Bin 0 -> 142456 bytes
+ ...nsNewa-Regular.layout-test.retain-all-codepoint.ttf | Bin 0 -> 142456 bytes
+ test/subset/data/fonts/NotoSansNewa-Regular.ttf        | Bin 0 -> 150892 bytes
+ test/subset/data/tests/layout.context_format2.tests    |   9 +++++++++
+ test/subset/meson.build                                |   1 +
+ 8 files changed, 14 insertions(+), 3 deletions(-)
+
+commit 4731b1073636b6ff4ff1bccbe7fb4663a2648674
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 19 12:33:37 2021 -0700
+
+    [array] Mark constructors constexpr
+    
+    ../src/hb-map.hh:44:38: note: non-constexpr constructor 'hb_array_t' cannot be used in a constant expression
+      static constexpr K INVALID_KEY   = kINVALID;
+                                         ^
+
+ src/hb-array.hh | 20 ++++++++++----------
+ 1 file changed, 10 insertions(+), 10 deletions(-)
+
+commit 1da7423ed9d96c6ed8000f2c6a971bc3ce65cb2b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 19 12:11:41 2021 -0700
+
+    [array] Add constructor taking std::nullptr_t
+    
+    Not all impls implement nullptr_t in a way that would automatically
+    convert to what we were accepting.
+    
+    In file included from ../src/test-map.cc:27:
+    ../src/hb-map.hh:44:22: error: no viable conversion from 'nullptr_t' to 'const hb_array_t<const char>'
+      static constexpr K INVALID_KEY   = kINVALID;
+                         ^               ~~~~~~~~
+
+ src/hb-array.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit e456922a769461757acc6c0628e7af28f27b16ac
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 19 12:04:08 2021 -0700
+
+    [test] Fix nullptr_t scope issue
+
+ src/test-map.cc | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 5157cac0e28204ce658d784ee1fbe0614e50c786
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 19 12:03:10 2021 -0700
+
+    [test] Silence unused-variable erros in test
+
+ src/test-map.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 394f772937851f10ef05245e32279cf08ca8399d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 19 11:49:23 2021 -0700
+
+    [map] Allow storing classes in the hashmap
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/3293
+    
+    The trick was to change the type of the invalid key/value to be non-class.
+
+ src/hb-map.hh                | 22 +++++++++++++++-------
+ src/hb-ot-layout-common.hh   |  8 ++++----
+ src/hb-ot-layout-gsubgpos.hh |  8 ++++----
+ src/hb-ot-layout.cc          |  4 ++--
+ src/hb-serialize.hh          |  4 +++-
+ src/hb-set.hh                |  6 +++---
+ src/hb-subset-plan.cc        |  2 +-
+ src/hb-subset-plan.hh        |  4 ++--
+ src/test-map.cc              |  7 +++++++
+ 9 files changed, 41 insertions(+), 24 deletions(-)
+
+commit cba17fd1015113a1176eef5a87876d4e2b19e13a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 19 11:49:03 2021 -0700
+
+    [array] Add default methods again, this time the full set
+    
+    Should add tests.
+
+ src/hb-array.hh | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+commit a75b96f7e5833c9206f6a15d11168a757a85ee59
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Nov 16 14:34:07 2021 -0800
+
+    [sanitize] In lookup sanitize don't try to access subtable 0 if it isn't there.
+
+ src/hb-ot-layout-common.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 82a9f54410d2d0188eab50c96824f52e2820b1da
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 10 10:15:38 2021 -0800
+
+    [colr] Simplify sanitize
+
+ src/hb-ot-color-colr-table.hh | 38 ++------------------------------------
+ 1 file changed, 2 insertions(+), 36 deletions(-)
+
+commit 64b29dbd5994a511acee69cb9b45ad650ef88359
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Nov 9 09:13:14 2021 -0800
+
+    [subset] reuse colrv1 max nesting depth constant for sanitize.
+
+ src/hb-ot-color-colr-table.hh | 11 ++++++-----
+ src/hb-sanitize.hh            |  7 ++-----
+ 2 files changed, 8 insertions(+), 10 deletions(-)
+
+commit ace98cc65f527dbdfaa3784957535f551c7a600a
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Nov 8 15:47:56 2021 -0800
+
+    [subset] Only sanitize recursion depth in COLR.
+
+ src/hb-ot-color-colr-table.hh                      |  49 ++++++++++++++++++++-
+ src/hb-sanitize.hh                                 |  26 +++++++----
+ ...tcase-minimized-hb-draw-fuzzer-4856957815619584 | Bin 0 -> 486280 bytes
+ 3 files changed, 65 insertions(+), 10 deletions(-)
+
+commit 782a7377adc2a13071b6dc74ddca209a8e65e4ba
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Nov 4 13:39:11 2021 -0700
+
+    [sanitize] add a maximum recursion depth for sanitize.
+
+ src/hb-sanitize.hh | 12 ++++++++++--
+ 1 file changed, 10 insertions(+), 2 deletions(-)
+
+commit cd5c6cd0419ac5e4de975d6c476fb760bf06d2ce
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Mon Nov 8 06:59:55 2021 +0200
+
+    3.1.1
+
+ NEWS             | 7 +++++++
+ configure.ac     | 2 +-
+ meson.build      | 2 +-
+ src/hb-version.h | 4 ++--
+ 4 files changed, 11 insertions(+), 4 deletions(-)
+
+commit 1e07d42aa6259f73aed09f25dd37993974b9b366
+Author: Matthias Clasen <mclasen@redhat.com>
+Date:   Sun Nov 7 01:19:42 2021 -0400
+
+    Typo fix
+
+ src/hb-ot-layout.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 1fd7fd98235649115bba7407f2a2b977bf86733c
+Author: Matthias Clasen <mclasen@redhat.com>
+Date:   Sat Nov 6 10:18:20 2021 -0400
+
+    Cosmetics: Avoid confusing indentation
+    
+    This line had me confused for a second because
+    the condition looked like a cast and the if just
+    looked misplaced. Add a line break to prevent
+    such confusion.
+
+ src/hb-ot-layout.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 3471f8f69e25ffebe96dc55173096cedc738ca6f
+Author: Matthias Clasen <mclasen@redhat.com>
+Date:   Sat Nov 6 10:17:20 2021 -0400
+
+    docs: Clarify a doc comment
+    
+    Reword the docs for hb_ot_layout_script_select_language and
+    be a bit more specific about the returned index.
+
+ src/hb-ot-layout.cc | 12 ++++++++----
+ 1 file changed, 8 insertions(+), 4 deletions(-)
+
+commit 07dc34bdaf977a3be97ab5a68455ed7a67f80a06
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 5 14:45:20 2021 -0700
+
+    [mutex] Try work around GCC cast-align error/warning
+    
+    Shouldn't be needed because of the alignas(). Oh well...
+    
+    Might fix https://github.com/harfbuzz/harfbuzz/issues/3283
+
+ src/hb-mutex.hh | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 77eeec53a917554a2766a7cb1687607841282777
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Nov 3 23:31:03 2021 +0200
+
+    3.1.0
+
+ NEWS                   | 21 +++++++++++++++++++++
+ configure.ac           |  2 +-
+ docs/harfbuzz-docs.xml |  1 +
+ meson.build            |  2 +-
+ src/hb-buffer.cc       |  4 ++--
+ src/hb-version.h       |  4 ++--
+ 6 files changed, 28 insertions(+), 6 deletions(-)
+
+commit 54e7d6267b485f252cf3f266a4577c72d79b286b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 3 14:43:34 2021 -0600
+
+    [array] Remove defaulted destructor
+
+ src/hb-array.hh | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit f51b48c8e780ca918535c7af670818f2166ccf64
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Nov 2 16:16:52 2021 -0700
+
+    [subset] Fix fuzzer found memory leak.
+    
+    Happens because an insert into a map with an invalid key reports successful, but this causes the set being inserted to be lost.
+
+ src/hb-ot-layout-gsubgpos.hh                           |  17 +++++++++--------
+ .../leak-34f1798a142fd0dfdd71a96fb6aa7de19a62865e      | Bin 0 -> 134 bytes
+ 2 files changed, 9 insertions(+), 8 deletions(-)
+
+commit b1cd0dce8ed2fff2b781dfb432777db7de5f3f80
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 2 17:56:11 2021 -0600
+
+    [map] Add INVALID_KEY and INVALID_VALUE
+
+ src/hb-map.hh | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 540f19b6fe0de39312bc3f881be16e76dd902c33
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Fri Oct 29 17:11:53 2021 -0700
+
+    [subset] fix bug in (Chain)ContextFormat2
+    
+    Only keep rulesets for glyphs class numbers that survived in coverage
+
+ src/hb-ot-layout-common.hh                         |  53 ++++++++++++++++++++-
+ src/hb-ot-layout-gsubgpos.hh                       |  46 ++++++++++++++----
+ test/subset/data/Makefile.am                       |   1 +
+ test/subset/data/Makefile.sources                  |   1 +
+ ...lar.layout-test-retain-gids.268,301,302,324.ttf | Bin 0 -> 6312 bytes
+ ...ayout-test-retain-gids.retain-all-codepoint.ttf | Bin 0 -> 60976 bytes
+ ...Molengo-Regular.layout-test.268,301,302,324.ttf | Bin 0 -> 4124 bytes
+ ...go-Regular.layout-test.retain-all-codepoint.ttf | Bin 0 -> 60972 bytes
+ test/subset/data/fonts/Molengo-Regular.ttf         | Bin 0 -> 65464 bytes
+ test/subset/data/tests/layout.gsub5_format2.tests  |  10 ++++
+ test/subset/meson.build                            |   1 +
+ 11 files changed, 103 insertions(+), 9 deletions(-)
+
+commit e260eeb9be0402d645917cadc8634ddf8c0e2743
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Nov 2 15:31:32 2021 -0700
+
+    [subset] Update test goldens for gdef.glyphset.
+
+ ...Howrah-Regular.default.retain-all-codepoint.ttf | Bin 174040 -> 174308 bytes
+ ...rah-Regular.drop-hints.retain-all-codepoint.ttf | Bin 99020 -> 99288 bytes
+ ...ah-Regular.retain-gids.retain-all-codepoint.ttf | Bin 174340 -> 174608 bytes
+ 3 files changed, 0 insertions(+), 0 deletions(-)
+
+commit 60e203644b7aa2098bce9ddae7741ba037500d2c
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Tue Nov 2 15:02:36 2021 -0700
+
+    [subset] use glyphset_gsub instead of glyphset for GDEF
+
+ src/hb-ot-layout-gdef-table.hh                         |   4 ++--
+ test/subset/data/Makefile.am                           |   1 +
+ test/subset/data/Makefile.sources                      |   1 +
+ .../IndicTestHowrah-Regular.default.9dd.ttf            | Bin 0 -> 4152 bytes
+ ...TestHowrah-Regular.default.retain-all-codepoint.ttf | Bin 0 -> 174040 bytes
+ .../IndicTestHowrah-Regular.drop-hints.9dd.ttf         | Bin 0 -> 1128 bytes
+ ...tHowrah-Regular.drop-hints.retain-all-codepoint.ttf | Bin 0 -> 99020 bytes
+ .../IndicTestHowrah-Regular.retain-gids.9dd.ttf        | Bin 0 -> 4540 bytes
+ ...Howrah-Regular.retain-gids.retain-all-codepoint.ttf | Bin 0 -> 174340 bytes
+ test/subset/data/fonts/IndicTestHowrah-Regular.ttf     | Bin 0 -> 186128 bytes
+ test/subset/data/tests/layout.gdef.glyphset.tests      |  11 +++++++++++
+ test/subset/meson.build                                |   1 +
+ 12 files changed, 16 insertions(+), 2 deletions(-)
+
+commit e39647c0f14102928ed787c2d38213f5b6cf576d
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Nov 2 15:25:05 2021 -0700
+
+    [subset] update subset goldens to fix tests.
+
+ ...wLatin-Regular.default.retain-all-codepoint.ttf | Bin 131672 -> 131672 bytes
+ ...in-Regular.layout-test.retain-all-codepoint.ttf | Bin 153648 -> 153648 bytes
+ ...in-Regular.retain-gids.retain-all-codepoint.ttf | Bin 134776 -> 134776 bytes
+ 3 files changed, 0 insertions(+), 0 deletions(-)
+
+commit 0a7563a53ffedd735cb41c03f697269ef48f0ec2
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Mon Nov 1 14:56:14 2021 -0700
+
+    [subset] fuzzer fix: https://oss-fuzz.com/testcase?key=6254792024915968
+    
+    Make sure input is valid, each gid has a corresponding offset value in
+    the map
+
+ src/hb-ot-color-colr-table.hh                           |   5 ++++-
+ ...testcase-minimized-hb-subset-fuzzer-6254792024915968 | Bin 0 -> 20851 bytes
+ 2 files changed, 4 insertions(+), 1 deletion(-)
+
+commit 364b6b3989e9df6335711e282e3250534d88299a
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Sun Oct 31 14:38:20 2021 -0700
+
+    [subset] Don't assume FeatureList is sorted
+    
+    Though the spec said FeatureRecords are sorted alphabetically by feature
+    tag, there're font files with unsorted FeatureList. And harfbuzz is not
+    able to subset these files correctly because we use binary search in
+    finding featureRecords when collecting lookups. Also
+    find_duplicate_features needs to be updated to handle this.
+
+ src/hb-ot-layout-gsubgpos.hh                       |  28 +++++++++++++++------
+ src/hb-ot-layout.cc                                |  21 +++++-----------
+ test/subset/data/Makefile.am                       |   1 +
+ test/subset/data/Makefile.sources                  |   1 +
+ ...HebrewLatin-Regular.default.392,3a7,3b2,3c7.ttf | Bin 0 -> 2464 bytes
+ ...wLatin-Regular.default.retain-all-codepoint.ttf | Bin 0 -> 131672 bytes
+ ...ewLatin-Regular.layout-test.392,3a7,3b2,3c7.ttf | Bin 0 -> 2588 bytes
+ ...in-Regular.layout-test.retain-all-codepoint.ttf | Bin 0 -> 153648 bytes
+ ...ewLatin-Regular.retain-gids.392,3a7,3b2,3c7.ttf | Bin 0 -> 13484 bytes
+ ...in-Regular.retain-gids.retain-all-codepoint.ttf | Bin 0 -> 134776 bytes
+ .../data/fonts/NotoIKEAHebrewLatin-Regular.ttf     | Bin 0 -> 212524 bytes
+ .../data/tests/layout.unsorted_featurelist.tests   |  11 ++++++++
+ test/subset/meson.build                            |   1 +
+ 13 files changed, 40 insertions(+), 23 deletions(-)
+
+commit 49c9392412ccf31cf948310acda057b96eb6afc6
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Sep 24 09:28:10 2021 -0700
+
+    [subset] During LigatureSubstFormat1 subsetting always place Coverage last.
+    
+    In Windows 7 on Chrome if the coverage table comes before any of the LigatureSet or Ligature subtables the font won't load. This changes the packing order to always place the Coverage table last. Virtual links are used to ensure the repacker maintains the desired ordering.
+    
+    Coincidentally fontTools also does the same thing (https://github.com/fonttools/fonttools/blob/a3f988fbf621142d7d9b3e68a69725b88f358869/Lib/fontTools/ttLib/tables/otTables.py#L1137) to reduce overflows during packing.
+
+ src/hb-ot-layout-gsub-table.hh                     |  48 +++++++++++++++++----
+ ...aa-Regular-new.default.retain-all-codepoint.ttf | Bin 222756 -> 222756 bytes
+ ...drop-hints-retain-gids.retain-all-codepoint.ttf | Bin 191632 -> 191632 bytes
+ ...Regular-new.drop-hints.retain-all-codepoint.ttf | Bin 191584 -> 191584 bytes
+ ...ortaa-Regular-new.gids.retain-all-codepoint.ttf | Bin 222756 -> 222756 bytes
+ ...egular-new.glyph-names.retain-all-codepoint.ttf | Bin 229748 -> 229748 bytes
+ ...ep-all-layout-features.retain-all-codepoint.ttf | Bin 223452 -> 223452 bytes
+ ...ar-new.layout-features.retain-all-codepoint.ttf | Bin 220948 -> 220948 bytes
+ ...a-Regular-new.name-ids.retain-all-codepoint.ttf | Bin 222496 -> 222496 bytes
+ ...lar-new.name-languages.retain-all-codepoint.ttf | Bin 222756 -> 222756 bytes
+ ...egular-new.name-legacy.retain-all-codepoint.ttf | Bin 222756 -> 222756 bytes
+ ...o-prune-unicode-ranges.retain-all-codepoint.ttf | Bin 222756 -> 222756 bytes
+ ...lar-new.notdef-outline.retain-all-codepoint.ttf | Bin 223352 -> 223352 bytes
+ ...egular-new.retain-gids.retain-all-codepoint.ttf | Bin 222804 -> 222804 bytes
+ ...tu-Regular.glyph-names.retain-all-codepoint.ttf | Bin 281092 -> 281092 bytes
+ ...ns-BlackItalic.default.retain-all-codepoint.ttf | Bin 120236 -> 120236 bytes
+ ...lackItalic.glyph-names.retain-all-codepoint.ttf | Bin 132480 -> 132480 bytes
+ ...kItalic.notdef-outline.retain-all-codepoint.ttf | Bin 120236 -> 120236 bytes
+ ...andhar-Regular.default.retain-all-codepoint.ttf | Bin 49248 -> 49248 bytes
+ ...har-Regular.drop-hints.retain-all-codepoint.ttf | Bin 29468 -> 29468 bytes
+ ...dhar-Regular.keep-gdef.retain-all-codepoint.ttf | Bin 49248 -> 49248 bytes
+ ...ayout-test-retain-gids.retain-all-codepoint.otf | Bin 4064 -> 4064 bytes
+ ...pos5_font1.layout-test.retain-all-codepoint.otf | Bin 4064 -> 4064 bytes
+ ...ayout-test-retain-gids.retain-all-codepoint.otf | Bin 4008 -> 4008 bytes
+ ...cessive_f1.layout-test.retain-all-codepoint.otf | Bin 4008 -> 4008 bytes
+ ...Bold.default.627,644,623,62D,644,627,645,2E.ttf | Bin 11372 -> 11372 bytes
+ ...toNastaliqUrdu-Bold.default.627,644,62D,628.ttf | Bin 17640 -> 17732 bytes
+ .../NotoNastaliqUrdu-Bold.default.627,644.ttf      | Bin 3512 -> 3512 bytes
+ ...rdu-Bold.default.633,645,627,621,20,644,627.ttf | Bin 12360 -> 12360 bytes
+ .../NotoNastaliqUrdu-Bold.default.63A,64A,631.ttf  | Bin 19340 -> 19432 bytes
+ ....retain-gids.627,644,623,62D,644,627,645,2E.ttf | Bin 18208 -> 18208 bytes
+ ...staliqUrdu-Bold.retain-gids.627,644,62D,628.ttf | Bin 23704 -> 23792 bytes
+ .../NotoNastaliqUrdu-Bold.retain-gids.627,644.ttf  | Bin 9160 -> 9160 bytes
+ ...Bold.retain-gids.633,645,627,621,20,644,627.ttf | Bin 18164 -> 18164 bytes
+ ...toNastaliqUrdu-Bold.retain-gids.63A,64A,631.ttf | Bin 25392 -> 25484 bytes
+ .../Tinos-Italic.default.retain-all-codepoint.ttf  | Bin 412764 -> 412764 bytes
+ ...nos-Italic.glyph-names.retain-all-codepoint.ttf | Bin 437592 -> 437592 bytes
+ ...-Italic.notdef-outline.retain-all-codepoint.ttf | Bin 412764 -> 412764 bytes
+ ...nos-Italic.retain-gids.retain-all-codepoint.ttf | Bin 415140 -> 415140 bytes
+ ...woMath-Regular.default.retain-all-codepoint.ttf | Bin 1038580 -> 1038580 bytes
+ ...th-Regular.glyph-names.retain-all-codepoint.ttf | Bin 1091356 -> 1091356 bytes
+ ...Regular.notdef-outline.retain-all-codepoint.ttf | Bin 1038828 -> 1038828 bytes
+ ...th-Regular.retain-gids.retain-all-codepoint.ttf | Bin 1053656 -> 1053656 bytes
+ .../variable/Fraunces.default.26,66,69,124,125.ttf | Bin 15856 -> 15856 bytes
+ 44 files changed, 39 insertions(+), 9 deletions(-)
+
+commit 9643d77086b1d0896cb4703f48b71743044880bf
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Sep 24 11:39:59 2021 -0700
+
+    [repacker] add more detailed comment about virtual links.
+
+ src/hb-serialize.hh | 10 ++++++++--
+ 1 file changed, 8 insertions(+), 2 deletions(-)
+
+commit 5bfc7d101562a188fb283fd679a7ba55acc4042c
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Sep 23 14:45:20 2021 -0700
+
+    [repacker] remove VirtualOffset struct.
+    
+    Make and add_virtual_link () specialization of add_link() instead.
+
+ src/hb-serialize.hh  | 9 +--------
+ src/test-repacker.cc | 3 +--
+ 2 files changed, 2 insertions(+), 10 deletions(-)
+
+commit bc4c5341d6e5725a6ad231eba3a7a6f2ba606ce9
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Sep 23 14:41:42 2021 -0700
+
+    [repacker] Add test for virtual links in the repacker.
+
+ src/hb-serialize.hh  | 24 +++++++++++++++++++++
+ src/test-repacker.cc | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 84 insertions(+)
+
+commit 7615b94ecf483aa275220409d3c385089a74a09d
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Sep 23 14:14:06 2021 -0700
+
+    [repacker] add 'virtual links' to the serializer.
+    
+    These aren't associated with an offset field, but instead exist solely to add an ordering constraint to the object graph.
+
+ src/hb-repacker.hh  | 10 +++++++++-
+ src/hb-serialize.hh | 21 ++++++++++++++++++++-
+ 2 files changed, 29 insertions(+), 2 deletions(-)
+
+commit 59d8f6c8173a9054b2594f38c06d9aa635da04c9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 2 10:33:53 2021 -0600
+
+    [map] Fix copy assignment operator
+
+ src/hb-map.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit bbda020cbc99d6a956f21a7fb05bf721fa0f2faf
+Merge: 8dc86d070 459e485ba
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 2 08:40:59 2021 -0700
+
+    Merge pull request #3278 from harfbuzz/more-std
+    
+    More standard idioms
+
+commit 459e485babea657e47930e74bd56280658811af2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 2 09:36:12 2021 -0600
+
+    [meta] Remove otherwise-empty test-meta
+
+ src/Makefile.am  |  5 ----
+ src/meson.build  |  1 -
+ src/test-meta.cc | 87 --------------------------------------------------------
+ 3 files changed, 93 deletions(-)
+
+commit b8724c60232a97d1e1785c3c618a340089be9c8a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 2 00:49:40 2021 -0600
+
+    [meta] Add in-house impl of hb_is_convertible()
+
+ src/hb-meta.hh   | 26 +-------------------------
+ src/test-meta.cc | 14 --------------
+ 2 files changed, 1 insertion(+), 39 deletions(-)
+
+commit 7a078c395a57097a2ae204c0089f47a9ac97d849
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 2 00:44:51 2021 -0600
+
+    [meta] Use std::conditional instead of hb_conditional()
+
+ src/hb-meta.hh      | 13 ++-----------
+ src/hb-open-type.hh |  2 +-
+ 2 files changed, 3 insertions(+), 12 deletions(-)
+
+commit 943921cf0caefa564601f7b18eed2168be77cfda
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 2 00:26:46 2021 -0600
+
+    [meta] Use more std type_traits
+
+ src/hb-algs.hh      |  6 +++---
+ src/hb-map.hh       |  8 ++++----
+ src/hb-meta.hh      | 44 --------------------------------------------
+ src/hb-open-type.hh |  4 ++--
+ src/hb-serialize.hh |  2 +-
+ src/test-meta.cc    |  3 ---
+ 6 files changed, 10 insertions(+), 57 deletions(-)
+
+commit 6d555ce82e50bdd54896a89d9d547493b466b116
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 2 00:18:22 2021 -0600
+
+    [meta] Use std::forward instead of hb_forward()
+
+ src/hb-aat-layout-common.hh     |  2 +-
+ src/hb-aat-layout-kerx-table.hh | 10 +++---
+ src/hb-aat-layout-morx-table.hh | 10 +++---
+ src/hb-algs.hh                  | 80 ++++++++++++++++++++---------------------
+ src/hb-debug.hh                 |  8 ++---
+ src/hb-dispatch.hh              |  2 +-
+ src/hb-iter.hh                  | 14 ++++----
+ src/hb-meta.hh                  | 10 ++----
+ src/hb-open-type.hh             | 22 ++++++------
+ src/hb-ot-cff-common.hh         |  2 +-
+ src/hb-ot-color-colr-table.hh   | 68 +++++++++++++++++------------------
+ src/hb-ot-kern-table.hh         |  8 ++---
+ src/hb-ot-layout-common.hh      |  4 +--
+ src/hb-ot-layout-gdef-table.hh  |  6 ++--
+ src/hb-ot-layout-gpos-table.hh  | 36 +++++++++----------
+ src/hb-ot-layout-gsub-table.hh  | 30 ++++++++--------
+ src/hb-ot-layout-gsubgpos.hh    | 16 ++++-----
+ src/hb-ot-layout.cc             |  4 +--
+ src/hb-sanitize.hh              |  6 ++--
+ src/hb-serialize.hh             | 16 ++++-----
+ src/hb-subset.hh                |  6 ++--
+ src/hb-vector.hh                |  4 +--
+ 22 files changed, 179 insertions(+), 185 deletions(-)
+
+commit 811f80a701a7e40d8ef2e01b927da74015aa6113
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 2 00:14:34 2021 -0600
+
+    [algs] Use std::move instead of hb_move()
+
+ src/hb-map.hh    | 4 ++--
+ src/hb-meta.hh   | 6 ++----
+ src/hb-set.hh    | 2 +-
+ src/hb-vector.hh | 2 +-
+ 4 files changed, 6 insertions(+), 8 deletions(-)
+
+commit 896e0c74a82eb65f80d284a5d4f6557960de2620
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 2 00:06:30 2021 -0600
+
+    [meta] Remove unused traits
+
+ src/hb-meta.hh   | 46 ----------------------------------------------
+ src/test-meta.cc | 13 -------------
+ 2 files changed, 59 deletions(-)
+
+commit be42800fc6d90340f843fa03be1bb06b0453e519
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 2 00:04:18 2021 -0600
+
+    [meta] Use std::is_trivially_... instead of internal copies
+
+ src/hb-meta.hh      | 58 ++---------------------------------------------------
+ src/hb-open-type.hh | 10 ++++-----
+ src/test-meta.cc    | 16 ---------------
+ 3 files changed, 7 insertions(+), 77 deletions(-)
+
+commit 30c05e8b55c36200735446f237f1d7003cb70450
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 1 23:57:00 2021 -0600
+
+    [algs] include <new>
+
+ src/hb-algs.hh  | 1 +
+ src/hb-mutex.hh | 1 -
+ 2 files changed, 1 insertion(+), 1 deletion(-)
+
+commit 4c6fd7cdb2f2ab60de83d9a1e0fd189510b771a0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 1 23:13:34 2021 -0600
+
+    [map] Try moving items when resizing
+
+ src/hb-map.hh | 11 +++++------
+ 1 file changed, 5 insertions(+), 6 deletions(-)
+
+commit a28ea8d7f35a89cda49a9552a5ab6dc14d208c84
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 1 22:50:54 2021 -0600
+
+    Simplify swap()
+
+ src/hb-bit-set.hh | 1 -
+ src/hb-map.hh     | 1 -
+ 2 files changed, 2 deletions(-)
+
+commit 94158316d9ba69315497a200ec63d13cb6959363
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 1 22:47:26 2021 -0600
+
+    [map] Add iterable constructor
+
+ src/hb-map.hh   |  6 ++++++
+ src/test-map.cc | 24 ++++++++++++++++++++++++
+ 2 files changed, 30 insertions(+)
+
+commit a03b9b14c988aa04ba3ee1e5d187b65e7b24015a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 1 22:45:11 2021 -0600
+
+    [map] Add initializer_list and swap()
+
+ src/hb-map.hh   | 25 +++++++++++++++++++++++--
+ src/test-map.cc | 10 ++++++++++
+ src/test-set.cc |  6 +++---
+ 3 files changed, 36 insertions(+), 5 deletions(-)
+
+commit 3604f5f2484b47c0693896f8a8e48dfe46dddef1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 1 22:37:42 2021 -0600
+
+    [algs] Include <initializer_list>
+
+ src/hb-algs.hh   | 1 +
+ src/hb-set.hh    | 2 --
+ src/hb-vector.hh | 2 --
+ 3 files changed, 1 insertion(+), 4 deletions(-)
+
+commit c30f6834d0ad0adbe0f16bb79555fd161de2303e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 1 22:29:14 2021 -0600
+
+    [map] Add 5 methods
+
+ src/Makefile.am    |  5 ++++
+ src/hb-map.hh      | 17 +++++++++++++-
+ src/meson.build    |  1 +
+ src/test-map.cc    | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/test-set.cc    |  1 +
+ src/test-vector.cc |  1 +
+ 6 files changed, 92 insertions(+), 1 deletion(-)
+
+commit 38debbab7e287e513968c80a10e69ab054acad4d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 1 22:17:35 2021 -0600
+
+    [set] Add successful check in swap()
+
+ src/hb-bit-set-invertible.hh | 2 ++
+ src/hb-bit-set.hh            | 2 ++
+ 2 files changed, 4 insertions(+)
+
+commit b860b44229dbde49e8a1ed34257b1a70bb2401ee
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 1 22:00:18 2021 -0600
+
+    [bimap] Simplify initialization
+
+ src/hb-bimap.hh | 15 +++------------
+ 1 file changed, 3 insertions(+), 12 deletions(-)
+
+commit d2c364f6e7edbd295132f792d711ac37ff551d37
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 1 21:55:14 2021 -0600
+
+    [array] Use default methods
+
+ src/hb-array.hh | 15 ++++++++-------
+ 1 file changed, 8 insertions(+), 7 deletions(-)
+
+commit 6f74d80ed1f20a31744f78ee5a290b76b1dfb102
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 1 21:49:32 2021 -0600
+
+    [vector] Complete sorted_vector 5-methods
+
+ src/hb-vector.hh   | 11 +++++++++--
+ src/test-vector.cc | 19 ++++++++++++++++---
+ 2 files changed, 25 insertions(+), 5 deletions(-)
+
+commit a28b5d03b5c86d2ffc352ef35463718aa4a00a9f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 1 21:43:44 2021 -0600
+
+    [vector] Add swap() friend to hb_sorted_vector_t
+
+ src/hb-vector.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit e97e79967e6ed0dd5719c2b88cf72f8860790245
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 1 21:34:46 2021 -0600
+
+    Verbiage
+
+ src/hb-set.hh    |  8 ++++----
+ src/hb-vector.hh | 10 +++++-----
+ 2 files changed, 9 insertions(+), 9 deletions(-)
+
+commit 34fa5e290146b14ee6bdb261811d219fd7711574
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 1 21:25:03 2021 -0600
+
+    [set] More default operators
+
+ src/hb-set.hh | 9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
+
+commit b6c0b40fc2a66893c70f02dc20f2c99b0a996b6a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 1 21:15:38 2021 -0600
+
+    [vector] Use default constructor
+
+ src/hb-vector.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 1e3f57c07904578079a58e37baf3a6bb01c0be0c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 1 21:14:12 2021 -0600
+
+    [bit-set] Implement standard-5 methods plus swap
+
+ src/hb-bit-set.hh | 24 ++++++++++++++++--------
+ 1 file changed, 16 insertions(+), 8 deletions(-)
+
+commit 11eadb5d2886c8d2a6eef26866f080bde9ff65ce
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 1 21:07:09 2021 -0600
+
+    [bit-set-invertible] Implement standard-5 methods & swap
+
+ src/hb-bit-set-invertible.hh | 16 ++++++++++++----
+ 1 file changed, 12 insertions(+), 4 deletions(-)
+
+commit dcd18da611436455733e3a80075d07685a6f96f7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 1 20:55:30 2021 -0600
+
+    [set] Add standard the 5 standard methods & tests
+
+ src/Makefile.am |  9 ++++++
+ src/hb-set.hh   | 33 +++++++++++++++++---
+ src/meson.build |  1 +
+ src/test-set.cc | 96 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 4 files changed, 135 insertions(+), 4 deletions(-)
+
+commit 628a0f3796992fe858b368c8b6358ef9d83a21e1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 1 20:36:55 2021 -0600
+
+    [vector] Add more tests
+
+ src/test-vector.cc | 41 +++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 41 insertions(+)
+
+commit f15858be5f09a9fdfbec9ccc68490e23e5db35ad
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 1 20:26:07 2021 -0600
+
+    [vector] Pre-allocate if iterator has random-access length
+
+ src/hb-vector.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 11135150a7e9955aefbf9ac943367a618b513981
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 1 20:23:12 2021 -0600
+
+    [vector] Move test code into separate file
+
+ src/Makefile.am    | 14 ++++++++-
+ src/meson.build    |  1 +
+ src/test-algs.cc   | 51 --------------------------------
+ src/test-vector.cc | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 4 files changed, 99 insertions(+), 52 deletions(-)
+
+commit ee75e716c1fec110e9ee2d30be9db14b75515404
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 1 20:18:49 2021 -0600
+
+    [vector] Add initializer from iterable
+
+ src/hb-vector.hh |  6 ++++++
+ src/test-algs.cc | 31 +++++++++++++++++++++++++++++++
+ 2 files changed, 37 insertions(+)
+
+commit 18a078f968072990cc50f96d4b6e47b32a6001c5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 1 20:06:58 2021 -0600
+
+    [vector] Implement move assignment using swap
+
+ src/hb-vector.hh | 6 +-----
+ 1 file changed, 1 insertion(+), 5 deletions(-)
+
+commit 8dc86d07036e0d251ab6817230651f8943693db8
+Author: Matthias Clasen <mclasen@redhat.com>
+Date:   Mon Nov 1 19:57:11 2021 -0400
+
+    Add a test font scale rounding behavior
+    
+    This test verifies the fix for
+    https://github.com/harfbuzz/harfbuzz/issues/3274
+
+ test/api/Makefile.am           |   1 +
+ test/api/fonts/Cantarell.A.otf | Bin 0 -> 1956 bytes
+ test/api/meson.build           |   1 +
+ test/api/test-font-scale.c     |  57 +++++++++++++++++++++++++++++++++++++++++
+ 4 files changed, 59 insertions(+)
+
+commit eeda2c549ddd103ebf8f9d1e20ae30137f5ed532
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 1 18:36:57 2021 -0600
+
+    [vector] Add initializer_list constructor & tests
+
+ src/hb-vector.hh | 15 +++++++++++++--
+ src/test-algs.cc | 20 ++++++++++++++++++++
+ 2 files changed, 33 insertions(+), 2 deletions(-)
+
+commit c484641304daff090111171d2dc3404735e14ed6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 1 18:48:24 2021 -0600
+
+    Revert "[vector] Add initializer_list constructor & tests"
+    
+    This reverts commit aa6182453b29b2d1cc974756fe0ae4220a846bf4.
+
+ src/hb-vector.hh | 15 ++-------------
+ src/test-algs.cc | 20 --------------------
+ 2 files changed, 2 insertions(+), 33 deletions(-)
+
+commit aa6182453b29b2d1cc974756fe0ae4220a846bf4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 1 18:36:57 2021 -0600
+
+    [vector] Add initializer_list constructor & tests
+
+ src/hb-vector.hh | 15 +++++++++++++--
+ src/test-algs.cc | 20 ++++++++++++++++++++
+ 2 files changed, 33 insertions(+), 2 deletions(-)
+
+commit 8c05569930b3ba8901baae7ffb9ae2a6fc6ce4b1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 1 17:59:17 2021 -0600
+
+    [algs] Add hb_swap() ala, and using, std::swap()
+    
+    Use it in vector.
+    
+    Use ADL idiom.
+
+ src/hb-algs.hh     | 11 +++++++++++
+ src/hb-repacker.hh |  4 ++--
+ src/hb-vector.hh   | 16 ++++------------
+ 3 files changed, 17 insertions(+), 14 deletions(-)
+
+commit bbaccf23d9e231370fb3ca3398ebfc132c7555bc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 1 16:45:36 2021 -0600
+
+    Better round positions during scaling
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/3274
+
+ src/hb-font.hh | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit 52ccdc78e67b57645a83c6a55268dc19bf562e04
+Author: Matthias Clasen <mclasen@redhat.com>
+Date:   Thu Oct 28 14:56:13 2021 -0400
+
+    docs: Add a link to the OpenType spec
+    
+    Link to the name table specification in the
+    hb_ot_name_id_t docs.
+
+ src/hb-ot-name.h | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 8cb2f969d9632804a546e7e1157b64f85f21f512
+Author: Matthias Clasen <mclasen@redhat.com>
+Date:   Thu Oct 28 07:42:07 2021 -0400
+
+    Document hb_ot_name_t values
+    
+    Add a short blurb for each value and refer
+    to the OpenType spec for more information.
+    
+    Fixes: #3181
+
+ src/hb-ot-name.h | 29 +++++++++++++++++++++++++++++
+ 1 file changed, 29 insertions(+)
+
+commit 85deddb16ee6b00b0c921998e1d93c84002f5a42
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Wed Oct 27 14:36:02 2021 -0700
+
+    [subset] fuzzer fix: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=40406
+
+ src/hb-ot-color-colr-table.hh                           |   1 +
+ ...testcase-minimized-hb-subset-fuzzer-6315334756335616 | Bin 0 -> 20377 bytes
+ 2 files changed, 1 insertion(+)
+
+commit de9424172d79ee45c1913b2a5020c228a19e7ac8
+Author: David Korczynski <david@adalogics.com>
+Date:   Wed Oct 27 15:24:57 2021 +0100
+
+    [ci] Add CIFuzz integration
+    
+    Add CIFuzz integration, which will run the fuzzers for a short amount
+    of time when a PR is submitted on Github.
+    
+    Signed-off-by: David Korczynski <david@adalogics.com>
+
+ .github/workflows/cifuzz.yml | 24 ++++++++++++++++++++++++
+ 1 file changed, 24 insertions(+)
+
+commit da500568dee503fd3fc9042d95668e3371f93d75
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 26 08:02:29 2021 -0600
+
+    [API] Add hb_buffer_[sg]et_not_found_glyph() and --not-found-glyph
+    
+    Instead of using gid=0 when a character is not found in the font,
+    client can now set a custom value.  This is useful for shaper-driven
+    font fallback and to differentiate that from .notdef glyph.
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1360
+
+ docs/harfbuzz-sections.txt   |  2 ++
+ src/hb-buffer.cc             | 42 ++++++++++++++++++++++++++++++++++++++++++
+ src/hb-buffer.h              |  7 +++++++
+ src/hb-buffer.hh             |  1 +
+ src/hb-font.hh               | 10 ++++++----
+ src/hb-ot-shape-normalize.cc |  5 +++--
+ src/hb-ot-shape-normalize.hh |  1 +
+ util/shape-options.hh        |  3 +++
+ 8 files changed, 65 insertions(+), 6 deletions(-)
+
+commit 6ea6c581edb3cecf1b4b42854e37b40d6d067cd3
+Author: Cameron Cawley <ccawley2011@gmail.com>
+Date:   Fri Sep 24 22:05:29 2021 +0100
+
+    Remove direct link to dwrite from meson scripts
+
+ meson.build     | 7 +------
+ src/meson.build | 1 -
+ 2 files changed, 1 insertion(+), 7 deletions(-)
+
+commit ecbe224743c205c99aa459b27e7fb241cc4b1dc5
+Author: Cameron Cawley <ccawley2011@gmail.com>
+Date:   Fri Sep 24 21:32:12 2021 +0100
+
+    Revert "[hb-directwrite] Don't load dwrit.dll dynamically"
+    
+    This reverts commit 6119ff9d806db7de3ceef73de67fe589507800bb.
+
+ src/hb-directwrite.cc | 36 ++++++++++++++++++++++++++++++++++--
+ 1 file changed, 34 insertions(+), 2 deletions(-)
+
+commit 4262636926123df42eaba5374dc54bb9776a5af2
+Merge: f55d83473 d17155f5d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 23 13:18:22 2021 -0700
+
+    Merge pull request #3248 from googlefonts/connected_components
+    
+    [repacker] Keep connected subgraphs in the same space.
+
+commit f55d834736b58ac15cff09c20f5c5cd3ca52ef1e
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Thu Oct 14 13:39:45 2021 -0700
+
+    [subset] Move struct DeltaSetIndexMap into hb-ot-var-common.hh
+    
+    Also fix naming issues in review comments
+
+ src/Makefile.sources          |   1 +
+ src/hb-ot-color-colr-table.hh | 131 +--------------------
+ src/hb-ot-var-common.hh       | 264 ++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-var-hvar-table.hh   |  88 +-------------
+ src/meson.build               |   1 +
+ 5 files changed, 273 insertions(+), 212 deletions(-)
+
+commit 8c583db9b5c63dc790f6553044b8915e1f5906bb
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Sat Oct 2 20:32:30 2021 -0700
+
+    [subset] COLRv1: update subset() method for new strutc ClipList and VarIdxMap
+    
+    Also fix issues in struct PaintTransform definition
+
+ src/hb-ot-color-colr-table.hh                      | 193 ++++++++++++++++++---
+ src/hb-subset-plan.cc                              |  60 ++++---
+ .../TwemojiMozilla.subset.default.32,3299.ttf      | Bin 1576 -> 1520 bytes
+ .../api/fonts/TwemojiMozilla.subset.default.32.ttf | Bin 932 -> 888 bytes
+ .../fonts/TwemojiMozilla.subset.default.3297.ttf   | Bin 1376 -> 1332 bytes
+ test/api/fonts/TwemojiMozilla.subset.ttf           | Bin 1936 -> 1868 bytes
+ test/subset/data/Makefile.am                       |   1 +
+ test/subset/data/Makefile.sources                  |   1 +
+ .../TwemojiMozilla.subset.default.32,3297,3299.ttf | Bin 1868 -> 1868 bytes
+ .../colr/TwemojiMozilla.subset.default.32,3297.ttf | Bin 1344 -> 1344 bytes
+ .../colr/TwemojiMozilla.subset.default.32,3299.ttf | Bin 1520 -> 1520 bytes
+ .../TwemojiMozilla.subset.default.3297,3299.ttf    | Bin 1860 -> 1860 bytes
+ .../colr/TwemojiMozilla.subset.default.3297.ttf    | Bin 1332 -> 1332 bytes
+ .../colr/TwemojiMozilla.subset.default.3299.ttf    | Bin 1508 -> 1508 bytes
+ ....subset.drop-hints-retain-gids.32,3297,3299.ttf | Bin 1848 -> 1848 bytes
+ ...zilla.subset.drop-hints-retain-gids.32,3297.ttf | Bin 1340 -> 1340 bytes
+ ...zilla.subset.drop-hints-retain-gids.32,3299.ttf | Bin 1520 -> 1520 bytes
+ ...lla.subset.drop-hints-retain-gids.3297,3299.ttf | Bin 1844 -> 1844 bytes
+ ...iMozilla.subset.drop-hints-retain-gids.3297.ttf | Bin 1328 -> 1328 bytes
+ ...iMozilla.subset.drop-hints-retain-gids.3299.ttf | Bin 1508 -> 1508 bytes
+ ...emojiMozilla.subset.drop-hints.32,3297,3299.ttf | Bin 1848 -> 1848 bytes
+ .../TwemojiMozilla.subset.drop-hints.32,3297.ttf   | Bin 1324 -> 1324 bytes
+ .../TwemojiMozilla.subset.drop-hints.32,3299.ttf   | Bin 1500 -> 1500 bytes
+ .../TwemojiMozilla.subset.drop-hints.3297,3299.ttf | Bin 1840 -> 1840 bytes
+ .../colr/TwemojiMozilla.subset.drop-hints.3297.ttf | Bin 1312 -> 1312 bytes
+ .../colr/TwemojiMozilla.subset.drop-hints.3299.ttf | Bin 1488 -> 1488 bytes
+ ...mojiMozilla.subset.retain-gids.32,3297,3299.ttf | Bin 1868 -> 1868 bytes
+ .../TwemojiMozilla.subset.retain-gids.32,3297.ttf  | Bin 1360 -> 1360 bytes
+ .../TwemojiMozilla.subset.retain-gids.32,3299.ttf  | Bin 1540 -> 1540 bytes
+ ...TwemojiMozilla.subset.retain-gids.3297,3299.ttf | Bin 1864 -> 1864 bytes
+ .../TwemojiMozilla.subset.retain-gids.3297.ttf     | Bin 1348 -> 1348 bytes
+ .../TwemojiMozilla.subset.retain-gids.3299.ttf     | Bin 1528 -> 1528 bytes
+ .../colr_with_components/colr-table.default.6B.ttf | Bin 4260 -> 4260 bytes
+ .../colr-table.drop-hints-retain-gids.6B.ttf       | Bin 4984 -> 4984 bytes
+ .../colr-table.drop-hints.6B.ttf                   | Bin 4260 -> 4260 bytes
+ .../colr-table.retain-gids.6B.ttf                  | Bin 4984 -> 4984 bytes
+ .../TestCOLRv1.default.E000,E001,E002,E003.ttf     | Bin 0 -> 1260 bytes
+ .../colrv1/TestCOLRv1.default.E000,E001,E002.ttf   | Bin 0 -> 1200 bytes
+ .../colrv1/TestCOLRv1.default.E000,E001.ttf        | Bin 0 -> 996 bytes
+ .../colrv1/TestCOLRv1.default.E000,E004.ttf        | Bin 0 -> 940 bytes
+ .../expected/colrv1/TestCOLRv1.default.E000.ttf    | Bin 0 -> 800 bytes
+ .../expected/colrv1/TestCOLRv1.default.E001.ttf    | Bin 0 -> 856 bytes
+ .../colrv1/TestCOLRv1.default.E002,E003,E004.ttf   | Bin 0 -> 1248 bytes
+ .../colrv1/TestCOLRv1.default.E002,E003.ttf        | Bin 0 -> 1116 bytes
+ .../expected/colrv1/TestCOLRv1.default.E002.ttf    | Bin 0 -> 856 bytes
+ .../colrv1/TestCOLRv1.default.E003,E004.ttf        | Bin 0 -> 1044 bytes
+ .../expected/colrv1/TestCOLRv1.default.E003.ttf    | Bin 0 -> 916 bytes
+ .../expected/colrv1/TestCOLRv1.default.E004.ttf    | Bin 0 -> 748 bytes
+ .../TestCOLRv1.default.retain-all-codepoint.ttf    | Bin 0 -> 1532 bytes
+ ....drop-hints-retain-gids.E000,E001,E002,E003.ttf | Bin 0 -> 1308 bytes
+ ...OLRv1.drop-hints-retain-gids.E000,E001,E002.ttf | Bin 0 -> 1248 bytes
+ ...TestCOLRv1.drop-hints-retain-gids.E000,E001.ttf | Bin 0 -> 1052 bytes
+ ...TestCOLRv1.drop-hints-retain-gids.E000,E004.ttf | Bin 0 -> 1020 bytes
+ .../TestCOLRv1.drop-hints-retain-gids.E000.ttf     | Bin 0 -> 856 bytes
+ .../TestCOLRv1.drop-hints-retain-gids.E001.ttf     | Bin 0 -> 924 bytes
+ ...OLRv1.drop-hints-retain-gids.E002,E003,E004.ttf | Bin 0 -> 1304 bytes
+ ...TestCOLRv1.drop-hints-retain-gids.E002,E003.ttf | Bin 0 -> 1176 bytes
+ .../TestCOLRv1.drop-hints-retain-gids.E002.ttf     | Bin 0 -> 936 bytes
+ ...TestCOLRv1.drop-hints-retain-gids.E003,E004.ttf | Bin 0 -> 1124 bytes
+ .../TestCOLRv1.drop-hints-retain-gids.E003.ttf     | Bin 0 -> 984 bytes
+ .../TestCOLRv1.drop-hints-retain-gids.E004.ttf     | Bin 0 -> 844 bytes
+ ...drop-hints-retain-gids.retain-all-codepoint.ttf | Bin 0 -> 1532 bytes
+ .../TestCOLRv1.drop-hints.E000,E001,E002,E003.ttf  | Bin 0 -> 1260 bytes
+ .../TestCOLRv1.drop-hints.E000,E001,E002.ttf       | Bin 0 -> 1200 bytes
+ .../colrv1/TestCOLRv1.drop-hints.E000,E001.ttf     | Bin 0 -> 996 bytes
+ .../colrv1/TestCOLRv1.drop-hints.E000,E004.ttf     | Bin 0 -> 940 bytes
+ .../expected/colrv1/TestCOLRv1.drop-hints.E000.ttf | Bin 0 -> 800 bytes
+ .../expected/colrv1/TestCOLRv1.drop-hints.E001.ttf | Bin 0 -> 856 bytes
+ .../TestCOLRv1.drop-hints.E002,E003,E004.ttf       | Bin 0 -> 1248 bytes
+ .../colrv1/TestCOLRv1.drop-hints.E002,E003.ttf     | Bin 0 -> 1116 bytes
+ .../expected/colrv1/TestCOLRv1.drop-hints.E002.ttf | Bin 0 -> 856 bytes
+ .../colrv1/TestCOLRv1.drop-hints.E003,E004.ttf     | Bin 0 -> 1044 bytes
+ .../expected/colrv1/TestCOLRv1.drop-hints.E003.ttf | Bin 0 -> 916 bytes
+ .../expected/colrv1/TestCOLRv1.drop-hints.E004.ttf | Bin 0 -> 748 bytes
+ .../TestCOLRv1.drop-hints.retain-all-codepoint.ttf | Bin 0 -> 1532 bytes
+ .../TestCOLRv1.retain-gids.E000,E001,E002,E003.ttf | Bin 0 -> 1308 bytes
+ .../TestCOLRv1.retain-gids.E000,E001,E002.ttf      | Bin 0 -> 1248 bytes
+ .../colrv1/TestCOLRv1.retain-gids.E000,E001.ttf    | Bin 0 -> 1052 bytes
+ .../colrv1/TestCOLRv1.retain-gids.E000,E004.ttf    | Bin 0 -> 1020 bytes
+ .../colrv1/TestCOLRv1.retain-gids.E000.ttf         | Bin 0 -> 856 bytes
+ .../colrv1/TestCOLRv1.retain-gids.E001.ttf         | Bin 0 -> 924 bytes
+ .../TestCOLRv1.retain-gids.E002,E003,E004.ttf      | Bin 0 -> 1304 bytes
+ .../colrv1/TestCOLRv1.retain-gids.E002,E003.ttf    | Bin 0 -> 1176 bytes
+ .../colrv1/TestCOLRv1.retain-gids.E002.ttf         | Bin 0 -> 936 bytes
+ .../colrv1/TestCOLRv1.retain-gids.E003,E004.ttf    | Bin 0 -> 1124 bytes
+ .../colrv1/TestCOLRv1.retain-gids.E003.ttf         | Bin 0 -> 984 bytes
+ .../colrv1/TestCOLRv1.retain-gids.E004.ttf         | Bin 0 -> 844 bytes
+ ...TestCOLRv1.retain-gids.retain-all-codepoint.ttf | Bin 0 -> 1532 bytes
+ test/subset/data/fonts/TestCOLRv1.ttf              | Bin 1780 -> 1860 bytes
+ test/subset/data/tests/colrv1.tests                |  16 +-
+ test/subset/meson.build                            |   2 +-
+ 91 files changed, 222 insertions(+), 51 deletions(-)
+
+commit e51c7f8e79867b790bfb282ca112b922cc7a2022
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Thu Sep 30 10:42:17 2021 -0700
+
+    [subset] COLRv1: add ClipList/ClipRecord/ClipBox struct definition
+
+ src/hb-ot-color-colr-table.hh | 76 +++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 76 insertions(+)
+
+commit 2e5636eeaf5da1623c9a14d60163449c44ffacd1
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Wed Aug 4 14:51:52 2021 -0700
+
+    [subset] add DeltasetIndexMap struct definition
+
+ src/hb-ot-color-colr-table.hh | 86 ++++++++++++++++++++++++++++++++++++++++++-
+ 1 file changed, 84 insertions(+), 2 deletions(-)
+
+commit d2e986feadfb8bbd7b7109795187780290e28f3b
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Tue Aug 3 16:31:42 2021 -0700
+
+    [subset] update COLRv1 table struct definitions
+
+ src/hb-ot-color-colr-table.hh     | 471 ++++++++++++++++++++++++++------------
+ src/hb-ot-color-colrv1-closure.hh |  53 +++--
+ 2 files changed, 357 insertions(+), 167 deletions(-)
+
+commit 792ca307b0cfe916e65879403861a583bb12c378
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Tue Oct 5 19:00:29 2021 +0200
+
+    [meson] Add graphite2 option and deprecate graphite
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/3241
+    
+    Should be better handled when we can use https://github.com/mesonbuild/meson/pull/9184
+
+ meson.build       | 5 +++--
+ meson_options.txt | 2 ++
+ src/meson.build   | 2 +-
+ 3 files changed, 6 insertions(+), 3 deletions(-)
+
+commit c6557747ef2d5b5effeaa4c6ff97a0d274e0ca6c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 21 09:56:47 2021 -0600
+
+    [style] Use head->macStyle.isExtended in style fallback
+    
+    https://github.com/harfbuzz/harfbuzz/issues/3263
+
+ src/hb-style.cc | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit f3f848b5066f3e6680ae5f68a1047085e7b8d59f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 21 09:54:02 2021 -0600
+
+    [head] Add is_expanded() internally
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/3263
+
+ src/hb-ot-head-table.hh | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit d17155f5d26f7ecb75d24d190c28a46f179c5d37
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Oct 13 14:40:00 2021 -0700
+
+    [repacker] use possibly updated root idx after isolate_subgraph.
+    
+    isolate_subgraph can change the root indices in some cases. So operations after the isolation need to use the roots from the output of isolate_subgraph.
+
+ src/hb-repacker.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit a7a36085538f218678c635a595025b7235c0e8cc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 12 16:11:25 2021 -0700
+
+    [docs] Rename overflow_resolution to repacker
+
+ docs/{overflow_resolution.md => repacker.md} | 0
+ src/hb-repacker.hh                           | 4 ++--
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 9bd7ba5019381bb8584811ee63a0ba0cee7dca99
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 12 08:44:01 2021 -0700
+
+    Err on -Wbitwise-instead-of-logical
+    
+    Part of https://github.com/harfbuzz/harfbuzz/pull/3256
+
+ src/hb.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 6bc64317ca0b1784a2826f980393d8cad3cf9de3
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Oct 12 13:13:32 2021 -0700
+
+    Add a writeup of the overflow resolution algorithm in harfbuzz.
+
+ docs/overflow_resolution.md | 265 ++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-repacker.hh          |   7 ++
+ 2 files changed, 272 insertions(+)
+
+commit 96299d70edba60e5eb88a1efca384bc82392d977
+Author: Nico Weber <thakis@chromium.org>
+Date:   Tue Oct 12 10:42:43 2021 -0400
+
+    Fix Wbitwise-instead-of-logical warnings
+    
+    `a || b` only evaluates b if a is false. `a | b` always evaluates
+    both a and b. If a and b are of type bool, || is usually what you
+    want, so clang now warns on `|` where both arguments are of type bool.
+    
+    This warning fires twice in harfbuzz. In both cases, `|` is used
+    intentionally, with a comment explaining this.
+    
+    Slightly reorder the code a bit to make the compiler happy, and to
+    make it obvious even without a comment that both calls should be evaluated.
+    
+    No intended behavior change.
+
+ src/hb-ot-layout-gpos-table.hh | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit b621c4fc29162c69098dce29fed887eac903d516
+Author: faywong <philip584521@gmail.com>
+Date:   Mon Oct 11 21:04:47 2021 +0800
+
+    [subset] Refine the coding style
+
+ CMakeLists.txt | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit f8538d3117b3f1715ffcfaf1775635c3d867839c
+Author: faywong <philip584521@gmail.com>
+Date:   Mon Oct 11 21:01:21 2021 +0800
+
+    [subset] Export header & archive when HB_BUILD_SUBSET
+    
+    Ease the adopt of hb-subset feature for 3rd party developers
+
+ CMakeLists.txt | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit 36ed56b6e81b613b95b551527f6091c9fdbdc7ba
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Thu Sep 23 10:51:21 2021 -0700
+
+    [subset] code cleanup
+    
+    - rename copy() method if it takes extra parameter
+    - get rid of same code blocks
+
+ src/hb-ot-layout-gsubgpos.hh | 110 ++++++++++++++++++-------------------------
+ 1 file changed, 45 insertions(+), 65 deletions(-)
+
+commit 3e635cf5e26e33d6210d3092256a49291752deec
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Fri Oct 8 17:13:22 2021 -0400
+
+    [USE] Categorize characters that only have AJT
+
+ src/gen-use-table.py                 | 69 +++++++++++++-----------------------
+ src/hb-ot-shape-complex-use-table.hh | 66 +++++++++++++++++-----------------
+ src/update-unicode-tables.make       |  2 +-
+ 3 files changed, 59 insertions(+), 78 deletions(-)
+
+commit ae193cd18239e662308a4a189a0241cbf7b92244
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Fri Oct 8 21:58:07 2021 -0400
+
+    [USE] Insert dotted circles before lone viramas
+
+ src/hb-ot-shape-complex-use-machine.hh | 520 ++++++++++++++++-----------------
+ src/hb-ot-shape-complex-use-machine.rl |  14 +-
+ 2 files changed, 265 insertions(+), 269 deletions(-)
+
+commit 641296b5ebb17875550705f1cea45ab6e6a8e562
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Fri Oct 8 21:39:30 2021 -0400
+
+    [USE] Categorize U+11046 BRAHMI VIRAMA as HALANT
+
+ src/gen-use-table.py                 | 3 +--
+ src/hb-ot-shape-complex-use-table.hh | 2 +-
+ 2 files changed, 2 insertions(+), 3 deletions(-)
+
+commit cca42cda460491fb8d9ee89cb0b37fe1d59ac04a
+Merge: 8eaee2f88 bb50aae9b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 8 13:10:21 2021 -0600
+
+    Merge pull request #3249 from harfbuzz/use-merge-s-o
+    
+    [USE] Merge the categories S and O
+
+commit bb50aae9b42e20e4b7aff0f7ac67a18ff2d65460
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Fri Oct 8 13:25:46 2021 -0400
+
+    [USE] Document customizations of USE categories
+
+ src/gen-use-table.py | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 7287125c586994bf2ea5d3117b15731475ce3192
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Tue Oct 5 08:52:11 2021 -0400
+
+    [USE] Merge the categories S and O
+
+ src/gen-use-table.py                   |   5 -
+ src/hb-ot-shape-complex-use-machine.hh | 470 ++++++++++++++++-----------------
+ src/hb-ot-shape-complex-use-machine.rl |   6 +-
+ src/hb-ot-shape-complex-use-table.hh   |   4 +-
+ src/hb-ot-shape-complex-use.cc         |   1 -
+ 5 files changed, 234 insertions(+), 252 deletions(-)
+
+commit 8eaee2f887fffb1130b41668a54cd98866f0bfb5
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Thu Oct 7 20:10:31 2021 -0400
+
+    [USE] Only skip default ignorables within CCSes
+
+ src/gen-use-table.py                              | 106 ++++++++--------
+ src/hb-ot-shape-complex-use-machine.hh            |  55 ++++----
+ src/hb-ot-shape-complex-use-machine.rl            |   9 +-
+ src/hb-ot-shape-complex-use-table.hh              | 145 ++++++++++++++--------
+ src/update-unicode-tables.make                    |  16 +--
+ test/shape/data/in-house/tests/use-syllable.tests |   2 +-
+ 6 files changed, 189 insertions(+), 144 deletions(-)
+
+commit 4645c3b47c6e7a70f8d55eda543df1109e309347
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Thu Oct 7 08:52:02 2021 -0400
+
+    Update comments for U+180F FVS4
+
+ src/hb-ot-layout.hh | 4 ++--
+ src/hb-unicode.hh   | 3 ++-
+ 2 files changed, 4 insertions(+), 3 deletions(-)
+
+commit 5b882c420adc8f0556a0d966a641aef4c812079e
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Oct 6 11:12:32 2021 -0700
+
+    [repacker] performance optimizations for topological sorting.
+    
+    - Presize the output sorted graph and write it once in the correct order to avoid needing to reverse.
+    - Swap the old/new graph vectors instead of copying.
+    - Use a boolean vector for tracking visited instead of a set.
+
+ src/hb-repacker.hh | 25 +++++++++++--------------
+ src/hb-vector.hh   | 15 +++++++++++++++
+ 2 files changed, 26 insertions(+), 14 deletions(-)
+
+commit ff7a86e9b06f7c9b4c82fb931d681b08be1e0b27
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Oct 6 10:51:45 2021 -0700
+
+    [repacker] remove clone buffer, they are unnessecary.
+    
+    When nodes are duplicated it's fine to just reuse head, tail from the node being cloned since we don't modify the contents.
+
+ src/hb-repacker.hh | 39 +++------------------------------------
+ 1 file changed, 3 insertions(+), 36 deletions(-)
+
+commit 8cae8b653ddae37b1a5410a5997a14e44bf934a0
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Oct 5 14:03:02 2021 -0700
+
+    [repacker] add missing fini for parents vector.
+
+ src/hb-repacker.hh | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit 7f0ede4f04f3f3eeb985bf40907e127952c7390c
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Oct 5 13:10:01 2021 -0700
+
+    [repacker] refactor resolve overflow tests to use a helper.
+
+ src/test-repacker.cc | 165 +++++++++++++++++----------------------------------
+ 1 file changed, 53 insertions(+), 112 deletions(-)
+
+commit 79937d24b75d3039d70feafa2e5ca9836d72689b
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Oct 5 12:53:21 2021 -0700
+
+    [repacker] Add repacker test that requires space splitting.
+
+ test/subset/data/fonts/Harmattan-Regular.ttf        | Bin 0 -> 835156 bytes
+ test/subset/data/repack_tests/Makefile.sources      |   3 ++-
+ test/subset/data/repack_tests/space_splitting.tests |   2 ++
+ test/subset/meson.build                             |   2 ++
+ 4 files changed, 6 insertions(+), 1 deletion(-)
+
+commit 7883b7ed95fcf577e4a5771daeaa01a89058eade
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Oct 5 12:46:59 2021 -0700
+
+    [repacker] Add additional splitting spaces test.
+    
+    Fix issues it uncovered.
+
+ src/hb-repacker.hh   |  11 +++--
+ src/test-repacker.cc | 125 +++++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 133 insertions(+), 3 deletions(-)
+
+commit 6265663de4c77dd504d231f2b8f7fd8e80363b40
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Oct 5 11:30:04 2021 -0700
+
+    [repacker] add test for splitting spaces.
+
+ src/test-repacker.cc | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 105 insertions(+)
+
+commit d97bd4268a8acdbc3628855057743d2b22e85341
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Oct 5 10:53:05 2021 -0700
+
+    [repacker] when assigning spaces use post isolation node indices.
+    
+    isolate_subgraph can result in some of the roots being duplicated and moved to new indices, so do subgraph isolation before assign roots to spaces.
+
+ src/hb-repacker.hh | 69 ++++++++++++++++++++++++++++++++++++++++--------------
+ 1 file changed, 51 insertions(+), 18 deletions(-)
+
+commit bb57df7a4fae6991895388c8b4fab8ae9de80332
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Tue Oct 5 15:40:30 2021 +0200
+
+    [test] Add test for https://github.com/harfbuzz/harfbuzz/issues/2757#issuecomment-933531978
+
+ .../fonts/e6185e88b04432fbf373594d5971686bb7dd698d.ttf  | Bin 0 -> 79552 bytes
+ test/shape/data/in-house/tests/aat-morx.tests           |   1 +
+ 2 files changed, 1 insertion(+)
+
+commit 16245503776b5d5487bb07640b1d75d0429f2143
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Tue Oct 5 15:35:17 2021 +0200
+
+    [test] Add test for https://github.com/harfbuzz/harfbuzz/issues/3244
+
+ .../fonts/e2b17207c4b7ad78d843e1b0c4d00b09398a1137.ttf   | Bin 0 -> 1488 bytes
+ test/shape/data/in-house/tests/indic-syllable.tests      |   1 +
+ 2 files changed, 1 insertion(+)
+
+commit ccfc0481539ca34cba578ebbcef8ac0ea315e2f0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 5 07:00:50 2021 -0600
+
+    [indic] Apply 'calt' and 'clig' across syllable boundaries
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/3244
+
+ src/hb-ot-shape-complex-indic.cc | 3 ---
+ 1 file changed, 3 deletions(-)
+
+commit d58f1685cee7fef904f4149561a2dcf5ec519ac3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 4 08:40:24 2021 -0600
+
+    [ot-shape] Tweak table order some more; apply GPOS with morx
+    
+    During 5bc05ba155 accidentally GPOS was disabled when morx was
+    enabled. Fix that.
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2757#issuecomment-933531978
+
+ src/hb-ot-shape.cc | 12 +++++++-----
+ 1 file changed, 7 insertions(+), 5 deletions(-)
+
+commit f8ebb8a65778745e43c560270d198c77c9d55220
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Wed Sep 29 19:18:25 2021 -0400
+
+    [USE] Update the data files
+    
+    This uses the data files from
+    <https://github.com/microsoft/font-tools/tree/c355d0419429fca2f1a22d88d0afd35822e4c0b0/USE>.
+
+ src/hb-ot-shape-complex-use-table.hh              | 187 +++++++++++++++++-----
+ src/ms-use/IndicPositionalCategory-Additional.txt |  97 +++++------
+ src/ms-use/IndicSyllabicCategory-Additional.txt   | 164 ++++++++++---------
+ 3 files changed, 284 insertions(+), 164 deletions(-)
+
+commit 564afc425abac78fc2741540cb0d77cf31491f40
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Tue Sep 28 17:33:47 2021 -0400
+
+    [USE] Remove overrides for hieroglyphic categories
+
+ src/gen-use-table.py                 |  8 ---
+ src/hb-ot-shape-complex-use-table.hh | 96 +++++-------------------------------
+ 2 files changed, 13 insertions(+), 91 deletions(-)
+
+commit 8c654420692a3534413334f6d096738a796f4384
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Sat Sep 25 16:38:32 2021 -0400
+
+    [Unicode 14] Handle U+180F FVS4
+
+ src/hb-ot-layout.hh               | 2 +-
+ src/hb-ot-shape-complex-arabic.cc | 2 +-
+ src/hb-unicode.hh                 | 2 +-
+ 3 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 375a6c8f81a894ac15be7542e17571ad3ebdf16a
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Sep 29 18:14:57 2021 -0700
+
+    [repacker] add the ability to move subgraphs from a shared space into their own space.
+    
+    Used to resolve overflows during manual resolution.
+
+ src/hb-repacker.hh | 93 ++++++++++++++++++++++++++++++++++++++++++++++++------
+ 1 file changed, 84 insertions(+), 9 deletions(-)
+
+commit 0dccbf368f1158f474f7ec3c6647932fbdda4e60
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Sep 29 14:28:27 2021 -0700
+
+    [repacker] Handle the case where a subgraph root has an incoming 32 and 16 bit edge.
+    
+    In this case the entire subgraph from that root will be duplicated.
+
+ src/hb-repacker.hh   |  49 ++++++++++++++++++++----
+ src/test-repacker.cc | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 146 insertions(+), 8 deletions(-)
+
+commit 794b00db4b63e8314aee96c23a20ecb878452eef
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Mon Sep 27 17:21:16 2021 -0700
+
+    [subset] fuzzer fix: https://oss-fuzz.com/testcase-detail/6616166961905664
+
+ src/hb-ot-math-table.hh                                   |   8 ++++++--
+ ...z-testcase-minimized-hb-subset-fuzzer-6616166961905664 | Bin 0 -> 919 bytes
+ 2 files changed, 6 insertions(+), 2 deletions(-)
+
+commit 816c5302a7f5bfbbac1b89a72f9d50871085ddf3
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Sep 28 16:04:27 2021 -0700
+
+    [repacker] restrict 32 bit subgraph connected component search to only nodes reachable via directed links.
+
+ src/hb-repacker.hh   |  20 ++++++---
+ src/test-repacker.cc | 122 +++++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 136 insertions(+), 6 deletions(-)
+
+commit 67eb222b8eae1a10d0fd485a04254144e4051d46
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Sep 28 13:36:06 2021 -0700
+
+    [repacker] when assigning each connected subgraph a space, also isolate it.
+    
+    This will break any links coming from space 0 (ie. the 16 bit offset only space).
+
+ src/hb-repacker.hh   | 46 ++++++++++++++--------------------------------
+ src/test-repacker.cc | 50 ++++++++++++++++++++++++++++++++++----------------
+ 2 files changed, 48 insertions(+), 48 deletions(-)
+
+commit 307acf7fb0d4c767b4b78ba6c80ab83399d16cb4
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Sep 28 12:08:18 2021 -0700
+
+    [repacker] add space assignment based on connected components.
+    
+    Assign each connected component that is underneath one or more 32 bit offsets into a unique space. This ensures that 32 bit subgraphs which are connected are packed into the same space.
+
+ src/hb-repacker.hh   |  79 ++++++++++++++++++++++++++++++++-
+ src/test-repacker.cc | 122 ++++++++++++++++++++++++++++++++++++++++++++-------
+ 2 files changed, 182 insertions(+), 19 deletions(-)
+
+commit c77bdf1dcf86dcad79e90643a5f4e7d04fbae975
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Sep 24 15:58:57 2021 -0700
+
+    [repacker] begin storing each nodes parents.
+    
+    Will be used for connected component search.
+
+ src/hb-repacker.hh | 132 +++++++++++++++++++++++++++++++++++------------------
+ 1 file changed, 87 insertions(+), 45 deletions(-)
+
+commit a52c6df38a38c4e36ff991dfb4b7d92e48a44553
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Sep 27 11:22:05 2021 -0700
+
+    [subset] Fix bug in composite operation counting.
+    
+    Adding the result of add_gid_and_children to operation count over counts the number of operations.
+
+ src/hb-ot-glyf-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit efda2f14e104eedfee7da50ba2d22ba9a9ae376b
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Sep 24 16:28:34 2021 -0700
+
+    [repacker] fix bug in subgraph isolation.
+    
+    Prior to this fix id remapping at the end of the isolation operation was fed the old subgraph instead of the new one. Which results in object indices being remapped for the nodes outside of the new subgraph. Adds a test which detects this problem.
+
+ src/hb-repacker.hh   | 11 +++++++--
+ src/test-repacker.cc | 64 ++++++++++++++++++++++++++++++++++++++++++++++++----
+ 2 files changed, 69 insertions(+), 6 deletions(-)
+
+commit 6f1909439862cc37246aba55a85c0a072b945dff
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 23 08:39:29 2021 -0600
+
+    [getn-hb-version.py] Open old output in UTF-8 mode as well
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/3227
+
+ src/gen-hb-version.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9247d24d7f41f820d7ea79089b482410b927edc8
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Sep 22 16:00:02 2021 -0700
+
+    [repacker] s/0/HB_TAG_NONE
+
+ src/test-repacker.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit fe155de9895e99d8ae13cb7516e2a70d6e7f8856
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Sep 10 14:55:24 2021 -0700
+
+    [repacker] handle a couple of duplication edge cases.
+    
+    - Detect cases where there are multiple links from a parent to a child. Don't duplicate that child if those are the only remaining links to the child.
+    - Correctly handle isolating a subgraph where the root idx has multiple incoming links.
+
+ src/hb-repacker.hh | 47 ++++++++++++++++++++++++++++++++++++-----------
+ 1 file changed, 36 insertions(+), 11 deletions(-)
+
+commit c19ec97da722d4a91024328c2d31f5e2f984fe10
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Sep 9 10:53:09 2021 -0700
+
+    [repacker] reduce the bits used by order by 2 to give more bits to distance.
+
+ src/hb-repacker.hh | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit d5beb96e06c34b6f5799f341d4b27e952e739d85
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Sep 9 10:40:08 2021 -0700
+
+    [repacker] add repacker isolation test on real font.
+
+ .../subset/data/fonts/NotoNastaliqUrdu-Regular.ttf | Bin 0 -> 570552 bytes
+ test/subset/data/repack_tests/Makefile.sources     |   1 +
+ test/subset/data/repack_tests/isolation.tests      |  96 +++++++++++++++++++++
+ test/subset/meson.build                            |   1 +
+ 4 files changed, 98 insertions(+)
+
+commit d0daa7a59be05689ac618b6c22f2c112f67d75cb
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Sep 9 10:25:43 2021 -0700
+
+    [repacker] add a couple more complex isolation tests.
+
+ src/hb-repacker.hh   |   5 ++-
+ src/test-repacker.cc | 120 +++++++++++++++++++++++++++++++++++++++++++++++++--
+ 2 files changed, 119 insertions(+), 6 deletions(-)
+
+commit 62c502cd9dc4637934f846caa9587a2aebca9ee9
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Sep 9 09:57:42 2021 -0700
+
+    [repacker] correctly update incoming_edges in duplicate.
+
+ src/hb-repacker.hh | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit a57ef8df7ebf70f08065233f3ad218c451eff98a
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Sep 8 17:31:39 2021 -0700
+
+    [repacker] default space to 0.
+    
+    Since vector push() init's new objects to all zeros.
+
+ src/hb-repacker.hh | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit 58facaade1c85906fec70584abfe13995a9dd07b
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Sep 8 16:08:48 2021 -0700
+
+    [repacker] put each 32 bit subgraph into it's own packing space.
+    
+    Each subgraph pointed to by a 32 bit offset should be packed into it's own space. This adds a space property to vertices which affects the distance calculation. This effectively places the distances for all of the nodes of a 32 bit subgraph into a distinct range. Thus all of the nodes of the subgraph will be packed together.
+
+ src/hb-repacker.hh   | 12 ++++++++++--
+ src/test-repacker.cc |  3 +++
+ 2 files changed, 13 insertions(+), 2 deletions(-)
+
+commit 543a3f97333a3bdede0cadd19b9a8554df81f1e8
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Sep 8 15:07:02 2021 -0700
+
+    [repacker] Add repacker test for subgraph isolation.
+
+ src/hb-repacker.hh   | 10 +++++++--
+ src/test-repacker.cc | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 65 insertions(+), 2 deletions(-)
+
+commit 7147f169d6cc93f54b7722022829ddb68957d2a5
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Sep 8 13:44:25 2021 -0700
+
+    [repacker] recursively duplicate nodes during isolation.
+    
+    If a node is duplicated during isolation then any children it has will have incoming links from outside the subgraph (from the duplicated node and the original node), so they must be duplicated too.
+
+ src/hb-repacker.hh | 20 ++++++++++++++++++--
+ 1 file changed, 18 insertions(+), 2 deletions(-)
+
+commit 41bbf2812e9f4f6e704496da5d73ba74d0b4465e
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Sep 8 10:14:00 2021 -0700
+
+    [repacker] do extension subtable isolation before starting resolution attempts.
+
+ src/hb-repacker.hh   | 39 ++++++++++++++++++++++++++++++++-------
+ src/hb-subset.cc     |  2 +-
+ src/test-repacker.cc |  4 ++--
+ 3 files changed, 35 insertions(+), 10 deletions(-)
+
+commit 8d8b7458a4cac9131bd650800ef0e3c0b67adfd4
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Sep 7 16:52:37 2021 -0700
+
+    [repacker] extract overflows processing into its own method.
+
+ src/hb-repacker.hh | 102 ++++++++++++++++++++++++++---------------------------
+ 1 file changed, 51 insertions(+), 51 deletions(-)
+
+commit b14b3f13bae48045c8a8465bdf6f579cb833852c
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Sep 7 16:32:13 2021 -0700
+
+    [repacker] begin implementing the ability to isolate extension subtables.
+    
+    Adds isolate_subgraph operation to the repacker. This severs any links from outside a subgraph by duplicating the affected vertices. This will be used to isolate the subgraphs of a extension subtable from the rest of object graph. Thus allowing the extension subtable to be packed far away from the rest of the objects.
+
+ src/hb-repacker.hh | 122 +++++++++++++++++++++++++++++++++++++++++++++--------
+ 1 file changed, 105 insertions(+), 17 deletions(-)
+
+commit 02c4a516dbcedc40cf7436105a56c6d913fa3675
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Sep 7 13:22:19 2021 -0700
+
+    Add a debug message when offset overflow resolution fails.
+
+ src/hb-repacker.hh | 13 ++++++++++++-
+ 1 file changed, 12 insertions(+), 1 deletion(-)
+
+commit cb2d71c648137f1bd7586d3ec05050f0db50865f
+Author: Ben Wagner <bungeman@chromium.org>
+Date:   Fri Jul 30 14:30:20 2021 -0400
+
+    [mutex] Add hb_mutex_t std::mutex implementation
+    
+    Instead of failing...
+
+ src/hb-mutex.hh | 33 ++++++++++++++++++++-------------
+ 1 file changed, 20 insertions(+), 13 deletions(-)
+
+commit 67b3962fa5348ac7ee8e6297edcc277f3983e8be
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Sep 22 16:21:27 2021 -0600
+
+    [atomic] Cannot fail anymore
+
+ src/hb-atomic.hh | 10 +---------
+ 1 file changed, 1 insertion(+), 9 deletions(-)
+
+commit ca7b9daef06fc515ec84cfb95e7204e9eef3f00e
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Mon Sep 20 14:42:51 2021 -0700
+
+    [subset] subset MATH table
+
+ src/hb-ot-layout-common.hh                         |  37 +++
+ src/hb-ot-math-table.hh                            | 268 +++++++++++++++++++++
+ src/hb-subset-plan.cc                              |  20 +-
+ src/hb-subset-plan.hh                              |   1 +
+ src/hb-subset.cc                                   |   2 +
+ test/subset/data/Makefile.am                       |   1 +
+ test/subset/data/Makefile.sources                  |   1 +
+ .../math/STIXTwoMath-Regular.default.2f,7c,305.ttf | Bin 0 -> 6388 bytes
+ ...woMath-Regular.default.retain-all-codepoint.ttf | Bin 0 -> 1038580 bytes
+ .../STIXTwoMath-Regular.glyph-names.2f,7c,305.ttf  | Bin 0 -> 6540 bytes
+ ...th-Regular.glyph-names.retain-all-codepoint.ttf | Bin 0 -> 1091356 bytes
+ ...TIXTwoMath-Regular.notdef-outline.2f,7c,305.ttf | Bin 0 -> 6636 bytes
+ ...Regular.notdef-outline.retain-all-codepoint.ttf | Bin 0 -> 1038828 bytes
+ .../STIXTwoMath-Regular.retain-gids.2f,7c,305.ttf  | Bin 0 -> 14916 bytes
+ ...th-Regular.retain-gids.retain-all-codepoint.ttf | Bin 0 -> 1053656 bytes
+ test/subset/data/fonts/STIXTwoMath-Regular.ttf     | Bin 0 -> 1517976 bytes
+ test/subset/data/tests/math.tests                  |  12 +
+ test/subset/meson.build                            |   1 +
+ 18 files changed, 342 insertions(+), 1 deletion(-)
+
+commit c2cc566c9d7f63c024c0a15e93c9ae99717a4b4f
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Sep 22 14:15:55 2021 -0700
+
+    [subset] Fix subset_offset_array adding unused space to serializer.
+    
+    ArrayOf.serialize_append allocates space for the new item, but ArrayOf.pop() does not recover the allocated space. So in the case where the revert path was entered the extra space added by serialize_append gets left in the serialization buffer. This moves the snapshot to before ArrayOf.serialize_append is called so that revert cleans up the buffer extend.
+
+ src/hb-ot-layout-common.hh                         |   4 ++--
+ src/hb-ot-layout-gpos-table.hh                     |   2 +-
+ src/hb-ot-layout-gsubgpos.hh                       |   4 ++--
+ ...ns-BlackItalic.default.retain-all-codepoint.ttf | Bin 120240 -> 120236 bytes
+ ...lackItalic.glyph-names.retain-all-codepoint.ttf | Bin 132484 -> 132480 bytes
+ ...kItalic.notdef-outline.retain-all-codepoint.ttf | Bin 120240 -> 120236 bytes
+ ...s2_1_font7.layout-test-retain-gids.21,23,25.otf | Bin 1728 -> 1728 bytes
+ .../gpos2_1_font7.layout-test.21,23,25.otf         | Bin 1384 -> 1384 bytes
+ ...e_subrules_f2.layout-test-retain-gids.41,42.otf | Bin 2208 -> 2208 bytes
+ ...ext1_multiple_subrules_f2.layout-test.41,42.otf | Bin 1400 -> 1400 bytes
+ ...e_subrules_f2.layout-test-retain-gids.41,42.otf | Bin 2224 -> 2224 bytes
+ ...ext2_multiple_subrules_f2.layout-test.41,42.otf | Bin 1416 -> 1416 bytes
+ ...Bold.default.627,644,623,62D,644,627,645,2E.ttf | Bin 11388 -> 11372 bytes
+ ...toNastaliqUrdu-Bold.default.627,644,62D,628.ttf | Bin 17688 -> 17640 bytes
+ .../NotoNastaliqUrdu-Bold.default.627,644.ttf      | Bin 3520 -> 3512 bytes
+ ...rdu-Bold.default.633,645,627,621,20,644,627.ttf | Bin 12380 -> 12360 bytes
+ .../NotoNastaliqUrdu-Bold.default.63A,64A,631.ttf  | Bin 19380 -> 19340 bytes
+ ....retain-gids.627,644,623,62D,644,627,645,2E.ttf | Bin 18224 -> 18208 bytes
+ ...staliqUrdu-Bold.retain-gids.627,644,62D,628.ttf | Bin 23748 -> 23704 bytes
+ .../NotoNastaliqUrdu-Bold.retain-gids.627,644.ttf  | Bin 9164 -> 9160 bytes
+ ...Bold.retain-gids.633,645,627,621,20,644,627.ttf | Bin 18184 -> 18164 bytes
+ ...toNastaliqUrdu-Bold.retain-gids.63A,64A,631.ttf | Bin 25432 -> 25392 bytes
+ .../variable/Fraunces.default.26,66,69,124,125.ttf | Bin 15856 -> 15856 bytes
+ 23 files changed, 5 insertions(+), 5 deletions(-)
+
+commit 8c5c81746d8d4c5921be50a85d219deea2c95762
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Sun Sep 12 20:16:30 2021 -0700
+
+    [subset] fix find_duplicate_features
+    
+    We should check each feature against all other features with the same
+    tag for duplicates.
+
+ src/hb-ot-layout-gsubgpos.hh                       |  70 +++++++++++----------
+ test/subset/data/Makefile.am                       |   1 +
+ test/subset/data/Makefile.sources                  |   1 +
+ ...fault.20,2f,38,49,4c,51,53,66,67,6f,b4,2044.ttf | Bin 0 -> 8452 bytes
+ ...ns-BlackItalic.default.retain-all-codepoint.ttf | Bin 0 -> 120240 bytes
+ ...names.20,2f,38,49,4c,51,53,66,67,6f,b4,2044.ttf | Bin 0 -> 8552 bytes
+ ...lackItalic.glyph-names.retain-all-codepoint.ttf | Bin 0 -> 132484 bytes
+ ...tline.20,2f,38,49,4c,51,53,66,67,6f,b4,2044.ttf | Bin 0 -> 8452 bytes
+ ...kItalic.notdef-outline.retain-all-codepoint.ttf | Bin 0 -> 120240 bytes
+ .../subset/data/fonts/AlegreyaSans-BlackItalic.ttf | Bin 0 -> 211948 bytes
+ .../data/tests/layout.duplicate_features.tests     |  11 ++++
+ test/subset/meson.build                            |   1 +
+ 12 files changed, 50 insertions(+), 34 deletions(-)
+
+commit 1afc3874e00992c378977c2feb25f8088c9c5a9a
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Sun Sep 19 20:41:43 2021 -0700
+
+    [subset] add closure_glyphs () method for MATH table
+
+ src/hb-ot-math-table.hh | 57 +++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 57 insertions(+)
+
+commit 3b2929e8a9da349fbd8437fd0b5cf0c8ce92cf32
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 21 12:21:02 2021 -0600
+
+    [set-digest] Use using instead of typedef
+
+ src/hb-set-digest.hh | 14 ++++++++------
+ 1 file changed, 8 insertions(+), 6 deletions(-)
+
+commit 5694561f75bdea9c7d77d7932598fe4e5f45b33e
+Author: Simon Cozens <simon@simon-cozens.org>
+Date:   Mon Sep 20 15:21:11 2021 +0100
+
+    Add support for Pwo Karen / Ason Chin medial la
+    
+    https://github.com/harfbuzz/harfbuzz/pull/3217
+
+ src/hb-ot-shape-complex-myanmar-machine.hh | 473 +++++++++++++++--------------
+ src/hb-ot-shape-complex-myanmar-machine.rl |   5 +-
+ src/hb-ot-shape-complex-myanmar.hh         |   7 +-
+ 3 files changed, 259 insertions(+), 226 deletions(-)
+
+commit bff56854323f853ed3dbad1105555da5192a7d1b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 20 13:25:58 2021 -0600
+
+    [khmer] Towards separating Khmer from Indic table
+
+ src/hb-ot-shape-complex-khmer.hh | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 5d957ffe74d767f621d7ce4833ce2349206a2391
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 20 11:33:01 2021 -0600
+
+    [myanmar] Towards separating Myanmar from Indic table
+
+ src/hb-ot-shape-complex-myanmar.cc | 2 +-
+ src/hb-ot-shape-complex-myanmar.hh | 3 ++-
+ 2 files changed, 3 insertions(+), 2 deletions(-)
+
+commit 6db4b56e05a6fd993b4f3b5f1d21acc12236361e
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Mon Sep 20 19:18:39 2021 +0200
+
+    Make the file UTF-8 again
+    
+    GitHub web interface failed to show the encoding change.
+
+ src/hb-subset-input.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 14a2df7bc237e7e59ff62c710751c7069733a469
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Sep 19 23:06:09 2021 -0400
+
+    Add stub HBUINT15
+
+ src/hb-open-type.hh        | 9 +++++++++
+ src/hb-ot-layout-common.hh | 2 +-
+ 2 files changed, 10 insertions(+), 1 deletion(-)
+
+commit c852b8684154f707a897b6b62338efc48ebcfd9e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Sep 19 16:30:12 2021 -0400
+
+    Rename HBGlyphID to HBGlyphID16
+
+ perf/texts/en-words.txt                    |  2 +-
+ src/hb-aat-layout-bsln-table.hh            |  4 +-
+ src/hb-aat-layout-common.hh                | 16 +++---
+ src/hb-aat-layout-just-table.hh            |  8 +--
+ src/hb-aat-layout-kerx-table.hh            |  4 +-
+ src/hb-aat-layout-morx-table.hh            | 32 ++++++------
+ src/hb-open-type.hh                        |  4 +-
+ src/hb-ot-cmap-table.hh                    |  4 +-
+ src/hb-ot-color-cbdt-table.hh              |  8 +--
+ src/hb-ot-color-colr-table.hh              |  6 +--
+ src/hb-ot-glyf-table.hh                    |  2 +-
+ src/hb-ot-layout-base-table.hh             |  2 +-
+ src/hb-ot-layout-common.hh                 | 18 +++----
+ src/hb-ot-layout-gpos-table.hh             |  2 +-
+ src/hb-ot-layout-gsub-table.hh             | 78 +++++++++++++++---------------
+ src/hb-ot-layout-jstf-table.hh             |  2 +-
+ src/hb-ot-math-table.hh                    |  4 +-
+ src/hb-ot-shape-complex-arabic-fallback.hh | 14 +++---
+ src/hb-ot-vorg-table.hh                    |  2 +-
+ 19 files changed, 106 insertions(+), 106 deletions(-)
+
+commit 74f96d9d4b359fc138d21709c975a09ba933fb3d
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Sep 17 13:46:07 2021 -0700
+
+    [repacker] fix heap use after free in repacker.
+    
+    Don't store a reference to the link in overflow records as the link object may be freed if the sorted graph vector is resized.
+
+ src/hb-repacker.hh                                      |  12 ++++++------
+ ...testcase-minimized-hb-subset-fuzzer-5127321313476608 | Bin 0 -> 60417 bytes
+ 2 files changed, 6 insertions(+), 6 deletions(-)
+
+commit 7143c8333bae6b0ca238a92d1fdb222d088bf9d1
+Author: ActuallyaDeviloper <ActuallyaDeviloper@users.noreply.github.com>
+Date:   Sat Sep 18 20:59:38 2021 +0200
+
+    Make the code able to compile with MSVC++ from Visual Studio 2015 (Version 14.0.25431.01, Update 3) sucessfully again.
+
+ src/hb-subset-input.hh | 24 +++++++++++++-----------
+ 1 file changed, 13 insertions(+), 11 deletions(-)
+
+commit b36f1510ec5180724e7866e2a86570429a435c93
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Sat Sep 18 23:09:07 2021 +0200
+
+    [doc] Add missing version tags
+
+ src/hb-ot-layout.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 9c387e20d65a7a366ac270d789f6ad266014c9e0
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Fri Sep 17 21:32:30 2021 +0200
+
+    3.0.0
+
+ NEWS                   | 51 ++++++++++++++++++++++++++++++++++++++++++++++++++
+ configure.ac           |  2 +-
+ docs/harfbuzz-docs.xml |  1 +
+ meson.build            |  2 +-
+ src/hb-common.h        | 12 ++++++------
+ src/hb-style.cc        |  2 +-
+ src/hb-style.h         |  2 +-
+ src/hb-version.h       |  8 ++++----
+ 8 files changed, 66 insertions(+), 14 deletions(-)
+
+commit e0d5fe740a6c23a995d4d881bfa330eb1063059d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 17 08:27:03 2021 -0400
+
+    Centralize math include
+    
+    https://github.com/harfbuzz/harfbuzz/pull/3212
+
+ src/hb-style.cc | 3 ---
+ src/hb.hh       | 3 +++
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 671f1d149a880491541d552c0d6e16365480790b
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Sep 15 15:13:41 2021 +0200
+
+    [ci] meson 0.55.0 didn’t work for harfbuzz
+    
+    https://github.com/mesonbuild/meson/issues/7437
+
+ .github/workflows/linux-ci.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f1b20b5a1466cbbea358960967b4a1bbb17956f2
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Sep 15 14:52:49 2021 +0200
+
+    [ci] Ragel subproject requires meson 0.55.0
+
+ .github/workflows/linux-ci.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 835fc1376f47e63f073a967cb6190c194e1e63f2
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Sep 15 14:14:04 2021 +0200
+
+    [ci] Build ragel on the Linux CI job
+    
+    To make sure we don’t accidentally break this option.
+
+ .github/workflows/linux-ci.yml | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit a59e7ec9938cb8a927ea7b02aee8800c36d7d71a
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Sep 15 14:02:52 2021 +0200
+
+    [meson] Add ragel_subproject option
+    
+    Add an option to build fallback ragel subproject when no suitable ragel
+    version is found, and make it off by default since most builder don’t
+    need ragel at all.
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/3208 (hopefully)
+
+ meson_options.txt | 2 ++
+ src/meson.build   | 8 +++++---
+ 2 files changed, 7 insertions(+), 3 deletions(-)
+
+commit 60a38d7988f8e1a15411aabde9ea91d1fe519b7b
+Merge: f4649f389 19cd84b4e
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Fri Sep 17 11:25:42 2021 +0200
+
+    Merge pull request #3210 from NikitaFeodonit/main
+    
+    CMake: Detect pthread with module FindThread
+
+commit f4649f389563819cee909df3c11087dc716f35e9
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Sep 16 13:40:44 2021 -0700
+
+    [subset] restore hb_subset_input_unicode/glyph_set () to documentation.
+
+ docs/harfbuzz-sections.txt | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit d700646c33af53afcabe564e9943565d58e1192a
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Sep 16 11:23:09 2021 -0700
+
+    [subset] In preperation for 3.0.0 release remove legacy subsetting api methods.
+
+ src/hb-subset-input.cc             | 202 -------------------------------------
+ src/hb-subset.cc                   |   8 --
+ src/hb-subset.h                    |  82 ++-------------
+ test/api/hb-subset-test.h          |   4 +-
+ test/api/test-subset-drop-tables.c |   4 +-
+ test/api/test-subset-glyf.c        |  12 +--
+ test/api/test-subset-gpos.c        |   6 +-
+ test/api/test-subset.c             |  53 +---------
+ util/hb-subset.cc                  |   8 +-
+ 9 files changed, 25 insertions(+), 354 deletions(-)
+
+commit 19cd84b4e95190f7ee236cb15a60d4a6be7040a0
+Author: NikitaFeodonit <nfeodonit@yandex.com>
+Date:   Wed Sep 15 16:31:32 2021 +0300
+
+    CMake: Detect pthread with module FindThread
+    
+    Set CMake minimum version to 3.1.
+
+ CMakeLists.txt | 12 ++++++++----
+ 1 file changed, 8 insertions(+), 4 deletions(-)
+
+commit ae145378540846ea3e51d6dee0033b16b9a43dea
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Sep 15 07:46:33 2021 -0400
+
+    [style] Change tag type to hb_style_tag_t
+    
+    https://github.com/harfbuzz/harfbuzz/pull/3201#discussion_r708914354
+
+ src/hb-style.cc | 5 ++---
+ src/hb-style.h  | 2 +-
+ 2 files changed, 3 insertions(+), 4 deletions(-)
+
+commit 470686e8179d728d70fe7d738e831f6d26281def
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Tue Sep 14 20:56:37 2021 -0400
+
+    [USE] Send Khitan Small Script and Yezidi to USE
+
+ src/hb-ot-shape-complex.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 22cbd038d3578c344e265a098fc98ef168f8d18b
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Tue Sep 14 12:34:25 2021 +0200
+
+    [meson] Add ragel subproject
+    
+    If ragel 6.10 is not found, build it from source.
+    
+    Seems to work, except that ragel uses exceptions and we configure
+    HarfBuzz build to not use exceptions, and I can’t find away to enable
+    exceptions only for the ragel subproject. I had to remove cpp_eh=none
+    from default options and try to disable exceptions in MSVC manually
+    (other compilers are already handled).
+
+ Makefile.am                                |  2 ++
+ meson.build                                |  3 +-
+ src/gen-ragel-artifacts.py                 |  8 ++---
+ src/meson.build                            |  5 ++-
+ subprojects/.gitignore                     |  1 +
+ subprojects/packagefiles/ragel/meson.build | 58 ++++++++++++++++++++++++++++++
+ subprojects/ragel.wrap                     | 11 ++++++
+ 7 files changed, 82 insertions(+), 6 deletions(-)
+
+commit 5898a9618cf6004d51c6fa2b34212c0ee61df3b0
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Tue Sep 14 07:09:50 2021 +0200
+
+    [ragel] Regenerate state machine files with 6.10
+
+ src/hb-buffer-deserialize-json.hh        | 1189 +++++++++++++-----------
+ src/hb-buffer-deserialize-text.hh        | 1437 ++++++++++++++++--------------
+ src/hb-ot-shape-complex-khmer-machine.hh |  665 +++++++-------
+ src/hb-ot-shape-complex-use-machine.hh   | 1036 ++++++++++-----------
+ 4 files changed, 2171 insertions(+), 2156 deletions(-)
+
+commit 7e9ac8fea2b6d2b729c1e4c2a773ed2947265b16
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Tue Sep 14 07:07:00 2021 +0200
+
+    [meson] Require ragel 6.10
+    
+    Ragel 7 is also not stable from upstream's point of view.
+    
+    This uses “version” argument find_program(), which was introduced in
+    meson 0.52.0, so I raised the minimum required meson version
+    accordingly.
+
+ .circleci/config.yml           | 2 +-
+ .github/workflows/linux-ci.yml | 2 +-
+ meson.build                    | 2 +-
+ src/meson.build                | 2 +-
+ 4 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 175f24a45938ec27f54154b40d9283f4cf47981c
+Merge: cd77846bd f1493357f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 14 18:46:05 2021 -0600
+
+    Merge pull request #3206 from harfbuzz/unicode-14
+    
+    Update to Unicode 14.0.0
+
+commit f1493357f745ef554276cb5cf3054d3d0f8a7af5
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Tue Sep 14 18:46:50 2021 -0400
+
+    [Unicode 14] Update the Arabic joining script list
+
+ src/hb-ot-shape-complex-arabic-joining-list.hh | 9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
+
+commit a0101a31b5079d7f223e109d13b4f45397aa1db0
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Tue Sep 14 18:38:50 2021 -0400
+
+    [Unicode 14] Add tests
+
+ test/api/test-unicode.c | 13 +++++++++++++
+ 1 file changed, 13 insertions(+)
+
+commit 2c3e4b279b577073df5a16610f7e6ae8aa790ef5
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Tue Sep 14 18:31:42 2021 -0400
+
+    [Unicode 14] Send all the new scripts to USE
+
+ src/hb-ot-shape-complex.hh | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+commit 20736d9bb33f18b8c657e3451ec1287b2866c0d4
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Tue Sep 14 18:25:38 2021 -0400
+
+    [Unicode 14] Update the USE table
+
+ src/hb-ot-shape-complex-use-table.hh | 76 ++++++++++++++++++------------------
+ 1 file changed, 39 insertions(+), 37 deletions(-)
+
+commit 35ac0de42bc3904e90039c7f00a9daf088f9d363
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Tue Sep 14 18:14:20 2021 -0400
+
+    [Unicode 14] Update the emoji table
+
+ src/hb-unicode-emoji-table.hh  | 8 ++++----
+ src/update-unicode-tables.make | 4 +++-
+ 2 files changed, 7 insertions(+), 5 deletions(-)
+
+commit ec5688f50fbc53de9b78fe11ef33fb903075aea6
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Tue Sep 14 18:09:05 2021 -0400
+
+    [Unicode 14] Update the vowel constraint table
+
+ src/hb-ot-shape-complex-vowel-constraints.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 11d5334d8e782ee3284a942eaae1f2dc9e4b4080
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Tue Sep 14 18:00:33 2021 -0400
+
+    [Unicode 14] Update the Indic table
+
+ src/hb-ot-shape-complex-indic-table.cc | 42 +++++++++++++++++-----------------
+ 1 file changed, 21 insertions(+), 21 deletions(-)
+
+commit 18a46eeafbe075dba953a1aba9bffeff089dd227
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Tue Sep 14 17:55:54 2021 -0400
+
+    [Unicode 14] Update the Arabic table
+
+ src/hb-ot-shape-complex-arabic-table.hh | 38 ++++++++++++++++++++-------------
+ 1 file changed, 23 insertions(+), 15 deletions(-)
+
+commit 7b05eec0548f5f5f74cd697a815d45ef2ab51e27
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Tue Sep 14 17:51:11 2021 -0400
+
+    [Unicode 14] Update the script direction list
+
+ src/hb-common.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 26e1498e76245f9e57f7d257c89a7e4be23d65ff
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Tue Sep 14 18:07:29 2021 -0400
+
+    [Unicode 14] Update the UCD table
+
+ src/hb-ucd-table.hh | 6796 ++++++++++++++++++++++++++-------------------------
+ 1 file changed, 3457 insertions(+), 3339 deletions(-)
+
+commit 67f1aa4d219b4636e151c7c01ab393d092ae7b6f
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Tue Sep 14 17:43:13 2021 -0400
+
+    [Unicode 14] Add new `hb_script_t` values
+
+ src/hb-common.h | 14 ++++++++++++++
+ 1 file changed, 14 insertions(+)
+
+commit cd77846bd9e2bab9c40048597ec0ee47604376c3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 14 08:35:19 2021 -0400
+
+    [util] Fix leak of an hb_font_t
+
+ util/font-options.hh | 4 +++-
+ util/options.hh      | 6 ++++--
+ 2 files changed, 7 insertions(+), 3 deletions(-)
+
+commit da285d511f85d6189fdb213cd29f25730baaed02
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 14 08:28:12 2021 -0400
+
+    [util/shape-consumer] Simplify font tracking
+
+ util/shape-consumer.hh | 23 +++++++++++------------
+ 1 file changed, 11 insertions(+), 12 deletions(-)
+
+commit bda3238c89fa4673c8772ad02f1949fc19b41a5e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 14 08:12:48 2021 -0400
+
+    Add fallback atexit implementation using template descrutors
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/3197
+
+ src/hb.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 9c270451581a0d7e969c29d65a9ba62b6b7b9b12
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 14 07:50:35 2021 -0400
+
+    [style] Fix another float conversion warning
+
+ src/hb-style.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 5a1a6f1fe35aa3e1325239e5e7b0ac67c49f7105
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 14 07:14:56 2021 -0400
+
+    [ot-shape] Enabled two more features: 'Harf' and 'Buzz'
+    
+    Considered 'required', as opposed to existing 'HARF' and 'BUZZ',
+    consider them discretionary.
+    
+    See discussion in https://github.com/harfbuzz/harfbuzz/issues/3200
+
+ src/hb-ot-shape.cc | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit ed1163208d97d77082d9b6e57671a55512a87729
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 14 07:09:54 2021 -0400
+
+    Call atexit() via hb_atexit()
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/3197
+
+ src/hb-common.cc    |  8 ++------
+ src/hb-ft.cc        | 24 ++++++------------------
+ src/hb-glib.cc      | 12 +++---------
+ src/hb-icu.cc       | 12 +++---------
+ src/hb-ot-font.cc   | 12 +++---------
+ src/hb-shape.cc     | 12 +++---------
+ src/hb-shaper.cc    | 12 +++---------
+ src/hb-ucd.cc       | 10 ++--------
+ src/hb-uniscribe.cc | 12 +++---------
+ src/hb.hh           | 17 +++++++++++++----
+ 10 files changed, 41 insertions(+), 90 deletions(-)
+
+commit ad4df20dd62efe6db4993861cba2268bd3921c1a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 14 07:11:33 2021 -0400
+
+    [style] Fix float conversion warning
+
+ src/hb-style.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit c5cc23a9b59c2c039a4838e5734741f63c7ae23f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 13 12:14:06 2021 -0400
+
+    [style] Change private slant tag
+    
+    https://github.com/harfbuzz/harfbuzz/issues/3200#issuecomment-918352162
+
+ src/hb-style.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit d748586a186826e8e09ddf290a064f84ff5619e6
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Sat Sep 11 01:11:55 2021 +0200
+
+    [style] Try harder to fix MSVC build
+    
+    https://docs.microsoft.com/en-us/cpp/c-runtime-library/math-constants?view=msvc-160
+
+ src/hb-style.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit e275f0d7edb190fba0e0af56f0e4a7775b7bfccb
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Sat Sep 11 01:03:32 2021 +0200
+
+    [style] Try to fix MSVC build
+
+ src/hb-style.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit eb4075a1ed8362ea3dd65a976141ddf8c12b2207
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Sat Sep 11 00:50:08 2021 +0200
+
+    [style] Fix documentation
+    
+    Message documentation a bit to get it working.
+
+ docs/harfbuzz-docs.xml     |  5 +++++
+ docs/harfbuzz-sections.txt |  6 ++++++
+ src/hb-style.cc            | 11 ++++++++++-
+ src/hb-style.h             |  3 ++-
+ 4 files changed, 23 insertions(+), 2 deletions(-)
+
+commit 4d9b7de0b6b8247bf25f12047ed28d72454182bb
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Sat Sep 11 00:43:43 2021 +0200
+
+    [style] Prepare for release
+
+ src/gen-def.py        |  1 -
+ src/hb-style.cc       | 40 +---------------------------------------
+ src/hb-style.h        | 39 +++++++++++++++++++++++++++++++++++++--
+ test/api/test-style.c | 10 ----------
+ 4 files changed, 38 insertions(+), 52 deletions(-)
+
+commit 34ff2d3ea6b7d3b748d82266e86c4a4d3fe31585
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Sat Sep 11 00:12:03 2021 +0200
+
+    Fix build with -Dexperimental_api=true
+    
+    ../src/hb-style.cc:102:32: error: no matching function for call to 'hb_style_get_value'
+        return _hb_angle_to_ratio (hb_style_get_value (HB_STYLE_TAG_SLANT_ANGLE));
+                                   ^~~~~~~~~~~~~~~~~~
+    ../src/hb-style.cc:99:1: note: candidate function not viable: requires 2 arguments, but 1 was provided
+    hb_style_get_value (hb_font_t *font, hb_tag_t tag)
+    ^
+    
+    and
+    
+    ../src/hb-style.cc:80:1: error: unused function '_hb_ratio_to_angle' [-Werror,-Wunused-function]
+    _hb_ratio_to_angle (float r)
+    ^
+
+ src/hb-style.cc | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 39c20d2b9eb476065e64d3a3cccc6345aa50e4c1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 9 11:19:21 2021 -0600
+
+    [style] Add HB_STYLE_TAG_SLANT_RATIO
+
+ src/hb-style.cc | 15 +++++++++++++++
+ 1 file changed, 15 insertions(+)
+
+commit 201cbe3c66fda566be302aff051cb6f836e2931b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 9 11:09:46 2021 -0600
+
+    [style] Rename HB_STYLE_TAG_SLANT to HB_STYLE_TAG_SLANT_ANGLE
+
+ src/hb-style.cc       |  9 +++++----
+ test/api/test-style.c | 24 ++++++++++++------------
+ 2 files changed, 17 insertions(+), 16 deletions(-)
+
+commit a23ce2897706c150160c21764fea992ac017c5c4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 9 10:59:01 2021 -0600
+
+    [style] Fall back to GPOS 'size' feature for optical size in style API
+
+ src/hb-style.cc | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 37379f8f7d6dab83b011416b8c7ff25d4f7365a0
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Thu Sep 2 11:54:37 2021 -0700
+
+    [subset] fox for (Chain)ContextFormat3: subset lookupRecord
+    
+    skip copying a lookupRecord if lookup referenced in the lookupRecord is
+    not retained after subset
+
+ src/hb-ot-layout-gsubgpos.hh                       |  30 ++++++++++++++++++---
+ test/subset/data/Makefile.am                       |   1 +
+ test/subset/data/Makefile.sources                  |   1 +
+ ...5f2,fb21,fb22,fb23,fb24,fb25,fb26,fb27,fb28.ttf | Bin 0 -> 12424 bytes
+ .../Tinos-Italic.default.retain-all-codepoint.ttf  | Bin 0 -> 412764 bytes
+ ...5f2,fb21,fb22,fb23,fb24,fb25,fb26,fb27,fb28.ttf | Bin 0 -> 12624 bytes
+ ...nos-Italic.glyph-names.retain-all-codepoint.ttf | Bin 0 -> 437592 bytes
+ ...5f2,fb21,fb22,fb23,fb24,fb25,fb26,fb27,fb28.ttf | Bin 0 -> 12424 bytes
+ ...-Italic.notdef-outline.retain-all-codepoint.ttf | Bin 0 -> 412764 bytes
+ ...5f2,fb21,fb22,fb23,fb24,fb25,fb26,fb27,fb28.ttf | Bin 0 -> 87564 bytes
+ ...nos-Italic.retain-gids.retain-all-codepoint.ttf | Bin 0 -> 415140 bytes
+ test/subset/data/fonts/Tinos-Italic.ttf            | Bin 0 -> 455400 bytes
+ test/subset/data/tests/layout.tinos.tests          |  12 +++++++++
+ test/subset/meson.build                            |   1 +
+ 14 files changed, 41 insertions(+), 4 deletions(-)
+
+commit 838d67075240e8be97f44aab4a925a0ee21935ae
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Sep 8 15:12:52 2021 +0200
+
+    [subset] Improve alignment of --help-all message
+
+ util/hb-subset.cc | 11 +++++------
+ 1 file changed, 5 insertions(+), 6 deletions(-)
+
+commit 9b7af950b36b919717580f3a5872812728d60dc1
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Tue Sep 7 15:05:42 2021 +0200
+
+    [docs] Fix subset documentation
+    
+    List the missing new APIs and unlist all the to be deleted legacy APIs.
+
+ docs/harfbuzz-sections.txt |  9 ++-------
+ src/hb-subset.h            | 46 +++++++++++++++++++++++-----------------------
+ 2 files changed, 25 insertions(+), 30 deletions(-)
+
+commit e38b873eaeec6105dcf4c2511a7c29ca6cf0749c
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Tue Sep 7 14:13:23 2021 +0200
+
+    [ci] Use different executer for win64 jobs
+
+ .circleci/config.yml | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+commit 48c9869bda0dcfa7cea11766718d3c5f3a102509
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Tue Sep 7 13:57:44 2021 +0200
+
+    Typo
+
+ NEWS | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 505df5abf8032f3a2295ded417dca9bfb14ea7b8
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Tue Sep 7 13:46:08 2021 +0200
+
+    2.9.1
+
+ NEWS                   | 19 +++++++++++++++++++
+ configure.ac           |  2 +-
+ docs/harfbuzz-docs.xml |  1 +
+ meson.build            |  2 +-
+ src/hb-subset-input.cc |  2 +-
+ src/hb-subset.h        |  2 +-
+ src/hb-version.h       |  4 ++--
+ 7 files changed, 26 insertions(+), 6 deletions(-)
+
+commit 6602cbb7062bf92e6824ae6bc0e5d3aad4b85939
+Author: mahanstreamer <84676642+mahanstreamer@users.noreply.github.com>
+Date:   Mon Aug 23 00:13:25 2021 -0400
+
+    dead link
+
+ docs/usermanual-install-harfbuzz.xml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 916ffe0c8590b4064cd898ac52dd48e3a343b14e
+Author: mahanstreamer <84676642+mahanstreamer@users.noreply.github.com>
+Date:   Mon Aug 23 00:09:19 2021 -0400
+
+    grammer fix
+
+ docs/usermanual-getting-started.xml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 195c05df9925c7c4a4982a286ef9c416b2cde3af
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Sat Sep 4 03:41:19 2021 +0200
+
+    Revert "[ot-shape-normalize] Move buffer out of hb_ot_shape_normalize_context_t"
+    
+    This reverts commit 8cdbea5580731c2bf66e56bf619c1fbb2978692e.
+    
+    For some reason this is causing several tests to crash locally for me
+    (on macOS), see:
+    https://github.com/harfbuzz/harfbuzz/commit/8cdbea5580731c2bf66e56bf619c1fbb2978692e#commitcomment-55898088
+
+ src/hb-ot-shape-normalize.cc | 32 ++++++++++++++------------------
+ src/hb-ot-shape-normalize.hh |  1 +
+ 2 files changed, 15 insertions(+), 18 deletions(-)
+
+commit f4559d243560a6f780e8975d7d48cd1bc1f3096a
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Thu Sep 2 17:56:17 2021 -0400
+
+    Update hb-ot-tag-table.hh
+
+ src/hb-ot-tag-table.hh | 27 ++++++++++++++++++++++++---
+ 1 file changed, 24 insertions(+), 3 deletions(-)
+
+commit 9fddbb3e24469a0cd87de8237a1be52f730809d3
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Fri Sep 3 17:56:08 2021 +0200
+
+    [test] Rename test and split into smaller subtests
+
+ test/shape/data/in-house/Makefile.sources          |  2 +-
+ test/shape/data/in-house/meson.build               |  2 +-
+ .../data/in-house/tests/arabic-decomposition.tests |  4 --
+ .../data/in-house/tests/arabic-normalization.tests | 64 ++++++++++++++++++++++
+ 4 files changed, 66 insertions(+), 6 deletions(-)
+
+commit c6bb719e658573a602eeab184e2c23c5bdc4a284
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Fri Sep 3 16:14:02 2021 +0200
+
+    [test] Add tests for Arabic decomposition
+    
+    Test that both NFC and NFD input produces identical results for fonts
+    that used composed fonts internally (Amiri here) and fonts that
+    decompose internally (Noto Nastaliq Urdu here) and that for the former
+    composed forms are used.
+    
+    See https://github.com/harfbuzz/harfbuzz/issues/3179
+
+ test/shape/data/in-house/Makefile.sources               |   1 +
+ .../fonts/3e46c3b84c1370a06594736c7f8acebf810bbb3b.ttf  | Bin 0 -> 44884 bytes
+ .../fonts/872d2955d326bd6676a06f66b8238ebbaabc212f.ttf  | Bin 0 -> 17556 bytes
+ test/shape/data/in-house/meson.build                    |   1 +
+ .../data/in-house/tests/arabic-decomposition.tests      |   4 ++++
+ 5 files changed, 6 insertions(+)
+
+commit a9dc4fbeacac23407e90b050d81ec8cddc9f4ff1
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Fri Sep 3 16:20:06 2021 +0200
+
+    [test] Make shape test names match file names
+    
+    No idea why test names are underscorified but it it just makes calling
+    meson test testname harder than it should being not able to copy file
+    name directly.
+
+ test/shape/meson.build | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 2bd911b8b49ac9e7cb0708b7ff5861cc3705e915
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Aug 26 14:32:17 2021 -0700
+
+    [subset] handle cmap4 overflows.
+    
+    If a cmap4 subtable overflows during serialization drop it and the corresponding EncodingRecord. Don't drop the corresponding cmap12 table if it would have otherwise been removed.
+
+ src/hb-ot-cmap-table.hh | 49 +++++++++++++++++++++++++++++++++++++++----------
+ src/hb-serialize.hh     | 15 +++++++++++++--
+ 2 files changed, 52 insertions(+), 12 deletions(-)
+
+commit bf81bbfb3541ea4a39bacdbe0568e9e170b1b0f7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 2 00:16:22 2021 -0600
+
+    Revert "[arabic] Do not re-compose Unicode sequences"
+    
+    This reverts commit ff34c240b0a60014a219b8af49c1be2d7e08b388.
+    
+    https://github.com/harfbuzz/harfbuzz/issues/3179#issuecomment-911242833
+
+ src/hb-ot-shape-complex-arabic.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ff34c240b0a60014a219b8af49c1be2d7e08b388
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Sep 1 23:55:00 2021 -0600
+
+    [arabic] Do not re-compose Unicode sequences
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/3179
+
+ src/hb-ot-shape-complex-arabic.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 5fadf4c85e53a9acc9baa126b5588e4f4aeec2ed
+Author: Alba Mendez <me@alba.sh>
+Date:   Wed Sep 1 14:38:01 2021 +0200
+
+    Small docs improvement
+    
+    Mention that the returned strings are always nul terminated for convenience.
+
+ src/hb-ot-name.cc | 9 ++++++---
+ 1 file changed, 6 insertions(+), 3 deletions(-)
+
+commit 04cf6212d72ceffb164b2aaf7315711d4227445f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 30 18:35:08 2021 -0600
+
+    [util/hb-subset] Fix --version and --help again
+    
+    https://github.com/harfbuzz/harfbuzz/commit/38ad093216d8204df2dce18a112ee43964031357
+
+ util/hb-subset.cc | 18 +++++++++++++++---
+ 1 file changed, 15 insertions(+), 3 deletions(-)
+
+commit 5c4c173b06e28171f5fafd54ae0c5a70f38d8d8a
+Merge: 41b9f2abc de8563658
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 30 16:44:28 2021 -0600
+
+    Merge pull request #3146 from googlefonts/set_api
+    
+    [subset] proposed update to subset set apis.
+
+commit de85636581f3c7c8f8140624b78efd76e3ecfd4b
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Aug 30 14:36:05 2021 -0700
+
+    [subset] s/REPLACE/REPLACEME/
+
+ src/hb-subset.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 3844e58e14f6f528c52df06d49c771dd174730b9
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Aug 30 11:16:51 2021 -0700
+
+    [subset] remove helper functions for accessing subset input sets.
+
+ src/hb-subset-input.cc | 24 ++++++++---------
+ src/hb-subset-input.hh | 70 --------------------------------------------------
+ src/hb-subset-plan.cc  | 20 +++++++--------
+ 3 files changed, 22 insertions(+), 92 deletions(-)
+
+commit 41b9f2abcd63589e541da13e295fdb9d2f78a2bb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 29 10:47:11 2021 -0600
+
+    [set] Add TODO item
+
+ src/hb-bit-set.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 93ac700da612b70fec9efb15ed97855dc15f4582
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 29 10:32:40 2021 -0600
+
+    [set] Add copy-constructor/assignment again
+
+ src/hb-bit-set.hh | 10 +++++-----
+ src/hb-set.hh     |  5 +++++
+ 2 files changed, 10 insertions(+), 5 deletions(-)
+
+commit b9a176e268a0dde9ed491130fe4fc5869bcca235
+Author: Garret Rieger <grieger@google.com>
+Date:   Sun Aug 29 10:33:12 2021 -0600
+
+    [subset] speedup cmap4 subsetting for large codepoint counts. (#3178)
+    
+    glyphIdArray generation implementation was O(n^2). Refactored to use a hashmap to reduce complexity. After the change subset time for a 22k codepoint subset went from 7s to 0.7s.
+
+ src/hb-ot-cmap-table.hh | 33 ++++++++++++++-------------------
+ 1 file changed, 14 insertions(+), 19 deletions(-)
+
+commit fdce294120bc7d626321d38df46e4c49823310db
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 29 09:44:52 2021 -0600
+
+    [util/hb-subset] Print error and suggest filing github issue if operation fails
+    
+    https://github.com/harfbuzz/harfbuzz/issues/3173#issuecomment-906715780
+
+ util/batch.hh         | 5 ++++-
+ util/shape-options.hh | 4 ++--
+ 2 files changed, 6 insertions(+), 3 deletions(-)
+
+commit 38ad093216d8204df2dce18a112ee43964031357
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 29 09:44:07 2021 -0600
+
+    [util/hb-subset] Don't ignore errors during face parsing
+    
+    Was ignoring file-not-found errors.
+
+ util/hb-subset.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 57d6bf82519f39717ddb7b7574ac079e3016757f
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Aug 27 10:59:28 2021 -0700
+
+    [subset] in sets union correctly size the pointer array.
+
+ src/hb-subset-input.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 102666dab7ef649fca0fbd3ce043ab2b166d662c
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Aug 27 10:31:37 2021 -0700
+
+    [subset] add test for hb_subset_input_set (...).
+
+ src/hb-subset-input.cc |  1 -
+ test/api/test-subset.c | 30 ++++++++++++++++++++++++++++++
+ 2 files changed, 30 insertions(+), 1 deletion(-)
+
+commit 7194c2a2a370a39d8e41539cb7fde9a9ffed80c3
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Aug 27 08:20:58 2021 -0700
+
+    [subset] use anonymous union to hold the input sets instead of a map.
+
+ src/hb-subset-input.cc | 16 ++++-----------
+ src/hb-subset-input.hh | 56 ++++++++++++++++++++++++++++++++++----------------
+ 2 files changed, 42 insertions(+), 30 deletions(-)
+
+commit 05204d758689751350cf9f14518bfd7fc86db608
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Aug 25 16:51:26 2021 -0700
+
+    [subset] implement hb_subset_input_set (...).
+    
+    Switch to storing the sets keyed by enum internally.
+
+ src/hb-subset-input.cc | 87 ++++++++++++++++++++++++++------------------
+ src/hb-subset-input.hh | 97 ++++++++++++++++++++++++++++++++++++++++++--------
+ src/hb-subset-plan.cc  | 20 +++++------
+ 3 files changed, 145 insertions(+), 59 deletions(-)
+
+commit 50193262f0d8aa1c2d6a2a2e4b68f8d2771157b3
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Aug 25 15:10:21 2021 -0700
+
+    [subset] reorder set enums.
+
+ src/hb-subset.h | 14 +++++++-------
+ 1 file changed, 7 insertions(+), 7 deletions(-)
+
+commit 3282f540a967670d8ee6ac2d78193f6bfaa8c68c
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Aug 25 15:06:42 2021 -0700
+
+    [subset] restore legacy set api methods.
+
+ src/hb-subset.h | 15 +++++++++++++++
+ 1 file changed, 15 insertions(+)
+
+commit 1457c1f0806ce63051cf48c47b9a03741533fc8f
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Aug 25 15:01:28 2021 -0700
+
+    [subset] set enum name changes.
+
+ src/hb-subset.h | 14 ++++++++------
+ 1 file changed, 8 insertions(+), 6 deletions(-)
+
+commit 1b5e1593010eb7c79c58bb68ea1200ef6c8cb740
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Aug 25 14:56:55 2021 -0700
+
+    [subset] Remove HB_SUBSET_SETS_COUNT and flags comment.
+
+ src/hb-subset.h | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 4c389fd9e5c09574651c5dca3917857cc2cf910c
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Aug 13 11:14:52 2021 -0700
+
+    [subset] add unicode and glyph set  enums.
+
+ src/hb-subset.h | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit e3e1ae876646937302593d37ea68e1e650621fcb
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Aug 13 10:53:20 2021 -0700
+
+    [subset] proposed update to subset set apis.
+
+ src/hb-subset.h | 37 ++++++++++++++++++++++++-------------
+ 1 file changed, 24 insertions(+), 13 deletions(-)
+
+commit 1e1438c4fb7ed6fdcfcd8d6ae53eb9ed8d3a8a93
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Aug 26 14:59:29 2021 -0600
+
+    [subset] fix --*-file options in hb-subset. (#3176)
+    
+    The previous change to add -/+ versions of each set type broke all of the --*-file input options since all of the parse functions now default to replacing the set if the + variant is not being used. This fixes the issue by changing parse_file_for to pass '+' as the name to the parsing function. This triggers the append mode.
+
+ util/hb-subset.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9db494f517a217e4bec709762416777b97b4445d
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Aug 26 10:51:38 2021 -0600
+
+    [subset] Update remaining subset input sets to use inversion for all. (#3172)
+    
+    * [subset] Update remaining subset input sets to use inversion for all.
+    
+    * [subset] Update flag help for remaining sets to mention -=.
+
+ src/hb-subset-input.hh | 14 ++++----
+ util/hb-subset.cc      | 95 +++++++++++++++++++++++++++++---------------------
+ 2 files changed, 62 insertions(+), 47 deletions(-)
+
+commit 99356ea5f0b426137e83b68605cb50045bf42708
+Merge: 1620698bd 4b5a81f13
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 25 17:19:06 2021 -0600
+
+    Merge pull request #3150 from harfbuzz/item-context-tests
+    
+    [test] Add tests for item context
+
+commit 1620698bd51d4a21d4cb2ca9ff3d66d10a1a4cd6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 25 16:25:08 2021 -0600
+
+    [subset-input] Minor format
+
+ src/hb-subset-plan.cc | 32 ++++++++++++++++++--------------
+ 1 file changed, 18 insertions(+), 14 deletions(-)
+
+commit 18b4aab6526bdfe1cc595709fbd7586c07a5417a
+Merge: e9e6d66cd 75efade7a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 25 16:21:07 2021 -0600
+
+    Merge pull request #3171 from googlefonts/unicode_glyph_invert
+    
+    [subset] use inverted set for all unicodes.
+
+commit 75efade7a4290413711c00748b38c547021a6f26
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Aug 25 14:51:21 2021 -0700
+
+    [subset] format --gids and --unicodes help messages better.
+
+ util/hb-subset.cc | 15 ++++++++++++---
+ 1 file changed, 12 insertions(+), 3 deletions(-)
+
+commit cd07070e41eb020be0669780be4a8517cfb0e9a6
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Aug 25 14:42:00 2021 -0700
+
+    [subset] Move plan unicodes and gids population to end of _populate_unicodes...
+
+ src/hb-subset-plan.cc | 49 +++++++++++++++++++++++++------------------------
+ 1 file changed, 25 insertions(+), 24 deletions(-)
+
+commit fa4bf7cf58e9193981c9f4a6da7f15f7ba4332d2
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Aug 25 14:31:11 2021 -0700
+
+    [subset] use inverted sets for glyph id input.
+    
+    Adds --gids-=, --glyphs-=, --text-=, --unicodes-= options. Use inverted sets to represent all glyphs and/or all unicodes.
+
+ util/hb-subset.cc | 84 +++++++++++++++++++++++++++++++++++++++++--------------
+ 1 file changed, 63 insertions(+), 21 deletions(-)
+
+commit 4b5a81f13c326e26f740ca61752f95a9d2afe89c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 25 15:20:54 2021 -0600
+
+    [buffer] Fix hb_buffer_append() pre/post-context logic
+    
+    Part of https://github.com/harfbuzz/harfbuzz/pull/3150
+
+ src/hb-buffer.cc | 15 +++++++++++----
+ 1 file changed, 11 insertions(+), 4 deletions(-)
+
+commit 8f4f47df7c42294c06d6bd4f2d0e1b35c4040eb5
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Aug 25 13:34:05 2021 -0700
+
+    [subset] use inverted set for all unicodes.
+    
+    Modify the code that handles input->unicodes to be safe with possibly inverted sets. Also adds --unicodes-= and --unicodes+= flags.
+
+ src/hb-subset-plan.cc | 45 +++++++++++++++++++++++++++------------------
+ util/hb-subset.cc     | 15 ++++++++++++---
+ 2 files changed, 39 insertions(+), 21 deletions(-)
+
+commit e9e6d66cd6bf00124fa3cffdbeece44dcffb1bbd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 24 23:22:49 2021 -0600
+
+    [subset] Minor internal parameter rename
+
+ src/hb-subset-plan.cc | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 955f86a034b11827a5d3bfb6e60f7e00a4bf40db
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 24 11:17:10 2021 -0600
+
+    [test-set] Fix compiler warnings
+
+ test/api/test-set.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 59deb754b3e199ff47e1ce2c22aab1a3486615ba
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Aug 24 17:06:14 2021 -0700
+
+    [subset] rename _collect_subset_layout to _collect_layout_indices.
+    
+    Better describes what the function does.
+
+ src/hb-subset-plan.cc | 31 ++++++++++++++++---------------
+ 1 file changed, 16 insertions(+), 15 deletions(-)
+
+commit f2441a4b65288dfc1c17a52bb31d694fb3e3ce08
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Aug 24 15:53:32 2021 -0700
+
+    [subset] Remove retain all layout features flag.
+    
+    Instead use inverted sets to handle requesting all features. Modifies feature collection in subset plan to intersect the set of requested features against the features in the font. This prevents iterating a fully filled feature tag set.
+
+ src/hb-subset-input.cc | 15 ----------
+ src/hb-subset-plan.cc  | 74 +++++++++++++++++++++++++-------------------------
+ src/hb-subset.h        | 11 --------
+ test/api/test-subset.c |  4 +--
+ util/hb-subset.cc      | 12 ++------
+ 5 files changed, 42 insertions(+), 74 deletions(-)
+
+commit f84daccb4f85e6ec86e2608fbe59c1e92ec0d814
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Aug 24 14:20:26 2021 -0700
+
+    [set] include null pool sets in the permutations tested by inverted_operations.
+
+ test/api/test-set.c | 38 +++++++++++++++++++++++++-------------
+ 1 file changed, 25 insertions(+), 13 deletions(-)
+
+commit c90678cbc5856a425e7b6b50a516bc8287569a39
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 24 11:11:12 2021 -0600
+
+    [set] One more try to fix things
+    
+    That I don't let a "make check -j10" run finish before pushing things
+    out means either that we need to speed up our build / test process,
+    or I need a faster laptop...
+
+ src/hb-bit-set.hh | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 357976963ec7228d4790d9524142943f5ecf112e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 24 10:55:12 2021 -0600
+
+    [set] One more try at fixing clear() on empty set
+
+ src/hb-bit-set.hh | 15 ++++++---------
+ 1 file changed, 6 insertions(+), 9 deletions(-)
+
+commit fb07f8f8761b12dadaa18bb42d09706bb69c56e3
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Aug 23 15:33:57 2021 -0700
+
+    During subset input creation check for set alloc failures and fail if encountered.
+
+ src/hb-subset-input.cc                                      |  12 ++++++++++++
+ ...estcase-minimized-hb-subset-fuzzer-5141317848530944.fuzz | Bin 0 -> 8 bytes
+ 2 files changed, 12 insertions(+)
+
+commit b5177d21473bdabb16bd9bfe8f4512edc776c1c1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 24 10:43:37 2021 -0600
+
+    [set] Fix seam exposed by previous commit
+
+ src/hb-bit-set.hh | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit f0de40dd61dd261cda197383d192ca487408a3f7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 23 23:52:17 2021 -0600
+
+    Whitespace
+
+ src/hb-ot-shape.cc | 9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
+
+commit 8cdbea5580731c2bf66e56bf619c1fbb2978692e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 23 23:44:55 2021 -0600
+
+    [ot-shape-normalize] Move buffer out of hb_ot_shape_normalize_context_t
+
+ src/hb-ot-shape-normalize.cc | 32 ++++++++++++++++++--------------
+ src/hb-ot-shape-normalize.hh |  1 -
+ 2 files changed, 18 insertions(+), 15 deletions(-)
+
+commit 10da9fd20de74411f1a463e17628d8a2395e6eaa
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 23 23:32:02 2021 -0600
+
+    [ot-map] Whitespace
+
+ src/hb-ot-map.cc | 25 ++++++++++++++++++++-----
+ 1 file changed, 20 insertions(+), 5 deletions(-)
+
+commit d3e09bf4654fe5478b6dbf2b26ebab6271317d81
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 24 10:31:49 2021 -0600
+
+    [set] Make all operators null-safe again
+    
+    Changed my mind.
+    
+    Also for hb_map_clear().
+    
+    Part of https://github.com/harfbuzz/harfbuzz/pull/3162
+
+ src/hb-bit-set-invertible.hh | 38 ++++++++++++++++++++++++++++++--------
+ src/hb-map.cc                |  3 ---
+ src/hb-map.hh                |  2 ++
+ src/hb-set.cc                | 28 +++++++---------------------
+ 4 files changed, 39 insertions(+), 32 deletions(-)
+
+commit 33bfe9edd679d61898209281960ec1a8570a11c7
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Mon Aug 16 17:00:57 2021 +0200
+
+    [test] Add tests for item context
+    
+    Test pre-context and post-context in Arabic shaper, as well as
+    interaction of pre-context with BOT flag.
+
+ test/shape/data/in-house/Makefile.sources                |   1 +
+ .../fonts/3105b51976b879032c66aa93a634b3b3672cd344.ttf   | Bin 0 -> 2768 bytes
+ .../fonts/65984dfce552a785f564422aadf4715fa07795ad.ttf   | Bin 0 -> 4020 bytes
+ test/shape/data/in-house/meson.build                     |   1 +
+ test/shape/data/in-house/tests/item-context.tests        |  11 +++++++++++
+ 5 files changed, 13 insertions(+)
+
+commit 430224b1a06c6eef04de9b6e1ee5aa2cb7a9a403
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Mon Aug 16 15:40:47 2021 +0200
+
+    [buffer] Handle pre/post-context in buffer_append
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1843
+
+ src/hb-buffer.cc      | 15 +++++++++++++++
+ util/shape-options.hh |  1 -
+ 2 files changed, 15 insertions(+), 1 deletion(-)
+
+commit 6ca0ffd42e0a5cea2adc9efaedf7fc6fd333f9d1
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Mon Aug 16 14:52:13 2021 +0200
+
+    [util] Add --unicodes-before/after
+    
+    Parallel to --unicodes for --text-before/after. To be used in tests.
+
+ util/text-options.hh | 156 +++++++++++++++++++++++++++++++++++++++++----------
+ 1 file changed, 126 insertions(+), 30 deletions(-)
+
+commit 65c622c6892dcbe44996962a748f13569600d389
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Mon Aug 23 21:23:30 2021 +0200
+
+    Typo
+
+ docs/usermanual-install-harfbuzz.xml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c76af4973cc9f9b64f829a81bb6107218cf303f6
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Mon Aug 23 20:50:35 2021 +0200
+
+    [doc] We use GitHub for discussion not the mailing list
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/3160
+
+ docs/usermanual-install-harfbuzz.xml | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 33c82c7dad41a7dc7ac007b63a5c3e9a45b6faf4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 22 22:31:39 2021 -0600
+
+    [ot-shape] Fix unused-var error when building without AAT
+    
+    Fixes https://github.com/harfbuzz/harfbuzzjs/issues/45
+
+ src/hb-ot-shape.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 34e0b28faef0f4157a47cc3e2feb7360f82232fd
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Wed Aug 18 20:46:06 2021 -0700
+
+    [subset] make glyph-names option match fonttools behavior
+    
+    Don't encode psNames that are contained in standard glyph names set
+
+ src/hb-ot-post-table-v2subset.hh                   |  24 +++++++++++++++++----
+ test/subset/data/Makefile.am                       |   1 +
+ test/subset/data/Makefile.sources                  |   1 +
+ ...ular.glyph-names.0x0,0x8,0x9,0x1d,0x20,0xb7.ttf | Bin 0 -> 10172 bytes
+ ...tu-Regular.glyph-names.retain-all-codepoint.ttf | Bin 0 -> 281092 bytes
+ test/subset/data/fonts/Ubuntu-Regular.ttf          | Bin 0 -> 351884 bytes
+ test/subset/data/tests/glyph_names.tests           |   9 ++++++++
+ test/subset/meson.build                            |   1 +
+ 8 files changed, 32 insertions(+), 4 deletions(-)
+
+commit 829b0f33531b3c14b2e08331b8cc5b31fed73129
+Merge: 280366ba6 915550ab1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 20 01:28:15 2021 -0600
+
+    Merge pull request #3154 from harfbuzz/set-invert
+    
+    Resurrect hb_set_invert()
+
+commit 915550ab19659107acea9e70a7bc699a19fe2f44
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Aug 19 17:48:38 2021 -0700
+
+    [set] remove inverted test TODO.
+
+ test/api/test-set.c | 13 -------------
+ 1 file changed, 13 deletions(-)
+
+commit c4ed58299761ac2e5452bec890e44fcb7c9f1cc7
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Aug 19 17:47:41 2021 -0700
+
+    [set] add test for inverted set operations.
+    
+    This test checks all possible set configurations against each operation type.
+
+ test/api/test-set.c | 125 ++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 125 insertions(+)
+
+commit 325fd6ddb85a141507f752f37ab650bb56299247
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Aug 19 15:54:31 2021 -0700
+
+    [set] add tests for inverted set equality.
+
+ test/api/test-set.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++-
+ 1 file changed, 55 insertions(+), 1 deletion(-)
+
+commit 287032af6cf3609bb9ca88cf622d478fc77698e3
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Aug 19 15:45:28 2021 -0700
+
+    [set] update set test TODO list.
+
+ test/api/test-set.c | 9 +--------
+ 1 file changed, 1 insertion(+), 8 deletions(-)
+
+commit 5c003d80a680ec619f0922318244e7d41ca709ba
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Aug 19 15:41:12 2021 -0700
+
+    [set] add tests for inverted previous iteration.
+
+ test/api/test-set.c | 108 ++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 108 insertions(+)
+
+commit 84c2a30214eed8e9cabc1efa7460c74e0ca4f214
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 19 16:33:48 2021 -0600
+
+    [bit-set-invertible] Second try fixing previous()
+
+ src/hb-bit-set-invertible.hh | 25 +++++++++++++------------
+ 1 file changed, 13 insertions(+), 12 deletions(-)
+
+commit 8f88747a5e100adc3f722baf573143cbb812ac48
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 19 16:30:48 2021 -0600
+
+    [bit-set-invertible] Fix previous() iteration
+
+ src/hb-bit-set-invertible.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 3f2cc582f283319a5f98469b993403c6f79f3ef9
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Aug 19 15:00:07 2021 -0700
+
+    [set] add basic and iteration set inverion tests.
+
+ test/api/test-set.c | 220 ++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 220 insertions(+)
+
+commit 1d832693e17935e025201905236b9fa34e1f310d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 19 16:02:30 2021 -0600
+
+    [set] Protect against immutible null set with invertible addition
+
+ src/hb-map.cc |  2 ++
+ src/hb-set.cc | 22 ++++++++++++++++++++++
+ 2 files changed, 24 insertions(+)
+
+commit 7115af23ebe4a896174d1a246fcfb3b4d0fe6806
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 19 15:55:21 2021 -0600
+
+    [util] Fix glib deprecation warning re g_memdup()
+
+ util/hb-subset.cc | 8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+commit dc800ffd6c0b806b5b0db9d48cd57528d1fae3eb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 19 15:35:51 2021 -0600
+
+    [bit-set] Remove TODO items we don't intend to finish
+
+ src/hb-bit-set.hh | 8 --------
+ 1 file changed, 8 deletions(-)
+
+commit 92908c122bb578d502bdaa2fbf7a9a3b41540ae0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 19 15:28:26 2021 -0600
+
+    [bit-set-invertible] Remove extra check
+    
+    We don't expect immutable / null set in this code.
+
+ src/hb-bit-set-invertible.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 1babe80ed2506b36c22275b4c511296c8d9b4096
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 19 15:18:32 2021 -0600
+
+    [bit-set-invertible] Fix last remaining corner-case
+
+ src/hb-bit-set-invertible.hh | 13 ++++++++++++-
+ 1 file changed, 12 insertions(+), 1 deletion(-)
+
+commit e8911d137ca1e367a41143ece02149a62779cdf0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 19 14:59:57 2021 -0600
+
+    [bit-set-invertible] Implement a couple other missing corner cases
+    
+    Also, in bit-set, don't compute population in is_equal/is_subset()
+    if we don't have it computed already.
+
+ src/hb-bit-set-invertible.hh |  7 +++----
+ src/hb-bit-set.hh            | 14 +++++++++-----
+ 2 files changed, 12 insertions(+), 9 deletions(-)
+
+commit 2579dc648f940c7c66ac0ef2cc75c7b6754c6892
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 19 14:48:27 2021 -0600
+
+    [bit-set-invertible] Move code around
+
+ src/hb-bit-set-invertible.hh | 31 +++++++++++++++----------------
+ 1 file changed, 15 insertions(+), 16 deletions(-)
+
+commit 2dfc104236395f224b6834ab52263fbafbe92651
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 19 14:47:33 2021 -0600
+
+    [bit-set-invertible] Implement is_empty() for inverted case as well
+
+ src/hb-bit-set-invertible.hh | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+commit ec4812a7d4031c2a579f0d49f526f0a9b418e063
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 19 13:32:44 2021 -0600
+
+    [bit-page] Remove unused inverted code
+
+ src/hb-bit-page.hh | 47 +++++++++++++++++------------------------------
+ 1 file changed, 17 insertions(+), 30 deletions(-)
+
+commit 87885e6f02fef1d8289050c1c939d5a5566b5ee2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 19 13:26:25 2021 -0600
+
+    [bit-set-invertible] Fix next/previous() logic
+
+ src/hb-bit-set-invertible.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit ee4e331a6e05ce5e99671a401e986c0fcdd2a691
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 19 13:23:22 2021 -0600
+
+    [bit-set] Remove unused get_min(inverted)
+
+ src/hb-bit-set.hh | 16 +++-------------
+ 1 file changed, 3 insertions(+), 13 deletions(-)
+
+commit eec1a25e7169a2958a4f739d98cca4ae6e38605f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 19 13:22:36 2021 -0600
+
+    [bit-set-invertible] Rewrite get_min/max() in terms of next/previous()
+
+ src/hb-bit-set-invertible.hh | 12 ++++++++++--
+ 1 file changed, 10 insertions(+), 2 deletions(-)
+
+commit f09d5ed0f52987f4af39d0a577762d4dda99509c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 19 13:06:10 2021 -0600
+
+    [algs] Remove hb_bitwise_non()
+
+ src/hb-algs.hh | 6 ------
+ 1 file changed, 6 deletions(-)
+
+commit f4fd7baf7ec8ff5954e226f2e7ea2697e84a39dd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 19 13:05:12 2021 -0600
+
+    [bit-set-invertible] Fix subtract() logic
+
+ src/hb-bit-set-invertible.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f317d8e4261e6fef1a7d5682bd62a4562588b322
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 19 13:01:07 2021 -0600
+
+    [bit-set-invertible] Fix intersect() logic
+
+ src/hb-bit-set-invertible.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit b21038d91de7f67bbfec549f618b0238c3ca7735
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 19 11:24:17 2021 -0600
+
+    [bit-set-invertible] Rewrite next/previous_range() in terms of s.next/previous()
+
+ src/hb-bit-set-invertible.hh | 26 ++++++++------------------
+ 1 file changed, 8 insertions(+), 18 deletions(-)
+
+commit eb98bc1e322c0675de7f7b00e4e1932ec593277d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 19 11:19:24 2021 -0600
+
+    [bit-set-invertible] Rewrite next/previous() using s.next/previous_range()
+
+ src/hb-bit-set-invertible.hh | 54 ++++++++++++++++++++++++--------------------
+ 1 file changed, 30 insertions(+), 24 deletions(-)
+
+commit 248ad3bce5b5e7190e174929bf1892f1a2bafb44
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 19 10:17:51 2021 -0600
+
+    [bit-set-invertible] Implement next/previous
+    
+    This makes invertible set functionality complete.
+
+ src/hb-bit-set-invertible.hh | 48 ++++++++++++++++++++++++++++++++++++++++----
+ 1 file changed, 44 insertions(+), 4 deletions(-)
+
+commit c27f5b1288e4786c27bd010a1f6b41c29ab37992
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 19 10:01:24 2021 -0600
+
+    [bit-set-invertible] Plug in next_range()/previous_range()
+
+ src/hb-bit-set-invertible.hh | 34 ++++++++++++++++++++++++++++++----
+ 1 file changed, 30 insertions(+), 4 deletions(-)
+
+commit f6aa37159bf1f4b3a2b83c7e263f4642959af73a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 19 01:12:25 2021 -0600
+
+    [bit-set-invertible] Fix process logic for inverted
+    [# On branch set-invert
+
+ src/hb-bit-set-invertible.hh | 9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
+
+commit 060de189ecdf2327c6583b97f02c33c21889ca15
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 19 00:58:34 2021 -0600
+
+    [bit-page] Fix sanitizer error
+    
+    This essentially reverts 9449cfeefd7e3b761c8035c45330abd7a5201604
+    
+    Problem was dereferencing pointer at end of array...
+
+ src/hb-bit-page.hh | 12 ++++++++----
+ 1 file changed, 8 insertions(+), 4 deletions(-)
+
+commit b119b48079ab4bece6bb0cf75c6606d25c49ee5e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 19 00:51:24 2021 -0600
+
+    [bit-set-invertible] Add unlikely() around inverted checks
+
+ src/hb-bit-set-invertible.hh | 36 +++++++++++++++++++-----------------
+ 1 file changed, 19 insertions(+), 17 deletions(-)
+
+commit b94f24ec79877d57a17e8e8b9961127d590afa34
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 19 00:48:00 2021 -0600
+
+    [bit-set-invertible] Implement set algebra
+
+ src/hb-algs.hh               | 32 +++++++++++++++++++-
+ src/hb-bit-set-invertible.hh | 71 +++++++++++++++++++++++++++++++++++++-------
+ src/hb-bit-set.hh            |  2 +-
+ 3 files changed, 93 insertions(+), 12 deletions(-)
+
+commit 6afefe1dc3f7aedc1f355bfa70bfee1a15829ec1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 19 00:27:03 2021 -0600
+
+    [algs] Remove unnecessary struct tag names
+
+ src/hb-algs.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 8aa92ff8f054a1b7b8d06618a6366a44cba8fe87
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 18 23:01:06 2021 -0600
+
+    [bit-set-invertible] Implement get_min/max
+
+ src/hb-bit-set-invertible.hh |  4 ++--
+ src/hb-bit-set.hh            | 16 +++++++++++++---
+ 2 files changed, 15 insertions(+), 5 deletions(-)
+
+commit 18f50275ed2b66c9316d68138572b84ee713f0cc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 18 22:08:06 2021 -0600
+
+    [bit-set] Restructure get_min/max() in prep for adding inverted
+
+ src/hb-bit-set.hh | 26 ++++++++++++++++++--------
+ 1 file changed, 18 insertions(+), 8 deletions(-)
+
+commit 669b97d949173ceb691ece4c71c606f90c2f3e3f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 18 21:39:04 2021 -0600
+
+    [bit-set-invertible] Implement iterator
+
+ src/hb-bit-set-invertible.hh | 32 +++++++++++++++++++++++++++++---
+ 1 file changed, 29 insertions(+), 3 deletions(-)
+
+commit c66894d7c9f7883032fbe92aa33c49cb689b1230
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 18 21:24:29 2021 -0600
+
+    [bit-set-invertible] Write a subset branch as dagger
+
+ src/hb-bit-set-invertible.hh | 8 +-------
+ 1 file changed, 1 insertion(+), 7 deletions(-)
+
+commit c39d2f7a76807cfa8198eb931ff6c58e6bb7fc67
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 18 21:20:54 2021 -0600
+
+    [bit-set-invertible] Implement add_array / add_sorted_array / intersects
+
+ src/hb-bit-set-invertible.hh | 9 ++++++---
+ 1 file changed, 6 insertions(+), 3 deletions(-)
+
+commit 0efa614c04a237722ca6a63a7b0c481fee11be97
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 18 21:16:05 2021 -0600
+
+    [bit-set] Add del_array/del_sorted_array()
+
+ src/hb-bit-set.hh | 35 +++++++++++++++++++++++++++++------
+ 1 file changed, 29 insertions(+), 6 deletions(-)
+
+commit 48ad9eef1eb5e5226fcfdb86f3cf5be925456a57
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 18 21:05:21 2021 -0600
+
+    [bit-set] Merge page_for_insert() into page_for()
+
+ src/hb-bit-set.hh | 27 +++++++++++----------------
+ 1 file changed, 11 insertions(+), 16 deletions(-)
+
+commit 280366ba6af14fbcacbc49e6aa1c12d83e531ad1
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Aug 18 15:50:49 2021 -0700
+
+    Add TODO to update NN offsets to allow nulls.
+
+ src/hb-ot-color-cpal-table.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit dc31920bbe3a35c565f89aaeca43e2a5fdb5b606
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Aug 18 14:20:14 2021 -0700
+
+    Don't serialize null offsets in CPAL.
+    
+    Fixes https://oss-fuzz.com/testcase-detail/5443213648330752
+
+ src/hb-ot-color-cpal-table.hh                             |  11 ++++++++---
+ ...z-testcase-minimized-hb-subset-fuzzer-5443213648330752 | Bin 0 -> 567 bytes
+ 2 files changed, 8 insertions(+), 3 deletions(-)
+
+commit e29f56354a62683bc461d4dfba48de4173ccd538
+Author: Simon Cozens <simon@simon-cozens.org>
+Date:   Wed Aug 18 08:51:41 2021 +0100
+
+    Replace "langstr" with more helpful help.
+
+ util/shape-options.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 7f9173d67f14dd273f6366cfcbf3498e6a8b2f56
+Author: Caleb Maclennan <caleb@alerque.com>
+Date:   Wed Aug 18 14:43:54 2021 +0300
+
+    [ci] Fix workflow so ‘publish-*’ dependencies can run
+    
+    This is a documented but bizarre quirk on Circle CI: in order for a job
+    to run as a dependency of another job that has a filter it must also
+    have at least one filter of its own, even if the filter is a noop.
+    
+    https://circleci.com/docs/2.0/workflows/#executing-workflows-for-a-git-tag
+
+ .circleci/config.yml | 15 ++++++++++++---
+ 1 file changed, 12 insertions(+), 3 deletions(-)
+
+commit a997f8918ea4e748657b4feb60dda84044c50ffd
+Author: Caleb Maclennan <caleb@alerque.com>
+Date:   Wed Aug 18 13:23:19 2021 +0300
+
+    [ci] Bump ghr tool used to post release artifacts to v0.14.0
+    
+    Also make sure we only download it once per CI run, not three times...
+
+ .ci/publish_release_artifact.sh | 13 ++++++++-----
+ 1 file changed, 8 insertions(+), 5 deletions(-)
+
+commit 80ff72f39dc833118426521f82f6bf614ef274d5
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Aug 18 13:09:03 2021 +0200
+
+    [doc] Misc fixes
+
+ docs/harfbuzz-docs.xml     | 1 +
+ docs/harfbuzz-sections.txt | 6 +++---
+ src/hb-subset-input.cc     | 6 ++++--
+ 3 files changed, 8 insertions(+), 5 deletions(-)
+
+commit 9aa6f8a93f035dd0a1e3978da495d830049480c8
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Aug 18 09:32:04 2021 +0200
+
+    2.9.0
+
+ NEWS                   | 20 ++++++++++++++++++++
+ configure.ac           |  2 +-
+ meson.build            |  2 +-
+ src/hb-subset-input.cc | 18 +++++++++---------
+ src/hb-subset.cc       |  2 +-
+ src/hb-subset.h        |  2 +-
+ src/hb-version.h       |  6 +++---
+ 7 files changed, 36 insertions(+), 16 deletions(-)
+
+commit adf3f3b317dbf95b3906f3003bd01195ec3121f7
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Aug 18 09:29:28 2021 +0200
+
+    Revert "2.9.0"
+    
+    This reverts commit 791aba9c45709a68ce6d5dc1066d22399dc4bee4.
+
+ NEWS | 20 --------------------
+ 1 file changed, 20 deletions(-)
+
+commit 791aba9c45709a68ce6d5dc1066d22399dc4bee4
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Aug 18 09:25:27 2021 +0200
+
+    2.9.0
+
+ NEWS | 20 ++++++++++++++++++++
+ 1 file changed, 20 insertions(+)
+
+commit f0c3804fa292ef3be41cc8d1cdea8239f00e2295
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 17 15:37:19 2021 -0600
+
+    [set] Add hb_bit_set_invertible_t and resurrect hb_set_invert()
+    
+    Implementation is NOT complete yet.
+
+ docs/harfbuzz-sections.txt   |   2 +-
+ src/Makefile.sources         |   1 +
+ src/hb-bit-set-invertible.hh | 168 +++++++++++++++++++++++++++++++++++++++++++
+ src/hb-bit-set.hh            |  15 ++--
+ src/hb-deprecated.h          |   3 -
+ src/hb-set.cc                |   9 +--
+ src/hb-set.h                 |   3 +
+ src/hb-set.hh                |  40 +++++------
+ 8 files changed, 201 insertions(+), 40 deletions(-)
+
+commit b5cdbdc030dc700134f41b67b5a42ab54806a9a3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 17 10:53:08 2021 -0600
+
+    [set] Turn hb_set_t into instance of template taking implementation t
+
+ src/hb-set.hh | 32 ++++++++++++++++++--------------
+ 1 file changed, 18 insertions(+), 14 deletions(-)
+
+commit fad452bffb4047b84aad3e2684244ce0385742ff
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 16 20:48:24 2021 -0600
+
+    [set] Move main functionality into hb_bit_set_t
+    
+    To add inversion on top in hb_invertible_set_t and use that as hb_set_t.
+
+ src/Makefile.sources         |   1 +
+ src/hb-bit-set.hh            | 787 +++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-layout-gsubgpos.hh |   5 +-
+ src/hb-set.cc                |   2 +-
+ src/hb-set.hh                | 737 ++--------------------------------------
+ 5 files changed, 828 insertions(+), 704 deletions(-)
+
+commit 9cc4da962f53c2a9883742a0d9e9fd24222bd7b4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 16 20:17:53 2021 -0600
+
+    [object] Remove hb_object_is_inert()
+
+ src/hb-object.hh | 15 ++++++---------
+ 1 file changed, 6 insertions(+), 9 deletions(-)
+
+commit 2d5ef05d67d9a352d620e9d9e781e25717ab3a31
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 16 20:13:58 2021 -0600
+
+    Use !g_object_is_valid() instead of g_object_is_inert()
+
+ src/hb-shape-plan.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit f6d6eff6a2f996df3144b9c03326c8efdcbf10bf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 16 19:41:44 2021 -0600
+
+    [object] Remove unused HB_REFERENCE_COUNT_INIT
+
+ src/hb-object.hh | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 57d86950c3f913805a5527a54eb735ef9360c8d5
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Mon Aug 16 21:54:26 2021 +0200
+
+    [meson] Update FreeType wrap to use upstream repo
+
+ subprojects/freetype2.wrap | 8 +++-----
+ 1 file changed, 3 insertions(+), 5 deletions(-)
+
+commit f245dc4db86483be3ede773e0bc8ba68065e2380
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 15 12:40:36 2021 -0600
+
+    [set] Whitespace
+
+ src/hb-set.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 9b390f8c40eb80871778b13de7e987bd0e8bedad
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 15 12:34:55 2021 -0600
+
+    [set] Move page_t into hb-bit-page.hh
+
+ src/Makefile.sources |   1 +
+ src/hb-bit-page.hh   | 212 +++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-set.hh        | 190 ++-------------------------------------------
+ src/meson.build      |   1 +
+ 4 files changed, 221 insertions(+), 183 deletions(-)
+
+commit 0c3e02ee2d0b24d7fbed92ab2b51c3e98bbe69e8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 15 12:10:13 2021 -0600
+
+    [set] Add "inverted" to page_t::is_empty()
+
+ src/hb-set.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 9bd64fa077ed1133ec96341335c62f91b3f9b9ce
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 15 11:42:16 2021 -0600
+
+    [set] Add "inverted" to page_t::next/prev()
+
+ src/hb-set.hh | 12 +++++++-----
+ 1 file changed, 7 insertions(+), 5 deletions(-)
+
+commit c88e7ec935caf31ca7db6b90ab0db514c1b65e45
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 15 11:39:31 2021 -0600
+
+    [set] Add page_t::elt_maybe_invert()
+
+ src/hb-set.hh | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 9449cfeefd7e3b761c8035c45330abd7a5201604
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 15 11:35:33 2021 -0600
+
+    [set] Simplify page_t::next/prev()
+
+ src/hb-set.hh | 14 +++++++-------
+ 1 file changed, 7 insertions(+), 7 deletions(-)
+
+commit 4394ee1f1dd355b4e8c4e4ad8f310ed624c64e01
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 15 11:28:09 2021 -0600
+
+    [set] Add inverted to page_t::get_min/max()
+
+ src/hb-set.hh | 18 ++++++++++++------
+ 1 file changed, 12 insertions(+), 6 deletions(-)
+
+commit 0dcd9b15d964c7eee3344525313c15a2ff4a16e4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 15 11:11:10 2021 -0600
+
+    [set] Add page_t::set_range()
+
+ src/hb-set.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit cb273fd17c436ada2b88aaecc585b62eb5203691
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 15 11:09:08 2021 -0600
+
+    [set] Add page_t::set()
+
+ src/hb-set.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 32bbf53d9c860c32fb9109a11459ccba6eba7110
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 15 11:06:52 2021 -0600
+
+    [set] Minor rewrite one cmp() in term of other
+
+ src/hb-set.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 5b4dbf5af361161194d815fd97d616429f6bf81c
+Merge: cb05c363d d203267e5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 15 12:57:55 2021 -0600
+
+    Merge pull request #3148 from harfbuzz/win64
+    
+    Build win64 binaries
+
+commit d203267e53d1007ea1974111dee26c5383b3ee9a
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Sun Aug 15 18:29:26 2021 +0200
+
+    [ci] Remove effectively ignored filters
+    
+    We want these jobs to always run, and the filter does not seem to do
+    anything anyway.
+
+ .circleci/config.yml | 10 ++--------
+ 1 file changed, 2 insertions(+), 8 deletions(-)
+
+commit f73053edafdcdd04855055e8b04eff33b425ae7d
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Sun Aug 15 18:27:32 2021 +0200
+
+    [ci] Don’t install unused dependencies
+    
+    This is a cross build job, native libraries are not used.
+
+ .circleci/config.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ddb4f9b9674a651fafd0e628ea7ea74a20e61ad9
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Sun Aug 15 17:24:51 2021 +0200
+
+    [ci] Build win64 binaries as well
+
+ .ci/build-win64.sh   | 27 +++++++++++++++++++++++++++
+ .circleci/config.yml | 33 +++++++++++++++++++++++++++++++++
+ 2 files changed, 60 insertions(+)
+
+commit cb05c363d7f85f1a9f309cc91a372d1305ee8f9e
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Aug 13 15:19:20 2021 -0700
+
+    [subset] add some basic tests for the legacy subset methods.
+
+ src/hb-subset-input.cc | 16 ++++++++--------
+ test/api/test-subset.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 59 insertions(+), 8 deletions(-)
+
+commit d18aad7ec5e940cf2bd31f5005df739f42da2590
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Aug 13 15:05:48 2021 -0700
+
+    [subset] restore old subsetting api methods.
+    
+    These will be left in place until the 3.0.0 release.
+
+ src/hb-subset-input.cc | 130 +++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-subset.cc       |   8 +++
+ src/hb-subset.h        |  61 +++++++++++++++++++++++
+ 3 files changed, 199 insertions(+)
+
+commit 44802c8ec462574c148be12594609e13abd7ccb5
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Aug 12 11:11:51 2021 -0700
+
+    [subset] use layout-features=* for layout subsetting tests w/ synthetic test fonts.
+
+ ...e_subrules_f1.layout-test-retain-gids.41,42,43.otf | Bin 0 -> 2132 bytes
+ ...iple_subrules_f1.layout-test-retain-gids.41,42.otf | Bin 0 -> 2012 bytes
+ ...ple_subrules_f1.layout-test-retain-gids.41,43.otf} | Bin
+ ...ltiple_subrules_f1.layout-test-retain-gids.41.otf} | Bin
+ ...1.layout-test-retain-gids.retain-all-codepoint.otf | Bin 0 -> 3992 bytes
+ ...ext1_multiple_subrules_f1.layout-test.41,42,43.otf | Bin 0 -> 1420 bytes
+ ...ontext1_multiple_subrules_f1.layout-test.41,42.otf | Bin 0 -> 1304 bytes
+ ...ntext1_multiple_subrules_f1.layout-test.41,43.otf} | Bin
+ ..._context1_multiple_subrules_f1.layout-test.41.otf} | Bin
+ ...e_subrules_f1.layout-test.retain-all-codepoint.otf | Bin 0 -> 3992 bytes
+ ...e_subrules_f1.notdef-outline-retain-gids.41,42.otf | Bin 1912 -> 0 bytes
+ ...1_multiple_subrules_f1.notdef-outline.41,42,43.otf | Bin 1304 -> 0 bytes
+ ...ext1_multiple_subrules_f1.notdef-outline.41,42.otf | Bin 1204 -> 0 bytes
+ ...e_subrules_f1.layout-test-retain-gids.41,42,43.otf | Bin 0 -> 2152 bytes
+ ...iple_subrules_f1.layout-test-retain-gids.41,42.otf | Bin 0 -> 2028 bytes
+ ...ple_subrules_f1.layout-test-retain-gids.41,43.otf} | Bin
+ ...ltiple_subrules_f1.layout-test-retain-gids.41.otf} | Bin
+ ...1.layout-test-retain-gids.retain-all-codepoint.otf | Bin 0 -> 4012 bytes
+ ...ext2_multiple_subrules_f1.layout-test.41,42,43.otf | Bin 0 -> 1440 bytes
+ ...ontext2_multiple_subrules_f1.layout-test.41,42.otf | Bin 0 -> 1320 bytes
+ ...ntext2_multiple_subrules_f1.layout-test.41,43.otf} | Bin
+ ..._context2_multiple_subrules_f1.layout-test.41.otf} | Bin
+ ...e_subrules_f1.layout-test.retain-all-codepoint.otf | Bin 0 -> 4012 bytes
+ ...ubrules_f1.notdef-outline-retain-gids.41,42,43.otf | Bin 2016 -> 0 bytes
+ ...e_subrules_f1.notdef-outline-retain-gids.41,42.otf | Bin 1912 -> 0 bytes
+ ...2_multiple_subrules_f1.notdef-outline.41,42,43.otf | Bin 1304 -> 0 bytes
+ ...ext2_multiple_subrules_f1.notdef-outline.41,42.otf | Bin 1204 -> 0 bytes
+ ...xt3_simple_f1.layout-test-retain-gids.41,42,43.otf | Bin 0 -> 2112 bytes
+ ...text3_simple_f1.layout-test-retain-gids.41,42.otf} | Bin
+ ...text3_simple_f1.layout-test-retain-gids.41,43.otf} | Bin
+ ...context3_simple_f1.layout-test-retain-gids.41.otf} | Bin
+ ...1.layout-test-retain-gids.retain-all-codepoint.otf | Bin 0 -> 3972 bytes
+ .../gpos_context3_simple_f1.layout-test.41,42,43.otf  | Bin 0 -> 1400 bytes
+ ... => gpos_context3_simple_f1.layout-test.41,42.otf} | Bin
+ ... => gpos_context3_simple_f1.layout-test.41,43.otf} | Bin
+ ...otf => gpos_context3_simple_f1.layout-test.41.otf} | Bin
+ ...xt3_simple_f1.layout-test.retain-all-codepoint.otf | Bin 0 -> 3972 bytes
+ ..._simple_f1.notdef-outline-retain-gids.41,42,43.otf | Bin 1996 -> 0 bytes
+ ...otdef-outline-retain-gids.retain-all-codepoint.otf | Bin 3856 -> 0 bytes
+ ...pos_context3_simple_f1.notdef-outline.41,42,43.otf | Bin 1284 -> 0 bytes
+ ..._simple_f1.notdef-outline.retain-all-codepoint.otf | Bin 3856 -> 0 bytes
+ ...Prototype.layout-test-retain-gids.41,42,43,57.otf} | Bin 5272 -> 5924 bytes
+ ...eVFPrototype.layout-test-retain-gids.41,42,43.otf} | Bin 4740 -> 5212 bytes
+ ...dobeVFPrototype.layout-test-retain-gids.41,42.otf} | Bin 4264 -> 4732 bytes
+ ...eVFPrototype.layout-test-retain-gids.41,56,57.otf} | Bin 4408 -> 5048 bytes
+ ...> AdobeVFPrototype.layout-test-retain-gids.41.otf} | Bin 3560 -> 3996 bytes
+ ...dobeVFPrototype.layout-test-retain-gids.42,57.otf} | Bin 4396 -> 5040 bytes
+ ...f => AdobeVFPrototype.layout-test.41,42,43,57.otf} | Bin 5460 -> 5480 bytes
+ ....otf => AdobeVFPrototype.layout-test.41,42,43.otf} | Bin 4928 -> 4952 bytes
+ ...,42.otf => AdobeVFPrototype.layout-test.41,42.otf} | Bin 4448 -> 4468 bytes
+ ....otf => AdobeVFPrototype.layout-test.41,56,57.otf} | Bin 4596 -> 4620 bytes
+ ...ine.41.otf => AdobeVFPrototype.layout-test.41.otf} | Bin 3748 -> 3768 bytes
+ ...,57.otf => AdobeVFPrototype.layout-test.42,57.otf} | Bin 4580 -> 4600 bytes
+ ...=> gpos1_2_font.layout-test-retain-gids.41,43.otf} | Bin 1980 -> 2044 bytes
+ ...=> gpos1_2_font.layout-test-retain-gids.41,46.otf} | Bin 2140 -> 2204 bytes
+ ...tf => gpos1_2_font.layout-test-retain-gids.41.otf} | Bin 1856 -> 1916 bytes
+ ...=> gpos1_2_font.layout-test-retain-gids.42,44.otf} | Bin
+ ...=> gpos1_2_font.layout-test-retain-gids.43,46.otf} | Bin 2004 -> 2068 bytes
+ ....layout-test-retain-gids.retain-all-codepoint.otf} | Bin 3780 -> 3848 bytes
+ ...e.41,43.otf => gpos1_2_font.layout-test.41,43.otf} | Bin 1260 -> 1324 bytes
+ ...e.41,46.otf => gpos1_2_font.layout-test.41,46.otf} | Bin 1388 -> 1452 bytes
+ ...outline.41.otf => gpos1_2_font.layout-test.41.otf} | Bin 1152 -> 1212 bytes
+ ...e.42,44.otf => gpos1_2_font.layout-test.42,44.otf} | Bin
+ ...e.43,46.otf => gpos1_2_font.layout-test.43,46.otf} | Bin 1252 -> 1316 bytes
+ ...gpos1_2_font.layout-test.retain-all-codepoint.otf} | Bin 3780 -> 3848 bytes
+ ...pos2_1_font7.layout-test-retain-gids.21,23,25.otf} | Bin 1656 -> 1728 bytes
+ ...> gpos2_1_font7.layout-test-retain-gids.21,23.otf} | Bin 1532 -> 1604 bytes
+ ...> gpos2_1_font7.layout-test-retain-gids.2E,23.otf} | Bin
+ ...pos2_1_font7.layout-test-retain-gids.41,42,43.otf} | Bin
+ ....layout-test-retain-gids.retain-all-codepoint.otf} | Bin 3780 -> 3868 bytes
+ ...,25.otf => gpos2_1_font7.layout-test.21,23,25.otf} | Bin 1312 -> 1384 bytes
+ ....21,23.otf => gpos2_1_font7.layout-test.21,23.otf} | Bin 1204 -> 1276 bytes
+ ....2E,23.otf => gpos2_1_font7.layout-test.2E,23.otf} | Bin
+ ...,43.otf => gpos2_1_font7.layout-test.41,42,43.otf} | Bin
+ ...pos2_1_font7.layout-test.retain-all-codepoint.otf} | Bin 3780 -> 3868 bytes
+ ...gpos2_2_font5.layout-test-retain-gids.21,23,25.otf | Bin 0 -> 1780 bytes
+ .../gpos2_2_font5.layout-test-retain-gids.21,23.otf   | Bin 0 -> 1656 bytes
+ ...> gpos2_2_font5.layout-test-retain-gids.2E,23.otf} | Bin
+ ...pos2_2_font5.layout-test-retain-gids.41,42,43.otf} | Bin
+ ...5.layout-test-retain-gids.retain-all-codepoint.otf | Bin 0 -> 3904 bytes
+ .../gpos2_2_font5.layout-test.21,23,25.otf            | Bin 0 -> 1436 bytes
+ .../layout.gpos2/gpos2_2_font5.layout-test.21,23.otf  | Bin 0 -> 1328 bytes
+ ....2E,23.otf => gpos2_2_font5.layout-test.2E,23.otf} | Bin
+ ...,43.otf => gpos2_2_font5.layout-test.41,42,43.otf} | Bin
+ ...gpos2_2_font5.layout-test.retain-all-codepoint.otf | Bin 0 -> 3904 bytes
+ ...s2_2_font5.notdef-outline-retain-gids.21,23,25.otf | Bin 1656 -> 0 bytes
+ ...gpos2_2_font5.notdef-outline-retain-gids.21,23.otf | Bin 1532 -> 0 bytes
+ ...otdef-outline-retain-gids.retain-all-codepoint.otf | Bin 3780 -> 0 bytes
+ .../gpos2_2_font5.notdef-outline.21,23,25.otf         | Bin 1312 -> 0 bytes
+ .../gpos2_2_font5.notdef-outline.21,23.otf            | Bin 1204 -> 0 bytes
+ ...s2_2_font5.notdef-outline.retain-all-codepoint.otf | Bin 3780 -> 0 bytes
+ ... => gpos3_font3.layout-test-retain-gids.28,29.otf} | Bin 1616 -> 1700 bytes
+ ... => gpos3_font3.layout-test-retain-gids.28,2B.otf} | Bin 1752 -> 1836 bytes
+ ... => gpos3_font3.layout-test-retain-gids.29,2B.otf} | Bin 1664 -> 1744 bytes
+ ... gpos3_font3.layout-test-retain-gids.41,42,43.otf} | Bin
+ ....layout-test-retain-gids.retain-all-codepoint.otf} | Bin 3876 -> 3908 bytes
+ ...ne.28,29.otf => gpos3_font3.layout-test.28,29.otf} | Bin 1224 -> 1308 bytes
+ ...ne.28,2B.otf => gpos3_font3.layout-test.28,2B.otf} | Bin 1344 -> 1428 bytes
+ ...ne.29,2B.otf => gpos3_font3.layout-test.29,2B.otf} | Bin 1256 -> 1336 bytes
+ ...42,43.otf => gpos3_font3.layout-test.41,42,43.otf} | Bin
+ .../gpos3_font3.layout-test.retain-all-codepoint.otf} | Bin 3876 -> 3908 bytes
+ ..._anchors_1.layout-test-retain-gids.41,42,43,44.otf | Bin 0 -> 2336 bytes
+ ..._anchors_1.layout-test-retain-gids.41,42,43,45.otf | Bin 0 -> 2332 bytes
+ ...le_anchors_1.layout-test-retain-gids.41,42,43.otf} | Bin 1976 -> 2096 bytes
+ ...tiple_anchors_1.layout-test-retain-gids.41,42.otf} | Bin
+ ...hors_1.layout-test-retain-gids.41,43,44,45,46.otf} | Bin 2560 -> 2692 bytes
+ ...ple_anchors_1.layout-test-retain-gids.41,43,44.otf | Bin 0 -> 2328 bytes
+ ...ple_anchors_1.layout-test-retain-gids.41,43,45.otf | Bin 0 -> 2328 bytes
+ ...tiple_anchors_1.layout-test-retain-gids.41,43.otf} | Bin 1972 -> 2092 bytes
+ ...multiple_anchors_1.layout-test-retain-gids.41.otf} | Bin
+ ....layout-test-retain-gids.retain-all-codepoint.otf} | Bin 3844 -> 3996 bytes
+ ...os4_multiple_anchors_1.layout-test.41,42,43,44.otf | Bin 0 -> 1620 bytes
+ ...os4_multiple_anchors_1.layout-test.41,42,43,45.otf | Bin 0 -> 1600 bytes
+ .../gpos4_multiple_anchors_1.layout-test.41,42,43.otf | Bin 0 -> 1384 bytes
+ ...=> gpos4_multiple_anchors_1.layout-test.41,42.otf} | Bin
+ ...multiple_anchors_1.layout-test.41,43,44,45,46.otf} | Bin 1832 -> 1964 bytes
+ .../gpos4_multiple_anchors_1.layout-test.41,43,44.otf | Bin 0 -> 1604 bytes
+ .../gpos4_multiple_anchors_1.layout-test.41,43,45.otf | Bin 0 -> 1592 bytes
+ .../gpos4_multiple_anchors_1.layout-test.41,43.otf    | Bin 0 -> 1372 bytes
+ ...tf => gpos4_multiple_anchors_1.layout-test.41.otf} | Bin
+ ...le_anchors_1.layout-test.retain-all-codepoint.otf} | Bin 3844 -> 3996 bytes
+ ...chors_1.notdef-outline-retain-gids.41,42,43,44.otf | Bin 2208 -> 0 bytes
+ ..._anchors_1.notdef-outline-retain-gids.41,42,43.otf | Bin 1996 -> 0 bytes
+ ...ple_anchors_1.notdef-outline-retain-gids.41,43.otf | Bin 2000 -> 0 bytes
+ ..._multiple_anchors_1.notdef-outline.41,42,43,44.otf | Bin 1492 -> 0 bytes
+ ..._multiple_anchors_1.notdef-outline.41,42,43,45.otf | Bin 1488 -> 0 bytes
+ ...os4_multiple_anchors_1.notdef-outline.41,42,43.otf | Bin 1284 -> 0 bytes
+ ...os4_multiple_anchors_1.notdef-outline.41,43,45.otf | Bin 1488 -> 0 bytes
+ .../gpos4_multiple_anchors_1.notdef-outline.41,43.otf | Bin 1280 -> 0 bytes
+ ...os5_font1.layout-test-retain-gids.41,42,43,44.otf} | Bin 2224 -> 2360 bytes
+ ...os5_font1.layout-test-retain-gids.41,42,43,45.otf} | Bin 2220 -> 2356 bytes
+ .../gpos5_font1.layout-test-retain-gids.41,42,43.otf  | Bin 0 -> 2120 bytes
+ ... gpos5_font1.layout-test-retain-gids.41,42,44.otf} | Bin 2144 -> 2276 bytes
+ .../gpos5_font1.layout-test-retain-gids.41,42,45.otf  | Bin 0 -> 2260 bytes
+ .../gpos5_font1.layout-test-retain-gids.41,42.otf     | Bin 0 -> 2012 bytes
+ ... => gpos5_font1.layout-test-retain-gids.41,43.otf} | Bin
+ ...otf => gpos5_font1.layout-test-retain-gids.41.otf} | Bin
+ ...otf => gpos5_font1.layout-test-retain-gids.42.otf} | Bin
+ ....layout-test-retain-gids.retain-all-codepoint.otf} | Bin 3860 -> 4064 bytes
+ ...44.otf => gpos5_font1.layout-test.41,42,43,44.otf} | Bin 1508 -> 1644 bytes
+ .../gpos5_font1.layout-test.41,42,43,45.otf           | Bin 0 -> 1624 bytes
+ .../layout.gpos5/gpos5_font1.layout-test.41,42,43.otf | Bin 0 -> 1408 bytes
+ ...42,44.otf => gpos5_font1.layout-test.41,42,44.otf} | Bin 1420 -> 1552 bytes
+ .../layout.gpos5/gpos5_font1.layout-test.41,42,45.otf | Bin 0 -> 1524 bytes
+ .../layout.gpos5/gpos5_font1.layout-test.41,42.otf    | Bin 0 -> 1304 bytes
+ ...ne.41,43.otf => gpos5_font1.layout-test.41,43.otf} | Bin
+ ...-outline.41.otf => gpos5_font1.layout-test.41.otf} | Bin
+ ...-outline.42.otf => gpos5_font1.layout-test.42.otf} | Bin
+ ... gpos5_font1.layout-test.retain-all-codepoint.otf} | Bin 3860 -> 4064 bytes
+ ...5_font1.notdef-outline-retain-gids.41,42,43,45.otf | Bin 2236 -> 0 bytes
+ ...pos5_font1.notdef-outline-retain-gids.41,42,43.otf | Bin 2012 -> 0 bytes
+ ...pos5_font1.notdef-outline-retain-gids.41,42,45.otf | Bin 2144 -> 0 bytes
+ .../gpos5_font1.notdef-outline-retain-gids.41,42.otf  | Bin 1908 -> 0 bytes
+ .../gpos5_font1.notdef-outline.41,42,43,45.otf        | Bin 1504 -> 0 bytes
+ .../gpos5_font1.notdef-outline.41,42,43.otf           | Bin 1300 -> 0 bytes
+ .../gpos5_font1.notdef-outline.41,42,45.otf           | Bin 1408 -> 0 bytes
+ .../layout.gpos5/gpos5_font1.notdef-outline.41,42.otf | Bin 1200 -> 0 bytes
+ ...os6_font1.layout-test-retain-gids.41,42,43,44.otf} | Bin 2184 -> 2312 bytes
+ ...pos6_font1.layout-test-retain-gids.41,42,43,45.otf | Bin 0 -> 2308 bytes
+ .../gpos6_font1.layout-test-retain-gids.41,42,43.otf} | Bin 2016 -> 2072 bytes
+ ... => gpos6_font1.layout-test-retain-gids.41,42.otf} | Bin
+ ..._font1.layout-test-retain-gids.41,43,44,45,46.otf} | Bin 2536 -> 2668 bytes
+ .../gpos6_font1.layout-test-retain-gids.41,43,44.otf} | Bin 2216 -> 2304 bytes
+ .../gpos6_font1.layout-test-retain-gids.41,43,45.otf} | Bin 2224 -> 2304 bytes
+ .../gpos6_font1.layout-test-retain-gids.41,43.otf     | Bin 0 -> 2068 bytes
+ ...otf => gpos6_font1.layout-test-retain-gids.41.otf} | Bin
+ ....layout-test-retain-gids.retain-all-codepoint.otf} | Bin 3820 -> 3972 bytes
+ ...44.otf => gpos6_font1.layout-test.41,42,43,44.otf} | Bin 1468 -> 1596 bytes
+ .../gpos6_font1.layout-test.41,42,43,45.otf           | Bin 0 -> 1576 bytes
+ .../layout.gpos6/gpos6_font1.layout-test.41,42,43.otf | Bin 0 -> 1360 bytes
+ ...ne.41,42.otf => gpos6_font1.layout-test.41,42.otf} | Bin
+ ...otf => gpos6_font1.layout-test.41,43,44,45,46.otf} | Bin 1808 -> 1940 bytes
+ .../gpos6_font1.layout-test.41,43,44.otf}             | Bin 1492 -> 1580 bytes
+ .../layout.gpos6/gpos6_font1.layout-test.41,43,45.otf | Bin 0 -> 1568 bytes
+ .../layout.gpos6/gpos6_font1.layout-test.41,43.otf    | Bin 0 -> 1348 bytes
+ ...-outline.41.otf => gpos6_font1.layout-test.41.otf} | Bin
+ ... gpos6_font1.layout-test.retain-all-codepoint.otf} | Bin 3820 -> 3972 bytes
+ ...6_font1.notdef-outline-retain-gids.41,42,43,45.otf | Bin 2196 -> 0 bytes
+ ...pos6_font1.notdef-outline-retain-gids.41,43,44.otf | Bin 2192 -> 0 bytes
+ ...pos6_font1.notdef-outline-retain-gids.41,43,45.otf | Bin 2200 -> 0 bytes
+ .../gpos6_font1.notdef-outline.41,42,43,45.otf        | Bin 1464 -> 0 bytes
+ .../gpos6_font1.notdef-outline.41,42,43.otf           | Bin 1260 -> 0 bytes
+ .../gpos6_font1.notdef-outline.41,43,44.otf           | Bin 1468 -> 0 bytes
+ .../gpos6_font1.notdef-outline.41,43,45.otf           | Bin 1464 -> 0 bytes
+ .../layout.gpos6/gpos6_font1.notdef-outline.41,43.otf | Bin 1256 -> 0 bytes
+ ...ubrules_f1.layout-test-retain-gids.30,31,32,33.otf | Bin 0 -> 2400 bytes
+ ..._subrules_f1.layout-test-retain-gids.41,42,43.otf} | Bin
+ ...1.layout-test-retain-gids.retain-all-codepoint.otf | Bin 0 -> 4012 bytes
+ ...1_multiple_subrules_f1.layout-test.30,31,32,33.otf | Bin 0 -> 1928 bytes
+ ...ng1_multiple_subrules_f1.layout-test.41,42,43.otf} | Bin
+ ...e_subrules_f1.layout-test.retain-all-codepoint.otf | Bin 0 -> 4012 bytes
+ ...ules_f1.notdef-outline-retain-gids.30,31,32,33.otf | Bin 2292 -> 0 bytes
+ ...ultiple_subrules_f1.notdef-outline.30,31,32,33.otf | Bin 1820 -> 0 bytes
+ ...ubrules_f1.layout-test-retain-gids.30,31,32,33.otf | Bin 0 -> 2420 bytes
+ ..._subrules_f1.layout-test-retain-gids.41,42,43.otf} | Bin
+ ...1.layout-test-retain-gids.retain-all-codepoint.otf | Bin 0 -> 4044 bytes
+ ...2_multiple_subrules_f1.layout-test.30,31,32,33.otf | Bin 0 -> 1948 bytes
+ ...ng2_multiple_subrules_f1.layout-test.41,42,43.otf} | Bin
+ ...e_subrules_f1.layout-test.retain-all-codepoint.otf | Bin 0 -> 4044 bytes
+ ...ules_f1.notdef-outline-retain-gids.30,31,32,33.otf | Bin 2292 -> 0 bytes
+ ...ultiple_subrules_f1.notdef-outline.30,31,32,33.otf | Bin 1820 -> 0 bytes
+ ..._simple_f1.layout-test-retain-gids.30,31,32,33.otf | Bin 0 -> 2392 bytes
+ ...g3_simple_f1.layout-test-retain-gids.41,42,43.otf} | Bin
+ ...1.layout-test-retain-gids.retain-all-codepoint.otf | Bin 0 -> 3980 bytes
+ ...os_chaining3_simple_f1.layout-test.30,31,32,33.otf | Bin 0 -> 1920 bytes
+ ...gpos_chaining3_simple_f1.layout-test.41,42,43.otf} | Bin
+ ...ng3_simple_f1.layout-test.retain-all-codepoint.otf | Bin 0 -> 3980 bytes
+ ...mple_f1.notdef-outline-retain-gids.30,31,32,33.otf | Bin 2268 -> 0 bytes
+ ...otdef-outline-retain-gids.retain-all-codepoint.otf | Bin 3856 -> 0 bytes
+ ...chaining3_simple_f1.notdef-outline.30,31,32,33.otf | Bin 1796 -> 0 bytes
+ ..._simple_f1.notdef-outline.retain-all-codepoint.otf | Bin 3856 -> 0 bytes
+ .../gpos9_font2.layout-test-retain-gids.41,42.otf     | Bin 0 -> 1960 bytes
+ ...otf => gpos9_font2.layout-test-retain-gids.41.otf} | Bin 1852 -> 1920 bytes
+ ...otf => gpos9_font2.layout-test-retain-gids.42.otf} | Bin 1724 -> 1792 bytes
+ .../layout.gpos9/gpos9_font2.layout-test.41,42.otf    | Bin 0 -> 1252 bytes
+ ...-outline.41.otf => gpos9_font2.layout-test.41.otf} | Bin 1148 -> 1216 bytes
+ ...-outline.42.otf => gpos9_font2.layout-test.42.otf} | Bin 1008 -> 1076 bytes
+ .../gpos9_font2.notdef-outline-retain-gids.41,42.otf  | Bin 1868 -> 0 bytes
+ .../layout.gpos9/gpos9_font2.notdef-outline.41,42.otf | Bin 1160 -> 0 bytes
+ .../gsub_alternate_substitution.default.53A9.otf      | Bin 3884 -> 0 bytes
+ .../gsub_alternate_substitution.default.53F1.otf      | Bin 2440 -> 0 bytes
+ ...ubstitution.layout-test-retain-gids.53A9,53F1.otf} | Bin 4440 -> 5076 bytes
+ ...nate_substitution.layout-test-retain-gids.53A9.otf | Bin 0 -> 4656 bytes
+ ...nate_substitution.layout-test-retain-gids.53F1.otf | Bin 0 -> 2996 bytes
+ ....layout-test-retain-gids.retain-all-codepoint.otf} | Bin 6076 -> 6764 bytes
+ ..._alternate_substitution.layout-test.53A9,53F1.otf} | Bin 4316 -> 4952 bytes
+ .../gsub_alternate_substitution.layout-test.53A9.otf  | Bin 0 -> 4504 bytes
+ .../gsub_alternate_substitution.layout-test.53F1.otf  | Bin 0 -> 2804 bytes
+ ...substitution.layout-test.retain-all-codepoint.otf} | Bin 5984 -> 6672 bytes
+ .../gsub_alternate_substitution.retain-gids.53A9.otf  | Bin 4036 -> 0 bytes
+ .../gsub_alternate_substitution.retain-gids.53F1.otf  | Bin 2632 -> 0 bytes
+ ...e_subrules_f2.layout-test-retain-gids.41,42,43.otf | Bin 0 -> 2236 bytes
+ ...iple_subrules_f2.layout-test-retain-gids.41,42.otf | Bin 0 -> 2208 bytes
+ ...ple_subrules_f2.layout-test-retain-gids.41,43.otf} | Bin
+ ...ltiple_subrules_f2.layout-test-retain-gids.41.otf} | Bin
+ ....layout-test-retain-gids.retain-all-codepoint.otf} | Bin 3880 -> 3988 bytes
+ ...ext1_multiple_subrules_f2.layout-test.41,42,43.otf | Bin 0 -> 1440 bytes
+ ...ontext1_multiple_subrules_f2.layout-test.41,42.otf | Bin 0 -> 1400 bytes
+ ...ntext1_multiple_subrules_f2.layout-test.41,43.otf} | Bin
+ ..._context1_multiple_subrules_f2.layout-test.41.otf} | Bin
+ ..._subrules_f2.layout-test.retain-all-codepoint.otf} | Bin 3880 -> 3988 bytes
+ ...ubrules_f2.notdef-outline-retain-gids.41,42,43.otf | Bin 2028 -> 0 bytes
+ ...e_subrules_f2.notdef-outline-retain-gids.41,42.otf | Bin 1924 -> 0 bytes
+ ...otdef-outline-retain-gids.retain-all-codepoint.otf | Bin 3888 -> 0 bytes
+ ...1_multiple_subrules_f2.notdef-outline.41,42,43.otf | Bin 1316 -> 0 bytes
+ ...ext1_multiple_subrules_f2.notdef-outline.41,42.otf | Bin 1216 -> 0 bytes
+ ...ubrules_f2.notdef-outline.retain-all-codepoint.otf | Bin 3888 -> 0 bytes
+ ...e_subrules_f2.layout-test-retain-gids.41,42,43.otf | Bin 0 -> 2256 bytes
+ ...iple_subrules_f2.layout-test-retain-gids.41,42.otf | Bin 0 -> 2224 bytes
+ ...ple_subrules_f2.layout-test-retain-gids.41,43.otf} | Bin
+ ...ltiple_subrules_f2.layout-test-retain-gids.41.otf} | Bin
+ ....layout-test-retain-gids.retain-all-codepoint.otf} | Bin 3880 -> 4008 bytes
+ ...ext2_multiple_subrules_f2.layout-test.41,42,43.otf | Bin 0 -> 1460 bytes
+ ...ontext2_multiple_subrules_f2.layout-test.41,42.otf | Bin 0 -> 1416 bytes
+ ...ntext2_multiple_subrules_f2.layout-test.41,43.otf} | Bin
+ ..._context2_multiple_subrules_f2.layout-test.41.otf} | Bin
+ ..._subrules_f2.layout-test.retain-all-codepoint.otf} | Bin 3880 -> 4008 bytes
+ ...ubrules_f2.notdef-outline-retain-gids.41,42,43.otf | Bin 2028 -> 0 bytes
+ ...e_subrules_f2.notdef-outline-retain-gids.41,42.otf | Bin 1924 -> 0 bytes
+ ...otdef-outline-retain-gids.retain-all-codepoint.otf | Bin 3888 -> 0 bytes
+ ...2_multiple_subrules_f2.notdef-outline.41,42,43.otf | Bin 1316 -> 0 bytes
+ ...ext2_multiple_subrules_f2.notdef-outline.41,42.otf | Bin 1216 -> 0 bytes
+ ...ubrules_f2.notdef-outline.retain-all-codepoint.otf | Bin 3888 -> 0 bytes
+ ...uccessive_f1.layout-test-retain-gids.41,42,43.otf} | Bin
+ ...3_successive_f1.layout-test-retain-gids.41,42.otf} | Bin
+ ...3_successive_f1.layout-test-retain-gids.41,43.otf} | Bin
+ ...ext3_successive_f1.layout-test-retain-gids.41.otf} | Bin
+ ....layout-test-retain-gids.retain-all-codepoint.otf} | Bin 3876 -> 4008 bytes
+ ...b_context3_successive_f1.layout-test.41,42,43.otf} | Bin
+ ...gsub_context3_successive_f1.layout-test.41,42.otf} | Bin
+ ...gsub_context3_successive_f1.layout-test.41,43.otf} | Bin
+ ...=> gsub_context3_successive_f1.layout-test.41.otf} | Bin
+ ...uccessive_f1.layout-test.retain-all-codepoint.otf} | Bin 3876 -> 4008 bytes
+ ...brules_f1.layout-test-retain-gids.30,31,32,33.otf} | Bin 2304 -> 2372 bytes
+ ..._subrules_f1.layout-test-retain-gids.41,42,43.otf} | Bin
+ ....layout-test-retain-gids.retain-all-codepoint.otf} | Bin 3876 -> 3984 bytes
+ ..._multiple_subrules_f1.layout-test.30,31,32,33.otf} | Bin 1832 -> 1900 bytes
+ ...ng1_multiple_subrules_f1.layout-test.41,42,43.otf} | Bin
+ ..._subrules_f1.layout-test.retain-all-codepoint.otf} | Bin 3876 -> 3984 bytes
+ ...otdef-outline-retain-gids.retain-all-codepoint.otf | Bin 3892 -> 0 bytes
+ ...ubrules_f1.notdef-outline.retain-all-codepoint.otf | Bin 3892 -> 0 bytes
+ ...brules_f1.layout-test-retain-gids.30,31,32,33.otf} | Bin 2304 -> 2400 bytes
+ ..._subrules_f1.layout-test-retain-gids.41,42,43.otf} | Bin
+ ...1.layout-test-retain-gids.retain-all-codepoint.otf | Bin 0 -> 4016 bytes
+ ...2_multiple_subrules_f1.layout-test.30,31,32,33.otf | Bin 0 -> 1928 bytes
+ ...ng2_multiple_subrules_f1.layout-test.41,42,43.otf} | Bin
+ ...e_subrules_f1.layout-test.retain-all-codepoint.otf | Bin 0 -> 4016 bytes
+ ...otdef-outline-retain-gids.retain-all-codepoint.otf | Bin 3892 -> 0 bytes
+ ...ultiple_subrules_f1.notdef-outline.30,31,32,33.otf | Bin 1832 -> 0 bytes
+ ...ubrules_f1.notdef-outline.retain-all-codepoint.otf | Bin 3892 -> 0 bytes
+ ..._simple_f2.layout-test-retain-gids.30,31,32,33.otf | Bin 0 -> 2360 bytes
+ ...g3_simple_f2.layout-test-retain-gids.41,42,43.otf} | Bin
+ ....layout-test-retain-gids.retain-all-codepoint.otf} | Bin 3812 -> 3952 bytes
+ ...ub_chaining3_simple_f2.layout-test.30,31,32,33.otf | Bin 0 -> 1888 bytes
+ ...gsub_chaining3_simple_f2.layout-test.41,42,43.otf} | Bin
+ ...g3_simple_f2.layout-test.retain-all-codepoint.otf} | Bin 3812 -> 3952 bytes
+ ...mple_f2.notdef-outline-retain-gids.30,31,32,33.otf | Bin 2280 -> 0 bytes
+ ...otdef-outline-retain-gids.retain-all-codepoint.otf | Bin 3868 -> 0 bytes
+ ...chaining3_simple_f2.notdef-outline.30,31,32,33.otf | Bin 1808 -> 0 bytes
+ ..._simple_f2.notdef-outline.retain-all-codepoint.otf | Bin 3868 -> 0 bytes
+ ...t-test-retain-gids.41,42,43,44,45,46,47,48,49.otf} | Bin 2916 -> 3208 bytes
+ ...d.layout-test-retain-gids.41,42,43,44,45,46,47.otf | Bin 0 -> 2828 bytes
+ ...d.layout-test-retain-gids.41,42,43,44,45,46,4D.otf | Bin 0 -> 2896 bytes
+ ....layout-test-retain-gids.41,42,43,44,45,46,51.otf} | Bin 2624 -> 2900 bytes
+ ...ted.layout-test-retain-gids.41,42,43,44,45,46.otf} | Bin
+ ...ally_created.layout-test-retain-gids.41,42,43.otf} | Bin
+ ...8_manually_created.layout-test-retain-gids.41.otf} | Bin
+ ...b8_manually_created.layout-test-retain-gids.61.otf | Bin 0 -> 2608 bytes
+ ....layout-test-retain-gids.retain-all-codepoint.otf} | Bin 3868 -> 4048 bytes
+ ...reated.layout-test.41,42,43,44,45,46,47,48,49.otf} | Bin 2188 -> 2404 bytes
+ ...ally_created.layout-test.41,42,43,44,45,46,47.otf} | Bin 1948 -> 2012 bytes
+ ...ually_created.layout-test.41,42,43,44,45,46,4D.otf | Bin 0 -> 2012 bytes
+ ...ually_created.layout-test.41,42,43,44,45,46,51.otf | Bin 0 -> 2060 bytes
+ ...anually_created.layout-test.41,42,43,44,45,46.otf} | Bin
+ ...> gsub8_manually_created.layout-test.41,42,43.otf} | Bin
+ ....otf => gsub8_manually_created.layout-test.41.otf} | Bin
+ .../gsub8_manually_created.layout-test.61.otf         | Bin 0 -> 1556 bytes
+ ...ally_created.layout-test.retain-all-codepoint.otf} | Bin 3868 -> 4048 bytes
+ ...otdef-outline-retain-gids.41,42,43,44,45,46,4D.otf | Bin 2668 -> 0 bytes
+ ...otdef-outline-retain-gids.41,42,43,44,45,46,51.otf | Bin 2792 -> 0 bytes
+ ...manually_created.notdef-outline-retain-gids.61.otf | Bin 2292 -> 0 bytes
+ ...ly_created.notdef-outline.41,42,43,44,45,46,47.otf | Bin 1904 -> 0 bytes
+ ...ly_created.notdef-outline.41,42,43,44,45,46,4D.otf | Bin 1868 -> 0 bytes
+ .../gsub8_manually_created.notdef-outline.61.otf      | Bin 1236 -> 0 bytes
+ test/subset/data/profiles/layout-test-retain-gids.txt |   3 +++
+ test/subset/data/profiles/layout-test.txt             |   2 ++
+ test/subset/data/tests/layout.context.tests           |   4 ++--
+ test/subset/data/tests/layout.gdef-varstore.tests     |   4 ++--
+ test/subset/data/tests/layout.gpos.tests              |   4 ++--
+ test/subset/data/tests/layout.gpos2.tests             |   4 ++--
+ test/subset/data/tests/layout.gpos3.tests             |   4 ++--
+ test/subset/data/tests/layout.gpos4.tests             |   4 ++--
+ test/subset/data/tests/layout.gpos5.tests             |   4 ++--
+ test/subset/data/tests/layout.gpos6.tests             |   4 ++--
+ test/subset/data/tests/layout.gpos8.tests             |   4 ++--
+ test/subset/data/tests/layout.gpos9.tests             |   4 ++--
+ test/subset/data/tests/layout.gsub3.tests             |   4 ++--
+ test/subset/data/tests/layout.gsub5.tests             |   4 ++--
+ test/subset/data/tests/layout.gsub6.tests             |   4 ++--
+ test/subset/data/tests/layout.gsub8.tests             |   4 ++--
+ 340 files changed, 33 insertions(+), 28 deletions(-)
+
+commit 7620da0f2b2ec83db401f598c1e1ab22c0cfa91d
+Merge: c0f3af91b ccc2a1921
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 12 14:55:33 2021 -0600
+
+    Merge pull request #3142 from harfbuzz/subset-preload-face
+    
+    [util/hb-subset] preload face
+
+commit c0f3af91b80bcaa32d216eac6843c5036e446e25
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Aug 11 16:20:05 2021 -0700
+
+    [subset] speed up add_gid_and_children and adjust op limit.
+    
+    Fix for fuzzer timeout: https://oss-fuzz.com/testcase-detail/5001604901240832.
+    
+    - Operation limit is per glyph, so 100,000 should still be far more than needed.
+    - Switches from for(...) to while(...) loop for iteration. for(...) calls it.end() which in this case triggers a complete iteration.
+    - Cache CompositeGlyph size in the iterator to avoid needing to recalculate it.
+
+ src/hb-ot-glyf-table.hh                            |  48 +++++++++++++++------
+ ...ase-minimized-hb-subset-fuzzer-5001604901240832 | Bin 0 -> 165568 bytes
+ 2 files changed, 34 insertions(+), 14 deletions(-)
+
+commit ccc2a1921a2beab5d7570145a9474870cf25d02a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 12 12:44:52 2021 -0600
+
+    [util/hb-subset] Whitespace
+
+ util/hb-subset.cc | 57 +++++++++++++++++++++++++++----------------------------
+ 1 file changed, 28 insertions(+), 29 deletions(-)
+
+commit 4dfc668e0a745cfb6d06d731adf71198cb4cb610
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 12 12:40:21 2021 -0600
+
+    [util/hb-subset] Move glyph name parsing inline instead of post_parse
+    
+    Now that we have face around we can just do it as it happens.
+
+ util/hb-subset.cc | 85 +++++++++++++++++++------------------------------------
+ 1 file changed, 29 insertions(+), 56 deletions(-)
+
+commit 08d43d1ba188ffb99eeeb50f6bc20b2f10701318
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 12 11:40:56 2021 -0600
+
+    [util/hb-subset] Move add_all_unicodes inline, instead of post_parse
+    
+    Now that we have the font loaded, we can do it as it happens.
+
+ util/hb-subset.cc | 19 +++++++++----------
+ 1 file changed, 9 insertions(+), 10 deletions(-)
+
+commit 11b0b688538b54f13069416a4a47a4db1eba6ae6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 12 11:38:28 2021 -0600
+
+    [util/hb-subset] Pre-parse font-face so we can use it during main parsing
+
+ util/face-options.hh |  3 +++
+ util/hb-subset.cc    | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++
+ util/options.hh      | 23 +++++++++++++++--------
+ 3 files changed, 69 insertions(+), 8 deletions(-)
+
+commit c45d2a9c9dbdf3f0936f56f12706e8725078883b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 12 11:17:26 2021 -0600
+
+    [util] Allow setting cli summary / description
+
+ util/hb-ot-shape-closure.cc |  1 +
+ util/hb-shape.cc            |  1 +
+ util/hb-subset.cc           |  2 ++
+ util/options.hh             | 13 +++++++++++--
+ util/view-cairo.hh          |  1 +
+ 5 files changed, 16 insertions(+), 2 deletions(-)
+
+commit 4f3b7b7035b12991a155f2775ddadd1ecd824ecb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 12 11:05:31 2021 -0600
+
+    [util] Remove unused usage
+
+ util/options.hh | 9 +--------
+ 1 file changed, 1 insertion(+), 8 deletions(-)
+
+commit 1cb621d35d1e8e47d868f4ef6a9d186aa835e708
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 12 10:58:19 2021 -0600
+
+    [util/hb-subset] Minor move parsing
+
+ util/hb-subset.cc | 9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+commit 3f94177ee80a120afcb2275608473b9da63811d0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 12 10:43:31 2021 -0600
+
+    [util] Use g_set_error() in one more place
+
+ util/font-options.hh | 12 +++++++-----
+ 1 file changed, 7 insertions(+), 5 deletions(-)
+
+commit 4d73b3d9b1575b9b71ba21886cc130f8bb7591ee
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 12 10:39:46 2021 -0600
+
+    [util] Add --batch to hb-view / hb-ot-shape-closure
+
+ util/batch.hh               |  2 ++
+ util/hb-ot-shape-closure.cc |  8 +++++---
+ util/hb-shape.cc            |  8 ++++----
+ util/hb-subset.cc           |  6 ++----
+ util/hb-view.cc             | 10 ++++++----
+ 5 files changed, 19 insertions(+), 15 deletions(-)
+
+commit 302bde0bfbb29208a974bd50b1af09a154efbd45
+Merge: 43722cc9f 23282c9c9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 11 23:05:11 2021 -0600
+
+    Merge pull request #3135 from harfbuzz/post-parse
+    
+    [util] Clean up option parsing some more and implement missing featuress
+
+commit 23282c9c9d057c715dde93d18167de9329931354
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 11 22:49:47 2021 -0600
+
+    [util/hb-subset] Support ranges in --unicodes / --unicodes-file
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/3109
+
+ test/shape/hb_test_tools.py |  2 +-
+ util/hb-subset.cc           | 68 ++++++++++++++++++++++++++++++---------------
+ util/text-options.hh        |  3 +-
+ 3 files changed, 48 insertions(+), 25 deletions(-)
+
+commit f60f005b1fec38dcb0630b01520a7b8a105759c5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 11 22:36:00 2021 -0600
+
+    [util/hb-subset] Remove wrong hb_set_destroy() in error paths
+
+ util/hb-subset.cc | 5 -----
+ 1 file changed, 5 deletions(-)
+
+commit 49cf36027c5ad8092966983f9c2e438cbef00c15
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 11 22:34:14 2021 -0600
+
+    [util/hb-subset] Parse --gids-file, --glyphs-file, --text-file, --unicodes-file
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2455
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/3002
+
+ util/hb-subset.cc | 119 +++++++++++++++++++++++++++++++++++++++++-------------
+ 1 file changed, 92 insertions(+), 27 deletions(-)
+
+commit bf80b7ea457deb1fb72e7996e5f4d78a981e8a39
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 11 22:07:45 2021 -0600
+
+    [util/hb-subset] Add --glyphs for passing glyph names
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/2455
+
+ util/hb-subset.cc | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-
+ 1 file changed, 62 insertions(+), 1 deletion(-)
+
+commit 5b07c3c7d03b5ff6d35fafa3db402528d813af0a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 11 21:14:55 2021 -0600
+
+    [util/hb-subset] Parse --text & --unicodes
+
+ util/Makefile.sources  |   1 -
+ util/hb-subset.cc      | 528 ++++++++++++++++++++++++++++++++++++++++++++-----
+ util/subset-options.hh | 399 -------------------------------------
+ util/text-options.hh   |   3 +-
+ 4 files changed, 475 insertions(+), 456 deletions(-)
+
+commit 4ec727e55f1f5479aa2be85f8ad4e0f1a4b922b6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 11 20:46:16 2021 -0600
+
+    [util] Minor edit of failure messages
+
+ util/subset-options.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit b83f25c749c219e2cb7ed6d819d638f97bf3ea62
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 11 20:42:20 2021 -0600
+
+    [util/hb-subset] Revamp option groups
+
+ util/shape-options.hh  |  3 ++-
+ util/subset-options.hh | 59 ++++++++++++++++++++++++++++++++++++++++----------
+ 2 files changed, 49 insertions(+), 13 deletions(-)
+
+commit 9a6055caa812a5c855ec604ce0c74a91236c0988
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 11 20:30:25 2021 -0600
+
+    [util/hb-ot-shape-closure] Remove unnecessary include
+
+ util/hb-ot-shape-closure.cc | 4 ----
+ 1 file changed, 4 deletions(-)
+
+commit c98773ebb0b47c682494de4a4c6b648a62698cec
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 11 20:22:03 2021 -0600
+
+    [util/hb-subset] Move output-file validation code into post_parse
+
+ util/hb-shape.cc       |   2 +-
+ util/hb-subset.cc      |   5 +--
+ util/helper-cairo.hh   |   2 +
+ util/output-options.hh | 120 ++++++++++++++++++++++++-------------------------
+ util/view-cairo.hh     |   2 +-
+ 5 files changed, 65 insertions(+), 66 deletions(-)
+
+commit 58bfe40794352afc162c651ff84cbacf5e751960
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 11 19:48:28 2021 -0600
+
+    [util] Move hb-subset away from main-font-text
+
+ test/subset/run-tests.py |   1 -
+ util/face-options.hh     |   6 ++
+ util/hb-shape.cc         |   8 +--
+ util/hb-subset.cc        | 146 ++++++++++++++++++++++++++++-------------------
+ util/helper-cairo.hh     |   4 +-
+ util/output-options.hh   |  15 +++--
+ util/shape-options.hh    |   9 ++-
+ util/text-options.hh     |  18 +++---
+ 8 files changed, 122 insertions(+), 85 deletions(-)
+
+commit 3147e081da35b9c3c03cc58970eb96f31958f4c4
+Merge: ba418cfc5 43722cc9f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 11 19:33:00 2021 -0600
+
+    Merge branch 'main' into post-parse
+
+commit 43722cc9f428bbfa759d4d93008ba4cf6efaceba
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Thu Aug 12 02:32:29 2021 +0200
+
+    [test] Add some real reverse sub tests
+
+ .../fonts/1b66a1f4b076b734caa6397b3e57231af1feaafb.ttf   | Bin 0 -> 3220 bytes
+ .../fonts/3f24aff8b768e586162e9b9d03b15c36508dd2ae.ttf   | Bin 0 -> 5760 bytes
+ test/shaping/data/in-house/tests/reverse-sub.tests       |   2 ++
+ 3 files changed, 2 insertions(+)
+
+commit ba418cfc5218ac093b759e2c03a43234a786f6eb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 11 19:29:07 2021 -0600
+
+    [util] Use automatic casts
+
+ util/view-cairo.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 97a9e4e41e9712fa52802d1043b7cecdde2ff2a2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 11 19:28:16 2021 -0600
+
+    [util] Separate shape_text_options_t from text_options_t
+
+ util/hb-ot-shape-closure.cc | 15 ++++++----
+ util/hb-shape.cc            |  2 +-
+ util/hb-subset.cc           | 14 +++++----
+ util/hb-view.cc             |  2 +-
+ util/main-font-text.hh      |  6 ++--
+ util/shape-consumer.hh      | 16 ++++++----
+ util/text-options.hh        | 73 ++++++++++++++++++++++++++++++++++++++++-----
+ 7 files changed, 98 insertions(+), 30 deletions(-)
+
+commit 6ba7ddafed4cf80cdb4ff38700d96629d10eed64
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 11 19:06:57 2021 -0600
+
+    [util] Move text-file opening to post_parse
+
+ util/text-options.hh | 39 +++++++++++++++++++++------------------
+ 1 file changed, 21 insertions(+), 18 deletions(-)
+
+commit 23298bc846d34eb6a5465511df6219e3d94c3103
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 11 18:58:25 2021 -0600
+
+    [util] Remove unnecessary check
+
+ util/text-options.hh | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit fd0778aa2a8525d9b435304710c29598df6905cc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 11 18:54:46 2021 -0600
+
+    [util] Use post_parse in output_options_t
+
+ util/hb-shape.cc       |  1 -
+ util/helper-cairo.hh   |  4 ++--
+ util/output-options.hh | 57 ++++++++++++++++++++++----------------------------
+ 3 files changed, 27 insertions(+), 35 deletions(-)
+
+commit 24a9d8c78db50e8082cb6ba258707f3d0e8333e7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 11 18:47:06 2021 -0600
+
+    [util] Use post_parse in font_options_t
+
+ util/font-options.hh        | 15 +++++----------
+ util/hb-ot-shape-closure.cc |  2 +-
+ util/hb-shape.cc            |  2 +-
+ util/helper-cairo.hh        |  2 +-
+ util/shape-consumer.hh      |  2 +-
+ util/view-cairo.hh          |  2 +-
+ 6 files changed, 10 insertions(+), 15 deletions(-)
+
+commit e0d7060f80f8c4b9b8241c3a4d8faa33f48da86d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 11 18:43:21 2021 -0600
+
+    [test] Rename shaping/ to shape/
+
+ configure.ac                                                |  10 +++++-----
+ test/Makefile.am                                            |   2 +-
+ test/meson.build                                            |   4 ++--
+ test/{shaping => shape}/Makefile.am                         |   0
+ test/{shaping => shape}/README.md                           |   0
+ test/{shaping => shape}/data/Makefile.am                    |   0
+ test/{shaping => shape}/data/aots/COPYING                   |   0
+ test/{shaping => shape}/data/aots/Makefile.am               |   0
+ test/{shaping => shape}/data/aots/Makefile.sources          |   0
+ test/{shaping => shape}/data/aots/fonts/classdef1_font1.otf | Bin
+ test/{shaping => shape}/data/aots/fonts/classdef1_font2.otf | Bin
+ test/{shaping => shape}/data/aots/fonts/classdef1_font3.otf | Bin
+ test/{shaping => shape}/data/aots/fonts/classdef1_font4.otf | Bin
+ test/{shaping => shape}/data/aots/fonts/classdef2_font1.otf | Bin
+ test/{shaping => shape}/data/aots/fonts/classdef2_font2.otf | Bin
+ test/{shaping => shape}/data/aots/fonts/classdef2_font3.otf | Bin
+ test/{shaping => shape}/data/aots/fonts/classdef2_font4.otf | Bin
+ test/{shaping => shape}/data/aots/fonts/cmap0_font1.otf     | Bin
+ test/{shaping => shape}/data/aots/fonts/cmap10_font1.otf    | Bin
+ test/{shaping => shape}/data/aots/fonts/cmap10_font2.otf    | Bin
+ test/{shaping => shape}/data/aots/fonts/cmap12_font1.otf    | Bin
+ test/{shaping => shape}/data/aots/fonts/cmap14_font1.otf    | Bin
+ test/{shaping => shape}/data/aots/fonts/cmap2_font1.otf     | Bin
+ test/{shaping => shape}/data/aots/fonts/cmap4_font1.otf     | Bin
+ test/{shaping => shape}/data/aots/fonts/cmap4_font2.otf     | Bin
+ test/{shaping => shape}/data/aots/fonts/cmap4_font3.otf     | Bin
+ test/{shaping => shape}/data/aots/fonts/cmap4_font4.otf     | Bin
+ test/{shaping => shape}/data/aots/fonts/cmap6_font1.otf     | Bin
+ test/{shaping => shape}/data/aots/fonts/cmap6_font2.otf     | Bin
+ test/{shaping => shape}/data/aots/fonts/cmap8_font1.otf     | Bin
+ .../data/aots/fonts/cmap_composition_font1.otf              | Bin
+ .../data/aots/fonts/cmap_subtableselection_font1.otf        | Bin
+ .../data/aots/fonts/cmap_subtableselection_font2.otf        | Bin
+ .../data/aots/fonts/cmap_subtableselection_font3.otf        | Bin
+ .../data/aots/fonts/cmap_subtableselection_font4.otf        | Bin
+ .../data/aots/fonts/cmap_subtableselection_font5.otf        | Bin
+ .../data/aots/fonts/gpos1_1_lookupflag_f1.otf               | Bin
+ .../data/aots/fonts/gpos1_1_simple_f1.otf                   | Bin
+ .../data/aots/fonts/gpos1_1_simple_f2.otf                   | Bin
+ .../data/aots/fonts/gpos1_1_simple_f3.otf                   | Bin
+ .../data/aots/fonts/gpos1_1_simple_f4.otf                   | Bin
+ test/{shaping => shape}/data/aots/fonts/gpos1_2_font1.otf   | Bin
+ test/{shaping => shape}/data/aots/fonts/gpos1_2_font2.otf   | Bin
+ test/{shaping => shape}/data/aots/fonts/gpos2_1_font6.otf   | Bin
+ test/{shaping => shape}/data/aots/fonts/gpos2_1_font7.otf   | Bin
+ .../data/aots/fonts/gpos2_1_lookupflag_f1.otf               | Bin
+ .../data/aots/fonts/gpos2_1_lookupflag_f2.otf               | Bin
+ .../data/aots/fonts/gpos2_1_next_glyph_f1.otf               | Bin
+ .../data/aots/fonts/gpos2_1_next_glyph_f2.otf               | Bin
+ .../data/aots/fonts/gpos2_1_simple_f1.otf                   | Bin
+ test/{shaping => shape}/data/aots/fonts/gpos2_2_font1.otf   | Bin
+ test/{shaping => shape}/data/aots/fonts/gpos2_2_font2.otf   | Bin
+ test/{shaping => shape}/data/aots/fonts/gpos2_2_font3.otf   | Bin
+ test/{shaping => shape}/data/aots/fonts/gpos2_2_font4.otf   | Bin
+ test/{shaping => shape}/data/aots/fonts/gpos2_2_font5.otf   | Bin
+ test/{shaping => shape}/data/aots/fonts/gpos3_font1.otf     | Bin
+ test/{shaping => shape}/data/aots/fonts/gpos3_font2.otf     | Bin
+ test/{shaping => shape}/data/aots/fonts/gpos3_font3.otf     | Bin
+ .../data/aots/fonts/gpos4_lookupflag_f1.otf                 | Bin
+ .../data/aots/fonts/gpos4_lookupflag_f2.otf                 | Bin
+ .../data/aots/fonts/gpos4_multiple_anchors_1.otf            | Bin
+ test/{shaping => shape}/data/aots/fonts/gpos4_simple_1.otf  | Bin
+ test/{shaping => shape}/data/aots/fonts/gpos5_font1.otf     | Bin
+ test/{shaping => shape}/data/aots/fonts/gpos6_font1.otf     | Bin
+ test/{shaping => shape}/data/aots/fonts/gpos7_1_font1.otf   | Bin
+ test/{shaping => shape}/data/aots/fonts/gpos9_font1.otf     | Bin
+ test/{shaping => shape}/data/aots/fonts/gpos9_font2.otf     | Bin
+ .../data/aots/fonts/gpos_chaining1_boundary_f1.otf          | Bin
+ .../data/aots/fonts/gpos_chaining1_boundary_f2.otf          | Bin
+ .../data/aots/fonts/gpos_chaining1_boundary_f3.otf          | Bin
+ .../data/aots/fonts/gpos_chaining1_boundary_f4.otf          | Bin
+ .../data/aots/fonts/gpos_chaining1_lookupflag_f1.otf        | Bin
+ .../data/aots/fonts/gpos_chaining1_multiple_subrules_f1.otf | Bin
+ .../data/aots/fonts/gpos_chaining1_multiple_subrules_f2.otf | Bin
+ .../data/aots/fonts/gpos_chaining1_next_glyph_f1.otf        | Bin
+ .../data/aots/fonts/gpos_chaining1_simple_f1.otf            | Bin
+ .../data/aots/fonts/gpos_chaining1_simple_f2.otf            | Bin
+ .../data/aots/fonts/gpos_chaining1_successive_f1.otf        | Bin
+ .../data/aots/fonts/gpos_chaining2_boundary_f1.otf          | Bin
+ .../data/aots/fonts/gpos_chaining2_boundary_f2.otf          | Bin
+ .../data/aots/fonts/gpos_chaining2_boundary_f3.otf          | Bin
+ .../data/aots/fonts/gpos_chaining2_boundary_f4.otf          | Bin
+ .../data/aots/fonts/gpos_chaining2_lookupflag_f1.otf        | Bin
+ .../data/aots/fonts/gpos_chaining2_multiple_subrules_f1.otf | Bin
+ .../data/aots/fonts/gpos_chaining2_multiple_subrules_f2.otf | Bin
+ .../data/aots/fonts/gpos_chaining2_next_glyph_f1.otf        | Bin
+ .../data/aots/fonts/gpos_chaining2_simple_f1.otf            | Bin
+ .../data/aots/fonts/gpos_chaining2_simple_f2.otf            | Bin
+ .../data/aots/fonts/gpos_chaining2_successive_f1.otf        | Bin
+ .../data/aots/fonts/gpos_chaining3_boundary_f1.otf          | Bin
+ .../data/aots/fonts/gpos_chaining3_boundary_f2.otf          | Bin
+ .../data/aots/fonts/gpos_chaining3_boundary_f3.otf          | Bin
+ .../data/aots/fonts/gpos_chaining3_boundary_f4.otf          | Bin
+ .../data/aots/fonts/gpos_chaining3_lookupflag_f1.otf        | Bin
+ .../data/aots/fonts/gpos_chaining3_next_glyph_f1.otf        | Bin
+ .../data/aots/fonts/gpos_chaining3_simple_f1.otf            | Bin
+ .../data/aots/fonts/gpos_chaining3_simple_f2.otf            | Bin
+ .../data/aots/fonts/gpos_chaining3_successive_f1.otf        | Bin
+ .../data/aots/fonts/gpos_context1_boundary_f1.otf           | Bin
+ .../data/aots/fonts/gpos_context1_boundary_f2.otf           | Bin
+ .../data/aots/fonts/gpos_context1_expansion_f1.otf          | Bin
+ .../data/aots/fonts/gpos_context1_lookupflag_f1.otf         | Bin
+ .../data/aots/fonts/gpos_context1_lookupflag_f2.otf         | Bin
+ .../data/aots/fonts/gpos_context1_multiple_subrules_f1.otf  | Bin
+ .../data/aots/fonts/gpos_context1_multiple_subrules_f2.otf  | Bin
+ .../data/aots/fonts/gpos_context1_next_glyph_f1.otf         | Bin
+ .../data/aots/fonts/gpos_context1_simple_f1.otf             | Bin
+ .../data/aots/fonts/gpos_context1_simple_f2.otf             | Bin
+ .../data/aots/fonts/gpos_context1_successive_f1.otf         | Bin
+ .../data/aots/fonts/gpos_context2_boundary_f1.otf           | Bin
+ .../data/aots/fonts/gpos_context2_boundary_f2.otf           | Bin
+ .../data/aots/fonts/gpos_context2_classes_f1.otf            | Bin
+ .../data/aots/fonts/gpos_context2_classes_f2.otf            | Bin
+ .../data/aots/fonts/gpos_context2_expansion_f1.otf          | Bin
+ .../data/aots/fonts/gpos_context2_lookupflag_f1.otf         | Bin
+ .../data/aots/fonts/gpos_context2_lookupflag_f2.otf         | Bin
+ .../data/aots/fonts/gpos_context2_multiple_subrules_f1.otf  | Bin
+ .../data/aots/fonts/gpos_context2_multiple_subrules_f2.otf  | Bin
+ .../data/aots/fonts/gpos_context2_next_glyph_f1.otf         | Bin
+ .../data/aots/fonts/gpos_context2_simple_f1.otf             | Bin
+ .../data/aots/fonts/gpos_context2_simple_f2.otf             | Bin
+ .../data/aots/fonts/gpos_context2_successive_f1.otf         | Bin
+ .../data/aots/fonts/gpos_context3_boundary_f1.otf           | Bin
+ .../data/aots/fonts/gpos_context3_boundary_f2.otf           | Bin
+ .../data/aots/fonts/gpos_context3_lookupflag_f1.otf         | Bin
+ .../data/aots/fonts/gpos_context3_lookupflag_f2.otf         | Bin
+ .../data/aots/fonts/gpos_context3_next_glyph_f1.otf         | Bin
+ .../data/aots/fonts/gpos_context3_simple_f1.otf             | Bin
+ .../data/aots/fonts/gpos_context3_successive_f1.otf         | Bin
+ .../data/aots/fonts/gsub1_1_lookupflag_f1.otf               | Bin
+ .../data/aots/fonts/gsub1_1_modulo_f1.otf                   | Bin
+ .../data/aots/fonts/gsub1_1_simple_f1.otf                   | Bin
+ .../data/aots/fonts/gsub1_2_lookupflag_f1.otf               | Bin
+ .../data/aots/fonts/gsub1_2_simple_f1.otf                   | Bin
+ .../data/aots/fonts/gsub2_1_lookupflag_f1.otf               | Bin
+ .../data/aots/fonts/gsub2_1_multiple_sequences_f1.otf       | Bin
+ .../data/aots/fonts/gsub2_1_simple_f1.otf                   | Bin
+ .../data/aots/fonts/gsub3_1_lookupflag_f1.otf               | Bin
+ .../data/aots/fonts/gsub3_1_multiple_f1.otf                 | Bin
+ .../data/aots/fonts/gsub3_1_simple_f1.otf                   | Bin
+ .../data/aots/fonts/gsub4_1_lookupflag_f1.otf               | Bin
+ .../data/aots/fonts/gsub4_1_multiple_ligatures_f1.otf       | Bin
+ .../data/aots/fonts/gsub4_1_multiple_ligatures_f2.otf       | Bin
+ .../data/aots/fonts/gsub4_1_multiple_ligsets_f1.otf         | Bin
+ .../data/aots/fonts/gsub4_1_simple_f1.otf                   | Bin
+ test/{shaping => shape}/data/aots/fonts/gsub7_font1.otf     | Bin
+ test/{shaping => shape}/data/aots/fonts/gsub7_font2.otf     | Bin
+ .../data/aots/fonts/gsub_chaining1_boundary_f1.otf          | Bin
+ .../data/aots/fonts/gsub_chaining1_boundary_f2.otf          | Bin
+ .../data/aots/fonts/gsub_chaining1_boundary_f3.otf          | Bin
+ .../data/aots/fonts/gsub_chaining1_boundary_f4.otf          | Bin
+ .../data/aots/fonts/gsub_chaining1_lookupflag_f1.otf        | Bin
+ .../data/aots/fonts/gsub_chaining1_multiple_subrules_f1.otf | Bin
+ .../data/aots/fonts/gsub_chaining1_multiple_subrules_f2.otf | Bin
+ .../data/aots/fonts/gsub_chaining1_next_glyph_f1.otf        | Bin
+ .../data/aots/fonts/gsub_chaining1_simple_f1.otf            | Bin
+ .../data/aots/fonts/gsub_chaining1_simple_f2.otf            | Bin
+ .../data/aots/fonts/gsub_chaining1_successive_f1.otf        | Bin
+ .../data/aots/fonts/gsub_chaining2_boundary_f1.otf          | Bin
+ .../data/aots/fonts/gsub_chaining2_boundary_f2.otf          | Bin
+ .../data/aots/fonts/gsub_chaining2_boundary_f3.otf          | Bin
+ .../data/aots/fonts/gsub_chaining2_boundary_f4.otf          | Bin
+ .../data/aots/fonts/gsub_chaining2_lookupflag_f1.otf        | Bin
+ .../data/aots/fonts/gsub_chaining2_multiple_subrules_f1.otf | Bin
+ .../data/aots/fonts/gsub_chaining2_multiple_subrules_f2.otf | Bin
+ .../data/aots/fonts/gsub_chaining2_next_glyph_f1.otf        | Bin
+ .../data/aots/fonts/gsub_chaining2_simple_f1.otf            | Bin
+ .../data/aots/fonts/gsub_chaining2_simple_f2.otf            | Bin
+ .../data/aots/fonts/gsub_chaining2_successive_f1.otf        | Bin
+ .../data/aots/fonts/gsub_chaining3_boundary_f1.otf          | Bin
+ .../data/aots/fonts/gsub_chaining3_boundary_f2.otf          | Bin
+ .../data/aots/fonts/gsub_chaining3_boundary_f3.otf          | Bin
+ .../data/aots/fonts/gsub_chaining3_boundary_f4.otf          | Bin
+ .../data/aots/fonts/gsub_chaining3_lookupflag_f1.otf        | Bin
+ .../data/aots/fonts/gsub_chaining3_next_glyph_f1.otf        | Bin
+ .../data/aots/fonts/gsub_chaining3_simple_f1.otf            | Bin
+ .../data/aots/fonts/gsub_chaining3_simple_f2.otf            | Bin
+ .../data/aots/fonts/gsub_chaining3_successive_f1.otf        | Bin
+ .../data/aots/fonts/gsub_context1_boundary_f1.otf           | Bin
+ .../data/aots/fonts/gsub_context1_boundary_f2.otf           | Bin
+ .../data/aots/fonts/gsub_context1_expansion_f1.otf          | Bin
+ .../data/aots/fonts/gsub_context1_lookupflag_f1.otf         | Bin
+ .../data/aots/fonts/gsub_context1_lookupflag_f2.otf         | Bin
+ .../data/aots/fonts/gsub_context1_multiple_subrules_f1.otf  | Bin
+ .../data/aots/fonts/gsub_context1_multiple_subrules_f2.otf  | Bin
+ .../data/aots/fonts/gsub_context1_next_glyph_f1.otf         | Bin
+ .../data/aots/fonts/gsub_context1_simple_f1.otf             | Bin
+ .../data/aots/fonts/gsub_context1_simple_f2.otf             | Bin
+ .../data/aots/fonts/gsub_context1_successive_f1.otf         | Bin
+ .../data/aots/fonts/gsub_context2_boundary_f1.otf           | Bin
+ .../data/aots/fonts/gsub_context2_boundary_f2.otf           | Bin
+ .../data/aots/fonts/gsub_context2_classes_f1.otf            | Bin
+ .../data/aots/fonts/gsub_context2_classes_f2.otf            | Bin
+ .../data/aots/fonts/gsub_context2_expansion_f1.otf          | Bin
+ .../data/aots/fonts/gsub_context2_lookupflag_f1.otf         | Bin
+ .../data/aots/fonts/gsub_context2_lookupflag_f2.otf         | Bin
+ .../data/aots/fonts/gsub_context2_multiple_subrules_f1.otf  | Bin
+ .../data/aots/fonts/gsub_context2_multiple_subrules_f2.otf  | Bin
+ .../data/aots/fonts/gsub_context2_next_glyph_f1.otf         | Bin
+ .../data/aots/fonts/gsub_context2_simple_f1.otf             | Bin
+ .../data/aots/fonts/gsub_context2_simple_f2.otf             | Bin
+ .../data/aots/fonts/gsub_context2_successive_f1.otf         | Bin
+ .../data/aots/fonts/gsub_context3_boundary_f1.otf           | Bin
+ .../data/aots/fonts/gsub_context3_boundary_f2.otf           | Bin
+ .../data/aots/fonts/gsub_context3_lookupflag_f1.otf         | Bin
+ .../data/aots/fonts/gsub_context3_lookupflag_f2.otf         | Bin
+ .../data/aots/fonts/gsub_context3_next_glyph_f1.otf         | Bin
+ .../data/aots/fonts/gsub_context3_simple_f1.otf             | Bin
+ .../data/aots/fonts/gsub_context3_successive_f1.otf         | Bin
+ .../data/aots/fonts/lookupflag_ignore_attach_f1.otf         | Bin
+ .../data/aots/fonts/lookupflag_ignore_base_f1.otf           | Bin
+ .../data/aots/fonts/lookupflag_ignore_combination_f1.otf    | Bin
+ .../data/aots/fonts/lookupflag_ignore_ligatures_f1.otf      | Bin
+ .../data/aots/fonts/lookupflag_ignore_marks_f1.otf          | Bin
+ test/{shaping => shape}/data/aots/hb-aots-tester.cpp        |   0
+ test/{shaping => shape}/data/aots/meson.build               |   0
+ test/{shaping => shape}/data/aots/tests/classdef1.tests     |   0
+ .../data/aots/tests/classdef1_empty.tests                   |   0
+ .../data/aots/tests/classdef1_multiple.tests                |   0
+ .../data/aots/tests/classdef1_single.tests                  |   0
+ test/{shaping => shape}/data/aots/tests/classdef2.tests     |   0
+ .../data/aots/tests/classdef2_empty.tests                   |   0
+ .../data/aots/tests/classdef2_multiple.tests                |   0
+ .../data/aots/tests/classdef2_single.tests                  |   0
+ test/{shaping => shape}/data/aots/tests/cmap0.tests         |   0
+ test/{shaping => shape}/data/aots/tests/cmap10.tests        |   0
+ test/{shaping => shape}/data/aots/tests/cmap12.tests        |   0
+ test/{shaping => shape}/data/aots/tests/cmap2.tests         |   0
+ test/{shaping => shape}/data/aots/tests/cmap4.tests         |   0
+ test/{shaping => shape}/data/aots/tests/cmap6.tests         |   0
+ test/{shaping => shape}/data/aots/tests/cmap8.tests         |   0
+ .../data/aots/tests/gpos1_1_lookupflag.tests                |   0
+ .../{shaping => shape}/data/aots/tests/gpos1_1_simple.tests |   0
+ test/{shaping => shape}/data/aots/tests/gpos1_2.tests       |   0
+ .../data/aots/tests/gpos1_2_lookupflag.tests                |   0
+ test/{shaping => shape}/data/aots/tests/gpos2_1.tests       |   0
+ .../data/aots/tests/gpos2_1_lookupflag.tests                |   0
+ .../data/aots/tests/gpos2_1_next_glyph.tests                |   0
+ .../{shaping => shape}/data/aots/tests/gpos2_1_simple.tests |   0
+ test/{shaping => shape}/data/aots/tests/gpos2_2.tests       |   0
+ test/{shaping => shape}/data/aots/tests/gpos3.tests         |   0
+ .../data/aots/tests/gpos3_lookupflag.tests                  |   0
+ .../data/aots/tests/gpos4_lookupflag.tests                  |   0
+ .../data/aots/tests/gpos4_multiple_anchors.tests            |   0
+ test/{shaping => shape}/data/aots/tests/gpos4_simple.tests  |   0
+ test/{shaping => shape}/data/aots/tests/gpos5.tests         |   0
+ test/{shaping => shape}/data/aots/tests/gpos6.tests         |   0
+ test/{shaping => shape}/data/aots/tests/gpos7_1.tests       |   0
+ test/{shaping => shape}/data/aots/tests/gpos9.tests         |   0
+ .../data/aots/tests/gpos_chaining1_boundary.tests           |   0
+ .../data/aots/tests/gpos_chaining1_lookupflag.tests         |   0
+ .../data/aots/tests/gpos_chaining1_multiple_subrules.tests  |   0
+ .../data/aots/tests/gpos_chaining1_next_glyph.tests         |   0
+ .../data/aots/tests/gpos_chaining1_simple.tests             |   0
+ .../data/aots/tests/gpos_chaining1_successive.tests         |   0
+ .../data/aots/tests/gpos_chaining2_boundary.tests           |   0
+ .../data/aots/tests/gpos_chaining2_lookupflag.tests         |   0
+ .../data/aots/tests/gpos_chaining2_multiple_subrules.tests  |   0
+ .../data/aots/tests/gpos_chaining2_next_glyph.tests         |   0
+ .../data/aots/tests/gpos_chaining2_simple.tests             |   0
+ .../data/aots/tests/gpos_chaining2_successive.tests         |   0
+ .../data/aots/tests/gpos_chaining3_boundary.tests           |   0
+ .../data/aots/tests/gpos_chaining3_lookupflag.tests         |   0
+ .../data/aots/tests/gpos_chaining3_next_glyph.tests         |   0
+ .../data/aots/tests/gpos_chaining3_simple.tests             |   0
+ .../data/aots/tests/gpos_chaining3_successive.tests         |   0
+ .../data/aots/tests/gpos_context1_boundary.tests            |   0
+ .../data/aots/tests/gpos_context1_expansion.tests           |   0
+ .../data/aots/tests/gpos_context1_lookupflag.tests          |   0
+ .../data/aots/tests/gpos_context1_multiple_subrules.tests   |   0
+ .../data/aots/tests/gpos_context1_next_glyph.tests          |   0
+ .../data/aots/tests/gpos_context1_simple.tests              |   0
+ .../data/aots/tests/gpos_context1_successive.tests          |   0
+ .../data/aots/tests/gpos_context2_boundary.tests            |   0
+ .../data/aots/tests/gpos_context2_classes.tests             |   0
+ .../data/aots/tests/gpos_context2_expansion.tests           |   0
+ .../data/aots/tests/gpos_context2_lookupflag.tests          |   0
+ .../data/aots/tests/gpos_context2_multiple_subrules.tests   |   0
+ .../data/aots/tests/gpos_context2_next_glyph.tests          |   0
+ .../data/aots/tests/gpos_context2_simple.tests              |   0
+ .../data/aots/tests/gpos_context2_successive.tests          |   0
+ .../data/aots/tests/gpos_context3_boundary.tests            |   0
+ .../data/aots/tests/gpos_context3_lookupflag.tests          |   0
+ .../data/aots/tests/gpos_context3_next_glyph.tests          |   0
+ .../data/aots/tests/gpos_context3_simple.tests              |   0
+ .../data/aots/tests/gpos_context3_successive.tests          |   0
+ .../data/aots/tests/gsub1_1_lookupflag.tests                |   0
+ .../{shaping => shape}/data/aots/tests/gsub1_1_modulo.tests |   0
+ .../{shaping => shape}/data/aots/tests/gsub1_1_simple.tests |   0
+ .../data/aots/tests/gsub1_2_lookupflag.tests                |   0
+ .../{shaping => shape}/data/aots/tests/gsub1_2_simple.tests |   0
+ .../data/aots/tests/gsub2_1_lookupflag.tests                |   0
+ .../data/aots/tests/gsub2_1_multiple_sequences.tests        |   0
+ .../{shaping => shape}/data/aots/tests/gsub2_1_simple.tests |   0
+ .../data/aots/tests/gsub3_1_lookupflag.tests                |   0
+ .../data/aots/tests/gsub3_1_multiple.tests                  |   0
+ .../{shaping => shape}/data/aots/tests/gsub3_1_simple.tests |   0
+ .../data/aots/tests/gsub4_1_lookupflag.tests                |   0
+ .../data/aots/tests/gsub4_1_multiple_ligatures.tests        |   0
+ .../data/aots/tests/gsub4_1_multiple_ligsets.tests          |   0
+ .../{shaping => shape}/data/aots/tests/gsub4_1_simple.tests |   0
+ test/{shaping => shape}/data/aots/tests/gsub7.tests         |   0
+ .../data/aots/tests/gsub_chaining1_boundary.tests           |   0
+ .../data/aots/tests/gsub_chaining1_lookupflag.tests         |   0
+ .../data/aots/tests/gsub_chaining1_multiple_subrules.tests  |   0
+ .../data/aots/tests/gsub_chaining1_next_glyph.tests         |   0
+ .../data/aots/tests/gsub_chaining1_simple.tests             |   0
+ .../data/aots/tests/gsub_chaining1_successive.tests         |   0
+ .../data/aots/tests/gsub_chaining2_boundary.tests           |   0
+ .../data/aots/tests/gsub_chaining2_lookupflag.tests         |   0
+ .../data/aots/tests/gsub_chaining2_multiple_subrules.tests  |   0
+ .../data/aots/tests/gsub_chaining2_next_glyph.tests         |   0
+ .../data/aots/tests/gsub_chaining2_simple.tests             |   0
+ .../data/aots/tests/gsub_chaining2_successive.tests         |   0
+ .../data/aots/tests/gsub_chaining3_boundary.tests           |   0
+ .../data/aots/tests/gsub_chaining3_lookupflag.tests         |   0
+ .../data/aots/tests/gsub_chaining3_next_glyph.tests         |   0
+ .../data/aots/tests/gsub_chaining3_simple.tests             |   0
+ .../data/aots/tests/gsub_chaining3_successive.tests         |   0
+ .../data/aots/tests/gsub_context1_boundary.tests            |   0
+ .../data/aots/tests/gsub_context1_expansion.tests           |   0
+ .../data/aots/tests/gsub_context1_lookupflag.tests          |   0
+ .../data/aots/tests/gsub_context1_multiple_subrules.tests   |   0
+ .../data/aots/tests/gsub_context1_next_glyph.tests          |   0
+ .../data/aots/tests/gsub_context1_simple.tests              |   0
+ .../data/aots/tests/gsub_context1_successive.tests          |   0
+ .../data/aots/tests/gsub_context2_boundary.tests            |   0
+ .../data/aots/tests/gsub_context2_classes.tests             |   0
+ .../data/aots/tests/gsub_context2_expansion.tests           |   0
+ .../data/aots/tests/gsub_context2_lookupflag.tests          |   0
+ .../data/aots/tests/gsub_context2_multiple_subrules.tests   |   0
+ .../data/aots/tests/gsub_context2_next_glyph.tests          |   0
+ .../data/aots/tests/gsub_context2_simple.tests              |   0
+ .../data/aots/tests/gsub_context2_successive.tests          |   0
+ .../data/aots/tests/gsub_context3_boundary.tests            |   0
+ .../data/aots/tests/gsub_context3_lookupflag.tests          |   0
+ .../data/aots/tests/gsub_context3_next_glyph.tests          |   0
+ .../data/aots/tests/gsub_context3_simple.tests              |   0
+ .../data/aots/tests/gsub_context3_successive.tests          |   0
+ .../data/aots/tests/lookupflag_ignore_attach.tests          |   0
+ .../data/aots/tests/lookupflag_ignore_base.tests            |   0
+ .../data/aots/tests/lookupflag_ignore_combination.tests     |   0
+ .../data/aots/tests/lookupflag_ignore_ligatures.tests       |   0
+ .../data/aots/tests/lookupflag_ignore_marks.tests           |   0
+ test/{shaping => shape}/data/aots/update.py                 |   0
+ test/{shaping => shape}/data/in-house/COPYING               |   0
+ test/{shaping => shape}/data/in-house/Makefile.am           |   0
+ test/{shaping => shape}/data/in-house/Makefile.sources      |   0
+ .../fonts/03e3f463c3a985bc42096620cc415342818454fb.ttf      | Bin
+ .../fonts/051d92f8bc6ff724511b296c27623f824de256e9.ttf      | Bin
+ .../fonts/065b01e54f35f0d849fd43bd5b936212739a50cb.ttf      | Bin
+ .../fonts/074a5ae6b19de8f29772fdd5df2d3d833f81f5e6.ttf      | Bin
+ .../fonts/07f054357ff8638bac3711b422a1e31180bba863.ttf      | Bin
+ .../fonts/08b4b136f418add748dc641eb4a83033476f1170.ttf      | Bin
+ .../fonts/15dfc433a135a658b9f4b1a861b5cdd9658ccbb9.ttf      | Bin
+ .../fonts/1735326da89f0818cd8c51a0600e9789812c0f94.ttf      | Bin
+ .../fonts/191826b9643e3f124d865d617ae609db6a2ce203.ttf      | Bin
+ .../fonts/1a3d8f381387dd29be1e897e4b5100ac8b4829e1.ttf      | Bin
+ .../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf      | Bin
+ .../fonts/1c04a16f32a39c26c851b7fc014d2e8d298ba2b8.ttf      | Bin
+ .../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf      | Bin
+ .../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf      | Bin
+ .../fonts/1ed7e9064f008f62de6ff0207bb4dd29409597a5.ttf      | Bin
+ .../fonts/21b7fb9c1eeae260473809fbc1fe330f66a507cd.ttf      | Bin
+ .../fonts/226bc2deab3846f1a682085f70c67d0421014144.ttf      | Bin
+ .../fonts/24b8d24d00ae86f49791b746da4c9d3f717a51a8.ttf      | Bin
+ .../fonts/2681c1c72d6484ed3410417f521b1b819b4e2392.ttf      | Bin
+ .../fonts/270b89df543a7e48e206a2d830c0e10e5265c630.ttf      | Bin
+ .../fonts/28f497629c04ceb15546c9a70e0730125ed6698d.ttf      | Bin
+ .../fonts/298c9e1d955f10f6f72c6915c3c6ff9bf9695cec.ttf      | Bin
+ .../fonts/2a670df15b73a5dc75a5cc491bde5ac93c5077dc.ttf      | Bin
+ .../fonts/2c25beb56d9c556622d56b0b5d02b4670c034f89.ttf      | Bin
+ .../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf      | Bin
+ .../fonts/341421e629668b1a1242245d39238ca48432d35d.ttf      | Bin
+ .../fonts/3493e92eaded2661cadde752a39f9d58b11f0326.ttf      | Bin
+ .../fonts/37033cc5cf37bb223d7355153016b6ccece93b28.ttf      | Bin
+ .../fonts/373e67bf41ca264e260a9716162b71a23549e885.ttf      | Bin
+ .../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf      | Bin
+ .../fonts/3b791518a9ba89675df02f1eefbc9026a50648a6.ttf      | Bin
+ .../fonts/3c96e7a303c58475a8c750bf4289bbe73784f37d.ttf      | Bin
+ .../fonts/3cae6bfe5b57c07ba81ddbd54c02fe4f3a1e3bf6.ttf      | Bin
+ .../fonts/3cc01fede4debd4b7794ccb1b16cdb9987ea7571.ttf      | Bin
+ .../fonts/3cf6f8ac6d647473a43a3100e7494b202b2cfafe.ttf      | Bin
+ .../fonts/3d0b77a2360aa6faa1385aaa510509ab70dfbeff.ttf      | Bin
+ .../fonts/43ef465752be9af900745f72fe29cb853a1401a5.ttf      | Bin
+ .../fonts/45855bc8d46332b39c4ab9e2ee1a26b1f896da6b.ttf      | Bin
+ .../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf      | Bin
+ .../fonts/49c9f7485c1392fa09a1b801bc2ffea79275f22e.ttf      | Bin
+ .../fonts/4afb0e8b9a86bb9bd73a1247de4e33fbe3c1fd93.ttf      | Bin
+ .../fonts/4cbbc461be066fccc611dcc634af6e8cb2705537.ttf      | Bin
+ .../fonts/4cce528e99f600ed9c25a2b69e32eb94a03b4ae8.ttf      | Bin
+ .../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf      | Bin
+ .../fonts/4fac3929fc3332834e93673780ec0fe94342d193.ttf      | Bin
+ .../fonts/5028afb650b1bb718ed2131e872fbcce57828fff.ttf      | Bin
+ .../fonts/53374c7ca3657be37efde7ed02ae34229a56ae1f.ttf      | Bin
+ .../fonts/53a91c20e33a596f2be17fb68b382d6b7eb85d5c.ttf      | Bin
+ .../fonts/54674a3111d209fb6be0ed31745314b7a8d2c244.ttf      | Bin
+ .../fonts/55c88ebbe938680b08f92c3de20713183e0c7481.ttf      | Bin
+ .../fonts/56cfd0e18d07f41c38e9598545a6d369127fc6f9.ttf      | Bin
+ .../fonts/573d3a3177c9a8646e94c8a0d7b224334340946a.ttf      | Bin
+ .../fonts/57a9d9f83020155cbb1d2be1f43d82388cbecc88.ttf      | Bin
+ .../fonts/59a585a63b3df608fbeef00956c8c108deec7de6.ttf      | Bin
+ .../fonts/5af5361ed4d1e8305780b100e1730cb09132f8d1.ttf      | Bin
+ .../fonts/5bb74492f5e0ffa1fbb72e4c881be035120b6513.ttf      | Bin
+ .../fonts/5dfad7735c6a67085f1b90d4d497e32907db4c78.ttf      | Bin
+ .../fonts/604026ae5aaca83c49cd8416909d71ba3e1c1194.ttf      | Bin
+ .../fonts/641ca9d7808b01cafa9a666c13811c9b56eb9c52.ttf      | Bin
+ .../fonts/663aef6b019dbf45ffd74089e2b5f2496ceceb18.ttf      | Bin
+ .../fonts/6677074106f94a2644da6aaaacd5bbd48cbdc7de.ttf      | Bin
+ .../fonts/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf      | Bin
+ .../fonts/6f36d056bad6d478fc0bf7397bd52dc3bd197d5f.ttf      | Bin
+ .../fonts/6ff0fbead4462d9f229167b4e6839eceb8465058.ttf      | Bin
+ .../fonts/706c5d7b625f207bc0d874c67237aad6f1e9cd6f.ttf      | Bin
+ .../fonts/738d9f3b8c2dfd03875bf35a61d28fd78faf17c8.ttf      | Bin
+ .../fonts/73e84dac2fc6a2d1bc9250d1414353661088937d.ttf      | Bin
+ .../fonts/757ebd573617a24aa9dfbf0b885c54875c6fe06b.ttf      | Bin
+ .../fonts/7a37dc4d5bf018456aea291cee06daf004c0221c.ttf      | Bin
+ .../fonts/7d18685e1529e4ceaad5b6095dfab2f9789e5bce.ttf      | Bin
+ .../fonts/7e14e7883ed152baa158b80e207b66114c823a8b.ttf      | Bin
+ .../fonts/8099955657a54e9ee38a6ba1d6f950ce58e3cc25.ttf      | Bin
+ .../fonts/8116e5d8fedfbec74e45dc350d2416d810bed8c4.ttf      | Bin
+ .../fonts/813c2f8e5512187fd982417a7fb4286728e6f4a8.ttf      | Bin
+ .../fonts/81c368a33816fb20e9f647e8f24e2180f4720263.ttf      | Bin
+ .../fonts/8228d035fcd65d62ec9728fb34f42c63be93a5d3.ttf      | Bin
+ .../fonts/82f4f3b57bb55344e72e70231380202a52af5805.ttf      | Bin
+ .../fonts/8454d22037f892e76614e1645d066689a0200e61.ttf      | Bin
+ .../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf      | Bin
+ .../fonts/856ff9562451293cbeff6f396d4e3877c4f0a436.ttf      | Bin
+ .../fonts/85fe0be440c64ac77699e21c2f1bd933a919167e.ttf      | Bin
+ .../fonts/86cdd983c4e4c4d7f27dd405d6ceb7d4b9ed3d35.ttf      | Bin
+ .../fonts/87f85d17d26f1fe9ad28d7365101958edaefb967.ttf      | Bin
+ .../fonts/881642af1667ae30a54e58de8be904566d00508f.ttf      | Bin
+ .../fonts/8a9fea2a7384f2116e5b84a9b31f83be7850ce21.ttf      | Bin
+ .../fonts/8d9c4b193808b8bde94389ba7831c1fc6f9e794e.ttf      | Bin
+ .../fonts/932ad5132c2761297c74e9976fe25b08e5ffa10b.ttf      | Bin
+ .../fonts/94a5d6fb15a27521fba9ea4aee9cb39b2d03322a.ttf      | Bin
+ .../fonts/96490dd2ff81233b335a650e7eb660e0e7b2eeea.ttf      | Bin
+ .../fonts/98b7887cff91f722b92a8ff800120954606354f9.ttf      | Bin
+ .../fonts/9fc3e6960b3520e5304033ef5fd540285f72f14d.ttf      | Bin
+ test/{shaping => shape}/data/in-house/fonts/AdobeBlank2.ttf | Bin
+ test/{shaping => shape}/data/in-house/fonts/DFONT.dfont     | Bin
+ test/{shaping => shape}/data/in-house/fonts/HBTest-VF.ttf   | Bin
+ .../data/in-house/fonts/MORXTwentyeight.ttf                 | Bin
+ test/{shaping => shape}/data/in-house/fonts/TRAK.ttf        | Bin
+ test/{shaping => shape}/data/in-house/fonts/TTC.ttc         | Bin
+ .../fonts/a014549f766436cf55b2ceb40e462038938ee899.ttf      | Bin
+ .../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf      | Bin
+ .../fonts/a34a7b00f22ffb5fd7eef6933b81c7e71bc2cdfb.ttf      | Bin
+ .../fonts/a6b17da98b9f1565ba428719777bbf94a66403c1.ttf      | Bin
+ .../fonts/a6c76d1bafde4a0b1026ebcc932d2e5c6fd02442.ttf      | Bin
+ .../fonts/a706511c65fb278fda87eaf2180ca6684a80f423.ttf      | Bin
+ .../fonts/a919b33197965846f21074b24e30250d67277bce.ttf      | Bin
+ .../fonts/a98e908e2ed21b22228ea59ebcc0f05034c86f2e.ttf      | Bin
+ .../fonts/ab14b4eb9d7a67e293f51d30d719add06c9d6e06.ttf      | Bin
+ .../fonts/ab40c89624a6104e5d0a2308e448a989302f515b.ttf      | Bin
+ .../fonts/ad01ab2ea1cb1a4d3a2783e2675112ef11ae6404.ttf      | Bin
+ .../fonts/af3086380b743099c54a3b11b96766039ea62fcd.ttf      | Bin
+ .../fonts/af85624080af5627fb050f570d148a62f04fda74.ttf      | Bin
+ .../fonts/b082211be29a3e2cf91f0fd43497e40b2a27b344.ttf      | Bin
+ .../fonts/b121d4306b2e3add5abbaad21d95fcf04aacbd64.ttf      | Bin
+ .../fonts/b151cfcdaa77585d77f17a42158e0873fc8e2633.ttf      | Bin
+ .../fonts/b3075ca42b27dde7341c2d0ae16703c5b6640df0.ttf      | Bin
+ .../fonts/b31e6c52a31edadc16f1bec9efe6019e2d59824a.ttf      | Bin
+ .../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf      | Bin
+ .../fonts/b722a7d09e60421f3efbc706ad348ab47b88567b.ttf      | Bin
+ .../fonts/bb0c53752e85c3d28973ebc913287b8987d3dfe8.ttf      | Bin
+ .../fonts/bb9473d2403488714043bcfb946c9f78b86ad627.ttf      | Bin
+ .../fonts/bf39b0e91ef9807f15a9e283a21a14a209fd2cfc.ttf      | Bin
+ .../fonts/bf962d3202883a820aed019d9b5c1838c2ff69c6.ttf      | Bin
+ .../fonts/c4e48b0886ef460f532fb49f00047ec92c432ec0.ttf      | Bin
+ .../fonts/cc5f3d2d717fb6bd4dfae1c16d48a2cb8e12233b.ttf      | Bin
+ .../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf      | Bin
+ .../fonts/d3129450fafe5e5c98cfc25a4e71809b1b4d2855.ttf      | Bin
+ .../fonts/d629e7fedc0b350222d7987345fe61613fa3929a.ttf      | Bin
+ .../fonts/d9b8bc10985f24796826c29f7ccba3d0ae11ec02.ttf      | Bin
+ .../fonts/dcf774ca21062e7439f98658b18974ea8b956d0c.ttf      | Bin
+ .../fonts/df768b9c257e0c9c35786c47cae15c46571d56be.ttf      | Bin
+ .../fonts/e207635780b42f898d58654b65098763e340f5c7.ttf      | Bin
+ .../fonts/e39391c77a6321c2ac7a2d644de0396470cd4bfe.ttf      | Bin
+ .../fonts/e5ff44940364c2247abed50bdda30d2ef5aedfe4.ttf      | Bin
+ .../fonts/e68a88939e0f06e34d2bc911f09b70890289c8fd.ttf      | Bin
+ .../fonts/e8691822f6a705e3e9fb48a0405c645b1a036590.ttf      | Bin
+ .../fonts/ea3f63620511b2097200d23774ffef197e829e69.ttf      | Bin
+ .../fonts/ee39587d13b2afa5499cc79e45780aa79293bbd4.ttf      | Bin
+ .../fonts/ef86fe710cfea877bbe0dbb6946a1f88d0661031.ttf      | Bin
+ .../fonts/f22416c692720a7d46fadf4af99f4c9e094f00b9.ttf      | Bin
+ .../fonts/f443753e8ffe8e8aae606cfba158e00334b6efb1.ttf      | Bin
+ .../fonts/f499fbc23865022234775c43503bba2e63978fe1.ttf      | Bin
+ .../fonts/f518eb6f6b5eec2946c9fbbbde44e45d46f5e2ac.ttf      | Bin
+ .../fonts/f75c4b05a0a4d67c1a808081ae3d74a9c66509e8.ttf      | Bin
+ .../fonts/f79eb71df4e4c9c273b67b89a06e5ff9e3c1f834.ttf      | Bin
+ .../fonts/f9b1dd4dcb515e757789a22cb4241107746fd3d0.ttf      | Bin
+ .../fonts/fbb6c84c9e1fe0c39e152fbe845e51fd81f6748e.ttf      | Bin
+ .../fonts/fcbaa518d3cce441ed37ae3b1fed6a19e9b54efd.ttf      | Bin
+ .../fonts/fcdcffbdf1c4c97c05308d7600e4c283eb47dbca.ttf      | Bin
+ .../fonts/fcea341ba6489536390384d8403ce5287ba71a4a.ttf      | Bin
+ .../fonts/fd07ea46e4d8368ada1776208c07fd596f727852.ttf      | Bin
+ .../fonts/ffa0f5d2d9025486d8469d8b1fdd983e7632499b.ttf      | Bin
+ test/{shaping => shape}/data/in-house/meson.build           |   0
+ test/{shaping => shape}/data/in-house/tests/aat-morx.tests  |   0
+ test/{shaping => shape}/data/in-house/tests/aat-trak.tests  |   0
+ .../data/in-house/tests/arabic-fallback-shaping.tests       |   0
+ .../data/in-house/tests/arabic-feature-order.tests          |   0
+ .../data/in-house/tests/arabic-like-joining.tests           |   0
+ .../data/in-house/tests/arabic-mark-attach.tests            |   0
+ .../data/in-house/tests/arabic-mark-order.tests             |   0
+ .../data/in-house/tests/arabic-stch.tests                   |   0
+ .../data/in-house/tests/automatic-fractions.tests           |   0
+ test/{shaping => shape}/data/in-house/tests/cluster.tests   |   0
+ .../data/in-house/tests/collections.tests                   |   0
+ .../data/in-house/tests/color-fonts.tests                   |   0
+ .../data/in-house/tests/context-matching.tests              |   0
+ .../data/in-house/tests/cursive-positioning.tests           |   0
+ .../data/in-house/tests/default-ignorables.tests            |   0
+ test/{shaping => shape}/data/in-house/tests/digits.tests    |   0
+ .../data/in-house/tests/emoji-clusters.tests                |   0
+ test/{shaping => shape}/data/in-house/tests/emoji.tests     |   0
+ .../data/in-house/tests/fallback-positioning.tests          |   0
+ .../data/in-house/tests/hangul-jamo.tests                   |   0
+ test/{shaping => shape}/data/in-house/tests/hyphens.tests   |   0
+ .../data/in-house/tests/indic-consonant-with-stacker.tests  |   0
+ .../data/in-house/tests/indic-decompose.tests               |   0
+ .../{shaping => shape}/data/in-house/tests/indic-init.tests |   0
+ .../data/in-house/tests/indic-joiner-candrabindu.tests      |   0
+ .../data/in-house/tests/indic-joiners.tests                 |   0
+ .../data/in-house/tests/indic-old-spec.tests                |   0
+ .../data/in-house/tests/indic-pref-blocking.tests           |   0
+ .../data/in-house/tests/indic-script-extensions.tests       |   0
+ .../data/in-house/tests/indic-special-cases.tests           |   0
+ .../data/in-house/tests/indic-syllable.tests                |   0
+ .../data/in-house/tests/indic-vowel-letter-spoofing.tests   |   0
+ .../data/in-house/tests/kern-format2.tests                  |   0
+ .../data/in-house/tests/khmer-mark-order.tests              |   0
+ .../{shaping => shape}/data/in-house/tests/khmer-misc.tests |   0
+ .../data/in-house/tests/language-tags.tests                 |   0
+ .../data/in-house/tests/ligature-id.tests                   |   0
+ test/{shaping => shape}/data/in-house/tests/macos.tests     |   0
+ .../data/in-house/tests/mark-attachment.tests               |   0
+ .../data/in-house/tests/mark-filtering-sets.tests           |   0
+ .../data/in-house/tests/mongolian-variation-selector.tests  |   0
+ .../data/in-house/tests/myanmar-misc.tests                  |   0
+ .../data/in-house/tests/myanmar-syllable.tests              |   0
+ .../data/in-house/tests/myanmar-zawgyi.tests                |   0
+ .../data/in-house/tests/none-directional.tests              |   0
+ .../data/in-house/tests/positioning-features.tests          |   0
+ test/{shaping => shape}/data/in-house/tests/rand.tests      |   0
+ .../data/in-house/tests/reverse-sub.tests                   |   0
+ test/{shaping => shape}/data/in-house/tests/rotation.tests  |   0
+ test/{shaping => shape}/data/in-house/tests/simple.tests    |   0
+ test/{shaping => shape}/data/in-house/tests/sinhala.tests   |   0
+ test/{shaping => shape}/data/in-house/tests/spaces.tests    |   0
+ .../data/in-house/tests/tibetan-contractions-1.tests        |   0
+ .../data/in-house/tests/tibetan-contractions-2.tests        |   0
+ .../data/in-house/tests/tibetan-vowels.tests                |   0
+ .../data/in-house/tests/tt-kern-gpos.tests                  |   0
+ .../{shaping => shape}/data/in-house/tests/use-indic3.tests |   0
+ .../data/in-house/tests/use-marchen.tests                   |   0
+ .../data/in-house/tests/use-syllable.tests                  |   0
+ .../data/in-house/tests/use-vowel-letter-spoofing.tests     |   0
+ test/{shaping => shape}/data/in-house/tests/use.tests       |   0
+ .../data/in-house/tests/variations-rvrn.tests               |   0
+ .../{shaping => shape}/data/in-house/tests/variations.tests |   0
+ test/{shaping => shape}/data/in-house/tests/vertical.tests  |   0
+ .../data/in-house/tests/zero-width-marks.tests              |   0
+ test/{shaping => shape}/data/text-rendering-tests/COPYING   |   0
+ test/{shaping => shape}/data/text-rendering-tests/DISABLED  |   0
+ .../data/text-rendering-tests/Makefile.am                   |   0
+ .../data/text-rendering-tests/Makefile.sources              |   0
+ test/{shaping => shape}/data/text-rendering-tests/README    |   0
+ .../text-rendering-tests/fonts/AdobeVFPrototype-Subset.otf  | Bin
+ .../data/text-rendering-tests/fonts/FDArrayTest257.otf      | Bin
+ .../data/text-rendering-tests/fonts/FDArrayTest65535.otf    | Bin
+ .../text-rendering-tests/fonts/NotoSansBalinese-Regular.ttf | Bin
+ .../text-rendering-tests/fonts/NotoSansKannada-Regular.ttf  | Bin
+ .../text-rendering-tests/fonts/NotoSerifKannada-Regular.ttf | Bin
+ .../data/text-rendering-tests/fonts/Selawik-README.md       |   0
+ .../data/text-rendering-tests/fonts/Selawik-variable.ttf    | Bin
+ .../data/text-rendering-tests/fonts/TestAVAR.ttf            | Bin
+ .../data/text-rendering-tests/fonts/TestCMAP14.otf          | Bin
+ .../data/text-rendering-tests/fonts/TestCMAPMacTurkish.ttf  | Bin
+ .../data/text-rendering-tests/fonts/TestCVARGVAROne.ttf     | Bin
+ .../data/text-rendering-tests/fonts/TestCVARGVARTwo.ttf     | Bin
+ .../data/text-rendering-tests/fonts/TestGLYFOne.ttf         | Bin
+ .../data/text-rendering-tests/fonts/TestGPOSFour.ttf        | Bin
+ .../data/text-rendering-tests/fonts/TestGPOSOne.ttf         | Bin
+ .../data/text-rendering-tests/fonts/TestGPOSThree.ttf       | Bin
+ .../data/text-rendering-tests/fonts/TestGPOSTwo.otf         | Bin
+ .../data/text-rendering-tests/fonts/TestGSUBOne.otf         | Bin
+ .../data/text-rendering-tests/fonts/TestGSUBThree.ttf       | Bin
+ .../text-rendering-tests/fonts/TestGVAR-Composite-0.ttf     | Bin
+ .../fonts/TestGVAR-Composite-Missing.ttf                    | Bin
+ .../data/text-rendering-tests/fonts/TestGVAREight.ttf       | Bin
+ .../data/text-rendering-tests/fonts/TestGVARFour.ttf        | Bin
+ .../data/text-rendering-tests/fonts/TestGVARNine.ttf        | Bin
+ .../data/text-rendering-tests/fonts/TestGVAROne.ttf         | Bin
+ .../data/text-rendering-tests/fonts/TestGVARThree.ttf       | Bin
+ .../data/text-rendering-tests/fonts/TestGVARTwo.ttf         | Bin
+ .../data/text-rendering-tests/fonts/TestHVAROne.otf         | Bin
+ .../data/text-rendering-tests/fonts/TestHVARTwo.ttf         | Bin
+ .../data/text-rendering-tests/fonts/TestKERNOne.otf         | Bin
+ .../data/text-rendering-tests/fonts/TestMORXEight.ttf       | Bin
+ .../data/text-rendering-tests/fonts/TestMORXEighteen.ttf    | Bin
+ .../data/text-rendering-tests/fonts/TestMORXEleven.ttf      | Bin
+ .../data/text-rendering-tests/fonts/TestMORXForty.ttf       | Bin
+ .../data/text-rendering-tests/fonts/TestMORXFour.ttf        | Bin
+ .../data/text-rendering-tests/fonts/TestMORXFourteen.ttf    | Bin
+ .../data/text-rendering-tests/fonts/TestMORXFourtyone.ttf   | Bin
+ .../data/text-rendering-tests/fonts/TestMORXNine.ttf        | Bin
+ .../data/text-rendering-tests/fonts/TestMORXOne.ttf         | Bin
+ .../data/text-rendering-tests/fonts/TestMORXSeventeen.ttf   | Bin
+ .../data/text-rendering-tests/fonts/TestMORXSixteen.ttf     | Bin
+ .../data/text-rendering-tests/fonts/TestMORXTen.ttf         | Bin
+ .../data/text-rendering-tests/fonts/TestMORXThirteen.ttf    | Bin
+ .../data/text-rendering-tests/fonts/TestMORXThirtyeight.ttf | Bin
+ .../data/text-rendering-tests/fonts/TestMORXThirtyfive.ttf  | Bin
+ .../data/text-rendering-tests/fonts/TestMORXThirtyfour.ttf  | Bin
+ .../data/text-rendering-tests/fonts/TestMORXThirtynine.ttf  | Bin
+ .../data/text-rendering-tests/fonts/TestMORXThirtyone.ttf   | Bin
+ .../data/text-rendering-tests/fonts/TestMORXThirtyseven.ttf | Bin
+ .../data/text-rendering-tests/fonts/TestMORXThirtysix.ttf   | Bin
+ .../data/text-rendering-tests/fonts/TestMORXThirtythree.ttf | Bin
+ .../data/text-rendering-tests/fonts/TestMORXThirtytwo.ttf   | Bin
+ .../data/text-rendering-tests/fonts/TestMORXThree.ttf       | Bin
+ .../data/text-rendering-tests/fonts/TestMORXTwelve.ttf      | Bin
+ .../data/text-rendering-tests/fonts/TestMORXTwenty.ttf      | Bin
+ .../data/text-rendering-tests/fonts/TestMORXTwentyeight.ttf | Bin
+ .../data/text-rendering-tests/fonts/TestMORXTwentyfive.ttf  | Bin
+ .../data/text-rendering-tests/fonts/TestMORXTwentyfour.ttf  | Bin
+ .../data/text-rendering-tests/fonts/TestMORXTwentynine.ttf  | Bin
+ .../data/text-rendering-tests/fonts/TestMORXTwentyone.ttf   | Bin
+ .../data/text-rendering-tests/fonts/TestMORXTwentyseven.ttf | Bin
+ .../data/text-rendering-tests/fonts/TestMORXTwentysix.ttf   | Bin
+ .../data/text-rendering-tests/fonts/TestMORXTwentythree.ttf | Bin
+ .../data/text-rendering-tests/fonts/TestMORXTwentytwo.ttf   | Bin
+ .../data/text-rendering-tests/fonts/TestMORXTwo.ttf         | Bin
+ .../data/text-rendering-tests/fonts/TestSFNTOne.otf         | Bin
+ .../data/text-rendering-tests/fonts/TestSFNTTwo.ttf         | Bin
+ .../text-rendering-tests/fonts/TestSVGgradientTransform.otf | Bin
+ .../data/text-rendering-tests/fonts/TestSVGgzip.otf         | Bin
+ .../data/text-rendering-tests/fonts/TestSVGmultiGlyphs.otf  | Bin
+ .../data/text-rendering-tests/fonts/TestShapeAran.ttf       | Bin
+ .../data/text-rendering-tests/fonts/TestShapeEthi.ttf       | Bin
+ .../data/text-rendering-tests/fonts/TestShapeKndaV3.ttf     | Bin
+ .../data/text-rendering-tests/fonts/TestShapeLana.ttf       | Bin
+ .../data/text-rendering-tests/fonts/TestTRAKOne.ttf         | Bin
+ .../data/text-rendering-tests/fonts/Zycon.ttf               | Bin
+ .../data/text-rendering-tests/meson.build                   |   0
+ .../data/text-rendering-tests/tests/AVAR-1.tests            |   0
+ .../data/text-rendering-tests/tests/CFF-1.tests             |   0
+ .../data/text-rendering-tests/tests/CFF-2.tests             |   0
+ .../data/text-rendering-tests/tests/CFF2-1.tests            |   0
+ .../data/text-rendering-tests/tests/CMAP-1.tests            |   0
+ .../data/text-rendering-tests/tests/CMAP-2.tests            |   0
+ .../data/text-rendering-tests/tests/CMAP-3.tests            |   0
+ .../data/text-rendering-tests/tests/CVAR-1.tests            |   0
+ .../data/text-rendering-tests/tests/CVAR-2.tests            |   0
+ .../data/text-rendering-tests/tests/GLYF-1.tests            |   0
+ .../data/text-rendering-tests/tests/GPOS-1.tests            |   0
+ .../data/text-rendering-tests/tests/GPOS-2.tests            |   0
+ .../data/text-rendering-tests/tests/GPOS-3.tests            |   0
+ .../data/text-rendering-tests/tests/GPOS-4.tests            |   0
+ .../data/text-rendering-tests/tests/GPOS-5.tests            |   0
+ .../data/text-rendering-tests/tests/GSUB-1.tests            |   0
+ .../data/text-rendering-tests/tests/GSUB-2.tests            |   0
+ .../data/text-rendering-tests/tests/GSUB-3.tests            |   0
+ .../data/text-rendering-tests/tests/GVAR-1.tests            |   0
+ .../data/text-rendering-tests/tests/GVAR-2.tests            |   0
+ .../data/text-rendering-tests/tests/GVAR-3.tests            |   0
+ .../data/text-rendering-tests/tests/GVAR-4.tests            |   0
+ .../data/text-rendering-tests/tests/GVAR-5.tests            |   0
+ .../data/text-rendering-tests/tests/GVAR-6.tests            |   0
+ .../data/text-rendering-tests/tests/GVAR-7.tests            |   0
+ .../data/text-rendering-tests/tests/GVAR-8.tests            |   0
+ .../data/text-rendering-tests/tests/GVAR-9.tests            |   0
+ .../data/text-rendering-tests/tests/HVAR-1.tests            |   0
+ .../data/text-rendering-tests/tests/HVAR-2.tests            |   0
+ .../data/text-rendering-tests/tests/KERN-1.tests            |   0
+ .../data/text-rendering-tests/tests/KERN-2.tests            |   0
+ .../data/text-rendering-tests/tests/MORX-1.tests            |   0
+ .../data/text-rendering-tests/tests/MORX-10.tests           |   0
+ .../data/text-rendering-tests/tests/MORX-11.tests           |   0
+ .../data/text-rendering-tests/tests/MORX-12.tests           |   0
+ .../data/text-rendering-tests/tests/MORX-13.tests           |   0
+ .../data/text-rendering-tests/tests/MORX-14.tests           |   0
+ .../data/text-rendering-tests/tests/MORX-16.tests           |   0
+ .../data/text-rendering-tests/tests/MORX-17.tests           |   0
+ .../data/text-rendering-tests/tests/MORX-18.tests           |   0
+ .../data/text-rendering-tests/tests/MORX-19.tests           |   0
+ .../data/text-rendering-tests/tests/MORX-2.tests            |   0
+ .../data/text-rendering-tests/tests/MORX-20.tests           |   0
+ .../data/text-rendering-tests/tests/MORX-21.tests           |   0
+ .../data/text-rendering-tests/tests/MORX-22.tests           |   0
+ .../data/text-rendering-tests/tests/MORX-23.tests           |   0
+ .../data/text-rendering-tests/tests/MORX-24.tests           |   0
+ .../data/text-rendering-tests/tests/MORX-25.tests           |   0
+ .../data/text-rendering-tests/tests/MORX-26.tests           |   0
+ .../data/text-rendering-tests/tests/MORX-27.tests           |   0
+ .../data/text-rendering-tests/tests/MORX-28.tests           |   0
+ .../data/text-rendering-tests/tests/MORX-29.tests           |   0
+ .../data/text-rendering-tests/tests/MORX-3.tests            |   0
+ .../data/text-rendering-tests/tests/MORX-30.tests           |   0
+ .../data/text-rendering-tests/tests/MORX-31.tests           |   0
+ .../data/text-rendering-tests/tests/MORX-32.tests           |   0
+ .../data/text-rendering-tests/tests/MORX-33.tests           |   0
+ .../data/text-rendering-tests/tests/MORX-34.tests           |   0
+ .../data/text-rendering-tests/tests/MORX-35.tests           |   0
+ .../data/text-rendering-tests/tests/MORX-36.tests           |   0
+ .../data/text-rendering-tests/tests/MORX-37.tests           |   0
+ .../data/text-rendering-tests/tests/MORX-38.tests           |   0
+ .../data/text-rendering-tests/tests/MORX-39.tests           |   0
+ .../data/text-rendering-tests/tests/MORX-4.tests            |   0
+ .../data/text-rendering-tests/tests/MORX-40.tests           |   0
+ .../data/text-rendering-tests/tests/MORX-41.tests           |   0
+ .../data/text-rendering-tests/tests/MORX-5.tests            |   0
+ .../data/text-rendering-tests/tests/MORX-6.tests            |   0
+ .../data/text-rendering-tests/tests/MORX-7.tests            |   0
+ .../data/text-rendering-tests/tests/MORX-8.tests            |   0
+ .../data/text-rendering-tests/tests/MORX-9.tests            |   0
+ .../data/text-rendering-tests/tests/SFNT-1.tests            |   0
+ .../data/text-rendering-tests/tests/SFNT-2.tests            |   0
+ .../data/text-rendering-tests/tests/SHARAN-1.tests          |   0
+ .../data/text-rendering-tests/tests/SHBALI-1.tests          |   0
+ .../data/text-rendering-tests/tests/SHBALI-2.tests          |   0
+ .../data/text-rendering-tests/tests/SHBALI-3.tests          |   0
+ .../data/text-rendering-tests/tests/SHKNDA-1.tests          |   0
+ .../data/text-rendering-tests/tests/SHKNDA-2.tests          |   0
+ .../data/text-rendering-tests/tests/SHKNDA-3.tests          |   0
+ .../data/text-rendering-tests/tests/SHLANA-1.tests          |   0
+ .../data/text-rendering-tests/tests/SHLANA-10.tests         |   0
+ .../data/text-rendering-tests/tests/SHLANA-2.tests          |   0
+ .../data/text-rendering-tests/tests/SHLANA-3.tests          |   0
+ .../data/text-rendering-tests/tests/SHLANA-4.tests          |   0
+ .../data/text-rendering-tests/tests/SHLANA-5.tests          |   0
+ .../data/text-rendering-tests/tests/SHLANA-6.tests          |   0
+ .../data/text-rendering-tests/tests/SHLANA-7.tests          |   0
+ .../data/text-rendering-tests/tests/SHLANA-8.tests          |   0
+ .../data/text-rendering-tests/tests/SHLANA-9.tests          |   0
+ test/{shaping => shape}/data/text-rendering-tests/update.py |   0
+ test/{shaping => shape}/hb-diff                             |   0
+ test/{shaping => shape}/hb-diff-colorize                    |   0
+ test/{shaping => shape}/hb-diff-filter-failures             |   0
+ test/{shaping => shape}/hb-diff-stat                        |   0
+ test/{shaping => shape}/hb-unicode-decode                   |   0
+ test/{shaping => shape}/hb-unicode-encode                   |   0
+ test/{shaping => shape}/hb-unicode-prettyname               |   0
+ test/{shaping => shape}/hb_test_tools.py                    |   0
+ test/{shaping => shape}/meson.build                         |   0
+ test/{shaping => shape}/record-test.sh                      |   0
+ test/{shaping => shape}/run-tests.py                        |   0
+ .../shaper-arabic/script-arabic/language-persian/mehran.txt |   0
+ .../script-arabic/language-urdu/crulp/ligatures/2grams.txt  |   0
+ .../script-arabic/language-urdu/crulp/ligatures/3grams.txt  |   0
+ .../script-arabic/language-urdu/crulp/ligatures/4grams.txt  |   0
+ .../script-arabic/language-urdu/crulp/ligatures/5grams.txt  |   0
+ .../script-arabic/language-urdu/crulp/ligatures/6grams.txt  |   0
+ .../script-arabic/language-urdu/crulp/ligatures/7grams.txt  |   0
+ .../script-arabic/language-urdu/crulp/ligatures/8grams.txt  |   0
+ .../script-arabic/language-urdu/crulp/ligatures/LICENSE     |   0
+ .../script-arabic/language-urdu/crulp/ligatures/README      |   0
+ .../script-arabic/language-urdu/crulp/ligatures/SOURCES     |   0
+ .../script-arabic/misc/diacritics/lam-alef.txt              |   0
+ .../script-arabic/misc/diacritics/language-arabic.txt       |   0
+ .../script-arabic/misc/diacritics/language-persian.txt      |   0
+ .../script-arabic/misc/diacritics/language-urdu.txt         |   0
+ .../script-arabic/misc/diacritics/ligature-components.txt   |   0
+ .../script-arabic/misc/diacritics/ligature-diacritics.txt   |   0
+ .../script-arabic/misc/diacritics/mark-skipping.txt         |   0
+ .../in-house/shaper-arabic/script-mongolian/misc/misc.txt   |   0
+ .../shaper-arabic/script-mongolian/misc/non-joining.txt     |   0
+ .../in-house/shaper-arabic/script-mongolian/misc/poem.txt   |   0
+ .../script-mongolian/misc/variation-selectors.txt           |   0
+ .../texts/in-house/shaper-arabic/script-nko/misc/misc.txt   |   0
+ .../in-house/shaper-arabic/script-phags-pa/misc/misc.txt    |   0
+ .../shaper-arabic/script-syriac/misc/abbreviation-mark.txt  |   0
+ .../in-house/shaper-arabic/script-syriac/misc/alaph.txt     |   0
+ .../in-house/shaper-default/script-ethiopic/misc/misc.txt   |   0
+ .../in-house/shaper-default/script-han/misc/cjk-compat.txt  |   0
+ .../script-hiragana/misc/kazuraki-liga-lines.txt            |   0
+ .../shaper-default/script-hiragana/misc/kazuraki-liga.txt   |   0
+ .../in-house/shaper-default/script-linear-b/misc/misc.txt   |   0
+ .../in-house/shaper-default/script-tifinagh/misc/misc.txt   |   0
+ .../in-house/shaper-hangul/script-hangul/misc/misc.txt      |   0
+ .../shaper-hebrew/script-hebrew/misc/diacritics.txt         |   0
+ .../in-house/shaper-indic/script-assamese/utrrs/LICENSE     |   0
+ .../in-house/shaper-indic/script-assamese/utrrs/README      |   0
+ .../in-house/shaper-indic/script-assamese/utrrs/SOURCES     |   0
+ .../IndicFontFeatureCodepoint-AdditionalVowels.txt          |   0
+ .../codepoint/IndicFontFeatureCodepoint-Consonants.txt      |   0
+ .../codepoint/IndicFontFeatureCodepoint-DependentVowels.txt |   0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt    |   0
+ .../IndicFontFeatureCodepoint-IndependentVowels.txt         |   0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt  |   0
+ .../codepoint/IndicFontFeatureCodepoint-VariousSigns.txt    |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt           |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt           |   0
+ .../script-assamese/utrrs/gsub/IndicFontFeatureGSUB.txt     |   0
+ .../shaper-indic/script-bengali/bengali-vowel-letters.txt   |   0
+ .../in-house/shaper-indic/script-bengali/misc/misc.txt      |   0
+ .../in-house/shaper-indic/script-bengali/misc/reph.txt      |   0
+ .../in-house/shaper-indic/script-bengali/utrrs/LICENSE      |   0
+ .../texts/in-house/shaper-indic/script-bengali/utrrs/README |   0
+ .../in-house/shaper-indic/script-bengali/utrrs/SOURCES      |   0
+ .../IndicFontFeatureCodepoint-AdditionalVowels.txt          |   0
+ .../codepoint/IndicFontFeatureCodepoint-Consonants.txt      |   0
+ .../codepoint/IndicFontFeatureCodepoint-DependentVowels.txt |   0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt    |   0
+ .../IndicFontFeatureCodepoint-IndependentVowels.txt         |   0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt  |   0
+ .../codepoint/IndicFontFeatureCodepoint-VariousSigns.txt    |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt           |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt           |   0
+ .../script-bengali/utrrs/gsub/IndicFontFeatureGSUB.txt      |   0
+ .../script-devanagari/devanagari-atomic-consonants.txt      |   0
+ .../script-devanagari/devanagari-vowel-letters.txt          |   0
+ .../shaper-indic/script-devanagari/misc/dottedcircle.txt    |   0
+ .../shaper-indic/script-devanagari/misc/eyelash.txt         |   0
+ .../shaper-indic/script-devanagari/misc/joiners.txt         |   0
+ .../in-house/shaper-indic/script-devanagari/misc/misc.txt   |   0
+ .../shaper-indic/script-devanagari/misc/spec-deviations.txt |   0
+ .../script-devanagari/misc/tricky-reordering.txt            |   0
+ .../in-house/shaper-indic/script-devanagari/utrrs/LICENSE   |   0
+ .../in-house/shaper-indic/script-devanagari/utrrs/README    |   0
+ .../in-house/shaper-indic/script-devanagari/utrrs/SOURCES   |   0
+ .../IndicFontFeatureCodepoint-AdditionalConsonants.txt      |   0
+ .../IndicFontFeatureCodepoint-AdditionalVowels.txt          |   0
+ .../codepoint/IndicFontFeatureCodepoint-Consonants.txt      |   0
+ .../codepoint/IndicFontFeatureCodepoint-DependentVowels.txt |   0
+ .../IndicFontFeatureCodepoint-DevnagariSpecificAddition.txt |   0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt    |   0
+ .../IndicFontFeatureCodepoint-GenericPunctuation.txt        |   0
+ .../IndicFontFeatureCodepoint-IndependentVowels.txt         |   0
+ .../codepoint/IndicFontFeatureCodepoint-VariousSigns.txt    |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt           |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt           |   0
+ .../script-devanagari/utrrs/gsub/IndicFontFeatureGSUB.txt   |   0
+ .../shaper-indic/script-gujarati/gujarati-vowel-letters.txt |   0
+ .../in-house/shaper-indic/script-gujarati/utrrs/LICENSE     |   0
+ .../in-house/shaper-indic/script-gujarati/utrrs/README      |   0
+ .../in-house/shaper-indic/script-gujarati/utrrs/SOURCES     |   0
+ .../IndicFontFeatureCodepoint-AdditionalVowels.txt          |   0
+ .../codepoint/IndicFontFeatureCodepoint-Consonants.txt      |   0
+ .../codepoint/IndicFontFeatureCodepoint-DependentVowels.txt |   0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt    |   0
+ .../IndicFontFeatureCodepoint-IndependentVowels.txt         |   0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt  |   0
+ .../codepoint/IndicFontFeatureCodepoint-VariousSigns.txt    |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt           |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt           |   0
+ .../script-gujarati/utrrs/gsub/IndicFontFeatureGSUB.txt     |   0
+ .../shaper-indic/script-gurmukhi/gurmukhi-vowel-letters.txt |   0
+ .../in-house/shaper-indic/script-gurmukhi/misc/misc.txt     |   0
+ .../in-house/shaper-indic/script-gurmukhi/utrrs/LICENSE     |   0
+ .../in-house/shaper-indic/script-gurmukhi/utrrs/README      |   0
+ .../in-house/shaper-indic/script-gurmukhi/utrrs/SOURCES     |   0
+ .../codepoint/IndicFontFeatureCodepoint-Consonants.txt      |   0
+ .../codepoint/IndicFontFeatureCodepoint-DependentVowels.txt |   0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt    |   0
+ .../IndicFontFeatureCodepoint-GurmukhiSpecific.txt          |   0
+ .../IndicFontFeatureCodepoint-IndependentVowels.txt         |   0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt  |   0
+ .../codepoint/IndicFontFeatureCodepoint-VariousSigns.txt    |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt           |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt           |   0
+ .../script-gurmukhi/utrrs/gsub/IndicFontFeatureGSUB.txt     |   0
+ .../shaper-indic/script-kannada/kannada-vowel-letters.txt   |   0
+ .../in-house/shaper-indic/script-kannada/misc/misc.txt      |   0
+ .../shaper-indic/script-kannada/misc/right-matras.txt       |   0
+ .../in-house/shaper-indic/script-kannada/utrrs/LICENSE      |   0
+ .../texts/in-house/shaper-indic/script-kannada/utrrs/README |   0
+ .../in-house/shaper-indic/script-kannada/utrrs/SOURCES      |   0
+ .../IndicFontFeatureCodepoint-AdditionalConsonants.txt      |   0
+ .../IndicFontFeatureCodepoint-AdditionalVowels.txt          |   0
+ .../codepoint/IndicFontFeatureCodepoint-Consonants.txt      |   0
+ .../codepoint/IndicFontFeatureCodepoint-DependentVowels.txt |   0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt    |   0
+ .../IndicFontFeatureCodepoint-IndependentVowels.txt         |   0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt  |   0
+ .../codepoint/IndicFontFeatureCodepoint-VariousSigns.txt    |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt           |   0
+ .../script-kannada/utrrs/gsub/IndicFontFeatureGSUB.txt      |   0
+ .../script-malayalam/malayalam-vowel-letters.txt            |   0
+ .../in-house/shaper-indic/script-malayalam/misc/cibu.txt    |   0
+ .../shaper-indic/script-malayalam/misc/dot-reph.txt         |   0
+ .../in-house/shaper-indic/script-malayalam/misc/misc.txt    |   0
+ .../in-house/shaper-indic/script-malayalam/utrrs/LICENSE    |   0
+ .../in-house/shaper-indic/script-malayalam/utrrs/README     |   0
+ .../in-house/shaper-indic/script-malayalam/utrrs/SOURCES    |   0
+ .../IndicFontFeatureCodepoint-AdditionalVowels.txt          |   0
+ .../codepoint/IndicFontFeatureCodepoint-Consonants.txt      |   0
+ .../codepoint/IndicFontFeatureCodepoint-DependentVowels.txt |   0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt    |   0
+ .../IndicFontFeatureCodepoint-IndependentVowels.txt         |   0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt  |   0
+ .../codepoint/IndicFontFeatureCodepoint-VariousSigns.txt    |   0
+ .../script-malayalam/utrrs/gsub/IndicFontFeatureGSUB.txt    |   0
+ .../texts/in-house/shaper-indic/script-oriya/misc/bindu.txt |   0
+ .../texts/in-house/shaper-indic/script-oriya/misc/misc.txt  |   0
+ .../shaper-indic/script-oriya/oriya-vowel-letters.txt       |   0
+ .../texts/in-house/shaper-indic/script-oriya/utrrs/LICENSE  |   0
+ .../texts/in-house/shaper-indic/script-oriya/utrrs/README   |   0
+ .../texts/in-house/shaper-indic/script-oriya/utrrs/SOURCES  |   0
+ .../IndicFontFeatureCodepoint-AdditionalConsonants.txt      |   0
+ .../IndicFontFeatureCodepoint-AdditionalVowels.txt          |   0
+ .../codepoint/IndicFontFeatureCodepoint-Consonants.txt      |   0
+ .../codepoint/IndicFontFeatureCodepoint-DependentVowels.txt |   0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt    |   0
+ .../IndicFontFeatureCodepoint-IndependentVowels.txt         |   0
+ .../codepoint/IndicFontFeatureCodepoint-OriyaSpecific.txt   |   0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt  |   0
+ .../codepoint/IndicFontFeatureCodepoint-VariousSigns.txt    |   0
+ .../script-oriya/utrrs/gsub/IndicFontFeatureGSUB.txt        |   0
+ .../in-house/shaper-indic/script-sinhala/misc/extensive.txt |   0
+ .../in-house/shaper-indic/script-sinhala/misc/misc.txt      |   0
+ .../in-house/shaper-indic/script-sinhala/misc/reph.txt      |   0
+ .../shaper-indic/script-sinhala/misc/split-matras.txt       |   0
+ .../in-house/shaper-indic/script-sinhala/utrrs/LICENSE      |   0
+ .../texts/in-house/shaper-indic/script-sinhala/utrrs/README |   0
+ .../in-house/shaper-indic/script-sinhala/utrrs/SOURCES      |   0
+ .../codepoint/IndicFontFeatureCodepoint-Consonants.txt      |   0
+ .../codepoint/IndicFontFeatureCodepoint-DependentVowels.txt |   0
+ .../IndicFontFeatureCodepoint-IndependentVowels.txt         |   0
+ .../codepoint/IndicFontFeatureCodepoint-Punctuation.txt     |   0
+ .../codepoint/IndicFontFeatureCodepoint-VariousSigns.txt    |   0
+ .../script-sinhala/utrrs/gpos/IndicFontFeatureGPOS.txt      |   0
+ .../utrrs/gsub/IndicFontFeatureGSUB-Conjunct.txt            |   0
+ .../utrrs/gsub/IndicFontFeatureGSUB-Rakaaraansaya.txt       |   0
+ .../utrrs/gsub/IndicFontFeatureGSUB-Repaya.txt              |   0
+ .../utrrs/gsub/IndicFontFeatureGSUB-Special-Cases.txt       |   0
+ .../utrrs/gsub/IndicFontFeatureGSUB-TouchingLetters.txt     |   0
+ .../utrrs/gsub/IndicFontFeatureGSUB-Yansaya.txt             |   0
+ .../script-sinhala/utrrs/gsub/IndicFontFeatureGSUB.txt      |   0
+ .../texts/in-house/shaper-indic/script-tamil/misc/misc.txt  |   0
+ .../texts/in-house/shaper-indic/script-tamil/utrrs/LICENSE  |   0
+ .../texts/in-house/shaper-indic/script-tamil/utrrs/README   |   0
+ .../texts/in-house/shaper-indic/script-tamil/utrrs/SOURCES  |   0
+ .../codepoint/IndicFontFeatureCodepoint-Consonants.txt      |   0
+ .../codepoint/IndicFontFeatureCodepoint-CurrencySymbols.txt |   0
+ .../codepoint/IndicFontFeatureCodepoint-DependentVowels.txt |   0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt    |   0
+ .../IndicFontFeatureCodepoint-IndependentVowels.txt         |   0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Numerics.txt  |   0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt  |   0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Symbols.txt   |   0
+ .../codepoint/IndicFontFeatureCodepoint-TamilSymbol.txt     |   0
+ .../codepoint/IndicFontFeatureCodepoint-VariousSigns.txt    |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt           |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt           |   0
+ .../script-tamil/utrrs/gsub/IndicFontFeatureGSUB.txt        |   0
+ .../texts/in-house/shaper-indic/script-telugu/misc/misc.txt |   0
+ .../shaper-indic/script-telugu/telugu-vowel-letters.txt     |   0
+ .../texts/in-house/shaper-indic/script-telugu/utrrs/LICENSE |   0
+ .../texts/in-house/shaper-indic/script-telugu/utrrs/README  |   0
+ .../texts/in-house/shaper-indic/script-telugu/utrrs/SOURCES |   0
+ .../IndicFontFeatureCodepoint-AdditionalVowels.txt          |   0
+ .../codepoint/IndicFontFeatureCodepoint-Consonants.txt      |   0
+ .../codepoint/IndicFontFeatureCodepoint-DependentVowels.txt |   0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt    |   0
+ .../IndicFontFeatureCodepoint-IndependentVowels.txt         |   0
+ .../utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt  |   0
+ .../codepoint/IndicFontFeatureCodepoint-VariousSigns.txt    |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt           |   0
+ .../script-telugu/utrrs/gsub/IndicFontFeatureGSUB.txt       |   0
+ .../{shaping => shape}/texts/in-house/shaper-khmer/misc.txt |   0
+ .../texts/in-house/shaper-khmer/other-marks-invalid.txt     |   0
+ .../texts/in-house/shaper-khmer/other-marks.txt             |   0
+ .../in-house/shaper-myanmar/script-myanmar/misc/misc.txt    |   0
+ .../in-house/shaper-myanmar/script-myanmar/misc/otspec.txt  |   0
+ .../in-house/shaper-myanmar/script-myanmar/misc/utn11.txt   |   0
+ .../texts/in-house/shaper-thai/script-lao/misc/sara-am.txt  |   0
+ .../texts/in-house/shaper-thai/script-thai/misc/misc.txt    |   0
+ .../texts/in-house/shaper-thai/script-thai/misc/phinthu.txt |   0
+ .../in-house/shaper-thai/script-thai/misc/pua-shaping.txt   |   0
+ .../texts/in-house/shaper-thai/script-thai/misc/sara-am.txt |   0
+ .../shaper-tibetan/script-tibetan/misc/contractions.txt     |   0
+ .../in-house/shaper-tibetan/script-tibetan/misc/misc.txt    |   0
+ .../texts/in-house/shaper-use/script-batak/misc.txt         |   0
+ .../texts/in-house/shaper-use/script-buginese/misc.txt      |   0
+ .../texts/in-house/shaper-use/script-cham/misc.txt          |   0
+ .../texts/in-house/shaper-use/script-javanese/misc.txt      |   0
+ .../texts/in-house/shaper-use/script-kaithi/misc.txt        |   0
+ .../texts/in-house/shaper-use/script-kharoshti/misc.txt     |   0
+ .../texts/in-house/shaper-use/script-tai-tham/misc.txt      |   0
+ .../texts/in-house/shaper-use/script-tai-tham/torture.txt   |   0
+ 983 files changed, 8 insertions(+), 8 deletions(-)
+
+commit e4b33d9d360eeb80f7d841f7ad8921aa16836027
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 11 18:35:11 2021 -0600
+
+    [util] Use post_parse in face_options_t
+
+ util/face-options.hh | 37 ++++++++++++-------------------------
+ util/font-options.hh |  2 --
+ util/hb-subset.cc    |  2 +-
+ util/helper-cairo.hh |  2 +-
+ 4 files changed, 14 insertions(+), 29 deletions(-)
+
+commit c0ea4e2d33e613eb4936a9cce85453a6b7a43ae5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 11 18:30:08 2021 -0600
+
+    [util] Use post_parse to validate
+
+ util/face-options.hh   | 21 +++++++++++----
+ util/font-options.hh   |  1 -
+ util/main-font-text.hh | 72 ++++++++++++++++++++++++++++++++++----------------
+ util/options.hh        | 33 +++++++++--------------
+ util/text-options.hh   |  3 +++
+ 5 files changed, 81 insertions(+), 49 deletions(-)
+
+commit f1226988104281b576878cd8c306d03cc91aa111
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Thu Aug 12 01:47:35 2021 +0200
+
+    [test] Improve generate-expected-outputs.py diff output
+
+ test/subset/generate-expected-outputs.py | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 9468e4699833b6f6376503d2724fa4a8abcc8ab2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 11 16:46:04 2021 -0600
+
+    [util] Rename main_font_text back to main_font_text_t
+
+ util/hb-ot-shape-closure.cc | 2 +-
+ util/hb-shape.cc            | 2 +-
+ util/hb-subset.cc           | 2 +-
+ util/hb-view.cc             | 2 +-
+ util/main-font-text.hh      | 2 +-
+ 5 files changed, 5 insertions(+), 5 deletions(-)
+
+commit 6ac6a2b27b3abe42508828e7919c9ff55a7840d7
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Thu Aug 12 00:04:32 2021 +0200
+
+    [test] hb_ot_layout_language_get_feature_tags()
+
+ test/api/test-ot-layout.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 45 insertions(+)
+
+commit e9b743b26d9ac4a981ac519d85d975ad1d74f513
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Aug 11 23:51:12 2021 +0200
+
+    [test] hb_ot_layout_script_get_language_tags()
+
+ test/api/test-ot-layout.c | 40 ++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 40 insertions(+)
+
+commit bf438b815f488afe97ae8442ec4a0989a8bc0c65
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Aug 11 23:23:51 2021 +0200
+
+    [test] hb_ot_layout_table_get_feature_tags()
+
+ test/api/test-ot-layout.c | 42 ++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 42 insertions(+)
+
+commit 2f88ea5a200a8c33ed307460ef153cf51d486683
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Aug 11 23:12:00 2021 +0200
+
+    [test] hb_ot_layout_table_find_script()
+
+ test/api/test-ot-layout.c | 24 ++++++++++++++++++++++++
+ 1 file changed, 24 insertions(+)
+
+commit f60caad7ffd796c6dc1cc57f0cecee6fd643d827
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Aug 11 22:54:30 2021 +0200
+
+    [test] hb_ot_layout_table_get_script_tags()
+
+ test/api/Makefile.am      |  1 +
+ test/api/meson.build      |  1 +
+ test/api/test-ot-layout.c | 77 +++++++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 79 insertions(+)
+
+commit 7e4fcf1be895b7c92d3d5e3498cf1b467708994c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 11 12:12:49 2021 -0600
+
+    [util] Rename add_main_options
+
+ util/options.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 62fb102184b82ad1c7798c16fcb5f390ddf2ba91
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 11 12:03:07 2021 -0600
+
+    [util] Move add_main_options() invocation
+
+ util/options.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 9d8bbe3e531ded6419b2573c8b813596fff69745
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 11 11:53:32 2021 -0600
+
+    [util] Make main_font_text a struct again
+    
+    Going to move to G_OPTION_REMAINING.
+
+ util/batch.hh               |  8 +++---
+ util/hb-ot-shape-closure.cc |  2 +-
+ util/hb-shape.cc            |  4 +--
+ util/hb-subset.cc           |  4 +--
+ util/hb-view.cc             |  2 +-
+ util/main-font-text.hh      | 59 ++++++++++++++++++++++++---------------------
+ 6 files changed, 41 insertions(+), 38 deletions(-)
+
+commit 5bd463f130935df282cc2a484ef1bb6dbd047170
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 10 14:26:48 2021 -0600
+
+    [util/hb-subset] Access input directly
+
+ util/hb-subset.cc      | 3 ---
+ util/subset-options.hh | 5 -----
+ 2 files changed, 8 deletions(-)
+
+commit 6905f6fa600c2565573952e9d347dfcf9f0d3770
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 10 14:24:24 2021 -0600
+
+    [util/hb-subset] Use templated function to parse flags directly
+
+ util/subset-options.hh | 55 +++++++++++++++++++++++++-------------------------
+ 1 file changed, 27 insertions(+), 28 deletions(-)
+
+commit 3e3e1801a5a7916c3966c86b4deab225c3d63167
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 10 13:59:46 2021 -0600
+
+    [util] Small tweaks in --help output
+
+ util/font-options.hh | 3 ++-
+ util/text-options.hh | 4 ++--
+ 2 files changed, 4 insertions(+), 3 deletions(-)
+
+commit c08f1b89037b9a0277b8cef67ff2f38bcf253dfd
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Aug 10 12:29:32 2021 -0700
+
+    [map] fix incorrect population count in hash map.
+    
+    If the same key was set twice the population was being incorrectly incremented.
+
+ src/hb-map.hh                                      |   2 +-
+ test/api/test-map.c                                |  28 +++++++++++++++++++++
+ ...ase-minimized-hb-subset-fuzzer-5522792714993664 | Bin 0 -> 74 bytes
+ 3 files changed, 29 insertions(+), 1 deletion(-)
+
+commit e39c3bde7bf56a49848cba09cf7309ac6a359796
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Aug 10 11:41:55 2021 -0700
+
+    [subset] fix bug in parsing glyf flags.
+    
+    the bytes of the flag stream were being treated as signed integers instead of unsigned as specified in the spec.
+
+ src/hb-ot-glyf-table.hh                                  |   4 ++--
+ test/subset/data/Makefile.am                             |   1 +
+ test/subset/data/Makefile.sources                        |   1 +
+ ..._3131.drop-hints-retain-gids.63,64,65,6F,70,71,72.ttf | Bin 0 -> 1908 bytes
+ ..._3131.drop-hints-retain-gids.retain-all-codepoint.ttf | Bin 0 -> 1908 bytes
+ .../glyf_bug_3131.retain-gids.63,64,65,6F,70,71,72.ttf   | Bin 0 -> 1928 bytes
+ .../glyf_bug_3131.retain-gids.retain-all-codepoint.ttf   | Bin 0 -> 1928 bytes
+ test/subset/data/fonts/glyf_bug_3131.ttf                 | Bin 0 -> 2600 bytes
+ test/subset/data/tests/glyf_bug_3131.tests               |  11 +++++++++++
+ test/subset/meson.build                                  |   1 +
+ 10 files changed, 16 insertions(+), 2 deletions(-)
+
+commit f5a8f747ffc4fa920d12db68f1f40c28627d720a
+Merge: d92ee726c f3acb977e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 10 11:21:08 2021 -0600
+
+    Merge pull request #3132 from harfbuzz/semicolon
+    
+    Use semicolon in shaping test suite
+
+commit f3acb977ec269dc735ab68aa477ada774873d5d4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 10 11:05:40 2021 -0600
+
+    [test/shaping;util] Use ';' instead of ':' to separate test fields
+    
+    Accept that in --batch mode. Also in batch mode don't send the 0th arg.
+    
+    Related discussion: https://github.com/harfbuzz/harfbuzz/pull/3102
+
+ test/shaping/data/aots/hb-aots-tester.cpp          |   18 +-
+ test/shaping/data/aots/tests/classdef1.tests       |    2 +-
+ test/shaping/data/aots/tests/classdef1_empty.tests |    2 +-
+ .../data/aots/tests/classdef1_multiple.tests       |    2 +-
+ .../shaping/data/aots/tests/classdef1_single.tests |    2 +-
+ test/shaping/data/aots/tests/classdef2.tests       |    2 +-
+ test/shaping/data/aots/tests/classdef2_empty.tests |    2 +-
+ .../data/aots/tests/classdef2_multiple.tests       |    2 +-
+ .../shaping/data/aots/tests/classdef2_single.tests |    2 +-
+ test/shaping/data/aots/tests/cmap0.tests           |    2 +-
+ test/shaping/data/aots/tests/cmap10.tests          |    4 +-
+ test/shaping/data/aots/tests/cmap12.tests          |    2 +-
+ test/shaping/data/aots/tests/cmap2.tests           |    2 +-
+ test/shaping/data/aots/tests/cmap4.tests           |   12 +-
+ test/shaping/data/aots/tests/cmap6.tests           |    4 +-
+ test/shaping/data/aots/tests/cmap8.tests           |    2 +-
+ .../data/aots/tests/gpos1_1_lookupflag.tests       |    2 +-
+ test/shaping/data/aots/tests/gpos1_1_simple.tests  |    8 +-
+ test/shaping/data/aots/tests/gpos1_2.tests         |    2 +-
+ .../data/aots/tests/gpos1_2_lookupflag.tests       |    2 +-
+ test/shaping/data/aots/tests/gpos2_1.tests         |    4 +-
+ .../data/aots/tests/gpos2_1_lookupflag.tests       |    4 +-
+ .../data/aots/tests/gpos2_1_next_glyph.tests       |    4 +-
+ test/shaping/data/aots/tests/gpos2_1_simple.tests  |    4 +-
+ test/shaping/data/aots/tests/gpos2_2.tests         |   10 +-
+ test/shaping/data/aots/tests/gpos3.tests           |   22 +-
+ .../shaping/data/aots/tests/gpos3_lookupflag.tests |    4 +-
+ .../shaping/data/aots/tests/gpos4_lookupflag.tests |    4 +-
+ .../data/aots/tests/gpos4_multiple_anchors.tests   |    2 +-
+ test/shaping/data/aots/tests/gpos4_simple.tests    |   10 +-
+ test/shaping/data/aots/tests/gpos5.tests           |    4 +-
+ test/shaping/data/aots/tests/gpos6.tests           |    6 +-
+ test/shaping/data/aots/tests/gpos7_1.tests         |    4 +-
+ test/shaping/data/aots/tests/gpos9.tests           |    4 +-
+ .../data/aots/tests/gpos_chaining1_boundary.tests  |    8 +-
+ .../aots/tests/gpos_chaining1_lookupflag.tests     |    2 +-
+ .../tests/gpos_chaining1_multiple_subrules.tests   |    4 +-
+ .../aots/tests/gpos_chaining1_next_glyph.tests     |    2 +-
+ .../data/aots/tests/gpos_chaining1_simple.tests    |   22 +-
+ .../aots/tests/gpos_chaining1_successive.tests     |    2 +-
+ .../data/aots/tests/gpos_chaining2_boundary.tests  |    8 +-
+ .../aots/tests/gpos_chaining2_lookupflag.tests     |    2 +-
+ .../tests/gpos_chaining2_multiple_subrules.tests   |    4 +-
+ .../aots/tests/gpos_chaining2_next_glyph.tests     |    2 +-
+ .../data/aots/tests/gpos_chaining2_simple.tests    |   22 +-
+ .../aots/tests/gpos_chaining2_successive.tests     |    2 +-
+ .../data/aots/tests/gpos_chaining3_boundary.tests  |    8 +-
+ .../aots/tests/gpos_chaining3_lookupflag.tests     |    2 +-
+ .../aots/tests/gpos_chaining3_next_glyph.tests     |    2 +-
+ .../data/aots/tests/gpos_chaining3_simple.tests    |   22 +-
+ .../aots/tests/gpos_chaining3_successive.tests     |    2 +-
+ .../data/aots/tests/gpos_context1_boundary.tests   |    4 +-
+ .../data/aots/tests/gpos_context1_expansion.tests  |    2 +-
+ .../data/aots/tests/gpos_context1_lookupflag.tests |    4 +-
+ .../tests/gpos_context1_multiple_subrules.tests    |    4 +-
+ .../data/aots/tests/gpos_context1_next_glyph.tests |    2 +-
+ .../data/aots/tests/gpos_context1_simple.tests     |    6 +-
+ .../data/aots/tests/gpos_context1_successive.tests |    2 +-
+ .../data/aots/tests/gpos_context2_boundary.tests   |    4 +-
+ .../data/aots/tests/gpos_context2_classes.tests    |    4 +-
+ .../data/aots/tests/gpos_context2_expansion.tests  |    2 +-
+ .../data/aots/tests/gpos_context2_lookupflag.tests |    4 +-
+ .../tests/gpos_context2_multiple_subrules.tests    |    4 +-
+ .../data/aots/tests/gpos_context2_next_glyph.tests |    2 +-
+ .../data/aots/tests/gpos_context2_simple.tests     |    6 +-
+ .../data/aots/tests/gpos_context2_successive.tests |    2 +-
+ .../data/aots/tests/gpos_context3_boundary.tests   |    4 +-
+ .../data/aots/tests/gpos_context3_lookupflag.tests |    4 +-
+ .../data/aots/tests/gpos_context3_next_glyph.tests |    2 +-
+ .../data/aots/tests/gpos_context3_simple.tests     |    4 +-
+ .../data/aots/tests/gpos_context3_successive.tests |    2 +-
+ .../data/aots/tests/gsub1_1_lookupflag.tests       |    2 +-
+ test/shaping/data/aots/tests/gsub1_1_modulo.tests  |    2 +-
+ test/shaping/data/aots/tests/gsub1_1_simple.tests  |    2 +-
+ .../data/aots/tests/gsub1_2_lookupflag.tests       |    2 +-
+ test/shaping/data/aots/tests/gsub1_2_simple.tests  |    2 +-
+ .../data/aots/tests/gsub2_1_lookupflag.tests       |    2 +-
+ .../aots/tests/gsub2_1_multiple_sequences.tests    |    2 +-
+ test/shaping/data/aots/tests/gsub2_1_simple.tests  |    4 +-
+ .../data/aots/tests/gsub3_1_lookupflag.tests       |    2 +-
+ .../shaping/data/aots/tests/gsub3_1_multiple.tests |    2 +-
+ test/shaping/data/aots/tests/gsub3_1_simple.tests  |    2 +-
+ .../data/aots/tests/gsub4_1_lookupflag.tests       |    2 +-
+ .../aots/tests/gsub4_1_multiple_ligatures.tests    |    4 +-
+ .../data/aots/tests/gsub4_1_multiple_ligsets.tests |    2 +-
+ test/shaping/data/aots/tests/gsub4_1_simple.tests  |    2 +-
+ test/shaping/data/aots/tests/gsub7.tests           |    4 +-
+ .../data/aots/tests/gsub_chaining1_boundary.tests  |    8 +-
+ .../aots/tests/gsub_chaining1_lookupflag.tests     |    2 +-
+ .../tests/gsub_chaining1_multiple_subrules.tests   |    4 +-
+ .../aots/tests/gsub_chaining1_next_glyph.tests     |    2 +-
+ .../data/aots/tests/gsub_chaining1_simple.tests    |   22 +-
+ .../aots/tests/gsub_chaining1_successive.tests     |    2 +-
+ .../data/aots/tests/gsub_chaining2_boundary.tests  |    8 +-
+ .../aots/tests/gsub_chaining2_lookupflag.tests     |    2 +-
+ .../tests/gsub_chaining2_multiple_subrules.tests   |    4 +-
+ .../aots/tests/gsub_chaining2_next_glyph.tests     |    2 +-
+ .../data/aots/tests/gsub_chaining2_simple.tests    |   22 +-
+ .../aots/tests/gsub_chaining2_successive.tests     |    2 +-
+ .../data/aots/tests/gsub_chaining3_boundary.tests  |    8 +-
+ .../aots/tests/gsub_chaining3_lookupflag.tests     |    2 +-
+ .../aots/tests/gsub_chaining3_next_glyph.tests     |    2 +-
+ .../data/aots/tests/gsub_chaining3_simple.tests    |   22 +-
+ .../aots/tests/gsub_chaining3_successive.tests     |    2 +-
+ .../data/aots/tests/gsub_context1_boundary.tests   |    4 +-
+ .../data/aots/tests/gsub_context1_expansion.tests  |    2 +-
+ .../data/aots/tests/gsub_context1_lookupflag.tests |    4 +-
+ .../tests/gsub_context1_multiple_subrules.tests    |    4 +-
+ .../data/aots/tests/gsub_context1_next_glyph.tests |    2 +-
+ .../data/aots/tests/gsub_context1_simple.tests     |    6 +-
+ .../data/aots/tests/gsub_context1_successive.tests |    2 +-
+ .../data/aots/tests/gsub_context2_boundary.tests   |    4 +-
+ .../data/aots/tests/gsub_context2_classes.tests    |    4 +-
+ .../data/aots/tests/gsub_context2_expansion.tests  |    2 +-
+ .../data/aots/tests/gsub_context2_lookupflag.tests |    4 +-
+ .../tests/gsub_context2_multiple_subrules.tests    |    4 +-
+ .../data/aots/tests/gsub_context2_next_glyph.tests |    2 +-
+ .../data/aots/tests/gsub_context2_simple.tests     |    6 +-
+ .../data/aots/tests/gsub_context2_successive.tests |    2 +-
+ .../data/aots/tests/gsub_context3_boundary.tests   |    4 +-
+ .../data/aots/tests/gsub_context3_lookupflag.tests |    4 +-
+ .../data/aots/tests/gsub_context3_next_glyph.tests |    2 +-
+ .../data/aots/tests/gsub_context3_simple.tests     |    4 +-
+ .../data/aots/tests/gsub_context3_successive.tests |    2 +-
+ .../data/aots/tests/lookupflag_ignore_attach.tests |   10 +-
+ .../data/aots/tests/lookupflag_ignore_base.tests   |    4 +-
+ .../aots/tests/lookupflag_ignore_combination.tests |    6 +-
+ .../aots/tests/lookupflag_ignore_ligatures.tests   |    6 +-
+ .../data/aots/tests/lookupflag_ignore_marks.tests  |    2 +-
+ test/shaping/data/in-house/tests/aat-morx.tests    |    2 +-
+ test/shaping/data/in-house/tests/aat-trak.tests    |   22 +-
+ .../in-house/tests/arabic-fallback-shaping.tests   |    2 +-
+ .../data/in-house/tests/arabic-feature-order.tests |    8 +-
+ .../data/in-house/tests/arabic-like-joining.tests  |    2 +-
+ .../data/in-house/tests/arabic-mark-attach.tests   |    2 +-
+ .../data/in-house/tests/arabic-mark-order.tests    |   12 +-
+ test/shaping/data/in-house/tests/arabic-stch.tests |    2 +-
+ .../data/in-house/tests/automatic-fractions.tests  |    6 +-
+ test/shaping/data/in-house/tests/cluster.tests     |    8 +-
+ test/shaping/data/in-house/tests/collections.tests |   12 +-
+ test/shaping/data/in-house/tests/color-fonts.tests |    4 +-
+ .../data/in-house/tests/context-matching.tests     |    6 +-
+ .../data/in-house/tests/cursive-positioning.tests  |   10 +-
+ .../data/in-house/tests/default-ignorables.tests   |   10 +-
+ test/shaping/data/in-house/tests/digits.tests      |   10 +-
+ .../data/in-house/tests/emoji-clusters.tests       | 6522 ++++++++++----------
+ test/shaping/data/in-house/tests/emoji.tests       |   10 +-
+ .../data/in-house/tests/fallback-positioning.tests |    4 +-
+ test/shaping/data/in-house/tests/hangul-jamo.tests |    4 +-
+ test/shaping/data/in-house/tests/hyphens.tests     |    4 +-
+ .../tests/indic-consonant-with-stacker.tests       |    8 +-
+ .../data/in-house/tests/indic-decompose.tests      |    2 +-
+ test/shaping/data/in-house/tests/indic-init.tests  |    2 +-
+ .../in-house/tests/indic-joiner-candrabindu.tests  |    4 +-
+ .../data/in-house/tests/indic-joiners.tests        |   12 +-
+ .../data/in-house/tests/indic-old-spec.tests       |    8 +-
+ .../data/in-house/tests/indic-pref-blocking.tests  |    4 +-
+ .../in-house/tests/indic-script-extensions.tests   |    4 +-
+ .../data/in-house/tests/indic-special-cases.tests  |    6 +-
+ .../data/in-house/tests/indic-syllable.tests       |   24 +-
+ .../tests/indic-vowel-letter-spoofing.tests        |  106 +-
+ .../shaping/data/in-house/tests/kern-format2.tests |    6 +-
+ .../data/in-house/tests/khmer-mark-order.tests     |   50 +-
+ test/shaping/data/in-house/tests/khmer-misc.tests  |  180 +-
+ .../data/in-house/tests/language-tags.tests        |   26 +-
+ test/shaping/data/in-house/tests/ligature-id.tests |   74 +-
+ test/shaping/data/in-house/tests/macos.tests       |  266 +-
+ .../data/in-house/tests/mark-attachment.tests      |    2 +-
+ .../data/in-house/tests/mark-filtering-sets.tests  |   10 +-
+ .../tests/mongolian-variation-selector.tests       |   38 +-
+ .../shaping/data/in-house/tests/myanmar-misc.tests |    2 +-
+ .../data/in-house/tests/myanmar-syllable.tests     |    2 +-
+ .../data/in-house/tests/myanmar-zawgyi.tests       |    2 +-
+ .../data/in-house/tests/none-directional.tests     |    6 +-
+ .../data/in-house/tests/positioning-features.tests |    6 +-
+ test/shaping/data/in-house/tests/rand.tests        |    6 +-
+ test/shaping/data/in-house/tests/reverse-sub.tests |    2 +-
+ test/shaping/data/in-house/tests/rotation.tests    |    8 +-
+ test/shaping/data/in-house/tests/simple.tests      |    4 +-
+ test/shaping/data/in-house/tests/sinhala.tests     |    2 +-
+ test/shaping/data/in-house/tests/spaces.tests      |   68 +-
+ .../in-house/tests/tibetan-contractions-1.tests    |  120 +-
+ .../in-house/tests/tibetan-contractions-2.tests    |  106 +-
+ .../data/in-house/tests/tibetan-vowels.tests       |   22 +-
+ .../shaping/data/in-house/tests/tt-kern-gpos.tests |    2 +-
+ test/shaping/data/in-house/tests/use-indic3.tests  |    2 +-
+ test/shaping/data/in-house/tests/use-marchen.tests |   70 +-
+ .../shaping/data/in-house/tests/use-syllable.tests |   44 +-
+ .../in-house/tests/use-vowel-letter-spoofing.tests |  188 +-
+ test/shaping/data/in-house/tests/use.tests         |   30 +-
+ .../data/in-house/tests/variations-rvrn.tests      |  200 +-
+ test/shaping/data/in-house/tests/variations.tests  |   10 +-
+ test/shaping/data/in-house/tests/vertical.tests    |    8 +-
+ .../data/in-house/tests/zero-width-marks.tests     |   22 +-
+ .../data/text-rendering-tests/tests/AVAR-1.tests   |   34 +-
+ .../data/text-rendering-tests/tests/CFF-1.tests    |   26 +-
+ .../data/text-rendering-tests/tests/CFF-2.tests    |   26 +-
+ .../data/text-rendering-tests/tests/CFF2-1.tests   |   18 +-
+ .../data/text-rendering-tests/tests/CMAP-1.tests   |    8 +-
+ .../data/text-rendering-tests/tests/CMAP-2.tests   |    4 +-
+ .../data/text-rendering-tests/tests/CMAP-3.tests   |   40 +-
+ .../data/text-rendering-tests/tests/CVAR-1.tests   |    6 +-
+ .../data/text-rendering-tests/tests/CVAR-2.tests   |    6 +-
+ .../data/text-rendering-tests/tests/GLYF-1.tests   |    2 +-
+ .../data/text-rendering-tests/tests/GPOS-1.tests   |   38 +-
+ .../data/text-rendering-tests/tests/GPOS-2.tests   |    6 +-
+ .../data/text-rendering-tests/tests/GPOS-3.tests   |    8 +-
+ .../data/text-rendering-tests/tests/GPOS-4.tests   |    8 +-
+ .../data/text-rendering-tests/tests/GPOS-5.tests   |   10 +-
+ .../data/text-rendering-tests/tests/GSUB-1.tests   |    2 +-
+ .../data/text-rendering-tests/tests/GSUB-2.tests   |   22 +-
+ .../data/text-rendering-tests/tests/GSUB-3.tests   |    2 +-
+ .../data/text-rendering-tests/tests/GVAR-1.tests   |   18 +-
+ .../data/text-rendering-tests/tests/GVAR-2.tests   |   18 +-
+ .../data/text-rendering-tests/tests/GVAR-3.tests   |   18 +-
+ .../data/text-rendering-tests/tests/GVAR-4.tests   |   22 +-
+ .../data/text-rendering-tests/tests/GVAR-5.tests   |   22 +-
+ .../data/text-rendering-tests/tests/GVAR-6.tests   |   22 +-
+ .../data/text-rendering-tests/tests/GVAR-7.tests   |   14 +-
+ .../data/text-rendering-tests/tests/GVAR-8.tests   |   12 +-
+ .../data/text-rendering-tests/tests/GVAR-9.tests   |   20 +-
+ .../data/text-rendering-tests/tests/HVAR-1.tests   |   12 +-
+ .../data/text-rendering-tests/tests/HVAR-2.tests   |   12 +-
+ .../data/text-rendering-tests/tests/KERN-1.tests   |    2 +-
+ .../data/text-rendering-tests/tests/KERN-2.tests   |    2 +-
+ .../data/text-rendering-tests/tests/MORX-1.tests   |    2 +-
+ .../data/text-rendering-tests/tests/MORX-10.tests  |    2 +-
+ .../data/text-rendering-tests/tests/MORX-11.tests  |    2 +-
+ .../data/text-rendering-tests/tests/MORX-12.tests  |    6 +-
+ .../data/text-rendering-tests/tests/MORX-13.tests  |    2 +-
+ .../data/text-rendering-tests/tests/MORX-14.tests  |    4 +-
+ .../data/text-rendering-tests/tests/MORX-16.tests  |    2 +-
+ .../data/text-rendering-tests/tests/MORX-17.tests  |    2 +-
+ .../data/text-rendering-tests/tests/MORX-18.tests  |    8 +-
+ .../data/text-rendering-tests/tests/MORX-19.tests  |    4 +-
+ .../data/text-rendering-tests/tests/MORX-2.tests   |   32 +-
+ .../data/text-rendering-tests/tests/MORX-20.tests  |   14 +-
+ .../data/text-rendering-tests/tests/MORX-21.tests  |    2 +-
+ .../data/text-rendering-tests/tests/MORX-22.tests  |    2 +-
+ .../data/text-rendering-tests/tests/MORX-23.tests  |    2 +-
+ .../data/text-rendering-tests/tests/MORX-24.tests  |    2 +-
+ .../data/text-rendering-tests/tests/MORX-25.tests  |   18 +-
+ .../data/text-rendering-tests/tests/MORX-26.tests  |    4 +-
+ .../data/text-rendering-tests/tests/MORX-27.tests  |    6 +-
+ .../data/text-rendering-tests/tests/MORX-28.tests  |   10 +-
+ .../data/text-rendering-tests/tests/MORX-29.tests  |    8 +-
+ .../data/text-rendering-tests/tests/MORX-3.tests   |   32 +-
+ .../data/text-rendering-tests/tests/MORX-30.tests  |    8 +-
+ .../data/text-rendering-tests/tests/MORX-31.tests  |   16 +-
+ .../data/text-rendering-tests/tests/MORX-32.tests  |    8 +-
+ .../data/text-rendering-tests/tests/MORX-33.tests  |    6 +-
+ .../data/text-rendering-tests/tests/MORX-34.tests  |    2 +-
+ .../data/text-rendering-tests/tests/MORX-35.tests  |    4 +-
+ .../data/text-rendering-tests/tests/MORX-36.tests  |    2 +-
+ .../data/text-rendering-tests/tests/MORX-37.tests  |    8 +-
+ .../data/text-rendering-tests/tests/MORX-38.tests  |    8 +-
+ .../data/text-rendering-tests/tests/MORX-39.tests  |    8 +-
+ .../data/text-rendering-tests/tests/MORX-4.tests   |   30 +-
+ .../data/text-rendering-tests/tests/MORX-40.tests  |    8 +-
+ .../data/text-rendering-tests/tests/MORX-41.tests  |    8 +-
+ .../data/text-rendering-tests/tests/MORX-5.tests   |   50 +-
+ .../data/text-rendering-tests/tests/MORX-6.tests   |    2 +-
+ .../data/text-rendering-tests/tests/MORX-7.tests   |    2 +-
+ .../data/text-rendering-tests/tests/MORX-8.tests   |    6 +-
+ .../data/text-rendering-tests/tests/MORX-9.tests   |    2 +-
+ .../data/text-rendering-tests/tests/SFNT-1.tests   |    4 +-
+ .../data/text-rendering-tests/tests/SFNT-2.tests   |    4 +-
+ .../data/text-rendering-tests/tests/SHARAN-1.tests |   12 +-
+ .../data/text-rendering-tests/tests/SHBALI-1.tests |   44 +-
+ .../data/text-rendering-tests/tests/SHBALI-2.tests |   24 +-
+ .../data/text-rendering-tests/tests/SHBALI-3.tests |   18 +-
+ .../data/text-rendering-tests/tests/SHKNDA-1.tests |   68 +-
+ .../data/text-rendering-tests/tests/SHKNDA-2.tests |   32 +-
+ .../data/text-rendering-tests/tests/SHKNDA-3.tests |   62 +-
+ .../data/text-rendering-tests/tests/SHLANA-1.tests |  104 +-
+ .../text-rendering-tests/tests/SHLANA-10.tests     |   94 +-
+ .../data/text-rendering-tests/tests/SHLANA-2.tests |   74 +-
+ .../data/text-rendering-tests/tests/SHLANA-3.tests |   26 +-
+ .../data/text-rendering-tests/tests/SHLANA-4.tests |    6 +-
+ .../data/text-rendering-tests/tests/SHLANA-5.tests |   26 +-
+ .../data/text-rendering-tests/tests/SHLANA-6.tests |   14 +-
+ .../data/text-rendering-tests/tests/SHLANA-7.tests |   36 +-
+ .../data/text-rendering-tests/tests/SHLANA-8.tests |   26 +-
+ .../data/text-rendering-tests/tests/SHLANA-9.tests |   12 +-
+ test/shaping/record-test.sh                        |    2 +-
+ test/shaping/run-tests.py                          |   16 +-
+ test/subset/run-repack-tests.py                    |    8 +-
+ test/subset/run-tests.py                           |    8 +-
+ util/batch.hh                                      |   10 +-
+ 289 files changed, 5277 insertions(+), 5279 deletions(-)
+
+commit b83fd3a564aaaa0311a1f8275b2ae5bbc8b94e2c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 10 02:21:05 2021 -0600
+
+    [util] Refactor batch-processing code into batch.hh
+
+ test/subset/run-repack-tests.py |  2 +-
+ test/subset/run-tests.py        |  2 +-
+ util/Makefile.sources           |  2 ++
+ util/batch.hh                   | 72 +++++++++++++++++++++++++++++++++++++++++
+ util/hb-shape.cc                | 34 ++-----------------
+ util/hb-subset.cc               | 34 ++-----------------
+ 6 files changed, 80 insertions(+), 66 deletions(-)
+
+commit d92ee726ce3b2fc2c249407d977433f0badcc918
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 9 19:08:34 2021 -0600
+
+    [util/hb-shape] Treat as single-paragraph text other than provided by a file
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/3129
+
+ util/hb-shape.cc       |  4 ++--
+ util/hb-subset.cc      |  4 ++--
+ util/main-font-text.hh |  4 ++--
+ util/text-options.hh   | 39 +++++++++------------------------------
+ 4 files changed, 15 insertions(+), 36 deletions(-)
+
+commit 8940409e3c108e2c26c0f22679eb3c6cea4fee9d
+Merge: f5ba1fabc 7d2e9164a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 9 13:21:07 2021 -0600
+
+    Merge pull request #3121 from harfbuzz/subset-args
+    
+    Fix up `hb-subset --help-all`
+
+commit f5ba1fabced5b04615ece8938d950b098490fe97
+Author: Ben Wagner <bungeman@chromium.org>
+Date:   Sat Aug 7 16:05:51 2021 -0400
+
+    Fix documentation of hb_subset_flags_t defaults
+    
+    HB_SUBSET_FLAGS_DEFAULT is 0, and hb_subset_input_create_or_fail
+    initializes its flags to HB_SUBSET_FLAGS_DEFAULT, so currently all flags
+    are set to false by default. It has been decided that future flags will
+    also be false by default for simplicity (using NO_ in the name if
+    needed). Correct and simplify the documentation for hb_subset_flags_t to
+    reflect this.
+
+ src/hb-subset.h | 15 ++++++---------
+ 1 file changed, 6 insertions(+), 9 deletions(-)
+
+commit 7d2e9164ab6681bfd9fa0946a1150905a1aba283
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 7 13:38:19 2021 -0600
+
+    [util] Move text options into text_options_t
+    
+    Remove now empty options.cc.
+
+ util/Makefile.sources                |   8 +--
+ util/hb-ot-shape-closure.cc          |   1 +
+ util/hb-shape.cc                     |   4 +-
+ util/hb-subset.cc                    |   1 +
+ util/hb-view.cc                      |   2 +
+ util/meson.build                     |   4 --
+ util/options.hh                      |  43 -------------
+ util/{options.cc => text-options.hh} | 120 ++++++++++++++++++++---------------
+ 8 files changed, 81 insertions(+), 102 deletions(-)
+
+commit 93bc62e9b24404d2af4042c4a9aa450af79be8dd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 7 13:13:58 2021 -0600
+
+    [util] Move output options into output-options.hh
+
+ util/Makefile.sources  |  15 +++---
+ util/hb-shape.cc       |   1 +
+ util/hb-subset.cc      |   1 +
+ util/helper-cairo.hh   |   4 +-
+ util/options.cc        |  50 --------------------
+ util/options.hh        |  40 ----------------
+ util/output-options.hh | 123 +++++++++++++++++++++++++++++++++++++++++++++++++
+ util/view-cairo.hh     |   1 +
+ 8 files changed, 137 insertions(+), 98 deletions(-)
+
+commit af9d2495dc68c4a64bab87a7cc0a60927d81fa53
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 7 12:29:52 2021 -0600
+
+    [util] Use inheritance for output_options_t
+
+ util/hb-shape.cc   | 41 ++++++++++++++++++++---------------------
+ util/hb-subset.cc  |  9 +++------
+ util/view-cairo.hh | 12 ++++++------
+ 3 files changed, 29 insertions(+), 33 deletions(-)
+
+commit 9db0fd4821ab721bbf558e999044384726ba650e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 7 12:22:17 2021 -0600
+
+    [util] Don't show --output-format if no supported formats provided
+
+ util/options.cc | 9 ++++-----
+ 1 file changed, 4 insertions(+), 5 deletions(-)
+
+commit 5545eea7e575318d53aa42acbb09cf39e4b82134
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 7 11:04:46 2021 -0600
+
+    [util] Remove main_font_text_t class, use bare function
+
+ util/hb-ot-shape-closure.cc |  3 +-
+ util/hb-shape.cc            |  8 ++---
+ util/hb-subset.cc           |  8 ++---
+ util/hb-view.cc             |  3 +-
+ util/main-font-text.hh      | 72 +++++++++++++++++----------------------------
+ util/options.hh             | 15 ++++++++++
+ 6 files changed, 50 insertions(+), 59 deletions(-)
+
+commit 58c223357b340ceb64af337b481fd4786152881e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 6 23:45:59 2021 -0600
+
+    [util] Move face/font options into face/font-options.hh
+
+ util/Makefile.sources       |   7 +
+ util/face-options.hh        | 135 +++++++++++++++++++
+ util/font-options.hh        | 306 ++++++++++++++++++++++++++++++++++++++++++
+ util/hb-ot-shape-closure.cc |   3 +-
+ util/hb-shape.cc            |   2 +-
+ util/hb-subset.cc           |   7 +-
+ util/hb-view.cc             |   2 +-
+ util/main-font-text.hh      |   2 +-
+ util/options.cc             | 318 +-------------------------------------------
+ util/options.hh             |  63 ---------
+ util/shape-consumer.hh      |   1 +
+ 11 files changed, 457 insertions(+), 389 deletions(-)
+
+commit 6edd50ae7fa550c909fa32339537f6105002a07d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 6 23:36:45 2021 -0600
+
+    [util] Move option_parser_t code into options.hh
+
+ util/options.cc | 83 --------------------------------------------------------
+ util/options.hh | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
+ 2 files changed, 83 insertions(+), 84 deletions(-)
+
+commit 798bb89c969288704c1cc534192eac9e6339d66a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 6 23:29:29 2021 -0600
+
+    [util] Move shape format options into shape-format.hh
+
+ util/Makefile.sources |   1 +
+ util/hb-shape.cc      |   5 +-
+ util/hb-subset.cc     |   2 +-
+ util/hb-view.cc       |   2 +-
+ util/options.cc       | 135 -------------------------------
+ util/options.hh       |  42 ----------
+ util/shape-format.hh  | 214 ++++++++++++++++++++++++++++++++++++++++++++++++++
+ 7 files changed, 220 insertions(+), 181 deletions(-)
+
+commit c3599fded73882d5234a995b7f253baf0b4fa1e4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 6 23:24:28 2021 -0600
+
+    [util] Move shape options into shape-options.hh
+
+ util/Makefile.sources       |   2 +
+ util/hb-ot-shape-closure.cc |   1 +
+ util/main-font-text.hh      |   1 -
+ util/options.cc             | 179 +---------------
+ util/options.hh             | 286 --------------------------
+ util/shape-consumer.hh      |   3 +-
+ util/shape-options.hh       | 490 ++++++++++++++++++++++++++++++++++++++++++++
+ 7 files changed, 496 insertions(+), 466 deletions(-)
+
+commit cfb2d6ad9e34f4b61ea3fedd27ac448a47ac4c09
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 6 23:14:30 2021 -0600
+
+    [util] Move view options into view-options.hh
+
+ util/Makefile.sources |  15 +++---
+ util/options.cc       |  64 --------------------------
+ util/options.hh       |  25 ----------
+ util/view-cairo.hh    |   4 +-
+ util/view-options.hh  | 123 ++++++++++++++++++++++++++++++++++++++++++++++++++
+ 5 files changed, 132 insertions(+), 99 deletions(-)
+
+commit 167f58a2ca1db5649a0724f88e033c28a3bbb844
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 6 23:03:30 2021 -0600
+
+    [util] Move subset options into subset-options.hh
+
+ util/Makefile.sources                         |  2 +-
+ util/hb-subset.cc                             |  3 +-
+ util/meson.build                              |  1 -
+ util/options.hh                               | 40 ------------------------
+ util/{options-subset.cc => subset-options.hh} | 45 +++++++++++++++++++++++++++
+ 5 files changed, 48 insertions(+), 43 deletions(-)
+
+commit 370e961faf28291def7f011f694bef1266adda99
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 6 22:59:50 2021 -0600
+
+    [util/hb-subset] Use hb-subset.h public API instead of poking inside
+    
+    Oops.
+
+ util/options-subset.cc | 11 +++++------
+ 1 file changed, 5 insertions(+), 6 deletions(-)
+
+commit 4e97678ebb77be96765942051d8bb03ab8f74f1c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 6 22:53:44 2021 -0600
+
+    [util] Use inheritence to embed inherent options of objects
+
+ util/hb-subset.cc      |  9 ++++-----
+ util/shape-consumer.hh | 15 +++++++--------
+ util/view-cairo.hh     | 33 ++++++++++++++++-----------------
+ 3 files changed, 27 insertions(+), 30 deletions(-)
+
+commit 06d661803c79e18bad3e943894a8a7bcba1352e8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 6 19:20:47 2021 -0600
+
+    [util] Fix compiler error
+    
+    ../util/options.cc:588:3: error: narrowing conversion of ‘font_size_flags’ from ‘unsigned int’ to ‘gint {aka int}’ inside { } [-Werror=narrowing]
+
+ util/options.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c5337c43e932f23c18380995fa1ec74e2d8eaeb7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 6 19:19:50 2021 -0600
+
+    [util] Fold helper-cairo.cc into helper-cairo.hh
+
+ util/Makefile.sources |   1 -
+ util/helper-cairo.cc  | 668 --------------------------------------------------
+ util/helper-cairo.hh  | 636 ++++++++++++++++++++++++++++++++++++++++++++++-
+ util/meson.build      |   1 -
+ 4 files changed, 624 insertions(+), 682 deletions(-)
+
+commit c329ce1000ee202700582396b0a47918d815e22e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 6 19:13:21 2021 -0600
+
+    [util] Also hide ppem settings in hb-ot-shape-closure
+    
+    Leaving ptem, as that can in theory change shape closure if we apply it
+    to optical-size axis (we currently don't).
+
+ util/options.cc | 9 ++++++---
+ 1 file changed, 6 insertions(+), 3 deletions(-)
+
+commit c40e00796c6ae900a9e540ad9e345a4514fdc4eb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 6 19:04:27 2021 -0600
+
+    [util] Fold helper-cairo-ansi.cc into helper-cairo-ansi.hh
+
+ util/Makefile.sources     |   1 -
+ util/helper-cairo-ansi.cc | 202 ----------------------------------------------
+ util/helper-cairo-ansi.hh | 174 ++++++++++++++++++++++++++++++++++++++-
+ util/meson.build          |   1 -
+ 4 files changed, 172 insertions(+), 206 deletions(-)
+
+commit 4fe43ccbf172d633c17ea4d5c308310d4597062f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 6 19:00:45 2021 -0600
+
+    [util] Fold ansi-print.cc into ansi-print.hh
+
+ util/Makefile.sources |   1 -
+ util/ansi-print.cc    | 427 --------------------------------------------------
+ util/ansi-print.hh    | 391 ++++++++++++++++++++++++++++++++++++++++++++-
+ util/meson.build      |   1 -
+ 4 files changed, 389 insertions(+), 431 deletions(-)
+
+commit b1db0e4a0f2c1aa1f64176b0da9ca4ea5585d0ee
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 6 18:55:40 2021 -0600
+
+    [util] Fold view-cairo.cc into view-cairo.hh
+
+ util/Makefile.sources |   1 -
+ util/meson.build      |   1 -
+ util/view-cairo.cc    | 140 --------------------------------------------------
+ util/view-cairo.hh    | 110 +++++++++++++++++++++++++++++++++++++++
+ 4 files changed, 110 insertions(+), 142 deletions(-)
+
+commit 6500f68f1fd0614c7165fc9bea6d37a3cf17a8b4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 6 18:46:31 2021 -0600
+
+    [util] Change hb-subset to use face_options_t instead of font_options_t
+
+ util/hb-subset.cc      | 9 +++++----
+ util/main-font-text.hh | 3 +--
+ 2 files changed, 6 insertions(+), 6 deletions(-)
+
+commit 869e20e09f96ba6cddc5db7e9aa6fde29d84ed78
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 6 18:09:31 2021 -0600
+
+    [util] separate face options from font options
+
+ util/helper-cairo.cc |  2 +-
+ util/options.cc      | 87 +++++++++++++++++++++++++++++++++-------------------
+ util/options.hh      | 48 +++++++++++++++++------------
+ 3 files changed, 85 insertions(+), 52 deletions(-)
+
+commit b3a2f2bfcf483b525c55de211e3c644dba860e51
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 5 14:03:48 2021 -0600
+
+    [util/main-font-text] Simplify
+
+ util/main-font-text.hh | 21 ++++++++-------------
+ 1 file changed, 8 insertions(+), 13 deletions(-)
+
+commit 71440dbd90d77b2af35c69fac90e9342e9a9e439
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 5 13:48:59 2021 -0600
+
+    [util] Move font-size and upem to be extern variables
+
+ util/hb-ot-shape-closure.cc |  5 ++++-
+ util/hb-shape.cc            |  5 ++++-
+ util/hb-subset.cc           |  5 ++++-
+ util/hb-view.cc             |  6 +++---
+ util/main-font-text.hh      |  6 +-----
+ util/options.cc             |  6 +++---
+ util/options.hh             | 17 ++++++-----------
+ 7 files changed, 25 insertions(+), 25 deletions(-)
+
+commit fc0339eef0fa302f74ca9a3b90430288dac29df3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 5 13:35:46 2021 -0600
+
+    [util] Simplify shape-consumer by removing buffer arg
+
+ util/hb-ot-shape-closure.cc | 5 ++---
+ util/hb-subset.cc           | 3 +--
+ util/main-font-text.hh      | 4 +---
+ util/shape-consumer.hh      | 5 ++---
+ 4 files changed, 6 insertions(+), 11 deletions(-)
+
+commit e014c6fa2d4b1cb341d065d582d1dd995c04e5b5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 5 13:24:59 2021 -0600
+
+    [util/main-font-text] Move eol from template arg to main() arg
+
+ util/hb-shape.cc       | 11 +++++------
+ util/hb-subset.cc      | 11 +++++------
+ util/main-font-text.hh |  4 ++--
+ 3 files changed, 12 insertions(+), 14 deletions(-)
+
+commit 463411a1de4b9ca2e267a1ce0f9667da17a73d1e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 5 11:44:35 2021 -0600
+
+    [util] Remove unused option_group_t
+
+ util/hb-ot-shape-closure.cc |  2 +-
+ util/options.hh             | 31 +++++++++++++------------------
+ 2 files changed, 14 insertions(+), 19 deletions(-)
+
+commit 8588173ee6ace5926e090120fbcad85e5be1fab5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 5 11:43:25 2021 -0600
+
+    [util] Rework post_parse() handling
+
+ util/options.hh | 16 ++++++++++------
+ 1 file changed, 10 insertions(+), 6 deletions(-)
+
+commit 3362b48f5a5eee9fe6378787ffce3304b341e474
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 5 11:30:39 2021 -0600
+
+    [util] Templatize add_group logic
+
+ util/options.cc | 25 -------------------------
+ util/options.hh | 22 +++++++++++++++++++++-
+ 2 files changed, 21 insertions(+), 26 deletions(-)
+
+commit fe90fbeba3b9ddca20e1ecc0feb99ddb8132f961
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 5 11:22:20 2021 -0600
+
+    [util] Remove unused pre_parse callback logic
+
+ util/options.cc | 13 +------------
+ util/options.hh |  1 -
+ 2 files changed, 1 insertion(+), 13 deletions(-)
+
+commit 09e4d7dd306ceb58064b92ec3cfc3ad7900a7802
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 5 11:21:20 2021 -0600
+
+    [util] Simplify output_options_t
+
+ util/hb-ot-shape-closure.cc |  2 +-
+ util/hb-shape.cc            |  9 +++------
+ util/options.cc             |  3 ++-
+ util/options.hh             | 21 ++++++++-------------
+ util/view-cairo.hh          |  5 +----
+ 5 files changed, 15 insertions(+), 25 deletions(-)
+
+commit e109f9a6f9954f55a7ca2f336aa41a0235dca37b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 5 11:05:51 2021 -0600
+
+    [util] Collect cmdline arg options outside of constructor
+
+ util/hb-ot-shape-closure.cc |  8 ++------
+ util/hb-shape.cc            | 11 ++++++++---
+ util/hb-subset.cc           | 13 +++++++------
+ util/main-font-text.hh      | 16 +++++++++++-----
+ util/options.hh             | 37 ++++++-------------------------------
+ util/shape-consumer.hh      |  9 +++++----
+ util/view-cairo.hh          | 11 ++++++++---
+ 7 files changed, 47 insertions(+), 58 deletions(-)
+
+commit e57dd6688937072ac1b5bf2cd45c8fb9e867abe1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 5 10:33:31 2021 -0600
+
+    [util] Initialize struct members inline
+
+ util/hb-ot-shape-closure.cc |  13 ++-
+ util/hb-shape.cc            |  20 ++---
+ util/hb-subset.cc           |  10 ++-
+ util/options.hh             | 214 +++++++++++++++-----------------------------
+ util/shape-consumer.hh      |  14 ++-
+ util/view-cairo.hh          |  20 ++---
+ 6 files changed, 110 insertions(+), 181 deletions(-)
+
+commit 21f1054d4718213c5b4e4abba7fe74979e93febe
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 4 20:23:48 2021 -0600
+
+    [util/hb-subset] Keep face around instead of font
+
+ util/hb-subset.cc | 15 +++++++--------
+ 1 file changed, 7 insertions(+), 8 deletions(-)
+
+commit 8c0c217b5a1ded98ce62a3c7394942bcb3b95396
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Aug 6 10:45:38 2021 -0700
+
+    [subset] fail reference blob in face builder if allocation for table sorting fails.
+    
+    Fixes https://oss-fuzz.com/testcase-detail/5041767803125760
+
+ src/hb-face.cc                                             |   6 ++++++
+ ...zz-testcase-minimized-hb-subset-fuzzer-5041767803125760 | Bin 0 -> 29 bytes
+ 2 files changed, 6 insertions(+)
+
+commit e5bfd49ae5bc711a40e3fac9e3b8230f251e5d67
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Aug 5 14:03:25 2021 -0700
+
+    [subset] don't allow table adds for tag == -1.
+
+ src/hb-face.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 222b74f08f8cc4a5e1b7c1582b28db5588ea11da
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Aug 5 11:39:26 2021 -0700
+
+    [subset] don't leak memory for duplicate tables.
+
+ src/hb-face.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit f7a9c3ea9324caf83eaacd65a7493470d09198a3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 5 13:05:07 2021 -0600
+
+    [open-file] Use hb_is_source_of instead of hb_is_iterator
+
+ src/hb-open-file.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit fa90cb8a3128d617d8a71b73085eb05af105f62c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 5 12:31:06 2021 -0600
+
+    Whitespace again
+
+ src/hb-open-file.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a110a47eb5782cf35b6b042fd3c7565a204b6ff7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 5 12:28:39 2021 -0600
+
+    Whitespace
+
+ src/hb-open-file.hh | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit 2cb8c928d75ae4c0ac491be60e65be4a77fe9705
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 5 12:27:22 2021 -0600
+
+    [face] Let hashmap derive invalid key/value types
+    
+    Works now with the previous two fixes.
+
+ src/hb-face.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 95c888e192909b18de6f38da8b6e4d8294416703
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 5 12:27:02 2021 -0600
+
+    [meta] Define hb_int_min for pointer types as nullptr
+
+ src/hb-meta.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 407a112e7b743e75053ed2278416cb1bd5c91fac
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 5 12:23:53 2021 -0600
+
+    [meta] Make hb_is_signed/hb_is_unsigned work on all types
+    
+    They were failing if type was non-scalar, eg. pointer.
+
+ src/hb-meta.hh | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+commit baf2166a24554ba26ac88f800fc6f124a0adf706
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 5 12:07:25 2021 -0600
+
+    [meta] Use hb_true_type/hb_false_type more
+
+ src/hb-meta.hh | 14 +++++++-------
+ 1 file changed, 7 insertions(+), 7 deletions(-)
+
+commit 74ad5ddcd759140a1a35d38288d0e615538b66ca
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 5 11:51:54 2021 -0600
+
+    [face] Minor cleaning of previous commit
+
+ src/hb-face.cc | 17 ++++++++---------
+ 1 file changed, 8 insertions(+), 9 deletions(-)
+
+commit c2ee1fdd404e980303dd92882b1df816727a4b65
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Aug 4 16:42:49 2021 -0700
+
+    [subset] remove unsed table_entry struct.
+
+ src/hb-face.cc                                     |  48 ++++++++-------------
+ src/hb-open-file.hh                                |   5 +--
+ .../Comfortaa-Regular-new.default.61,62,63.ttf     | Bin 7060 -> 7060 bytes
+ .../basics/Comfortaa-Regular-new.default.61,63.ttf | Bin 6692 -> 6692 bytes
+ .../basics/Comfortaa-Regular-new.default.61.ttf    | Bin 6328 -> 6328 bytes
+ .../basics/Comfortaa-Regular-new.default.62.ttf    | Bin 6200 -> 6200 bytes
+ .../basics/Comfortaa-Regular-new.default.63.ttf    | Bin 6256 -> 6256 bytes
+ ...aa-Regular-new.default.retain-all-codepoint.ttf | Bin 222756 -> 222756 bytes
+ ...Regular-new.drop-hints-retain-gids.61,62,63.ttf | Bin 4608 -> 4608 bytes
+ ...aa-Regular-new.drop-hints-retain-gids.61,63.ttf | Bin 4312 -> 4312 bytes
+ ...ortaa-Regular-new.drop-hints-retain-gids.61.ttf | Bin 3724 -> 3724 bytes
+ ...ortaa-Regular-new.drop-hints-retain-gids.62.ttf | Bin 3900 -> 3900 bytes
+ ...ortaa-Regular-new.drop-hints-retain-gids.63.ttf | Bin 3972 -> 3972 bytes
+ ...drop-hints-retain-gids.retain-all-codepoint.ttf | Bin 191632 -> 191632 bytes
+ .../Comfortaa-Regular-new.drop-hints.61,62,63.ttf  | Bin 2600 -> 2600 bytes
+ .../Comfortaa-Regular-new.drop-hints.61,63.ttf     | Bin 2296 -> 2296 bytes
+ .../basics/Comfortaa-Regular-new.drop-hints.61.ttf | Bin 1976 -> 1976 bytes
+ .../basics/Comfortaa-Regular-new.drop-hints.62.ttf | Bin 1900 -> 1900 bytes
+ .../basics/Comfortaa-Regular-new.drop-hints.63.ttf | Bin 1968 -> 1968 bytes
+ ...Regular-new.drop-hints.retain-all-codepoint.ttf | Bin 191584 -> 191584 bytes
+ .../basics/Comfortaa-Regular-new.gids.61,62,63.ttf | Bin 7988 -> 7988 bytes
+ .../basics/Comfortaa-Regular-new.gids.61,63.ttf    | Bin 7628 -> 7628 bytes
+ .../basics/Comfortaa-Regular-new.gids.61.ttf       | Bin 7256 -> 7256 bytes
+ .../basics/Comfortaa-Regular-new.gids.62.ttf       | Bin 7184 -> 7184 bytes
+ .../basics/Comfortaa-Regular-new.gids.63.ttf       | Bin 7180 -> 7180 bytes
+ ...ortaa-Regular-new.gids.retain-all-codepoint.ttf | Bin 222756 -> 222756 bytes
+ .../Comfortaa-Regular-new.glyph-names.61,62,63.ttf | Bin 7072 -> 7072 bytes
+ .../Comfortaa-Regular-new.glyph-names.61,63.ttf    | Bin 6700 -> 6700 bytes
+ .../Comfortaa-Regular-new.glyph-names.61.ttf       | Bin 6336 -> 6336 bytes
+ .../Comfortaa-Regular-new.glyph-names.62.ttf       | Bin 6208 -> 6208 bytes
+ .../Comfortaa-Regular-new.glyph-names.63.ttf       | Bin 6264 -> 6264 bytes
+ ...egular-new.glyph-names.retain-all-codepoint.ttf | Bin 229748 -> 229748 bytes
+ ...gular-new.keep-all-layout-features.61,62,63.ttf | Bin 7508 -> 7508 bytes
+ ...-Regular-new.keep-all-layout-features.61,63.ttf | Bin 7144 -> 7144 bytes
+ ...taa-Regular-new.keep-all-layout-features.61.ttf | Bin 6776 -> 6776 bytes
+ ...taa-Regular-new.keep-all-layout-features.62.ttf | Bin 6200 -> 6200 bytes
+ ...taa-Regular-new.keep-all-layout-features.63.ttf | Bin 6256 -> 6256 bytes
+ ...ep-all-layout-features.retain-all-codepoint.ttf | Bin 223452 -> 223452 bytes
+ ...fortaa-Regular-new.layout-features.61,62,63.ttf | Bin 7060 -> 7060 bytes
+ ...Comfortaa-Regular-new.layout-features.61,63.ttf | Bin 6692 -> 6692 bytes
+ .../Comfortaa-Regular-new.layout-features.61.ttf   | Bin 6328 -> 6328 bytes
+ .../Comfortaa-Regular-new.layout-features.62.ttf   | Bin 6200 -> 6200 bytes
+ .../Comfortaa-Regular-new.layout-features.63.ttf   | Bin 6256 -> 6256 bytes
+ ...ar-new.layout-features.retain-all-codepoint.ttf | Bin 220948 -> 220948 bytes
+ .../Comfortaa-Regular-new.name-ids.61,62,63.ttf    | Bin 6800 -> 6800 bytes
+ .../Comfortaa-Regular-new.name-ids.61,63.ttf       | Bin 6432 -> 6432 bytes
+ .../basics/Comfortaa-Regular-new.name-ids.61.ttf   | Bin 6068 -> 6068 bytes
+ .../basics/Comfortaa-Regular-new.name-ids.62.ttf   | Bin 5940 -> 5940 bytes
+ .../basics/Comfortaa-Regular-new.name-ids.63.ttf   | Bin 5996 -> 5996 bytes
+ ...a-Regular-new.name-ids.retain-all-codepoint.ttf | Bin 222496 -> 222496 bytes
+ ...mfortaa-Regular-new.name-languages.61,62,63.ttf | Bin 7060 -> 7060 bytes
+ .../Comfortaa-Regular-new.name-languages.61,63.ttf | Bin 6692 -> 6692 bytes
+ .../Comfortaa-Regular-new.name-languages.61.ttf    | Bin 6328 -> 6328 bytes
+ .../Comfortaa-Regular-new.name-languages.62.ttf    | Bin 6200 -> 6200 bytes
+ .../Comfortaa-Regular-new.name-languages.63.ttf    | Bin 6256 -> 6256 bytes
+ ...lar-new.name-languages.retain-all-codepoint.ttf | Bin 222756 -> 222756 bytes
+ .../Comfortaa-Regular-new.name-legacy.61,62,63.ttf | Bin 7060 -> 7060 bytes
+ .../Comfortaa-Regular-new.name-legacy.61,63.ttf    | Bin 6692 -> 6692 bytes
+ .../Comfortaa-Regular-new.name-legacy.61.ttf       | Bin 6328 -> 6328 bytes
+ .../Comfortaa-Regular-new.name-legacy.62.ttf       | Bin 6200 -> 6200 bytes
+ .../Comfortaa-Regular-new.name-legacy.63.ttf       | Bin 6256 -> 6256 bytes
+ ...egular-new.name-legacy.retain-all-codepoint.ttf | Bin 222756 -> 222756 bytes
+ ...egular-new.no-prune-unicode-ranges.61,62,63.ttf | Bin 7060 -> 7060 bytes
+ ...a-Regular-new.no-prune-unicode-ranges.61,63.ttf | Bin 6692 -> 6692 bytes
+ ...rtaa-Regular-new.no-prune-unicode-ranges.61.ttf | Bin 6328 -> 6328 bytes
+ ...rtaa-Regular-new.no-prune-unicode-ranges.62.ttf | Bin 6200 -> 6200 bytes
+ ...rtaa-Regular-new.no-prune-unicode-ranges.63.ttf | Bin 6256 -> 6256 bytes
+ ...o-prune-unicode-ranges.retain-all-codepoint.ttf | Bin 222756 -> 222756 bytes
+ ...mfortaa-Regular-new.notdef-outline.61,62,63.ttf | Bin 7652 -> 7652 bytes
+ .../Comfortaa-Regular-new.notdef-outline.61,63.ttf | Bin 7284 -> 7284 bytes
+ .../Comfortaa-Regular-new.notdef-outline.61.ttf    | Bin 6920 -> 6920 bytes
+ .../Comfortaa-Regular-new.notdef-outline.62.ttf    | Bin 6796 -> 6796 bytes
+ .../Comfortaa-Regular-new.notdef-outline.63.ttf    | Bin 6844 -> 6844 bytes
+ ...lar-new.notdef-outline.retain-all-codepoint.ttf | Bin 223352 -> 223352 bytes
+ .../Comfortaa-Regular-new.retain-gids.61,62,63.ttf | Bin 9068 -> 9068 bytes
+ .../Comfortaa-Regular-new.retain-gids.61,63.ttf    | Bin 8708 -> 8708 bytes
+ .../Comfortaa-Regular-new.retain-gids.61.ttf       | Bin 8076 -> 8076 bytes
+ .../Comfortaa-Regular-new.retain-gids.62.ttf       | Bin 8200 -> 8200 bytes
+ .../Comfortaa-Regular-new.retain-gids.63.ttf       | Bin 8260 -> 8260 bytes
+ ...egular-new.retain-gids.retain-all-codepoint.ttf | Bin 222804 -> 222804 bytes
+ ...numMyeongjo-Regular-subset.default.61,62,63.ttf | Bin 4128 -> 4128 bytes
+ .../NanumMyeongjo-Regular-subset.default.61,63.ttf | Bin 3580 -> 3580 bytes
+ .../NanumMyeongjo-Regular-subset.default.61.ttf    | Bin 3156 -> 3156 bytes
+ .../NanumMyeongjo-Regular-subset.default.62.ttf    | Bin 3180 -> 3180 bytes
+ .../NanumMyeongjo-Regular-subset.default.63.ttf    | Bin 3048 -> 3048 bytes
+ ...Regular-subset.default.retain-all-codepoint.ttf | Bin 9524 -> 9524 bytes
+ ...ular-subset.drop-hints-retain-gids.61,62,63.ttf | Bin 1452 -> 1452 bytes
+ ...Regular-subset.drop-hints-retain-gids.61,63.ttf | Bin 1284 -> 1284 bytes
+ ...jo-Regular-subset.drop-hints-retain-gids.61.ttf | Bin 1128 -> 1128 bytes
+ ...jo-Regular-subset.drop-hints-retain-gids.62.ttf | Bin 1144 -> 1144 bytes
+ ...jo-Regular-subset.drop-hints-retain-gids.63.ttf | Bin 1116 -> 1116 bytes
+ ...drop-hints-retain-gids.retain-all-codepoint.ttf | Bin 3536 -> 3536 bytes
+ ...Myeongjo-Regular-subset.drop-hints.61,62,63.ttf | Bin 1452 -> 1452 bytes
+ ...numMyeongjo-Regular-subset.drop-hints.61,63.ttf | Bin 1276 -> 1276 bytes
+ .../NanumMyeongjo-Regular-subset.drop-hints.61.ttf | Bin 1128 -> 1128 bytes
+ .../NanumMyeongjo-Regular-subset.drop-hints.62.ttf | Bin 1140 -> 1140 bytes
+ .../NanumMyeongjo-Regular-subset.drop-hints.63.ttf | Bin 1104 -> 1104 bytes
+ ...ular-subset.drop-hints.retain-all-codepoint.ttf | Bin 3536 -> 3536 bytes
+ .../NanumMyeongjo-Regular-subset.gids.61,62,63.ttf | Bin 4128 -> 4128 bytes
+ .../NanumMyeongjo-Regular-subset.gids.61,63.ttf    | Bin 4128 -> 4128 bytes
+ .../NanumMyeongjo-Regular-subset.gids.61.ttf       | Bin 4128 -> 4128 bytes
+ .../NanumMyeongjo-Regular-subset.gids.62.ttf       | Bin 4128 -> 4128 bytes
+ .../NanumMyeongjo-Regular-subset.gids.63.ttf       | Bin 4128 -> 4128 bytes
+ ...jo-Regular-subset.gids.retain-all-codepoint.ttf | Bin 9524 -> 9524 bytes
+ ...yeongjo-Regular-subset.glyph-names.61,62,63.ttf | Bin 4128 -> 4128 bytes
+ ...umMyeongjo-Regular-subset.glyph-names.61,63.ttf | Bin 3580 -> 3580 bytes
+ ...NanumMyeongjo-Regular-subset.glyph-names.61.ttf | Bin 3156 -> 3156 bytes
+ ...NanumMyeongjo-Regular-subset.glyph-names.62.ttf | Bin 3180 -> 3180 bytes
+ ...NanumMyeongjo-Regular-subset.glyph-names.63.ttf | Bin 3048 -> 3048 bytes
+ ...lar-subset.glyph-names.retain-all-codepoint.ttf | Bin 9524 -> 9524 bytes
+ ...ar-subset.keep-all-layout-features.61,62,63.ttf | Bin 4128 -> 4128 bytes
+ ...gular-subset.keep-all-layout-features.61,63.ttf | Bin 3580 -> 3580 bytes
+ ...-Regular-subset.keep-all-layout-features.61.ttf | Bin 3156 -> 3156 bytes
+ ...-Regular-subset.keep-all-layout-features.62.ttf | Bin 3180 -> 3180 bytes
+ ...-Regular-subset.keep-all-layout-features.63.ttf | Bin 3048 -> 3048 bytes
+ ...ep-all-layout-features.retain-all-codepoint.ttf | Bin 9524 -> 9524 bytes
+ ...gjo-Regular-subset.layout-features.61,62,63.ttf | Bin 4128 -> 4128 bytes
+ ...eongjo-Regular-subset.layout-features.61,63.ttf | Bin 3580 -> 3580 bytes
+ ...mMyeongjo-Regular-subset.layout-features.61.ttf | Bin 3156 -> 3156 bytes
+ ...mMyeongjo-Regular-subset.layout-features.62.ttf | Bin 3180 -> 3180 bytes
+ ...mMyeongjo-Regular-subset.layout-features.63.ttf | Bin 3048 -> 3048 bytes
+ ...subset.layout-features.retain-all-codepoint.ttf | Bin 9524 -> 9524 bytes
+ ...umMyeongjo-Regular-subset.name-ids.61,62,63.ttf | Bin 3924 -> 3924 bytes
+ ...NanumMyeongjo-Regular-subset.name-ids.61,63.ttf | Bin 3376 -> 3376 bytes
+ .../NanumMyeongjo-Regular-subset.name-ids.61.ttf   | Bin 2952 -> 2952 bytes
+ .../NanumMyeongjo-Regular-subset.name-ids.62.ttf   | Bin 2976 -> 2976 bytes
+ .../NanumMyeongjo-Regular-subset.name-ids.63.ttf   | Bin 2844 -> 2844 bytes
+ ...egular-subset.name-ids.retain-all-codepoint.ttf | Bin 9320 -> 9320 bytes
+ ...ngjo-Regular-subset.name-languages.61,62,63.ttf | Bin 4172 -> 4172 bytes
+ ...yeongjo-Regular-subset.name-languages.61,63.ttf | Bin 3624 -> 3624 bytes
+ ...umMyeongjo-Regular-subset.name-languages.61.ttf | Bin 3200 -> 3200 bytes
+ ...umMyeongjo-Regular-subset.name-languages.62.ttf | Bin 3224 -> 3224 bytes
+ ...umMyeongjo-Regular-subset.name-languages.63.ttf | Bin 3092 -> 3092 bytes
+ ...-subset.name-languages.retain-all-codepoint.ttf | Bin 9568 -> 9568 bytes
+ ...yeongjo-Regular-subset.name-legacy.61,62,63.ttf | Bin 4128 -> 4128 bytes
+ ...umMyeongjo-Regular-subset.name-legacy.61,63.ttf | Bin 3580 -> 3580 bytes
+ ...NanumMyeongjo-Regular-subset.name-legacy.61.ttf | Bin 3156 -> 3156 bytes
+ ...NanumMyeongjo-Regular-subset.name-legacy.62.ttf | Bin 3180 -> 3180 bytes
+ ...NanumMyeongjo-Regular-subset.name-legacy.63.ttf | Bin 3048 -> 3048 bytes
+ ...lar-subset.name-legacy.retain-all-codepoint.ttf | Bin 9524 -> 9524 bytes
+ ...lar-subset.no-prune-unicode-ranges.61,62,63.ttf | Bin 4128 -> 4128 bytes
+ ...egular-subset.no-prune-unicode-ranges.61,63.ttf | Bin 3580 -> 3580 bytes
+ ...o-Regular-subset.no-prune-unicode-ranges.61.ttf | Bin 3156 -> 3156 bytes
+ ...o-Regular-subset.no-prune-unicode-ranges.62.ttf | Bin 3180 -> 3180 bytes
+ ...o-Regular-subset.no-prune-unicode-ranges.63.ttf | Bin 3048 -> 3048 bytes
+ ...o-prune-unicode-ranges.retain-all-codepoint.ttf | Bin 9524 -> 9524 bytes
+ ...ngjo-Regular-subset.notdef-outline.61,62,63.ttf | Bin 4128 -> 4128 bytes
+ ...yeongjo-Regular-subset.notdef-outline.61,63.ttf | Bin 3580 -> 3580 bytes
+ ...umMyeongjo-Regular-subset.notdef-outline.61.ttf | Bin 3156 -> 3156 bytes
+ ...umMyeongjo-Regular-subset.notdef-outline.62.ttf | Bin 3180 -> 3180 bytes
+ ...umMyeongjo-Regular-subset.notdef-outline.63.ttf | Bin 3048 -> 3048 bytes
+ ...-subset.notdef-outline.retain-all-codepoint.ttf | Bin 9524 -> 9524 bytes
+ ...yeongjo-Regular-subset.retain-gids.61,62,63.ttf | Bin 4128 -> 4128 bytes
+ ...umMyeongjo-Regular-subset.retain-gids.61,63.ttf | Bin 3588 -> 3588 bytes
+ ...NanumMyeongjo-Regular-subset.retain-gids.61.ttf | Bin 3156 -> 3156 bytes
+ ...NanumMyeongjo-Regular-subset.retain-gids.62.ttf | Bin 3184 -> 3184 bytes
+ ...NanumMyeongjo-Regular-subset.retain-gids.63.ttf | Bin 3060 -> 3060 bytes
+ ...lar-subset.retain-gids.retain-all-codepoint.ttf | Bin 9524 -> 9524 bytes
+ .../basics/Roboto-Regular.abc.default.61,62,63.ttf | Bin 2412 -> 2412 bytes
+ .../basics/Roboto-Regular.abc.default.61,63.ttf    | Bin 2208 -> 2208 bytes
+ .../basics/Roboto-Regular.abc.default.61.ttf       | Bin 2008 -> 2008 bytes
+ .../basics/Roboto-Regular.abc.default.62.ttf       | Bin 1876 -> 1876 bytes
+ .../basics/Roboto-Regular.abc.default.63.ttf       | Bin 1932 -> 1932 bytes
+ ...to-Regular.abc.default.retain-all-codepoint.ttf | Bin 2412 -> 2412 bytes
+ ...Regular.abc.drop-hints-retain-gids.61,62,63.ttf | Bin 1152 -> 1152 bytes
+ ...to-Regular.abc.drop-hints-retain-gids.61,63.ttf | Bin 1072 -> 1072 bytes
+ ...oboto-Regular.abc.drop-hints-retain-gids.61.ttf | Bin 944 -> 944 bytes
+ ...oboto-Regular.abc.drop-hints-retain-gids.62.ttf | Bin 840 -> 840 bytes
+ ...oboto-Regular.abc.drop-hints-retain-gids.63.ttf | Bin 928 -> 928 bytes
+ ...drop-hints-retain-gids.retain-all-codepoint.ttf | Bin 1152 -> 1152 bytes
+ .../Roboto-Regular.abc.drop-hints.61,62,63.ttf     | Bin 1152 -> 1152 bytes
+ .../basics/Roboto-Regular.abc.drop-hints.61,63.ttf | Bin 1056 -> 1056 bytes
+ .../basics/Roboto-Regular.abc.drop-hints.61.ttf    | Bin 944 -> 944 bytes
+ .../basics/Roboto-Regular.abc.drop-hints.62.ttf    | Bin 836 -> 836 bytes
+ .../basics/Roboto-Regular.abc.drop-hints.63.ttf    | Bin 916 -> 916 bytes
+ ...Regular.abc.drop-hints.retain-all-codepoint.ttf | Bin 1152 -> 1152 bytes
+ .../basics/Roboto-Regular.abc.gids.61,62,63.ttf    | Bin 2412 -> 2412 bytes
+ .../basics/Roboto-Regular.abc.gids.61,63.ttf       | Bin 2412 -> 2412 bytes
+ .../expected/basics/Roboto-Regular.abc.gids.61.ttf | Bin 2412 -> 2412 bytes
+ .../expected/basics/Roboto-Regular.abc.gids.62.ttf | Bin 2412 -> 2412 bytes
+ .../expected/basics/Roboto-Regular.abc.gids.63.ttf | Bin 2412 -> 2412 bytes
+ ...oboto-Regular.abc.gids.retain-all-codepoint.ttf | Bin 2412 -> 2412 bytes
+ .../Roboto-Regular.abc.glyph-names.61,62,63.ttf    | Bin 2412 -> 2412 bytes
+ .../Roboto-Regular.abc.glyph-names.61,63.ttf       | Bin 2208 -> 2208 bytes
+ .../basics/Roboto-Regular.abc.glyph-names.61.ttf   | Bin 2008 -> 2008 bytes
+ .../basics/Roboto-Regular.abc.glyph-names.62.ttf   | Bin 1876 -> 1876 bytes
+ .../basics/Roboto-Regular.abc.glyph-names.63.ttf   | Bin 1932 -> 1932 bytes
+ ...egular.abc.glyph-names.retain-all-codepoint.ttf | Bin 2412 -> 2412 bytes
+ ...gular.abc.keep-all-layout-features.61,62,63.ttf | Bin 2412 -> 2412 bytes
+ ...-Regular.abc.keep-all-layout-features.61,63.ttf | Bin 2208 -> 2208 bytes
+ ...oto-Regular.abc.keep-all-layout-features.61.ttf | Bin 2008 -> 2008 bytes
+ ...oto-Regular.abc.keep-all-layout-features.62.ttf | Bin 1876 -> 1876 bytes
+ ...oto-Regular.abc.keep-all-layout-features.63.ttf | Bin 1932 -> 1932 bytes
+ ...ep-all-layout-features.retain-all-codepoint.ttf | Bin 2412 -> 2412 bytes
+ ...Roboto-Regular.abc.layout-features.61,62,63.ttf | Bin 2412 -> 2412 bytes
+ .../Roboto-Regular.abc.layout-features.61,63.ttf   | Bin 2208 -> 2208 bytes
+ .../Roboto-Regular.abc.layout-features.61.ttf      | Bin 2008 -> 2008 bytes
+ .../Roboto-Regular.abc.layout-features.62.ttf      | Bin 1876 -> 1876 bytes
+ .../Roboto-Regular.abc.layout-features.63.ttf      | Bin 1932 -> 1932 bytes
+ ...ar.abc.layout-features.retain-all-codepoint.ttf | Bin 2412 -> 2412 bytes
+ .../Roboto-Regular.abc.name-ids.61,62,63.ttf       | Bin 2412 -> 2412 bytes
+ .../basics/Roboto-Regular.abc.name-ids.61,63.ttf   | Bin 2208 -> 2208 bytes
+ .../basics/Roboto-Regular.abc.name-ids.61.ttf      | Bin 2008 -> 2008 bytes
+ .../basics/Roboto-Regular.abc.name-ids.62.ttf      | Bin 1876 -> 1876 bytes
+ .../basics/Roboto-Regular.abc.name-ids.63.ttf      | Bin 1932 -> 1932 bytes
+ ...o-Regular.abc.name-ids.retain-all-codepoint.ttf | Bin 2412 -> 2412 bytes
+ .../Roboto-Regular.abc.name-languages.61,62,63.ttf | Bin 2412 -> 2412 bytes
+ .../Roboto-Regular.abc.name-languages.61,63.ttf    | Bin 2208 -> 2208 bytes
+ .../Roboto-Regular.abc.name-languages.61.ttf       | Bin 2008 -> 2008 bytes
+ .../Roboto-Regular.abc.name-languages.62.ttf       | Bin 1876 -> 1876 bytes
+ .../Roboto-Regular.abc.name-languages.63.ttf       | Bin 1932 -> 1932 bytes
+ ...lar.abc.name-languages.retain-all-codepoint.ttf | Bin 2412 -> 2412 bytes
+ .../Roboto-Regular.abc.name-legacy.61,62,63.ttf    | Bin 2412 -> 2412 bytes
+ .../Roboto-Regular.abc.name-legacy.61,63.ttf       | Bin 2208 -> 2208 bytes
+ .../basics/Roboto-Regular.abc.name-legacy.61.ttf   | Bin 2008 -> 2008 bytes
+ .../basics/Roboto-Regular.abc.name-legacy.62.ttf   | Bin 1876 -> 1876 bytes
+ .../basics/Roboto-Regular.abc.name-legacy.63.ttf   | Bin 1932 -> 1932 bytes
+ ...egular.abc.name-legacy.retain-all-codepoint.ttf | Bin 2412 -> 2412 bytes
+ ...egular.abc.no-prune-unicode-ranges.61,62,63.ttf | Bin 2412 -> 2412 bytes
+ ...o-Regular.abc.no-prune-unicode-ranges.61,63.ttf | Bin 2208 -> 2208 bytes
+ ...boto-Regular.abc.no-prune-unicode-ranges.61.ttf | Bin 2008 -> 2008 bytes
+ ...boto-Regular.abc.no-prune-unicode-ranges.62.ttf | Bin 1876 -> 1876 bytes
+ ...boto-Regular.abc.no-prune-unicode-ranges.63.ttf | Bin 1932 -> 1932 bytes
+ ...o-prune-unicode-ranges.retain-all-codepoint.ttf | Bin 2412 -> 2412 bytes
+ .../Roboto-Regular.abc.notdef-outline.61,62,63.ttf | Bin 2412 -> 2412 bytes
+ .../Roboto-Regular.abc.notdef-outline.61,63.ttf    | Bin 2208 -> 2208 bytes
+ .../Roboto-Regular.abc.notdef-outline.61.ttf       | Bin 2008 -> 2008 bytes
+ .../Roboto-Regular.abc.notdef-outline.62.ttf       | Bin 1876 -> 1876 bytes
+ .../Roboto-Regular.abc.notdef-outline.63.ttf       | Bin 1932 -> 1932 bytes
+ ...lar.abc.notdef-outline.retain-all-codepoint.ttf | Bin 2412 -> 2412 bytes
+ .../Roboto-Regular.abc.retain-gids.61,62,63.ttf    | Bin 2412 -> 2412 bytes
+ .../Roboto-Regular.abc.retain-gids.61,63.ttf       | Bin 2224 -> 2224 bytes
+ .../basics/Roboto-Regular.abc.retain-gids.61.ttf   | Bin 2008 -> 2008 bytes
+ .../basics/Roboto-Regular.abc.retain-gids.62.ttf   | Bin 1884 -> 1884 bytes
+ .../basics/Roboto-Regular.abc.retain-gids.63.ttf   | Bin 1948 -> 1948 bytes
+ ...egular.abc.retain-gids.retain-all-codepoint.ttf | Bin 2412 -> 2412 bytes
+ .../cbdt/NotoColorEmoji.subset.default.2049.ttf    | Bin 3112 -> 3112 bytes
+ .../cbdt/NotoColorEmoji.subset.default.38,2049.ttf | Bin 4084 -> 4084 bytes
+ .../cbdt/NotoColorEmoji.subset.default.38,20E3.ttf | Bin 3568 -> 3568 bytes
+ ...rEmoji.subset.default.38,39,AE,2049,38,20E3.ttf | Bin 10124 -> 10124 bytes
+ .../NotoColorEmoji.subset.default.38,AE,2049.ttf   | Bin 7544 -> 7544 bytes
+ .../cbdt/NotoColorEmoji.subset.default.39.ttf      | Bin 1920 -> 1920 bytes
+ .../cbdt/NotoColorEmoji.subset.default.AE.ttf      | Bin 4412 -> 4412 bytes
+ ...lorEmoji.subset.drop-hints-retain-gids.2049.ttf | Bin 3136 -> 3136 bytes
+ ...Emoji.subset.drop-hints-retain-gids.38,2049.ttf | Bin 4108 -> 4108 bytes
+ ...Emoji.subset.drop-hints-retain-gids.38,20E3.ttf | Bin 3600 -> 3600 bytes
+ ...rop-hints-retain-gids.38,39,AE,2049,38,20E3.ttf | Bin 10124 -> 10124 bytes
+ ...ji.subset.drop-hints-retain-gids.38,AE,2049.ttf | Bin 7564 -> 7564 bytes
+ ...ColorEmoji.subset.drop-hints-retain-gids.39.ttf | Bin 1928 -> 1928 bytes
+ ...ColorEmoji.subset.drop-hints-retain-gids.AE.ttf | Bin 4428 -> 4428 bytes
+ .../cbdt/NotoColorEmoji.subset.drop-hints.2049.ttf | Bin 3112 -> 3112 bytes
+ .../NotoColorEmoji.subset.drop-hints.38,2049.ttf   | Bin 4084 -> 4084 bytes
+ .../NotoColorEmoji.subset.drop-hints.38,20E3.ttf   | Bin 3568 -> 3568 bytes
+ ...oji.subset.drop-hints.38,39,AE,2049,38,20E3.ttf | Bin 10124 -> 10124 bytes
+ ...NotoColorEmoji.subset.drop-hints.38,AE,2049.ttf | Bin 7544 -> 7544 bytes
+ .../cbdt/NotoColorEmoji.subset.drop-hints.39.ttf   | Bin 1920 -> 1920 bytes
+ .../cbdt/NotoColorEmoji.subset.drop-hints.AE.ttf   | Bin 4412 -> 4412 bytes
+ .../NotoColorEmoji.subset.gap.default.2049.ttf     | Bin 3112 -> 3112 bytes
+ .../NotoColorEmoji.subset.gap.default.38,2049.ttf  | Bin 4084 -> 4084 bytes
+ .../NotoColorEmoji.subset.gap.default.38,20E3.ttf  | Bin 3568 -> 3568 bytes
+ ...ji.subset.gap.default.38,39,AE,2049,38,20E3.ttf | Bin 9188 -> 9188 bytes
+ ...otoColorEmoji.subset.gap.default.38,AE,2049.ttf | Bin 7544 -> 7544 bytes
+ .../cbdt/NotoColorEmoji.subset.gap.default.39.ttf  | Bin 908 -> 908 bytes
+ .../cbdt/NotoColorEmoji.subset.gap.default.AE.ttf  | Bin 4412 -> 4412 bytes
+ ...moji.subset.gap.drop-hints-retain-gids.2049.ttf | Bin 3136 -> 3136 bytes
+ ...i.subset.gap.drop-hints-retain-gids.38,2049.ttf | Bin 4108 -> 4108 bytes
+ ...i.subset.gap.drop-hints-retain-gids.38,20E3.ttf | Bin 3600 -> 3600 bytes
+ ...rop-hints-retain-gids.38,39,AE,2049,38,20E3.ttf | Bin 9188 -> 9188 bytes
+ ...ubset.gap.drop-hints-retain-gids.38,AE,2049.ttf | Bin 7564 -> 7564 bytes
+ ...rEmoji.subset.gap.drop-hints-retain-gids.39.ttf | Bin 916 -> 916 bytes
+ ...rEmoji.subset.gap.drop-hints-retain-gids.AE.ttf | Bin 4428 -> 4428 bytes
+ .../NotoColorEmoji.subset.gap.drop-hints.2049.ttf  | Bin 3112 -> 3112 bytes
+ ...otoColorEmoji.subset.gap.drop-hints.38,2049.ttf | Bin 4084 -> 4084 bytes
+ ...otoColorEmoji.subset.gap.drop-hints.38,20E3.ttf | Bin 3568 -> 3568 bytes
+ ...subset.gap.drop-hints.38,39,AE,2049,38,20E3.ttf | Bin 9188 -> 9188 bytes
+ ...ColorEmoji.subset.gap.drop-hints.38,AE,2049.ttf | Bin 7544 -> 7544 bytes
+ .../NotoColorEmoji.subset.gap.drop-hints.39.ttf    | Bin 908 -> 908 bytes
+ .../NotoColorEmoji.subset.gap.drop-hints.AE.ttf    | Bin 4412 -> 4412 bytes
+ .../NotoColorEmoji.subset.gap.retain-gids.2049.ttf | Bin 3136 -> 3136 bytes
+ ...toColorEmoji.subset.gap.retain-gids.38,2049.ttf | Bin 4108 -> 4108 bytes
+ ...toColorEmoji.subset.gap.retain-gids.38,20E3.ttf | Bin 3600 -> 3600 bytes
+ ...ubset.gap.retain-gids.38,39,AE,2049,38,20E3.ttf | Bin 9188 -> 9188 bytes
+ ...olorEmoji.subset.gap.retain-gids.38,AE,2049.ttf | Bin 7564 -> 7564 bytes
+ .../NotoColorEmoji.subset.gap.retain-gids.39.ttf   | Bin 916 -> 916 bytes
+ .../NotoColorEmoji.subset.gap.retain-gids.AE.ttf   | Bin 4428 -> 4428 bytes
+ ...olorEmoji.subset.index_format3.default.2049.ttf | Bin 3108 -> 3108 bytes
+ ...rEmoji.subset.index_format3.default.38,2049.ttf | Bin 4076 -> 4076 bytes
+ ...rEmoji.subset.index_format3.default.38,20E3.ttf | Bin 3560 -> 3560 bytes
+ ...index_format3.default.38,39,AE,2049,38,20E3.ttf | Bin 10112 -> 10112 bytes
+ ...oji.subset.index_format3.default.38,AE,2049.ttf | Bin 7536 -> 7536 bytes
+ ...oColorEmoji.subset.index_format3.default.39.ttf | Bin 1916 -> 1916 bytes
+ ...oColorEmoji.subset.index_format3.default.AE.ttf | Bin 4408 -> 4408 bytes
+ ...t.index_format3.drop-hints-retain-gids.2049.ttf | Bin 3132 -> 3132 bytes
+ ...ndex_format3.drop-hints-retain-gids.38,2049.ttf | Bin 4100 -> 4100 bytes
+ ...ndex_format3.drop-hints-retain-gids.38,20E3.ttf | Bin 3592 -> 3592 bytes
+ ...rop-hints-retain-gids.38,39,AE,2049,38,20E3.ttf | Bin 10112 -> 10112 bytes
+ ...x_format3.drop-hints-retain-gids.38,AE,2049.ttf | Bin 7552 -> 7552 bytes
+ ...set.index_format3.drop-hints-retain-gids.39.ttf | Bin 1924 -> 1924 bytes
+ ...set.index_format3.drop-hints-retain-gids.AE.ttf | Bin 4424 -> 4424 bytes
+ ...rEmoji.subset.index_format3.drop-hints.2049.ttf | Bin 3108 -> 3108 bytes
+ ...oji.subset.index_format3.drop-hints.38,2049.ttf | Bin 4076 -> 4076 bytes
+ ...oji.subset.index_format3.drop-hints.38,20E3.ttf | Bin 3560 -> 3560 bytes
+ ...ex_format3.drop-hints.38,39,AE,2049,38,20E3.ttf | Bin 10112 -> 10112 bytes
+ ....subset.index_format3.drop-hints.38,AE,2049.ttf | Bin 7536 -> 7536 bytes
+ ...lorEmoji.subset.index_format3.drop-hints.39.ttf | Bin 1916 -> 1916 bytes
+ ...lorEmoji.subset.index_format3.drop-hints.AE.ttf | Bin 4408 -> 4408 bytes
+ ...Emoji.subset.index_format3.retain-gids.2049.ttf | Bin 3132 -> 3132 bytes
+ ...ji.subset.index_format3.retain-gids.38,2049.ttf | Bin 4100 -> 4100 bytes
+ ...ji.subset.index_format3.retain-gids.38,20E3.ttf | Bin 3592 -> 3592 bytes
+ ...x_format3.retain-gids.38,39,AE,2049,38,20E3.ttf | Bin 10112 -> 10112 bytes
+ ...subset.index_format3.retain-gids.38,AE,2049.ttf | Bin 7552 -> 7552 bytes
+ ...orEmoji.subset.index_format3.retain-gids.39.ttf | Bin 1924 -> 1924 bytes
+ ...orEmoji.subset.index_format3.retain-gids.AE.ttf | Bin 4424 -> 4424 bytes
+ ...ji.subset.multiple_size_tables.default.2049.ttf | Bin 5312 -> 5312 bytes
+ ...subset.multiple_size_tables.default.38,2049.ttf | Bin 7244 -> 7244 bytes
+ ...subset.multiple_size_tables.default.38,20E3.ttf | Bin 6212 -> 6212 bytes
+ ...e_size_tables.default.38,39,AE,2049,38,20E3.ttf | Bin 19280 -> 19280 bytes
+ ...set.multiple_size_tables.default.38,AE,2049.ttf | Bin 14140 -> 14140 bytes
+ ...moji.subset.multiple_size_tables.default.39.ttf | Bin 2928 -> 2928 bytes
+ ...moji.subset.multiple_size_tables.default.AE.ttf | Bin 7916 -> 7916 bytes
+ ...ple_size_tables.drop-hints-retain-gids.2049.ttf | Bin 5336 -> 5336 bytes
+ ..._size_tables.drop-hints-retain-gids.38,2049.ttf | Bin 7268 -> 7268 bytes
+ ..._size_tables.drop-hints-retain-gids.38,20E3.ttf | Bin 6244 -> 6244 bytes
+ ...rop-hints-retain-gids.38,39,AE,2049,38,20E3.ttf | Bin 19280 -> 19280 bytes
+ ...ze_tables.drop-hints-retain-gids.38,AE,2049.ttf | Bin 14164 -> 14164 bytes
+ ...tiple_size_tables.drop-hints-retain-gids.39.ttf | Bin 2936 -> 2936 bytes
+ ...tiple_size_tables.drop-hints-retain-gids.AE.ttf | Bin 7932 -> 7932 bytes
+ ...subset.multiple_size_tables.drop-hints.2049.ttf | Bin 5312 -> 5312 bytes
+ ...set.multiple_size_tables.drop-hints.38,2049.ttf | Bin 7244 -> 7244 bytes
+ ...set.multiple_size_tables.drop-hints.38,20E3.ttf | Bin 6212 -> 6212 bytes
+ ...ize_tables.drop-hints.38,39,AE,2049,38,20E3.ttf | Bin 19280 -> 19280 bytes
+ ....multiple_size_tables.drop-hints.38,AE,2049.ttf | Bin 14140 -> 14140 bytes
+ ...i.subset.multiple_size_tables.drop-hints.39.ttf | Bin 2928 -> 2928 bytes
+ ...i.subset.multiple_size_tables.drop-hints.AE.ttf | Bin 7916 -> 7916 bytes
+ ...ubset.multiple_size_tables.retain-gids.2049.ttf | Bin 5336 -> 5336 bytes
+ ...et.multiple_size_tables.retain-gids.38,2049.ttf | Bin 7268 -> 7268 bytes
+ ...et.multiple_size_tables.retain-gids.38,20E3.ttf | Bin 6244 -> 6244 bytes
+ ...ze_tables.retain-gids.38,39,AE,2049,38,20E3.ttf | Bin 19280 -> 19280 bytes
+ ...multiple_size_tables.retain-gids.38,AE,2049.ttf | Bin 14164 -> 14164 bytes
+ ....subset.multiple_size_tables.retain-gids.39.ttf | Bin 2936 -> 2936 bytes
+ ....subset.multiple_size_tables.retain-gids.AE.ttf | Bin 7932 -> 7932 bytes
+ .../NotoColorEmoji.subset.retain-gids.2049.ttf     | Bin 3136 -> 3136 bytes
+ .../NotoColorEmoji.subset.retain-gids.38,2049.ttf  | Bin 4108 -> 4108 bytes
+ .../NotoColorEmoji.subset.retain-gids.38,20E3.ttf  | Bin 3600 -> 3600 bytes
+ ...ji.subset.retain-gids.38,39,AE,2049,38,20E3.ttf | Bin 10124 -> 10124 bytes
+ ...otoColorEmoji.subset.retain-gids.38,AE,2049.ttf | Bin 7564 -> 7564 bytes
+ .../cbdt/NotoColorEmoji.subset.retain-gids.39.ttf  | Bin 1928 -> 1928 bytes
+ .../cbdt/NotoColorEmoji.subset.retain-gids.AE.ttf  | Bin 4428 -> 4428 bytes
+ ...subroutinize-retain-gids.1FC,21,41,20,62,63.otf | Bin 20128 -> 20128 bytes
+ ...outline-desubroutinize-retain-gids.61,62,63.otf | Bin 2280 -> 2280 bytes
+ ...e-desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf | Bin 30448 -> 30448 bytes
+ ...f-outline-desubroutinize.1FC,21,41,20,62,63.otf | Bin 2356 -> 2356 bytes
+ ...ular.notdef-outline-desubroutinize.61,62,63.otf | Bin 2084 -> 2084 bytes
+ ...otdef-outline-desubroutinize.D7,D8,D9,DA,DE.otf | Bin 2252 -> 2252 bytes
+ ...subroutinize-retain-gids.1FC,21,41,20,62,63.otf | Bin 19960 -> 19960 bytes
+ ...p-hints-desubroutinize-retain-gids.61,62,63.otf | Bin 2156 -> 2156 bytes
+ ...s-desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf | Bin 30280 -> 30280 bytes
+ ...rop-hints-desubroutinize.1FC,21,41,20,62,63.otf | Bin 2184 -> 2184 bytes
+ ...-outline-drop-hints-desubroutinize.61,62,63.otf | Bin 1960 -> 1960 bytes
+ ...ne-drop-hints-desubroutinize.D7,D8,D9,DA,DE.otf | Bin 2088 -> 2088 bytes
+ ...e-drop-hints-retain-gids.1FC,21,41,20,62,63.otf | Bin 20052 -> 20052 bytes
+ ...def-outline-drop-hints-retain-gids.61,62,63.otf | Bin 2196 -> 2196 bytes
+ ...tline-drop-hints-retain-gids.D7,D8,D9,DA,DE.otf | Bin 30296 -> 30296 bytes
+ ...otdef-outline-drop-hints.1FC,21,41,20,62,63.otf | Bin 2268 -> 2268 bytes
+ ...-Regular.notdef-outline-drop-hints.61,62,63.otf | Bin 2028 -> 2028 bytes
+ ...ar.notdef-outline-drop-hints.D7,D8,D9,DA,DE.otf | Bin 2104 -> 2104 bytes
+ ...tdef-outline-retain-gids.1FC,21,41,20,62,63.otf | Bin 20284 -> 20284 bytes
+ ...Regular.notdef-outline-retain-gids.61,62,63.otf | Bin 2348 -> 2348 bytes
+ ...r.notdef-outline-retain-gids.D7,D8,D9,DA,DE.otf | Bin 30464 -> 30464 bytes
+ ...o-Regular.notdef-outline.1FC,21,41,20,62,63.otf | Bin 2500 -> 2500 bytes
+ ...urceSansPro-Regular.notdef-outline.61,62,63.otf | Bin 2180 -> 2180 bytes
+ ...nsPro-Regular.notdef-outline.D7,D8,D9,DA,DE.otf | Bin 2272 -> 2272 bytes
+ ...ubset.default.3042,3044,3046,3048,304A,304B.otf | Bin 4820 -> 4820 bytes
+ ...ubset.default.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 6196 -> 6196 bytes
+ ...eHanSans-Regular_subset.default.61,63,65,6B.otf | Bin 2540 -> 2540 bytes
+ ...ubset.default.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 6640 -> 6640 bytes
+ .../SourceHanSans-Regular_subset.default.660E.otf  | Bin 2444 -> 2444 bytes
+ ...e-retain-gids.3042,3044,3046,3048,304A,304B.otf | Bin 129820 -> 129820 bytes
+ ...e-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 130840 -> 130840 bytes
+ ...bset.desubroutinize-retain-gids.61,63,65,6B.otf | Bin 3364 -> 3364 bytes
+ ...e-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 121956 -> 121956 bytes
+ ...ular_subset.desubroutinize-retain-gids.660E.otf | Bin 50744 -> 50744 bytes
+ ...esubroutinize.3042,3044,3046,3048,304A,304B.otf | Bin 4656 -> 4656 bytes
+ ...esubroutinize.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 5840 -> 5840 bytes
+ ...s-Regular_subset.desubroutinize.61,63,65,6B.otf | Bin 2472 -> 2472 bytes
+ ...esubroutinize.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 6132 -> 6132 bytes
+ ...eHanSans-Regular_subset.desubroutinize.660E.otf | Bin 2428 -> 2428 bytes
+ ...e-retain-gids.3042,3044,3046,3048,304A,304B.otf | Bin 129376 -> 129376 bytes
+ ...e-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 130220 -> 130220 bytes
+ ...ints-desubroutinize-retain-gids.61,63,65,6B.otf | Bin 3244 -> 3244 bytes
+ ...e-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 121180 -> 121180 bytes
+ ....drop-hints-desubroutinize-retain-gids.660E.otf | Bin 50516 -> 50516 bytes
+ ...esubroutinize.3042,3044,3046,3048,304A,304B.otf | Bin 4348 -> 4348 bytes
+ ...esubroutinize.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 5324 -> 5324 bytes
+ ...ubset.drop-hints-desubroutinize.61,63,65,6B.otf | Bin 2368 -> 2368 bytes
+ ...esubroutinize.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 5456 -> 5456 bytes
+ ...gular_subset.drop-hints-desubroutinize.660E.otf | Bin 2292 -> 2292 bytes
+ ...s-retain-gids.3042,3044,3046,3048,304A,304B.otf | Bin 129516 -> 129516 bytes
+ ...s-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 130528 -> 130528 bytes
+ ...r_subset.drop-hints-retain-gids.61,63,65,6B.otf | Bin 3208 -> 3208 bytes
+ ...s-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 121680 -> 121680 bytes
+ ...-Regular_subset.drop-hints-retain-gids.660E.otf | Bin 50532 -> 50532 bytes
+ ...et.drop-hints.3042,3044,3046,3048,304A,304B.otf | Bin 4484 -> 4484 bytes
+ ...et.drop-hints.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 5628 -> 5628 bytes
+ ...nSans-Regular_subset.drop-hints.61,63,65,6B.otf | Bin 2400 -> 2400 bytes
+ ...et.drop-hints.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 5952 -> 5952 bytes
+ ...ourceHanSans-Regular_subset.drop-hints.660E.otf | Bin 2304 -> 2304 bytes
+ ...t.retain-gids.3042,3044,3046,3048,304A,304B.otf | Bin 129980 -> 129980 bytes
+ ...t.retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 131196 -> 131196 bytes
+ ...Sans-Regular_subset.retain-gids.61,63,65,6B.otf | Bin 3364 -> 3364 bytes
+ ...t.retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 122460 -> 122460 bytes
+ ...urceHanSans-Regular_subset.retain-gids.660E.otf | Bin 50760 -> 50760 bytes
+ ...otoSerifMyanmar-Regular.notdef-outline.1092.otf | Bin 1392 -> 1392 bytes
+ .../cmap/AdobeBlank-Regular.default.61,62.ttf      | Bin 1208 -> 1208 bytes
+ .../cmap/AdobeBlank-Regular.default.61,FEFA.ttf    | Bin 1264 -> 1264 bytes
+ .../cmap/AdobeBlank-Regular.default.FEE6,FECF.ttf  | Bin 1216 -> 1216 bytes
+ .../cmap/AdobeBlank-Regular.default.FEF9,FEFA.ttf  | Bin 1204 -> 1204 bytes
+ .../cmap/AdobeBlank-Regular.default.FEFA.ttf       | Bin 1184 -> 1184 bytes
+ ...eBlank-Regular.drop-hints-retain-gids.61,62.ttf | Bin 1424 -> 1424 bytes
+ ...lank-Regular.drop-hints-retain-gids.61,FEFA.ttf | Bin 8232 -> 8232 bytes
+ ...nk-Regular.drop-hints-retain-gids.FEE6,FECF.ttf | Bin 8104 -> 8104 bytes
+ ...nk-Regular.drop-hints-retain-gids.FEF9,FEFA.ttf | Bin 8172 -> 8172 bytes
+ ...beBlank-Regular.drop-hints-retain-gids.FEFA.ttf | Bin 8156 -> 8156 bytes
+ .../cmap/AdobeBlank-Regular.drop-hints.61,62.ttf   | Bin 1036 -> 1036 bytes
+ .../cmap/AdobeBlank-Regular.drop-hints.61,FEFA.ttf | Bin 1092 -> 1092 bytes
+ .../AdobeBlank-Regular.drop-hints.FEE6,FECF.ttf    | Bin 1044 -> 1044 bytes
+ .../AdobeBlank-Regular.drop-hints.FEF9,FEFA.ttf    | Bin 1032 -> 1032 bytes
+ .../cmap/AdobeBlank-Regular.drop-hints.FEFA.ttf    | Bin 1012 -> 1012 bytes
+ .../cmap/AdobeBlank-Regular.name-ids.61,62.ttf     | Bin 956 -> 956 bytes
+ .../cmap/AdobeBlank-Regular.name-ids.61,FEFA.ttf   | Bin 1012 -> 1012 bytes
+ .../cmap/AdobeBlank-Regular.name-ids.FEE6,FECF.ttf | Bin 964 -> 964 bytes
+ .../cmap/AdobeBlank-Regular.name-ids.FEF9,FEFA.ttf | Bin 952 -> 952 bytes
+ .../cmap/AdobeBlank-Regular.name-ids.FEFA.ttf      | Bin 932 -> 932 bytes
+ .../cmap/AdobeBlank-Regular.retain-gids.61,62.ttf  | Bin 1596 -> 1596 bytes
+ .../AdobeBlank-Regular.retain-gids.61,FEFA.ttf     | Bin 8404 -> 8404 bytes
+ .../AdobeBlank-Regular.retain-gids.FEE6,FECF.ttf   | Bin 8276 -> 8276 bytes
+ .../AdobeBlank-Regular.retain-gids.FEF9,FEFA.ttf   | Bin 8344 -> 8344 bytes
+ .../cmap/AdobeBlank-Regular.retain-gids.FEFA.ttf   | Bin 8328 -> 8328 bytes
+ ...tline-drop-hints-retain-gids.4E00,4E02,4E03.otf | Bin 1404 -> 1404 bytes
+ ...ef-outline-drop-hints-retain-gids.4E00,4E03.otf | Bin 1292 -> 1292 bytes
+ ...tline-drop-hints-retain-gids.4E00,4E05,4E07.otf | Bin 1416 -> 1416 bytes
+ ...tline-drop-hints-retain-gids.4E02,4E03,4E08.otf | Bin 1736 -> 1736 bytes
+ ....notdef-outline-drop-hints-retain-gids.4E02.otf | Bin 1048 -> 1048 bytes
+ ....notdef-outline-drop-hints-retain-gids.4E03.otf | Bin 1140 -> 1140 bytes
+ ...-drop-hints-retain-gids.4E05,4E07,4E08,4E09.otf | Bin 2000 -> 2000 bytes
+ ...ef-outline-drop-hints-retain-gids.4E08,4E09.otf | Bin 1888 -> 1888 bytes
+ ....notdef-outline-drop-hints-retain-gids.4E08.otf | Bin 1560 -> 1560 bytes
+ ...drop-hints-retain-gids.retain-all-codepoint.otf | Bin 2452 -> 2452 bytes
+ ...t1.notdef-outline-drop-hints.4E00,4E02,4E03.otf | Bin 1308 -> 1308 bytes
+ ...4_font1.notdef-outline-drop-hints.4E00,4E03.otf | Bin 1188 -> 1188 bytes
+ ...t1.notdef-outline-drop-hints.4E00,4E05,4E07.otf | Bin 1280 -> 1280 bytes
+ ...t1.notdef-outline-drop-hints.4E02,4E03,4E08.otf | Bin 1528 -> 1528 bytes
+ ...cmap14_font1.notdef-outline-drop-hints.4E02.otf | Bin 944 -> 944 bytes
+ ...cmap14_font1.notdef-outline-drop-hints.4E03.otf | Bin 1028 -> 1028 bytes
+ ...tdef-outline-drop-hints.4E05,4E07,4E08,4E09.otf | Bin 1796 -> 1796 bytes
+ ...4_font1.notdef-outline-drop-hints.4E08,4E09.otf | Bin 1672 -> 1672 bytes
+ ...cmap14_font1.notdef-outline-drop-hints.4E08.otf | Bin 1336 -> 1336 bytes
+ ...def-outline-drop-hints.retain-all-codepoint.otf | Bin 2296 -> 2296 bytes
+ ...14_font1.notdef-outline-gids.4E00,4E02,4E03.otf | Bin 1408 -> 1408 bytes
+ .../cmap14_font1.notdef-outline-gids.4E00,4E03.otf | Bin 1396 -> 1396 bytes
+ ...14_font1.notdef-outline-gids.4E00,4E05,4E07.otf | Bin 1640 -> 1640 bytes
+ ...14_font1.notdef-outline-gids.4E02,4E03,4E08.otf | Bin 1760 -> 1760 bytes
+ .../cmap14_font1.notdef-outline-gids.4E02.otf      | Bin 1332 -> 1332 bytes
+ .../cmap14_font1.notdef-outline-gids.4E03.otf      | Bin 1372 -> 1372 bytes
+ ...nt1.notdef-outline-gids.4E05,4E07,4E08,4E09.otf | Bin 2184 -> 2184 bytes
+ .../cmap14_font1.notdef-outline-gids.4E08,4E09.otf | Bin 2056 -> 2056 bytes
+ .../cmap14_font1.notdef-outline-gids.4E08.otf      | Bin 1720 -> 1720 bytes
+ ...t1.notdef-outline-gids.retain-all-codepoint.otf | Bin 2400 -> 2400 bytes
+ ...ont1.notdef-outline-name-ids.4E00,4E02,4E03.otf | Bin 1308 -> 1308 bytes
+ ...p14_font1.notdef-outline-name-ids.4E00,4E03.otf | Bin 1184 -> 1184 bytes
+ ...ont1.notdef-outline-name-ids.4E00,4E05,4E07.otf | Bin 1280 -> 1280 bytes
+ ...ont1.notdef-outline-name-ids.4E02,4E03,4E08.otf | Bin 1528 -> 1528 bytes
+ .../cmap14_font1.notdef-outline-name-ids.4E02.otf  | Bin 944 -> 944 bytes
+ .../cmap14_font1.notdef-outline-name-ids.4E03.otf  | Bin 1028 -> 1028 bytes
+ ...notdef-outline-name-ids.4E05,4E07,4E08,4E09.otf | Bin 1796 -> 1796 bytes
+ ...p14_font1.notdef-outline-name-ids.4E08,4E09.otf | Bin 1668 -> 1668 bytes
+ .../cmap14_font1.notdef-outline-name-ids.4E08.otf  | Bin 1336 -> 1336 bytes
+ ...otdef-outline-name-ids.retain-all-codepoint.otf | Bin 2296 -> 2296 bytes
+ ...1.notdef-outline-retain-gids.4E00,4E02,4E03.otf | Bin 1472 -> 1472 bytes
+ ..._font1.notdef-outline-retain-gids.4E00,4E03.otf | Bin 1360 -> 1360 bytes
+ ...1.notdef-outline-retain-gids.4E00,4E05,4E07.otf | Bin 1480 -> 1480 bytes
+ ...1.notdef-outline-retain-gids.4E02,4E03,4E08.otf | Bin 1804 -> 1804 bytes
+ ...map14_font1.notdef-outline-retain-gids.4E02.otf | Bin 1116 -> 1116 bytes
+ ...map14_font1.notdef-outline-retain-gids.4E03.otf | Bin 1208 -> 1208 bytes
+ ...def-outline-retain-gids.4E05,4E07,4E08,4E09.otf | Bin 2068 -> 2068 bytes
+ ..._font1.notdef-outline-retain-gids.4E08,4E09.otf | Bin 1956 -> 1956 bytes
+ ...map14_font1.notdef-outline-retain-gids.4E08.otf | Bin 1628 -> 1628 bytes
+ ...ef-outline-retain-gids.retain-all-codepoint.otf | Bin 2520 -> 2520 bytes
+ .../cmap14_font1.notdef-outline.4E00,4E02,4E03.otf | Bin 1376 -> 1376 bytes
+ .../cmap14_font1.notdef-outline.4E00,4E03.otf      | Bin 1252 -> 1252 bytes
+ .../cmap14_font1.notdef-outline.4E00,4E05,4E07.otf | Bin 1348 -> 1348 bytes
+ .../cmap14_font1.notdef-outline.4E02,4E03,4E08.otf | Bin 1596 -> 1596 bytes
+ .../cmap14/cmap14_font1.notdef-outline.4E02.otf    | Bin 1012 -> 1012 bytes
+ .../cmap14/cmap14_font1.notdef-outline.4E03.otf    | Bin 1096 -> 1096 bytes
+ ...14_font1.notdef-outline.4E05,4E07,4E08,4E09.otf | Bin 1864 -> 1864 bytes
+ .../cmap14_font1.notdef-outline.4E08,4E09.otf      | Bin 1736 -> 1736 bytes
+ .../cmap14/cmap14_font1.notdef-outline.4E08.otf    | Bin 1404 -> 1404 bytes
+ ...4_font1.notdef-outline.retain-all-codepoint.otf | Bin 2364 -> 2364 bytes
+ ...tline-drop-hints-retain-gids.4E00,4E02,4E03.otf | Bin 1404 -> 1404 bytes
+ ...ef-outline-drop-hints-retain-gids.4E00,4E03.otf | Bin 1292 -> 1292 bytes
+ ...tline-drop-hints-retain-gids.4E00,4E05,4E07.otf | Bin 1420 -> 1420 bytes
+ ...tline-drop-hints-retain-gids.4E02,4E03,4E08.otf | Bin 1736 -> 1736 bytes
+ ....notdef-outline-drop-hints-retain-gids.4E02.otf | Bin 1044 -> 1044 bytes
+ ....notdef-outline-drop-hints-retain-gids.4E03.otf | Bin 1136 -> 1136 bytes
+ ...-drop-hints-retain-gids.4E05,4E07,4E08,4E09.otf | Bin 2000 -> 2000 bytes
+ ...ef-outline-drop-hints-retain-gids.4E08,4E09.otf | Bin 1884 -> 1884 bytes
+ ....notdef-outline-drop-hints-retain-gids.4E08.otf | Bin 1556 -> 1556 bytes
+ ...drop-hints-retain-gids.retain-all-codepoint.otf | Bin 2448 -> 2448 bytes
+ ...t2.notdef-outline-drop-hints.4E00,4E02,4E03.otf | Bin 1308 -> 1308 bytes
+ ...4_font2.notdef-outline-drop-hints.4E00,4E03.otf | Bin 1188 -> 1188 bytes
+ ...t2.notdef-outline-drop-hints.4E00,4E05,4E07.otf | Bin 1284 -> 1284 bytes
+ ...t2.notdef-outline-drop-hints.4E02,4E03,4E08.otf | Bin 1528 -> 1528 bytes
+ ...cmap14_font2.notdef-outline-drop-hints.4E02.otf | Bin 940 -> 940 bytes
+ ...cmap14_font2.notdef-outline-drop-hints.4E03.otf | Bin 1024 -> 1024 bytes
+ ...tdef-outline-drop-hints.4E05,4E07,4E08,4E09.otf | Bin 1796 -> 1796 bytes
+ ...4_font2.notdef-outline-drop-hints.4E08,4E09.otf | Bin 1668 -> 1668 bytes
+ ...cmap14_font2.notdef-outline-drop-hints.4E08.otf | Bin 1332 -> 1332 bytes
+ ...def-outline-drop-hints.retain-all-codepoint.otf | Bin 2292 -> 2292 bytes
+ ...14_font2.notdef-outline-gids.4E00,4E02,4E03.otf | Bin 1408 -> 1408 bytes
+ .../cmap14_font2.notdef-outline-gids.4E00,4E03.otf | Bin 1396 -> 1396 bytes
+ ...14_font2.notdef-outline-gids.4E00,4E05,4E07.otf | Bin 1644 -> 1644 bytes
+ ...14_font2.notdef-outline-gids.4E02,4E03,4E08.otf | Bin 1760 -> 1760 bytes
+ .../cmap14_font2.notdef-outline-gids.4E02.otf      | Bin 1328 -> 1328 bytes
+ .../cmap14_font2.notdef-outline-gids.4E03.otf      | Bin 1368 -> 1368 bytes
+ ...nt2.notdef-outline-gids.4E05,4E07,4E08,4E09.otf | Bin 2184 -> 2184 bytes
+ .../cmap14_font2.notdef-outline-gids.4E08,4E09.otf | Bin 2052 -> 2052 bytes
+ .../cmap14_font2.notdef-outline-gids.4E08.otf      | Bin 1716 -> 1716 bytes
+ ...t2.notdef-outline-gids.retain-all-codepoint.otf | Bin 2396 -> 2396 bytes
+ ...ont2.notdef-outline-name-ids.4E00,4E02,4E03.otf | Bin 1308 -> 1308 bytes
+ ...p14_font2.notdef-outline-name-ids.4E00,4E03.otf | Bin 1184 -> 1184 bytes
+ ...ont2.notdef-outline-name-ids.4E00,4E05,4E07.otf | Bin 1284 -> 1284 bytes
+ ...ont2.notdef-outline-name-ids.4E02,4E03,4E08.otf | Bin 1528 -> 1528 bytes
+ .../cmap14_font2.notdef-outline-name-ids.4E02.otf  | Bin 940 -> 940 bytes
+ .../cmap14_font2.notdef-outline-name-ids.4E03.otf  | Bin 1024 -> 1024 bytes
+ ...notdef-outline-name-ids.4E05,4E07,4E08,4E09.otf | Bin 1796 -> 1796 bytes
+ ...p14_font2.notdef-outline-name-ids.4E08,4E09.otf | Bin 1664 -> 1664 bytes
+ .../cmap14_font2.notdef-outline-name-ids.4E08.otf  | Bin 1332 -> 1332 bytes
+ ...otdef-outline-name-ids.retain-all-codepoint.otf | Bin 2292 -> 2292 bytes
+ ...2.notdef-outline-retain-gids.4E00,4E02,4E03.otf | Bin 1472 -> 1472 bytes
+ ..._font2.notdef-outline-retain-gids.4E00,4E03.otf | Bin 1360 -> 1360 bytes
+ ...2.notdef-outline-retain-gids.4E00,4E05,4E07.otf | Bin 1484 -> 1484 bytes
+ ...2.notdef-outline-retain-gids.4E02,4E03,4E08.otf | Bin 1804 -> 1804 bytes
+ ...map14_font2.notdef-outline-retain-gids.4E02.otf | Bin 1112 -> 1112 bytes
+ ...map14_font2.notdef-outline-retain-gids.4E03.otf | Bin 1204 -> 1204 bytes
+ ...def-outline-retain-gids.4E05,4E07,4E08,4E09.otf | Bin 2068 -> 2068 bytes
+ ..._font2.notdef-outline-retain-gids.4E08,4E09.otf | Bin 1952 -> 1952 bytes
+ ...map14_font2.notdef-outline-retain-gids.4E08.otf | Bin 1624 -> 1624 bytes
+ ...ef-outline-retain-gids.retain-all-codepoint.otf | Bin 2516 -> 2516 bytes
+ .../cmap14_font2.notdef-outline.4E00,4E02,4E03.otf | Bin 1376 -> 1376 bytes
+ .../cmap14_font2.notdef-outline.4E00,4E03.otf      | Bin 1252 -> 1252 bytes
+ .../cmap14_font2.notdef-outline.4E00,4E05,4E07.otf | Bin 1352 -> 1352 bytes
+ .../cmap14_font2.notdef-outline.4E02,4E03,4E08.otf | Bin 1596 -> 1596 bytes
+ .../cmap14/cmap14_font2.notdef-outline.4E02.otf    | Bin 1008 -> 1008 bytes
+ .../cmap14/cmap14_font2.notdef-outline.4E03.otf    | Bin 1092 -> 1092 bytes
+ ...14_font2.notdef-outline.4E05,4E07,4E08,4E09.otf | Bin 1864 -> 1864 bytes
+ .../cmap14_font2.notdef-outline.4E08,4E09.otf      | Bin 1732 -> 1732 bytes
+ .../cmap14/cmap14_font2.notdef-outline.4E08.otf    | Bin 1400 -> 1400 bytes
+ ...4_font2.notdef-outline.retain-all-codepoint.otf | Bin 2360 -> 2360 bytes
+ .../TwemojiMozilla.subset.default.32,3297,3299.ttf | Bin 1868 -> 1868 bytes
+ .../colr/TwemojiMozilla.subset.default.32,3297.ttf | Bin 1344 -> 1344 bytes
+ .../colr/TwemojiMozilla.subset.default.32,3299.ttf | Bin 1520 -> 1520 bytes
+ .../colr/TwemojiMozilla.subset.default.32.ttf      | Bin 888 -> 888 bytes
+ .../TwemojiMozilla.subset.default.3297,3299.ttf    | Bin 1860 -> 1860 bytes
+ .../colr/TwemojiMozilla.subset.default.3297.ttf    | Bin 1332 -> 1332 bytes
+ .../colr/TwemojiMozilla.subset.default.3299.ttf    | Bin 1508 -> 1508 bytes
+ ....subset.drop-hints-retain-gids.32,3297,3299.ttf | Bin 1848 -> 1848 bytes
+ ...zilla.subset.drop-hints-retain-gids.32,3297.ttf | Bin 1340 -> 1340 bytes
+ ...zilla.subset.drop-hints-retain-gids.32,3299.ttf | Bin 1520 -> 1520 bytes
+ ...ojiMozilla.subset.drop-hints-retain-gids.32.ttf | Bin 868 -> 868 bytes
+ ...lla.subset.drop-hints-retain-gids.3297,3299.ttf | Bin 1844 -> 1844 bytes
+ ...iMozilla.subset.drop-hints-retain-gids.3297.ttf | Bin 1328 -> 1328 bytes
+ ...iMozilla.subset.drop-hints-retain-gids.3299.ttf | Bin 1508 -> 1508 bytes
+ ...emojiMozilla.subset.drop-hints.32,3297,3299.ttf | Bin 1848 -> 1848 bytes
+ .../TwemojiMozilla.subset.drop-hints.32,3297.ttf   | Bin 1324 -> 1324 bytes
+ .../TwemojiMozilla.subset.drop-hints.32,3299.ttf   | Bin 1500 -> 1500 bytes
+ .../colr/TwemojiMozilla.subset.drop-hints.32.ttf   | Bin 868 -> 868 bytes
+ .../TwemojiMozilla.subset.drop-hints.3297,3299.ttf | Bin 1840 -> 1840 bytes
+ .../colr/TwemojiMozilla.subset.drop-hints.3297.ttf | Bin 1312 -> 1312 bytes
+ .../colr/TwemojiMozilla.subset.drop-hints.3299.ttf | Bin 1488 -> 1488 bytes
+ ...mojiMozilla.subset.retain-gids.32,3297,3299.ttf | Bin 1868 -> 1868 bytes
+ .../TwemojiMozilla.subset.retain-gids.32,3297.ttf  | Bin 1360 -> 1360 bytes
+ .../TwemojiMozilla.subset.retain-gids.32,3299.ttf  | Bin 1540 -> 1540 bytes
+ .../colr/TwemojiMozilla.subset.retain-gids.32.ttf  | Bin 888 -> 888 bytes
+ ...TwemojiMozilla.subset.retain-gids.3297,3299.ttf | Bin 1864 -> 1864 bytes
+ .../TwemojiMozilla.subset.retain-gids.3297.ttf     | Bin 1348 -> 1348 bytes
+ .../TwemojiMozilla.subset.retain-gids.3299.ttf     | Bin 1528 -> 1528 bytes
+ .../colr_with_components/colr-table.default.6B.ttf | Bin 4260 -> 4260 bytes
+ .../colr-table.drop-hints-retain-gids.6B.ttf       | Bin 4984 -> 4984 bytes
+ .../colr-table.drop-hints.6B.ttf                   | Bin 4260 -> 4260 bytes
+ .../colr-table.retain-gids.6B.ttf                  | Bin 4984 -> 4984 bytes
+ .../Roboto-Regular.default.1FC,21,41,20,62,63.ttf  | Bin 3004 -> 3004 bytes
+ .../full-font/Roboto-Regular.default.61,62,63.ttf  | Bin 2632 -> 2632 bytes
+ .../Roboto-Regular.default.D7,D8,D9,DA,DE.ttf      | Bin 2960 -> 2960 bytes
+ ...oboto-Regular.drop-hints.1FC,21,41,20,62,63.ttf | Bin 1556 -> 1556 bytes
+ .../Roboto-Regular.drop-hints.61,62,63.ttf         | Bin 1372 -> 1372 bytes
+ .../Roboto-Regular.drop-hints.D7,D8,D9,DA,DE.ttf   | Bin 1584 -> 1584 bytes
+ ...ifVariable-Roman.default.1FC,21,41,20,62,63.ttf | Bin 3888 -> 3888 bytes
+ .../SourceSerifVariable-Roman.default.61,62,63.ttf | Bin 3784 -> 3784 bytes
+ ...eSerifVariable-Roman.default.D7,D8,D9,DA,DE.ttf | Bin 4324 -> 4324 bytes
+ ...ariable-Roman.drop-hints.1FC,21,41,20,62,63.ttf | Bin 3876 -> 3876 bytes
+ ...urceSerifVariable-Roman.drop-hints.61,62,63.ttf | Bin 3784 -> 3784 bytes
+ ...rifVariable-Roman.drop-hints.D7,D8,D9,DA,DE.ttf | Bin 4324 -> 4324 bytes
+ .../Mplus1p-Regular.default.1D715,1D7D8,41,42.ttf  | Bin 2340 -> 2340 bytes
+ .../japanese/Mplus1p-Regular.default.25771.ttf     | Bin 1988 -> 1988 bytes
+ ...gular.default.3042,3044,3046,3048,304A,304B.ttf | Bin 2616 -> 2616 bytes
+ ...gular.default.3042,3044,3046,73E0,5EA6,8F38.ttf | Bin 2848 -> 2848 bytes
+ .../Mplus1p-Regular.default.61,63,65,6B.ttf        | Bin 2248 -> 2248 bytes
+ ...gular.default.660E,6975,73E0,5EA6,8F38,6E05.ttf | Bin 3144 -> 3144 bytes
+ .../japanese/Mplus1p-Regular.default.660E.ttf      | Bin 1944 -> 1944 bytes
+ ...plus1p-Regular.drop-hints.1D715,1D7D8,41,42.ttf | Bin 1612 -> 1612 bytes
+ .../japanese/Mplus1p-Regular.drop-hints.25771.ttf  | Bin 1260 -> 1260 bytes
+ ...ar.drop-hints.3042,3044,3046,3048,304A,304B.ttf | Bin 1888 -> 1888 bytes
+ ...ar.drop-hints.3042,3044,3046,73E0,5EA6,8F38.ttf | Bin 2120 -> 2120 bytes
+ .../Mplus1p-Regular.drop-hints.61,63,65,6B.ttf     | Bin 1520 -> 1520 bytes
+ ...ar.drop-hints.660E,6975,73E0,5EA6,8F38,6E05.ttf | Bin 2416 -> 2416 bytes
+ .../japanese/Mplus1p-Regular.drop-hints.660E.ttf   | Bin 1216 -> 1216 bytes
+ ...Mplus1p-Regular.keep-gdef.1D715,1D7D8,41,42.ttf | Bin 2340 -> 2340 bytes
+ .../japanese/Mplus1p-Regular.keep-gdef.25771.ttf   | Bin 1988 -> 1988 bytes
+ ...lar.keep-gdef.3042,3044,3046,3048,304A,304B.ttf | Bin 2616 -> 2616 bytes
+ ...lar.keep-gdef.3042,3044,3046,73E0,5EA6,8F38.ttf | Bin 2848 -> 2848 bytes
+ .../Mplus1p-Regular.keep-gdef.61,63,65,6B.ttf      | Bin 2248 -> 2248 bytes
+ ...lar.keep-gdef.660E,6975,73E0,5EA6,8F38,6E05.ttf | Bin 3144 -> 3144 bytes
+ .../japanese/Mplus1p-Regular.keep-gdef.660E.ttf    | Bin 1944 -> 1944 bytes
+ ...ules_f1.notdef-outline-retain-gids.41,42,43.otf | Bin 2016 -> 2016 bytes
+ ...ubrules_f1.notdef-outline-retain-gids.41,42.otf | Bin 1912 -> 1912 bytes
+ ...ubrules_f1.notdef-outline-retain-gids.41,43.otf | Bin 2020 -> 2020 bytes
+ ...e_subrules_f1.notdef-outline-retain-gids.41.otf | Bin 1896 -> 1896 bytes
+ ...ef-outline-retain-gids.retain-all-codepoint.otf | Bin 3876 -> 3876 bytes
+ ...ultiple_subrules_f1.notdef-outline.41,42,43.otf | Bin 1304 -> 1304 bytes
+ ...1_multiple_subrules_f1.notdef-outline.41,42.otf | Bin 1204 -> 1204 bytes
+ ...1_multiple_subrules_f1.notdef-outline.41,43.otf | Bin 1300 -> 1300 bytes
+ ...ext1_multiple_subrules_f1.notdef-outline.41.otf | Bin 1192 -> 1192 bytes
+ ...ules_f1.notdef-outline.retain-all-codepoint.otf | Bin 3876 -> 3876 bytes
+ ...ules_f1.notdef-outline-retain-gids.41,42,43.otf | Bin 2016 -> 2016 bytes
+ ...ubrules_f1.notdef-outline-retain-gids.41,42.otf | Bin 1912 -> 1912 bytes
+ ...ubrules_f1.notdef-outline-retain-gids.41,43.otf | Bin 2020 -> 2020 bytes
+ ...e_subrules_f1.notdef-outline-retain-gids.41.otf | Bin 1896 -> 1896 bytes
+ ...ef-outline-retain-gids.retain-all-codepoint.otf | Bin 3876 -> 3876 bytes
+ ...ultiple_subrules_f1.notdef-outline.41,42,43.otf | Bin 1304 -> 1304 bytes
+ ...2_multiple_subrules_f1.notdef-outline.41,42.otf | Bin 1204 -> 1204 bytes
+ ...2_multiple_subrules_f1.notdef-outline.41,43.otf | Bin 1300 -> 1300 bytes
+ ...ext2_multiple_subrules_f1.notdef-outline.41.otf | Bin 1192 -> 1192 bytes
+ ...ules_f1.notdef-outline.retain-all-codepoint.otf | Bin 3876 -> 3876 bytes
+ ...mple_f1.notdef-outline-retain-gids.41,42,43.otf | Bin 1996 -> 1996 bytes
+ ..._simple_f1.notdef-outline-retain-gids.41,42.otf | Bin 1892 -> 1892 bytes
+ ..._simple_f1.notdef-outline-retain-gids.41,43.otf | Bin 2000 -> 2000 bytes
+ ...xt3_simple_f1.notdef-outline-retain-gids.41.otf | Bin 1876 -> 1876 bytes
+ ...ef-outline-retain-gids.retain-all-codepoint.otf | Bin 3856 -> 3856 bytes
+ ..._context3_simple_f1.notdef-outline.41,42,43.otf | Bin 1284 -> 1284 bytes
+ ...pos_context3_simple_f1.notdef-outline.41,42.otf | Bin 1184 -> 1184 bytes
+ ...pos_context3_simple_f1.notdef-outline.41,43.otf | Bin 1280 -> 1280 bytes
+ .../gpos_context3_simple_f1.notdef-outline.41.otf  | Bin 1172 -> 1172 bytes
+ ...mple_f1.notdef-outline.retain-all-codepoint.otf | Bin 3856 -> 3856 bytes
+ .../IndicTestJalandhar-Regular.default.A01.ttf     | Bin 4172 -> 4172 bytes
+ .../IndicTestJalandhar-Regular.default.A05,A06.ttf | Bin 4748 -> 4748 bytes
+ .../IndicTestJalandhar-Regular.default.A07,A1B.ttf | Bin 4720 -> 4720 bytes
+ ...andhar-Regular.default.retain-all-codepoint.ttf | Bin 49248 -> 49248 bytes
+ .../IndicTestJalandhar-Regular.drop-hints.A01.ttf  | Bin 1032 -> 1032 bytes
+ ...dicTestJalandhar-Regular.drop-hints.A05,A06.ttf | Bin 1340 -> 1340 bytes
+ ...dicTestJalandhar-Regular.drop-hints.A07,A1B.ttf | Bin 1340 -> 1340 bytes
+ ...har-Regular.drop-hints.retain-all-codepoint.ttf | Bin 29468 -> 29468 bytes
+ .../IndicTestJalandhar-Regular.keep-gdef.A01.ttf   | Bin 4172 -> 4172 bytes
+ ...ndicTestJalandhar-Regular.keep-gdef.A05,A06.ttf | Bin 4748 -> 4748 bytes
+ ...ndicTestJalandhar-Regular.keep-gdef.A07,A1B.ttf | Bin 4720 -> 4720 bytes
+ ...dhar-Regular.keep-gdef.retain-all-codepoint.ttf | Bin 49248 -> 49248 bytes
+ ...otype.notdef-outline-drop-hints.41,42,43,57.otf | Bin 5272 -> 5272 bytes
+ ...rototype.notdef-outline-drop-hints.41,42,43.otf | Bin 4740 -> 4740 bytes
+ ...VFPrototype.notdef-outline-drop-hints.41,42.otf | Bin 4264 -> 4264 bytes
+ ...rototype.notdef-outline-drop-hints.41,56,57.otf | Bin 4408 -> 4408 bytes
+ ...obeVFPrototype.notdef-outline-drop-hints.41.otf | Bin 3560 -> 3560 bytes
+ ...VFPrototype.notdef-outline-drop-hints.42,57.otf | Bin 4396 -> 4396 bytes
+ ...AdobeVFPrototype.notdef-outline.41,42,43,57.otf | Bin 5460 -> 5460 bytes
+ .../AdobeVFPrototype.notdef-outline.41,42,43.otf   | Bin 4928 -> 4928 bytes
+ .../AdobeVFPrototype.notdef-outline.41,42.otf      | Bin 4448 -> 4448 bytes
+ .../AdobeVFPrototype.notdef-outline.41,56,57.otf   | Bin 4596 -> 4596 bytes
+ .../AdobeVFPrototype.notdef-outline.41.otf         | Bin 3748 -> 3748 bytes
+ .../AdobeVFPrototype.notdef-outline.42,57.otf      | Bin 4580 -> 4580 bytes
+ .../Roboto-Regular.default.1E00,303.ttf            | Bin 2472 -> 2472 bytes
+ .../layout.gdef/Roboto-Regular.default.303.ttf     | Bin 2076 -> 2076 bytes
+ .../Roboto-Regular.default.309,20,30F.ttf          | Bin 2148 -> 2148 bytes
+ .../layout.gdef/Roboto-Regular.default.323.ttf     | Bin 1968 -> 1968 bytes
+ .../Roboto-Regular.default.41,42,43.ttf            | Bin 2532 -> 2532 bytes
+ .../Roboto-Regular.drop-hints.1E00,303.ttf         | Bin 1328 -> 1328 bytes
+ .../layout.gdef/Roboto-Regular.drop-hints.303.ttf  | Bin 1072 -> 1072 bytes
+ .../Roboto-Regular.drop-hints.309,20,30F.ttf       | Bin 1108 -> 1108 bytes
+ .../layout.gdef/Roboto-Regular.drop-hints.323.ttf  | Bin 1016 -> 1016 bytes
+ .../Roboto-Regular.drop-hints.41,42,43.ttf         | Bin 1348 -> 1348 bytes
+ .../Roboto-Regular.keep-gdef-gpos.1E00,303.ttf     | Bin 2472 -> 2472 bytes
+ .../Roboto-Regular.keep-gdef-gpos.303.ttf          | Bin 2076 -> 2076 bytes
+ .../Roboto-Regular.keep-gdef-gpos.309,20,30F.ttf   | Bin 2148 -> 2148 bytes
+ .../Roboto-Regular.keep-gdef-gpos.323.ttf          | Bin 1968 -> 1968 bytes
+ .../Roboto-Regular.keep-gdef-gpos.41,42,43.ttf     | Bin 2532 -> 2532 bytes
+ ...os1_2_font.notdef-outline-retain-gids.41,43.otf | Bin 1980 -> 1980 bytes
+ ...os1_2_font.notdef-outline-retain-gids.41,46.otf | Bin 2140 -> 2140 bytes
+ .../gpos1_2_font.notdef-outline-retain-gids.41.otf | Bin 1856 -> 1856 bytes
+ ...os1_2_font.notdef-outline-retain-gids.42,44.otf | Bin 1964 -> 1964 bytes
+ ...os1_2_font.notdef-outline-retain-gids.43,46.otf | Bin 2004 -> 2004 bytes
+ ...ef-outline-retain-gids.retain-all-codepoint.otf | Bin 3780 -> 3780 bytes
+ .../gpos1_2_font.notdef-outline.41,43.otf          | Bin 1260 -> 1260 bytes
+ .../gpos1_2_font.notdef-outline.41,46.otf          | Bin 1388 -> 1388 bytes
+ .../layout.gpos/gpos1_2_font.notdef-outline.41.otf | Bin 1152 -> 1152 bytes
+ .../gpos1_2_font.notdef-outline.42,44.otf          | Bin 1232 -> 1232 bytes
+ .../gpos1_2_font.notdef-outline.43,46.otf          | Bin 1252 -> 1252 bytes
+ ..._2_font.notdef-outline.retain-all-codepoint.otf | Bin 3780 -> 3780 bytes
+ ...1_font7.notdef-outline-retain-gids.21,23,25.otf | Bin 1656 -> 1656 bytes
+ ...s2_1_font7.notdef-outline-retain-gids.21,23.otf | Bin 1532 -> 1532 bytes
+ ...s2_1_font7.notdef-outline-retain-gids.2E,23.otf | Bin 1912 -> 1912 bytes
+ ...1_font7.notdef-outline-retain-gids.41,42,43.otf | Bin 1976 -> 1976 bytes
+ ...ef-outline-retain-gids.retain-all-codepoint.otf | Bin 3780 -> 3780 bytes
+ .../gpos2_1_font7.notdef-outline.21,23,25.otf      | Bin 1312 -> 1312 bytes
+ .../gpos2_1_font7.notdef-outline.21,23.otf         | Bin 1204 -> 1204 bytes
+ .../gpos2_1_font7.notdef-outline.2E,23.otf         | Bin 1476 -> 1476 bytes
+ .../gpos2_1_font7.notdef-outline.41,42,43.otf      | Bin 1264 -> 1264 bytes
+ ...1_font7.notdef-outline.retain-all-codepoint.otf | Bin 3780 -> 3780 bytes
+ ...2_font5.notdef-outline-retain-gids.21,23,25.otf | Bin 1656 -> 1656 bytes
+ ...s2_2_font5.notdef-outline-retain-gids.21,23.otf | Bin 1532 -> 1532 bytes
+ ...s2_2_font5.notdef-outline-retain-gids.2E,23.otf | Bin 1912 -> 1912 bytes
+ ...2_font5.notdef-outline-retain-gids.41,42,43.otf | Bin 1976 -> 1976 bytes
+ ...ef-outline-retain-gids.retain-all-codepoint.otf | Bin 3780 -> 3780 bytes
+ .../gpos2_2_font5.notdef-outline.21,23,25.otf      | Bin 1312 -> 1312 bytes
+ .../gpos2_2_font5.notdef-outline.21,23.otf         | Bin 1204 -> 1204 bytes
+ .../gpos2_2_font5.notdef-outline.2E,23.otf         | Bin 1476 -> 1476 bytes
+ .../gpos2_2_font5.notdef-outline.41,42,43.otf      | Bin 1264 -> 1264 bytes
+ ...2_font5.notdef-outline.retain-all-codepoint.otf | Bin 3780 -> 3780 bytes
+ ...pos3_font3.notdef-outline-retain-gids.28,29.otf | Bin 1616 -> 1616 bytes
+ ...pos3_font3.notdef-outline-retain-gids.28,2B.otf | Bin 1752 -> 1752 bytes
+ ...pos3_font3.notdef-outline-retain-gids.29,2B.otf | Bin 1664 -> 1664 bytes
+ ...3_font3.notdef-outline-retain-gids.41,42,43.otf | Bin 1972 -> 1972 bytes
+ ...ef-outline-retain-gids.retain-all-codepoint.otf | Bin 3812 -> 3812 bytes
+ .../gpos3_font3.notdef-outline.28,29.otf           | Bin 1224 -> 1224 bytes
+ .../gpos3_font3.notdef-outline.28,2B.otf           | Bin 1344 -> 1344 bytes
+ .../gpos3_font3.notdef-outline.29,2B.otf           | Bin 1256 -> 1256 bytes
+ .../gpos3_font3.notdef-outline.41,42,43.otf        | Bin 1260 -> 1260 bytes
+ ...3_font3.notdef-outline.retain-all-codepoint.otf | Bin 3812 -> 3812 bytes
+ ...rs_1.notdef-outline-retain-gids.41,42,43,44.otf | Bin 2208 -> 2208 bytes
+ ...rs_1.notdef-outline-retain-gids.41,42,43,45.otf | Bin 2220 -> 2220 bytes
+ ...chors_1.notdef-outline-retain-gids.41,42,43.otf | Bin 1996 -> 1996 bytes
+ ..._anchors_1.notdef-outline-retain-gids.41,42.otf | Bin 1892 -> 1892 bytes
+ ...1.notdef-outline-retain-gids.41,43,44,45,46.otf | Bin 2560 -> 2560 bytes
+ ...chors_1.notdef-outline-retain-gids.41,43,44.otf | Bin 2216 -> 2216 bytes
+ ...chors_1.notdef-outline-retain-gids.41,43,45.otf | Bin 2224 -> 2224 bytes
+ ..._anchors_1.notdef-outline-retain-gids.41,43.otf | Bin 2000 -> 2000 bytes
+ ...ple_anchors_1.notdef-outline-retain-gids.41.otf | Bin 1876 -> 1876 bytes
+ ...ef-outline-retain-gids.retain-all-codepoint.otf | Bin 3844 -> 3844 bytes
+ ...ltiple_anchors_1.notdef-outline.41,42,43,44.otf | Bin 1492 -> 1492 bytes
+ ...ltiple_anchors_1.notdef-outline.41,42,43,45.otf | Bin 1488 -> 1488 bytes
+ ..._multiple_anchors_1.notdef-outline.41,42,43.otf | Bin 1284 -> 1284 bytes
+ ...os4_multiple_anchors_1.notdef-outline.41,42.otf | Bin 1184 -> 1184 bytes
+ ...ple_anchors_1.notdef-outline.41,43,44,45,46.otf | Bin 1832 -> 1832 bytes
+ ..._multiple_anchors_1.notdef-outline.41,43,44.otf | Bin 1492 -> 1492 bytes
+ ..._multiple_anchors_1.notdef-outline.41,43,45.otf | Bin 1488 -> 1488 bytes
+ ...os4_multiple_anchors_1.notdef-outline.41,43.otf | Bin 1280 -> 1280 bytes
+ .../gpos4_multiple_anchors_1.notdef-outline.41.otf | Bin 1172 -> 1172 bytes
+ ...chors_1.notdef-outline.retain-all-codepoint.otf | Bin 3844 -> 3844 bytes
+ ...ont1.notdef-outline-retain-gids.41,42,43,44.otf | Bin 2224 -> 2224 bytes
+ ...ont1.notdef-outline-retain-gids.41,42,43,45.otf | Bin 2236 -> 2236 bytes
+ ...5_font1.notdef-outline-retain-gids.41,42,43.otf | Bin 2012 -> 2012 bytes
+ ...5_font1.notdef-outline-retain-gids.41,42,44.otf | Bin 2144 -> 2144 bytes
+ ...5_font1.notdef-outline-retain-gids.41,42,45.otf | Bin 2144 -> 2144 bytes
+ ...pos5_font1.notdef-outline-retain-gids.41,42.otf | Bin 1908 -> 1908 bytes
+ ...pos5_font1.notdef-outline-retain-gids.41,43.otf | Bin 2016 -> 2016 bytes
+ .../gpos5_font1.notdef-outline-retain-gids.41.otf  | Bin 1892 -> 1892 bytes
+ .../gpos5_font1.notdef-outline-retain-gids.42.otf  | Bin 1764 -> 1764 bytes
+ ...ef-outline-retain-gids.retain-all-codepoint.otf | Bin 3860 -> 3860 bytes
+ .../gpos5_font1.notdef-outline.41,42,43,44.otf     | Bin 1508 -> 1508 bytes
+ .../gpos5_font1.notdef-outline.41,42,43,45.otf     | Bin 1504 -> 1504 bytes
+ .../gpos5_font1.notdef-outline.41,42,43.otf        | Bin 1300 -> 1300 bytes
+ .../gpos5_font1.notdef-outline.41,42,44.otf        | Bin 1420 -> 1420 bytes
+ .../gpos5_font1.notdef-outline.41,42,45.otf        | Bin 1408 -> 1408 bytes
+ .../gpos5_font1.notdef-outline.41,42.otf           | Bin 1200 -> 1200 bytes
+ .../gpos5_font1.notdef-outline.41,43.otf           | Bin 1296 -> 1296 bytes
+ .../layout.gpos5/gpos5_font1.notdef-outline.41.otf | Bin 1188 -> 1188 bytes
+ .../layout.gpos5/gpos5_font1.notdef-outline.42.otf | Bin 1048 -> 1048 bytes
+ ...5_font1.notdef-outline.retain-all-codepoint.otf | Bin 3860 -> 3860 bytes
+ ...ont1.notdef-outline-retain-gids.41,42,43,44.otf | Bin 2184 -> 2184 bytes
+ ...ont1.notdef-outline-retain-gids.41,42,43,45.otf | Bin 2196 -> 2196 bytes
+ ...6_font1.notdef-outline-retain-gids.41,42,43.otf | Bin 1972 -> 1972 bytes
+ ...pos6_font1.notdef-outline-retain-gids.41,42.otf | Bin 1868 -> 1868 bytes
+ ...1.notdef-outline-retain-gids.41,43,44,45,46.otf | Bin 2536 -> 2536 bytes
+ ...6_font1.notdef-outline-retain-gids.41,43,44.otf | Bin 2192 -> 2192 bytes
+ ...6_font1.notdef-outline-retain-gids.41,43,45.otf | Bin 2200 -> 2200 bytes
+ ...pos6_font1.notdef-outline-retain-gids.41,43.otf | Bin 1976 -> 1976 bytes
+ .../gpos6_font1.notdef-outline-retain-gids.41.otf  | Bin 1852 -> 1852 bytes
+ ...ef-outline-retain-gids.retain-all-codepoint.otf | Bin 3820 -> 3820 bytes
+ .../gpos6_font1.notdef-outline.41,42,43,44.otf     | Bin 1468 -> 1468 bytes
+ .../gpos6_font1.notdef-outline.41,42,43,45.otf     | Bin 1464 -> 1464 bytes
+ .../gpos6_font1.notdef-outline.41,42,43.otf        | Bin 1260 -> 1260 bytes
+ .../gpos6_font1.notdef-outline.41,42.otf           | Bin 1160 -> 1160 bytes
+ .../gpos6_font1.notdef-outline.41,43,44,45,46.otf  | Bin 1808 -> 1808 bytes
+ .../gpos6_font1.notdef-outline.41,43,44.otf        | Bin 1468 -> 1468 bytes
+ .../gpos6_font1.notdef-outline.41,43,45.otf        | Bin 1464 -> 1464 bytes
+ .../gpos6_font1.notdef-outline.41,43.otf           | Bin 1256 -> 1256 bytes
+ .../layout.gpos6/gpos6_font1.notdef-outline.41.otf | Bin 1148 -> 1148 bytes
+ ...6_font1.notdef-outline.retain-all-codepoint.otf | Bin 3820 -> 3820 bytes
+ ...ular.default.627,644,623,62D,644,627,645,2E.ttf | Bin 12592 -> 12592 bytes
+ .../Amiri-Regular.default.627,644,62D,628.ttf      | Bin 9924 -> 9924 bytes
+ .../Amiri-Regular.default.627,644.ttf              | Bin 4112 -> 4112 bytes
+ ...-Regular.default.633,645,627,621,20,644,627.ttf | Bin 9424 -> 9424 bytes
+ .../Amiri-Regular.default.63A,64A,631.ttf          | Bin 7256 -> 7256 bytes
+ ....retain-gids.627,644,623,62D,644,627,645,2E.ttf | Bin 47920 -> 47920 bytes
+ .../Amiri-Regular.retain-gids.627,644,62D,628.ttf  | Bin 42572 -> 42572 bytes
+ .../Amiri-Regular.retain-gids.627,644.ttf          | Bin 36640 -> 36640 bytes
+ ...ular.retain-gids.633,645,627,621,20,644,627.ttf | Bin 45816 -> 45816 bytes
+ .../Amiri-Regular.retain-gids.63A,64A,631.ttf      | Bin 37920 -> 37920 bytes
+ ...s_f1.notdef-outline-retain-gids.30,31,32,33.otf | Bin 2292 -> 2292 bytes
+ ...ules_f1.notdef-outline-retain-gids.41,42,43.otf | Bin 2020 -> 2020 bytes
+ ...ef-outline-retain-gids.retain-all-codepoint.otf | Bin 3880 -> 3880 bytes
+ ...iple_subrules_f1.notdef-outline.30,31,32,33.otf | Bin 1820 -> 1820 bytes
+ ...ultiple_subrules_f1.notdef-outline.41,42,43.otf | Bin 1308 -> 1308 bytes
+ ...ules_f1.notdef-outline.retain-all-codepoint.otf | Bin 3880 -> 3880 bytes
+ ...s_f1.notdef-outline-retain-gids.30,31,32,33.otf | Bin 2292 -> 2292 bytes
+ ...ules_f1.notdef-outline-retain-gids.41,42,43.otf | Bin 2020 -> 2020 bytes
+ ...ef-outline-retain-gids.retain-all-codepoint.otf | Bin 3880 -> 3880 bytes
+ ...iple_subrules_f1.notdef-outline.30,31,32,33.otf | Bin 1820 -> 1820 bytes
+ ...ultiple_subrules_f1.notdef-outline.41,42,43.otf | Bin 1308 -> 1308 bytes
+ ...ules_f1.notdef-outline.retain-all-codepoint.otf | Bin 3880 -> 3880 bytes
+ ...e_f1.notdef-outline-retain-gids.30,31,32,33.otf | Bin 2268 -> 2268 bytes
+ ...mple_f1.notdef-outline-retain-gids.41,42,43.otf | Bin 1996 -> 1996 bytes
+ ...ef-outline-retain-gids.retain-all-codepoint.otf | Bin 3856 -> 3856 bytes
+ ...ining3_simple_f1.notdef-outline.30,31,32,33.otf | Bin 1796 -> 1796 bytes
+ ...chaining3_simple_f1.notdef-outline.41,42,43.otf | Bin 1284 -> 1284 bytes
+ ...mple_f1.notdef-outline.retain-all-codepoint.otf | Bin 3856 -> 3856 bytes
+ ...pos9_font2.notdef-outline-retain-gids.41,42.otf | Bin 1868 -> 1868 bytes
+ .../gpos9_font2.notdef-outline-retain-gids.41.otf  | Bin 1852 -> 1852 bytes
+ .../gpos9_font2.notdef-outline-retain-gids.42.otf  | Bin 1724 -> 1724 bytes
+ .../gpos9_font2.notdef-outline.41,42.otf           | Bin 1160 -> 1160 bytes
+ .../layout.gpos9/gpos9_font2.notdef-outline.41.otf | Bin 1148 -> 1148 bytes
+ .../layout.gpos9/gpos9_font2.notdef-outline.42.otf | Bin 1008 -> 1008 bytes
+ ...ub_alternate_substitution.default.53A9,53F1.otf | Bin 4316 -> 4316 bytes
+ .../gsub_alternate_substitution.default.53A9.otf   | Bin 3884 -> 3884 bytes
+ .../gsub_alternate_substitution.default.53F1.otf   | Bin 2440 -> 2440 bytes
+ ...e_substitution.default.retain-all-codepoint.otf | Bin 5984 -> 5984 bytes
+ ...lternate_substitution.retain-gids.53A9,53F1.otf | Bin 4440 -> 4440 bytes
+ ...sub_alternate_substitution.retain-gids.53A9.otf | Bin 4036 -> 4036 bytes
+ ...sub_alternate_substitution.retain-gids.53F1.otf | Bin 2632 -> 2632 bytes
+ ...bstitution.retain-gids.retain-all-codepoint.otf | Bin 6076 -> 6076 bytes
+ ...ules_f2.notdef-outline-retain-gids.41,42,43.otf | Bin 2028 -> 2028 bytes
+ ...ubrules_f2.notdef-outline-retain-gids.41,42.otf | Bin 1924 -> 1924 bytes
+ ...ubrules_f2.notdef-outline-retain-gids.41,43.otf | Bin 2032 -> 2032 bytes
+ ...e_subrules_f2.notdef-outline-retain-gids.41.otf | Bin 1908 -> 1908 bytes
+ ...ef-outline-retain-gids.retain-all-codepoint.otf | Bin 3888 -> 3888 bytes
+ ...ultiple_subrules_f2.notdef-outline.41,42,43.otf | Bin 1316 -> 1316 bytes
+ ...1_multiple_subrules_f2.notdef-outline.41,42.otf | Bin 1216 -> 1216 bytes
+ ...1_multiple_subrules_f2.notdef-outline.41,43.otf | Bin 1312 -> 1312 bytes
+ ...ext1_multiple_subrules_f2.notdef-outline.41.otf | Bin 1204 -> 1204 bytes
+ ...ules_f2.notdef-outline.retain-all-codepoint.otf | Bin 3888 -> 3888 bytes
+ ...ules_f2.notdef-outline-retain-gids.41,42,43.otf | Bin 2028 -> 2028 bytes
+ ...ubrules_f2.notdef-outline-retain-gids.41,42.otf | Bin 1924 -> 1924 bytes
+ ...ubrules_f2.notdef-outline-retain-gids.41,43.otf | Bin 2032 -> 2032 bytes
+ ...e_subrules_f2.notdef-outline-retain-gids.41.otf | Bin 1908 -> 1908 bytes
+ ...ef-outline-retain-gids.retain-all-codepoint.otf | Bin 3888 -> 3888 bytes
+ ...ultiple_subrules_f2.notdef-outline.41,42,43.otf | Bin 1316 -> 1316 bytes
+ ...2_multiple_subrules_f2.notdef-outline.41,42.otf | Bin 1216 -> 1216 bytes
+ ...2_multiple_subrules_f2.notdef-outline.41,43.otf | Bin 1312 -> 1312 bytes
+ ...ext2_multiple_subrules_f2.notdef-outline.41.otf | Bin 1204 -> 1204 bytes
+ ...ules_f2.notdef-outline.retain-all-codepoint.otf | Bin 3888 -> 3888 bytes
+ ...sive_f1.notdef-outline-retain-gids.41,42,43.otf | Bin 2016 -> 2016 bytes
+ ...cessive_f1.notdef-outline-retain-gids.41,42.otf | Bin 1912 -> 1912 bytes
+ ...cessive_f1.notdef-outline-retain-gids.41,43.otf | Bin 2020 -> 2020 bytes
+ ...successive_f1.notdef-outline-retain-gids.41.otf | Bin 1896 -> 1896 bytes
+ ...ef-outline-retain-gids.retain-all-codepoint.otf | Bin 3876 -> 3876 bytes
+ ...text3_successive_f1.notdef-outline.41,42,43.otf | Bin 1304 -> 1304 bytes
+ ...context3_successive_f1.notdef-outline.41,42.otf | Bin 1204 -> 1204 bytes
+ ...context3_successive_f1.notdef-outline.41,43.otf | Bin 1300 -> 1300 bytes
+ ...ub_context3_successive_f1.notdef-outline.41.otf | Bin 1192 -> 1192 bytes
+ ...sive_f1.notdef-outline.retain-all-codepoint.otf | Bin 3876 -> 3876 bytes
+ ...s_f1.notdef-outline-retain-gids.30,31,32,33.otf | Bin 2304 -> 2304 bytes
+ ...ules_f1.notdef-outline-retain-gids.41,42,43.otf | Bin 2032 -> 2032 bytes
+ ...ef-outline-retain-gids.retain-all-codepoint.otf | Bin 3892 -> 3892 bytes
+ ...iple_subrules_f1.notdef-outline.30,31,32,33.otf | Bin 1832 -> 1832 bytes
+ ...ultiple_subrules_f1.notdef-outline.41,42,43.otf | Bin 1320 -> 1320 bytes
+ ...ules_f1.notdef-outline.retain-all-codepoint.otf | Bin 3892 -> 3892 bytes
+ ...s_f1.notdef-outline-retain-gids.30,31,32,33.otf | Bin 2304 -> 2304 bytes
+ ...ules_f1.notdef-outline-retain-gids.41,42,43.otf | Bin 2032 -> 2032 bytes
+ ...ef-outline-retain-gids.retain-all-codepoint.otf | Bin 3892 -> 3892 bytes
+ ...iple_subrules_f1.notdef-outline.30,31,32,33.otf | Bin 1832 -> 1832 bytes
+ ...ultiple_subrules_f1.notdef-outline.41,42,43.otf | Bin 1320 -> 1320 bytes
+ ...ules_f1.notdef-outline.retain-all-codepoint.otf | Bin 3892 -> 3892 bytes
+ ...e_f2.notdef-outline-retain-gids.30,31,32,33.otf | Bin 2280 -> 2280 bytes
+ ...mple_f2.notdef-outline-retain-gids.41,42,43.otf | Bin 2008 -> 2008 bytes
+ ...ef-outline-retain-gids.retain-all-codepoint.otf | Bin 3868 -> 3868 bytes
+ ...ining3_simple_f2.notdef-outline.30,31,32,33.otf | Bin 1808 -> 1808 bytes
+ ...chaining3_simple_f2.notdef-outline.41,42,43.otf | Bin 1296 -> 1296 bytes
+ ...mple_f2.notdef-outline.retain-all-codepoint.otf | Bin 3868 -> 3868 bytes
+ ...line-retain-gids.41,42,43,44,45,46,47,48,49.otf | Bin 2916 -> 2916 bytes
+ ...ef-outline-retain-gids.41,42,43,44,45,46,47.otf | Bin 2624 -> 2624 bytes
+ ...ef-outline-retain-gids.41,42,43,44,45,46,4D.otf | Bin 2668 -> 2668 bytes
+ ...ef-outline-retain-gids.41,42,43,44,45,46,51.otf | Bin 2792 -> 2792 bytes
+ ...otdef-outline-retain-gids.41,42,43,44,45,46.otf | Bin 2564 -> 2564 bytes
+ ...created.notdef-outline-retain-gids.41,42,43.otf | Bin 2008 -> 2008 bytes
+ ...ually_created.notdef-outline-retain-gids.41.otf | Bin 1888 -> 1888 bytes
+ ...ually_created.notdef-outline-retain-gids.61.otf | Bin 2292 -> 2292 bytes
+ ...ef-outline-retain-gids.retain-all-codepoint.otf | Bin 3868 -> 3868 bytes
+ ...d.notdef-outline.41,42,43,44,45,46,47,48,49.otf | Bin 2188 -> 2188 bytes
+ ...created.notdef-outline.41,42,43,44,45,46,47.otf | Bin 1904 -> 1904 bytes
+ ...created.notdef-outline.41,42,43,44,45,46,4D.otf | Bin 1868 -> 1868 bytes
+ ...created.notdef-outline.41,42,43,44,45,46,51.otf | Bin 1948 -> 1948 bytes
+ ...ly_created.notdef-outline.41,42,43,44,45,46.otf | Bin 1844 -> 1844 bytes
+ ...b8_manually_created.notdef-outline.41,42,43.otf | Bin 1296 -> 1296 bytes
+ .../gsub8_manually_created.notdef-outline.41.otf   | Bin 1184 -> 1184 bytes
+ .../gsub8_manually_created.notdef-outline.61.otf   | Bin 1236 -> 1236 bytes
+ ...created.notdef-outline.retain-all-codepoint.otf | Bin 3868 -> 3868 bytes
+ .../expected/layout.khmer/Khmer.default.1780.ttf   | Bin 4200 -> 4200 bytes
+ ...ult.1789,17BB,17C6,1794,17B6,1793,1798,17BE.ttf | Bin 6408 -> 6408 bytes
+ .../expected/layout.khmer/Khmer.default.31.ttf     | Bin 4136 -> 4136 bytes
+ .../layout.khmer/Khmer.retain-gids.1780.ttf        | Bin 4460 -> 4460 bytes
+ ...ids.1789,17BB,17C6,1794,17B6,1793,1798,17BE.ttf | Bin 7844 -> 7844 bytes
+ .../expected/layout.khmer/Khmer.retain-gids.31.ttf | Bin 4252 -> 4252 bytes
+ ...Bold.default.627,644,623,62D,644,627,645,2E.ttf | Bin 11388 -> 11388 bytes
+ ...toNastaliqUrdu-Bold.default.627,644,62D,628.ttf | Bin 17688 -> 17688 bytes
+ .../NotoNastaliqUrdu-Bold.default.627,644.ttf      | Bin 3520 -> 3520 bytes
+ ...rdu-Bold.default.633,645,627,621,20,644,627.ttf | Bin 12380 -> 12380 bytes
+ .../NotoNastaliqUrdu-Bold.default.63A,64A,631.ttf  | Bin 19380 -> 19380 bytes
+ ....retain-gids.627,644,623,62D,644,627,645,2E.ttf | Bin 18224 -> 18224 bytes
+ ...staliqUrdu-Bold.retain-gids.627,644,62D,628.ttf | Bin 23748 -> 23748 bytes
+ .../NotoNastaliqUrdu-Bold.retain-gids.627,644.ttf  | Bin 9164 -> 9164 bytes
+ ...Bold.retain-gids.633,645,627,621,20,644,627.ttf | Bin 18184 -> 18184 bytes
+ ...toNastaliqUrdu-Bold.retain-gids.63A,64A,631.ttf | Bin 25432 -> 25432 bytes
+ .../Roboto-Regular.smallcaps.default.41,42,43.ttf  | Bin 2424 -> 2424 bytes
+ .../Roboto-Regular.smallcaps.default.41,43.ttf     | Bin 2232 -> 2232 bytes
+ .../layout/Roboto-Regular.smallcaps.default.41.ttf | Bin 2044 -> 2044 bytes
+ .../layout/Roboto-Regular.smallcaps.default.43.ttf | Bin 2076 -> 2076 bytes
+ .../Roboto-Regular.smallcaps.default.CA,CB.ttf     | Bin 2348 -> 2348 bytes
+ ...boto-Regular.smallcaps.retain-gids.41,42,43.ttf | Bin 2676 -> 2676 bytes
+ .../Roboto-Regular.smallcaps.retain-gids.41,43.ttf | Bin 2496 -> 2496 bytes
+ .../Roboto-Regular.smallcaps.retain-gids.41.ttf    | Bin 2296 -> 2296 bytes
+ .../Roboto-Regular.smallcaps.retain-gids.43.ttf    | Bin 2344 -> 2344 bytes
+ .../Roboto-Regular.smallcaps.retain-gids.CA,CB.ttf | Bin 6436 -> 6436 bytes
+ .../data/expected/sbix/sbix.default.58,59.ttf      | Bin 193528 -> 193528 bytes
+ test/subset/data/expected/sbix/sbix.default.58.ttf | Bin 121168 -> 121168 bytes
+ test/subset/data/expected/sbix/sbix.default.59.ttf | Bin 89364 -> 89364 bytes
+ .../sbix/sbix.drop-hints-retain-gids.58,59.ttf     | Bin 193528 -> 193528 bytes
+ .../sbix/sbix.drop-hints-retain-gids.58.ttf        | Bin 121168 -> 121168 bytes
+ .../sbix/sbix.drop-hints-retain-gids.59.ttf        | Bin 89404 -> 89404 bytes
+ .../data/expected/sbix/sbix.drop-hints.58,59.ttf   | Bin 193528 -> 193528 bytes
+ .../data/expected/sbix/sbix.drop-hints.58.ttf      | Bin 121168 -> 121168 bytes
+ .../data/expected/sbix/sbix.drop-hints.59.ttf      | Bin 89364 -> 89364 bytes
+ .../data/expected/sbix/sbix.retain-gids.58,59.ttf  | Bin 193528 -> 193528 bytes
+ .../data/expected/sbix/sbix.retain-gids.58.ttf     | Bin 121168 -> 121168 bytes
+ .../data/expected/sbix/sbix.retain-gids.59.ttf     | Bin 89404 -> 89404 bytes
+ .../variable/Fraunces.default.26,66,69,124,125.ttf | Bin 15856 -> 15856 bytes
+ .../data/expected/variable/Fraunces.default.61.ttf | Bin 4232 -> 4232 bytes
+ 942 files changed, 21 insertions(+), 32 deletions(-)
+
+commit dea0fe5717a0ce72484bf6b827f5a871f816d4a2
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Aug 4 16:36:20 2021 -0700
+
+    [subset] discard extra copies of a table in face builder.
+    
+    Fixes #2361. Stores tables in the builder in a hashmap so you end up with at most one copy of each table. Table serialization order is now based on tag sort order instead of order of insertion into the builder.
+
+ src/hb-face.cc                                     |  44 +++++++++++++--------
+ src/hb-open-file.hh                                |  23 ++++++-----
+ .../Comfortaa-Regular-new.default.61,62,63.ttf     | Bin 7060 -> 7060 bytes
+ .../basics/Comfortaa-Regular-new.default.61,63.ttf | Bin 6692 -> 6692 bytes
+ .../basics/Comfortaa-Regular-new.default.61.ttf    | Bin 6328 -> 6328 bytes
+ .../basics/Comfortaa-Regular-new.default.62.ttf    | Bin 6200 -> 6200 bytes
+ .../basics/Comfortaa-Regular-new.default.63.ttf    | Bin 6256 -> 6256 bytes
+ ...aa-Regular-new.default.retain-all-codepoint.ttf | Bin 222756 -> 222756 bytes
+ ...Regular-new.drop-hints-retain-gids.61,62,63.ttf | Bin 4608 -> 4608 bytes
+ ...aa-Regular-new.drop-hints-retain-gids.61,63.ttf | Bin 4312 -> 4312 bytes
+ ...ortaa-Regular-new.drop-hints-retain-gids.61.ttf | Bin 3724 -> 3724 bytes
+ ...ortaa-Regular-new.drop-hints-retain-gids.62.ttf | Bin 3900 -> 3900 bytes
+ ...ortaa-Regular-new.drop-hints-retain-gids.63.ttf | Bin 3972 -> 3972 bytes
+ ...drop-hints-retain-gids.retain-all-codepoint.ttf | Bin 191632 -> 191632 bytes
+ .../Comfortaa-Regular-new.drop-hints.61,62,63.ttf  | Bin 2600 -> 2600 bytes
+ .../Comfortaa-Regular-new.drop-hints.61,63.ttf     | Bin 2296 -> 2296 bytes
+ .../basics/Comfortaa-Regular-new.drop-hints.61.ttf | Bin 1976 -> 1976 bytes
+ .../basics/Comfortaa-Regular-new.drop-hints.62.ttf | Bin 1900 -> 1900 bytes
+ .../basics/Comfortaa-Regular-new.drop-hints.63.ttf | Bin 1968 -> 1968 bytes
+ ...Regular-new.drop-hints.retain-all-codepoint.ttf | Bin 191584 -> 191584 bytes
+ .../basics/Comfortaa-Regular-new.gids.61,62,63.ttf | Bin 7988 -> 7988 bytes
+ .../basics/Comfortaa-Regular-new.gids.61,63.ttf    | Bin 7628 -> 7628 bytes
+ .../basics/Comfortaa-Regular-new.gids.61.ttf       | Bin 7256 -> 7256 bytes
+ .../basics/Comfortaa-Regular-new.gids.62.ttf       | Bin 7184 -> 7184 bytes
+ .../basics/Comfortaa-Regular-new.gids.63.ttf       | Bin 7180 -> 7180 bytes
+ ...ortaa-Regular-new.gids.retain-all-codepoint.ttf | Bin 222756 -> 222756 bytes
+ .../Comfortaa-Regular-new.glyph-names.61,62,63.ttf | Bin 7072 -> 7072 bytes
+ .../Comfortaa-Regular-new.glyph-names.61,63.ttf    | Bin 6700 -> 6700 bytes
+ .../Comfortaa-Regular-new.glyph-names.61.ttf       | Bin 6336 -> 6336 bytes
+ .../Comfortaa-Regular-new.glyph-names.62.ttf       | Bin 6208 -> 6208 bytes
+ .../Comfortaa-Regular-new.glyph-names.63.ttf       | Bin 6264 -> 6264 bytes
+ ...egular-new.glyph-names.retain-all-codepoint.ttf | Bin 229748 -> 229748 bytes
+ ...gular-new.keep-all-layout-features.61,62,63.ttf | Bin 7508 -> 7508 bytes
+ ...-Regular-new.keep-all-layout-features.61,63.ttf | Bin 7144 -> 7144 bytes
+ ...taa-Regular-new.keep-all-layout-features.61.ttf | Bin 6776 -> 6776 bytes
+ ...taa-Regular-new.keep-all-layout-features.62.ttf | Bin 6200 -> 6200 bytes
+ ...taa-Regular-new.keep-all-layout-features.63.ttf | Bin 6256 -> 6256 bytes
+ ...ep-all-layout-features.retain-all-codepoint.ttf | Bin 223452 -> 223452 bytes
+ ...fortaa-Regular-new.layout-features.61,62,63.ttf | Bin 7060 -> 7060 bytes
+ ...Comfortaa-Regular-new.layout-features.61,63.ttf | Bin 6692 -> 6692 bytes
+ .../Comfortaa-Regular-new.layout-features.61.ttf   | Bin 6328 -> 6328 bytes
+ .../Comfortaa-Regular-new.layout-features.62.ttf   | Bin 6200 -> 6200 bytes
+ .../Comfortaa-Regular-new.layout-features.63.ttf   | Bin 6256 -> 6256 bytes
+ ...ar-new.layout-features.retain-all-codepoint.ttf | Bin 220948 -> 220948 bytes
+ .../Comfortaa-Regular-new.name-ids.61,62,63.ttf    | Bin 6800 -> 6800 bytes
+ .../Comfortaa-Regular-new.name-ids.61,63.ttf       | Bin 6432 -> 6432 bytes
+ .../basics/Comfortaa-Regular-new.name-ids.61.ttf   | Bin 6068 -> 6068 bytes
+ .../basics/Comfortaa-Regular-new.name-ids.62.ttf   | Bin 5940 -> 5940 bytes
+ .../basics/Comfortaa-Regular-new.name-ids.63.ttf   | Bin 5996 -> 5996 bytes
+ ...a-Regular-new.name-ids.retain-all-codepoint.ttf | Bin 222496 -> 222496 bytes
+ ...mfortaa-Regular-new.name-languages.61,62,63.ttf | Bin 7060 -> 7060 bytes
+ .../Comfortaa-Regular-new.name-languages.61,63.ttf | Bin 6692 -> 6692 bytes
+ .../Comfortaa-Regular-new.name-languages.61.ttf    | Bin 6328 -> 6328 bytes
+ .../Comfortaa-Regular-new.name-languages.62.ttf    | Bin 6200 -> 6200 bytes
+ .../Comfortaa-Regular-new.name-languages.63.ttf    | Bin 6256 -> 6256 bytes
+ ...lar-new.name-languages.retain-all-codepoint.ttf | Bin 222756 -> 222756 bytes
+ .../Comfortaa-Regular-new.name-legacy.61,62,63.ttf | Bin 7060 -> 7060 bytes
+ .../Comfortaa-Regular-new.name-legacy.61,63.ttf    | Bin 6692 -> 6692 bytes
+ .../Comfortaa-Regular-new.name-legacy.61.ttf       | Bin 6328 -> 6328 bytes
+ .../Comfortaa-Regular-new.name-legacy.62.ttf       | Bin 6200 -> 6200 bytes
+ .../Comfortaa-Regular-new.name-legacy.63.ttf       | Bin 6256 -> 6256 bytes
+ ...egular-new.name-legacy.retain-all-codepoint.ttf | Bin 222756 -> 222756 bytes
+ ...egular-new.no-prune-unicode-ranges.61,62,63.ttf | Bin 7060 -> 7060 bytes
+ ...a-Regular-new.no-prune-unicode-ranges.61,63.ttf | Bin 6692 -> 6692 bytes
+ ...rtaa-Regular-new.no-prune-unicode-ranges.61.ttf | Bin 6328 -> 6328 bytes
+ ...rtaa-Regular-new.no-prune-unicode-ranges.62.ttf | Bin 6200 -> 6200 bytes
+ ...rtaa-Regular-new.no-prune-unicode-ranges.63.ttf | Bin 6256 -> 6256 bytes
+ ...o-prune-unicode-ranges.retain-all-codepoint.ttf | Bin 222756 -> 222756 bytes
+ ...mfortaa-Regular-new.notdef-outline.61,62,63.ttf | Bin 7652 -> 7652 bytes
+ .../Comfortaa-Regular-new.notdef-outline.61,63.ttf | Bin 7284 -> 7284 bytes
+ .../Comfortaa-Regular-new.notdef-outline.61.ttf    | Bin 6920 -> 6920 bytes
+ .../Comfortaa-Regular-new.notdef-outline.62.ttf    | Bin 6796 -> 6796 bytes
+ .../Comfortaa-Regular-new.notdef-outline.63.ttf    | Bin 6844 -> 6844 bytes
+ ...lar-new.notdef-outline.retain-all-codepoint.ttf | Bin 223352 -> 223352 bytes
+ .../Comfortaa-Regular-new.retain-gids.61,62,63.ttf | Bin 9068 -> 9068 bytes
+ .../Comfortaa-Regular-new.retain-gids.61,63.ttf    | Bin 8708 -> 8708 bytes
+ .../Comfortaa-Regular-new.retain-gids.61.ttf       | Bin 8076 -> 8076 bytes
+ .../Comfortaa-Regular-new.retain-gids.62.ttf       | Bin 8200 -> 8200 bytes
+ .../Comfortaa-Regular-new.retain-gids.63.ttf       | Bin 8260 -> 8260 bytes
+ ...egular-new.retain-gids.retain-all-codepoint.ttf | Bin 222804 -> 222804 bytes
+ ...numMyeongjo-Regular-subset.default.61,62,63.ttf | Bin 4128 -> 4128 bytes
+ .../NanumMyeongjo-Regular-subset.default.61,63.ttf | Bin 3580 -> 3580 bytes
+ .../NanumMyeongjo-Regular-subset.default.61.ttf    | Bin 3156 -> 3156 bytes
+ .../NanumMyeongjo-Regular-subset.default.62.ttf    | Bin 3180 -> 3180 bytes
+ .../NanumMyeongjo-Regular-subset.default.63.ttf    | Bin 3048 -> 3048 bytes
+ ...Regular-subset.default.retain-all-codepoint.ttf | Bin 9524 -> 9524 bytes
+ ...ular-subset.drop-hints-retain-gids.61,62,63.ttf | Bin 1452 -> 1452 bytes
+ ...Regular-subset.drop-hints-retain-gids.61,63.ttf | Bin 1284 -> 1284 bytes
+ ...jo-Regular-subset.drop-hints-retain-gids.61.ttf | Bin 1128 -> 1128 bytes
+ ...jo-Regular-subset.drop-hints-retain-gids.62.ttf | Bin 1144 -> 1144 bytes
+ ...jo-Regular-subset.drop-hints-retain-gids.63.ttf | Bin 1116 -> 1116 bytes
+ ...drop-hints-retain-gids.retain-all-codepoint.ttf | Bin 3536 -> 3536 bytes
+ ...Myeongjo-Regular-subset.drop-hints.61,62,63.ttf | Bin 1452 -> 1452 bytes
+ ...numMyeongjo-Regular-subset.drop-hints.61,63.ttf | Bin 1276 -> 1276 bytes
+ .../NanumMyeongjo-Regular-subset.drop-hints.61.ttf | Bin 1128 -> 1128 bytes
+ .../NanumMyeongjo-Regular-subset.drop-hints.62.ttf | Bin 1140 -> 1140 bytes
+ .../NanumMyeongjo-Regular-subset.drop-hints.63.ttf | Bin 1104 -> 1104 bytes
+ ...ular-subset.drop-hints.retain-all-codepoint.ttf | Bin 3536 -> 3536 bytes
+ .../NanumMyeongjo-Regular-subset.gids.61,62,63.ttf | Bin 4128 -> 4128 bytes
+ .../NanumMyeongjo-Regular-subset.gids.61,63.ttf    | Bin 4128 -> 4128 bytes
+ .../NanumMyeongjo-Regular-subset.gids.61.ttf       | Bin 4128 -> 4128 bytes
+ .../NanumMyeongjo-Regular-subset.gids.62.ttf       | Bin 4128 -> 4128 bytes
+ .../NanumMyeongjo-Regular-subset.gids.63.ttf       | Bin 4128 -> 4128 bytes
+ ...jo-Regular-subset.gids.retain-all-codepoint.ttf | Bin 9524 -> 9524 bytes
+ ...yeongjo-Regular-subset.glyph-names.61,62,63.ttf | Bin 4128 -> 4128 bytes
+ ...umMyeongjo-Regular-subset.glyph-names.61,63.ttf | Bin 3580 -> 3580 bytes
+ ...NanumMyeongjo-Regular-subset.glyph-names.61.ttf | Bin 3156 -> 3156 bytes
+ ...NanumMyeongjo-Regular-subset.glyph-names.62.ttf | Bin 3180 -> 3180 bytes
+ ...NanumMyeongjo-Regular-subset.glyph-names.63.ttf | Bin 3048 -> 3048 bytes
+ ...lar-subset.glyph-names.retain-all-codepoint.ttf | Bin 9524 -> 9524 bytes
+ ...ar-subset.keep-all-layout-features.61,62,63.ttf | Bin 4128 -> 4128 bytes
+ ...gular-subset.keep-all-layout-features.61,63.ttf | Bin 3580 -> 3580 bytes
+ ...-Regular-subset.keep-all-layout-features.61.ttf | Bin 3156 -> 3156 bytes
+ ...-Regular-subset.keep-all-layout-features.62.ttf | Bin 3180 -> 3180 bytes
+ ...-Regular-subset.keep-all-layout-features.63.ttf | Bin 3048 -> 3048 bytes
+ ...ep-all-layout-features.retain-all-codepoint.ttf | Bin 9524 -> 9524 bytes
+ ...gjo-Regular-subset.layout-features.61,62,63.ttf | Bin 4128 -> 4128 bytes
+ ...eongjo-Regular-subset.layout-features.61,63.ttf | Bin 3580 -> 3580 bytes
+ ...mMyeongjo-Regular-subset.layout-features.61.ttf | Bin 3156 -> 3156 bytes
+ ...mMyeongjo-Regular-subset.layout-features.62.ttf | Bin 3180 -> 3180 bytes
+ ...mMyeongjo-Regular-subset.layout-features.63.ttf | Bin 3048 -> 3048 bytes
+ ...subset.layout-features.retain-all-codepoint.ttf | Bin 9524 -> 9524 bytes
+ ...umMyeongjo-Regular-subset.name-ids.61,62,63.ttf | Bin 3924 -> 3924 bytes
+ ...NanumMyeongjo-Regular-subset.name-ids.61,63.ttf | Bin 3376 -> 3376 bytes
+ .../NanumMyeongjo-Regular-subset.name-ids.61.ttf   | Bin 2952 -> 2952 bytes
+ .../NanumMyeongjo-Regular-subset.name-ids.62.ttf   | Bin 2976 -> 2976 bytes
+ .../NanumMyeongjo-Regular-subset.name-ids.63.ttf   | Bin 2844 -> 2844 bytes
+ ...egular-subset.name-ids.retain-all-codepoint.ttf | Bin 9320 -> 9320 bytes
+ ...ngjo-Regular-subset.name-languages.61,62,63.ttf | Bin 4172 -> 4172 bytes
+ ...yeongjo-Regular-subset.name-languages.61,63.ttf | Bin 3624 -> 3624 bytes
+ ...umMyeongjo-Regular-subset.name-languages.61.ttf | Bin 3200 -> 3200 bytes
+ ...umMyeongjo-Regular-subset.name-languages.62.ttf | Bin 3224 -> 3224 bytes
+ ...umMyeongjo-Regular-subset.name-languages.63.ttf | Bin 3092 -> 3092 bytes
+ ...-subset.name-languages.retain-all-codepoint.ttf | Bin 9568 -> 9568 bytes
+ ...yeongjo-Regular-subset.name-legacy.61,62,63.ttf | Bin 4128 -> 4128 bytes
+ ...umMyeongjo-Regular-subset.name-legacy.61,63.ttf | Bin 3580 -> 3580 bytes
+ ...NanumMyeongjo-Regular-subset.name-legacy.61.ttf | Bin 3156 -> 3156 bytes
+ ...NanumMyeongjo-Regular-subset.name-legacy.62.ttf | Bin 3180 -> 3180 bytes
+ ...NanumMyeongjo-Regular-subset.name-legacy.63.ttf | Bin 3048 -> 3048 bytes
+ ...lar-subset.name-legacy.retain-all-codepoint.ttf | Bin 9524 -> 9524 bytes
+ ...lar-subset.no-prune-unicode-ranges.61,62,63.ttf | Bin 4128 -> 4128 bytes
+ ...egular-subset.no-prune-unicode-ranges.61,63.ttf | Bin 3580 -> 3580 bytes
+ ...o-Regular-subset.no-prune-unicode-ranges.61.ttf | Bin 3156 -> 3156 bytes
+ ...o-Regular-subset.no-prune-unicode-ranges.62.ttf | Bin 3180 -> 3180 bytes
+ ...o-Regular-subset.no-prune-unicode-ranges.63.ttf | Bin 3048 -> 3048 bytes
+ ...o-prune-unicode-ranges.retain-all-codepoint.ttf | Bin 9524 -> 9524 bytes
+ ...ngjo-Regular-subset.notdef-outline.61,62,63.ttf | Bin 4128 -> 4128 bytes
+ ...yeongjo-Regular-subset.notdef-outline.61,63.ttf | Bin 3580 -> 3580 bytes
+ ...umMyeongjo-Regular-subset.notdef-outline.61.ttf | Bin 3156 -> 3156 bytes
+ ...umMyeongjo-Regular-subset.notdef-outline.62.ttf | Bin 3180 -> 3180 bytes
+ ...umMyeongjo-Regular-subset.notdef-outline.63.ttf | Bin 3048 -> 3048 bytes
+ ...-subset.notdef-outline.retain-all-codepoint.ttf | Bin 9524 -> 9524 bytes
+ ...yeongjo-Regular-subset.retain-gids.61,62,63.ttf | Bin 4128 -> 4128 bytes
+ ...umMyeongjo-Regular-subset.retain-gids.61,63.ttf | Bin 3588 -> 3588 bytes
+ ...NanumMyeongjo-Regular-subset.retain-gids.61.ttf | Bin 3156 -> 3156 bytes
+ ...NanumMyeongjo-Regular-subset.retain-gids.62.ttf | Bin 3184 -> 3184 bytes
+ ...NanumMyeongjo-Regular-subset.retain-gids.63.ttf | Bin 3060 -> 3060 bytes
+ ...lar-subset.retain-gids.retain-all-codepoint.ttf | Bin 9524 -> 9524 bytes
+ .../basics/Roboto-Regular.abc.default.61,62,63.ttf | Bin 2412 -> 2412 bytes
+ .../basics/Roboto-Regular.abc.default.61,63.ttf    | Bin 2208 -> 2208 bytes
+ .../basics/Roboto-Regular.abc.default.61.ttf       | Bin 2008 -> 2008 bytes
+ .../basics/Roboto-Regular.abc.default.62.ttf       | Bin 1876 -> 1876 bytes
+ .../basics/Roboto-Regular.abc.default.63.ttf       | Bin 1932 -> 1932 bytes
+ ...to-Regular.abc.default.retain-all-codepoint.ttf | Bin 2412 -> 2412 bytes
+ ...Regular.abc.drop-hints-retain-gids.61,62,63.ttf | Bin 1152 -> 1152 bytes
+ ...to-Regular.abc.drop-hints-retain-gids.61,63.ttf | Bin 1072 -> 1072 bytes
+ ...oboto-Regular.abc.drop-hints-retain-gids.61.ttf | Bin 944 -> 944 bytes
+ ...oboto-Regular.abc.drop-hints-retain-gids.62.ttf | Bin 840 -> 840 bytes
+ ...oboto-Regular.abc.drop-hints-retain-gids.63.ttf | Bin 928 -> 928 bytes
+ ...drop-hints-retain-gids.retain-all-codepoint.ttf | Bin 1152 -> 1152 bytes
+ .../Roboto-Regular.abc.drop-hints.61,62,63.ttf     | Bin 1152 -> 1152 bytes
+ .../basics/Roboto-Regular.abc.drop-hints.61,63.ttf | Bin 1056 -> 1056 bytes
+ .../basics/Roboto-Regular.abc.drop-hints.61.ttf    | Bin 944 -> 944 bytes
+ .../basics/Roboto-Regular.abc.drop-hints.62.ttf    | Bin 836 -> 836 bytes
+ .../basics/Roboto-Regular.abc.drop-hints.63.ttf    | Bin 916 -> 916 bytes
+ ...Regular.abc.drop-hints.retain-all-codepoint.ttf | Bin 1152 -> 1152 bytes
+ .../basics/Roboto-Regular.abc.gids.61,62,63.ttf    | Bin 2412 -> 2412 bytes
+ .../basics/Roboto-Regular.abc.gids.61,63.ttf       | Bin 2412 -> 2412 bytes
+ .../expected/basics/Roboto-Regular.abc.gids.61.ttf | Bin 2412 -> 2412 bytes
+ .../expected/basics/Roboto-Regular.abc.gids.62.ttf | Bin 2412 -> 2412 bytes
+ .../expected/basics/Roboto-Regular.abc.gids.63.ttf | Bin 2412 -> 2412 bytes
+ ...oboto-Regular.abc.gids.retain-all-codepoint.ttf | Bin 2412 -> 2412 bytes
+ .../Roboto-Regular.abc.glyph-names.61,62,63.ttf    | Bin 2412 -> 2412 bytes
+ .../Roboto-Regular.abc.glyph-names.61,63.ttf       | Bin 2208 -> 2208 bytes
+ .../basics/Roboto-Regular.abc.glyph-names.61.ttf   | Bin 2008 -> 2008 bytes
+ .../basics/Roboto-Regular.abc.glyph-names.62.ttf   | Bin 1876 -> 1876 bytes
+ .../basics/Roboto-Regular.abc.glyph-names.63.ttf   | Bin 1932 -> 1932 bytes
+ ...egular.abc.glyph-names.retain-all-codepoint.ttf | Bin 2412 -> 2412 bytes
+ ...gular.abc.keep-all-layout-features.61,62,63.ttf | Bin 2412 -> 2412 bytes
+ ...-Regular.abc.keep-all-layout-features.61,63.ttf | Bin 2208 -> 2208 bytes
+ ...oto-Regular.abc.keep-all-layout-features.61.ttf | Bin 2008 -> 2008 bytes
+ ...oto-Regular.abc.keep-all-layout-features.62.ttf | Bin 1876 -> 1876 bytes
+ ...oto-Regular.abc.keep-all-layout-features.63.ttf | Bin 1932 -> 1932 bytes
+ ...ep-all-layout-features.retain-all-codepoint.ttf | Bin 2412 -> 2412 bytes
+ ...Roboto-Regular.abc.layout-features.61,62,63.ttf | Bin 2412 -> 2412 bytes
+ .../Roboto-Regular.abc.layout-features.61,63.ttf   | Bin 2208 -> 2208 bytes
+ .../Roboto-Regular.abc.layout-features.61.ttf      | Bin 2008 -> 2008 bytes
+ .../Roboto-Regular.abc.layout-features.62.ttf      | Bin 1876 -> 1876 bytes
+ .../Roboto-Regular.abc.layout-features.63.ttf      | Bin 1932 -> 1932 bytes
+ ...ar.abc.layout-features.retain-all-codepoint.ttf | Bin 2412 -> 2412 bytes
+ .../Roboto-Regular.abc.name-ids.61,62,63.ttf       | Bin 2412 -> 2412 bytes
+ .../basics/Roboto-Regular.abc.name-ids.61,63.ttf   | Bin 2208 -> 2208 bytes
+ .../basics/Roboto-Regular.abc.name-ids.61.ttf      | Bin 2008 -> 2008 bytes
+ .../basics/Roboto-Regular.abc.name-ids.62.ttf      | Bin 1876 -> 1876 bytes
+ .../basics/Roboto-Regular.abc.name-ids.63.ttf      | Bin 1932 -> 1932 bytes
+ ...o-Regular.abc.name-ids.retain-all-codepoint.ttf | Bin 2412 -> 2412 bytes
+ .../Roboto-Regular.abc.name-languages.61,62,63.ttf | Bin 2412 -> 2412 bytes
+ .../Roboto-Regular.abc.name-languages.61,63.ttf    | Bin 2208 -> 2208 bytes
+ .../Roboto-Regular.abc.name-languages.61.ttf       | Bin 2008 -> 2008 bytes
+ .../Roboto-Regular.abc.name-languages.62.ttf       | Bin 1876 -> 1876 bytes
+ .../Roboto-Regular.abc.name-languages.63.ttf       | Bin 1932 -> 1932 bytes
+ ...lar.abc.name-languages.retain-all-codepoint.ttf | Bin 2412 -> 2412 bytes
+ .../Roboto-Regular.abc.name-legacy.61,62,63.ttf    | Bin 2412 -> 2412 bytes
+ .../Roboto-Regular.abc.name-legacy.61,63.ttf       | Bin 2208 -> 2208 bytes
+ .../basics/Roboto-Regular.abc.name-legacy.61.ttf   | Bin 2008 -> 2008 bytes
+ .../basics/Roboto-Regular.abc.name-legacy.62.ttf   | Bin 1876 -> 1876 bytes
+ .../basics/Roboto-Regular.abc.name-legacy.63.ttf   | Bin 1932 -> 1932 bytes
+ ...egular.abc.name-legacy.retain-all-codepoint.ttf | Bin 2412 -> 2412 bytes
+ ...egular.abc.no-prune-unicode-ranges.61,62,63.ttf | Bin 2412 -> 2412 bytes
+ ...o-Regular.abc.no-prune-unicode-ranges.61,63.ttf | Bin 2208 -> 2208 bytes
+ ...boto-Regular.abc.no-prune-unicode-ranges.61.ttf | Bin 2008 -> 2008 bytes
+ ...boto-Regular.abc.no-prune-unicode-ranges.62.ttf | Bin 1876 -> 1876 bytes
+ ...boto-Regular.abc.no-prune-unicode-ranges.63.ttf | Bin 1932 -> 1932 bytes
+ ...o-prune-unicode-ranges.retain-all-codepoint.ttf | Bin 2412 -> 2412 bytes
+ .../Roboto-Regular.abc.notdef-outline.61,62,63.ttf | Bin 2412 -> 2412 bytes
+ .../Roboto-Regular.abc.notdef-outline.61,63.ttf    | Bin 2208 -> 2208 bytes
+ .../Roboto-Regular.abc.notdef-outline.61.ttf       | Bin 2008 -> 2008 bytes
+ .../Roboto-Regular.abc.notdef-outline.62.ttf       | Bin 1876 -> 1876 bytes
+ .../Roboto-Regular.abc.notdef-outline.63.ttf       | Bin 1932 -> 1932 bytes
+ ...lar.abc.notdef-outline.retain-all-codepoint.ttf | Bin 2412 -> 2412 bytes
+ .../Roboto-Regular.abc.retain-gids.61,62,63.ttf    | Bin 2412 -> 2412 bytes
+ .../Roboto-Regular.abc.retain-gids.61,63.ttf       | Bin 2224 -> 2224 bytes
+ .../basics/Roboto-Regular.abc.retain-gids.61.ttf   | Bin 2008 -> 2008 bytes
+ .../basics/Roboto-Regular.abc.retain-gids.62.ttf   | Bin 1884 -> 1884 bytes
+ .../basics/Roboto-Regular.abc.retain-gids.63.ttf   | Bin 1948 -> 1948 bytes
+ ...egular.abc.retain-gids.retain-all-codepoint.ttf | Bin 2412 -> 2412 bytes
+ .../cmap/AdobeBlank-Regular.default.61,62.ttf      | Bin 1208 -> 1208 bytes
+ .../cmap/AdobeBlank-Regular.default.61,FEFA.ttf    | Bin 1264 -> 1264 bytes
+ .../cmap/AdobeBlank-Regular.default.FEE6,FECF.ttf  | Bin 1216 -> 1216 bytes
+ .../cmap/AdobeBlank-Regular.default.FEF9,FEFA.ttf  | Bin 1204 -> 1204 bytes
+ .../cmap/AdobeBlank-Regular.default.FEFA.ttf       | Bin 1184 -> 1184 bytes
+ ...eBlank-Regular.drop-hints-retain-gids.61,62.ttf | Bin 1424 -> 1424 bytes
+ ...lank-Regular.drop-hints-retain-gids.61,FEFA.ttf | Bin 8232 -> 8232 bytes
+ ...nk-Regular.drop-hints-retain-gids.FEE6,FECF.ttf | Bin 8104 -> 8104 bytes
+ ...nk-Regular.drop-hints-retain-gids.FEF9,FEFA.ttf | Bin 8172 -> 8172 bytes
+ ...beBlank-Regular.drop-hints-retain-gids.FEFA.ttf | Bin 8156 -> 8156 bytes
+ .../cmap/AdobeBlank-Regular.drop-hints.61,62.ttf   | Bin 1036 -> 1036 bytes
+ .../cmap/AdobeBlank-Regular.drop-hints.61,FEFA.ttf | Bin 1092 -> 1092 bytes
+ .../AdobeBlank-Regular.drop-hints.FEE6,FECF.ttf    | Bin 1044 -> 1044 bytes
+ .../AdobeBlank-Regular.drop-hints.FEF9,FEFA.ttf    | Bin 1032 -> 1032 bytes
+ .../cmap/AdobeBlank-Regular.drop-hints.FEFA.ttf    | Bin 1012 -> 1012 bytes
+ .../cmap/AdobeBlank-Regular.name-ids.61,62.ttf     | Bin 956 -> 956 bytes
+ .../cmap/AdobeBlank-Regular.name-ids.61,FEFA.ttf   | Bin 1012 -> 1012 bytes
+ .../cmap/AdobeBlank-Regular.name-ids.FEE6,FECF.ttf | Bin 964 -> 964 bytes
+ .../cmap/AdobeBlank-Regular.name-ids.FEF9,FEFA.ttf | Bin 952 -> 952 bytes
+ .../cmap/AdobeBlank-Regular.name-ids.FEFA.ttf      | Bin 932 -> 932 bytes
+ .../cmap/AdobeBlank-Regular.retain-gids.61,62.ttf  | Bin 1596 -> 1596 bytes
+ .../AdobeBlank-Regular.retain-gids.61,FEFA.ttf     | Bin 8404 -> 8404 bytes
+ .../AdobeBlank-Regular.retain-gids.FEE6,FECF.ttf   | Bin 8276 -> 8276 bytes
+ .../AdobeBlank-Regular.retain-gids.FEF9,FEFA.ttf   | Bin 8344 -> 8344 bytes
+ .../cmap/AdobeBlank-Regular.retain-gids.FEFA.ttf   | Bin 8328 -> 8328 bytes
+ .../TwemojiMozilla.subset.default.32,3297,3299.ttf | Bin 1868 -> 1868 bytes
+ .../colr/TwemojiMozilla.subset.default.32,3297.ttf | Bin 1344 -> 1344 bytes
+ .../colr/TwemojiMozilla.subset.default.32,3299.ttf | Bin 1520 -> 1520 bytes
+ .../colr/TwemojiMozilla.subset.default.32.ttf      | Bin 888 -> 888 bytes
+ .../TwemojiMozilla.subset.default.3297,3299.ttf    | Bin 1860 -> 1860 bytes
+ .../colr/TwemojiMozilla.subset.default.3297.ttf    | Bin 1332 -> 1332 bytes
+ .../colr/TwemojiMozilla.subset.default.3299.ttf    | Bin 1508 -> 1508 bytes
+ ....subset.drop-hints-retain-gids.32,3297,3299.ttf | Bin 1848 -> 1848 bytes
+ ...zilla.subset.drop-hints-retain-gids.32,3297.ttf | Bin 1340 -> 1340 bytes
+ ...zilla.subset.drop-hints-retain-gids.32,3299.ttf | Bin 1520 -> 1520 bytes
+ ...ojiMozilla.subset.drop-hints-retain-gids.32.ttf | Bin 868 -> 868 bytes
+ ...lla.subset.drop-hints-retain-gids.3297,3299.ttf | Bin 1844 -> 1844 bytes
+ ...iMozilla.subset.drop-hints-retain-gids.3297.ttf | Bin 1328 -> 1328 bytes
+ ...iMozilla.subset.drop-hints-retain-gids.3299.ttf | Bin 1508 -> 1508 bytes
+ ...emojiMozilla.subset.drop-hints.32,3297,3299.ttf | Bin 1848 -> 1848 bytes
+ .../TwemojiMozilla.subset.drop-hints.32,3297.ttf   | Bin 1324 -> 1324 bytes
+ .../TwemojiMozilla.subset.drop-hints.32,3299.ttf   | Bin 1500 -> 1500 bytes
+ .../colr/TwemojiMozilla.subset.drop-hints.32.ttf   | Bin 868 -> 868 bytes
+ .../TwemojiMozilla.subset.drop-hints.3297,3299.ttf | Bin 1840 -> 1840 bytes
+ .../colr/TwemojiMozilla.subset.drop-hints.3297.ttf | Bin 1312 -> 1312 bytes
+ .../colr/TwemojiMozilla.subset.drop-hints.3299.ttf | Bin 1488 -> 1488 bytes
+ ...mojiMozilla.subset.retain-gids.32,3297,3299.ttf | Bin 1868 -> 1868 bytes
+ .../TwemojiMozilla.subset.retain-gids.32,3297.ttf  | Bin 1360 -> 1360 bytes
+ .../TwemojiMozilla.subset.retain-gids.32,3299.ttf  | Bin 1540 -> 1540 bytes
+ .../colr/TwemojiMozilla.subset.retain-gids.32.ttf  | Bin 888 -> 888 bytes
+ ...TwemojiMozilla.subset.retain-gids.3297,3299.ttf | Bin 1864 -> 1864 bytes
+ .../TwemojiMozilla.subset.retain-gids.3297.ttf     | Bin 1348 -> 1348 bytes
+ .../TwemojiMozilla.subset.retain-gids.3299.ttf     | Bin 1528 -> 1528 bytes
+ .../colr_with_components/colr-table.default.6B.ttf | Bin 4260 -> 4260 bytes
+ .../colr-table.drop-hints-retain-gids.6B.ttf       | Bin 4984 -> 4984 bytes
+ .../colr-table.drop-hints.6B.ttf                   | Bin 4260 -> 4260 bytes
+ .../colr-table.retain-gids.6B.ttf                  | Bin 4984 -> 4984 bytes
+ .../Roboto-Regular.default.1FC,21,41,20,62,63.ttf  | Bin 3004 -> 3004 bytes
+ .../full-font/Roboto-Regular.default.61,62,63.ttf  | Bin 2632 -> 2632 bytes
+ .../Roboto-Regular.default.D7,D8,D9,DA,DE.ttf      | Bin 2960 -> 2960 bytes
+ ...oboto-Regular.drop-hints.1FC,21,41,20,62,63.ttf | Bin 1556 -> 1556 bytes
+ .../Roboto-Regular.drop-hints.61,62,63.ttf         | Bin 1372 -> 1372 bytes
+ .../Roboto-Regular.drop-hints.D7,D8,D9,DA,DE.ttf   | Bin 1584 -> 1584 bytes
+ ...ifVariable-Roman.default.1FC,21,41,20,62,63.ttf | Bin 3888 -> 3888 bytes
+ .../SourceSerifVariable-Roman.default.61,62,63.ttf | Bin 3784 -> 3784 bytes
+ ...eSerifVariable-Roman.default.D7,D8,D9,DA,DE.ttf | Bin 4324 -> 4324 bytes
+ ...ariable-Roman.drop-hints.1FC,21,41,20,62,63.ttf | Bin 3876 -> 3876 bytes
+ ...urceSerifVariable-Roman.drop-hints.61,62,63.ttf | Bin 3784 -> 3784 bytes
+ ...rifVariable-Roman.drop-hints.D7,D8,D9,DA,DE.ttf | Bin 4324 -> 4324 bytes
+ .../Mplus1p-Regular.default.1D715,1D7D8,41,42.ttf  | Bin 2340 -> 2340 bytes
+ .../japanese/Mplus1p-Regular.default.25771.ttf     | Bin 1988 -> 1988 bytes
+ ...gular.default.3042,3044,3046,3048,304A,304B.ttf | Bin 2616 -> 2616 bytes
+ ...gular.default.3042,3044,3046,73E0,5EA6,8F38.ttf | Bin 2848 -> 2848 bytes
+ .../Mplus1p-Regular.default.61,63,65,6B.ttf        | Bin 2248 -> 2248 bytes
+ ...gular.default.660E,6975,73E0,5EA6,8F38,6E05.ttf | Bin 3144 -> 3144 bytes
+ .../japanese/Mplus1p-Regular.default.660E.ttf      | Bin 1944 -> 1944 bytes
+ ...plus1p-Regular.drop-hints.1D715,1D7D8,41,42.ttf | Bin 1612 -> 1612 bytes
+ .../japanese/Mplus1p-Regular.drop-hints.25771.ttf  | Bin 1260 -> 1260 bytes
+ ...ar.drop-hints.3042,3044,3046,3048,304A,304B.ttf | Bin 1888 -> 1888 bytes
+ ...ar.drop-hints.3042,3044,3046,73E0,5EA6,8F38.ttf | Bin 2120 -> 2120 bytes
+ .../Mplus1p-Regular.drop-hints.61,63,65,6B.ttf     | Bin 1520 -> 1520 bytes
+ ...ar.drop-hints.660E,6975,73E0,5EA6,8F38,6E05.ttf | Bin 2416 -> 2416 bytes
+ .../japanese/Mplus1p-Regular.drop-hints.660E.ttf   | Bin 1216 -> 1216 bytes
+ ...Mplus1p-Regular.keep-gdef.1D715,1D7D8,41,42.ttf | Bin 2340 -> 2340 bytes
+ .../japanese/Mplus1p-Regular.keep-gdef.25771.ttf   | Bin 1988 -> 1988 bytes
+ ...lar.keep-gdef.3042,3044,3046,3048,304A,304B.ttf | Bin 2616 -> 2616 bytes
+ ...lar.keep-gdef.3042,3044,3046,73E0,5EA6,8F38.ttf | Bin 2848 -> 2848 bytes
+ .../Mplus1p-Regular.keep-gdef.61,63,65,6B.ttf      | Bin 2248 -> 2248 bytes
+ ...lar.keep-gdef.660E,6975,73E0,5EA6,8F38,6E05.ttf | Bin 3144 -> 3144 bytes
+ .../japanese/Mplus1p-Regular.keep-gdef.660E.ttf    | Bin 1944 -> 1944 bytes
+ .../IndicTestJalandhar-Regular.default.A01.ttf     | Bin 4172 -> 4172 bytes
+ .../IndicTestJalandhar-Regular.default.A05,A06.ttf | Bin 4748 -> 4748 bytes
+ .../IndicTestJalandhar-Regular.default.A07,A1B.ttf | Bin 4720 -> 4720 bytes
+ ...andhar-Regular.default.retain-all-codepoint.ttf | Bin 49248 -> 49248 bytes
+ .../IndicTestJalandhar-Regular.drop-hints.A01.ttf  | Bin 1032 -> 1032 bytes
+ ...dicTestJalandhar-Regular.drop-hints.A05,A06.ttf | Bin 1340 -> 1340 bytes
+ ...dicTestJalandhar-Regular.drop-hints.A07,A1B.ttf | Bin 1340 -> 1340 bytes
+ ...har-Regular.drop-hints.retain-all-codepoint.ttf | Bin 29468 -> 29468 bytes
+ .../IndicTestJalandhar-Regular.keep-gdef.A01.ttf   | Bin 4172 -> 4172 bytes
+ ...ndicTestJalandhar-Regular.keep-gdef.A05,A06.ttf | Bin 4748 -> 4748 bytes
+ ...ndicTestJalandhar-Regular.keep-gdef.A07,A1B.ttf | Bin 4720 -> 4720 bytes
+ ...dhar-Regular.keep-gdef.retain-all-codepoint.ttf | Bin 49248 -> 49248 bytes
+ .../Roboto-Regular.default.1E00,303.ttf            | Bin 2472 -> 2472 bytes
+ .../layout.gdef/Roboto-Regular.default.303.ttf     | Bin 2076 -> 2076 bytes
+ .../Roboto-Regular.default.309,20,30F.ttf          | Bin 2148 -> 2148 bytes
+ .../layout.gdef/Roboto-Regular.default.323.ttf     | Bin 1968 -> 1968 bytes
+ .../Roboto-Regular.default.41,42,43.ttf            | Bin 2532 -> 2532 bytes
+ .../Roboto-Regular.drop-hints.1E00,303.ttf         | Bin 1328 -> 1328 bytes
+ .../layout.gdef/Roboto-Regular.drop-hints.303.ttf  | Bin 1072 -> 1072 bytes
+ .../Roboto-Regular.drop-hints.309,20,30F.ttf       | Bin 1108 -> 1108 bytes
+ .../layout.gdef/Roboto-Regular.drop-hints.323.ttf  | Bin 1016 -> 1016 bytes
+ .../Roboto-Regular.drop-hints.41,42,43.ttf         | Bin 1348 -> 1348 bytes
+ .../Roboto-Regular.keep-gdef-gpos.1E00,303.ttf     | Bin 2472 -> 2472 bytes
+ .../Roboto-Regular.keep-gdef-gpos.303.ttf          | Bin 2076 -> 2076 bytes
+ .../Roboto-Regular.keep-gdef-gpos.309,20,30F.ttf   | Bin 2148 -> 2148 bytes
+ .../Roboto-Regular.keep-gdef-gpos.323.ttf          | Bin 1968 -> 1968 bytes
+ .../Roboto-Regular.keep-gdef-gpos.41,42,43.ttf     | Bin 2532 -> 2532 bytes
+ ...ular.default.627,644,623,62D,644,627,645,2E.ttf | Bin 12592 -> 12592 bytes
+ .../Amiri-Regular.default.627,644,62D,628.ttf      | Bin 9924 -> 9924 bytes
+ .../Amiri-Regular.default.627,644.ttf              | Bin 4112 -> 4112 bytes
+ ...-Regular.default.633,645,627,621,20,644,627.ttf | Bin 9424 -> 9424 bytes
+ .../Amiri-Regular.default.63A,64A,631.ttf          | Bin 7256 -> 7256 bytes
+ ....retain-gids.627,644,623,62D,644,627,645,2E.ttf | Bin 47920 -> 47920 bytes
+ .../Amiri-Regular.retain-gids.627,644,62D,628.ttf  | Bin 42572 -> 42572 bytes
+ .../Amiri-Regular.retain-gids.627,644.ttf          | Bin 36640 -> 36640 bytes
+ ...ular.retain-gids.633,645,627,621,20,644,627.ttf | Bin 45816 -> 45816 bytes
+ .../Amiri-Regular.retain-gids.63A,64A,631.ttf      | Bin 37920 -> 37920 bytes
+ .../expected/layout.khmer/Khmer.default.1780.ttf   | Bin 4200 -> 4200 bytes
+ ...ult.1789,17BB,17C6,1794,17B6,1793,1798,17BE.ttf | Bin 6408 -> 6408 bytes
+ .../expected/layout.khmer/Khmer.default.31.ttf     | Bin 4136 -> 4136 bytes
+ .../layout.khmer/Khmer.retain-gids.1780.ttf        | Bin 4460 -> 4460 bytes
+ ...ids.1789,17BB,17C6,1794,17B6,1793,1798,17BE.ttf | Bin 7844 -> 7844 bytes
+ .../expected/layout.khmer/Khmer.retain-gids.31.ttf | Bin 4252 -> 4252 bytes
+ ...Bold.default.627,644,623,62D,644,627,645,2E.ttf | Bin 11388 -> 11388 bytes
+ ...toNastaliqUrdu-Bold.default.627,644,62D,628.ttf | Bin 17688 -> 17688 bytes
+ .../NotoNastaliqUrdu-Bold.default.627,644.ttf      | Bin 3520 -> 3520 bytes
+ ...rdu-Bold.default.633,645,627,621,20,644,627.ttf | Bin 12380 -> 12380 bytes
+ .../NotoNastaliqUrdu-Bold.default.63A,64A,631.ttf  | Bin 19380 -> 19380 bytes
+ ....retain-gids.627,644,623,62D,644,627,645,2E.ttf | Bin 18224 -> 18224 bytes
+ ...staliqUrdu-Bold.retain-gids.627,644,62D,628.ttf | Bin 23748 -> 23748 bytes
+ .../NotoNastaliqUrdu-Bold.retain-gids.627,644.ttf  | Bin 9164 -> 9164 bytes
+ ...Bold.retain-gids.633,645,627,621,20,644,627.ttf | Bin 18184 -> 18184 bytes
+ ...toNastaliqUrdu-Bold.retain-gids.63A,64A,631.ttf | Bin 25432 -> 25432 bytes
+ .../Roboto-Regular.smallcaps.default.41,42,43.ttf  | Bin 2424 -> 2424 bytes
+ .../Roboto-Regular.smallcaps.default.41,43.ttf     | Bin 2232 -> 2232 bytes
+ .../layout/Roboto-Regular.smallcaps.default.41.ttf | Bin 2044 -> 2044 bytes
+ .../layout/Roboto-Regular.smallcaps.default.43.ttf | Bin 2076 -> 2076 bytes
+ .../Roboto-Regular.smallcaps.default.CA,CB.ttf     | Bin 2348 -> 2348 bytes
+ ...boto-Regular.smallcaps.retain-gids.41,42,43.ttf | Bin 2676 -> 2676 bytes
+ .../Roboto-Regular.smallcaps.retain-gids.41,43.ttf | Bin 2496 -> 2496 bytes
+ .../Roboto-Regular.smallcaps.retain-gids.41.ttf    | Bin 2296 -> 2296 bytes
+ .../Roboto-Regular.smallcaps.retain-gids.43.ttf    | Bin 2344 -> 2344 bytes
+ .../Roboto-Regular.smallcaps.retain-gids.CA,CB.ttf | Bin 6436 -> 6436 bytes
+ .../data/expected/sbix/sbix.default.58,59.ttf      | Bin 193528 -> 193528 bytes
+ test/subset/data/expected/sbix/sbix.default.58.ttf | Bin 121168 -> 121168 bytes
+ test/subset/data/expected/sbix/sbix.default.59.ttf | Bin 89364 -> 89364 bytes
+ .../sbix/sbix.drop-hints-retain-gids.58,59.ttf     | Bin 193528 -> 193528 bytes
+ .../sbix/sbix.drop-hints-retain-gids.58.ttf        | Bin 121168 -> 121168 bytes
+ .../sbix/sbix.drop-hints-retain-gids.59.ttf        | Bin 89404 -> 89404 bytes
+ .../data/expected/sbix/sbix.drop-hints.58,59.ttf   | Bin 193528 -> 193528 bytes
+ .../data/expected/sbix/sbix.drop-hints.58.ttf      | Bin 121168 -> 121168 bytes
+ .../data/expected/sbix/sbix.drop-hints.59.ttf      | Bin 89364 -> 89364 bytes
+ .../data/expected/sbix/sbix.retain-gids.58,59.ttf  | Bin 193528 -> 193528 bytes
+ .../data/expected/sbix/sbix.retain-gids.58.ttf     | Bin 121168 -> 121168 bytes
+ .../data/expected/sbix/sbix.retain-gids.59.ttf     | Bin 89404 -> 89404 bytes
+ .../variable/Fraunces.default.26,66,69,124,125.ttf | Bin 15856 -> 15856 bytes
+ .../data/expected/variable/Fraunces.default.61.ttf | Bin 4232 -> 4232 bytes
+ 403 files changed, 41 insertions(+), 26 deletions(-)
+
+commit 368e9578873798e2d17ed78a0474dec7d4e9d6c0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 5 10:16:13 2021 -0600
+
+    [ot-shape] Add comment re `vert` feature
+
+ src/hb-ot-shape.cc | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 2c024dc3cba60eee67fb004e3258cd8e47bd9593
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Aug 4 11:38:38 2021 -0700
+
+    [subset] prune redundant cmap12 subtables.
+    
+    If the post subset cmap12 table is equivalent to another cmap subtable don't include the 12 table in the final subset. Matches change https://github.com/fonttools/fonttools/pull/2146 from fontTools.
+
+ src/hb-ot-cmap-table.hh                            |  96 ++++++++++++++++++++-
+ test/api/fonts/Roboto-Regular.D7,D8,D9,DA,DE.ttf   | Bin 2532 -> 2472 bytes
+ test/api/fonts/Roboto-Regular.abc.ttf              | Bin 2168 -> 2132 bytes
+ test/api/fonts/Roboto-Regular.ac.ttf               | Bin 1988 -> 1940 bytes
+ test/subset/data/Makefile.am                       |   6 +-
+ .../basics/Roboto-Regular.abc.default.61,62,63.ttf | Bin 2448 -> 2412 bytes
+ .../basics/Roboto-Regular.abc.default.61,63.ttf    | Bin 2256 -> 2208 bytes
+ .../basics/Roboto-Regular.abc.default.61.ttf       | Bin 2044 -> 2008 bytes
+ .../basics/Roboto-Regular.abc.default.62.ttf       | Bin 1912 -> 1876 bytes
+ .../basics/Roboto-Regular.abc.default.63.ttf       | Bin 1968 -> 1932 bytes
+ ...to-Regular.abc.default.retain-all-codepoint.ttf | Bin 2448 -> 2412 bytes
+ ...Regular.abc.drop-hints-retain-gids.61,62,63.ttf | Bin 1188 -> 1152 bytes
+ ...to-Regular.abc.drop-hints-retain-gids.61,63.ttf | Bin 1120 -> 1072 bytes
+ ...oboto-Regular.abc.drop-hints-retain-gids.61.ttf | Bin 980 -> 944 bytes
+ ...oboto-Regular.abc.drop-hints-retain-gids.62.ttf | Bin 876 -> 840 bytes
+ ...oboto-Regular.abc.drop-hints-retain-gids.63.ttf | Bin 964 -> 928 bytes
+ ...drop-hints-retain-gids.retain-all-codepoint.ttf | Bin 1188 -> 1152 bytes
+ .../Roboto-Regular.abc.drop-hints.61,62,63.ttf     | Bin 1188 -> 1152 bytes
+ .../basics/Roboto-Regular.abc.drop-hints.61,63.ttf | Bin 1104 -> 1056 bytes
+ .../basics/Roboto-Regular.abc.drop-hints.61.ttf    | Bin 980 -> 944 bytes
+ .../basics/Roboto-Regular.abc.drop-hints.62.ttf    | Bin 872 -> 836 bytes
+ .../basics/Roboto-Regular.abc.drop-hints.63.ttf    | Bin 952 -> 916 bytes
+ ...Regular.abc.drop-hints.retain-all-codepoint.ttf | Bin 1188 -> 1152 bytes
+ .../basics/Roboto-Regular.abc.gids.61,62,63.ttf    | Bin 2448 -> 2412 bytes
+ .../basics/Roboto-Regular.abc.gids.61,63.ttf       | Bin 2448 -> 2412 bytes
+ .../expected/basics/Roboto-Regular.abc.gids.61.ttf | Bin 2448 -> 2412 bytes
+ .../expected/basics/Roboto-Regular.abc.gids.62.ttf | Bin 2448 -> 2412 bytes
+ .../expected/basics/Roboto-Regular.abc.gids.63.ttf | Bin 2448 -> 2412 bytes
+ ...oboto-Regular.abc.gids.retain-all-codepoint.ttf | Bin 2448 -> 2412 bytes
+ .../Roboto-Regular.abc.glyph-names.61,62,63.ttf    | Bin 2448 -> 2412 bytes
+ .../Roboto-Regular.abc.glyph-names.61,63.ttf       | Bin 2256 -> 2208 bytes
+ .../basics/Roboto-Regular.abc.glyph-names.61.ttf   | Bin 2044 -> 2008 bytes
+ .../basics/Roboto-Regular.abc.glyph-names.62.ttf   | Bin 1912 -> 1876 bytes
+ .../basics/Roboto-Regular.abc.glyph-names.63.ttf   | Bin 1968 -> 1932 bytes
+ ...egular.abc.glyph-names.retain-all-codepoint.ttf | Bin 2448 -> 2412 bytes
+ ...gular.abc.keep-all-layout-features.61,62,63.ttf | Bin 2448 -> 2412 bytes
+ ...-Regular.abc.keep-all-layout-features.61,63.ttf | Bin 2256 -> 2208 bytes
+ ...oto-Regular.abc.keep-all-layout-features.61.ttf | Bin 2044 -> 2008 bytes
+ ...oto-Regular.abc.keep-all-layout-features.62.ttf | Bin 1912 -> 1876 bytes
+ ...oto-Regular.abc.keep-all-layout-features.63.ttf | Bin 1968 -> 1932 bytes
+ ...ep-all-layout-features.retain-all-codepoint.ttf | Bin 2448 -> 2412 bytes
+ ...Roboto-Regular.abc.layout-features.61,62,63.ttf | Bin 2448 -> 2412 bytes
+ .../Roboto-Regular.abc.layout-features.61,63.ttf   | Bin 2256 -> 2208 bytes
+ .../Roboto-Regular.abc.layout-features.61.ttf      | Bin 2044 -> 2008 bytes
+ .../Roboto-Regular.abc.layout-features.62.ttf      | Bin 1912 -> 1876 bytes
+ .../Roboto-Regular.abc.layout-features.63.ttf      | Bin 1968 -> 1932 bytes
+ ...ar.abc.layout-features.retain-all-codepoint.ttf | Bin 2448 -> 2412 bytes
+ .../Roboto-Regular.abc.name-ids.61,62,63.ttf       | Bin 2448 -> 2412 bytes
+ .../basics/Roboto-Regular.abc.name-ids.61,63.ttf   | Bin 2256 -> 2208 bytes
+ .../basics/Roboto-Regular.abc.name-ids.61.ttf      | Bin 2044 -> 2008 bytes
+ .../basics/Roboto-Regular.abc.name-ids.62.ttf      | Bin 1912 -> 1876 bytes
+ .../basics/Roboto-Regular.abc.name-ids.63.ttf      | Bin 1968 -> 1932 bytes
+ ...o-Regular.abc.name-ids.retain-all-codepoint.ttf | Bin 2448 -> 2412 bytes
+ .../Roboto-Regular.abc.name-languages.61,62,63.ttf | Bin 2448 -> 2412 bytes
+ .../Roboto-Regular.abc.name-languages.61,63.ttf    | Bin 2256 -> 2208 bytes
+ .../Roboto-Regular.abc.name-languages.61.ttf       | Bin 2044 -> 2008 bytes
+ .../Roboto-Regular.abc.name-languages.62.ttf       | Bin 1912 -> 1876 bytes
+ .../Roboto-Regular.abc.name-languages.63.ttf       | Bin 1968 -> 1932 bytes
+ ...lar.abc.name-languages.retain-all-codepoint.ttf | Bin 2448 -> 2412 bytes
+ .../Roboto-Regular.abc.name-legacy.61,62,63.ttf    | Bin 2448 -> 2412 bytes
+ .../Roboto-Regular.abc.name-legacy.61,63.ttf       | Bin 2256 -> 2208 bytes
+ .../basics/Roboto-Regular.abc.name-legacy.61.ttf   | Bin 2044 -> 2008 bytes
+ .../basics/Roboto-Regular.abc.name-legacy.62.ttf   | Bin 1912 -> 1876 bytes
+ .../basics/Roboto-Regular.abc.name-legacy.63.ttf   | Bin 1968 -> 1932 bytes
+ ...egular.abc.name-legacy.retain-all-codepoint.ttf | Bin 2448 -> 2412 bytes
+ ...egular.abc.no-prune-unicode-ranges.61,62,63.ttf | Bin 2448 -> 2412 bytes
+ ...o-Regular.abc.no-prune-unicode-ranges.61,63.ttf | Bin 2256 -> 2208 bytes
+ ...boto-Regular.abc.no-prune-unicode-ranges.61.ttf | Bin 2044 -> 2008 bytes
+ ...boto-Regular.abc.no-prune-unicode-ranges.62.ttf | Bin 1912 -> 1876 bytes
+ ...boto-Regular.abc.no-prune-unicode-ranges.63.ttf | Bin 1968 -> 1932 bytes
+ ...o-prune-unicode-ranges.retain-all-codepoint.ttf | Bin 2448 -> 2412 bytes
+ .../Roboto-Regular.abc.notdef-outline.61,62,63.ttf | Bin 2448 -> 2412 bytes
+ .../Roboto-Regular.abc.notdef-outline.61,63.ttf    | Bin 2256 -> 2208 bytes
+ .../Roboto-Regular.abc.notdef-outline.61.ttf       | Bin 2044 -> 2008 bytes
+ .../Roboto-Regular.abc.notdef-outline.62.ttf       | Bin 1912 -> 1876 bytes
+ .../Roboto-Regular.abc.notdef-outline.63.ttf       | Bin 1968 -> 1932 bytes
+ ...lar.abc.notdef-outline.retain-all-codepoint.ttf | Bin 2448 -> 2412 bytes
+ .../Roboto-Regular.abc.retain-gids.61,62,63.ttf    | Bin 2448 -> 2412 bytes
+ .../Roboto-Regular.abc.retain-gids.61,63.ttf       | Bin 2272 -> 2224 bytes
+ .../basics/Roboto-Regular.abc.retain-gids.61.ttf   | Bin 2044 -> 2008 bytes
+ .../basics/Roboto-Regular.abc.retain-gids.62.ttf   | Bin 1920 -> 1884 bytes
+ .../basics/Roboto-Regular.abc.retain-gids.63.ttf   | Bin 1984 -> 1948 bytes
+ ...egular.abc.retain-gids.retain-all-codepoint.ttf | Bin 2448 -> 2412 bytes
+ ...-Regular.drop-hints-desubroutinize.61,62,63.otf | Bin 2004 -> 0 bytes
+ ...ubroutinize-retain-gids.1FC,21,41,20,62,63.otf} | Bin 20220 -> 20128 bytes
+ ...utline-desubroutinize-retain-gids.61,62,63.otf} | Bin 2324 -> 2280 bytes
+ ...-desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf} | Bin 30528 -> 30448 bytes
+ ...-outline-desubroutinize.1FC,21,41,20,62,63.otf} | Bin 2448 -> 2356 bytes
+ ...lar.notdef-outline-desubroutinize.61,62,63.otf} | Bin 2128 -> 2084 bytes
+ ...tdef-outline-desubroutinize.D7,D8,D9,DA,DE.otf} | Bin 2320 -> 2252 bytes
+ ...ubroutinize-retain-gids.1FC,21,41,20,62,63.otf} | Bin 20052 -> 19960 bytes
+ ...-hints-desubroutinize-retain-gids.61,62,63.otf} | Bin 2200 -> 2156 bytes
+ ...-desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf} | Bin 30360 -> 30280 bytes
+ ...op-hints-desubroutinize.1FC,21,41,20,62,63.otf} | Bin 2276 -> 2184 bytes
+ ...-outline-drop-hints-desubroutinize.61,62,63.otf | Bin 0 -> 1960 bytes
+ ...e-drop-hints-desubroutinize.D7,D8,D9,DA,DE.otf} | Bin 2156 -> 2088 bytes
+ ...-drop-hints-retain-gids.1FC,21,41,20,62,63.otf} | Bin 20144 -> 20052 bytes
+ ...ef-outline-drop-hints-retain-gids.61,62,63.otf} | Bin 2240 -> 2196 bytes
+ ...line-drop-hints-retain-gids.D7,D8,D9,DA,DE.otf} | Bin 30376 -> 30296 bytes
+ ...tdef-outline-drop-hints.1FC,21,41,20,62,63.otf} | Bin 2360 -> 2268 bytes
+ ...Regular.notdef-outline-drop-hints.61,62,63.otf} | Bin 2072 -> 2028 bytes
+ ...r.notdef-outline-drop-hints.D7,D8,D9,DA,DE.otf} | Bin 2172 -> 2104 bytes
+ ...def-outline-retain-gids.1FC,21,41,20,62,63.otf} | Bin 20376 -> 20284 bytes
+ ...egular.notdef-outline-retain-gids.61,62,63.otf} | Bin 2392 -> 2348 bytes
+ ....notdef-outline-retain-gids.D7,D8,D9,DA,DE.otf} | Bin 30544 -> 30464 bytes
+ ...-Regular.notdef-outline.1FC,21,41,20,62,63.otf} | Bin 2592 -> 2500 bytes
+ ...rceSansPro-Regular.notdef-outline.61,62,63.otf} | Bin 2224 -> 2180 bytes
+ ...sPro-Regular.notdef-outline.D7,D8,D9,DA,DE.otf} | Bin 2340 -> 2272 bytes
+ ...ubset.default.3042,3044,3046,3048,304A,304B.otf | Bin 4912 -> 4820 bytes
+ ...ubset.default.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 6300 -> 6196 bytes
+ ...eHanSans-Regular_subset.default.61,63,65,6B.otf | Bin 2620 -> 2540 bytes
+ ...ubset.default.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 6744 -> 6640 bytes
+ .../SourceHanSans-Regular_subset.default.660E.otf  | Bin 2488 -> 2444 bytes
+ ...e-retain-gids.3042,3044,3046,3048,304A,304B.otf | Bin 129912 -> 129820 bytes
+ ...e-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 130944 -> 130840 bytes
+ ...bset.desubroutinize-retain-gids.61,63,65,6B.otf | Bin 3444 -> 3364 bytes
+ ...e-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 122060 -> 121956 bytes
+ ...ular_subset.desubroutinize-retain-gids.660E.otf | Bin 50788 -> 50744 bytes
+ ...esubroutinize.3042,3044,3046,3048,304A,304B.otf | Bin 4748 -> 4656 bytes
+ ...esubroutinize.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 5944 -> 5840 bytes
+ ...s-Regular_subset.desubroutinize.61,63,65,6B.otf | Bin 2552 -> 2472 bytes
+ ...esubroutinize.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 6236 -> 6132 bytes
+ ...eHanSans-Regular_subset.desubroutinize.660E.otf | Bin 2472 -> 2428 bytes
+ ...e-retain-gids.3042,3044,3046,3048,304A,304B.otf | Bin 129468 -> 129376 bytes
+ ...e-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 130324 -> 130220 bytes
+ ...ints-desubroutinize-retain-gids.61,63,65,6B.otf | Bin 3324 -> 3244 bytes
+ ...e-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 121284 -> 121180 bytes
+ ....drop-hints-desubroutinize-retain-gids.660E.otf | Bin 50560 -> 50516 bytes
+ ...esubroutinize.3042,3044,3046,3048,304A,304B.otf | Bin 4440 -> 4348 bytes
+ ...esubroutinize.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 5428 -> 5324 bytes
+ ...ubset.drop-hints-desubroutinize.61,63,65,6B.otf | Bin 2448 -> 2368 bytes
+ ...esubroutinize.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 5560 -> 5456 bytes
+ ...gular_subset.drop-hints-desubroutinize.660E.otf | Bin 2336 -> 2292 bytes
+ ...s-retain-gids.3042,3044,3046,3048,304A,304B.otf | Bin 129608 -> 129516 bytes
+ ...s-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 130632 -> 130528 bytes
+ ...r_subset.drop-hints-retain-gids.61,63,65,6B.otf | Bin 3288 -> 3208 bytes
+ ...s-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 121784 -> 121680 bytes
+ ...-Regular_subset.drop-hints-retain-gids.660E.otf | Bin 50576 -> 50532 bytes
+ ...et.drop-hints.3042,3044,3046,3048,304A,304B.otf | Bin 4576 -> 4484 bytes
+ ...et.drop-hints.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 5732 -> 5628 bytes
+ ...nSans-Regular_subset.drop-hints.61,63,65,6B.otf | Bin 2480 -> 2400 bytes
+ ...et.drop-hints.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 6056 -> 5952 bytes
+ ...ourceHanSans-Regular_subset.drop-hints.660E.otf | Bin 2348 -> 2304 bytes
+ ...t.retain-gids.3042,3044,3046,3048,304A,304B.otf | Bin 130072 -> 129980 bytes
+ ...t.retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 131300 -> 131196 bytes
+ ...Sans-Regular_subset.retain-gids.61,63,65,6B.otf | Bin 3444 -> 3364 bytes
+ ...t.retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 122564 -> 122460 bytes
+ ...urceHanSans-Regular_subset.retain-gids.660E.otf | Bin 50804 -> 50760 bytes
+ ...039,1005,100A,103A,1038,1010,103D,1031,104A.otf | Bin 7724 -> 0 bytes
+ .../cmap/AdobeBlank-Regular.default.61,62.ttf      | Bin 1252 -> 1208 bytes
+ ...eBlank-Regular.drop-hints-retain-gids.61,62.ttf | Bin 1468 -> 1424 bytes
+ .../cmap/AdobeBlank-Regular.drop-hints.61,62.ttf   | Bin 1080 -> 1036 bytes
+ .../cmap/AdobeBlank-Regular.name-ids.61,62.ttf     | Bin 1000 -> 956 bytes
+ .../cmap/AdobeBlank-Regular.retain-gids.61,62.ttf  | Bin 1640 -> 1596 bytes
+ ...line-drop-hints-retain-gids.4E00,4E02,4E03.otf} | Bin
+ ...f-outline-drop-hints-retain-gids.4E00,4E03.otf} | Bin
+ ...line-drop-hints-retain-gids.4E00,4E05,4E07.otf} | Bin
+ ...line-drop-hints-retain-gids.4E02,4E03,4E08.otf} | Bin
+ ...notdef-outline-drop-hints-retain-gids.4E02.otf} | Bin
+ ...notdef-outline-drop-hints-retain-gids.4E03.otf} | Bin
+ ...drop-hints-retain-gids.4E05,4E07,4E08,4E09.otf} | Bin
+ ...f-outline-drop-hints-retain-gids.4E08,4E09.otf} | Bin
+ ...notdef-outline-drop-hints-retain-gids.4E08.otf} | Bin
+ ...rop-hints-retain-gids.retain-all-codepoint.otf} | Bin
+ ...1.notdef-outline-drop-hints.4E00,4E02,4E03.otf} | Bin
+ ..._font1.notdef-outline-drop-hints.4E00,4E03.otf} | Bin
+ ...1.notdef-outline-drop-hints.4E00,4E05,4E07.otf} | Bin
+ ...1.notdef-outline-drop-hints.4E02,4E03,4E08.otf} | Bin
+ ...map14_font1.notdef-outline-drop-hints.4E02.otf} | Bin
+ ...map14_font1.notdef-outline-drop-hints.4E03.otf} | Bin
+ ...def-outline-drop-hints.4E05,4E07,4E08,4E09.otf} | Bin
+ ..._font1.notdef-outline-drop-hints.4E08,4E09.otf} | Bin
+ ...map14_font1.notdef-outline-drop-hints.4E08.otf} | Bin
+ ...ef-outline-drop-hints.retain-all-codepoint.otf} | Bin
+ ...4_font1.notdef-outline-gids.4E00,4E02,4E03.otf} | Bin
+ ...cmap14_font1.notdef-outline-gids.4E00,4E03.otf} | Bin
+ ...4_font1.notdef-outline-gids.4E00,4E05,4E07.otf} | Bin
+ ...4_font1.notdef-outline-gids.4E02,4E03,4E08.otf} | Bin
+ ...f => cmap14_font1.notdef-outline-gids.4E02.otf} | Bin
+ ...f => cmap14_font1.notdef-outline-gids.4E03.otf} | Bin
+ ...t1.notdef-outline-gids.4E05,4E07,4E08,4E09.otf} | Bin
+ ...cmap14_font1.notdef-outline-gids.4E08,4E09.otf} | Bin
+ ...f => cmap14_font1.notdef-outline-gids.4E08.otf} | Bin
+ ...1.notdef-outline-gids.retain-all-codepoint.otf} | Bin
+ ...nt1.notdef-outline-name-ids.4E00,4E02,4E03.otf} | Bin
+ ...14_font1.notdef-outline-name-ids.4E00,4E03.otf} | Bin
+ ...nt1.notdef-outline-name-ids.4E00,4E05,4E07.otf} | Bin
+ ...nt1.notdef-outline-name-ids.4E02,4E03,4E08.otf} | Bin
+ ... cmap14_font1.notdef-outline-name-ids.4E02.otf} | Bin
+ ... cmap14_font1.notdef-outline-name-ids.4E03.otf} | Bin
+ ...otdef-outline-name-ids.4E05,4E07,4E08,4E09.otf} | Bin
+ ...14_font1.notdef-outline-name-ids.4E08,4E09.otf} | Bin
+ ... cmap14_font1.notdef-outline-name-ids.4E08.otf} | Bin
+ ...tdef-outline-name-ids.retain-all-codepoint.otf} | Bin
+ ....notdef-outline-retain-gids.4E00,4E02,4E03.otf} | Bin
+ ...font1.notdef-outline-retain-gids.4E00,4E03.otf} | Bin
+ ....notdef-outline-retain-gids.4E00,4E05,4E07.otf} | Bin
+ ....notdef-outline-retain-gids.4E02,4E03,4E08.otf} | Bin
+ ...ap14_font1.notdef-outline-retain-gids.4E02.otf} | Bin
+ ...ap14_font1.notdef-outline-retain-gids.4E03.otf} | Bin
+ ...ef-outline-retain-gids.4E05,4E07,4E08,4E09.otf} | Bin
+ ...font1.notdef-outline-retain-gids.4E08,4E09.otf} | Bin
+ ...ap14_font1.notdef-outline-retain-gids.4E08.otf} | Bin
+ ...f-outline-retain-gids.retain-all-codepoint.otf} | Bin
+ ...cmap14_font1.notdef-outline.4E00,4E02,4E03.otf} | Bin
+ ...f => cmap14_font1.notdef-outline.4E00,4E03.otf} | Bin
+ ...cmap14_font1.notdef-outline.4E00,4E05,4E07.otf} | Bin
+ ...cmap14_font1.notdef-outline.4E02,4E03,4E08.otf} | Bin
+ ...02.otf => cmap14_font1.notdef-outline.4E02.otf} | Bin
+ ...03.otf => cmap14_font1.notdef-outline.4E03.otf} | Bin
+ ...4_font1.notdef-outline.4E05,4E07,4E08,4E09.otf} | Bin
+ ...f => cmap14_font1.notdef-outline.4E08,4E09.otf} | Bin
+ ...08.otf => cmap14_font1.notdef-outline.4E08.otf} | Bin
+ ..._font1.notdef-outline.retain-all-codepoint.otf} | Bin
+ ...line-drop-hints-retain-gids.4E00,4E02,4E03.otf} | Bin
+ ...f-outline-drop-hints-retain-gids.4E00,4E03.otf} | Bin
+ ...line-drop-hints-retain-gids.4E00,4E05,4E07.otf} | Bin
+ ...line-drop-hints-retain-gids.4E02,4E03,4E08.otf} | Bin
+ ...notdef-outline-drop-hints-retain-gids.4E02.otf} | Bin
+ ...notdef-outline-drop-hints-retain-gids.4E03.otf} | Bin
+ ...drop-hints-retain-gids.4E05,4E07,4E08,4E09.otf} | Bin
+ ...f-outline-drop-hints-retain-gids.4E08,4E09.otf} | Bin
+ ...notdef-outline-drop-hints-retain-gids.4E08.otf} | Bin
+ ...rop-hints-retain-gids.retain-all-codepoint.otf} | Bin
+ ...2.notdef-outline-drop-hints.4E00,4E02,4E03.otf} | Bin
+ ..._font2.notdef-outline-drop-hints.4E00,4E03.otf} | Bin
+ ...2.notdef-outline-drop-hints.4E00,4E05,4E07.otf} | Bin
+ ...2.notdef-outline-drop-hints.4E02,4E03,4E08.otf} | Bin
+ ...map14_font2.notdef-outline-drop-hints.4E02.otf} | Bin
+ ...map14_font2.notdef-outline-drop-hints.4E03.otf} | Bin
+ ...def-outline-drop-hints.4E05,4E07,4E08,4E09.otf} | Bin
+ ..._font2.notdef-outline-drop-hints.4E08,4E09.otf} | Bin
+ ...map14_font2.notdef-outline-drop-hints.4E08.otf} | Bin
+ ...ef-outline-drop-hints.retain-all-codepoint.otf} | Bin
+ ...4_font2.notdef-outline-gids.4E00,4E02,4E03.otf} | Bin
+ ...cmap14_font2.notdef-outline-gids.4E00,4E03.otf} | Bin
+ ...4_font2.notdef-outline-gids.4E00,4E05,4E07.otf} | Bin
+ ...4_font2.notdef-outline-gids.4E02,4E03,4E08.otf} | Bin
+ ...f => cmap14_font2.notdef-outline-gids.4E02.otf} | Bin
+ ...f => cmap14_font2.notdef-outline-gids.4E03.otf} | Bin
+ ...t2.notdef-outline-gids.4E05,4E07,4E08,4E09.otf} | Bin
+ ...cmap14_font2.notdef-outline-gids.4E08,4E09.otf} | Bin
+ ...f => cmap14_font2.notdef-outline-gids.4E08.otf} | Bin
+ ...2.notdef-outline-gids.retain-all-codepoint.otf} | Bin
+ ...nt2.notdef-outline-name-ids.4E00,4E02,4E03.otf} | Bin
+ ...14_font2.notdef-outline-name-ids.4E00,4E03.otf} | Bin
+ ...nt2.notdef-outline-name-ids.4E00,4E05,4E07.otf} | Bin
+ ...nt2.notdef-outline-name-ids.4E02,4E03,4E08.otf} | Bin
+ ... cmap14_font2.notdef-outline-name-ids.4E02.otf} | Bin
+ ... cmap14_font2.notdef-outline-name-ids.4E03.otf} | Bin
+ ...otdef-outline-name-ids.4E05,4E07,4E08,4E09.otf} | Bin
+ ...14_font2.notdef-outline-name-ids.4E08,4E09.otf} | Bin
+ ... cmap14_font2.notdef-outline-name-ids.4E08.otf} | Bin
+ ...tdef-outline-name-ids.retain-all-codepoint.otf} | Bin
+ ....notdef-outline-retain-gids.4E00,4E02,4E03.otf} | Bin
+ ...font2.notdef-outline-retain-gids.4E00,4E03.otf} | Bin
+ ....notdef-outline-retain-gids.4E00,4E05,4E07.otf} | Bin
+ ....notdef-outline-retain-gids.4E02,4E03,4E08.otf} | Bin
+ ...ap14_font2.notdef-outline-retain-gids.4E02.otf} | Bin
+ ...ap14_font2.notdef-outline-retain-gids.4E03.otf} | Bin
+ ...ef-outline-retain-gids.4E05,4E07,4E08,4E09.otf} | Bin
+ ...font2.notdef-outline-retain-gids.4E08,4E09.otf} | Bin
+ ...ap14_font2.notdef-outline-retain-gids.4E08.otf} | Bin
+ ...f-outline-retain-gids.retain-all-codepoint.otf} | Bin
+ ...cmap14_font2.notdef-outline.4E00,4E02,4E03.otf} | Bin
+ ...f => cmap14_font2.notdef-outline.4E00,4E03.otf} | Bin
+ ...cmap14_font2.notdef-outline.4E00,4E05,4E07.otf} | Bin
+ ...cmap14_font2.notdef-outline.4E02,4E03,4E08.otf} | Bin
+ ...02.otf => cmap14_font2.notdef-outline.4E02.otf} | Bin
+ ...03.otf => cmap14_font2.notdef-outline.4E03.otf} | Bin
+ ...4_font2.notdef-outline.4E05,4E07,4E08,4E09.otf} | Bin
+ ...f => cmap14_font2.notdef-outline.4E08,4E09.otf} | Bin
+ ...08.otf => cmap14_font2.notdef-outline.4E08.otf} | Bin
+ ..._font2.notdef-outline.retain-all-codepoint.otf} | Bin
+ .../TwemojiMozilla.subset.default.32,3297,3299.ttf | Bin 1936 -> 1868 bytes
+ .../colr/TwemojiMozilla.subset.default.32,3297.ttf | Bin 1400 -> 1344 bytes
+ .../colr/TwemojiMozilla.subset.default.32,3299.ttf | Bin 1576 -> 1520 bytes
+ .../colr/TwemojiMozilla.subset.default.32.ttf      | Bin 932 -> 888 bytes
+ .../TwemojiMozilla.subset.default.3297,3299.ttf    | Bin 1916 -> 1860 bytes
+ .../colr/TwemojiMozilla.subset.default.3297.ttf    | Bin 1376 -> 1332 bytes
+ .../colr/TwemojiMozilla.subset.default.3299.ttf    | Bin 1552 -> 1508 bytes
+ ....subset.drop-hints-retain-gids.32,3297,3299.ttf | Bin 1916 -> 1848 bytes
+ ...zilla.subset.drop-hints-retain-gids.32,3297.ttf | Bin 1396 -> 1340 bytes
+ ...zilla.subset.drop-hints-retain-gids.32,3299.ttf | Bin 1576 -> 1520 bytes
+ ...ojiMozilla.subset.drop-hints-retain-gids.32.ttf | Bin 912 -> 868 bytes
+ ...lla.subset.drop-hints-retain-gids.3297,3299.ttf | Bin 1900 -> 1844 bytes
+ ...iMozilla.subset.drop-hints-retain-gids.3297.ttf | Bin 1372 -> 1328 bytes
+ ...iMozilla.subset.drop-hints-retain-gids.3299.ttf | Bin 1552 -> 1508 bytes
+ ...emojiMozilla.subset.drop-hints.32,3297,3299.ttf | Bin 1916 -> 1848 bytes
+ .../TwemojiMozilla.subset.drop-hints.32,3297.ttf   | Bin 1380 -> 1324 bytes
+ .../TwemojiMozilla.subset.drop-hints.32,3299.ttf   | Bin 1556 -> 1500 bytes
+ .../colr/TwemojiMozilla.subset.drop-hints.32.ttf   | Bin 912 -> 868 bytes
+ .../TwemojiMozilla.subset.drop-hints.3297,3299.ttf | Bin 1896 -> 1840 bytes
+ .../colr/TwemojiMozilla.subset.drop-hints.3297.ttf | Bin 1356 -> 1312 bytes
+ .../colr/TwemojiMozilla.subset.drop-hints.3299.ttf | Bin 1532 -> 1488 bytes
+ ...mojiMozilla.subset.retain-gids.32,3297,3299.ttf | Bin 1936 -> 1868 bytes
+ .../TwemojiMozilla.subset.retain-gids.32,3297.ttf  | Bin 1416 -> 1360 bytes
+ .../TwemojiMozilla.subset.retain-gids.32,3299.ttf  | Bin 1596 -> 1540 bytes
+ .../colr/TwemojiMozilla.subset.retain-gids.32.ttf  | Bin 932 -> 888 bytes
+ ...TwemojiMozilla.subset.retain-gids.3297,3299.ttf | Bin 1920 -> 1864 bytes
+ .../TwemojiMozilla.subset.retain-gids.3297.ttf     | Bin 1392 -> 1348 bytes
+ .../TwemojiMozilla.subset.retain-gids.3299.ttf     | Bin 1572 -> 1528 bytes
+ ...oColrEmojiGlyf-Regular.subset.default.1f35e.ttf | Bin 3004 -> 0 bytes
+ ...oColrEmojiGlyf-Regular.subset.default.1f696.ttf | Bin 3752 -> 0 bytes
+ ...Regular.subset.drop-hints-retain-gids.1f35e.ttf | Bin 3516 -> 0 bytes
+ ...Regular.subset.drop-hints-retain-gids.1f696.ttf | Bin 5048 -> 0 bytes
+ ...lrEmojiGlyf-Regular.subset.drop-hints.1f35e.ttf | Bin 3004 -> 0 bytes
+ ...lrEmojiGlyf-Regular.subset.drop-hints.1f696.ttf | Bin 3752 -> 0 bytes
+ ...rEmojiGlyf-Regular.subset.retain-gids.1f35e.ttf | Bin 3516 -> 0 bytes
+ ...rEmojiGlyf-Regular.subset.retain-gids.1f696.ttf | Bin 5048 -> 0 bytes
+ .../colrv1/TestCOLRv1.default.E000,E004.ttf        | Bin 900 -> 0 bytes
+ .../colrv1/TestCOLRv1.default.E003,E004.ttf        | Bin 1000 -> 0 bytes
+ .../expected/colrv1/TestCOLRv1.default.E004.ttf    | Bin 744 -> 0 bytes
+ .../TestCOLRv1.default.retain-all-codepoint.ttf    | Bin 1444 -> 0 bytes
+ ...TestCOLRv1.drop-hints-retain-gids.E000,E004.ttf | Bin 984 -> 0 bytes
+ ...TestCOLRv1.drop-hints-retain-gids.E003,E004.ttf | Bin 1076 -> 0 bytes
+ .../TestCOLRv1.drop-hints-retain-gids.E004.ttf     | Bin 836 -> 0 bytes
+ ...drop-hints-retain-gids.retain-all-codepoint.ttf | Bin 1444 -> 0 bytes
+ .../colrv1/TestCOLRv1.drop-hints.E000,E004.ttf     | Bin 900 -> 0 bytes
+ .../colrv1/TestCOLRv1.drop-hints.E003,E004.ttf     | Bin 1000 -> 0 bytes
+ .../expected/colrv1/TestCOLRv1.drop-hints.E004.ttf | Bin 744 -> 0 bytes
+ .../TestCOLRv1.drop-hints.retain-all-codepoint.ttf | Bin 1444 -> 0 bytes
+ .../colrv1/TestCOLRv1.retain-gids.E000,E004.ttf    | Bin 984 -> 0 bytes
+ .../colrv1/TestCOLRv1.retain-gids.E003,E004.ttf    | Bin 1076 -> 0 bytes
+ .../colrv1/TestCOLRv1.retain-gids.E004.ttf         | Bin 836 -> 0 bytes
+ ...TestCOLRv1.retain-gids.retain-all-codepoint.ttf | Bin 1444 -> 0 bytes
+ .../Roboto-Regular.default.1FC,21,41,20,62,63.ttf  | Bin 3076 -> 3004 bytes
+ .../full-font/Roboto-Regular.default.61,62,63.ttf  | Bin 2668 -> 2632 bytes
+ .../Roboto-Regular.default.D7,D8,D9,DA,DE.ttf      | Bin 3020 -> 2960 bytes
+ ...oboto-Regular.drop-hints.1FC,21,41,20,62,63.ttf | Bin 1628 -> 1556 bytes
+ .../Roboto-Regular.drop-hints.61,62,63.ttf         | Bin 1408 -> 1372 bytes
+ .../Roboto-Regular.drop-hints.D7,D8,D9,DA,DE.ttf   | Bin 1644 -> 1584 bytes
+ ...ifVariable-Roman.default.1FC,21,41,20,62,63.ttf | Bin 3960 -> 3888 bytes
+ .../SourceSerifVariable-Roman.default.61,62,63.ttf | Bin 3820 -> 3784 bytes
+ ...eSerifVariable-Roman.default.D7,D8,D9,DA,DE.ttf | Bin 4384 -> 4324 bytes
+ ...ariable-Roman.drop-hints.1FC,21,41,20,62,63.ttf | Bin 3948 -> 3876 bytes
+ ...urceSerifVariable-Roman.drop-hints.61,62,63.ttf | Bin 3820 -> 3784 bytes
+ ...rifVariable-Roman.drop-hints.D7,D8,D9,DA,DE.ttf | Bin 4384 -> 4324 bytes
+ ...gular.default.3042,3044,3046,3048,304A,304B.ttf | Bin 2700 -> 2616 bytes
+ ...gular.default.3042,3044,3046,73E0,5EA6,8F38.ttf | Bin 2944 -> 2848 bytes
+ .../Mplus1p-Regular.default.61,63,65,6B.ttf        | Bin 2320 -> 2248 bytes
+ ...gular.default.660E,6975,73E0,5EA6,8F38,6E05.ttf | Bin 3240 -> 3144 bytes
+ .../japanese/Mplus1p-Regular.default.660E.ttf      | Bin 1980 -> 1944 bytes
+ ...ar.drop-hints.3042,3044,3046,3048,304A,304B.ttf | Bin 1972 -> 1888 bytes
+ ...ar.drop-hints.3042,3044,3046,73E0,5EA6,8F38.ttf | Bin 2216 -> 2120 bytes
+ .../Mplus1p-Regular.drop-hints.61,63,65,6B.ttf     | Bin 1592 -> 1520 bytes
+ ...ar.drop-hints.660E,6975,73E0,5EA6,8F38,6E05.ttf | Bin 2512 -> 2416 bytes
+ .../japanese/Mplus1p-Regular.drop-hints.660E.ttf   | Bin 1252 -> 1216 bytes
+ ...lar.keep-gdef.3042,3044,3046,3048,304A,304B.ttf | Bin 2700 -> 2616 bytes
+ ...lar.keep-gdef.3042,3044,3046,73E0,5EA6,8F38.ttf | Bin 2944 -> 2848 bytes
+ .../Mplus1p-Regular.keep-gdef.61,63,65,6B.ttf      | Bin 2320 -> 2248 bytes
+ ...lar.keep-gdef.660E,6975,73E0,5EA6,8F38,6E05.ttf | Bin 3240 -> 3144 bytes
+ .../japanese/Mplus1p-Regular.keep-gdef.660E.ttf    | Bin 1980 -> 1944 bytes
+ ...les_f1.notdef-outline-retain-gids.41,42,43.otf} | Bin 2052 -> 2016 bytes
+ ...brules_f1.notdef-outline-retain-gids.41,42.otf} | Bin 1948 -> 1912 bytes
+ ...brules_f1.notdef-outline-retain-gids.41,43.otf} | Bin 2068 -> 2020 bytes
+ ..._subrules_f1.notdef-outline-retain-gids.41.otf} | Bin 1932 -> 1896 bytes
+ ...f-outline-retain-gids.retain-all-codepoint.otf} | Bin 3912 -> 3876 bytes
+ ...ltiple_subrules_f1.notdef-outline.41,42,43.otf} | Bin 1340 -> 1304 bytes
+ ..._multiple_subrules_f1.notdef-outline.41,42.otf} | Bin 1240 -> 1204 bytes
+ ..._multiple_subrules_f1.notdef-outline.41,43.otf} | Bin 1348 -> 1300 bytes
+ ...xt1_multiple_subrules_f1.notdef-outline.41.otf} | Bin 1228 -> 1192 bytes
+ ...les_f1.notdef-outline.retain-all-codepoint.otf} | Bin 3912 -> 3876 bytes
+ ...les_f1.notdef-outline-retain-gids.41,42,43.otf} | Bin 2052 -> 2016 bytes
+ ...brules_f1.notdef-outline-retain-gids.41,42.otf} | Bin 1948 -> 1912 bytes
+ ...brules_f1.notdef-outline-retain-gids.41,43.otf} | Bin 2068 -> 2020 bytes
+ ..._subrules_f1.notdef-outline-retain-gids.41.otf} | Bin 1932 -> 1896 bytes
+ ...f-outline-retain-gids.retain-all-codepoint.otf} | Bin 3912 -> 3876 bytes
+ ...ltiple_subrules_f1.notdef-outline.41,42,43.otf} | Bin 1340 -> 1304 bytes
+ ..._multiple_subrules_f1.notdef-outline.41,42.otf} | Bin 1240 -> 1204 bytes
+ ..._multiple_subrules_f1.notdef-outline.41,43.otf} | Bin 1348 -> 1300 bytes
+ ...xt2_multiple_subrules_f1.notdef-outline.41.otf} | Bin 1228 -> 1192 bytes
+ ...les_f1.notdef-outline.retain-all-codepoint.otf} | Bin 3912 -> 3876 bytes
+ .../gpos_context3_simple_f1.default.41,42,43.otf   | Bin 1320 -> 0 bytes
+ ...ple_f1.notdef-outline-retain-gids.41,42,43.otf} | Bin 2008 -> 1996 bytes
+ ...simple_f1.notdef-outline-retain-gids.41,42.otf} | Bin 1904 -> 1892 bytes
+ ..._simple_f1.notdef-outline-retain-gids.41,43.otf | Bin 0 -> 2000 bytes
+ ...t3_simple_f1.notdef-outline-retain-gids.41.otf} | Bin 1888 -> 1876 bytes
+ ...f-outline-retain-gids.retain-all-codepoint.otf} | Bin 3892 -> 3856 bytes
+ ...context3_simple_f1.notdef-outline.41,42,43.otf} | Bin 1296 -> 1284 bytes
+ ...os_context3_simple_f1.notdef-outline.41,42.otf} | Bin 1196 -> 1184 bytes
+ ...os_context3_simple_f1.notdef-outline.41,43.otf} | Bin 1304 -> 1280 bytes
+ .../gpos_context3_simple_f1.notdef-outline.41.otf} | Bin 1184 -> 1172 bytes
+ ...ple_f1.notdef-outline.retain-all-codepoint.otf} | Bin 3892 -> 3856 bytes
+ ...pos_context3_simple_f1.retain-gids.41,42,43.otf | Bin 2032 -> 0 bytes
+ .../gpos_context3_simple_f1.retain-gids.41,43.otf  | Bin 2048 -> 0 bytes
+ ...AdobeVFPrototype.keep-gdef-gpos.41,42,43,57.otf | Bin 5460 -> 0 bytes
+ .../AdobeVFPrototype.keep-gdef-gpos.41,42,43.otf   | Bin 4928 -> 0 bytes
+ .../AdobeVFPrototype.keep-gdef-gpos.41,42.otf      | Bin 4448 -> 0 bytes
+ .../AdobeVFPrototype.keep-gdef-gpos.41,56,57.otf   | Bin 4596 -> 0 bytes
+ .../AdobeVFPrototype.keep-gdef-gpos.41.otf         | Bin 3748 -> 0 bytes
+ .../AdobeVFPrototype.keep-gdef-gpos.42,57.otf      | Bin 4580 -> 0 bytes
+ ...type.notdef-outline-drop-hints.41,42,43,57.otf} | Bin
+ ...ototype.notdef-outline-drop-hints.41,42,43.otf} | Bin
+ ...FPrototype.notdef-outline-drop-hints.41,42.otf} | Bin
+ ...ototype.notdef-outline-drop-hints.41,56,57.otf} | Bin
+ ...beVFPrototype.notdef-outline-drop-hints.41.otf} | Bin
+ ...FPrototype.notdef-outline-drop-hints.42,57.otf} | Bin
+ ...dobeVFPrototype.notdef-outline.41,42,43,57.otf} | Bin
+ ...> AdobeVFPrototype.notdef-outline.41,42,43.otf} | Bin
+ ...f => AdobeVFPrototype.notdef-outline.41,42.otf} | Bin
+ ...> AdobeVFPrototype.notdef-outline.41,56,57.otf} | Bin
+ ....otf => AdobeVFPrototype.notdef-outline.41.otf} | Bin
+ ...f => AdobeVFPrototype.notdef-outline.42,57.otf} | Bin
+ .../Roboto-Regular.default.1E00,303.ttf            | Bin 2520 -> 2472 bytes
+ .../layout.gdef/Roboto-Regular.default.303.ttf     | Bin 2112 -> 2076 bytes
+ .../Roboto-Regular.default.309,20,30F.ttf          | Bin 2208 -> 2148 bytes
+ .../layout.gdef/Roboto-Regular.default.323.ttf     | Bin 2004 -> 1968 bytes
+ .../Roboto-Regular.default.41,42,43.ttf            | Bin 2568 -> 2532 bytes
+ .../Roboto-Regular.drop-hints.1E00,303.ttf         | Bin 1376 -> 1328 bytes
+ .../layout.gdef/Roboto-Regular.drop-hints.303.ttf  | Bin 1108 -> 1072 bytes
+ .../Roboto-Regular.drop-hints.309,20,30F.ttf       | Bin 1168 -> 1108 bytes
+ .../layout.gdef/Roboto-Regular.drop-hints.323.ttf  | Bin 1052 -> 1016 bytes
+ .../Roboto-Regular.drop-hints.41,42,43.ttf         | Bin 1384 -> 1348 bytes
+ .../Roboto-Regular.keep-gdef-gpos.1E00,303.ttf     | Bin 2520 -> 2472 bytes
+ .../Roboto-Regular.keep-gdef-gpos.303.ttf          | Bin 2112 -> 2076 bytes
+ .../Roboto-Regular.keep-gdef-gpos.309,20,30F.ttf   | Bin 2208 -> 2148 bytes
+ .../Roboto-Regular.keep-gdef-gpos.323.ttf          | Bin 2004 -> 1968 bytes
+ .../Roboto-Regular.keep-gdef-gpos.41,42,43.ttf     | Bin 2568 -> 2532 bytes
+ ...os1_2_font.notdef-outline-retain-gids.41,43.otf | Bin 0 -> 1980 bytes
+ ...s1_2_font.notdef-outline-retain-gids.41,46.otf} | Bin 2188 -> 2140 bytes
+ ...gpos1_2_font.notdef-outline-retain-gids.41.otf} | Bin 1888 -> 1856 bytes
+ ...s1_2_font.notdef-outline-retain-gids.42,44.otf} | Bin 2012 -> 1964 bytes
+ ...s1_2_font.notdef-outline-retain-gids.43,46.otf} | Bin 2052 -> 2004 bytes
+ ...f-outline-retain-gids.retain-all-codepoint.otf} | Bin 3816 -> 3780 bytes
+ ...3.otf => gpos1_2_font.notdef-outline.41,43.otf} | Bin 1308 -> 1260 bytes
+ ...6.otf => gpos1_2_font.notdef-outline.41,46.otf} | Bin 1436 -> 1388 bytes
+ .../gpos1_2_font.notdef-outline.41.otf}            | Bin 1184 -> 1152 bytes
+ ...4.otf => gpos1_2_font.notdef-outline.42,44.otf} | Bin 1280 -> 1232 bytes
+ ...6.otf => gpos1_2_font.notdef-outline.43,46.otf} | Bin 1300 -> 1252 bytes
+ ...2_font.notdef-outline.retain-all-codepoint.otf} | Bin 3816 -> 3780 bytes
+ .../layout.gpos/gpos1_2_font.retain-gids.41,43.otf | Bin 2028 -> 0 bytes
+ ..._font7.notdef-outline-retain-gids.21,23,25.otf} | Bin 1716 -> 1656 bytes
+ ...2_1_font7.notdef-outline-retain-gids.21,23.otf} | Bin 1580 -> 1532 bytes
+ ...2_1_font7.notdef-outline-retain-gids.2E,23.otf} | Bin 1960 -> 1912 bytes
+ ..._font7.notdef-outline-retain-gids.41,42,43.otf} | Bin 2008 -> 1976 bytes
+ ...f-outline-retain-gids.retain-all-codepoint.otf} | Bin 3816 -> 3780 bytes
+ ...f => gpos2_1_font7.notdef-outline.21,23,25.otf} | Bin 1372 -> 1312 bytes
+ ....otf => gpos2_1_font7.notdef-outline.21,23.otf} | Bin 1252 -> 1204 bytes
+ ....otf => gpos2_1_font7.notdef-outline.2E,23.otf} | Bin 1524 -> 1476 bytes
+ .../gpos2_1_font7.notdef-outline.41,42,43.otf}     | Bin 1296 -> 1264 bytes
+ ..._font7.notdef-outline.retain-all-codepoint.otf} | Bin 3816 -> 3780 bytes
+ ..._font5.notdef-outline-retain-gids.21,23,25.otf} | Bin 1716 -> 1656 bytes
+ ...2_2_font5.notdef-outline-retain-gids.21,23.otf} | Bin 1580 -> 1532 bytes
+ ...2_2_font5.notdef-outline-retain-gids.2E,23.otf} | Bin 1960 -> 1912 bytes
+ ..._font5.notdef-outline-retain-gids.41,42,43.otf} | Bin 2012 -> 1976 bytes
+ ...f-outline-retain-gids.retain-all-codepoint.otf} | Bin 3816 -> 3780 bytes
+ ...f => gpos2_2_font5.notdef-outline.21,23,25.otf} | Bin 1372 -> 1312 bytes
+ ....otf => gpos2_2_font5.notdef-outline.21,23.otf} | Bin 1252 -> 1204 bytes
+ ....otf => gpos2_2_font5.notdef-outline.2E,23.otf} | Bin 1524 -> 1476 bytes
+ ...f => gpos2_2_font5.notdef-outline.41,42,43.otf} | Bin 1300 -> 1264 bytes
+ ..._font5.notdef-outline.retain-all-codepoint.otf} | Bin 3816 -> 3780 bytes
+ ...os3_font3.notdef-outline-retain-gids.28,29.otf} | Bin 1652 -> 1616 bytes
+ ...os3_font3.notdef-outline-retain-gids.28,2B.otf} | Bin 1800 -> 1752 bytes
+ ...os3_font3.notdef-outline-retain-gids.29,2B.otf} | Bin 1712 -> 1664 bytes
+ ..._font3.notdef-outline-retain-gids.41,42,43.otf} | Bin 2012 -> 1972 bytes
+ ...f-outline-retain-gids.retain-all-codepoint.otf} | Bin 3848 -> 3812 bytes
+ ...29.otf => gpos3_font3.notdef-outline.28,29.otf} | Bin 1260 -> 1224 bytes
+ ...2B.otf => gpos3_font3.notdef-outline.28,2B.otf} | Bin 1392 -> 1344 bytes
+ ...2B.otf => gpos3_font3.notdef-outline.29,2B.otf} | Bin 1304 -> 1256 bytes
+ .../gpos3_font3.notdef-outline.41,42,43.otf}       | Bin 1300 -> 1260 bytes
+ ..._font3.notdef-outline.retain-all-codepoint.otf} | Bin 3848 -> 3812 bytes
+ .../gpos4_multiple_anchors_1.default.41,42,43.otf  | Bin 1320 -> 0 bytes
+ .../gpos4_multiple_anchors_1.default.41.otf        | Bin 1208 -> 0 bytes
+ ...s_1.notdef-outline-retain-gids.41,42,43,44.otf} | Bin 2220 -> 2208 bytes
+ ...s_1.notdef-outline-retain-gids.41,42,43,45.otf} | Bin 2268 -> 2220 bytes
+ ...chors_1.notdef-outline-retain-gids.41,42,43.otf | Bin 0 -> 1996 bytes
+ ...anchors_1.notdef-outline-retain-gids.41,42.otf} | Bin 1904 -> 1892 bytes
+ ....notdef-outline-retain-gids.41,43,44,45,46.otf} | Bin 2584 -> 2560 bytes
+ ...hors_1.notdef-outline-retain-gids.41,43,44.otf} | Bin 2240 -> 2216 bytes
+ ...hors_1.notdef-outline-retain-gids.41,43,45.otf} | Bin 2260 -> 2224 bytes
+ ..._anchors_1.notdef-outline-retain-gids.41,43.otf | Bin 0 -> 2000 bytes
+ ...le_anchors_1.notdef-outline-retain-gids.41.otf} | Bin 1892 -> 1876 bytes
+ ...f-outline-retain-gids.retain-all-codepoint.otf} | Bin 3880 -> 3844 bytes
+ ...tiple_anchors_1.notdef-outline.41,42,43,44.otf} | Bin 1504 -> 1492 bytes
+ ...tiple_anchors_1.notdef-outline.41,42,43,45.otf} | Bin 1512 -> 1488 bytes
+ ..._multiple_anchors_1.notdef-outline.41,42,43.otf | Bin 0 -> 1284 bytes
+ ...s4_multiple_anchors_1.notdef-outline.41,42.otf} | Bin 1196 -> 1184 bytes
+ ...le_anchors_1.notdef-outline.41,43,44,45,46.otf} | Bin 1856 -> 1832 bytes
+ ...multiple_anchors_1.notdef-outline.41,43,44.otf} | Bin 1516 -> 1492 bytes
+ ...multiple_anchors_1.notdef-outline.41,43,45.otf} | Bin 1524 -> 1488 bytes
+ ...s4_multiple_anchors_1.notdef-outline.41,43.otf} | Bin 1328 -> 1280 bytes
+ ...gpos4_multiple_anchors_1.notdef-outline.41.otf} | Bin 1188 -> 1172 bytes
+ ...hors_1.notdef-outline.retain-all-codepoint.otf} | Bin 3880 -> 3844 bytes
+ ...os4_multiple_anchors_1.retain-gids.41,42,43.otf | Bin 2032 -> 0 bytes
+ .../gpos4_multiple_anchors_1.retain-gids.41,43.otf | Bin 2048 -> 0 bytes
+ .../gpos4_multiple_anchors_1.retain-gids.41.otf    | Bin 1912 -> 0 bytes
+ .../layout.gpos5/gpos5_font1.default.42.otf        | Bin 1084 -> 0 bytes
+ ...nt1.notdef-outline-retain-gids.41,42,43,44.otf} | Bin 2260 -> 2224 bytes
+ ...nt1.notdef-outline-retain-gids.41,42,43,45.otf} | Bin 2284 -> 2236 bytes
+ ..._font1.notdef-outline-retain-gids.41,42,43.otf} | Bin 2048 -> 2012 bytes
+ ..._font1.notdef-outline-retain-gids.41,42,44.otf} | Bin 2192 -> 2144 bytes
+ ..._font1.notdef-outline-retain-gids.41,42,45.otf} | Bin 2192 -> 2144 bytes
+ ...os5_font1.notdef-outline-retain-gids.41,42.otf} | Bin 1944 -> 1908 bytes
+ ...pos5_font1.notdef-outline-retain-gids.41,43.otf | Bin 0 -> 2016 bytes
+ ... gpos5_font1.notdef-outline-retain-gids.41.otf} | Bin 1928 -> 1892 bytes
+ ... gpos5_font1.notdef-outline-retain-gids.42.otf} | Bin 1800 -> 1764 bytes
+ ...f-outline-retain-gids.retain-all-codepoint.otf} | Bin 3896 -> 3860 bytes
+ ... => gpos5_font1.notdef-outline.41,42,43,44.otf} | Bin 1544 -> 1508 bytes
+ ... => gpos5_font1.notdef-outline.41,42,43,45.otf} | Bin 1552 -> 1504 bytes
+ ...otf => gpos5_font1.notdef-outline.41,42,43.otf} | Bin 1336 -> 1300 bytes
+ ...otf => gpos5_font1.notdef-outline.41,42,44.otf} | Bin 1468 -> 1420 bytes
+ ...otf => gpos5_font1.notdef-outline.41,42,45.otf} | Bin 1456 -> 1408 bytes
+ ...42.otf => gpos5_font1.notdef-outline.41,42.otf} | Bin 1236 -> 1200 bytes
+ ...43.otf => gpos5_font1.notdef-outline.41,43.otf} | Bin 1344 -> 1296 bytes
+ ...lt.41.otf => gpos5_font1.notdef-outline.41.otf} | Bin 1224 -> 1188 bytes
+ .../layout.gpos5/gpos5_font1.notdef-outline.42.otf | Bin 0 -> 1048 bytes
+ ..._font1.notdef-outline.retain-all-codepoint.otf} | Bin 3896 -> 3860 bytes
+ .../layout.gpos5/gpos5_font1.retain-gids.41,43.otf | Bin 2064 -> 0 bytes
+ ...nt1.notdef-outline-retain-gids.41,42,43,44.otf} | Bin 2244 -> 2184 bytes
+ ...nt1.notdef-outline-retain-gids.41,42,43,45.otf} | Bin 2244 -> 2196 bytes
+ ...6_font1.notdef-outline-retain-gids.41,42,43.otf | Bin 0 -> 1972 bytes
+ ...os6_font1.notdef-outline-retain-gids.41,42.otf} | Bin 1928 -> 1868 bytes
+ ....notdef-outline-retain-gids.41,43,44,45,46.otf} | Bin 2608 -> 2536 bytes
+ ..._font1.notdef-outline-retain-gids.41,43,44.otf} | Bin 2264 -> 2192 bytes
+ ..._font1.notdef-outline-retain-gids.41,43,45.otf} | Bin 2284 -> 2200 bytes
+ ...pos6_font1.notdef-outline-retain-gids.41,43.otf | Bin 0 -> 1976 bytes
+ .../gpos6_font1.notdef-outline-retain-gids.41.otf} | Bin 1912 -> 1852 bytes
+ ...f-outline-retain-gids.retain-all-codepoint.otf} | Bin 3856 -> 3820 bytes
+ .../gpos6_font1.notdef-outline.41,42,43,44.otf}    | Bin 1528 -> 1468 bytes
+ .../gpos6_font1.notdef-outline.41,42,43,45.otf}    | Bin 1536 -> 1464 bytes
+ .../gpos6_font1.notdef-outline.41,42,43.otf        | Bin 0 -> 1260 bytes
+ .../gpos6_font1.notdef-outline.41,42.otf}          | Bin 1220 -> 1160 bytes
+ .../gpos6_font1.notdef-outline.41,43,44,45,46.otf} | Bin 1880 -> 1808 bytes
+ .../gpos6_font1.notdef-outline.41,43,44.otf}       | Bin 1540 -> 1468 bytes
+ .../gpos6_font1.notdef-outline.41,43,45.otf}       | Bin 1548 -> 1464 bytes
+ .../gpos6_font1.notdef-outline.41,43.otf}          | Bin 1328 -> 1256 bytes
+ .../gpos6_font1.notdef-outline.41.otf}             | Bin 1208 -> 1148 bytes
+ ..._font1.notdef-outline.retain-all-codepoint.otf} | Bin 3856 -> 3820 bytes
+ .../layout.gpos6/gpos6_font1.retain-gids.41,43.otf | Bin 2024 -> 0 bytes
+ ...ular.default.627,644,623,62D,644,627,645,2E.ttf | Bin 12684 -> 12592 bytes
+ .../Amiri-Regular.default.627,644,62D,628.ttf      | Bin 9992 -> 9924 bytes
+ .../Amiri-Regular.default.627,644.ttf              | Bin 4168 -> 4112 bytes
+ ...-Regular.default.633,645,627,621,20,644,627.ttf | Bin 9516 -> 9424 bytes
+ .../Amiri-Regular.default.63A,64A,631.ttf          | Bin 7324 -> 7256 bytes
+ ....retain-gids.627,644,623,62D,644,627,645,2E.ttf | Bin 48012 -> 47920 bytes
+ .../Amiri-Regular.retain-gids.627,644,62D,628.ttf  | Bin 42640 -> 42572 bytes
+ .../Amiri-Regular.retain-gids.627,644.ttf          | Bin 36696 -> 36640 bytes
+ ...ular.retain-gids.633,645,627,621,20,644,627.ttf | Bin 45908 -> 45816 bytes
+ .../Amiri-Regular.retain-gids.63A,64A,631.ttf      | Bin 37988 -> 37920 bytes
+ ...ning1_multiple_subrules_f1.default.41,42,43.otf | Bin 1344 -> 0 bytes
+ ..._f1.notdef-outline-retain-gids.30,31,32,33.otf} | Bin 2304 -> 2292 bytes
+ ...ules_f1.notdef-outline-retain-gids.41,42,43.otf | Bin 0 -> 2020 bytes
+ ...f-outline-retain-gids.retain-all-codepoint.otf} | Bin 3916 -> 3880 bytes
+ ...ple_subrules_f1.notdef-outline.30,31,32,33.otf} | Bin 1832 -> 1820 bytes
+ ...ultiple_subrules_f1.notdef-outline.41,42,43.otf | Bin 0 -> 1308 bytes
+ ...les_f1.notdef-outline.retain-all-codepoint.otf} | Bin 3916 -> 3880 bytes
+ ...1_multiple_subrules_f1.retain-gids.41,42,43.otf | Bin 2056 -> 0 bytes
+ ...ning2_multiple_subrules_f1.default.41,42,43.otf | Bin 1344 -> 0 bytes
+ ..._f1.notdef-outline-retain-gids.30,31,32,33.otf} | Bin 2328 -> 2292 bytes
+ ...ules_f1.notdef-outline-retain-gids.41,42,43.otf | Bin 0 -> 2020 bytes
+ ...f-outline-retain-gids.retain-all-codepoint.otf} | Bin 3916 -> 3880 bytes
+ ...ple_subrules_f1.notdef-outline.30,31,32,33.otf} | Bin 1856 -> 1820 bytes
+ ...ultiple_subrules_f1.notdef-outline.41,42,43.otf | Bin 0 -> 1308 bytes
+ ...les_f1.notdef-outline.retain-all-codepoint.otf} | Bin 3916 -> 3880 bytes
+ ...2_multiple_subrules_f1.retain-gids.41,42,43.otf | Bin 2056 -> 0 bytes
+ .../gpos_chaining3_simple_f1.default.41,42,43.otf  | Bin 1320 -> 0 bytes
+ ..._f1.notdef-outline-retain-gids.30,31,32,33.otf} | Bin 2328 -> 2268 bytes
+ ...mple_f1.notdef-outline-retain-gids.41,42,43.otf | Bin 0 -> 1996 bytes
+ ...f-outline-retain-gids.retain-all-codepoint.otf} | Bin 3892 -> 3856 bytes
+ ...ning3_simple_f1.notdef-outline.30,31,32,33.otf} | Bin 1856 -> 1796 bytes
+ ...chaining3_simple_f1.notdef-outline.41,42,43.otf | Bin 0 -> 1284 bytes
+ ...ple_f1.notdef-outline.retain-all-codepoint.otf} | Bin 3892 -> 3856 bytes
+ ...os_chaining3_simple_f1.retain-gids.41,42,43.otf | Bin 2032 -> 0 bytes
+ .../layout.gpos9/gpos9_font2.default.42.otf        | Bin 1044 -> 0 bytes
+ ...os9_font2.notdef-outline-retain-gids.41,42.otf} | Bin 1928 -> 1868 bytes
+ .../gpos9_font2.notdef-outline-retain-gids.41.otf  | Bin 0 -> 1852 bytes
+ ... gpos9_font2.notdef-outline-retain-gids.42.otf} | Bin 1760 -> 1724 bytes
+ .../gpos9_font2.notdef-outline.41,42.otf}          | Bin 1220 -> 1160 bytes
+ .../layout.gpos9/gpos9_font2.notdef-outline.41.otf | Bin 0 -> 1148 bytes
+ .../layout.gpos9/gpos9_font2.notdef-outline.42.otf | Bin 0 -> 1008 bytes
+ ...ub_alternate_substitution.default.53A9,53F1.otf | Bin 4372 -> 4316 bytes
+ .../gsub_alternate_substitution.default.53A9.otf   | Bin 3928 -> 3884 bytes
+ .../gsub_alternate_substitution.default.53F1.otf   | Bin 2484 -> 2440 bytes
+ ...e_substitution.default.retain-all-codepoint.otf | Bin 6064 -> 5984 bytes
+ ...lternate_substitution.retain-gids.53A9,53F1.otf | Bin 4496 -> 4440 bytes
+ ...sub_alternate_substitution.retain-gids.53A9.otf | Bin 4080 -> 4036 bytes
+ ...sub_alternate_substitution.retain-gids.53F1.otf | Bin 2676 -> 2632 bytes
+ ...bstitution.retain-gids.retain-all-codepoint.otf | Bin 6156 -> 6076 bytes
+ ...les_f2.notdef-outline-retain-gids.41,42,43.otf} | Bin 2064 -> 2028 bytes
+ ...brules_f2.notdef-outline-retain-gids.41,42.otf} | Bin 1960 -> 1924 bytes
+ ...brules_f2.notdef-outline-retain-gids.41,43.otf} | Bin 2080 -> 2032 bytes
+ ..._subrules_f2.notdef-outline-retain-gids.41.otf} | Bin 1944 -> 1908 bytes
+ ...f-outline-retain-gids.retain-all-codepoint.otf} | Bin 3924 -> 3888 bytes
+ ...ltiple_subrules_f2.notdef-outline.41,42,43.otf} | Bin 1352 -> 1316 bytes
+ ..._multiple_subrules_f2.notdef-outline.41,42.otf} | Bin 1252 -> 1216 bytes
+ ..._multiple_subrules_f2.notdef-outline.41,43.otf} | Bin 1360 -> 1312 bytes
+ ...xt1_multiple_subrules_f2.notdef-outline.41.otf} | Bin 1240 -> 1204 bytes
+ ...les_f2.notdef-outline.retain-all-codepoint.otf} | Bin 3924 -> 3888 bytes
+ ...les_f2.notdef-outline-retain-gids.41,42,43.otf} | Bin 2064 -> 2028 bytes
+ ...brules_f2.notdef-outline-retain-gids.41,42.otf} | Bin 1960 -> 1924 bytes
+ ...brules_f2.notdef-outline-retain-gids.41,43.otf} | Bin 2080 -> 2032 bytes
+ ..._subrules_f2.notdef-outline-retain-gids.41.otf} | Bin 1944 -> 1908 bytes
+ ...f-outline-retain-gids.retain-all-codepoint.otf} | Bin 3924 -> 3888 bytes
+ ...ltiple_subrules_f2.notdef-outline.41,42,43.otf} | Bin 1352 -> 1316 bytes
+ ..._multiple_subrules_f2.notdef-outline.41,42.otf} | Bin 1252 -> 1216 bytes
+ ..._multiple_subrules_f2.notdef-outline.41,43.otf} | Bin 1360 -> 1312 bytes
+ ...xt2_multiple_subrules_f2.notdef-outline.41.otf} | Bin 1240 -> 1204 bytes
+ ...les_f2.notdef-outline.retain-all-codepoint.otf} | Bin 3924 -> 3888 bytes
+ ...ive_f1.notdef-outline-retain-gids.41,42,43.otf} | Bin 2044 -> 2016 bytes
+ ...essive_f1.notdef-outline-retain-gids.41,42.otf} | Bin 1948 -> 1912 bytes
+ ...cessive_f1.notdef-outline-retain-gids.41,43.otf | Bin 0 -> 2020 bytes
+ ...uccessive_f1.notdef-outline-retain-gids.41.otf} | Bin 1932 -> 1896 bytes
+ ...f-outline-retain-gids.retain-all-codepoint.otf} | Bin 3912 -> 3876 bytes
+ ...ext3_successive_f1.notdef-outline.41,42,43.otf} | Bin 1332 -> 1304 bytes
+ ...ontext3_successive_f1.notdef-outline.41,42.otf} | Bin 1240 -> 1204 bytes
+ ...ontext3_successive_f1.notdef-outline.41,43.otf} | Bin 1348 -> 1300 bytes
+ ...b_context3_successive_f1.notdef-outline.41.otf} | Bin 1228 -> 1192 bytes
+ ...ive_f1.notdef-outline.retain-all-codepoint.otf} | Bin 3912 -> 3876 bytes
+ ...ub_context3_successive_f1.retain-gids.41,43.otf | Bin 2068 -> 0 bytes
+ ...ning1_multiple_subrules_f1.default.41,42,43.otf | Bin 1356 -> 0 bytes
+ ..._f1.notdef-outline-retain-gids.30,31,32,33.otf} | Bin 2316 -> 2304 bytes
+ ...les_f1.notdef-outline-retain-gids.41,42,43.otf} | Bin 2052 -> 2032 bytes
+ ...f-outline-retain-gids.retain-all-codepoint.otf} | Bin 3928 -> 3892 bytes
+ ...ple_subrules_f1.notdef-outline.30,31,32,33.otf} | Bin 1844 -> 1832 bytes
+ ...ltiple_subrules_f1.notdef-outline.41,42,43.otf} | Bin 1340 -> 1320 bytes
+ ...les_f1.notdef-outline.retain-all-codepoint.otf} | Bin 3928 -> 3892 bytes
+ ..._f1.notdef-outline-retain-gids.30,31,32,33.otf} | Bin 2340 -> 2304 bytes
+ ...les_f1.notdef-outline-retain-gids.41,42,43.otf} | Bin 2068 -> 2032 bytes
+ ...f-outline-retain-gids.retain-all-codepoint.otf} | Bin 3928 -> 3892 bytes
+ ...ple_subrules_f1.notdef-outline.30,31,32,33.otf} | Bin 1868 -> 1832 bytes
+ ...ltiple_subrules_f1.notdef-outline.41,42,43.otf} | Bin 1356 -> 1320 bytes
+ ...les_f1.notdef-outline.retain-all-codepoint.otf} | Bin 3928 -> 3892 bytes
+ ..._f2.notdef-outline-retain-gids.30,31,32,33.otf} | Bin 2340 -> 2280 bytes
+ ...ple_f2.notdef-outline-retain-gids.41,42,43.otf} | Bin 2068 -> 2008 bytes
+ ...f-outline-retain-gids.retain-all-codepoint.otf} | Bin 3904 -> 3868 bytes
+ ...ning3_simple_f2.notdef-outline.30,31,32,33.otf} | Bin 1868 -> 1808 bytes
+ ...chaining3_simple_f2.notdef-outline.41,42,43.otf | Bin 0 -> 1296 bytes
+ ...ple_f2.notdef-outline.retain-all-codepoint.otf} | Bin 3904 -> 3868 bytes
+ ...ine-retain-gids.41,42,43,44,45,46,47,48,49.otf} | Bin
+ ...f-outline-retain-gids.41,42,43,44,45,46,47.otf} | Bin
+ ...f-outline-retain-gids.41,42,43,44,45,46,4D.otf} | Bin
+ ...f-outline-retain-gids.41,42,43,44,45,46,51.otf} | Bin
+ ...tdef-outline-retain-gids.41,42,43,44,45,46.otf} | Bin
+ ...reated.notdef-outline-retain-gids.41,42,43.otf} | Bin
+ ...ally_created.notdef-outline-retain-gids.41.otf} | Bin
+ ...ally_created.notdef-outline-retain-gids.61.otf} | Bin
+ ...f-outline-retain-gids.retain-all-codepoint.otf} | Bin
+ ....notdef-outline.41,42,43,44,45,46,47,48,49.otf} | Bin
+ ...reated.notdef-outline.41,42,43,44,45,46,47.otf} | Bin
+ ...reated.notdef-outline.41,42,43,44,45,46,4D.otf} | Bin
+ ...reated.notdef-outline.41,42,43,44,45,46,51.otf} | Bin
+ ...y_created.notdef-outline.41,42,43,44,45,46.otf} | Bin
+ ...8_manually_created.notdef-outline.41,42,43.otf} | Bin
+ ...> gsub8_manually_created.notdef-outline.41.otf} | Bin
+ ...> gsub8_manually_created.notdef-outline.61.otf} | Bin
+ ...reated.notdef-outline.retain-all-codepoint.otf} | Bin
+ .../Roboto-Regular.smallcaps.default.41,42,43.ttf  | Bin 2460 -> 2424 bytes
+ .../Roboto-Regular.smallcaps.default.41,43.ttf     | Bin 2280 -> 2232 bytes
+ .../layout/Roboto-Regular.smallcaps.default.41.ttf | Bin 2080 -> 2044 bytes
+ .../layout/Roboto-Regular.smallcaps.default.43.ttf | Bin 2112 -> 2076 bytes
+ .../Roboto-Regular.smallcaps.default.CA,CB.ttf     | Bin 2384 -> 2348 bytes
+ ...boto-Regular.smallcaps.retain-gids.41,42,43.ttf | Bin 2712 -> 2676 bytes
+ .../Roboto-Regular.smallcaps.retain-gids.41,43.ttf | Bin 2544 -> 2496 bytes
+ .../Roboto-Regular.smallcaps.retain-gids.41.ttf    | Bin 2332 -> 2296 bytes
+ .../Roboto-Regular.smallcaps.retain-gids.43.ttf    | Bin 2380 -> 2344 bytes
+ .../Roboto-Regular.smallcaps.retain-gids.CA,CB.ttf | Bin 6472 -> 6436 bytes
+ .../notdef-outline-desubroutinize-retain-gids.txt  |   3 +
+ .../profiles/notdef-outline-desubroutinize.txt     |   2 +
+ ...tline-drop-hints-desubroutinize-retain-gids.txt |   4 +
+ .../notdef-outline-drop-hints-desubroutinize.txt   |   3 +
+ .../notdef-outline-drop-hints-retain-gids.txt      |   3 +
+ .../data/profiles/notdef-outline-drop-hints.txt    |   2 +
+ test/subset/data/profiles/notdef-outline-gids.txt  |   2 +
+ .../data/profiles/notdef-outline-name-ids.txt      |   2 +
+ .../data/profiles/notdef-outline-retain-gids.txt   |   2 +
+ test/subset/data/tests/cff-full-font.tests         |  16 ++--
+ test/subset/data/tests/cmap14.tests                |  12 +--
+ test/subset/data/tests/layout.context.tests        |   4 +-
+ test/subset/data/tests/layout.gdef-varstore.tests  |   5 +-
+ test/subset/data/tests/layout.gpos.tests           |   4 +-
+ test/subset/data/tests/layout.gpos2.tests          |   4 +-
+ test/subset/data/tests/layout.gpos3.tests          |   4 +-
+ test/subset/data/tests/layout.gpos4.tests          |   4 +-
+ test/subset/data/tests/layout.gpos5.tests          |   4 +-
+ test/subset/data/tests/layout.gpos6.tests          |   4 +-
+ test/subset/data/tests/layout.gpos8.tests          |   4 +-
+ test/subset/data/tests/layout.gpos9.tests          |   4 +-
+ test/subset/data/tests/layout.gsub5.tests          |   4 +-
+ test/subset/data/tests/layout.gsub6.tests          |   4 +-
+ test/subset/data/tests/layout.gsub8.tests          |   4 +-
+ 681 files changed, 162 insertions(+), 44 deletions(-)
+
+commit 84946e4d2c0c362e969eb13e5a6acae0a76c6015
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Thu Aug 5 00:05:26 2021 +0200
+
+    [test] Suggest updating the expectation if ttx matches
+    
+    https://github.com/harfbuzz/harfbuzz/issues/3089#issuecomment-892208892
+
+ test/subset/run-tests.py | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 09c3b82f5e5a25f07145f405776c466b02743442
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 29 17:49:10 2021 -0600
+
+    [buffer] When shifting forward, leave no gap
+    
+    Trying to see if this fixes the fuzzer issue:
+    https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=36236
+
+ src/hb-buffer.cc | 9 ++++-----
+ 1 file changed, 4 insertions(+), 5 deletions(-)
+
+commit 5086e10538b893294f1b64a33deb8c5af4d22f1b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 29 17:03:55 2021 -0600
+
+    [test] Add failing fuzzer test case
+    
+    From https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=36236
+    https://oss-fuzz.com/testcase-detail/5061207689134080
+
+ ...z-testcase-minimized-hb-shape-fuzzer-5061207689134080 | Bin 0 -> 3344 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit a150baf32c2cbb03a0efd6e260904c57d93275d9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 4 11:53:27 2021 -0600
+
+    [ot-map] Allocate top mask bit as global bit
+    
+    Avoids undefined-shift of 32 in the following line:
+    
+      map->mask = (1u << (next_bit + bits_needed)) - (1u << next_bit)
+    
+    Fixes https://bugs.chromium.org/p/chromium/issues/detail?id=1219263
+
+ src/hb-ot-map.cc | 11 +++++------
+ 1 file changed, 5 insertions(+), 6 deletions(-)
+
+commit f698fe5aeede4027230046d4b06c265b33f0085a
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Aug 4 12:08:18 2021 +0200
+
+    [test] Always fail subset tests if hashes don’t match
+    
+    Regardless of the pre sentience or absence of fonttools.
+
+ test/subset/run-tests.py | 65 +++++++++++++++++++++---------------------------
+ 1 file changed, 28 insertions(+), 37 deletions(-)
+
+commit e80c86ffa6868f8bbcfd3a21b4b82a1436527100
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 4 10:24:14 2021 -0600
+
+    [coretext] Fix formatting
+
+ src/hb-coretext.cc | 69 +++++++++++++++++++++++++++++-------------------------
+ 1 file changed, 37 insertions(+), 32 deletions(-)
+
+commit db6fbe29e47ce871e66ebbf2eb93657bad429d13
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 3 10:13:17 2021 -0600
+
+    [util/hb-subset] Use driver_t<> in outer block as well
+    
+    https://github.com/harfbuzz/harfbuzz/commit/a363ce573c3aa706de3aecf0515519a5d7842af2#r54282223
+
+ util/hb-subset.cc | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 66aef2818e1450a14549ca3e202e094e335f6b78
+Author: Simon Cozens <simon@simon-cozens.org>
+Date:   Wed Aug 4 13:34:52 2021 +0100
+
+    Support passing variations to coretext shaper
+
+ src/hb-coretext.cc | 33 +++++++++++++++++++++++++++++++++
+ 1 file changed, 33 insertions(+)
+
+commit f25daa4794f22f7e0eaddb77ef7b47c8c6584453
+Merge: 62a535f15 9f544e500
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 4 00:06:32 2021 -0600
+
+    Merge pull request #3110 from harfbuzz/subset-tests-fast
+    
+    [test] Make subset tests fast
+
+commit 9f544e5008e27346ace98abd7c3e8e5184724920
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Aug 4 04:20:14 2021 +0200
+
+    [test] Don’t skip subset tests early
+    
+    Check for FontTools only when the checksums are mismatching.
+
+ test/subset/run-tests.py | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+commit b0841533174b752f9ac4b3c62f81c98cb7be197a
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Aug 4 04:12:31 2021 +0200
+
+    [test] Remove subset tests from the slow suite
+
+ test/subset/meson.build | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 7ccc52b0751795b32db989b71295f1fee2c9ab21
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Aug 4 03:57:18 2021 +0200
+
+    [test] Compare sha256 hash before TTX dumps
+    
+    Most of time the files are identical, so instead of comparing the TTX
+    dump we can check sha256 hashes of the files first and if they match, we
+    don’t have to check the TTX dumps at all, making the subset tests orders
+    of magnitude faster.
+    
+    time meson test --suite=subset down from:
+    real    0m19.418s
+    user    0m38.171s
+    sys     0m3.587s
+    
+    to:
+    real    0m3.102s
+    user    0m8.622s
+    sys     0m1.701s
+    
+    The expected files have been replaced by hb-subset output so they are
+    bit-identical where FontTools output might not.
+    
+    The generate-expected-outputs.py now compares the hb-subset output with
+    fontttols subset and errors of they don’t match.
+
+ .../Comfortaa-Regular-new.default.61,62,63.ttf     | Bin 7060 -> 7060 bytes
+ .../basics/Comfortaa-Regular-new.default.61,63.ttf | Bin 6692 -> 6692 bytes
+ .../basics/Comfortaa-Regular-new.default.61.ttf    | Bin 6328 -> 6328 bytes
+ .../basics/Comfortaa-Regular-new.default.62.ttf    | Bin 6200 -> 6200 bytes
+ .../basics/Comfortaa-Regular-new.default.63.ttf    | Bin 6256 -> 6256 bytes
+ ...aa-Regular-new.default.retain-all-codepoint.ttf | Bin 220928 -> 222756 bytes
+ ...Regular-new.drop-hints-retain-gids.61,62,63.ttf | Bin 4608 -> 4608 bytes
+ ...aa-Regular-new.drop-hints-retain-gids.61,63.ttf | Bin 4312 -> 4312 bytes
+ ...ortaa-Regular-new.drop-hints-retain-gids.61.ttf | Bin 3724 -> 3724 bytes
+ ...ortaa-Regular-new.drop-hints-retain-gids.62.ttf | Bin 3900 -> 3900 bytes
+ ...ortaa-Regular-new.drop-hints-retain-gids.63.ttf | Bin 3972 -> 3972 bytes
+ ...drop-hints-retain-gids.retain-all-codepoint.ttf | Bin 189800 -> 191632 bytes
+ .../Comfortaa-Regular-new.drop-hints.61,62,63.ttf  | Bin 2600 -> 2600 bytes
+ .../Comfortaa-Regular-new.drop-hints.61,63.ttf     | Bin 2296 -> 2296 bytes
+ .../basics/Comfortaa-Regular-new.drop-hints.61.ttf | Bin 1976 -> 1976 bytes
+ .../basics/Comfortaa-Regular-new.drop-hints.62.ttf | Bin 1900 -> 1900 bytes
+ .../basics/Comfortaa-Regular-new.drop-hints.63.ttf | Bin 1968 -> 1968 bytes
+ ...Regular-new.drop-hints.retain-all-codepoint.ttf | Bin 189756 -> 191584 bytes
+ .../basics/Comfortaa-Regular-new.gids.61,62,63.ttf | Bin 7988 -> 7988 bytes
+ .../basics/Comfortaa-Regular-new.gids.61,63.ttf    | Bin 7628 -> 7628 bytes
+ .../basics/Comfortaa-Regular-new.gids.61.ttf       | Bin 7256 -> 7256 bytes
+ .../basics/Comfortaa-Regular-new.gids.62.ttf       | Bin 7184 -> 7184 bytes
+ .../basics/Comfortaa-Regular-new.gids.63.ttf       | Bin 7180 -> 7180 bytes
+ ...ortaa-Regular-new.gids.retain-all-codepoint.ttf | Bin 220928 -> 222756 bytes
+ .../Comfortaa-Regular-new.glyph-names.61,62,63.ttf | Bin 7072 -> 7072 bytes
+ .../Comfortaa-Regular-new.glyph-names.61,63.ttf    | Bin 6700 -> 6700 bytes
+ .../Comfortaa-Regular-new.glyph-names.61.ttf       | Bin 6336 -> 6336 bytes
+ .../Comfortaa-Regular-new.glyph-names.62.ttf       | Bin 6208 -> 6208 bytes
+ .../Comfortaa-Regular-new.glyph-names.63.ttf       | Bin 6264 -> 6264 bytes
+ ...egular-new.glyph-names.retain-all-codepoint.ttf | Bin 227920 -> 229748 bytes
+ ...gular-new.keep-all-layout-features.61,62,63.ttf | Bin 7504 -> 7508 bytes
+ ...-Regular-new.keep-all-layout-features.61,63.ttf | Bin 7140 -> 7144 bytes
+ ...taa-Regular-new.keep-all-layout-features.61.ttf | Bin 6772 -> 6776 bytes
+ ...taa-Regular-new.keep-all-layout-features.62.ttf | Bin 6200 -> 6200 bytes
+ ...taa-Regular-new.keep-all-layout-features.63.ttf | Bin 6256 -> 6256 bytes
+ ...ep-all-layout-features.retain-all-codepoint.ttf | Bin 221620 -> 223452 bytes
+ ...fortaa-Regular-new.layout-features.61,62,63.ttf | Bin 7060 -> 7060 bytes
+ ...Comfortaa-Regular-new.layout-features.61,63.ttf | Bin 6692 -> 6692 bytes
+ .../Comfortaa-Regular-new.layout-features.61.ttf   | Bin 6328 -> 6328 bytes
+ .../Comfortaa-Regular-new.layout-features.62.ttf   | Bin 6200 -> 6200 bytes
+ .../Comfortaa-Regular-new.layout-features.63.ttf   | Bin 6256 -> 6256 bytes
+ ...ar-new.layout-features.retain-all-codepoint.ttf | Bin 219124 -> 220948 bytes
+ .../Comfortaa-Regular-new.name-ids.61,62,63.ttf    | Bin 6800 -> 6800 bytes
+ .../Comfortaa-Regular-new.name-ids.61,63.ttf       | Bin 6432 -> 6432 bytes
+ .../basics/Comfortaa-Regular-new.name-ids.61.ttf   | Bin 6068 -> 6068 bytes
+ .../basics/Comfortaa-Regular-new.name-ids.62.ttf   | Bin 5940 -> 5940 bytes
+ .../basics/Comfortaa-Regular-new.name-ids.63.ttf   | Bin 5996 -> 5996 bytes
+ ...a-Regular-new.name-ids.retain-all-codepoint.ttf | Bin 220668 -> 222496 bytes
+ ...mfortaa-Regular-new.name-languages.61,62,63.ttf | Bin 7060 -> 7060 bytes
+ .../Comfortaa-Regular-new.name-languages.61,63.ttf | Bin 6692 -> 6692 bytes
+ .../Comfortaa-Regular-new.name-languages.61.ttf    | Bin 6328 -> 6328 bytes
+ .../Comfortaa-Regular-new.name-languages.62.ttf    | Bin 6200 -> 6200 bytes
+ .../Comfortaa-Regular-new.name-languages.63.ttf    | Bin 6256 -> 6256 bytes
+ ...lar-new.name-languages.retain-all-codepoint.ttf | Bin 220928 -> 222756 bytes
+ .../Comfortaa-Regular-new.name-legacy.61,62,63.ttf | Bin 7060 -> 7060 bytes
+ .../Comfortaa-Regular-new.name-legacy.61,63.ttf    | Bin 6692 -> 6692 bytes
+ .../Comfortaa-Regular-new.name-legacy.61.ttf       | Bin 6328 -> 6328 bytes
+ .../Comfortaa-Regular-new.name-legacy.62.ttf       | Bin 6200 -> 6200 bytes
+ .../Comfortaa-Regular-new.name-legacy.63.ttf       | Bin 6256 -> 6256 bytes
+ ...egular-new.name-legacy.retain-all-codepoint.ttf | Bin 220928 -> 222756 bytes
+ ...egular-new.no-prune-unicode-ranges.61,62,63.ttf | Bin 7060 -> 7060 bytes
+ ...a-Regular-new.no-prune-unicode-ranges.61,63.ttf | Bin 6692 -> 6692 bytes
+ ...rtaa-Regular-new.no-prune-unicode-ranges.61.ttf | Bin 6328 -> 6328 bytes
+ ...rtaa-Regular-new.no-prune-unicode-ranges.62.ttf | Bin 6200 -> 6200 bytes
+ ...rtaa-Regular-new.no-prune-unicode-ranges.63.ttf | Bin 6256 -> 6256 bytes
+ ...o-prune-unicode-ranges.retain-all-codepoint.ttf | Bin 220928 -> 222756 bytes
+ ...mfortaa-Regular-new.notdef-outline.61,62,63.ttf | Bin 7652 -> 7652 bytes
+ .../Comfortaa-Regular-new.notdef-outline.61,63.ttf | Bin 7284 -> 7284 bytes
+ .../Comfortaa-Regular-new.notdef-outline.61.ttf    | Bin 6920 -> 6920 bytes
+ .../Comfortaa-Regular-new.notdef-outline.62.ttf    | Bin 6796 -> 6796 bytes
+ .../Comfortaa-Regular-new.notdef-outline.63.ttf    | Bin 6844 -> 6844 bytes
+ ...lar-new.notdef-outline.retain-all-codepoint.ttf | Bin 221524 -> 223352 bytes
+ .../Comfortaa-Regular-new.retain-gids.61,62,63.ttf | Bin 9068 -> 9068 bytes
+ .../Comfortaa-Regular-new.retain-gids.61,63.ttf    | Bin 8708 -> 8708 bytes
+ .../Comfortaa-Regular-new.retain-gids.61.ttf       | Bin 8076 -> 8076 bytes
+ .../Comfortaa-Regular-new.retain-gids.62.ttf       | Bin 8200 -> 8200 bytes
+ .../Comfortaa-Regular-new.retain-gids.63.ttf       | Bin 8260 -> 8260 bytes
+ ...egular-new.retain-gids.retain-all-codepoint.ttf | Bin 220972 -> 222804 bytes
+ ...numMyeongjo-Regular-subset.default.61,62,63.ttf | Bin 4128 -> 4128 bytes
+ .../NanumMyeongjo-Regular-subset.default.61,63.ttf | Bin 3580 -> 3580 bytes
+ .../NanumMyeongjo-Regular-subset.default.61.ttf    | Bin 3156 -> 3156 bytes
+ .../NanumMyeongjo-Regular-subset.default.62.ttf    | Bin 3180 -> 3180 bytes
+ .../NanumMyeongjo-Regular-subset.default.63.ttf    | Bin 3048 -> 3048 bytes
+ ...Regular-subset.default.retain-all-codepoint.ttf | Bin 9524 -> 9524 bytes
+ ...ular-subset.drop-hints-retain-gids.61,62,63.ttf | Bin 1452 -> 1452 bytes
+ ...Regular-subset.drop-hints-retain-gids.61,63.ttf | Bin 1284 -> 1284 bytes
+ ...jo-Regular-subset.drop-hints-retain-gids.61.ttf | Bin 1128 -> 1128 bytes
+ ...jo-Regular-subset.drop-hints-retain-gids.62.ttf | Bin 1144 -> 1144 bytes
+ ...jo-Regular-subset.drop-hints-retain-gids.63.ttf | Bin 1116 -> 1116 bytes
+ ...drop-hints-retain-gids.retain-all-codepoint.ttf | Bin 3536 -> 3536 bytes
+ ...Myeongjo-Regular-subset.drop-hints.61,62,63.ttf | Bin 1452 -> 1452 bytes
+ ...numMyeongjo-Regular-subset.drop-hints.61,63.ttf | Bin 1276 -> 1276 bytes
+ .../NanumMyeongjo-Regular-subset.drop-hints.61.ttf | Bin 1128 -> 1128 bytes
+ .../NanumMyeongjo-Regular-subset.drop-hints.62.ttf | Bin 1140 -> 1140 bytes
+ .../NanumMyeongjo-Regular-subset.drop-hints.63.ttf | Bin 1104 -> 1104 bytes
+ ...ular-subset.drop-hints.retain-all-codepoint.ttf | Bin 3536 -> 3536 bytes
+ .../NanumMyeongjo-Regular-subset.gids.61,62,63.ttf | Bin 4128 -> 4128 bytes
+ .../NanumMyeongjo-Regular-subset.gids.61,63.ttf    | Bin 4128 -> 4128 bytes
+ .../NanumMyeongjo-Regular-subset.gids.61.ttf       | Bin 4128 -> 4128 bytes
+ .../NanumMyeongjo-Regular-subset.gids.62.ttf       | Bin 4128 -> 4128 bytes
+ .../NanumMyeongjo-Regular-subset.gids.63.ttf       | Bin 4128 -> 4128 bytes
+ ...jo-Regular-subset.gids.retain-all-codepoint.ttf | Bin 9524 -> 9524 bytes
+ ...yeongjo-Regular-subset.glyph-names.61,62,63.ttf | Bin 4128 -> 4128 bytes
+ ...umMyeongjo-Regular-subset.glyph-names.61,63.ttf | Bin 3580 -> 3580 bytes
+ ...NanumMyeongjo-Regular-subset.glyph-names.61.ttf | Bin 3156 -> 3156 bytes
+ ...NanumMyeongjo-Regular-subset.glyph-names.62.ttf | Bin 3180 -> 3180 bytes
+ ...NanumMyeongjo-Regular-subset.glyph-names.63.ttf | Bin 3048 -> 3048 bytes
+ ...lar-subset.glyph-names.retain-all-codepoint.ttf | Bin 9524 -> 9524 bytes
+ ...ar-subset.keep-all-layout-features.61,62,63.ttf | Bin 4128 -> 4128 bytes
+ ...gular-subset.keep-all-layout-features.61,63.ttf | Bin 3580 -> 3580 bytes
+ ...-Regular-subset.keep-all-layout-features.61.ttf | Bin 3156 -> 3156 bytes
+ ...-Regular-subset.keep-all-layout-features.62.ttf | Bin 3180 -> 3180 bytes
+ ...-Regular-subset.keep-all-layout-features.63.ttf | Bin 3048 -> 3048 bytes
+ ...ep-all-layout-features.retain-all-codepoint.ttf | Bin 9524 -> 9524 bytes
+ ...gjo-Regular-subset.layout-features.61,62,63.ttf | Bin 4128 -> 4128 bytes
+ ...eongjo-Regular-subset.layout-features.61,63.ttf | Bin 3580 -> 3580 bytes
+ ...mMyeongjo-Regular-subset.layout-features.61.ttf | Bin 3156 -> 3156 bytes
+ ...mMyeongjo-Regular-subset.layout-features.62.ttf | Bin 3180 -> 3180 bytes
+ ...mMyeongjo-Regular-subset.layout-features.63.ttf | Bin 3048 -> 3048 bytes
+ ...subset.layout-features.retain-all-codepoint.ttf | Bin 9524 -> 9524 bytes
+ ...umMyeongjo-Regular-subset.name-ids.61,62,63.ttf | Bin 3924 -> 3924 bytes
+ ...NanumMyeongjo-Regular-subset.name-ids.61,63.ttf | Bin 3376 -> 3376 bytes
+ .../NanumMyeongjo-Regular-subset.name-ids.61.ttf   | Bin 2952 -> 2952 bytes
+ .../NanumMyeongjo-Regular-subset.name-ids.62.ttf   | Bin 2976 -> 2976 bytes
+ .../NanumMyeongjo-Regular-subset.name-ids.63.ttf   | Bin 2844 -> 2844 bytes
+ ...egular-subset.name-ids.retain-all-codepoint.ttf | Bin 9320 -> 9320 bytes
+ ...ngjo-Regular-subset.name-languages.61,62,63.ttf | Bin 4172 -> 4172 bytes
+ ...yeongjo-Regular-subset.name-languages.61,63.ttf | Bin 3624 -> 3624 bytes
+ ...umMyeongjo-Regular-subset.name-languages.61.ttf | Bin 3200 -> 3200 bytes
+ ...umMyeongjo-Regular-subset.name-languages.62.ttf | Bin 3224 -> 3224 bytes
+ ...umMyeongjo-Regular-subset.name-languages.63.ttf | Bin 3092 -> 3092 bytes
+ ...-subset.name-languages.retain-all-codepoint.ttf | Bin 9568 -> 9568 bytes
+ ...yeongjo-Regular-subset.name-legacy.61,62,63.ttf | Bin 4128 -> 4128 bytes
+ ...umMyeongjo-Regular-subset.name-legacy.61,63.ttf | Bin 3580 -> 3580 bytes
+ ...NanumMyeongjo-Regular-subset.name-legacy.61.ttf | Bin 3156 -> 3156 bytes
+ ...NanumMyeongjo-Regular-subset.name-legacy.62.ttf | Bin 3180 -> 3180 bytes
+ ...NanumMyeongjo-Regular-subset.name-legacy.63.ttf | Bin 3048 -> 3048 bytes
+ ...lar-subset.name-legacy.retain-all-codepoint.ttf | Bin 9524 -> 9524 bytes
+ ...lar-subset.no-prune-unicode-ranges.61,62,63.ttf | Bin 4128 -> 4128 bytes
+ ...egular-subset.no-prune-unicode-ranges.61,63.ttf | Bin 3580 -> 3580 bytes
+ ...o-Regular-subset.no-prune-unicode-ranges.61.ttf | Bin 3156 -> 3156 bytes
+ ...o-Regular-subset.no-prune-unicode-ranges.62.ttf | Bin 3180 -> 3180 bytes
+ ...o-Regular-subset.no-prune-unicode-ranges.63.ttf | Bin 3048 -> 3048 bytes
+ ...o-prune-unicode-ranges.retain-all-codepoint.ttf | Bin 9524 -> 9524 bytes
+ ...ngjo-Regular-subset.notdef-outline.61,62,63.ttf | Bin 4128 -> 4128 bytes
+ ...yeongjo-Regular-subset.notdef-outline.61,63.ttf | Bin 3580 -> 3580 bytes
+ ...umMyeongjo-Regular-subset.notdef-outline.61.ttf | Bin 3156 -> 3156 bytes
+ ...umMyeongjo-Regular-subset.notdef-outline.62.ttf | Bin 3180 -> 3180 bytes
+ ...umMyeongjo-Regular-subset.notdef-outline.63.ttf | Bin 3048 -> 3048 bytes
+ ...-subset.notdef-outline.retain-all-codepoint.ttf | Bin 9524 -> 9524 bytes
+ ...yeongjo-Regular-subset.retain-gids.61,62,63.ttf | Bin 4128 -> 4128 bytes
+ ...umMyeongjo-Regular-subset.retain-gids.61,63.ttf | Bin 3588 -> 3588 bytes
+ ...NanumMyeongjo-Regular-subset.retain-gids.61.ttf | Bin 3156 -> 3156 bytes
+ ...NanumMyeongjo-Regular-subset.retain-gids.62.ttf | Bin 3184 -> 3184 bytes
+ ...NanumMyeongjo-Regular-subset.retain-gids.63.ttf | Bin 3060 -> 3060 bytes
+ ...lar-subset.retain-gids.retain-all-codepoint.ttf | Bin 9524 -> 9524 bytes
+ .../basics/Roboto-Regular.abc.default.61,62,63.ttf | Bin 2452 -> 2448 bytes
+ .../basics/Roboto-Regular.abc.default.61,63.ttf    | Bin 2260 -> 2256 bytes
+ .../basics/Roboto-Regular.abc.default.61.ttf       | Bin 2048 -> 2044 bytes
+ .../basics/Roboto-Regular.abc.default.62.ttf       | Bin 1916 -> 1912 bytes
+ .../basics/Roboto-Regular.abc.default.63.ttf       | Bin 1972 -> 1968 bytes
+ ...to-Regular.abc.default.retain-all-codepoint.ttf | Bin 2452 -> 2448 bytes
+ ...Regular.abc.drop-hints-retain-gids.61,62,63.ttf | Bin 1192 -> 1188 bytes
+ ...to-Regular.abc.drop-hints-retain-gids.61,63.ttf | Bin 1124 -> 1120 bytes
+ ...oboto-Regular.abc.drop-hints-retain-gids.61.ttf | Bin 984 -> 980 bytes
+ ...oboto-Regular.abc.drop-hints-retain-gids.62.ttf | Bin 880 -> 876 bytes
+ ...oboto-Regular.abc.drop-hints-retain-gids.63.ttf | Bin 968 -> 964 bytes
+ ...drop-hints-retain-gids.retain-all-codepoint.ttf | Bin 1192 -> 1188 bytes
+ .../Roboto-Regular.abc.drop-hints.61,62,63.ttf     | Bin 1192 -> 1188 bytes
+ .../basics/Roboto-Regular.abc.drop-hints.61,63.ttf | Bin 1108 -> 1104 bytes
+ .../basics/Roboto-Regular.abc.drop-hints.61.ttf    | Bin 984 -> 980 bytes
+ .../basics/Roboto-Regular.abc.drop-hints.62.ttf    | Bin 876 -> 872 bytes
+ .../basics/Roboto-Regular.abc.drop-hints.63.ttf    | Bin 956 -> 952 bytes
+ ...Regular.abc.drop-hints.retain-all-codepoint.ttf | Bin 1192 -> 1188 bytes
+ .../basics/Roboto-Regular.abc.gids.61,62,63.ttf    | Bin 2452 -> 2448 bytes
+ .../basics/Roboto-Regular.abc.gids.61,63.ttf       | Bin 2452 -> 2448 bytes
+ .../expected/basics/Roboto-Regular.abc.gids.61.ttf | Bin 2452 -> 2448 bytes
+ .../expected/basics/Roboto-Regular.abc.gids.62.ttf | Bin 2452 -> 2448 bytes
+ .../expected/basics/Roboto-Regular.abc.gids.63.ttf | Bin 2452 -> 2448 bytes
+ ...oboto-Regular.abc.gids.retain-all-codepoint.ttf | Bin 2452 -> 2448 bytes
+ .../Roboto-Regular.abc.glyph-names.61,62,63.ttf    | Bin 2452 -> 2448 bytes
+ .../Roboto-Regular.abc.glyph-names.61,63.ttf       | Bin 2260 -> 2256 bytes
+ .../basics/Roboto-Regular.abc.glyph-names.61.ttf   | Bin 2048 -> 2044 bytes
+ .../basics/Roboto-Regular.abc.glyph-names.62.ttf   | Bin 1916 -> 1912 bytes
+ .../basics/Roboto-Regular.abc.glyph-names.63.ttf   | Bin 1972 -> 1968 bytes
+ ...egular.abc.glyph-names.retain-all-codepoint.ttf | Bin 2452 -> 2448 bytes
+ ...gular.abc.keep-all-layout-features.61,62,63.ttf | Bin 2452 -> 2448 bytes
+ ...-Regular.abc.keep-all-layout-features.61,63.ttf | Bin 2260 -> 2256 bytes
+ ...oto-Regular.abc.keep-all-layout-features.61.ttf | Bin 2048 -> 2044 bytes
+ ...oto-Regular.abc.keep-all-layout-features.62.ttf | Bin 1916 -> 1912 bytes
+ ...oto-Regular.abc.keep-all-layout-features.63.ttf | Bin 1972 -> 1968 bytes
+ ...ep-all-layout-features.retain-all-codepoint.ttf | Bin 2452 -> 2448 bytes
+ ...Roboto-Regular.abc.layout-features.61,62,63.ttf | Bin 2452 -> 2448 bytes
+ .../Roboto-Regular.abc.layout-features.61,63.ttf   | Bin 2260 -> 2256 bytes
+ .../Roboto-Regular.abc.layout-features.61.ttf      | Bin 2048 -> 2044 bytes
+ .../Roboto-Regular.abc.layout-features.62.ttf      | Bin 1916 -> 1912 bytes
+ .../Roboto-Regular.abc.layout-features.63.ttf      | Bin 1972 -> 1968 bytes
+ ...ar.abc.layout-features.retain-all-codepoint.ttf | Bin 2452 -> 2448 bytes
+ .../Roboto-Regular.abc.name-ids.61,62,63.ttf       | Bin 2452 -> 2448 bytes
+ .../basics/Roboto-Regular.abc.name-ids.61,63.ttf   | Bin 2260 -> 2256 bytes
+ .../basics/Roboto-Regular.abc.name-ids.61.ttf      | Bin 2048 -> 2044 bytes
+ .../basics/Roboto-Regular.abc.name-ids.62.ttf      | Bin 1916 -> 1912 bytes
+ .../basics/Roboto-Regular.abc.name-ids.63.ttf      | Bin 1972 -> 1968 bytes
+ ...o-Regular.abc.name-ids.retain-all-codepoint.ttf | Bin 2452 -> 2448 bytes
+ .../Roboto-Regular.abc.name-languages.61,62,63.ttf | Bin 2452 -> 2448 bytes
+ .../Roboto-Regular.abc.name-languages.61,63.ttf    | Bin 2260 -> 2256 bytes
+ .../Roboto-Regular.abc.name-languages.61.ttf       | Bin 2048 -> 2044 bytes
+ .../Roboto-Regular.abc.name-languages.62.ttf       | Bin 1916 -> 1912 bytes
+ .../Roboto-Regular.abc.name-languages.63.ttf       | Bin 1972 -> 1968 bytes
+ ...lar.abc.name-languages.retain-all-codepoint.ttf | Bin 2452 -> 2448 bytes
+ .../Roboto-Regular.abc.name-legacy.61,62,63.ttf    | Bin 2452 -> 2448 bytes
+ .../Roboto-Regular.abc.name-legacy.61,63.ttf       | Bin 2260 -> 2256 bytes
+ .../basics/Roboto-Regular.abc.name-legacy.61.ttf   | Bin 2048 -> 2044 bytes
+ .../basics/Roboto-Regular.abc.name-legacy.62.ttf   | Bin 1916 -> 1912 bytes
+ .../basics/Roboto-Regular.abc.name-legacy.63.ttf   | Bin 1972 -> 1968 bytes
+ ...egular.abc.name-legacy.retain-all-codepoint.ttf | Bin 2452 -> 2448 bytes
+ ...egular.abc.no-prune-unicode-ranges.61,62,63.ttf | Bin 2452 -> 2448 bytes
+ ...o-Regular.abc.no-prune-unicode-ranges.61,63.ttf | Bin 2260 -> 2256 bytes
+ ...boto-Regular.abc.no-prune-unicode-ranges.61.ttf | Bin 2048 -> 2044 bytes
+ ...boto-Regular.abc.no-prune-unicode-ranges.62.ttf | Bin 1916 -> 1912 bytes
+ ...boto-Regular.abc.no-prune-unicode-ranges.63.ttf | Bin 1972 -> 1968 bytes
+ ...o-prune-unicode-ranges.retain-all-codepoint.ttf | Bin 2452 -> 2448 bytes
+ .../Roboto-Regular.abc.notdef-outline.61,62,63.ttf | Bin 2452 -> 2448 bytes
+ .../Roboto-Regular.abc.notdef-outline.61,63.ttf    | Bin 2260 -> 2256 bytes
+ .../Roboto-Regular.abc.notdef-outline.61.ttf       | Bin 2048 -> 2044 bytes
+ .../Roboto-Regular.abc.notdef-outline.62.ttf       | Bin 1916 -> 1912 bytes
+ .../Roboto-Regular.abc.notdef-outline.63.ttf       | Bin 1972 -> 1968 bytes
+ ...lar.abc.notdef-outline.retain-all-codepoint.ttf | Bin 2452 -> 2448 bytes
+ .../Roboto-Regular.abc.retain-gids.61,62,63.ttf    | Bin 2452 -> 2448 bytes
+ .../Roboto-Regular.abc.retain-gids.61,63.ttf       | Bin 2276 -> 2272 bytes
+ .../basics/Roboto-Regular.abc.retain-gids.61.ttf   | Bin 2048 -> 2044 bytes
+ .../basics/Roboto-Regular.abc.retain-gids.62.ttf   | Bin 1924 -> 1920 bytes
+ .../basics/Roboto-Regular.abc.retain-gids.63.ttf   | Bin 1988 -> 1984 bytes
+ ...egular.abc.retain-gids.retain-all-codepoint.ttf | Bin 2452 -> 2448 bytes
+ .../cbdt/NotoColorEmoji.subset.default.2049.ttf    | Bin 3112 -> 3112 bytes
+ .../cbdt/NotoColorEmoji.subset.default.38,2049.ttf | Bin 4084 -> 4084 bytes
+ .../cbdt/NotoColorEmoji.subset.default.38,20E3.ttf | Bin 3568 -> 3568 bytes
+ ...rEmoji.subset.default.38,39,AE,2049,38,20E3.ttf | Bin 10124 -> 10124 bytes
+ .../NotoColorEmoji.subset.default.38,AE,2049.ttf   | Bin 7544 -> 7544 bytes
+ .../cbdt/NotoColorEmoji.subset.default.39.ttf      | Bin 1920 -> 1920 bytes
+ .../cbdt/NotoColorEmoji.subset.default.AE.ttf      | Bin 4412 -> 4412 bytes
+ ...lorEmoji.subset.drop-hints-retain-gids.2049.ttf | Bin 3136 -> 3136 bytes
+ ...Emoji.subset.drop-hints-retain-gids.38,2049.ttf | Bin 4108 -> 4108 bytes
+ ...Emoji.subset.drop-hints-retain-gids.38,20E3.ttf | Bin 3600 -> 3600 bytes
+ ...rop-hints-retain-gids.38,39,AE,2049,38,20E3.ttf | Bin 10124 -> 10124 bytes
+ ...ji.subset.drop-hints-retain-gids.38,AE,2049.ttf | Bin 7564 -> 7564 bytes
+ ...ColorEmoji.subset.drop-hints-retain-gids.39.ttf | Bin 1928 -> 1928 bytes
+ ...ColorEmoji.subset.drop-hints-retain-gids.AE.ttf | Bin 4428 -> 4428 bytes
+ .../cbdt/NotoColorEmoji.subset.drop-hints.2049.ttf | Bin 3112 -> 3112 bytes
+ .../NotoColorEmoji.subset.drop-hints.38,2049.ttf   | Bin 4084 -> 4084 bytes
+ .../NotoColorEmoji.subset.drop-hints.38,20E3.ttf   | Bin 3568 -> 3568 bytes
+ ...oji.subset.drop-hints.38,39,AE,2049,38,20E3.ttf | Bin 10124 -> 10124 bytes
+ ...NotoColorEmoji.subset.drop-hints.38,AE,2049.ttf | Bin 7544 -> 7544 bytes
+ .../cbdt/NotoColorEmoji.subset.drop-hints.39.ttf   | Bin 1920 -> 1920 bytes
+ .../cbdt/NotoColorEmoji.subset.drop-hints.AE.ttf   | Bin 4412 -> 4412 bytes
+ .../NotoColorEmoji.subset.gap.default.2049.ttf     | Bin 3112 -> 3112 bytes
+ .../NotoColorEmoji.subset.gap.default.38,2049.ttf  | Bin 4084 -> 4084 bytes
+ .../NotoColorEmoji.subset.gap.default.38,20E3.ttf  | Bin 3568 -> 3568 bytes
+ ...ji.subset.gap.default.38,39,AE,2049,38,20E3.ttf | Bin 9188 -> 9188 bytes
+ ...otoColorEmoji.subset.gap.default.38,AE,2049.ttf | Bin 7544 -> 7544 bytes
+ .../cbdt/NotoColorEmoji.subset.gap.default.39.ttf  | Bin 908 -> 908 bytes
+ .../cbdt/NotoColorEmoji.subset.gap.default.AE.ttf  | Bin 4412 -> 4412 bytes
+ ...moji.subset.gap.drop-hints-retain-gids.2049.ttf | Bin 3136 -> 3136 bytes
+ ...i.subset.gap.drop-hints-retain-gids.38,2049.ttf | Bin 4108 -> 4108 bytes
+ ...i.subset.gap.drop-hints-retain-gids.38,20E3.ttf | Bin 3600 -> 3600 bytes
+ ...rop-hints-retain-gids.38,39,AE,2049,38,20E3.ttf | Bin 9188 -> 9188 bytes
+ ...ubset.gap.drop-hints-retain-gids.38,AE,2049.ttf | Bin 7564 -> 7564 bytes
+ ...rEmoji.subset.gap.drop-hints-retain-gids.39.ttf | Bin 916 -> 916 bytes
+ ...rEmoji.subset.gap.drop-hints-retain-gids.AE.ttf | Bin 4428 -> 4428 bytes
+ .../NotoColorEmoji.subset.gap.drop-hints.2049.ttf  | Bin 3112 -> 3112 bytes
+ ...otoColorEmoji.subset.gap.drop-hints.38,2049.ttf | Bin 4084 -> 4084 bytes
+ ...otoColorEmoji.subset.gap.drop-hints.38,20E3.ttf | Bin 3568 -> 3568 bytes
+ ...subset.gap.drop-hints.38,39,AE,2049,38,20E3.ttf | Bin 9188 -> 9188 bytes
+ ...ColorEmoji.subset.gap.drop-hints.38,AE,2049.ttf | Bin 7544 -> 7544 bytes
+ .../NotoColorEmoji.subset.gap.drop-hints.39.ttf    | Bin 908 -> 908 bytes
+ .../NotoColorEmoji.subset.gap.drop-hints.AE.ttf    | Bin 4412 -> 4412 bytes
+ .../NotoColorEmoji.subset.gap.retain-gids.2049.ttf | Bin 3136 -> 3136 bytes
+ ...toColorEmoji.subset.gap.retain-gids.38,2049.ttf | Bin 4108 -> 4108 bytes
+ ...toColorEmoji.subset.gap.retain-gids.38,20E3.ttf | Bin 3600 -> 3600 bytes
+ ...ubset.gap.retain-gids.38,39,AE,2049,38,20E3.ttf | Bin 9188 -> 9188 bytes
+ ...olorEmoji.subset.gap.retain-gids.38,AE,2049.ttf | Bin 7564 -> 7564 bytes
+ .../NotoColorEmoji.subset.gap.retain-gids.39.ttf   | Bin 916 -> 916 bytes
+ .../NotoColorEmoji.subset.gap.retain-gids.AE.ttf   | Bin 4428 -> 4428 bytes
+ ...olorEmoji.subset.index_format3.default.2049.ttf | Bin 3108 -> 3108 bytes
+ ...rEmoji.subset.index_format3.default.38,2049.ttf | Bin 4076 -> 4076 bytes
+ ...rEmoji.subset.index_format3.default.38,20E3.ttf | Bin 3560 -> 3560 bytes
+ ...index_format3.default.38,39,AE,2049,38,20E3.ttf | Bin 10112 -> 10112 bytes
+ ...oji.subset.index_format3.default.38,AE,2049.ttf | Bin 7536 -> 7536 bytes
+ ...oColorEmoji.subset.index_format3.default.39.ttf | Bin 1916 -> 1916 bytes
+ ...oColorEmoji.subset.index_format3.default.AE.ttf | Bin 4408 -> 4408 bytes
+ ...t.index_format3.drop-hints-retain-gids.2049.ttf | Bin 3132 -> 3132 bytes
+ ...ndex_format3.drop-hints-retain-gids.38,2049.ttf | Bin 4100 -> 4100 bytes
+ ...ndex_format3.drop-hints-retain-gids.38,20E3.ttf | Bin 3592 -> 3592 bytes
+ ...rop-hints-retain-gids.38,39,AE,2049,38,20E3.ttf | Bin 10112 -> 10112 bytes
+ ...x_format3.drop-hints-retain-gids.38,AE,2049.ttf | Bin 7552 -> 7552 bytes
+ ...set.index_format3.drop-hints-retain-gids.39.ttf | Bin 1924 -> 1924 bytes
+ ...set.index_format3.drop-hints-retain-gids.AE.ttf | Bin 4424 -> 4424 bytes
+ ...rEmoji.subset.index_format3.drop-hints.2049.ttf | Bin 3108 -> 3108 bytes
+ ...oji.subset.index_format3.drop-hints.38,2049.ttf | Bin 4076 -> 4076 bytes
+ ...oji.subset.index_format3.drop-hints.38,20E3.ttf | Bin 3560 -> 3560 bytes
+ ...ex_format3.drop-hints.38,39,AE,2049,38,20E3.ttf | Bin 10112 -> 10112 bytes
+ ....subset.index_format3.drop-hints.38,AE,2049.ttf | Bin 7536 -> 7536 bytes
+ ...lorEmoji.subset.index_format3.drop-hints.39.ttf | Bin 1916 -> 1916 bytes
+ ...lorEmoji.subset.index_format3.drop-hints.AE.ttf | Bin 4408 -> 4408 bytes
+ ...Emoji.subset.index_format3.retain-gids.2049.ttf | Bin 3132 -> 3132 bytes
+ ...ji.subset.index_format3.retain-gids.38,2049.ttf | Bin 4100 -> 4100 bytes
+ ...ji.subset.index_format3.retain-gids.38,20E3.ttf | Bin 3592 -> 3592 bytes
+ ...x_format3.retain-gids.38,39,AE,2049,38,20E3.ttf | Bin 10112 -> 10112 bytes
+ ...subset.index_format3.retain-gids.38,AE,2049.ttf | Bin 7552 -> 7552 bytes
+ ...orEmoji.subset.index_format3.retain-gids.39.ttf | Bin 1924 -> 1924 bytes
+ ...orEmoji.subset.index_format3.retain-gids.AE.ttf | Bin 4424 -> 4424 bytes
+ ...ji.subset.multiple_size_tables.default.2049.ttf | Bin 5312 -> 5312 bytes
+ ...subset.multiple_size_tables.default.38,2049.ttf | Bin 7244 -> 7244 bytes
+ ...subset.multiple_size_tables.default.38,20E3.ttf | Bin 6212 -> 6212 bytes
+ ...e_size_tables.default.38,39,AE,2049,38,20E3.ttf | Bin 19280 -> 19280 bytes
+ ...set.multiple_size_tables.default.38,AE,2049.ttf | Bin 14140 -> 14140 bytes
+ ...moji.subset.multiple_size_tables.default.39.ttf | Bin 2928 -> 2928 bytes
+ ...moji.subset.multiple_size_tables.default.AE.ttf | Bin 7916 -> 7916 bytes
+ ...ple_size_tables.drop-hints-retain-gids.2049.ttf | Bin 5336 -> 5336 bytes
+ ..._size_tables.drop-hints-retain-gids.38,2049.ttf | Bin 7268 -> 7268 bytes
+ ..._size_tables.drop-hints-retain-gids.38,20E3.ttf | Bin 6244 -> 6244 bytes
+ ...rop-hints-retain-gids.38,39,AE,2049,38,20E3.ttf | Bin 19280 -> 19280 bytes
+ ...ze_tables.drop-hints-retain-gids.38,AE,2049.ttf | Bin 14164 -> 14164 bytes
+ ...tiple_size_tables.drop-hints-retain-gids.39.ttf | Bin 2936 -> 2936 bytes
+ ...tiple_size_tables.drop-hints-retain-gids.AE.ttf | Bin 7932 -> 7932 bytes
+ ...subset.multiple_size_tables.drop-hints.2049.ttf | Bin 5312 -> 5312 bytes
+ ...set.multiple_size_tables.drop-hints.38,2049.ttf | Bin 7244 -> 7244 bytes
+ ...set.multiple_size_tables.drop-hints.38,20E3.ttf | Bin 6212 -> 6212 bytes
+ ...ize_tables.drop-hints.38,39,AE,2049,38,20E3.ttf | Bin 19280 -> 19280 bytes
+ ....multiple_size_tables.drop-hints.38,AE,2049.ttf | Bin 14140 -> 14140 bytes
+ ...i.subset.multiple_size_tables.drop-hints.39.ttf | Bin 2928 -> 2928 bytes
+ ...i.subset.multiple_size_tables.drop-hints.AE.ttf | Bin 7916 -> 7916 bytes
+ ...ubset.multiple_size_tables.retain-gids.2049.ttf | Bin 5336 -> 5336 bytes
+ ...et.multiple_size_tables.retain-gids.38,2049.ttf | Bin 7268 -> 7268 bytes
+ ...et.multiple_size_tables.retain-gids.38,20E3.ttf | Bin 6244 -> 6244 bytes
+ ...ze_tables.retain-gids.38,39,AE,2049,38,20E3.ttf | Bin 19280 -> 19280 bytes
+ ...multiple_size_tables.retain-gids.38,AE,2049.ttf | Bin 14164 -> 14164 bytes
+ ....subset.multiple_size_tables.retain-gids.39.ttf | Bin 2936 -> 2936 bytes
+ ....subset.multiple_size_tables.retain-gids.AE.ttf | Bin 7932 -> 7932 bytes
+ .../NotoColorEmoji.subset.retain-gids.2049.ttf     | Bin 3136 -> 3136 bytes
+ .../NotoColorEmoji.subset.retain-gids.38,2049.ttf  | Bin 4108 -> 4108 bytes
+ .../NotoColorEmoji.subset.retain-gids.38,20E3.ttf  | Bin 3600 -> 3600 bytes
+ ...ji.subset.retain-gids.38,39,AE,2049,38,20E3.ttf | Bin 10124 -> 10124 bytes
+ ...otoColorEmoji.subset.retain-gids.38,AE,2049.ttf | Bin 7564 -> 7564 bytes
+ .../cbdt/NotoColorEmoji.subset.retain-gids.39.ttf  | Bin 1928 -> 1928 bytes
+ .../cbdt/NotoColorEmoji.subset.retain-gids.AE.ttf  | Bin 4428 -> 4428 bytes
+ ...eSansPro-Regular.default.1FC,21,41,20,62,63.otf | Bin 2580 -> 2592 bytes
+ .../SourceSansPro-Regular.default.61,62,63.otf     | Bin 2216 -> 2224 bytes
+ ...ourceSansPro-Regular.default.D7,D8,D9,DA,DE.otf | Bin 2328 -> 2340 bytes
+ ...subroutinize-retain-gids.1FC,21,41,20,62,63.otf | Bin 20232 -> 20220 bytes
+ ...Regular.desubroutinize-retain-gids.61,62,63.otf | Bin 2316 -> 2324 bytes
+ ...r.desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf | Bin 30540 -> 30528 bytes
+ ...o-Regular.desubroutinize.1FC,21,41,20,62,63.otf | Bin 2436 -> 2448 bytes
+ ...urceSansPro-Regular.desubroutinize.61,62,63.otf | Bin 2120 -> 2128 bytes
+ ...nsPro-Regular.desubroutinize.D7,D8,D9,DA,DE.otf | Bin 2312 -> 2320 bytes
+ ...subroutinize-retain-gids.1FC,21,41,20,62,63.otf | Bin 20064 -> 20052 bytes
+ ...p-hints-desubroutinize-retain-gids.61,62,63.otf | Bin 2192 -> 2200 bytes
+ ...s-desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf | Bin 30372 -> 30360 bytes
+ ...rop-hints-desubroutinize.1FC,21,41,20,62,63.otf | Bin 2268 -> 2276 bytes
+ ...-Regular.drop-hints-desubroutinize.61,62,63.otf | Bin 1996 -> 2004 bytes
+ ...ar.drop-hints-desubroutinize.D7,D8,D9,DA,DE.otf | Bin 2148 -> 2156 bytes
+ ...r.drop-hints-retain-gids.1FC,21,41,20,62,63.otf | Bin 20156 -> 20144 bytes
+ ...Pro-Regular.drop-hints-retain-gids.61,62,63.otf | Bin 2228 -> 2240 bytes
+ ...gular.drop-hints-retain-gids.D7,D8,D9,DA,DE.otf | Bin 30384 -> 30376 bytes
+ ...nsPro-Regular.drop-hints.1FC,21,41,20,62,63.otf | Bin 2352 -> 2360 bytes
+ .../SourceSansPro-Regular.drop-hints.61,62,63.otf  | Bin 2060 -> 2072 bytes
+ ...ceSansPro-Regular.drop-hints.D7,D8,D9,DA,DE.otf | Bin 2164 -> 2172 bytes
+ ...sPro-Regular.retain-gids.1FC,21,41,20,62,63.otf | Bin 20384 -> 20376 bytes
+ .../SourceSansPro-Regular.retain-gids.61,62,63.otf | Bin 2384 -> 2392 bytes
+ ...eSansPro-Regular.retain-gids.D7,D8,D9,DA,DE.otf | Bin 30556 -> 30544 bytes
+ ...ubset.default.3042,3044,3046,3048,304A,304B.otf | Bin 4884 -> 4912 bytes
+ ...ubset.default.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 6276 -> 6300 bytes
+ ...eHanSans-Regular_subset.default.61,63,65,6B.otf | Bin 2588 -> 2620 bytes
+ ...ubset.default.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 6736 -> 6744 bytes
+ .../SourceHanSans-Regular_subset.default.660E.otf  | Bin 2456 -> 2488 bytes
+ ...e-retain-gids.3042,3044,3046,3048,304A,304B.otf | Bin 129876 -> 129912 bytes
+ ...e-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 130920 -> 130944 bytes
+ ...bset.desubroutinize-retain-gids.61,63,65,6B.otf | Bin 3412 -> 3444 bytes
+ ...e-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 122048 -> 122060 bytes
+ ...ular_subset.desubroutinize-retain-gids.660E.otf | Bin 50760 -> 50788 bytes
+ ...esubroutinize.3042,3044,3046,3048,304A,304B.otf | Bin 4724 -> 4748 bytes
+ ...esubroutinize.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 5928 -> 5944 bytes
+ ...s-Regular_subset.desubroutinize.61,63,65,6B.otf | Bin 2520 -> 2552 bytes
+ ...esubroutinize.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 6232 -> 6236 bytes
+ ...eHanSans-Regular_subset.desubroutinize.660E.otf | Bin 2440 -> 2472 bytes
+ ...e-retain-gids.3042,3044,3046,3048,304A,304B.otf | Bin 129448 -> 129468 bytes
+ ...e-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 130312 -> 130324 bytes
+ ...ints-desubroutinize-retain-gids.61,63,65,6B.otf | Bin 3288 -> 3324 bytes
+ ...e-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 121284 -> 121284 bytes
+ ....drop-hints-desubroutinize-retain-gids.660E.otf | Bin 50540 -> 50560 bytes
+ ...esubroutinize.3042,3044,3046,3048,304A,304B.otf | Bin 4420 -> 4440 bytes
+ ...esubroutinize.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 5416 -> 5428 bytes
+ ...ubset.drop-hints-desubroutinize.61,63,65,6B.otf | Bin 2416 -> 2448 bytes
+ ...esubroutinize.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 5556 -> 5560 bytes
+ ...gular_subset.drop-hints-desubroutinize.660E.otf | Bin 2308 -> 2336 bytes
+ ...s-retain-gids.3042,3044,3046,3048,304A,304B.otf | Bin 129576 -> 129608 bytes
+ ...s-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 130604 -> 130632 bytes
+ ...r_subset.drop-hints-retain-gids.61,63,65,6B.otf | Bin 3248 -> 3288 bytes
+ ...s-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 121776 -> 121784 bytes
+ ...-Regular_subset.drop-hints-retain-gids.660E.otf | Bin 50552 -> 50576 bytes
+ ...et.drop-hints.3042,3044,3046,3048,304A,304B.otf | Bin 4548 -> 4576 bytes
+ ...et.drop-hints.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 5708 -> 5732 bytes
+ ...nSans-Regular_subset.drop-hints.61,63,65,6B.otf | Bin 2448 -> 2480 bytes
+ ...et.drop-hints.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 6048 -> 6056 bytes
+ ...ourceHanSans-Regular_subset.drop-hints.660E.otf | Bin 2316 -> 2348 bytes
+ ...t.retain-gids.3042,3044,3046,3048,304A,304B.otf | Bin 130036 -> 130072 bytes
+ ...t.retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 131272 -> 131300 bytes
+ ...Sans-Regular_subset.retain-gids.61,63,65,6B.otf | Bin 3408 -> 3444 bytes
+ ...t.retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 122552 -> 122564 bytes
+ ...urceHanSans-Regular_subset.retain-gids.660E.otf | Bin 50776 -> 50804 bytes
+ ...otoSerifMyanmar-Regular.notdef-outline.1092.otf | Bin 1380 -> 1392 bytes
+ .../cmap/AdobeBlank-Regular.default.61,62.ttf      | Bin 1252 -> 1252 bytes
+ .../cmap/AdobeBlank-Regular.default.61,FEFA.ttf    | Bin 1264 -> 1264 bytes
+ .../cmap/AdobeBlank-Regular.default.FEE6,FECF.ttf  | Bin 1216 -> 1216 bytes
+ .../cmap/AdobeBlank-Regular.default.FEF9,FEFA.ttf  | Bin 1204 -> 1204 bytes
+ .../cmap/AdobeBlank-Regular.default.FEFA.ttf       | Bin 1184 -> 1184 bytes
+ ...eBlank-Regular.drop-hints-retain-gids.61,62.ttf | Bin 1468 -> 1468 bytes
+ ...lank-Regular.drop-hints-retain-gids.61,FEFA.ttf | Bin 8232 -> 8232 bytes
+ ...nk-Regular.drop-hints-retain-gids.FEE6,FECF.ttf | Bin 8104 -> 8104 bytes
+ ...nk-Regular.drop-hints-retain-gids.FEF9,FEFA.ttf | Bin 8172 -> 8172 bytes
+ ...beBlank-Regular.drop-hints-retain-gids.FEFA.ttf | Bin 8156 -> 8156 bytes
+ .../cmap/AdobeBlank-Regular.drop-hints.61,62.ttf   | Bin 1080 -> 1080 bytes
+ .../cmap/AdobeBlank-Regular.drop-hints.61,FEFA.ttf | Bin 1092 -> 1092 bytes
+ .../AdobeBlank-Regular.drop-hints.FEE6,FECF.ttf    | Bin 1044 -> 1044 bytes
+ .../AdobeBlank-Regular.drop-hints.FEF9,FEFA.ttf    | Bin 1032 -> 1032 bytes
+ .../cmap/AdobeBlank-Regular.drop-hints.FEFA.ttf    | Bin 1012 -> 1012 bytes
+ .../cmap/AdobeBlank-Regular.name-ids.61,62.ttf     | Bin 1000 -> 1000 bytes
+ .../cmap/AdobeBlank-Regular.name-ids.61,FEFA.ttf   | Bin 1012 -> 1012 bytes
+ .../cmap/AdobeBlank-Regular.name-ids.FEE6,FECF.ttf | Bin 964 -> 964 bytes
+ .../cmap/AdobeBlank-Regular.name-ids.FEF9,FEFA.ttf | Bin 952 -> 952 bytes
+ .../cmap/AdobeBlank-Regular.name-ids.FEFA.ttf      | Bin 932 -> 932 bytes
+ .../cmap/AdobeBlank-Regular.retain-gids.61,62.ttf  | Bin 1640 -> 1640 bytes
+ .../AdobeBlank-Regular.retain-gids.61,FEFA.ttf     | Bin 8404 -> 8404 bytes
+ .../AdobeBlank-Regular.retain-gids.FEE6,FECF.ttf   | Bin 8276 -> 8276 bytes
+ .../AdobeBlank-Regular.retain-gids.FEF9,FEFA.ttf   | Bin 8344 -> 8344 bytes
+ .../cmap/AdobeBlank-Regular.retain-gids.FEFA.ttf   | Bin 8328 -> 8328 bytes
+ .../cmap14/cmap14_font1.default.4E00,4E02,4E03.otf | Bin 1360 -> 1376 bytes
+ .../cmap14/cmap14_font1.default.4E00,4E03.otf      | Bin 1236 -> 1252 bytes
+ .../cmap14/cmap14_font1.default.4E00,4E05,4E07.otf | Bin 1328 -> 1348 bytes
+ .../cmap14/cmap14_font1.default.4E02,4E03,4E08.otf | Bin 1576 -> 1596 bytes
+ .../expected/cmap14/cmap14_font1.default.4E02.otf  | Bin 996 -> 1012 bytes
+ .../expected/cmap14/cmap14_font1.default.4E03.otf  | Bin 1080 -> 1096 bytes
+ .../cmap14_font1.default.4E05,4E07,4E08,4E09.otf   | Bin 1848 -> 1864 bytes
+ .../cmap14/cmap14_font1.default.4E08,4E09.otf      | Bin 1720 -> 1736 bytes
+ .../expected/cmap14/cmap14_font1.default.4E08.otf  | Bin 1384 -> 1404 bytes
+ .../cmap14_font1.default.retain-all-codepoint.otf  | Bin 2348 -> 2364 bytes
+ ...font1.drop-hints-retain-gids.4E00,4E02,4E03.otf | Bin 1388 -> 1404 bytes
+ ...ap14_font1.drop-hints-retain-gids.4E00,4E03.otf | Bin 1272 -> 1292 bytes
+ ...font1.drop-hints-retain-gids.4E00,4E05,4E07.otf | Bin 1396 -> 1416 bytes
+ ...font1.drop-hints-retain-gids.4E02,4E03,4E08.otf | Bin 1720 -> 1736 bytes
+ .../cmap14_font1.drop-hints-retain-gids.4E02.otf   | Bin 1028 -> 1048 bytes
+ .../cmap14_font1.drop-hints-retain-gids.4E03.otf   | Bin 1124 -> 1140 bytes
+ ....drop-hints-retain-gids.4E05,4E07,4E08,4E09.otf | Bin 1984 -> 2000 bytes
+ ...ap14_font1.drop-hints-retain-gids.4E08,4E09.otf | Bin 1872 -> 1888 bytes
+ .../cmap14_font1.drop-hints-retain-gids.4E08.otf   | Bin 1544 -> 1560 bytes
+ ...drop-hints-retain-gids.retain-all-codepoint.otf | Bin 2436 -> 2452 bytes
+ .../cmap14_font1.drop-hints.4E00,4E02,4E03.otf     | Bin 1292 -> 1308 bytes
+ .../cmap14/cmap14_font1.drop-hints.4E00,4E03.otf   | Bin 1168 -> 1188 bytes
+ .../cmap14_font1.drop-hints.4E00,4E05,4E07.otf     | Bin 1260 -> 1280 bytes
+ .../cmap14_font1.drop-hints.4E02,4E03,4E08.otf     | Bin 1512 -> 1528 bytes
+ .../cmap14/cmap14_font1.drop-hints.4E02.otf        | Bin 928 -> 944 bytes
+ .../cmap14/cmap14_font1.drop-hints.4E03.otf        | Bin 1012 -> 1028 bytes
+ ...cmap14_font1.drop-hints.4E05,4E07,4E08,4E09.otf | Bin 1780 -> 1796 bytes
+ .../cmap14/cmap14_font1.drop-hints.4E08,4E09.otf   | Bin 1652 -> 1672 bytes
+ .../cmap14/cmap14_font1.drop-hints.4E08.otf        | Bin 1316 -> 1336 bytes
+ ...map14_font1.drop-hints.retain-all-codepoint.otf | Bin 2280 -> 2296 bytes
+ .../cmap14/cmap14_font1.gids.4E00,4E02,4E03.otf    | Bin 1388 -> 1408 bytes
+ .../cmap14/cmap14_font1.gids.4E00,4E03.otf         | Bin 1380 -> 1396 bytes
+ .../cmap14/cmap14_font1.gids.4E00,4E05,4E07.otf    | Bin 1620 -> 1640 bytes
+ .../cmap14/cmap14_font1.gids.4E02,4E03,4E08.otf    | Bin 1744 -> 1760 bytes
+ .../expected/cmap14/cmap14_font1.gids.4E02.otf     | Bin 1312 -> 1332 bytes
+ .../expected/cmap14/cmap14_font1.gids.4E03.otf     | Bin 1352 -> 1372 bytes
+ .../cmap14_font1.gids.4E05,4E07,4E08,4E09.otf      | Bin 2164 -> 2184 bytes
+ .../cmap14/cmap14_font1.gids.4E08,4E09.otf         | Bin 2036 -> 2056 bytes
+ .../expected/cmap14/cmap14_font1.gids.4E08.otf     | Bin 1704 -> 1720 bytes
+ .../cmap14_font1.gids.retain-all-codepoint.otf     | Bin 2380 -> 2400 bytes
+ .../cmap14_font1.name-ids.4E00,4E02,4E03.otf       | Bin 1292 -> 1308 bytes
+ .../cmap14/cmap14_font1.name-ids.4E00,4E03.otf     | Bin 1168 -> 1184 bytes
+ .../cmap14_font1.name-ids.4E00,4E05,4E07.otf       | Bin 1260 -> 1280 bytes
+ .../cmap14_font1.name-ids.4E02,4E03,4E08.otf       | Bin 1508 -> 1528 bytes
+ .../expected/cmap14/cmap14_font1.name-ids.4E02.otf | Bin 928 -> 944 bytes
+ .../expected/cmap14/cmap14_font1.name-ids.4E03.otf | Bin 1012 -> 1028 bytes
+ .../cmap14_font1.name-ids.4E05,4E07,4E08,4E09.otf  | Bin 1780 -> 1796 bytes
+ .../cmap14/cmap14_font1.name-ids.4E08,4E09.otf     | Bin 1652 -> 1668 bytes
+ .../expected/cmap14/cmap14_font1.name-ids.4E08.otf | Bin 1316 -> 1336 bytes
+ .../cmap14_font1.name-ids.retain-all-codepoint.otf | Bin 2280 -> 2296 bytes
+ .../cmap14_font1.retain-gids.4E00,4E02,4E03.otf    | Bin 1452 -> 1472 bytes
+ .../cmap14/cmap14_font1.retain-gids.4E00,4E03.otf  | Bin 1340 -> 1360 bytes
+ .../cmap14_font1.retain-gids.4E00,4E05,4E07.otf    | Bin 1464 -> 1480 bytes
+ .../cmap14_font1.retain-gids.4E02,4E03,4E08.otf    | Bin 1788 -> 1804 bytes
+ .../cmap14/cmap14_font1.retain-gids.4E02.otf       | Bin 1096 -> 1116 bytes
+ .../cmap14/cmap14_font1.retain-gids.4E03.otf       | Bin 1192 -> 1208 bytes
+ ...map14_font1.retain-gids.4E05,4E07,4E08,4E09.otf | Bin 2048 -> 2068 bytes
+ .../cmap14/cmap14_font1.retain-gids.4E08,4E09.otf  | Bin 1940 -> 1956 bytes
+ .../cmap14/cmap14_font1.retain-gids.4E08.otf       | Bin 1608 -> 1628 bytes
+ ...ap14_font1.retain-gids.retain-all-codepoint.otf | Bin 2500 -> 2520 bytes
+ .../cmap14/cmap14_font2.default.4E00,4E02,4E03.otf | Bin 1360 -> 1376 bytes
+ .../cmap14/cmap14_font2.default.4E00,4E03.otf      | Bin 1236 -> 1252 bytes
+ .../cmap14/cmap14_font2.default.4E00,4E05,4E07.otf | Bin 1332 -> 1352 bytes
+ .../cmap14/cmap14_font2.default.4E02,4E03,4E08.otf | Bin 1576 -> 1596 bytes
+ .../expected/cmap14/cmap14_font2.default.4E02.otf  | Bin 992 -> 1008 bytes
+ .../expected/cmap14/cmap14_font2.default.4E03.otf  | Bin 1076 -> 1092 bytes
+ .../cmap14_font2.default.4E05,4E07,4E08,4E09.otf   | Bin 1848 -> 1864 bytes
+ .../cmap14/cmap14_font2.default.4E08,4E09.otf      | Bin 1716 -> 1732 bytes
+ .../expected/cmap14/cmap14_font2.default.4E08.otf  | Bin 1380 -> 1400 bytes
+ .../cmap14_font2.default.retain-all-codepoint.otf  | Bin 2344 -> 2360 bytes
+ ...font2.drop-hints-retain-gids.4E00,4E02,4E03.otf | Bin 1388 -> 1404 bytes
+ ...ap14_font2.drop-hints-retain-gids.4E00,4E03.otf | Bin 1272 -> 1292 bytes
+ ...font2.drop-hints-retain-gids.4E00,4E05,4E07.otf | Bin 1400 -> 1420 bytes
+ ...font2.drop-hints-retain-gids.4E02,4E03,4E08.otf | Bin 1720 -> 1736 bytes
+ .../cmap14_font2.drop-hints-retain-gids.4E02.otf   | Bin 1024 -> 1044 bytes
+ .../cmap14_font2.drop-hints-retain-gids.4E03.otf   | Bin 1120 -> 1136 bytes
+ ....drop-hints-retain-gids.4E05,4E07,4E08,4E09.otf | Bin 1984 -> 2000 bytes
+ ...ap14_font2.drop-hints-retain-gids.4E08,4E09.otf | Bin 1868 -> 1884 bytes
+ .../cmap14_font2.drop-hints-retain-gids.4E08.otf   | Bin 1540 -> 1556 bytes
+ ...drop-hints-retain-gids.retain-all-codepoint.otf | Bin 2432 -> 2448 bytes
+ .../cmap14_font2.drop-hints.4E00,4E02,4E03.otf     | Bin 1292 -> 1308 bytes
+ .../cmap14/cmap14_font2.drop-hints.4E00,4E03.otf   | Bin 1168 -> 1188 bytes
+ .../cmap14_font2.drop-hints.4E00,4E05,4E07.otf     | Bin 1264 -> 1284 bytes
+ .../cmap14_font2.drop-hints.4E02,4E03,4E08.otf     | Bin 1512 -> 1528 bytes
+ .../cmap14/cmap14_font2.drop-hints.4E02.otf        | Bin 924 -> 940 bytes
+ .../cmap14/cmap14_font2.drop-hints.4E03.otf        | Bin 1008 -> 1024 bytes
+ ...cmap14_font2.drop-hints.4E05,4E07,4E08,4E09.otf | Bin 1780 -> 1796 bytes
+ .../cmap14/cmap14_font2.drop-hints.4E08,4E09.otf   | Bin 1648 -> 1668 bytes
+ .../cmap14/cmap14_font2.drop-hints.4E08.otf        | Bin 1312 -> 1332 bytes
+ ...map14_font2.drop-hints.retain-all-codepoint.otf | Bin 2276 -> 2292 bytes
+ .../cmap14/cmap14_font2.gids.4E00,4E02,4E03.otf    | Bin 1388 -> 1408 bytes
+ .../cmap14/cmap14_font2.gids.4E00,4E03.otf         | Bin 1380 -> 1396 bytes
+ .../cmap14/cmap14_font2.gids.4E00,4E05,4E07.otf    | Bin 1624 -> 1644 bytes
+ .../cmap14/cmap14_font2.gids.4E02,4E03,4E08.otf    | Bin 1744 -> 1760 bytes
+ .../expected/cmap14/cmap14_font2.gids.4E02.otf     | Bin 1308 -> 1328 bytes
+ .../expected/cmap14/cmap14_font2.gids.4E03.otf     | Bin 1348 -> 1368 bytes
+ .../cmap14_font2.gids.4E05,4E07,4E08,4E09.otf      | Bin 2164 -> 2184 bytes
+ .../cmap14/cmap14_font2.gids.4E08,4E09.otf         | Bin 2032 -> 2052 bytes
+ .../expected/cmap14/cmap14_font2.gids.4E08.otf     | Bin 1700 -> 1716 bytes
+ .../cmap14_font2.gids.retain-all-codepoint.otf     | Bin 2376 -> 2396 bytes
+ .../cmap14_font2.name-ids.4E00,4E02,4E03.otf       | Bin 1292 -> 1308 bytes
+ .../cmap14/cmap14_font2.name-ids.4E00,4E03.otf     | Bin 1168 -> 1184 bytes
+ .../cmap14_font2.name-ids.4E00,4E05,4E07.otf       | Bin 1264 -> 1284 bytes
+ .../cmap14_font2.name-ids.4E02,4E03,4E08.otf       | Bin 1508 -> 1528 bytes
+ .../expected/cmap14/cmap14_font2.name-ids.4E02.otf | Bin 924 -> 940 bytes
+ .../expected/cmap14/cmap14_font2.name-ids.4E03.otf | Bin 1008 -> 1024 bytes
+ .../cmap14_font2.name-ids.4E05,4E07,4E08,4E09.otf  | Bin 1780 -> 1796 bytes
+ .../cmap14/cmap14_font2.name-ids.4E08,4E09.otf     | Bin 1648 -> 1664 bytes
+ .../expected/cmap14/cmap14_font2.name-ids.4E08.otf | Bin 1312 -> 1332 bytes
+ .../cmap14_font2.name-ids.retain-all-codepoint.otf | Bin 2276 -> 2292 bytes
+ .../cmap14_font2.retain-gids.4E00,4E02,4E03.otf    | Bin 1452 -> 1472 bytes
+ .../cmap14/cmap14_font2.retain-gids.4E00,4E03.otf  | Bin 1340 -> 1360 bytes
+ .../cmap14_font2.retain-gids.4E00,4E05,4E07.otf    | Bin 1468 -> 1484 bytes
+ .../cmap14_font2.retain-gids.4E02,4E03,4E08.otf    | Bin 1788 -> 1804 bytes
+ .../cmap14/cmap14_font2.retain-gids.4E02.otf       | Bin 1092 -> 1112 bytes
+ .../cmap14/cmap14_font2.retain-gids.4E03.otf       | Bin 1188 -> 1204 bytes
+ ...map14_font2.retain-gids.4E05,4E07,4E08,4E09.otf | Bin 2048 -> 2068 bytes
+ .../cmap14/cmap14_font2.retain-gids.4E08,4E09.otf  | Bin 1936 -> 1952 bytes
+ .../cmap14/cmap14_font2.retain-gids.4E08.otf       | Bin 1604 -> 1624 bytes
+ ...ap14_font2.retain-gids.retain-all-codepoint.otf | Bin 2496 -> 2516 bytes
+ .../TwemojiMozilla.subset.default.32,3297,3299.ttf | Bin 1936 -> 1936 bytes
+ .../colr/TwemojiMozilla.subset.default.32,3297.ttf | Bin 1400 -> 1400 bytes
+ .../colr/TwemojiMozilla.subset.default.32,3299.ttf | Bin 1576 -> 1576 bytes
+ .../colr/TwemojiMozilla.subset.default.32.ttf      | Bin 932 -> 932 bytes
+ .../TwemojiMozilla.subset.default.3297,3299.ttf    | Bin 1916 -> 1916 bytes
+ .../colr/TwemojiMozilla.subset.default.3297.ttf    | Bin 1376 -> 1376 bytes
+ .../colr/TwemojiMozilla.subset.default.3299.ttf    | Bin 1552 -> 1552 bytes
+ ....subset.drop-hints-retain-gids.32,3297,3299.ttf | Bin 1916 -> 1916 bytes
+ ...zilla.subset.drop-hints-retain-gids.32,3297.ttf | Bin 1396 -> 1396 bytes
+ ...zilla.subset.drop-hints-retain-gids.32,3299.ttf | Bin 1576 -> 1576 bytes
+ ...ojiMozilla.subset.drop-hints-retain-gids.32.ttf | Bin 912 -> 912 bytes
+ ...lla.subset.drop-hints-retain-gids.3297,3299.ttf | Bin 1900 -> 1900 bytes
+ ...iMozilla.subset.drop-hints-retain-gids.3297.ttf | Bin 1372 -> 1372 bytes
+ ...iMozilla.subset.drop-hints-retain-gids.3299.ttf | Bin 1552 -> 1552 bytes
+ ...emojiMozilla.subset.drop-hints.32,3297,3299.ttf | Bin 1916 -> 1916 bytes
+ .../TwemojiMozilla.subset.drop-hints.32,3297.ttf   | Bin 1380 -> 1380 bytes
+ .../TwemojiMozilla.subset.drop-hints.32,3299.ttf   | Bin 1556 -> 1556 bytes
+ .../colr/TwemojiMozilla.subset.drop-hints.32.ttf   | Bin 912 -> 912 bytes
+ .../TwemojiMozilla.subset.drop-hints.3297,3299.ttf | Bin 1896 -> 1896 bytes
+ .../colr/TwemojiMozilla.subset.drop-hints.3297.ttf | Bin 1356 -> 1356 bytes
+ .../colr/TwemojiMozilla.subset.drop-hints.3299.ttf | Bin 1532 -> 1532 bytes
+ ...mojiMozilla.subset.retain-gids.32,3297,3299.ttf | Bin 1936 -> 1936 bytes
+ .../TwemojiMozilla.subset.retain-gids.32,3297.ttf  | Bin 1416 -> 1416 bytes
+ .../TwemojiMozilla.subset.retain-gids.32,3299.ttf  | Bin 1596 -> 1596 bytes
+ .../colr/TwemojiMozilla.subset.retain-gids.32.ttf  | Bin 932 -> 932 bytes
+ ...TwemojiMozilla.subset.retain-gids.3297,3299.ttf | Bin 1920 -> 1920 bytes
+ .../TwemojiMozilla.subset.retain-gids.3297.ttf     | Bin 1392 -> 1392 bytes
+ .../TwemojiMozilla.subset.retain-gids.3299.ttf     | Bin 1572 -> 1572 bytes
+ .../colr_with_components/colr-table.default.6B.ttf | Bin 4260 -> 4260 bytes
+ .../colr-table.drop-hints-retain-gids.6B.ttf       | Bin 4984 -> 4984 bytes
+ .../colr-table.drop-hints.6B.ttf                   | Bin 4260 -> 4260 bytes
+ .../colr-table.retain-gids.6B.ttf                  | Bin 4984 -> 4984 bytes
+ .../Roboto-Regular.default.1FC,21,41,20,62,63.ttf  | Bin 3080 -> 3076 bytes
+ .../full-font/Roboto-Regular.default.61,62,63.ttf  | Bin 2672 -> 2668 bytes
+ .../Roboto-Regular.default.D7,D8,D9,DA,DE.ttf      | Bin 3024 -> 3020 bytes
+ ...oboto-Regular.drop-hints.1FC,21,41,20,62,63.ttf | Bin 1632 -> 1628 bytes
+ .../Roboto-Regular.drop-hints.61,62,63.ttf         | Bin 1412 -> 1408 bytes
+ .../Roboto-Regular.drop-hints.D7,D8,D9,DA,DE.ttf   | Bin 1648 -> 1644 bytes
+ ...ifVariable-Roman.default.1FC,21,41,20,62,63.ttf | Bin 3992 -> 3960 bytes
+ .../SourceSerifVariable-Roman.default.61,62,63.ttf | Bin 3832 -> 3820 bytes
+ ...eSerifVariable-Roman.default.D7,D8,D9,DA,DE.ttf | Bin 4396 -> 4384 bytes
+ ...ariable-Roman.drop-hints.1FC,21,41,20,62,63.ttf | Bin 3968 -> 3948 bytes
+ ...urceSerifVariable-Roman.drop-hints.61,62,63.ttf | Bin 3832 -> 3820 bytes
+ ...rifVariable-Roman.drop-hints.D7,D8,D9,DA,DE.ttf | Bin 4396 -> 4384 bytes
+ .../Mplus1p-Regular.default.1D715,1D7D8,41,42.ttf  | Bin 2344 -> 2340 bytes
+ .../japanese/Mplus1p-Regular.default.25771.ttf     | Bin 1992 -> 1988 bytes
+ ...gular.default.3042,3044,3046,3048,304A,304B.ttf | Bin 2704 -> 2700 bytes
+ ...gular.default.3042,3044,3046,73E0,5EA6,8F38.ttf | Bin 2948 -> 2944 bytes
+ .../Mplus1p-Regular.default.61,63,65,6B.ttf        | Bin 2324 -> 2320 bytes
+ ...gular.default.660E,6975,73E0,5EA6,8F38,6E05.ttf | Bin 3244 -> 3240 bytes
+ .../japanese/Mplus1p-Regular.default.660E.ttf      | Bin 1984 -> 1980 bytes
+ ...plus1p-Regular.drop-hints.1D715,1D7D8,41,42.ttf | Bin 1616 -> 1612 bytes
+ .../japanese/Mplus1p-Regular.drop-hints.25771.ttf  | Bin 1264 -> 1260 bytes
+ ...ar.drop-hints.3042,3044,3046,3048,304A,304B.ttf | Bin 1976 -> 1972 bytes
+ ...ar.drop-hints.3042,3044,3046,73E0,5EA6,8F38.ttf | Bin 2220 -> 2216 bytes
+ .../Mplus1p-Regular.drop-hints.61,63,65,6B.ttf     | Bin 1596 -> 1592 bytes
+ ...ar.drop-hints.660E,6975,73E0,5EA6,8F38,6E05.ttf | Bin 2516 -> 2512 bytes
+ .../japanese/Mplus1p-Regular.drop-hints.660E.ttf   | Bin 1256 -> 1252 bytes
+ ...Mplus1p-Regular.keep-gdef.1D715,1D7D8,41,42.ttf | Bin 2344 -> 2340 bytes
+ .../japanese/Mplus1p-Regular.keep-gdef.25771.ttf   | Bin 1992 -> 1988 bytes
+ ...lar.keep-gdef.3042,3044,3046,3048,304A,304B.ttf | Bin 2704 -> 2700 bytes
+ ...lar.keep-gdef.3042,3044,3046,73E0,5EA6,8F38.ttf | Bin 2948 -> 2944 bytes
+ .../Mplus1p-Regular.keep-gdef.61,63,65,6B.ttf      | Bin 2324 -> 2320 bytes
+ ...lar.keep-gdef.660E,6975,73E0,5EA6,8F38,6E05.ttf | Bin 3244 -> 3240 bytes
+ .../japanese/Mplus1p-Regular.keep-gdef.660E.ttf    | Bin 1984 -> 1980 bytes
+ ...text1_multiple_subrules_f1.default.41,42,43.otf | Bin 1328 -> 1340 bytes
+ ...context1_multiple_subrules_f1.default.41,42.otf | Bin 1228 -> 1240 bytes
+ ...context1_multiple_subrules_f1.default.41,43.otf | Bin 1332 -> 1348 bytes
+ ...os_context1_multiple_subrules_f1.default.41.otf | Bin 1216 -> 1228 bytes
+ ...le_subrules_f1.default.retain-all-codepoint.otf | Bin 3700 -> 3912 bytes
+ ...1_multiple_subrules_f1.retain-gids.41,42,43.otf | Bin 2028 -> 2052 bytes
+ ...ext1_multiple_subrules_f1.retain-gids.41,42.otf | Bin 1932 -> 1948 bytes
+ ...ext1_multiple_subrules_f1.retain-gids.41,43.otf | Bin 2048 -> 2068 bytes
+ ...ontext1_multiple_subrules_f1.retain-gids.41.otf | Bin 1916 -> 1932 bytes
+ ...ubrules_f1.retain-gids.retain-all-codepoint.otf | Bin 3700 -> 3912 bytes
+ ...text2_multiple_subrules_f1.default.41,42,43.otf | Bin 1328 -> 1340 bytes
+ ...context2_multiple_subrules_f1.default.41,42.otf | Bin 1228 -> 1240 bytes
+ ...context2_multiple_subrules_f1.default.41,43.otf | Bin 1332 -> 1348 bytes
+ ...os_context2_multiple_subrules_f1.default.41.otf | Bin 1216 -> 1228 bytes
+ ...le_subrules_f1.default.retain-all-codepoint.otf | Bin 3700 -> 3912 bytes
+ ...2_multiple_subrules_f1.retain-gids.41,42,43.otf | Bin 2028 -> 2052 bytes
+ ...ext2_multiple_subrules_f1.retain-gids.41,42.otf | Bin 1932 -> 1948 bytes
+ ...ext2_multiple_subrules_f1.retain-gids.41,43.otf | Bin 2048 -> 2068 bytes
+ ...ontext2_multiple_subrules_f1.retain-gids.41.otf | Bin 1916 -> 1932 bytes
+ ...ubrules_f1.retain-gids.retain-all-codepoint.otf | Bin 3700 -> 3912 bytes
+ .../gpos_context3_simple_f1.default.41,42,43.otf   | Bin 1308 -> 1320 bytes
+ .../gpos_context3_simple_f1.default.41,42.otf      | Bin 1208 -> 1220 bytes
+ .../gpos_context3_simple_f1.default.41,43.otf      | Bin 1312 -> 1328 bytes
+ .../gpos_context3_simple_f1.default.41.otf         | Bin 1196 -> 1208 bytes
+ ...ext3_simple_f1.default.retain-all-codepoint.otf | Bin 3680 -> 3892 bytes
+ ...pos_context3_simple_f1.retain-gids.41,42,43.otf | Bin 2008 -> 2032 bytes
+ .../gpos_context3_simple_f1.retain-gids.41,42.otf  | Bin 1912 -> 1928 bytes
+ .../gpos_context3_simple_f1.retain-gids.41,43.otf  | Bin 2028 -> 2048 bytes
+ .../gpos_context3_simple_f1.retain-gids.41.otf     | Bin 1896 -> 1912 bytes
+ ..._simple_f1.retain-gids.retain-all-codepoint.otf | Bin 3680 -> 3892 bytes
+ .../IndicTestJalandhar-Regular.default.A01.ttf     | Bin 4176 -> 4172 bytes
+ .../IndicTestJalandhar-Regular.default.A05,A06.ttf | Bin 4752 -> 4748 bytes
+ .../IndicTestJalandhar-Regular.default.A07,A1B.ttf | Bin 4724 -> 4720 bytes
+ ...andhar-Regular.default.retain-all-codepoint.ttf | Bin 49244 -> 49248 bytes
+ .../IndicTestJalandhar-Regular.drop-hints.A01.ttf  | Bin 1036 -> 1032 bytes
+ ...dicTestJalandhar-Regular.drop-hints.A05,A06.ttf | Bin 1344 -> 1340 bytes
+ ...dicTestJalandhar-Regular.drop-hints.A07,A1B.ttf | Bin 1344 -> 1340 bytes
+ ...har-Regular.drop-hints.retain-all-codepoint.ttf | Bin 29464 -> 29468 bytes
+ .../IndicTestJalandhar-Regular.keep-gdef.A01.ttf   | Bin 4176 -> 4172 bytes
+ ...ndicTestJalandhar-Regular.keep-gdef.A05,A06.ttf | Bin 4752 -> 4748 bytes
+ ...ndicTestJalandhar-Regular.keep-gdef.A07,A1B.ttf | Bin 4724 -> 4720 bytes
+ ...dhar-Regular.keep-gdef.retain-all-codepoint.ttf | Bin 49244 -> 49248 bytes
+ .../AdobeVFPrototype.default.41,42,43,57.otf       | Bin 5440 -> 5460 bytes
+ .../AdobeVFPrototype.default.41,42,43.otf          | Bin 4908 -> 4928 bytes
+ .../AdobeVFPrototype.default.41,42.otf             | Bin 4432 -> 4448 bytes
+ .../AdobeVFPrototype.default.41,56,57.otf          | Bin 4576 -> 4596 bytes
+ .../AdobeVFPrototype.default.41.otf                | Bin 3728 -> 3748 bytes
+ .../AdobeVFPrototype.default.42,57.otf             | Bin 4564 -> 4580 bytes
+ .../AdobeVFPrototype.drop-hints.41,42,43,57.otf    | Bin 5252 -> 5272 bytes
+ .../AdobeVFPrototype.drop-hints.41,42,43.otf       | Bin 4720 -> 4740 bytes
+ .../AdobeVFPrototype.drop-hints.41,42.otf          | Bin 4244 -> 4264 bytes
+ .../AdobeVFPrototype.drop-hints.41,56,57.otf       | Bin 4384 -> 4408 bytes
+ .../AdobeVFPrototype.drop-hints.41.otf             | Bin 3540 -> 3560 bytes
+ .../AdobeVFPrototype.drop-hints.42,57.otf          | Bin 4376 -> 4396 bytes
+ ...AdobeVFPrototype.keep-gdef-gpos.41,42,43,57.otf | Bin 5440 -> 5460 bytes
+ .../AdobeVFPrototype.keep-gdef-gpos.41,42,43.otf   | Bin 4908 -> 4928 bytes
+ .../AdobeVFPrototype.keep-gdef-gpos.41,42.otf      | Bin 4432 -> 4448 bytes
+ .../AdobeVFPrototype.keep-gdef-gpos.41,56,57.otf   | Bin 4576 -> 4596 bytes
+ .../AdobeVFPrototype.keep-gdef-gpos.41.otf         | Bin 3728 -> 3748 bytes
+ .../AdobeVFPrototype.keep-gdef-gpos.42,57.otf      | Bin 4564 -> 4580 bytes
+ .../Roboto-Regular.default.1E00,303.ttf            | Bin 2524 -> 2520 bytes
+ .../layout.gdef/Roboto-Regular.default.303.ttf     | Bin 2116 -> 2112 bytes
+ .../Roboto-Regular.default.309,20,30F.ttf          | Bin 2212 -> 2208 bytes
+ .../layout.gdef/Roboto-Regular.default.323.ttf     | Bin 2008 -> 2004 bytes
+ .../Roboto-Regular.default.41,42,43.ttf            | Bin 2572 -> 2568 bytes
+ .../Roboto-Regular.drop-hints.1E00,303.ttf         | Bin 1380 -> 1376 bytes
+ .../layout.gdef/Roboto-Regular.drop-hints.303.ttf  | Bin 1112 -> 1108 bytes
+ .../Roboto-Regular.drop-hints.309,20,30F.ttf       | Bin 1172 -> 1168 bytes
+ .../layout.gdef/Roboto-Regular.drop-hints.323.ttf  | Bin 1056 -> 1052 bytes
+ .../Roboto-Regular.drop-hints.41,42,43.ttf         | Bin 1388 -> 1384 bytes
+ .../Roboto-Regular.keep-gdef-gpos.1E00,303.ttf     | Bin 2524 -> 2520 bytes
+ .../Roboto-Regular.keep-gdef-gpos.303.ttf          | Bin 2116 -> 2112 bytes
+ .../Roboto-Regular.keep-gdef-gpos.309,20,30F.ttf   | Bin 2212 -> 2208 bytes
+ .../Roboto-Regular.keep-gdef-gpos.323.ttf          | Bin 2008 -> 2004 bytes
+ .../Roboto-Regular.keep-gdef-gpos.41,42,43.ttf     | Bin 2572 -> 2568 bytes
+ .../layout.gpos/gpos1_2_font.default.41,43.otf     | Bin 1292 -> 1308 bytes
+ .../layout.gpos/gpos1_2_font.default.41,46.otf     | Bin 1424 -> 1436 bytes
+ .../layout.gpos/gpos1_2_font.default.41.otf        | Bin 1176 -> 1188 bytes
+ .../layout.gpos/gpos1_2_font.default.42,44.otf     | Bin 1268 -> 1280 bytes
+ .../layout.gpos/gpos1_2_font.default.43,46.otf     | Bin 1288 -> 1300 bytes
+ .../gpos1_2_font.default.retain-all-codepoint.otf  | Bin 3604 -> 3816 bytes
+ .../layout.gpos/gpos1_2_font.retain-gids.41,43.otf | Bin 2008 -> 2028 bytes
+ .../layout.gpos/gpos1_2_font.retain-gids.41,46.otf | Bin 2172 -> 2188 bytes
+ .../layout.gpos/gpos1_2_font.retain-gids.41.otf    | Bin 1876 -> 1892 bytes
+ .../layout.gpos/gpos1_2_font.retain-gids.42,44.otf | Bin 1992 -> 2012 bytes
+ .../layout.gpos/gpos1_2_font.retain-gids.43,46.otf | Bin 2036 -> 2052 bytes
+ ...os1_2_font.retain-gids.retain-all-codepoint.otf | Bin 3604 -> 3816 bytes
+ .../gpos2_1_font7.default.21,23,25.otf             | Bin 1360 -> 1372 bytes
+ .../layout.gpos2/gpos2_1_font7.default.21,23.otf   | Bin 1240 -> 1252 bytes
+ .../layout.gpos2/gpos2_1_font7.default.2E,23.otf   | Bin 1508 -> 1524 bytes
+ .../gpos2_1_font7.default.41,42,43.otf             | Bin 1288 -> 1300 bytes
+ .../gpos2_1_font7.default.retain-all-codepoint.otf | Bin 3604 -> 3816 bytes
+ .../gpos2_1_font7.retain-gids.21,23,25.otf         | Bin 1696 -> 1716 bytes
+ .../gpos2_1_font7.retain-gids.21,23.otf            | Bin 1564 -> 1580 bytes
+ .../gpos2_1_font7.retain-gids.2E,23.otf            | Bin 1944 -> 1960 bytes
+ .../gpos2_1_font7.retain-gids.41,42,43.otf         | Bin 1988 -> 2012 bytes
+ ...s2_1_font7.retain-gids.retain-all-codepoint.otf | Bin 3604 -> 3816 bytes
+ .../gpos2_2_font5.default.21,23,25.otf             | Bin 1360 -> 1372 bytes
+ .../layout.gpos2/gpos2_2_font5.default.21,23.otf   | Bin 1240 -> 1252 bytes
+ .../layout.gpos2/gpos2_2_font5.default.2E,23.otf   | Bin 1508 -> 1524 bytes
+ .../gpos2_2_font5.default.41,42,43.otf             | Bin 1288 -> 1300 bytes
+ .../gpos2_2_font5.default.retain-all-codepoint.otf | Bin 3604 -> 3816 bytes
+ .../gpos2_2_font5.retain-gids.21,23,25.otf         | Bin 1696 -> 1716 bytes
+ .../gpos2_2_font5.retain-gids.21,23.otf            | Bin 1564 -> 1580 bytes
+ .../gpos2_2_font5.retain-gids.2E,23.otf            | Bin 1944 -> 1960 bytes
+ .../gpos2_2_font5.retain-gids.41,42,43.otf         | Bin 1988 -> 2012 bytes
+ ...s2_2_font5.retain-gids.retain-all-codepoint.otf | Bin 3604 -> 3816 bytes
+ .../layout.gpos3/gpos3_font3.default.28,29.otf     | Bin 1248 -> 1260 bytes
+ .../layout.gpos3/gpos3_font3.default.28,2B.otf     | Bin 1376 -> 1392 bytes
+ .../layout.gpos3/gpos3_font3.default.29,2B.otf     | Bin 1292 -> 1304 bytes
+ .../layout.gpos3/gpos3_font3.default.41,42,43.otf  | Bin 1284 -> 1296 bytes
+ .../gpos3_font3.default.retain-all-codepoint.otf   | Bin 3636 -> 3848 bytes
+ .../layout.gpos3/gpos3_font3.retain-gids.28,29.otf | Bin 1632 -> 1652 bytes
+ .../layout.gpos3/gpos3_font3.retain-gids.28,2B.otf | Bin 1780 -> 1800 bytes
+ .../layout.gpos3/gpos3_font3.retain-gids.29,2B.otf | Bin 1696 -> 1712 bytes
+ .../gpos3_font3.retain-gids.41,42,43.otf           | Bin 1984 -> 2008 bytes
+ ...pos3_font3.retain-gids.retain-all-codepoint.otf | Bin 3636 -> 3848 bytes
+ ...pos4_multiple_anchors_1.default.41,42,43,44.otf | Bin 1516 -> 1528 bytes
+ ...pos4_multiple_anchors_1.default.41,42,43,45.otf | Bin 1524 -> 1536 bytes
+ .../gpos4_multiple_anchors_1.default.41,42,43.otf  | Bin 1308 -> 1320 bytes
+ .../gpos4_multiple_anchors_1.default.41,42.otf     | Bin 1208 -> 1220 bytes
+ ...4_multiple_anchors_1.default.41,43,44,45,46.otf | Bin 1864 -> 1880 bytes
+ .../gpos4_multiple_anchors_1.default.41,43,44.otf  | Bin 1524 -> 1540 bytes
+ .../gpos4_multiple_anchors_1.default.41,43,45.otf  | Bin 1532 -> 1548 bytes
+ .../gpos4_multiple_anchors_1.default.41,43.otf     | Bin 1312 -> 1328 bytes
+ .../gpos4_multiple_anchors_1.default.41.otf        | Bin 1196 -> 1208 bytes
+ ...iple_anchors_1.default.retain-all-codepoint.otf | Bin 3668 -> 3880 bytes
+ ..._multiple_anchors_1.retain-gids.41,42,43,44.otf | Bin 2220 -> 2244 bytes
+ ..._multiple_anchors_1.retain-gids.41,42,43,45.otf | Bin 2244 -> 2268 bytes
+ ...os4_multiple_anchors_1.retain-gids.41,42,43.otf | Bin 2008 -> 2032 bytes
+ .../gpos4_multiple_anchors_1.retain-gids.41,42.otf | Bin 1912 -> 1928 bytes
+ ...ltiple_anchors_1.retain-gids.41,43,44,45,46.otf | Bin 2584 -> 2608 bytes
+ ...os4_multiple_anchors_1.retain-gids.41,43,44.otf | Bin 2240 -> 2264 bytes
+ ...os4_multiple_anchors_1.retain-gids.41,43,45.otf | Bin 2260 -> 2284 bytes
+ .../gpos4_multiple_anchors_1.retain-gids.41,43.otf | Bin 2028 -> 2048 bytes
+ .../gpos4_multiple_anchors_1.retain-gids.41.otf    | Bin 1896 -> 1912 bytes
+ ..._anchors_1.retain-gids.retain-all-codepoint.otf | Bin 3668 -> 3880 bytes
+ .../gpos5_font1.default.41,42,43,44.otf            | Bin 1536 -> 1544 bytes
+ .../gpos5_font1.default.41,42,43,45.otf            | Bin 1544 -> 1552 bytes
+ .../layout.gpos5/gpos5_font1.default.41,42,43.otf  | Bin 1328 -> 1336 bytes
+ .../layout.gpos5/gpos5_font1.default.41,42,44.otf  | Bin 1460 -> 1468 bytes
+ .../layout.gpos5/gpos5_font1.default.41,42,45.otf  | Bin 1448 -> 1456 bytes
+ .../layout.gpos5/gpos5_font1.default.41,42.otf     | Bin 1228 -> 1236 bytes
+ .../layout.gpos5/gpos5_font1.default.41,43.otf     | Bin 1332 -> 1344 bytes
+ .../layout.gpos5/gpos5_font1.default.41.otf        | Bin 1216 -> 1224 bytes
+ .../layout.gpos5/gpos5_font1.default.42.otf        | Bin 1076 -> 1084 bytes
+ .../gpos5_font1.default.retain-all-codepoint.otf   | Bin 3688 -> 3896 bytes
+ .../gpos5_font1.retain-gids.41,42,43,44.otf        | Bin 2240 -> 2260 bytes
+ .../gpos5_font1.retain-gids.41,42,43,45.otf        | Bin 2264 -> 2284 bytes
+ .../gpos5_font1.retain-gids.41,42,43.otf           | Bin 2028 -> 2048 bytes
+ .../gpos5_font1.retain-gids.41,42,44.otf           | Bin 2176 -> 2192 bytes
+ .../gpos5_font1.retain-gids.41,42,45.otf           | Bin 2172 -> 2192 bytes
+ .../layout.gpos5/gpos5_font1.retain-gids.41,42.otf | Bin 1932 -> 1944 bytes
+ .../layout.gpos5/gpos5_font1.retain-gids.41,43.otf | Bin 2048 -> 2064 bytes
+ .../layout.gpos5/gpos5_font1.retain-gids.41.otf    | Bin 1916 -> 1928 bytes
+ .../layout.gpos5/gpos5_font1.retain-gids.42.otf    | Bin 1788 -> 1800 bytes
+ ...pos5_font1.retain-gids.retain-all-codepoint.otf | Bin 3688 -> 3896 bytes
+ .../gpos6_font1.default.41,42,43,44.otf            | Bin 1492 -> 1504 bytes
+ .../gpos6_font1.default.41,42,43,45.otf            | Bin 1500 -> 1512 bytes
+ .../layout.gpos6/gpos6_font1.default.41,42,43.otf  | Bin 1284 -> 1296 bytes
+ .../layout.gpos6/gpos6_font1.default.41,42.otf     | Bin 1184 -> 1196 bytes
+ .../gpos6_font1.default.41,43,44,45,46.otf         | Bin 1840 -> 1856 bytes
+ .../layout.gpos6/gpos6_font1.default.41,43,44.otf  | Bin 1500 -> 1516 bytes
+ .../layout.gpos6/gpos6_font1.default.41,43,45.otf  | Bin 1508 -> 1524 bytes
+ .../layout.gpos6/gpos6_font1.default.41,43.otf     | Bin 1288 -> 1304 bytes
+ .../layout.gpos6/gpos6_font1.default.41.otf        | Bin 1172 -> 1184 bytes
+ .../gpos6_font1.default.retain-all-codepoint.otf   | Bin 3644 -> 3856 bytes
+ .../gpos6_font1.retain-gids.41,42,43,44.otf        | Bin 2196 -> 2220 bytes
+ .../gpos6_font1.retain-gids.41,42,43,45.otf        | Bin 2220 -> 2244 bytes
+ .../gpos6_font1.retain-gids.41,42,43.otf           | Bin 1984 -> 2008 bytes
+ .../layout.gpos6/gpos6_font1.retain-gids.41,42.otf | Bin 1888 -> 1904 bytes
+ .../gpos6_font1.retain-gids.41,43,44,45,46.otf     | Bin 2560 -> 2584 bytes
+ .../gpos6_font1.retain-gids.41,43,44.otf           | Bin 2216 -> 2240 bytes
+ .../gpos6_font1.retain-gids.41,43,45.otf           | Bin 2236 -> 2260 bytes
+ .../layout.gpos6/gpos6_font1.retain-gids.41,43.otf | Bin 2004 -> 2024 bytes
+ .../layout.gpos6/gpos6_font1.retain-gids.41.otf    | Bin 1872 -> 1888 bytes
+ ...pos6_font1.retain-gids.retain-all-codepoint.otf | Bin 3644 -> 3856 bytes
+ ...ular.default.627,644,623,62D,644,627,645,2E.ttf | Bin 12684 -> 12684 bytes
+ .../Amiri-Regular.default.627,644,62D,628.ttf      | Bin 9992 -> 9992 bytes
+ .../Amiri-Regular.default.627,644.ttf              | Bin 4168 -> 4168 bytes
+ ...-Regular.default.633,645,627,621,20,644,627.ttf | Bin 9516 -> 9516 bytes
+ .../Amiri-Regular.default.63A,64A,631.ttf          | Bin 7324 -> 7324 bytes
+ ....retain-gids.627,644,623,62D,644,627,645,2E.ttf | Bin 48012 -> 48012 bytes
+ .../Amiri-Regular.retain-gids.627,644,62D,628.ttf  | Bin 42640 -> 42640 bytes
+ .../Amiri-Regular.retain-gids.627,644.ttf          | Bin 36696 -> 36696 bytes
+ ...ular.retain-gids.633,645,627,621,20,644,627.ttf | Bin 45908 -> 45908 bytes
+ .../Amiri-Regular.retain-gids.63A,64A,631.ttf      | Bin 37988 -> 37988 bytes
+ ...g1_multiple_subrules_f1.default.30,31,32,33.otf | Bin 1840 -> 1856 bytes
+ ...ning1_multiple_subrules_f1.default.41,42,43.otf | Bin 1332 -> 1344 bytes
+ ...le_subrules_f1.default.retain-all-codepoint.otf | Bin 3704 -> 3916 bytes
+ ...ultiple_subrules_f1.retain-gids.30,31,32,33.otf | Bin 2304 -> 2328 bytes
+ ...1_multiple_subrules_f1.retain-gids.41,42,43.otf | Bin 2032 -> 2056 bytes
+ ...ubrules_f1.retain-gids.retain-all-codepoint.otf | Bin 3704 -> 3916 bytes
+ ...g2_multiple_subrules_f1.default.30,31,32,33.otf | Bin 1840 -> 1856 bytes
+ ...ning2_multiple_subrules_f1.default.41,42,43.otf | Bin 1332 -> 1344 bytes
+ ...le_subrules_f1.default.retain-all-codepoint.otf | Bin 3704 -> 3916 bytes
+ ...ultiple_subrules_f1.retain-gids.30,31,32,33.otf | Bin 2304 -> 2328 bytes
+ ...2_multiple_subrules_f1.retain-gids.41,42,43.otf | Bin 2032 -> 2056 bytes
+ ...ubrules_f1.retain-gids.retain-all-codepoint.otf | Bin 3704 -> 3916 bytes
+ ...pos_chaining3_simple_f1.default.30,31,32,33.otf | Bin 1816 -> 1832 bytes
+ .../gpos_chaining3_simple_f1.default.41,42,43.otf  | Bin 1308 -> 1320 bytes
+ ...ing3_simple_f1.default.retain-all-codepoint.otf | Bin 3680 -> 3892 bytes
+ ...chaining3_simple_f1.retain-gids.30,31,32,33.otf | Bin 2280 -> 2304 bytes
+ ...os_chaining3_simple_f1.retain-gids.41,42,43.otf | Bin 2008 -> 2032 bytes
+ ..._simple_f1.retain-gids.retain-all-codepoint.otf | Bin 3680 -> 3892 bytes
+ .../layout.gpos9/gpos9_font2.default.41,42.otf     | Bin 1184 -> 1196 bytes
+ .../layout.gpos9/gpos9_font2.default.41.otf        | Bin 1172 -> 1184 bytes
+ .../layout.gpos9/gpos9_font2.default.42.otf        | Bin 1032 -> 1044 bytes
+ .../layout.gpos9/gpos9_font2.retain-gids.41,42.otf | Bin 1888 -> 1904 bytes
+ .../layout.gpos9/gpos9_font2.retain-gids.41.otf    | Bin 1872 -> 1888 bytes
+ .../layout.gpos9/gpos9_font2.retain-gids.42.otf    | Bin 1744 -> 1760 bytes
+ ...ub_alternate_substitution.default.53A9,53F1.otf | Bin 4348 -> 4372 bytes
+ .../gsub_alternate_substitution.default.53A9.otf   | Bin 3904 -> 3928 bytes
+ .../gsub_alternate_substitution.default.53F1.otf   | Bin 2452 -> 2484 bytes
+ ...e_substitution.default.retain-all-codepoint.otf | Bin 6040 -> 6064 bytes
+ ...lternate_substitution.retain-gids.53A9,53F1.otf | Bin 4472 -> 4496 bytes
+ ...sub_alternate_substitution.retain-gids.53A9.otf | Bin 4056 -> 4080 bytes
+ ...sub_alternate_substitution.retain-gids.53F1.otf | Bin 2648 -> 2676 bytes
+ ...bstitution.retain-gids.retain-all-codepoint.otf | Bin 6132 -> 6156 bytes
+ ...text1_multiple_subrules_f2.default.41,42,43.otf | Bin 1340 -> 1352 bytes
+ ...context1_multiple_subrules_f2.default.41,42.otf | Bin 1240 -> 1252 bytes
+ ...context1_multiple_subrules_f2.default.41,43.otf | Bin 1344 -> 1360 bytes
+ ...ub_context1_multiple_subrules_f2.default.41.otf | Bin 1228 -> 1240 bytes
+ ...le_subrules_f2.default.retain-all-codepoint.otf | Bin 3712 -> 3924 bytes
+ ...1_multiple_subrules_f2.retain-gids.41,42,43.otf | Bin 2040 -> 2064 bytes
+ ...ext1_multiple_subrules_f2.retain-gids.41,42.otf | Bin 1944 -> 1960 bytes
+ ...ext1_multiple_subrules_f2.retain-gids.41,43.otf | Bin 2060 -> 2080 bytes
+ ...ontext1_multiple_subrules_f2.retain-gids.41.otf | Bin 1928 -> 1944 bytes
+ ...ubrules_f2.retain-gids.retain-all-codepoint.otf | Bin 3712 -> 3924 bytes
+ ...text2_multiple_subrules_f2.default.41,42,43.otf | Bin 1340 -> 1352 bytes
+ ...context2_multiple_subrules_f2.default.41,42.otf | Bin 1240 -> 1252 bytes
+ ...context2_multiple_subrules_f2.default.41,43.otf | Bin 1344 -> 1360 bytes
+ ...ub_context2_multiple_subrules_f2.default.41.otf | Bin 1228 -> 1240 bytes
+ ...le_subrules_f2.default.retain-all-codepoint.otf | Bin 3712 -> 3924 bytes
+ ...2_multiple_subrules_f2.retain-gids.41,42,43.otf | Bin 2040 -> 2064 bytes
+ ...ext2_multiple_subrules_f2.retain-gids.41,42.otf | Bin 1944 -> 1960 bytes
+ ...ext2_multiple_subrules_f2.retain-gids.41,43.otf | Bin 2060 -> 2080 bytes
+ ...ontext2_multiple_subrules_f2.retain-gids.41.otf | Bin 1928 -> 1944 bytes
+ ...ubrules_f2.retain-gids.retain-all-codepoint.otf | Bin 3712 -> 3924 bytes
+ ...sub_context3_successive_f1.default.41,42,43.otf | Bin 1328 -> 1340 bytes
+ .../gsub_context3_successive_f1.default.41,42.otf  | Bin 1228 -> 1240 bytes
+ .../gsub_context3_successive_f1.default.41,43.otf  | Bin 1332 -> 1348 bytes
+ .../gsub_context3_successive_f1.default.41.otf     | Bin 1216 -> 1228 bytes
+ ..._successive_f1.default.retain-all-codepoint.otf | Bin 3700 -> 3912 bytes
+ ...context3_successive_f1.retain-gids.41,42,43.otf | Bin 2028 -> 2052 bytes
+ ...ub_context3_successive_f1.retain-gids.41,42.otf | Bin 1932 -> 1948 bytes
+ ...ub_context3_successive_f1.retain-gids.41,43.otf | Bin 2048 -> 2068 bytes
+ .../gsub_context3_successive_f1.retain-gids.41.otf | Bin 1916 -> 1932 bytes
+ ...cessive_f1.retain-gids.retain-all-codepoint.otf | Bin 3700 -> 3912 bytes
+ ...g1_multiple_subrules_f1.default.30,31,32,33.otf | Bin 1852 -> 1868 bytes
+ ...ning1_multiple_subrules_f1.default.41,42,43.otf | Bin 1344 -> 1356 bytes
+ ...le_subrules_f1.default.retain-all-codepoint.otf | Bin 3716 -> 3928 bytes
+ ...ultiple_subrules_f1.retain-gids.30,31,32,33.otf | Bin 2316 -> 2340 bytes
+ ...1_multiple_subrules_f1.retain-gids.41,42,43.otf | Bin 2044 -> 2068 bytes
+ ...ubrules_f1.retain-gids.retain-all-codepoint.otf | Bin 3716 -> 3928 bytes
+ ...g2_multiple_subrules_f1.default.30,31,32,33.otf | Bin 1852 -> 1868 bytes
+ ...ning2_multiple_subrules_f1.default.41,42,43.otf | Bin 1344 -> 1356 bytes
+ ...le_subrules_f1.default.retain-all-codepoint.otf | Bin 3716 -> 3928 bytes
+ ...ultiple_subrules_f1.retain-gids.30,31,32,33.otf | Bin 2316 -> 2340 bytes
+ ...2_multiple_subrules_f1.retain-gids.41,42,43.otf | Bin 2044 -> 2068 bytes
+ ...ubrules_f1.retain-gids.retain-all-codepoint.otf | Bin 3716 -> 3928 bytes
+ ...sub_chaining3_simple_f2.default.30,31,32,33.otf | Bin 1828 -> 1844 bytes
+ .../gsub_chaining3_simple_f2.default.41,42,43.otf  | Bin 1320 -> 1332 bytes
+ ...ing3_simple_f2.default.retain-all-codepoint.otf | Bin 3692 -> 3904 bytes
+ ...chaining3_simple_f2.retain-gids.30,31,32,33.otf | Bin 2292 -> 2316 bytes
+ ...ub_chaining3_simple_f2.retain-gids.41,42,43.otf | Bin 2020 -> 2044 bytes
+ ..._simple_f2.retain-gids.retain-all-codepoint.otf | Bin 3692 -> 3904 bytes
+ ..._created.default.41,42,43,44,45,46,47,48,49.otf | Bin 2176 -> 2188 bytes
+ ...nually_created.default.41,42,43,44,45,46,47.otf | Bin 1888 -> 1904 bytes
+ ...nually_created.default.41,42,43,44,45,46,4D.otf | Bin 1852 -> 1868 bytes
+ ...nually_created.default.41,42,43,44,45,46,51.otf | Bin 1932 -> 1948 bytes
+ ..._manually_created.default.41,42,43,44,45,46.otf | Bin 1832 -> 1844 bytes
+ .../gsub8_manually_created.default.41,42,43.otf    | Bin 1284 -> 1296 bytes
+ .../gsub8_manually_created.default.41.otf          | Bin 1172 -> 1184 bytes
+ .../gsub8_manually_created.default.61.otf          | Bin 1224 -> 1236 bytes
+ ...nually_created.default.retain-all-codepoint.otf | Bin 3656 -> 3868 bytes
+ ...ated.retain-gids.41,42,43,44,45,46,47,48,49.otf | Bin 2884 -> 2916 bytes
+ ...ly_created.retain-gids.41,42,43,44,45,46,47.otf | Bin 2596 -> 2624 bytes
+ ...ly_created.retain-gids.41,42,43,44,45,46,4D.otf | Bin 2636 -> 2668 bytes
+ ...ly_created.retain-gids.41,42,43,44,45,46,51.otf | Bin 2760 -> 2792 bytes
+ ...ually_created.retain-gids.41,42,43,44,45,46.otf | Bin 2540 -> 2564 bytes
+ ...gsub8_manually_created.retain-gids.41,42,43.otf | Bin 1984 -> 2008 bytes
+ .../gsub8_manually_created.retain-gids.41.otf      | Bin 1872 -> 1888 bytes
+ .../gsub8_manually_created.retain-gids.61.otf      | Bin 2276 -> 2292 bytes
+ ...ly_created.retain-gids.retain-all-codepoint.otf | Bin 3656 -> 3868 bytes
+ .../expected/layout.khmer/Khmer.default.1780.ttf   | Bin 4204 -> 4200 bytes
+ ...ult.1789,17BB,17C6,1794,17B6,1793,1798,17BE.ttf | Bin 6412 -> 6408 bytes
+ .../expected/layout.khmer/Khmer.default.31.ttf     | Bin 4140 -> 4136 bytes
+ .../layout.khmer/Khmer.retain-gids.1780.ttf        | Bin 4464 -> 4460 bytes
+ ...ids.1789,17BB,17C6,1794,17B6,1793,1798,17BE.ttf | Bin 7848 -> 7844 bytes
+ .../expected/layout.khmer/Khmer.retain-gids.31.ttf | Bin 4256 -> 4252 bytes
+ ...Bold.default.627,644,623,62D,644,627,645,2E.ttf | Bin 11396 -> 11388 bytes
+ ...toNastaliqUrdu-Bold.default.627,644,62D,628.ttf | Bin 18248 -> 17688 bytes
+ .../NotoNastaliqUrdu-Bold.default.627,644.ttf      | Bin 3528 -> 3520 bytes
+ ...rdu-Bold.default.633,645,627,621,20,644,627.ttf | Bin 12368 -> 12380 bytes
+ .../NotoNastaliqUrdu-Bold.default.63A,64A,631.ttf  | Bin 20368 -> 19380 bytes
+ ....retain-gids.627,644,623,62D,644,627,645,2E.ttf | Bin 18232 -> 18224 bytes
+ ...staliqUrdu-Bold.retain-gids.627,644,62D,628.ttf | Bin 24376 -> 23748 bytes
+ .../NotoNastaliqUrdu-Bold.retain-gids.627,644.ttf  | Bin 9176 -> 9164 bytes
+ ...Bold.retain-gids.633,645,627,621,20,644,627.ttf | Bin 18172 -> 18184 bytes
+ ...toNastaliqUrdu-Bold.retain-gids.63A,64A,631.ttf | Bin 26588 -> 25432 bytes
+ .../Roboto-Regular.smallcaps.default.41,42,43.ttf  | Bin 2464 -> 2460 bytes
+ .../Roboto-Regular.smallcaps.default.41,43.ttf     | Bin 2284 -> 2280 bytes
+ .../layout/Roboto-Regular.smallcaps.default.41.ttf | Bin 2084 -> 2080 bytes
+ .../layout/Roboto-Regular.smallcaps.default.43.ttf | Bin 2116 -> 2112 bytes
+ .../Roboto-Regular.smallcaps.default.CA,CB.ttf     | Bin 2388 -> 2384 bytes
+ ...boto-Regular.smallcaps.retain-gids.41,42,43.ttf | Bin 2716 -> 2712 bytes
+ .../Roboto-Regular.smallcaps.retain-gids.41,43.ttf | Bin 2548 -> 2544 bytes
+ .../Roboto-Regular.smallcaps.retain-gids.41.ttf    | Bin 2336 -> 2332 bytes
+ .../Roboto-Regular.smallcaps.retain-gids.43.ttf    | Bin 2384 -> 2380 bytes
+ .../Roboto-Regular.smallcaps.retain-gids.CA,CB.ttf | Bin 6476 -> 6472 bytes
+ .../data/expected/sbix/sbix.default.58,59.ttf      | Bin 193528 -> 193528 bytes
+ test/subset/data/expected/sbix/sbix.default.58.ttf | Bin 121168 -> 121168 bytes
+ test/subset/data/expected/sbix/sbix.default.59.ttf | Bin 89364 -> 89364 bytes
+ .../sbix/sbix.drop-hints-retain-gids.58,59.ttf     | Bin 193528 -> 193528 bytes
+ .../sbix/sbix.drop-hints-retain-gids.58.ttf        | Bin 121168 -> 121168 bytes
+ .../sbix/sbix.drop-hints-retain-gids.59.ttf        | Bin 89404 -> 89404 bytes
+ .../data/expected/sbix/sbix.drop-hints.58,59.ttf   | Bin 193528 -> 193528 bytes
+ .../data/expected/sbix/sbix.drop-hints.58.ttf      | Bin 121168 -> 121168 bytes
+ .../data/expected/sbix/sbix.drop-hints.59.ttf      | Bin 89364 -> 89364 bytes
+ .../data/expected/sbix/sbix.retain-gids.58,59.ttf  | Bin 193528 -> 193528 bytes
+ .../data/expected/sbix/sbix.retain-gids.58.ttf     | Bin 121168 -> 121168 bytes
+ .../data/expected/sbix/sbix.retain-gids.59.ttf     | Bin 89404 -> 89404 bytes
+ .../variable/Fraunces.default.26,66,69,124,125.ttf | Bin 15792 -> 15856 bytes
+ .../data/expected/variable/Fraunces.default.61.ttf | Bin 4228 -> 4232 bytes
+ test/subset/generate-expected-outputs.py           |  54 +++++++++++++++++++--
+ test/subset/run-tests.py                           |  12 ++++-
+ 948 files changed, 60 insertions(+), 6 deletions(-)
+
+commit 770fbd5aa66b8f557d45366ed51df5a0b26e9e4b
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Aug 4 00:07:23 2021 +0200
+
+    Revert "[test] Speed-up subset tests by saving TTX dump"
+    
+    This reverts commit 278f44dcee34cea25403e42e06668f0afe2328c1.
+
+ .../Comfortaa-Regular-new.default.61,62,63.ttf     |    Bin 0 -> 7060 bytes
+ .../Comfortaa-Regular-new.default.61,62,63.ttx     |   4507 -
+ .../basics/Comfortaa-Regular-new.default.61,63.ttf |    Bin 0 -> 6692 bytes
+ .../basics/Comfortaa-Regular-new.default.61,63.ttx |   4359 -
+ .../basics/Comfortaa-Regular-new.default.61.ttf    |    Bin 0 -> 6328 bytes
+ .../basics/Comfortaa-Regular-new.default.61.ttx    |   4198 -
+ .../basics/Comfortaa-Regular-new.default.62.ttf    |    Bin 0 -> 6200 bytes
+ .../basics/Comfortaa-Regular-new.default.62.ttx    |   4151 -
+ .../basics/Comfortaa-Regular-new.default.63.ttf    |    Bin 0 -> 6256 bytes
+ .../basics/Comfortaa-Regular-new.default.63.ttx    |   4209 -
+ ...aa-Regular-new.default.retain-all-codepoint.ttf |    Bin 0 -> 220928 bytes
+ ...aa-Regular-new.default.retain-all-codepoint.ttx | 132956 -----------------
+ ...Regular-new.drop-hints-retain-gids.61,62,63.ttf |    Bin 0 -> 4608 bytes
+ ...Regular-new.drop-hints-retain-gids.61,62,63.ttx |   1918 -
+ ...aa-Regular-new.drop-hints-retain-gids.61,63.ttf |    Bin 0 -> 4312 bytes
+ ...aa-Regular-new.drop-hints-retain-gids.61,63.ttx |   1785 -
+ ...ortaa-Regular-new.drop-hints-retain-gids.61.ttf |    Bin 0 -> 3724 bytes
+ ...ortaa-Regular-new.drop-hints-retain-gids.61.ttx |   1493 -
+ ...ortaa-Regular-new.drop-hints-retain-gids.62.ttf |    Bin 0 -> 3900 bytes
+ ...ortaa-Regular-new.drop-hints-retain-gids.62.ttx |   1600 -
+ ...ortaa-Regular-new.drop-hints-retain-gids.63.ttf |    Bin 0 -> 3972 bytes
+ ...ortaa-Regular-new.drop-hints-retain-gids.63.ttx |   1662 -
+ ...drop-hints-retain-gids.retain-all-codepoint.ttf |    Bin 0 -> 189800 bytes
+ ...drop-hints-retain-gids.retain-all-codepoint.ttx | 122816 ----------------
+ .../Comfortaa-Regular-new.drop-hints.61,62,63.ttf  |    Bin 0 -> 2600 bytes
+ .../Comfortaa-Regular-new.drop-hints.61,62,63.ttx  |    813 -
+ .../Comfortaa-Regular-new.drop-hints.61,63.ttf     |    Bin 0 -> 2296 bytes
+ .../Comfortaa-Regular-new.drop-hints.61,63.ttx     |    675 -
+ .../basics/Comfortaa-Regular-new.drop-hints.61.ttf |    Bin 0 -> 1976 bytes
+ .../basics/Comfortaa-Regular-new.drop-hints.61.ttx |    523 -
+ .../basics/Comfortaa-Regular-new.drop-hints.62.ttf |    Bin 0 -> 1900 bytes
+ .../basics/Comfortaa-Regular-new.drop-hints.62.ttx |    490 -
+ .../basics/Comfortaa-Regular-new.drop-hints.63.ttf |    Bin 0 -> 1968 bytes
+ .../basics/Comfortaa-Regular-new.drop-hints.63.ttx |    547 -
+ ...Regular-new.drop-hints.retain-all-codepoint.ttf |    Bin 0 -> 189756 bytes
+ ...Regular-new.drop-hints.retain-all-codepoint.ttx | 122806 ----------------
+ .../basics/Comfortaa-Regular-new.gids.61,62,63.ttf |    Bin 0 -> 7988 bytes
+ .../basics/Comfortaa-Regular-new.gids.61,62,63.ttx |   4929 -
+ .../basics/Comfortaa-Regular-new.gids.61,63.ttf    |    Bin 0 -> 7628 bytes
+ .../basics/Comfortaa-Regular-new.gids.61,63.ttx    |   4778 -
+ .../basics/Comfortaa-Regular-new.gids.61.ttf       |    Bin 0 -> 7256 bytes
+ .../basics/Comfortaa-Regular-new.gids.61.ttx       |   4614 -
+ .../basics/Comfortaa-Regular-new.gids.62.ttf       |    Bin 0 -> 7184 bytes
+ .../basics/Comfortaa-Regular-new.gids.62.ttx       |   4606 -
+ .../basics/Comfortaa-Regular-new.gids.63.ttf       |    Bin 0 -> 7180 bytes
+ .../basics/Comfortaa-Regular-new.gids.63.ttx       |   4623 -
+ ...ortaa-Regular-new.gids.retain-all-codepoint.ttf |    Bin 0 -> 220928 bytes
+ ...ortaa-Regular-new.gids.retain-all-codepoint.ttx | 132956 -----------------
+ .../Comfortaa-Regular-new.glyph-names.61,62,63.ttf |    Bin 0 -> 7072 bytes
+ .../Comfortaa-Regular-new.glyph-names.61,62,63.ttx |   4519 -
+ .../Comfortaa-Regular-new.glyph-names.61,63.ttf    |    Bin 0 -> 6700 bytes
+ .../Comfortaa-Regular-new.glyph-names.61,63.ttx    |   4371 -
+ .../Comfortaa-Regular-new.glyph-names.61.ttf       |    Bin 0 -> 6336 bytes
+ .../Comfortaa-Regular-new.glyph-names.61.ttx       |   4210 -
+ .../Comfortaa-Regular-new.glyph-names.62.ttf       |    Bin 0 -> 6208 bytes
+ .../Comfortaa-Regular-new.glyph-names.62.ttx       |   4163 -
+ .../Comfortaa-Regular-new.glyph-names.63.ttf       |    Bin 0 -> 6264 bytes
+ .../Comfortaa-Regular-new.glyph-names.63.ttx       |   4221 -
+ ...egular-new.glyph-names.retain-all-codepoint.ttf |    Bin 0 -> 227920 bytes
+ ...egular-new.glyph-names.retain-all-codepoint.ttx | 133598 ------------------
+ ...gular-new.keep-all-layout-features.61,62,63.ttf |    Bin 0 -> 7504 bytes
+ ...gular-new.keep-all-layout-features.61,62,63.ttx |   4670 -
+ ...-Regular-new.keep-all-layout-features.61,63.ttf |    Bin 0 -> 7140 bytes
+ ...-Regular-new.keep-all-layout-features.61,63.ttx |   4519 -
+ ...taa-Regular-new.keep-all-layout-features.61.ttf |    Bin 0 -> 6772 bytes
+ ...taa-Regular-new.keep-all-layout-features.61.ttx |   4355 -
+ ...taa-Regular-new.keep-all-layout-features.62.ttf |    Bin 0 -> 6200 bytes
+ ...taa-Regular-new.keep-all-layout-features.62.ttx |   4151 -
+ ...taa-Regular-new.keep-all-layout-features.63.ttf |    Bin 0 -> 6256 bytes
+ ...taa-Regular-new.keep-all-layout-features.63.ttx |   4209 -
+ ...ep-all-layout-features.retain-all-codepoint.ttf |    Bin 0 -> 221620 bytes
+ ...ep-all-layout-features.retain-all-codepoint.ttx | 133303 -----------------
+ ...fortaa-Regular-new.layout-features.61,62,63.ttf |    Bin 0 -> 7060 bytes
+ ...fortaa-Regular-new.layout-features.61,62,63.ttx |   4507 -
+ ...Comfortaa-Regular-new.layout-features.61,63.ttf |    Bin 0 -> 6692 bytes
+ ...Comfortaa-Regular-new.layout-features.61,63.ttx |   4359 -
+ .../Comfortaa-Regular-new.layout-features.61.ttf   |    Bin 0 -> 6328 bytes
+ .../Comfortaa-Regular-new.layout-features.61.ttx   |   4198 -
+ .../Comfortaa-Regular-new.layout-features.62.ttf   |    Bin 0 -> 6200 bytes
+ .../Comfortaa-Regular-new.layout-features.62.ttx   |   4151 -
+ .../Comfortaa-Regular-new.layout-features.63.ttf   |    Bin 0 -> 6256 bytes
+ .../Comfortaa-Regular-new.layout-features.63.ttx   |   4209 -
+ ...ar-new.layout-features.retain-all-codepoint.ttf |    Bin 0 -> 219124 bytes
+ ...ar-new.layout-features.retain-all-codepoint.ttx | 131168 -----------------
+ .../Comfortaa-Regular-new.name-ids.61,62,63.ttf    |    Bin 0 -> 6800 bytes
+ .../Comfortaa-Regular-new.name-ids.61,62,63.ttx    |   4495 -
+ .../Comfortaa-Regular-new.name-ids.61,63.ttf       |    Bin 0 -> 6432 bytes
+ .../Comfortaa-Regular-new.name-ids.61,63.ttx       |   4347 -
+ .../basics/Comfortaa-Regular-new.name-ids.61.ttf   |    Bin 0 -> 6068 bytes
+ .../basics/Comfortaa-Regular-new.name-ids.61.ttx   |   4186 -
+ .../basics/Comfortaa-Regular-new.name-ids.62.ttf   |    Bin 0 -> 5940 bytes
+ .../basics/Comfortaa-Regular-new.name-ids.62.ttx   |   4139 -
+ .../basics/Comfortaa-Regular-new.name-ids.63.ttf   |    Bin 0 -> 5996 bytes
+ .../basics/Comfortaa-Regular-new.name-ids.63.ttx   |   4197 -
+ ...a-Regular-new.name-ids.retain-all-codepoint.ttf |    Bin 0 -> 220668 bytes
+ ...a-Regular-new.name-ids.retain-all-codepoint.ttx | 132944 -----------------
+ ...mfortaa-Regular-new.name-languages.61,62,63.ttf |    Bin 0 -> 7060 bytes
+ ...mfortaa-Regular-new.name-languages.61,62,63.ttx |   4507 -
+ .../Comfortaa-Regular-new.name-languages.61,63.ttf |    Bin 0 -> 6692 bytes
+ .../Comfortaa-Regular-new.name-languages.61,63.ttx |   4359 -
+ .../Comfortaa-Regular-new.name-languages.61.ttf    |    Bin 0 -> 6328 bytes
+ .../Comfortaa-Regular-new.name-languages.61.ttx    |   4198 -
+ .../Comfortaa-Regular-new.name-languages.62.ttf    |    Bin 0 -> 6200 bytes
+ .../Comfortaa-Regular-new.name-languages.62.ttx    |   4151 -
+ .../Comfortaa-Regular-new.name-languages.63.ttf    |    Bin 0 -> 6256 bytes
+ .../Comfortaa-Regular-new.name-languages.63.ttx    |   4209 -
+ ...lar-new.name-languages.retain-all-codepoint.ttf |    Bin 0 -> 220928 bytes
+ ...lar-new.name-languages.retain-all-codepoint.ttx | 132956 -----------------
+ .../Comfortaa-Regular-new.name-legacy.61,62,63.ttf |    Bin 0 -> 7060 bytes
+ .../Comfortaa-Regular-new.name-legacy.61,62,63.ttx |   4507 -
+ .../Comfortaa-Regular-new.name-legacy.61,63.ttf    |    Bin 0 -> 6692 bytes
+ .../Comfortaa-Regular-new.name-legacy.61,63.ttx    |   4359 -
+ .../Comfortaa-Regular-new.name-legacy.61.ttf       |    Bin 0 -> 6328 bytes
+ .../Comfortaa-Regular-new.name-legacy.61.ttx       |   4198 -
+ .../Comfortaa-Regular-new.name-legacy.62.ttf       |    Bin 0 -> 6200 bytes
+ .../Comfortaa-Regular-new.name-legacy.62.ttx       |   4151 -
+ .../Comfortaa-Regular-new.name-legacy.63.ttf       |    Bin 0 -> 6256 bytes
+ .../Comfortaa-Regular-new.name-legacy.63.ttx       |   4209 -
+ ...egular-new.name-legacy.retain-all-codepoint.ttf |    Bin 0 -> 220928 bytes
+ ...egular-new.name-legacy.retain-all-codepoint.ttx | 132956 -----------------
+ ...egular-new.no-prune-unicode-ranges.61,62,63.ttf |    Bin 0 -> 7060 bytes
+ ...egular-new.no-prune-unicode-ranges.61,62,63.ttx |   4507 -
+ ...a-Regular-new.no-prune-unicode-ranges.61,63.ttf |    Bin 0 -> 6692 bytes
+ ...a-Regular-new.no-prune-unicode-ranges.61,63.ttx |   4359 -
+ ...rtaa-Regular-new.no-prune-unicode-ranges.61.ttf |    Bin 0 -> 6328 bytes
+ ...rtaa-Regular-new.no-prune-unicode-ranges.61.ttx |   4198 -
+ ...rtaa-Regular-new.no-prune-unicode-ranges.62.ttf |    Bin 0 -> 6200 bytes
+ ...rtaa-Regular-new.no-prune-unicode-ranges.62.ttx |   4151 -
+ ...rtaa-Regular-new.no-prune-unicode-ranges.63.ttf |    Bin 0 -> 6256 bytes
+ ...rtaa-Regular-new.no-prune-unicode-ranges.63.ttx |   4209 -
+ ...o-prune-unicode-ranges.retain-all-codepoint.ttf |    Bin 0 -> 220928 bytes
+ ...o-prune-unicode-ranges.retain-all-codepoint.ttx | 132956 -----------------
+ ...mfortaa-Regular-new.notdef-outline.61,62,63.ttf |    Bin 0 -> 7652 bytes
+ ...mfortaa-Regular-new.notdef-outline.61,62,63.ttx |   4758 -
+ .../Comfortaa-Regular-new.notdef-outline.61,63.ttf |    Bin 0 -> 7284 bytes
+ .../Comfortaa-Regular-new.notdef-outline.61,63.ttx |   4610 -
+ .../Comfortaa-Regular-new.notdef-outline.61.ttf    |    Bin 0 -> 6920 bytes
+ .../Comfortaa-Regular-new.notdef-outline.61.ttx    |   4449 -
+ .../Comfortaa-Regular-new.notdef-outline.62.ttf    |    Bin 0 -> 6796 bytes
+ .../Comfortaa-Regular-new.notdef-outline.62.ttx    |   4402 -
+ .../Comfortaa-Regular-new.notdef-outline.63.ttf    |    Bin 0 -> 6844 bytes
+ .../Comfortaa-Regular-new.notdef-outline.63.ttx    |   4460 -
+ ...lar-new.notdef-outline.retain-all-codepoint.ttf |    Bin 0 -> 221524 bytes
+ ...lar-new.notdef-outline.retain-all-codepoint.ttx | 133207 -----------------
+ .../Comfortaa-Regular-new.retain-gids.61,62,63.ttf |    Bin 0 -> 9068 bytes
+ .../Comfortaa-Regular-new.retain-gids.61,62,63.ttx |   5612 -
+ .../Comfortaa-Regular-new.retain-gids.61,63.ttf    |    Bin 0 -> 8708 bytes
+ .../Comfortaa-Regular-new.retain-gids.61,63.ttx    |   5469 -
+ .../Comfortaa-Regular-new.retain-gids.61.ttf       |    Bin 0 -> 8076 bytes
+ .../Comfortaa-Regular-new.retain-gids.61.ttx       |   5168 -
+ .../Comfortaa-Regular-new.retain-gids.62.ttf       |    Bin 0 -> 8200 bytes
+ .../Comfortaa-Regular-new.retain-gids.62.ttx       |   5261 -
+ .../Comfortaa-Regular-new.retain-gids.63.ttf       |    Bin 0 -> 8260 bytes
+ .../Comfortaa-Regular-new.retain-gids.63.ttx       |   5324 -
+ ...egular-new.retain-gids.retain-all-codepoint.ttf |    Bin 0 -> 220972 bytes
+ ...egular-new.retain-gids.retain-all-codepoint.ttx | 132966 -----------------
+ ...numMyeongjo-Regular-subset.default.61,62,63.ttf |    Bin 0 -> 4128 bytes
+ ...numMyeongjo-Regular-subset.default.61,62,63.ttx |   2032 -
+ .../NanumMyeongjo-Regular-subset.default.61,63.ttf |    Bin 0 -> 3580 bytes
+ .../NanumMyeongjo-Regular-subset.default.61,63.ttx |   1822 -
+ .../NanumMyeongjo-Regular-subset.default.61.ttf    |    Bin 0 -> 3156 bytes
+ .../NanumMyeongjo-Regular-subset.default.61.ttx    |   1696 -
+ .../NanumMyeongjo-Regular-subset.default.62.ttf    |    Bin 0 -> 3180 bytes
+ .../NanumMyeongjo-Regular-subset.default.62.ttx    |   1719 -
+ .../NanumMyeongjo-Regular-subset.default.63.ttf    |    Bin 0 -> 3048 bytes
+ .../NanumMyeongjo-Regular-subset.default.63.ttx    |   1635 -
+ ...Regular-subset.default.retain-all-codepoint.ttf |    Bin 0 -> 9524 bytes
+ ...Regular-subset.default.retain-all-codepoint.ttx |   4391 -
+ ...ular-subset.drop-hints-retain-gids.61,62,63.ttf |    Bin 0 -> 1452 bytes
+ ...ular-subset.drop-hints-retain-gids.61,62,63.ttx |    380 -
+ ...Regular-subset.drop-hints-retain-gids.61,63.ttf |    Bin 0 -> 1284 bytes
+ ...Regular-subset.drop-hints-retain-gids.61,63.ttx |    314 -
+ ...jo-Regular-subset.drop-hints-retain-gids.61.ttf |    Bin 0 -> 1128 bytes
+ ...jo-Regular-subset.drop-hints-retain-gids.61.ttx |    254 -
+ ...jo-Regular-subset.drop-hints-retain-gids.62.ttf |    Bin 0 -> 1144 bytes
+ ...jo-Regular-subset.drop-hints-retain-gids.62.ttx |    261 -
+ ...jo-Regular-subset.drop-hints-retain-gids.63.ttf |    Bin 0 -> 1116 bytes
+ ...jo-Regular-subset.drop-hints-retain-gids.63.ttx |    251 -
+ ...drop-hints-retain-gids.retain-all-codepoint.ttf |    Bin 0 -> 3536 bytes
+ ...drop-hints-retain-gids.retain-all-codepoint.ttx |   1215 -
+ ...Myeongjo-Regular-subset.drop-hints.61,62,63.ttf |    Bin 0 -> 1452 bytes
+ ...Myeongjo-Regular-subset.drop-hints.61,62,63.ttx |    380 -
+ ...numMyeongjo-Regular-subset.drop-hints.61,63.ttf |    Bin 0 -> 1276 bytes
+ ...numMyeongjo-Regular-subset.drop-hints.61,63.ttx |    310 -
+ .../NanumMyeongjo-Regular-subset.drop-hints.61.ttf |    Bin 0 -> 1128 bytes
+ .../NanumMyeongjo-Regular-subset.drop-hints.61.ttx |    254 -
+ .../NanumMyeongjo-Regular-subset.drop-hints.62.ttf |    Bin 0 -> 1140 bytes
+ .../NanumMyeongjo-Regular-subset.drop-hints.62.ttx |    257 -
+ .../NanumMyeongjo-Regular-subset.drop-hints.63.ttf |    Bin 0 -> 1104 bytes
+ .../NanumMyeongjo-Regular-subset.drop-hints.63.ttx |    243 -
+ ...ular-subset.drop-hints.retain-all-codepoint.ttf |    Bin 0 -> 3536 bytes
+ ...ular-subset.drop-hints.retain-all-codepoint.ttx |   1215 -
+ .../NanumMyeongjo-Regular-subset.gids.61,62,63.ttf |    Bin 0 -> 4128 bytes
+ .../NanumMyeongjo-Regular-subset.gids.61,62,63.ttx |   2032 -
+ .../NanumMyeongjo-Regular-subset.gids.61,63.ttf    |    Bin 0 -> 4128 bytes
+ .../NanumMyeongjo-Regular-subset.gids.61,63.ttx    |   2032 -
+ .../NanumMyeongjo-Regular-subset.gids.61.ttf       |    Bin 0 -> 4128 bytes
+ .../NanumMyeongjo-Regular-subset.gids.61.ttx       |   2032 -
+ .../NanumMyeongjo-Regular-subset.gids.62.ttf       |    Bin 0 -> 4128 bytes
+ .../NanumMyeongjo-Regular-subset.gids.62.ttx       |   2032 -
+ .../NanumMyeongjo-Regular-subset.gids.63.ttf       |    Bin 0 -> 4128 bytes
+ .../NanumMyeongjo-Regular-subset.gids.63.ttx       |   2032 -
+ ...jo-Regular-subset.gids.retain-all-codepoint.ttf |    Bin 0 -> 9524 bytes
+ ...jo-Regular-subset.gids.retain-all-codepoint.ttx |   4391 -
+ ...yeongjo-Regular-subset.glyph-names.61,62,63.ttf |    Bin 0 -> 4128 bytes
+ ...yeongjo-Regular-subset.glyph-names.61,62,63.ttx |   2032 -
+ ...umMyeongjo-Regular-subset.glyph-names.61,63.ttf |    Bin 0 -> 3580 bytes
+ ...umMyeongjo-Regular-subset.glyph-names.61,63.ttx |   1822 -
+ ...NanumMyeongjo-Regular-subset.glyph-names.61.ttf |    Bin 0 -> 3156 bytes
+ ...NanumMyeongjo-Regular-subset.glyph-names.61.ttx |   1696 -
+ ...NanumMyeongjo-Regular-subset.glyph-names.62.ttf |    Bin 0 -> 3180 bytes
+ ...NanumMyeongjo-Regular-subset.glyph-names.62.ttx |   1719 -
+ ...NanumMyeongjo-Regular-subset.glyph-names.63.ttf |    Bin 0 -> 3048 bytes
+ ...NanumMyeongjo-Regular-subset.glyph-names.63.ttx |   1635 -
+ ...lar-subset.glyph-names.retain-all-codepoint.ttf |    Bin 0 -> 9524 bytes
+ ...lar-subset.glyph-names.retain-all-codepoint.ttx |   4391 -
+ ...ar-subset.keep-all-layout-features.61,62,63.ttf |    Bin 0 -> 4128 bytes
+ ...ar-subset.keep-all-layout-features.61,62,63.ttx |   2032 -
+ ...gular-subset.keep-all-layout-features.61,63.ttf |    Bin 0 -> 3580 bytes
+ ...gular-subset.keep-all-layout-features.61,63.ttx |   1822 -
+ ...-Regular-subset.keep-all-layout-features.61.ttf |    Bin 0 -> 3156 bytes
+ ...-Regular-subset.keep-all-layout-features.61.ttx |   1696 -
+ ...-Regular-subset.keep-all-layout-features.62.ttf |    Bin 0 -> 3180 bytes
+ ...-Regular-subset.keep-all-layout-features.62.ttx |   1719 -
+ ...-Regular-subset.keep-all-layout-features.63.ttf |    Bin 0 -> 3048 bytes
+ ...-Regular-subset.keep-all-layout-features.63.ttx |   1635 -
+ ...ep-all-layout-features.retain-all-codepoint.ttf |    Bin 0 -> 9524 bytes
+ ...ep-all-layout-features.retain-all-codepoint.ttx |   4391 -
+ ...gjo-Regular-subset.layout-features.61,62,63.ttf |    Bin 0 -> 4128 bytes
+ ...gjo-Regular-subset.layout-features.61,62,63.ttx |   2032 -
+ ...eongjo-Regular-subset.layout-features.61,63.ttf |    Bin 0 -> 3580 bytes
+ ...eongjo-Regular-subset.layout-features.61,63.ttx |   1822 -
+ ...mMyeongjo-Regular-subset.layout-features.61.ttf |    Bin 0 -> 3156 bytes
+ ...mMyeongjo-Regular-subset.layout-features.61.ttx |   1696 -
+ ...mMyeongjo-Regular-subset.layout-features.62.ttf |    Bin 0 -> 3180 bytes
+ ...mMyeongjo-Regular-subset.layout-features.62.ttx |   1719 -
+ ...mMyeongjo-Regular-subset.layout-features.63.ttf |    Bin 0 -> 3048 bytes
+ ...mMyeongjo-Regular-subset.layout-features.63.ttx |   1635 -
+ ...subset.layout-features.retain-all-codepoint.ttf |    Bin 0 -> 9524 bytes
+ ...subset.layout-features.retain-all-codepoint.ttx |   4391 -
+ ...umMyeongjo-Regular-subset.name-ids.61,62,63.ttf |    Bin 0 -> 3924 bytes
+ ...umMyeongjo-Regular-subset.name-ids.61,62,63.ttx |   2020 -
+ ...NanumMyeongjo-Regular-subset.name-ids.61,63.ttf |    Bin 0 -> 3376 bytes
+ ...NanumMyeongjo-Regular-subset.name-ids.61,63.ttx |   1810 -
+ .../NanumMyeongjo-Regular-subset.name-ids.61.ttf   |    Bin 0 -> 2952 bytes
+ .../NanumMyeongjo-Regular-subset.name-ids.61.ttx   |   1684 -
+ .../NanumMyeongjo-Regular-subset.name-ids.62.ttf   |    Bin 0 -> 2976 bytes
+ .../NanumMyeongjo-Regular-subset.name-ids.62.ttx   |   1707 -
+ .../NanumMyeongjo-Regular-subset.name-ids.63.ttf   |    Bin 0 -> 2844 bytes
+ .../NanumMyeongjo-Regular-subset.name-ids.63.ttx   |   1623 -
+ ...egular-subset.name-ids.retain-all-codepoint.ttf |    Bin 0 -> 9320 bytes
+ ...egular-subset.name-ids.retain-all-codepoint.ttx |   4379 -
+ ...ngjo-Regular-subset.name-languages.61,62,63.ttf |    Bin 0 -> 4172 bytes
+ ...ngjo-Regular-subset.name-languages.61,62,63.ttx |   2041 -
+ ...yeongjo-Regular-subset.name-languages.61,63.ttf |    Bin 0 -> 3624 bytes
+ ...yeongjo-Regular-subset.name-languages.61,63.ttx |   1831 -
+ ...umMyeongjo-Regular-subset.name-languages.61.ttf |    Bin 0 -> 3200 bytes
+ ...umMyeongjo-Regular-subset.name-languages.61.ttx |   1705 -
+ ...umMyeongjo-Regular-subset.name-languages.62.ttf |    Bin 0 -> 3224 bytes
+ ...umMyeongjo-Regular-subset.name-languages.62.ttx |   1728 -
+ ...umMyeongjo-Regular-subset.name-languages.63.ttf |    Bin 0 -> 3092 bytes
+ ...umMyeongjo-Regular-subset.name-languages.63.ttx |   1644 -
+ ...-subset.name-languages.retain-all-codepoint.ttf |    Bin 0 -> 9568 bytes
+ ...-subset.name-languages.retain-all-codepoint.ttx |   4400 -
+ ...yeongjo-Regular-subset.name-legacy.61,62,63.ttf |    Bin 0 -> 4128 bytes
+ ...yeongjo-Regular-subset.name-legacy.61,62,63.ttx |   2032 -
+ ...umMyeongjo-Regular-subset.name-legacy.61,63.ttf |    Bin 0 -> 3580 bytes
+ ...umMyeongjo-Regular-subset.name-legacy.61,63.ttx |   1822 -
+ ...NanumMyeongjo-Regular-subset.name-legacy.61.ttf |    Bin 0 -> 3156 bytes
+ ...NanumMyeongjo-Regular-subset.name-legacy.61.ttx |   1696 -
+ ...NanumMyeongjo-Regular-subset.name-legacy.62.ttf |    Bin 0 -> 3180 bytes
+ ...NanumMyeongjo-Regular-subset.name-legacy.62.ttx |   1719 -
+ ...NanumMyeongjo-Regular-subset.name-legacy.63.ttf |    Bin 0 -> 3048 bytes
+ ...NanumMyeongjo-Regular-subset.name-legacy.63.ttx |   1635 -
+ ...lar-subset.name-legacy.retain-all-codepoint.ttf |    Bin 0 -> 9524 bytes
+ ...lar-subset.name-legacy.retain-all-codepoint.ttx |   4391 -
+ ...lar-subset.no-prune-unicode-ranges.61,62,63.ttf |    Bin 0 -> 4128 bytes
+ ...lar-subset.no-prune-unicode-ranges.61,62,63.ttx |   2032 -
+ ...egular-subset.no-prune-unicode-ranges.61,63.ttf |    Bin 0 -> 3580 bytes
+ ...egular-subset.no-prune-unicode-ranges.61,63.ttx |   1822 -
+ ...o-Regular-subset.no-prune-unicode-ranges.61.ttf |    Bin 0 -> 3156 bytes
+ ...o-Regular-subset.no-prune-unicode-ranges.61.ttx |   1696 -
+ ...o-Regular-subset.no-prune-unicode-ranges.62.ttf |    Bin 0 -> 3180 bytes
+ ...o-Regular-subset.no-prune-unicode-ranges.62.ttx |   1719 -
+ ...o-Regular-subset.no-prune-unicode-ranges.63.ttf |    Bin 0 -> 3048 bytes
+ ...o-Regular-subset.no-prune-unicode-ranges.63.ttx |   1635 -
+ ...o-prune-unicode-ranges.retain-all-codepoint.ttf |    Bin 0 -> 9524 bytes
+ ...o-prune-unicode-ranges.retain-all-codepoint.ttx |   4391 -
+ ...ngjo-Regular-subset.notdef-outline.61,62,63.ttf |    Bin 0 -> 4128 bytes
+ ...ngjo-Regular-subset.notdef-outline.61,62,63.ttx |   2032 -
+ ...yeongjo-Regular-subset.notdef-outline.61,63.ttf |    Bin 0 -> 3580 bytes
+ ...yeongjo-Regular-subset.notdef-outline.61,63.ttx |   1822 -
+ ...umMyeongjo-Regular-subset.notdef-outline.61.ttf |    Bin 0 -> 3156 bytes
+ ...umMyeongjo-Regular-subset.notdef-outline.61.ttx |   1696 -
+ ...umMyeongjo-Regular-subset.notdef-outline.62.ttf |    Bin 0 -> 3180 bytes
+ ...umMyeongjo-Regular-subset.notdef-outline.62.ttx |   1719 -
+ ...umMyeongjo-Regular-subset.notdef-outline.63.ttf |    Bin 0 -> 3048 bytes
+ ...umMyeongjo-Regular-subset.notdef-outline.63.ttx |   1635 -
+ ...-subset.notdef-outline.retain-all-codepoint.ttf |    Bin 0 -> 9524 bytes
+ ...-subset.notdef-outline.retain-all-codepoint.ttx |   4391 -
+ ...yeongjo-Regular-subset.retain-gids.61,62,63.ttf |    Bin 0 -> 4128 bytes
+ ...yeongjo-Regular-subset.retain-gids.61,62,63.ttx |   2032 -
+ ...umMyeongjo-Regular-subset.retain-gids.61,63.ttf |    Bin 0 -> 3588 bytes
+ ...umMyeongjo-Regular-subset.retain-gids.61,63.ttx |   1826 -
+ ...NanumMyeongjo-Regular-subset.retain-gids.61.ttf |    Bin 0 -> 3156 bytes
+ ...NanumMyeongjo-Regular-subset.retain-gids.61.ttx |   1696 -
+ ...NanumMyeongjo-Regular-subset.retain-gids.62.ttf |    Bin 0 -> 3184 bytes
+ ...NanumMyeongjo-Regular-subset.retain-gids.62.ttx |   1723 -
+ ...NanumMyeongjo-Regular-subset.retain-gids.63.ttf |    Bin 0 -> 3060 bytes
+ ...NanumMyeongjo-Regular-subset.retain-gids.63.ttx |   1643 -
+ ...lar-subset.retain-gids.retain-all-codepoint.ttf |    Bin 0 -> 9524 bytes
+ ...lar-subset.retain-gids.retain-all-codepoint.ttx |   4391 -
+ .../basics/Roboto-Regular.abc.default.61,62,63.ttf |    Bin 0 -> 2452 bytes
+ .../basics/Roboto-Regular.abc.default.61,62,63.ttx |   1407 -
+ .../basics/Roboto-Regular.abc.default.61,63.ttf    |    Bin 0 -> 2260 bytes
+ .../basics/Roboto-Regular.abc.default.61,63.ttx    |   1259 -
+ .../basics/Roboto-Regular.abc.default.61.ttf       |    Bin 0 -> 2048 bytes
+ .../basics/Roboto-Regular.abc.default.61.ttx       |   1127 -
+ .../basics/Roboto-Regular.abc.default.62.ttf       |    Bin 0 -> 1916 bytes
+ .../basics/Roboto-Regular.abc.default.62.ttx       |   1025 -
+ .../basics/Roboto-Regular.abc.default.63.ttf       |    Bin 0 -> 1972 bytes
+ .../basics/Roboto-Regular.abc.default.63.ttx       |   1073 -
+ ...to-Regular.abc.default.retain-all-codepoint.ttf |    Bin 0 -> 2452 bytes
+ ...to-Regular.abc.default.retain-all-codepoint.ttx |   1407 -
+ ...Regular.abc.drop-hints-retain-gids.61,62,63.ttf |    Bin 0 -> 1192 bytes
+ ...Regular.abc.drop-hints-retain-gids.61,62,63.ttx |    479 -
+ ...to-Regular.abc.drop-hints-retain-gids.61,63.ttf |    Bin 0 -> 1124 bytes
+ ...to-Regular.abc.drop-hints-retain-gids.61,63.ttx |    433 -
+ ...oboto-Regular.abc.drop-hints-retain-gids.61.ttf |    Bin 0 -> 984 bytes
+ ...oboto-Regular.abc.drop-hints-retain-gids.61.ttx |    374 -
+ ...oboto-Regular.abc.drop-hints-retain-gids.62.ttf |    Bin 0 -> 880 bytes
+ ...oboto-Regular.abc.drop-hints-retain-gids.62.ttx |    297 -
+ ...oboto-Regular.abc.drop-hints-retain-gids.63.ttf |    Bin 0 -> 968 bytes
+ ...oboto-Regular.abc.drop-hints-retain-gids.63.ttx |    369 -
+ ...drop-hints-retain-gids.retain-all-codepoint.ttf |    Bin 0 -> 1192 bytes
+ ...drop-hints-retain-gids.retain-all-codepoint.ttx |    479 -
+ .../Roboto-Regular.abc.drop-hints.61,62,63.ttf     |    Bin 0 -> 1192 bytes
+ .../Roboto-Regular.abc.drop-hints.61,62,63.ttx     |    479 -
+ .../basics/Roboto-Regular.abc.drop-hints.61,63.ttf |    Bin 0 -> 1108 bytes
+ .../basics/Roboto-Regular.abc.drop-hints.61,63.ttx |    429 -
+ .../basics/Roboto-Regular.abc.drop-hints.61.ttf    |    Bin 0 -> 984 bytes
+ .../basics/Roboto-Regular.abc.drop-hints.61.ttx    |    374 -
+ .../basics/Roboto-Regular.abc.drop-hints.62.ttf    |    Bin 0 -> 876 bytes
+ .../basics/Roboto-Regular.abc.drop-hints.62.ttx    |    293 -
+ .../basics/Roboto-Regular.abc.drop-hints.63.ttf    |    Bin 0 -> 956 bytes
+ .../basics/Roboto-Regular.abc.drop-hints.63.ttx    |    361 -
+ ...Regular.abc.drop-hints.retain-all-codepoint.ttf |    Bin 0 -> 1192 bytes
+ ...Regular.abc.drop-hints.retain-all-codepoint.ttx |    479 -
+ .../basics/Roboto-Regular.abc.gids.61,62,63.ttf    |    Bin 0 -> 2452 bytes
+ .../basics/Roboto-Regular.abc.gids.61,62,63.ttx    |   1407 -
+ .../basics/Roboto-Regular.abc.gids.61,63.ttf       |    Bin 0 -> 2452 bytes
+ .../basics/Roboto-Regular.abc.gids.61,63.ttx       |   1407 -
+ .../expected/basics/Roboto-Regular.abc.gids.61.ttf |    Bin 0 -> 2452 bytes
+ .../expected/basics/Roboto-Regular.abc.gids.61.ttx |   1407 -
+ .../expected/basics/Roboto-Regular.abc.gids.62.ttf |    Bin 0 -> 2452 bytes
+ .../expected/basics/Roboto-Regular.abc.gids.62.ttx |   1407 -
+ .../expected/basics/Roboto-Regular.abc.gids.63.ttf |    Bin 0 -> 2452 bytes
+ .../expected/basics/Roboto-Regular.abc.gids.63.ttx |   1407 -
+ ...oboto-Regular.abc.gids.retain-all-codepoint.ttf |    Bin 0 -> 2452 bytes
+ ...oboto-Regular.abc.gids.retain-all-codepoint.ttx |   1407 -
+ .../Roboto-Regular.abc.glyph-names.61,62,63.ttf    |    Bin 0 -> 2452 bytes
+ .../Roboto-Regular.abc.glyph-names.61,62,63.ttx    |   1407 -
+ .../Roboto-Regular.abc.glyph-names.61,63.ttf       |    Bin 0 -> 2260 bytes
+ .../Roboto-Regular.abc.glyph-names.61,63.ttx       |   1259 -
+ .../basics/Roboto-Regular.abc.glyph-names.61.ttf   |    Bin 0 -> 2048 bytes
+ .../basics/Roboto-Regular.abc.glyph-names.61.ttx   |   1127 -
+ .../basics/Roboto-Regular.abc.glyph-names.62.ttf   |    Bin 0 -> 1916 bytes
+ .../basics/Roboto-Regular.abc.glyph-names.62.ttx   |   1025 -
+ .../basics/Roboto-Regular.abc.glyph-names.63.ttf   |    Bin 0 -> 1972 bytes
+ .../basics/Roboto-Regular.abc.glyph-names.63.ttx   |   1073 -
+ ...egular.abc.glyph-names.retain-all-codepoint.ttf |    Bin 0 -> 2452 bytes
+ ...egular.abc.glyph-names.retain-all-codepoint.ttx |   1407 -
+ ...gular.abc.keep-all-layout-features.61,62,63.ttf |    Bin 0 -> 2452 bytes
+ ...gular.abc.keep-all-layout-features.61,62,63.ttx |   1407 -
+ ...-Regular.abc.keep-all-layout-features.61,63.ttf |    Bin 0 -> 2260 bytes
+ ...-Regular.abc.keep-all-layout-features.61,63.ttx |   1259 -
+ ...oto-Regular.abc.keep-all-layout-features.61.ttf |    Bin 0 -> 2048 bytes
+ ...oto-Regular.abc.keep-all-layout-features.61.ttx |   1127 -
+ ...oto-Regular.abc.keep-all-layout-features.62.ttf |    Bin 0 -> 1916 bytes
+ ...oto-Regular.abc.keep-all-layout-features.62.ttx |   1025 -
+ ...oto-Regular.abc.keep-all-layout-features.63.ttf |    Bin 0 -> 1972 bytes
+ ...oto-Regular.abc.keep-all-layout-features.63.ttx |   1073 -
+ ...ep-all-layout-features.retain-all-codepoint.ttf |    Bin 0 -> 2452 bytes
+ ...ep-all-layout-features.retain-all-codepoint.ttx |   1407 -
+ ...Roboto-Regular.abc.layout-features.61,62,63.ttf |    Bin 0 -> 2452 bytes
+ ...Roboto-Regular.abc.layout-features.61,62,63.ttx |   1407 -
+ .../Roboto-Regular.abc.layout-features.61,63.ttf   |    Bin 0 -> 2260 bytes
+ .../Roboto-Regular.abc.layout-features.61,63.ttx   |   1259 -
+ .../Roboto-Regular.abc.layout-features.61.ttf      |    Bin 0 -> 2048 bytes
+ .../Roboto-Regular.abc.layout-features.61.ttx      |   1127 -
+ .../Roboto-Regular.abc.layout-features.62.ttf      |    Bin 0 -> 1916 bytes
+ .../Roboto-Regular.abc.layout-features.62.ttx      |   1025 -
+ .../Roboto-Regular.abc.layout-features.63.ttf      |    Bin 0 -> 1972 bytes
+ .../Roboto-Regular.abc.layout-features.63.ttx      |   1073 -
+ ...ar.abc.layout-features.retain-all-codepoint.ttf |    Bin 0 -> 2452 bytes
+ ...ar.abc.layout-features.retain-all-codepoint.ttx |   1407 -
+ .../Roboto-Regular.abc.name-ids.61,62,63.ttf       |    Bin 0 -> 2452 bytes
+ .../Roboto-Regular.abc.name-ids.61,62,63.ttx       |   1407 -
+ .../basics/Roboto-Regular.abc.name-ids.61,63.ttf   |    Bin 0 -> 2260 bytes
+ .../basics/Roboto-Regular.abc.name-ids.61,63.ttx   |   1259 -
+ .../basics/Roboto-Regular.abc.name-ids.61.ttf      |    Bin 0 -> 2048 bytes
+ .../basics/Roboto-Regular.abc.name-ids.61.ttx      |   1127 -
+ .../basics/Roboto-Regular.abc.name-ids.62.ttf      |    Bin 0 -> 1916 bytes
+ .../basics/Roboto-Regular.abc.name-ids.62.ttx      |   1025 -
+ .../basics/Roboto-Regular.abc.name-ids.63.ttf      |    Bin 0 -> 1972 bytes
+ .../basics/Roboto-Regular.abc.name-ids.63.ttx      |   1073 -
+ ...o-Regular.abc.name-ids.retain-all-codepoint.ttf |    Bin 0 -> 2452 bytes
+ ...o-Regular.abc.name-ids.retain-all-codepoint.ttx |   1407 -
+ .../Roboto-Regular.abc.name-languages.61,62,63.ttf |    Bin 0 -> 2452 bytes
+ .../Roboto-Regular.abc.name-languages.61,62,63.ttx |   1407 -
+ .../Roboto-Regular.abc.name-languages.61,63.ttf    |    Bin 0 -> 2260 bytes
+ .../Roboto-Regular.abc.name-languages.61,63.ttx    |   1259 -
+ .../Roboto-Regular.abc.name-languages.61.ttf       |    Bin 0 -> 2048 bytes
+ .../Roboto-Regular.abc.name-languages.61.ttx       |   1127 -
+ .../Roboto-Regular.abc.name-languages.62.ttf       |    Bin 0 -> 1916 bytes
+ .../Roboto-Regular.abc.name-languages.62.ttx       |   1025 -
+ .../Roboto-Regular.abc.name-languages.63.ttf       |    Bin 0 -> 1972 bytes
+ .../Roboto-Regular.abc.name-languages.63.ttx       |   1073 -
+ ...lar.abc.name-languages.retain-all-codepoint.ttf |    Bin 0 -> 2452 bytes
+ ...lar.abc.name-languages.retain-all-codepoint.ttx |   1407 -
+ .../Roboto-Regular.abc.name-legacy.61,62,63.ttf    |    Bin 0 -> 2452 bytes
+ .../Roboto-Regular.abc.name-legacy.61,62,63.ttx    |   1407 -
+ .../Roboto-Regular.abc.name-legacy.61,63.ttf       |    Bin 0 -> 2260 bytes
+ .../Roboto-Regular.abc.name-legacy.61,63.ttx       |   1259 -
+ .../basics/Roboto-Regular.abc.name-legacy.61.ttf   |    Bin 0 -> 2048 bytes
+ .../basics/Roboto-Regular.abc.name-legacy.61.ttx   |   1127 -
+ .../basics/Roboto-Regular.abc.name-legacy.62.ttf   |    Bin 0 -> 1916 bytes
+ .../basics/Roboto-Regular.abc.name-legacy.62.ttx   |   1025 -
+ .../basics/Roboto-Regular.abc.name-legacy.63.ttf   |    Bin 0 -> 1972 bytes
+ .../basics/Roboto-Regular.abc.name-legacy.63.ttx   |   1073 -
+ ...egular.abc.name-legacy.retain-all-codepoint.ttf |    Bin 0 -> 2452 bytes
+ ...egular.abc.name-legacy.retain-all-codepoint.ttx |   1407 -
+ ...egular.abc.no-prune-unicode-ranges.61,62,63.ttf |    Bin 0 -> 2452 bytes
+ ...egular.abc.no-prune-unicode-ranges.61,62,63.ttx |   1407 -
+ ...o-Regular.abc.no-prune-unicode-ranges.61,63.ttf |    Bin 0 -> 2260 bytes
+ ...o-Regular.abc.no-prune-unicode-ranges.61,63.ttx |   1259 -
+ ...boto-Regular.abc.no-prune-unicode-ranges.61.ttf |    Bin 0 -> 2048 bytes
+ ...boto-Regular.abc.no-prune-unicode-ranges.61.ttx |   1127 -
+ ...boto-Regular.abc.no-prune-unicode-ranges.62.ttf |    Bin 0 -> 1916 bytes
+ ...boto-Regular.abc.no-prune-unicode-ranges.62.ttx |   1025 -
+ ...boto-Regular.abc.no-prune-unicode-ranges.63.ttf |    Bin 0 -> 1972 bytes
+ ...boto-Regular.abc.no-prune-unicode-ranges.63.ttx |   1073 -
+ ...o-prune-unicode-ranges.retain-all-codepoint.ttf |    Bin 0 -> 2452 bytes
+ ...o-prune-unicode-ranges.retain-all-codepoint.ttx |   1407 -
+ .../Roboto-Regular.abc.notdef-outline.61,62,63.ttf |    Bin 0 -> 2452 bytes
+ .../Roboto-Regular.abc.notdef-outline.61,62,63.ttx |   1407 -
+ .../Roboto-Regular.abc.notdef-outline.61,63.ttf    |    Bin 0 -> 2260 bytes
+ .../Roboto-Regular.abc.notdef-outline.61,63.ttx    |   1259 -
+ .../Roboto-Regular.abc.notdef-outline.61.ttf       |    Bin 0 -> 2048 bytes
+ .../Roboto-Regular.abc.notdef-outline.61.ttx       |   1127 -
+ .../Roboto-Regular.abc.notdef-outline.62.ttf       |    Bin 0 -> 1916 bytes
+ .../Roboto-Regular.abc.notdef-outline.62.ttx       |   1025 -
+ .../Roboto-Regular.abc.notdef-outline.63.ttf       |    Bin 0 -> 1972 bytes
+ .../Roboto-Regular.abc.notdef-outline.63.ttx       |   1073 -
+ ...lar.abc.notdef-outline.retain-all-codepoint.ttf |    Bin 0 -> 2452 bytes
+ ...lar.abc.notdef-outline.retain-all-codepoint.ttx |   1407 -
+ .../Roboto-Regular.abc.retain-gids.61,62,63.ttf    |    Bin 0 -> 2452 bytes
+ .../Roboto-Regular.abc.retain-gids.61,62,63.ttx    |   1407 -
+ .../Roboto-Regular.abc.retain-gids.61,63.ttf       |    Bin 0 -> 2276 bytes
+ .../Roboto-Regular.abc.retain-gids.61,63.ttx       |   1264 -
+ .../basics/Roboto-Regular.abc.retain-gids.61.ttf   |    Bin 0 -> 2048 bytes
+ .../basics/Roboto-Regular.abc.retain-gids.61.ttx   |   1127 -
+ .../basics/Roboto-Regular.abc.retain-gids.62.ttf   |    Bin 0 -> 1924 bytes
+ .../basics/Roboto-Regular.abc.retain-gids.62.ttx   |   1030 -
+ .../basics/Roboto-Regular.abc.retain-gids.63.ttf   |    Bin 0 -> 1988 bytes
+ .../basics/Roboto-Regular.abc.retain-gids.63.ttx   |   1083 -
+ ...egular.abc.retain-gids.retain-all-codepoint.ttf |    Bin 0 -> 2452 bytes
+ ...egular.abc.retain-gids.retain-all-codepoint.ttx |   1407 -
+ .../cbdt/NotoColorEmoji.subset.default.2049.ttf    |    Bin 0 -> 3112 bytes
+ .../cbdt/NotoColorEmoji.subset.default.2049.ttx    |    397 -
+ .../cbdt/NotoColorEmoji.subset.default.38,2049.ttf |    Bin 0 -> 4084 bytes
+ .../cbdt/NotoColorEmoji.subset.default.38,2049.ttx |    474 -
+ .../cbdt/NotoColorEmoji.subset.default.38,20E3.ttf |    Bin 0 -> 3568 bytes
+ .../cbdt/NotoColorEmoji.subset.default.38,20E3.ttx |    441 -
+ ...rEmoji.subset.default.38,39,AE,2049,38,20E3.ttf |    Bin 0 -> 10124 bytes
+ ...rEmoji.subset.default.38,39,AE,2049,38,20E3.ttx |    898 -
+ .../NotoColorEmoji.subset.default.38,AE,2049.ttf   |    Bin 0 -> 7544 bytes
+ .../NotoColorEmoji.subset.default.38,AE,2049.ttx   |    705 -
+ .../cbdt/NotoColorEmoji.subset.default.39.ttf      |    Bin 0 -> 1920 bytes
+ .../cbdt/NotoColorEmoji.subset.default.39.ttx      |    323 -
+ .../cbdt/NotoColorEmoji.subset.default.AE.ttf      |    Bin 0 -> 4412 bytes
+ .../cbdt/NotoColorEmoji.subset.default.AE.ttx      |    478 -
+ ...lorEmoji.subset.drop-hints-retain-gids.2049.ttf |    Bin 0 -> 3136 bytes
+ ...lorEmoji.subset.drop-hints-retain-gids.2049.ttx |    406 -
+ ...Emoji.subset.drop-hints-retain-gids.38,2049.ttf |    Bin 0 -> 4108 bytes
+ ...Emoji.subset.drop-hints-retain-gids.38,2049.ttx |    480 -
+ ...Emoji.subset.drop-hints-retain-gids.38,20E3.ttf |    Bin 0 -> 3600 bytes
+ ...Emoji.subset.drop-hints-retain-gids.38,20E3.ttx |    450 -
+ ...rop-hints-retain-gids.38,39,AE,2049,38,20E3.ttf |    Bin 0 -> 10124 bytes
+ ...rop-hints-retain-gids.38,39,AE,2049,38,20E3.ttx |    898 -
+ ...ji.subset.drop-hints-retain-gids.38,AE,2049.ttf |    Bin 0 -> 7564 bytes
+ ...ji.subset.drop-hints-retain-gids.38,AE,2049.ttx |    708 -
+ ...ColorEmoji.subset.drop-hints-retain-gids.39.ttf |    Bin 0 -> 1928 bytes
+ ...ColorEmoji.subset.drop-hints-retain-gids.39.ttx |    326 -
+ ...ColorEmoji.subset.drop-hints-retain-gids.AE.ttf |    Bin 0 -> 4428 bytes
+ ...ColorEmoji.subset.drop-hints-retain-gids.AE.ttx |    484 -
+ .../cbdt/NotoColorEmoji.subset.drop-hints.2049.ttf |    Bin 0 -> 3112 bytes
+ .../cbdt/NotoColorEmoji.subset.drop-hints.2049.ttx |    397 -
+ .../NotoColorEmoji.subset.drop-hints.38,2049.ttf   |    Bin 0 -> 4084 bytes
+ .../NotoColorEmoji.subset.drop-hints.38,2049.ttx   |    474 -
+ .../NotoColorEmoji.subset.drop-hints.38,20E3.ttf   |    Bin 0 -> 3568 bytes
+ .../NotoColorEmoji.subset.drop-hints.38,20E3.ttx   |    441 -
+ ...oji.subset.drop-hints.38,39,AE,2049,38,20E3.ttf |    Bin 0 -> 10124 bytes
+ ...oji.subset.drop-hints.38,39,AE,2049,38,20E3.ttx |    898 -
+ ...NotoColorEmoji.subset.drop-hints.38,AE,2049.ttf |    Bin 0 -> 7544 bytes
+ ...NotoColorEmoji.subset.drop-hints.38,AE,2049.ttx |    705 -
+ .../cbdt/NotoColorEmoji.subset.drop-hints.39.ttf   |    Bin 0 -> 1920 bytes
+ .../cbdt/NotoColorEmoji.subset.drop-hints.39.ttx   |    323 -
+ .../cbdt/NotoColorEmoji.subset.drop-hints.AE.ttf   |    Bin 0 -> 4412 bytes
+ .../cbdt/NotoColorEmoji.subset.drop-hints.AE.ttx   |    478 -
+ .../NotoColorEmoji.subset.gap.default.2049.ttf     |    Bin 0 -> 3112 bytes
+ .../NotoColorEmoji.subset.gap.default.2049.ttx     |    397 -
+ .../NotoColorEmoji.subset.gap.default.38,2049.ttf  |    Bin 0 -> 4084 bytes
+ .../NotoColorEmoji.subset.gap.default.38,2049.ttx  |    474 -
+ .../NotoColorEmoji.subset.gap.default.38,20E3.ttf  |    Bin 0 -> 3568 bytes
+ .../NotoColorEmoji.subset.gap.default.38,20E3.ttx  |    441 -
+ ...ji.subset.gap.default.38,39,AE,2049,38,20E3.ttf |    Bin 0 -> 9188 bytes
+ ...ji.subset.gap.default.38,39,AE,2049,38,20E3.ttx |    827 -
+ ...otoColorEmoji.subset.gap.default.38,AE,2049.ttf |    Bin 0 -> 7544 bytes
+ ...otoColorEmoji.subset.gap.default.38,AE,2049.ttx |    705 -
+ .../cbdt/NotoColorEmoji.subset.gap.default.39.ttf  |    Bin 0 -> 908 bytes
+ .../cbdt/NotoColorEmoji.subset.gap.default.39.ttx  |    207 -
+ .../cbdt/NotoColorEmoji.subset.gap.default.AE.ttf  |    Bin 0 -> 4412 bytes
+ .../cbdt/NotoColorEmoji.subset.gap.default.AE.ttx  |    478 -
+ ...moji.subset.gap.drop-hints-retain-gids.2049.ttf |    Bin 0 -> 3136 bytes
+ ...moji.subset.gap.drop-hints-retain-gids.2049.ttx |    406 -
+ ...i.subset.gap.drop-hints-retain-gids.38,2049.ttf |    Bin 0 -> 4108 bytes
+ ...i.subset.gap.drop-hints-retain-gids.38,2049.ttx |    480 -
+ ...i.subset.gap.drop-hints-retain-gids.38,20E3.ttf |    Bin 0 -> 3600 bytes
+ ...i.subset.gap.drop-hints-retain-gids.38,20E3.ttx |    450 -
+ ...rop-hints-retain-gids.38,39,AE,2049,38,20E3.ttf |    Bin 0 -> 9188 bytes
+ ...rop-hints-retain-gids.38,39,AE,2049,38,20E3.ttx |    827 -
+ ...ubset.gap.drop-hints-retain-gids.38,AE,2049.ttf |    Bin 0 -> 7564 bytes
+ ...ubset.gap.drop-hints-retain-gids.38,AE,2049.ttx |    708 -
+ ...rEmoji.subset.gap.drop-hints-retain-gids.39.ttf |    Bin 0 -> 916 bytes
+ ...rEmoji.subset.gap.drop-hints-retain-gids.39.ttx |    210 -
+ ...rEmoji.subset.gap.drop-hints-retain-gids.AE.ttf |    Bin 0 -> 4428 bytes
+ ...rEmoji.subset.gap.drop-hints-retain-gids.AE.ttx |    484 -
+ .../NotoColorEmoji.subset.gap.drop-hints.2049.ttf  |    Bin 0 -> 3112 bytes
+ .../NotoColorEmoji.subset.gap.drop-hints.2049.ttx  |    397 -
+ ...otoColorEmoji.subset.gap.drop-hints.38,2049.ttf |    Bin 0 -> 4084 bytes
+ ...otoColorEmoji.subset.gap.drop-hints.38,2049.ttx |    474 -
+ ...otoColorEmoji.subset.gap.drop-hints.38,20E3.ttf |    Bin 0 -> 3568 bytes
+ ...otoColorEmoji.subset.gap.drop-hints.38,20E3.ttx |    441 -
+ ...subset.gap.drop-hints.38,39,AE,2049,38,20E3.ttf |    Bin 0 -> 9188 bytes
+ ...subset.gap.drop-hints.38,39,AE,2049,38,20E3.ttx |    827 -
+ ...ColorEmoji.subset.gap.drop-hints.38,AE,2049.ttf |    Bin 0 -> 7544 bytes
+ ...ColorEmoji.subset.gap.drop-hints.38,AE,2049.ttx |    705 -
+ .../NotoColorEmoji.subset.gap.drop-hints.39.ttf    |    Bin 0 -> 908 bytes
+ .../NotoColorEmoji.subset.gap.drop-hints.39.ttx    |    207 -
+ .../NotoColorEmoji.subset.gap.drop-hints.AE.ttf    |    Bin 0 -> 4412 bytes
+ .../NotoColorEmoji.subset.gap.drop-hints.AE.ttx    |    478 -
+ .../NotoColorEmoji.subset.gap.retain-gids.2049.ttf |    Bin 0 -> 3136 bytes
+ .../NotoColorEmoji.subset.gap.retain-gids.2049.ttx |    406 -
+ ...toColorEmoji.subset.gap.retain-gids.38,2049.ttf |    Bin 0 -> 4108 bytes
+ ...toColorEmoji.subset.gap.retain-gids.38,2049.ttx |    480 -
+ ...toColorEmoji.subset.gap.retain-gids.38,20E3.ttf |    Bin 0 -> 3600 bytes
+ ...toColorEmoji.subset.gap.retain-gids.38,20E3.ttx |    450 -
+ ...ubset.gap.retain-gids.38,39,AE,2049,38,20E3.ttf |    Bin 0 -> 9188 bytes
+ ...ubset.gap.retain-gids.38,39,AE,2049,38,20E3.ttx |    827 -
+ ...olorEmoji.subset.gap.retain-gids.38,AE,2049.ttf |    Bin 0 -> 7564 bytes
+ ...olorEmoji.subset.gap.retain-gids.38,AE,2049.ttx |    708 -
+ .../NotoColorEmoji.subset.gap.retain-gids.39.ttf   |    Bin 0 -> 916 bytes
+ .../NotoColorEmoji.subset.gap.retain-gids.39.ttx   |    210 -
+ .../NotoColorEmoji.subset.gap.retain-gids.AE.ttf   |    Bin 0 -> 4428 bytes
+ .../NotoColorEmoji.subset.gap.retain-gids.AE.ttx   |    484 -
+ ...olorEmoji.subset.index_format3.default.2049.ttf |    Bin 0 -> 3108 bytes
+ ...olorEmoji.subset.index_format3.default.2049.ttx |    397 -
+ ...rEmoji.subset.index_format3.default.38,2049.ttf |    Bin 0 -> 4076 bytes
+ ...rEmoji.subset.index_format3.default.38,2049.ttx |    474 -
+ ...rEmoji.subset.index_format3.default.38,20E3.ttf |    Bin 0 -> 3560 bytes
+ ...rEmoji.subset.index_format3.default.38,20E3.ttx |    441 -
+ ...index_format3.default.38,39,AE,2049,38,20E3.ttf |    Bin 0 -> 10112 bytes
+ ...index_format3.default.38,39,AE,2049,38,20E3.ttx |    898 -
+ ...oji.subset.index_format3.default.38,AE,2049.ttf |    Bin 0 -> 7536 bytes
+ ...oji.subset.index_format3.default.38,AE,2049.ttx |    705 -
+ ...oColorEmoji.subset.index_format3.default.39.ttf |    Bin 0 -> 1916 bytes
+ ...oColorEmoji.subset.index_format3.default.39.ttx |    323 -
+ ...oColorEmoji.subset.index_format3.default.AE.ttf |    Bin 0 -> 4408 bytes
+ ...oColorEmoji.subset.index_format3.default.AE.ttx |    478 -
+ ...t.index_format3.drop-hints-retain-gids.2049.ttf |    Bin 0 -> 3132 bytes
+ ...t.index_format3.drop-hints-retain-gids.2049.ttx |    406 -
+ ...ndex_format3.drop-hints-retain-gids.38,2049.ttf |    Bin 0 -> 4100 bytes
+ ...ndex_format3.drop-hints-retain-gids.38,2049.ttx |    480 -
+ ...ndex_format3.drop-hints-retain-gids.38,20E3.ttf |    Bin 0 -> 3592 bytes
+ ...ndex_format3.drop-hints-retain-gids.38,20E3.ttx |    450 -
+ ...rop-hints-retain-gids.38,39,AE,2049,38,20E3.ttf |    Bin 0 -> 10112 bytes
+ ...rop-hints-retain-gids.38,39,AE,2049,38,20E3.ttx |    898 -
+ ...x_format3.drop-hints-retain-gids.38,AE,2049.ttf |    Bin 0 -> 7552 bytes
+ ...x_format3.drop-hints-retain-gids.38,AE,2049.ttx |    708 -
+ ...set.index_format3.drop-hints-retain-gids.39.ttf |    Bin 0 -> 1924 bytes
+ ...set.index_format3.drop-hints-retain-gids.39.ttx |    326 -
+ ...set.index_format3.drop-hints-retain-gids.AE.ttf |    Bin 0 -> 4424 bytes
+ ...set.index_format3.drop-hints-retain-gids.AE.ttx |    484 -
+ ...rEmoji.subset.index_format3.drop-hints.2049.ttf |    Bin 0 -> 3108 bytes
+ ...rEmoji.subset.index_format3.drop-hints.2049.ttx |    397 -
+ ...oji.subset.index_format3.drop-hints.38,2049.ttf |    Bin 0 -> 4076 bytes
+ ...oji.subset.index_format3.drop-hints.38,2049.ttx |    474 -
+ ...oji.subset.index_format3.drop-hints.38,20E3.ttf |    Bin 0 -> 3560 bytes
+ ...oji.subset.index_format3.drop-hints.38,20E3.ttx |    441 -
+ ...ex_format3.drop-hints.38,39,AE,2049,38,20E3.ttf |    Bin 0 -> 10112 bytes
+ ...ex_format3.drop-hints.38,39,AE,2049,38,20E3.ttx |    898 -
+ ....subset.index_format3.drop-hints.38,AE,2049.ttf |    Bin 0 -> 7536 bytes
+ ....subset.index_format3.drop-hints.38,AE,2049.ttx |    705 -
+ ...lorEmoji.subset.index_format3.drop-hints.39.ttf |    Bin 0 -> 1916 bytes
+ ...lorEmoji.subset.index_format3.drop-hints.39.ttx |    323 -
+ ...lorEmoji.subset.index_format3.drop-hints.AE.ttf |    Bin 0 -> 4408 bytes
+ ...lorEmoji.subset.index_format3.drop-hints.AE.ttx |    478 -
+ ...Emoji.subset.index_format3.retain-gids.2049.ttf |    Bin 0 -> 3132 bytes
+ ...Emoji.subset.index_format3.retain-gids.2049.ttx |    406 -
+ ...ji.subset.index_format3.retain-gids.38,2049.ttf |    Bin 0 -> 4100 bytes
+ ...ji.subset.index_format3.retain-gids.38,2049.ttx |    480 -
+ ...ji.subset.index_format3.retain-gids.38,20E3.ttf |    Bin 0 -> 3592 bytes
+ ...ji.subset.index_format3.retain-gids.38,20E3.ttx |    450 -
+ ...x_format3.retain-gids.38,39,AE,2049,38,20E3.ttf |    Bin 0 -> 10112 bytes
+ ...x_format3.retain-gids.38,39,AE,2049,38,20E3.ttx |    898 -
+ ...subset.index_format3.retain-gids.38,AE,2049.ttf |    Bin 0 -> 7552 bytes
+ ...subset.index_format3.retain-gids.38,AE,2049.ttx |    708 -
+ ...orEmoji.subset.index_format3.retain-gids.39.ttf |    Bin 0 -> 1924 bytes
+ ...orEmoji.subset.index_format3.retain-gids.39.ttx |    326 -
+ ...orEmoji.subset.index_format3.retain-gids.AE.ttf |    Bin 0 -> 4424 bytes
+ ...orEmoji.subset.index_format3.retain-gids.AE.ttx |    484 -
+ ...ji.subset.multiple_size_tables.default.2049.ttf |    Bin 0 -> 5312 bytes
+ ...ji.subset.multiple_size_tables.default.2049.ttx |    587 -
+ ...subset.multiple_size_tables.default.38,2049.ttf |    Bin 0 -> 7244 bytes
+ ...subset.multiple_size_tables.default.38,2049.ttx |    736 -
+ ...subset.multiple_size_tables.default.38,20E3.ttf |    Bin 0 -> 6212 bytes
+ ...subset.multiple_size_tables.default.38,20E3.ttx |    671 -
+ ...e_size_tables.default.38,39,AE,2049,38,20E3.ttf |    Bin 0 -> 19280 bytes
+ ...e_size_tables.default.38,39,AE,2049,38,20E3.ttx |   1570 -
+ ...set.multiple_size_tables.default.38,AE,2049.ttf |    Bin 0 -> 14140 bytes
+ ...set.multiple_size_tables.default.38,AE,2049.ttx |   1193 -
+ ...moji.subset.multiple_size_tables.default.39.ttf |    Bin 0 -> 2928 bytes
+ ...moji.subset.multiple_size_tables.default.39.ttx |    439 -
+ ...moji.subset.multiple_size_tables.default.AE.ttf |    Bin 0 -> 7916 bytes
+ ...moji.subset.multiple_size_tables.default.AE.ttx |    749 -
+ ...ple_size_tables.drop-hints-retain-gids.2049.ttf |    Bin 0 -> 5336 bytes
+ ...ple_size_tables.drop-hints-retain-gids.2049.ttx |    596 -
+ ..._size_tables.drop-hints-retain-gids.38,2049.ttf |    Bin 0 -> 7268 bytes
+ ..._size_tables.drop-hints-retain-gids.38,2049.ttx |    742 -
+ ..._size_tables.drop-hints-retain-gids.38,20E3.ttf |    Bin 0 -> 6244 bytes
+ ..._size_tables.drop-hints-retain-gids.38,20E3.ttx |    680 -
+ ...rop-hints-retain-gids.38,39,AE,2049,38,20E3.ttf |    Bin 0 -> 19280 bytes
+ ...rop-hints-retain-gids.38,39,AE,2049,38,20E3.ttx |   1570 -
+ ...ze_tables.drop-hints-retain-gids.38,AE,2049.ttf |    Bin 0 -> 14164 bytes
+ ...ze_tables.drop-hints-retain-gids.38,AE,2049.ttx |   1196 -
+ ...tiple_size_tables.drop-hints-retain-gids.39.ttf |    Bin 0 -> 2936 bytes
+ ...tiple_size_tables.drop-hints-retain-gids.39.ttx |    442 -
+ ...tiple_size_tables.drop-hints-retain-gids.AE.ttf |    Bin 0 -> 7932 bytes
+ ...tiple_size_tables.drop-hints-retain-gids.AE.ttx |    755 -
+ ...subset.multiple_size_tables.drop-hints.2049.ttf |    Bin 0 -> 5312 bytes
+ ...subset.multiple_size_tables.drop-hints.2049.ttx |    587 -
+ ...set.multiple_size_tables.drop-hints.38,2049.ttf |    Bin 0 -> 7244 bytes
+ ...set.multiple_size_tables.drop-hints.38,2049.ttx |    736 -
+ ...set.multiple_size_tables.drop-hints.38,20E3.ttf |    Bin 0 -> 6212 bytes
+ ...set.multiple_size_tables.drop-hints.38,20E3.ttx |    671 -
+ ...ize_tables.drop-hints.38,39,AE,2049,38,20E3.ttf |    Bin 0 -> 19280 bytes
+ ...ize_tables.drop-hints.38,39,AE,2049,38,20E3.ttx |   1570 -
+ ....multiple_size_tables.drop-hints.38,AE,2049.ttf |    Bin 0 -> 14140 bytes
+ ....multiple_size_tables.drop-hints.38,AE,2049.ttx |   1193 -
+ ...i.subset.multiple_size_tables.drop-hints.39.ttf |    Bin 0 -> 2928 bytes
+ ...i.subset.multiple_size_tables.drop-hints.39.ttx |    439 -
+ ...i.subset.multiple_size_tables.drop-hints.AE.ttf |    Bin 0 -> 7916 bytes
+ ...i.subset.multiple_size_tables.drop-hints.AE.ttx |    749 -
+ ...ubset.multiple_size_tables.retain-gids.2049.ttf |    Bin 0 -> 5336 bytes
+ ...ubset.multiple_size_tables.retain-gids.2049.ttx |    596 -
+ ...et.multiple_size_tables.retain-gids.38,2049.ttf |    Bin 0 -> 7268 bytes
+ ...et.multiple_size_tables.retain-gids.38,2049.ttx |    742 -
+ ...et.multiple_size_tables.retain-gids.38,20E3.ttf |    Bin 0 -> 6244 bytes
+ ...et.multiple_size_tables.retain-gids.38,20E3.ttx |    680 -
+ ...ze_tables.retain-gids.38,39,AE,2049,38,20E3.ttf |    Bin 0 -> 19280 bytes
+ ...ze_tables.retain-gids.38,39,AE,2049,38,20E3.ttx |   1570 -
+ ...multiple_size_tables.retain-gids.38,AE,2049.ttf |    Bin 0 -> 14164 bytes
+ ...multiple_size_tables.retain-gids.38,AE,2049.ttx |   1196 -
+ ....subset.multiple_size_tables.retain-gids.39.ttf |    Bin 0 -> 2936 bytes
+ ....subset.multiple_size_tables.retain-gids.39.ttx |    442 -
+ ....subset.multiple_size_tables.retain-gids.AE.ttf |    Bin 0 -> 7932 bytes
+ ....subset.multiple_size_tables.retain-gids.AE.ttx |    755 -
+ .../NotoColorEmoji.subset.retain-gids.2049.ttf     |    Bin 0 -> 3136 bytes
+ .../NotoColorEmoji.subset.retain-gids.2049.ttx     |    406 -
+ .../NotoColorEmoji.subset.retain-gids.38,2049.ttf  |    Bin 0 -> 4108 bytes
+ .../NotoColorEmoji.subset.retain-gids.38,2049.ttx  |    480 -
+ .../NotoColorEmoji.subset.retain-gids.38,20E3.ttf  |    Bin 0 -> 3600 bytes
+ .../NotoColorEmoji.subset.retain-gids.38,20E3.ttx  |    450 -
+ ...ji.subset.retain-gids.38,39,AE,2049,38,20E3.ttf |    Bin 0 -> 10124 bytes
+ ...ji.subset.retain-gids.38,39,AE,2049,38,20E3.ttx |    898 -
+ ...otoColorEmoji.subset.retain-gids.38,AE,2049.ttf |    Bin 0 -> 7564 bytes
+ ...otoColorEmoji.subset.retain-gids.38,AE,2049.ttx |    708 -
+ .../cbdt/NotoColorEmoji.subset.retain-gids.39.ttf  |    Bin 0 -> 1928 bytes
+ .../cbdt/NotoColorEmoji.subset.retain-gids.39.ttx  |    326 -
+ .../cbdt/NotoColorEmoji.subset.retain-gids.AE.ttf  |    Bin 0 -> 4428 bytes
+ .../cbdt/NotoColorEmoji.subset.retain-gids.AE.ttx  |    484 -
+ ...eSansPro-Regular.default.1FC,21,41,20,62,63.otf |    Bin 0 -> 2580 bytes
+ ...eSansPro-Regular.default.1FC,21,41,20,62,63.ttx |    738 -
+ .../SourceSansPro-Regular.default.61,62,63.otf     |    Bin 0 -> 2216 bytes
+ .../SourceSansPro-Regular.default.61,62,63.ttx     |    587 -
+ ...ourceSansPro-Regular.default.D7,D8,D9,DA,DE.otf |    Bin 0 -> 2328 bytes
+ ...ourceSansPro-Regular.default.D7,D8,D9,DA,DE.ttx |    578 -
+ ...subroutinize-retain-gids.1FC,21,41,20,62,63.otf |    Bin 0 -> 20232 bytes
+ ...subroutinize-retain-gids.1FC,21,41,20,62,63.ttx |   6312 -
+ ...Regular.desubroutinize-retain-gids.61,62,63.otf |    Bin 0 -> 2316 bytes
+ ...Regular.desubroutinize-retain-gids.61,62,63.ttx |    627 -
+ ...r.desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf |    Bin 0 -> 30540 bytes
+ ...r.desubroutinize-retain-gids.D7,D8,D9,DA,DE.ttx |   9248 --
+ ...o-Regular.desubroutinize.1FC,21,41,20,62,63.otf |    Bin 0 -> 2436 bytes
+ ...o-Regular.desubroutinize.1FC,21,41,20,62,63.ttx |    612 -
+ ...urceSansPro-Regular.desubroutinize.61,62,63.otf |    Bin 0 -> 2120 bytes
+ ...urceSansPro-Regular.desubroutinize.61,62,63.ttx |    492 -
+ ...nsPro-Regular.desubroutinize.D7,D8,D9,DA,DE.otf |    Bin 0 -> 2312 bytes
+ ...nsPro-Regular.desubroutinize.D7,D8,D9,DA,DE.ttx |    523 -
+ ...subroutinize-retain-gids.1FC,21,41,20,62,63.otf |    Bin 0 -> 20064 bytes
+ ...subroutinize-retain-gids.1FC,21,41,20,62,63.ttx |   6281 -
+ ...p-hints-desubroutinize-retain-gids.61,62,63.otf |    Bin 0 -> 2192 bytes
+ ...p-hints-desubroutinize-retain-gids.61,62,63.ttx |    607 -
+ ...s-desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf |    Bin 0 -> 30372 bytes
+ ...s-desubroutinize-retain-gids.D7,D8,D9,DA,DE.ttx |   9215 --
+ ...rop-hints-desubroutinize.1FC,21,41,20,62,63.otf |    Bin 0 -> 2268 bytes
+ ...rop-hints-desubroutinize.1FC,21,41,20,62,63.ttx |    581 -
+ ...-Regular.drop-hints-desubroutinize.61,62,63.otf |    Bin 0 -> 1996 bytes
+ ...-Regular.drop-hints-desubroutinize.61,62,63.ttx |    472 -
+ ...ar.drop-hints-desubroutinize.D7,D8,D9,DA,DE.otf |    Bin 0 -> 2148 bytes
+ ...ar.drop-hints-desubroutinize.D7,D8,D9,DA,DE.ttx |    490 -
+ ...r.drop-hints-retain-gids.1FC,21,41,20,62,63.otf |    Bin 0 -> 20156 bytes
+ ...r.drop-hints-retain-gids.1FC,21,41,20,62,63.ttx |   6367 -
+ ...Pro-Regular.drop-hints-retain-gids.61,62,63.otf |    Bin 0 -> 2228 bytes
+ ...Pro-Regular.drop-hints-retain-gids.61,62,63.ttx |    670 -
+ ...gular.drop-hints-retain-gids.D7,D8,D9,DA,DE.otf |    Bin 0 -> 30384 bytes
+ ...gular.drop-hints-retain-gids.D7,D8,D9,DA,DE.ttx |   9259 --
+ ...nsPro-Regular.drop-hints.1FC,21,41,20,62,63.otf |    Bin 0 -> 2352 bytes
+ ...nsPro-Regular.drop-hints.1FC,21,41,20,62,63.ttx |    667 -
+ .../SourceSansPro-Regular.drop-hints.61,62,63.otf  |    Bin 0 -> 2060 bytes
+ .../SourceSansPro-Regular.drop-hints.61,62,63.ttx  |    535 -
+ ...ceSansPro-Regular.drop-hints.D7,D8,D9,DA,DE.otf |    Bin 0 -> 2164 bytes
+ ...ceSansPro-Regular.drop-hints.D7,D8,D9,DA,DE.ttx |    534 -
+ ...sPro-Regular.retain-gids.1FC,21,41,20,62,63.otf |    Bin 0 -> 20384 bytes
+ ...sPro-Regular.retain-gids.1FC,21,41,20,62,63.ttx |   6438 -
+ .../SourceSansPro-Regular.retain-gids.61,62,63.otf |    Bin 0 -> 2384 bytes
+ .../SourceSansPro-Regular.retain-gids.61,62,63.ttx |    722 -
+ ...eSansPro-Regular.retain-gids.D7,D8,D9,DA,DE.otf |    Bin 0 -> 30556 bytes
+ ...eSansPro-Regular.retain-gids.D7,D8,D9,DA,DE.ttx |   9303 --
+ ...ubset.default.3042,3044,3046,3048,304A,304B.otf |    Bin 0 -> 4884 bytes
+ ...ubset.default.3042,3044,3046,3048,304A,304B.ttx |   1165 -
+ ...ubset.default.3042,3044,3046,73E0,5EA6,8F38.otf |    Bin 0 -> 6276 bytes
+ ...ubset.default.3042,3044,3046,73E0,5EA6,8F38.ttx |   1708 -
+ ...eHanSans-Regular_subset.default.61,63,65,6B.otf |    Bin 0 -> 2588 bytes
+ ...eHanSans-Regular_subset.default.61,63,65,6B.ttx |    688 -
+ ...ubset.default.660E,6975,73E0,5EA6,8F38,6E05.otf |    Bin 0 -> 6736 bytes
+ ...ubset.default.660E,6975,73E0,5EA6,8F38,6E05.ttx |   1585 -
+ .../SourceHanSans-Regular_subset.default.660E.otf  |    Bin 0 -> 2456 bytes
+ .../SourceHanSans-Regular_subset.default.660E.ttx  |    577 -
+ ...e-retain-gids.3042,3044,3046,3048,304A,304B.otf |    Bin 0 -> 129876 bytes
+ ...e-retain-gids.3042,3044,3046,3048,304A,304B.ttx |  62430 --------
+ ...e-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf |    Bin 0 -> 130920 bytes
+ ...e-retain-gids.3042,3044,3046,73E0,5EA6,8F38.ttx |  62745 --------
+ ...bset.desubroutinize-retain-gids.61,63,65,6B.otf |    Bin 0 -> 3412 bytes
+ ...bset.desubroutinize-retain-gids.61,63,65,6B.ttx |   1081 -
+ ...e-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf |    Bin 0 -> 122048 bytes
+ ...e-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.ttx |  57783 --------
+ ...ular_subset.desubroutinize-retain-gids.660E.otf |    Bin 0 -> 50760 bytes
+ ...ular_subset.desubroutinize-retain-gids.660E.ttx |  24455 ----
+ ...esubroutinize.3042,3044,3046,3048,304A,304B.otf |    Bin 0 -> 4724 bytes
+ ...esubroutinize.3042,3044,3046,3048,304A,304B.ttx |   1044 -
+ ...esubroutinize.3042,3044,3046,73E0,5EA6,8F38.otf |    Bin 0 -> 5928 bytes
+ ...esubroutinize.3042,3044,3046,73E0,5EA6,8F38.ttx |   1414 -
+ ...s-Regular_subset.desubroutinize.61,63,65,6B.otf |    Bin 0 -> 2520 bytes
+ ...s-Regular_subset.desubroutinize.61,63,65,6B.ttx |    630 -
+ ...esubroutinize.660E,6975,73E0,5EA6,8F38,6E05.otf |    Bin 0 -> 6232 bytes
+ ...esubroutinize.660E,6975,73E0,5EA6,8F38,6E05.ttx |   1152 -
+ ...eHanSans-Regular_subset.desubroutinize.660E.otf |    Bin 0 -> 2440 bytes
+ ...eHanSans-Regular_subset.desubroutinize.660E.ttx |    560 -
+ ...e-retain-gids.3042,3044,3046,3048,304A,304B.otf |    Bin 0 -> 129448 bytes
+ ...e-retain-gids.3042,3044,3046,3048,304A,304B.ttx |  62346 --------
+ ...e-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf |    Bin 0 -> 130312 bytes
+ ...e-retain-gids.3042,3044,3046,73E0,5EA6,8F38.ttx |  62647 --------
+ ...ints-desubroutinize-retain-gids.61,63,65,6B.otf |    Bin 0 -> 3288 bytes
+ ...ints-desubroutinize-retain-gids.61,63,65,6B.ttx |   1055 -
+ ...e-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf |    Bin 0 -> 121284 bytes
+ ...e-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.ttx |  57675 --------
+ ....drop-hints-desubroutinize-retain-gids.660E.otf |    Bin 0 -> 50540 bytes
+ ....drop-hints-desubroutinize-retain-gids.660E.ttx |  24416 ----
+ ...esubroutinize.3042,3044,3046,3048,304A,304B.otf |    Bin 0 -> 4420 bytes
+ ...esubroutinize.3042,3044,3046,3048,304A,304B.ttx |    986 -
+ ...esubroutinize.3042,3044,3046,73E0,5EA6,8F38.otf |    Bin 0 -> 5416 bytes
+ ...esubroutinize.3042,3044,3046,73E0,5EA6,8F38.ttx |   1337 -
+ ...ubset.drop-hints-desubroutinize.61,63,65,6B.otf |    Bin 0 -> 2416 bytes
+ ...ubset.drop-hints-desubroutinize.61,63,65,6B.ttx |    609 -
+ ...esubroutinize.660E,6975,73E0,5EA6,8F38,6E05.otf |    Bin 0 -> 5556 bytes
+ ...esubroutinize.660E,6975,73E0,5EA6,8F38,6E05.ttx |   1063 -
+ ...gular_subset.drop-hints-desubroutinize.660E.otf |    Bin 0 -> 2308 bytes
+ ...gular_subset.drop-hints-desubroutinize.660E.ttx |    540 -
+ ...s-retain-gids.3042,3044,3046,3048,304A,304B.otf |    Bin 0 -> 129576 bytes
+ ...s-retain-gids.3042,3044,3046,3048,304A,304B.ttx |  62443 --------
+ ...s-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf |    Bin 0 -> 130604 bytes
+ ...s-retain-gids.3042,3044,3046,73E0,5EA6,8F38.ttx |  62929 ---------
+ ...r_subset.drop-hints-retain-gids.61,63,65,6B.otf |    Bin 0 -> 3248 bytes
+ ...r_subset.drop-hints-retain-gids.61,63,65,6B.ttx |   1089 -
+ ...s-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf |    Bin 0 -> 121776 bytes
+ ...s-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.ttx |  58100 --------
+ ...-Regular_subset.drop-hints-retain-gids.660E.otf |    Bin 0 -> 50552 bytes
+ ...-Regular_subset.drop-hints-retain-gids.660E.ttx |  24429 ----
+ ...et.drop-hints.3042,3044,3046,3048,304A,304B.otf |    Bin 0 -> 4548 bytes
+ ...et.drop-hints.3042,3044,3046,3048,304A,304B.ttx |   1083 -
+ ...et.drop-hints.3042,3044,3046,73E0,5EA6,8F38.otf |    Bin 0 -> 5708 bytes
+ ...et.drop-hints.3042,3044,3046,73E0,5EA6,8F38.ttx |   1619 -
+ ...nSans-Regular_subset.drop-hints.61,63,65,6B.otf |    Bin 0 -> 2448 bytes
+ ...nSans-Regular_subset.drop-hints.61,63,65,6B.ttx |    643 -
+ ...et.drop-hints.660E,6975,73E0,5EA6,8F38,6E05.otf |    Bin 0 -> 6048 bytes
+ ...et.drop-hints.660E,6975,73E0,5EA6,8F38,6E05.ttx |   1488 -
+ ...ourceHanSans-Regular_subset.drop-hints.660E.otf |    Bin 0 -> 2316 bytes
+ ...ourceHanSans-Regular_subset.drop-hints.660E.ttx |    553 -
+ ...t.retain-gids.3042,3044,3046,3048,304A,304B.otf |    Bin 0 -> 130036 bytes
+ ...t.retain-gids.3042,3044,3046,3048,304A,304B.ttx |  62551 --------
+ ...t.retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf |    Bin 0 -> 131272 bytes
+ ...t.retain-gids.3042,3044,3046,73E0,5EA6,8F38.ttx |  63039 ---------
+ ...Sans-Regular_subset.retain-gids.61,63,65,6B.otf |    Bin 0 -> 3408 bytes
+ ...Sans-Regular_subset.retain-gids.61,63,65,6B.ttx |   1139 -
+ ...t.retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf |    Bin 0 -> 122552 bytes
+ ...t.retain-gids.660E,6975,73E0,5EA6,8F38,6E05.ttx |  58216 --------
+ ...urceHanSans-Regular_subset.retain-gids.660E.otf |    Bin 0 -> 50776 bytes
+ ...urceHanSans-Regular_subset.retain-gids.660E.ttx |  24472 ----
+ ...039,1005,100A,103A,1038,1010,103D,1031,104A.otf |    Bin 0 -> 7724 bytes
+ ...039,1005,100A,103A,1038,1010,103D,1031,104A.ttx |   2971 -
+ ...otoSerifMyanmar-Regular.notdef-outline.1092.otf |    Bin 0 -> 1380 bytes
+ ...otoSerifMyanmar-Regular.notdef-outline.1092.ttx |    264 -
+ .../cmap/AdobeBlank-Regular.default.61,62.ttf      |    Bin 0 -> 1252 bytes
+ .../cmap/AdobeBlank-Regular.default.61,62.ttx      |    322 -
+ .../cmap/AdobeBlank-Regular.default.61,FEFA.ttf    |    Bin 0 -> 1264 bytes
+ .../cmap/AdobeBlank-Regular.default.61,FEFA.ttx    |    320 -
+ .../cmap/AdobeBlank-Regular.default.FEE6,FECF.ttf  |    Bin 0 -> 1216 bytes
+ .../cmap/AdobeBlank-Regular.default.FEE6,FECF.ttx  |    314 -
+ .../cmap/AdobeBlank-Regular.default.FEF9,FEFA.ttf  |    Bin 0 -> 1204 bytes
+ .../cmap/AdobeBlank-Regular.default.FEF9,FEFA.ttx  |    314 -
+ .../cmap/AdobeBlank-Regular.default.FEFA.ttf       |    Bin 0 -> 1184 bytes
+ .../cmap/AdobeBlank-Regular.default.FEFA.ttx       |    303 -
+ ...eBlank-Regular.drop-hints-retain-gids.61,62.ttf |    Bin 0 -> 1468 bytes
+ ...eBlank-Regular.drop-hints-retain-gids.61,62.ttx |    606 -
+ ...lank-Regular.drop-hints-retain-gids.61,FEFA.ttf |    Bin 0 -> 8232 bytes
+ ...lank-Regular.drop-hints-retain-gids.61,FEFA.ttx |   7356 -
+ ...nk-Regular.drop-hints-retain-gids.FEE6,FECF.ttf |    Bin 0 -> 8104 bytes
+ ...nk-Regular.drop-hints-retain-gids.FEE6,FECF.ttx |   7270 -
+ ...nk-Regular.drop-hints-retain-gids.FEF9,FEFA.ttf |    Bin 0 -> 8172 bytes
+ ...nk-Regular.drop-hints-retain-gids.FEF9,FEFA.ttx |   7350 -
+ ...beBlank-Regular.drop-hints-retain-gids.FEFA.ttf |    Bin 0 -> 8156 bytes
+ ...beBlank-Regular.drop-hints-retain-gids.FEFA.ttx |   7343 -
+ .../cmap/AdobeBlank-Regular.drop-hints.61,62.ttf   |    Bin 0 -> 1080 bytes
+ .../cmap/AdobeBlank-Regular.drop-hints.61,62.ttx   |    218 -
+ .../cmap/AdobeBlank-Regular.drop-hints.61,FEFA.ttf |    Bin 0 -> 1092 bytes
+ .../cmap/AdobeBlank-Regular.drop-hints.61,FEFA.ttx |    216 -
+ .../AdobeBlank-Regular.drop-hints.FEE6,FECF.ttf    |    Bin 0 -> 1044 bytes
+ .../AdobeBlank-Regular.drop-hints.FEE6,FECF.ttx    |    210 -
+ .../AdobeBlank-Regular.drop-hints.FEF9,FEFA.ttf    |    Bin 0 -> 1032 bytes
+ .../AdobeBlank-Regular.drop-hints.FEF9,FEFA.ttx    |    210 -
+ .../cmap/AdobeBlank-Regular.drop-hints.FEFA.ttf    |    Bin 0 -> 1012 bytes
+ .../cmap/AdobeBlank-Regular.drop-hints.FEFA.ttx    |    199 -
+ .../cmap/AdobeBlank-Regular.name-ids.61,62.ttf     |    Bin 0 -> 1000 bytes
+ .../cmap/AdobeBlank-Regular.name-ids.61,62.ttx     |    310 -
+ .../cmap/AdobeBlank-Regular.name-ids.61,FEFA.ttf   |    Bin 0 -> 1012 bytes
+ .../cmap/AdobeBlank-Regular.name-ids.61,FEFA.ttx   |    308 -
+ .../cmap/AdobeBlank-Regular.name-ids.FEE6,FECF.ttf |    Bin 0 -> 964 bytes
+ .../cmap/AdobeBlank-Regular.name-ids.FEE6,FECF.ttx |    302 -
+ .../cmap/AdobeBlank-Regular.name-ids.FEF9,FEFA.ttf |    Bin 0 -> 952 bytes
+ .../cmap/AdobeBlank-Regular.name-ids.FEF9,FEFA.ttx |    302 -
+ .../cmap/AdobeBlank-Regular.name-ids.FEFA.ttf      |    Bin 0 -> 932 bytes
+ .../cmap/AdobeBlank-Regular.name-ids.FEFA.ttx      |    291 -
+ .../cmap/AdobeBlank-Regular.retain-gids.61,62.ttf  |    Bin 0 -> 1640 bytes
+ .../cmap/AdobeBlank-Regular.retain-gids.61,62.ttx  |    710 -
+ .../AdobeBlank-Regular.retain-gids.61,FEFA.ttf     |    Bin 0 -> 8404 bytes
+ .../AdobeBlank-Regular.retain-gids.61,FEFA.ttx     |   7460 -
+ .../AdobeBlank-Regular.retain-gids.FEE6,FECF.ttf   |    Bin 0 -> 8276 bytes
+ .../AdobeBlank-Regular.retain-gids.FEE6,FECF.ttx   |   7374 -
+ .../AdobeBlank-Regular.retain-gids.FEF9,FEFA.ttf   |    Bin 0 -> 8344 bytes
+ .../AdobeBlank-Regular.retain-gids.FEF9,FEFA.ttx   |   7454 -
+ .../cmap/AdobeBlank-Regular.retain-gids.FEFA.ttf   |    Bin 0 -> 8328 bytes
+ .../cmap/AdobeBlank-Regular.retain-gids.FEFA.ttx   |   7447 -
+ .../cmap14/cmap14_font1.default.4E00,4E02,4E03.otf |    Bin 0 -> 1360 bytes
+ .../cmap14/cmap14_font1.default.4E00,4E02,4E03.ttx |    276 -
+ .../cmap14/cmap14_font1.default.4E00,4E03.otf      |    Bin 0 -> 1236 bytes
+ .../cmap14/cmap14_font1.default.4E00,4E03.ttx      |    261 -
+ .../cmap14/cmap14_font1.default.4E00,4E05,4E07.otf |    Bin 0 -> 1328 bytes
+ .../cmap14/cmap14_font1.default.4E00,4E05,4E07.ttx |    278 -
+ .../cmap14/cmap14_font1.default.4E02,4E03,4E08.otf |    Bin 0 -> 1576 bytes
+ .../cmap14/cmap14_font1.default.4E02,4E03,4E08.ttx |    294 -
+ .../expected/cmap14/cmap14_font1.default.4E02.otf  |    Bin 0 -> 996 bytes
+ .../expected/cmap14/cmap14_font1.default.4E02.ttx  |    233 -
+ .../expected/cmap14/cmap14_font1.default.4E03.otf  |    Bin 0 -> 1080 bytes
+ .../expected/cmap14/cmap14_font1.default.4E03.ttx  |    241 -
+ .../cmap14_font1.default.4E05,4E07,4E08,4E09.otf   |    Bin 0 -> 1848 bytes
+ .../cmap14_font1.default.4E05,4E07,4E08,4E09.ttx   |    329 -
+ .../cmap14/cmap14_font1.default.4E08,4E09.otf      |    Bin 0 -> 1720 bytes
+ .../cmap14/cmap14_font1.default.4E08,4E09.ttx      |    302 -
+ .../expected/cmap14/cmap14_font1.default.4E08.otf  |    Bin 0 -> 1384 bytes
+ .../expected/cmap14/cmap14_font1.default.4E08.ttx  |    265 -
+ .../cmap14_font1.default.retain-all-codepoint.otf  |    Bin 0 -> 2348 bytes
+ .../cmap14_font1.default.retain-all-codepoint.ttx  |    418 -
+ ...font1.drop-hints-retain-gids.4E00,4E02,4E03.otf |    Bin 0 -> 1388 bytes
+ ...font1.drop-hints-retain-gids.4E00,4E02,4E03.ttx |    318 -
+ ...ap14_font1.drop-hints-retain-gids.4E00,4E03.otf |    Bin 0 -> 1272 bytes
+ ...ap14_font1.drop-hints-retain-gids.4E00,4E03.ttx |    308 -
+ ...font1.drop-hints-retain-gids.4E00,4E05,4E07.otf |    Bin 0 -> 1396 bytes
+ ...font1.drop-hints-retain-gids.4E00,4E05,4E07.ttx |    340 -
+ ...font1.drop-hints-retain-gids.4E02,4E03,4E08.otf |    Bin 0 -> 1720 bytes
+ ...font1.drop-hints-retain-gids.4E02,4E03,4E08.ttx |    391 -
+ .../cmap14_font1.drop-hints-retain-gids.4E02.otf   |    Bin 0 -> 1028 bytes
+ .../cmap14_font1.drop-hints-retain-gids.4E02.ttx   |    280 -
+ .../cmap14_font1.drop-hints-retain-gids.4E03.otf   |    Bin 0 -> 1124 bytes
+ .../cmap14_font1.drop-hints-retain-gids.4E03.ttx   |    293 -
+ ....drop-hints-retain-gids.4E05,4E07,4E08,4E09.otf |    Bin 0 -> 1984 bytes
+ ....drop-hints-retain-gids.4E05,4E07,4E08,4E09.ttx |    421 -
+ ...ap14_font1.drop-hints-retain-gids.4E08,4E09.otf |    Bin 0 -> 1872 bytes
+ ...ap14_font1.drop-hints-retain-gids.4E08,4E09.ttx |    404 -
+ .../cmap14_font1.drop-hints-retain-gids.4E08.otf   |    Bin 0 -> 1544 bytes
+ .../cmap14_font1.drop-hints-retain-gids.4E08.ttx   |    372 -
+ ...drop-hints-retain-gids.retain-all-codepoint.otf |    Bin 0 -> 2436 bytes
+ ...drop-hints-retain-gids.retain-all-codepoint.ttx |    480 -
+ .../cmap14_font1.drop-hints.4E00,4E02,4E03.otf     |    Bin 0 -> 1292 bytes
+ .../cmap14_font1.drop-hints.4E00,4E02,4E03.ttx     |    268 -
+ .../cmap14/cmap14_font1.drop-hints.4E00,4E03.otf   |    Bin 0 -> 1168 bytes
+ .../cmap14/cmap14_font1.drop-hints.4E00,4E03.ttx   |    253 -
+ .../cmap14_font1.drop-hints.4E00,4E05,4E07.otf     |    Bin 0 -> 1260 bytes
+ .../cmap14_font1.drop-hints.4E00,4E05,4E07.ttx     |    270 -
+ .../cmap14_font1.drop-hints.4E02,4E03,4E08.otf     |    Bin 0 -> 1512 bytes
+ .../cmap14_font1.drop-hints.4E02,4E03,4E08.ttx     |    286 -
+ .../cmap14/cmap14_font1.drop-hints.4E02.otf        |    Bin 0 -> 928 bytes
+ .../cmap14/cmap14_font1.drop-hints.4E02.ttx        |    225 -
+ .../cmap14/cmap14_font1.drop-hints.4E03.otf        |    Bin 0 -> 1012 bytes
+ .../cmap14/cmap14_font1.drop-hints.4E03.ttx        |    233 -
+ ...cmap14_font1.drop-hints.4E05,4E07,4E08,4E09.otf |    Bin 0 -> 1780 bytes
+ ...cmap14_font1.drop-hints.4E05,4E07,4E08,4E09.ttx |    321 -
+ .../cmap14/cmap14_font1.drop-hints.4E08,4E09.otf   |    Bin 0 -> 1652 bytes
+ .../cmap14/cmap14_font1.drop-hints.4E08,4E09.ttx   |    294 -
+ .../cmap14/cmap14_font1.drop-hints.4E08.otf        |    Bin 0 -> 1316 bytes
+ .../cmap14/cmap14_font1.drop-hints.4E08.ttx        |    257 -
+ ...map14_font1.drop-hints.retain-all-codepoint.otf |    Bin 0 -> 2280 bytes
+ ...map14_font1.drop-hints.retain-all-codepoint.ttx |    410 -
+ .../cmap14/cmap14_font1.gids.4E00,4E02,4E03.otf    |    Bin 0 -> 1388 bytes
+ .../cmap14/cmap14_font1.gids.4E00,4E02,4E03.ttx    |    297 -
+ .../cmap14/cmap14_font1.gids.4E00,4E03.otf         |    Bin 0 -> 1380 bytes
+ .../cmap14/cmap14_font1.gids.4E00,4E03.ttx         |    289 -
+ .../cmap14/cmap14_font1.gids.4E00,4E05,4E07.otf    |    Bin 0 -> 1620 bytes
+ .../cmap14/cmap14_font1.gids.4E00,4E05,4E07.ttx    |    318 -
+ .../cmap14/cmap14_font1.gids.4E02,4E03,4E08.otf    |    Bin 0 -> 1744 bytes
+ .../cmap14/cmap14_font1.gids.4E02,4E03,4E08.ttx    |    326 -
+ .../expected/cmap14/cmap14_font1.gids.4E02.otf     |    Bin 0 -> 1312 bytes
+ .../expected/cmap14/cmap14_font1.gids.4E02.ttx     |    277 -
+ .../expected/cmap14/cmap14_font1.gids.4E03.otf     |    Bin 0 -> 1352 bytes
+ .../expected/cmap14/cmap14_font1.gids.4E03.ttx     |    280 -
+ .../cmap14_font1.gids.4E05,4E07,4E08,4E09.otf      |    Bin 0 -> 2164 bytes
+ .../cmap14_font1.gids.4E05,4E07,4E08,4E09.ttx      |    373 -
+ .../cmap14/cmap14_font1.gids.4E08,4E09.otf         |    Bin 0 -> 2036 bytes
+ .../cmap14/cmap14_font1.gids.4E08,4E09.ttx         |    346 -
+ .../expected/cmap14/cmap14_font1.gids.4E08.otf     |    Bin 0 -> 1704 bytes
+ .../expected/cmap14/cmap14_font1.gids.4E08.ttx     |    309 -
+ .../cmap14_font1.gids.retain-all-codepoint.otf     |    Bin 0 -> 2380 bytes
+ .../cmap14_font1.gids.retain-all-codepoint.ttx     |    439 -
+ .../cmap14_font1.name-ids.4E00,4E02,4E03.otf       |    Bin 0 -> 1292 bytes
+ .../cmap14_font1.name-ids.4E00,4E02,4E03.ttx       |    264 -
+ .../cmap14/cmap14_font1.name-ids.4E00,4E03.otf     |    Bin 0 -> 1168 bytes
+ .../cmap14/cmap14_font1.name-ids.4E00,4E03.ttx     |    249 -
+ .../cmap14_font1.name-ids.4E00,4E05,4E07.otf       |    Bin 0 -> 1260 bytes
+ .../cmap14_font1.name-ids.4E00,4E05,4E07.ttx       |    266 -
+ .../cmap14_font1.name-ids.4E02,4E03,4E08.otf       |    Bin 0 -> 1508 bytes
+ .../cmap14_font1.name-ids.4E02,4E03,4E08.ttx       |    282 -
+ .../expected/cmap14/cmap14_font1.name-ids.4E02.otf |    Bin 0 -> 928 bytes
+ .../expected/cmap14/cmap14_font1.name-ids.4E02.ttx |    221 -
+ .../expected/cmap14/cmap14_font1.name-ids.4E03.otf |    Bin 0 -> 1012 bytes
+ .../expected/cmap14/cmap14_font1.name-ids.4E03.ttx |    229 -
+ .../cmap14_font1.name-ids.4E05,4E07,4E08,4E09.otf  |    Bin 0 -> 1780 bytes
+ .../cmap14_font1.name-ids.4E05,4E07,4E08,4E09.ttx  |    317 -
+ .../cmap14/cmap14_font1.name-ids.4E08,4E09.otf     |    Bin 0 -> 1652 bytes
+ .../cmap14/cmap14_font1.name-ids.4E08,4E09.ttx     |    290 -
+ .../expected/cmap14/cmap14_font1.name-ids.4E08.otf |    Bin 0 -> 1316 bytes
+ .../expected/cmap14/cmap14_font1.name-ids.4E08.ttx |    253 -
+ .../cmap14_font1.name-ids.retain-all-codepoint.otf |    Bin 0 -> 2280 bytes
+ .../cmap14_font1.name-ids.retain-all-codepoint.ttx |    406 -
+ .../cmap14_font1.retain-gids.4E00,4E02,4E03.otf    |    Bin 0 -> 1452 bytes
+ .../cmap14_font1.retain-gids.4E00,4E02,4E03.ttx    |    326 -
+ .../cmap14/cmap14_font1.retain-gids.4E00,4E03.otf  |    Bin 0 -> 1340 bytes
+ .../cmap14/cmap14_font1.retain-gids.4E00,4E03.ttx  |    316 -
+ .../cmap14_font1.retain-gids.4E00,4E05,4E07.otf    |    Bin 0 -> 1464 bytes
+ .../cmap14_font1.retain-gids.4E00,4E05,4E07.ttx    |    348 -
+ .../cmap14_font1.retain-gids.4E02,4E03,4E08.otf    |    Bin 0 -> 1788 bytes
+ .../cmap14_font1.retain-gids.4E02,4E03,4E08.ttx    |    399 -
+ .../cmap14/cmap14_font1.retain-gids.4E02.otf       |    Bin 0 -> 1096 bytes
+ .../cmap14/cmap14_font1.retain-gids.4E02.ttx       |    288 -
+ .../cmap14/cmap14_font1.retain-gids.4E03.otf       |    Bin 0 -> 1192 bytes
+ .../cmap14/cmap14_font1.retain-gids.4E03.ttx       |    301 -
+ ...map14_font1.retain-gids.4E05,4E07,4E08,4E09.otf |    Bin 0 -> 2048 bytes
+ ...map14_font1.retain-gids.4E05,4E07,4E08,4E09.ttx |    429 -
+ .../cmap14/cmap14_font1.retain-gids.4E08,4E09.otf  |    Bin 0 -> 1940 bytes
+ .../cmap14/cmap14_font1.retain-gids.4E08,4E09.ttx  |    412 -
+ .../cmap14/cmap14_font1.retain-gids.4E08.otf       |    Bin 0 -> 1608 bytes
+ .../cmap14/cmap14_font1.retain-gids.4E08.ttx       |    380 -
+ ...ap14_font1.retain-gids.retain-all-codepoint.otf |    Bin 0 -> 2500 bytes
+ ...ap14_font1.retain-gids.retain-all-codepoint.ttx |    488 -
+ .../cmap14/cmap14_font2.default.4E00,4E02,4E03.otf |    Bin 0 -> 1360 bytes
+ .../cmap14/cmap14_font2.default.4E00,4E02,4E03.ttx |    276 -
+ .../cmap14/cmap14_font2.default.4E00,4E03.otf      |    Bin 0 -> 1236 bytes
+ .../cmap14/cmap14_font2.default.4E00,4E03.ttx      |    261 -
+ .../cmap14/cmap14_font2.default.4E00,4E05,4E07.otf |    Bin 0 -> 1332 bytes
+ .../cmap14/cmap14_font2.default.4E00,4E05,4E07.ttx |    278 -
+ .../cmap14/cmap14_font2.default.4E02,4E03,4E08.otf |    Bin 0 -> 1576 bytes
+ .../cmap14/cmap14_font2.default.4E02,4E03,4E08.ttx |    294 -
+ .../expected/cmap14/cmap14_font2.default.4E02.otf  |    Bin 0 -> 992 bytes
+ .../expected/cmap14/cmap14_font2.default.4E02.ttx  |    233 -
+ .../expected/cmap14/cmap14_font2.default.4E03.otf  |    Bin 0 -> 1076 bytes
+ .../expected/cmap14/cmap14_font2.default.4E03.ttx  |    241 -
+ .../cmap14_font2.default.4E05,4E07,4E08,4E09.otf   |    Bin 0 -> 1848 bytes
+ .../cmap14_font2.default.4E05,4E07,4E08,4E09.ttx   |    329 -
+ .../cmap14/cmap14_font2.default.4E08,4E09.otf      |    Bin 0 -> 1716 bytes
+ .../cmap14/cmap14_font2.default.4E08,4E09.ttx      |    302 -
+ .../expected/cmap14/cmap14_font2.default.4E08.otf  |    Bin 0 -> 1380 bytes
+ .../expected/cmap14/cmap14_font2.default.4E08.ttx  |    265 -
+ .../cmap14_font2.default.retain-all-codepoint.otf  |    Bin 0 -> 2344 bytes
+ .../cmap14_font2.default.retain-all-codepoint.ttx  |    418 -
+ ...font2.drop-hints-retain-gids.4E00,4E02,4E03.otf |    Bin 0 -> 1388 bytes
+ ...font2.drop-hints-retain-gids.4E00,4E02,4E03.ttx |    318 -
+ ...ap14_font2.drop-hints-retain-gids.4E00,4E03.otf |    Bin 0 -> 1272 bytes
+ ...ap14_font2.drop-hints-retain-gids.4E00,4E03.ttx |    308 -
+ ...font2.drop-hints-retain-gids.4E00,4E05,4E07.otf |    Bin 0 -> 1400 bytes
+ ...font2.drop-hints-retain-gids.4E00,4E05,4E07.ttx |    340 -
+ ...font2.drop-hints-retain-gids.4E02,4E03,4E08.otf |    Bin 0 -> 1720 bytes
+ ...font2.drop-hints-retain-gids.4E02,4E03,4E08.ttx |    391 -
+ .../cmap14_font2.drop-hints-retain-gids.4E02.otf   |    Bin 0 -> 1024 bytes
+ .../cmap14_font2.drop-hints-retain-gids.4E02.ttx   |    280 -
+ .../cmap14_font2.drop-hints-retain-gids.4E03.otf   |    Bin 0 -> 1120 bytes
+ .../cmap14_font2.drop-hints-retain-gids.4E03.ttx   |    293 -
+ ....drop-hints-retain-gids.4E05,4E07,4E08,4E09.otf |    Bin 0 -> 1984 bytes
+ ....drop-hints-retain-gids.4E05,4E07,4E08,4E09.ttx |    421 -
+ ...ap14_font2.drop-hints-retain-gids.4E08,4E09.otf |    Bin 0 -> 1868 bytes
+ ...ap14_font2.drop-hints-retain-gids.4E08,4E09.ttx |    404 -
+ .../cmap14_font2.drop-hints-retain-gids.4E08.otf   |    Bin 0 -> 1540 bytes
+ .../cmap14_font2.drop-hints-retain-gids.4E08.ttx   |    372 -
+ ...drop-hints-retain-gids.retain-all-codepoint.otf |    Bin 0 -> 2432 bytes
+ ...drop-hints-retain-gids.retain-all-codepoint.ttx |    480 -
+ .../cmap14_font2.drop-hints.4E00,4E02,4E03.otf     |    Bin 0 -> 1292 bytes
+ .../cmap14_font2.drop-hints.4E00,4E02,4E03.ttx     |    268 -
+ .../cmap14/cmap14_font2.drop-hints.4E00,4E03.otf   |    Bin 0 -> 1168 bytes
+ .../cmap14/cmap14_font2.drop-hints.4E00,4E03.ttx   |    253 -
+ .../cmap14_font2.drop-hints.4E00,4E05,4E07.otf     |    Bin 0 -> 1264 bytes
+ .../cmap14_font2.drop-hints.4E00,4E05,4E07.ttx     |    270 -
+ .../cmap14_font2.drop-hints.4E02,4E03,4E08.otf     |    Bin 0 -> 1512 bytes
+ .../cmap14_font2.drop-hints.4E02,4E03,4E08.ttx     |    286 -
+ .../cmap14/cmap14_font2.drop-hints.4E02.otf        |    Bin 0 -> 924 bytes
+ .../cmap14/cmap14_font2.drop-hints.4E02.ttx        |    225 -
+ .../cmap14/cmap14_font2.drop-hints.4E03.otf        |    Bin 0 -> 1008 bytes
+ .../cmap14/cmap14_font2.drop-hints.4E03.ttx        |    233 -
+ ...cmap14_font2.drop-hints.4E05,4E07,4E08,4E09.otf |    Bin 0 -> 1780 bytes
+ ...cmap14_font2.drop-hints.4E05,4E07,4E08,4E09.ttx |    321 -
+ .../cmap14/cmap14_font2.drop-hints.4E08,4E09.otf   |    Bin 0 -> 1648 bytes
+ .../cmap14/cmap14_font2.drop-hints.4E08,4E09.ttx   |    294 -
+ .../cmap14/cmap14_font2.drop-hints.4E08.otf        |    Bin 0 -> 1312 bytes
+ .../cmap14/cmap14_font2.drop-hints.4E08.ttx        |    257 -
+ ...map14_font2.drop-hints.retain-all-codepoint.otf |    Bin 0 -> 2276 bytes
+ ...map14_font2.drop-hints.retain-all-codepoint.ttx |    410 -
+ .../cmap14/cmap14_font2.gids.4E00,4E02,4E03.otf    |    Bin 0 -> 1388 bytes
+ .../cmap14/cmap14_font2.gids.4E00,4E02,4E03.ttx    |    297 -
+ .../cmap14/cmap14_font2.gids.4E00,4E03.otf         |    Bin 0 -> 1380 bytes
+ .../cmap14/cmap14_font2.gids.4E00,4E03.ttx         |    289 -
+ .../cmap14/cmap14_font2.gids.4E00,4E05,4E07.otf    |    Bin 0 -> 1624 bytes
+ .../cmap14/cmap14_font2.gids.4E00,4E05,4E07.ttx    |    318 -
+ .../cmap14/cmap14_font2.gids.4E02,4E03,4E08.otf    |    Bin 0 -> 1744 bytes
+ .../cmap14/cmap14_font2.gids.4E02,4E03,4E08.ttx    |    326 -
+ .../expected/cmap14/cmap14_font2.gids.4E02.otf     |    Bin 0 -> 1308 bytes
+ .../expected/cmap14/cmap14_font2.gids.4E02.ttx     |    277 -
+ .../expected/cmap14/cmap14_font2.gids.4E03.otf     |    Bin 0 -> 1348 bytes
+ .../expected/cmap14/cmap14_font2.gids.4E03.ttx     |    280 -
+ .../cmap14_font2.gids.4E05,4E07,4E08,4E09.otf      |    Bin 0 -> 2164 bytes
+ .../cmap14_font2.gids.4E05,4E07,4E08,4E09.ttx      |    373 -
+ .../cmap14/cmap14_font2.gids.4E08,4E09.otf         |    Bin 0 -> 2032 bytes
+ .../cmap14/cmap14_font2.gids.4E08,4E09.ttx         |    346 -
+ .../expected/cmap14/cmap14_font2.gids.4E08.otf     |    Bin 0 -> 1700 bytes
+ .../expected/cmap14/cmap14_font2.gids.4E08.ttx     |    309 -
+ .../cmap14_font2.gids.retain-all-codepoint.otf     |    Bin 0 -> 2376 bytes
+ .../cmap14_font2.gids.retain-all-codepoint.ttx     |    439 -
+ .../cmap14_font2.name-ids.4E00,4E02,4E03.otf       |    Bin 0 -> 1292 bytes
+ .../cmap14_font2.name-ids.4E00,4E02,4E03.ttx       |    264 -
+ .../cmap14/cmap14_font2.name-ids.4E00,4E03.otf     |    Bin 0 -> 1168 bytes
+ .../cmap14/cmap14_font2.name-ids.4E00,4E03.ttx     |    249 -
+ .../cmap14_font2.name-ids.4E00,4E05,4E07.otf       |    Bin 0 -> 1264 bytes
+ .../cmap14_font2.name-ids.4E00,4E05,4E07.ttx       |    266 -
+ .../cmap14_font2.name-ids.4E02,4E03,4E08.otf       |    Bin 0 -> 1508 bytes
+ .../cmap14_font2.name-ids.4E02,4E03,4E08.ttx       |    282 -
+ .../expected/cmap14/cmap14_font2.name-ids.4E02.otf |    Bin 0 -> 924 bytes
+ .../expected/cmap14/cmap14_font2.name-ids.4E02.ttx |    221 -
+ .../expected/cmap14/cmap14_font2.name-ids.4E03.otf |    Bin 0 -> 1008 bytes
+ .../expected/cmap14/cmap14_font2.name-ids.4E03.ttx |    229 -
+ .../cmap14_font2.name-ids.4E05,4E07,4E08,4E09.otf  |    Bin 0 -> 1780 bytes
+ .../cmap14_font2.name-ids.4E05,4E07,4E08,4E09.ttx  |    317 -
+ .../cmap14/cmap14_font2.name-ids.4E08,4E09.otf     |    Bin 0 -> 1648 bytes
+ .../cmap14/cmap14_font2.name-ids.4E08,4E09.ttx     |    290 -
+ .../expected/cmap14/cmap14_font2.name-ids.4E08.otf |    Bin 0 -> 1312 bytes
+ .../expected/cmap14/cmap14_font2.name-ids.4E08.ttx |    253 -
+ .../cmap14_font2.name-ids.retain-all-codepoint.otf |    Bin 0 -> 2276 bytes
+ .../cmap14_font2.name-ids.retain-all-codepoint.ttx |    406 -
+ .../cmap14_font2.retain-gids.4E00,4E02,4E03.otf    |    Bin 0 -> 1452 bytes
+ .../cmap14_font2.retain-gids.4E00,4E02,4E03.ttx    |    326 -
+ .../cmap14/cmap14_font2.retain-gids.4E00,4E03.otf  |    Bin 0 -> 1340 bytes
+ .../cmap14/cmap14_font2.retain-gids.4E00,4E03.ttx  |    316 -
+ .../cmap14_font2.retain-gids.4E00,4E05,4E07.otf    |    Bin 0 -> 1468 bytes
+ .../cmap14_font2.retain-gids.4E00,4E05,4E07.ttx    |    348 -
+ .../cmap14_font2.retain-gids.4E02,4E03,4E08.otf    |    Bin 0 -> 1788 bytes
+ .../cmap14_font2.retain-gids.4E02,4E03,4E08.ttx    |    399 -
+ .../cmap14/cmap14_font2.retain-gids.4E02.otf       |    Bin 0 -> 1092 bytes
+ .../cmap14/cmap14_font2.retain-gids.4E02.ttx       |    288 -
+ .../cmap14/cmap14_font2.retain-gids.4E03.otf       |    Bin 0 -> 1188 bytes
+ .../cmap14/cmap14_font2.retain-gids.4E03.ttx       |    301 -
+ ...map14_font2.retain-gids.4E05,4E07,4E08,4E09.otf |    Bin 0 -> 2048 bytes
+ ...map14_font2.retain-gids.4E05,4E07,4E08,4E09.ttx |    429 -
+ .../cmap14/cmap14_font2.retain-gids.4E08,4E09.otf  |    Bin 0 -> 1936 bytes
+ .../cmap14/cmap14_font2.retain-gids.4E08,4E09.ttx  |    412 -
+ .../cmap14/cmap14_font2.retain-gids.4E08.otf       |    Bin 0 -> 1604 bytes
+ .../cmap14/cmap14_font2.retain-gids.4E08.ttx       |    380 -
+ ...ap14_font2.retain-gids.retain-all-codepoint.otf |    Bin 0 -> 2496 bytes
+ ...ap14_font2.retain-gids.retain-all-codepoint.ttx |    488 -
+ .../TwemojiMozilla.subset.default.32,3297,3299.ttf |    Bin 0 -> 1936 bytes
+ .../TwemojiMozilla.subset.default.32,3297,3299.ttx |    626 -
+ .../colr/TwemojiMozilla.subset.default.32,3297.ttf |    Bin 0 -> 1400 bytes
+ .../colr/TwemojiMozilla.subset.default.32,3297.ttx |    411 -
+ .../colr/TwemojiMozilla.subset.default.32,3299.ttf |    Bin 0 -> 1576 bytes
+ .../colr/TwemojiMozilla.subset.default.32,3299.ttx |    475 -
+ .../colr/TwemojiMozilla.subset.default.32.ttf      |    Bin 0 -> 932 bytes
+ .../colr/TwemojiMozilla.subset.default.32.ttx      |    231 -
+ .../TwemojiMozilla.subset.default.3297,3299.ttf    |    Bin 0 -> 1916 bytes
+ .../TwemojiMozilla.subset.default.3297,3299.ttx    |    617 -
+ .../colr/TwemojiMozilla.subset.default.3297.ttf    |    Bin 0 -> 1376 bytes
+ .../colr/TwemojiMozilla.subset.default.3297.ttx    |    402 -
+ .../colr/TwemojiMozilla.subset.default.3299.ttf    |    Bin 0 -> 1552 bytes
+ .../colr/TwemojiMozilla.subset.default.3299.ttx    |    466 -
+ ....subset.drop-hints-retain-gids.32,3297,3299.ttf |    Bin 0 -> 1916 bytes
+ ....subset.drop-hints-retain-gids.32,3297,3299.ttx |    621 -
+ ...zilla.subset.drop-hints-retain-gids.32,3297.ttf |    Bin 0 -> 1396 bytes
+ ...zilla.subset.drop-hints-retain-gids.32,3297.ttx |    410 -
+ ...zilla.subset.drop-hints-retain-gids.32,3299.ttf |    Bin 0 -> 1576 bytes
+ ...zilla.subset.drop-hints-retain-gids.32,3299.ttx |    478 -
+ ...ojiMozilla.subset.drop-hints-retain-gids.32.ttf |    Bin 0 -> 912 bytes
+ ...ojiMozilla.subset.drop-hints-retain-gids.32.ttx |    226 -
+ ...lla.subset.drop-hints-retain-gids.3297,3299.ttf |    Bin 0 -> 1900 bytes
+ ...lla.subset.drop-hints-retain-gids.3297,3299.ttx |    616 -
+ ...iMozilla.subset.drop-hints-retain-gids.3297.ttf |    Bin 0 -> 1372 bytes
+ ...iMozilla.subset.drop-hints-retain-gids.3297.ttx |    405 -
+ ...iMozilla.subset.drop-hints-retain-gids.3299.ttf |    Bin 0 -> 1552 bytes
+ ...iMozilla.subset.drop-hints-retain-gids.3299.ttx |    473 -
+ ...emojiMozilla.subset.drop-hints.32,3297,3299.ttf |    Bin 0 -> 1916 bytes
+ ...emojiMozilla.subset.drop-hints.32,3297,3299.ttx |    621 -
+ .../TwemojiMozilla.subset.drop-hints.32,3297.ttf   |    Bin 0 -> 1380 bytes
+ .../TwemojiMozilla.subset.drop-hints.32,3297.ttx   |    406 -
+ .../TwemojiMozilla.subset.drop-hints.32,3299.ttf   |    Bin 0 -> 1556 bytes
+ .../TwemojiMozilla.subset.drop-hints.32,3299.ttx   |    470 -
+ .../colr/TwemojiMozilla.subset.drop-hints.32.ttf   |    Bin 0 -> 912 bytes
+ .../colr/TwemojiMozilla.subset.drop-hints.32.ttx   |    226 -
+ .../TwemojiMozilla.subset.drop-hints.3297,3299.ttf |    Bin 0 -> 1896 bytes
+ .../TwemojiMozilla.subset.drop-hints.3297,3299.ttx |    612 -
+ .../colr/TwemojiMozilla.subset.drop-hints.3297.ttf |    Bin 0 -> 1356 bytes
+ .../colr/TwemojiMozilla.subset.drop-hints.3297.ttx |    397 -
+ .../colr/TwemojiMozilla.subset.drop-hints.3299.ttf |    Bin 0 -> 1532 bytes
+ .../colr/TwemojiMozilla.subset.drop-hints.3299.ttx |    461 -
+ ...mojiMozilla.subset.retain-gids.32,3297,3299.ttf |    Bin 0 -> 1936 bytes
+ ...mojiMozilla.subset.retain-gids.32,3297,3299.ttx |    626 -
+ .../TwemojiMozilla.subset.retain-gids.32,3297.ttf  |    Bin 0 -> 1416 bytes
+ .../TwemojiMozilla.subset.retain-gids.32,3297.ttx  |    415 -
+ .../TwemojiMozilla.subset.retain-gids.32,3299.ttf  |    Bin 0 -> 1596 bytes
+ .../TwemojiMozilla.subset.retain-gids.32,3299.ttx  |    483 -
+ .../colr/TwemojiMozilla.subset.retain-gids.32.ttf  |    Bin 0 -> 932 bytes
+ .../colr/TwemojiMozilla.subset.retain-gids.32.ttx  |    231 -
+ ...TwemojiMozilla.subset.retain-gids.3297,3299.ttf |    Bin 0 -> 1920 bytes
+ ...TwemojiMozilla.subset.retain-gids.3297,3299.ttx |    621 -
+ .../TwemojiMozilla.subset.retain-gids.3297.ttf     |    Bin 0 -> 1392 bytes
+ .../TwemojiMozilla.subset.retain-gids.3297.ttx     |    410 -
+ .../TwemojiMozilla.subset.retain-gids.3299.ttf     |    Bin 0 -> 1572 bytes
+ .../TwemojiMozilla.subset.retain-gids.3299.ttx     |    478 -
+ .../colr_with_components/colr-table.default.6B.ttf |    Bin 0 -> 4260 bytes
+ .../colr_with_components/colr-table.default.6B.ttx |   1435 -
+ .../colr-table.drop-hints-retain-gids.6B.ttf       |    Bin 0 -> 4984 bytes
+ .../colr-table.drop-hints-retain-gids.6B.ttx       |   1919 -
+ .../colr-table.drop-hints.6B.ttf                   |    Bin 0 -> 4260 bytes
+ .../colr-table.drop-hints.6B.ttx                   |   1435 -
+ .../colr-table.retain-gids.6B.ttf                  |    Bin 0 -> 4984 bytes
+ .../colr-table.retain-gids.6B.ttx                  |   1919 -
+ ...oColrEmojiGlyf-Regular.subset.default.1f35e.ttf |    Bin 0 -> 3004 bytes
+ ...oColrEmojiGlyf-Regular.subset.default.1f35e.ttx |   1077 -
+ ...oColrEmojiGlyf-Regular.subset.default.1f696.ttf |    Bin 0 -> 3752 bytes
+ ...oColrEmojiGlyf-Regular.subset.default.1f696.ttx |   1449 -
+ ...Regular.subset.drop-hints-retain-gids.1f35e.ttf |    Bin 0 -> 3516 bytes
+ ...Regular.subset.drop-hints-retain-gids.1f35e.ttx |   1417 -
+ ...Regular.subset.drop-hints-retain-gids.1f696.ttf |    Bin 0 -> 5048 bytes
+ ...Regular.subset.drop-hints-retain-gids.1f696.ttx |   2313 -
+ ...lrEmojiGlyf-Regular.subset.drop-hints.1f35e.ttf |    Bin 0 -> 3004 bytes
+ ...lrEmojiGlyf-Regular.subset.drop-hints.1f35e.ttx |   1077 -
+ ...lrEmojiGlyf-Regular.subset.drop-hints.1f696.ttf |    Bin 0 -> 3752 bytes
+ ...lrEmojiGlyf-Regular.subset.drop-hints.1f696.ttx |   1449 -
+ ...rEmojiGlyf-Regular.subset.retain-gids.1f35e.ttf |    Bin 0 -> 3516 bytes
+ ...rEmojiGlyf-Regular.subset.retain-gids.1f35e.ttx |   1417 -
+ ...rEmojiGlyf-Regular.subset.retain-gids.1f696.ttf |    Bin 0 -> 5048 bytes
+ ...rEmojiGlyf-Regular.subset.retain-gids.1f696.ttx |   2313 -
+ .../colrv1/TestCOLRv1.default.E000,E004.ttf        |    Bin 0 -> 900 bytes
+ .../colrv1/TestCOLRv1.default.E000,E004.ttx        |    316 -
+ .../colrv1/TestCOLRv1.default.E003,E004.ttf        |    Bin 0 -> 1000 bytes
+ .../colrv1/TestCOLRv1.default.E003,E004.ttx        |    367 -
+ .../expected/colrv1/TestCOLRv1.default.E004.ttf    |    Bin 0 -> 744 bytes
+ .../expected/colrv1/TestCOLRv1.default.E004.ttx    |    231 -
+ .../TestCOLRv1.default.retain-all-codepoint.ttf    |    Bin 0 -> 1444 bytes
+ .../TestCOLRv1.default.retain-all-codepoint.ttx    |    596 -
+ ...TestCOLRv1.drop-hints-retain-gids.E000,E004.ttf |    Bin 0 -> 984 bytes
+ ...TestCOLRv1.drop-hints-retain-gids.E000,E004.ttx |    364 -
+ ...TestCOLRv1.drop-hints-retain-gids.E003,E004.ttf |    Bin 0 -> 1076 bytes
+ ...TestCOLRv1.drop-hints-retain-gids.E003,E004.ttx |    411 -
+ .../TestCOLRv1.drop-hints-retain-gids.E004.ttf     |    Bin 0 -> 836 bytes
+ .../TestCOLRv1.drop-hints-retain-gids.E004.ttx     |    291 -
+ ...drop-hints-retain-gids.retain-all-codepoint.ttf |    Bin 0 -> 1444 bytes
+ ...drop-hints-retain-gids.retain-all-codepoint.ttx |    596 -
+ .../colrv1/TestCOLRv1.drop-hints.E000,E004.ttf     |    Bin 0 -> 900 bytes
+ .../colrv1/TestCOLRv1.drop-hints.E000,E004.ttx     |    316 -
+ .../colrv1/TestCOLRv1.drop-hints.E003,E004.ttf     |    Bin 0 -> 1000 bytes
+ .../colrv1/TestCOLRv1.drop-hints.E003,E004.ttx     |    367 -
+ .../expected/colrv1/TestCOLRv1.drop-hints.E004.ttf |    Bin 0 -> 744 bytes
+ .../expected/colrv1/TestCOLRv1.drop-hints.E004.ttx |    231 -
+ .../TestCOLRv1.drop-hints.retain-all-codepoint.ttf |    Bin 0 -> 1444 bytes
+ .../TestCOLRv1.drop-hints.retain-all-codepoint.ttx |    596 -
+ .../colrv1/TestCOLRv1.retain-gids.E000,E004.ttf    |    Bin 0 -> 984 bytes
+ .../colrv1/TestCOLRv1.retain-gids.E000,E004.ttx    |    364 -
+ .../colrv1/TestCOLRv1.retain-gids.E003,E004.ttf    |    Bin 0 -> 1076 bytes
+ .../colrv1/TestCOLRv1.retain-gids.E003,E004.ttx    |    411 -
+ .../colrv1/TestCOLRv1.retain-gids.E004.ttf         |    Bin 0 -> 836 bytes
+ .../colrv1/TestCOLRv1.retain-gids.E004.ttx         |    291 -
+ ...TestCOLRv1.retain-gids.retain-all-codepoint.ttf |    Bin 0 -> 1444 bytes
+ ...TestCOLRv1.retain-gids.retain-all-codepoint.ttx |    596 -
+ .../Roboto-Regular.default.1FC,21,41,20,62,63.ttf  |    Bin 0 -> 3080 bytes
+ .../Roboto-Regular.default.1FC,21,41,20,62,63.ttx  |   1659 -
+ .../full-font/Roboto-Regular.default.61,62,63.ttf  |    Bin 0 -> 2672 bytes
+ .../full-font/Roboto-Regular.default.61,62,63.ttx  |   1422 -
+ .../Roboto-Regular.default.D7,D8,D9,DA,DE.ttf      |    Bin 0 -> 3024 bytes
+ .../Roboto-Regular.default.D7,D8,D9,DA,DE.ttx      |   1571 -
+ ...oboto-Regular.drop-hints.1FC,21,41,20,62,63.ttf |    Bin 0 -> 1632 bytes
+ ...oboto-Regular.drop-hints.1FC,21,41,20,62,63.ttx |    549 -
+ .../Roboto-Regular.drop-hints.61,62,63.ttf         |    Bin 0 -> 1412 bytes
+ .../Roboto-Regular.drop-hints.61,62,63.ttx         |    494 -
+ .../Roboto-Regular.drop-hints.D7,D8,D9,DA,DE.ttf   |    Bin 0 -> 1648 bytes
+ .../Roboto-Regular.drop-hints.D7,D8,D9,DA,DE.ttx   |    529 -
+ ...ifVariable-Roman.default.1FC,21,41,20,62,63.ttf |    Bin 0 -> 3992 bytes
+ ...ifVariable-Roman.default.1FC,21,41,20,62,63.ttx |   1355 -
+ .../SourceSerifVariable-Roman.default.61,62,63.ttf |    Bin 0 -> 3832 bytes
+ .../SourceSerifVariable-Roman.default.61,62,63.ttx |   1262 -
+ ...eSerifVariable-Roman.default.D7,D8,D9,DA,DE.ttf |    Bin 0 -> 4396 bytes
+ ...eSerifVariable-Roman.default.D7,D8,D9,DA,DE.ttx |   1522 -
+ ...ariable-Roman.drop-hints.1FC,21,41,20,62,63.ttf |    Bin 0 -> 3968 bytes
+ ...ariable-Roman.drop-hints.1FC,21,41,20,62,63.ttx |   1349 -
+ ...urceSerifVariable-Roman.drop-hints.61,62,63.ttf |    Bin 0 -> 3832 bytes
+ ...urceSerifVariable-Roman.drop-hints.61,62,63.ttx |   1262 -
+ ...rifVariable-Roman.drop-hints.D7,D8,D9,DA,DE.ttf |    Bin 0 -> 4396 bytes
+ ...rifVariable-Roman.drop-hints.D7,D8,D9,DA,DE.ttx |   1522 -
+ .../Mplus1p-Regular.default.1D715,1D7D8,41,42.ttf  |    Bin 0 -> 2344 bytes
+ .../Mplus1p-Regular.default.1D715,1D7D8,41,42.ttx  |   1187 -
+ .../japanese/Mplus1p-Regular.default.25771.ttf     |    Bin 0 -> 1992 bytes
+ .../japanese/Mplus1p-Regular.default.25771.ttx     |   1033 -
+ ...gular.default.3042,3044,3046,3048,304A,304B.ttf |    Bin 0 -> 2704 bytes
+ ...gular.default.3042,3044,3046,3048,304A,304B.ttx |   1296 -
+ ...gular.default.3042,3044,3046,73E0,5EA6,8F38.ttf |    Bin 0 -> 2948 bytes
+ ...gular.default.3042,3044,3046,73E0,5EA6,8F38.ttx |   1403 -
+ .../Mplus1p-Regular.default.61,63,65,6B.ttf        |    Bin 0 -> 2324 bytes
+ .../Mplus1p-Regular.default.61,63,65,6B.ttx        |   1172 -
+ ...gular.default.660E,6975,73E0,5EA6,8F38,6E05.ttf |    Bin 0 -> 3244 bytes
+ ...gular.default.660E,6975,73E0,5EA6,8F38,6E05.ttx |   1522 -
+ .../japanese/Mplus1p-Regular.default.660E.ttf      |    Bin 0 -> 1984 bytes
+ .../japanese/Mplus1p-Regular.default.660E.ttx      |   1024 -
+ ...plus1p-Regular.drop-hints.1D715,1D7D8,41,42.ttf |    Bin 0 -> 1616 bytes
+ ...plus1p-Regular.drop-hints.1D715,1D7D8,41,42.ttx |    522 -
+ .../japanese/Mplus1p-Regular.drop-hints.25771.ttf  |    Bin 0 -> 1264 bytes
+ .../japanese/Mplus1p-Regular.drop-hints.25771.ttx  |    368 -
+ ...ar.drop-hints.3042,3044,3046,3048,304A,304B.ttf |    Bin 0 -> 1976 bytes
+ ...ar.drop-hints.3042,3044,3046,3048,304A,304B.ttx |    631 -
+ ...ar.drop-hints.3042,3044,3046,73E0,5EA6,8F38.ttf |    Bin 0 -> 2220 bytes
+ ...ar.drop-hints.3042,3044,3046,73E0,5EA6,8F38.ttx |    738 -
+ .../Mplus1p-Regular.drop-hints.61,63,65,6B.ttf     |    Bin 0 -> 1596 bytes
+ .../Mplus1p-Regular.drop-hints.61,63,65,6B.ttx     |    507 -
+ ...ar.drop-hints.660E,6975,73E0,5EA6,8F38,6E05.ttf |    Bin 0 -> 2516 bytes
+ ...ar.drop-hints.660E,6975,73E0,5EA6,8F38,6E05.ttx |    857 -
+ .../japanese/Mplus1p-Regular.drop-hints.660E.ttf   |    Bin 0 -> 1256 bytes
+ .../japanese/Mplus1p-Regular.drop-hints.660E.ttx   |    359 -
+ ...Mplus1p-Regular.keep-gdef.1D715,1D7D8,41,42.ttf |    Bin 0 -> 2344 bytes
+ ...Mplus1p-Regular.keep-gdef.1D715,1D7D8,41,42.ttx |   1187 -
+ .../japanese/Mplus1p-Regular.keep-gdef.25771.ttf   |    Bin 0 -> 1992 bytes
+ .../japanese/Mplus1p-Regular.keep-gdef.25771.ttx   |   1033 -
+ ...lar.keep-gdef.3042,3044,3046,3048,304A,304B.ttf |    Bin 0 -> 2704 bytes
+ ...lar.keep-gdef.3042,3044,3046,3048,304A,304B.ttx |   1296 -
+ ...lar.keep-gdef.3042,3044,3046,73E0,5EA6,8F38.ttf |    Bin 0 -> 2948 bytes
+ ...lar.keep-gdef.3042,3044,3046,73E0,5EA6,8F38.ttx |   1403 -
+ .../Mplus1p-Regular.keep-gdef.61,63,65,6B.ttf      |    Bin 0 -> 2324 bytes
+ .../Mplus1p-Regular.keep-gdef.61,63,65,6B.ttx      |   1172 -
+ ...lar.keep-gdef.660E,6975,73E0,5EA6,8F38,6E05.ttf |    Bin 0 -> 3244 bytes
+ ...lar.keep-gdef.660E,6975,73E0,5EA6,8F38,6E05.ttx |   1522 -
+ .../japanese/Mplus1p-Regular.keep-gdef.660E.ttf    |    Bin 0 -> 1984 bytes
+ .../japanese/Mplus1p-Regular.keep-gdef.660E.ttx    |   1024 -
+ ...text1_multiple_subrules_f1.default.41,42,43.otf |    Bin 0 -> 1328 bytes
+ ...text1_multiple_subrules_f1.default.41,42,43.ttx |    284 -
+ ...context1_multiple_subrules_f1.default.41,42.otf |    Bin 0 -> 1228 bytes
+ ...context1_multiple_subrules_f1.default.41,42.ttx |    265 -
+ ...context1_multiple_subrules_f1.default.41,43.otf |    Bin 0 -> 1332 bytes
+ ...context1_multiple_subrules_f1.default.41,43.ttx |    275 -
+ ...os_context1_multiple_subrules_f1.default.41.otf |    Bin 0 -> 1216 bytes
+ ...os_context1_multiple_subrules_f1.default.41.ttx |    256 -
+ ...le_subrules_f1.default.retain-all-codepoint.otf |    Bin 0 -> 3700 bytes
+ ...le_subrules_f1.default.retain-all-codepoint.ttx |   1247 -
+ ...1_multiple_subrules_f1.retain-gids.41,42,43.otf |    Bin 0 -> 2028 bytes
+ ...1_multiple_subrules_f1.retain-gids.41,42,43.ttx |    604 -
+ ...ext1_multiple_subrules_f1.retain-gids.41,42.otf |    Bin 0 -> 1932 bytes
+ ...ext1_multiple_subrules_f1.retain-gids.41,42.ttx |    585 -
+ ...ext1_multiple_subrules_f1.retain-gids.41,43.otf |    Bin 0 -> 2048 bytes
+ ...ext1_multiple_subrules_f1.retain-gids.41,43.ttx |    600 -
+ ...ontext1_multiple_subrules_f1.retain-gids.41.otf |    Bin 0 -> 1916 bytes
+ ...ontext1_multiple_subrules_f1.retain-gids.41.ttx |    576 -
+ ...ubrules_f1.retain-gids.retain-all-codepoint.otf |    Bin 0 -> 3700 bytes
+ ...ubrules_f1.retain-gids.retain-all-codepoint.ttx |   1247 -
+ ...text2_multiple_subrules_f1.default.41,42,43.otf |    Bin 0 -> 1328 bytes
+ ...text2_multiple_subrules_f1.default.41,42,43.ttx |    284 -
+ ...context2_multiple_subrules_f1.default.41,42.otf |    Bin 0 -> 1228 bytes
+ ...context2_multiple_subrules_f1.default.41,42.ttx |    265 -
+ ...context2_multiple_subrules_f1.default.41,43.otf |    Bin 0 -> 1332 bytes
+ ...context2_multiple_subrules_f1.default.41,43.ttx |    275 -
+ ...os_context2_multiple_subrules_f1.default.41.otf |    Bin 0 -> 1216 bytes
+ ...os_context2_multiple_subrules_f1.default.41.ttx |    256 -
+ ...le_subrules_f1.default.retain-all-codepoint.otf |    Bin 0 -> 3700 bytes
+ ...le_subrules_f1.default.retain-all-codepoint.ttx |   1247 -
+ ...2_multiple_subrules_f1.retain-gids.41,42,43.otf |    Bin 0 -> 2028 bytes
+ ...2_multiple_subrules_f1.retain-gids.41,42,43.ttx |    604 -
+ ...ext2_multiple_subrules_f1.retain-gids.41,42.otf |    Bin 0 -> 1932 bytes
+ ...ext2_multiple_subrules_f1.retain-gids.41,42.ttx |    585 -
+ ...ext2_multiple_subrules_f1.retain-gids.41,43.otf |    Bin 0 -> 2048 bytes
+ ...ext2_multiple_subrules_f1.retain-gids.41,43.ttx |    600 -
+ ...ontext2_multiple_subrules_f1.retain-gids.41.otf |    Bin 0 -> 1916 bytes
+ ...ontext2_multiple_subrules_f1.retain-gids.41.ttx |    576 -
+ ...ubrules_f1.retain-gids.retain-all-codepoint.otf |    Bin 0 -> 3700 bytes
+ ...ubrules_f1.retain-gids.retain-all-codepoint.ttx |   1247 -
+ .../gpos_context3_simple_f1.default.41,42,43.otf   |    Bin 0 -> 1308 bytes
+ .../gpos_context3_simple_f1.default.41,42,43.ttx   |    284 -
+ .../gpos_context3_simple_f1.default.41,42.otf      |    Bin 0 -> 1208 bytes
+ .../gpos_context3_simple_f1.default.41,42.ttx      |    265 -
+ .../gpos_context3_simple_f1.default.41,43.otf      |    Bin 0 -> 1312 bytes
+ .../gpos_context3_simple_f1.default.41,43.ttx      |    275 -
+ .../gpos_context3_simple_f1.default.41.otf         |    Bin 0 -> 1196 bytes
+ .../gpos_context3_simple_f1.default.41.ttx         |    256 -
+ ...ext3_simple_f1.default.retain-all-codepoint.otf |    Bin 0 -> 3680 bytes
+ ...ext3_simple_f1.default.retain-all-codepoint.ttx |   1247 -
+ ...pos_context3_simple_f1.retain-gids.41,42,43.otf |    Bin 0 -> 2008 bytes
+ ...pos_context3_simple_f1.retain-gids.41,42,43.ttx |    604 -
+ .../gpos_context3_simple_f1.retain-gids.41,42.otf  |    Bin 0 -> 1912 bytes
+ .../gpos_context3_simple_f1.retain-gids.41,42.ttx  |    585 -
+ .../gpos_context3_simple_f1.retain-gids.41,43.otf  |    Bin 0 -> 2028 bytes
+ .../gpos_context3_simple_f1.retain-gids.41,43.ttx  |    600 -
+ .../gpos_context3_simple_f1.retain-gids.41.otf     |    Bin 0 -> 1896 bytes
+ .../gpos_context3_simple_f1.retain-gids.41.ttx     |    576 -
+ ..._simple_f1.retain-gids.retain-all-codepoint.otf |    Bin 0 -> 3680 bytes
+ ..._simple_f1.retain-gids.retain-all-codepoint.ttx |   1247 -
+ .../IndicTestJalandhar-Regular.default.A01.ttf     |    Bin 0 -> 4176 bytes
+ .../IndicTestJalandhar-Regular.default.A01.ttx     |   2916 -
+ .../IndicTestJalandhar-Regular.default.A05,A06.ttf |    Bin 0 -> 4752 bytes
+ .../IndicTestJalandhar-Regular.default.A05,A06.ttx |   3167 -
+ .../IndicTestJalandhar-Regular.default.A07,A1B.ttf |    Bin 0 -> 4724 bytes
+ .../IndicTestJalandhar-Regular.default.A07,A1B.ttx |   3148 -
+ ...andhar-Regular.default.retain-all-codepoint.ttf |    Bin 0 -> 49244 bytes
+ ...andhar-Regular.default.retain-all-codepoint.ttx |  22554 ---
+ .../IndicTestJalandhar-Regular.drop-hints.A01.ttf  |    Bin 0 -> 1036 bytes
+ .../IndicTestJalandhar-Regular.drop-hints.A01.ttx  |    281 -
+ ...dicTestJalandhar-Regular.drop-hints.A05,A06.ttf |    Bin 0 -> 1344 bytes
+ ...dicTestJalandhar-Regular.drop-hints.A05,A06.ttx |    403 -
+ ...dicTestJalandhar-Regular.drop-hints.A07,A1B.ttf |    Bin 0 -> 1344 bytes
+ ...dicTestJalandhar-Regular.drop-hints.A07,A1B.ttx |    404 -
+ ...har-Regular.drop-hints.retain-all-codepoint.ttf |    Bin 0 -> 29464 bytes
+ ...har-Regular.drop-hints.retain-all-codepoint.ttx |  11627 --
+ .../IndicTestJalandhar-Regular.keep-gdef.A01.ttf   |    Bin 0 -> 4176 bytes
+ .../IndicTestJalandhar-Regular.keep-gdef.A01.ttx   |   2916 -
+ ...ndicTestJalandhar-Regular.keep-gdef.A05,A06.ttf |    Bin 0 -> 4752 bytes
+ ...ndicTestJalandhar-Regular.keep-gdef.A05,A06.ttx |   3167 -
+ ...ndicTestJalandhar-Regular.keep-gdef.A07,A1B.ttf |    Bin 0 -> 4724 bytes
+ ...ndicTestJalandhar-Regular.keep-gdef.A07,A1B.ttx |   3148 -
+ ...dhar-Regular.keep-gdef.retain-all-codepoint.ttf |    Bin 0 -> 49244 bytes
+ ...dhar-Regular.keep-gdef.retain-all-codepoint.ttx |  22554 ---
+ .../AdobeVFPrototype.default.41,42,43,57.otf       |    Bin 0 -> 5440 bytes
+ .../AdobeVFPrototype.default.41,42,43,57.ttx       |   1536 -
+ .../AdobeVFPrototype.default.41,42,43.otf          |    Bin 0 -> 4908 bytes
+ .../AdobeVFPrototype.default.41,42,43.ttx          |   1338 -
+ .../AdobeVFPrototype.default.41,42.otf             |    Bin 0 -> 4432 bytes
+ .../AdobeVFPrototype.default.41,42.ttx             |   1201 -
+ .../AdobeVFPrototype.default.41,56,57.otf          |    Bin 0 -> 4576 bytes
+ .../AdobeVFPrototype.default.41,56,57.ttx          |   1310 -
+ .../AdobeVFPrototype.default.41.otf                |    Bin 0 -> 3728 bytes
+ .../AdobeVFPrototype.default.41.ttx                |   1000 -
+ .../AdobeVFPrototype.default.42,57.otf             |    Bin 0 -> 4564 bytes
+ .../AdobeVFPrototype.default.42,57.ttx             |   1253 -
+ .../AdobeVFPrototype.drop-hints.41,42,43,57.otf    |    Bin 0 -> 5252 bytes
+ .../AdobeVFPrototype.drop-hints.41,42,43,57.ttx    |   1500 -
+ .../AdobeVFPrototype.drop-hints.41,42,43.otf       |    Bin 0 -> 4720 bytes
+ .../AdobeVFPrototype.drop-hints.41,42,43.ttx       |   1302 -
+ .../AdobeVFPrototype.drop-hints.41,42.otf          |    Bin 0 -> 4244 bytes
+ .../AdobeVFPrototype.drop-hints.41,42.ttx          |   1165 -
+ .../AdobeVFPrototype.drop-hints.41,56,57.otf       |    Bin 0 -> 4384 bytes
+ .../AdobeVFPrototype.drop-hints.41,56,57.ttx       |   1274 -
+ .../AdobeVFPrototype.drop-hints.41.otf             |    Bin 0 -> 3540 bytes
+ .../AdobeVFPrototype.drop-hints.41.ttx             |    964 -
+ .../AdobeVFPrototype.drop-hints.42,57.otf          |    Bin 0 -> 4376 bytes
+ .../AdobeVFPrototype.drop-hints.42,57.ttx          |   1217 -
+ ...AdobeVFPrototype.keep-gdef-gpos.41,42,43,57.otf |    Bin 0 -> 5440 bytes
+ ...AdobeVFPrototype.keep-gdef-gpos.41,42,43,57.ttx |   1536 -
+ .../AdobeVFPrototype.keep-gdef-gpos.41,42,43.otf   |    Bin 0 -> 4908 bytes
+ .../AdobeVFPrototype.keep-gdef-gpos.41,42,43.ttx   |   1338 -
+ .../AdobeVFPrototype.keep-gdef-gpos.41,42.otf      |    Bin 0 -> 4432 bytes
+ .../AdobeVFPrototype.keep-gdef-gpos.41,42.ttx      |   1201 -
+ .../AdobeVFPrototype.keep-gdef-gpos.41,56,57.otf   |    Bin 0 -> 4576 bytes
+ .../AdobeVFPrototype.keep-gdef-gpos.41,56,57.ttx   |   1310 -
+ .../AdobeVFPrototype.keep-gdef-gpos.41.otf         |    Bin 0 -> 3728 bytes
+ .../AdobeVFPrototype.keep-gdef-gpos.41.ttx         |   1000 -
+ .../AdobeVFPrototype.keep-gdef-gpos.42,57.otf      |    Bin 0 -> 4564 bytes
+ .../AdobeVFPrototype.keep-gdef-gpos.42,57.ttx      |   1253 -
+ .../Roboto-Regular.default.1E00,303.ttf            |    Bin 0 -> 2524 bytes
+ .../Roboto-Regular.default.1E00,303.ttx            |   1258 -
+ .../layout.gdef/Roboto-Regular.default.303.ttf     |    Bin 0 -> 2116 bytes
+ .../layout.gdef/Roboto-Regular.default.303.ttx     |   1012 -
+ .../Roboto-Regular.default.309,20,30F.ttf          |    Bin 0 -> 2212 bytes
+ .../Roboto-Regular.default.309,20,30F.ttx          |   1054 -
+ .../layout.gdef/Roboto-Regular.default.323.ttf     |    Bin 0 -> 2008 bytes
+ .../layout.gdef/Roboto-Regular.default.323.ttx     |    949 -
+ .../Roboto-Regular.default.41,42,43.ttf            |    Bin 0 -> 2572 bytes
+ .../Roboto-Regular.default.41,42,43.ttx            |   1349 -
+ .../Roboto-Regular.drop-hints.1E00,303.ttf         |    Bin 0 -> 1380 bytes
+ .../Roboto-Regular.drop-hints.1E00,303.ttx         |    443 -
+ .../layout.gdef/Roboto-Regular.drop-hints.303.ttf  |    Bin 0 -> 1112 bytes
+ .../layout.gdef/Roboto-Regular.drop-hints.303.ttx  |    312 -
+ .../Roboto-Regular.drop-hints.309,20,30F.ttf       |    Bin 0 -> 1172 bytes
+ .../Roboto-Regular.drop-hints.309,20,30F.ttx       |    328 -
+ .../layout.gdef/Roboto-Regular.drop-hints.323.ttf  |    Bin 0 -> 1056 bytes
+ .../layout.gdef/Roboto-Regular.drop-hints.323.ttx  |    291 -
+ .../Roboto-Regular.drop-hints.41,42,43.ttf         |    Bin 0 -> 1388 bytes
+ .../Roboto-Regular.drop-hints.41,42,43.ttx         |    480 -
+ .../Roboto-Regular.keep-gdef-gpos.1E00,303.ttf     |    Bin 0 -> 2524 bytes
+ .../Roboto-Regular.keep-gdef-gpos.1E00,303.ttx     |   1258 -
+ .../Roboto-Regular.keep-gdef-gpos.303.ttf          |    Bin 0 -> 2116 bytes
+ .../Roboto-Regular.keep-gdef-gpos.303.ttx          |   1012 -
+ .../Roboto-Regular.keep-gdef-gpos.309,20,30F.ttf   |    Bin 0 -> 2212 bytes
+ .../Roboto-Regular.keep-gdef-gpos.309,20,30F.ttx   |   1054 -
+ .../Roboto-Regular.keep-gdef-gpos.323.ttf          |    Bin 0 -> 2008 bytes
+ .../Roboto-Regular.keep-gdef-gpos.323.ttx          |    949 -
+ .../Roboto-Regular.keep-gdef-gpos.41,42,43.ttf     |    Bin 0 -> 2572 bytes
+ .../Roboto-Regular.keep-gdef-gpos.41,42,43.ttx     |   1349 -
+ .../layout.gpos/gpos1_2_font.default.41,43.otf     |    Bin 0 -> 1292 bytes
+ .../layout.gpos/gpos1_2_font.default.41,43.ttx     |    275 -
+ .../layout.gpos/gpos1_2_font.default.41,46.otf     |    Bin 0 -> 1424 bytes
+ .../layout.gpos/gpos1_2_font.default.41,46.ttx     |    286 -
+ .../layout.gpos/gpos1_2_font.default.41.otf        |    Bin 0 -> 1176 bytes
+ .../layout.gpos/gpos1_2_font.default.41.ttx        |    256 -
+ .../layout.gpos/gpos1_2_font.default.42,44.otf     |    Bin 0 -> 1268 bytes
+ .../layout.gpos/gpos1_2_font.default.42,44.ttx     |    265 -
+ .../layout.gpos/gpos1_2_font.default.43,46.otf     |    Bin 0 -> 1288 bytes
+ .../layout.gpos/gpos1_2_font.default.43,46.ttx     |    275 -
+ .../gpos1_2_font.default.retain-all-codepoint.otf  |    Bin 0 -> 3604 bytes
+ .../gpos1_2_font.default.retain-all-codepoint.ttx  |   1221 -
+ .../layout.gpos/gpos1_2_font.retain-gids.41,43.otf |    Bin 0 -> 2008 bytes
+ .../layout.gpos/gpos1_2_font.retain-gids.41,43.ttx |    600 -
+ .../layout.gpos/gpos1_2_font.retain-gids.41,46.otf |    Bin 0 -> 2172 bytes
+ .../layout.gpos/gpos1_2_font.retain-gids.41,46.ttx |    626 -
+ .../layout.gpos/gpos1_2_font.retain-gids.41.otf    |    Bin 0 -> 1876 bytes
+ .../layout.gpos/gpos1_2_font.retain-gids.41.ttx    |    576 -
+ .../layout.gpos/gpos1_2_font.retain-gids.42,44.otf |    Bin 0 -> 1992 bytes
+ .../layout.gpos/gpos1_2_font.retain-gids.42,44.ttx |    595 -
+ .../layout.gpos/gpos1_2_font.retain-gids.43,46.otf |    Bin 0 -> 2036 bytes
+ .../layout.gpos/gpos1_2_font.retain-gids.43,46.ttx |    615 -
+ ...os1_2_font.retain-gids.retain-all-codepoint.otf |    Bin 0 -> 3604 bytes
+ ...os1_2_font.retain-gids.retain-all-codepoint.ttx |   1221 -
+ .../gpos2_1_font7.default.21,23,25.otf             |    Bin 0 -> 1360 bytes
+ .../gpos2_1_font7.default.21,23,25.ttx             |    287 -
+ .../layout.gpos2/gpos2_1_font7.default.21,23.otf   |    Bin 0 -> 1240 bytes
+ .../layout.gpos2/gpos2_1_font7.default.21,23.ttx   |    268 -
+ .../layout.gpos2/gpos2_1_font7.default.2E,23.otf   |    Bin 0 -> 1508 bytes
+ .../layout.gpos2/gpos2_1_font7.default.2E,23.ttx   |    291 -
+ .../gpos2_1_font7.default.41,42,43.otf             |    Bin 0 -> 1288 bytes
+ .../gpos2_1_font7.default.41,42,43.ttx             |    284 -
+ .../gpos2_1_font7.default.retain-all-codepoint.otf |    Bin 0 -> 3604 bytes
+ .../gpos2_1_font7.default.retain-all-codepoint.ttx |   1221 -
+ .../gpos2_1_font7.retain-gids.21,23,25.otf         |    Bin 0 -> 1696 bytes
+ .../gpos2_1_font7.retain-gids.21,23,25.ttx         |    457 -
+ .../gpos2_1_font7.retain-gids.21,23.otf            |    Bin 0 -> 1564 bytes
+ .../gpos2_1_font7.retain-gids.21,23.ttx            |    433 -
+ .../gpos2_1_font7.retain-gids.2E,23.otf            |    Bin 0 -> 1944 bytes
+ .../gpos2_1_font7.retain-gids.2E,23.ttx            |    511 -
+ .../gpos2_1_font7.retain-gids.41,42,43.otf         |    Bin 0 -> 1988 bytes
+ .../gpos2_1_font7.retain-gids.41,42,43.ttx         |    604 -
+ ...s2_1_font7.retain-gids.retain-all-codepoint.otf |    Bin 0 -> 3604 bytes
+ ...s2_1_font7.retain-gids.retain-all-codepoint.ttx |   1221 -
+ .../gpos2_2_font5.default.21,23,25.otf             |    Bin 0 -> 1360 bytes
+ .../gpos2_2_font5.default.21,23,25.ttx             |    287 -
+ .../layout.gpos2/gpos2_2_font5.default.21,23.otf   |    Bin 0 -> 1240 bytes
+ .../layout.gpos2/gpos2_2_font5.default.21,23.ttx   |    268 -
+ .../layout.gpos2/gpos2_2_font5.default.2E,23.otf   |    Bin 0 -> 1508 bytes
+ .../layout.gpos2/gpos2_2_font5.default.2E,23.ttx   |    291 -
+ .../gpos2_2_font5.default.41,42,43.otf             |    Bin 0 -> 1288 bytes
+ .../gpos2_2_font5.default.41,42,43.ttx             |    284 -
+ .../gpos2_2_font5.default.retain-all-codepoint.otf |    Bin 0 -> 3604 bytes
+ .../gpos2_2_font5.default.retain-all-codepoint.ttx |   1221 -
+ .../gpos2_2_font5.retain-gids.21,23,25.otf         |    Bin 0 -> 1696 bytes
+ .../gpos2_2_font5.retain-gids.21,23,25.ttx         |    457 -
+ .../gpos2_2_font5.retain-gids.21,23.otf            |    Bin 0 -> 1564 bytes
+ .../gpos2_2_font5.retain-gids.21,23.ttx            |    433 -
+ .../gpos2_2_font5.retain-gids.2E,23.otf            |    Bin 0 -> 1944 bytes
+ .../gpos2_2_font5.retain-gids.2E,23.ttx            |    511 -
+ .../gpos2_2_font5.retain-gids.41,42,43.otf         |    Bin 0 -> 1988 bytes
+ .../gpos2_2_font5.retain-gids.41,42,43.ttx         |    604 -
+ ...s2_2_font5.retain-gids.retain-all-codepoint.otf |    Bin 0 -> 3604 bytes
+ ...s2_2_font5.retain-gids.retain-all-codepoint.ttx |   1221 -
+ .../layout.gpos3/gpos3_font3.default.28,29.otf     |    Bin 0 -> 1248 bytes
+ .../layout.gpos3/gpos3_font3.default.28,29.ttx     |    276 -
+ .../layout.gpos3/gpos3_font3.default.28,2B.otf     |    Bin 0 -> 1376 bytes
+ .../layout.gpos3/gpos3_font3.default.28,2B.ttx     |    282 -
+ .../layout.gpos3/gpos3_font3.default.29,2B.otf     |    Bin 0 -> 1292 bytes
+ .../layout.gpos3/gpos3_font3.default.29,2B.ttx     |    277 -
+ .../layout.gpos3/gpos3_font3.default.41,42,43.otf  |    Bin 0 -> 1284 bytes
+ .../layout.gpos3/gpos3_font3.default.41,42,43.ttx  |    284 -
+ .../gpos3_font3.default.retain-all-codepoint.otf   |    Bin 0 -> 3636 bytes
+ .../gpos3_font3.default.retain-all-codepoint.ttx   |   1228 -
+ .../layout.gpos3/gpos3_font3.retain-gids.28,29.otf |    Bin 0 -> 1632 bytes
+ .../layout.gpos3/gpos3_font3.retain-gids.28,29.ttx |    471 -
+ .../layout.gpos3/gpos3_font3.retain-gids.28,2B.otf |    Bin 0 -> 1780 bytes
+ .../layout.gpos3/gpos3_font3.retain-gids.28,2B.ttx |    487 -
+ .../layout.gpos3/gpos3_font3.retain-gids.29,2B.otf |    Bin 0 -> 1696 bytes
+ .../layout.gpos3/gpos3_font3.retain-gids.29,2B.ttx |    482 -
+ .../gpos3_font3.retain-gids.41,42,43.otf           |    Bin 0 -> 1984 bytes
+ .../gpos3_font3.retain-gids.41,42,43.ttx           |    604 -
+ ...pos3_font3.retain-gids.retain-all-codepoint.otf |    Bin 0 -> 3636 bytes
+ ...pos3_font3.retain-gids.retain-all-codepoint.ttx |   1228 -
+ ...pos4_multiple_anchors_1.default.41,42,43,44.otf |    Bin 0 -> 1516 bytes
+ ...pos4_multiple_anchors_1.default.41,42,43,44.ttx |    304 -
+ ...pos4_multiple_anchors_1.default.41,42,43,45.otf |    Bin 0 -> 1524 bytes
+ ...pos4_multiple_anchors_1.default.41,42,43,45.ttx |    305 -
+ .../gpos4_multiple_anchors_1.default.41,42,43.otf  |    Bin 0 -> 1308 bytes
+ .../gpos4_multiple_anchors_1.default.41,42,43.ttx  |    284 -
+ .../gpos4_multiple_anchors_1.default.41,42.otf     |    Bin 0 -> 1208 bytes
+ .../gpos4_multiple_anchors_1.default.41,42.ttx     |    265 -
+ ...4_multiple_anchors_1.default.41,43,44,45,46.otf |    Bin 0 -> 1864 bytes
+ ...4_multiple_anchors_1.default.41,43,44,45,46.ttx |    336 -
+ .../gpos4_multiple_anchors_1.default.41,43,44.otf  |    Bin 0 -> 1524 bytes
+ .../gpos4_multiple_anchors_1.default.41,43,44.ttx  |    295 -
+ .../gpos4_multiple_anchors_1.default.41,43,45.otf  |    Bin 0 -> 1532 bytes
+ .../gpos4_multiple_anchors_1.default.41,43,45.ttx  |    296 -
+ .../gpos4_multiple_anchors_1.default.41,43.otf     |    Bin 0 -> 1312 bytes
+ .../gpos4_multiple_anchors_1.default.41,43.ttx     |    275 -
+ .../gpos4_multiple_anchors_1.default.41.otf        |    Bin 0 -> 1196 bytes
+ .../gpos4_multiple_anchors_1.default.41.ttx        |    256 -
+ ...iple_anchors_1.default.retain-all-codepoint.otf |    Bin 0 -> 3668 bytes
+ ...iple_anchors_1.default.retain-all-codepoint.ttx |   1233 -
+ ..._multiple_anchors_1.retain-gids.41,42,43,44.otf |    Bin 0 -> 2220 bytes
+ ..._multiple_anchors_1.retain-gids.41,42,43,44.ttx |    624 -
+ ..._multiple_anchors_1.retain-gids.41,42,43,45.otf |    Bin 0 -> 2244 bytes
+ ..._multiple_anchors_1.retain-gids.41,42,43,45.ttx |    630 -
+ ...os4_multiple_anchors_1.retain-gids.41,42,43.otf |    Bin 0 -> 2008 bytes
+ ...os4_multiple_anchors_1.retain-gids.41,42,43.ttx |    604 -
+ .../gpos4_multiple_anchors_1.retain-gids.41,42.otf |    Bin 0 -> 1912 bytes
+ .../gpos4_multiple_anchors_1.retain-gids.41,42.ttx |    585 -
+ ...ltiple_anchors_1.retain-gids.41,43,44,45,46.otf |    Bin 0 -> 2584 bytes
+ ...ltiple_anchors_1.retain-gids.41,43,44,45,46.ttx |    661 -
+ ...os4_multiple_anchors_1.retain-gids.41,43,44.otf |    Bin 0 -> 2240 bytes
+ ...os4_multiple_anchors_1.retain-gids.41,43,44.ttx |    620 -
+ ...os4_multiple_anchors_1.retain-gids.41,43,45.otf |    Bin 0 -> 2260 bytes
+ ...os4_multiple_anchors_1.retain-gids.41,43,45.ttx |    626 -
+ .../gpos4_multiple_anchors_1.retain-gids.41,43.otf |    Bin 0 -> 2028 bytes
+ .../gpos4_multiple_anchors_1.retain-gids.41,43.ttx |    600 -
+ .../gpos4_multiple_anchors_1.retain-gids.41.otf    |    Bin 0 -> 1896 bytes
+ .../gpos4_multiple_anchors_1.retain-gids.41.ttx    |    576 -
+ ..._anchors_1.retain-gids.retain-all-codepoint.otf |    Bin 0 -> 3668 bytes
+ ..._anchors_1.retain-gids.retain-all-codepoint.ttx |   1233 -
+ .../gpos5_font1.default.41,42,43,44.otf            |    Bin 0 -> 1536 bytes
+ .../gpos5_font1.default.41,42,43,44.ttx            |    323 -
+ .../gpos5_font1.default.41,42,43,45.otf            |    Bin 0 -> 1544 bytes
+ .../gpos5_font1.default.41,42,43,45.ttx            |    324 -
+ .../layout.gpos5/gpos5_font1.default.41,42,43.otf  |    Bin 0 -> 1328 bytes
+ .../layout.gpos5/gpos5_font1.default.41,42,43.ttx  |    303 -
+ .../layout.gpos5/gpos5_font1.default.41,42,44.otf  |    Bin 0 -> 1460 bytes
+ .../layout.gpos5/gpos5_font1.default.41,42,44.ttx  |    304 -
+ .../layout.gpos5/gpos5_font1.default.41,42,45.otf  |    Bin 0 -> 1448 bytes
+ .../layout.gpos5/gpos5_font1.default.41,42,45.ttx  |    305 -
+ .../layout.gpos5/gpos5_font1.default.41,42.otf     |    Bin 0 -> 1228 bytes
+ .../layout.gpos5/gpos5_font1.default.41,42.ttx     |    284 -
+ .../layout.gpos5/gpos5_font1.default.41,43.otf     |    Bin 0 -> 1332 bytes
+ .../layout.gpos5/gpos5_font1.default.41,43.ttx     |    294 -
+ .../layout.gpos5/gpos5_font1.default.41.otf        |    Bin 0 -> 1216 bytes
+ .../layout.gpos5/gpos5_font1.default.41.ttx        |    275 -
+ .../layout.gpos5/gpos5_font1.default.42.otf        |    Bin 0 -> 1076 bytes
+ .../layout.gpos5/gpos5_font1.default.42.ttx        |    264 -
+ .../gpos5_font1.default.retain-all-codepoint.otf   |    Bin 0 -> 3688 bytes
+ .../gpos5_font1.default.retain-all-codepoint.ttx   |   1250 -
+ .../gpos5_font1.retain-gids.41,42,43,44.otf        |    Bin 0 -> 2240 bytes
+ .../gpos5_font1.retain-gids.41,42,43,44.ttx        |    643 -
+ .../gpos5_font1.retain-gids.41,42,43,45.otf        |    Bin 0 -> 2264 bytes
+ .../gpos5_font1.retain-gids.41,42,43,45.ttx        |    649 -
+ .../gpos5_font1.retain-gids.41,42,43.otf           |    Bin 0 -> 2028 bytes
+ .../gpos5_font1.retain-gids.41,42,43.ttx           |    623 -
+ .../gpos5_font1.retain-gids.41,42,44.otf           |    Bin 0 -> 2176 bytes
+ .../gpos5_font1.retain-gids.41,42,44.ttx           |    629 -
+ .../gpos5_font1.retain-gids.41,42,45.otf           |    Bin 0 -> 2172 bytes
+ .../gpos5_font1.retain-gids.41,42,45.ttx           |    635 -
+ .../layout.gpos5/gpos5_font1.retain-gids.41,42.otf |    Bin 0 -> 1932 bytes
+ .../layout.gpos5/gpos5_font1.retain-gids.41,42.ttx |    604 -
+ .../layout.gpos5/gpos5_font1.retain-gids.41,43.otf |    Bin 0 -> 2048 bytes
+ .../layout.gpos5/gpos5_font1.retain-gids.41,43.ttx |    619 -
+ .../layout.gpos5/gpos5_font1.retain-gids.41.otf    |    Bin 0 -> 1916 bytes
+ .../layout.gpos5/gpos5_font1.retain-gids.41.ttx    |    595 -
+ .../layout.gpos5/gpos5_font1.retain-gids.42.otf    |    Bin 0 -> 1788 bytes
+ .../layout.gpos5/gpos5_font1.retain-gids.42.ttx    |    589 -
+ ...pos5_font1.retain-gids.retain-all-codepoint.otf |    Bin 0 -> 3688 bytes
+ ...pos5_font1.retain-gids.retain-all-codepoint.ttx |   1250 -
+ .../gpos6_font1.default.41,42,43,44.otf            |    Bin 0 -> 1492 bytes
+ .../gpos6_font1.default.41,42,43,44.ttx            |    304 -
+ .../gpos6_font1.default.41,42,43,45.otf            |    Bin 0 -> 1500 bytes
+ .../gpos6_font1.default.41,42,43,45.ttx            |    305 -
+ .../layout.gpos6/gpos6_font1.default.41,42,43.otf  |    Bin 0 -> 1284 bytes
+ .../layout.gpos6/gpos6_font1.default.41,42,43.ttx  |    284 -
+ .../layout.gpos6/gpos6_font1.default.41,42.otf     |    Bin 0 -> 1184 bytes
+ .../layout.gpos6/gpos6_font1.default.41,42.ttx     |    265 -
+ .../gpos6_font1.default.41,43,44,45,46.otf         |    Bin 0 -> 1840 bytes
+ .../gpos6_font1.default.41,43,44,45,46.ttx         |    336 -
+ .../layout.gpos6/gpos6_font1.default.41,43,44.otf  |    Bin 0 -> 1500 bytes
+ .../layout.gpos6/gpos6_font1.default.41,43,44.ttx  |    295 -
+ .../layout.gpos6/gpos6_font1.default.41,43,45.otf  |    Bin 0 -> 1508 bytes
+ .../layout.gpos6/gpos6_font1.default.41,43,45.ttx  |    296 -
+ .../layout.gpos6/gpos6_font1.default.41,43.otf     |    Bin 0 -> 1288 bytes
+ .../layout.gpos6/gpos6_font1.default.41,43.ttx     |    275 -
+ .../layout.gpos6/gpos6_font1.default.41.otf        |    Bin 0 -> 1172 bytes
+ .../layout.gpos6/gpos6_font1.default.41.ttx        |    256 -
+ .../gpos6_font1.default.retain-all-codepoint.otf   |    Bin 0 -> 3644 bytes
+ .../gpos6_font1.default.retain-all-codepoint.ttx   |   1231 -
+ .../gpos6_font1.retain-gids.41,42,43,44.otf        |    Bin 0 -> 2196 bytes
+ .../gpos6_font1.retain-gids.41,42,43,44.ttx        |    624 -
+ .../gpos6_font1.retain-gids.41,42,43,45.otf        |    Bin 0 -> 2220 bytes
+ .../gpos6_font1.retain-gids.41,42,43,45.ttx        |    630 -
+ .../gpos6_font1.retain-gids.41,42,43.otf           |    Bin 0 -> 1984 bytes
+ .../gpos6_font1.retain-gids.41,42,43.ttx           |    604 -
+ .../layout.gpos6/gpos6_font1.retain-gids.41,42.otf |    Bin 0 -> 1888 bytes
+ .../layout.gpos6/gpos6_font1.retain-gids.41,42.ttx |    585 -
+ .../gpos6_font1.retain-gids.41,43,44,45,46.otf     |    Bin 0 -> 2560 bytes
+ .../gpos6_font1.retain-gids.41,43,44,45,46.ttx     |    661 -
+ .../gpos6_font1.retain-gids.41,43,44.otf           |    Bin 0 -> 2216 bytes
+ .../gpos6_font1.retain-gids.41,43,44.ttx           |    620 -
+ .../gpos6_font1.retain-gids.41,43,45.otf           |    Bin 0 -> 2236 bytes
+ .../gpos6_font1.retain-gids.41,43,45.ttx           |    626 -
+ .../layout.gpos6/gpos6_font1.retain-gids.41,43.otf |    Bin 0 -> 2004 bytes
+ .../layout.gpos6/gpos6_font1.retain-gids.41,43.ttx |    600 -
+ .../layout.gpos6/gpos6_font1.retain-gids.41.otf    |    Bin 0 -> 1872 bytes
+ .../layout.gpos6/gpos6_font1.retain-gids.41.ttx    |    576 -
+ ...pos6_font1.retain-gids.retain-all-codepoint.otf |    Bin 0 -> 3644 bytes
+ ...pos6_font1.retain-gids.retain-all-codepoint.ttx |   1231 -
+ ...ular.default.627,644,623,62D,644,627,645,2E.ttf |    Bin 0 -> 12684 bytes
+ ...ular.default.627,644,623,62D,644,627,645,2E.ttx |   4529 -
+ .../Amiri-Regular.default.627,644,62D,628.ttf      |    Bin 0 -> 9992 bytes
+ .../Amiri-Regular.default.627,644,62D,628.ttx      |   3537 -
+ .../Amiri-Regular.default.627,644.ttf              |    Bin 0 -> 4168 bytes
+ .../Amiri-Regular.default.627,644.ttx              |   1383 -
+ ...-Regular.default.633,645,627,621,20,644,627.ttf |    Bin 0 -> 9516 bytes
+ ...-Regular.default.633,645,627,621,20,644,627.ttx |   3371 -
+ .../Amiri-Regular.default.63A,64A,631.ttf          |    Bin 0 -> 7324 bytes
+ .../Amiri-Regular.default.63A,64A,631.ttx          |   2587 -
+ ....retain-gids.627,644,623,62D,644,627,645,2E.ttf |    Bin 0 -> 48012 bytes
+ ....retain-gids.627,644,623,62D,644,627,645,2E.ttx |  28725 ----
+ .../Amiri-Regular.retain-gids.627,644,62D,628.ttf  |    Bin 0 -> 42640 bytes
+ .../Amiri-Regular.retain-gids.627,644,62D,628.ttx  |  25101 ----
+ .../Amiri-Regular.retain-gids.627,644.ttf          |    Bin 0 -> 36696 bytes
+ .../Amiri-Regular.retain-gids.627,644.ttx          |  23003 ---
+ ...ular.retain-gids.633,645,627,621,20,644,627.ttf |    Bin 0 -> 45908 bytes
+ ...ular.retain-gids.633,645,627,621,20,644,627.ttx |  27759 ----
+ .../Amiri-Regular.retain-gids.63A,64A,631.ttf      |    Bin 0 -> 37988 bytes
+ .../Amiri-Regular.retain-gids.63A,64A,631.ttx      |  22911 ---
+ ...g1_multiple_subrules_f1.default.30,31,32,33.otf |    Bin 0 -> 1840 bytes
+ ...g1_multiple_subrules_f1.default.30,31,32,33.ttx |    328 -
+ ...ning1_multiple_subrules_f1.default.41,42,43.otf |    Bin 0 -> 1332 bytes
+ ...ning1_multiple_subrules_f1.default.41,42,43.ttx |    284 -
+ ...le_subrules_f1.default.retain-all-codepoint.otf |    Bin 0 -> 3704 bytes
+ ...le_subrules_f1.default.retain-all-codepoint.ttx |   1247 -
+ ...ultiple_subrules_f1.retain-gids.30,31,32,33.otf |    Bin 0 -> 2304 bytes
+ ...ultiple_subrules_f1.retain-gids.30,31,32,33.ttx |    563 -
+ ...1_multiple_subrules_f1.retain-gids.41,42,43.otf |    Bin 0 -> 2032 bytes
+ ...1_multiple_subrules_f1.retain-gids.41,42,43.ttx |    604 -
+ ...ubrules_f1.retain-gids.retain-all-codepoint.otf |    Bin 0 -> 3704 bytes
+ ...ubrules_f1.retain-gids.retain-all-codepoint.ttx |   1247 -
+ ...g2_multiple_subrules_f1.default.30,31,32,33.otf |    Bin 0 -> 1840 bytes
+ ...g2_multiple_subrules_f1.default.30,31,32,33.ttx |    328 -
+ ...ning2_multiple_subrules_f1.default.41,42,43.otf |    Bin 0 -> 1332 bytes
+ ...ning2_multiple_subrules_f1.default.41,42,43.ttx |    284 -
+ ...le_subrules_f1.default.retain-all-codepoint.otf |    Bin 0 -> 3704 bytes
+ ...le_subrules_f1.default.retain-all-codepoint.ttx |   1247 -
+ ...ultiple_subrules_f1.retain-gids.30,31,32,33.otf |    Bin 0 -> 2304 bytes
+ ...ultiple_subrules_f1.retain-gids.30,31,32,33.ttx |    563 -
+ ...2_multiple_subrules_f1.retain-gids.41,42,43.otf |    Bin 0 -> 2032 bytes
+ ...2_multiple_subrules_f1.retain-gids.41,42,43.ttx |    604 -
+ ...ubrules_f1.retain-gids.retain-all-codepoint.otf |    Bin 0 -> 3704 bytes
+ ...ubrules_f1.retain-gids.retain-all-codepoint.ttx |   1247 -
+ ...pos_chaining3_simple_f1.default.30,31,32,33.otf |    Bin 0 -> 1816 bytes
+ ...pos_chaining3_simple_f1.default.30,31,32,33.ttx |    328 -
+ .../gpos_chaining3_simple_f1.default.41,42,43.otf  |    Bin 0 -> 1308 bytes
+ .../gpos_chaining3_simple_f1.default.41,42,43.ttx  |    284 -
+ ...ing3_simple_f1.default.retain-all-codepoint.otf |    Bin 0 -> 3680 bytes
+ ...ing3_simple_f1.default.retain-all-codepoint.ttx |   1247 -
+ ...chaining3_simple_f1.retain-gids.30,31,32,33.otf |    Bin 0 -> 2280 bytes
+ ...chaining3_simple_f1.retain-gids.30,31,32,33.ttx |    563 -
+ ...os_chaining3_simple_f1.retain-gids.41,42,43.otf |    Bin 0 -> 2008 bytes
+ ...os_chaining3_simple_f1.retain-gids.41,42,43.ttx |    604 -
+ ..._simple_f1.retain-gids.retain-all-codepoint.otf |    Bin 0 -> 3680 bytes
+ ..._simple_f1.retain-gids.retain-all-codepoint.ttx |   1247 -
+ .../layout.gpos9/gpos9_font2.default.41,42.otf     |    Bin 0 -> 1184 bytes
+ .../layout.gpos9/gpos9_font2.default.41,42.ttx     |    265 -
+ .../layout.gpos9/gpos9_font2.default.41.otf        |    Bin 0 -> 1172 bytes
+ .../layout.gpos9/gpos9_font2.default.41.ttx        |    256 -
+ .../layout.gpos9/gpos9_font2.default.42.otf        |    Bin 0 -> 1032 bytes
+ .../layout.gpos9/gpos9_font2.default.42.ttx        |    245 -
+ .../layout.gpos9/gpos9_font2.retain-gids.41,42.otf |    Bin 0 -> 1888 bytes
+ .../layout.gpos9/gpos9_font2.retain-gids.41,42.ttx |    585 -
+ .../layout.gpos9/gpos9_font2.retain-gids.41.otf    |    Bin 0 -> 1872 bytes
+ .../layout.gpos9/gpos9_font2.retain-gids.41.ttx    |    576 -
+ .../layout.gpos9/gpos9_font2.retain-gids.42.otf    |    Bin 0 -> 1744 bytes
+ .../layout.gpos9/gpos9_font2.retain-gids.42.ttx    |    570 -
+ ...ub_alternate_substitution.default.53A9,53F1.otf |    Bin 0 -> 4348 bytes
+ ...ub_alternate_substitution.default.53A9,53F1.ttx |   1009 -
+ .../gsub_alternate_substitution.default.53A9.otf   |    Bin 0 -> 3904 bytes
+ .../gsub_alternate_substitution.default.53A9.ttx   |    924 -
+ .../gsub_alternate_substitution.default.53F1.otf   |    Bin 0 -> 2452 bytes
+ .../gsub_alternate_substitution.default.53F1.ttx   |    638 -
+ ...e_substitution.default.retain-all-codepoint.otf |    Bin 0 -> 6040 bytes
+ ...e_substitution.default.retain-all-codepoint.ttx |   1387 -
+ ...lternate_substitution.retain-gids.53A9,53F1.otf |    Bin 0 -> 4472 bytes
+ ...lternate_substitution.retain-gids.53A9,53F1.ttx |   1063 -
+ ...sub_alternate_substitution.retain-gids.53A9.otf |    Bin 0 -> 4056 bytes
+ ...sub_alternate_substitution.retain-gids.53A9.ttx |    990 -
+ ...sub_alternate_substitution.retain-gids.53F1.otf |    Bin 0 -> 2648 bytes
+ ...sub_alternate_substitution.retain-gids.53F1.ttx |    728 -
+ ...bstitution.retain-gids.retain-all-codepoint.otf |    Bin 0 -> 6132 bytes
+ ...bstitution.retain-gids.retain-all-codepoint.ttx |   1423 -
+ ...text1_multiple_subrules_f2.default.41,42,43.otf |    Bin 0 -> 1340 bytes
+ ...text1_multiple_subrules_f2.default.41,42,43.ttx |    290 -
+ ...context1_multiple_subrules_f2.default.41,42.otf |    Bin 0 -> 1240 bytes
+ ...context1_multiple_subrules_f2.default.41,42.ttx |    271 -
+ ...context1_multiple_subrules_f2.default.41,43.otf |    Bin 0 -> 1344 bytes
+ ...context1_multiple_subrules_f2.default.41,43.ttx |    281 -
+ ...ub_context1_multiple_subrules_f2.default.41.otf |    Bin 0 -> 1228 bytes
+ ...ub_context1_multiple_subrules_f2.default.41.ttx |    262 -
+ ...le_subrules_f2.default.retain-all-codepoint.otf |    Bin 0 -> 3712 bytes
+ ...le_subrules_f2.default.retain-all-codepoint.ttx |   1253 -
+ ...1_multiple_subrules_f2.retain-gids.41,42,43.otf |    Bin 0 -> 2040 bytes
+ ...1_multiple_subrules_f2.retain-gids.41,42,43.ttx |    610 -
+ ...ext1_multiple_subrules_f2.retain-gids.41,42.otf |    Bin 0 -> 1944 bytes
+ ...ext1_multiple_subrules_f2.retain-gids.41,42.ttx |    591 -
+ ...ext1_multiple_subrules_f2.retain-gids.41,43.otf |    Bin 0 -> 2060 bytes
+ ...ext1_multiple_subrules_f2.retain-gids.41,43.ttx |    606 -
+ ...ontext1_multiple_subrules_f2.retain-gids.41.otf |    Bin 0 -> 1928 bytes
+ ...ontext1_multiple_subrules_f2.retain-gids.41.ttx |    582 -
+ ...ubrules_f2.retain-gids.retain-all-codepoint.otf |    Bin 0 -> 3712 bytes
+ ...ubrules_f2.retain-gids.retain-all-codepoint.ttx |   1253 -
+ ...text2_multiple_subrules_f2.default.41,42,43.otf |    Bin 0 -> 1340 bytes
+ ...text2_multiple_subrules_f2.default.41,42,43.ttx |    290 -
+ ...context2_multiple_subrules_f2.default.41,42.otf |    Bin 0 -> 1240 bytes
+ ...context2_multiple_subrules_f2.default.41,42.ttx |    271 -
+ ...context2_multiple_subrules_f2.default.41,43.otf |    Bin 0 -> 1344 bytes
+ ...context2_multiple_subrules_f2.default.41,43.ttx |    281 -
+ ...ub_context2_multiple_subrules_f2.default.41.otf |    Bin 0 -> 1228 bytes
+ ...ub_context2_multiple_subrules_f2.default.41.ttx |    262 -
+ ...le_subrules_f2.default.retain-all-codepoint.otf |    Bin 0 -> 3712 bytes
+ ...le_subrules_f2.default.retain-all-codepoint.ttx |   1253 -
+ ...2_multiple_subrules_f2.retain-gids.41,42,43.otf |    Bin 0 -> 2040 bytes
+ ...2_multiple_subrules_f2.retain-gids.41,42,43.ttx |    610 -
+ ...ext2_multiple_subrules_f2.retain-gids.41,42.otf |    Bin 0 -> 1944 bytes
+ ...ext2_multiple_subrules_f2.retain-gids.41,42.ttx |    591 -
+ ...ext2_multiple_subrules_f2.retain-gids.41,43.otf |    Bin 0 -> 2060 bytes
+ ...ext2_multiple_subrules_f2.retain-gids.41,43.ttx |    606 -
+ ...ontext2_multiple_subrules_f2.retain-gids.41.otf |    Bin 0 -> 1928 bytes
+ ...ontext2_multiple_subrules_f2.retain-gids.41.ttx |    582 -
+ ...ubrules_f2.retain-gids.retain-all-codepoint.otf |    Bin 0 -> 3712 bytes
+ ...ubrules_f2.retain-gids.retain-all-codepoint.ttx |   1253 -
+ ...sub_context3_successive_f1.default.41,42,43.otf |    Bin 0 -> 1328 bytes
+ ...sub_context3_successive_f1.default.41,42,43.ttx |    290 -
+ .../gsub_context3_successive_f1.default.41,42.otf  |    Bin 0 -> 1228 bytes
+ .../gsub_context3_successive_f1.default.41,42.ttx  |    271 -
+ .../gsub_context3_successive_f1.default.41,43.otf  |    Bin 0 -> 1332 bytes
+ .../gsub_context3_successive_f1.default.41,43.ttx  |    281 -
+ .../gsub_context3_successive_f1.default.41.otf     |    Bin 0 -> 1216 bytes
+ .../gsub_context3_successive_f1.default.41.ttx     |    262 -
+ ..._successive_f1.default.retain-all-codepoint.otf |    Bin 0 -> 3700 bytes
+ ..._successive_f1.default.retain-all-codepoint.ttx |   1253 -
+ ...context3_successive_f1.retain-gids.41,42,43.otf |    Bin 0 -> 2028 bytes
+ ...context3_successive_f1.retain-gids.41,42,43.ttx |    610 -
+ ...ub_context3_successive_f1.retain-gids.41,42.otf |    Bin 0 -> 1932 bytes
+ ...ub_context3_successive_f1.retain-gids.41,42.ttx |    591 -
+ ...ub_context3_successive_f1.retain-gids.41,43.otf |    Bin 0 -> 2048 bytes
+ ...ub_context3_successive_f1.retain-gids.41,43.ttx |    606 -
+ .../gsub_context3_successive_f1.retain-gids.41.otf |    Bin 0 -> 1916 bytes
+ .../gsub_context3_successive_f1.retain-gids.41.ttx |    582 -
+ ...cessive_f1.retain-gids.retain-all-codepoint.otf |    Bin 0 -> 3700 bytes
+ ...cessive_f1.retain-gids.retain-all-codepoint.ttx |   1253 -
+ ...g1_multiple_subrules_f1.default.30,31,32,33.otf |    Bin 0 -> 1852 bytes
+ ...g1_multiple_subrules_f1.default.30,31,32,33.ttx |    334 -
+ ...ning1_multiple_subrules_f1.default.41,42,43.otf |    Bin 0 -> 1344 bytes
+ ...ning1_multiple_subrules_f1.default.41,42,43.ttx |    290 -
+ ...le_subrules_f1.default.retain-all-codepoint.otf |    Bin 0 -> 3716 bytes
+ ...le_subrules_f1.default.retain-all-codepoint.ttx |   1253 -
+ ...ultiple_subrules_f1.retain-gids.30,31,32,33.otf |    Bin 0 -> 2316 bytes
+ ...ultiple_subrules_f1.retain-gids.30,31,32,33.ttx |    569 -
+ ...1_multiple_subrules_f1.retain-gids.41,42,43.otf |    Bin 0 -> 2044 bytes
+ ...1_multiple_subrules_f1.retain-gids.41,42,43.ttx |    610 -
+ ...ubrules_f1.retain-gids.retain-all-codepoint.otf |    Bin 0 -> 3716 bytes
+ ...ubrules_f1.retain-gids.retain-all-codepoint.ttx |   1253 -
+ ...g2_multiple_subrules_f1.default.30,31,32,33.otf |    Bin 0 -> 1852 bytes
+ ...g2_multiple_subrules_f1.default.30,31,32,33.ttx |    334 -
+ ...ning2_multiple_subrules_f1.default.41,42,43.otf |    Bin 0 -> 1344 bytes
+ ...ning2_multiple_subrules_f1.default.41,42,43.ttx |    290 -
+ ...le_subrules_f1.default.retain-all-codepoint.otf |    Bin 0 -> 3716 bytes
+ ...le_subrules_f1.default.retain-all-codepoint.ttx |   1253 -
+ ...ultiple_subrules_f1.retain-gids.30,31,32,33.otf |    Bin 0 -> 2316 bytes
+ ...ultiple_subrules_f1.retain-gids.30,31,32,33.ttx |    569 -
+ ...2_multiple_subrules_f1.retain-gids.41,42,43.otf |    Bin 0 -> 2044 bytes
+ ...2_multiple_subrules_f1.retain-gids.41,42,43.ttx |    610 -
+ ...ubrules_f1.retain-gids.retain-all-codepoint.otf |    Bin 0 -> 3716 bytes
+ ...ubrules_f1.retain-gids.retain-all-codepoint.ttx |   1253 -
+ ...sub_chaining3_simple_f2.default.30,31,32,33.otf |    Bin 0 -> 1828 bytes
+ ...sub_chaining3_simple_f2.default.30,31,32,33.ttx |    334 -
+ .../gsub_chaining3_simple_f2.default.41,42,43.otf  |    Bin 0 -> 1320 bytes
+ .../gsub_chaining3_simple_f2.default.41,42,43.ttx  |    290 -
+ ...ing3_simple_f2.default.retain-all-codepoint.otf |    Bin 0 -> 3692 bytes
+ ...ing3_simple_f2.default.retain-all-codepoint.ttx |   1253 -
+ ...chaining3_simple_f2.retain-gids.30,31,32,33.otf |    Bin 0 -> 2292 bytes
+ ...chaining3_simple_f2.retain-gids.30,31,32,33.ttx |    569 -
+ ...ub_chaining3_simple_f2.retain-gids.41,42,43.otf |    Bin 0 -> 2020 bytes
+ ...ub_chaining3_simple_f2.retain-gids.41,42,43.ttx |    610 -
+ ..._simple_f2.retain-gids.retain-all-codepoint.otf |    Bin 0 -> 3692 bytes
+ ..._simple_f2.retain-gids.retain-all-codepoint.ttx |   1253 -
+ ..._created.default.41,42,43,44,45,46,47,48,49.otf |    Bin 0 -> 2176 bytes
+ ..._created.default.41,42,43,44,45,46,47,48,49.ttx |    392 -
+ ...nually_created.default.41,42,43,44,45,46,47.otf |    Bin 0 -> 1888 bytes
+ ...nually_created.default.41,42,43,44,45,46,47.ttx |    357 -
+ ...nually_created.default.41,42,43,44,45,46,4D.otf |    Bin 0 -> 1852 bytes
+ ...nually_created.default.41,42,43,44,45,46,4D.ttx |    351 -
+ ...nually_created.default.41,42,43,44,45,46,51.otf |    Bin 0 -> 1932 bytes
+ ...nually_created.default.41,42,43,44,45,46,51.ttx |    364 -
+ ..._manually_created.default.41,42,43,44,45,46.otf |    Bin 0 -> 1832 bytes
+ ..._manually_created.default.41,42,43,44,45,46.ttx |    343 -
+ .../gsub8_manually_created.default.41,42,43.otf    |    Bin 0 -> 1284 bytes
+ .../gsub8_manually_created.default.41,42,43.ttx    |    285 -
+ .../gsub8_manually_created.default.41.otf          |    Bin 0 -> 1172 bytes
+ .../gsub8_manually_created.default.41.ttx          |    259 -
+ .../gsub8_manually_created.default.61.otf          |    Bin 0 -> 1224 bytes
+ .../gsub8_manually_created.default.61.ttx          |    268 -
+ ...nually_created.default.retain-all-codepoint.otf |    Bin 0 -> 3656 bytes
+ ...nually_created.default.retain-all-codepoint.ttx |   1152 -
+ ...ated.retain-gids.41,42,43,44,45,46,47,48,49.otf |    Bin 0 -> 2884 bytes
+ ...ated.retain-gids.41,42,43,44,45,46,47,48,49.ttx |    712 -
+ ...ly_created.retain-gids.41,42,43,44,45,46,47.otf |    Bin 0 -> 2596 bytes
+ ...ly_created.retain-gids.41,42,43,44,45,46,47.ttx |    677 -
+ ...ly_created.retain-gids.41,42,43,44,45,46,4D.otf |    Bin 0 -> 2636 bytes
+ ...ly_created.retain-gids.41,42,43,44,45,46,4D.ttx |    701 -
+ ...ly_created.retain-gids.41,42,43,44,45,46,51.otf |    Bin 0 -> 2760 bytes
+ ...ly_created.retain-gids.41,42,43,44,45,46,51.ttx |    734 -
+ ...ually_created.retain-gids.41,42,43,44,45,46.otf |    Bin 0 -> 2540 bytes
+ ...ually_created.retain-gids.41,42,43,44,45,46.ttx |    663 -
+ ...gsub8_manually_created.retain-gids.41,42,43.otf |    Bin 0 -> 1984 bytes
+ ...gsub8_manually_created.retain-gids.41,42,43.ttx |    605 -
+ .../gsub8_manually_created.retain-gids.41.otf      |    Bin 0 -> 1872 bytes
+ .../gsub8_manually_created.retain-gids.41.ttx      |    579 -
+ .../gsub8_manually_created.retain-gids.61.otf      |    Bin 0 -> 2276 bytes
+ .../gsub8_manually_created.retain-gids.61.ttx      |    748 -
+ ...ly_created.retain-gids.retain-all-codepoint.otf |    Bin 0 -> 3656 bytes
+ ...ly_created.retain-gids.retain-all-codepoint.ttx |   1152 -
+ .../expected/layout.khmer/Khmer.default.1780.ttf   |    Bin 0 -> 4204 bytes
+ .../expected/layout.khmer/Khmer.default.1780.ttx   |   2504 -
+ ...ult.1789,17BB,17C6,1794,17B6,1793,1798,17BE.ttf |    Bin 0 -> 6412 bytes
+ ...ult.1789,17BB,17C6,1794,17B6,1793,1798,17BE.ttx |   3406 -
+ .../expected/layout.khmer/Khmer.default.31.ttf     |    Bin 0 -> 4140 bytes
+ .../expected/layout.khmer/Khmer.default.31.ttx     |   2486 -
+ .../layout.khmer/Khmer.retain-gids.1780.ttf        |    Bin 0 -> 4464 bytes
+ .../layout.khmer/Khmer.retain-gids.1780.ttx        |   2676 -
+ ...ids.1789,17BB,17C6,1794,17B6,1793,1798,17BE.ttf |    Bin 0 -> 7848 bytes
+ ...ids.1789,17BB,17C6,1794,17B6,1793,1798,17BE.ttx |   4310 -
+ .../expected/layout.khmer/Khmer.retain-gids.31.ttf |    Bin 0 -> 4256 bytes
+ .../expected/layout.khmer/Khmer.retain-gids.31.ttx |   2562 -
+ ...Bold.default.627,644,623,62D,644,627,645,2E.ttf |    Bin 0 -> 11396 bytes
+ ...Bold.default.627,644,623,62D,644,627,645,2E.ttx |   4986 -
+ ...toNastaliqUrdu-Bold.default.627,644,62D,628.ttf |    Bin 0 -> 18248 bytes
+ ...toNastaliqUrdu-Bold.default.627,644,62D,628.ttx |   9792 --
+ .../NotoNastaliqUrdu-Bold.default.627,644.ttf      |    Bin 0 -> 3528 bytes
+ .../NotoNastaliqUrdu-Bold.default.627,644.ttx      |   1326 -
+ ...rdu-Bold.default.633,645,627,621,20,644,627.ttf |    Bin 0 -> 12368 bytes
+ ...rdu-Bold.default.633,645,627,621,20,644,627.ttx |   5279 -
+ .../NotoNastaliqUrdu-Bold.default.63A,64A,631.ttf  |    Bin 0 -> 20368 bytes
+ .../NotoNastaliqUrdu-Bold.default.63A,64A,631.ttx  |  10363 --
+ ....retain-gids.627,644,623,62D,644,627,645,2E.ttf |    Bin 0 -> 18232 bytes
+ ....retain-gids.627,644,623,62D,644,627,645,2E.ttx |   9170 --
+ ...staliqUrdu-Bold.retain-gids.627,644,62D,628.ttf |    Bin 0 -> 24376 bytes
+ ...staliqUrdu-Bold.retain-gids.627,644,62D,628.ttx |  13452 --
+ .../NotoNastaliqUrdu-Bold.retain-gids.627,644.ttf  |    Bin 0 -> 9176 bytes
+ .../NotoNastaliqUrdu-Bold.retain-gids.627,644.ttx  |   5158 -
+ ...Bold.retain-gids.633,645,627,621,20,644,627.ttf |    Bin 0 -> 18172 bytes
+ ...Bold.retain-gids.633,645,627,621,20,644,627.ttx |   8915 --
+ ...toNastaliqUrdu-Bold.retain-gids.63A,64A,631.ttf |    Bin 0 -> 26588 bytes
+ ...toNastaliqUrdu-Bold.retain-gids.63A,64A,631.ttx |  14027 --
+ .../Roboto-Regular.smallcaps.default.41,42,43.ttf  |    Bin 0 -> 2464 bytes
+ .../Roboto-Regular.smallcaps.default.41,42,43.ttx  |   1251 -
+ .../Roboto-Regular.smallcaps.default.41,43.ttf     |    Bin 0 -> 2284 bytes
+ .../Roboto-Regular.smallcaps.default.41,43.ttx     |   1120 -
+ .../layout/Roboto-Regular.smallcaps.default.41.ttf |    Bin 0 -> 2084 bytes
+ .../layout/Roboto-Regular.smallcaps.default.41.ttx |   1008 -
+ .../layout/Roboto-Regular.smallcaps.default.43.ttf |    Bin 0 -> 2116 bytes
+ .../layout/Roboto-Regular.smallcaps.default.43.ttx |   1017 -
+ .../Roboto-Regular.smallcaps.default.CA,CB.ttf     |    Bin 0 -> 2388 bytes
+ .../Roboto-Regular.smallcaps.default.CA,CB.ttx     |   1200 -
+ ...boto-Regular.smallcaps.retain-gids.41,42,43.ttf |    Bin 0 -> 2716 bytes
+ ...boto-Regular.smallcaps.retain-gids.41,42,43.ttx |   1431 -
+ .../Roboto-Regular.smallcaps.retain-gids.41,43.ttf |    Bin 0 -> 2548 bytes
+ .../Roboto-Regular.smallcaps.retain-gids.41,43.ttx |   1305 -
+ .../Roboto-Regular.smallcaps.retain-gids.41.ttf    |    Bin 0 -> 2336 bytes
+ .../Roboto-Regular.smallcaps.retain-gids.41.ttx    |   1188 -
+ .../Roboto-Regular.smallcaps.retain-gids.43.ttf    |    Bin 0 -> 2384 bytes
+ .../Roboto-Regular.smallcaps.retain-gids.43.ttx    |   1207 -
+ .../Roboto-Regular.smallcaps.retain-gids.CA,CB.ttf |    Bin 0 -> 6476 bytes
+ .../Roboto-Regular.smallcaps.retain-gids.CA,CB.ttx |   4120 -
+ .../data/expected/sbix/sbix.default.58,59.ttf      |    Bin 0 -> 193528 bytes
+ .../data/expected/sbix/sbix.default.58,59.ttx      |  12367 --
+ test/subset/data/expected/sbix/sbix.default.58.ttf |    Bin 0 -> 121168 bytes
+ test/subset/data/expected/sbix/sbix.default.58.ttx |   7801 -
+ test/subset/data/expected/sbix/sbix.default.59.ttf |    Bin 0 -> 89364 bytes
+ test/subset/data/expected/sbix/sbix.default.59.ttx |   5813 -
+ .../sbix/sbix.drop-hints-retain-gids.58,59.ttf     |    Bin 0 -> 193528 bytes
+ .../sbix/sbix.drop-hints-retain-gids.58,59.ttx     |  12367 --
+ .../sbix/sbix.drop-hints-retain-gids.58.ttf        |    Bin 0 -> 121168 bytes
+ .../sbix/sbix.drop-hints-retain-gids.58.ttx        |   7801 -
+ .../sbix/sbix.drop-hints-retain-gids.59.ttf        |    Bin 0 -> 89404 bytes
+ .../sbix/sbix.drop-hints-retain-gids.59.ttx        |   5826 -
+ .../data/expected/sbix/sbix.drop-hints.58,59.ttf   |    Bin 0 -> 193528 bytes
+ .../data/expected/sbix/sbix.drop-hints.58,59.ttx   |  12367 --
+ .../data/expected/sbix/sbix.drop-hints.58.ttf      |    Bin 0 -> 121168 bytes
+ .../data/expected/sbix/sbix.drop-hints.58.ttx      |   7801 -
+ .../data/expected/sbix/sbix.drop-hints.59.ttf      |    Bin 0 -> 89364 bytes
+ .../data/expected/sbix/sbix.drop-hints.59.ttx      |   5813 -
+ .../data/expected/sbix/sbix.retain-gids.58,59.ttf  |    Bin 0 -> 193528 bytes
+ .../data/expected/sbix/sbix.retain-gids.58,59.ttx  |  12367 --
+ .../data/expected/sbix/sbix.retain-gids.58.ttf     |    Bin 0 -> 121168 bytes
+ .../data/expected/sbix/sbix.retain-gids.58.ttx     |   7801 -
+ .../data/expected/sbix/sbix.retain-gids.59.ttf     |    Bin 0 -> 89404 bytes
+ .../data/expected/sbix/sbix.retain-gids.59.ttx     |   5826 -
+ .../variable/Fraunces.default.26,66,69,124,125.ttf |    Bin 0 -> 15792 bytes
+ .../variable/Fraunces.default.26,66,69,124,125.ttx |   6907 -
+ .../data/expected/variable/Fraunces.default.61.ttf |    Bin 0 -> 4228 bytes
+ .../data/expected/variable/Fraunces.default.61.ttx |   1427 -
+ test/subset/generate-expected-outputs.py           |      1 -
+ test/subset/run-tests.py                           |     29 +-
+ test/subset/subset_test_suite.py                   |     18 +-
+ 1945 files changed, 23 insertions(+), 3999130 deletions(-)
+
+commit 62a535f154a9453c7d16c669094c254666a6caac
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 3 10:11:27 2021 -0600
+
+    [khmer] Fix comment
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/3104
+
+ src/hb-ot-shape-complex-indic.cc   | 7 ++++---
+ src/hb-ot-shape-complex-khmer.cc   | 3 ++-
+ src/hb-ot-shape-complex-myanmar.cc | 3 ++-
+ src/hb-ot-shape-complex-use.cc     | 3 ++-
+ 4 files changed, 10 insertions(+), 6 deletions(-)
+
+commit 2cc9ed2b9e3de9e162e9d127edce377f059fd56b
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Mon Aug 2 22:00:11 2021 +0200
+
+    [test] More lookup_collect_glyphs() tests
+
+ test/api/test-ot-collect-glyphs.c | 95 +++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 95 insertions(+)
+
+commit 06640374016f1e78d1fbfa8c5e7b09f8b04a44cc
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Mon Aug 2 19:52:59 2021 +0200
+
+    [test] More lookup_collect_glyphs() tests
+
+ test/api/test-ot-collect-glyphs.c | 66 +++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 66 insertions(+)
+
+commit ecdd8e3f18700113032a88cdfdc94bcf55e08542
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Mon Aug 2 19:36:20 2021 +0200
+
+    [test] More lookup_collect_glyphs() tests
+
+ test/api/fonts/Qahiri-Regular.ttf | Bin 0 -> 35984 bytes
+ test/api/test-ot-collect-glyphs.c | 122 ++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 122 insertions(+)
+
+commit f998d7e1ceee3c797104e90cc25caeff56407745
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Mon Aug 2 16:10:13 2021 +0200
+
+    [test] Add API test for lookup_collect_glyphs()
+    
+    We don’t seem to have any tests exercising this API at all, and it is a
+    good check of GSUB/GPOS code.
+
+ test/api/Makefile.am              |   1 +
+ test/api/meson.build              |   1 +
+ test/api/test-ot-collect-glyphs.c | 209 ++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 211 insertions(+)
+
+commit 47d47e8c43d71c6d6570d354400c0757940bbb94
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 1 22:12:08 2021 -0600
+
+    [util/hb-shape/hb-subset] Don't terminate on first error in batch mode
+    
+    There's no reason to quit processing.  The failure is already
+    communicated via stdout in both cases.
+
+ util/hb-shape.cc  | 4 ----
+ util/hb-subset.cc | 3 ---
+ 2 files changed, 7 deletions(-)
+
+commit a363ce573c3aa706de3aecf0515519a5d7842af2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 1 22:11:13 2021 -0600
+
+    [util/hb-subset] Minor refactor of batch mode
+    
+    To match recent changes to hb-shape.
+
+ util/hb-subset.cc | 14 ++++++++------
+ 1 file changed, 8 insertions(+), 6 deletions(-)
+
+commit 10e73d188a28e777b7950e37a9eed908f3a19615
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Sun Aug 1 11:11:12 2021 +0200
+
+    [test] Add batch mode to hb-subset and use it
+    
+    time meson test --suite=subset down from:
+    real    0m22.822s
+    user    0m44.561s
+    sys     0m9.255s
+    
+    to:
+    real    0m19.418s
+    user    0m38.171s
+    sys     0m3.587s
+    
+    Does not seem to help much, but it is something.
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/3089
+
+ test/subset/run-repack-tests.py | 17 ++++++++++++++---
+ test/subset/run-tests.py        | 17 ++++++++++++++---
+ util/hb-subset.cc               | 34 ++++++++++++++++++++++++++++++++++
+ 3 files changed, 62 insertions(+), 6 deletions(-)
+
+commit 75f314c47150270a04b659c3218ba1e4738d13d2
+Merge: ed99c8062 1fd3a261e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 1 12:06:49 2021 -0600
+
+    Merge pull request #3103 from harfbuzz/test-reference
+    
+    [test] Remove unused shaping tests reference mode
+
+commit 1fd3a261e526745b1a99bf1eece8e87bcc673d49
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Sun Aug 1 19:38:39 2021 +0200
+
+    [test] Remove unused shaping tests reference mode
+
+ test/shaping/run-tests.py | 35 +++++++++++------------------------
+ 1 file changed, 11 insertions(+), 24 deletions(-)
+
+commit ed99c80623ce6c81e5efedd97f2374b41f33d14b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 1 08:14:59 2021 -0600
+
+    [util/hb-shape] Refactor driver type duplication
+
+ util/hb-shape.cc | 11 +++++++++--
+ 1 file changed, 9 insertions(+), 2 deletions(-)
+
+commit 05cf81283b90531710f060f7ef6e3216fe8b5330
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 1 07:59:25 2021 -0600
+
+    [util/hb-shape] Fix use of EOF as end-of-line
+    
+    EOF is -1, which was being treated as a valid char (255).
+    Use int instead.
+
+ test/api/test-style.c  |  2 +-
+ util/main-font-text.hh |  2 +-
+ util/options.cc        | 15 ++++++++-------
+ util/options.hh        |  2 +-
+ 4 files changed, 11 insertions(+), 10 deletions(-)
+
+commit ee7473b8a447a05a67b185bd9ff6fac3f2ca24d8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 30 12:55:28 2021 -0600
+
+    [mutex] Remove unused HB_MUTEX_IMPL_INIT / HB_MUTEX_INIT
+    
+    https://github.com/harfbuzz/harfbuzz/pull/3100#issuecomment-890089096
+
+ src/hb-mutex.hh | 8 +-------
+ 1 file changed, 1 insertion(+), 7 deletions(-)
+
+commit 0e37c07f4c116c983693ce87ae6828b1ca77a347
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 30 12:52:59 2021 -0600
+
+    Revert "Construct user_data in hb_object"
+    
+    This reverts commit a78eb43c79e7a2d870add6b686426748e104b7b3.
+    
+    See: https://github.com/harfbuzz/harfbuzz/pull/3100#issuecomment-890088227
+
+ src/hb-object.hh | 3 ---
+ 1 file changed, 3 deletions(-)
+
+commit 5dc4cd71cc950ccf2bbeee2a9f03e5908850b1eb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 30 12:37:40 2021 -0600
+
+    [blob] Minor change in destruction
+    
+    No semantic change.
+
+ src/hb-blob.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 7cbcdaf68a59ae87420503f7b5be490745607fbe
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 30 11:26:46 2021 -0600
+
+    Whitespace
+
+ test/subset/data/tests/cff-full-font.tests        | 1 -
+ test/subset/data/tests/cff-japanese.tests         | 3 ---
+ test/subset/data/tests/japanese.tests             | 2 --
+ test/subset/data/tests/layout.gdef-varstore.tests | 1 -
+ 4 files changed, 7 deletions(-)
+
+commit 5d283aa0bd65739f78b384590e070e8cfb531d74
+Merge: bbeb3a62b f6c67a5fc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 30 10:15:09 2021 -0600
+
+    Merge pull request #3095 from harfbuzz/subset-tests-speed
+    
+    [test] Speed-up subset tests by saving TTX dump
+
+commit bbeb3a62b0efbb598d8683f7c4b6cc7069a58aeb
+Merge: a78eb43c7 b63ac5717
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 30 09:54:55 2021 -0600
+
+    Merge pull request #3096 from googlefonts/multi_flag
+    
+    [subset] change input and plan flags to be bit sets.
+
+commit b63ac5717479cd8264e717f4e6a2df97d352bb67
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Jul 29 18:23:41 2021 -0700
+
+    [subset] bail if collection region indices is in error.
+
+ src/hb-ot-layout-common.hh | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit f9d8e4a97620eecd8dba3469b1bc115b3fbe242a
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Jul 29 15:25:41 2021 -0700
+
+    [subset] switch ..._set_flags to not take a mask.
+
+ src/hb-subset-input.cc           | 21 ++++++++-------------
+ src/hb-subset-input.hh           |  4 +++-
+ src/hb-subset-plan.hh            |  2 +-
+ src/hb-subset.h                  | 35 +++++++++++++++--------------------
+ test/api/hb-subset-test.h        |  3 +--
+ test/api/test-subset-cff1.c      | 20 +++++++++-----------
+ test/api/test-subset-cff2.c      |  9 ++++-----
+ test/api/test-subset-glyf.c      | 12 ++++++------
+ test/api/test-subset-gvar.c      |  2 +-
+ test/api/test-subset-hvar.c      |  4 ++--
+ test/api/test-subset-vvar.c      |  2 +-
+ test/api/test-subset.c           | 11 ++---------
+ test/fuzzing/hb-subset-fuzzer.cc |  6 +++---
+ util/options.hh                  |  9 +++++----
+ 14 files changed, 61 insertions(+), 79 deletions(-)
+
+commit 46d4a5e67353517bb27d0ac2d944b7343a8cff3c
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Jul 29 15:07:13 2021 -0700
+
+    [subset] Convert subset plan to use a flags bit set.
+
+ src/hb-ot-glyf-table.hh        | 15 +++++++++------
+ src/hb-ot-layout-gpos-table.hh |  6 +++---
+ src/hb-ot-maxp-table.hh        |  2 +-
+ src/hb-ot-name-table.hh        |  6 +++++-
+ src/hb-ot-os2-table.hh         |  3 ++-
+ src/hb-ot-post-table.hh        |  5 +++--
+ src/hb-ot-var-gvar-table.hh    |  8 ++++++--
+ src/hb-ot-var-hvar-table.hh    |  2 +-
+ src/hb-subset-cff-common.hh    | 13 ++++++++-----
+ src/hb-subset-cff1.cc          |  4 ++--
+ src/hb-subset-cff2.cc          |  4 ++--
+ src/hb-subset-plan.cc          | 29 +++++++++++++++++------------
+ src/hb-subset-plan.hh          | 13 ++-----------
+ src/hb-subset.cc               |  4 ++--
+ 14 files changed, 63 insertions(+), 51 deletions(-)
+
+commit 3d534b146c545d95e4b81fbec2c5a7a73531fae5
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Jul 29 11:52:14 2021 -0700
+
+    [subset] convert subset input flags into bit flags.
+    
+    Store the flags in a bit set. Updates the public api to work with the bit set directly.
+
+ src/hb-subset-input.cc           | 103 +++++++--------------------------------
+ src/hb-subset-input.hh           |  12 +----
+ src/hb-subset-plan.cc            |  22 ++++-----
+ src/hb-subset.h                  |  62 ++++++++++++-----------
+ test/api/hb-subset-test.h        |   4 +-
+ test/api/test-subset-cff1.c      |  24 ++++-----
+ test/api/test-subset-cff2.c      |  11 +++--
+ test/api/test-subset-glyf.c      |  12 ++---
+ test/api/test-subset-gvar.c      |   2 +-
+ test/api/test-subset-hvar.c      |   4 +-
+ test/api/test-subset-vvar.c      |   2 +-
+ test/api/test-subset.c           |  41 ++++++++++++++++
+ test/fuzzing/hb-subset-fuzzer.cc |  33 +++----------
+ util/hb-subset.cc                |   2 +-
+ util/options-subset.cc           |  23 +++++----
+ util/options.hh                  |  24 +++++++++
+ 16 files changed, 180 insertions(+), 201 deletions(-)
+
+commit f6c67a5fcfcf64e6e01b337c34d366f167800410
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Fri Jul 30 02:20:19 2021 +0200
+
+    [test] Open file in UTF-8
+    
+    It is 2021 and Python still does not default to UTF-8 on Windows!
+
+ test/subset/run-tests.py | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit bafbade087d18f0045181ad31829a0a4ffbf0544
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Fri Jul 30 01:42:45 2021 +0200
+
+    [test] Force FontTools to use \n on all platforms
+    
+    On Windows in helfuly uses \r\n.
+
+ test/subset/run-tests.py | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit a78eb43c79e7a2d870add6b686426748e104b7b3
+Author: Ben Wagner <bungeman@chromium.org>
+Date:   Thu Jul 29 17:35:25 2021 -0400
+
+    Construct user_data in hb_object
+    
+    hb_object's user_data is created lazily. The previous implementation of
+    hb_object_set_user_data created space for the user_data but did not
+    actually construct it. This means that hb_user_data_array_t's lock was
+    not constructed. If hb_mutex_t is backed by an implementation which
+    requires that it be constructed (not just zero initialized) then errors
+    will occur when taking the lock when setting the user data.
+    
+    Change hb_object_set_user_data to construct the user_data in the created
+    space and hb_object_fini to call the destructor.
+
+ src/hb-object.hh | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 278f44dcee34cea25403e42e06668f0afe2328c1
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Thu Jul 29 23:43:56 2021 +0200
+
+    [test] Speed-up subset tests by saving TTX dump
+    
+    Speed-up subset tests by saving TTX dump of expected output instead of
+    generating it each time the tests are run.
+    
+    Cuts down meson test --suite=subset on my system from:
+    real    0m38.977s
+    user    1m12.024s
+    sys     0m10.547s
+    
+    to:
+    real    0m22.291s
+    user    0m44.548s
+    sys     0m9.221s
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/3089
+
+ .../Comfortaa-Regular-new.default.61,62,63.ttf     |    Bin 7060 -> 0 bytes
+ .../Comfortaa-Regular-new.default.61,62,63.ttx     |   4507 +
+ .../basics/Comfortaa-Regular-new.default.61,63.ttf |    Bin 6692 -> 0 bytes
+ .../basics/Comfortaa-Regular-new.default.61,63.ttx |   4359 +
+ .../basics/Comfortaa-Regular-new.default.61.ttf    |    Bin 6328 -> 0 bytes
+ .../basics/Comfortaa-Regular-new.default.61.ttx    |   4198 +
+ .../basics/Comfortaa-Regular-new.default.62.ttf    |    Bin 6200 -> 0 bytes
+ .../basics/Comfortaa-Regular-new.default.62.ttx    |   4151 +
+ .../basics/Comfortaa-Regular-new.default.63.ttf    |    Bin 6256 -> 0 bytes
+ .../basics/Comfortaa-Regular-new.default.63.ttx    |   4209 +
+ ...aa-Regular-new.default.retain-all-codepoint.ttf |    Bin 220928 -> 0 bytes
+ ...aa-Regular-new.default.retain-all-codepoint.ttx | 132956 +++++++++++++++++
+ ...Regular-new.drop-hints-retain-gids.61,62,63.ttf |    Bin 4608 -> 0 bytes
+ ...Regular-new.drop-hints-retain-gids.61,62,63.ttx |   1918 +
+ ...aa-Regular-new.drop-hints-retain-gids.61,63.ttf |    Bin 4312 -> 0 bytes
+ ...aa-Regular-new.drop-hints-retain-gids.61,63.ttx |   1785 +
+ ...ortaa-Regular-new.drop-hints-retain-gids.61.ttf |    Bin 3724 -> 0 bytes
+ ...ortaa-Regular-new.drop-hints-retain-gids.61.ttx |   1493 +
+ ...ortaa-Regular-new.drop-hints-retain-gids.62.ttf |    Bin 3900 -> 0 bytes
+ ...ortaa-Regular-new.drop-hints-retain-gids.62.ttx |   1600 +
+ ...ortaa-Regular-new.drop-hints-retain-gids.63.ttf |    Bin 3972 -> 0 bytes
+ ...ortaa-Regular-new.drop-hints-retain-gids.63.ttx |   1662 +
+ ...drop-hints-retain-gids.retain-all-codepoint.ttf |    Bin 189800 -> 0 bytes
+ ...drop-hints-retain-gids.retain-all-codepoint.ttx | 122816 ++++++++++++++++
+ .../Comfortaa-Regular-new.drop-hints.61,62,63.ttf  |    Bin 2600 -> 0 bytes
+ .../Comfortaa-Regular-new.drop-hints.61,62,63.ttx  |    813 +
+ .../Comfortaa-Regular-new.drop-hints.61,63.ttf     |    Bin 2296 -> 0 bytes
+ .../Comfortaa-Regular-new.drop-hints.61,63.ttx     |    675 +
+ .../basics/Comfortaa-Regular-new.drop-hints.61.ttf |    Bin 1976 -> 0 bytes
+ .../basics/Comfortaa-Regular-new.drop-hints.61.ttx |    523 +
+ .../basics/Comfortaa-Regular-new.drop-hints.62.ttf |    Bin 1900 -> 0 bytes
+ .../basics/Comfortaa-Regular-new.drop-hints.62.ttx |    490 +
+ .../basics/Comfortaa-Regular-new.drop-hints.63.ttf |    Bin 1968 -> 0 bytes
+ .../basics/Comfortaa-Regular-new.drop-hints.63.ttx |    547 +
+ ...Regular-new.drop-hints.retain-all-codepoint.ttf |    Bin 189756 -> 0 bytes
+ ...Regular-new.drop-hints.retain-all-codepoint.ttx | 122806 ++++++++++++++++
+ .../basics/Comfortaa-Regular-new.gids.61,62,63.ttf |    Bin 7988 -> 0 bytes
+ .../basics/Comfortaa-Regular-new.gids.61,62,63.ttx |   4929 +
+ .../basics/Comfortaa-Regular-new.gids.61,63.ttf    |    Bin 7628 -> 0 bytes
+ .../basics/Comfortaa-Regular-new.gids.61,63.ttx    |   4778 +
+ .../basics/Comfortaa-Regular-new.gids.61.ttf       |    Bin 7256 -> 0 bytes
+ .../basics/Comfortaa-Regular-new.gids.61.ttx       |   4614 +
+ .../basics/Comfortaa-Regular-new.gids.62.ttf       |    Bin 7184 -> 0 bytes
+ .../basics/Comfortaa-Regular-new.gids.62.ttx       |   4606 +
+ .../basics/Comfortaa-Regular-new.gids.63.ttf       |    Bin 7180 -> 0 bytes
+ .../basics/Comfortaa-Regular-new.gids.63.ttx       |   4623 +
+ ...ortaa-Regular-new.gids.retain-all-codepoint.ttf |    Bin 220928 -> 0 bytes
+ ...ortaa-Regular-new.gids.retain-all-codepoint.ttx | 132956 +++++++++++++++++
+ .../Comfortaa-Regular-new.glyph-names.61,62,63.ttf |    Bin 7072 -> 0 bytes
+ .../Comfortaa-Regular-new.glyph-names.61,62,63.ttx |   4519 +
+ .../Comfortaa-Regular-new.glyph-names.61,63.ttf    |    Bin 6700 -> 0 bytes
+ .../Comfortaa-Regular-new.glyph-names.61,63.ttx    |   4371 +
+ .../Comfortaa-Regular-new.glyph-names.61.ttf       |    Bin 6336 -> 0 bytes
+ .../Comfortaa-Regular-new.glyph-names.61.ttx       |   4210 +
+ .../Comfortaa-Regular-new.glyph-names.62.ttf       |    Bin 6208 -> 0 bytes
+ .../Comfortaa-Regular-new.glyph-names.62.ttx       |   4163 +
+ .../Comfortaa-Regular-new.glyph-names.63.ttf       |    Bin 6264 -> 0 bytes
+ .../Comfortaa-Regular-new.glyph-names.63.ttx       |   4221 +
+ ...egular-new.glyph-names.retain-all-codepoint.ttf |    Bin 227920 -> 0 bytes
+ ...egular-new.glyph-names.retain-all-codepoint.ttx | 133598 ++++++++++++++++++
+ ...gular-new.keep-all-layout-features.61,62,63.ttf |    Bin 7504 -> 0 bytes
+ ...gular-new.keep-all-layout-features.61,62,63.ttx |   4670 +
+ ...-Regular-new.keep-all-layout-features.61,63.ttf |    Bin 7140 -> 0 bytes
+ ...-Regular-new.keep-all-layout-features.61,63.ttx |   4519 +
+ ...taa-Regular-new.keep-all-layout-features.61.ttf |    Bin 6772 -> 0 bytes
+ ...taa-Regular-new.keep-all-layout-features.61.ttx |   4355 +
+ ...taa-Regular-new.keep-all-layout-features.62.ttf |    Bin 6200 -> 0 bytes
+ ...taa-Regular-new.keep-all-layout-features.62.ttx |   4151 +
+ ...taa-Regular-new.keep-all-layout-features.63.ttf |    Bin 6256 -> 0 bytes
+ ...taa-Regular-new.keep-all-layout-features.63.ttx |   4209 +
+ ...ep-all-layout-features.retain-all-codepoint.ttf |    Bin 221620 -> 0 bytes
+ ...ep-all-layout-features.retain-all-codepoint.ttx | 133303 +++++++++++++++++
+ ...fortaa-Regular-new.layout-features.61,62,63.ttf |    Bin 7060 -> 0 bytes
+ ...fortaa-Regular-new.layout-features.61,62,63.ttx |   4507 +
+ ...Comfortaa-Regular-new.layout-features.61,63.ttf |    Bin 6692 -> 0 bytes
+ ...Comfortaa-Regular-new.layout-features.61,63.ttx |   4359 +
+ .../Comfortaa-Regular-new.layout-features.61.ttf   |    Bin 6328 -> 0 bytes
+ .../Comfortaa-Regular-new.layout-features.61.ttx   |   4198 +
+ .../Comfortaa-Regular-new.layout-features.62.ttf   |    Bin 6200 -> 0 bytes
+ .../Comfortaa-Regular-new.layout-features.62.ttx   |   4151 +
+ .../Comfortaa-Regular-new.layout-features.63.ttf   |    Bin 6256 -> 0 bytes
+ .../Comfortaa-Regular-new.layout-features.63.ttx   |   4209 +
+ ...ar-new.layout-features.retain-all-codepoint.ttf |    Bin 219124 -> 0 bytes
+ ...ar-new.layout-features.retain-all-codepoint.ttx | 131168 +++++++++++++++++
+ .../Comfortaa-Regular-new.name-ids.61,62,63.ttf    |    Bin 6800 -> 0 bytes
+ .../Comfortaa-Regular-new.name-ids.61,62,63.ttx    |   4495 +
+ .../Comfortaa-Regular-new.name-ids.61,63.ttf       |    Bin 6432 -> 0 bytes
+ .../Comfortaa-Regular-new.name-ids.61,63.ttx       |   4347 +
+ .../basics/Comfortaa-Regular-new.name-ids.61.ttf   |    Bin 6068 -> 0 bytes
+ .../basics/Comfortaa-Regular-new.name-ids.61.ttx   |   4186 +
+ .../basics/Comfortaa-Regular-new.name-ids.62.ttf   |    Bin 5940 -> 0 bytes
+ .../basics/Comfortaa-Regular-new.name-ids.62.ttx   |   4139 +
+ .../basics/Comfortaa-Regular-new.name-ids.63.ttf   |    Bin 5996 -> 0 bytes
+ .../basics/Comfortaa-Regular-new.name-ids.63.ttx   |   4197 +
+ ...a-Regular-new.name-ids.retain-all-codepoint.ttf |    Bin 220668 -> 0 bytes
+ ...a-Regular-new.name-ids.retain-all-codepoint.ttx | 132944 +++++++++++++++++
+ ...mfortaa-Regular-new.name-languages.61,62,63.ttf |    Bin 7060 -> 0 bytes
+ ...mfortaa-Regular-new.name-languages.61,62,63.ttx |   4507 +
+ .../Comfortaa-Regular-new.name-languages.61,63.ttf |    Bin 6692 -> 0 bytes
+ .../Comfortaa-Regular-new.name-languages.61,63.ttx |   4359 +
+ .../Comfortaa-Regular-new.name-languages.61.ttf    |    Bin 6328 -> 0 bytes
+ .../Comfortaa-Regular-new.name-languages.61.ttx    |   4198 +
+ .../Comfortaa-Regular-new.name-languages.62.ttf    |    Bin 6200 -> 0 bytes
+ .../Comfortaa-Regular-new.name-languages.62.ttx    |   4151 +
+ .../Comfortaa-Regular-new.name-languages.63.ttf    |    Bin 6256 -> 0 bytes
+ .../Comfortaa-Regular-new.name-languages.63.ttx    |   4209 +
+ ...lar-new.name-languages.retain-all-codepoint.ttf |    Bin 220928 -> 0 bytes
+ ...lar-new.name-languages.retain-all-codepoint.ttx | 132956 +++++++++++++++++
+ .../Comfortaa-Regular-new.name-legacy.61,62,63.ttf |    Bin 7060 -> 0 bytes
+ .../Comfortaa-Regular-new.name-legacy.61,62,63.ttx |   4507 +
+ .../Comfortaa-Regular-new.name-legacy.61,63.ttf    |    Bin 6692 -> 0 bytes
+ .../Comfortaa-Regular-new.name-legacy.61,63.ttx    |   4359 +
+ .../Comfortaa-Regular-new.name-legacy.61.ttf       |    Bin 6328 -> 0 bytes
+ .../Comfortaa-Regular-new.name-legacy.61.ttx       |   4198 +
+ .../Comfortaa-Regular-new.name-legacy.62.ttf       |    Bin 6200 -> 0 bytes
+ .../Comfortaa-Regular-new.name-legacy.62.ttx       |   4151 +
+ .../Comfortaa-Regular-new.name-legacy.63.ttf       |    Bin 6256 -> 0 bytes
+ .../Comfortaa-Regular-new.name-legacy.63.ttx       |   4209 +
+ ...egular-new.name-legacy.retain-all-codepoint.ttf |    Bin 220928 -> 0 bytes
+ ...egular-new.name-legacy.retain-all-codepoint.ttx | 132956 +++++++++++++++++
+ ...egular-new.no-prune-unicode-ranges.61,62,63.ttf |    Bin 7060 -> 0 bytes
+ ...egular-new.no-prune-unicode-ranges.61,62,63.ttx |   4507 +
+ ...a-Regular-new.no-prune-unicode-ranges.61,63.ttf |    Bin 6692 -> 0 bytes
+ ...a-Regular-new.no-prune-unicode-ranges.61,63.ttx |   4359 +
+ ...rtaa-Regular-new.no-prune-unicode-ranges.61.ttf |    Bin 6328 -> 0 bytes
+ ...rtaa-Regular-new.no-prune-unicode-ranges.61.ttx |   4198 +
+ ...rtaa-Regular-new.no-prune-unicode-ranges.62.ttf |    Bin 6200 -> 0 bytes
+ ...rtaa-Regular-new.no-prune-unicode-ranges.62.ttx |   4151 +
+ ...rtaa-Regular-new.no-prune-unicode-ranges.63.ttf |    Bin 6256 -> 0 bytes
+ ...rtaa-Regular-new.no-prune-unicode-ranges.63.ttx |   4209 +
+ ...o-prune-unicode-ranges.retain-all-codepoint.ttf |    Bin 220928 -> 0 bytes
+ ...o-prune-unicode-ranges.retain-all-codepoint.ttx | 132956 +++++++++++++++++
+ ...mfortaa-Regular-new.notdef-outline.61,62,63.ttf |    Bin 7652 -> 0 bytes
+ ...mfortaa-Regular-new.notdef-outline.61,62,63.ttx |   4758 +
+ .../Comfortaa-Regular-new.notdef-outline.61,63.ttf |    Bin 7284 -> 0 bytes
+ .../Comfortaa-Regular-new.notdef-outline.61,63.ttx |   4610 +
+ .../Comfortaa-Regular-new.notdef-outline.61.ttf    |    Bin 6920 -> 0 bytes
+ .../Comfortaa-Regular-new.notdef-outline.61.ttx    |   4449 +
+ .../Comfortaa-Regular-new.notdef-outline.62.ttf    |    Bin 6796 -> 0 bytes
+ .../Comfortaa-Regular-new.notdef-outline.62.ttx    |   4402 +
+ .../Comfortaa-Regular-new.notdef-outline.63.ttf    |    Bin 6844 -> 0 bytes
+ .../Comfortaa-Regular-new.notdef-outline.63.ttx    |   4460 +
+ ...lar-new.notdef-outline.retain-all-codepoint.ttf |    Bin 221524 -> 0 bytes
+ ...lar-new.notdef-outline.retain-all-codepoint.ttx | 133207 +++++++++++++++++
+ .../Comfortaa-Regular-new.retain-gids.61,62,63.ttf |    Bin 9068 -> 0 bytes
+ .../Comfortaa-Regular-new.retain-gids.61,62,63.ttx |   5612 +
+ .../Comfortaa-Regular-new.retain-gids.61,63.ttf    |    Bin 8708 -> 0 bytes
+ .../Comfortaa-Regular-new.retain-gids.61,63.ttx    |   5469 +
+ .../Comfortaa-Regular-new.retain-gids.61.ttf       |    Bin 8076 -> 0 bytes
+ .../Comfortaa-Regular-new.retain-gids.61.ttx       |   5168 +
+ .../Comfortaa-Regular-new.retain-gids.62.ttf       |    Bin 8200 -> 0 bytes
+ .../Comfortaa-Regular-new.retain-gids.62.ttx       |   5261 +
+ .../Comfortaa-Regular-new.retain-gids.63.ttf       |    Bin 8260 -> 0 bytes
+ .../Comfortaa-Regular-new.retain-gids.63.ttx       |   5324 +
+ ...egular-new.retain-gids.retain-all-codepoint.ttf |    Bin 220972 -> 0 bytes
+ ...egular-new.retain-gids.retain-all-codepoint.ttx | 132966 +++++++++++++++++
+ ...numMyeongjo-Regular-subset.default.61,62,63.ttf |    Bin 4128 -> 0 bytes
+ ...numMyeongjo-Regular-subset.default.61,62,63.ttx |   2032 +
+ .../NanumMyeongjo-Regular-subset.default.61,63.ttf |    Bin 3580 -> 0 bytes
+ .../NanumMyeongjo-Regular-subset.default.61,63.ttx |   1822 +
+ .../NanumMyeongjo-Regular-subset.default.61.ttf    |    Bin 3156 -> 0 bytes
+ .../NanumMyeongjo-Regular-subset.default.61.ttx    |   1696 +
+ .../NanumMyeongjo-Regular-subset.default.62.ttf    |    Bin 3180 -> 0 bytes
+ .../NanumMyeongjo-Regular-subset.default.62.ttx    |   1719 +
+ .../NanumMyeongjo-Regular-subset.default.63.ttf    |    Bin 3048 -> 0 bytes
+ .../NanumMyeongjo-Regular-subset.default.63.ttx    |   1635 +
+ ...Regular-subset.default.retain-all-codepoint.ttf |    Bin 9524 -> 0 bytes
+ ...Regular-subset.default.retain-all-codepoint.ttx |   4391 +
+ ...ular-subset.drop-hints-retain-gids.61,62,63.ttf |    Bin 1452 -> 0 bytes
+ ...ular-subset.drop-hints-retain-gids.61,62,63.ttx |    380 +
+ ...Regular-subset.drop-hints-retain-gids.61,63.ttf |    Bin 1284 -> 0 bytes
+ ...Regular-subset.drop-hints-retain-gids.61,63.ttx |    314 +
+ ...jo-Regular-subset.drop-hints-retain-gids.61.ttf |    Bin 1128 -> 0 bytes
+ ...jo-Regular-subset.drop-hints-retain-gids.61.ttx |    254 +
+ ...jo-Regular-subset.drop-hints-retain-gids.62.ttf |    Bin 1144 -> 0 bytes
+ ...jo-Regular-subset.drop-hints-retain-gids.62.ttx |    261 +
+ ...jo-Regular-subset.drop-hints-retain-gids.63.ttf |    Bin 1116 -> 0 bytes
+ ...jo-Regular-subset.drop-hints-retain-gids.63.ttx |    251 +
+ ...drop-hints-retain-gids.retain-all-codepoint.ttf |    Bin 3536 -> 0 bytes
+ ...drop-hints-retain-gids.retain-all-codepoint.ttx |   1215 +
+ ...Myeongjo-Regular-subset.drop-hints.61,62,63.ttf |    Bin 1452 -> 0 bytes
+ ...Myeongjo-Regular-subset.drop-hints.61,62,63.ttx |    380 +
+ ...numMyeongjo-Regular-subset.drop-hints.61,63.ttf |    Bin 1276 -> 0 bytes
+ ...numMyeongjo-Regular-subset.drop-hints.61,63.ttx |    310 +
+ .../NanumMyeongjo-Regular-subset.drop-hints.61.ttf |    Bin 1128 -> 0 bytes
+ .../NanumMyeongjo-Regular-subset.drop-hints.61.ttx |    254 +
+ .../NanumMyeongjo-Regular-subset.drop-hints.62.ttf |    Bin 1140 -> 0 bytes
+ .../NanumMyeongjo-Regular-subset.drop-hints.62.ttx |    257 +
+ .../NanumMyeongjo-Regular-subset.drop-hints.63.ttf |    Bin 1104 -> 0 bytes
+ .../NanumMyeongjo-Regular-subset.drop-hints.63.ttx |    243 +
+ ...ular-subset.drop-hints.retain-all-codepoint.ttf |    Bin 3536 -> 0 bytes
+ ...ular-subset.drop-hints.retain-all-codepoint.ttx |   1215 +
+ .../NanumMyeongjo-Regular-subset.gids.61,62,63.ttf |    Bin 4128 -> 0 bytes
+ .../NanumMyeongjo-Regular-subset.gids.61,62,63.ttx |   2032 +
+ .../NanumMyeongjo-Regular-subset.gids.61,63.ttf    |    Bin 4128 -> 0 bytes
+ .../NanumMyeongjo-Regular-subset.gids.61,63.ttx    |   2032 +
+ .../NanumMyeongjo-Regular-subset.gids.61.ttf       |    Bin 4128 -> 0 bytes
+ .../NanumMyeongjo-Regular-subset.gids.61.ttx       |   2032 +
+ .../NanumMyeongjo-Regular-subset.gids.62.ttf       |    Bin 4128 -> 0 bytes
+ .../NanumMyeongjo-Regular-subset.gids.62.ttx       |   2032 +
+ .../NanumMyeongjo-Regular-subset.gids.63.ttf       |    Bin 4128 -> 0 bytes
+ .../NanumMyeongjo-Regular-subset.gids.63.ttx       |   2032 +
+ ...jo-Regular-subset.gids.retain-all-codepoint.ttf |    Bin 9524 -> 0 bytes
+ ...jo-Regular-subset.gids.retain-all-codepoint.ttx |   4391 +
+ ...yeongjo-Regular-subset.glyph-names.61,62,63.ttf |    Bin 4128 -> 0 bytes
+ ...yeongjo-Regular-subset.glyph-names.61,62,63.ttx |   2032 +
+ ...umMyeongjo-Regular-subset.glyph-names.61,63.ttf |    Bin 3580 -> 0 bytes
+ ...umMyeongjo-Regular-subset.glyph-names.61,63.ttx |   1822 +
+ ...NanumMyeongjo-Regular-subset.glyph-names.61.ttf |    Bin 3156 -> 0 bytes
+ ...NanumMyeongjo-Regular-subset.glyph-names.61.ttx |   1696 +
+ ...NanumMyeongjo-Regular-subset.glyph-names.62.ttf |    Bin 3180 -> 0 bytes
+ ...NanumMyeongjo-Regular-subset.glyph-names.62.ttx |   1719 +
+ ...NanumMyeongjo-Regular-subset.glyph-names.63.ttf |    Bin 3048 -> 0 bytes
+ ...NanumMyeongjo-Regular-subset.glyph-names.63.ttx |   1635 +
+ ...lar-subset.glyph-names.retain-all-codepoint.ttf |    Bin 9524 -> 0 bytes
+ ...lar-subset.glyph-names.retain-all-codepoint.ttx |   4391 +
+ ...ar-subset.keep-all-layout-features.61,62,63.ttf |    Bin 4128 -> 0 bytes
+ ...ar-subset.keep-all-layout-features.61,62,63.ttx |   2032 +
+ ...gular-subset.keep-all-layout-features.61,63.ttf |    Bin 3580 -> 0 bytes
+ ...gular-subset.keep-all-layout-features.61,63.ttx |   1822 +
+ ...-Regular-subset.keep-all-layout-features.61.ttf |    Bin 3156 -> 0 bytes
+ ...-Regular-subset.keep-all-layout-features.61.ttx |   1696 +
+ ...-Regular-subset.keep-all-layout-features.62.ttf |    Bin 3180 -> 0 bytes
+ ...-Regular-subset.keep-all-layout-features.62.ttx |   1719 +
+ ...-Regular-subset.keep-all-layout-features.63.ttf |    Bin 3048 -> 0 bytes
+ ...-Regular-subset.keep-all-layout-features.63.ttx |   1635 +
+ ...ep-all-layout-features.retain-all-codepoint.ttf |    Bin 9524 -> 0 bytes
+ ...ep-all-layout-features.retain-all-codepoint.ttx |   4391 +
+ ...gjo-Regular-subset.layout-features.61,62,63.ttf |    Bin 4128 -> 0 bytes
+ ...gjo-Regular-subset.layout-features.61,62,63.ttx |   2032 +
+ ...eongjo-Regular-subset.layout-features.61,63.ttf |    Bin 3580 -> 0 bytes
+ ...eongjo-Regular-subset.layout-features.61,63.ttx |   1822 +
+ ...mMyeongjo-Regular-subset.layout-features.61.ttf |    Bin 3156 -> 0 bytes
+ ...mMyeongjo-Regular-subset.layout-features.61.ttx |   1696 +
+ ...mMyeongjo-Regular-subset.layout-features.62.ttf |    Bin 3180 -> 0 bytes
+ ...mMyeongjo-Regular-subset.layout-features.62.ttx |   1719 +
+ ...mMyeongjo-Regular-subset.layout-features.63.ttf |    Bin 3048 -> 0 bytes
+ ...mMyeongjo-Regular-subset.layout-features.63.ttx |   1635 +
+ ...subset.layout-features.retain-all-codepoint.ttf |    Bin 9524 -> 0 bytes
+ ...subset.layout-features.retain-all-codepoint.ttx |   4391 +
+ ...umMyeongjo-Regular-subset.name-ids.61,62,63.ttf |    Bin 3924 -> 0 bytes
+ ...umMyeongjo-Regular-subset.name-ids.61,62,63.ttx |   2020 +
+ ...NanumMyeongjo-Regular-subset.name-ids.61,63.ttf |    Bin 3376 -> 0 bytes
+ ...NanumMyeongjo-Regular-subset.name-ids.61,63.ttx |   1810 +
+ .../NanumMyeongjo-Regular-subset.name-ids.61.ttf   |    Bin 2952 -> 0 bytes
+ .../NanumMyeongjo-Regular-subset.name-ids.61.ttx   |   1684 +
+ .../NanumMyeongjo-Regular-subset.name-ids.62.ttf   |    Bin 2976 -> 0 bytes
+ .../NanumMyeongjo-Regular-subset.name-ids.62.ttx   |   1707 +
+ .../NanumMyeongjo-Regular-subset.name-ids.63.ttf   |    Bin 2844 -> 0 bytes
+ .../NanumMyeongjo-Regular-subset.name-ids.63.ttx   |   1623 +
+ ...egular-subset.name-ids.retain-all-codepoint.ttf |    Bin 9320 -> 0 bytes
+ ...egular-subset.name-ids.retain-all-codepoint.ttx |   4379 +
+ ...ngjo-Regular-subset.name-languages.61,62,63.ttf |    Bin 4172 -> 0 bytes
+ ...ngjo-Regular-subset.name-languages.61,62,63.ttx |   2041 +
+ ...yeongjo-Regular-subset.name-languages.61,63.ttf |    Bin 3624 -> 0 bytes
+ ...yeongjo-Regular-subset.name-languages.61,63.ttx |   1831 +
+ ...umMyeongjo-Regular-subset.name-languages.61.ttf |    Bin 3200 -> 0 bytes
+ ...umMyeongjo-Regular-subset.name-languages.61.ttx |   1705 +
+ ...umMyeongjo-Regular-subset.name-languages.62.ttf |    Bin 3224 -> 0 bytes
+ ...umMyeongjo-Regular-subset.name-languages.62.ttx |   1728 +
+ ...umMyeongjo-Regular-subset.name-languages.63.ttf |    Bin 3092 -> 0 bytes
+ ...umMyeongjo-Regular-subset.name-languages.63.ttx |   1644 +
+ ...-subset.name-languages.retain-all-codepoint.ttf |    Bin 9568 -> 0 bytes
+ ...-subset.name-languages.retain-all-codepoint.ttx |   4400 +
+ ...yeongjo-Regular-subset.name-legacy.61,62,63.ttf |    Bin 4128 -> 0 bytes
+ ...yeongjo-Regular-subset.name-legacy.61,62,63.ttx |   2032 +
+ ...umMyeongjo-Regular-subset.name-legacy.61,63.ttf |    Bin 3580 -> 0 bytes
+ ...umMyeongjo-Regular-subset.name-legacy.61,63.ttx |   1822 +
+ ...NanumMyeongjo-Regular-subset.name-legacy.61.ttf |    Bin 3156 -> 0 bytes
+ ...NanumMyeongjo-Regular-subset.name-legacy.61.ttx |   1696 +
+ ...NanumMyeongjo-Regular-subset.name-legacy.62.ttf |    Bin 3180 -> 0 bytes
+ ...NanumMyeongjo-Regular-subset.name-legacy.62.ttx |   1719 +
+ ...NanumMyeongjo-Regular-subset.name-legacy.63.ttf |    Bin 3048 -> 0 bytes
+ ...NanumMyeongjo-Regular-subset.name-legacy.63.ttx |   1635 +
+ ...lar-subset.name-legacy.retain-all-codepoint.ttf |    Bin 9524 -> 0 bytes
+ ...lar-subset.name-legacy.retain-all-codepoint.ttx |   4391 +
+ ...lar-subset.no-prune-unicode-ranges.61,62,63.ttf |    Bin 4128 -> 0 bytes
+ ...lar-subset.no-prune-unicode-ranges.61,62,63.ttx |   2032 +
+ ...egular-subset.no-prune-unicode-ranges.61,63.ttf |    Bin 3580 -> 0 bytes
+ ...egular-subset.no-prune-unicode-ranges.61,63.ttx |   1822 +
+ ...o-Regular-subset.no-prune-unicode-ranges.61.ttf |    Bin 3156 -> 0 bytes
+ ...o-Regular-subset.no-prune-unicode-ranges.61.ttx |   1696 +
+ ...o-Regular-subset.no-prune-unicode-ranges.62.ttf |    Bin 3180 -> 0 bytes
+ ...o-Regular-subset.no-prune-unicode-ranges.62.ttx |   1719 +
+ ...o-Regular-subset.no-prune-unicode-ranges.63.ttf |    Bin 3048 -> 0 bytes
+ ...o-Regular-subset.no-prune-unicode-ranges.63.ttx |   1635 +
+ ...o-prune-unicode-ranges.retain-all-codepoint.ttf |    Bin 9524 -> 0 bytes
+ ...o-prune-unicode-ranges.retain-all-codepoint.ttx |   4391 +
+ ...ngjo-Regular-subset.notdef-outline.61,62,63.ttf |    Bin 4128 -> 0 bytes
+ ...ngjo-Regular-subset.notdef-outline.61,62,63.ttx |   2032 +
+ ...yeongjo-Regular-subset.notdef-outline.61,63.ttf |    Bin 3580 -> 0 bytes
+ ...yeongjo-Regular-subset.notdef-outline.61,63.ttx |   1822 +
+ ...umMyeongjo-Regular-subset.notdef-outline.61.ttf |    Bin 3156 -> 0 bytes
+ ...umMyeongjo-Regular-subset.notdef-outline.61.ttx |   1696 +
+ ...umMyeongjo-Regular-subset.notdef-outline.62.ttf |    Bin 3180 -> 0 bytes
+ ...umMyeongjo-Regular-subset.notdef-outline.62.ttx |   1719 +
+ ...umMyeongjo-Regular-subset.notdef-outline.63.ttf |    Bin 3048 -> 0 bytes
+ ...umMyeongjo-Regular-subset.notdef-outline.63.ttx |   1635 +
+ ...-subset.notdef-outline.retain-all-codepoint.ttf |    Bin 9524 -> 0 bytes
+ ...-subset.notdef-outline.retain-all-codepoint.ttx |   4391 +
+ ...yeongjo-Regular-subset.retain-gids.61,62,63.ttf |    Bin 4128 -> 0 bytes
+ ...yeongjo-Regular-subset.retain-gids.61,62,63.ttx |   2032 +
+ ...umMyeongjo-Regular-subset.retain-gids.61,63.ttf |    Bin 3588 -> 0 bytes
+ ...umMyeongjo-Regular-subset.retain-gids.61,63.ttx |   1826 +
+ ...NanumMyeongjo-Regular-subset.retain-gids.61.ttf |    Bin 3156 -> 0 bytes
+ ...NanumMyeongjo-Regular-subset.retain-gids.61.ttx |   1696 +
+ ...NanumMyeongjo-Regular-subset.retain-gids.62.ttf |    Bin 3184 -> 0 bytes
+ ...NanumMyeongjo-Regular-subset.retain-gids.62.ttx |   1723 +
+ ...NanumMyeongjo-Regular-subset.retain-gids.63.ttf |    Bin 3060 -> 0 bytes
+ ...NanumMyeongjo-Regular-subset.retain-gids.63.ttx |   1643 +
+ ...lar-subset.retain-gids.retain-all-codepoint.ttf |    Bin 9524 -> 0 bytes
+ ...lar-subset.retain-gids.retain-all-codepoint.ttx |   4391 +
+ .../basics/Roboto-Regular.abc.default.61,62,63.ttf |    Bin 2452 -> 0 bytes
+ .../basics/Roboto-Regular.abc.default.61,62,63.ttx |   1407 +
+ .../basics/Roboto-Regular.abc.default.61,63.ttf    |    Bin 2260 -> 0 bytes
+ .../basics/Roboto-Regular.abc.default.61,63.ttx    |   1259 +
+ .../basics/Roboto-Regular.abc.default.61.ttf       |    Bin 2048 -> 0 bytes
+ .../basics/Roboto-Regular.abc.default.61.ttx       |   1127 +
+ .../basics/Roboto-Regular.abc.default.62.ttf       |    Bin 1916 -> 0 bytes
+ .../basics/Roboto-Regular.abc.default.62.ttx       |   1025 +
+ .../basics/Roboto-Regular.abc.default.63.ttf       |    Bin 1972 -> 0 bytes
+ .../basics/Roboto-Regular.abc.default.63.ttx       |   1073 +
+ ...to-Regular.abc.default.retain-all-codepoint.ttf |    Bin 2452 -> 0 bytes
+ ...to-Regular.abc.default.retain-all-codepoint.ttx |   1407 +
+ ...Regular.abc.drop-hints-retain-gids.61,62,63.ttf |    Bin 1192 -> 0 bytes
+ ...Regular.abc.drop-hints-retain-gids.61,62,63.ttx |    479 +
+ ...to-Regular.abc.drop-hints-retain-gids.61,63.ttf |    Bin 1124 -> 0 bytes
+ ...to-Regular.abc.drop-hints-retain-gids.61,63.ttx |    433 +
+ ...oboto-Regular.abc.drop-hints-retain-gids.61.ttf |    Bin 984 -> 0 bytes
+ ...oboto-Regular.abc.drop-hints-retain-gids.61.ttx |    374 +
+ ...oboto-Regular.abc.drop-hints-retain-gids.62.ttf |    Bin 880 -> 0 bytes
+ ...oboto-Regular.abc.drop-hints-retain-gids.62.ttx |    297 +
+ ...oboto-Regular.abc.drop-hints-retain-gids.63.ttf |    Bin 968 -> 0 bytes
+ ...oboto-Regular.abc.drop-hints-retain-gids.63.ttx |    369 +
+ ...drop-hints-retain-gids.retain-all-codepoint.ttf |    Bin 1192 -> 0 bytes
+ ...drop-hints-retain-gids.retain-all-codepoint.ttx |    479 +
+ .../Roboto-Regular.abc.drop-hints.61,62,63.ttf     |    Bin 1192 -> 0 bytes
+ .../Roboto-Regular.abc.drop-hints.61,62,63.ttx     |    479 +
+ .../basics/Roboto-Regular.abc.drop-hints.61,63.ttf |    Bin 1108 -> 0 bytes
+ .../basics/Roboto-Regular.abc.drop-hints.61,63.ttx |    429 +
+ .../basics/Roboto-Regular.abc.drop-hints.61.ttf    |    Bin 984 -> 0 bytes
+ .../basics/Roboto-Regular.abc.drop-hints.61.ttx    |    374 +
+ .../basics/Roboto-Regular.abc.drop-hints.62.ttf    |    Bin 876 -> 0 bytes
+ .../basics/Roboto-Regular.abc.drop-hints.62.ttx    |    293 +
+ .../basics/Roboto-Regular.abc.drop-hints.63.ttf    |    Bin 956 -> 0 bytes
+ .../basics/Roboto-Regular.abc.drop-hints.63.ttx    |    361 +
+ ...Regular.abc.drop-hints.retain-all-codepoint.ttf |    Bin 1192 -> 0 bytes
+ ...Regular.abc.drop-hints.retain-all-codepoint.ttx |    479 +
+ .../basics/Roboto-Regular.abc.gids.61,62,63.ttf    |    Bin 2452 -> 0 bytes
+ .../basics/Roboto-Regular.abc.gids.61,62,63.ttx    |   1407 +
+ .../basics/Roboto-Regular.abc.gids.61,63.ttf       |    Bin 2452 -> 0 bytes
+ .../basics/Roboto-Regular.abc.gids.61,63.ttx       |   1407 +
+ .../expected/basics/Roboto-Regular.abc.gids.61.ttf |    Bin 2452 -> 0 bytes
+ .../expected/basics/Roboto-Regular.abc.gids.61.ttx |   1407 +
+ .../expected/basics/Roboto-Regular.abc.gids.62.ttf |    Bin 2452 -> 0 bytes
+ .../expected/basics/Roboto-Regular.abc.gids.62.ttx |   1407 +
+ .../expected/basics/Roboto-Regular.abc.gids.63.ttf |    Bin 2452 -> 0 bytes
+ .../expected/basics/Roboto-Regular.abc.gids.63.ttx |   1407 +
+ ...oboto-Regular.abc.gids.retain-all-codepoint.ttf |    Bin 2452 -> 0 bytes
+ ...oboto-Regular.abc.gids.retain-all-codepoint.ttx |   1407 +
+ .../Roboto-Regular.abc.glyph-names.61,62,63.ttf    |    Bin 2452 -> 0 bytes
+ .../Roboto-Regular.abc.glyph-names.61,62,63.ttx    |   1407 +
+ .../Roboto-Regular.abc.glyph-names.61,63.ttf       |    Bin 2260 -> 0 bytes
+ .../Roboto-Regular.abc.glyph-names.61,63.ttx       |   1259 +
+ .../basics/Roboto-Regular.abc.glyph-names.61.ttf   |    Bin 2048 -> 0 bytes
+ .../basics/Roboto-Regular.abc.glyph-names.61.ttx   |   1127 +
+ .../basics/Roboto-Regular.abc.glyph-names.62.ttf   |    Bin 1916 -> 0 bytes
+ .../basics/Roboto-Regular.abc.glyph-names.62.ttx   |   1025 +
+ .../basics/Roboto-Regular.abc.glyph-names.63.ttf   |    Bin 1972 -> 0 bytes
+ .../basics/Roboto-Regular.abc.glyph-names.63.ttx   |   1073 +
+ ...egular.abc.glyph-names.retain-all-codepoint.ttf |    Bin 2452 -> 0 bytes
+ ...egular.abc.glyph-names.retain-all-codepoint.ttx |   1407 +
+ ...gular.abc.keep-all-layout-features.61,62,63.ttf |    Bin 2452 -> 0 bytes
+ ...gular.abc.keep-all-layout-features.61,62,63.ttx |   1407 +
+ ...-Regular.abc.keep-all-layout-features.61,63.ttf |    Bin 2260 -> 0 bytes
+ ...-Regular.abc.keep-all-layout-features.61,63.ttx |   1259 +
+ ...oto-Regular.abc.keep-all-layout-features.61.ttf |    Bin 2048 -> 0 bytes
+ ...oto-Regular.abc.keep-all-layout-features.61.ttx |   1127 +
+ ...oto-Regular.abc.keep-all-layout-features.62.ttf |    Bin 1916 -> 0 bytes
+ ...oto-Regular.abc.keep-all-layout-features.62.ttx |   1025 +
+ ...oto-Regular.abc.keep-all-layout-features.63.ttf |    Bin 1972 -> 0 bytes
+ ...oto-Regular.abc.keep-all-layout-features.63.ttx |   1073 +
+ ...ep-all-layout-features.retain-all-codepoint.ttf |    Bin 2452 -> 0 bytes
+ ...ep-all-layout-features.retain-all-codepoint.ttx |   1407 +
+ ...Roboto-Regular.abc.layout-features.61,62,63.ttf |    Bin 2452 -> 0 bytes
+ ...Roboto-Regular.abc.layout-features.61,62,63.ttx |   1407 +
+ .../Roboto-Regular.abc.layout-features.61,63.ttf   |    Bin 2260 -> 0 bytes
+ .../Roboto-Regular.abc.layout-features.61,63.ttx   |   1259 +
+ .../Roboto-Regular.abc.layout-features.61.ttf      |    Bin 2048 -> 0 bytes
+ .../Roboto-Regular.abc.layout-features.61.ttx      |   1127 +
+ .../Roboto-Regular.abc.layout-features.62.ttf      |    Bin 1916 -> 0 bytes
+ .../Roboto-Regular.abc.layout-features.62.ttx      |   1025 +
+ .../Roboto-Regular.abc.layout-features.63.ttf      |    Bin 1972 -> 0 bytes
+ .../Roboto-Regular.abc.layout-features.63.ttx      |   1073 +
+ ...ar.abc.layout-features.retain-all-codepoint.ttf |    Bin 2452 -> 0 bytes
+ ...ar.abc.layout-features.retain-all-codepoint.ttx |   1407 +
+ .../Roboto-Regular.abc.name-ids.61,62,63.ttf       |    Bin 2452 -> 0 bytes
+ .../Roboto-Regular.abc.name-ids.61,62,63.ttx       |   1407 +
+ .../basics/Roboto-Regular.abc.name-ids.61,63.ttf   |    Bin 2260 -> 0 bytes
+ .../basics/Roboto-Regular.abc.name-ids.61,63.ttx   |   1259 +
+ .../basics/Roboto-Regular.abc.name-ids.61.ttf      |    Bin 2048 -> 0 bytes
+ .../basics/Roboto-Regular.abc.name-ids.61.ttx      |   1127 +
+ .../basics/Roboto-Regular.abc.name-ids.62.ttf      |    Bin 1916 -> 0 bytes
+ .../basics/Roboto-Regular.abc.name-ids.62.ttx      |   1025 +
+ .../basics/Roboto-Regular.abc.name-ids.63.ttf      |    Bin 1972 -> 0 bytes
+ .../basics/Roboto-Regular.abc.name-ids.63.ttx      |   1073 +
+ ...o-Regular.abc.name-ids.retain-all-codepoint.ttf |    Bin 2452 -> 0 bytes
+ ...o-Regular.abc.name-ids.retain-all-codepoint.ttx |   1407 +
+ .../Roboto-Regular.abc.name-languages.61,62,63.ttf |    Bin 2452 -> 0 bytes
+ .../Roboto-Regular.abc.name-languages.61,62,63.ttx |   1407 +
+ .../Roboto-Regular.abc.name-languages.61,63.ttf    |    Bin 2260 -> 0 bytes
+ .../Roboto-Regular.abc.name-languages.61,63.ttx    |   1259 +
+ .../Roboto-Regular.abc.name-languages.61.ttf       |    Bin 2048 -> 0 bytes
+ .../Roboto-Regular.abc.name-languages.61.ttx       |   1127 +
+ .../Roboto-Regular.abc.name-languages.62.ttf       |    Bin 1916 -> 0 bytes
+ .../Roboto-Regular.abc.name-languages.62.ttx       |   1025 +
+ .../Roboto-Regular.abc.name-languages.63.ttf       |    Bin 1972 -> 0 bytes
+ .../Roboto-Regular.abc.name-languages.63.ttx       |   1073 +
+ ...lar.abc.name-languages.retain-all-codepoint.ttf |    Bin 2452 -> 0 bytes
+ ...lar.abc.name-languages.retain-all-codepoint.ttx |   1407 +
+ .../Roboto-Regular.abc.name-legacy.61,62,63.ttf    |    Bin 2452 -> 0 bytes
+ .../Roboto-Regular.abc.name-legacy.61,62,63.ttx    |   1407 +
+ .../Roboto-Regular.abc.name-legacy.61,63.ttf       |    Bin 2260 -> 0 bytes
+ .../Roboto-Regular.abc.name-legacy.61,63.ttx       |   1259 +
+ .../basics/Roboto-Regular.abc.name-legacy.61.ttf   |    Bin 2048 -> 0 bytes
+ .../basics/Roboto-Regular.abc.name-legacy.61.ttx   |   1127 +
+ .../basics/Roboto-Regular.abc.name-legacy.62.ttf   |    Bin 1916 -> 0 bytes
+ .../basics/Roboto-Regular.abc.name-legacy.62.ttx   |   1025 +
+ .../basics/Roboto-Regular.abc.name-legacy.63.ttf   |    Bin 1972 -> 0 bytes
+ .../basics/Roboto-Regular.abc.name-legacy.63.ttx   |   1073 +
+ ...egular.abc.name-legacy.retain-all-codepoint.ttf |    Bin 2452 -> 0 bytes
+ ...egular.abc.name-legacy.retain-all-codepoint.ttx |   1407 +
+ ...egular.abc.no-prune-unicode-ranges.61,62,63.ttf |    Bin 2452 -> 0 bytes
+ ...egular.abc.no-prune-unicode-ranges.61,62,63.ttx |   1407 +
+ ...o-Regular.abc.no-prune-unicode-ranges.61,63.ttf |    Bin 2260 -> 0 bytes
+ ...o-Regular.abc.no-prune-unicode-ranges.61,63.ttx |   1259 +
+ ...boto-Regular.abc.no-prune-unicode-ranges.61.ttf |    Bin 2048 -> 0 bytes
+ ...boto-Regular.abc.no-prune-unicode-ranges.61.ttx |   1127 +
+ ...boto-Regular.abc.no-prune-unicode-ranges.62.ttf |    Bin 1916 -> 0 bytes
+ ...boto-Regular.abc.no-prune-unicode-ranges.62.ttx |   1025 +
+ ...boto-Regular.abc.no-prune-unicode-ranges.63.ttf |    Bin 1972 -> 0 bytes
+ ...boto-Regular.abc.no-prune-unicode-ranges.63.ttx |   1073 +
+ ...o-prune-unicode-ranges.retain-all-codepoint.ttf |    Bin 2452 -> 0 bytes
+ ...o-prune-unicode-ranges.retain-all-codepoint.ttx |   1407 +
+ .../Roboto-Regular.abc.notdef-outline.61,62,63.ttf |    Bin 2452 -> 0 bytes
+ .../Roboto-Regular.abc.notdef-outline.61,62,63.ttx |   1407 +
+ .../Roboto-Regular.abc.notdef-outline.61,63.ttf    |    Bin 2260 -> 0 bytes
+ .../Roboto-Regular.abc.notdef-outline.61,63.ttx    |   1259 +
+ .../Roboto-Regular.abc.notdef-outline.61.ttf       |    Bin 2048 -> 0 bytes
+ .../Roboto-Regular.abc.notdef-outline.61.ttx       |   1127 +
+ .../Roboto-Regular.abc.notdef-outline.62.ttf       |    Bin 1916 -> 0 bytes
+ .../Roboto-Regular.abc.notdef-outline.62.ttx       |   1025 +
+ .../Roboto-Regular.abc.notdef-outline.63.ttf       |    Bin 1972 -> 0 bytes
+ .../Roboto-Regular.abc.notdef-outline.63.ttx       |   1073 +
+ ...lar.abc.notdef-outline.retain-all-codepoint.ttf |    Bin 2452 -> 0 bytes
+ ...lar.abc.notdef-outline.retain-all-codepoint.ttx |   1407 +
+ .../Roboto-Regular.abc.retain-gids.61,62,63.ttf    |    Bin 2452 -> 0 bytes
+ .../Roboto-Regular.abc.retain-gids.61,62,63.ttx    |   1407 +
+ .../Roboto-Regular.abc.retain-gids.61,63.ttf       |    Bin 2276 -> 0 bytes
+ .../Roboto-Regular.abc.retain-gids.61,63.ttx       |   1264 +
+ .../basics/Roboto-Regular.abc.retain-gids.61.ttf   |    Bin 2048 -> 0 bytes
+ .../basics/Roboto-Regular.abc.retain-gids.61.ttx   |   1127 +
+ .../basics/Roboto-Regular.abc.retain-gids.62.ttf   |    Bin 1924 -> 0 bytes
+ .../basics/Roboto-Regular.abc.retain-gids.62.ttx   |   1030 +
+ .../basics/Roboto-Regular.abc.retain-gids.63.ttf   |    Bin 1988 -> 0 bytes
+ .../basics/Roboto-Regular.abc.retain-gids.63.ttx   |   1083 +
+ ...egular.abc.retain-gids.retain-all-codepoint.ttf |    Bin 2452 -> 0 bytes
+ ...egular.abc.retain-gids.retain-all-codepoint.ttx |   1407 +
+ .../cbdt/NotoColorEmoji.subset.default.2049.ttf    |    Bin 3112 -> 0 bytes
+ .../cbdt/NotoColorEmoji.subset.default.2049.ttx    |    397 +
+ .../cbdt/NotoColorEmoji.subset.default.38,2049.ttf |    Bin 4084 -> 0 bytes
+ .../cbdt/NotoColorEmoji.subset.default.38,2049.ttx |    474 +
+ .../cbdt/NotoColorEmoji.subset.default.38,20E3.ttf |    Bin 3568 -> 0 bytes
+ .../cbdt/NotoColorEmoji.subset.default.38,20E3.ttx |    441 +
+ ...rEmoji.subset.default.38,39,AE,2049,38,20E3.ttf |    Bin 10124 -> 0 bytes
+ ...rEmoji.subset.default.38,39,AE,2049,38,20E3.ttx |    898 +
+ .../NotoColorEmoji.subset.default.38,AE,2049.ttf   |    Bin 7544 -> 0 bytes
+ .../NotoColorEmoji.subset.default.38,AE,2049.ttx   |    705 +
+ .../cbdt/NotoColorEmoji.subset.default.39.ttf      |    Bin 1920 -> 0 bytes
+ .../cbdt/NotoColorEmoji.subset.default.39.ttx      |    323 +
+ .../cbdt/NotoColorEmoji.subset.default.AE.ttf      |    Bin 4412 -> 0 bytes
+ .../cbdt/NotoColorEmoji.subset.default.AE.ttx      |    478 +
+ ...lorEmoji.subset.drop-hints-retain-gids.2049.ttf |    Bin 3136 -> 0 bytes
+ ...lorEmoji.subset.drop-hints-retain-gids.2049.ttx |    406 +
+ ...Emoji.subset.drop-hints-retain-gids.38,2049.ttf |    Bin 4108 -> 0 bytes
+ ...Emoji.subset.drop-hints-retain-gids.38,2049.ttx |    480 +
+ ...Emoji.subset.drop-hints-retain-gids.38,20E3.ttf |    Bin 3600 -> 0 bytes
+ ...Emoji.subset.drop-hints-retain-gids.38,20E3.ttx |    450 +
+ ...rop-hints-retain-gids.38,39,AE,2049,38,20E3.ttf |    Bin 10124 -> 0 bytes
+ ...rop-hints-retain-gids.38,39,AE,2049,38,20E3.ttx |    898 +
+ ...ji.subset.drop-hints-retain-gids.38,AE,2049.ttf |    Bin 7564 -> 0 bytes
+ ...ji.subset.drop-hints-retain-gids.38,AE,2049.ttx |    708 +
+ ...ColorEmoji.subset.drop-hints-retain-gids.39.ttf |    Bin 1928 -> 0 bytes
+ ...ColorEmoji.subset.drop-hints-retain-gids.39.ttx |    326 +
+ ...ColorEmoji.subset.drop-hints-retain-gids.AE.ttf |    Bin 4428 -> 0 bytes
+ ...ColorEmoji.subset.drop-hints-retain-gids.AE.ttx |    484 +
+ .../cbdt/NotoColorEmoji.subset.drop-hints.2049.ttf |    Bin 3112 -> 0 bytes
+ .../cbdt/NotoColorEmoji.subset.drop-hints.2049.ttx |    397 +
+ .../NotoColorEmoji.subset.drop-hints.38,2049.ttf   |    Bin 4084 -> 0 bytes
+ .../NotoColorEmoji.subset.drop-hints.38,2049.ttx   |    474 +
+ .../NotoColorEmoji.subset.drop-hints.38,20E3.ttf   |    Bin 3568 -> 0 bytes
+ .../NotoColorEmoji.subset.drop-hints.38,20E3.ttx   |    441 +
+ ...oji.subset.drop-hints.38,39,AE,2049,38,20E3.ttf |    Bin 10124 -> 0 bytes
+ ...oji.subset.drop-hints.38,39,AE,2049,38,20E3.ttx |    898 +
+ ...NotoColorEmoji.subset.drop-hints.38,AE,2049.ttf |    Bin 7544 -> 0 bytes
+ ...NotoColorEmoji.subset.drop-hints.38,AE,2049.ttx |    705 +
+ .../cbdt/NotoColorEmoji.subset.drop-hints.39.ttf   |    Bin 1920 -> 0 bytes
+ .../cbdt/NotoColorEmoji.subset.drop-hints.39.ttx   |    323 +
+ .../cbdt/NotoColorEmoji.subset.drop-hints.AE.ttf   |    Bin 4412 -> 0 bytes
+ .../cbdt/NotoColorEmoji.subset.drop-hints.AE.ttx   |    478 +
+ .../NotoColorEmoji.subset.gap.default.2049.ttf     |    Bin 3112 -> 0 bytes
+ .../NotoColorEmoji.subset.gap.default.2049.ttx     |    397 +
+ .../NotoColorEmoji.subset.gap.default.38,2049.ttf  |    Bin 4084 -> 0 bytes
+ .../NotoColorEmoji.subset.gap.default.38,2049.ttx  |    474 +
+ .../NotoColorEmoji.subset.gap.default.38,20E3.ttf  |    Bin 3568 -> 0 bytes
+ .../NotoColorEmoji.subset.gap.default.38,20E3.ttx  |    441 +
+ ...ji.subset.gap.default.38,39,AE,2049,38,20E3.ttf |    Bin 9188 -> 0 bytes
+ ...ji.subset.gap.default.38,39,AE,2049,38,20E3.ttx |    827 +
+ ...otoColorEmoji.subset.gap.default.38,AE,2049.ttf |    Bin 7544 -> 0 bytes
+ ...otoColorEmoji.subset.gap.default.38,AE,2049.ttx |    705 +
+ .../cbdt/NotoColorEmoji.subset.gap.default.39.ttf  |    Bin 908 -> 0 bytes
+ .../cbdt/NotoColorEmoji.subset.gap.default.39.ttx  |    207 +
+ .../cbdt/NotoColorEmoji.subset.gap.default.AE.ttf  |    Bin 4412 -> 0 bytes
+ .../cbdt/NotoColorEmoji.subset.gap.default.AE.ttx  |    478 +
+ ...moji.subset.gap.drop-hints-retain-gids.2049.ttf |    Bin 3136 -> 0 bytes
+ ...moji.subset.gap.drop-hints-retain-gids.2049.ttx |    406 +
+ ...i.subset.gap.drop-hints-retain-gids.38,2049.ttf |    Bin 4108 -> 0 bytes
+ ...i.subset.gap.drop-hints-retain-gids.38,2049.ttx |    480 +
+ ...i.subset.gap.drop-hints-retain-gids.38,20E3.ttf |    Bin 3600 -> 0 bytes
+ ...i.subset.gap.drop-hints-retain-gids.38,20E3.ttx |    450 +
+ ...rop-hints-retain-gids.38,39,AE,2049,38,20E3.ttf |    Bin 9188 -> 0 bytes
+ ...rop-hints-retain-gids.38,39,AE,2049,38,20E3.ttx |    827 +
+ ...ubset.gap.drop-hints-retain-gids.38,AE,2049.ttf |    Bin 7564 -> 0 bytes
+ ...ubset.gap.drop-hints-retain-gids.38,AE,2049.ttx |    708 +
+ ...rEmoji.subset.gap.drop-hints-retain-gids.39.ttf |    Bin 916 -> 0 bytes
+ ...rEmoji.subset.gap.drop-hints-retain-gids.39.ttx |    210 +
+ ...rEmoji.subset.gap.drop-hints-retain-gids.AE.ttf |    Bin 4428 -> 0 bytes
+ ...rEmoji.subset.gap.drop-hints-retain-gids.AE.ttx |    484 +
+ .../NotoColorEmoji.subset.gap.drop-hints.2049.ttf  |    Bin 3112 -> 0 bytes
+ .../NotoColorEmoji.subset.gap.drop-hints.2049.ttx  |    397 +
+ ...otoColorEmoji.subset.gap.drop-hints.38,2049.ttf |    Bin 4084 -> 0 bytes
+ ...otoColorEmoji.subset.gap.drop-hints.38,2049.ttx |    474 +
+ ...otoColorEmoji.subset.gap.drop-hints.38,20E3.ttf |    Bin 3568 -> 0 bytes
+ ...otoColorEmoji.subset.gap.drop-hints.38,20E3.ttx |    441 +
+ ...subset.gap.drop-hints.38,39,AE,2049,38,20E3.ttf |    Bin 9188 -> 0 bytes
+ ...subset.gap.drop-hints.38,39,AE,2049,38,20E3.ttx |    827 +
+ ...ColorEmoji.subset.gap.drop-hints.38,AE,2049.ttf |    Bin 7544 -> 0 bytes
+ ...ColorEmoji.subset.gap.drop-hints.38,AE,2049.ttx |    705 +
+ .../NotoColorEmoji.subset.gap.drop-hints.39.ttf    |    Bin 908 -> 0 bytes
+ .../NotoColorEmoji.subset.gap.drop-hints.39.ttx    |    207 +
+ .../NotoColorEmoji.subset.gap.drop-hints.AE.ttf    |    Bin 4412 -> 0 bytes
+ .../NotoColorEmoji.subset.gap.drop-hints.AE.ttx    |    478 +
+ .../NotoColorEmoji.subset.gap.retain-gids.2049.ttf |    Bin 3136 -> 0 bytes
+ .../NotoColorEmoji.subset.gap.retain-gids.2049.ttx |    406 +
+ ...toColorEmoji.subset.gap.retain-gids.38,2049.ttf |    Bin 4108 -> 0 bytes
+ ...toColorEmoji.subset.gap.retain-gids.38,2049.ttx |    480 +
+ ...toColorEmoji.subset.gap.retain-gids.38,20E3.ttf |    Bin 3600 -> 0 bytes
+ ...toColorEmoji.subset.gap.retain-gids.38,20E3.ttx |    450 +
+ ...ubset.gap.retain-gids.38,39,AE,2049,38,20E3.ttf |    Bin 9188 -> 0 bytes
+ ...ubset.gap.retain-gids.38,39,AE,2049,38,20E3.ttx |    827 +
+ ...olorEmoji.subset.gap.retain-gids.38,AE,2049.ttf |    Bin 7564 -> 0 bytes
+ ...olorEmoji.subset.gap.retain-gids.38,AE,2049.ttx |    708 +
+ .../NotoColorEmoji.subset.gap.retain-gids.39.ttf   |    Bin 916 -> 0 bytes
+ .../NotoColorEmoji.subset.gap.retain-gids.39.ttx   |    210 +
+ .../NotoColorEmoji.subset.gap.retain-gids.AE.ttf   |    Bin 4428 -> 0 bytes
+ .../NotoColorEmoji.subset.gap.retain-gids.AE.ttx   |    484 +
+ ...olorEmoji.subset.index_format3.default.2049.ttf |    Bin 3108 -> 0 bytes
+ ...olorEmoji.subset.index_format3.default.2049.ttx |    397 +
+ ...rEmoji.subset.index_format3.default.38,2049.ttf |    Bin 4076 -> 0 bytes
+ ...rEmoji.subset.index_format3.default.38,2049.ttx |    474 +
+ ...rEmoji.subset.index_format3.default.38,20E3.ttf |    Bin 3560 -> 0 bytes
+ ...rEmoji.subset.index_format3.default.38,20E3.ttx |    441 +
+ ...index_format3.default.38,39,AE,2049,38,20E3.ttf |    Bin 10112 -> 0 bytes
+ ...index_format3.default.38,39,AE,2049,38,20E3.ttx |    898 +
+ ...oji.subset.index_format3.default.38,AE,2049.ttf |    Bin 7536 -> 0 bytes
+ ...oji.subset.index_format3.default.38,AE,2049.ttx |    705 +
+ ...oColorEmoji.subset.index_format3.default.39.ttf |    Bin 1916 -> 0 bytes
+ ...oColorEmoji.subset.index_format3.default.39.ttx |    323 +
+ ...oColorEmoji.subset.index_format3.default.AE.ttf |    Bin 4408 -> 0 bytes
+ ...oColorEmoji.subset.index_format3.default.AE.ttx |    478 +
+ ...t.index_format3.drop-hints-retain-gids.2049.ttf |    Bin 3132 -> 0 bytes
+ ...t.index_format3.drop-hints-retain-gids.2049.ttx |    406 +
+ ...ndex_format3.drop-hints-retain-gids.38,2049.ttf |    Bin 4100 -> 0 bytes
+ ...ndex_format3.drop-hints-retain-gids.38,2049.ttx |    480 +
+ ...ndex_format3.drop-hints-retain-gids.38,20E3.ttf |    Bin 3592 -> 0 bytes
+ ...ndex_format3.drop-hints-retain-gids.38,20E3.ttx |    450 +
+ ...rop-hints-retain-gids.38,39,AE,2049,38,20E3.ttf |    Bin 10112 -> 0 bytes
+ ...rop-hints-retain-gids.38,39,AE,2049,38,20E3.ttx |    898 +
+ ...x_format3.drop-hints-retain-gids.38,AE,2049.ttf |    Bin 7552 -> 0 bytes
+ ...x_format3.drop-hints-retain-gids.38,AE,2049.ttx |    708 +
+ ...set.index_format3.drop-hints-retain-gids.39.ttf |    Bin 1924 -> 0 bytes
+ ...set.index_format3.drop-hints-retain-gids.39.ttx |    326 +
+ ...set.index_format3.drop-hints-retain-gids.AE.ttf |    Bin 4424 -> 0 bytes
+ ...set.index_format3.drop-hints-retain-gids.AE.ttx |    484 +
+ ...rEmoji.subset.index_format3.drop-hints.2049.ttf |    Bin 3108 -> 0 bytes
+ ...rEmoji.subset.index_format3.drop-hints.2049.ttx |    397 +
+ ...oji.subset.index_format3.drop-hints.38,2049.ttf |    Bin 4076 -> 0 bytes
+ ...oji.subset.index_format3.drop-hints.38,2049.ttx |    474 +
+ ...oji.subset.index_format3.drop-hints.38,20E3.ttf |    Bin 3560 -> 0 bytes
+ ...oji.subset.index_format3.drop-hints.38,20E3.ttx |    441 +
+ ...ex_format3.drop-hints.38,39,AE,2049,38,20E3.ttf |    Bin 10112 -> 0 bytes
+ ...ex_format3.drop-hints.38,39,AE,2049,38,20E3.ttx |    898 +
+ ....subset.index_format3.drop-hints.38,AE,2049.ttf |    Bin 7536 -> 0 bytes
+ ....subset.index_format3.drop-hints.38,AE,2049.ttx |    705 +
+ ...lorEmoji.subset.index_format3.drop-hints.39.ttf |    Bin 1916 -> 0 bytes
+ ...lorEmoji.subset.index_format3.drop-hints.39.ttx |    323 +
+ ...lorEmoji.subset.index_format3.drop-hints.AE.ttf |    Bin 4408 -> 0 bytes
+ ...lorEmoji.subset.index_format3.drop-hints.AE.ttx |    478 +
+ ...Emoji.subset.index_format3.retain-gids.2049.ttf |    Bin 3132 -> 0 bytes
+ ...Emoji.subset.index_format3.retain-gids.2049.ttx |    406 +
+ ...ji.subset.index_format3.retain-gids.38,2049.ttf |    Bin 4100 -> 0 bytes
+ ...ji.subset.index_format3.retain-gids.38,2049.ttx |    480 +
+ ...ji.subset.index_format3.retain-gids.38,20E3.ttf |    Bin 3592 -> 0 bytes
+ ...ji.subset.index_format3.retain-gids.38,20E3.ttx |    450 +
+ ...x_format3.retain-gids.38,39,AE,2049,38,20E3.ttf |    Bin 10112 -> 0 bytes
+ ...x_format3.retain-gids.38,39,AE,2049,38,20E3.ttx |    898 +
+ ...subset.index_format3.retain-gids.38,AE,2049.ttf |    Bin 7552 -> 0 bytes
+ ...subset.index_format3.retain-gids.38,AE,2049.ttx |    708 +
+ ...orEmoji.subset.index_format3.retain-gids.39.ttf |    Bin 1924 -> 0 bytes
+ ...orEmoji.subset.index_format3.retain-gids.39.ttx |    326 +
+ ...orEmoji.subset.index_format3.retain-gids.AE.ttf |    Bin 4424 -> 0 bytes
+ ...orEmoji.subset.index_format3.retain-gids.AE.ttx |    484 +
+ ...ji.subset.multiple_size_tables.default.2049.ttf |    Bin 5312 -> 0 bytes
+ ...ji.subset.multiple_size_tables.default.2049.ttx |    587 +
+ ...subset.multiple_size_tables.default.38,2049.ttf |    Bin 7244 -> 0 bytes
+ ...subset.multiple_size_tables.default.38,2049.ttx |    736 +
+ ...subset.multiple_size_tables.default.38,20E3.ttf |    Bin 6212 -> 0 bytes
+ ...subset.multiple_size_tables.default.38,20E3.ttx |    671 +
+ ...e_size_tables.default.38,39,AE,2049,38,20E3.ttf |    Bin 19280 -> 0 bytes
+ ...e_size_tables.default.38,39,AE,2049,38,20E3.ttx |   1570 +
+ ...set.multiple_size_tables.default.38,AE,2049.ttf |    Bin 14140 -> 0 bytes
+ ...set.multiple_size_tables.default.38,AE,2049.ttx |   1193 +
+ ...moji.subset.multiple_size_tables.default.39.ttf |    Bin 2928 -> 0 bytes
+ ...moji.subset.multiple_size_tables.default.39.ttx |    439 +
+ ...moji.subset.multiple_size_tables.default.AE.ttf |    Bin 7916 -> 0 bytes
+ ...moji.subset.multiple_size_tables.default.AE.ttx |    749 +
+ ...ple_size_tables.drop-hints-retain-gids.2049.ttf |    Bin 5336 -> 0 bytes
+ ...ple_size_tables.drop-hints-retain-gids.2049.ttx |    596 +
+ ..._size_tables.drop-hints-retain-gids.38,2049.ttf |    Bin 7268 -> 0 bytes
+ ..._size_tables.drop-hints-retain-gids.38,2049.ttx |    742 +
+ ..._size_tables.drop-hints-retain-gids.38,20E3.ttf |    Bin 6244 -> 0 bytes
+ ..._size_tables.drop-hints-retain-gids.38,20E3.ttx |    680 +
+ ...rop-hints-retain-gids.38,39,AE,2049,38,20E3.ttf |    Bin 19280 -> 0 bytes
+ ...rop-hints-retain-gids.38,39,AE,2049,38,20E3.ttx |   1570 +
+ ...ze_tables.drop-hints-retain-gids.38,AE,2049.ttf |    Bin 14164 -> 0 bytes
+ ...ze_tables.drop-hints-retain-gids.38,AE,2049.ttx |   1196 +
+ ...tiple_size_tables.drop-hints-retain-gids.39.ttf |    Bin 2936 -> 0 bytes
+ ...tiple_size_tables.drop-hints-retain-gids.39.ttx |    442 +
+ ...tiple_size_tables.drop-hints-retain-gids.AE.ttf |    Bin 7932 -> 0 bytes
+ ...tiple_size_tables.drop-hints-retain-gids.AE.ttx |    755 +
+ ...subset.multiple_size_tables.drop-hints.2049.ttf |    Bin 5312 -> 0 bytes
+ ...subset.multiple_size_tables.drop-hints.2049.ttx |    587 +
+ ...set.multiple_size_tables.drop-hints.38,2049.ttf |    Bin 7244 -> 0 bytes
+ ...set.multiple_size_tables.drop-hints.38,2049.ttx |    736 +
+ ...set.multiple_size_tables.drop-hints.38,20E3.ttf |    Bin 6212 -> 0 bytes
+ ...set.multiple_size_tables.drop-hints.38,20E3.ttx |    671 +
+ ...ize_tables.drop-hints.38,39,AE,2049,38,20E3.ttf |    Bin 19280 -> 0 bytes
+ ...ize_tables.drop-hints.38,39,AE,2049,38,20E3.ttx |   1570 +
+ ....multiple_size_tables.drop-hints.38,AE,2049.ttf |    Bin 14140 -> 0 bytes
+ ....multiple_size_tables.drop-hints.38,AE,2049.ttx |   1193 +
+ ...i.subset.multiple_size_tables.drop-hints.39.ttf |    Bin 2928 -> 0 bytes
+ ...i.subset.multiple_size_tables.drop-hints.39.ttx |    439 +
+ ...i.subset.multiple_size_tables.drop-hints.AE.ttf |    Bin 7916 -> 0 bytes
+ ...i.subset.multiple_size_tables.drop-hints.AE.ttx |    749 +
+ ...ubset.multiple_size_tables.retain-gids.2049.ttf |    Bin 5336 -> 0 bytes
+ ...ubset.multiple_size_tables.retain-gids.2049.ttx |    596 +
+ ...et.multiple_size_tables.retain-gids.38,2049.ttf |    Bin 7268 -> 0 bytes
+ ...et.multiple_size_tables.retain-gids.38,2049.ttx |    742 +
+ ...et.multiple_size_tables.retain-gids.38,20E3.ttf |    Bin 6244 -> 0 bytes
+ ...et.multiple_size_tables.retain-gids.38,20E3.ttx |    680 +
+ ...ze_tables.retain-gids.38,39,AE,2049,38,20E3.ttf |    Bin 19280 -> 0 bytes
+ ...ze_tables.retain-gids.38,39,AE,2049,38,20E3.ttx |   1570 +
+ ...multiple_size_tables.retain-gids.38,AE,2049.ttf |    Bin 14164 -> 0 bytes
+ ...multiple_size_tables.retain-gids.38,AE,2049.ttx |   1196 +
+ ....subset.multiple_size_tables.retain-gids.39.ttf |    Bin 2936 -> 0 bytes
+ ....subset.multiple_size_tables.retain-gids.39.ttx |    442 +
+ ....subset.multiple_size_tables.retain-gids.AE.ttf |    Bin 7932 -> 0 bytes
+ ....subset.multiple_size_tables.retain-gids.AE.ttx |    755 +
+ .../NotoColorEmoji.subset.retain-gids.2049.ttf     |    Bin 3136 -> 0 bytes
+ .../NotoColorEmoji.subset.retain-gids.2049.ttx     |    406 +
+ .../NotoColorEmoji.subset.retain-gids.38,2049.ttf  |    Bin 4108 -> 0 bytes
+ .../NotoColorEmoji.subset.retain-gids.38,2049.ttx  |    480 +
+ .../NotoColorEmoji.subset.retain-gids.38,20E3.ttf  |    Bin 3600 -> 0 bytes
+ .../NotoColorEmoji.subset.retain-gids.38,20E3.ttx  |    450 +
+ ...ji.subset.retain-gids.38,39,AE,2049,38,20E3.ttf |    Bin 10124 -> 0 bytes
+ ...ji.subset.retain-gids.38,39,AE,2049,38,20E3.ttx |    898 +
+ ...otoColorEmoji.subset.retain-gids.38,AE,2049.ttf |    Bin 7564 -> 0 bytes
+ ...otoColorEmoji.subset.retain-gids.38,AE,2049.ttx |    708 +
+ .../cbdt/NotoColorEmoji.subset.retain-gids.39.ttf  |    Bin 1928 -> 0 bytes
+ .../cbdt/NotoColorEmoji.subset.retain-gids.39.ttx  |    326 +
+ .../cbdt/NotoColorEmoji.subset.retain-gids.AE.ttf  |    Bin 4428 -> 0 bytes
+ .../cbdt/NotoColorEmoji.subset.retain-gids.AE.ttx  |    484 +
+ ...eSansPro-Regular.default.1FC,21,41,20,62,63.otf |    Bin 2580 -> 0 bytes
+ ...eSansPro-Regular.default.1FC,21,41,20,62,63.ttx |    738 +
+ .../SourceSansPro-Regular.default.61,62,63.otf     |    Bin 2216 -> 0 bytes
+ .../SourceSansPro-Regular.default.61,62,63.ttx     |    587 +
+ ...ourceSansPro-Regular.default.D7,D8,D9,DA,DE.otf |    Bin 2328 -> 0 bytes
+ ...ourceSansPro-Regular.default.D7,D8,D9,DA,DE.ttx |    578 +
+ ...subroutinize-retain-gids.1FC,21,41,20,62,63.otf |    Bin 20232 -> 0 bytes
+ ...subroutinize-retain-gids.1FC,21,41,20,62,63.ttx |   6312 +
+ ...Regular.desubroutinize-retain-gids.61,62,63.otf |    Bin 2316 -> 0 bytes
+ ...Regular.desubroutinize-retain-gids.61,62,63.ttx |    627 +
+ ...r.desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf |    Bin 30540 -> 0 bytes
+ ...r.desubroutinize-retain-gids.D7,D8,D9,DA,DE.ttx |   9248 ++
+ ...o-Regular.desubroutinize.1FC,21,41,20,62,63.otf |    Bin 2436 -> 0 bytes
+ ...o-Regular.desubroutinize.1FC,21,41,20,62,63.ttx |    612 +
+ ...urceSansPro-Regular.desubroutinize.61,62,63.otf |    Bin 2120 -> 0 bytes
+ ...urceSansPro-Regular.desubroutinize.61,62,63.ttx |    492 +
+ ...nsPro-Regular.desubroutinize.D7,D8,D9,DA,DE.otf |    Bin 2312 -> 0 bytes
+ ...nsPro-Regular.desubroutinize.D7,D8,D9,DA,DE.ttx |    523 +
+ ...subroutinize-retain-gids.1FC,21,41,20,62,63.otf |    Bin 20064 -> 0 bytes
+ ...subroutinize-retain-gids.1FC,21,41,20,62,63.ttx |   6281 +
+ ...p-hints-desubroutinize-retain-gids.61,62,63.otf |    Bin 2192 -> 0 bytes
+ ...p-hints-desubroutinize-retain-gids.61,62,63.ttx |    607 +
+ ...s-desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf |    Bin 30372 -> 0 bytes
+ ...s-desubroutinize-retain-gids.D7,D8,D9,DA,DE.ttx |   9215 ++
+ ...rop-hints-desubroutinize.1FC,21,41,20,62,63.otf |    Bin 2268 -> 0 bytes
+ ...rop-hints-desubroutinize.1FC,21,41,20,62,63.ttx |    581 +
+ ...-Regular.drop-hints-desubroutinize.61,62,63.otf |    Bin 1996 -> 0 bytes
+ ...-Regular.drop-hints-desubroutinize.61,62,63.ttx |    472 +
+ ...ar.drop-hints-desubroutinize.D7,D8,D9,DA,DE.otf |    Bin 2148 -> 0 bytes
+ ...ar.drop-hints-desubroutinize.D7,D8,D9,DA,DE.ttx |    490 +
+ ...r.drop-hints-retain-gids.1FC,21,41,20,62,63.otf |    Bin 20156 -> 0 bytes
+ ...r.drop-hints-retain-gids.1FC,21,41,20,62,63.ttx |   6367 +
+ ...Pro-Regular.drop-hints-retain-gids.61,62,63.otf |    Bin 2228 -> 0 bytes
+ ...Pro-Regular.drop-hints-retain-gids.61,62,63.ttx |    670 +
+ ...gular.drop-hints-retain-gids.D7,D8,D9,DA,DE.otf |    Bin 30384 -> 0 bytes
+ ...gular.drop-hints-retain-gids.D7,D8,D9,DA,DE.ttx |   9259 ++
+ ...nsPro-Regular.drop-hints.1FC,21,41,20,62,63.otf |    Bin 2352 -> 0 bytes
+ ...nsPro-Regular.drop-hints.1FC,21,41,20,62,63.ttx |    667 +
+ .../SourceSansPro-Regular.drop-hints.61,62,63.otf  |    Bin 2060 -> 0 bytes
+ .../SourceSansPro-Regular.drop-hints.61,62,63.ttx  |    535 +
+ ...ceSansPro-Regular.drop-hints.D7,D8,D9,DA,DE.otf |    Bin 2164 -> 0 bytes
+ ...ceSansPro-Regular.drop-hints.D7,D8,D9,DA,DE.ttx |    534 +
+ ...sPro-Regular.retain-gids.1FC,21,41,20,62,63.otf |    Bin 20384 -> 0 bytes
+ ...sPro-Regular.retain-gids.1FC,21,41,20,62,63.ttx |   6438 +
+ .../SourceSansPro-Regular.retain-gids.61,62,63.otf |    Bin 2384 -> 0 bytes
+ .../SourceSansPro-Regular.retain-gids.61,62,63.ttx |    722 +
+ ...eSansPro-Regular.retain-gids.D7,D8,D9,DA,DE.otf |    Bin 30556 -> 0 bytes
+ ...eSansPro-Regular.retain-gids.D7,D8,D9,DA,DE.ttx |   9303 ++
+ ...ubset.default.3042,3044,3046,3048,304A,304B.otf |    Bin 4884 -> 0 bytes
+ ...ubset.default.3042,3044,3046,3048,304A,304B.ttx |   1165 +
+ ...ubset.default.3042,3044,3046,73E0,5EA6,8F38.otf |    Bin 6276 -> 0 bytes
+ ...ubset.default.3042,3044,3046,73E0,5EA6,8F38.ttx |   1708 +
+ ...eHanSans-Regular_subset.default.61,63,65,6B.otf |    Bin 2588 -> 0 bytes
+ ...eHanSans-Regular_subset.default.61,63,65,6B.ttx |    688 +
+ ...ubset.default.660E,6975,73E0,5EA6,8F38,6E05.otf |    Bin 6736 -> 0 bytes
+ ...ubset.default.660E,6975,73E0,5EA6,8F38,6E05.ttx |   1585 +
+ .../SourceHanSans-Regular_subset.default.660E.otf  |    Bin 2456 -> 0 bytes
+ .../SourceHanSans-Regular_subset.default.660E.ttx  |    577 +
+ ...e-retain-gids.3042,3044,3046,3048,304A,304B.otf |    Bin 129876 -> 0 bytes
+ ...e-retain-gids.3042,3044,3046,3048,304A,304B.ttx |  62430 ++++++++
+ ...e-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf |    Bin 130920 -> 0 bytes
+ ...e-retain-gids.3042,3044,3046,73E0,5EA6,8F38.ttx |  62745 ++++++++
+ ...bset.desubroutinize-retain-gids.61,63,65,6B.otf |    Bin 3412 -> 0 bytes
+ ...bset.desubroutinize-retain-gids.61,63,65,6B.ttx |   1081 +
+ ...e-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf |    Bin 122048 -> 0 bytes
+ ...e-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.ttx |  57783 ++++++++
+ ...ular_subset.desubroutinize-retain-gids.660E.otf |    Bin 50760 -> 0 bytes
+ ...ular_subset.desubroutinize-retain-gids.660E.ttx |  24455 ++++
+ ...esubroutinize.3042,3044,3046,3048,304A,304B.otf |    Bin 4724 -> 0 bytes
+ ...esubroutinize.3042,3044,3046,3048,304A,304B.ttx |   1044 +
+ ...esubroutinize.3042,3044,3046,73E0,5EA6,8F38.otf |    Bin 5928 -> 0 bytes
+ ...esubroutinize.3042,3044,3046,73E0,5EA6,8F38.ttx |   1414 +
+ ...s-Regular_subset.desubroutinize.61,63,65,6B.otf |    Bin 2520 -> 0 bytes
+ ...s-Regular_subset.desubroutinize.61,63,65,6B.ttx |    630 +
+ ...esubroutinize.660E,6975,73E0,5EA6,8F38,6E05.otf |    Bin 6232 -> 0 bytes
+ ...esubroutinize.660E,6975,73E0,5EA6,8F38,6E05.ttx |   1152 +
+ ...eHanSans-Regular_subset.desubroutinize.660E.otf |    Bin 2440 -> 0 bytes
+ ...eHanSans-Regular_subset.desubroutinize.660E.ttx |    560 +
+ ...e-retain-gids.3042,3044,3046,3048,304A,304B.otf |    Bin 129448 -> 0 bytes
+ ...e-retain-gids.3042,3044,3046,3048,304A,304B.ttx |  62346 ++++++++
+ ...e-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf |    Bin 130312 -> 0 bytes
+ ...e-retain-gids.3042,3044,3046,73E0,5EA6,8F38.ttx |  62647 ++++++++
+ ...ints-desubroutinize-retain-gids.61,63,65,6B.otf |    Bin 3288 -> 0 bytes
+ ...ints-desubroutinize-retain-gids.61,63,65,6B.ttx |   1055 +
+ ...e-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf |    Bin 121284 -> 0 bytes
+ ...e-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.ttx |  57675 ++++++++
+ ....drop-hints-desubroutinize-retain-gids.660E.otf |    Bin 50540 -> 0 bytes
+ ....drop-hints-desubroutinize-retain-gids.660E.ttx |  24416 ++++
+ ...esubroutinize.3042,3044,3046,3048,304A,304B.otf |    Bin 4420 -> 0 bytes
+ ...esubroutinize.3042,3044,3046,3048,304A,304B.ttx |    986 +
+ ...esubroutinize.3042,3044,3046,73E0,5EA6,8F38.otf |    Bin 5416 -> 0 bytes
+ ...esubroutinize.3042,3044,3046,73E0,5EA6,8F38.ttx |   1337 +
+ ...ubset.drop-hints-desubroutinize.61,63,65,6B.otf |    Bin 2416 -> 0 bytes
+ ...ubset.drop-hints-desubroutinize.61,63,65,6B.ttx |    609 +
+ ...esubroutinize.660E,6975,73E0,5EA6,8F38,6E05.otf |    Bin 5556 -> 0 bytes
+ ...esubroutinize.660E,6975,73E0,5EA6,8F38,6E05.ttx |   1063 +
+ ...gular_subset.drop-hints-desubroutinize.660E.otf |    Bin 2308 -> 0 bytes
+ ...gular_subset.drop-hints-desubroutinize.660E.ttx |    540 +
+ ...s-retain-gids.3042,3044,3046,3048,304A,304B.otf |    Bin 129576 -> 0 bytes
+ ...s-retain-gids.3042,3044,3046,3048,304A,304B.ttx |  62443 ++++++++
+ ...s-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf |    Bin 130604 -> 0 bytes
+ ...s-retain-gids.3042,3044,3046,73E0,5EA6,8F38.ttx |  62929 +++++++++
+ ...r_subset.drop-hints-retain-gids.61,63,65,6B.otf |    Bin 3248 -> 0 bytes
+ ...r_subset.drop-hints-retain-gids.61,63,65,6B.ttx |   1089 +
+ ...s-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf |    Bin 121776 -> 0 bytes
+ ...s-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.ttx |  58100 ++++++++
+ ...-Regular_subset.drop-hints-retain-gids.660E.otf |    Bin 50552 -> 0 bytes
+ ...-Regular_subset.drop-hints-retain-gids.660E.ttx |  24429 ++++
+ ...et.drop-hints.3042,3044,3046,3048,304A,304B.otf |    Bin 4548 -> 0 bytes
+ ...et.drop-hints.3042,3044,3046,3048,304A,304B.ttx |   1083 +
+ ...et.drop-hints.3042,3044,3046,73E0,5EA6,8F38.otf |    Bin 5708 -> 0 bytes
+ ...et.drop-hints.3042,3044,3046,73E0,5EA6,8F38.ttx |   1619 +
+ ...nSans-Regular_subset.drop-hints.61,63,65,6B.otf |    Bin 2448 -> 0 bytes
+ ...nSans-Regular_subset.drop-hints.61,63,65,6B.ttx |    643 +
+ ...et.drop-hints.660E,6975,73E0,5EA6,8F38,6E05.otf |    Bin 6048 -> 0 bytes
+ ...et.drop-hints.660E,6975,73E0,5EA6,8F38,6E05.ttx |   1488 +
+ ...ourceHanSans-Regular_subset.drop-hints.660E.otf |    Bin 2316 -> 0 bytes
+ ...ourceHanSans-Regular_subset.drop-hints.660E.ttx |    553 +
+ ...t.retain-gids.3042,3044,3046,3048,304A,304B.otf |    Bin 130036 -> 0 bytes
+ ...t.retain-gids.3042,3044,3046,3048,304A,304B.ttx |  62551 ++++++++
+ ...t.retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf |    Bin 131272 -> 0 bytes
+ ...t.retain-gids.3042,3044,3046,73E0,5EA6,8F38.ttx |  63039 +++++++++
+ ...Sans-Regular_subset.retain-gids.61,63,65,6B.otf |    Bin 3408 -> 0 bytes
+ ...Sans-Regular_subset.retain-gids.61,63,65,6B.ttx |   1139 +
+ ...t.retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf |    Bin 122552 -> 0 bytes
+ ...t.retain-gids.660E,6975,73E0,5EA6,8F38,6E05.ttx |  58216 ++++++++
+ ...urceHanSans-Regular_subset.retain-gids.660E.otf |    Bin 50776 -> 0 bytes
+ ...urceHanSans-Regular_subset.retain-gids.660E.ttx |  24472 ++++
+ ...039,1005,100A,103A,1038,1010,103D,1031,104A.otf |    Bin 7724 -> 0 bytes
+ ...039,1005,100A,103A,1038,1010,103D,1031,104A.ttx |   2971 +
+ ...otoSerifMyanmar-Regular.notdef-outline.1092.otf |    Bin 1380 -> 0 bytes
+ ...otoSerifMyanmar-Regular.notdef-outline.1092.ttx |    264 +
+ .../cmap/AdobeBlank-Regular.default.61,62.ttf      |    Bin 1252 -> 0 bytes
+ .../cmap/AdobeBlank-Regular.default.61,62.ttx      |    322 +
+ .../cmap/AdobeBlank-Regular.default.61,FEFA.ttf    |    Bin 1264 -> 0 bytes
+ .../cmap/AdobeBlank-Regular.default.61,FEFA.ttx    |    320 +
+ .../cmap/AdobeBlank-Regular.default.FEE6,FECF.ttf  |    Bin 1216 -> 0 bytes
+ .../cmap/AdobeBlank-Regular.default.FEE6,FECF.ttx  |    314 +
+ .../cmap/AdobeBlank-Regular.default.FEF9,FEFA.ttf  |    Bin 1204 -> 0 bytes
+ .../cmap/AdobeBlank-Regular.default.FEF9,FEFA.ttx  |    314 +
+ .../cmap/AdobeBlank-Regular.default.FEFA.ttf       |    Bin 1184 -> 0 bytes
+ .../cmap/AdobeBlank-Regular.default.FEFA.ttx       |    303 +
+ ...eBlank-Regular.drop-hints-retain-gids.61,62.ttf |    Bin 1468 -> 0 bytes
+ ...eBlank-Regular.drop-hints-retain-gids.61,62.ttx |    606 +
+ ...lank-Regular.drop-hints-retain-gids.61,FEFA.ttf |    Bin 8232 -> 0 bytes
+ ...lank-Regular.drop-hints-retain-gids.61,FEFA.ttx |   7356 +
+ ...nk-Regular.drop-hints-retain-gids.FEE6,FECF.ttf |    Bin 8104 -> 0 bytes
+ ...nk-Regular.drop-hints-retain-gids.FEE6,FECF.ttx |   7270 +
+ ...nk-Regular.drop-hints-retain-gids.FEF9,FEFA.ttf |    Bin 8172 -> 0 bytes
+ ...nk-Regular.drop-hints-retain-gids.FEF9,FEFA.ttx |   7350 +
+ ...beBlank-Regular.drop-hints-retain-gids.FEFA.ttf |    Bin 8156 -> 0 bytes
+ ...beBlank-Regular.drop-hints-retain-gids.FEFA.ttx |   7343 +
+ .../cmap/AdobeBlank-Regular.drop-hints.61,62.ttf   |    Bin 1080 -> 0 bytes
+ .../cmap/AdobeBlank-Regular.drop-hints.61,62.ttx   |    218 +
+ .../cmap/AdobeBlank-Regular.drop-hints.61,FEFA.ttf |    Bin 1092 -> 0 bytes
+ .../cmap/AdobeBlank-Regular.drop-hints.61,FEFA.ttx |    216 +
+ .../AdobeBlank-Regular.drop-hints.FEE6,FECF.ttf    |    Bin 1044 -> 0 bytes
+ .../AdobeBlank-Regular.drop-hints.FEE6,FECF.ttx    |    210 +
+ .../AdobeBlank-Regular.drop-hints.FEF9,FEFA.ttf    |    Bin 1032 -> 0 bytes
+ .../AdobeBlank-Regular.drop-hints.FEF9,FEFA.ttx    |    210 +
+ .../cmap/AdobeBlank-Regular.drop-hints.FEFA.ttf    |    Bin 1012 -> 0 bytes
+ .../cmap/AdobeBlank-Regular.drop-hints.FEFA.ttx    |    199 +
+ .../cmap/AdobeBlank-Regular.name-ids.61,62.ttf     |    Bin 1000 -> 0 bytes
+ .../cmap/AdobeBlank-Regular.name-ids.61,62.ttx     |    310 +
+ .../cmap/AdobeBlank-Regular.name-ids.61,FEFA.ttf   |    Bin 1012 -> 0 bytes
+ .../cmap/AdobeBlank-Regular.name-ids.61,FEFA.ttx   |    308 +
+ .../cmap/AdobeBlank-Regular.name-ids.FEE6,FECF.ttf |    Bin 964 -> 0 bytes
+ .../cmap/AdobeBlank-Regular.name-ids.FEE6,FECF.ttx |    302 +
+ .../cmap/AdobeBlank-Regular.name-ids.FEF9,FEFA.ttf |    Bin 952 -> 0 bytes
+ .../cmap/AdobeBlank-Regular.name-ids.FEF9,FEFA.ttx |    302 +
+ .../cmap/AdobeBlank-Regular.name-ids.FEFA.ttf      |    Bin 932 -> 0 bytes
+ .../cmap/AdobeBlank-Regular.name-ids.FEFA.ttx      |    291 +
+ .../cmap/AdobeBlank-Regular.retain-gids.61,62.ttf  |    Bin 1640 -> 0 bytes
+ .../cmap/AdobeBlank-Regular.retain-gids.61,62.ttx  |    710 +
+ .../AdobeBlank-Regular.retain-gids.61,FEFA.ttf     |    Bin 8404 -> 0 bytes
+ .../AdobeBlank-Regular.retain-gids.61,FEFA.ttx     |   7460 +
+ .../AdobeBlank-Regular.retain-gids.FEE6,FECF.ttf   |    Bin 8276 -> 0 bytes
+ .../AdobeBlank-Regular.retain-gids.FEE6,FECF.ttx   |   7374 +
+ .../AdobeBlank-Regular.retain-gids.FEF9,FEFA.ttf   |    Bin 8344 -> 0 bytes
+ .../AdobeBlank-Regular.retain-gids.FEF9,FEFA.ttx   |   7454 +
+ .../cmap/AdobeBlank-Regular.retain-gids.FEFA.ttf   |    Bin 8328 -> 0 bytes
+ .../cmap/AdobeBlank-Regular.retain-gids.FEFA.ttx   |   7447 +
+ .../cmap14/cmap14_font1.default.4E00,4E02,4E03.otf |    Bin 1360 -> 0 bytes
+ .../cmap14/cmap14_font1.default.4E00,4E02,4E03.ttx |    276 +
+ .../cmap14/cmap14_font1.default.4E00,4E03.otf      |    Bin 1236 -> 0 bytes
+ .../cmap14/cmap14_font1.default.4E00,4E03.ttx      |    261 +
+ .../cmap14/cmap14_font1.default.4E00,4E05,4E07.otf |    Bin 1328 -> 0 bytes
+ .../cmap14/cmap14_font1.default.4E00,4E05,4E07.ttx |    278 +
+ .../cmap14/cmap14_font1.default.4E02,4E03,4E08.otf |    Bin 1576 -> 0 bytes
+ .../cmap14/cmap14_font1.default.4E02,4E03,4E08.ttx |    294 +
+ .../expected/cmap14/cmap14_font1.default.4E02.otf  |    Bin 996 -> 0 bytes
+ .../expected/cmap14/cmap14_font1.default.4E02.ttx  |    233 +
+ .../expected/cmap14/cmap14_font1.default.4E03.otf  |    Bin 1080 -> 0 bytes
+ .../expected/cmap14/cmap14_font1.default.4E03.ttx  |    241 +
+ .../cmap14_font1.default.4E05,4E07,4E08,4E09.otf   |    Bin 1848 -> 0 bytes
+ .../cmap14_font1.default.4E05,4E07,4E08,4E09.ttx   |    329 +
+ .../cmap14/cmap14_font1.default.4E08,4E09.otf      |    Bin 1720 -> 0 bytes
+ .../cmap14/cmap14_font1.default.4E08,4E09.ttx      |    302 +
+ .../expected/cmap14/cmap14_font1.default.4E08.otf  |    Bin 1384 -> 0 bytes
+ .../expected/cmap14/cmap14_font1.default.4E08.ttx  |    265 +
+ .../cmap14_font1.default.retain-all-codepoint.otf  |    Bin 2348 -> 0 bytes
+ .../cmap14_font1.default.retain-all-codepoint.ttx  |    418 +
+ ...font1.drop-hints-retain-gids.4E00,4E02,4E03.otf |    Bin 1388 -> 0 bytes
+ ...font1.drop-hints-retain-gids.4E00,4E02,4E03.ttx |    318 +
+ ...ap14_font1.drop-hints-retain-gids.4E00,4E03.otf |    Bin 1272 -> 0 bytes
+ ...ap14_font1.drop-hints-retain-gids.4E00,4E03.ttx |    308 +
+ ...font1.drop-hints-retain-gids.4E00,4E05,4E07.otf |    Bin 1396 -> 0 bytes
+ ...font1.drop-hints-retain-gids.4E00,4E05,4E07.ttx |    340 +
+ ...font1.drop-hints-retain-gids.4E02,4E03,4E08.otf |    Bin 1720 -> 0 bytes
+ ...font1.drop-hints-retain-gids.4E02,4E03,4E08.ttx |    391 +
+ .../cmap14_font1.drop-hints-retain-gids.4E02.otf   |    Bin 1028 -> 0 bytes
+ .../cmap14_font1.drop-hints-retain-gids.4E02.ttx   |    280 +
+ .../cmap14_font1.drop-hints-retain-gids.4E03.otf   |    Bin 1124 -> 0 bytes
+ .../cmap14_font1.drop-hints-retain-gids.4E03.ttx   |    293 +
+ ....drop-hints-retain-gids.4E05,4E07,4E08,4E09.otf |    Bin 1984 -> 0 bytes
+ ....drop-hints-retain-gids.4E05,4E07,4E08,4E09.ttx |    421 +
+ ...ap14_font1.drop-hints-retain-gids.4E08,4E09.otf |    Bin 1872 -> 0 bytes
+ ...ap14_font1.drop-hints-retain-gids.4E08,4E09.ttx |    404 +
+ .../cmap14_font1.drop-hints-retain-gids.4E08.otf   |    Bin 1544 -> 0 bytes
+ .../cmap14_font1.drop-hints-retain-gids.4E08.ttx   |    372 +
+ ...drop-hints-retain-gids.retain-all-codepoint.otf |    Bin 2436 -> 0 bytes
+ ...drop-hints-retain-gids.retain-all-codepoint.ttx |    480 +
+ .../cmap14_font1.drop-hints.4E00,4E02,4E03.otf     |    Bin 1292 -> 0 bytes
+ .../cmap14_font1.drop-hints.4E00,4E02,4E03.ttx     |    268 +
+ .../cmap14/cmap14_font1.drop-hints.4E00,4E03.otf   |    Bin 1168 -> 0 bytes
+ .../cmap14/cmap14_font1.drop-hints.4E00,4E03.ttx   |    253 +
+ .../cmap14_font1.drop-hints.4E00,4E05,4E07.otf     |    Bin 1260 -> 0 bytes
+ .../cmap14_font1.drop-hints.4E00,4E05,4E07.ttx     |    270 +
+ .../cmap14_font1.drop-hints.4E02,4E03,4E08.otf     |    Bin 1512 -> 0 bytes
+ .../cmap14_font1.drop-hints.4E02,4E03,4E08.ttx     |    286 +
+ .../cmap14/cmap14_font1.drop-hints.4E02.otf        |    Bin 928 -> 0 bytes
+ .../cmap14/cmap14_font1.drop-hints.4E02.ttx        |    225 +
+ .../cmap14/cmap14_font1.drop-hints.4E03.otf        |    Bin 1012 -> 0 bytes
+ .../cmap14/cmap14_font1.drop-hints.4E03.ttx        |    233 +
+ ...cmap14_font1.drop-hints.4E05,4E07,4E08,4E09.otf |    Bin 1780 -> 0 bytes
+ ...cmap14_font1.drop-hints.4E05,4E07,4E08,4E09.ttx |    321 +
+ .../cmap14/cmap14_font1.drop-hints.4E08,4E09.otf   |    Bin 1652 -> 0 bytes
+ .../cmap14/cmap14_font1.drop-hints.4E08,4E09.ttx   |    294 +
+ .../cmap14/cmap14_font1.drop-hints.4E08.otf        |    Bin 1316 -> 0 bytes
+ .../cmap14/cmap14_font1.drop-hints.4E08.ttx        |    257 +
+ ...map14_font1.drop-hints.retain-all-codepoint.otf |    Bin 2280 -> 0 bytes
+ ...map14_font1.drop-hints.retain-all-codepoint.ttx |    410 +
+ .../cmap14/cmap14_font1.gids.4E00,4E02,4E03.otf    |    Bin 1388 -> 0 bytes
+ .../cmap14/cmap14_font1.gids.4E00,4E02,4E03.ttx    |    297 +
+ .../cmap14/cmap14_font1.gids.4E00,4E03.otf         |    Bin 1380 -> 0 bytes
+ .../cmap14/cmap14_font1.gids.4E00,4E03.ttx         |    289 +
+ .../cmap14/cmap14_font1.gids.4E00,4E05,4E07.otf    |    Bin 1620 -> 0 bytes
+ .../cmap14/cmap14_font1.gids.4E00,4E05,4E07.ttx    |    318 +
+ .../cmap14/cmap14_font1.gids.4E02,4E03,4E08.otf    |    Bin 1744 -> 0 bytes
+ .../cmap14/cmap14_font1.gids.4E02,4E03,4E08.ttx    |    326 +
+ .../expected/cmap14/cmap14_font1.gids.4E02.otf     |    Bin 1312 -> 0 bytes
+ .../expected/cmap14/cmap14_font1.gids.4E02.ttx     |    277 +
+ .../expected/cmap14/cmap14_font1.gids.4E03.otf     |    Bin 1352 -> 0 bytes
+ .../expected/cmap14/cmap14_font1.gids.4E03.ttx     |    280 +
+ .../cmap14_font1.gids.4E05,4E07,4E08,4E09.otf      |    Bin 2164 -> 0 bytes
+ .../cmap14_font1.gids.4E05,4E07,4E08,4E09.ttx      |    373 +
+ .../cmap14/cmap14_font1.gids.4E08,4E09.otf         |    Bin 2036 -> 0 bytes
+ .../cmap14/cmap14_font1.gids.4E08,4E09.ttx         |    346 +
+ .../expected/cmap14/cmap14_font1.gids.4E08.otf     |    Bin 1704 -> 0 bytes
+ .../expected/cmap14/cmap14_font1.gids.4E08.ttx     |    309 +
+ .../cmap14_font1.gids.retain-all-codepoint.otf     |    Bin 2380 -> 0 bytes
+ .../cmap14_font1.gids.retain-all-codepoint.ttx     |    439 +
+ .../cmap14_font1.name-ids.4E00,4E02,4E03.otf       |    Bin 1292 -> 0 bytes
+ .../cmap14_font1.name-ids.4E00,4E02,4E03.ttx       |    264 +
+ .../cmap14/cmap14_font1.name-ids.4E00,4E03.otf     |    Bin 1168 -> 0 bytes
+ .../cmap14/cmap14_font1.name-ids.4E00,4E03.ttx     |    249 +
+ .../cmap14_font1.name-ids.4E00,4E05,4E07.otf       |    Bin 1260 -> 0 bytes
+ .../cmap14_font1.name-ids.4E00,4E05,4E07.ttx       |    266 +
+ .../cmap14_font1.name-ids.4E02,4E03,4E08.otf       |    Bin 1508 -> 0 bytes
+ .../cmap14_font1.name-ids.4E02,4E03,4E08.ttx       |    282 +
+ .../expected/cmap14/cmap14_font1.name-ids.4E02.otf |    Bin 928 -> 0 bytes
+ .../expected/cmap14/cmap14_font1.name-ids.4E02.ttx |    221 +
+ .../expected/cmap14/cmap14_font1.name-ids.4E03.otf |    Bin 1012 -> 0 bytes
+ .../expected/cmap14/cmap14_font1.name-ids.4E03.ttx |    229 +
+ .../cmap14_font1.name-ids.4E05,4E07,4E08,4E09.otf  |    Bin 1780 -> 0 bytes
+ .../cmap14_font1.name-ids.4E05,4E07,4E08,4E09.ttx  |    317 +
+ .../cmap14/cmap14_font1.name-ids.4E08,4E09.otf     |    Bin 1652 -> 0 bytes
+ .../cmap14/cmap14_font1.name-ids.4E08,4E09.ttx     |    290 +
+ .../expected/cmap14/cmap14_font1.name-ids.4E08.otf |    Bin 1316 -> 0 bytes
+ .../expected/cmap14/cmap14_font1.name-ids.4E08.ttx |    253 +
+ .../cmap14_font1.name-ids.retain-all-codepoint.otf |    Bin 2280 -> 0 bytes
+ .../cmap14_font1.name-ids.retain-all-codepoint.ttx |    406 +
+ .../cmap14_font1.retain-gids.4E00,4E02,4E03.otf    |    Bin 1452 -> 0 bytes
+ .../cmap14_font1.retain-gids.4E00,4E02,4E03.ttx    |    326 +
+ .../cmap14/cmap14_font1.retain-gids.4E00,4E03.otf  |    Bin 1340 -> 0 bytes
+ .../cmap14/cmap14_font1.retain-gids.4E00,4E03.ttx  |    316 +
+ .../cmap14_font1.retain-gids.4E00,4E05,4E07.otf    |    Bin 1464 -> 0 bytes
+ .../cmap14_font1.retain-gids.4E00,4E05,4E07.ttx    |    348 +
+ .../cmap14_font1.retain-gids.4E02,4E03,4E08.otf    |    Bin 1788 -> 0 bytes
+ .../cmap14_font1.retain-gids.4E02,4E03,4E08.ttx    |    399 +
+ .../cmap14/cmap14_font1.retain-gids.4E02.otf       |    Bin 1096 -> 0 bytes
+ .../cmap14/cmap14_font1.retain-gids.4E02.ttx       |    288 +
+ .../cmap14/cmap14_font1.retain-gids.4E03.otf       |    Bin 1192 -> 0 bytes
+ .../cmap14/cmap14_font1.retain-gids.4E03.ttx       |    301 +
+ ...map14_font1.retain-gids.4E05,4E07,4E08,4E09.otf |    Bin 2048 -> 0 bytes
+ ...map14_font1.retain-gids.4E05,4E07,4E08,4E09.ttx |    429 +
+ .../cmap14/cmap14_font1.retain-gids.4E08,4E09.otf  |    Bin 1940 -> 0 bytes
+ .../cmap14/cmap14_font1.retain-gids.4E08,4E09.ttx  |    412 +
+ .../cmap14/cmap14_font1.retain-gids.4E08.otf       |    Bin 1608 -> 0 bytes
+ .../cmap14/cmap14_font1.retain-gids.4E08.ttx       |    380 +
+ ...ap14_font1.retain-gids.retain-all-codepoint.otf |    Bin 2500 -> 0 bytes
+ ...ap14_font1.retain-gids.retain-all-codepoint.ttx |    488 +
+ .../cmap14/cmap14_font2.default.4E00,4E02,4E03.otf |    Bin 1360 -> 0 bytes
+ .../cmap14/cmap14_font2.default.4E00,4E02,4E03.ttx |    276 +
+ .../cmap14/cmap14_font2.default.4E00,4E03.otf      |    Bin 1236 -> 0 bytes
+ .../cmap14/cmap14_font2.default.4E00,4E03.ttx      |    261 +
+ .../cmap14/cmap14_font2.default.4E00,4E05,4E07.otf |    Bin 1332 -> 0 bytes
+ .../cmap14/cmap14_font2.default.4E00,4E05,4E07.ttx |    278 +
+ .../cmap14/cmap14_font2.default.4E02,4E03,4E08.otf |    Bin 1576 -> 0 bytes
+ .../cmap14/cmap14_font2.default.4E02,4E03,4E08.ttx |    294 +
+ .../expected/cmap14/cmap14_font2.default.4E02.otf  |    Bin 992 -> 0 bytes
+ .../expected/cmap14/cmap14_font2.default.4E02.ttx  |    233 +
+ .../expected/cmap14/cmap14_font2.default.4E03.otf  |    Bin 1076 -> 0 bytes
+ .../expected/cmap14/cmap14_font2.default.4E03.ttx  |    241 +
+ .../cmap14_font2.default.4E05,4E07,4E08,4E09.otf   |    Bin 1848 -> 0 bytes
+ .../cmap14_font2.default.4E05,4E07,4E08,4E09.ttx   |    329 +
+ .../cmap14/cmap14_font2.default.4E08,4E09.otf      |    Bin 1716 -> 0 bytes
+ .../cmap14/cmap14_font2.default.4E08,4E09.ttx      |    302 +
+ .../expected/cmap14/cmap14_font2.default.4E08.otf  |    Bin 1380 -> 0 bytes
+ .../expected/cmap14/cmap14_font2.default.4E08.ttx  |    265 +
+ .../cmap14_font2.default.retain-all-codepoint.otf  |    Bin 2344 -> 0 bytes
+ .../cmap14_font2.default.retain-all-codepoint.ttx  |    418 +
+ ...font2.drop-hints-retain-gids.4E00,4E02,4E03.otf |    Bin 1388 -> 0 bytes
+ ...font2.drop-hints-retain-gids.4E00,4E02,4E03.ttx |    318 +
+ ...ap14_font2.drop-hints-retain-gids.4E00,4E03.otf |    Bin 1272 -> 0 bytes
+ ...ap14_font2.drop-hints-retain-gids.4E00,4E03.ttx |    308 +
+ ...font2.drop-hints-retain-gids.4E00,4E05,4E07.otf |    Bin 1400 -> 0 bytes
+ ...font2.drop-hints-retain-gids.4E00,4E05,4E07.ttx |    340 +
+ ...font2.drop-hints-retain-gids.4E02,4E03,4E08.otf |    Bin 1720 -> 0 bytes
+ ...font2.drop-hints-retain-gids.4E02,4E03,4E08.ttx |    391 +
+ .../cmap14_font2.drop-hints-retain-gids.4E02.otf   |    Bin 1024 -> 0 bytes
+ .../cmap14_font2.drop-hints-retain-gids.4E02.ttx   |    280 +
+ .../cmap14_font2.drop-hints-retain-gids.4E03.otf   |    Bin 1120 -> 0 bytes
+ .../cmap14_font2.drop-hints-retain-gids.4E03.ttx   |    293 +
+ ....drop-hints-retain-gids.4E05,4E07,4E08,4E09.otf |    Bin 1984 -> 0 bytes
+ ....drop-hints-retain-gids.4E05,4E07,4E08,4E09.ttx |    421 +
+ ...ap14_font2.drop-hints-retain-gids.4E08,4E09.otf |    Bin 1868 -> 0 bytes
+ ...ap14_font2.drop-hints-retain-gids.4E08,4E09.ttx |    404 +
+ .../cmap14_font2.drop-hints-retain-gids.4E08.otf   |    Bin 1540 -> 0 bytes
+ .../cmap14_font2.drop-hints-retain-gids.4E08.ttx   |    372 +
+ ...drop-hints-retain-gids.retain-all-codepoint.otf |    Bin 2432 -> 0 bytes
+ ...drop-hints-retain-gids.retain-all-codepoint.ttx |    480 +
+ .../cmap14_font2.drop-hints.4E00,4E02,4E03.otf     |    Bin 1292 -> 0 bytes
+ .../cmap14_font2.drop-hints.4E00,4E02,4E03.ttx     |    268 +
+ .../cmap14/cmap14_font2.drop-hints.4E00,4E03.otf   |    Bin 1168 -> 0 bytes
+ .../cmap14/cmap14_font2.drop-hints.4E00,4E03.ttx   |    253 +
+ .../cmap14_font2.drop-hints.4E00,4E05,4E07.otf     |    Bin 1264 -> 0 bytes
+ .../cmap14_font2.drop-hints.4E00,4E05,4E07.ttx     |    270 +
+ .../cmap14_font2.drop-hints.4E02,4E03,4E08.otf     |    Bin 1512 -> 0 bytes
+ .../cmap14_font2.drop-hints.4E02,4E03,4E08.ttx     |    286 +
+ .../cmap14/cmap14_font2.drop-hints.4E02.otf        |    Bin 924 -> 0 bytes
+ .../cmap14/cmap14_font2.drop-hints.4E02.ttx        |    225 +
+ .../cmap14/cmap14_font2.drop-hints.4E03.otf        |    Bin 1008 -> 0 bytes
+ .../cmap14/cmap14_font2.drop-hints.4E03.ttx        |    233 +
+ ...cmap14_font2.drop-hints.4E05,4E07,4E08,4E09.otf |    Bin 1780 -> 0 bytes
+ ...cmap14_font2.drop-hints.4E05,4E07,4E08,4E09.ttx |    321 +
+ .../cmap14/cmap14_font2.drop-hints.4E08,4E09.otf   |    Bin 1648 -> 0 bytes
+ .../cmap14/cmap14_font2.drop-hints.4E08,4E09.ttx   |    294 +
+ .../cmap14/cmap14_font2.drop-hints.4E08.otf        |    Bin 1312 -> 0 bytes
+ .../cmap14/cmap14_font2.drop-hints.4E08.ttx        |    257 +
+ ...map14_font2.drop-hints.retain-all-codepoint.otf |    Bin 2276 -> 0 bytes
+ ...map14_font2.drop-hints.retain-all-codepoint.ttx |    410 +
+ .../cmap14/cmap14_font2.gids.4E00,4E02,4E03.otf    |    Bin 1388 -> 0 bytes
+ .../cmap14/cmap14_font2.gids.4E00,4E02,4E03.ttx    |    297 +
+ .../cmap14/cmap14_font2.gids.4E00,4E03.otf         |    Bin 1380 -> 0 bytes
+ .../cmap14/cmap14_font2.gids.4E00,4E03.ttx         |    289 +
+ .../cmap14/cmap14_font2.gids.4E00,4E05,4E07.otf    |    Bin 1624 -> 0 bytes
+ .../cmap14/cmap14_font2.gids.4E00,4E05,4E07.ttx    |    318 +
+ .../cmap14/cmap14_font2.gids.4E02,4E03,4E08.otf    |    Bin 1744 -> 0 bytes
+ .../cmap14/cmap14_font2.gids.4E02,4E03,4E08.ttx    |    326 +
+ .../expected/cmap14/cmap14_font2.gids.4E02.otf     |    Bin 1308 -> 0 bytes
+ .../expected/cmap14/cmap14_font2.gids.4E02.ttx     |    277 +
+ .../expected/cmap14/cmap14_font2.gids.4E03.otf     |    Bin 1348 -> 0 bytes
+ .../expected/cmap14/cmap14_font2.gids.4E03.ttx     |    280 +
+ .../cmap14_font2.gids.4E05,4E07,4E08,4E09.otf      |    Bin 2164 -> 0 bytes
+ .../cmap14_font2.gids.4E05,4E07,4E08,4E09.ttx      |    373 +
+ .../cmap14/cmap14_font2.gids.4E08,4E09.otf         |    Bin 2032 -> 0 bytes
+ .../cmap14/cmap14_font2.gids.4E08,4E09.ttx         |    346 +
+ .../expected/cmap14/cmap14_font2.gids.4E08.otf     |    Bin 1700 -> 0 bytes
+ .../expected/cmap14/cmap14_font2.gids.4E08.ttx     |    309 +
+ .../cmap14_font2.gids.retain-all-codepoint.otf     |    Bin 2376 -> 0 bytes
+ .../cmap14_font2.gids.retain-all-codepoint.ttx     |    439 +
+ .../cmap14_font2.name-ids.4E00,4E02,4E03.otf       |    Bin 1292 -> 0 bytes
+ .../cmap14_font2.name-ids.4E00,4E02,4E03.ttx       |    264 +
+ .../cmap14/cmap14_font2.name-ids.4E00,4E03.otf     |    Bin 1168 -> 0 bytes
+ .../cmap14/cmap14_font2.name-ids.4E00,4E03.ttx     |    249 +
+ .../cmap14_font2.name-ids.4E00,4E05,4E07.otf       |    Bin 1264 -> 0 bytes
+ .../cmap14_font2.name-ids.4E00,4E05,4E07.ttx       |    266 +
+ .../cmap14_font2.name-ids.4E02,4E03,4E08.otf       |    Bin 1508 -> 0 bytes
+ .../cmap14_font2.name-ids.4E02,4E03,4E08.ttx       |    282 +
+ .../expected/cmap14/cmap14_font2.name-ids.4E02.otf |    Bin 924 -> 0 bytes
+ .../expected/cmap14/cmap14_font2.name-ids.4E02.ttx |    221 +
+ .../expected/cmap14/cmap14_font2.name-ids.4E03.otf |    Bin 1008 -> 0 bytes
+ .../expected/cmap14/cmap14_font2.name-ids.4E03.ttx |    229 +
+ .../cmap14_font2.name-ids.4E05,4E07,4E08,4E09.otf  |    Bin 1780 -> 0 bytes
+ .../cmap14_font2.name-ids.4E05,4E07,4E08,4E09.ttx  |    317 +
+ .../cmap14/cmap14_font2.name-ids.4E08,4E09.otf     |    Bin 1648 -> 0 bytes
+ .../cmap14/cmap14_font2.name-ids.4E08,4E09.ttx     |    290 +
+ .../expected/cmap14/cmap14_font2.name-ids.4E08.otf |    Bin 1312 -> 0 bytes
+ .../expected/cmap14/cmap14_font2.name-ids.4E08.ttx |    253 +
+ .../cmap14_font2.name-ids.retain-all-codepoint.otf |    Bin 2276 -> 0 bytes
+ .../cmap14_font2.name-ids.retain-all-codepoint.ttx |    406 +
+ .../cmap14_font2.retain-gids.4E00,4E02,4E03.otf    |    Bin 1452 -> 0 bytes
+ .../cmap14_font2.retain-gids.4E00,4E02,4E03.ttx    |    326 +
+ .../cmap14/cmap14_font2.retain-gids.4E00,4E03.otf  |    Bin 1340 -> 0 bytes
+ .../cmap14/cmap14_font2.retain-gids.4E00,4E03.ttx  |    316 +
+ .../cmap14_font2.retain-gids.4E00,4E05,4E07.otf    |    Bin 1468 -> 0 bytes
+ .../cmap14_font2.retain-gids.4E00,4E05,4E07.ttx    |    348 +
+ .../cmap14_font2.retain-gids.4E02,4E03,4E08.otf    |    Bin 1788 -> 0 bytes
+ .../cmap14_font2.retain-gids.4E02,4E03,4E08.ttx    |    399 +
+ .../cmap14/cmap14_font2.retain-gids.4E02.otf       |    Bin 1092 -> 0 bytes
+ .../cmap14/cmap14_font2.retain-gids.4E02.ttx       |    288 +
+ .../cmap14/cmap14_font2.retain-gids.4E03.otf       |    Bin 1188 -> 0 bytes
+ .../cmap14/cmap14_font2.retain-gids.4E03.ttx       |    301 +
+ ...map14_font2.retain-gids.4E05,4E07,4E08,4E09.otf |    Bin 2048 -> 0 bytes
+ ...map14_font2.retain-gids.4E05,4E07,4E08,4E09.ttx |    429 +
+ .../cmap14/cmap14_font2.retain-gids.4E08,4E09.otf  |    Bin 1936 -> 0 bytes
+ .../cmap14/cmap14_font2.retain-gids.4E08,4E09.ttx  |    412 +
+ .../cmap14/cmap14_font2.retain-gids.4E08.otf       |    Bin 1604 -> 0 bytes
+ .../cmap14/cmap14_font2.retain-gids.4E08.ttx       |    380 +
+ ...ap14_font2.retain-gids.retain-all-codepoint.otf |    Bin 2496 -> 0 bytes
+ ...ap14_font2.retain-gids.retain-all-codepoint.ttx |    488 +
+ .../TwemojiMozilla.subset.default.32,3297,3299.ttf |    Bin 1936 -> 0 bytes
+ .../TwemojiMozilla.subset.default.32,3297,3299.ttx |    626 +
+ .../colr/TwemojiMozilla.subset.default.32,3297.ttf |    Bin 1400 -> 0 bytes
+ .../colr/TwemojiMozilla.subset.default.32,3297.ttx |    411 +
+ .../colr/TwemojiMozilla.subset.default.32,3299.ttf |    Bin 1576 -> 0 bytes
+ .../colr/TwemojiMozilla.subset.default.32,3299.ttx |    475 +
+ .../colr/TwemojiMozilla.subset.default.32.ttf      |    Bin 932 -> 0 bytes
+ .../colr/TwemojiMozilla.subset.default.32.ttx      |    231 +
+ .../TwemojiMozilla.subset.default.3297,3299.ttf    |    Bin 1916 -> 0 bytes
+ .../TwemojiMozilla.subset.default.3297,3299.ttx    |    617 +
+ .../colr/TwemojiMozilla.subset.default.3297.ttf    |    Bin 1376 -> 0 bytes
+ .../colr/TwemojiMozilla.subset.default.3297.ttx    |    402 +
+ .../colr/TwemojiMozilla.subset.default.3299.ttf    |    Bin 1552 -> 0 bytes
+ .../colr/TwemojiMozilla.subset.default.3299.ttx    |    466 +
+ ....subset.drop-hints-retain-gids.32,3297,3299.ttf |    Bin 1916 -> 0 bytes
+ ....subset.drop-hints-retain-gids.32,3297,3299.ttx |    621 +
+ ...zilla.subset.drop-hints-retain-gids.32,3297.ttf |    Bin 1396 -> 0 bytes
+ ...zilla.subset.drop-hints-retain-gids.32,3297.ttx |    410 +
+ ...zilla.subset.drop-hints-retain-gids.32,3299.ttf |    Bin 1576 -> 0 bytes
+ ...zilla.subset.drop-hints-retain-gids.32,3299.ttx |    478 +
+ ...ojiMozilla.subset.drop-hints-retain-gids.32.ttf |    Bin 912 -> 0 bytes
+ ...ojiMozilla.subset.drop-hints-retain-gids.32.ttx |    226 +
+ ...lla.subset.drop-hints-retain-gids.3297,3299.ttf |    Bin 1900 -> 0 bytes
+ ...lla.subset.drop-hints-retain-gids.3297,3299.ttx |    616 +
+ ...iMozilla.subset.drop-hints-retain-gids.3297.ttf |    Bin 1372 -> 0 bytes
+ ...iMozilla.subset.drop-hints-retain-gids.3297.ttx |    405 +
+ ...iMozilla.subset.drop-hints-retain-gids.3299.ttf |    Bin 1552 -> 0 bytes
+ ...iMozilla.subset.drop-hints-retain-gids.3299.ttx |    473 +
+ ...emojiMozilla.subset.drop-hints.32,3297,3299.ttf |    Bin 1916 -> 0 bytes
+ ...emojiMozilla.subset.drop-hints.32,3297,3299.ttx |    621 +
+ .../TwemojiMozilla.subset.drop-hints.32,3297.ttf   |    Bin 1380 -> 0 bytes
+ .../TwemojiMozilla.subset.drop-hints.32,3297.ttx   |    406 +
+ .../TwemojiMozilla.subset.drop-hints.32,3299.ttf   |    Bin 1556 -> 0 bytes
+ .../TwemojiMozilla.subset.drop-hints.32,3299.ttx   |    470 +
+ .../colr/TwemojiMozilla.subset.drop-hints.32.ttf   |    Bin 912 -> 0 bytes
+ .../colr/TwemojiMozilla.subset.drop-hints.32.ttx   |    226 +
+ .../TwemojiMozilla.subset.drop-hints.3297,3299.ttf |    Bin 1896 -> 0 bytes
+ .../TwemojiMozilla.subset.drop-hints.3297,3299.ttx |    612 +
+ .../colr/TwemojiMozilla.subset.drop-hints.3297.ttf |    Bin 1356 -> 0 bytes
+ .../colr/TwemojiMozilla.subset.drop-hints.3297.ttx |    397 +
+ .../colr/TwemojiMozilla.subset.drop-hints.3299.ttf |    Bin 1532 -> 0 bytes
+ .../colr/TwemojiMozilla.subset.drop-hints.3299.ttx |    461 +
+ ...mojiMozilla.subset.retain-gids.32,3297,3299.ttf |    Bin 1936 -> 0 bytes
+ ...mojiMozilla.subset.retain-gids.32,3297,3299.ttx |    626 +
+ .../TwemojiMozilla.subset.retain-gids.32,3297.ttf  |    Bin 1416 -> 0 bytes
+ .../TwemojiMozilla.subset.retain-gids.32,3297.ttx  |    415 +
+ .../TwemojiMozilla.subset.retain-gids.32,3299.ttf  |    Bin 1596 -> 0 bytes
+ .../TwemojiMozilla.subset.retain-gids.32,3299.ttx  |    483 +
+ .../colr/TwemojiMozilla.subset.retain-gids.32.ttf  |    Bin 932 -> 0 bytes
+ .../colr/TwemojiMozilla.subset.retain-gids.32.ttx  |    231 +
+ ...TwemojiMozilla.subset.retain-gids.3297,3299.ttf |    Bin 1920 -> 0 bytes
+ ...TwemojiMozilla.subset.retain-gids.3297,3299.ttx |    621 +
+ .../TwemojiMozilla.subset.retain-gids.3297.ttf     |    Bin 1392 -> 0 bytes
+ .../TwemojiMozilla.subset.retain-gids.3297.ttx     |    410 +
+ .../TwemojiMozilla.subset.retain-gids.3299.ttf     |    Bin 1572 -> 0 bytes
+ .../TwemojiMozilla.subset.retain-gids.3299.ttx     |    478 +
+ .../colr_with_components/colr-table.default.6B.ttf |    Bin 4260 -> 0 bytes
+ .../colr_with_components/colr-table.default.6B.ttx |   1435 +
+ .../colr-table.drop-hints-retain-gids.6B.ttf       |    Bin 4984 -> 0 bytes
+ .../colr-table.drop-hints-retain-gids.6B.ttx       |   1919 +
+ .../colr-table.drop-hints.6B.ttf                   |    Bin 4260 -> 0 bytes
+ .../colr-table.drop-hints.6B.ttx                   |   1435 +
+ .../colr-table.retain-gids.6B.ttf                  |    Bin 4984 -> 0 bytes
+ .../colr-table.retain-gids.6B.ttx                  |   1919 +
+ ...oColrEmojiGlyf-Regular.subset.default.1f35e.ttf |    Bin 3004 -> 0 bytes
+ ...oColrEmojiGlyf-Regular.subset.default.1f35e.ttx |   1077 +
+ ...oColrEmojiGlyf-Regular.subset.default.1f696.ttf |    Bin 3752 -> 0 bytes
+ ...oColrEmojiGlyf-Regular.subset.default.1f696.ttx |   1449 +
+ ...Regular.subset.drop-hints-retain-gids.1f35e.ttf |    Bin 3516 -> 0 bytes
+ ...Regular.subset.drop-hints-retain-gids.1f35e.ttx |   1417 +
+ ...Regular.subset.drop-hints-retain-gids.1f696.ttf |    Bin 5048 -> 0 bytes
+ ...Regular.subset.drop-hints-retain-gids.1f696.ttx |   2313 +
+ ...lrEmojiGlyf-Regular.subset.drop-hints.1f35e.ttf |    Bin 3004 -> 0 bytes
+ ...lrEmojiGlyf-Regular.subset.drop-hints.1f35e.ttx |   1077 +
+ ...lrEmojiGlyf-Regular.subset.drop-hints.1f696.ttf |    Bin 3752 -> 0 bytes
+ ...lrEmojiGlyf-Regular.subset.drop-hints.1f696.ttx |   1449 +
+ ...rEmojiGlyf-Regular.subset.retain-gids.1f35e.ttf |    Bin 3516 -> 0 bytes
+ ...rEmojiGlyf-Regular.subset.retain-gids.1f35e.ttx |   1417 +
+ ...rEmojiGlyf-Regular.subset.retain-gids.1f696.ttf |    Bin 5048 -> 0 bytes
+ ...rEmojiGlyf-Regular.subset.retain-gids.1f696.ttx |   2313 +
+ .../colrv1/TestCOLRv1.default.E000,E004.ttf        |    Bin 900 -> 0 bytes
+ .../colrv1/TestCOLRv1.default.E000,E004.ttx        |    316 +
+ .../colrv1/TestCOLRv1.default.E003,E004.ttf        |    Bin 1000 -> 0 bytes
+ .../colrv1/TestCOLRv1.default.E003,E004.ttx        |    367 +
+ .../expected/colrv1/TestCOLRv1.default.E004.ttf    |    Bin 744 -> 0 bytes
+ .../expected/colrv1/TestCOLRv1.default.E004.ttx    |    231 +
+ .../TestCOLRv1.default.retain-all-codepoint.ttf    |    Bin 1444 -> 0 bytes
+ .../TestCOLRv1.default.retain-all-codepoint.ttx    |    596 +
+ ...TestCOLRv1.drop-hints-retain-gids.E000,E004.ttf |    Bin 984 -> 0 bytes
+ ...TestCOLRv1.drop-hints-retain-gids.E000,E004.ttx |    364 +
+ ...TestCOLRv1.drop-hints-retain-gids.E003,E004.ttf |    Bin 1076 -> 0 bytes
+ ...TestCOLRv1.drop-hints-retain-gids.E003,E004.ttx |    411 +
+ .../TestCOLRv1.drop-hints-retain-gids.E004.ttf     |    Bin 836 -> 0 bytes
+ .../TestCOLRv1.drop-hints-retain-gids.E004.ttx     |    291 +
+ ...drop-hints-retain-gids.retain-all-codepoint.ttf |    Bin 1444 -> 0 bytes
+ ...drop-hints-retain-gids.retain-all-codepoint.ttx |    596 +
+ .../colrv1/TestCOLRv1.drop-hints.E000,E004.ttf     |    Bin 900 -> 0 bytes
+ .../colrv1/TestCOLRv1.drop-hints.E000,E004.ttx     |    316 +
+ .../colrv1/TestCOLRv1.drop-hints.E003,E004.ttf     |    Bin 1000 -> 0 bytes
+ .../colrv1/TestCOLRv1.drop-hints.E003,E004.ttx     |    367 +
+ .../expected/colrv1/TestCOLRv1.drop-hints.E004.ttf |    Bin 744 -> 0 bytes
+ .../expected/colrv1/TestCOLRv1.drop-hints.E004.ttx |    231 +
+ .../TestCOLRv1.drop-hints.retain-all-codepoint.ttf |    Bin 1444 -> 0 bytes
+ .../TestCOLRv1.drop-hints.retain-all-codepoint.ttx |    596 +
+ .../colrv1/TestCOLRv1.retain-gids.E000,E004.ttf    |    Bin 984 -> 0 bytes
+ .../colrv1/TestCOLRv1.retain-gids.E000,E004.ttx    |    364 +
+ .../colrv1/TestCOLRv1.retain-gids.E003,E004.ttf    |    Bin 1076 -> 0 bytes
+ .../colrv1/TestCOLRv1.retain-gids.E003,E004.ttx    |    411 +
+ .../colrv1/TestCOLRv1.retain-gids.E004.ttf         |    Bin 836 -> 0 bytes
+ .../colrv1/TestCOLRv1.retain-gids.E004.ttx         |    291 +
+ ...TestCOLRv1.retain-gids.retain-all-codepoint.ttf |    Bin 1444 -> 0 bytes
+ ...TestCOLRv1.retain-gids.retain-all-codepoint.ttx |    596 +
+ .../Roboto-Regular.default.1FC,21,41,20,62,63.ttf  |    Bin 3080 -> 0 bytes
+ .../Roboto-Regular.default.1FC,21,41,20,62,63.ttx  |   1659 +
+ .../full-font/Roboto-Regular.default.61,62,63.ttf  |    Bin 2672 -> 0 bytes
+ .../full-font/Roboto-Regular.default.61,62,63.ttx  |   1422 +
+ .../Roboto-Regular.default.D7,D8,D9,DA,DE.ttf      |    Bin 3024 -> 0 bytes
+ .../Roboto-Regular.default.D7,D8,D9,DA,DE.ttx      |   1571 +
+ ...oboto-Regular.drop-hints.1FC,21,41,20,62,63.ttf |    Bin 1632 -> 0 bytes
+ ...oboto-Regular.drop-hints.1FC,21,41,20,62,63.ttx |    549 +
+ .../Roboto-Regular.drop-hints.61,62,63.ttf         |    Bin 1412 -> 0 bytes
+ .../Roboto-Regular.drop-hints.61,62,63.ttx         |    494 +
+ .../Roboto-Regular.drop-hints.D7,D8,D9,DA,DE.ttf   |    Bin 1648 -> 0 bytes
+ .../Roboto-Regular.drop-hints.D7,D8,D9,DA,DE.ttx   |    529 +
+ ...ifVariable-Roman.default.1FC,21,41,20,62,63.ttf |    Bin 3992 -> 0 bytes
+ ...ifVariable-Roman.default.1FC,21,41,20,62,63.ttx |   1355 +
+ .../SourceSerifVariable-Roman.default.61,62,63.ttf |    Bin 3832 -> 0 bytes
+ .../SourceSerifVariable-Roman.default.61,62,63.ttx |   1262 +
+ ...eSerifVariable-Roman.default.D7,D8,D9,DA,DE.ttf |    Bin 4396 -> 0 bytes
+ ...eSerifVariable-Roman.default.D7,D8,D9,DA,DE.ttx |   1522 +
+ ...ariable-Roman.drop-hints.1FC,21,41,20,62,63.ttf |    Bin 3968 -> 0 bytes
+ ...ariable-Roman.drop-hints.1FC,21,41,20,62,63.ttx |   1349 +
+ ...urceSerifVariable-Roman.drop-hints.61,62,63.ttf |    Bin 3832 -> 0 bytes
+ ...urceSerifVariable-Roman.drop-hints.61,62,63.ttx |   1262 +
+ ...rifVariable-Roman.drop-hints.D7,D8,D9,DA,DE.ttf |    Bin 4396 -> 0 bytes
+ ...rifVariable-Roman.drop-hints.D7,D8,D9,DA,DE.ttx |   1522 +
+ .../Mplus1p-Regular.default.1D715,1D7D8,41,42.ttf  |    Bin 2344 -> 0 bytes
+ .../Mplus1p-Regular.default.1D715,1D7D8,41,42.ttx  |   1187 +
+ .../japanese/Mplus1p-Regular.default.25771.ttf     |    Bin 1992 -> 0 bytes
+ .../japanese/Mplus1p-Regular.default.25771.ttx     |   1033 +
+ ...gular.default.3042,3044,3046,3048,304A,304B.ttf |    Bin 2704 -> 0 bytes
+ ...gular.default.3042,3044,3046,3048,304A,304B.ttx |   1296 +
+ ...gular.default.3042,3044,3046,73E0,5EA6,8F38.ttf |    Bin 2948 -> 0 bytes
+ ...gular.default.3042,3044,3046,73E0,5EA6,8F38.ttx |   1403 +
+ .../Mplus1p-Regular.default.61,63,65,6B.ttf        |    Bin 2324 -> 0 bytes
+ .../Mplus1p-Regular.default.61,63,65,6B.ttx        |   1172 +
+ ...gular.default.660E,6975,73E0,5EA6,8F38,6E05.ttf |    Bin 3244 -> 0 bytes
+ ...gular.default.660E,6975,73E0,5EA6,8F38,6E05.ttx |   1522 +
+ .../japanese/Mplus1p-Regular.default.660E.ttf      |    Bin 1984 -> 0 bytes
+ .../japanese/Mplus1p-Regular.default.660E.ttx      |   1024 +
+ ...plus1p-Regular.drop-hints.1D715,1D7D8,41,42.ttf |    Bin 1616 -> 0 bytes
+ ...plus1p-Regular.drop-hints.1D715,1D7D8,41,42.ttx |    522 +
+ .../japanese/Mplus1p-Regular.drop-hints.25771.ttf  |    Bin 1264 -> 0 bytes
+ .../japanese/Mplus1p-Regular.drop-hints.25771.ttx  |    368 +
+ ...ar.drop-hints.3042,3044,3046,3048,304A,304B.ttf |    Bin 1976 -> 0 bytes
+ ...ar.drop-hints.3042,3044,3046,3048,304A,304B.ttx |    631 +
+ ...ar.drop-hints.3042,3044,3046,73E0,5EA6,8F38.ttf |    Bin 2220 -> 0 bytes
+ ...ar.drop-hints.3042,3044,3046,73E0,5EA6,8F38.ttx |    738 +
+ .../Mplus1p-Regular.drop-hints.61,63,65,6B.ttf     |    Bin 1596 -> 0 bytes
+ .../Mplus1p-Regular.drop-hints.61,63,65,6B.ttx     |    507 +
+ ...ar.drop-hints.660E,6975,73E0,5EA6,8F38,6E05.ttf |    Bin 2516 -> 0 bytes
+ ...ar.drop-hints.660E,6975,73E0,5EA6,8F38,6E05.ttx |    857 +
+ .../japanese/Mplus1p-Regular.drop-hints.660E.ttf   |    Bin 1256 -> 0 bytes
+ .../japanese/Mplus1p-Regular.drop-hints.660E.ttx   |    359 +
+ ...Mplus1p-Regular.keep-gdef.1D715,1D7D8,41,42.ttf |    Bin 2344 -> 0 bytes
+ ...Mplus1p-Regular.keep-gdef.1D715,1D7D8,41,42.ttx |   1187 +
+ .../japanese/Mplus1p-Regular.keep-gdef.25771.ttf   |    Bin 1992 -> 0 bytes
+ .../japanese/Mplus1p-Regular.keep-gdef.25771.ttx   |   1033 +
+ ...lar.keep-gdef.3042,3044,3046,3048,304A,304B.ttf |    Bin 2704 -> 0 bytes
+ ...lar.keep-gdef.3042,3044,3046,3048,304A,304B.ttx |   1296 +
+ ...lar.keep-gdef.3042,3044,3046,73E0,5EA6,8F38.ttf |    Bin 2948 -> 0 bytes
+ ...lar.keep-gdef.3042,3044,3046,73E0,5EA6,8F38.ttx |   1403 +
+ .../Mplus1p-Regular.keep-gdef.61,63,65,6B.ttf      |    Bin 2324 -> 0 bytes
+ .../Mplus1p-Regular.keep-gdef.61,63,65,6B.ttx      |   1172 +
+ ...lar.keep-gdef.660E,6975,73E0,5EA6,8F38,6E05.ttf |    Bin 3244 -> 0 bytes
+ ...lar.keep-gdef.660E,6975,73E0,5EA6,8F38,6E05.ttx |   1522 +
+ .../japanese/Mplus1p-Regular.keep-gdef.660E.ttf    |    Bin 1984 -> 0 bytes
+ .../japanese/Mplus1p-Regular.keep-gdef.660E.ttx    |   1024 +
+ ...text1_multiple_subrules_f1.default.41,42,43.otf |    Bin 1328 -> 0 bytes
+ ...text1_multiple_subrules_f1.default.41,42,43.ttx |    284 +
+ ...context1_multiple_subrules_f1.default.41,42.otf |    Bin 1228 -> 0 bytes
+ ...context1_multiple_subrules_f1.default.41,42.ttx |    265 +
+ ...context1_multiple_subrules_f1.default.41,43.otf |    Bin 1332 -> 0 bytes
+ ...context1_multiple_subrules_f1.default.41,43.ttx |    275 +
+ ...os_context1_multiple_subrules_f1.default.41.otf |    Bin 1216 -> 0 bytes
+ ...os_context1_multiple_subrules_f1.default.41.ttx |    256 +
+ ...le_subrules_f1.default.retain-all-codepoint.otf |    Bin 3700 -> 0 bytes
+ ...le_subrules_f1.default.retain-all-codepoint.ttx |   1247 +
+ ...1_multiple_subrules_f1.retain-gids.41,42,43.otf |    Bin 2028 -> 0 bytes
+ ...1_multiple_subrules_f1.retain-gids.41,42,43.ttx |    604 +
+ ...ext1_multiple_subrules_f1.retain-gids.41,42.otf |    Bin 1932 -> 0 bytes
+ ...ext1_multiple_subrules_f1.retain-gids.41,42.ttx |    585 +
+ ...ext1_multiple_subrules_f1.retain-gids.41,43.otf |    Bin 2048 -> 0 bytes
+ ...ext1_multiple_subrules_f1.retain-gids.41,43.ttx |    600 +
+ ...ontext1_multiple_subrules_f1.retain-gids.41.otf |    Bin 1916 -> 0 bytes
+ ...ontext1_multiple_subrules_f1.retain-gids.41.ttx |    576 +
+ ...ubrules_f1.retain-gids.retain-all-codepoint.otf |    Bin 3700 -> 0 bytes
+ ...ubrules_f1.retain-gids.retain-all-codepoint.ttx |   1247 +
+ ...text2_multiple_subrules_f1.default.41,42,43.otf |    Bin 1328 -> 0 bytes
+ ...text2_multiple_subrules_f1.default.41,42,43.ttx |    284 +
+ ...context2_multiple_subrules_f1.default.41,42.otf |    Bin 1228 -> 0 bytes
+ ...context2_multiple_subrules_f1.default.41,42.ttx |    265 +
+ ...context2_multiple_subrules_f1.default.41,43.otf |    Bin 1332 -> 0 bytes
+ ...context2_multiple_subrules_f1.default.41,43.ttx |    275 +
+ ...os_context2_multiple_subrules_f1.default.41.otf |    Bin 1216 -> 0 bytes
+ ...os_context2_multiple_subrules_f1.default.41.ttx |    256 +
+ ...le_subrules_f1.default.retain-all-codepoint.otf |    Bin 3700 -> 0 bytes
+ ...le_subrules_f1.default.retain-all-codepoint.ttx |   1247 +
+ ...2_multiple_subrules_f1.retain-gids.41,42,43.otf |    Bin 2028 -> 0 bytes
+ ...2_multiple_subrules_f1.retain-gids.41,42,43.ttx |    604 +
+ ...ext2_multiple_subrules_f1.retain-gids.41,42.otf |    Bin 1932 -> 0 bytes
+ ...ext2_multiple_subrules_f1.retain-gids.41,42.ttx |    585 +
+ ...ext2_multiple_subrules_f1.retain-gids.41,43.otf |    Bin 2048 -> 0 bytes
+ ...ext2_multiple_subrules_f1.retain-gids.41,43.ttx |    600 +
+ ...ontext2_multiple_subrules_f1.retain-gids.41.otf |    Bin 1916 -> 0 bytes
+ ...ontext2_multiple_subrules_f1.retain-gids.41.ttx |    576 +
+ ...ubrules_f1.retain-gids.retain-all-codepoint.otf |    Bin 3700 -> 0 bytes
+ ...ubrules_f1.retain-gids.retain-all-codepoint.ttx |   1247 +
+ .../gpos_context3_simple_f1.default.41,42,43.otf   |    Bin 1308 -> 0 bytes
+ .../gpos_context3_simple_f1.default.41,42,43.ttx   |    284 +
+ .../gpos_context3_simple_f1.default.41,42.otf      |    Bin 1208 -> 0 bytes
+ .../gpos_context3_simple_f1.default.41,42.ttx      |    265 +
+ .../gpos_context3_simple_f1.default.41,43.otf      |    Bin 1312 -> 0 bytes
+ .../gpos_context3_simple_f1.default.41,43.ttx      |    275 +
+ .../gpos_context3_simple_f1.default.41.otf         |    Bin 1196 -> 0 bytes
+ .../gpos_context3_simple_f1.default.41.ttx         |    256 +
+ ...ext3_simple_f1.default.retain-all-codepoint.otf |    Bin 3680 -> 0 bytes
+ ...ext3_simple_f1.default.retain-all-codepoint.ttx |   1247 +
+ ...pos_context3_simple_f1.retain-gids.41,42,43.otf |    Bin 2008 -> 0 bytes
+ ...pos_context3_simple_f1.retain-gids.41,42,43.ttx |    604 +
+ .../gpos_context3_simple_f1.retain-gids.41,42.otf  |    Bin 1912 -> 0 bytes
+ .../gpos_context3_simple_f1.retain-gids.41,42.ttx  |    585 +
+ .../gpos_context3_simple_f1.retain-gids.41,43.otf  |    Bin 2028 -> 0 bytes
+ .../gpos_context3_simple_f1.retain-gids.41,43.ttx  |    600 +
+ .../gpos_context3_simple_f1.retain-gids.41.otf     |    Bin 1896 -> 0 bytes
+ .../gpos_context3_simple_f1.retain-gids.41.ttx     |    576 +
+ ..._simple_f1.retain-gids.retain-all-codepoint.otf |    Bin 3680 -> 0 bytes
+ ..._simple_f1.retain-gids.retain-all-codepoint.ttx |   1247 +
+ .../IndicTestJalandhar-Regular.default.A01.ttf     |    Bin 4176 -> 0 bytes
+ .../IndicTestJalandhar-Regular.default.A01.ttx     |   2916 +
+ .../IndicTestJalandhar-Regular.default.A05,A06.ttf |    Bin 4752 -> 0 bytes
+ .../IndicTestJalandhar-Regular.default.A05,A06.ttx |   3167 +
+ .../IndicTestJalandhar-Regular.default.A07,A1B.ttf |    Bin 4724 -> 0 bytes
+ .../IndicTestJalandhar-Regular.default.A07,A1B.ttx |   3148 +
+ ...andhar-Regular.default.retain-all-codepoint.ttf |    Bin 49244 -> 0 bytes
+ ...andhar-Regular.default.retain-all-codepoint.ttx |  22554 +++
+ .../IndicTestJalandhar-Regular.drop-hints.A01.ttf  |    Bin 1036 -> 0 bytes
+ .../IndicTestJalandhar-Regular.drop-hints.A01.ttx  |    281 +
+ ...dicTestJalandhar-Regular.drop-hints.A05,A06.ttf |    Bin 1344 -> 0 bytes
+ ...dicTestJalandhar-Regular.drop-hints.A05,A06.ttx |    403 +
+ ...dicTestJalandhar-Regular.drop-hints.A07,A1B.ttf |    Bin 1344 -> 0 bytes
+ ...dicTestJalandhar-Regular.drop-hints.A07,A1B.ttx |    404 +
+ ...har-Regular.drop-hints.retain-all-codepoint.ttf |    Bin 29464 -> 0 bytes
+ ...har-Regular.drop-hints.retain-all-codepoint.ttx |  11627 ++
+ .../IndicTestJalandhar-Regular.keep-gdef.A01.ttf   |    Bin 4176 -> 0 bytes
+ .../IndicTestJalandhar-Regular.keep-gdef.A01.ttx   |   2916 +
+ ...ndicTestJalandhar-Regular.keep-gdef.A05,A06.ttf |    Bin 4752 -> 0 bytes
+ ...ndicTestJalandhar-Regular.keep-gdef.A05,A06.ttx |   3167 +
+ ...ndicTestJalandhar-Regular.keep-gdef.A07,A1B.ttf |    Bin 4724 -> 0 bytes
+ ...ndicTestJalandhar-Regular.keep-gdef.A07,A1B.ttx |   3148 +
+ ...dhar-Regular.keep-gdef.retain-all-codepoint.ttf |    Bin 49244 -> 0 bytes
+ ...dhar-Regular.keep-gdef.retain-all-codepoint.ttx |  22554 +++
+ .../AdobeVFPrototype.default.41,42,43,57.otf       |    Bin 5440 -> 0 bytes
+ .../AdobeVFPrototype.default.41,42,43,57.ttx       |   1536 +
+ .../AdobeVFPrototype.default.41,42,43.otf          |    Bin 4908 -> 0 bytes
+ .../AdobeVFPrototype.default.41,42,43.ttx          |   1338 +
+ .../AdobeVFPrototype.default.41,42.otf             |    Bin 4432 -> 0 bytes
+ .../AdobeVFPrototype.default.41,42.ttx             |   1201 +
+ .../AdobeVFPrototype.default.41,56,57.otf          |    Bin 4576 -> 0 bytes
+ .../AdobeVFPrototype.default.41,56,57.ttx          |   1310 +
+ .../AdobeVFPrototype.default.41.otf                |    Bin 3728 -> 0 bytes
+ .../AdobeVFPrototype.default.41.ttx                |   1000 +
+ .../AdobeVFPrototype.default.42,57.otf             |    Bin 4564 -> 0 bytes
+ .../AdobeVFPrototype.default.42,57.ttx             |   1253 +
+ .../AdobeVFPrototype.drop-hints.41,42,43,57.otf    |    Bin 5252 -> 0 bytes
+ .../AdobeVFPrototype.drop-hints.41,42,43,57.ttx    |   1500 +
+ .../AdobeVFPrototype.drop-hints.41,42,43.otf       |    Bin 4720 -> 0 bytes
+ .../AdobeVFPrototype.drop-hints.41,42,43.ttx       |   1302 +
+ .../AdobeVFPrototype.drop-hints.41,42.otf          |    Bin 4244 -> 0 bytes
+ .../AdobeVFPrototype.drop-hints.41,42.ttx          |   1165 +
+ .../AdobeVFPrototype.drop-hints.41,56,57.otf       |    Bin 4384 -> 0 bytes
+ .../AdobeVFPrototype.drop-hints.41,56,57.ttx       |   1274 +
+ .../AdobeVFPrototype.drop-hints.41.otf             |    Bin 3540 -> 0 bytes
+ .../AdobeVFPrototype.drop-hints.41.ttx             |    964 +
+ .../AdobeVFPrototype.drop-hints.42,57.otf          |    Bin 4376 -> 0 bytes
+ .../AdobeVFPrototype.drop-hints.42,57.ttx          |   1217 +
+ ...AdobeVFPrototype.keep-gdef-gpos.41,42,43,57.otf |    Bin 5440 -> 0 bytes
+ ...AdobeVFPrototype.keep-gdef-gpos.41,42,43,57.ttx |   1536 +
+ .../AdobeVFPrototype.keep-gdef-gpos.41,42,43.otf   |    Bin 4908 -> 0 bytes
+ .../AdobeVFPrototype.keep-gdef-gpos.41,42,43.ttx   |   1338 +
+ .../AdobeVFPrototype.keep-gdef-gpos.41,42.otf      |    Bin 4432 -> 0 bytes
+ .../AdobeVFPrototype.keep-gdef-gpos.41,42.ttx      |   1201 +
+ .../AdobeVFPrototype.keep-gdef-gpos.41,56,57.otf   |    Bin 4576 -> 0 bytes
+ .../AdobeVFPrototype.keep-gdef-gpos.41,56,57.ttx   |   1310 +
+ .../AdobeVFPrototype.keep-gdef-gpos.41.otf         |    Bin 3728 -> 0 bytes
+ .../AdobeVFPrototype.keep-gdef-gpos.41.ttx         |   1000 +
+ .../AdobeVFPrototype.keep-gdef-gpos.42,57.otf      |    Bin 4564 -> 0 bytes
+ .../AdobeVFPrototype.keep-gdef-gpos.42,57.ttx      |   1253 +
+ .../Roboto-Regular.default.1E00,303.ttf            |    Bin 2524 -> 0 bytes
+ .../Roboto-Regular.default.1E00,303.ttx            |   1258 +
+ .../layout.gdef/Roboto-Regular.default.303.ttf     |    Bin 2116 -> 0 bytes
+ .../layout.gdef/Roboto-Regular.default.303.ttx     |   1012 +
+ .../Roboto-Regular.default.309,20,30F.ttf          |    Bin 2212 -> 0 bytes
+ .../Roboto-Regular.default.309,20,30F.ttx          |   1054 +
+ .../layout.gdef/Roboto-Regular.default.323.ttf     |    Bin 2008 -> 0 bytes
+ .../layout.gdef/Roboto-Regular.default.323.ttx     |    949 +
+ .../Roboto-Regular.default.41,42,43.ttf            |    Bin 2572 -> 0 bytes
+ .../Roboto-Regular.default.41,42,43.ttx            |   1349 +
+ .../Roboto-Regular.drop-hints.1E00,303.ttf         |    Bin 1380 -> 0 bytes
+ .../Roboto-Regular.drop-hints.1E00,303.ttx         |    443 +
+ .../layout.gdef/Roboto-Regular.drop-hints.303.ttf  |    Bin 1112 -> 0 bytes
+ .../layout.gdef/Roboto-Regular.drop-hints.303.ttx  |    312 +
+ .../Roboto-Regular.drop-hints.309,20,30F.ttf       |    Bin 1172 -> 0 bytes
+ .../Roboto-Regular.drop-hints.309,20,30F.ttx       |    328 +
+ .../layout.gdef/Roboto-Regular.drop-hints.323.ttf  |    Bin 1056 -> 0 bytes
+ .../layout.gdef/Roboto-Regular.drop-hints.323.ttx  |    291 +
+ .../Roboto-Regular.drop-hints.41,42,43.ttf         |    Bin 1388 -> 0 bytes
+ .../Roboto-Regular.drop-hints.41,42,43.ttx         |    480 +
+ .../Roboto-Regular.keep-gdef-gpos.1E00,303.ttf     |    Bin 2524 -> 0 bytes
+ .../Roboto-Regular.keep-gdef-gpos.1E00,303.ttx     |   1258 +
+ .../Roboto-Regular.keep-gdef-gpos.303.ttf          |    Bin 2116 -> 0 bytes
+ .../Roboto-Regular.keep-gdef-gpos.303.ttx          |   1012 +
+ .../Roboto-Regular.keep-gdef-gpos.309,20,30F.ttf   |    Bin 2212 -> 0 bytes
+ .../Roboto-Regular.keep-gdef-gpos.309,20,30F.ttx   |   1054 +
+ .../Roboto-Regular.keep-gdef-gpos.323.ttf          |    Bin 2008 -> 0 bytes
+ .../Roboto-Regular.keep-gdef-gpos.323.ttx          |    949 +
+ .../Roboto-Regular.keep-gdef-gpos.41,42,43.ttf     |    Bin 2572 -> 0 bytes
+ .../Roboto-Regular.keep-gdef-gpos.41,42,43.ttx     |   1349 +
+ .../layout.gpos/gpos1_2_font.default.41,43.otf     |    Bin 1292 -> 0 bytes
+ .../layout.gpos/gpos1_2_font.default.41,43.ttx     |    275 +
+ .../layout.gpos/gpos1_2_font.default.41,46.otf     |    Bin 1424 -> 0 bytes
+ .../layout.gpos/gpos1_2_font.default.41,46.ttx     |    286 +
+ .../layout.gpos/gpos1_2_font.default.41.otf        |    Bin 1176 -> 0 bytes
+ .../layout.gpos/gpos1_2_font.default.41.ttx        |    256 +
+ .../layout.gpos/gpos1_2_font.default.42,44.otf     |    Bin 1268 -> 0 bytes
+ .../layout.gpos/gpos1_2_font.default.42,44.ttx     |    265 +
+ .../layout.gpos/gpos1_2_font.default.43,46.otf     |    Bin 1288 -> 0 bytes
+ .../layout.gpos/gpos1_2_font.default.43,46.ttx     |    275 +
+ .../gpos1_2_font.default.retain-all-codepoint.otf  |    Bin 3604 -> 0 bytes
+ .../gpos1_2_font.default.retain-all-codepoint.ttx  |   1221 +
+ .../layout.gpos/gpos1_2_font.retain-gids.41,43.otf |    Bin 2008 -> 0 bytes
+ .../layout.gpos/gpos1_2_font.retain-gids.41,43.ttx |    600 +
+ .../layout.gpos/gpos1_2_font.retain-gids.41,46.otf |    Bin 2172 -> 0 bytes
+ .../layout.gpos/gpos1_2_font.retain-gids.41,46.ttx |    626 +
+ .../layout.gpos/gpos1_2_font.retain-gids.41.otf    |    Bin 1876 -> 0 bytes
+ .../layout.gpos/gpos1_2_font.retain-gids.41.ttx    |    576 +
+ .../layout.gpos/gpos1_2_font.retain-gids.42,44.otf |    Bin 1992 -> 0 bytes
+ .../layout.gpos/gpos1_2_font.retain-gids.42,44.ttx |    595 +
+ .../layout.gpos/gpos1_2_font.retain-gids.43,46.otf |    Bin 2036 -> 0 bytes
+ .../layout.gpos/gpos1_2_font.retain-gids.43,46.ttx |    615 +
+ ...os1_2_font.retain-gids.retain-all-codepoint.otf |    Bin 3604 -> 0 bytes
+ ...os1_2_font.retain-gids.retain-all-codepoint.ttx |   1221 +
+ .../gpos2_1_font7.default.21,23,25.otf             |    Bin 1360 -> 0 bytes
+ .../gpos2_1_font7.default.21,23,25.ttx             |    287 +
+ .../layout.gpos2/gpos2_1_font7.default.21,23.otf   |    Bin 1240 -> 0 bytes
+ .../layout.gpos2/gpos2_1_font7.default.21,23.ttx   |    268 +
+ .../layout.gpos2/gpos2_1_font7.default.2E,23.otf   |    Bin 1508 -> 0 bytes
+ .../layout.gpos2/gpos2_1_font7.default.2E,23.ttx   |    291 +
+ .../gpos2_1_font7.default.41,42,43.otf             |    Bin 1288 -> 0 bytes
+ .../gpos2_1_font7.default.41,42,43.ttx             |    284 +
+ .../gpos2_1_font7.default.retain-all-codepoint.otf |    Bin 3604 -> 0 bytes
+ .../gpos2_1_font7.default.retain-all-codepoint.ttx |   1221 +
+ .../gpos2_1_font7.retain-gids.21,23,25.otf         |    Bin 1696 -> 0 bytes
+ .../gpos2_1_font7.retain-gids.21,23,25.ttx         |    457 +
+ .../gpos2_1_font7.retain-gids.21,23.otf            |    Bin 1564 -> 0 bytes
+ .../gpos2_1_font7.retain-gids.21,23.ttx            |    433 +
+ .../gpos2_1_font7.retain-gids.2E,23.otf            |    Bin 1944 -> 0 bytes
+ .../gpos2_1_font7.retain-gids.2E,23.ttx            |    511 +
+ .../gpos2_1_font7.retain-gids.41,42,43.otf         |    Bin 1988 -> 0 bytes
+ .../gpos2_1_font7.retain-gids.41,42,43.ttx         |    604 +
+ ...s2_1_font7.retain-gids.retain-all-codepoint.otf |    Bin 3604 -> 0 bytes
+ ...s2_1_font7.retain-gids.retain-all-codepoint.ttx |   1221 +
+ .../gpos2_2_font5.default.21,23,25.otf             |    Bin 1360 -> 0 bytes
+ .../gpos2_2_font5.default.21,23,25.ttx             |    287 +
+ .../layout.gpos2/gpos2_2_font5.default.21,23.otf   |    Bin 1240 -> 0 bytes
+ .../layout.gpos2/gpos2_2_font5.default.21,23.ttx   |    268 +
+ .../layout.gpos2/gpos2_2_font5.default.2E,23.otf   |    Bin 1508 -> 0 bytes
+ .../layout.gpos2/gpos2_2_font5.default.2E,23.ttx   |    291 +
+ .../gpos2_2_font5.default.41,42,43.otf             |    Bin 1288 -> 0 bytes
+ .../gpos2_2_font5.default.41,42,43.ttx             |    284 +
+ .../gpos2_2_font5.default.retain-all-codepoint.otf |    Bin 3604 -> 0 bytes
+ .../gpos2_2_font5.default.retain-all-codepoint.ttx |   1221 +
+ .../gpos2_2_font5.retain-gids.21,23,25.otf         |    Bin 1696 -> 0 bytes
+ .../gpos2_2_font5.retain-gids.21,23,25.ttx         |    457 +
+ .../gpos2_2_font5.retain-gids.21,23.otf            |    Bin 1564 -> 0 bytes
+ .../gpos2_2_font5.retain-gids.21,23.ttx            |    433 +
+ .../gpos2_2_font5.retain-gids.2E,23.otf            |    Bin 1944 -> 0 bytes
+ .../gpos2_2_font5.retain-gids.2E,23.ttx            |    511 +
+ .../gpos2_2_font5.retain-gids.41,42,43.otf         |    Bin 1988 -> 0 bytes
+ .../gpos2_2_font5.retain-gids.41,42,43.ttx         |    604 +
+ ...s2_2_font5.retain-gids.retain-all-codepoint.otf |    Bin 3604 -> 0 bytes
+ ...s2_2_font5.retain-gids.retain-all-codepoint.ttx |   1221 +
+ .../layout.gpos3/gpos3_font3.default.28,29.otf     |    Bin 1248 -> 0 bytes
+ .../layout.gpos3/gpos3_font3.default.28,29.ttx     |    276 +
+ .../layout.gpos3/gpos3_font3.default.28,2B.otf     |    Bin 1376 -> 0 bytes
+ .../layout.gpos3/gpos3_font3.default.28,2B.ttx     |    282 +
+ .../layout.gpos3/gpos3_font3.default.29,2B.otf     |    Bin 1292 -> 0 bytes
+ .../layout.gpos3/gpos3_font3.default.29,2B.ttx     |    277 +
+ .../layout.gpos3/gpos3_font3.default.41,42,43.otf  |    Bin 1284 -> 0 bytes
+ .../layout.gpos3/gpos3_font3.default.41,42,43.ttx  |    284 +
+ .../gpos3_font3.default.retain-all-codepoint.otf   |    Bin 3636 -> 0 bytes
+ .../gpos3_font3.default.retain-all-codepoint.ttx   |   1228 +
+ .../layout.gpos3/gpos3_font3.retain-gids.28,29.otf |    Bin 1632 -> 0 bytes
+ .../layout.gpos3/gpos3_font3.retain-gids.28,29.ttx |    471 +
+ .../layout.gpos3/gpos3_font3.retain-gids.28,2B.otf |    Bin 1780 -> 0 bytes
+ .../layout.gpos3/gpos3_font3.retain-gids.28,2B.ttx |    487 +
+ .../layout.gpos3/gpos3_font3.retain-gids.29,2B.otf |    Bin 1696 -> 0 bytes
+ .../layout.gpos3/gpos3_font3.retain-gids.29,2B.ttx |    482 +
+ .../gpos3_font3.retain-gids.41,42,43.otf           |    Bin 1984 -> 0 bytes
+ .../gpos3_font3.retain-gids.41,42,43.ttx           |    604 +
+ ...pos3_font3.retain-gids.retain-all-codepoint.otf |    Bin 3636 -> 0 bytes
+ ...pos3_font3.retain-gids.retain-all-codepoint.ttx |   1228 +
+ ...pos4_multiple_anchors_1.default.41,42,43,44.otf |    Bin 1516 -> 0 bytes
+ ...pos4_multiple_anchors_1.default.41,42,43,44.ttx |    304 +
+ ...pos4_multiple_anchors_1.default.41,42,43,45.otf |    Bin 1524 -> 0 bytes
+ ...pos4_multiple_anchors_1.default.41,42,43,45.ttx |    305 +
+ .../gpos4_multiple_anchors_1.default.41,42,43.otf  |    Bin 1308 -> 0 bytes
+ .../gpos4_multiple_anchors_1.default.41,42,43.ttx  |    284 +
+ .../gpos4_multiple_anchors_1.default.41,42.otf     |    Bin 1208 -> 0 bytes
+ .../gpos4_multiple_anchors_1.default.41,42.ttx     |    265 +
+ ...4_multiple_anchors_1.default.41,43,44,45,46.otf |    Bin 1864 -> 0 bytes
+ ...4_multiple_anchors_1.default.41,43,44,45,46.ttx |    336 +
+ .../gpos4_multiple_anchors_1.default.41,43,44.otf  |    Bin 1524 -> 0 bytes
+ .../gpos4_multiple_anchors_1.default.41,43,44.ttx  |    295 +
+ .../gpos4_multiple_anchors_1.default.41,43,45.otf  |    Bin 1532 -> 0 bytes
+ .../gpos4_multiple_anchors_1.default.41,43,45.ttx  |    296 +
+ .../gpos4_multiple_anchors_1.default.41,43.otf     |    Bin 1312 -> 0 bytes
+ .../gpos4_multiple_anchors_1.default.41,43.ttx     |    275 +
+ .../gpos4_multiple_anchors_1.default.41.otf        |    Bin 1196 -> 0 bytes
+ .../gpos4_multiple_anchors_1.default.41.ttx        |    256 +
+ ...iple_anchors_1.default.retain-all-codepoint.otf |    Bin 3668 -> 0 bytes
+ ...iple_anchors_1.default.retain-all-codepoint.ttx |   1233 +
+ ..._multiple_anchors_1.retain-gids.41,42,43,44.otf |    Bin 2220 -> 0 bytes
+ ..._multiple_anchors_1.retain-gids.41,42,43,44.ttx |    624 +
+ ..._multiple_anchors_1.retain-gids.41,42,43,45.otf |    Bin 2244 -> 0 bytes
+ ..._multiple_anchors_1.retain-gids.41,42,43,45.ttx |    630 +
+ ...os4_multiple_anchors_1.retain-gids.41,42,43.otf |    Bin 2008 -> 0 bytes
+ ...os4_multiple_anchors_1.retain-gids.41,42,43.ttx |    604 +
+ .../gpos4_multiple_anchors_1.retain-gids.41,42.otf |    Bin 1912 -> 0 bytes
+ .../gpos4_multiple_anchors_1.retain-gids.41,42.ttx |    585 +
+ ...ltiple_anchors_1.retain-gids.41,43,44,45,46.otf |    Bin 2584 -> 0 bytes
+ ...ltiple_anchors_1.retain-gids.41,43,44,45,46.ttx |    661 +
+ ...os4_multiple_anchors_1.retain-gids.41,43,44.otf |    Bin 2240 -> 0 bytes
+ ...os4_multiple_anchors_1.retain-gids.41,43,44.ttx |    620 +
+ ...os4_multiple_anchors_1.retain-gids.41,43,45.otf |    Bin 2260 -> 0 bytes
+ ...os4_multiple_anchors_1.retain-gids.41,43,45.ttx |    626 +
+ .../gpos4_multiple_anchors_1.retain-gids.41,43.otf |    Bin 2028 -> 0 bytes
+ .../gpos4_multiple_anchors_1.retain-gids.41,43.ttx |    600 +
+ .../gpos4_multiple_anchors_1.retain-gids.41.otf    |    Bin 1896 -> 0 bytes
+ .../gpos4_multiple_anchors_1.retain-gids.41.ttx    |    576 +
+ ..._anchors_1.retain-gids.retain-all-codepoint.otf |    Bin 3668 -> 0 bytes
+ ..._anchors_1.retain-gids.retain-all-codepoint.ttx |   1233 +
+ .../gpos5_font1.default.41,42,43,44.otf            |    Bin 1536 -> 0 bytes
+ .../gpos5_font1.default.41,42,43,44.ttx            |    323 +
+ .../gpos5_font1.default.41,42,43,45.otf            |    Bin 1544 -> 0 bytes
+ .../gpos5_font1.default.41,42,43,45.ttx            |    324 +
+ .../layout.gpos5/gpos5_font1.default.41,42,43.otf  |    Bin 1328 -> 0 bytes
+ .../layout.gpos5/gpos5_font1.default.41,42,43.ttx  |    303 +
+ .../layout.gpos5/gpos5_font1.default.41,42,44.otf  |    Bin 1460 -> 0 bytes
+ .../layout.gpos5/gpos5_font1.default.41,42,44.ttx  |    304 +
+ .../layout.gpos5/gpos5_font1.default.41,42,45.otf  |    Bin 1448 -> 0 bytes
+ .../layout.gpos5/gpos5_font1.default.41,42,45.ttx  |    305 +
+ .../layout.gpos5/gpos5_font1.default.41,42.otf     |    Bin 1228 -> 0 bytes
+ .../layout.gpos5/gpos5_font1.default.41,42.ttx     |    284 +
+ .../layout.gpos5/gpos5_font1.default.41,43.otf     |    Bin 1332 -> 0 bytes
+ .../layout.gpos5/gpos5_font1.default.41,43.ttx     |    294 +
+ .../layout.gpos5/gpos5_font1.default.41.otf        |    Bin 1216 -> 0 bytes
+ .../layout.gpos5/gpos5_font1.default.41.ttx        |    275 +
+ .../layout.gpos5/gpos5_font1.default.42.otf        |    Bin 1076 -> 0 bytes
+ .../layout.gpos5/gpos5_font1.default.42.ttx        |    264 +
+ .../gpos5_font1.default.retain-all-codepoint.otf   |    Bin 3688 -> 0 bytes
+ .../gpos5_font1.default.retain-all-codepoint.ttx   |   1250 +
+ .../gpos5_font1.retain-gids.41,42,43,44.otf        |    Bin 2240 -> 0 bytes
+ .../gpos5_font1.retain-gids.41,42,43,44.ttx        |    643 +
+ .../gpos5_font1.retain-gids.41,42,43,45.otf        |    Bin 2264 -> 0 bytes
+ .../gpos5_font1.retain-gids.41,42,43,45.ttx        |    649 +
+ .../gpos5_font1.retain-gids.41,42,43.otf           |    Bin 2028 -> 0 bytes
+ .../gpos5_font1.retain-gids.41,42,43.ttx           |    623 +
+ .../gpos5_font1.retain-gids.41,42,44.otf           |    Bin 2176 -> 0 bytes
+ .../gpos5_font1.retain-gids.41,42,44.ttx           |    629 +
+ .../gpos5_font1.retain-gids.41,42,45.otf           |    Bin 2172 -> 0 bytes
+ .../gpos5_font1.retain-gids.41,42,45.ttx           |    635 +
+ .../layout.gpos5/gpos5_font1.retain-gids.41,42.otf |    Bin 1932 -> 0 bytes
+ .../layout.gpos5/gpos5_font1.retain-gids.41,42.ttx |    604 +
+ .../layout.gpos5/gpos5_font1.retain-gids.41,43.otf |    Bin 2048 -> 0 bytes
+ .../layout.gpos5/gpos5_font1.retain-gids.41,43.ttx |    619 +
+ .../layout.gpos5/gpos5_font1.retain-gids.41.otf    |    Bin 1916 -> 0 bytes
+ .../layout.gpos5/gpos5_font1.retain-gids.41.ttx    |    595 +
+ .../layout.gpos5/gpos5_font1.retain-gids.42.otf    |    Bin 1788 -> 0 bytes
+ .../layout.gpos5/gpos5_font1.retain-gids.42.ttx    |    589 +
+ ...pos5_font1.retain-gids.retain-all-codepoint.otf |    Bin 3688 -> 0 bytes
+ ...pos5_font1.retain-gids.retain-all-codepoint.ttx |   1250 +
+ .../gpos6_font1.default.41,42,43,44.otf            |    Bin 1492 -> 0 bytes
+ .../gpos6_font1.default.41,42,43,44.ttx            |    304 +
+ .../gpos6_font1.default.41,42,43,45.otf            |    Bin 1500 -> 0 bytes
+ .../gpos6_font1.default.41,42,43,45.ttx            |    305 +
+ .../layout.gpos6/gpos6_font1.default.41,42,43.otf  |    Bin 1284 -> 0 bytes
+ .../layout.gpos6/gpos6_font1.default.41,42,43.ttx  |    284 +
+ .../layout.gpos6/gpos6_font1.default.41,42.otf     |    Bin 1184 -> 0 bytes
+ .../layout.gpos6/gpos6_font1.default.41,42.ttx     |    265 +
+ .../gpos6_font1.default.41,43,44,45,46.otf         |    Bin 1840 -> 0 bytes
+ .../gpos6_font1.default.41,43,44,45,46.ttx         |    336 +
+ .../layout.gpos6/gpos6_font1.default.41,43,44.otf  |    Bin 1500 -> 0 bytes
+ .../layout.gpos6/gpos6_font1.default.41,43,44.ttx  |    295 +
+ .../layout.gpos6/gpos6_font1.default.41,43,45.otf  |    Bin 1508 -> 0 bytes
+ .../layout.gpos6/gpos6_font1.default.41,43,45.ttx  |    296 +
+ .../layout.gpos6/gpos6_font1.default.41,43.otf     |    Bin 1288 -> 0 bytes
+ .../layout.gpos6/gpos6_font1.default.41,43.ttx     |    275 +
+ .../layout.gpos6/gpos6_font1.default.41.otf        |    Bin 1172 -> 0 bytes
+ .../layout.gpos6/gpos6_font1.default.41.ttx        |    256 +
+ .../gpos6_font1.default.retain-all-codepoint.otf   |    Bin 3644 -> 0 bytes
+ .../gpos6_font1.default.retain-all-codepoint.ttx   |   1231 +
+ .../gpos6_font1.retain-gids.41,42,43,44.otf        |    Bin 2196 -> 0 bytes
+ .../gpos6_font1.retain-gids.41,42,43,44.ttx        |    624 +
+ .../gpos6_font1.retain-gids.41,42,43,45.otf        |    Bin 2220 -> 0 bytes
+ .../gpos6_font1.retain-gids.41,42,43,45.ttx        |    630 +
+ .../gpos6_font1.retain-gids.41,42,43.otf           |    Bin 1984 -> 0 bytes
+ .../gpos6_font1.retain-gids.41,42,43.ttx           |    604 +
+ .../layout.gpos6/gpos6_font1.retain-gids.41,42.otf |    Bin 1888 -> 0 bytes
+ .../layout.gpos6/gpos6_font1.retain-gids.41,42.ttx |    585 +
+ .../gpos6_font1.retain-gids.41,43,44,45,46.otf     |    Bin 2560 -> 0 bytes
+ .../gpos6_font1.retain-gids.41,43,44,45,46.ttx     |    661 +
+ .../gpos6_font1.retain-gids.41,43,44.otf           |    Bin 2216 -> 0 bytes
+ .../gpos6_font1.retain-gids.41,43,44.ttx           |    620 +
+ .../gpos6_font1.retain-gids.41,43,45.otf           |    Bin 2236 -> 0 bytes
+ .../gpos6_font1.retain-gids.41,43,45.ttx           |    626 +
+ .../layout.gpos6/gpos6_font1.retain-gids.41,43.otf |    Bin 2004 -> 0 bytes
+ .../layout.gpos6/gpos6_font1.retain-gids.41,43.ttx |    600 +
+ .../layout.gpos6/gpos6_font1.retain-gids.41.otf    |    Bin 1872 -> 0 bytes
+ .../layout.gpos6/gpos6_font1.retain-gids.41.ttx    |    576 +
+ ...pos6_font1.retain-gids.retain-all-codepoint.otf |    Bin 3644 -> 0 bytes
+ ...pos6_font1.retain-gids.retain-all-codepoint.ttx |   1231 +
+ ...ular.default.627,644,623,62D,644,627,645,2E.ttf |    Bin 12684 -> 0 bytes
+ ...ular.default.627,644,623,62D,644,627,645,2E.ttx |   4529 +
+ .../Amiri-Regular.default.627,644,62D,628.ttf      |    Bin 9992 -> 0 bytes
+ .../Amiri-Regular.default.627,644,62D,628.ttx      |   3537 +
+ .../Amiri-Regular.default.627,644.ttf              |    Bin 4168 -> 0 bytes
+ .../Amiri-Regular.default.627,644.ttx              |   1383 +
+ ...-Regular.default.633,645,627,621,20,644,627.ttf |    Bin 9516 -> 0 bytes
+ ...-Regular.default.633,645,627,621,20,644,627.ttx |   3371 +
+ .../Amiri-Regular.default.63A,64A,631.ttf          |    Bin 7324 -> 0 bytes
+ .../Amiri-Regular.default.63A,64A,631.ttx          |   2587 +
+ ....retain-gids.627,644,623,62D,644,627,645,2E.ttf |    Bin 48012 -> 0 bytes
+ ....retain-gids.627,644,623,62D,644,627,645,2E.ttx |  28725 ++++
+ .../Amiri-Regular.retain-gids.627,644,62D,628.ttf  |    Bin 42640 -> 0 bytes
+ .../Amiri-Regular.retain-gids.627,644,62D,628.ttx  |  25101 ++++
+ .../Amiri-Regular.retain-gids.627,644.ttf          |    Bin 36696 -> 0 bytes
+ .../Amiri-Regular.retain-gids.627,644.ttx          |  23003 +++
+ ...ular.retain-gids.633,645,627,621,20,644,627.ttf |    Bin 45908 -> 0 bytes
+ ...ular.retain-gids.633,645,627,621,20,644,627.ttx |  27759 ++++
+ .../Amiri-Regular.retain-gids.63A,64A,631.ttf      |    Bin 37988 -> 0 bytes
+ .../Amiri-Regular.retain-gids.63A,64A,631.ttx      |  22911 +++
+ ...g1_multiple_subrules_f1.default.30,31,32,33.otf |    Bin 1840 -> 0 bytes
+ ...g1_multiple_subrules_f1.default.30,31,32,33.ttx |    328 +
+ ...ning1_multiple_subrules_f1.default.41,42,43.otf |    Bin 1332 -> 0 bytes
+ ...ning1_multiple_subrules_f1.default.41,42,43.ttx |    284 +
+ ...le_subrules_f1.default.retain-all-codepoint.otf |    Bin 3704 -> 0 bytes
+ ...le_subrules_f1.default.retain-all-codepoint.ttx |   1247 +
+ ...ultiple_subrules_f1.retain-gids.30,31,32,33.otf |    Bin 2304 -> 0 bytes
+ ...ultiple_subrules_f1.retain-gids.30,31,32,33.ttx |    563 +
+ ...1_multiple_subrules_f1.retain-gids.41,42,43.otf |    Bin 2032 -> 0 bytes
+ ...1_multiple_subrules_f1.retain-gids.41,42,43.ttx |    604 +
+ ...ubrules_f1.retain-gids.retain-all-codepoint.otf |    Bin 3704 -> 0 bytes
+ ...ubrules_f1.retain-gids.retain-all-codepoint.ttx |   1247 +
+ ...g2_multiple_subrules_f1.default.30,31,32,33.otf |    Bin 1840 -> 0 bytes
+ ...g2_multiple_subrules_f1.default.30,31,32,33.ttx |    328 +
+ ...ning2_multiple_subrules_f1.default.41,42,43.otf |    Bin 1332 -> 0 bytes
+ ...ning2_multiple_subrules_f1.default.41,42,43.ttx |    284 +
+ ...le_subrules_f1.default.retain-all-codepoint.otf |    Bin 3704 -> 0 bytes
+ ...le_subrules_f1.default.retain-all-codepoint.ttx |   1247 +
+ ...ultiple_subrules_f1.retain-gids.30,31,32,33.otf |    Bin 2304 -> 0 bytes
+ ...ultiple_subrules_f1.retain-gids.30,31,32,33.ttx |    563 +
+ ...2_multiple_subrules_f1.retain-gids.41,42,43.otf |    Bin 2032 -> 0 bytes
+ ...2_multiple_subrules_f1.retain-gids.41,42,43.ttx |    604 +
+ ...ubrules_f1.retain-gids.retain-all-codepoint.otf |    Bin 3704 -> 0 bytes
+ ...ubrules_f1.retain-gids.retain-all-codepoint.ttx |   1247 +
+ ...pos_chaining3_simple_f1.default.30,31,32,33.otf |    Bin 1816 -> 0 bytes
+ ...pos_chaining3_simple_f1.default.30,31,32,33.ttx |    328 +
+ .../gpos_chaining3_simple_f1.default.41,42,43.otf  |    Bin 1308 -> 0 bytes
+ .../gpos_chaining3_simple_f1.default.41,42,43.ttx  |    284 +
+ ...ing3_simple_f1.default.retain-all-codepoint.otf |    Bin 3680 -> 0 bytes
+ ...ing3_simple_f1.default.retain-all-codepoint.ttx |   1247 +
+ ...chaining3_simple_f1.retain-gids.30,31,32,33.otf |    Bin 2280 -> 0 bytes
+ ...chaining3_simple_f1.retain-gids.30,31,32,33.ttx |    563 +
+ ...os_chaining3_simple_f1.retain-gids.41,42,43.otf |    Bin 2008 -> 0 bytes
+ ...os_chaining3_simple_f1.retain-gids.41,42,43.ttx |    604 +
+ ..._simple_f1.retain-gids.retain-all-codepoint.otf |    Bin 3680 -> 0 bytes
+ ..._simple_f1.retain-gids.retain-all-codepoint.ttx |   1247 +
+ .../layout.gpos9/gpos9_font2.default.41,42.otf     |    Bin 1184 -> 0 bytes
+ .../layout.gpos9/gpos9_font2.default.41,42.ttx     |    265 +
+ .../layout.gpos9/gpos9_font2.default.41.otf        |    Bin 1172 -> 0 bytes
+ .../layout.gpos9/gpos9_font2.default.41.ttx        |    256 +
+ .../layout.gpos9/gpos9_font2.default.42.otf        |    Bin 1032 -> 0 bytes
+ .../layout.gpos9/gpos9_font2.default.42.ttx        |    245 +
+ .../layout.gpos9/gpos9_font2.retain-gids.41,42.otf |    Bin 1888 -> 0 bytes
+ .../layout.gpos9/gpos9_font2.retain-gids.41,42.ttx |    585 +
+ .../layout.gpos9/gpos9_font2.retain-gids.41.otf    |    Bin 1872 -> 0 bytes
+ .../layout.gpos9/gpos9_font2.retain-gids.41.ttx    |    576 +
+ .../layout.gpos9/gpos9_font2.retain-gids.42.otf    |    Bin 1744 -> 0 bytes
+ .../layout.gpos9/gpos9_font2.retain-gids.42.ttx    |    570 +
+ ...ub_alternate_substitution.default.53A9,53F1.otf |    Bin 4348 -> 0 bytes
+ ...ub_alternate_substitution.default.53A9,53F1.ttx |   1009 +
+ .../gsub_alternate_substitution.default.53A9.otf   |    Bin 3904 -> 0 bytes
+ .../gsub_alternate_substitution.default.53A9.ttx   |    924 +
+ .../gsub_alternate_substitution.default.53F1.otf   |    Bin 2452 -> 0 bytes
+ .../gsub_alternate_substitution.default.53F1.ttx   |    638 +
+ ...e_substitution.default.retain-all-codepoint.otf |    Bin 6040 -> 0 bytes
+ ...e_substitution.default.retain-all-codepoint.ttx |   1387 +
+ ...lternate_substitution.retain-gids.53A9,53F1.otf |    Bin 4472 -> 0 bytes
+ ...lternate_substitution.retain-gids.53A9,53F1.ttx |   1063 +
+ ...sub_alternate_substitution.retain-gids.53A9.otf |    Bin 4056 -> 0 bytes
+ ...sub_alternate_substitution.retain-gids.53A9.ttx |    990 +
+ ...sub_alternate_substitution.retain-gids.53F1.otf |    Bin 2648 -> 0 bytes
+ ...sub_alternate_substitution.retain-gids.53F1.ttx |    728 +
+ ...bstitution.retain-gids.retain-all-codepoint.otf |    Bin 6132 -> 0 bytes
+ ...bstitution.retain-gids.retain-all-codepoint.ttx |   1423 +
+ ...text1_multiple_subrules_f2.default.41,42,43.otf |    Bin 1340 -> 0 bytes
+ ...text1_multiple_subrules_f2.default.41,42,43.ttx |    290 +
+ ...context1_multiple_subrules_f2.default.41,42.otf |    Bin 1240 -> 0 bytes
+ ...context1_multiple_subrules_f2.default.41,42.ttx |    271 +
+ ...context1_multiple_subrules_f2.default.41,43.otf |    Bin 1344 -> 0 bytes
+ ...context1_multiple_subrules_f2.default.41,43.ttx |    281 +
+ ...ub_context1_multiple_subrules_f2.default.41.otf |    Bin 1228 -> 0 bytes
+ ...ub_context1_multiple_subrules_f2.default.41.ttx |    262 +
+ ...le_subrules_f2.default.retain-all-codepoint.otf |    Bin 3712 -> 0 bytes
+ ...le_subrules_f2.default.retain-all-codepoint.ttx |   1253 +
+ ...1_multiple_subrules_f2.retain-gids.41,42,43.otf |    Bin 2040 -> 0 bytes
+ ...1_multiple_subrules_f2.retain-gids.41,42,43.ttx |    610 +
+ ...ext1_multiple_subrules_f2.retain-gids.41,42.otf |    Bin 1944 -> 0 bytes
+ ...ext1_multiple_subrules_f2.retain-gids.41,42.ttx |    591 +
+ ...ext1_multiple_subrules_f2.retain-gids.41,43.otf |    Bin 2060 -> 0 bytes
+ ...ext1_multiple_subrules_f2.retain-gids.41,43.ttx |    606 +
+ ...ontext1_multiple_subrules_f2.retain-gids.41.otf |    Bin 1928 -> 0 bytes
+ ...ontext1_multiple_subrules_f2.retain-gids.41.ttx |    582 +
+ ...ubrules_f2.retain-gids.retain-all-codepoint.otf |    Bin 3712 -> 0 bytes
+ ...ubrules_f2.retain-gids.retain-all-codepoint.ttx |   1253 +
+ ...text2_multiple_subrules_f2.default.41,42,43.otf |    Bin 1340 -> 0 bytes
+ ...text2_multiple_subrules_f2.default.41,42,43.ttx |    290 +
+ ...context2_multiple_subrules_f2.default.41,42.otf |    Bin 1240 -> 0 bytes
+ ...context2_multiple_subrules_f2.default.41,42.ttx |    271 +
+ ...context2_multiple_subrules_f2.default.41,43.otf |    Bin 1344 -> 0 bytes
+ ...context2_multiple_subrules_f2.default.41,43.ttx |    281 +
+ ...ub_context2_multiple_subrules_f2.default.41.otf |    Bin 1228 -> 0 bytes
+ ...ub_context2_multiple_subrules_f2.default.41.ttx |    262 +
+ ...le_subrules_f2.default.retain-all-codepoint.otf |    Bin 3712 -> 0 bytes
+ ...le_subrules_f2.default.retain-all-codepoint.ttx |   1253 +
+ ...2_multiple_subrules_f2.retain-gids.41,42,43.otf |    Bin 2040 -> 0 bytes
+ ...2_multiple_subrules_f2.retain-gids.41,42,43.ttx |    610 +
+ ...ext2_multiple_subrules_f2.retain-gids.41,42.otf |    Bin 1944 -> 0 bytes
+ ...ext2_multiple_subrules_f2.retain-gids.41,42.ttx |    591 +
+ ...ext2_multiple_subrules_f2.retain-gids.41,43.otf |    Bin 2060 -> 0 bytes
+ ...ext2_multiple_subrules_f2.retain-gids.41,43.ttx |    606 +
+ ...ontext2_multiple_subrules_f2.retain-gids.41.otf |    Bin 1928 -> 0 bytes
+ ...ontext2_multiple_subrules_f2.retain-gids.41.ttx |    582 +
+ ...ubrules_f2.retain-gids.retain-all-codepoint.otf |    Bin 3712 -> 0 bytes
+ ...ubrules_f2.retain-gids.retain-all-codepoint.ttx |   1253 +
+ ...sub_context3_successive_f1.default.41,42,43.otf |    Bin 1328 -> 0 bytes
+ ...sub_context3_successive_f1.default.41,42,43.ttx |    290 +
+ .../gsub_context3_successive_f1.default.41,42.otf  |    Bin 1228 -> 0 bytes
+ .../gsub_context3_successive_f1.default.41,42.ttx  |    271 +
+ .../gsub_context3_successive_f1.default.41,43.otf  |    Bin 1332 -> 0 bytes
+ .../gsub_context3_successive_f1.default.41,43.ttx  |    281 +
+ .../gsub_context3_successive_f1.default.41.otf     |    Bin 1216 -> 0 bytes
+ .../gsub_context3_successive_f1.default.41.ttx     |    262 +
+ ..._successive_f1.default.retain-all-codepoint.otf |    Bin 3700 -> 0 bytes
+ ..._successive_f1.default.retain-all-codepoint.ttx |   1253 +
+ ...context3_successive_f1.retain-gids.41,42,43.otf |    Bin 2028 -> 0 bytes
+ ...context3_successive_f1.retain-gids.41,42,43.ttx |    610 +
+ ...ub_context3_successive_f1.retain-gids.41,42.otf |    Bin 1932 -> 0 bytes
+ ...ub_context3_successive_f1.retain-gids.41,42.ttx |    591 +
+ ...ub_context3_successive_f1.retain-gids.41,43.otf |    Bin 2048 -> 0 bytes
+ ...ub_context3_successive_f1.retain-gids.41,43.ttx |    606 +
+ .../gsub_context3_successive_f1.retain-gids.41.otf |    Bin 1916 -> 0 bytes
+ .../gsub_context3_successive_f1.retain-gids.41.ttx |    582 +
+ ...cessive_f1.retain-gids.retain-all-codepoint.otf |    Bin 3700 -> 0 bytes
+ ...cessive_f1.retain-gids.retain-all-codepoint.ttx |   1253 +
+ ...g1_multiple_subrules_f1.default.30,31,32,33.otf |    Bin 1852 -> 0 bytes
+ ...g1_multiple_subrules_f1.default.30,31,32,33.ttx |    334 +
+ ...ning1_multiple_subrules_f1.default.41,42,43.otf |    Bin 1344 -> 0 bytes
+ ...ning1_multiple_subrules_f1.default.41,42,43.ttx |    290 +
+ ...le_subrules_f1.default.retain-all-codepoint.otf |    Bin 3716 -> 0 bytes
+ ...le_subrules_f1.default.retain-all-codepoint.ttx |   1253 +
+ ...ultiple_subrules_f1.retain-gids.30,31,32,33.otf |    Bin 2316 -> 0 bytes
+ ...ultiple_subrules_f1.retain-gids.30,31,32,33.ttx |    569 +
+ ...1_multiple_subrules_f1.retain-gids.41,42,43.otf |    Bin 2044 -> 0 bytes
+ ...1_multiple_subrules_f1.retain-gids.41,42,43.ttx |    610 +
+ ...ubrules_f1.retain-gids.retain-all-codepoint.otf |    Bin 3716 -> 0 bytes
+ ...ubrules_f1.retain-gids.retain-all-codepoint.ttx |   1253 +
+ ...g2_multiple_subrules_f1.default.30,31,32,33.otf |    Bin 1852 -> 0 bytes
+ ...g2_multiple_subrules_f1.default.30,31,32,33.ttx |    334 +
+ ...ning2_multiple_subrules_f1.default.41,42,43.otf |    Bin 1344 -> 0 bytes
+ ...ning2_multiple_subrules_f1.default.41,42,43.ttx |    290 +
+ ...le_subrules_f1.default.retain-all-codepoint.otf |    Bin 3716 -> 0 bytes
+ ...le_subrules_f1.default.retain-all-codepoint.ttx |   1253 +
+ ...ultiple_subrules_f1.retain-gids.30,31,32,33.otf |    Bin 2316 -> 0 bytes
+ ...ultiple_subrules_f1.retain-gids.30,31,32,33.ttx |    569 +
+ ...2_multiple_subrules_f1.retain-gids.41,42,43.otf |    Bin 2044 -> 0 bytes
+ ...2_multiple_subrules_f1.retain-gids.41,42,43.ttx |    610 +
+ ...ubrules_f1.retain-gids.retain-all-codepoint.otf |    Bin 3716 -> 0 bytes
+ ...ubrules_f1.retain-gids.retain-all-codepoint.ttx |   1253 +
+ ...sub_chaining3_simple_f2.default.30,31,32,33.otf |    Bin 1828 -> 0 bytes
+ ...sub_chaining3_simple_f2.default.30,31,32,33.ttx |    334 +
+ .../gsub_chaining3_simple_f2.default.41,42,43.otf  |    Bin 1320 -> 0 bytes
+ .../gsub_chaining3_simple_f2.default.41,42,43.ttx  |    290 +
+ ...ing3_simple_f2.default.retain-all-codepoint.otf |    Bin 3692 -> 0 bytes
+ ...ing3_simple_f2.default.retain-all-codepoint.ttx |   1253 +
+ ...chaining3_simple_f2.retain-gids.30,31,32,33.otf |    Bin 2292 -> 0 bytes
+ ...chaining3_simple_f2.retain-gids.30,31,32,33.ttx |    569 +
+ ...ub_chaining3_simple_f2.retain-gids.41,42,43.otf |    Bin 2020 -> 0 bytes
+ ...ub_chaining3_simple_f2.retain-gids.41,42,43.ttx |    610 +
+ ..._simple_f2.retain-gids.retain-all-codepoint.otf |    Bin 3692 -> 0 bytes
+ ..._simple_f2.retain-gids.retain-all-codepoint.ttx |   1253 +
+ ..._created.default.41,42,43,44,45,46,47,48,49.otf |    Bin 2176 -> 0 bytes
+ ..._created.default.41,42,43,44,45,46,47,48,49.ttx |    392 +
+ ...nually_created.default.41,42,43,44,45,46,47.otf |    Bin 1888 -> 0 bytes
+ ...nually_created.default.41,42,43,44,45,46,47.ttx |    357 +
+ ...nually_created.default.41,42,43,44,45,46,4D.otf |    Bin 1852 -> 0 bytes
+ ...nually_created.default.41,42,43,44,45,46,4D.ttx |    351 +
+ ...nually_created.default.41,42,43,44,45,46,51.otf |    Bin 1932 -> 0 bytes
+ ...nually_created.default.41,42,43,44,45,46,51.ttx |    364 +
+ ..._manually_created.default.41,42,43,44,45,46.otf |    Bin 1832 -> 0 bytes
+ ..._manually_created.default.41,42,43,44,45,46.ttx |    343 +
+ .../gsub8_manually_created.default.41,42,43.otf    |    Bin 1284 -> 0 bytes
+ .../gsub8_manually_created.default.41,42,43.ttx    |    285 +
+ .../gsub8_manually_created.default.41.otf          |    Bin 1172 -> 0 bytes
+ .../gsub8_manually_created.default.41.ttx          |    259 +
+ .../gsub8_manually_created.default.61.otf          |    Bin 1224 -> 0 bytes
+ .../gsub8_manually_created.default.61.ttx          |    268 +
+ ...nually_created.default.retain-all-codepoint.otf |    Bin 3656 -> 0 bytes
+ ...nually_created.default.retain-all-codepoint.ttx |   1152 +
+ ...ated.retain-gids.41,42,43,44,45,46,47,48,49.otf |    Bin 2884 -> 0 bytes
+ ...ated.retain-gids.41,42,43,44,45,46,47,48,49.ttx |    712 +
+ ...ly_created.retain-gids.41,42,43,44,45,46,47.otf |    Bin 2596 -> 0 bytes
+ ...ly_created.retain-gids.41,42,43,44,45,46,47.ttx |    677 +
+ ...ly_created.retain-gids.41,42,43,44,45,46,4D.otf |    Bin 2636 -> 0 bytes
+ ...ly_created.retain-gids.41,42,43,44,45,46,4D.ttx |    701 +
+ ...ly_created.retain-gids.41,42,43,44,45,46,51.otf |    Bin 2760 -> 0 bytes
+ ...ly_created.retain-gids.41,42,43,44,45,46,51.ttx |    734 +
+ ...ually_created.retain-gids.41,42,43,44,45,46.otf |    Bin 2540 -> 0 bytes
+ ...ually_created.retain-gids.41,42,43,44,45,46.ttx |    663 +
+ ...gsub8_manually_created.retain-gids.41,42,43.otf |    Bin 1984 -> 0 bytes
+ ...gsub8_manually_created.retain-gids.41,42,43.ttx |    605 +
+ .../gsub8_manually_created.retain-gids.41.otf      |    Bin 1872 -> 0 bytes
+ .../gsub8_manually_created.retain-gids.41.ttx      |    579 +
+ .../gsub8_manually_created.retain-gids.61.otf      |    Bin 2276 -> 0 bytes
+ .../gsub8_manually_created.retain-gids.61.ttx      |    748 +
+ ...ly_created.retain-gids.retain-all-codepoint.otf |    Bin 3656 -> 0 bytes
+ ...ly_created.retain-gids.retain-all-codepoint.ttx |   1152 +
+ .../expected/layout.khmer/Khmer.default.1780.ttf   |    Bin 4204 -> 0 bytes
+ .../expected/layout.khmer/Khmer.default.1780.ttx   |   2504 +
+ ...ult.1789,17BB,17C6,1794,17B6,1793,1798,17BE.ttf |    Bin 6412 -> 0 bytes
+ ...ult.1789,17BB,17C6,1794,17B6,1793,1798,17BE.ttx |   3406 +
+ .../expected/layout.khmer/Khmer.default.31.ttf     |    Bin 4140 -> 0 bytes
+ .../expected/layout.khmer/Khmer.default.31.ttx     |   2486 +
+ .../layout.khmer/Khmer.retain-gids.1780.ttf        |    Bin 4464 -> 0 bytes
+ .../layout.khmer/Khmer.retain-gids.1780.ttx        |   2676 +
+ ...ids.1789,17BB,17C6,1794,17B6,1793,1798,17BE.ttf |    Bin 7848 -> 0 bytes
+ ...ids.1789,17BB,17C6,1794,17B6,1793,1798,17BE.ttx |   4310 +
+ .../expected/layout.khmer/Khmer.retain-gids.31.ttf |    Bin 4256 -> 0 bytes
+ .../expected/layout.khmer/Khmer.retain-gids.31.ttx |   2562 +
+ ...Bold.default.627,644,623,62D,644,627,645,2E.ttf |    Bin 11396 -> 0 bytes
+ ...Bold.default.627,644,623,62D,644,627,645,2E.ttx |   4986 +
+ ...toNastaliqUrdu-Bold.default.627,644,62D,628.ttf |    Bin 18248 -> 0 bytes
+ ...toNastaliqUrdu-Bold.default.627,644,62D,628.ttx |   9792 ++
+ .../NotoNastaliqUrdu-Bold.default.627,644.ttf      |    Bin 3528 -> 0 bytes
+ .../NotoNastaliqUrdu-Bold.default.627,644.ttx      |   1326 +
+ ...rdu-Bold.default.633,645,627,621,20,644,627.ttf |    Bin 12368 -> 0 bytes
+ ...rdu-Bold.default.633,645,627,621,20,644,627.ttx |   5279 +
+ .../NotoNastaliqUrdu-Bold.default.63A,64A,631.ttf  |    Bin 20368 -> 0 bytes
+ .../NotoNastaliqUrdu-Bold.default.63A,64A,631.ttx  |  10363 ++
+ ....retain-gids.627,644,623,62D,644,627,645,2E.ttf |    Bin 18232 -> 0 bytes
+ ....retain-gids.627,644,623,62D,644,627,645,2E.ttx |   9170 ++
+ ...staliqUrdu-Bold.retain-gids.627,644,62D,628.ttf |    Bin 24376 -> 0 bytes
+ ...staliqUrdu-Bold.retain-gids.627,644,62D,628.ttx |  13452 ++
+ .../NotoNastaliqUrdu-Bold.retain-gids.627,644.ttf  |    Bin 9176 -> 0 bytes
+ .../NotoNastaliqUrdu-Bold.retain-gids.627,644.ttx  |   5158 +
+ ...Bold.retain-gids.633,645,627,621,20,644,627.ttf |    Bin 18172 -> 0 bytes
+ ...Bold.retain-gids.633,645,627,621,20,644,627.ttx |   8915 ++
+ ...toNastaliqUrdu-Bold.retain-gids.63A,64A,631.ttf |    Bin 26588 -> 0 bytes
+ ...toNastaliqUrdu-Bold.retain-gids.63A,64A,631.ttx |  14027 ++
+ .../Roboto-Regular.smallcaps.default.41,42,43.ttf  |    Bin 2464 -> 0 bytes
+ .../Roboto-Regular.smallcaps.default.41,42,43.ttx  |   1251 +
+ .../Roboto-Regular.smallcaps.default.41,43.ttf     |    Bin 2284 -> 0 bytes
+ .../Roboto-Regular.smallcaps.default.41,43.ttx     |   1120 +
+ .../layout/Roboto-Regular.smallcaps.default.41.ttf |    Bin 2084 -> 0 bytes
+ .../layout/Roboto-Regular.smallcaps.default.41.ttx |   1008 +
+ .../layout/Roboto-Regular.smallcaps.default.43.ttf |    Bin 2116 -> 0 bytes
+ .../layout/Roboto-Regular.smallcaps.default.43.ttx |   1017 +
+ .../Roboto-Regular.smallcaps.default.CA,CB.ttf     |    Bin 2388 -> 0 bytes
+ .../Roboto-Regular.smallcaps.default.CA,CB.ttx     |   1200 +
+ ...boto-Regular.smallcaps.retain-gids.41,42,43.ttf |    Bin 2716 -> 0 bytes
+ ...boto-Regular.smallcaps.retain-gids.41,42,43.ttx |   1431 +
+ .../Roboto-Regular.smallcaps.retain-gids.41,43.ttf |    Bin 2548 -> 0 bytes
+ .../Roboto-Regular.smallcaps.retain-gids.41,43.ttx |   1305 +
+ .../Roboto-Regular.smallcaps.retain-gids.41.ttf    |    Bin 2336 -> 0 bytes
+ .../Roboto-Regular.smallcaps.retain-gids.41.ttx    |   1188 +
+ .../Roboto-Regular.smallcaps.retain-gids.43.ttf    |    Bin 2384 -> 0 bytes
+ .../Roboto-Regular.smallcaps.retain-gids.43.ttx    |   1207 +
+ .../Roboto-Regular.smallcaps.retain-gids.CA,CB.ttf |    Bin 6476 -> 0 bytes
+ .../Roboto-Regular.smallcaps.retain-gids.CA,CB.ttx |   4120 +
+ .../data/expected/sbix/sbix.default.58,59.ttf      |    Bin 193528 -> 0 bytes
+ .../data/expected/sbix/sbix.default.58,59.ttx      |  12367 ++
+ test/subset/data/expected/sbix/sbix.default.58.ttf |    Bin 121168 -> 0 bytes
+ test/subset/data/expected/sbix/sbix.default.58.ttx |   7801 +
+ test/subset/data/expected/sbix/sbix.default.59.ttf |    Bin 89364 -> 0 bytes
+ test/subset/data/expected/sbix/sbix.default.59.ttx |   5813 +
+ .../sbix/sbix.drop-hints-retain-gids.58,59.ttf     |    Bin 193528 -> 0 bytes
+ .../sbix/sbix.drop-hints-retain-gids.58,59.ttx     |  12367 ++
+ .../sbix/sbix.drop-hints-retain-gids.58.ttf        |    Bin 121168 -> 0 bytes
+ .../sbix/sbix.drop-hints-retain-gids.58.ttx        |   7801 +
+ .../sbix/sbix.drop-hints-retain-gids.59.ttf        |    Bin 89404 -> 0 bytes
+ .../sbix/sbix.drop-hints-retain-gids.59.ttx        |   5826 +
+ .../data/expected/sbix/sbix.drop-hints.58,59.ttf   |    Bin 193528 -> 0 bytes
+ .../data/expected/sbix/sbix.drop-hints.58,59.ttx   |  12367 ++
+ .../data/expected/sbix/sbix.drop-hints.58.ttf      |    Bin 121168 -> 0 bytes
+ .../data/expected/sbix/sbix.drop-hints.58.ttx      |   7801 +
+ .../data/expected/sbix/sbix.drop-hints.59.ttf      |    Bin 89364 -> 0 bytes
+ .../data/expected/sbix/sbix.drop-hints.59.ttx      |   5813 +
+ .../data/expected/sbix/sbix.retain-gids.58,59.ttf  |    Bin 193528 -> 0 bytes
+ .../data/expected/sbix/sbix.retain-gids.58,59.ttx  |  12367 ++
+ .../data/expected/sbix/sbix.retain-gids.58.ttf     |    Bin 121168 -> 0 bytes
+ .../data/expected/sbix/sbix.retain-gids.58.ttx     |   7801 +
+ .../data/expected/sbix/sbix.retain-gids.59.ttf     |    Bin 89404 -> 0 bytes
+ .../data/expected/sbix/sbix.retain-gids.59.ttx     |   5826 +
+ .../variable/Fraunces.default.26,66,69,124,125.ttf |    Bin 15792 -> 0 bytes
+ .../variable/Fraunces.default.26,66,69,124,125.ttx |   6907 +
+ .../data/expected/variable/Fraunces.default.61.ttf |    Bin 4228 -> 0 bytes
+ .../data/expected/variable/Fraunces.default.61.ttx |   1427 +
+ test/subset/generate-expected-outputs.py           |      1 +
+ test/subset/run-tests.py                           |     24 +-
+ test/subset/subset_test_suite.py                   |     18 +-
+ 1945 files changed, 3999127 insertions(+), 21 deletions(-)
+
+commit 30579f5a37a7f0e044572e978660f050dc85559a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 29 11:19:13 2021 -0600
+
+    [set] Document & use open-ended del_range()
+
+ src/hb-ot-layout-common.hh   | 2 +-
+ src/hb-ot-layout-gsubgpos.hh | 2 +-
+ src/hb-set.cc                | 3 +++
+ 3 files changed, 5 insertions(+), 2 deletions(-)
+
+commit 72489f3e0e41fd5a6b68afd1d0493a79a508e97c
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Thu Jul 29 18:20:03 2021 +0200
+
+    [test] Free memory in hb-aots-tester
+
+ test/shaping/data/aots/hb-aots-tester.cpp | 108 ++++++++++++++++--------------
+ 1 file changed, 56 insertions(+), 52 deletions(-)
+
+commit 895162d6f324590f79654575bf2b6126034a2042
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Thu Jul 29 18:03:00 2021 +0200
+
+    [test] Account for mark zeroing in AOTS tests
+    
+    The AOTS are not written with the face that mark glyphs gets their
+    advances zeroed. Taking this into account makes 16 more tests to pass.
+
+ test/shaping/data/aots/hb-aots-tester.cpp               | 17 ++++++++++++-----
+ test/shaping/data/aots/tests/gpos4_lookupflag.tests     |  4 ++--
+ .../data/aots/tests/gpos4_multiple_anchors.tests        |  2 +-
+ test/shaping/data/aots/tests/gpos4_simple.tests         | 10 +++++-----
+ test/shaping/data/aots/tests/gpos5.tests                |  4 ++--
+ test/shaping/data/aots/tests/gpos6.tests                |  6 +++---
+ .../data/aots/tests/gpos_chaining1_lookupflag.tests     |  2 +-
+ .../data/aots/tests/gpos_chaining2_lookupflag.tests     |  2 +-
+ .../data/aots/tests/gpos_chaining3_lookupflag.tests     |  2 +-
+ .../data/aots/tests/gpos_context1_lookupflag.tests      |  4 ++--
+ .../data/aots/tests/gpos_context2_lookupflag.tests      |  4 ++--
+ .../data/aots/tests/gpos_context3_lookupflag.tests      |  4 ++--
+ 12 files changed, 34 insertions(+), 27 deletions(-)
+
+commit e65bf60500d575d83d71bc94723c58a4765d59ba
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Thu Jul 29 17:36:09 2021 +0200
+
+    [test] make this test runner less verbose
+    
+    Print the command being called once and in a way the can be manually
+    run.
+
+ test/shaping/run-tests.py | 6 +-----
+ 1 file changed, 1 insertion(+), 5 deletions(-)
+
+commit 2d54c34680fd22e195eb6bd9e87c25a94e9a4b8b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 28 18:20:53 2021 -0600
+
+    [subset/VarStore] Fix OOM in fuzzer test
+    
+    The test in question is the one added in c68a00b92eb62fdc79f9a2bd1fc7a6acc24a3602.
+    Culprit is that it's allocating lots of memory because of region_indices that
+    are out-of-range anyway. So, try to filter those out first.
+
+ src/hb-ot-layout-common.hh | 28 ++++++++++++++++++----------
+ src/hb-set.hh              |  2 +-
+ 2 files changed, 19 insertions(+), 11 deletions(-)
+
+commit ff1fe25a5dbd249b8939f3c851d096b8fb1e50b5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 28 18:02:52 2021 -0600
+
+    [VarStore] Rename internal get_scalars() to get_region_scalars()
+
+ src/hb-cff2-interp-cs.hh   |  4 ++--
+ src/hb-ot-layout-common.hh | 25 +++++++++++++------------
+ 2 files changed, 15 insertions(+), 14 deletions(-)
+
+commit d7541f7b55dc30cd0cbb68f9066b2fff5f60e754
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 29 00:09:24 2021 -0600
+
+    [util/hb-shape] Free cached resources on termination
+
+ util/options.cc | 33 +++++++++++++++------------------
+ util/options.hh | 18 ++++++++++++++----
+ 2 files changed, 29 insertions(+), 22 deletions(-)
+
+commit ad03f34df75bfff32f12787f4af3b972ee57fb19
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 28 19:05:12 2021 -0600
+
+    [util/hb-shape] Cache blob/face in batch mode
+
+ util/options.cc | 41 +++++++++++++++++++++++++++++++++++------
+ util/options.hh |  7 ++++++-
+ 2 files changed, 41 insertions(+), 7 deletions(-)
+
+commit 9a7ff54bb7ce9cafb563f740e25df931868e12dd
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Thu Jul 29 01:52:55 2021 +0200
+
+    [test] Write one sequence per-line
+    
+    https://github.com/harfbuzz/harfbuzz/pull/3087#issuecomment-888691436
+
+ src/gen-emoji-table.py                             |   21 +-
+ .../data/in-house/tests/emoji-clusters.tests       | 3327 +++++++++++++++++++-
+ 2 files changed, 3265 insertions(+), 83 deletions(-)
+
+commit ddf87ffb22d30d6b15083f1f6d5d4fe20417b538
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Thu Jul 29 01:12:46 2021 +0200
+
+    [test] Add generated tests for emoji clusters
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/3017
+    
+    Uses AdobeBlank2.ttf from:
+    
+      https://github.com/adobe-fonts/adobe-blank-2
+    
+    instead of a dummy empty font so that everything maps to GID 1 and
+    control code points are kept instead of being dropped because there is
+    not space glyph (otherwise we’d need to identify control code points
+    somehow when generating the expectations).
+
+ src/gen-emoji-table.py                             |  39 +++++++++++-
+ test/shaping/data/in-house/Makefile.sources        |   1 +
+ test/shaping/data/in-house/fonts/AdobeBlank2.ttf   | Bin 0 -> 2360 bytes
+ test/shaping/data/in-house/meson.build             |   1 +
+ .../data/in-house/tests/emoji-clusters.tests       |  66 +++++++++++++++++++++
+ 5 files changed, 105 insertions(+), 2 deletions(-)
+
+commit f0a1892ff991581e787193fb81361d68a93933e7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 28 17:36:22 2021 -0600
+
+    [serialize] Remove unnecessary pointer indirection
+
+ src/hb-open-file.hh            |  4 ++--
+ src/hb-open-type.hh            | 12 ++++++------
+ src/hb-ot-cff-common.hh        |  6 +++---
+ src/hb-ot-cff1-table.hh        |  4 ++--
+ src/hb-ot-cmap-table.hh        |  6 +++---
+ src/hb-ot-color-sbix-table.hh  |  2 +-
+ src/hb-ot-hdmx-table.hh        |  2 +-
+ src/hb-ot-layout-common.hh     | 20 ++++++++++----------
+ src/hb-ot-layout-gpos-table.hh |  4 ++--
+ src/hb-ot-layout-gsub-table.hh | 14 +++++++-------
+ src/hb-ot-var-hvar-table.hh    |  2 +-
+ 11 files changed, 38 insertions(+), 38 deletions(-)
+
+commit 1c511ed6f6c0f36ec2767b88e4c93682530cfd0d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 28 17:33:26 2021 -0600
+
+    [subset] Simplify VarStore serialization
+
+ src/hb-ot-layout-common.hh | 9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
+
+commit ad4c6924926830316fb1593a60d0c4858d095052
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 28 16:50:34 2021 -0600
+
+    [subset] Simplify VarStore serialize
+
+ src/hb-ot-layout-common.hh | 25 +++++++++++++------------
+ 1 file changed, 13 insertions(+), 12 deletions(-)
+
+commit 25dee6097741e9594d545ff764623c30289e5c58
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 28 13:58:24 2021 -0600
+
+    [sanitize] Revert some from c68a00b92eb62fdc79f9a2bd1fc7a6acc24a3602
+    
+    That overflow check was already happening in arrayZ.sanitize().
+
+ src/hb-ot-layout-common.hh | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit 6fe0d7d6e8be657a64eaf288fc4049e010669c89
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 28 12:06:49 2021 -0600
+
+    [GSUB] If MultipleSubst is applied to a ligature-component, preserve lig-id
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/3069
+
+ src/hb-ot-layout-gsub-table.hh                           |   9 +++++++--
+ .../fonts/b31e6c52a31edadc16f1bec9efe6019e2d59824a.ttf   | Bin 0 -> 6812 bytes
+ test/shaping/data/in-house/tests/ligature-id.tests       |   1 +
+ 3 files changed, 8 insertions(+), 2 deletions(-)
+
+commit b926fb9bb010e838282b9f735c3cb2e39340c708
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 28 11:58:10 2021 -0600
+
+    Whitespace
+
+ src/hb-ot-layout-gsub-table.hh | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit cc3a7ceea3322080d0607b4af7d0fa2b2f0e6c0e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 28 11:53:06 2021 -0600
+
+    Fix macro-in-macro invocation
+    
+    ../src/hb-ot-color-colr-table.hh:980:2: error: embedding a directive within macro arguments has undefined behavior [-Werror,-Wembedded-directive]
+    \#if COLRV1_ENABLE_SUBSETTING == 1
+
+ src/hb-ot-color-colr-table.hh | 13 +++++--------
+ 1 file changed, 5 insertions(+), 8 deletions(-)
+
+commit 087e2705de1ea5195eb77e144ef9196058d1ee7d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 28 11:42:31 2021 -0600
+
+    Fix signed-ness error in 0ded6a70c829284a8220ce30a405b0a974061df4
+
+ src/hb-serialize.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit f3e031539f72d67e9bcfad96b28798367a79f1ec
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Jul 27 14:40:15 2021 -0700
+
+    Revert "[ci] Bin FontTools version due to recent COLRv1 changes"
+    
+    This reverts commit 163748b5059e7b02a8ea57e263b009020a3ed499.
+
+ .circleci/config.yml           |  4 ++--
+ .github/workflows/linux-ci.yml |  2 +-
+ .github/workflows/macos-ci.yml |  2 +-
+ .github/workflows/msvc-ci.yml  |  2 +-
+ .github/workflows/msys2-ci.yml |  2 +-
+ src/hb-ot-color-colr-table.hh  | 13 +++++--------
+ 6 files changed, 11 insertions(+), 14 deletions(-)
+
+commit acbd8b27dce3ee369f7d6022eb8bcddfd2fb666c
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Jul 27 14:31:18 2021 -0700
+
+    [subset] temporarily disable COLRv1 subsetting.
+    
+    Currently COLRv1 spec is being changed so the subsetting implementation is out of sync. Disable subsetting by failing sanitization for COLRv1 tables and disable all colrv1 tests.
+
+ src/hb-ot-color-colr-table.hh     | 15 +++++++++++++--
+ test/subset/data/Makefile.am      |  1 +
+ test/subset/data/Makefile.sources |  6 +++++-
+ test/subset/meson.build           |  4 +++-
+ 4 files changed, 22 insertions(+), 4 deletions(-)
+
+commit 5dae8297bbb868e57557a22bd9c56514bb8dd00d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 28 11:35:40 2021 -0600
+
+    [util] Minor followup to https://github.com/harfbuzz/harfbuzz/pull/3083
+
+ util/options.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0ded6a70c829284a8220ce30a405b0a974061df4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 28 11:28:38 2021 -0600
+
+    [subset] Fix another fuzzer issue
+    
+    Addition could overflow on 32bit arch.
+    
+    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=36636
+    Fixes https://oss-fuzz.com/testcase-detail/5072358514753536
+
+ src/hb-serialize.hh                                     |   5 +++--
+ ...testcase-minimized-hb-subset-fuzzer-5072358514753536 | Bin 0 -> 55875 bytes
+ 2 files changed, 3 insertions(+), 2 deletions(-)
+
+commit c65e1e0842affc66149cf459e610159f7b7f3992
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Jul 28 17:04:10 2021 +0200
+
+    [test] Run AOTS cmap tests with ot font functions only
+    
+    We are not interested in testing FreeType cmap support.
+    
+    Fixes most format 4 tests. The remaining test seems to be peculiar, and
+    I can’t find any cmap implementation that produces the expected output.
+
+ test/shaping/data/aots/hb-aots-tester.cpp |  2 +-
+ test/shaping/data/aots/tests/cmap0.tests  |  2 +-
+ test/shaping/data/aots/tests/cmap10.tests |  4 ++--
+ test/shaping/data/aots/tests/cmap12.tests |  2 +-
+ test/shaping/data/aots/tests/cmap2.tests  |  2 +-
+ test/shaping/data/aots/tests/cmap4.tests  | 12 ++++++------
+ test/shaping/data/aots/tests/cmap6.tests  |  4 ++--
+ test/shaping/data/aots/tests/cmap8.tests  |  2 +-
+ 8 files changed, 15 insertions(+), 15 deletions(-)
+
+commit 8396c523b6715893c67163c947521c9b1408f594
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Jul 28 16:29:43 2021 +0200
+
+    [test] Add AOTS cmap tests
+    
+    Uses https://github.com/adobe-type-tools/aots/pull/3
+    
+    Related to https://github.com/unicode-org/text-rendering-tests/issues/70
+    
+    We don’t support format 4 or 8, so these tests are disabled. We support
+    format 4 but most of the tests are failing, investigating.
+
+ test/shaping/data/aots/Makefile.sources   |  7 +++
+ test/shaping/data/aots/hb-aots-tester.cpp | 82 +++++++++++++++++++++++++++++++
+ test/shaping/data/aots/meson.build        |  7 +++
+ test/shaping/data/aots/tests/cmap0.tests  |  1 +
+ test/shaping/data/aots/tests/cmap10.tests |  2 +
+ test/shaping/data/aots/tests/cmap12.tests |  1 +
+ test/shaping/data/aots/tests/cmap2.tests  |  1 +
+ test/shaping/data/aots/tests/cmap4.tests  |  6 +++
+ test/shaping/data/aots/tests/cmap6.tests  |  2 +
+ test/shaping/data/aots/tests/cmap8.tests  |  1 +
+ 10 files changed, 110 insertions(+)
+
+commit 50379fbb1517387d91b3ec4cc55a7500dd09b436
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Jul 28 16:13:49 2021 +0200
+
+    [util] Don’t split text at new lines in batch mode
+    
+    In batch mode (which is used for testing) we are probably not interested
+    in splitting text into lines as we could have split the string into
+    different tests. This fixes a bunch of AOTS tests that use newlines as
+    input.
+
+ test/shaping/data/aots/tests/lookupflag_ignore_attach.tests | 10 +++++-----
+ util/hb-shape.cc                                            |  2 +-
+ util/main-font-text.hh                                      |  4 ++--
+ util/options.cc                                             |  6 +++---
+ util/options.hh                                             |  2 +-
+ 5 files changed, 12 insertions(+), 12 deletions(-)
+
+commit 92b85749f2b284a370fff3905c0a554bbbc7b323
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Jul 28 15:56:53 2021 +0200
+
+    [util] Strip quotes when parsing features
+    
+    When running in batch mode, the quotes are not stripped by the shell and
+    end up in the feature string. This breaks one of the AOTS tests.
+    
+    Alternatively, we can remove the quotes from the test files, not sure
+    which is less hacky, though!
+
+ test/shaping/data/aots/tests/gsub3_1_simple.tests | 2 +-
+ util/options.cc                                   | 8 ++++++++
+ 2 files changed, 9 insertions(+), 1 deletion(-)
+
+commit ad9559e3e23ab32c27dc62374f040330e25f24eb
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Jul 28 14:35:23 2021 +0200
+
+    [tests] Make AOTS update.py work on macOS
+    
+    Use C++ compiler and make sure C++11 is used.
+
+ test/shaping/data/aots/update.py | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit d84efca312b2a10dc1c7b5444bc802c2d1b19e17
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Jul 28 13:17:41 2021 +0200
+
+    [tests] Add missed test file to Makefile/meson
+    
+    It was introduced in 205737acdc268b1c90cf00bde2d2038519a8bf48 but was
+    not actually used.
+    
+    See https://github.com/harfbuzz/harfbuzz/issues/2098
+
+ test/shaping/data/in-house/Makefile.sources | 1 +
+ test/shaping/data/in-house/meson.build      | 1 +
+ 2 files changed, 2 insertions(+)
+
+commit 09474d8d7b051b1465582828c8ec5afcccb6c3c6
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Jun 29 16:07:14 2021 -0700
+
+    [subset] Fix fuzzer timeout in add_gid_and_children.
+    
+    The composite glyph graph isn't check for max operations by sanitize so track an operations count during the graph traversal.
+
+ src/hb-ot-glyf-table.hh                            |  22 +++++++++++++++------
+ ...ase-minimized-hb-subset-fuzzer-5991762219892736 | Bin 0 -> 80599 bytes
+ 2 files changed, 16 insertions(+), 6 deletions(-)
+
+commit c68a00b92eb62fdc79f9a2bd1fc7a6acc24a3602
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 27 13:25:22 2021 -0600
+
+    [subset] Fix possible overflows in VarRegionList serialize
+    
+    Fixes https://oss-fuzz.com/testcase-detail/5362189182566400
+
+ src/harfbuzz.cc                                         |   1 +
+ src/hb-ot-layout-common.hh                              |   7 +++++--
+ ...testcase-minimized-hb-subset-fuzzer-5362189182566400 | Bin 0 -> 85171 bytes
+ 3 files changed, 6 insertions(+), 2 deletions(-)
+
+commit 7b8464b655b190c16bba33cefdd58acb03d32ddf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 27 13:15:07 2021 -0600
+
+    [serialize] Check for overflow in allocate_size()
+    
+    If size was > INT_MAX, then the out-of-room check was failing to perform
+    as intended.
+    
+    Part of fixing https://oss-fuzz.com/testcase-detail/5362189182566400
+
+ src/hb-serialize.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit bf2c87bfe6b3826d187dfee2ca894b5a39f6d17e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 27 13:10:41 2021 -0600
+
+    Add hb_memcpy() that does len=0 check
+
+ src/hb-algs.hh | 8 ++++++++
+ src/hb-set.hh  | 8 ++------
+ 2 files changed, 10 insertions(+), 6 deletions(-)
+
+commit 5f801da945025d66204c61fc11a2ff7fd55e3666
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Tue Jul 27 20:54:19 2021 +0200
+
+    [hb-ms-features] Move code out of header file
+
+ src/Makefile.sources        |   2 +
+ src/hb-ms-feature-ranges.cc | 177 ++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ms-feature-ranges.hh | 140 +----------------------------------
+ src/meson.build             |   2 +
+ 4 files changed, 185 insertions(+), 136 deletions(-)
+
+commit 990c15dbe5dfaf35de02089832938a4821369074
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Tue Jul 27 20:43:53 2021 +0200
+
+    [hb-ms-features] Rename types to be less general
+
+ src/hb-directwrite.cc       |  2 +-
+ src/hb-ms-feature-ranges.hh | 79 ++++++++++++++++++++++-----------------------
+ src/hb-uniscribe.cc         |  2 +-
+ 3 files changed, 41 insertions(+), 42 deletions(-)
+
+commit 69199211b7a9b7d7ea0a603ec9d8c25a48f1fcd5
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Tue Jul 27 19:51:23 2021 +0200
+
+    [uniscribe/directwrite] Move feature setup to shared file
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/3070
+
+ src/hb-directwrite.cc       | 236 +++++++++-----------------------------------
+ src/hb-ms-feature-ranges.hh | 229 ++++++++++++++++++++++++++++++++++++++++++
+ src/hb-uniscribe.cc         | 213 ++++++---------------------------------
+ 3 files changed, 308 insertions(+), 370 deletions(-)
+
+commit fc7f77812068840fd6d6edc8c0647baf52f65d07
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Jul 27 12:21:19 2021 -0600
+
+    [subset] add a note to hb-subset on what is and isn't supported (#3076)
+
+ src/hb-subset.cc | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+commit 3e4f006fe24186182b12ec04776aedbc0f6659b3
+Merge: 163748b50 791a1bf3a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 27 09:28:47 2021 -0600
+
+    Merge pull request #3079 from harfbuzz/windows-getenv
+    
+    Don’t disable getenv on Windows
+
+commit 791a1bf3a4e356d9ea0222e3ed6bc6b56011c64d
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Tue Jul 27 15:22:13 2021 +0200
+
+    Don’t disable getenv on Windows
+    
+    The condition is inverted, regression from
+    40ec187dec07e97ed4004b9831e7be844e6e7948.
+
+ src/hb.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 163748b5059e7b02a8ea57e263b009020a3ed499
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Mon Jul 26 23:03:16 2021 +0200
+
+    [ci] Bin FontTools version due to recent COLRv1 changes
+    
+    Should be reverted once HarfBuzz updated to match FontTools.
+
+ .circleci/config.yml           | 4 ++--
+ .github/workflows/linux-ci.yml | 2 +-
+ .github/workflows/macos-ci.yml | 2 +-
+ .github/workflows/msvc-ci.yml  | 2 +-
+ .github/workflows/msys2-ci.yml | 2 +-
+ 5 files changed, 6 insertions(+), 6 deletions(-)
+
+commit 4762fcb415c8070dbbfbb04ff0cf2c55385c812d
+Merge: aeec27845 71b5509c1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 26 11:48:55 2021 -0700
+
+    Merge pull request #3067 from googlefonts/glyph_names
+    
+    [subset] support option --glyph-names
+
+commit aeec278453c1d529003f276867f56b4e205b6e2e
+Merge: 404b91b93 a9a607d36
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 26 11:31:54 2021 -0700
+
+    Merge pull request #3068 from harfbuzz/hoi
+    
+    [variations] Support multiple axes with same tag, aka HOI
+
+commit 404b91b93d4dd333992b021e416b4a0c27f997d6
+Merge: c2d58c974 ec99fdb7e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 26 11:07:55 2021 -0700
+
+    Merge pull request #3071 from harfbuzz/subset-flags
+    
+    [sebset] Use [s|g]et_flag for retain_all_layout_features
+
+commit ec99fdb7e83ebc70993385a9b852cc05bf4693bf
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Mon Jul 26 01:35:13 2021 +0200
+
+    [sebset] Use [s|g]et_flag for retain_all_layout_features
+    
+    Looks like this was missed when adding hb_subset_input_[s|g]et_flag()
+
+ docs/harfbuzz-sections.txt |  2 --
+ src/hb-subset-input.cc     | 19 +++++--------------
+ src/hb-subset.h            | 11 +++++------
+ 3 files changed, 10 insertions(+), 22 deletions(-)
+
+commit c2d58c9747794a91c4d1e9d71426039e8b16be0b
+Merge: b235511ed acc7100a3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 26 00:08:34 2021 -0700
+
+    Merge pull request #3072 from harfbuzz/subset-docs
+    
+    [docs] Improve subset documentation
+
+commit acc7100a3f37fd72cfcd5953cf9446b04ef387b6
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Mon Jul 26 02:13:49 2021 +0200
+
+    [docs] Improve subset documentation
+
+ docs/harfbuzz-sections.txt |  1 +
+ src/hb-subset-input.cc     | 58 +++++++++++++++++++++++++++++++++++-----------
+ src/hb-subset-plan.cc      |  9 +++++--
+ src/hb-subset.h            |  4 ++--
+ 4 files changed, 54 insertions(+), 18 deletions(-)
+
+commit 3e2734cf9131dc075ac120209c803d55720672b3
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Mon Jul 26 02:12:21 2021 +0200
+
+    [docs] Don’t use GTK-Doc syntax for internal functions
+    
+    We don’t generate docs for them, reduces the number of warnings.
+
+ src/hb-subset-cff-common.cc | 12 ++++--------
+ src/hb-subset-cff1.cc       |  6 ------
+ src/hb-subset-cff2.cc       |  4 ----
+ 3 files changed, 4 insertions(+), 18 deletions(-)
+
+commit 71b5509c195546b38c27a4efa69f80c175da4d3a
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Tue Jul 20 20:05:35 2021 -0700
+
+    [subset] support option --glyph-names
+
+ src/Makefile.sources                               |   1 +
+ src/hb-ot-post-table-v2subset.hh                   | 114 +++++++++++++++++++++
+ src/hb-ot-post-table.hh                            |  25 ++++-
+ src/hb-subset-input.cc                             |   6 ++
+ src/hb-subset-input.hh                             |   1 +
+ src/hb-subset-plan.cc                              |   1 +
+ src/hb-subset-plan.hh                              |   1 +
+ src/hb-subset.cc                                   |   1 +
+ src/hb-subset.h                                    |   3 +
+ .../Comfortaa-Regular-new.glyph-names.61,62,63.ttf | Bin 0 -> 7072 bytes
+ .../Comfortaa-Regular-new.glyph-names.61,63.ttf    | Bin 0 -> 6700 bytes
+ .../Comfortaa-Regular-new.glyph-names.61.ttf       | Bin 0 -> 6336 bytes
+ .../Comfortaa-Regular-new.glyph-names.62.ttf       | Bin 0 -> 6208 bytes
+ .../Comfortaa-Regular-new.glyph-names.63.ttf       | Bin 0 -> 6264 bytes
+ ...egular-new.glyph-names.retain-all-codepoint.ttf | Bin 0 -> 227920 bytes
+ ...yeongjo-Regular-subset.glyph-names.61,62,63.ttf | Bin 0 -> 4128 bytes
+ ...umMyeongjo-Regular-subset.glyph-names.61,63.ttf | Bin 0 -> 3580 bytes
+ ...NanumMyeongjo-Regular-subset.glyph-names.61.ttf | Bin 0 -> 3156 bytes
+ ...NanumMyeongjo-Regular-subset.glyph-names.62.ttf | Bin 0 -> 3180 bytes
+ ...NanumMyeongjo-Regular-subset.glyph-names.63.ttf | Bin 0 -> 3048 bytes
+ ...lar-subset.glyph-names.retain-all-codepoint.ttf | Bin 0 -> 9524 bytes
+ .../Roboto-Regular.abc.glyph-names.61,62,63.ttf    | Bin 0 -> 2452 bytes
+ .../Roboto-Regular.abc.glyph-names.61,63.ttf       | Bin 0 -> 2260 bytes
+ .../basics/Roboto-Regular.abc.glyph-names.61.ttf   | Bin 0 -> 2048 bytes
+ .../basics/Roboto-Regular.abc.glyph-names.62.ttf   | Bin 0 -> 1916 bytes
+ .../basics/Roboto-Regular.abc.glyph-names.63.ttf   | Bin 0 -> 1972 bytes
+ ...egular.abc.glyph-names.retain-all-codepoint.ttf | Bin 0 -> 2452 bytes
+ test/subset/data/profiles/glyph-names.txt          |   1 +
+ test/subset/data/tests/basics.tests                |   1 +
+ util/options-subset.cc                             |   1 +
+ 30 files changed, 152 insertions(+), 4 deletions(-)
+
+commit b235511ed88e46d97d27a9176da1931f4a701b0d
+Merge: 0a44feaed 1fde80ad2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 23 12:15:15 2021 -0700
+
+    Merge pull request #3021 from googlefonts/stable_api
+    
+    [subset] update hb_subset api with final changes before going stable.
+
+commit a9a607d360c491104517bffdb81701c99252cfe4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 22 16:49:56 2021 -0700
+
+    [variations] Support multiple axes with same tag, aka HOI
+    
+    The axes in fvar are in arbitrary order, NOT sorted. Hence have to
+    lsearch all entries.
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1673
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2743
+    
+    Test from https://github.com/ctrlcctrlv/FontForge-Higher-Order-Interpolation
+
+ src/hb-font.cc                                     |  21 ++++++++-------
+ src/hb-ot-var-fvar-table.hh                        |  29 +++------------------
+ test/shaping/data/in-house/Makefile.sources        |   3 +--
+ .../e8691822f6a705e3e9fb48a0405c645b1a036590.ttf   | Bin 0 -> 2192 bytes
+ test/shaping/data/in-house/meson.build             |   3 +--
+ .../data/in-house/tests/variations-rounding.tests  |   2 --
+ .../data/in-house/tests/variations-space.tests     |   2 --
+ test/shaping/data/in-house/tests/variations.tests  |   5 ++++
+ 8 files changed, 21 insertions(+), 44 deletions(-)
+
+commit 1fde80ad282affc5d6cb54cd38915a803eeb70cb
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Jul 22 16:45:48 2021 -0700
+
+    [subset] update comments referencing hb_subset_input_t parameter.
+
+ src/hb-subset-input.cc | 26 +++++++++++++-------------
+ 1 file changed, 13 insertions(+), 13 deletions(-)
+
+commit c581d11eba0885d3e286d58cf648fec52caf6cd4
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Jul 22 14:04:39 2021 -0700
+
+    [set] in hb_set_set() avoid calling memcpy on nullptr.
+
+ src/hb-set.hh | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit 2b9cb29923ab1face19a84a03459dabe2d47fb67
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Jul 22 13:26:03 2021 -0700
+
+    [subset] cleanup no_subset_tables on destruction.
+
+ src/hb-subset-input.cc | 1 +
+ src/hb-subset-plan.cc  | 1 +
+ 2 files changed, 2 insertions(+)
+
+commit 89fc399eba5c7adf61c67be60cf5e81cfb21bbdc
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Jul 22 13:00:34 2021 -0700
+
+    [subset] Add hb-subset section documentation.
+
+ src/hb-subset.cc | 11 +++++++++++
+ src/hb-subset.h  |  4 ----
+ 2 files changed, 11 insertions(+), 4 deletions(-)
+
+commit 792e2ed61c14ba850e7ffcedbddc107947394014
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Jul 22 12:41:48 2021 -0700
+
+    [subset] convert no get/set prune unicode ranges to enum.
+
+ src/hb-subset-input.cc | 45 ++++++---------------------------------------
+ src/hb-subset.h        | 26 +++-----------------------
+ 2 files changed, 9 insertions(+), 62 deletions(-)
+
+commit 0a44feaedaf211a47d93765014106495d161af3f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 22 12:18:48 2021 -0700
+
+    [fvar] Make find_axis_index() return a range, not individual value
+
+ src/hb-ot-var-fvar-table.hh | 24 ++++++++++++++++++++----
+ 1 file changed, 20 insertions(+), 4 deletions(-)
+
+commit 1b6c1aa684df072a4212f9d350c78d9592f93413
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Jun 28 12:57:39 2021 -0700
+
+    [subset] add hb-subset api to documentation generator.
+    
+    Standardize subset_input parameter to be input.
+
+ docs/harfbuzz-docs.xml     |  8 ++++-
+ docs/harfbuzz-sections.txt | 22 ++++++++++++
+ src/hb-subset-input.cc     | 84 +++++++++++++++++++++++-----------------------
+ src/hb-subset-plan.cc      |  3 ++
+ src/hb-subset.h            | 22 ++++++------
+ 5 files changed, 85 insertions(+), 54 deletions(-)
+
+commit 8ce968341285be9dd5bf10a6bd5cf316995248cd
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Jun 23 13:55:11 2021 -0700
+
+    [subset] add documentation for all hb-subset.h methods.
+
+ src/hb-subset-input.cc | 71 +++++++++++++++++++++++++++++++++++++++++++++++---
+ src/hb-subset.h        | 59 ++++++++++++++++++++++-------------------
+ 2 files changed, 100 insertions(+), 30 deletions(-)
+
+commit 9ab751ac9ff139a7a1c286674f5560af386a7d23
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Jun 23 13:38:47 2021 -0700
+
+    [subset] Remove hb_subset(). Leaving just hb_subset_or_fail().
+
+ src/hb-subset.cc                   | 15 ---------------
+ src/hb-subset.h                    | 22 +++++++++++-----------
+ test/api/hb-subset-test.h          |  2 +-
+ test/api/test-subset-drop-tables.c |  3 ++-
+ test/api/test-subset-glyf.c        |  7 +++----
+ test/api/test-subset-hdmx.c        |  5 ++---
+ test/api/test-subset-hmtx.c        |  5 ++---
+ test/api/test-subset.c             | 12 +++++-------
+ test/fuzzing/hb-subset-fuzzer.cc   |  3 ++-
+ 9 files changed, 28 insertions(+), 46 deletions(-)
+
+commit e5c887fc0fc5263c4c84b32c327f1334b3b0dffc
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Jun 23 13:19:25 2021 -0700
+
+    [subset] add documentation for subset input flag enums.
+
+ src/hb-subset.h | 20 ++++++++++++++++++++
+ 1 file changed, 20 insertions(+)
+
+commit 372722ceee3bb4d30df9edd78c5899dbd6bbd66c
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Jun 23 13:10:03 2021 -0700
+
+    [subset] move notdef_outline to the subset input property enum.
+
+ src/hb-subset-input.cc | 6 +++++-
+ src/hb-subset.h        | 1 +
+ 2 files changed, 6 insertions(+), 1 deletion(-)
+
+commit a6c6cda48608e988a7debc3c18597186e3b4e2ee
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Jun 9 17:46:47 2021 -0700
+
+    [subset] Add no subset tables and passthrough unrecognized tables to the subset api.
+    
+    Matches fontTools options.
+
+ src/hb-subset-input.cc | 29 ++++++++++++++++++++++++++++-
+ src/hb-subset-input.hh |  3 +++
+ src/hb-subset-plan.cc  |  2 ++
+ src/hb-subset-plan.hh  |  4 ++++
+ src/hb-subset.cc       | 22 ++++++++++++++++++----
+ src/hb-subset.h        | 15 +++++++++------
+ 6 files changed, 64 insertions(+), 11 deletions(-)
+
+commit 668f2bd93e3ea72e43e57ce10981d300f39a1967
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Jun 9 16:33:50 2021 -0700
+
+    [subset] Add hb_subset_or_fail () to public subset api.
+
+ src/hb-subset.cc  | 22 ++++++++++++++++++++--
+ src/hb-subset.h   |  3 +++
+ util/hb-subset.cc | 10 ++++++----
+ 3 files changed, 29 insertions(+), 6 deletions(-)
+
+commit aba2e13141c133091197adfcb1579de0a965a59d
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Jun 9 16:23:35 2021 -0700
+
+    [subset] Remove hb_subset_input_get/set_overlaps_flag ().
+
+ src/hb-subset.h             | 1 -
+ test/api/test-subset-glyf.c | 2 +-
+ 2 files changed, 1 insertion(+), 2 deletions(-)
+
+commit 7d82191f61f79aba910d37aff74d45f4ca0d48e9
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Jun 9 16:20:55 2021 -0700
+
+    [subset] Remove hb_subset_input_get/set_name_legacy ().
+
+ src/hb-subset-input.cc    | 13 -------------
+ src/hb-subset.h           |  6 ------
+ test/api/hb-subset-test.h |  2 +-
+ 3 files changed, 1 insertion(+), 20 deletions(-)
+
+commit 942636ae1300e56dfe599b5f961719f044bdf828
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Jun 9 16:18:39 2021 -0700
+
+    [subset] Remove hb_subset_input_get/set_retain_gids.
+
+ src/hb-subset-input.cc           | 24 ------------------------
+ src/hb-subset.h                  |  7 -------
+ test/api/test-subset-cff1.c      |  4 ++--
+ test/api/test-subset-cff2.c      |  2 +-
+ test/api/test-subset-glyf.c      |  4 ++--
+ test/api/test-subset-gvar.c      |  2 +-
+ test/api/test-subset-hvar.c      |  4 ++--
+ test/api/test-subset-vvar.c      |  2 +-
+ test/fuzzing/hb-subset-fuzzer.cc |  2 +-
+ 9 files changed, 10 insertions(+), 41 deletions(-)
+
+commit 77b4a1cd9634aafb6353b7d5e451d1f5a06e929b
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Jun 9 14:11:17 2021 -0700
+
+    [subset] Remove hb_subset_input_get/set_desubroutinize.
+
+ src/hb-subset-input.cc      | 13 -------------
+ src/hb-subset.h             |  6 ------
+ test/api/test-subset-cff1.c |  8 ++++----
+ test/api/test-subset-cff2.c |  4 ++--
+ 4 files changed, 6 insertions(+), 25 deletions(-)
+
+commit 8bf5d4d4f787600e5e290bb8d59ee13f3a0d2515
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Jun 9 14:05:17 2021 -0700
+
+    [subset] Remove hb_subset_input_get/set_drop_hints.
+
+ src/hb-subset-input.cc           | 13 -------------
+ src/hb-subset-plan.cc            |  2 +-
+ src/hb-subset.h                  |  6 +-----
+ test/api/test-subset-cff1.c      | 10 +++++-----
+ test/api/test-subset-cff2.c      |  4 ++--
+ test/api/test-subset-glyf.c      |  6 +++---
+ test/fuzzing/hb-subset-fuzzer.cc |  2 +-
+ 7 files changed, 13 insertions(+), 30 deletions(-)
+
+commit 9fb3a2563333a0af1b67b2519f50cbc8278a8244
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Jun 9 13:46:35 2021 -0700
+
+    [subset] Use hb_set_copy in subset input.
+
+ src/hb-subset-plan.cc | 65 +++++++++++++++++++++++----------------------------
+ 1 file changed, 29 insertions(+), 36 deletions(-)
+
+commit 38de3491a08633175d7e40d9acabd48d813f755a
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Jun 9 12:54:14 2021 -0700
+
+    [subset] add implementation for get/set flag on subset input.
+
+ src/hb-subset-input.cc | 61 +++++++++++++++++++++++++++++++++++++++-----------
+ src/hb-subset.h        | 35 ++++++++++++++++-------------
+ 2 files changed, 67 insertions(+), 29 deletions(-)
+
+commit 83727837ef8818eec7c7c840117e7752c4bb487e
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Jun 9 11:09:14 2021 -0700
+
+    [subset] add proposed enum property get/set method.
+
+ src/hb-subset-input.cc | 15 +++++++++++++++
+ src/hb-subset.h        | 18 ++++++++++++++++++
+ 2 files changed, 33 insertions(+)
+
+commit b38e49dcfa8c8cf11b4586ce93784ce7523b5f48
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Jun 9 10:57:58 2021 -0700
+
+    [subset] add get/set user data methods to subset input.
+
+ src/hb-subset-input.cc | 42 ++++++++++++++++++++++++++++++++++++++++++
+ src/hb-subset.h        | 10 ++++++++++
+ 2 files changed, 52 insertions(+)
+
+commit edb57a8d9af6513c8d4ed5799bd208e4b9d68927
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Jun 9 10:42:48 2021 -0700
+
+    Make subset input const in the subsetting operation. Don't modify the subset input's sets.
+
+ src/hb-subset-plan.cc | 19 +++++++++++++------
+ src/hb-subset-plan.hh |  2 +-
+ src/hb-subset.cc      |  2 +-
+ src/hb-subset.h       |  2 +-
+ 4 files changed, 16 insertions(+), 9 deletions(-)
+
+commit 233c29b3024469fed9ea68018e9a072a036884af
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 22 12:00:24 2021 -0700
+
+    [font] Call fvar.find_axis_index instead of find_axis_info in set_variations()
+
+ src/hb-font.cc | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit 89018068cd4e247d556d42a501a7ffa8e6c9ef52
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 22 11:59:23 2021 -0700
+
+    [fvar] Centralize axis finding logic
+    
+    Part of fixing https://github.com/harfbuzz/harfbuzz/issues/1673
+
+ src/hb-ot-var-fvar-table.hh | 13 ++++++++++---
+ 1 file changed, 10 insertions(+), 3 deletions(-)
+
+commit 0b2280af909cb57570a28602922c7d5787ae42c7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 22 11:53:32 2021 -0700
+
+    [font] Call fvar table directly, instead of calling public get_axis_info
+    
+    To lighten it up in next commit.
+
+ src/hb-font.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b86a45ca55d0ce230965f9db507939f55e5145dd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 22 11:46:44 2021 -0700
+
+    [fvar] Add TODO
+    
+    Fixing https://github.com/harfbuzz/harfbuzz/issues/1673
+
+ src/hb-ot-var-fvar-table.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit ba6db26b65c6ce00755def84691e117249b857ff
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 22 11:37:39 2021 -0700
+
+    Tolerate unsorted OT table entries for small number of entries
+    
+    See comment.
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/3065
+
+ src/hb-open-file.hh | 8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+commit 03cd9c5cbab9c70c091d4bc5d634fd67469f0658
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 22 11:27:33 2021 -0700
+
+    Align lfind() API to match bfind()
+
+ src/hb-array.hh            | 43 +++++++++++++++++++++++++++++++------------
+ src/hb-open-file.hh        |  2 +-
+ src/hb-open-type.hh        | 16 ++++++++++------
+ src/hb-ot-layout-common.hh |  4 ++--
+ src/hb-set.hh              |  6 +++---
+ src/hb-vector.hh           |  2 +-
+ 6 files changed, 48 insertions(+), 25 deletions(-)
+
+commit f54f5c1b16b920464557ff29049b07668b12dad7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 22 11:09:02 2021 -0700
+
+    Fix debug printer of bool
+
+ src/hb-debug.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6269866bddd789be354d189ce31ad444b479a772
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Jul 16 14:06:55 2021 -0700
+
+    [subset] Keep bimap consistent if only one of the internal maps is in error.
+
+ src/hb-bimap.hh            | 5 +++++
+ src/hb-ot-layout-common.hh | 3 ++-
+ 2 files changed, 7 insertions(+), 1 deletion(-)
+
+commit 48edbef96f41a1ace04232af72bb2d55003614d9
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Jun 29 13:14:26 2021 -0700
+
+    [subset] bail if region_map is in error.
+    
+    Fixes fuzzer case https://oss-fuzz.com/testcase-detail/5499162606043136.
+
+ src/hb-ot-layout-common.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 79e8b306090ebadafa0fd53242ffcfbc74c94ab6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 16 15:06:10 2021 -0600
+
+    [ot-shape] Fix application of kern table if GPOS kern is missing
+    
+    Was broken sometime after we implemented kerx and tweaking it.
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/3043
+
+ src/hb-ot-shape.cc                                       |   9 ++++++---
+ src/hb-ot-shape.hh                                       |   1 +
+ test/shaping/data/in-house/Makefile.sources              |   1 +
+ .../fonts/b121d4306b2e3add5abbaad21d95fcf04aacbd64.ttf   | Bin 0 -> 1308 bytes
+ test/shaping/data/in-house/meson.build                   |   1 +
+ test/shaping/data/in-house/tests/tt-kern-gpos.tests      |   1 +
+ 6 files changed, 10 insertions(+), 3 deletions(-)
+
+commit 1060b04938d6d744b4441414f3061613047cff92
+Merge: deee24fbe 9aa0ecef3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 14 17:50:46 2021 -0700
+
+    Merge pull request #3060 from googlefonts/unicode_collect
+    
+    [subset] de-duplicate the logic that finds unicodes corresponding to …
+
+commit 9aa0ecef3fd2070e37a645c3455471407b363fbe
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Jul 14 17:27:14 2021 -0700
+
+    [subset] de-duplicate the logic that finds unicodes corresponding to requested glyphs.
+    
+    Move the logic into subset planning and then re-use the results in cmap and OS2 subsetting. Removes depedency on cmap from os2.
+
+ src/hb-ot-cmap-table.hh | 41 ++++++----------------------------
+ src/hb-ot-os2-table.hh  | 23 ++------------------
+ src/hb-subset-plan.cc   | 58 ++++++++++++++++++++++++++++++++++---------------
+ 3 files changed, 50 insertions(+), 72 deletions(-)
+
+commit deee24fbef7a67989ed7f60d1f76538f926d22a7
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Jul 14 13:46:36 2021 -0700
+
+    [subset] Add missing FontName op code in top dict parsing.
+    
+    Fix for #3058
+
+ src/hb-ot-cff1-table.hh                                |   1 +
+ test/subset/data/Makefile.am                           |   1 +
+ test/subset/data/Makefile.sources                      |   1 +
+ ...05,1039,1005,100A,103A,1038,1010,103D,1031,104A.otf | Bin 0 -> 7724 bytes
+ .../NotoSerifMyanmar-Regular.notdef-outline.1092.otf   | Bin 0 -> 1380 bytes
+ test/subset/data/fonts/NotoSerifMyanmar-Regular.otf    | Bin 0 -> 137544 bytes
+ test/subset/data/tests/cff.notoserifmyanmar.tests      |   9 +++++++++
+ test/subset/meson.build                                |   1 +
+ 8 files changed, 13 insertions(+)
+
+commit 9985ca64919b42b28010a741dc79b3cd0db4714d
+Merge: f51384d37 2c7ef0db0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 13 13:42:09 2021 -0700
+
+    Merge pull request #3057 from harfbuzz/ci-coverage-macos
+    
+    [ci] Add macOS GitHub workflow
+
+commit 2c7ef0db0b1b0815fa32d5d21b2c53d3b753aab6
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Tue Jul 13 13:23:53 2021 +0200
+
+    [ci] Generate only XML coverage data
+    
+    That is the one we are uploading, and HTML coverage seems broken on
+    macOS.
+
+ .github/workflows/linux-ci.yml | 2 +-
+ .github/workflows/macos-ci.yml | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit f51384d375210aea7d6e3bba82d776c812024950
+Merge: 1cb0ca1f2 95b04f740
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 12 16:51:43 2021 -0700
+
+    Merge pull request #3027 from harfbuzz/buffer-sync
+    
+    Improving buffer synchronization
+
+commit 95b04f7409e5af6dec97feb4ed18ba0bfae2cd88
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 12 17:35:45 2021 -0600
+
+    [buffer] Remove unnecessary have_separate_output()
+
+ src/hb-buffer.hh    | 5 +----
+ src/hb-ot-layout.cc | 2 --
+ 2 files changed, 1 insertion(+), 6 deletions(-)
+
+commit 3e266e5f64b6d078d64fe0f3783f774d7e29472d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 12 17:30:26 2021 -0600
+
+    [buffer] Update comments
+
+ src/hb-buffer.cc | 9 +++++----
+ src/hb-buffer.hh | 2 +-
+ 2 files changed, 6 insertions(+), 5 deletions(-)
+
+commit 3807061d634b60bd6235d6e1d8c47a034377f924
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 12 17:02:03 2021 -0600
+
+    [ot-layout] Don't remove_output() before reverse substitution
+    
+    No need anymore, because of new swap_buffers() semantics.
+    
+    Just assert instead.
+
+ src/hb-buffer.cc    | 10 ----------
+ src/hb-buffer.hh    |  1 -
+ src/hb-ot-layout.cc |  4 +---
+ 3 files changed, 1 insertion(+), 14 deletions(-)
+
+commit 10a9960f0af9d6fb93ff3d234b2a989f9bc00b21
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 12 17:09:03 2021 -0600
+
+    [buffer] Restructure swap_buffers()
+    
+    Is more of a "commit" operation now. Will rename when ready.
+
+ src/hb-buffer.cc | 20 +++++++-------------
+ 1 file changed, 7 insertions(+), 13 deletions(-)
+
+commit f6c9fcfd3e07dffe246fb727fce95429d028395a
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Tue Jul 13 01:12:43 2021 +0200
+
+    [ci] Add macOS GitHub workflow
+    
+    To collect codecov coverage on macOS as well (hopefully it will run the
+    macOS-specific tests).
+
+ .github/workflows/macos-ci.yml | 27 +++++++++++++++++++++++++++
+ 1 file changed, 27 insertions(+)
+
+commit d56afb750a1cde046158f13bb7bc6abbd8f1cb1b
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Tue Jul 13 00:56:54 2021 +0200
+
+    [tests] Ignore more symbols
+    
+    These seem to be exported when building with code coverage on macOS.
+
+ src/check-symbols.py | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit a7f4c985a8080797482c971a7b6275636fe5be62
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 12 17:00:46 2021 -0600
+
+    [ot-layout] Always swap_buffers() even if no substitutions happened
+
+ src/hb-ot-layout.cc | 14 +++++---------
+ 1 file changed, 5 insertions(+), 9 deletions(-)
+
+commit 62b441e6ff798f1d551d290a2a4970482254dbe2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 12 16:59:34 2021 -0600
+
+    [layout] Use Proxy::inplace instead of table index check
+    
+    Equivalent.
+
+ src/hb-ot-layout.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 431f164003d1d92b657b3facf984c8bbe342418b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 12 16:57:25 2021 -0600
+
+    [layout] Don't call clear_output() before pause-func
+
+ src/hb-ot-layout.cc | 3 ---
+ 1 file changed, 3 deletions(-)
+
+commit a623446a34a4a388f86afc97ed9c5a74792d5420
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 12 16:55:54 2021 -0600
+
+    [shape] Remove stray clear_output() call in hb_shape()
+
+ src/hb-ot-shape.cc | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 05c17787c4fc5283925920b546952ccca0ba4a00
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 12 16:55:08 2021 -0600
+
+    [buffer] Rewind cursor in clear_output()
+
+ src/hb-buffer.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 1cb0ca1f2cc24092e2977ac7b12274c399d6814a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 12 16:52:31 2021 -0600
+
+    Whitespace
+
+ src/hb-ot-layout.cc | 3 ++-
+ src/hb-ot-shape.cc  | 4 +++-
+ 2 files changed, 5 insertions(+), 2 deletions(-)
+
+commit 5f5a8b4dd7ddba13cd2459c626c3eb2f3c19d9d5
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Mon Jul 12 22:24:14 2021 +0200
+
+    [ci] Use the latest stable XCode image
+
+ .circleci/config.yml | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 13187d29efdf9d6ce19d649a6ce8349e2a9d954e
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Mon Jul 12 22:21:47 2021 +0200
+
+    [ci] Drop macOS job using deprecated XCode image
+
+ .circleci/config.yml | 14 --------------
+ 1 file changed, 14 deletions(-)
+
+commit 69310f14a6b79399041a1d9d70c246722b58829f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 9 17:24:29 2021 -0600
+
+    [buffer] Change nil buffer have_output to false
+    
+    Seems like a historical artefact that it was true.
+
+ src/hb-buffer.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 40884af17e9fd0149051b5a7ea452226ba806283
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 9 17:17:05 2021 -0600
+
+    [ot-layout] Narrow down random feature logic vs safe-to-break
+
+ src/hb-ot-layout-gsub-table.hh | 5 +++++
+ src/hb-ot-layout.cc            | 2 --
+ 2 files changed, 5 insertions(+), 2 deletions(-)
+
+commit 33b579d0ad06c34aec9780df90ae99eda697b7a1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 9 17:12:09 2021 -0600
+
+    [ot-layout] Clear random flag for subsequent flags
+    
+    Ouch!
+
+ src/hb-ot-layout.cc | 7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
+
+commit 29c9833e579cddf9f97c4eca956ccca98c1683c4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 9 11:58:36 2021 -0600
+
+    Remove Offset::serialize()
+    
+    Finishing https://github.com/harfbuzz/harfbuzz/pull/2355
+
+ src/hb-open-file.hh | 20 +++++++++++++-------
+ src/hb-open-type.hh |  9 ---------
+ 2 files changed, 13 insertions(+), 16 deletions(-)
+
+commit 63e15eac4f443fa53565d1e4fb9611cdd7814f28
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Thu Jul 8 22:46:33 2021 +0200
+
+    2.8.2
+
+ NEWS                   | 16 ++++++++++++++++
+ configure.ac           |  2 +-
+ docs/harfbuzz-docs.xml |  1 +
+ meson.build            |  2 +-
+ src/hb-blob.cc         |  4 ++--
+ src/hb-set.cc          |  2 +-
+ src/hb-version.h       |  4 ++--
+ 7 files changed, 24 insertions(+), 7 deletions(-)
+
+commit eee36bbea3c96ab3c84a2b928cb254d9e1860069
+Author: Caleb Maclennan <caleb@alerque.com>
+Date:   Thu Jul 8 21:19:57 2021 +0300
+
+    [releasing] Format notes as Markdown checklist for pasting in GH PR/Issue
+
+ RELEASING.md | 49 ++++++++++++++++++++++++-------------------------
+ 1 file changed, 24 insertions(+), 25 deletions(-)
+
+commit eda5dcdb3eb1b85d914602c27a480ba3a16e43fb
+Author: Caleb Maclennan <caleb@alerque.com>
+Date:   Thu Jul 8 21:10:35 2021 +0300
+
+    [releasing] Drop obsolete release process items
+
+ RELEASING.md | 8 +-------
+ 1 file changed, 1 insertion(+), 7 deletions(-)
+
+commit 2337f0d047f2561c13b29b70ad783bbf0d286654
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 8 10:58:50 2021 -0600
+
+    Internally use hb_malloc/.../hb_free instead of malloc/.../free
+    
+    Redefining those stock names as macros was conflicting with gcc 10
+    headers.
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/3044
+
+ src/hb-array.hh                            |  4 +--
+ src/hb-blob.cc                             | 32 ++++++++---------
+ src/hb-buffer.cc                           | 10 +++---
+ src/hb-common.cc                           | 12 +++----
+ src/hb-directwrite.cc                      |  4 +--
+ src/hb-draw.cc                             |  2 +-
+ src/hb-face.cc                             | 18 +++++-----
+ src/hb-font.cc                             | 58 +++++++++++++++---------------
+ src/hb-ft.cc                               | 24 ++++++-------
+ src/hb-gdi.cc                              |  6 ++--
+ src/hb-gobject-structs.cc                  |  4 +--
+ src/hb-graphite2.cc                        | 10 +++---
+ src/hb-machinery.hh                        |  6 ++--
+ src/hb-map.cc                              |  2 +-
+ src/hb-map.hh                              |  6 ++--
+ src/hb-object.hh                           |  8 ++---
+ src/hb-ot-color-cbdt-table.hh              |  2 +-
+ src/hb-ot-glyf-table.hh                    |  4 +--
+ src/hb-ot-layout-gsubgpos.hh               |  4 +--
+ src/hb-ot-name-table.hh                    |  4 +--
+ src/hb-ot-post-table.hh                    |  6 ++--
+ src/hb-ot-shape-complex-arabic-fallback.hh |  8 ++---
+ src/hb-ot-shape-complex-arabic.cc          |  4 +--
+ src/hb-ot-shape-complex-hangul.cc          |  4 +--
+ src/hb-ot-shape-complex-indic.cc           |  4 +--
+ src/hb-ot-shape-complex-khmer.cc           |  4 +--
+ src/hb-ot-shape-complex-use.cc             |  6 ++--
+ src/hb-ot-tag.cc                           |  4 +--
+ src/hb-pool.hh                             |  4 +--
+ src/hb-repacker.hh                         |  4 +--
+ src/hb-serialize.hh                        |  6 ++--
+ src/hb-set.cc                              |  2 +-
+ src/hb-shape-plan.cc                       | 12 +++----
+ src/hb-shape-plan.hh                       |  2 +-
+ src/hb-shape.cc                            |  4 +--
+ src/hb-shaper.cc                           |  4 +--
+ src/hb-subset-input.cc                     |  2 +-
+ src/hb-subset-plan.cc                      | 10 +++---
+ src/hb-unicode.cc                          |  2 +-
+ src/hb-uniscribe.cc                        | 24 ++++++-------
+ src/hb-vector.hh                           |  4 +--
+ src/hb.hh                                  | 13 ++++---
+ 42 files changed, 179 insertions(+), 174 deletions(-)
+
+commit bb48bf52a4645abda6fe98cc5ee33beab69931a5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 8 10:53:45 2021 -0600
+
+    Rename misc uses of "free"
+    
+    In preparation for fixing https://github.com/harfbuzz/harfbuzz/issues/3044
+
+ src/hb-array.hh                |  4 ++--
+ src/hb-cache.hh                |  2 +-
+ src/hb-common.cc               | 10 ++++------
+ src/hb-iter.hh                 |  2 +-
+ src/hb-ot-face-table-list.hh   |  2 +-
+ src/hb-ot-glyf-table.hh        |  2 +-
+ src/hb-ot-layout-gpos-table.hh |  2 +-
+ src/hb-ot-layout.cc            |  3 ++-
+ src/hb-pool.hh                 |  4 ++--
+ src/hb-serialize.hh            |  2 +-
+ src/hb-set.hh                  |  2 +-
+ src/hb-shape-plan.cc           |  4 ++--
+ src/hb-shape-plan.hh           |  2 +-
+ src/test-repacker.cc           |  8 ++++----
+ 14 files changed, 24 insertions(+), 25 deletions(-)
+
+commit 7416faceeb7a875ba7316cee124edee2d59ea8d0
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Wed Jul 7 11:27:49 2021 -0700
+
+    [subset] fuzzer fix: https://oss-fuzz.com/testcase-detail/5715464591376384
+
+ src/hb-ot-color-cpal-table.hh                      |  49 +++++++--------------
+ ...ase-minimized-hb-subset-fuzzer-5715464591376384 | Bin 0 -> 2116 bytes
+ 2 files changed, 15 insertions(+), 34 deletions(-)
+
+commit 895acdf7c7ac128cc1540fa251f772323f0042e8
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Jun 23 14:53:28 2021 +0200
+
+    [ci] Don’t build Cairo subproject with FontConfig on win32 cross-build
+    
+    We don’t need it and it breaks the build because FontConfig renamed its
+    master branch and the released version of Cairo wants to build
+    FontConfig from master branch.
+
+ .ci/build-win32.sh | 16 ++++++++++++++--
+ 1 file changed, 14 insertions(+), 2 deletions(-)
+
+commit 0da9158f620077ec46dcdfa4c1556253b23337eb
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Jun 29 14:23:37 2021 -0700
+
+    [subset] Remove OffsetTo::serialize().
+    
+    Convert remaining uses of it to serialize_serialize() which correctly uses the object packer.
+
+ src/hb-open-type.hh                                   |   4 ----
+ src/hb-ot-layout-common.hh                            |   8 ++++----
+ src/hb-ot-var-hvar-table.hh                           |  14 ++++++++------
+ test/api/fonts/AdobeVFPrototype.abc.otf               | Bin 6900 -> 5164 bytes
+ test/api/fonts/AdobeVFPrototype.ac.nohints.otf        | Bin 4212 -> 4384 bytes
+ .../api/fonts/AdobeVFPrototype.ac.nosubrs.nohints.otf | Bin 4092 -> 4268 bytes
+ test/api/fonts/AdobeVFPrototype.ac.nosubrs.otf        | Bin 6284 -> 4464 bytes
+ test/api/fonts/AdobeVFPrototype.ac.otf                | Bin 6408 -> 4584 bytes
+ test/api/fonts/AdobeVFPrototype.ac.retaingids.otf     | Bin 6412 -> 4584 bytes
+ .../fonts/SourceSansVariable-Roman-modHVAR.abc.ttf    | Bin 3260 -> 3124 bytes
+ .../api/fonts/SourceSansVariable-Roman-modHVAR.ac.ttf | Bin 3032 -> 2892 bytes
+ test/api/fonts/SourceSansVariable-Roman.abc.ttf       | Bin 3240 -> 3196 bytes
+ .../fonts/SourceSansVariable-Roman.ac.retaingids.ttf  | Bin 2616 -> 2976 bytes
+ test/api/fonts/SourceSansVariable-Roman.ac.ttf        | Bin 3028 -> 2964 bytes
+ test/api/fonts/SourceSerifVariable-Roman-VVAR.abc.ttf | Bin 5632 -> 3588 bytes
+ .../SourceSerifVariable-Roman-VVAR.ac.retaingids.ttf  | Bin 5288 -> 3244 bytes
+ test/api/fonts/SourceSerifVariable-Roman-VVAR.ac.ttf  | Bin 3224 -> 3224 bytes
+ 17 files changed, 12 insertions(+), 14 deletions(-)
+
+commit 0969614865a8664aaa13759e2d60caab0bd7df3a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jun 26 08:52:53 2021 -0600
+
+    [ot-shape] Rewrite loop without foreach_grapheme()
+    
+    We were not using the graphemes, and that's costlier than just for().
+
+ src/hb-ot-shape.cc | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit eee7b459ee18cd722e9ba0d030c983e66b6e7777
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Thu Jun 24 10:17:46 2021 -0700
+
+    [subset] add option --no-prune-unicode-ranges
+
+ src/hb-ot-os2-table.hh                                 |   1 +
+ src/hb-subset-input.cc                                 |  14 ++++++++++++++
+ src/hb-subset-input.hh                                 |   1 +
+ src/hb-subset-plan.cc                                  |   1 +
+ src/hb-subset-plan.hh                                  |   1 +
+ src/hb-subset.h                                        |   7 +++++++
+ ...aa-Regular-new.no-prune-unicode-ranges.61,62,63.ttf | Bin 0 -> 7060 bytes
+ ...ortaa-Regular-new.no-prune-unicode-ranges.61,63.ttf | Bin 0 -> 6692 bytes
+ ...omfortaa-Regular-new.no-prune-unicode-ranges.61.ttf | Bin 0 -> 6328 bytes
+ ...omfortaa-Regular-new.no-prune-unicode-ranges.62.ttf | Bin 0 -> 6200 bytes
+ ...omfortaa-Regular-new.no-prune-unicode-ranges.63.ttf | Bin 0 -> 6256 bytes
+ ...ew.no-prune-unicode-ranges.retain-all-codepoint.ttf | Bin 0 -> 220928 bytes
+ ...Regular-subset.no-prune-unicode-ranges.61,62,63.ttf | Bin 0 -> 4128 bytes
+ ...jo-Regular-subset.no-prune-unicode-ranges.61,63.ttf | Bin 0 -> 3580 bytes
+ ...ongjo-Regular-subset.no-prune-unicode-ranges.61.ttf | Bin 0 -> 3156 bytes
+ ...ongjo-Regular-subset.no-prune-unicode-ranges.62.ttf | Bin 0 -> 3180 bytes
+ ...ongjo-Regular-subset.no-prune-unicode-ranges.63.ttf | Bin 0 -> 3048 bytes
+ ...et.no-prune-unicode-ranges.retain-all-codepoint.ttf | Bin 0 -> 9524 bytes
+ ...to-Regular.abc.no-prune-unicode-ranges.61,62,63.ttf | Bin 0 -> 2452 bytes
+ ...oboto-Regular.abc.no-prune-unicode-ranges.61,63.ttf | Bin 0 -> 2260 bytes
+ .../Roboto-Regular.abc.no-prune-unicode-ranges.61.ttf  | Bin 0 -> 2048 bytes
+ .../Roboto-Regular.abc.no-prune-unicode-ranges.62.ttf  | Bin 0 -> 1916 bytes
+ .../Roboto-Regular.abc.no-prune-unicode-ranges.63.ttf  | Bin 0 -> 1972 bytes
+ ...bc.no-prune-unicode-ranges.retain-all-codepoint.ttf | Bin 0 -> 2452 bytes
+ test/subset/data/profiles/no-prune-unicode-ranges.txt  |   1 +
+ test/subset/data/tests/basics.tests                    |   1 +
+ util/options-subset.cc                                 |   1 +
+ 27 files changed, 28 insertions(+)
+
+commit c3be28ea26cd23011440db7e6afaf4412e5d705d
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Jun 23 17:39:23 2021 +0200
+
+    [ot-shape] Numeric runs native direction is LTR
+    
+    See inline comments. Slightly modified version of the code from Jonathan
+    Kew on the linked issue.
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/501
+
+ src/hb-ot-shape.cc                                 |  29 +++++++++++++++++++++
+ src/hb-unicode.hh                                  |   7 +++++
+ test/shaping/data/in-house/Makefile.sources        |   1 +
+ .../3b791518a9ba89675df02f1eefbc9026a50648a6.ttf   | Bin 0 -> 3144 bytes
+ .../a6b17da98b9f1565ba428719777bbf94a66403c1.ttf   | Bin 0 -> 3676 bytes
+ .../b082211be29a3e2cf91f0fd43497e40b2a27b344.ttf   | Bin 0 -> 4800 bytes
+ .../e5ff44940364c2247abed50bdda30d2ef5aedfe4.ttf   | Bin 0 -> 2548 bytes
+ test/shaping/data/in-house/meson.build             |   1 +
+ test/shaping/data/in-house/tests/digits.tests      |   5 ++++
+ 9 files changed, 43 insertions(+)
+
+commit 71a62966202012300a2cf2c8fbaae32354d136ba
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Jun 23 18:16:56 2021 +0200
+
+    [tests] Make record-test.sh work with .otf files
+    
+    It hard-codes the file extension, but fonttools sunset will use .otf for
+    CFF fonts, so hard-code the output file from subset as well.
+
+ test/shaping/record-test.sh | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+commit cc9bb294919e846ef8a0731b5e9f304f95ef3bb8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jun 20 18:47:03 2021 -0600
+
+    [blob] Fix-up recent mistake in hb_blob_create() destroy(user_data)
+    
+    https://github.com/harfbuzz/harfbuzz/pull/3026#discussion_r653437491
+
+ src/hb-blob.cc | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit bc06af977fc89b8b25bfd7180d010b915811c0d8
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Jun 16 15:49:14 2021 -0700
+
+    [subset] speed up feature collection when tags are specified.
+    
+    Precompute a feature index filter to avoid needing to iterate the feature tag list for each encountered feature index. For this particular fuzzer case speeds up feature collection from 50s to 2s.
+
+ src/hb-ot-layout.cc                                |  98 +++++++++++++--------
+ ...ase-minimized-hb-subset-fuzzer-5241922561114112 | Bin 0 -> 638237 bytes
+ 2 files changed, 63 insertions(+), 35 deletions(-)
+
+commit 14f220b76159a2f2d926029e32b3fe975d1dc525
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Sun Jun 20 18:59:13 2021 +0200
+
+    [directwrite] Support feature ranges
+    
+    Code copied from hb-uniscribe.cc and adapted to use DirectWrite types.
+    May be there is a better way to de-duplicate the code, though I'm not
+    exactly sure how or if it is worth it.
+
+ src/hb-directwrite.cc | 198 +++++++++++++++++++++++++++++++++++++++++++++-----
+ 1 file changed, 180 insertions(+), 18 deletions(-)
+
+commit d2397d91f30c7eda0a446cefd623d78e16cf7268
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Jun 18 18:12:19 2021 -0700
+
+    [subset] Add additional colrv1 subsetting tests that has a glyph with components.
+
+ test/subset/data/Makefile.am                            |   1 +
+ test/subset/data/Makefile.sources                       |   1 +
+ .../NotoColrEmojiGlyf-Regular.subset.default.1f35e.ttf  | Bin 0 -> 3004 bytes
+ .../NotoColrEmojiGlyf-Regular.subset.default.1f696.ttf  | Bin 0 -> 3752 bytes
+ ...Glyf-Regular.subset.drop-hints-retain-gids.1f35e.ttf | Bin 0 -> 3516 bytes
+ ...Glyf-Regular.subset.drop-hints-retain-gids.1f696.ttf | Bin 0 -> 5048 bytes
+ ...otoColrEmojiGlyf-Regular.subset.drop-hints.1f35e.ttf | Bin 0 -> 3004 bytes
+ ...otoColrEmojiGlyf-Regular.subset.drop-hints.1f696.ttf | Bin 0 -> 3752 bytes
+ ...toColrEmojiGlyf-Regular.subset.retain-gids.1f35e.ttf | Bin 0 -> 3516 bytes
+ ...toColrEmojiGlyf-Regular.subset.retain-gids.1f696.ttf | Bin 0 -> 5048 bytes
+ .../data/fonts/NotoColrEmojiGlyf-Regular.subset.ttf     | Bin 0 -> 71896 bytes
+ test/subset/data/tests/colrv1.notoemoji.tests           |  12 ++++++++++++
+ test/subset/meson.build                                 |   1 +
+ 13 files changed, 15 insertions(+)
+
+commit 26c80adb61938288b3954b907fe6ddbb430fa468
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Jun 18 14:14:20 2021 -0700
+
+    [subset] do colrv1 glyph closure before glyf composite closure.
+
+ src/hb-subset-plan.cc | 21 +++++++++++----------
+ 1 file changed, 11 insertions(+), 10 deletions(-)
+
+commit d07f789ae3997ee95923525af56627d4be4a90e4
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Wed Jun 9 15:36:40 2021 -0700
+
+    [subset] support option "--notdef-outline"
+
+ src/hb-ot-glyf-table.hh                            |   5 ++++-
+ src/hb-ot-var-gvar-table.hh                        |   4 ++--
+ src/hb-subset-input.cc                             |  15 +++++++++++++++
+ src/hb-subset-input.hh                             |  14 ++++++++------
+ src/hb-subset-plan.cc                              |   1 +
+ src/hb-subset-plan.hh                              |   1 +
+ src/hb-subset.h                                    |   7 +++++++
+ .../Comfortaa-Regular-new.default.61,62,63.ttf     | Bin 7652 -> 7060 bytes
+ .../basics/Comfortaa-Regular-new.default.61,63.ttf | Bin 7284 -> 6692 bytes
+ .../basics/Comfortaa-Regular-new.default.61.ttf    | Bin 6920 -> 6328 bytes
+ .../basics/Comfortaa-Regular-new.default.62.ttf    | Bin 6796 -> 6200 bytes
+ .../basics/Comfortaa-Regular-new.default.63.ttf    | Bin 6844 -> 6256 bytes
+ ...aa-Regular-new.default.retain-all-codepoint.ttf | Bin 221524 -> 220928 bytes
+ ...Regular-new.drop-hints-retain-gids.61,62,63.ttf | Bin 5104 -> 4608 bytes
+ ...aa-Regular-new.drop-hints-retain-gids.61,63.ttf | Bin 4808 -> 4312 bytes
+ ...ortaa-Regular-new.drop-hints-retain-gids.61.ttf | Bin 4220 -> 3724 bytes
+ ...ortaa-Regular-new.drop-hints-retain-gids.62.ttf | Bin 4396 -> 3900 bytes
+ ...ortaa-Regular-new.drop-hints-retain-gids.63.ttf | Bin 4468 -> 3972 bytes
+ ...drop-hints-retain-gids.retain-all-codepoint.ttf | Bin 190296 -> 189800 bytes
+ .../Comfortaa-Regular-new.drop-hints.61,62,63.ttf  | Bin 3100 -> 2600 bytes
+ .../Comfortaa-Regular-new.drop-hints.61,63.ttf     | Bin 2792 -> 2296 bytes
+ .../basics/Comfortaa-Regular-new.drop-hints.61.ttf | Bin 2472 -> 1976 bytes
+ .../basics/Comfortaa-Regular-new.drop-hints.62.ttf | Bin 2396 -> 1900 bytes
+ .../basics/Comfortaa-Regular-new.drop-hints.63.ttf | Bin 2460 -> 1968 bytes
+ ...Regular-new.drop-hints.retain-all-codepoint.ttf | Bin 190252 -> 189756 bytes
+ .../basics/Comfortaa-Regular-new.gids.61,62,63.ttf | Bin 8580 -> 7988 bytes
+ .../basics/Comfortaa-Regular-new.gids.61,63.ttf    | Bin 8220 -> 7628 bytes
+ .../basics/Comfortaa-Regular-new.gids.61.ttf       | Bin 7848 -> 7256 bytes
+ .../basics/Comfortaa-Regular-new.gids.62.ttf       | Bin 7772 -> 7184 bytes
+ .../basics/Comfortaa-Regular-new.gids.63.ttf       | Bin 7776 -> 7180 bytes
+ ...ortaa-Regular-new.gids.retain-all-codepoint.ttf | Bin 221524 -> 220928 bytes
+ ...gular-new.keep-all-layout-features.61,62,63.ttf | Bin 8100 -> 7504 bytes
+ ...-Regular-new.keep-all-layout-features.61,63.ttf | Bin 7736 -> 7140 bytes
+ ...taa-Regular-new.keep-all-layout-features.61.ttf | Bin 7360 -> 6772 bytes
+ ...taa-Regular-new.keep-all-layout-features.62.ttf | Bin 6796 -> 6200 bytes
+ ...taa-Regular-new.keep-all-layout-features.63.ttf | Bin 6844 -> 6256 bytes
+ ...ep-all-layout-features.retain-all-codepoint.ttf | Bin 222212 -> 221620 bytes
+ ...fortaa-Regular-new.layout-features.61,62,63.ttf | Bin 7652 -> 7060 bytes
+ ...Comfortaa-Regular-new.layout-features.61,63.ttf | Bin 7284 -> 6692 bytes
+ .../Comfortaa-Regular-new.layout-features.61.ttf   | Bin 6920 -> 6328 bytes
+ .../Comfortaa-Regular-new.layout-features.62.ttf   | Bin 6796 -> 6200 bytes
+ .../Comfortaa-Regular-new.layout-features.63.ttf   | Bin 6844 -> 6256 bytes
+ ...ar-new.layout-features.retain-all-codepoint.ttf | Bin 219716 -> 219124 bytes
+ .../Comfortaa-Regular-new.name-ids.61,62,63.ttf    | Bin 7392 -> 6800 bytes
+ .../Comfortaa-Regular-new.name-ids.61,63.ttf       | Bin 7024 -> 6432 bytes
+ .../basics/Comfortaa-Regular-new.name-ids.61.ttf   | Bin 6660 -> 6068 bytes
+ .../basics/Comfortaa-Regular-new.name-ids.62.ttf   | Bin 6536 -> 5940 bytes
+ .../basics/Comfortaa-Regular-new.name-ids.63.ttf   | Bin 6584 -> 5996 bytes
+ ...a-Regular-new.name-ids.retain-all-codepoint.ttf | Bin 221264 -> 220668 bytes
+ ...mfortaa-Regular-new.name-languages.61,62,63.ttf | Bin 7652 -> 7060 bytes
+ .../Comfortaa-Regular-new.name-languages.61,63.ttf | Bin 7284 -> 6692 bytes
+ .../Comfortaa-Regular-new.name-languages.61.ttf    | Bin 6920 -> 6328 bytes
+ .../Comfortaa-Regular-new.name-languages.62.ttf    | Bin 6796 -> 6200 bytes
+ .../Comfortaa-Regular-new.name-languages.63.ttf    | Bin 6844 -> 6256 bytes
+ ...lar-new.name-languages.retain-all-codepoint.ttf | Bin 221524 -> 220928 bytes
+ .../Comfortaa-Regular-new.name-legacy.61,62,63.ttf | Bin 7652 -> 7060 bytes
+ .../Comfortaa-Regular-new.name-legacy.61,63.ttf    | Bin 7284 -> 6692 bytes
+ .../Comfortaa-Regular-new.name-legacy.61.ttf       | Bin 6920 -> 6328 bytes
+ .../Comfortaa-Regular-new.name-legacy.62.ttf       | Bin 6796 -> 6200 bytes
+ .../Comfortaa-Regular-new.name-legacy.63.ttf       | Bin 6844 -> 6256 bytes
+ ...egular-new.name-legacy.retain-all-codepoint.ttf | Bin 221524 -> 220928 bytes
+ ...mfortaa-Regular-new.notdef-outline.61,62,63.ttf | Bin 0 -> 7652 bytes
+ .../Comfortaa-Regular-new.notdef-outline.61,63.ttf | Bin 0 -> 7284 bytes
+ .../Comfortaa-Regular-new.notdef-outline.61.ttf    | Bin 0 -> 6920 bytes
+ .../Comfortaa-Regular-new.notdef-outline.62.ttf    | Bin 0 -> 6796 bytes
+ .../Comfortaa-Regular-new.notdef-outline.63.ttf    | Bin 0 -> 6844 bytes
+ ...lar-new.notdef-outline.retain-all-codepoint.ttf | Bin 0 -> 221524 bytes
+ .../Comfortaa-Regular-new.retain-gids.61,62,63.ttf | Bin 9656 -> 9068 bytes
+ .../Comfortaa-Regular-new.retain-gids.61,63.ttf    | Bin 9300 -> 8708 bytes
+ .../Comfortaa-Regular-new.retain-gids.61.ttf       | Bin 8668 -> 8076 bytes
+ .../Comfortaa-Regular-new.retain-gids.62.ttf       | Bin 8796 -> 8200 bytes
+ .../Comfortaa-Regular-new.retain-gids.63.ttf       | Bin 8852 -> 8260 bytes
+ ...egular-new.retain-gids.retain-all-codepoint.ttf | Bin 221568 -> 220972 bytes
+ ...ngjo-Regular-subset.notdef-outline.61,62,63.ttf | Bin 0 -> 4128 bytes
+ ...yeongjo-Regular-subset.notdef-outline.61,63.ttf | Bin 0 -> 3580 bytes
+ ...umMyeongjo-Regular-subset.notdef-outline.61.ttf | Bin 0 -> 3156 bytes
+ ...umMyeongjo-Regular-subset.notdef-outline.62.ttf | Bin 0 -> 3180 bytes
+ ...umMyeongjo-Regular-subset.notdef-outline.63.ttf | Bin 0 -> 3048 bytes
+ ...-subset.notdef-outline.retain-all-codepoint.ttf | Bin 0 -> 9524 bytes
+ .../Roboto-Regular.abc.notdef-outline.61,62,63.ttf | Bin 0 -> 2452 bytes
+ .../Roboto-Regular.abc.notdef-outline.61,63.ttf    | Bin 0 -> 2260 bytes
+ .../Roboto-Regular.abc.notdef-outline.61.ttf       | Bin 0 -> 2048 bytes
+ .../Roboto-Regular.abc.notdef-outline.62.ttf       | Bin 0 -> 1916 bytes
+ .../Roboto-Regular.abc.notdef-outline.63.ttf       | Bin 0 -> 1972 bytes
+ ...lar.abc.notdef-outline.retain-all-codepoint.ttf | Bin 0 -> 2452 bytes
+ .../cmap/AdobeBlank-Regular.default.61,62.ttf      | Bin 1336 -> 1252 bytes
+ .../cmap/AdobeBlank-Regular.default.61,FEFA.ttf    | Bin 1348 -> 1264 bytes
+ .../cmap/AdobeBlank-Regular.default.FEE6,FECF.ttf  | Bin 1300 -> 1216 bytes
+ .../cmap/AdobeBlank-Regular.default.FEF9,FEFA.ttf  | Bin 1288 -> 1204 bytes
+ .../cmap/AdobeBlank-Regular.default.FEFA.ttf       | Bin 1268 -> 1184 bytes
+ ...eBlank-Regular.drop-hints-retain-gids.61,62.ttf | Bin 1552 -> 1468 bytes
+ ...lank-Regular.drop-hints-retain-gids.61,FEFA.ttf | Bin 8316 -> 8232 bytes
+ ...nk-Regular.drop-hints-retain-gids.FEE6,FECF.ttf | Bin 8188 -> 8104 bytes
+ ...nk-Regular.drop-hints-retain-gids.FEF9,FEFA.ttf | Bin 8256 -> 8172 bytes
+ ...beBlank-Regular.drop-hints-retain-gids.FEFA.ttf | Bin 8240 -> 8156 bytes
+ .../cmap/AdobeBlank-Regular.drop-hints.61,62.ttf   | Bin 1164 -> 1080 bytes
+ .../cmap/AdobeBlank-Regular.drop-hints.61,FEFA.ttf | Bin 1176 -> 1092 bytes
+ .../AdobeBlank-Regular.drop-hints.FEE6,FECF.ttf    | Bin 1128 -> 1044 bytes
+ .../AdobeBlank-Regular.drop-hints.FEF9,FEFA.ttf    | Bin 1116 -> 1032 bytes
+ .../cmap/AdobeBlank-Regular.drop-hints.FEFA.ttf    | Bin 1096 -> 1012 bytes
+ .../cmap/AdobeBlank-Regular.name-ids.61,62.ttf     | Bin 1084 -> 1000 bytes
+ .../cmap/AdobeBlank-Regular.name-ids.61,FEFA.ttf   | Bin 1096 -> 1012 bytes
+ .../cmap/AdobeBlank-Regular.name-ids.FEE6,FECF.ttf | Bin 1048 -> 964 bytes
+ .../cmap/AdobeBlank-Regular.name-ids.FEF9,FEFA.ttf | Bin 1036 -> 952 bytes
+ .../cmap/AdobeBlank-Regular.name-ids.FEFA.ttf      | Bin 1016 -> 932 bytes
+ .../cmap/AdobeBlank-Regular.retain-gids.61,62.ttf  | Bin 1724 -> 1640 bytes
+ .../AdobeBlank-Regular.retain-gids.61,FEFA.ttf     | Bin 8488 -> 8404 bytes
+ .../AdobeBlank-Regular.retain-gids.FEE6,FECF.ttf   | Bin 8360 -> 8276 bytes
+ .../AdobeBlank-Regular.retain-gids.FEF9,FEFA.ttf   | Bin 8428 -> 8344 bytes
+ .../cmap/AdobeBlank-Regular.retain-gids.FEFA.ttf   | Bin 8412 -> 8328 bytes
+ .../Roboto-Regular.default.1FC,21,41,20,62,63.ttf  | Bin 3276 -> 3080 bytes
+ .../full-font/Roboto-Regular.default.61,62,63.ttf  | Bin 2864 -> 2672 bytes
+ .../Roboto-Regular.default.D7,D8,D9,DA,DE.ttf      | Bin 3216 -> 3024 bytes
+ ...oboto-Regular.drop-hints.1FC,21,41,20,62,63.ttf | Bin 1712 -> 1632 bytes
+ .../Roboto-Regular.drop-hints.61,62,63.ttf         | Bin 1496 -> 1412 bytes
+ .../Roboto-Regular.drop-hints.D7,D8,D9,DA,DE.ttf   | Bin 1728 -> 1648 bytes
+ ...ifVariable-Roman.default.1FC,21,41,20,62,63.ttf | Bin 4144 -> 3992 bytes
+ .../SourceSerifVariable-Roman.default.61,62,63.ttf | Bin 3984 -> 3832 bytes
+ ...eSerifVariable-Roman.default.D7,D8,D9,DA,DE.ttf | Bin 4548 -> 4396 bytes
+ ...ariable-Roman.drop-hints.1FC,21,41,20,62,63.ttf | Bin 4120 -> 3968 bytes
+ ...urceSerifVariable-Roman.drop-hints.61,62,63.ttf | Bin 3984 -> 3832 bytes
+ ...rifVariable-Roman.drop-hints.D7,D8,D9,DA,DE.ttf | Bin 4548 -> 4396 bytes
+ .../IndicTestJalandhar-Regular.default.A01.ttf     | Bin 4220 -> 4176 bytes
+ .../IndicTestJalandhar-Regular.default.A05,A06.ttf | Bin 4796 -> 4752 bytes
+ .../IndicTestJalandhar-Regular.default.A07,A1B.ttf | Bin 4768 -> 4724 bytes
+ ...andhar-Regular.default.retain-all-codepoint.ttf | Bin 49288 -> 49244 bytes
+ .../IndicTestJalandhar-Regular.drop-hints.A01.ttf  | Bin 1080 -> 1036 bytes
+ ...dicTestJalandhar-Regular.drop-hints.A05,A06.ttf | Bin 1388 -> 1344 bytes
+ ...dicTestJalandhar-Regular.drop-hints.A07,A1B.ttf | Bin 1388 -> 1344 bytes
+ ...har-Regular.drop-hints.retain-all-codepoint.ttf | Bin 29504 -> 29464 bytes
+ .../IndicTestJalandhar-Regular.keep-gdef.A01.ttf   | Bin 4220 -> 4176 bytes
+ ...ndicTestJalandhar-Regular.keep-gdef.A05,A06.ttf | Bin 4796 -> 4752 bytes
+ ...ndicTestJalandhar-Regular.keep-gdef.A07,A1B.ttf | Bin 4768 -> 4724 bytes
+ ...dhar-Regular.keep-gdef.retain-all-codepoint.ttf | Bin 49288 -> 49244 bytes
+ .../Roboto-Regular.default.1E00,303.ttf            | Bin 2720 -> 2524 bytes
+ .../layout.gdef/Roboto-Regular.default.303.ttf     | Bin 2312 -> 2116 bytes
+ .../Roboto-Regular.default.309,20,30F.ttf          | Bin 2408 -> 2212 bytes
+ .../layout.gdef/Roboto-Regular.default.323.ttf     | Bin 2204 -> 2008 bytes
+ .../Roboto-Regular.default.41,42,43.ttf            | Bin 2764 -> 2572 bytes
+ .../Roboto-Regular.drop-hints.1E00,303.ttf         | Bin 1464 -> 1380 bytes
+ .../layout.gdef/Roboto-Regular.drop-hints.303.ttf  | Bin 1196 -> 1112 bytes
+ .../Roboto-Regular.drop-hints.309,20,30F.ttf       | Bin 1256 -> 1172 bytes
+ .../layout.gdef/Roboto-Regular.drop-hints.323.ttf  | Bin 1136 -> 1056 bytes
+ .../Roboto-Regular.drop-hints.41,42,43.ttf         | Bin 1472 -> 1388 bytes
+ .../Roboto-Regular.keep-gdef-gpos.1E00,303.ttf     | Bin 2720 -> 2524 bytes
+ .../Roboto-Regular.keep-gdef-gpos.303.ttf          | Bin 2312 -> 2116 bytes
+ .../Roboto-Regular.keep-gdef-gpos.309,20,30F.ttf   | Bin 2408 -> 2212 bytes
+ .../Roboto-Regular.keep-gdef-gpos.323.ttf          | Bin 2204 -> 2008 bytes
+ .../Roboto-Regular.keep-gdef-gpos.41,42,43.ttf     | Bin 2764 -> 2572 bytes
+ ...ular.default.627,644,623,62D,644,627,645,2E.ttf | Bin 12724 -> 12684 bytes
+ .../Amiri-Regular.default.627,644,62D,628.ttf      | Bin 10028 -> 9992 bytes
+ .../Amiri-Regular.default.627,644.ttf              | Bin 4208 -> 4168 bytes
+ ...-Regular.default.633,645,627,621,20,644,627.ttf | Bin 9552 -> 9516 bytes
+ .../Amiri-Regular.default.63A,64A,631.ttf          | Bin 7360 -> 7324 bytes
+ ....retain-gids.627,644,623,62D,644,627,645,2E.ttf | Bin 48052 -> 48012 bytes
+ .../Amiri-Regular.retain-gids.627,644,62D,628.ttf  | Bin 42676 -> 42640 bytes
+ .../Amiri-Regular.retain-gids.627,644.ttf          | Bin 36736 -> 36696 bytes
+ ...ular.retain-gids.633,645,627,621,20,644,627.ttf | Bin 45944 -> 45908 bytes
+ .../Amiri-Regular.retain-gids.63A,64A,631.ttf      | Bin 38024 -> 37988 bytes
+ ...Bold.default.627,644,623,62D,644,627,645,2E.ttf | Bin 11436 -> 11396 bytes
+ ...toNastaliqUrdu-Bold.default.627,644,62D,628.ttf | Bin 18288 -> 18248 bytes
+ .../NotoNastaliqUrdu-Bold.default.627,644.ttf      | Bin 3568 -> 3528 bytes
+ ...rdu-Bold.default.633,645,627,621,20,644,627.ttf | Bin 12408 -> 12368 bytes
+ .../NotoNastaliqUrdu-Bold.default.63A,64A,631.ttf  | Bin 20408 -> 20368 bytes
+ ....retain-gids.627,644,623,62D,644,627,645,2E.ttf | Bin 18272 -> 18232 bytes
+ ...staliqUrdu-Bold.retain-gids.627,644,62D,628.ttf | Bin 24416 -> 24376 bytes
+ .../NotoNastaliqUrdu-Bold.retain-gids.627,644.ttf  | Bin 9216 -> 9176 bytes
+ ...Bold.retain-gids.633,645,627,621,20,644,627.ttf | Bin 18212 -> 18172 bytes
+ ...toNastaliqUrdu-Bold.retain-gids.63A,64A,631.ttf | Bin 26628 -> 26588 bytes
+ .../variable/Fraunces.default.26,66,69,124,125.ttf | Bin 15912 -> 15792 bytes
+ .../data/expected/variable/Fraunces.default.61.ttf | Bin 4348 -> 4228 bytes
+ test/subset/data/profiles/notdef-outline.txt       |   1 +
+ test/subset/data/tests/basics.tests                |   1 +
+ test/subset/generate-expected-outputs.py           |   3 +--
+ util/options-subset.cc                             |   1 +
+ 175 files changed, 42 insertions(+), 11 deletions(-)
+
+commit 10ad1859320c0475bdbf706d4b547e1d292c7111
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Jun 16 16:34:46 2021 -0700
+
+    [subset] add comment to copy_bytes().
+
+ src/hb-serialize.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 675ebbeb3a0c5b007f87505d6805096a570dd10c
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Jun 16 10:40:46 2021 -0700
+
+    [subset] don't alloc zero bytes.
+    
+    It will be leaked later since hb_blob_create() won't set up the blob to cleanup since it has length zero.
+
+ src/hb-serialize.hh                                        |   2 ++
+ ...zz-testcase-minimized-hb-subset-fuzzer-5269686781607936 | Bin 0 -> 48 bytes
+ 2 files changed, 2 insertions(+)
+
+commit 93e6a9bc4e1ac16abeccc9c0bead08a1eded1540
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 15 15:38:49 2021 -0600
+
+    Revert "Remove unneeded buffer clear_output / remove_output calls"
+    
+    This reverts commit 06175b71433bc42edc07d342e6354035e37fb5fd.
+    
+    One of the sanitizers is failing. Pushing again as PR to debug.
+    I have suspicions.
+
+ src/hb-buffer.cc    | 10 ++++++++++
+ src/hb-buffer.hh    |  1 +
+ src/hb-ot-layout.cc | 12 ++++++++----
+ src/hb-ot-shape.cc  |  3 ++-
+ 4 files changed, 21 insertions(+), 5 deletions(-)
+
+commit 06175b71433bc42edc07d342e6354035e37fb5fd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 15 14:33:27 2021 -0600
+
+    Remove unneeded buffer clear_output / remove_output calls
+    
+    Made sure clear_output is always paired with swap_buffers.
+    Trying to see if we can move towards RAII-like buffer iterators
+    instead of the buffer keeping an iterator internally.
+
+ src/hb-buffer.cc    | 10 ----------
+ src/hb-buffer.hh    |  1 -
+ src/hb-ot-layout.cc | 12 ++++--------
+ src/hb-ot-shape.cc  |  3 +--
+ 4 files changed, 5 insertions(+), 21 deletions(-)
+
+commit bdfed8f113431a2156e13d59a4b21e19feb7efd9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 14 15:46:04 2021 -0600
+
+    [blob] Add failing versions of create API
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2567
+    
+    New API:
+    +hb_blob_create_or_fail()
+    +hb_blob_create_from_file_or_fail()
+    
+    Use these in util/ to distinguish empty file from not-found file.
+    Only err on the latter.
+
+ docs/harfbuzz-sections.txt          |  2 +
+ docs/usermanual-getting-started.xml |  2 +-
+ perf/perf-draw.hh                   |  4 +-
+ perf/perf-extents.hh                |  4 +-
+ perf/perf-shaping.hh                |  8 ++--
+ src/hb-blob.cc                      | 89 ++++++++++++++++++++++++++++++-------
+ src/hb-blob.h                       | 10 +++++
+ src/main.cc                         | 12 ++---
+ src/test-buffer-serialize.cc        |  5 ++-
+ src/test-gpos-size-params.cc        |  5 ++-
+ src/test-gsub-would-substitute.cc   |  5 ++-
+ src/test-ot-glyphname.cc            |  5 ++-
+ src/test-ot-meta.cc                 |  5 ++-
+ src/test-ot-name.cc                 |  5 ++-
+ src/test.cc                         |  5 ++-
+ test/api/hb-test.h                  |  4 +-
+ test/fuzzing/main.cc                | 10 +++--
+ util/options.cc                     |  6 +--
+ 18 files changed, 132 insertions(+), 54 deletions(-)
+
+commit 2fc8d0e6f0b7cfe3897f69ca0411265257dd4a18
+Merge: d3dd93630 085aa65e0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 15 12:56:17 2021 -0700
+
+    Merge pull request #3020 from googlefonts/serialize_serialize
+    
+    [subset] Always serialize objects point to by OffsetTo to a new serializer object.
+
+commit 085aa65e09e847cf28d6430e85238ea77cce20e2
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Jun 14 16:47:45 2021 -0700
+
+    [subset] Convert offset serialization in gsubgpos and gdef to serialize_serialize().
+
+ src/hb-ot-layout-gdef-table.hh | 6 ++----
+ src/hb-ot-layout-gsubgpos.hh   | 6 ++----
+ 2 files changed, 4 insertions(+), 8 deletions(-)
+
+commit cc96c4e87ee3d5de6364ab207676daf6d243f95b
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Jun 14 16:43:23 2021 -0700
+
+    [shaping] Update shaping substituion lookup serialization to use serializer pop()/pack().
+
+ src/hb-ot-layout-gsub-table.hh | 66 +++++++++++++++++++++++++++---------------
+ 1 file changed, 43 insertions(+), 23 deletions(-)
+
+commit d3dd9363095fadaeb59dabe59b5101bb0ecddb41
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 14 12:31:02 2021 -0600
+
+    [coretext] Round position info
+    
+    Test:
+    
+    Before:
+    $ ./hb-shape /System/Library/Fonts/ヒラギノ丸ゴ\ ProN\ W4.ttc 1 --features="+palt" --shaper=coretext
+    [gid781=0@-78,0+841]
+    $ ./hb-shape /System/Library/Fonts/ヒラギノ丸ゴ\ ProN\ W4.ttc 1 --features="+palt" --shaper=ot
+    [gid781=0@-78,0+842]
+    
+    After:
+    $ ./hb-shape /System/Library/Fonts/ヒラギノ丸ゴ\ ProN\ W4.ttc 1 --features="+palt" --shaper=coretext
+    [gid781=0@-78,0+842]
+    $ ./hb-shape /System/Library/Fonts/ヒラギノ丸ゴ\ ProN\ W4.ttc 1 --features="+palt" --shaper=ot
+    [gid781=0@-78,0+842]
+    
+    I've verified in the font that 842 is correct.
+
+ src/hb-coretext.cc | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit 8443cc85cb118e858043179ac27673ce170dad3b
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Jun 11 13:40:39 2021 -0700
+
+    [subset] Correct OffsetTo serialization in GPOS to use serialize_serialize ().
+
+ src/hb-ot-layout-gpos-table.hh | 30 +++++++++++-------------------
+ 1 file changed, 11 insertions(+), 19 deletions(-)
+
+commit 5ba46ed067a04b6e1de1611153885c2478de3ceb
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Jun 11 13:34:00 2021 -0700
+
+    [subset] Correct OffsetTo serialization in GSUB to use serialize_serialize ().
+
+ src/hb-ot-layout-gsub-table.hh | 44 +++++++++++++++++++-----------------------
+ 1 file changed, 20 insertions(+), 24 deletions(-)
+
+commit 35458b6b66f801194a1dad957308be9a71280425
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Jun 11 13:14:51 2021 -0700
+
+    [subset] Add serialize_serialize to OffsetTo.
+    
+    Similar to serialize_subset() this will serialize the new object and then link it to the offset.
+
+ src/hb-open-type.hh            | 17 +++++++++++++++++
+ src/hb-ot-layout-gsub-table.hh |  2 +-
+ 2 files changed, 18 insertions(+), 1 deletion(-)
+
+commit 2b0ced28b685de4edbd22cf5f59be30075984dfb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 9 19:06:31 2021 -0600
+
+    Cluster Regional_Indicator pairs (aka emoji flags)
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2265
+
+ src/hb-ot-shape.cc | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit 4e72d5e35d68b1772985ddafc522dcd4b0aceec2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jun 13 05:46:17 2021 -0600
+
+    [src/check-static-init] Ignore objdump "file format not recognized" error
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/3019
+
+ src/check-static-inits.py | 17 +++++++++++++++--
+ 1 file changed, 15 insertions(+), 2 deletions(-)
+
+commit 5bc05ba155a0fd568b56423009e55d16ed42b91c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jun 13 05:28:20 2021 -0600
+
+    Prefer GPOS over kerx, if GSUB was applied
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/3008
+
+ src/hb-ot-shape.cc                           | 6 ++++--
+ test/shaping/data/in-house/tests/macos.tests | 3 +++
+ 2 files changed, 7 insertions(+), 2 deletions(-)
+
+commit 13c6ad980fcff52567955d268f33d698ff78379e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jun 12 11:00:19 2021 -0600
+
+    [src/check-*] Pickup $(NM), $(OBJDUMP), $(LDD), $(OTOOL)
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/3019
+
+ src/Makefile.am            |  4 ++++
+ src/check-libstdc++.py     | 14 ++++++--------
+ src/check-static-inits.py  |  4 ++--
+ src/check-symbols.py       |  6 +++---
+ src/gen-ragel-artifacts.py |  4 ++--
+ 5 files changed, 17 insertions(+), 15 deletions(-)
+
+commit c61ce962cfdef3fc756850132eb9f76cb7a57ba5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jun 10 17:33:29 2021 -0600
+
+    [buffer] In hb_buffer_get_positions(), return NULL if inside message callback
+    
+    As discussed in https://github.com/harfbuzz/harfbuzz/issues/2468#issuecomment-645666066
+    
+    Part of fixing https://github.com/harfbuzz/harfbuzz/issues/2468
+
+ src/hb-buffer.cc | 16 +++++++++++++---
+ src/hb-buffer.hh |  9 +++++++++
+ util/options.cc  |  2 +-
+ 3 files changed, 23 insertions(+), 4 deletions(-)
+
+commit 855a3f478eea5b770e64611d09fd347336c56b67
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 9 15:10:52 2021 -0600
+
+    [emoji] Fix emoji table generation
+    
+    Previously, the last of each range having Extended_Pictograph property
+    was not processed as so. Ouch!
+    
+    Test:
+    
+    $ echo x > null; hb-shape null -u U+1f43b,U+200d,U+2744,U+fe0f
+    
+    Before:
+    [gid0=0+1000|gid0=2+1000]
+    
+    After:
+    [gid0=0+1000|gid0=0+1000]
+    
+    Caught by https://github.com/harfbuzz/harfbuzz/issues/3017
+
+ src/gen-emoji-table.py        |  2 +-
+ src/hb-unicode-emoji-table.hh | 64 +++++++++++++++++++++++--------------------
+ 2 files changed, 36 insertions(+), 30 deletions(-)
+
+commit bd5502f09f09b3f464754395880f9db30a5fcf60
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 9 14:03:25 2021 -0600
+
+    [set] Oops. Fix compile
+
+ src/hb-set.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 3962225a7247582f1ae12193a4caee11dc876e1e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 9 14:02:31 2021 -0600
+
+    [set] Add hb_set_copy()
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/3016
+
+ docs/harfbuzz-sections.txt |  1 +
+ src/hb-set.cc              | 18 ++++++++++++++++++
+ src/hb-set.h               |  3 +++
+ 3 files changed, 22 insertions(+)
+
+commit bc33b87f5e72648c66949cc9469291e77aa80701
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 9 11:51:32 2021 -0600
+
+    [set] Use references, not pointers, in internal C++ API
+
+ src/hb-ot-layout-gsubgpos.hh |  2 +-
+ src/hb-set.cc                | 14 ++++-----
+ src/hb-set.hh                | 69 ++++++++++++++++++++++----------------------
+ src/hb-subset-plan.cc        |  2 +-
+ 4 files changed, 44 insertions(+), 43 deletions(-)
+
+commit 9cfac093aa5816113289812764c44ec0c44c04c4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 9 11:41:59 2021 -0600
+
+    [set] Add copy constructor/assignment
+
+ src/hb-set.hh | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit a83b9b0fec4c21e9da19b7c83ea76cb33aabd195
+Merge: 4811e8f5d 6119ff9d8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 7 16:41:27 2021 -0700
+
+    Merge pull request #3011 from harfbuzz/directwrite-cleanup
+    
+    Some directwrite cleanups
+
+commit 4811e8f5d76ef528b4cec00f241cc4ab8110db30
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Mon Jun 7 10:54:36 2021 +0200
+
+    Trigger doc rebuild
+
+ src/hb-face.cc | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit 09a2eb65d782c1e6bba5ebb5027eaf84c40fc31a
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Mon Jun 7 10:52:27 2021 +0200
+
+    Revert "Temporarily always push the docs commit"
+    
+    This reverts commit 6612fd39ae6f84446dad1b0507417d6febf22fa0.
+
+ .ci/deploy-docs.sh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 6612fd39ae6f84446dad1b0507417d6febf22fa0
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Mon Jun 7 10:36:02 2021 +0200
+
+    Temporarily always push the docs commit
+
+ .ci/deploy-docs.sh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit b39b047505d0cd8a77fb9eafca2a08b717a07ead
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Mon Jun 7 10:27:33 2021 +0200
+
+    Try to fix doc deployment
+    
+    https://github.com/harfbuzz/harfbuzz.github.io/issues/4
+    
+    From CI logs at https://github.com/harfbuzz/harfbuzz/runs/2758234200:
+    
+    + git init
+    hint: Using 'master' as the name for the initial branch. This default branch name
+    hint: is subject to change. To configure the initial branch name to use in all
+    hint: of your new repositories, which will suppress this warning, call:
+    hint:
+    hint:   git config --global init.defaultBranch <name>
+    hint:
+    hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
+    hint: 'development'. The just-created branch can be renamed via this command:
+    hint:
+    hint:   git branch -m <name>
+    
+    We want the branch too be main not master.
+
+ .ci/deploy-docs.sh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 5585ea02eb90c013ddba73290d3a9ae435df9f15
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Sat Jun 5 08:35:28 2021 -0400
+
+    [syllabic] Set position of dotted circle for Indic
+
+ src/hb-ot-shape-complex-indic.cc                          |   3 ++-
+ src/hb-ot-shape-complex-syllabic.cc                       |   5 ++++-
+ src/hb-ot-shape-complex-syllabic.hh                       |   3 ++-
+ .../fonts/fd07ea46e4d8368ada1776208c07fd596f727852.ttf    | Bin 0 -> 956 bytes
+ test/shaping/data/in-house/tests/cluster.tests            |   1 +
+ 5 files changed, 9 insertions(+), 3 deletions(-)
+
+commit a9fb6a0c3cb1ffdbd6c18c8a4b1ad7a51ade2e1c
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Sun Jun 6 14:40:50 2021 +0200
+
+    [aat] Add start table/end table to buffer messages
+    
+    Related to https://github.com/harfbuzz/harfbuzz/issues/3008
+
+ src/hb-aat-layout.cc | 6 ++++++
+ src/hb-ot-layout.cc  | 2 ++
+ 2 files changed, 8 insertions(+)
+
+commit 19cb449358202b22b851f87032ea01b950b04f0f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jun 5 13:44:51 2021 -0600
+
+    Update COPYING
+    
+    Mainly just to push any commit to see if it fixes our github.io site.
+    
+    https://github.com/harfbuzz/harfbuzz.github.io/issues/4
+
+ COPYING | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit cf9538e8080c6e96c840db09515191a799c85de9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 4 22:33:16 2021 -0600
+
+    Removal remaining uses of "blacklist" terminology
+
+ src/gen-use-table.py | 4 ++--
+ src/hb-config.hh     | 2 +-
+ src/hb-ot-layout.cc  | 6 +++---
+ 3 files changed, 6 insertions(+), 6 deletions(-)
+
+commit 6119ff9d806db7de3ceef73de67fe589507800bb
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Thu Jun 3 13:02:53 2021 +0200
+
+    [hb-directwrite] Don't load dwrit.dll dynamically
+    
+    We already link to it, so I don't see the point of trying to load it
+    dynamically.
+
+ src/hb-directwrite.cc | 36 ++----------------------------------
+ 1 file changed, 2 insertions(+), 34 deletions(-)
+
+commit b2070a509c6aabc5a275749979d140f8d78206e6
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Thu Jun 3 10:50:46 2021 +0200
+
+    [hb-directwrite] Don’t override new/delete
+    
+    This is a testing shaper, we don’t care for overridden malloc/free here.
+    Use malloc/free in the code called from hb_directwrite_face_create().
+
+ src/hb-directwrite.cc | 14 ++------------
+ 1 file changed, 2 insertions(+), 12 deletions(-)
+
+commit 221d642b196a1bc1550e06a06d32bc8888590380
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Thu Jun 3 10:45:23 2021 +0200
+
+    [hb-directwrite] Remove _hb_directwrite_shape_experimental_width
+    
+    Not used anywhere.
+
+ src/hb-directwrite.cc | 128 +++-----------------------------------------------
+ 1 file changed, 6 insertions(+), 122 deletions(-)
+
+commit fa432a121e3c409de77cd2e2b1085b31b93be4c6
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Sat Jun 5 04:06:58 2021 +0200
+
+    Rename various references to master branch
+
+ .ci/deploy-docs.sh             | 4 ++--
+ .github/workflows/linux-ci.yml | 6 +++---
+ .github/workflows/msvc-ci.yml  | 4 ++--
+ .github/workflows/msys2-ci.yml | 4 ++--
+ README                         | 8 ++++----
+ README.md                      | 4 ++--
+ 6 files changed, 15 insertions(+), 15 deletions(-)
+
+commit 35d6af69435ff070cee00f7cd9741b3545ca161c
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Fri Jun 4 10:04:27 2021 -0700
+
+    [subset] fix fuzzer testcase: https://oss-fuzz.com/testcase-detail/5965777994907648
+
+ src/hb-ot-color-colr-table.hh                            |  15 +++++++++++++--
+ ...-testcase-minimized-hb-subset-fuzzer-5965777994907648 | Bin 0 -> 159 bytes
+ 2 files changed, 13 insertions(+), 2 deletions(-)
+
+commit 92206345a390311e6ebe074238bf39d6dc77d79e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 4 14:51:49 2021 -0600
+
+    [ci] Disable patch-level codecov failures
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/3004
+
+ .codecov.yml | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 3d48bfc18731e3c2187a5b0666a7e94dcab0150b
+Author: Peter Williams <peter@newton.cx>
+Date:   Wed Jun 2 23:12:53 2021 -0400
+
+    Avoid a deprecation warning in graphite2
+    
+    As of graphite2 1.3.7, `gr_make_face` is deprecated in favor of
+    `gr_make_face_with_ops`. It's a one-liner to port over to using it.
+    
+    This is potentially a compatibility break since I'm not sure when the
+    `with_ops` API was added, but the minimum version of graphite2 that's
+    supported by Harfbuzz doesn't seem to be documented anywhere anyway.
+
+ src/hb-graphite2.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 1b6008ca625e0f41cb34259368f91677a110b5dd
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Wed Jun 2 15:07:18 2021 -0700
+
+    fix fuzzer testcase: https://oss-fuzz.com/testcase-detail/5417934246772736
+
+ src/hb-ot-color-colr-table.hh                             |  12 +++++++++---
+ ...z-testcase-minimized-hb-subset-fuzzer-5417934246772736 | Bin 0 -> 104 bytes
+ 2 files changed, 9 insertions(+), 3 deletions(-)
+
+commit 18f61210a43e2dc4e7001227e37fc899d5af7979
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu May 27 16:01:17 2021 -0700
+
+    Add public api methods to get/set the layout features to retain.
+
+ src/hb-subset-input.cc | 20 ++++++++++++++++++++
+ src/hb-subset.h        |  9 +++++++++
+ 2 files changed, 29 insertions(+)
+
+commit 243d056ff1c2af583ceb67e5dfbfaac51dc96e63
+Author: Andi-Bogdan Postelnicu <abpostelnicu@me.com>
+Date:   Wed Jun 2 14:08:11 2021 +0300
+
+    Removed unused variable `supp_size` from plan_subset_encoding(...).
+
+ src/hb-subset-cff1.cc | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit 7ab0f4eda9a8a1d7ccd334fa7f9fef4b038a1c24
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Thu May 27 11:40:34 2021 -0700
+
+    fuzzer fix
+
+ src/hb-subset.cc                                           |   1 +
+ ...zz-testcase-minimized-hb-subset-fuzzer-4681956043390976 | Bin 0 -> 56 bytes
+ 2 files changed, 1 insertion(+)
+
+commit cb5a6b5a27cfe616113bafe7f23ad33f1b0d0a1e
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Wed May 19 17:33:46 2021 -0700
+
+    [subset] support option --layout-features
+
+ src/hb-subset-input.cc                             |  91 +++++++++++++
+ src/hb-subset-input.hh                             |   2 +
+ src/hb-subset-plan.cc                              | 147 +++++++++++----------
+ src/hb-subset-plan.hh                              |   4 +
+ .../Comfortaa-Regular-new.default.61,62,63.ttf     | Bin 8100 -> 7652 bytes
+ .../basics/Comfortaa-Regular-new.default.61,63.ttf | Bin 7736 -> 7284 bytes
+ .../basics/Comfortaa-Regular-new.default.61.ttf    | Bin 7360 -> 6920 bytes
+ ...aa-Regular-new.default.retain-all-codepoint.ttf | Bin 222212 -> 221524 bytes
+ ...Regular-new.drop-hints-retain-gids.61,62,63.ttf | Bin 7012 -> 5104 bytes
+ ...aa-Regular-new.drop-hints-retain-gids.61,63.ttf | Bin 6712 -> 4808 bytes
+ ...ortaa-Regular-new.drop-hints-retain-gids.61.ttf | Bin 6388 -> 4220 bytes
+ ...drop-hints-retain-gids.retain-all-codepoint.ttf | Bin 190920 -> 190296 bytes
+ .../Comfortaa-Regular-new.drop-hints.61,62,63.ttf  | Bin 3424 -> 3100 bytes
+ .../Comfortaa-Regular-new.drop-hints.61,63.ttf     | Bin 3128 -> 2792 bytes
+ .../basics/Comfortaa-Regular-new.drop-hints.61.ttf | Bin 2800 -> 2472 bytes
+ ...Regular-new.drop-hints.retain-all-codepoint.ttf | Bin 190908 -> 190252 bytes
+ .../basics/Comfortaa-Regular-new.gids.61,62,63.ttf | Bin 9036 -> 8580 bytes
+ .../basics/Comfortaa-Regular-new.gids.61,63.ttf    | Bin 8668 -> 8220 bytes
+ .../basics/Comfortaa-Regular-new.gids.61.ttf       | Bin 8304 -> 7848 bytes
+ .../basics/Comfortaa-Regular-new.gids.62.ttf       | Bin 8236 -> 7772 bytes
+ .../basics/Comfortaa-Regular-new.gids.63.ttf       | Bin 8220 -> 7776 bytes
+ ...ortaa-Regular-new.gids.retain-all-codepoint.ttf | Bin 222212 -> 221524 bytes
+ ...gular-new.keep-all-layout-features.61,62,63.ttf | Bin 0 -> 8100 bytes
+ ...-Regular-new.keep-all-layout-features.61,63.ttf | Bin 0 -> 7736 bytes
+ ...taa-Regular-new.keep-all-layout-features.61.ttf | Bin 0 -> 7360 bytes
+ ...taa-Regular-new.keep-all-layout-features.62.ttf | Bin 0 -> 6796 bytes
+ ...taa-Regular-new.keep-all-layout-features.63.ttf | Bin 0 -> 6844 bytes
+ ...ep-all-layout-features.retain-all-codepoint.ttf | Bin 0 -> 222212 bytes
+ ...fortaa-Regular-new.layout-features.61,62,63.ttf | Bin 0 -> 7652 bytes
+ ...Comfortaa-Regular-new.layout-features.61,63.ttf | Bin 0 -> 7284 bytes
+ .../Comfortaa-Regular-new.layout-features.61.ttf   | Bin 0 -> 6920 bytes
+ .../Comfortaa-Regular-new.layout-features.62.ttf   | Bin 0 -> 6796 bytes
+ .../Comfortaa-Regular-new.layout-features.63.ttf   | Bin 0 -> 6844 bytes
+ ...ar-new.layout-features.retain-all-codepoint.ttf | Bin 0 -> 219716 bytes
+ .../Comfortaa-Regular-new.name-ids.61,62,63.ttf    | Bin 7840 -> 7392 bytes
+ .../Comfortaa-Regular-new.name-ids.61,63.ttf       | Bin 7476 -> 7024 bytes
+ .../basics/Comfortaa-Regular-new.name-ids.61.ttf   | Bin 7100 -> 6660 bytes
+ ...a-Regular-new.name-ids.retain-all-codepoint.ttf | Bin 221952 -> 221264 bytes
+ ...mfortaa-Regular-new.name-languages.61,62,63.ttf | Bin 8100 -> 7652 bytes
+ .../Comfortaa-Regular-new.name-languages.61,63.ttf | Bin 7736 -> 7284 bytes
+ .../Comfortaa-Regular-new.name-languages.61.ttf    | Bin 7360 -> 6920 bytes
+ ...lar-new.name-languages.retain-all-codepoint.ttf | Bin 222212 -> 221524 bytes
+ .../Comfortaa-Regular-new.name-legacy.61,62,63.ttf | Bin 8100 -> 7652 bytes
+ .../Comfortaa-Regular-new.name-legacy.61,63.ttf    | Bin 7736 -> 7284 bytes
+ .../Comfortaa-Regular-new.name-legacy.61.ttf       | Bin 7360 -> 6920 bytes
+ ...egular-new.name-legacy.retain-all-codepoint.ttf | Bin 222212 -> 221524 bytes
+ .../Comfortaa-Regular-new.retain-gids.61,62,63.ttf | Bin 11688 -> 9656 bytes
+ .../Comfortaa-Regular-new.retain-gids.61,63.ttf    | Bin 11320 -> 9300 bytes
+ .../Comfortaa-Regular-new.retain-gids.61.ttf       | Bin 10952 -> 8668 bytes
+ ...egular-new.retain-gids.retain-all-codepoint.ttf | Bin 222224 -> 221568 bytes
+ ...ar-subset.keep-all-layout-features.61,62,63.ttf | Bin 0 -> 4128 bytes
+ ...gular-subset.keep-all-layout-features.61,63.ttf | Bin 0 -> 3580 bytes
+ ...-Regular-subset.keep-all-layout-features.61.ttf | Bin 0 -> 3156 bytes
+ ...-Regular-subset.keep-all-layout-features.62.ttf | Bin 0 -> 3180 bytes
+ ...-Regular-subset.keep-all-layout-features.63.ttf | Bin 0 -> 3048 bytes
+ ...ep-all-layout-features.retain-all-codepoint.ttf | Bin 0 -> 9524 bytes
+ ...gjo-Regular-subset.layout-features.61,62,63.ttf | Bin 0 -> 4128 bytes
+ ...eongjo-Regular-subset.layout-features.61,63.ttf | Bin 0 -> 3580 bytes
+ ...mMyeongjo-Regular-subset.layout-features.61.ttf | Bin 0 -> 3156 bytes
+ ...mMyeongjo-Regular-subset.layout-features.62.ttf | Bin 0 -> 3180 bytes
+ ...mMyeongjo-Regular-subset.layout-features.63.ttf | Bin 0 -> 3048 bytes
+ ...subset.layout-features.retain-all-codepoint.ttf | Bin 0 -> 9524 bytes
+ ...gular.abc.keep-all-layout-features.61,62,63.ttf | Bin 0 -> 2452 bytes
+ ...-Regular.abc.keep-all-layout-features.61,63.ttf | Bin 0 -> 2260 bytes
+ ...oto-Regular.abc.keep-all-layout-features.61.ttf | Bin 0 -> 2048 bytes
+ ...oto-Regular.abc.keep-all-layout-features.62.ttf | Bin 0 -> 1916 bytes
+ ...oto-Regular.abc.keep-all-layout-features.63.ttf | Bin 0 -> 1972 bytes
+ ...ep-all-layout-features.retain-all-codepoint.ttf | Bin 0 -> 2452 bytes
+ ...Roboto-Regular.abc.layout-features.61,62,63.ttf | Bin 0 -> 2452 bytes
+ .../Roboto-Regular.abc.layout-features.61,63.ttf   | Bin 0 -> 2260 bytes
+ .../Roboto-Regular.abc.layout-features.61.ttf      | Bin 0 -> 2048 bytes
+ .../Roboto-Regular.abc.layout-features.62.ttf      | Bin 0 -> 1916 bytes
+ .../Roboto-Regular.abc.layout-features.63.ttf      | Bin 0 -> 1972 bytes
+ ...ar.abc.layout-features.retain-all-codepoint.ttf | Bin 0 -> 2452 bytes
+ ...eSansPro-Regular.default.1FC,21,41,20,62,63.otf | Bin 4192 -> 2580 bytes
+ .../SourceSansPro-Regular.default.61,62,63.otf     | Bin 3856 -> 2216 bytes
+ ...ourceSansPro-Regular.default.D7,D8,D9,DA,DE.otf | Bin 3144 -> 2328 bytes
+ ...subroutinize-retain-gids.1FC,21,41,20,62,63.otf | Bin 30788 -> 20232 bytes
+ ...Regular.desubroutinize-retain-gids.61,62,63.otf | Bin 30908 -> 2316 bytes
+ ...r.desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf | Bin 31336 -> 30540 bytes
+ ...o-Regular.desubroutinize.1FC,21,41,20,62,63.otf | Bin 3968 -> 2436 bytes
+ ...urceSansPro-Regular.desubroutinize.61,62,63.otf | Bin 3556 -> 2120 bytes
+ ...nsPro-Regular.desubroutinize.D7,D8,D9,DA,DE.otf | Bin 3168 -> 2312 bytes
+ ...subroutinize-retain-gids.1FC,21,41,20,62,63.otf | Bin 30488 -> 20064 bytes
+ ...p-hints-desubroutinize-retain-gids.61,62,63.otf | Bin 30668 -> 2192 bytes
+ ...s-desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf | Bin 31124 -> 30372 bytes
+ ...rop-hints-desubroutinize.1FC,21,41,20,62,63.otf | Bin 3668 -> 2268 bytes
+ ...-Regular.drop-hints-desubroutinize.61,62,63.otf | Bin 3320 -> 1996 bytes
+ ...ar.drop-hints-desubroutinize.D7,D8,D9,DA,DE.otf | Bin 2952 -> 2148 bytes
+ ...r.drop-hints-retain-gids.1FC,21,41,20,62,63.otf | Bin 30624 -> 20156 bytes
+ ...Pro-Regular.drop-hints-retain-gids.61,62,63.otf | Bin 30888 -> 2228 bytes
+ ...gular.drop-hints-retain-gids.D7,D8,D9,DA,DE.otf | Bin 31104 -> 30384 bytes
+ ...nsPro-Regular.drop-hints.1FC,21,41,20,62,63.otf | Bin 3808 -> 2352 bytes
+ .../SourceSansPro-Regular.drop-hints.61,62,63.otf  | Bin 3524 -> 2060 bytes
+ ...ceSansPro-Regular.drop-hints.D7,D8,D9,DA,DE.otf | Bin 2932 -> 2164 bytes
+ ...sPro-Regular.retain-gids.1FC,21,41,20,62,63.otf | Bin 31012 -> 20384 bytes
+ .../SourceSansPro-Regular.retain-gids.61,62,63.otf | Bin 31208 -> 2384 bytes
+ ...eSansPro-Regular.retain-gids.D7,D8,D9,DA,DE.otf | Bin 31312 -> 30556 bytes
+ .../Roboto-Regular.default.1FC,21,41,20,62,63.ttf  | Bin 4656 -> 3276 bytes
+ .../full-font/Roboto-Regular.default.61,62,63.ttf  | Bin 3904 -> 2864 bytes
+ .../Roboto-Regular.default.D7,D8,D9,DA,DE.ttf      | Bin 3976 -> 3216 bytes
+ ...oboto-Regular.drop-hints.1FC,21,41,20,62,63.ttf | Bin 2532 -> 1712 bytes
+ .../Roboto-Regular.drop-hints.61,62,63.ttf         | Bin 2116 -> 1496 bytes
+ .../Roboto-Regular.drop-hints.D7,D8,D9,DA,DE.ttf   | Bin 2184 -> 1728 bytes
+ ...ifVariable-Roman.default.1FC,21,41,20,62,63.ttf | Bin 6876 -> 4144 bytes
+ .../SourceSerifVariable-Roman.default.61,62,63.ttf | Bin 6552 -> 3984 bytes
+ ...eSerifVariable-Roman.default.D7,D8,D9,DA,DE.ttf | Bin 6136 -> 4548 bytes
+ ...ariable-Roman.drop-hints.1FC,21,41,20,62,63.ttf | Bin 6832 -> 4120 bytes
+ ...urceSerifVariable-Roman.drop-hints.61,62,63.ttf | Bin 6552 -> 3984 bytes
+ ...rifVariable-Roman.drop-hints.D7,D8,D9,DA,DE.ttf | Bin 6136 -> 4548 bytes
+ ...text1_multiple_subrules_f1.default.41,42,43.otf | Bin 1440 -> 1328 bytes
+ ...context1_multiple_subrules_f1.default.41,42.otf | Bin 1324 -> 1228 bytes
+ ...le_subrules_f1.default.retain-all-codepoint.otf | Bin 3812 -> 3700 bytes
+ ...1_multiple_subrules_f1.retain-gids.41,42,43.otf | Bin 2140 -> 2028 bytes
+ ...ext1_multiple_subrules_f1.retain-gids.41,42.otf | Bin 2028 -> 1932 bytes
+ ...ubrules_f1.retain-gids.retain-all-codepoint.otf | Bin 3812 -> 3700 bytes
+ ...text2_multiple_subrules_f1.default.41,42,43.otf | Bin 1456 -> 1328 bytes
+ ...context2_multiple_subrules_f1.default.41,42.otf | Bin 1336 -> 1228 bytes
+ ...le_subrules_f1.default.retain-all-codepoint.otf | Bin 3828 -> 3700 bytes
+ ...2_multiple_subrules_f1.retain-gids.41,42,43.otf | Bin 2156 -> 2028 bytes
+ ...ext2_multiple_subrules_f1.retain-gids.41,42.otf | Bin 2040 -> 1932 bytes
+ ...ubrules_f1.retain-gids.retain-all-codepoint.otf | Bin 3828 -> 3700 bytes
+ .../gpos_context3_simple_f1.default.41,42,43.otf   | Bin 1420 -> 1308 bytes
+ ...ext3_simple_f1.default.retain-all-codepoint.otf | Bin 3792 -> 3680 bytes
+ ...pos_context3_simple_f1.retain-gids.41,42,43.otf | Bin 2120 -> 2008 bytes
+ ..._simple_f1.retain-gids.retain-all-codepoint.otf | Bin 3792 -> 3680 bytes
+ .../AdobeVFPrototype.default.41,42,43,57.otf       | Bin 5460 -> 5440 bytes
+ .../AdobeVFPrototype.default.41,42,43.otf          | Bin 4932 -> 4908 bytes
+ .../AdobeVFPrototype.default.41,42.otf             | Bin 4452 -> 4432 bytes
+ .../AdobeVFPrototype.default.41,56,57.otf          | Bin 4600 -> 4576 bytes
+ .../AdobeVFPrototype.default.41.otf                | Bin 3748 -> 3728 bytes
+ .../AdobeVFPrototype.default.42,57.otf             | Bin 4584 -> 4564 bytes
+ .../AdobeVFPrototype.drop-hints.41,42,43,57.otf    | Bin 5272 -> 5252 bytes
+ .../AdobeVFPrototype.drop-hints.41,42,43.otf       | Bin 4744 -> 4720 bytes
+ .../AdobeVFPrototype.drop-hints.41,42.otf          | Bin 4264 -> 4244 bytes
+ .../AdobeVFPrototype.drop-hints.41,56,57.otf       | Bin 4408 -> 4384 bytes
+ .../AdobeVFPrototype.drop-hints.41.otf             | Bin 3560 -> 3540 bytes
+ .../AdobeVFPrototype.drop-hints.42,57.otf          | Bin 4396 -> 4376 bytes
+ ...AdobeVFPrototype.keep-gdef-gpos.41,42,43,57.otf | Bin 5460 -> 5440 bytes
+ .../AdobeVFPrototype.keep-gdef-gpos.41,42,43.otf   | Bin 4932 -> 4908 bytes
+ .../AdobeVFPrototype.keep-gdef-gpos.41,42.otf      | Bin 4452 -> 4432 bytes
+ .../AdobeVFPrototype.keep-gdef-gpos.41,56,57.otf   | Bin 4600 -> 4576 bytes
+ .../AdobeVFPrototype.keep-gdef-gpos.41.otf         | Bin 3748 -> 3728 bytes
+ .../AdobeVFPrototype.keep-gdef-gpos.42,57.otf      | Bin 4584 -> 4564 bytes
+ .../Roboto-Regular.default.41,42,43.ttf            | Bin 3668 -> 2764 bytes
+ .../Roboto-Regular.drop-hints.41,42,43.ttf         | Bin 2036 -> 1472 bytes
+ .../Roboto-Regular.keep-gdef-gpos.41,42,43.ttf     | Bin 3668 -> 2764 bytes
+ .../layout.gpos/gpos1_2_font.default.41,43.otf     | Bin 1352 -> 1292 bytes
+ .../layout.gpos/gpos1_2_font.default.41,46.otf     | Bin 1484 -> 1424 bytes
+ .../layout.gpos/gpos1_2_font.default.41.otf        | Bin 1232 -> 1176 bytes
+ .../layout.gpos/gpos1_2_font.default.43,46.otf     | Bin 1348 -> 1288 bytes
+ .../gpos1_2_font.default.retain-all-codepoint.otf  | Bin 3668 -> 3604 bytes
+ .../layout.gpos/gpos1_2_font.retain-gids.41,43.otf | Bin 2068 -> 2008 bytes
+ .../layout.gpos/gpos1_2_font.retain-gids.41,46.otf | Bin 2232 -> 2172 bytes
+ .../layout.gpos/gpos1_2_font.retain-gids.41.otf    | Bin 1932 -> 1876 bytes
+ .../layout.gpos/gpos1_2_font.retain-gids.43,46.otf | Bin 2096 -> 2036 bytes
+ ...os1_2_font.retain-gids.retain-all-codepoint.otf | Bin 3668 -> 3604 bytes
+ .../gpos2_1_font7.default.21,23,25.otf             | Bin 1428 -> 1360 bytes
+ .../layout.gpos2/gpos2_1_font7.default.21,23.otf   | Bin 1308 -> 1240 bytes
+ .../gpos2_1_font7.default.retain-all-codepoint.otf | Bin 3688 -> 3604 bytes
+ .../gpos2_1_font7.retain-gids.21,23,25.otf         | Bin 1764 -> 1696 bytes
+ .../gpos2_1_font7.retain-gids.21,23.otf            | Bin 1632 -> 1564 bytes
+ ...s2_1_font7.retain-gids.retain-all-codepoint.otf | Bin 3688 -> 3604 bytes
+ .../gpos2_2_font5.default.21,23,25.otf             | Bin 1480 -> 1360 bytes
+ .../layout.gpos2/gpos2_2_font5.default.21,23.otf   | Bin 1360 -> 1240 bytes
+ .../gpos2_2_font5.default.retain-all-codepoint.otf | Bin 3724 -> 3604 bytes
+ .../gpos2_2_font5.retain-gids.21,23,25.otf         | Bin 1816 -> 1696 bytes
+ .../gpos2_2_font5.retain-gids.21,23.otf            | Bin 1684 -> 1564 bytes
+ ...s2_2_font5.retain-gids.retain-all-codepoint.otf | Bin 3724 -> 3604 bytes
+ .../layout.gpos3/gpos3_font3.default.28,29.otf     | Bin 1328 -> 1248 bytes
+ .../layout.gpos3/gpos3_font3.default.28,2B.otf     | Bin 1456 -> 1376 bytes
+ .../layout.gpos3/gpos3_font3.default.29,2B.otf     | Bin 1368 -> 1292 bytes
+ .../gpos3_font3.default.retain-all-codepoint.otf   | Bin 3728 -> 3636 bytes
+ .../layout.gpos3/gpos3_font3.retain-gids.28,29.otf | Bin 1712 -> 1632 bytes
+ .../layout.gpos3/gpos3_font3.retain-gids.28,2B.otf | Bin 1860 -> 1780 bytes
+ .../layout.gpos3/gpos3_font3.retain-gids.29,2B.otf | Bin 1772 -> 1696 bytes
+ ...pos3_font3.retain-gids.retain-all-codepoint.otf | Bin 3728 -> 3636 bytes
+ ...pos4_multiple_anchors_1.default.41,42,43,44.otf | Bin 1640 -> 1516 bytes
+ ...pos4_multiple_anchors_1.default.41,42,43,45.otf | Bin 1632 -> 1524 bytes
+ .../gpos4_multiple_anchors_1.default.41,42,43.otf  | Bin 1404 -> 1308 bytes
+ ...4_multiple_anchors_1.default.41,43,44,45,46.otf | Bin 1992 -> 1864 bytes
+ .../gpos4_multiple_anchors_1.default.41,43,44.otf  | Bin 1632 -> 1524 bytes
+ .../gpos4_multiple_anchors_1.default.41,43,45.otf  | Bin 1632 -> 1532 bytes
+ .../gpos4_multiple_anchors_1.default.41,43.otf     | Bin 1400 -> 1312 bytes
+ ...iple_anchors_1.default.retain-all-codepoint.otf | Bin 3816 -> 3668 bytes
+ ..._multiple_anchors_1.retain-gids.41,42,43,44.otf | Bin 2344 -> 2220 bytes
+ ..._multiple_anchors_1.retain-gids.41,42,43,45.otf | Bin 2352 -> 2244 bytes
+ ...os4_multiple_anchors_1.retain-gids.41,42,43.otf | Bin 2104 -> 2008 bytes
+ ...ltiple_anchors_1.retain-gids.41,43,44,45,46.otf | Bin 2712 -> 2584 bytes
+ ...os4_multiple_anchors_1.retain-gids.41,43,44.otf | Bin 2348 -> 2240 bytes
+ ...os4_multiple_anchors_1.retain-gids.41,43,45.otf | Bin 2360 -> 2260 bytes
+ .../gpos4_multiple_anchors_1.retain-gids.41,43.otf | Bin 2116 -> 2028 bytes
+ ..._anchors_1.retain-gids.retain-all-codepoint.otf | Bin 3816 -> 3668 bytes
+ .../gpos5_font1.default.41,42,43,44.otf            | Bin 1668 -> 1536 bytes
+ .../gpos5_font1.default.41,42,43,45.otf            | Bin 1660 -> 1544 bytes
+ .../layout.gpos5/gpos5_font1.default.41,42,43.otf  | Bin 1432 -> 1328 bytes
+ .../layout.gpos5/gpos5_font1.default.41,42,44.otf  | Bin 1588 -> 1460 bytes
+ .../layout.gpos5/gpos5_font1.default.41,42,45.otf  | Bin 1560 -> 1448 bytes
+ .../layout.gpos5/gpos5_font1.default.41,42.otf     | Bin 1328 -> 1228 bytes
+ .../gpos5_font1.default.retain-all-codepoint.otf   | Bin 3884 -> 3688 bytes
+ .../gpos5_font1.retain-gids.41,42,43,44.otf        | Bin 2372 -> 2240 bytes
+ .../gpos5_font1.retain-gids.41,42,43,45.otf        | Bin 2380 -> 2264 bytes
+ .../gpos5_font1.retain-gids.41,42,43.otf           | Bin 2132 -> 2028 bytes
+ .../gpos5_font1.retain-gids.41,42,44.otf           | Bin 2304 -> 2176 bytes
+ .../gpos5_font1.retain-gids.41,42,45.otf           | Bin 2284 -> 2172 bytes
+ .../layout.gpos5/gpos5_font1.retain-gids.41,42.otf | Bin 2032 -> 1932 bytes
+ ...pos5_font1.retain-gids.retain-all-codepoint.otf | Bin 3884 -> 3688 bytes
+ .../gpos6_font1.default.41,42,43,44.otf            | Bin 1616 -> 1492 bytes
+ .../gpos6_font1.default.41,42,43,45.otf            | Bin 1608 -> 1500 bytes
+ .../layout.gpos6/gpos6_font1.default.41,42,43.otf  | Bin 1380 -> 1284 bytes
+ .../gpos6_font1.default.41,43,44,45,46.otf         | Bin 1968 -> 1840 bytes
+ .../layout.gpos6/gpos6_font1.default.41,43,44.otf  | Bin 1608 -> 1500 bytes
+ .../layout.gpos6/gpos6_font1.default.41,43,45.otf  | Bin 1608 -> 1508 bytes
+ .../layout.gpos6/gpos6_font1.default.41,43.otf     | Bin 1376 -> 1288 bytes
+ .../gpos6_font1.default.retain-all-codepoint.otf   | Bin 3792 -> 3644 bytes
+ .../gpos6_font1.retain-gids.41,42,43,44.otf        | Bin 2320 -> 2196 bytes
+ .../gpos6_font1.retain-gids.41,42,43,45.otf        | Bin 2328 -> 2220 bytes
+ .../gpos6_font1.retain-gids.41,42,43.otf           | Bin 2080 -> 1984 bytes
+ .../gpos6_font1.retain-gids.41,43,44,45,46.otf     | Bin 2688 -> 2560 bytes
+ .../gpos6_font1.retain-gids.41,43,44.otf           | Bin 2324 -> 2216 bytes
+ .../gpos6_font1.retain-gids.41,43,45.otf           | Bin 2336 -> 2236 bytes
+ .../layout.gpos6/gpos6_font1.retain-gids.41,43.otf | Bin 2092 -> 2004 bytes
+ ...pos6_font1.retain-gids.retain-all-codepoint.otf | Bin 3792 -> 3644 bytes
+ ...ular.default.627,644,623,62D,644,627,645,2E.ttf | Bin 13288 -> 12724 bytes
+ .../Amiri-Regular.default.627,644,62D,628.ttf      | Bin 10188 -> 10028 bytes
+ .../Amiri-Regular.default.627,644.ttf              | Bin 4364 -> 4208 bytes
+ ...-Regular.default.633,645,627,621,20,644,627.ttf | Bin 10324 -> 9552 bytes
+ .../Amiri-Regular.default.63A,64A,631.ttf          | Bin 7824 -> 7360 bytes
+ ....retain-gids.627,644,623,62D,644,627,645,2E.ttf | Bin 48596 -> 48052 bytes
+ .../Amiri-Regular.retain-gids.627,644,62D,628.ttf  | Bin 42836 -> 42676 bytes
+ .../Amiri-Regular.retain-gids.627,644.ttf          | Bin 36892 -> 36736 bytes
+ ...ular.retain-gids.633,645,627,621,20,644,627.ttf | Bin 46680 -> 45944 bytes
+ .../Amiri-Regular.retain-gids.63A,64A,631.ttf      | Bin 42896 -> 38024 bytes
+ ...g1_multiple_subrules_f1.default.30,31,32,33.otf | Bin 1944 -> 1840 bytes
+ ...le_subrules_f1.default.retain-all-codepoint.otf | Bin 3832 -> 3704 bytes
+ ...ultiple_subrules_f1.retain-gids.30,31,32,33.otf | Bin 2408 -> 2304 bytes
+ ...ubrules_f1.retain-gids.retain-all-codepoint.otf | Bin 3832 -> 3704 bytes
+ ...g2_multiple_subrules_f1.default.30,31,32,33.otf | Bin 1964 -> 1840 bytes
+ ...le_subrules_f1.default.retain-all-codepoint.otf | Bin 3864 -> 3704 bytes
+ ...ultiple_subrules_f1.retain-gids.30,31,32,33.otf | Bin 2428 -> 2304 bytes
+ ...ubrules_f1.retain-gids.retain-all-codepoint.otf | Bin 3864 -> 3704 bytes
+ ...pos_chaining3_simple_f1.default.30,31,32,33.otf | Bin 1936 -> 1816 bytes
+ ...ing3_simple_f1.default.retain-all-codepoint.otf | Bin 3800 -> 3680 bytes
+ ...chaining3_simple_f1.retain-gids.30,31,32,33.otf | Bin 2400 -> 2280 bytes
+ ..._simple_f1.retain-gids.retain-all-codepoint.otf | Bin 3800 -> 3680 bytes
+ .../layout.gpos9/gpos9_font2.default.41,42.otf     | Bin 1272 -> 1184 bytes
+ .../layout.gpos9/gpos9_font2.default.41.otf        | Bin 1236 -> 1172 bytes
+ .../layout.gpos9/gpos9_font2.default.42.otf        | Bin 1096 -> 1032 bytes
+ .../layout.gpos9/gpos9_font2.retain-gids.41,42.otf | Bin 1976 -> 1888 bytes
+ .../layout.gpos9/gpos9_font2.retain-gids.41.otf    | Bin 1936 -> 1872 bytes
+ .../layout.gpos9/gpos9_font2.retain-gids.42.otf    | Bin 1808 -> 1744 bytes
+ ...ub_alternate_substitution.default.53A9,53F1.otf | Bin 4984 -> 4348 bytes
+ .../gsub_alternate_substitution.default.53A9.otf   | Bin 4524 -> 3904 bytes
+ .../gsub_alternate_substitution.default.53F1.otf   | Bin 2816 -> 2452 bytes
+ ...e_substitution.default.retain-all-codepoint.otf | Bin 6728 -> 6040 bytes
+ ...lternate_substitution.retain-gids.53A9,53F1.otf | Bin 5108 -> 4472 bytes
+ ...sub_alternate_substitution.retain-gids.53A9.otf | Bin 4676 -> 4056 bytes
+ ...sub_alternate_substitution.retain-gids.53F1.otf | Bin 3012 -> 2648 bytes
+ ...bstitution.retain-gids.retain-all-codepoint.otf | Bin 6820 -> 6132 bytes
+ ...text1_multiple_subrules_f2.default.41,42,43.otf | Bin 1460 -> 1340 bytes
+ ...context1_multiple_subrules_f2.default.41,42.otf | Bin 1420 -> 1240 bytes
+ ...le_subrules_f2.default.retain-all-codepoint.otf | Bin 3808 -> 3712 bytes
+ ...1_multiple_subrules_f2.retain-gids.41,42,43.otf | Bin 2248 -> 2040 bytes
+ ...ext1_multiple_subrules_f2.retain-gids.41,42.otf | Bin 2224 -> 1944 bytes
+ ...ubrules_f2.retain-gids.retain-all-codepoint.otf | Bin 3808 -> 3712 bytes
+ ...text2_multiple_subrules_f2.default.41,42,43.otf | Bin 1476 -> 1340 bytes
+ ...context2_multiple_subrules_f2.default.41,42.otf | Bin 1432 -> 1240 bytes
+ ...le_subrules_f2.default.retain-all-codepoint.otf | Bin 3824 -> 3712 bytes
+ ...2_multiple_subrules_f2.retain-gids.41,42,43.otf | Bin 2264 -> 2040 bytes
+ ...ext2_multiple_subrules_f2.retain-gids.41,42.otf | Bin 2236 -> 1944 bytes
+ ...ubrules_f2.retain-gids.retain-all-codepoint.otf | Bin 3824 -> 3712 bytes
+ ..._successive_f1.default.retain-all-codepoint.otf | Bin 3828 -> 3700 bytes
+ ...cessive_f1.retain-gids.retain-all-codepoint.otf | Bin 3828 -> 3700 bytes
+ ...g1_multiple_subrules_f1.default.30,31,32,33.otf | Bin 1916 -> 1852 bytes
+ ...le_subrules_f1.default.retain-all-codepoint.otf | Bin 3804 -> 3716 bytes
+ ...ultiple_subrules_f1.retain-gids.30,31,32,33.otf | Bin 2380 -> 2316 bytes
+ ...ubrules_f1.retain-gids.retain-all-codepoint.otf | Bin 3804 -> 3716 bytes
+ ...g2_multiple_subrules_f1.default.30,31,32,33.otf | Bin 1944 -> 1852 bytes
+ ...le_subrules_f1.default.retain-all-codepoint.otf | Bin 3836 -> 3716 bytes
+ ...ultiple_subrules_f1.retain-gids.30,31,32,33.otf | Bin 2408 -> 2316 bytes
+ ...ubrules_f1.retain-gids.retain-all-codepoint.otf | Bin 3836 -> 3716 bytes
+ ...sub_chaining3_simple_f2.default.30,31,32,33.otf | Bin 1904 -> 1828 bytes
+ ...ing3_simple_f2.default.retain-all-codepoint.otf | Bin 3772 -> 3692 bytes
+ ...chaining3_simple_f2.retain-gids.30,31,32,33.otf | Bin 2368 -> 2292 bytes
+ ..._simple_f2.retain-gids.retain-all-codepoint.otf | Bin 3772 -> 3692 bytes
+ ..._created.default.41,42,43,44,45,46,47,48,49.otf | Bin 2384 -> 2176 bytes
+ ...nually_created.default.41,42,43,44,45,46,47.otf | Bin 1996 -> 1888 bytes
+ ...nually_created.default.41,42,43,44,45,46,4D.otf | Bin 1996 -> 1852 bytes
+ ...nually_created.default.41,42,43,44,45,46,51.otf | Bin 2044 -> 1932 bytes
+ .../gsub8_manually_created.default.61.otf          | Bin 1540 -> 1224 bytes
+ ...nually_created.default.retain-all-codepoint.otf | Bin 3832 -> 3656 bytes
+ ...ated.retain-gids.41,42,43,44,45,46,47,48,49.otf | Bin 3172 -> 2884 bytes
+ ...ly_created.retain-gids.41,42,43,44,45,46,47.otf | Bin 2796 -> 2596 bytes
+ ...ly_created.retain-gids.41,42,43,44,45,46,4D.otf | Bin 2860 -> 2636 bytes
+ ...ly_created.retain-gids.41,42,43,44,45,46,51.otf | Bin 2864 -> 2760 bytes
+ .../gsub8_manually_created.retain-gids.61.otf      | Bin 2584 -> 2276 bytes
+ ...ly_created.retain-gids.retain-all-codepoint.otf | Bin 3832 -> 3656 bytes
+ .../Roboto-Regular.smallcaps.default.41,42,43.ttf  | Bin 3028 -> 2464 bytes
+ .../Roboto-Regular.smallcaps.default.41,43.ttf     | Bin 2628 -> 2284 bytes
+ .../layout/Roboto-Regular.smallcaps.default.41.ttf | Bin 2252 -> 2084 bytes
+ .../layout/Roboto-Regular.smallcaps.default.43.ttf | Bin 2324 -> 2116 bytes
+ .../Roboto-Regular.smallcaps.default.CA,CB.ttf     | Bin 2668 -> 2388 bytes
+ ...boto-Regular.smallcaps.retain-gids.41,42,43.ttf | Bin 6844 -> 2716 bytes
+ .../Roboto-Regular.smallcaps.retain-gids.41,43.ttf | Bin 6472 -> 2548 bytes
+ .../Roboto-Regular.smallcaps.retain-gids.41.ttf    | Bin 6096 -> 2336 bytes
+ .../Roboto-Regular.smallcaps.retain-gids.43.ttf    | Bin 6152 -> 2384 bytes
+ .../Roboto-Regular.smallcaps.retain-gids.CA,CB.ttf | Bin 7996 -> 6476 bytes
+ .../variable/Fraunces.default.26,66,69,124,125.ttf | Bin 18448 -> 15912 bytes
+ .../data/expected/variable/Fraunces.default.61.ttf | Bin 5880 -> 4348 bytes
+ .../data/profiles/keep-all-layout-features.txt     |   1 +
+ test/subset/data/profiles/layout-features.txt      |   1 +
+ test/subset/data/tests/basics.tests                |   2 +
+ test/subset/generate-expected-outputs.py           |   1 -
+ util/options-subset.cc                             |  53 ++++++++
+ 314 files changed, 233 insertions(+), 69 deletions(-)
+
+commit 0989b5553af0e252d7201da9bf762d2f68fade9e
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue May 18 17:12:50 2021 -0700
+
+    [subset] Add test for overlaps flag setting.
+
+ test/api/fonts/Roboto-Regular.abcAE.ttf | Bin 0 -> 7224 bytes
+ test/api/fonts/Roboto-Regular.bAE.ttf   | Bin 0 -> 6732 bytes
+ test/api/test-subset-glyf.c             |  26 ++++++++++++++++++++++++++
+ 3 files changed, 26 insertions(+)
+
+commit 73ff04a324c3ac721bbebd2a7817dbe819c351fa
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue May 18 16:54:01 2021 -0700
+
+    [subset] add option to have the subsetter set the mac overlaps flag on each glyph.
+
+ src/hb-ot-glyf-table.hh | 50 +++++++++++++++++++++++++++++++++++++++++--------
+ src/hb-subset-input.cc  | 14 ++++++++++++++
+ src/hb-subset-input.hh  |  1 +
+ src/hb-subset-plan.cc   |  3 ++-
+ src/hb-subset-plan.hh   |  1 +
+ src/hb-subset.h         |  7 +++++++
+ util/options-subset.cc  |  3 ++-
+ 7 files changed, 69 insertions(+), 10 deletions(-)
+
+commit f739e1dc6a875d092d94bcc906d1604887729eac
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Tue May 11 11:44:32 2021 -0700
+
+    [subset] subset both CPAL and COLRv1
+
+ src/hb-ot-color-colr-table.hh                      |  69 +++++++++--
+ src/hb-ot-color-cpal-table.hh                      | 131 ++++++++++++++++++++-
+ src/hb-subset-plan.cc                              |  28 ++++-
+ src/hb-subset-plan.hh                              |   2 +-
+ src/hb-subset.cc                                   |   2 +
+ .../TwemojiMozilla.subset.default.32,3299.ttf      | Bin 5264 -> 1576 bytes
+ .../api/fonts/TwemojiMozilla.subset.default.32.ttf | Bin 4660 -> 932 bytes
+ .../fonts/TwemojiMozilla.subset.default.3297.ttf   | Bin 5068 -> 1376 bytes
+ test/api/fonts/TwemojiMozilla.subset.ttf           | Bin 5712 -> 1936 bytes
+ .../TwemojiMozilla.subset.default.32,3297,3299.ttf | Bin 5712 -> 1936 bytes
+ .../colr/TwemojiMozilla.subset.default.32,3297.ttf | Bin 5176 -> 1400 bytes
+ .../colr/TwemojiMozilla.subset.default.32,3299.ttf | Bin 5352 -> 1576 bytes
+ .../colr/TwemojiMozilla.subset.default.32.ttf      | Bin 4748 -> 932 bytes
+ .../TwemojiMozilla.subset.default.3297,3299.ttf    | Bin 5692 -> 1916 bytes
+ .../colr/TwemojiMozilla.subset.default.3297.ttf    | Bin 5152 -> 1376 bytes
+ .../colr/TwemojiMozilla.subset.default.3299.ttf    | Bin 5328 -> 1552 bytes
+ ....subset.drop-hints-retain-gids.32,3297,3299.ttf | Bin 5692 -> 1916 bytes
+ ...zilla.subset.drop-hints-retain-gids.32,3297.ttf | Bin 5172 -> 1396 bytes
+ ...zilla.subset.drop-hints-retain-gids.32,3299.ttf | Bin 5352 -> 1576 bytes
+ ...ojiMozilla.subset.drop-hints-retain-gids.32.ttf | Bin 4728 -> 912 bytes
+ ...lla.subset.drop-hints-retain-gids.3297,3299.ttf | Bin 5676 -> 1900 bytes
+ ...iMozilla.subset.drop-hints-retain-gids.3297.ttf | Bin 5148 -> 1372 bytes
+ ...iMozilla.subset.drop-hints-retain-gids.3299.ttf | Bin 5328 -> 1552 bytes
+ ...emojiMozilla.subset.drop-hints.32,3297,3299.ttf | Bin 5692 -> 1916 bytes
+ .../TwemojiMozilla.subset.drop-hints.32,3297.ttf   | Bin 5156 -> 1380 bytes
+ .../TwemojiMozilla.subset.drop-hints.32,3299.ttf   | Bin 5332 -> 1556 bytes
+ .../colr/TwemojiMozilla.subset.drop-hints.32.ttf   | Bin 4728 -> 912 bytes
+ .../TwemojiMozilla.subset.drop-hints.3297,3299.ttf | Bin 5672 -> 1896 bytes
+ .../colr/TwemojiMozilla.subset.drop-hints.3297.ttf | Bin 5132 -> 1356 bytes
+ .../colr/TwemojiMozilla.subset.drop-hints.3299.ttf | Bin 5308 -> 1532 bytes
+ ...mojiMozilla.subset.retain-gids.32,3297,3299.ttf | Bin 5712 -> 1936 bytes
+ .../TwemojiMozilla.subset.retain-gids.32,3297.ttf  | Bin 5192 -> 1416 bytes
+ .../TwemojiMozilla.subset.retain-gids.32,3299.ttf  | Bin 5372 -> 1596 bytes
+ .../colr/TwemojiMozilla.subset.retain-gids.32.ttf  | Bin 4748 -> 932 bytes
+ ...TwemojiMozilla.subset.retain-gids.3297,3299.ttf | Bin 5696 -> 1920 bytes
+ .../TwemojiMozilla.subset.retain-gids.3297.ttf     | Bin 5168 -> 1392 bytes
+ .../TwemojiMozilla.subset.retain-gids.3299.ttf     | Bin 5348 -> 1572 bytes
+ .../colr_with_components/colr-table.default.6B.ttf | Bin 4576 -> 4260 bytes
+ .../colr-table.drop-hints-retain-gids.6B.ttf       | Bin 5300 -> 4984 bytes
+ .../colr-table.drop-hints.6B.ttf                   | Bin 4576 -> 4260 bytes
+ .../colr-table.retain-gids.6B.ttf                  | Bin 5300 -> 4984 bytes
+ .../colrv1/TestCOLRv1.default.E000,E004.ttf        | Bin 0 -> 900 bytes
+ .../colrv1/TestCOLRv1.default.E003,E004.ttf        | Bin 0 -> 1000 bytes
+ .../expected/colrv1/TestCOLRv1.default.E004.ttf    | Bin 0 -> 744 bytes
+ .../TestCOLRv1.default.retain-all-codepoint.ttf    | Bin 0 -> 1444 bytes
+ ...TestCOLRv1.drop-hints-retain-gids.E000,E004.ttf | Bin 0 -> 984 bytes
+ ...TestCOLRv1.drop-hints-retain-gids.E003,E004.ttf | Bin 0 -> 1076 bytes
+ .../TestCOLRv1.drop-hints-retain-gids.E004.ttf     | Bin 0 -> 836 bytes
+ ...drop-hints-retain-gids.retain-all-codepoint.ttf | Bin 0 -> 1444 bytes
+ .../colrv1/TestCOLRv1.drop-hints.E000,E004.ttf     | Bin 0 -> 900 bytes
+ .../colrv1/TestCOLRv1.drop-hints.E003,E004.ttf     | Bin 0 -> 1000 bytes
+ .../expected/colrv1/TestCOLRv1.drop-hints.E004.ttf | Bin 0 -> 744 bytes
+ .../TestCOLRv1.drop-hints.retain-all-codepoint.ttf | Bin 0 -> 1444 bytes
+ .../colrv1/TestCOLRv1.retain-gids.E000,E004.ttf    | Bin 0 -> 984 bytes
+ .../colrv1/TestCOLRv1.retain-gids.E003,E004.ttf    | Bin 0 -> 1076 bytes
+ .../colrv1/TestCOLRv1.retain-gids.E004.ttf         | Bin 0 -> 836 bytes
+ ...TestCOLRv1.retain-gids.retain-all-codepoint.ttf | Bin 0 -> 1444 bytes
+ test/subset/data/fonts/TestCOLRv1.ttf              | Bin 0 -> 1780 bytes
+ test/subset/data/tests/colrv1.tests                |  21 ++++
+ test/subset/subset_test_suite.py                   |   4 +
+ 60 files changed, 241 insertions(+), 16 deletions(-)
+
+commit 466e1fdf5dc2589fe134bec16a71d9ba9f0d035d
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed May 26 14:22:21 2021 -0700
+
+    [subset] remove unnessecary brackets.
+
+ src/hb-set.hh | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 583237299d623b2e8afa36a4e334e396874da073
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed May 26 14:06:02 2021 -0700
+
+    Add cmp() method for major to page map.
+
+ src/hb-set.hh | 14 ++++++++------
+ 1 file changed, 8 insertions(+), 6 deletions(-)
+
+commit 2c137045dc53c4ad678e18499cc556c00a0ce3cb
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu May 20 16:22:04 2021 -0700
+
+    [subset] Optimize set iteration by caching the last found page map index.
+    
+    Reuse it if possible on consecutive calls to next(). Will signifcantly speed up cases where the entire set is iterated. In local testing iterating a very large set was 10x faster.
+
+ src/hb-set.hh | 37 ++++++++++++++++++++++++++++---------
+ 1 file changed, 28 insertions(+), 9 deletions(-)
+
+commit 1bb00cd54b2343971371d520fdda159d2e2a9018
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed May 26 14:18:32 2021 -0700
+
+    [subset] add num-iterations flag to util/hb-subset.
+
+ util/hb-subset.cc      | 6 +++++-
+ util/options-subset.cc | 3 +++
+ util/options.hh        | 2 ++
+ 3 files changed, 10 insertions(+), 1 deletion(-)
+
+commit 9e5738a86af1bc50480b0263664057b665b94cba
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 26 15:12:39 2021 -0600
+
+    [set] Okay, giving up on constexpr till C++14
+    
+    ../src/hb-set.hh:213:89: error: call to non-'constexpr' function 'const elt_t& hb_vector_size_t<elt_t, byte_size>::operator[](unsigned int) const [with elt_t = long long unsigned int; unsigned int byte_size = 64]'
+
+ src/hb-set.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit fac0bc78764a368a22623ba5b5a49ed803b0e915
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed May 26 14:44:58 2021 +0200
+
+    [meson] Drop more wraps we don’t use directly
+
+ Makefile.am                    |  5 ++---
+ subprojects/.gitignore         |  5 -----
+ subprojects/libffi.wrap        |  5 -----
+ subprojects/libpng.wrap        | 12 ------------
+ subprojects/pixman.wrap        |  6 ------
+ subprojects/proxy-libintl.wrap |  5 -----
+ subprojects/zlib.wrap          | 12 ------------
+ 7 files changed, 2 insertions(+), 48 deletions(-)
+
+commit 21d1034dc0320a43061df89a1fcb1f20c58f56a2
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed May 26 14:31:05 2021 +0200
+
+    [meson] Remove expat.wrap that we don’t use directly
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2987
+
+ Makefile.am            | 1 -
+ subprojects/.gitignore | 1 -
+ subprojects/expat.wrap | 9 ---------
+ 3 files changed, 11 deletions(-)
+
+commit 90fa558a5bfd9ac99dc8434810f50ef2b69014af
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 26 15:05:48 2021 -0600
+
+    [set] Another try at constexpr to make msvc happy
+
+ src/hb-set.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit bf5d4a6392de3d0d26a4d2175490532639631d4c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 26 14:27:02 2021 -0600
+
+    [set] Add TODO
+
+ src/hb-set.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 11d03f1ff973bb1a0731cdf6302d1587185c347a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 26 14:26:05 2021 -0600
+
+    [set] Mark a couple methods as constexpr
+
+ src/hb-set.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit d2829ad374a10957683b54f1d253df6653befd93
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 26 14:24:27 2021 -0600
+
+    [set] Refactor code into page_t::is_subset()
+
+ src/hb-set.hh | 18 ++++++++++++------
+ 1 file changed, 12 insertions(+), 6 deletions(-)
+
+commit e47e44a8583d9f74bd13172a6a0b084745f7d5fe
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 26 14:19:27 2021 -0600
+
+    [set] Whitespace
+
+ src/hb-set.hh | 15 ++-------------
+ 1 file changed, 2 insertions(+), 13 deletions(-)
+
+commit 2000f47ae539ff31c248626e4d142a3221522708
+Author: Kurt Kartaltepe <kkartaltepe@gmail.com>
+Date:   Wed May 19 00:34:09 2021 -0700
+
+    [set] Compute is_subset by comparing pages.
+    
+    Test subsets one page at a time instead of by codepoints. On my machine
+    this is about 250x faster than the previous implementation.
+
+ src/hb-set.hh       | 44 +++++++++++++++++++++++++++++++++++++-------
+ test/api/test-set.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 90 insertions(+), 7 deletions(-)
+
+commit 1dffb553613d8bcaa5440d27b411ae1ff22bf68b
+Author: Dominik Röttsches <drott@chromium.org>
+Date:   Tue May 18 12:31:14 2021 +0300
+
+    Chromium build fixes for C++ 17 warning and missing _remap_indexes
+    
+    Use class instead of typename, move _remap_indexes out of #ifndef.
+    
+    Fixes #2979
+
+ src/hb-ot-color-colrv1-closure.hh | 8 ++++----
+ src/hb-subset-plan.cc             | 2 +-
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+commit 89df3539966d7d544b49495a667ccebf94bb045c
+Author: Jonathan Kew <jfkthame@gmail.com>
+Date:   Thu May 13 11:45:32 2021 +0100
+
+    [aat] Add testcase for Apple Color Emoji couple-with-skin-tones sequence.
+
+ test/shaping/data/in-house/tests/macos.tests | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit bbc5fc373143b6a5f66b7e72eac42a9377c81d1e
+Author: Jonathan Kew <jfkthame@gmail.com>
+Date:   Thu May 13 11:39:09 2021 +0100
+
+    [aat] If shaping via morx, don't adjust mark positioning when zeroing widths.
+
+ src/hb-ot-shape.cc | 8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+commit 4f1e8d2bf702910e45d3d3756227abbb9d659093
+Author: Jonathan Kew <jfkthame@gmail.com>
+Date:   Wed May 5 11:11:43 2021 +0100
+
+    [aat] Update glyph properties from GDEF if available when doing a replacement.
+
+ src/hb-aat-layout-common.hh     |  4 ++++
+ src/hb-aat-layout-morx-table.hh | 17 +++++++++++++++++
+ src/hb-aat-layout.cc            |  7 ++++---
+ 3 files changed, 25 insertions(+), 3 deletions(-)
+
+commit 5e0ec33b3d9379b78084cd59a9ebed3fc583eed6
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed May 12 14:46:54 2021 -0700
+
+    Error when link width not in [2, 4]
+
+ src/hb-repacker.hh | 17 +++++++++++------
+ 1 file changed, 11 insertions(+), 6 deletions(-)
+
+commit b23f29bf05650134a9d398d03eb271840172ac9e
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Sat Apr 17 09:59:45 2021 -0700
+
+    [subset] Add subset () method for COLRv1 Paint tables, BaseGlyphV1List and LayerV1List
+    
+    Also add support for Offset24 in serializer and repacker
+
+ src/hb-ot-color-colr-table.hh | 196 +++++++++++++++++++++++++++++++++++++++++-
+ src/hb-repacker.hh            |  16 ++--
+ src/hb-serialize.hh           |  17 ++--
+ 3 files changed, 216 insertions(+), 13 deletions(-)
+
+commit 413769bf8616c6b3cf420f35801bd19129155498
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed May 12 14:14:06 2021 -0700
+
+    Add hb-ot-color-colrv1-closure.hh to sources list.
+
+ src/Makefile.sources | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit de0eba20ed4fc38fb4bb81f8deab4a2e62187763
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed May 12 14:05:34 2021 -0700
+
+    Remove array for visited_paint.
+
+ src/hb-ot-color-colr-table.hh | 12 +++++-------
+ 1 file changed, 5 insertions(+), 7 deletions(-)
+
+commit e59ffe54824ffefd97cd14c81b0778afb4d8a878
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Thu Apr 1 12:01:19 2021 -0700
+
+    [subset] COLRv1 layer/palette indices closure
+
+ src/hb-ot-color-colr-table.hh     | 134 ++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-color-colrv1-closure.hh | 101 ++++++++++++++++++++++++++++
+ src/hb-subset-plan.cc             |  12 ++++
+ src/hb-subset-plan.hh             |   4 ++
+ 4 files changed, 251 insertions(+)
+
+commit a08900b721fc8c5e26215dabe62c4124985d434d
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue May 4 16:48:41 2021 -0700
+
+    [subset] fix failing colrv0 subsetting when font has composite glyphs.
+    
+    Composite glyph collection was happening along side colrv0 glyph collection which meant it was possible to miss grabbing the component glyphs for a glyph added by colrv0.
+
+ src/hb-subset-plan.cc                                   |  16 ++++++++++++----
+ test/subset/data/Makefile.am                            |   1 +
+ test/subset/data/Makefile.sources                       |   1 +
+ .../colr_with_components/colr-table.default.6B.ttf      | Bin 0 -> 4576 bytes
+ .../colr-table.drop-hints-retain-gids.6B.ttf            | Bin 0 -> 5300 bytes
+ .../colr_with_components/colr-table.drop-hints.6B.ttf   | Bin 0 -> 4576 bytes
+ .../colr_with_components/colr-table.retain-gids.6B.ttf  | Bin 0 -> 5300 bytes
+ test/subset/data/fonts/colr-table.ttf                   | Bin 0 -> 26952 bytes
+ test/subset/data/tests/colr_with_components.tests       |  11 +++++++++++
+ test/subset/meson.build                                 |   1 +
+ 10 files changed, 26 insertions(+), 4 deletions(-)
+
+commit b54d9b695a17afb86f022084e12d72bb4a199673
+Author: tstuefe <thomas.stuefe@gmail.com>
+Date:   Thu May 6 06:22:48 2021 +0200
+
+    start
+
+ src/hb-ot-shape-complex-use-machine.hh | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit b07b97d5d753ffb58cd5abcbc898d602f76b0f72
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Mar 29 10:39:38 2021 -0700
+
+    [subset] Add more Noto Nastaliq test cases.
+
+ ...Urdu-Bold.default.627,644,623,62D,644,627,645,2E.ttf | Bin 0 -> 11436 bytes
+ .../NotoNastaliqUrdu-Bold.default.627,644,62D,628.ttf   | Bin 0 -> 18288 bytes
+ .../NotoNastaliqUrdu-Bold.default.627,644.ttf           | Bin 0 -> 3568 bytes
+ ...aliqUrdu-Bold.default.633,645,627,621,20,644,627.ttf | Bin 0 -> 12408 bytes
+ .../NotoNastaliqUrdu-Bold.default.63A,64A,631.ttf       | Bin 0 -> 20408 bytes
+ ...-Bold.retain-gids.627,644,623,62D,644,627,645,2E.ttf | Bin 0 -> 18272 bytes
+ ...otoNastaliqUrdu-Bold.retain-gids.627,644,62D,628.ttf | Bin 0 -> 24416 bytes
+ .../NotoNastaliqUrdu-Bold.retain-gids.627,644,62D.ttf   | Bin 11532 -> 0 bytes
+ .../NotoNastaliqUrdu-Bold.retain-gids.627,644.ttf       | Bin 0 -> 9216 bytes
+ ...Urdu-Bold.retain-gids.633,645,627,621,20,644,627.ttf | Bin 0 -> 18212 bytes
+ .../NotoNastaliqUrdu-Bold.retain-gids.63A,64A,631.ttf   | Bin 0 -> 26628 bytes
+ test/subset/data/tests/layout.notonastaliqurdu.tests    |   7 ++++++-
+ 12 files changed, 6 insertions(+), 1 deletion(-)
+
+commit b37f03f16b39d397a626f097858e9ae550234ca0
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Tue May 4 02:07:06 2021 +0200
+
+    2.8.1
+
+ NEWS             | 9 +++++++++
+ configure.ac     | 2 +-
+ meson.build      | 2 +-
+ src/hb-version.h | 4 ++--
+ 4 files changed, 13 insertions(+), 4 deletions(-)
+
+commit d3e84413fd512441e62e5200eab6a24d34282e9a
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Sun May 2 01:03:21 2021 +0200
+
+    [ci] Drop macos-10_13_6-aat-fonts job
+    
+    This version of macOS is no longer supported by Homebrew, it takes 26
+    minutes to brew the dependencies before it fails.
+
+ .circleci/config.yml | 14 --------------
+ 1 file changed, 14 deletions(-)
+
+commit 517d68b26e04be63a306cdacec20218a18ede3a4
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Sat May 1 23:50:39 2021 +0200
+
+    [ci] Pin fedora 33 docker image
+    
+    g-ir-scanner is broken on 34 image:
+    
+    FAILED: src/HarfBuzz-0.0.gir
+    /usr/bin/g-ir-scanner --no-libtool --namespace=HarfBuzz --nsversion=0.0 --warn-all --output src/HarfBuzz-0.0.gir --c-include=hb-gobject.h --cflags-begin -DHB_NO_SINGLE_HEADER_ERROR -DHAVE_GOBJECT -DHB_EXTERN= --cflags-end -I/root/project/src -I/root/project/build/src -I./. -I../. --filelist=/root/project/build/src/libharfbuzz-gobject.so.0.20800.0.p/HarfBuzz_0.0_gir_filelist --include=GObject-2.0 --symbol-prefix=hb --symbol-prefix=hb_gobject --identifier-prefix=hb_ --pkg-export=harfbuzz-gobject --cflags-begin -DHAVE_CONFIG_H -I./. -I../. -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -I/usr/include/sysprof-4 -I./src/. -I../src/. -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/harfbuzz -I/usr/include/gobject-introspection-1.0 --cflags-end --add-include-path=/usr/share/gir-1.0 -L/root/project/build/src --extra-library=harfbuzz --library harfbuzz-gobject -L/root/project/build/src -L/root/project/build/src --extra-library=glib-2.0 --extra-library=gobject-2.0 --extra-library=m --extra-library=freetype --extra-library=girepository-1.0 --sources-top-dirs /root/project/subprojects/ --sources-top-dirs /root/project/build/subprojects/
+    ../src/hb-buffer.cc:641: Warning: HarfBuzz: unknown annotation: xconstructor
+    ../src/hb-face.cc:192: Warning: HarfBuzz: unknown annotation: xconstructor
+    ../src/hb-font.cc:551: Warning: HarfBuzz: unknown annotation: xconstructor
+    ../src/hb-font.cc:1519: Warning: HarfBuzz: unknown annotation: xconstructor
+    ../src/hb-map.cc:43: Warning: HarfBuzz: unknown annotation: xconstructor
+    ../src/hb-ot-name.cc:55: Warning: HarfBuzz: unexpected annotation: out
+    ../src/hb-set.cc:43: Warning: HarfBuzz: unknown annotation: xconstructor
+    ../src/hb-shape-plan.cc:173: Warning: HarfBuzz: unknown annotation: xconstructor
+    ../src/hb-shape-plan.cc:201: Warning: HarfBuzz: unknown annotation: xconstructor
+    ../src/hb-unicode.cc:172: Warning: HarfBuzz: unknown annotation: xconstructor
+    g-ir-scanner: link: gcc -pthread -o /root/project/build/tmp-introspecta9rymai3/HarfBuzz-0.0 /root/project/build/tmp-introspecta9rymai3/HarfBuzz-0.0.o -L. -Wl,-rpath,. -Wl,--no-as-needed -L/root/project/build/src -Wl,-rpath,/root/project/build/src -L/root/project/build/src -Wl,-rpath,/root/project/build/src -L/root/project/build/src -Wl,-rpath,/root/project/build/src -lharfbuzz-gobject -lharfbuzz -lglib-2.0 -lgobject-2.0 -lm -lfreetype -lgirepository-1.0 -lgio-2.0 -lgobject-2.0 -Wl,--export-dynamic -lgmodule-2.0 -pthread -lglib-2.0 -lglib-2.0
+    ldd: error: you do not have read permission for `/root/project/build/tmp-introspecta9rymai3/HarfBuzz-0.0'
+    Traceback (most recent call last):
+      File "/usr/bin/g-ir-scanner", line 99, in <module>
+        sys.exit(scanner_main(sys.argv))
+      File "/usr/lib64/gobject-introspection/giscanner/scannermain.py", line 599, in scanner_main
+        shlibs = create_binary(transformer, options, args)
+      File "/usr/lib64/gobject-introspection/giscanner/scannermain.py", line 428, in create_binary
+        shlibs = resolve_shlibs(options, binary, options.libraries)
+      File "/usr/lib64/gobject-introspection/giscanner/shlibs.py", line 170, in resolve_shlibs
+        _resolve_non_libtool(options, binary, non_libtool))
+      File "/usr/lib64/gobject-introspection/giscanner/shlibs.py", line 106, in _resolve_non_libtool
+        output = subprocess.check_output(args)
+      File "/usr/lib64/python3.9/subprocess.py", line 424, in check_output
+        return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
+      File "/usr/lib64/python3.9/subprocess.py", line 528, in run
+        raise CalledProcessError(retcode, process.args,
+    subprocess.CalledProcessError: Command '['ldd', '/root/project/build/tmp-introspecta9rymai3/HarfBuzz-0.0']' returned non-zero exit status 1.
+    ninja: build stopped: subcommand failed.
+
+ .circleci/config.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 2b7647649a2016e1f10a0eacc2bf2285e1207954
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Apr 30 13:34:16 2021 -0700
+
+    [subset] update test-subset-gpos expected files.
+
+ test/api/fonts/AdobeVFPrototype.WA.gpos.otf | Bin 4148 -> 4096 bytes
+ test/api/fonts/Roboto-Regular-gpos-aw.ttf   | Bin 2236 -> 2228 bytes
+ 2 files changed, 0 insertions(+), 0 deletions(-)
+
+commit be50779cda64d6b7bc8422d6b428892ca829733f
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Apr 30 12:59:17 2021 -0700
+
+    [subset] correct ClassDef format determination.
+    
+    It was possible for glyph_min to be a glyph mapped to class zero which threw off the number of glyph calculation.
+
+ src/hb-ot-layout-common.hh | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+commit 90713f270eeb8286067c141245209814b9e7e706
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Fri Apr 30 16:56:39 2021 +0200
+
+    [hb-ot-layout] Document some return values
+
+ src/hb-ot-layout.cc | 25 +++++++++++++++++++++++--
+ 1 file changed, 23 insertions(+), 2 deletions(-)
+
+commit 46362a954c1408f8e4046d1c2069f2f9d7f80dcd
+Merge: 42bf8e3d4 e25efb31f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 30 11:39:47 2021 -0600
+
+    Merge pull request #2958 from googlefonts/layout_by_default_gr
+    
+    [subset] Enable layout subsetting by default.
+
+commit 42bf8e3d49b789adc00c6d7602ba8c73757ebfaf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 26 12:31:44 2021 -0600
+
+    [util] Disable chafa's truecolor mode
+    
+    See https://github.com/harfbuzz/harfbuzz/pull/2959#issuecomment-827056111
+
+ util/helper-cairo-ansi.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit c571a96eb0866093f6bece1069f292e34f933421
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Sun Apr 25 15:43:30 2021 +0200
+
+    [ci] Disable Chafa on jobs that enables all auto features
+    
+    No suitable versions are available on these setups.
+
+ .circleci/config.yml           | 2 +-
+ .github/workflows/linux-ci.yml | 2 +-
+ .github/workflows/msys2-ci.yml | 3 ++-
+ 3 files changed, 4 insertions(+), 3 deletions(-)
+
+commit 8298c2f93b0dbe39eae66455c80e68e812213a2f
+Author: Hans Petter Jansson <hpj@hpjansson.org>
+Date:   Fri Apr 23 18:37:58 2021 +0200
+
+    [hb-view] Use Chafa for terminal graphics if available
+    
+    This produces high-quality terminal graphics using symbols or sixels
+    according to the detected terminal capabilities.
+    
+    Fixes #2430.
+
+ configure.ac              |  19 +++++++++
+ meson.build               |   7 ++++
+ meson_options.txt         |   2 +
+ util/Makefile.am          |   2 +
+ util/helper-cairo-ansi.cc | 104 +++++++++++++++++++++++++++++++++++++++++++++-
+ util/meson.build          |   2 +-
+ 6 files changed, 133 insertions(+), 3 deletions(-)
+
+commit e25efb31f21441d29866a2be866abb835b77d7c8
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Apr 23 19:09:37 2021 -0700
+
+    [subset] consider all value formats when computing effective format.
+
+ src/hb-ot-layout-gpos-table.hh | 9 ++++-----
+ 1 file changed, 4 insertions(+), 5 deletions(-)
+
+commit 84dbfacfec3818478a1e5ac2b9922d25917493ef
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Thu Apr 15 16:52:11 2021 -0700
+
+    [subset] fix collect_variation_idx in PairPosFormat2
+
+ src/hb-ot-layout-common.hh     | 15 ++++++++++-----
+ src/hb-ot-layout-gdef-table.hh |  4 ++--
+ src/hb-ot-layout-gpos-table.hh | 22 ++++++++++++++++++----
+ 3 files changed, 30 insertions(+), 11 deletions(-)
+
+commit d356d0f79c6086e913722a8f40cbc0e59a365c1b
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Apr 23 17:41:09 2021 -0700
+
+    [subset] optimize ValueRecord's for PairPosFormat1.
+
+ src/hb-ot-layout-gpos-table.hh | 53 +++++++++++++++++++++++++++++++++++++++++-
+ 1 file changed, 52 insertions(+), 1 deletion(-)
+
+commit f9fbe4817ebcb0c88865dc19b7a6e616842a7be6
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Apr 23 17:06:06 2021 -0700
+
+    [subset] implement value record optimization for PairPosFormat2.
+
+ src/hb-ot-layout-gpos-table.hh | 59 ++++++++++++++++++++++++++++--------------
+ 1 file changed, 40 insertions(+), 19 deletions(-)
+
+commit badb8e409bf65a7a0a1f73af735c86870c5c7899
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Apr 23 16:32:56 2021 -0700
+
+    [subset] use copy_values for PairPos serialize.
+
+ src/hb-ot-layout-gpos-table.hh | 111 +++++++++++++++++++++++------------------
+ 1 file changed, 62 insertions(+), 49 deletions(-)
+
+commit 2f50283cd33f20b41a9efd5e851272edacf1d8c1
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Apr 23 15:21:30 2021 -0700
+
+    [subset] Begin implementing ValueRecord optimization:
+    
+    remove value records which have a zero value.
+
+ src/hb-ot-layout-gpos-table.hh | 91 +++++++++++++++++++++++++++++++++++-------
+ 1 file changed, 76 insertions(+), 15 deletions(-)
+
+commit 5df7c668ba530fb5b27e6eed482aa286db3add23
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Apr 22 16:45:14 2021 -0700
+
+    [subset] In SinglePosFormat1 serialize only 1 value record.
+    
+    Previously one record per glyph in the subset was serialized.
+
+ src/hb-ot-layout-gpos-table.hh | 22 ++++++++++++++--------
+ 1 file changed, 14 insertions(+), 8 deletions(-)
+
+commit 92757f68097aaae74043a5030789289cc3ce514e
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Apr 22 15:18:35 2021 -0700
+
+    [subset] Don't drop anchor device tables when dropping hints. These may contain variation data.
+    
+    Update subseting expected files to match latest version of fontTools.
+
+ src/hb-ot-layout-gpos-table.hh                     |  20 +++++++++-----------
+ .../Comfortaa-Regular-new.default.61,62,63.ttf     | Bin 8100 -> 8100 bytes
+ .../basics/Comfortaa-Regular-new.default.61,63.ttf | Bin 7736 -> 7736 bytes
+ .../basics/Comfortaa-Regular-new.default.61.ttf    | Bin 7360 -> 7360 bytes
+ .../basics/Comfortaa-Regular-new.default.62.ttf    | Bin 6796 -> 6796 bytes
+ ...aa-Regular-new.default.retain-all-codepoint.ttf | Bin 222212 -> 222212 bytes
+ ...Regular-new.drop-hints-retain-gids.61,62,63.ttf | Bin 7032 -> 7012 bytes
+ ...aa-Regular-new.drop-hints-retain-gids.61,63.ttf | Bin 6724 -> 6712 bytes
+ ...ortaa-Regular-new.drop-hints-retain-gids.61.ttf | Bin 6396 -> 6388 bytes
+ ...ortaa-Regular-new.drop-hints-retain-gids.62.ttf | Bin 4396 -> 4396 bytes
+ ...ortaa-Regular-new.drop-hints-retain-gids.63.ttf | Bin 4472 -> 4468 bytes
+ ...drop-hints-retain-gids.retain-all-codepoint.ttf | Bin 187952 -> 190920 bytes
+ .../Comfortaa-Regular-new.drop-hints.61,62,63.ttf  | Bin 3444 -> 3424 bytes
+ .../Comfortaa-Regular-new.drop-hints.61,63.ttf     | Bin 3140 -> 3128 bytes
+ .../basics/Comfortaa-Regular-new.drop-hints.61.ttf | Bin 2804 -> 2800 bytes
+ .../basics/Comfortaa-Regular-new.drop-hints.62.ttf | Bin 2396 -> 2396 bytes
+ .../basics/Comfortaa-Regular-new.drop-hints.63.ttf | Bin 2464 -> 2460 bytes
+ ...Regular-new.drop-hints.retain-all-codepoint.ttf | Bin 187944 -> 190908 bytes
+ .../basics/Comfortaa-Regular-new.gids.61,62,63.ttf | Bin 9036 -> 9036 bytes
+ .../basics/Comfortaa-Regular-new.gids.61,63.ttf    | Bin 8668 -> 8668 bytes
+ .../basics/Comfortaa-Regular-new.gids.61.ttf       | Bin 8304 -> 8304 bytes
+ .../basics/Comfortaa-Regular-new.gids.62.ttf       | Bin 8236 -> 8236 bytes
+ .../basics/Comfortaa-Regular-new.gids.63.ttf       | Bin 8220 -> 8220 bytes
+ ...ortaa-Regular-new.gids.retain-all-codepoint.ttf | Bin 222212 -> 222212 bytes
+ .../Comfortaa-Regular-new.name-ids.61,62,63.ttf    | Bin 7840 -> 7840 bytes
+ .../Comfortaa-Regular-new.name-ids.61,63.ttf       | Bin 7476 -> 7476 bytes
+ .../basics/Comfortaa-Regular-new.name-ids.61.ttf   | Bin 7100 -> 7100 bytes
+ .../basics/Comfortaa-Regular-new.name-ids.62.ttf   | Bin 6536 -> 6536 bytes
+ ...a-Regular-new.name-ids.retain-all-codepoint.ttf | Bin 221952 -> 221952 bytes
+ ...mfortaa-Regular-new.name-languages.61,62,63.ttf | Bin 8100 -> 8100 bytes
+ .../Comfortaa-Regular-new.name-languages.61,63.ttf | Bin 7736 -> 7736 bytes
+ .../Comfortaa-Regular-new.name-languages.61.ttf    | Bin 7360 -> 7360 bytes
+ .../Comfortaa-Regular-new.name-languages.62.ttf    | Bin 6796 -> 6796 bytes
+ ...lar-new.name-languages.retain-all-codepoint.ttf | Bin 222212 -> 222212 bytes
+ .../Comfortaa-Regular-new.name-legacy.61,62,63.ttf | Bin 8100 -> 8100 bytes
+ .../Comfortaa-Regular-new.name-legacy.61,63.ttf    | Bin 7736 -> 7736 bytes
+ .../Comfortaa-Regular-new.name-legacy.61.ttf       | Bin 7360 -> 7360 bytes
+ .../Comfortaa-Regular-new.name-legacy.62.ttf       | Bin 6796 -> 6796 bytes
+ ...egular-new.name-legacy.retain-all-codepoint.ttf | Bin 222212 -> 222212 bytes
+ .../Comfortaa-Regular-new.retain-gids.61,62,63.ttf | Bin 11688 -> 11688 bytes
+ .../Comfortaa-Regular-new.retain-gids.61,63.ttf    | Bin 11320 -> 11320 bytes
+ .../Comfortaa-Regular-new.retain-gids.61.ttf       | Bin 10952 -> 10952 bytes
+ .../Comfortaa-Regular-new.retain-gids.62.ttf       | Bin 8796 -> 8796 bytes
+ ...egular-new.retain-gids.retain-all-codepoint.ttf | Bin 222224 -> 222224 bytes
+ ...Regular.abc.drop-hints-retain-gids.61,62,63.ttf | Bin 1208 -> 1192 bytes
+ ...to-Regular.abc.drop-hints-retain-gids.61,63.ttf | Bin 1136 -> 1124 bytes
+ ...oboto-Regular.abc.drop-hints-retain-gids.61.ttf | Bin 988 -> 984 bytes
+ ...oboto-Regular.abc.drop-hints-retain-gids.63.ttf | Bin 972 -> 968 bytes
+ ...drop-hints-retain-gids.retain-all-codepoint.ttf | Bin 1208 -> 1192 bytes
+ .../Roboto-Regular.abc.drop-hints.61,62,63.ttf     | Bin 1208 -> 1192 bytes
+ .../basics/Roboto-Regular.abc.drop-hints.61,63.ttf | Bin 1120 -> 1108 bytes
+ .../basics/Roboto-Regular.abc.drop-hints.61.ttf    | Bin 988 -> 984 bytes
+ .../basics/Roboto-Regular.abc.drop-hints.63.ttf    | Bin 960 -> 956 bytes
+ ...Regular.abc.drop-hints.retain-all-codepoint.ttf | Bin 1208 -> 1192 bytes
+ ...subroutinize-retain-gids.1FC,21,41,20,62,63.otf | Bin 30500 -> 30488 bytes
+ ...rop-hints-desubroutinize.1FC,21,41,20,62,63.otf | Bin 3680 -> 3668 bytes
+ ...r.drop-hints-retain-gids.1FC,21,41,20,62,63.otf | Bin 30636 -> 30624 bytes
+ ...nsPro-Regular.drop-hints.1FC,21,41,20,62,63.otf | Bin 3820 -> 3808 bytes
+ .../Roboto-Regular.drop-hints.D7,D8,D9,DA,DE.ttf   | Bin 2192 -> 2184 bytes
+ ...ifVariable-Roman.default.1FC,21,41,20,62,63.ttf | Bin 6876 -> 6876 bytes
+ .../SourceSerifVariable-Roman.default.61,62,63.ttf | Bin 6552 -> 6552 bytes
+ ...ariable-Roman.drop-hints.1FC,21,41,20,62,63.ttf | Bin 6612 -> 6832 bytes
+ ...urceSerifVariable-Roman.drop-hints.61,62,63.ttf | Bin 6356 -> 6552 bytes
+ ...rifVariable-Roman.drop-hints.D7,D8,D9,DA,DE.ttf | Bin 5880 -> 6136 bytes
+ .../AdobeVFPrototype.drop-hints.41,42,43,57.otf    | Bin 5180 -> 5272 bytes
+ .../AdobeVFPrototype.drop-hints.41,42,43.otf       | Bin 4688 -> 4744 bytes
+ .../AdobeVFPrototype.drop-hints.41,42.otf          | Bin 4236 -> 4264 bytes
+ .../AdobeVFPrototype.drop-hints.41,56,57.otf       | Bin 4348 -> 4408 bytes
+ .../AdobeVFPrototype.drop-hints.41.otf             | Bin 3552 -> 3560 bytes
+ .../AdobeVFPrototype.drop-hints.42,57.otf          | Bin 4364 -> 4396 bytes
+ .../Roboto-Regular.drop-hints.1E00,303.ttf         | Bin 1468 -> 1464 bytes
+ .../expected/layout.khmer/Khmer.default.1780.ttf   | Bin 0 -> 4204 bytes
+ ...ult.1789,17BB,17C6,1794,17B6,1793,1798,17BE.ttf | Bin 0 -> 6412 bytes
+ .../expected/layout.khmer/Khmer.default.31.ttf     | Bin 0 -> 4140 bytes
+ .../layout.khmer/Khmer.retain-gids.1780.ttf        | Bin 0 -> 4464 bytes
+ ...ids.1789,17BB,17C6,1794,17B6,1793,1798,17BE.ttf | Bin 0 -> 7848 bytes
+ .../expected/layout.khmer/Khmer.retain-gids.31.ttf | Bin 0 -> 4256 bytes
+ .../variable/Fraunces.default.26,66,69,124,125.ttf | Bin 0 -> 18448 bytes
+ .../data/expected/variable/Fraunces.default.61.ttf | Bin 0 -> 5880 bytes
+ 79 files changed, 9 insertions(+), 11 deletions(-)
+
+commit 6fddc2bbf9224bde4327e1792a683de637ad5613
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Apr 1 15:34:17 2021 -0700
+
+    [subset] subset layout tables (G*) by default.
+
+ src/hb-subset-input.cc                             |   3 ---
+ .../Comfortaa-Regular-new.default.61,62,63.ttf     | Bin 7392 -> 8100 bytes
+ .../basics/Comfortaa-Regular-new.default.61,63.ttf | Bin 7036 -> 7736 bytes
+ .../basics/Comfortaa-Regular-new.default.61.ttf    | Bin 6684 -> 7360 bytes
+ .../basics/Comfortaa-Regular-new.default.62.ttf    | Bin 6628 -> 6796 bytes
+ .../basics/Comfortaa-Regular-new.default.63.ttf    | Bin 6608 -> 6844 bytes
+ ...aa-Regular-new.default.retain-all-codepoint.ttf | Bin 182876 -> 222212 bytes
+ ...Regular-new.drop-hints-retain-gids.61,62,63.ttf | Bin 4844 -> 7032 bytes
+ ...aa-Regular-new.drop-hints-retain-gids.61,63.ttf | Bin 4552 -> 6724 bytes
+ ...ortaa-Regular-new.drop-hints-retain-gids.61.ttf | Bin 3988 -> 6396 bytes
+ ...ortaa-Regular-new.drop-hints-retain-gids.62.ttf | Bin 4228 -> 4396 bytes
+ ...ortaa-Regular-new.drop-hints-retain-gids.63.ttf | Bin 4236 -> 4472 bytes
+ ...drop-hints-retain-gids.retain-all-codepoint.ttf | Bin 151672 -> 187952 bytes
+ .../Comfortaa-Regular-new.drop-hints.61,62,63.ttf  | Bin 2852 -> 3444 bytes
+ .../Comfortaa-Regular-new.drop-hints.61,63.ttf     | Bin 2552 -> 3140 bytes
+ .../basics/Comfortaa-Regular-new.drop-hints.61.ttf | Bin 2240 -> 2804 bytes
+ .../basics/Comfortaa-Regular-new.drop-hints.62.ttf | Bin 2228 -> 2396 bytes
+ .../basics/Comfortaa-Regular-new.drop-hints.63.ttf | Bin 2228 -> 2464 bytes
+ ...Regular-new.drop-hints.retain-all-codepoint.ttf | Bin 151608 -> 187944 bytes
+ .../basics/Comfortaa-Regular-new.gids.61,62,63.ttf | Bin 8296 -> 9036 bytes
+ .../basics/Comfortaa-Regular-new.gids.61,63.ttf    | Bin 7944 -> 8668 bytes
+ .../basics/Comfortaa-Regular-new.gids.61.ttf       | Bin 7588 -> 8304 bytes
+ .../basics/Comfortaa-Regular-new.gids.62.ttf       | Bin 7528 -> 8236 bytes
+ .../basics/Comfortaa-Regular-new.gids.63.ttf       | Bin 7516 -> 8220 bytes
+ ...ortaa-Regular-new.gids.retain-all-codepoint.ttf | Bin 182876 -> 222212 bytes
+ ...Regular-new.keep-layout-drop-hints.61,62,63.ttf | Bin 3444 -> 0 bytes
+ ...aa-Regular-new.keep-layout-drop-hints.61,63.ttf | Bin 3140 -> 0 bytes
+ ...ortaa-Regular-new.keep-layout-drop-hints.61.ttf | Bin 2804 -> 0 bytes
+ ...ortaa-Regular-new.keep-layout-drop-hints.62.ttf | Bin 2396 -> 0 bytes
+ ...ortaa-Regular-new.keep-layout-drop-hints.63.ttf | Bin 2464 -> 0 bytes
+ ...keep-layout-drop-hints.retain-all-codepoint.ttf | Bin 187944 -> 0 bytes
+ .../Comfortaa-Regular-new.keep-layout.61,62,63.ttf | Bin 8100 -> 0 bytes
+ .../Comfortaa-Regular-new.keep-layout.61,63.ttf    | Bin 7736 -> 0 bytes
+ .../Comfortaa-Regular-new.keep-layout.61.ttf       | Bin 7360 -> 0 bytes
+ .../Comfortaa-Regular-new.keep-layout.62.ttf       | Bin 6796 -> 0 bytes
+ .../Comfortaa-Regular-new.keep-layout.63.ttf       | Bin 6844 -> 0 bytes
+ ...egular-new.keep-layout.retain-all-codepoint.ttf | Bin 222212 -> 0 bytes
+ .../Comfortaa-Regular-new.name-ids.61,62,63.ttf    | Bin 7132 -> 7840 bytes
+ .../Comfortaa-Regular-new.name-ids.61,63.ttf       | Bin 6776 -> 7476 bytes
+ .../basics/Comfortaa-Regular-new.name-ids.61.ttf   | Bin 6424 -> 7100 bytes
+ .../basics/Comfortaa-Regular-new.name-ids.62.ttf   | Bin 6368 -> 6536 bytes
+ .../basics/Comfortaa-Regular-new.name-ids.63.ttf   | Bin 6348 -> 6584 bytes
+ ...a-Regular-new.name-ids.retain-all-codepoint.ttf | Bin 182616 -> 221952 bytes
+ ...mfortaa-Regular-new.name-languages.61,62,63.ttf | Bin 7392 -> 8100 bytes
+ .../Comfortaa-Regular-new.name-languages.61,63.ttf | Bin 7036 -> 7736 bytes
+ .../Comfortaa-Regular-new.name-languages.61.ttf    | Bin 6684 -> 7360 bytes
+ .../Comfortaa-Regular-new.name-languages.62.ttf    | Bin 6628 -> 6796 bytes
+ .../Comfortaa-Regular-new.name-languages.63.ttf    | Bin 6608 -> 6844 bytes
+ ...lar-new.name-languages.retain-all-codepoint.ttf | Bin 182876 -> 222212 bytes
+ .../Comfortaa-Regular-new.name-legacy.61,62,63.ttf | Bin 7392 -> 8100 bytes
+ .../Comfortaa-Regular-new.name-legacy.61,63.ttf    | Bin 7036 -> 7736 bytes
+ .../Comfortaa-Regular-new.name-legacy.61.ttf       | Bin 6684 -> 7360 bytes
+ .../Comfortaa-Regular-new.name-legacy.62.ttf       | Bin 6628 -> 6796 bytes
+ .../Comfortaa-Regular-new.name-legacy.63.ttf       | Bin 6608 -> 6844 bytes
+ ...egular-new.name-legacy.retain-all-codepoint.ttf | Bin 182876 -> 222212 bytes
+ .../Comfortaa-Regular-new.retain-gids.61,62,63.ttf | Bin 9384 -> 11688 bytes
+ .../Comfortaa-Regular-new.retain-gids.61,63.ttf    | Bin 9036 -> 11320 bytes
+ .../Comfortaa-Regular-new.retain-gids.61.ttf       | Bin 8432 -> 10952 bytes
+ .../Comfortaa-Regular-new.retain-gids.62.ttf       | Bin 8628 -> 8796 bytes
+ .../Comfortaa-Regular-new.retain-gids.63.ttf       | Bin 8616 -> 8852 bytes
+ ...egular-new.retain-gids.retain-all-codepoint.ttf | Bin 182940 -> 222224 bytes
+ ...ular-subset.keep-layout-drop-hints.61,62,63.ttf | Bin 1452 -> 0 bytes
+ ...Regular-subset.keep-layout-drop-hints.61,63.ttf | Bin 1276 -> 0 bytes
+ ...jo-Regular-subset.keep-layout-drop-hints.61.ttf | Bin 1128 -> 0 bytes
+ ...jo-Regular-subset.keep-layout-drop-hints.62.ttf | Bin 1140 -> 0 bytes
+ ...jo-Regular-subset.keep-layout-drop-hints.63.ttf | Bin 1104 -> 0 bytes
+ ...keep-layout-drop-hints.retain-all-codepoint.ttf | Bin 3536 -> 0 bytes
+ ...yeongjo-Regular-subset.keep-layout.61,62,63.ttf | Bin 4128 -> 0 bytes
+ ...umMyeongjo-Regular-subset.keep-layout.61,63.ttf | Bin 3580 -> 0 bytes
+ ...NanumMyeongjo-Regular-subset.keep-layout.61.ttf | Bin 3156 -> 0 bytes
+ ...NanumMyeongjo-Regular-subset.keep-layout.62.ttf | Bin 3180 -> 0 bytes
+ ...NanumMyeongjo-Regular-subset.keep-layout.63.ttf | Bin 3048 -> 0 bytes
+ ...lar-subset.keep-layout.retain-all-codepoint.ttf | Bin 9524 -> 0 bytes
+ .../basics/Roboto-Regular.abc.default.61,62,63.ttf | Bin 2168 -> 2452 bytes
+ .../basics/Roboto-Regular.abc.default.61,63.ttf    | Bin 1988 -> 2260 bytes
+ .../basics/Roboto-Regular.abc.default.61.ttf       | Bin 1792 -> 2048 bytes
+ .../basics/Roboto-Regular.abc.default.62.ttf       | Bin 1740 -> 1916 bytes
+ .../basics/Roboto-Regular.abc.default.63.ttf       | Bin 1716 -> 1972 bytes
+ ...to-Regular.abc.default.retain-all-codepoint.ttf | Bin 2168 -> 2452 bytes
+ ...Regular.abc.drop-hints-retain-gids.61,62,63.ttf | Bin 924 -> 1208 bytes
+ ...to-Regular.abc.drop-hints-retain-gids.61,63.ttf | Bin 856 -> 1136 bytes
+ ...oboto-Regular.abc.drop-hints-retain-gids.61.ttf | Bin 732 -> 988 bytes
+ ...oboto-Regular.abc.drop-hints-retain-gids.62.ttf | Bin 704 -> 880 bytes
+ ...oboto-Regular.abc.drop-hints-retain-gids.63.ttf | Bin 716 -> 972 bytes
+ ...drop-hints-retain-gids.retain-all-codepoint.ttf | Bin 924 -> 1208 bytes
+ .../Roboto-Regular.abc.drop-hints.61,62,63.ttf     | Bin 924 -> 1208 bytes
+ .../basics/Roboto-Regular.abc.drop-hints.61,63.ttf | Bin 848 -> 1120 bytes
+ .../basics/Roboto-Regular.abc.drop-hints.61.ttf    | Bin 732 -> 988 bytes
+ .../basics/Roboto-Regular.abc.drop-hints.62.ttf    | Bin 700 -> 876 bytes
+ .../basics/Roboto-Regular.abc.drop-hints.63.ttf    | Bin 704 -> 960 bytes
+ ...Regular.abc.drop-hints.retain-all-codepoint.ttf | Bin 924 -> 1208 bytes
+ .../basics/Roboto-Regular.abc.gids.61,62,63.ttf    | Bin 2168 -> 2452 bytes
+ .../basics/Roboto-Regular.abc.gids.61,63.ttf       | Bin 2168 -> 2452 bytes
+ .../expected/basics/Roboto-Regular.abc.gids.61.ttf | Bin 2168 -> 2452 bytes
+ .../expected/basics/Roboto-Regular.abc.gids.62.ttf | Bin 2168 -> 2452 bytes
+ .../expected/basics/Roboto-Regular.abc.gids.63.ttf | Bin 2168 -> 2452 bytes
+ ...oboto-Regular.abc.gids.retain-all-codepoint.ttf | Bin 2168 -> 2452 bytes
+ ...Regular.abc.keep-layout-drop-hints.61,62,63.ttf | Bin 1208 -> 0 bytes
+ ...to-Regular.abc.keep-layout-drop-hints.61,63.ttf | Bin 1120 -> 0 bytes
+ ...oboto-Regular.abc.keep-layout-drop-hints.61.ttf | Bin 988 -> 0 bytes
+ ...oboto-Regular.abc.keep-layout-drop-hints.62.ttf | Bin 876 -> 0 bytes
+ ...oboto-Regular.abc.keep-layout-drop-hints.63.ttf | Bin 960 -> 0 bytes
+ ...keep-layout-drop-hints.retain-all-codepoint.ttf | Bin 1208 -> 0 bytes
+ .../Roboto-Regular.abc.keep-layout.61,62,63.ttf    | Bin 2452 -> 0 bytes
+ .../Roboto-Regular.abc.keep-layout.61,63.ttf       | Bin 2260 -> 0 bytes
+ .../basics/Roboto-Regular.abc.keep-layout.61.ttf   | Bin 2048 -> 0 bytes
+ .../basics/Roboto-Regular.abc.keep-layout.62.ttf   | Bin 1916 -> 0 bytes
+ .../basics/Roboto-Regular.abc.keep-layout.63.ttf   | Bin 1972 -> 0 bytes
+ ...egular.abc.keep-layout.retain-all-codepoint.ttf | Bin 2452 -> 0 bytes
+ .../Roboto-Regular.abc.name-ids.61,62,63.ttf       | Bin 2168 -> 2452 bytes
+ .../basics/Roboto-Regular.abc.name-ids.61,63.ttf   | Bin 1988 -> 2260 bytes
+ .../basics/Roboto-Regular.abc.name-ids.61.ttf      | Bin 1792 -> 2048 bytes
+ .../basics/Roboto-Regular.abc.name-ids.62.ttf      | Bin 1740 -> 1916 bytes
+ .../basics/Roboto-Regular.abc.name-ids.63.ttf      | Bin 1716 -> 1972 bytes
+ ...o-Regular.abc.name-ids.retain-all-codepoint.ttf | Bin 2168 -> 2452 bytes
+ .../Roboto-Regular.abc.name-languages.61,62,63.ttf | Bin 2168 -> 2452 bytes
+ .../Roboto-Regular.abc.name-languages.61,63.ttf    | Bin 1988 -> 2260 bytes
+ .../Roboto-Regular.abc.name-languages.61.ttf       | Bin 1792 -> 2048 bytes
+ .../Roboto-Regular.abc.name-languages.62.ttf       | Bin 1740 -> 1916 bytes
+ .../Roboto-Regular.abc.name-languages.63.ttf       | Bin 1716 -> 1972 bytes
+ ...lar.abc.name-languages.retain-all-codepoint.ttf | Bin 2168 -> 2452 bytes
+ .../Roboto-Regular.abc.name-legacy.61,62,63.ttf    | Bin 2168 -> 2452 bytes
+ .../Roboto-Regular.abc.name-legacy.61,63.ttf       | Bin 1988 -> 2260 bytes
+ .../basics/Roboto-Regular.abc.name-legacy.61.ttf   | Bin 1792 -> 2048 bytes
+ .../basics/Roboto-Regular.abc.name-legacy.62.ttf   | Bin 1740 -> 1916 bytes
+ .../basics/Roboto-Regular.abc.name-legacy.63.ttf   | Bin 1716 -> 1972 bytes
+ ...egular.abc.name-legacy.retain-all-codepoint.ttf | Bin 2168 -> 2452 bytes
+ .../Roboto-Regular.abc.retain-gids.61,62,63.ttf    | Bin 2168 -> 2452 bytes
+ .../Roboto-Regular.abc.retain-gids.61,63.ttf       | Bin 1996 -> 2276 bytes
+ .../basics/Roboto-Regular.abc.retain-gids.61.ttf   | Bin 1792 -> 2048 bytes
+ .../basics/Roboto-Regular.abc.retain-gids.62.ttf   | Bin 1748 -> 1924 bytes
+ .../basics/Roboto-Regular.abc.retain-gids.63.ttf   | Bin 1732 -> 1988 bytes
+ ...egular.abc.retain-gids.retain-all-codepoint.ttf | Bin 2168 -> 2452 bytes
+ ...olorEmoji.subset.index_format3.default.2049.ttf | Bin 3112 -> 3108 bytes
+ ...rEmoji.subset.index_format3.default.38,2049.ttf | Bin 4080 -> 4076 bytes
+ ...rEmoji.subset.index_format3.default.38,20E3.ttf | Bin 3564 -> 3560 bytes
+ ...index_format3.default.38,39,AE,2049,38,20E3.ttf | Bin 10112 -> 10112 bytes
+ ...oji.subset.index_format3.default.38,AE,2049.ttf | Bin 7536 -> 7536 bytes
+ ...oColorEmoji.subset.index_format3.default.39.ttf | Bin 1920 -> 1916 bytes
+ ...oColorEmoji.subset.index_format3.default.AE.ttf | Bin 4412 -> 4408 bytes
+ ...t.index_format3.drop-hints-retain-gids.2049.ttf | Bin 3136 -> 3132 bytes
+ ...ndex_format3.drop-hints-retain-gids.38,2049.ttf | Bin 4104 -> 4100 bytes
+ ...ndex_format3.drop-hints-retain-gids.38,20E3.ttf | Bin 3596 -> 3592 bytes
+ ...rop-hints-retain-gids.38,39,AE,2049,38,20E3.ttf | Bin 10112 -> 10112 bytes
+ ...x_format3.drop-hints-retain-gids.38,AE,2049.ttf | Bin 7556 -> 7552 bytes
+ ...set.index_format3.drop-hints-retain-gids.39.ttf | Bin 1928 -> 1924 bytes
+ ...set.index_format3.drop-hints-retain-gids.AE.ttf | Bin 4428 -> 4424 bytes
+ ...rEmoji.subset.index_format3.drop-hints.2049.ttf | Bin 3112 -> 3108 bytes
+ ...oji.subset.index_format3.drop-hints.38,2049.ttf | Bin 4080 -> 4076 bytes
+ ...oji.subset.index_format3.drop-hints.38,20E3.ttf | Bin 3564 -> 3560 bytes
+ ...ex_format3.drop-hints.38,39,AE,2049,38,20E3.ttf | Bin 10112 -> 10112 bytes
+ ....subset.index_format3.drop-hints.38,AE,2049.ttf | Bin 7536 -> 7536 bytes
+ ...lorEmoji.subset.index_format3.drop-hints.39.ttf | Bin 1920 -> 1916 bytes
+ ...lorEmoji.subset.index_format3.drop-hints.AE.ttf | Bin 4412 -> 4408 bytes
+ ...Emoji.subset.index_format3.retain-gids.2049.ttf | Bin 3136 -> 3132 bytes
+ ...ji.subset.index_format3.retain-gids.38,2049.ttf | Bin 4104 -> 4100 bytes
+ ...ji.subset.index_format3.retain-gids.38,20E3.ttf | Bin 3596 -> 3592 bytes
+ ...x_format3.retain-gids.38,39,AE,2049,38,20E3.ttf | Bin 10112 -> 10112 bytes
+ ...subset.index_format3.retain-gids.38,AE,2049.ttf | Bin 7556 -> 7552 bytes
+ ...orEmoji.subset.index_format3.retain-gids.39.ttf | Bin 1928 -> 1924 bytes
+ ...orEmoji.subset.index_format3.retain-gids.AE.ttf | Bin 4428 -> 4424 bytes
+ ...eSansPro-Regular.default.1FC,21,41,20,62,63.otf | Bin 2180 -> 4192 bytes
+ .../SourceSansPro-Regular.default.61,62,63.otf     | Bin 1892 -> 3856 bytes
+ ...ourceSansPro-Regular.default.D7,D8,D9,DA,DE.otf | Bin 2008 -> 3144 bytes
+ ...subroutinize-retain-gids.1FC,21,41,20,62,63.otf | Bin 19796 -> 30788 bytes
+ ...Regular.desubroutinize-retain-gids.61,62,63.otf | Bin 1992 -> 30908 bytes
+ ...r.desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf | Bin 30208 -> 31336 bytes
+ ...o-Regular.desubroutinize.1FC,21,41,20,62,63.otf | Bin 2036 -> 3968 bytes
+ ...urceSansPro-Regular.desubroutinize.61,62,63.otf | Bin 1796 -> 3556 bytes
+ ...nsPro-Regular.desubroutinize.D7,D8,D9,DA,DE.otf | Bin 1992 -> 3168 bytes
+ ...subroutinize-retain-gids.1FC,21,41,20,62,63.otf | Bin 19636 -> 30500 bytes
+ ...p-hints-desubroutinize-retain-gids.61,62,63.otf | Bin 1868 -> 30668 bytes
+ ...s-desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf | Bin 30060 -> 31124 bytes
+ ...rop-hints-desubroutinize.1FC,21,41,20,62,63.otf | Bin 1876 -> 3680 bytes
+ ...-Regular.drop-hints-desubroutinize.61,62,63.otf | Bin 1672 -> 3320 bytes
+ ...ar.drop-hints-desubroutinize.D7,D8,D9,DA,DE.otf | Bin 1844 -> 2952 bytes
+ ...r.drop-hints-retain-gids.1FC,21,41,20,62,63.otf | Bin 19728 -> 30636 bytes
+ ...Pro-Regular.drop-hints-retain-gids.61,62,63.otf | Bin 1904 -> 30888 bytes
+ ...gular.drop-hints-retain-gids.D7,D8,D9,DA,DE.otf | Bin 30072 -> 31104 bytes
+ ...nsPro-Regular.drop-hints.1FC,21,41,20,62,63.otf | Bin 1960 -> 3820 bytes
+ .../SourceSansPro-Regular.drop-hints.61,62,63.otf  | Bin 1736 -> 3524 bytes
+ ...ceSansPro-Regular.drop-hints.D7,D8,D9,DA,DE.otf | Bin 1860 -> 2932 bytes
+ ...sPro-Regular.retain-gids.1FC,21,41,20,62,63.otf | Bin 19948 -> 31012 bytes
+ .../SourceSansPro-Regular.retain-gids.61,62,63.otf | Bin 2060 -> 31208 bytes
+ ...eSansPro-Regular.retain-gids.D7,D8,D9,DA,DE.otf | Bin 30224 -> 31312 bytes
+ ...ubset.default.3042,3044,3046,3048,304A,304B.otf | Bin 3036 -> 4884 bytes
+ ...ubset.default.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 3248 -> 6276 bytes
+ ...eHanSans-Regular_subset.default.61,63,65,6B.otf | Bin 2208 -> 2588 bytes
+ ...ubset.default.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 3468 -> 6736 bytes
+ .../SourceHanSans-Regular_subset.default.660E.otf  | Bin 1928 -> 2456 bytes
+ ...e-retain-gids.3042,3044,3046,3048,304A,304B.otf | Bin 8932 -> 129876 bytes
+ ...e-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 116080 -> 130920 bytes
+ ...bset.desubroutinize-retain-gids.61,63,65,6B.otf | Bin 3016 -> 3412 bytes
+ ...e-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 116264 -> 122048 bytes
+ ...ular_subset.desubroutinize-retain-gids.660E.otf | Bin 50224 -> 50760 bytes
+ ...esubroutinize.3042,3044,3046,3048,304A,304B.otf | Bin 2960 -> 4724 bytes
+ ...esubroutinize.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 3144 -> 5928 bytes
+ ...s-Regular_subset.desubroutinize.61,63,65,6B.otf | Bin 2140 -> 2520 bytes
+ ...esubroutinize.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 3264 -> 6232 bytes
+ ...eHanSans-Regular_subset.desubroutinize.660E.otf | Bin 1904 -> 2440 bytes
+ ...e-retain-gids.3042,3044,3046,3048,304A,304B.otf | Bin 8672 -> 129448 bytes
+ ...e-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 115768 -> 130312 bytes
+ ...ints-desubroutinize-retain-gids.61,63,65,6B.otf | Bin 2892 -> 3288 bytes
+ ...e-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 115884 -> 121284 bytes
+ ....drop-hints-desubroutinize-retain-gids.660E.otf | Bin 50040 -> 50540 bytes
+ ...esubroutinize.3042,3044,3046,3048,304A,304B.otf | Bin 2800 -> 4420 bytes
+ ...esubroutinize.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 2904 -> 5416 bytes
+ ...ubset.drop-hints-desubroutinize.61,63,65,6B.otf | Bin 2036 -> 2416 bytes
+ ...esubroutinize.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 2972 -> 5556 bytes
+ ...gular_subset.drop-hints-desubroutinize.660E.otf | Bin 1812 -> 2308 bytes
+ ...s-retain-gids.3042,3044,3046,3048,304A,304B.otf | Bin 8740 -> 129576 bytes
+ ...s-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 115864 -> 130604 bytes
+ ...r_subset.drop-hints-retain-gids.61,63,65,6B.otf | Bin 2852 -> 3248 bytes
+ ...s-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 116084 -> 121776 bytes
+ ...-Regular_subset.drop-hints-retain-gids.660E.otf | Bin 50060 -> 50552 bytes
+ ...et.drop-hints.3042,3044,3046,3048,304A,304B.otf | Bin 2856 -> 4548 bytes
+ ...et.drop-hints.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 2996 -> 5708 bytes
+ ...nSans-Regular_subset.drop-hints.61,63,65,6B.otf | Bin 2068 -> 2448 bytes
+ ...et.drop-hints.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 3172 -> 6048 bytes
+ ...ourceHanSans-Regular_subset.drop-hints.660E.otf | Bin 1832 -> 2316 bytes
+ ...t.retain-gids.3042,3044,3046,3048,304A,304B.otf | Bin 9016 -> 130036 bytes
+ ...t.retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 116184 -> 131272 bytes
+ ...Sans-Regular_subset.retain-gids.61,63,65,6B.otf | Bin 3012 -> 3408 bytes
+ ...t.retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 116468 -> 122552 bytes
+ ...urceHanSans-Regular_subset.retain-gids.660E.otf | Bin 50244 -> 50776 bytes
+ .../TwemojiMozilla.subset.default.32,3297,3299.ttf | Bin 5624 -> 5712 bytes
+ .../colr/TwemojiMozilla.subset.default.32,3297.ttf | Bin 5088 -> 5176 bytes
+ .../colr/TwemojiMozilla.subset.default.32,3299.ttf | Bin 5264 -> 5352 bytes
+ .../colr/TwemojiMozilla.subset.default.32.ttf      | Bin 4664 -> 4748 bytes
+ .../TwemojiMozilla.subset.default.3297,3299.ttf    | Bin 5604 -> 5692 bytes
+ .../colr/TwemojiMozilla.subset.default.3297.ttf    | Bin 5068 -> 5152 bytes
+ .../colr/TwemojiMozilla.subset.default.3299.ttf    | Bin 5244 -> 5328 bytes
+ ....subset.drop-hints-retain-gids.32,3297,3299.ttf | Bin 5604 -> 5692 bytes
+ ...zilla.subset.drop-hints-retain-gids.32,3297.ttf | Bin 5084 -> 5172 bytes
+ ...zilla.subset.drop-hints-retain-gids.32,3299.ttf | Bin 5264 -> 5352 bytes
+ ...ojiMozilla.subset.drop-hints-retain-gids.32.ttf | Bin 4644 -> 4728 bytes
+ ...lla.subset.drop-hints-retain-gids.3297,3299.ttf | Bin 5588 -> 5676 bytes
+ ...iMozilla.subset.drop-hints-retain-gids.3297.ttf | Bin 5064 -> 5148 bytes
+ ...iMozilla.subset.drop-hints-retain-gids.3299.ttf | Bin 5244 -> 5328 bytes
+ ...emojiMozilla.subset.drop-hints.32,3297,3299.ttf | Bin 5604 -> 5692 bytes
+ .../TwemojiMozilla.subset.drop-hints.32,3297.ttf   | Bin 5068 -> 5156 bytes
+ .../TwemojiMozilla.subset.drop-hints.32,3299.ttf   | Bin 5244 -> 5332 bytes
+ .../colr/TwemojiMozilla.subset.drop-hints.32.ttf   | Bin 4644 -> 4728 bytes
+ .../TwemojiMozilla.subset.drop-hints.3297,3299.ttf | Bin 5584 -> 5672 bytes
+ .../colr/TwemojiMozilla.subset.drop-hints.3297.ttf | Bin 5048 -> 5132 bytes
+ .../colr/TwemojiMozilla.subset.drop-hints.3299.ttf | Bin 5224 -> 5308 bytes
+ ...mojiMozilla.subset.retain-gids.32,3297,3299.ttf | Bin 5624 -> 5712 bytes
+ .../TwemojiMozilla.subset.retain-gids.32,3297.ttf  | Bin 5104 -> 5192 bytes
+ .../TwemojiMozilla.subset.retain-gids.32,3299.ttf  | Bin 5284 -> 5372 bytes
+ .../colr/TwemojiMozilla.subset.retain-gids.32.ttf  | Bin 4664 -> 4748 bytes
+ ...TwemojiMozilla.subset.retain-gids.3297,3299.ttf | Bin 5608 -> 5696 bytes
+ .../TwemojiMozilla.subset.retain-gids.3297.ttf     | Bin 5084 -> 5168 bytes
+ .../TwemojiMozilla.subset.retain-gids.3299.ttf     | Bin 5264 -> 5348 bytes
+ .../Roboto-Regular.default.1FC,21,41,20,62,63.ttf  | Bin 2984 -> 4656 bytes
+ .../full-font/Roboto-Regular.default.61,62,63.ttf  | Bin 2580 -> 3904 bytes
+ .../Roboto-Regular.default.D7,D8,D9,DA,DE.ttf      | Bin 2944 -> 3976 bytes
+ ...oboto-Regular.drop-hints.1FC,21,41,20,62,63.ttf | Bin 1436 -> 2532 bytes
+ .../Roboto-Regular.drop-hints.61,62,63.ttf         | Bin 1228 -> 2116 bytes
+ .../Roboto-Regular.drop-hints.D7,D8,D9,DA,DE.ttf   | Bin 1464 -> 2192 bytes
+ ...ifVariable-Roman.default.1FC,21,41,20,62,63.ttf | Bin 3572 -> 6876 bytes
+ .../SourceSerifVariable-Roman.default.61,62,63.ttf | Bin 3540 -> 6552 bytes
+ ...eSerifVariable-Roman.default.D7,D8,D9,DA,DE.ttf | Bin 4032 -> 6136 bytes
+ ...ariable-Roman.drop-hints.1FC,21,41,20,62,63.ttf | Bin 3572 -> 6612 bytes
+ ...urceSerifVariable-Roman.drop-hints.61,62,63.ttf | Bin 3540 -> 6356 bytes
+ ...rifVariable-Roman.drop-hints.D7,D8,D9,DA,DE.ttf | Bin 4032 -> 5880 bytes
+ .../Mplus1p-Regular.default.1D715,1D7D8,41,42.ttf  | Bin 2108 -> 2344 bytes
+ .../japanese/Mplus1p-Regular.default.25771.ttf     | Bin 1824 -> 1992 bytes
+ ...gular.default.3042,3044,3046,3048,304A,304B.ttf | Bin 2532 -> 2704 bytes
+ ...gular.default.3042,3044,3046,73E0,5EA6,8F38.ttf | Bin 2776 -> 2948 bytes
+ .../Mplus1p-Regular.default.61,63,65,6B.ttf        | Bin 2076 -> 2324 bytes
+ ...gular.default.660E,6975,73E0,5EA6,8F38,6E05.ttf | Bin 3072 -> 3244 bytes
+ .../japanese/Mplus1p-Regular.default.660E.ttf      | Bin 1816 -> 1984 bytes
+ ...plus1p-Regular.drop-hints.1D715,1D7D8,41,42.ttf | Bin 1380 -> 1616 bytes
+ .../japanese/Mplus1p-Regular.drop-hints.25771.ttf  | Bin 1096 -> 1264 bytes
+ ...ar.drop-hints.3042,3044,3046,3048,304A,304B.ttf | Bin 1804 -> 1976 bytes
+ ...ar.drop-hints.3042,3044,3046,73E0,5EA6,8F38.ttf | Bin 2048 -> 2220 bytes
+ .../Mplus1p-Regular.drop-hints.61,63,65,6B.ttf     | Bin 1348 -> 1596 bytes
+ ...ar.drop-hints.660E,6975,73E0,5EA6,8F38,6E05.ttf | Bin 2344 -> 2516 bytes
+ .../japanese/Mplus1p-Regular.drop-hints.660E.ttf   | Bin 1088 -> 1256 bytes
+ ...Mplus1p-Regular.keep-gdef.1D715,1D7D8,41,42.ttf | Bin 2148 -> 2344 bytes
+ .../japanese/Mplus1p-Regular.keep-gdef.25771.ttf   | Bin 1860 -> 1992 bytes
+ ...lar.keep-gdef.3042,3044,3046,3048,304A,304B.ttf | Bin 2572 -> 2704 bytes
+ ...lar.keep-gdef.3042,3044,3046,73E0,5EA6,8F38.ttf | Bin 2816 -> 2948 bytes
+ .../Mplus1p-Regular.keep-gdef.61,63,65,6B.ttf      | Bin 2116 -> 2324 bytes
+ ...lar.keep-gdef.660E,6975,73E0,5EA6,8F38,6E05.ttf | Bin 3112 -> 3244 bytes
+ .../japanese/Mplus1p-Regular.keep-gdef.660E.ttf    | Bin 1852 -> 1984 bytes
+ ...ext1_multiple_subrules_f1.default.41,42,43.otf} | Bin
+ ...ontext1_multiple_subrules_f1.default.41,42.otf} | Bin
+ ...ontext1_multiple_subrules_f1.default.41,43.otf} | Bin
+ ...s_context1_multiple_subrules_f1.default.41.otf} | Bin
+ ...e_subrules_f1.default.retain-all-codepoint.otf} | Bin
+ ..._multiple_subrules_f1.retain-gids.41,42,43.otf} | Bin
+ ...xt1_multiple_subrules_f1.retain-gids.41,42.otf} | Bin
+ ...xt1_multiple_subrules_f1.retain-gids.41,43.otf} | Bin
+ ...ntext1_multiple_subrules_f1.retain-gids.41.otf} | Bin
+ ...brules_f1.retain-gids.retain-all-codepoint.otf} | Bin
+ ...ext2_multiple_subrules_f1.default.41,42,43.otf} | Bin
+ ...ontext2_multiple_subrules_f1.default.41,42.otf} | Bin
+ ...ontext2_multiple_subrules_f1.default.41,43.otf} | Bin
+ ...s_context2_multiple_subrules_f1.default.41.otf} | Bin
+ ...e_subrules_f1.default.retain-all-codepoint.otf} | Bin
+ ..._multiple_subrules_f1.retain-gids.41,42,43.otf} | Bin
+ ...xt2_multiple_subrules_f1.retain-gids.41,42.otf} | Bin
+ ...xt2_multiple_subrules_f1.retain-gids.41,43.otf} | Bin
+ ...ntext2_multiple_subrules_f1.retain-gids.41.otf} | Bin
+ ...brules_f1.retain-gids.retain-all-codepoint.otf} | Bin
+ ...> gpos_context3_simple_f1.default.41,42,43.otf} | Bin
+ ...f => gpos_context3_simple_f1.default.41,42.otf} | Bin
+ ...f => gpos_context3_simple_f1.default.41,43.otf} | Bin
+ ....otf => gpos_context3_simple_f1.default.41.otf} | Bin
+ ...xt3_simple_f1.default.retain-all-codepoint.otf} | Bin
+ ...os_context3_simple_f1.retain-gids.41,42,43.otf} | Bin
+ ... gpos_context3_simple_f1.retain-gids.41,42.otf} | Bin
+ ... gpos_context3_simple_f1.retain-gids.41,43.otf} | Bin
+ ... => gpos_context3_simple_f1.retain-gids.41.otf} | Bin
+ ...simple_f1.retain-gids.retain-all-codepoint.otf} | Bin
+ .../IndicTestJalandhar-Regular.default.A01.ttf     | Bin 4088 -> 4220 bytes
+ .../IndicTestJalandhar-Regular.default.A05,A06.ttf | Bin 4652 -> 4796 bytes
+ .../IndicTestJalandhar-Regular.default.A07,A1B.ttf | Bin 4620 -> 4768 bytes
+ ...andhar-Regular.default.retain-all-codepoint.ttf | Bin 28176 -> 49288 bytes
+ .../IndicTestJalandhar-Regular.drop-hints.A01.ttf  | Bin 948 -> 1080 bytes
+ ...dicTestJalandhar-Regular.drop-hints.A05,A06.ttf | Bin 1244 -> 1388 bytes
+ ...dicTestJalandhar-Regular.drop-hints.A07,A1B.ttf | Bin 1240 -> 1388 bytes
+ ...har-Regular.drop-hints.retain-all-codepoint.ttf | Bin 15200 -> 29504 bytes
+ .../IndicTestJalandhar-Regular.keep-gdef.A01.ttf   | Bin 4140 -> 4220 bytes
+ ...ndicTestJalandhar-Regular.keep-gdef.A05,A06.ttf | Bin 4716 -> 4796 bytes
+ ...ndicTestJalandhar-Regular.keep-gdef.A07,A1B.ttf | Bin 4688 -> 4768 bytes
+ ...dhar-Regular.keep-gdef.retain-all-codepoint.ttf | Bin 28604 -> 49288 bytes
+ .../AdobeVFPrototype.default.41,42,43,57.otf       | Bin 4960 -> 5460 bytes
+ .../AdobeVFPrototype.default.41,42,43.otf          | Bin 4540 -> 4932 bytes
+ .../AdobeVFPrototype.default.41,42.otf             | Bin 4132 -> 4452 bytes
+ .../AdobeVFPrototype.default.41,56,57.otf          | Bin 4152 -> 4600 bytes
+ .../AdobeVFPrototype.default.41.otf                | Bin 3468 -> 3748 bytes
+ .../AdobeVFPrototype.default.42,57.otf             | Bin 4208 -> 4584 bytes
+ .../AdobeVFPrototype.drop-hints.41,42,43,57.otf    | Bin 4772 -> 5180 bytes
+ .../AdobeVFPrototype.drop-hints.41,42,43.otf       | Bin 4352 -> 4688 bytes
+ .../AdobeVFPrototype.drop-hints.41,42.otf          | Bin 3944 -> 4236 bytes
+ .../AdobeVFPrototype.drop-hints.41,56,57.otf       | Bin 3964 -> 4348 bytes
+ .../AdobeVFPrototype.drop-hints.41.otf             | Bin 3280 -> 3552 bytes
+ .../AdobeVFPrototype.drop-hints.42,57.otf          | Bin 4020 -> 4364 bytes
+ ...AdobeVFPrototype.keep-gdef-gpos.41,42,43,57.otf | Bin 5400 -> 5460 bytes
+ .../AdobeVFPrototype.keep-gdef-gpos.41,42,43.otf   | Bin 4872 -> 4932 bytes
+ .../AdobeVFPrototype.keep-gdef-gpos.41,42.otf      | Bin 4392 -> 4452 bytes
+ .../AdobeVFPrototype.keep-gdef-gpos.41,56,57.otf   | Bin 4540 -> 4600 bytes
+ .../AdobeVFPrototype.keep-gdef-gpos.41.otf         | Bin 3688 -> 3748 bytes
+ .../AdobeVFPrototype.keep-gdef-gpos.42,57.otf      | Bin 4524 -> 4584 bytes
+ .../Roboto-Regular.default.1E00,303.ttf            | Bin 2456 -> 2720 bytes
+ .../layout.gdef/Roboto-Regular.default.303.ttf     | Bin 2128 -> 2312 bytes
+ .../Roboto-Regular.default.309,20,30F.ttf          | Bin 2220 -> 2408 bytes
+ .../layout.gdef/Roboto-Regular.default.323.ttf     | Bin 2020 -> 2204 bytes
+ .../Roboto-Regular.default.41,42,43.ttf            | Bin 2480 -> 3668 bytes
+ .../Roboto-Regular.drop-hints.1E00,303.ttf         | Bin 1204 -> 1468 bytes
+ .../layout.gdef/Roboto-Regular.drop-hints.303.ttf  | Bin 1012 -> 1196 bytes
+ .../Roboto-Regular.drop-hints.309,20,30F.ttf       | Bin 1068 -> 1256 bytes
+ .../layout.gdef/Roboto-Regular.drop-hints.323.ttf  | Bin 952 -> 1136 bytes
+ .../Roboto-Regular.drop-hints.41,42,43.ttf         | Bin 1188 -> 2036 bytes
+ .../Roboto-Regular.keep-gdef-gpos.1E00,303.ttf     | Bin 2648 -> 2720 bytes
+ .../Roboto-Regular.keep-gdef-gpos.303.ttf          | Bin 2240 -> 2312 bytes
+ .../Roboto-Regular.keep-gdef-gpos.309,20,30F.ttf   | Bin 2336 -> 2408 bytes
+ .../Roboto-Regular.keep-gdef-gpos.323.ttf          | Bin 2132 -> 2204 bytes
+ .../Roboto-Regular.keep-gdef-gpos.41,42,43.ttf     | Bin 2728 -> 3668 bytes
+ ...ut.41,43.otf => gpos1_2_font.default.41,43.otf} | Bin
+ ...ut.41,46.otf => gpos1_2_font.default.41,46.otf} | Bin
+ ...p-layout.41.otf => gpos1_2_font.default.41.otf} | Bin
+ ...ut.42,44.otf => gpos1_2_font.default.42,44.otf} | Bin
+ ...ut.43,46.otf => gpos1_2_font.default.43,46.otf} | Bin
+ ... gpos1_2_font.default.retain-all-codepoint.otf} | Bin
+ ...1,43.otf => gpos1_2_font.retain-gids.41,43.otf} | Bin
+ ...1,46.otf => gpos1_2_font.retain-gids.41,46.otf} | Bin
+ ...gids.41.otf => gpos1_2_font.retain-gids.41.otf} | Bin
+ ...2,44.otf => gpos1_2_font.retain-gids.42,44.otf} | Bin
+ ...3,46.otf => gpos1_2_font.retain-gids.43,46.otf} | Bin
+ ...s1_2_font.retain-gids.retain-all-codepoint.otf} | Bin
+ ...3,25.otf => gpos2_1_font7.default.21,23,25.otf} | Bin
+ ...t.21,23.otf => gpos2_1_font7.default.21,23.otf} | Bin
+ ...t.2E,23.otf => gpos2_1_font7.default.2E,23.otf} | Bin
+ ...2,43.otf => gpos2_1_font7.default.41,42,43.otf} | Bin
+ ...gpos2_1_font7.default.retain-all-codepoint.otf} | Bin
+ ....otf => gpos2_1_font7.retain-gids.21,23,25.otf} | Bin
+ ...,23.otf => gpos2_1_font7.retain-gids.21,23.otf} | Bin
+ ...,23.otf => gpos2_1_font7.retain-gids.2E,23.otf} | Bin
+ ....otf => gpos2_1_font7.retain-gids.41,42,43.otf} | Bin
+ ...2_1_font7.retain-gids.retain-all-codepoint.otf} | Bin
+ ...3,25.otf => gpos2_2_font5.default.21,23,25.otf} | Bin
+ ...t.21,23.otf => gpos2_2_font5.default.21,23.otf} | Bin
+ ...t.2E,23.otf => gpos2_2_font5.default.2E,23.otf} | Bin
+ ...2,43.otf => gpos2_2_font5.default.41,42,43.otf} | Bin
+ ...gpos2_2_font5.default.retain-all-codepoint.otf} | Bin
+ ....otf => gpos2_2_font5.retain-gids.21,23,25.otf} | Bin
+ ...,23.otf => gpos2_2_font5.retain-gids.21,23.otf} | Bin
+ ...,23.otf => gpos2_2_font5.retain-gids.2E,23.otf} | Bin
+ ....otf => gpos2_2_font5.retain-gids.41,42,43.otf} | Bin
+ ...2_2_font5.retain-gids.retain-all-codepoint.otf} | Bin
+ ...out.28,29.otf => gpos3_font3.default.28,29.otf} | Bin
+ ...out.28,2B.otf => gpos3_font3.default.28,2B.otf} | Bin
+ ...out.29,2B.otf => gpos3_font3.default.29,2B.otf} | Bin
+ ...,42,43.otf => gpos3_font3.default.41,42,43.otf} | Bin
+ ...> gpos3_font3.default.retain-all-codepoint.otf} | Bin
+ ...28,29.otf => gpos3_font3.retain-gids.28,29.otf} | Bin
+ ...28,2B.otf => gpos3_font3.retain-gids.28,2B.otf} | Bin
+ ...29,2B.otf => gpos3_font3.retain-gids.29,2B.otf} | Bin
+ ...43.otf => gpos3_font3.retain-gids.41,42,43.otf} | Bin
+ ...os3_font3.retain-gids.retain-all-codepoint.otf} | Bin
+ ...os4_multiple_anchors_1.default.41,42,43,44.otf} | Bin
+ ...os4_multiple_anchors_1.default.41,42,43,45.otf} | Bin
+ ... gpos4_multiple_anchors_1.default.41,42,43.otf} | Bin
+ ... => gpos4_multiple_anchors_1.default.41,42.otf} | Bin
+ ..._multiple_anchors_1.default.41,43,44,45,46.otf} | Bin
+ ... gpos4_multiple_anchors_1.default.41,43,44.otf} | Bin
+ ... gpos4_multiple_anchors_1.default.41,43,45.otf} | Bin
+ ... => gpos4_multiple_anchors_1.default.41,43.otf} | Bin
+ ...otf => gpos4_multiple_anchors_1.default.41.otf} | Bin
+ ...ple_anchors_1.default.retain-all-codepoint.otf} | Bin
+ ...multiple_anchors_1.retain-gids.41,42,43,44.otf} | Bin
+ ...multiple_anchors_1.retain-gids.41,42,43,45.otf} | Bin
+ ...s4_multiple_anchors_1.retain-gids.41,42,43.otf} | Bin
+ ...gpos4_multiple_anchors_1.retain-gids.41,42.otf} | Bin
+ ...tiple_anchors_1.retain-gids.41,43,44,45,46.otf} | Bin
+ ...s4_multiple_anchors_1.retain-gids.41,43,44.otf} | Bin
+ ...s4_multiple_anchors_1.retain-gids.41,43,45.otf} | Bin
+ ...gpos4_multiple_anchors_1.retain-gids.41,43.otf} | Bin
+ ...=> gpos4_multiple_anchors_1.retain-gids.41.otf} | Bin
+ ...anchors_1.retain-gids.retain-all-codepoint.otf} | Bin
+ ...,44.otf => gpos5_font1.default.41,42,43,44.otf} | Bin
+ ...,45.otf => gpos5_font1.default.41,42,43,45.otf} | Bin
+ ...,42,43.otf => gpos5_font1.default.41,42,43.otf} | Bin
+ ...,42,44.otf => gpos5_font1.default.41,42,44.otf} | Bin
+ ...,42,45.otf => gpos5_font1.default.41,42,45.otf} | Bin
+ ...out.41,42.otf => gpos5_font1.default.41,42.otf} | Bin
+ ...out.41,43.otf => gpos5_font1.default.41,43.otf} | Bin
+ ...ep-layout.41.otf => gpos5_font1.default.41.otf} | Bin
+ ...ep-layout.42.otf => gpos5_font1.default.42.otf} | Bin
+ ...> gpos5_font1.default.retain-all-codepoint.otf} | Bin
+ ...otf => gpos5_font1.retain-gids.41,42,43,44.otf} | Bin
+ ...otf => gpos5_font1.retain-gids.41,42,43,45.otf} | Bin
+ ...43.otf => gpos5_font1.retain-gids.41,42,43.otf} | Bin
+ ...44.otf => gpos5_font1.retain-gids.41,42,44.otf} | Bin
+ ...45.otf => gpos5_font1.retain-gids.41,42,45.otf} | Bin
+ ...41,42.otf => gpos5_font1.retain-gids.41,42.otf} | Bin
+ ...41,43.otf => gpos5_font1.retain-gids.41,43.otf} | Bin
+ ...-gids.41.otf => gpos5_font1.retain-gids.41.otf} | Bin
+ ...-gids.42.otf => gpos5_font1.retain-gids.42.otf} | Bin
+ ...os5_font1.retain-gids.retain-all-codepoint.otf} | Bin
+ ...,44.otf => gpos6_font1.default.41,42,43,44.otf} | Bin
+ ...,45.otf => gpos6_font1.default.41,42,43,45.otf} | Bin
+ ...,42,43.otf => gpos6_font1.default.41,42,43.otf} | Bin
+ ...out.41,42.otf => gpos6_font1.default.41,42.otf} | Bin
+ ....otf => gpos6_font1.default.41,43,44,45,46.otf} | Bin
+ ...,43,44.otf => gpos6_font1.default.41,43,44.otf} | Bin
+ ...,43,45.otf => gpos6_font1.default.41,43,45.otf} | Bin
+ ...out.41,43.otf => gpos6_font1.default.41,43.otf} | Bin
+ ...ep-layout.41.otf => gpos6_font1.default.41.otf} | Bin
+ ...> gpos6_font1.default.retain-all-codepoint.otf} | Bin
+ ...otf => gpos6_font1.retain-gids.41,42,43,44.otf} | Bin
+ ...otf => gpos6_font1.retain-gids.41,42,43,45.otf} | Bin
+ ...43.otf => gpos6_font1.retain-gids.41,42,43.otf} | Bin
+ ...41,42.otf => gpos6_font1.retain-gids.41,42.otf} | Bin
+ ... => gpos6_font1.retain-gids.41,43,44,45,46.otf} | Bin
+ ...44.otf => gpos6_font1.retain-gids.41,43,44.otf} | Bin
+ ...45.otf => gpos6_font1.retain-gids.41,43,45.otf} | Bin
+ ...41,43.otf => gpos6_font1.retain-gids.41,43.otf} | Bin
+ ...-gids.41.otf => gpos6_font1.retain-gids.41.otf} | Bin
+ ...os6_font1.retain-gids.retain-all-codepoint.otf} | Bin
+ ...lar.default.627,644,623,62D,644,627,645,2E.ttf} | Bin
+ ...f => Amiri-Regular.default.627,644,62D,628.ttf} | Bin
+ ...7,644.ttf => Amiri-Regular.default.627,644.ttf} | Bin
+ ...Regular.default.633,645,627,621,20,644,627.ttf} | Bin
+ ...1.ttf => Amiri-Regular.default.63A,64A,631.ttf} | Bin
+ ...retain-gids.627,644,623,62D,644,627,645,2E.ttf} | Bin
+ ... Amiri-Regular.retain-gids.627,644,62D,628.ttf} | Bin
+ ...4.ttf => Amiri-Regular.retain-gids.627,644.ttf} | Bin
+ ...lar.retain-gids.633,645,627,621,20,644,627.ttf} | Bin
+ ...f => Amiri-Regular.retain-gids.63A,64A,631.ttf} | Bin
+ ...1_multiple_subrules_f1.default.30,31,32,33.otf} | Bin
+ ...ing1_multiple_subrules_f1.default.41,42,43.otf} | Bin
+ ...e_subrules_f1.default.retain-all-codepoint.otf} | Bin
+ ...ltiple_subrules_f1.retain-gids.30,31,32,33.otf} | Bin
+ ..._multiple_subrules_f1.retain-gids.41,42,43.otf} | Bin
+ ...brules_f1.retain-gids.retain-all-codepoint.otf} | Bin
+ ...2_multiple_subrules_f1.default.30,31,32,33.otf} | Bin
+ ...ing2_multiple_subrules_f1.default.41,42,43.otf} | Bin
+ ...e_subrules_f1.default.retain-all-codepoint.otf} | Bin
+ ...ltiple_subrules_f1.retain-gids.30,31,32,33.otf} | Bin
+ ..._multiple_subrules_f1.retain-gids.41,42,43.otf} | Bin
+ ...brules_f1.retain-gids.retain-all-codepoint.otf} | Bin
+ ...os_chaining3_simple_f1.default.30,31,32,33.otf} | Bin
+ ... gpos_chaining3_simple_f1.default.41,42,43.otf} | Bin
+ ...ng3_simple_f1.default.retain-all-codepoint.otf} | Bin
+ ...haining3_simple_f1.retain-gids.30,31,32,33.otf} | Bin
+ ...s_chaining3_simple_f1.retain-gids.41,42,43.otf} | Bin
+ ...simple_f1.retain-gids.retain-all-codepoint.otf} | Bin
+ ...out.41,42.otf => gpos9_font2.default.41,42.otf} | Bin
+ ...ep-layout.41.otf => gpos9_font2.default.41.otf} | Bin
+ ...ep-layout.42.otf => gpos9_font2.default.42.otf} | Bin
+ ...41,42.otf => gpos9_font2.retain-gids.41,42.otf} | Bin
+ ...-gids.41.otf => gpos9_font2.retain-gids.41.otf} | Bin
+ ...-gids.42.otf => gpos9_font2.retain-gids.42.otf} | Bin
+ ...b_alternate_substitution.default.53A9,53F1.otf} | Bin
+ ...> gsub_alternate_substitution.default.53A9.otf} | Bin
+ ...> gsub_alternate_substitution.default.53F1.otf} | Bin
+ ..._substitution.default.retain-all-codepoint.otf} | Bin
+ ...ternate_substitution.retain-gids.53A9,53F1.otf} | Bin
+ ...ub_alternate_substitution.retain-gids.53A9.otf} | Bin
+ ...ub_alternate_substitution.retain-gids.53F1.otf} | Bin
+ ...stitution.retain-gids.retain-all-codepoint.otf} | Bin
+ ...ext1_multiple_subrules_f2.default.41,42,43.otf} | Bin
+ ...ontext1_multiple_subrules_f2.default.41,42.otf} | Bin
+ ...ontext1_multiple_subrules_f2.default.41,43.otf} | Bin
+ ...b_context1_multiple_subrules_f2.default.41.otf} | Bin
+ ...e_subrules_f2.default.retain-all-codepoint.otf} | Bin
+ ..._multiple_subrules_f2.retain-gids.41,42,43.otf} | Bin
+ ...xt1_multiple_subrules_f2.retain-gids.41,42.otf} | Bin
+ ...xt1_multiple_subrules_f2.retain-gids.41,43.otf} | Bin
+ ...ntext1_multiple_subrules_f2.retain-gids.41.otf} | Bin
+ ...brules_f2.retain-gids.retain-all-codepoint.otf} | Bin
+ ...ext2_multiple_subrules_f2.default.41,42,43.otf} | Bin
+ ...ontext2_multiple_subrules_f2.default.41,42.otf} | Bin
+ ...ontext2_multiple_subrules_f2.default.41,43.otf} | Bin
+ ...b_context2_multiple_subrules_f2.default.41.otf} | Bin
+ ...e_subrules_f2.default.retain-all-codepoint.otf} | Bin
+ ..._multiple_subrules_f2.retain-gids.41,42,43.otf} | Bin
+ ...xt2_multiple_subrules_f2.retain-gids.41,42.otf} | Bin
+ ...xt2_multiple_subrules_f2.retain-gids.41,43.otf} | Bin
+ ...ntext2_multiple_subrules_f2.retain-gids.41.otf} | Bin
+ ...brules_f2.retain-gids.retain-all-codepoint.otf} | Bin
+ ...ub_context3_successive_f1.default.41,42,43.otf} | Bin
+ ... gsub_context3_successive_f1.default.41,42.otf} | Bin
+ ... gsub_context3_successive_f1.default.41,43.otf} | Bin
+ ... => gsub_context3_successive_f1.default.41.otf} | Bin
+ ...successive_f1.default.retain-all-codepoint.otf} | Bin
+ ...ontext3_successive_f1.retain-gids.41,42,43.otf} | Bin
+ ...b_context3_successive_f1.retain-gids.41,42.otf} | Bin
+ ...b_context3_successive_f1.retain-gids.41,43.otf} | Bin
+ ...gsub_context3_successive_f1.retain-gids.41.otf} | Bin
+ ...essive_f1.retain-gids.retain-all-codepoint.otf} | Bin
+ ...1_multiple_subrules_f1.default.30,31,32,33.otf} | Bin
+ ...ing1_multiple_subrules_f1.default.41,42,43.otf} | Bin
+ ...e_subrules_f1.default.retain-all-codepoint.otf} | Bin
+ ...ltiple_subrules_f1.retain-gids.30,31,32,33.otf} | Bin
+ ..._multiple_subrules_f1.retain-gids.41,42,43.otf} | Bin
+ ...brules_f1.retain-gids.retain-all-codepoint.otf} | Bin
+ ...2_multiple_subrules_f1.default.30,31,32,33.otf} | Bin
+ ...ing2_multiple_subrules_f1.default.41,42,43.otf} | Bin
+ ...e_subrules_f1.default.retain-all-codepoint.otf} | Bin
+ ...ltiple_subrules_f1.retain-gids.30,31,32,33.otf} | Bin
+ ..._multiple_subrules_f1.retain-gids.41,42,43.otf} | Bin
+ ...brules_f1.retain-gids.retain-all-codepoint.otf} | Bin
+ ...ub_chaining3_simple_f2.default.30,31,32,33.otf} | Bin
+ ... gsub_chaining3_simple_f2.default.41,42,43.otf} | Bin
+ ...ng3_simple_f2.default.retain-all-codepoint.otf} | Bin
+ ...haining3_simple_f2.retain-gids.30,31,32,33.otf} | Bin
+ ...b_chaining3_simple_f2.retain-gids.41,42,43.otf} | Bin
+ ...simple_f2.retain-gids.retain-all-codepoint.otf} | Bin
+ ...created.default.41,42,43,44,45,46,47,48,49.otf} | Bin
+ ...ually_created.default.41,42,43,44,45,46,47.otf} | Bin
+ ...ually_created.default.41,42,43,44,45,46,4D.otf} | Bin
+ ...ually_created.default.41,42,43,44,45,46,51.otf} | Bin
+ ...manually_created.default.41,42,43,44,45,46.otf} | Bin
+ ...=> gsub8_manually_created.default.41,42,43.otf} | Bin
+ ...1.otf => gsub8_manually_created.default.41.otf} | Bin
+ ...1.otf => gsub8_manually_created.default.61.otf} | Bin
+ ...ually_created.default.retain-all-codepoint.otf} | Bin
+ ...ted.retain-gids.41,42,43,44,45,46,47,48,49.otf} | Bin
+ ...y_created.retain-gids.41,42,43,44,45,46,47.otf} | Bin
+ ...y_created.retain-gids.41,42,43,44,45,46,4D.otf} | Bin
+ ...y_created.retain-gids.41,42,43,44,45,46,51.otf} | Bin
+ ...ally_created.retain-gids.41,42,43,44,45,46.otf} | Bin
+ ...sub8_manually_created.retain-gids.41,42,43.otf} | Bin
+ ...f => gsub8_manually_created.retain-gids.41.otf} | Bin
+ ...f => gsub8_manually_created.retain-gids.61.otf} | Bin
+ ...y_created.retain-gids.retain-all-codepoint.otf} | Bin
+ .../Khmer.keep-layout-retain-gids.1780.ttf         | Bin 4464 -> 0 bytes
+ ...ids.1789,17BB,17C6,1794,17B6,1793,1798,17BE.ttf | Bin 7848 -> 0 bytes
+ .../Khmer.keep-layout-retain-gids.31.ttf           | Bin 4256 -> 0 bytes
+ .../layout.khmer/Khmer.keep-layout.1780.ttf        | Bin 4204 -> 0 bytes
+ ...out.1789,17BB,17C6,1794,17B6,1793,1798,17BE.ttf | Bin 6412 -> 0 bytes
+ .../expected/layout.khmer/Khmer.keep-layout.31.ttf | Bin 4140 -> 0 bytes
+ ...oNastaliqUrdu-Bold.retain-gids.627,644,62D.ttf} | Bin
+ ... Roboto-Regular.smallcaps.default.41,42,43.ttf} | Bin
+ ... => Roboto-Regular.smallcaps.default.41,43.ttf} | Bin
+ ...ttf => Roboto-Regular.smallcaps.default.41.ttf} | Bin
+ ...ttf => Roboto-Regular.smallcaps.default.43.ttf} | Bin
+ ... => Roboto-Regular.smallcaps.default.CA,CB.ttf} | Bin
+ ...oto-Regular.smallcaps.retain-gids.41,42,43.ttf} | Bin
+ ...Roboto-Regular.smallcaps.retain-gids.41,43.ttf} | Bin
+ ...=> Roboto-Regular.smallcaps.retain-gids.41.ttf} | Bin
+ ...=> Roboto-Regular.smallcaps.retain-gids.43.ttf} | Bin
+ ...Roboto-Regular.smallcaps.retain-gids.CA,CB.ttf} | Bin
+ .../Fraunces.keep-layout.26,66,69,124,125.ttf      | Bin 18496 -> 0 bytes
+ .../expected/variable/Fraunces.keep-layout.61.ttf  | Bin 5880 -> 0 bytes
+ .../data/profiles/keep-layout-drop-hints.txt       |   2 --
+ .../data/profiles/keep-layout-retain-gids.txt      |   2 --
+ test/subset/data/profiles/keep-layout.txt          |   1 -
+ test/subset/data/tests/basics.tests                |   2 --
+ test/subset/data/tests/layout.context.tests        |   4 ++--
+ test/subset/data/tests/layout.gpos.tests           |   4 ++--
+ test/subset/data/tests/layout.gpos2.tests          |   4 ++--
+ test/subset/data/tests/layout.gpos3.tests          |   4 ++--
+ test/subset/data/tests/layout.gpos4.tests          |   4 ++--
+ test/subset/data/tests/layout.gpos5.tests          |   4 ++--
+ test/subset/data/tests/layout.gpos6.tests          |   4 ++--
+ test/subset/data/tests/layout.gpos8.amiri.tests    |   4 ++--
+ test/subset/data/tests/layout.gpos8.tests          |   4 ++--
+ test/subset/data/tests/layout.gpos9.tests          |   4 ++--
+ test/subset/data/tests/layout.gsub3.tests          |   4 ++--
+ test/subset/data/tests/layout.gsub5.tests          |   4 ++--
+ test/subset/data/tests/layout.gsub6.tests          |   4 ++--
+ test/subset/data/tests/layout.gsub8.tests          |   4 ++--
+ test/subset/data/tests/layout.khmer.tests          |   4 ++--
+ .../data/tests/layout.notonastaliqurdu.tests       |   2 +-
+ test/subset/data/tests/layout.tests                |   4 ++--
+ test/subset/data/tests/variable.tests              |   2 +-
+ test/subset/generate-expected-outputs.py           |   2 +-
+ test/subset/run-tests.py                           |   2 +-
+ 614 files changed, 36 insertions(+), 46 deletions(-)
+
+commit 425ba1f4ab4fd1ee0245bc822336d26bd1755c52
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Apr 19 18:01:24 2021 -0700
+
+    [subset] fixes infinite loop in hb_set_get_max().
+    
+    Fixes https://oss-fuzz.com/testcase-detail/5363902507515904
+
+ src/hb-set.hh                                            |   2 +-
+ test/api/test-set.c                                      |   7 ++++++-
+ ...-testcase-minimized-hb-subset-fuzzer-5363902507515904 | Bin 0 -> 1683 bytes
+ 3 files changed, 7 insertions(+), 2 deletions(-)
+
+commit ec4321068b9de1ea2730b8a62dda7cb23d064303
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Apr 19 17:18:05 2021 -0700
+
+    [subset] fix infinite loop caused by alloc failure in repacker.
+    
+    Fixes: https://oss-fuzz.com/testcase-detail/5609112151916544.
+
+ src/hb-repacker.hh                                      |   8 ++++----
+ ...testcase-minimized-hb-subset-fuzzer-5609112151916544 | Bin 0 -> 80225 bytes
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 0e845d973e2bf15b56cf68af9db778d1258b7709
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Apr 19 16:09:37 2021 -0700
+
+    [subset] fix memory leak in repacker caused by failed alloc.
+    
+    Fixes: https://oss-fuzz.com/testcase-detail/5616763250278400.
+
+ src/hb-repacker.hh                                      |   4 +++-
+ ...testcase-minimized-hb-subset-fuzzer-5616763250278400 | Bin 0 -> 97363 bytes
+ 2 files changed, 3 insertions(+), 1 deletion(-)
+
+commit 3fb62cdc141d2d30ba0fc4a173dd50e7c1d56466
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Apr 5 15:48:34 2021 -0700
+
+    [subset] fail on offset overflow in tables that we don't repack.
+    
+    Fixes: https://oss-fuzz.com/testcase-detail/5229304507138048
+
+ src/hb-subset.cc                                        |   5 ++++-
+ ...testcase-minimized-hb-subset-fuzzer-5229304507138048 | Bin 0 -> 56552 bytes
+ 2 files changed, 4 insertions(+), 1 deletion(-)
+
+commit 19e096aa97b1b3af21313df5250a937ddfece7fb
+Merge: ed2ee8a8c 23a28f5ad
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 16 14:35:04 2021 -0600
+
+    Merge pull request #2067 from harfbuzz/null-size
+    
+    Avoid undefined-behavior, another try
+
+commit ed2ee8a8c26dc39e39172c169d8a0d434083fefe
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 16 13:53:43 2021 -0600
+
+    Revert "Disable -Wunused-macros under GCC"
+    
+    This reverts commit 1b1413246b8b4a9c6f7e0aac16afd6d110c142cf.
+    
+    Err. It wasn't working. We already have that disabled in the files it
+    is warning about. Doesn't work.
+
+ src/hb.hh | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 47cbf8f2c49ae82b85bf1edb211ade257f009800
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Mar 30 21:01:44 2021 -0600
+
+    [test] Silence more compiler warnings
+
+ test/api/test-unicode.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 1b1413246b8b4a9c6f7e0aac16afd6d110c142cf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Mar 30 20:54:20 2021 -0600
+
+    Disable -Wunused-macros under GCC
+    
+    Since the pragram in hb-ot-shape-complex-indic-table.cc didn't seem to
+    silence GCC, eg:
+    
+    ../../src/hb-ot-shape-complex-indic-table.cc:55: warning: macro "ISC_TL" is not used [-Wunused-macros]
+       55 | #define ISC_TL   INDIC_SYLLABIC_CATEGORY_TONE_LETTER                 /*    7 chars; Tone_Letter */
+    
+    disable it at compiler level.
+
+ src/hb.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 23a28f5ad059a45ff861a06a63d8537dab7f81b7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 16 13:22:05 2021 -0600
+
+    Avoid undefined-behavior
+    
+    If a struct had (because it's a union) sizeof that is larger than the null_size,
+    we were providing only null_size bytes for its Null object. We know we'd never
+    access beyond that, but is undefined-behavior nonetheless according to the
+    standard.
+    
+    The alternative fix would have required use of flexible-arrays, which are not
+    standard and have their own issues in various compiler. We've discussed that
+    extensively in the follow Mozilla issue (currently locked; I've asked that it
+    be opened):
+    
+      https://bugzilla.mozilla.org/show_bug.cgi?id=1577584
+    
+    Part of
+    https://github.com/harfbuzz/harfbuzz/pull/2067
+
+ src/hb-null.hh | 11 ++++++++---
+ 1 file changed, 8 insertions(+), 3 deletions(-)
+
+commit 499248c533eaf88f20920bc438a939989a359956
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 16 13:14:48 2021 -0600
+
+    [blob] Use min_size, instead of null_size in .as<T>()
+    
+    Part of https://github.com/harfbuzz/harfbuzz/pull/2067
+
+ src/hb-array.hh | 2 +-
+ src/hb-null.hh  | 9 ++++++++-
+ 2 files changed, 9 insertions(+), 2 deletions(-)
+
+commit a4fb5da984d1dc50e419298a6212a0f53b4f761f
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Fri Apr 16 14:10:37 2021 +0200
+
+    [ci] Enable DirectWrite in win32 tarballs
+
+ .ci/build-win32.sh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f2240d12c2a847afda0eb2da635694ca2346de65
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Fri Apr 16 02:37:11 2021 +0200
+
+    [ci] Use -j2 for make and ninja in distcheck job
+    
+    Lets see if this makes it faster without crashing gcc.
+
+ .circleci/config.yml | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit f5c922b7091b9919cd6dbe17db663edb366aea52
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Fri Apr 16 01:47:34 2021 +0200
+
+    [ci] Try to stop distcheck job from crashing gcc
+
+ .circleci/config.yml | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit e116058bba1f5eb667d211c0c6c0be1bbffc6213
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Thu Apr 15 13:52:19 2021 +0200
+
+    [directwrite] Use correct UTF-16 string length
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2474
+
+ src/hb-directwrite.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 668acff1f07ed6bb1472467e59d16399befa68ae
+Author: Ben Denckla <bdenckla@alum.mit.edu>
+Date:   Mon Apr 12 14:25:19 2021 -0400
+
+    similarly improve comments on Hebrew ccc 18 & 19
+    
+    Should have committed this along with commit 9658435a25c2ba82 but forgot.
+
+ src/hb-ot-shape-fallback.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 43d955207bcfcddbf5a5e3d35819fddb81605be3
+Author: Ben Denckla <bdenckla@alum.mit.edu>
+Date:   Mon Apr 12 14:01:56 2021 -0400
+
+    improve comments on Hebrew ccc 18 & 19
+    
+    improve comments to reflect that:
+    ccc 18 includes both "flavors" of qamats: qamats [gadol] and qamats qatan
+    ccc 19 includes both "flavors" of holam: holam [not haser for vav] and holam haser for vav
+    This code and its comments may have been written before these code points were added to Unicode.
+    I.e. originally, these comments may have been complete, but they may have become incomplete in the meantime.
+
+ src/hb-unicode.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 4cc4cd3b24ded40cfff651ebf63d20d19253c505
+Author: Ambient Lighter <victor@opennodecloud.com>
+Date:   Sat Apr 10 14:11:23 2021 +0300
+
+    [docs] Fix spelling typo (#2945)
+
+ docs/usermanual-object-model.xml | 2 +-
+ perf/texts/en-words.txt          | 1 -
+ 2 files changed, 1 insertion(+), 2 deletions(-)
+
+commit 9dc9f0385dce05456d48730bf5dc7cac52eaa4da
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Thu Apr 8 11:00:17 2021 -0700
+
+    [subset] fix for fuzzer testcase: https://oss-fuzz.com/testcase-detail/5858518134554624
+
+ src/hb-ot-layout-gpos-table.hh                            |   4 ++++
+ ...z-testcase-minimized-hb-subset-fuzzer-5858518134554624 | Bin 0 -> 802 bytes
+ 2 files changed, 4 insertions(+)
+
+commit 430a67ceaba5896c850c0a0da80f1bc211c022d8
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Thu Apr 1 12:01:19 2021 -0700
+
+    [subset] COLRv1 struct definitions
+
+ src/hb-ot-color-colr-table.hh | 479 +++++++++++++++++++++++++++++++++++++++++-
+ 1 file changed, 474 insertions(+), 5 deletions(-)
+
+commit 553ffaf6823040bf4a91bcd4c8e42592cd4d13c2
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Wed Apr 7 17:15:32 2021 -0700
+
+    [subset] fix for fuzzer testcase: https://oss-fuzz.com/testcase-detail/6382598554255360
+     avoid writing to null pointer
+
+ src/hb-ot-layout-gpos-table.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 4af5dacedc8d45c701c8a559962f1b071419ca50
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Wed Apr 7 10:56:49 2021 -0700
+
+    [subset] add fuzzer testcase
+
+ ...z-testcase-minimized-hb-subset-fuzzer-6382598554255360 | Bin 0 -> 766 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit 8b686afeb5a7f959d98c0f85844d782c1cbc489f
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Apr 6 11:33:38 2021 -0700
+
+    [subset] add unlikely().
+
+ src/hb-ot-layout-gsubgpos.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 64122b5a443d78cc1c4c0c94fa2e489e1f22dd3e
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Apr 5 12:53:08 2021 -0700
+
+    [subset] don't visit lookup if covered glyph set has failed.
+    
+    If covered glyph set is in error then the same lookup can be recursed into repeatedly potentially causing a fuzzer timeout. Fixes: https://oss-fuzz.com/testcase-detail/5416421032067072.
+
+ src/hb-ot-layout-gsubgpos.hh                              |   2 ++
+ ...z-testcase-minimized-hb-subset-fuzzer-5416421032067072 | Bin 0 -> 114 bytes
+ 2 files changed, 2 insertions(+)
+
+commit 4ec18c85e6eebc0948c29df36fc13b5467fce86b
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Apr 2 15:33:54 2021 -0700
+
+    [subset] add subsetting tests with drop hints and layout subsetting enabled.
+
+ ...taa-Regular-new.keep-layout-drop-hints.61,62,63.ttf | Bin 0 -> 3444 bytes
+ ...fortaa-Regular-new.keep-layout-drop-hints.61,63.ttf | Bin 0 -> 3140 bytes
+ ...Comfortaa-Regular-new.keep-layout-drop-hints.61.ttf | Bin 0 -> 2804 bytes
+ ...Comfortaa-Regular-new.keep-layout-drop-hints.62.ttf | Bin 0 -> 2396 bytes
+ ...Comfortaa-Regular-new.keep-layout-drop-hints.63.ttf | Bin 0 -> 2464 bytes
+ ...new.keep-layout-drop-hints.retain-all-codepoint.ttf | Bin 0 -> 187944 bytes
+ ...-Regular-subset.keep-layout-drop-hints.61,62,63.ttf | Bin 0 -> 1452 bytes
+ ...gjo-Regular-subset.keep-layout-drop-hints.61,63.ttf | Bin 0 -> 1276 bytes
+ ...eongjo-Regular-subset.keep-layout-drop-hints.61.ttf | Bin 0 -> 1128 bytes
+ ...eongjo-Regular-subset.keep-layout-drop-hints.62.ttf | Bin 0 -> 1140 bytes
+ ...eongjo-Regular-subset.keep-layout-drop-hints.63.ttf | Bin 0 -> 1104 bytes
+ ...set.keep-layout-drop-hints.retain-all-codepoint.ttf | Bin 0 -> 3536 bytes
+ ...oto-Regular.abc.keep-layout-drop-hints.61,62,63.ttf | Bin 0 -> 1208 bytes
+ ...Roboto-Regular.abc.keep-layout-drop-hints.61,63.ttf | Bin 0 -> 1120 bytes
+ .../Roboto-Regular.abc.keep-layout-drop-hints.61.ttf   | Bin 0 -> 988 bytes
+ .../Roboto-Regular.abc.keep-layout-drop-hints.62.ttf   | Bin 0 -> 876 bytes
+ .../Roboto-Regular.abc.keep-layout-drop-hints.63.ttf   | Bin 0 -> 960 bytes
+ ...abc.keep-layout-drop-hints.retain-all-codepoint.ttf | Bin 0 -> 1208 bytes
+ test/subset/data/profiles/keep-layout-drop-hints.txt   |   2 ++
+ test/subset/data/tests/basics.tests                    |   1 +
+ 20 files changed, 3 insertions(+)
+
+commit 6f98a8ed4627b662d9591649328d2d302fc01987
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Apr 2 14:37:10 2021 -0700
+
+    [subset] Anchor should only use format 1 when hints are dropped.
+    
+    Refactor Anchor to have a subset method instead of copy. This also allows
+    use to use serialize_subset in several places which simplifies calculating
+    offset bases.
+
+ src/hb-ot-layout-gpos-table.hh | 189 +++++++++++++++++++++--------------------
+ 1 file changed, 95 insertions(+), 94 deletions(-)
+
+commit 71d6d1560035619ee685dc9aa626eeefabe5e9f1
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Apr 5 12:03:17 2021 -0700
+
+    [subset] clamp distance to prevent shifting outside of the limits of int64.
+    
+    Fixes https://oss-fuzz.com/testcase-detail/4961171477233664.
+
+ src/hb-repacker.hh                                      |   3 ++-
+ ...testcase-minimized-hb-subset-fuzzer-4961171477233664 | Bin 0 -> 39793 bytes
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+commit fcacd17748b85a56ff0c1d822295bfcbd8e175a2
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Mon Apr 5 22:27:39 2021 +0200
+
+    [ot] Update _hb_glyph_info_is_default_ignorable_and_not_hidden()
+    
+    Used _hb_glyph_info_substituted() similar to the change made to
+    _hb_glyph_info_is_default_ignorable() in
+    7686ff854bbb9698bb1469dcfe6d288c695a76b7.
+
+ src/hb-ot-layout.hh | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 596f4258d0b6464a8186263625a2da1b16014bdd
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Apr 2 12:41:09 2021 -0700
+
+    [subset] copy Lookup::markFilteringSet when subseting.
+
+ src/hb-ot-layout-common.hh                             |   8 ++++++++
+ .../Comfortaa-Regular-new.keep-layout.61,62,63.ttf     | Bin 0 -> 8100 bytes
+ .../basics/Comfortaa-Regular-new.keep-layout.61,63.ttf | Bin 0 -> 7736 bytes
+ .../basics/Comfortaa-Regular-new.keep-layout.61.ttf    | Bin 0 -> 7360 bytes
+ .../basics/Comfortaa-Regular-new.keep-layout.62.ttf    | Bin 0 -> 6796 bytes
+ .../basics/Comfortaa-Regular-new.keep-layout.63.ttf    | Bin 0 -> 6844 bytes
+ ...aa-Regular-new.keep-layout.retain-all-codepoint.ttf | Bin 0 -> 222212 bytes
+ ...numMyeongjo-Regular-subset.keep-layout.61,62,63.ttf | Bin 0 -> 4128 bytes
+ .../NanumMyeongjo-Regular-subset.keep-layout.61,63.ttf | Bin 0 -> 3580 bytes
+ .../NanumMyeongjo-Regular-subset.keep-layout.61.ttf    | Bin 0 -> 3156 bytes
+ .../NanumMyeongjo-Regular-subset.keep-layout.62.ttf    | Bin 0 -> 3180 bytes
+ .../NanumMyeongjo-Regular-subset.keep-layout.63.ttf    | Bin 0 -> 3048 bytes
+ ...Regular-subset.keep-layout.retain-all-codepoint.ttf | Bin 0 -> 9524 bytes
+ .../basics/Roboto-Regular.abc.keep-layout.61,62,63.ttf | Bin 0 -> 2452 bytes
+ .../basics/Roboto-Regular.abc.keep-layout.61,63.ttf    | Bin 0 -> 2260 bytes
+ .../basics/Roboto-Regular.abc.keep-layout.61.ttf       | Bin 0 -> 2048 bytes
+ .../basics/Roboto-Regular.abc.keep-layout.62.ttf       | Bin 0 -> 1916 bytes
+ .../basics/Roboto-Regular.abc.keep-layout.63.ttf       | Bin 0 -> 1972 bytes
+ ...to-Regular.abc.keep-layout.retain-all-codepoint.ttf | Bin 0 -> 2452 bytes
+ test/subset/data/tests/basics.tests                    |   1 +
+ 20 files changed, 9 insertions(+)
+
+commit d3a2f999e4d5c83e14f6380b780aab170d9cbd39
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 2 08:32:41 2021 -0600
+
+    Fix up build
+    
+    This was left out; oops.
+
+ src/hb-set-digest.hh | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit c35d7863979f2395140d70cda49a19857b98f515
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Apr 1 14:32:38 2021 -0700
+
+    [subset] never drop the 'pref' feature.
+    
+    Never ever drop feature 'pref', even if it's empty. Harfbuzz uses it to choose the shaper for Khmer.
+
+ src/hb-ot-layout-gsubgpos.hh                            |   7 +++++++
+ test/subset/data/Makefile.am                            |   1 +
+ test/subset/data/Makefile.sources                       |   1 +
+ .../layout.khmer/Khmer.keep-layout-retain-gids.1780.ttf | Bin 0 -> 4464 bytes
+ ...ain-gids.1789,17BB,17C6,1794,17B6,1793,1798,17BE.ttf | Bin 0 -> 7848 bytes
+ .../layout.khmer/Khmer.keep-layout-retain-gids.31.ttf   | Bin 0 -> 4256 bytes
+ .../expected/layout.khmer/Khmer.keep-layout.1780.ttf    | Bin 0 -> 4204 bytes
+ ...p-layout.1789,17BB,17C6,1794,17B6,1793,1798,17BE.ttf | Bin 0 -> 6412 bytes
+ .../data/expected/layout.khmer/Khmer.keep-layout.31.ttf | Bin 0 -> 4140 bytes
+ test/subset/data/fonts/Khmer.ttf                        | Bin 0 -> 75368 bytes
+ test/subset/data/tests/layout.khmer.tests               |  11 +++++++++++
+ test/subset/meson.build                                 |   1 +
+ 12 files changed, 21 insertions(+)
+
+commit 092094f7055c1632e9bdf2c07f16e984a88a65ec
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 1 15:47:21 2021 -0600
+
+    Use as_array() and range loops in a few places
+
+ src/hb-ot-cmap-table.hh    | 17 +++++++----------
+ src/hb-ot-layout-common.hh | 26 +++++++++-----------------
+ src/hb-set.hh              |  4 ++++
+ 3 files changed, 20 insertions(+), 27 deletions(-)
+
+commit 55e7f3fe329021c77c880f1f3fd6d082f4ac27da
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Apr 1 13:35:30 2021 -0700
+
+    [subset] Match FeatureVariationRecord dropping from fontTools.
+    
+    Only drop records with no matching features that are at the end of the list. See: https://github.com/fonttools/fonttools/commit/cab7d13dc0883765cde435215c7d65e9212f152d
+
+ src/hb-ot-layout-common.hh | 36 ++++++++++++++++++++++++++++++------
+ 1 file changed, 30 insertions(+), 6 deletions(-)
+
+commit f0c78e028261a7823194cccc7be241aa9ddbac25
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Mar 25 12:57:12 2021 -0700
+
+    [subset] don't drop features referenced in a feature variation substitution.
+
+ src/hb-ot-layout-common.hh | 13 ++++++++++---
+ 1 file changed, 10 insertions(+), 3 deletions(-)
+
+commit dae99b7769616d354e8cce41fbd7cf780353cb44
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Mar 25 12:33:51 2021 -0700
+
+    [subset] don't keep FeatureVariationRecord's with no subsittutions.
+
+ src/hb-ot-layout-common.hh | 13 +++++++------
+ 1 file changed, 7 insertions(+), 6 deletions(-)
+
+commit 85b07287838440e000622c53cee9cc911ad0de6d
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Mar 25 12:17:18 2021 -0700
+
+    Add full variable font subsetting test.
+
+ test/subset/data/Makefile.am                           |   1 +
+ test/subset/data/Makefile.sources                      |   1 +
+ .../variable/Fraunces.keep-layout.26,66,69,124,125.ttf | Bin 0 -> 18496 bytes
+ .../data/expected/variable/Fraunces.keep-layout.61.ttf | Bin 0 -> 5880 bytes
+ test/subset/data/fonts/Fraunces.ttf                    | Bin 0 -> 360440 bytes
+ test/subset/data/tests/variable.tests                  |   9 +++++++++
+ test/subset/meson.build                                |   1 +
+ 7 files changed, 12 insertions(+)
+
+commit c4b49075f62eaa11799c95099a70acbb70e566c9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 1 10:47:18 2021 -0700
+
+    Update CMakeLists.txt
+    
+    Keep the warning.
+
+ CMakeLists.txt | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9945f327463066957f2677237d468651235a1f3d
+Author: Timo Suoranta <timo.suoranta@varjo.com>
+Date:   Sat Feb 6 14:24:25 2021 +0200
+
+    Test fix to export target include directories
+
+ CMakeLists.txt | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+commit b10741ca7f4cd55526f303c47c72f0a5c1a932fe
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Mar 25 19:14:48 2021 -0700
+
+    [subset] when closing glyphs in context lookups don't use a current glyph set if a lookup is already applied.
+
+ src/hb-ot-layout-gsubgpos.hh                            |  12 ++++++++----
+ ...ayout-retain-gids.627,644,623,62D,644,627,645,2E.ttf | Bin 18272 -> 0 bytes
+ ...rdu-Bold.keep-layout-retain-gids.627,644,62D,628.ttf | Bin 24416 -> 0 bytes
+ ...liqUrdu-Bold.keep-layout-retain-gids.627,644,62D.ttf | Bin 0 -> 11532 bytes
+ ...astaliqUrdu-Bold.keep-layout-retain-gids.627,644.ttf | Bin 9216 -> 0 bytes
+ ...ep-layout-retain-gids.633,645,627,621,20,644,627.ttf | Bin 18212 -> 0 bytes
+ ...liqUrdu-Bold.keep-layout-retain-gids.63A,64A,631.ttf | Bin 26628 -> 0 bytes
+ ...-Bold.keep-layout.627,644,623,62D,644,627,645,2E.ttf | Bin 11436 -> 0 bytes
+ ...otoNastaliqUrdu-Bold.keep-layout.627,644,62D,628.ttf | Bin 18288 -> 0 bytes
+ .../NotoNastaliqUrdu-Bold.keep-layout.627,644.ttf       | Bin 3568 -> 0 bytes
+ ...Urdu-Bold.keep-layout.633,645,627,621,20,644,627.ttf | Bin 12408 -> 0 bytes
+ .../NotoNastaliqUrdu-Bold.keep-layout.63A,64A,631.ttf   | Bin 20408 -> 0 bytes
+ test/subset/data/tests/layout.notonastaliqurdu.tests    |   7 +------
+ 13 files changed, 9 insertions(+), 10 deletions(-)
+
+commit 2773d057403292e4a13e13ca12912437607b9d86
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Nov 4 11:11:16 2020 -0800
+
+    [subset] Add a test case using NotoNastaliqUrdu.
+
+ test/subset/data/Makefile.am                            |   1 +
+ test/subset/data/Makefile.sources                       |   1 +
+ ...ayout-retain-gids.627,644,623,62D,644,627,645,2E.ttf | Bin 0 -> 18272 bytes
+ ...rdu-Bold.keep-layout-retain-gids.627,644,62D,628.ttf | Bin 0 -> 24416 bytes
+ ...astaliqUrdu-Bold.keep-layout-retain-gids.627,644.ttf | Bin 0 -> 9216 bytes
+ ...ep-layout-retain-gids.633,645,627,621,20,644,627.ttf | Bin 0 -> 18212 bytes
+ ...liqUrdu-Bold.keep-layout-retain-gids.63A,64A,631.ttf | Bin 0 -> 26628 bytes
+ ...-Bold.keep-layout.627,644,623,62D,644,627,645,2E.ttf | Bin 0 -> 11436 bytes
+ ...otoNastaliqUrdu-Bold.keep-layout.627,644,62D,628.ttf | Bin 0 -> 18288 bytes
+ .../NotoNastaliqUrdu-Bold.keep-layout.627,644.ttf       | Bin 0 -> 3568 bytes
+ ...Urdu-Bold.keep-layout.633,645,627,621,20,644,627.ttf | Bin 0 -> 12408 bytes
+ .../NotoNastaliqUrdu-Bold.keep-layout.63A,64A,631.ttf   | Bin 0 -> 20408 bytes
+ test/subset/data/tests/layout.notonastaliqurdu.tests    |  13 +++++++++++++
+ test/subset/meson.build                                 |   1 +
+ 14 files changed, 16 insertions(+)
+
+commit 8ef4257dc8d6b59b55d0169b66c8de135d5f199b
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Mar 31 15:00:46 2021 -0700
+
+    [sanitize] change max ops to track number of bytes processed.
+    
+    Counting bytes as the operations is likely to be a better proxy for how
+    much work processing the table will cost vs. the current approach of
+    counting the number of sub-objects.
+    
+    This should allow checks for max features, max scripts, etc. to be removed.
+    
+    I tested this change against the full collection of fonts at https://github.com/google/fonts
+    and a max ops factor of 3 was sufficient to successfully sanitize all of them.
+
+ src/hb-sanitize.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 70110f6aaac541bc157eb5612b476d3b906b5d2a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 31 17:04:02 2021 -0600
+
+    Modify OffsetTo<>::sanitize() overflow check
+    
+    The code in question was introduced in 70eb2ff682.
+    Rewrite it to not call sanitizer check_range() as we want to use
+    check_range() for byte accounting.
+    
+    Part of https://github.com/harfbuzz/harfbuzz/pull/2923
+
+ src/hb-open-type.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 4dba749d833491ec0c73fb4647f55236be1caee3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 31 16:09:39 2021 -0600
+
+    Add SortedArray{16,32}Of<>
+
+ src/hb-open-type.hh            |  5 ++++-
+ src/hb-ot-cmap-table.hh        | 10 +++++-----
+ src/hb-ot-color-svg-table.hh   |  2 +-
+ src/hb-ot-layout-base-table.hh |  8 ++++----
+ src/hb-ot-layout-common.hh     |  8 ++++----
+ src/hb-ot-layout-jstf-table.hh |  2 +-
+ src/hb-ot-vorg-table.hh        |  2 +-
+ 7 files changed, 20 insertions(+), 17 deletions(-)
+
+commit 5639e253f91bd71cdb626719ebc5b8d68631cc73
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 31 16:04:43 2021 -0600
+
+    Add Array16Of<>
+
+ src/hb-aat-layout-common.hh                |  2 +-
+ src/hb-aat-layout-just-table.hh            |  2 +-
+ src/hb-open-type.hh                        |  6 ++--
+ src/hb-ot-gasp-table.hh                    |  2 +-
+ src/hb-ot-layout-common.hh                 | 12 +++----
+ src/hb-ot-layout-gdef-table.hh             |  4 +--
+ src/hb-ot-layout-gpos-table.hh             |  8 ++---
+ src/hb-ot-layout-gsub-table.hh             | 20 +++++------
+ src/hb-ot-layout-gsubgpos.hh               | 54 +++++++++++++++---------------
+ src/hb-ot-math-table.hh                    | 10 +++---
+ src/hb-ot-post-table.hh                    |  4 +--
+ src/hb-ot-shape-complex-arabic-fallback.hh |  2 +-
+ src/hb-ot-var-avar-table.hh                |  2 +-
+ 13 files changed, 64 insertions(+), 64 deletions(-)
+
+commit 2520a82df9116fbc287cec1be66d05874c467bbb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 31 15:34:26 2021 -0600
+
+    s/LArrayOf/Array32Of/g
+
+ src/hb-aat-layout-ankr-table.hh | 2 +-
+ src/hb-aat-layout-just-table.hh | 2 +-
+ src/hb-aat-ltag-table.hh        | 2 +-
+ src/hb-open-file.hh             | 4 ++--
+ src/hb-open-type.hh             | 4 ++--
+ src/hb-ot-color-cbdt-table.hh   | 8 ++++----
+ src/hb-ot-layout-common.hh      | 2 +-
+ src/hb-ot-meta-table.hh         | 2 +-
+ 8 files changed, 13 insertions(+), 13 deletions(-)
+
+commit 5efe3609865b450305474b9abe672905bd25cc06
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 31 15:33:22 2021 -0600
+
+    Rename (Unsized)OffsetListOf
+
+ src/hb-aat-layout-morx-table.hh | 4 ++--
+ src/hb-open-type.hh             | 6 +++---
+ src/hb-ot-layout-common.hh      | 8 ++++----
+ src/hb-ot-layout-gpos-table.hh  | 2 +-
+ src/hb-ot-layout-gsubgpos.hh    | 2 +-
+ src/hb-ot-layout-jstf-table.hh  | 6 +++---
+ 6 files changed, 14 insertions(+), 14 deletions(-)
+
+commit 6c4e0491d7ebdc41318db59c4b0911212b299341
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 31 15:31:32 2021 -0600
+
+    s/OffsetArrayOf/Array16OfOffset16To/g
+
+ src/hb-open-type.hh            |  6 ++---
+ src/hb-ot-layout-base-table.hh |  2 +-
+ src/hb-ot-layout-common.hh     |  8 +++----
+ src/hb-ot-layout-gdef-table.hh |  6 ++---
+ src/hb-ot-layout-gpos-table.hh |  2 +-
+ src/hb-ot-layout-gsub-table.hh | 26 ++++++++++----------
+ src/hb-ot-layout-gsubgpos.hh   | 54 +++++++++++++++++++++---------------------
+ 7 files changed, 52 insertions(+), 52 deletions(-)
+
+commit 1fc6b69aed28aa768b65a8cf0825b79aa851a71f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 31 15:30:35 2021 -0600
+
+    s/UnsizedOffsetArrayOf/UnsizedArray16OfOffsetTo/g
+
+ src/hb-open-type.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 2a54c9f744b195bb1412573afcc36db806d20a4b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 31 15:26:42 2021 -0600
+
+    .
+
+ src/hb-open-type.hh           | 9 +++------
+ src/hb-ot-color-sbix-table.hh | 4 ++--
+ src/hb-ot-layout-common.hh    | 4 ++--
+ 3 files changed, 7 insertions(+), 10 deletions(-)
+
+commit c539afb08b1b698216541087b1eec222472699ea
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 31 13:28:25 2021 -0600
+
+    [CFF] Use NNOffsetTo<> instead of OffsetTo<>
+    
+    I'm pretty sure that's what is intended.
+
+ src/hb-ot-cff1-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9b4b58493b7e4c15565e4a47118181d96f517fae
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 31 13:27:21 2021 -0600
+
+    Fixup for recent OffsetTo<> changes
+
+ src/hb-open-type.hh          | 2 +-
+ src/hb-ot-layout-gsubgpos.hh | 8 ++++----
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+commit ad28f973f3ec6184b4c405efc0e17fba87b51062
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 31 12:49:14 2021 -0600
+
+    Rename offset types to be explicit about their size
+    
+    Add Offset16To<>, Offset24To<>, and Offset32To<> for most use-cases.
+
+ src/hb-aat-layout-ankr-table.hh            |  6 +--
+ src/hb-aat-layout-common.hh                |  2 +-
+ src/hb-aat-layout-feat-table.hh            |  2 +-
+ src/hb-aat-layout-just-table.hh            | 12 ++---
+ src/hb-aat-layout-kerx-table.hh            | 14 +++---
+ src/hb-aat-layout-opbd-table.hh            |  8 ++--
+ src/hb-aat-layout-trak-table.hh            |  8 ++--
+ src/hb-aat-ltag-table.hh                   |  2 +-
+ src/hb-open-file.hh                        | 12 ++---
+ src/hb-open-type.hh                        | 14 +++---
+ src/hb-ot-cmap-table.hh                    |  6 +--
+ src/hb-ot-color-cbdt-table.hh              |  4 +-
+ src/hb-ot-color-colr-table.hh              |  4 +-
+ src/hb-ot-color-cpal-table.hh              |  8 ++--
+ src/hb-ot-color-sbix-table.hh              |  4 +-
+ src/hb-ot-color-svg-table.hh               |  4 +-
+ src/hb-ot-layout-base-table.hh             | 28 ++++++------
+ src/hb-ot-layout-common.hh                 | 22 +++++-----
+ src/hb-ot-layout-gdef-table.hh             | 24 +++++-----
+ src/hb-ot-layout-gpos-table.hh             | 70 +++++++++++++++---------------
+ src/hb-ot-layout-gsub-table.hh             | 14 +++---
+ src/hb-ot-layout-gsubgpos.hh               | 64 +++++++++++++--------------
+ src/hb-ot-layout-jstf-table.hh             | 24 +++++-----
+ src/hb-ot-math-table.hh                    | 34 +++++++--------
+ src/hb-ot-meta-table.hh                    |  2 +-
+ src/hb-ot-name-table.hh                    |  4 +-
+ src/hb-ot-shape-complex-arabic-fallback.hh |  2 +-
+ src/hb-ot-stat-table.hh                    |  8 ++--
+ src/hb-ot-var-fvar-table.hh                |  2 +-
+ src/hb-ot-var-gvar-table.hh                |  6 +--
+ src/hb-ot-var-hvar-table.hh                | 10 ++---
+ src/hb-ot-var-mvar-table.hh                |  2 +-
+ 32 files changed, 214 insertions(+), 212 deletions(-)
+
+commit c5c13006a1f8e5fb9b28a3c2081e93eb4e5d4c98
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Mar 31 11:23:46 2021 -0700
+
+    [subset] fix memory leaks found in https://oss-fuzz.com/testcase-detail/5179935334465536
+
+ src/hb-repacker.hh                                      |   3 ++-
+ src/hb-vector.hh                                        |   5 +++++
+ ...testcase-minimized-hb-subset-fuzzer-5179935334465536 | Bin 0 -> 50501 bytes
+ 3 files changed, 7 insertions(+), 1 deletion(-)
+
+commit bd2950b3939d88fed998717b05367651153dc21b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 31 11:36:36 2021 -0600
+
+    Make VariationStore::get_delta(outer, inner) private
+
+ src/hb-ot-layout-common.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 934675a42958ba2e4e3e10aa4b55a9e772977399
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 31 11:34:41 2021 -0600
+
+    Use VarIdx in VariationDevice
+
+ src/hb-ot-layout-common.hh | 17 +++++++----------
+ 1 file changed, 7 insertions(+), 10 deletions(-)
+
+commit 0f7f7536b9d98e65f345398529da9c6bc365a3fb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 31 11:31:49 2021 -0600
+
+    [hvar] Change variation-index types from "unsigned int" to uint32_t
+
+ src/hb-ot-var-hvar-table.hh | 14 +++++++-------
+ 1 file changed, 7 insertions(+), 7 deletions(-)
+
+commit 9ffc46b8ff5546998fc9b74cb54dec8618ed0ac7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 31 11:26:18 2021 -0600
+
+    Add VarIdx
+
+ src/hb-open-type.hh | 6 ++++++
+ src/hb-static.cc    | 1 +
+ 2 files changed, 7 insertions(+)
+
+commit 2179281c406452392a2d9c7e17b81e02735fe50b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 31 11:20:21 2021 -0600
+
+    Add Offset24
+
+ src/hb-open-type.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit b3159ed8d2dbe4af584d05298448e6de62d394d6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Mar 30 20:52:56 2021 -0600
+
+    [util] Silence compiler warning
+
+ util/helper-cairo.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit cab9d5a57dc56c47ba4db51b813fac618694c9a9
+Author: Andrzej Perczak <kartapolska@gmail.com>
+Date:   Fri Mar 19 22:10:50 2021 +0100
+
+    hb-config: Include config-override earlier
+    
+    Currently config-override.h is included at the end of this file. This caused a problem for me while undefing HB_DISABLE_DEPRECATED, namely HB_IF_NOT_DEPRECATED was defined before actual undef took place and broke the whole build. I believe it would break builds for some other defines, too. Moving config-override.h include right after predefined configs is more sane and fixes all potential problems with includes.
+
+ src/hb-config.hh | 7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
+
+commit adca4ce071d12998deea6bb53b223daa3aa163c5
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Mar 30 13:20:50 2021 -0700
+
+    [subset] fixes https://oss-fuzz.com/testcase-detail/6173520787800064.
+    
+    Caused by incorrect bounds check in glyph closure for context lookups.
+
+ src/hb-ot-layout-gsubgpos.hh                             |   2 +-
+ ...-testcase-minimized-hb-subset-fuzzer-6173520787800064 | Bin 0 -> 1731 bytes
+ 2 files changed, 1 insertion(+), 1 deletion(-)
+
+commit 9f77a0c1ff02765862d6d2bfed6b9aab78db6fff
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Mar 30 14:10:45 2021 -0700
+
+    [subset] use hb_set_clear to avoid calling clear() on null pool set.
+
+ src/hb-ot-layout-gsubgpos.hh | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 752e393ad2f5ec4f7faae84f5322fbef41ddb2ab
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Mar 29 17:23:33 2021 -0700
+
+    [subset] avoid calling clear on null pool set.
+
+ src/hb-ot-layout-gsubgpos.hh                              |   3 ++-
+ ...z-testcase-minimized-hb-subset-fuzzer-5617065093365760 | Bin 0 -> 160 bytes
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+commit 9ed5f04a7092c76744076ba65673b250aee22dcd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 29 18:14:30 2021 -0600
+
+    [subset] Simplify recent out-of-memory fixes
+    
+    By checking return status of map->set().
+
+ src/hb-ot-layout-common.hh   |  8 ++++----
+ src/hb-ot-layout-gsubgpos.hh | 12 ++++++------
+ 2 files changed, 10 insertions(+), 10 deletions(-)
+
+commit a8f9f85a919543ce79b5a7d5df90c132830ae772
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 29 18:12:05 2021 -0600
+
+    [map] Return success from ->set()
+
+ src/hb-map.hh | 16 +++++++++-------
+ 1 file changed, 9 insertions(+), 7 deletions(-)
+
+commit 8741914a8043757d4800b14192980fbc1ea24492
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Mar 29 16:39:44 2021 -0700
+
+    [subset] fix memory leak when map insert fails.
+
+ src/hb-ot-layout-common.hh                             |  17 ++++++++++++-----
+ ...estcase-minimized-hb-subset-fuzzer-6421315436281856 | Bin 0 -> 59 bytes
+ 2 files changed, 12 insertions(+), 5 deletions(-)
+
+commit 2397689387419f9a86b928ea5084b2318d136ac6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 29 17:34:23 2021 -0600
+
+    Remove hb_success_t
+    
+    Was not rolled-out yet.  So just expand.
+
+ src/hb-open-type.hh | 4 ++--
+ src/hb.hh           | 1 -
+ 2 files changed, 2 insertions(+), 3 deletions(-)
+
+commit 7a2eda7817a26e017c9da3db4700a24dde550dde
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 29 17:32:29 2021 -0600
+
+    Move code around
+
+ src/hb-open-type.hh | 26 +++++++++++++-------------
+ 1 file changed, 13 insertions(+), 13 deletions(-)
+
+commit bcb57dccaabad4275ab96b14123413bbec6d0fec
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 29 17:31:09 2021 -0600
+
+    [sanitize] Add short-circuit to ArrayOfM1
+    
+    Like the sibling ArrayOf types.
+
+ src/hb-open-type.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 5b6da6d2f0bcaeb7768705e6891f575ae73c8b41
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Mar 29 16:19:17 2021 -0700
+
+    [subset] add fuzzer test case.
+
+ ...z-testcase-minimized-hb-subset-fuzzer-5250795600740352 | Bin 0 -> 409 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit 52df6b9fd8cf075f416372f0469a6915e814b0d6
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Mar 29 16:17:27 2021 -0700
+
+    [subset] check for set insertion success.
+
+ src/hb-ot-layout-gsubgpos.hh | 11 ++++++++---
+ 1 file changed, 8 insertions(+), 3 deletions(-)
+
+commit c6adb90a273f22159b0775f798724d36d552d36c
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Mar 29 16:08:44 2021 -0700
+
+    [subset] fix nullptr deref.
+
+ src/hb-ot-layout-gsubgpos.hh | 20 +++++++++++---------
+ 1 file changed, 11 insertions(+), 9 deletions(-)
+
+commit 9a3537e5f688637a2ac2ced57de9e2b7c21d90a5
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Mar 29 14:34:24 2021 -0700
+
+    [subset] invert err() return value. Undo previous change to check_success.
+
+ src/hb-serialize.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit a804a0c903f6dd230954ff5855ed7ff1dd92844d
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Mar 29 14:25:20 2021 -0700
+
+    [subset] add fuzzer test case.
+
+ ...-testcase-minimized-hb-subset-fuzzer-5887968763052032 | Bin 0 -> 3889 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit cdba5d44c28a97ab8d9298a3bef60fcbd0845000
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Mar 29 14:23:59 2021 -0700
+
+    [subset] fix incorrect handling of return value in check_success in the error case.
+
+ src/hb-serialize.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 05e845c49ad2eebf110dcc6cb0ee48a7f68ca233
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 29 16:02:10 2021 -0700
+
+    Make previous commit gcc-only
+
+ src/hb.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit b5e40323921566ce8a15aa7808d22d36acac4edd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 29 15:54:40 2021 -0700
+
+    -Wno-unused-result
+    
+    GCC doesn't let one turn off the warning using "(void) foo()".
+    People have introduced macros that do "unused << foo()" instead.
+    Until we do something similar, silence gcc.
+    
+    Clang on the other hand understands "(void) foo()".
+
+ src/hb.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit c30349d54e67c1ee7e1ea759e8378fcf6a6c9ff4
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Sun Mar 21 20:12:59 2021 +0200
+
+    [hb-view] Support kitty inline images protocol
+    
+    https://github.com/harfbuzz/harfbuzz/issues/2758
+
+ util/helper-cairo.cc | 36 ++++++++++++++++++++++++++++++++++++
+ 1 file changed, 36 insertions(+)
+
+commit f7d5889b3ea9012d23407b83a176bcd54a94e21b
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Sun Mar 21 18:16:33 2021 +0200
+
+    [hb-view] Support iTerm2 inline images protocol
+    
+    https://github.com/harfbuzz/harfbuzz/issues/2758
+
+ util/helper-cairo.cc | 85 +++++++++++++++++++++++++++++++++++++++++++++++-----
+ 1 file changed, 78 insertions(+), 7 deletions(-)
+
+commit 743baf35436d8de937984e09467f453cdfba102e
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Mon Mar 22 15:51:17 2021 +0200
+
+    [build] Don’t look for FontConfig
+    
+    We don’t currently use it anywhere. It was used briefly for the
+    hb-fc-list tool, but this tool have not been built since 2015:
+    
+    commit cd042fc8c4a3984c3647cd22a27c34f00636f6e8
+    Author: Behdad Esfahbod <behdad@behdad.org>
+    Date:   Thu Jun 18 10:55:13 2015 -0700
+    
+        [util] Disable hb-fc-list for now
+    
+        Until I figure out what to do about the API, and finalize
+        the tool.
+
+ .circleci/config.yml                 |  2 +-
+ Makefile.am                          |  1 -
+ configure.ac                         | 19 -------------------
+ docs/usermanual-install-harfbuzz.xml | 20 --------------------
+ meson.build                          |  7 -------
+ meson_options.txt                    |  2 --
+ subprojects/.gitignore               |  1 -
+ subprojects/fontconfig.wrap          |  6 ------
+ 8 files changed, 1 insertion(+), 57 deletions(-)
+
+commit 95230e291dddc20185e6a34b69836631d894c0d8
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Thu Mar 18 17:41:25 2021 -0700
+
+    [subset] support subsetting GSUB8
+
+ src/hb-ot-layout-gsub-table.hh                     |  73 ++++++++++++++++++++-
+ test/subset/data/Makefile.am                       |   1 +
+ test/subset/data/Makefile.sources                  |   1 +
+ ...yout-retain-gids.41,42,43,44,45,46,47,48,49.otf | Bin 0 -> 3172 bytes
+ ...eep-layout-retain-gids.41,42,43,44,45,46,47.otf | Bin 0 -> 2796 bytes
+ ...eep-layout-retain-gids.41,42,43,44,45,46,4D.otf | Bin 0 -> 2860 bytes
+ ...eep-layout-retain-gids.41,42,43,44,45,46,51.otf | Bin 0 -> 2864 bytes
+ ...d.keep-layout-retain-gids.41,42,43,44,45,46.otf | Bin 0 -> 2540 bytes
+ ...ly_created.keep-layout-retain-gids.41,42,43.otf | Bin 0 -> 1984 bytes
+ ...manually_created.keep-layout-retain-gids.41.otf | Bin 0 -> 1872 bytes
+ ...manually_created.keep-layout-retain-gids.61.otf | Bin 0 -> 2584 bytes
+ ...eep-layout-retain-gids.retain-all-codepoint.otf | Bin 0 -> 3832 bytes
+ ...ated.keep-layout.41,42,43,44,45,46,47,48,49.otf | Bin 0 -> 2384 bytes
+ ...ly_created.keep-layout.41,42,43,44,45,46,47.otf | Bin 0 -> 1996 bytes
+ ...ly_created.keep-layout.41,42,43,44,45,46,4D.otf | Bin 0 -> 1996 bytes
+ ...ly_created.keep-layout.41,42,43,44,45,46,51.otf | Bin 0 -> 2044 bytes
+ ...ually_created.keep-layout.41,42,43,44,45,46.otf | Bin 0 -> 1832 bytes
+ ...gsub8_manually_created.keep-layout.41,42,43.otf | Bin 0 -> 1284 bytes
+ .../gsub8_manually_created.keep-layout.41.otf      | Bin 0 -> 1172 bytes
+ .../gsub8_manually_created.keep-layout.61.otf      | Bin 0 -> 1540 bytes
+ ...ly_created.keep-layout.retain-all-codepoint.otf | Bin 0 -> 3832 bytes
+ test/subset/data/fonts/gsub8_manually_created.otf  | Bin 0 -> 4824 bytes
+ test/subset/data/tests/layout.gsub8.tests          |  17 +++++
+ test/subset/meson.build                            |   1 +
+ 24 files changed, 91 insertions(+), 2 deletions(-)
+
+commit d18915f920a0d9ab7ce5cfec4654d3d610b1d082
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Sun Mar 28 10:09:13 2021 -0400
+
+    Reformat gen-tag-table.py
+
+ src/gen-tag-table.py | 16 +++++++---------
+ 1 file changed, 7 insertions(+), 9 deletions(-)
+
+commit 3c8273ab68e37ed5b08b4edacac995fc451d5732
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Mar 25 11:39:57 2021 -0700
+
+    Check for alloc failures on the gsub/gpos_langsys maps in subset plan creation.
+
+ src/hb-subset-plan.cc | 46 ++++++++++++++++++++++++++++------------------
+ src/hb-subset.cc      |  4 +++-
+ 2 files changed, 31 insertions(+), 19 deletions(-)
+
+commit 29708e959a04ee003b9c0738f0c5330584f15b4f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 22 15:22:15 2021 -0700
+
+    [aat] Fix offsetToIndex math for out-of-bounds values
+    
+    Previously, some bad font data was accidentally being interpretted as
+    legit if it happened to not fall out of memory bounds. The intention
+    of the code was what this commit does.  I'm surprised we weren't getting
+    a "arithmetic between signed and unsigned values" warning / error
+    before.
+
+ src/hb-aat-layout-common.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit c5d6bdb4bf2d8d595f5c762c3e618444621803ae
+Merge: a7d120aea 46bf03d69
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Mar 18 14:38:55 2021 -0700
+
+    Merge pull request #2857 from googlefonts/repacker
+    
+    [subset] add a GSUB/GPOS table repacker to resolve offset overflows.
+
+commit 46bf03d6919087e4ce8f0626a3d342380346dc97
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Mar 18 14:35:36 2021 -0700
+
+    [subset] add NODISCARD to error checking methods on serializer.
+
+ src/hb-serialize.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 3827a3eb567b424e8144564a42a22df74a20a7c6
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Mar 18 11:20:03 2021 -0700
+
+    [subset] rename serializer::set_error() to err().
+
+ src/hb-repacker.hh  |  4 ++--
+ src/hb-serialize.hh | 15 +++++++--------
+ 2 files changed, 9 insertions(+), 10 deletions(-)
+
+commit f561fa6e4c5572c60c8fcf40e617919e531e6ee3
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Mar 18 11:13:47 2021 -0700
+
+    Change priority queue to use (priority, value) instead of (value, priority).
+
+ src/Makefile.sources       |  2 +-
+ src/hb-priority-queue.hh   | 24 +++++++++++++-----------
+ src/hb-repacker.hh         | 14 +++++++-------
+ src/test-priority-queue.cc | 40 ++++++++++++++++++++--------------------
+ 4 files changed, 41 insertions(+), 39 deletions(-)
+
+commit b14475d2ae488acf3c2a169126a4901796401157
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Mar 18 10:51:26 2021 -0700
+
+    [subset] further changes to serializer error handling.
+    
+    - Rename enum type and enum members.
+    - in_errors() now returns true for any error having been set. hb-subset now looks for offset overflow only errors to divert to repacker.
+    - Added INT_OVERFLOW and ARRAY_OVERFLOW enum values.
+
+ src/hb-cff-interp-common.hh    |  2 +-
+ src/hb-open-type.hh            |  8 +++----
+ src/hb-ot-cmap-table.hh        | 11 +++++-----
+ src/hb-ot-hmtx-table.hh        |  2 +-
+ src/hb-ot-layout-gpos-table.hh |  8 +++----
+ src/hb-ot-layout-gsub-table.hh |  2 +-
+ src/hb-repacker.hh             |  4 ++--
+ src/hb-serialize.hh            | 50 ++++++++++++++++++++++++------------------
+ src/hb-subset.cc               |  4 ++--
+ 9 files changed, 50 insertions(+), 41 deletions(-)
+
+commit 73ed59f7a68fc5363ef444b6de131c92cc5ca836
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Mar 17 15:53:10 2021 -0700
+
+    [subset] store errors in the serializer as a flag set.
+    
+    Make check_assign/check_equal specify the type of error to set.
+
+ src/hb-cff-interp-common.hh    |  2 +-
+ src/hb-open-type.hh            | 10 ++++---
+ src/hb-ot-cmap-table.hh        | 17 +++++++----
+ src/hb-ot-hdmx-table.hh        |  2 +-
+ src/hb-ot-hmtx-table.hh        |  2 +-
+ src/hb-ot-layout-gpos-table.hh |  8 +++---
+ src/hb-ot-layout-gsub-table.hh |  4 +--
+ src/hb-ot-name-table.hh        |  3 +-
+ src/hb-repacker.hh             |  4 +--
+ src/hb-serialize.hh            | 64 +++++++++++++++++++++++++-----------------
+ src/hb-subset.cc               |  8 +++---
+ src/test-repacker.cc           |  4 +--
+ 12 files changed, 76 insertions(+), 52 deletions(-)
+
+commit b9ecc7420df811e94413d77e6d70140e18d6ebe6
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Feb 16 13:39:10 2021 -0800
+
+    [subset] init offset_overflow in hb_serialize_context_t.
+
+ src/hb-serialize.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit cf79fc342d7e59966fc7ba3e8460d58083b33966
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Feb 16 13:24:43 2021 -0800
+
+    [subset] limit priority bumps to 16.
+
+ src/hb-repacker.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0104409959b15ca8dc344df4a60ce36fc7f40105
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Feb 16 11:38:14 2021 -0800
+
+    Fix repack_tests for distcheck.
+
+ test/subset/data/repack_tests/Makefile.am | 7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
+
+commit e2f14e81bd20cc944bdecba7fcea20a4b4eddec0
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Nov 11 13:55:35 2020 -0800
+
+    [subset] fix memory leaks in test-repacker.
+
+ src/test-repacker.cc | 19 ++++++++++++++++++-
+ 1 file changed, 18 insertions(+), 1 deletion(-)
+
+commit d3e2ba7c01b26da9cc5fac49a204fae8a54a3eb1
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Nov 11 13:50:18 2020 -0800
+
+    [subset] comment cleanup in hb-repacker.hh
+
+ src/hb-repacker.hh | 35 ++++++++++++++++++++++++-----------
+ 1 file changed, 24 insertions(+), 11 deletions(-)
+
+commit 832f2b599b3d4fad5eea6d0eeef77377d3e0bad0
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Nov 10 16:15:37 2020 -0800
+
+    [subset] Refactor _subset () to reduce nesting and eliminate the use of 'goto'.
+
+ src/hb-serialize.hh |   9 ++++
+ src/hb-subset.cc    | 134 +++++++++++++++++++++++++++++++---------------------
+ src/meson.build     |   1 +
+ 3 files changed, 90 insertions(+), 54 deletions(-)
+
+commit bb5c80a7c2d2454bba745a155146e7eaad912474
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Nov 10 14:11:57 2020 -0800
+
+    [subset] add error tracking to the repacker.
+    Also check for allocation failures as needed.
+
+ src/hb-repacker.hh | 93 ++++++++++++++++++++++++++++++++++++------------------
+ 1 file changed, 62 insertions(+), 31 deletions(-)
+
+commit b8b8c58b9ff9b51108caf47f5d98a15801b39058
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Nov 10 11:56:09 2020 -0800
+
+    [subset] add tests that check for successful repacking of a real font file.
+
+ configure.ac                                       |   1 +
+ test/subset/Makefile.am                            |   2 +
+ test/subset/data/Makefile.am                       |   2 +-
+ test/subset/data/fonts/NotoNastaliqUrdu-Bold.ttf   | Bin 0 -> 459600 bytes
+ test/subset/data/repack_tests/Makefile.am          |  22 +++++
+ test/subset/data/repack_tests/Makefile.sources     |  12 +++
+ .../repack_tests/advanced_prioritization.tests     |  72 ++++++++++++++
+ test/subset/data/repack_tests/basic.tests          |  52 +++++++++++
+ test/subset/data/repack_tests/prioritization.tests |  77 +++++++++++++++
+ .../data/repack_tests/table_duplication.tests      |  97 +++++++++++++++++++
+ test/subset/meson.build                            |  22 +++++
+ test/subset/repack_test.py                         |  36 +++++++
+ test/subset/run-repack-tests.py                    | 104 +++++++++++++++++++++
+ 13 files changed, 498 insertions(+), 1 deletion(-)
+
+commit 6e9468fcfb71c731b0ec5a5e9c434119f16245e9
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Nov 9 16:52:36 2020 -0800
+
+    [subset] cleanup memory leaks in the repacker.
+
+ src/hb-repacker.hh |  7 ++++++-
+ src/hb-subset.cc   | 12 ++++++++----
+ 2 files changed, 14 insertions(+), 5 deletions(-)
+
+commit a7a86a6eb4da25822cf0d42d7dd1668a15325a8f
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Nov 6 16:22:48 2020 -0800
+
+    [subset] Add prioritization offset resolution.
+    Vertices can now be prioritized to force them to sort closer to their parent. The resolver will attempt to use this for overflows on non-shared vertices.
+
+ src/hb-repacker.hh   | 107 +++++++++++++++++++++++++++++++++++++++++----------
+ src/test-repacker.cc |   1 +
+ 2 files changed, 88 insertions(+), 20 deletions(-)
+
+commit b452b2c76c9f76c9ea3501e8eb6534cb172f59ce
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Nov 6 15:37:05 2020 -0800
+
+    [subset] refactor repacker graph to cache edge count and distances of vertices.
+
+ src/hb-repacker.hh   | 315 ++++++++++++++++++++++++++++++---------------------
+ src/test-repacker.cc | 158 +++++++++++++-------------
+ 2 files changed, 265 insertions(+), 208 deletions(-)
+
+commit 75414e82b52d5a3adeb1eb48e64f43472913cba2
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Nov 5 16:39:23 2020 -0800
+
+    [subset] Add table duplication overflow resolution.
+
+ src/hb-debug.hh      |   4 ++
+ src/hb-repacker.hh   | 181 ++++++++++++++++++++++++++++++++++++++++-------
+ src/test-repacker.cc | 196 +++++++++++++++++++++++++++++++++++++++++++++++++--
+ 3 files changed, 347 insertions(+), 34 deletions(-)
+
+commit 8286bd80940a7d136ee503dd1b1142190c6695ff
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Nov 5 14:23:29 2020 -0800
+
+    [subset] use vectors instead of hashmaps throughout the repacker since all keys will be mapped for these use cases.
+
+ src/hb-repacker.hh | 65 ++++++++++++++++++++++++++----------------------------
+ 1 file changed, 31 insertions(+), 34 deletions(-)
+
+commit 519ae96617e1e2867122c5dbbdc8f1bbce89cb24
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Nov 5 11:22:16 2020 -0800
+
+    [subset] switch sort_shortest_distance() to use priority queue.
+
+ src/hb-repacker.hh | 35 +++++++++++++----------------------
+ 1 file changed, 13 insertions(+), 22 deletions(-)
+
+commit 5d3511e5b13eb825ea9914aa2400cc040edef8a7
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Nov 5 10:34:26 2020 -0800
+
+    [subset] Change compute_distances() to use a priority queue.
+
+ src/hb-repacker.hh | 38 ++++++++++++++++++++++++++++----------
+ src/meson.build    |  1 +
+ 2 files changed, 29 insertions(+), 10 deletions(-)
+
+commit 59ac0a0d0a99e91a75d18a3884ae276309370997
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Nov 5 10:29:56 2020 -0800
+
+    [subset] Use priority for comparison in heap.
+
+ src/hb-priority-queue.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 4c8dd41ed90292d4516c539be23c16d625d69a41
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Nov 5 09:21:25 2020 -0800
+
+    [subset] re-write compute distances to use an array lookup for the distance map.
+
+ src/hb-priority-queue.hh |  4 ++--
+ src/hb-repacker.hh       | 55 ++++++++++++++++++++----------------------------
+ src/test-repacker.cc     |  2 ++
+ 3 files changed, 27 insertions(+), 34 deletions(-)
+
+commit 5c4e0ffd9768de0c51a42baa35d9c29636fdd99a
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Nov 4 16:08:01 2020 -0800
+
+    [subset] Add a basic priority queue datastructure (binary heap).
+
+ src/Makefile.am            |   6 +-
+ src/Makefile.sources       |   1 +
+ src/hb-priority-queue.hh   | 149 +++++++++++++++++++++++++++++++++++++++++++++
+ src/test-priority-queue.cc |  89 +++++++++++++++++++++++++++
+ 4 files changed, 244 insertions(+), 1 deletion(-)
+
+commit dd8e5d0e1b0c52190bf16ab091ee3756b30d4d97
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Nov 3 14:01:42 2020 -0800
+
+    [subset] Only run the repacker for GSUB/GPOS.
+
+ src/hb-subset.cc | 9 ++++++---
+ 1 file changed, 6 insertions(+), 3 deletions(-)
+
+commit aaa7873d425a6267b1df16f5a1f3750578b438f0
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Nov 2 16:16:27 2020 -0800
+
+    [subset] add topological sort by closest distance via Dijkstra's algorithm.
+
+ src/hb-repacker.hh   | 125 +++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/test-repacker.cc |  37 ++++++++++++++-
+ 2 files changed, 160 insertions(+), 2 deletions(-)
+
+commit 8ebe5d734f3543b7a1266f252fe96188efc69531
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Nov 2 14:51:39 2020 -0800
+
+    Implement will_overflow ().
+
+ src/hb-repacker.hh   | 73 +++++++++++++++++++++++++++++++++++++++++++++++++---
+ src/test-repacker.cc | 45 ++++++++++++++++++++++++++++++++
+ 2 files changed, 114 insertions(+), 4 deletions(-)
+
+commit 6b1ea4cbe724af10309763b708abc36c968f14a7
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Oct 30 12:16:26 2020 -0700
+
+    [subset] hook up the repacker to run if offset overflows are encountered during subsetting.
+
+ src/hb-serialize.hh | 13 +++++++++++--
+ src/hb-subset.cc    | 30 +++++++++++++++++++++++++++++-
+ 2 files changed, 40 insertions(+), 3 deletions(-)
+
+commit f4c78cc7dd11c83aa3f3a3516e75f4fe689aff19
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Oct 30 10:29:51 2020 -0700
+
+    [subset] Implement Kahn's algo for topological sorting instead of BFS.
+
+ src/hb-repacker.hh   | 88 +++++++++++++++++++++++++++++++++++-----------------
+ src/test-repacker.cc | 69 +++++++++++++++++++++++++++++++++++++---
+ 2 files changed, 124 insertions(+), 33 deletions(-)
+
+commit 00f393dc3fdd40a761df4fe988745ecb0e62df4b
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Oct 29 14:58:34 2020 -0700
+
+    [subset] finish up BFS sort implementation.
+
+ src/hb-repacker.hh   | 93 +++++++++++++++++++++++++++++++++++++++-----------
+ src/test-repacker.cc | 95 ++++++++++++++++++++++++++++++++++++++++++----------
+ 2 files changed, 151 insertions(+), 37 deletions(-)
+
+commit 1584d3cb8faf244ae439cd59eac5f3d006d7a106
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Oct 28 17:49:09 2020 -0700
+
+    [subset] Start a proof of concept implementation of the GSUB/GPOS offset overflow resolver.
+
+ src/Makefile.am      |   6 +-
+ src/Makefile.sources |   1 +
+ src/hb-repacker.hh   | 180 +++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-serialize.hh  |   3 +
+ src/test-repacker.cc |  87 +++++++++++++++++++++++++
+ 5 files changed, 276 insertions(+), 1 deletion(-)
+
+commit a7d120aeabbae6a08f3cdd39a5ef1d435c3a4854
+Merge: 69d772e52 56ca43578
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 17 14:33:33 2021 -0700
+
+    Merge pull request #2835 from googlefonts/remove_redundant_sys
+    
+    [subset] Remove redundant LangSys
+
+commit 56ca435787c1686fcfe01bf4db822bb91d9ba769
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Thu Jan 28 15:21:26 2021 -0800
+
+    [subset] fix for collect_features and remove_redundant_lamngsys
+    
+    previously remove_redundant_sys () is missing in harfbuzz, after
+    redundant langsys removal, some features are removed as well in
+    prune_features() in fonttools. This change is trying to get the same
+    result between harfbuzz and fonttools.
+
+ src/hb-ot-layout-common.hh                         | 182 +++++++++++++++++++--
+ src/hb-ot-layout-gpos-table.hh                     |   2 +-
+ src/hb-ot-layout-gsub-table.hh                     |   2 +-
+ src/hb-ot-layout-gsubgpos.hh                       |  75 ++++++++-
+ src/hb-subset-plan.cc                              |  43 ++++-
+ src/hb-subset-plan.hh                              |   6 +-
+ ...-retain-gids.627,644,623,62D,644,627,645,2E.ttf | Bin 48640 -> 48596 bytes
+ ...lar.keep-layout-retain-gids.627,644,62D,628.ttf | Bin 42884 -> 42836 bytes
+ ...iri-Regular.keep-layout-retain-gids.627,644.ttf | Bin 36940 -> 36892 bytes
+ ...yout-retain-gids.633,645,627,621,20,644,627.ttf | Bin 46724 -> 46680 bytes
+ ...Regular.keep-layout-retain-gids.63A,64A,631.ttf | Bin 42896 -> 42896 bytes
+ ....keep-layout.627,644,623,62D,644,627,645,2E.ttf | Bin 13332 -> 13288 bytes
+ .../Amiri-Regular.keep-layout.627,644,62D,628.ttf  | Bin 10232 -> 10188 bytes
+ .../Amiri-Regular.keep-layout.627,644.ttf          | Bin 4412 -> 4364 bytes
+ ...ular.keep-layout.633,645,627,621,20,644,627.ttf | Bin 10372 -> 10324 bytes
+ .../Amiri-Regular.keep-layout.63A,64A,631.ttf      | Bin 7824 -> 7824 bytes
+ test/subset/data/fonts/Amiri-Regular.ttf           | Bin 562684 -> 562980 bytes
+ 17 files changed, 284 insertions(+), 26 deletions(-)
+
+commit 69d772e522c60aa9d73b6ccd550f4a834e7bd9b8
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Mar 17 14:11:16 2021 -0700
+
+    [subset] Fixed test gsub5 test files.
+
+ ...2.keep-layout-retain-gids.retain-all-codepoint.otf | Bin 3752 -> 3808 bytes
+ ...e_subrules_f2.keep-layout.retain-all-codepoint.otf | Bin 3752 -> 3808 bytes
+ ...2.keep-layout-retain-gids.retain-all-codepoint.otf | Bin 3768 -> 3824 bytes
+ ...e_subrules_f2.keep-layout.retain-all-codepoint.otf | Bin 3768 -> 3824 bytes
+ ...1.keep-layout-retain-gids.retain-all-codepoint.otf | Bin 3772 -> 3828 bytes
+ ...successive_f1.keep-layout.retain-all-codepoint.otf | Bin 3772 -> 3828 bytes
+ 6 files changed, 0 insertions(+), 0 deletions(-)
+
+commit 0e1c0fa404e2ad087265dc59130dbec1c4682258
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Tue Jan 12 10:17:14 2021 -0800
+
+    [subset] optimize glyph closure method: step 5
+    
+    add testcase and some fixes
+
+ src/hb-ot-layout-common.hh                         |  35 ++++----
+ src/hb-ot-layout-gsub-table.hh                     |  10 +--
+ src/hb-ot-layout-gsubgpos.hh                       |  95 +++++++++++++++------
+ src/hb-ot-layout.cc                                |  18 +++-
+ test/subset/data/Makefile.am                       |   1 +
+ test/subset/data/Makefile.sources                  |   1 +
+ ...ubrules_f2.keep-layout-retain-gids.41,42,43.otf | Bin 0 -> 2248 bytes
+ ...e_subrules_f2.keep-layout-retain-gids.41,42.otf | Bin 0 -> 2224 bytes
+ ...e_subrules_f2.keep-layout-retain-gids.41,43.otf | Bin 0 -> 2060 bytes
+ ...iple_subrules_f2.keep-layout-retain-gids.41.otf | Bin 0 -> 1928 bytes
+ ...eep-layout-retain-gids.retain-all-codepoint.otf | Bin 0 -> 3752 bytes
+ ...1_multiple_subrules_f2.keep-layout.41,42,43.otf | Bin 0 -> 1460 bytes
+ ...ext1_multiple_subrules_f2.keep-layout.41,42.otf | Bin 0 -> 1420 bytes
+ ...ext1_multiple_subrules_f2.keep-layout.41,43.otf | Bin 0 -> 1344 bytes
+ ...ontext1_multiple_subrules_f2.keep-layout.41.otf | Bin 0 -> 1228 bytes
+ ...ubrules_f2.keep-layout.retain-all-codepoint.otf | Bin 0 -> 3752 bytes
+ ...ubrules_f2.keep-layout-retain-gids.41,42,43.otf | Bin 0 -> 2264 bytes
+ ...e_subrules_f2.keep-layout-retain-gids.41,42.otf | Bin 0 -> 2236 bytes
+ ...e_subrules_f2.keep-layout-retain-gids.41,43.otf | Bin 0 -> 2060 bytes
+ ...iple_subrules_f2.keep-layout-retain-gids.41.otf | Bin 0 -> 1928 bytes
+ ...eep-layout-retain-gids.retain-all-codepoint.otf | Bin 0 -> 3768 bytes
+ ...2_multiple_subrules_f2.keep-layout.41,42,43.otf | Bin 0 -> 1476 bytes
+ ...ext2_multiple_subrules_f2.keep-layout.41,42.otf | Bin 0 -> 1432 bytes
+ ...ext2_multiple_subrules_f2.keep-layout.41,43.otf | Bin 0 -> 1344 bytes
+ ...ontext2_multiple_subrules_f2.keep-layout.41.otf | Bin 0 -> 1228 bytes
+ ...ubrules_f2.keep-layout.retain-all-codepoint.otf | Bin 0 -> 3768 bytes
+ ...cessive_f1.keep-layout-retain-gids.41,42,43.otf | Bin 0 -> 2028 bytes
+ ...successive_f1.keep-layout-retain-gids.41,42.otf | Bin 0 -> 1932 bytes
+ ...successive_f1.keep-layout-retain-gids.41,43.otf | Bin 0 -> 2048 bytes
+ ...t3_successive_f1.keep-layout-retain-gids.41.otf | Bin 0 -> 1916 bytes
+ ...eep-layout-retain-gids.retain-all-codepoint.otf | Bin 0 -> 3772 bytes
+ ...context3_successive_f1.keep-layout.41,42,43.otf | Bin 0 -> 1328 bytes
+ ...ub_context3_successive_f1.keep-layout.41,42.otf | Bin 0 -> 1228 bytes
+ ...ub_context3_successive_f1.keep-layout.41,43.otf | Bin 0 -> 1332 bytes
+ .../gsub_context3_successive_f1.keep-layout.41.otf | Bin 0 -> 1216 bytes
+ ...cessive_f1.keep-layout.retain-all-codepoint.otf | Bin 0 -> 3772 bytes
+ .../fonts/gsub_context1_multiple_subrules_f2.otf   | Bin 0 -> 4776 bytes
+ .../fonts/gsub_context2_multiple_subrules_f2.otf   | Bin 0 -> 4796 bytes
+ .../data/fonts/gsub_context3_successive_f1.otf     | Bin 0 -> 4760 bytes
+ test/subset/data/tests/layout.gsub5.tests          |  15 ++++
+ test/subset/meson.build                            |   1 +
+ 41 files changed, 124 insertions(+), 52 deletions(-)
+
+commit b8a58a0c0b7d62c33b106ad119a567b6d86d1d36
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Sun Jan 10 15:50:04 2021 -0800
+
+    [subset] optimize glyph closure method: step 4
+    
+    optimize recurse_lookups in Context/ChainContext
+    glyph closure, only the glyphs that the parent lookup
+    can apply the recursion to can participate in recursing
+    the lookup.
+
+ src/hb-ot-layout-gsub-table.hh |  84 ++++------------
+ src/hb-ot-layout-gsubgpos.hh   | 219 +++++++++++++++++++++++++++++++----------
+ 2 files changed, 186 insertions(+), 117 deletions(-)
+
+commit 62423504ee6dcf282177ea0b91268df4e7a1e30b
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Tue Jan 5 14:54:40 2021 -0800
+
+    [subset] optimize glyph closure method: step 3
+    
+    Add function intersects_coverage_glyphs that collects
+    set of matching glyphs in Coverage table
+
+ src/hb-ot-layout-common.hh | 39 ++++++++++++++++++++++++++++++++++-----
+ 1 file changed, 34 insertions(+), 5 deletions(-)
+
+commit ef78d0f92345eb452e94c73301bc929822755b27
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Tue Jan 5 10:16:50 2021 -0800
+
+    [subset] optimize glyph closure method: step 2
+    Add function intersects_class_glyphs that collects
+    set of glyphs matching class in ClassDef table
+
+ src/hb-ot-layout-common.hh | 75 ++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 75 insertions(+)
+
+commit b4fc593c3c34c45521c684cb6d0d24079d553e3a
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Wed Dec 9 10:44:18 2020 -0800
+
+    [subset] optimize glyph closure method: step1
+    
+    Previous GSUB glyph closure is done by recursively visiting
+    all reachable lookup tables that apply to any glyphs in the
+    current/input glyph set, but actually only the glyphs that
+    the parent lookup can apply the recursion to can participate
+    in recursing the lookup. This is step 1 for glyph closure
+    optimization:
+    1. Add stack of currently active glyph set pointers into hb_closure_context_t
+    2. Update closure() method in simple GSUB tables to use
+    this stack in order not to change current glyph set at different stages
+    of recursion
+    3. Add function may_have_non_1to1() to GSUB tables
+
+ src/hb-ot-layout-gsub-table.hh | 100 ++++++++++++++++++++++++++++++++++++++---
+ src/hb-ot-layout-gsubgpos.hh   |  57 ++++++++++++++++++++++-
+ 2 files changed, 150 insertions(+), 7 deletions(-)
+
+commit 5f4c321d4aae659f83178143d5a4df0d2d6b4d02
+Merge: 03538e872 1b79b8cd2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 17 10:20:59 2021 -0700
+
+    Merge pull request #2894 from googlefonts/gpos_2
+    
+    [subset] Update PairPosFormat2 subsetting to match fontTools
+
+commit 1b79b8cd2daebc99acd9310742755f02162e5ed0
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Mar 16 15:23:11 2021 -0700
+
+    [subset] update gpos tests to reflect updated behaviour.
+
+ test/api/fonts/AdobeVFPrototype.WA.gpos.otf | Bin 3948 -> 4148 bytes
+ test/api/fonts/Roboto-Regular-gpos-aw.ttf   | Bin 2232 -> 2236 bytes
+ test/api/test-subset-gpos.c                 |   5 -----
+ 3 files changed, 5 deletions(-)
+
+commit 2df39bcae7e34630361a49c44e9d295233367ce0
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Mar 16 14:20:49 2021 -0700
+
+    [subset] don't allocate a set to use as a glyph filter for PairPosFormat2.
+
+ src/hb-ot-layout-common.hh     | 34 ++++++++++++++++++++++------------
+ src/hb-ot-layout-gpos-table.hh |  7 +------
+ 2 files changed, 23 insertions(+), 18 deletions(-)
+
+commit b1b1486d07f8fe3c7a1fb4bc87e6f037ff5b47d3
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Mar 16 13:32:23 2021 -0700
+
+    [subset] update expected files to not include cmap12 pruning.
+
+ .../Roboto-Regular.keep-gdef-gpos.1E00,303.ttf      | Bin 2648 -> 2648 bytes
+ .../Roboto-Regular.keep-gdef-gpos.41,42,43.ttf      | Bin 2736 -> 2728 bytes
+ ...os2_2_font5.keep-layout-retain-gids.21,23,25.otf | Bin 1824 -> 1816 bytes
+ .../gpos2_2_font5.keep-layout-retain-gids.21,23.otf | Bin 1692 -> 1684 bytes
+ .../gpos2_2_font5.keep-layout-retain-gids.2E,23.otf | Bin 2024 -> 1944 bytes
+ ...keep-layout-retain-gids.retain-all-codepoint.otf | Bin 3732 -> 3724 bytes
+ .../gpos2_2_font5.keep-layout.21,23,25.otf          | Bin 1488 -> 1480 bytes
+ .../gpos2_2_font5.keep-layout.21,23.otf             | Bin 1368 -> 1360 bytes
+ .../gpos2_2_font5.keep-layout.2E,23.otf             | Bin 1588 -> 1508 bytes
+ ...os2_2_font5.keep-layout.retain-all-codepoint.otf | Bin 3732 -> 3724 bytes
+ ...t-retain-gids.627,644,623,62D,644,627,645,2E.ttf | Bin 48640 -> 48640 bytes
+ ...r.keep-layout.627,644,623,62D,644,627,645,2E.ttf | Bin 13332 -> 13332 bytes
+ 12 files changed, 0 insertions(+), 0 deletions(-)
+
+commit bb54e1047d2d501459bb366e47f24f51824c8db7
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Mar 16 13:19:26 2021 -0700
+
+    [subset] Also filter class1 by coverage when collecting variation indices for PairPosFormat2.
+
+ src/hb-ot-layout-gpos-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 190b7a98f8af54cc42d3ccdb6979e432dfd41aa9
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Oct 8 14:44:54 2020 -0700
+
+    [subset] Update PairPosFormat2 subsetting to match fontTools updated subsetting (https://github.com/fonttools/fonttools/pull/2221)
+    
+    - subset class def 1 against the coverage table.
+    - Don't re-use class 0 in class def 2.
+    - Ignore class 0 glyphs for the purposes of determing format 1 vs format 2 encoding for ClassDef.
+    
+    Add an additional test case which demonstrates these issues.
+
+ src/hb-ot-layout-common.hh                         |  43 +++++++++++++--------
+ src/hb-ot-layout-gpos-table.hh                     |  14 +++++--
+ ...AdobeVFPrototype.keep-gdef-gpos.41,42,43,57.otf | Bin 5444 -> 5400 bytes
+ .../AdobeVFPrototype.keep-gdef-gpos.41,42,43.otf   | Bin 4916 -> 4872 bytes
+ .../AdobeVFPrototype.keep-gdef-gpos.41,42.otf      | Bin 4436 -> 4392 bytes
+ .../AdobeVFPrototype.keep-gdef-gpos.41,56,57.otf   | Bin 4556 -> 4540 bytes
+ .../AdobeVFPrototype.keep-gdef-gpos.41.otf         | Bin 3692 -> 3688 bytes
+ .../AdobeVFPrototype.keep-gdef-gpos.42,57.otf      | Bin 4556 -> 4524 bytes
+ ...gpos2_1_font7.keep-layout-retain-gids.2E,23.otf | Bin 0 -> 1944 bytes
+ .../gpos2_1_font7.keep-layout.2E,23.otf            | Bin 0 -> 1508 bytes
+ ...s2_2_font5.keep-layout-retain-gids.21,23,25.otf | Bin 1776 -> 1824 bytes
+ ...gpos2_2_font5.keep-layout-retain-gids.21,23.otf | Bin 1644 -> 1692 bytes
+ ...gpos2_2_font5.keep-layout-retain-gids.2E,23.otf | Bin 0 -> 2024 bytes
+ ...s2_2_font5.keep-layout-retain-gids.41,42,43.otf | Bin 1988 -> 1988 bytes
+ ...eep-layout-retain-gids.retain-all-codepoint.otf | Bin 3684 -> 3732 bytes
+ .../gpos2_2_font5.keep-layout.21,23,25.otf         | Bin 1440 -> 1488 bytes
+ .../gpos2_2_font5.keep-layout.21,23.otf            | Bin 1320 -> 1368 bytes
+ .../gpos2_2_font5.keep-layout.2E,23.otf            | Bin 0 -> 1588 bytes
+ .../gpos2_2_font5.keep-layout.41,42,43.otf         | Bin 1288 -> 1288 bytes
+ ...s2_2_font5.keep-layout.retain-all-codepoint.otf | Bin 3684 -> 3732 bytes
+ test/subset/data/fonts/gpos2_2_font5.otf           | Bin 4580 -> 4632 bytes
+ test/subset/data/tests/layout.gpos2.tests          |   1 +
+ 22 files changed, 38 insertions(+), 20 deletions(-)
+
+commit 03538e872a0610a65fad692b33d3646f387cf578
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Tue Mar 16 19:28:35 2021 +0200
+
+    2.8.0
+
+ NEWS             | 15 +++++++++++++++
+ configure.ac     |  2 +-
+ meson.build      |  2 +-
+ src/hb-version.h |  6 +++---
+ 4 files changed, 20 insertions(+), 5 deletions(-)
+
+commit 4c34478b28497acfce02b8a544fed4ae20526336
+Merge: daeb27734 f2d08578e
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Tue Mar 16 10:37:49 2021 +0200
+
+    Merge pull request #2899 from harfbuzz/ci-fix
+    
+    [ci] Don’t install meson from its master branch
+
+commit daeb27734693183232a4571bae76a88ba869224f
+Merge: a5b8e7db4 f5356bcb6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 15 18:50:02 2021 -0700
+
+    Merge pull request #2900 from harfbuzz/nodiscard-buffer
+    
+    Mark buffer modification methods that can fail with nodiscard
+
+commit f2d08578e7a6c6febeff498dbba91ea1f747e14f
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Tue Mar 16 00:19:40 2021 +0200
+
+    [tests] Increase shape-fuzzer timeout
+
+ test/fuzzing/meson.build | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit cad753e20f7f48d4910ce99c55bf8cc379a4aae7
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Tue Mar 16 01:04:16 2021 +0200
+
+    [ci] Use known working Ubuntu version
+    
+    GitHub Actions seems to be moving ubuntu-latest from ubuntu-18.04 to
+    ubuntu-20.04, but gcovr is broken for us in the new version.
+
+ .github/workflows/linux-ci.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ff86c72e09f8d7c623fafec671d44d62ef940e50
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Tue Mar 16 00:20:05 2021 +0200
+
+    [ci] Avoid duplicate builds on pull requests
+    
+    Don’t run GitHub Actions on pushing to branches other than master. This
+    was already the case for the linux-ci workflow.
+
+ .github/workflows/msvc-ci.yml  | 2 ++
+ .github/workflows/msys2-ci.yml | 2 ++
+ 2 files changed, 4 insertions(+)
+
+commit f5356bcb6186d21158275e69fce75f015eac5478
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 15 16:52:39 2021 -0600
+
+    [ci] Switch back to c++2a
+    
+    Okay I guess we can be bothered to fix things up for next version of C++.
+    
+    Reverts meat of c0b3b9b2584c6dcb5fc37e3b49e26fba718d0e6c
+
+ .circleci/config.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9e397ff2fb1beb08a226f12d68a406a13023f03d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 15 16:50:54 2021 -0600
+
+    [buffer] Fix order of HB_INTERNAL HB_DISCARD
+    
+    Sucks that has to be specified in this order. But that is what it is for now.
+    
+    Was only exhibiting problem on C++>=17 since that's when the [[nodiscard]]
+    was introduced.
+
+ src/hb-buffer.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 9582640eedbf73fa95e6877a83e9b70970d9d115
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 15 16:47:27 2021 -0600
+
+    [ci] Remove more cruft
+    
+    All were commented out already.
+
+ .circleci/config.yml | 6 +-----
+ 1 file changed, 1 insertion(+), 5 deletions(-)
+
+commit c0b3b9b2584c6dcb5fc37e3b49e26fba718d0e6c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 15 16:46:13 2021 -0600
+
+    [ci] Don't test C++2a build
+    
+    One of the bots is unhappy when HB_NODISCARD comes after HB_INTERNAL.
+    No idea why. But, again, we're testing HarfBuzz, not C++, not clang. Ugh.
+    
+    In file included from src/harfbuzz.cc:1:
+    In file included from src/hb-aat-layout.cc:30:
+    In file included from src/hb-aat-layout.hh:32:
+    In file included from src/hb-ot-shape.hh:32:
+    In file included from src/hb-ot-map.hh:32:
+    src/hb-buffer.hh:335:15: error: an attribute list cannot appear here
+      HB_INTERNAL HB_NODISCARD bool move_to (unsigned int i); /* i is output-buffer index. */
+                  ^~~~~~~~~~~~
+    https://app.circleci.com/pipelines/github/harfbuzz/harfbuzz/1693/workflows/77459205-a189-45d3-bc58-52a8fd952c3f/jobs/155912/parallel-runs/0/steps/0-110?invite=true
+
+ .circleci/config.yml | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit 15f3ef01366c8dc1d6fa18f6c9e072b18f92afd7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 15 15:36:47 2021 -0600
+
+    [test] Fix output format
+
+ test/shaping/run-tests.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 8450f43ae1d1a5825bdfc1ec665cb81b05f35cc2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 15 15:18:06 2021 -0600
+
+    [buffer] HB_NODISCARD next_glyph()
+
+ src/gen-vowel-constraints.py                 |  6 ++---
+ src/hb-aat-layout-common.hh                  |  2 +-
+ src/hb-buffer.hh                             |  2 +-
+ src/hb-ot-layout-gsubgpos.hh                 |  2 +-
+ src/hb-ot-layout.cc                          |  2 +-
+ src/hb-ot-shape-complex-hangul.cc            | 18 +++++++--------
+ src/hb-ot-shape-complex-syllabic.cc          |  4 ++--
+ src/hb-ot-shape-complex-thai.cc              |  9 ++++----
+ src/hb-ot-shape-complex-vowel-constraints.cc | 34 ++++++++++++++--------------
+ src/hb-ot-shape-normalize.cc                 | 33 +++++++++++++++------------
+ 10 files changed, 57 insertions(+), 55 deletions(-)
+
+commit f4bc7673db762db8dbb83caaeeb32b2c04dbcf9a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 15 14:54:45 2021 -0600
+
+    [buffer] Implement copy_glyph() in terms of output_info()
+
+ src/hb-buffer.hh | 10 ++++------
+ 1 file changed, 4 insertions(+), 6 deletions(-)
+
+commit f73982a6992445141ea7ca402d1f4fea80f151c4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 15 14:52:19 2021 -0600
+
+    [buffer] Implement replace_glyph() in terms of replace_glyphs(1,1)
+    
+    I get exact same binary size with this, suggesting that compiler is
+    optimizing these as needed.
+
+ src/hb-buffer.hh | 12 +-----------
+ 1 file changed, 1 insertion(+), 11 deletions(-)
+
+commit 862f913489a868154a3733a93e1ea0407e68cc05
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 15 14:48:50 2021 -0600
+
+    [buffer] Implement output_glyph() in terms of replace_glyphs(0,1)
+    
+    To my surprise, saves ~20kb in my build (non-size-optimized) build.
+    The output_glyph() method is never used in the fast paths, so doesn't
+    matter if is not fully optimized for the special case it is.
+
+ src/hb-buffer.hh | 9 +--------
+ 1 file changed, 1 insertion(+), 8 deletions(-)
+
+commit 34a1204f10eb1dedbd49c63eb7d89b86315ca093
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 15 14:39:06 2021 -0600
+
+    [buffer] HB_NODISCARD output_glyph()
+    
+    Also, generalize and use replace_glyphs() in morx where output_glyph() was used
+    in a loop.
+
+ src/gen-vowel-constraints.py                 |  4 +--
+ src/hb-aat-layout-morx-table.hh              |  6 ++---
+ src/hb-buffer.cc                             | 27 -------------------
+ src/hb-buffer.hh                             | 40 ++++++++++++++++++++--------
+ src/hb-ot-layout-gsubgpos.hh                 |  2 +-
+ src/hb-ot-shape-complex-thai.cc              |  7 +++--
+ src/hb-ot-shape-complex-vowel-constraints.cc |  4 +--
+ src/hb-ot-shape-normalize.cc                 |  3 ++-
+ 8 files changed, 41 insertions(+), 52 deletions(-)
+
+commit 07315d9c83b9f7b15244c9922f97f4c71f89ae7d
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Mon Mar 15 22:37:02 2021 +0200
+
+    [ci] Don’t install meson from its master branch
+    
+    We are testing Harfbuzz not meson!
+
+ .github/workflows/linux-ci.yml | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit e6be9eb4fbb9a5d1e028015cf1f92601da2984ac
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 15 14:12:10 2021 -0600
+
+    [buffer] HB_NODISCARD output_info()
+
+ src/hb-buffer.hh                    | 2 +-
+ src/hb-ot-shape-complex-syllabic.cc | 2 +-
+ src/hb-ot-shape.cc                  | 2 +-
+ 3 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 2a0dbb3ee59a83d1db568b002a17d617f4c45b63
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 15 14:10:39 2021 -0600
+
+    [buffer] HB_NODISCARD copy_glyph()
+
+ src/hb-aat-layout-morx-table.hh | 4 ++--
+ src/hb-buffer.hh                | 2 +-
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit b05e5d9a7998529ffd0e34f3b8d3ae5bf4c200eb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 15 14:08:08 2021 -0600
+
+    [buffer] HB_NODISCARD next_glyphs()
+
+ src/hb-buffer.cc             | 2 +-
+ src/hb-buffer.hh             | 2 +-
+ src/hb-ot-shape-normalize.cc | 2 +-
+ 3 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 4ae8aab83b83bc088719a993a359625b9ff1b6ab
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 15 14:01:52 2021 -0600
+
+    [buffer] HB_NODISCARD has_separate_output()
+
+ src/hb-buffer.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 8d3701f507cfda835855a64f598bed468a4b31e3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 15 14:01:32 2021 -0600
+
+    [buffer] HB_NODISCARD in_error()
+
+ src/hb-buffer.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 41e05479b6f1cc024576aca1f52b2185bdd93cef
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 15 14:00:00 2021 -0600
+
+    [buffer] HB_NODISCARD shift_forward()
+
+ src/hb-buffer.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 83b3784d1d984ed3a94b696252b03eab514e3ffa
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 15 13:59:14 2021 -0600
+
+    [buffer] HB_NODISCARD make_room_for()
+
+ src/hb-buffer.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c355508a8907584e41c4317fb56eac49f9627969
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 15 13:58:30 2021 -0600
+
+    [buffer] HB_NODISCARD ensure_glyphs() / ensure_unicode()
+
+ src/hb-buffer.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit bc22305b6ab626719e8b0c0d6fa518bf7b7267f6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 15 13:57:18 2021 -0600
+
+    [buffer] HB_NODISCARD ensure_inplace()
+
+ src/hb-buffer.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit cac6c86d2f8013a6f803f95e5760d7be6d27bbe0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 15 13:46:54 2021 -0600
+
+    [buffer] HB_NODISCARD move_to()
+
+ src/hb-aat-layout-morx-table.hh | 14 +++++++-------
+ src/hb-buffer.hh                |  2 +-
+ src/hb-ot-layout-gsubgpos.hh    |  2 +-
+ 3 files changed, 9 insertions(+), 9 deletions(-)
+
+commit 05d2d37f9a6753c2c3e0a2404e171f0b0a26c4ac
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 15 13:43:29 2021 -0600
+
+    [buffer] HB_NODISCARD ensure()
+
+ src/hb-buffer.cc    | 7 +++++--
+ src/hb-buffer.hh    | 2 +-
+ src/hb-graphite2.cc | 2 +-
+ 3 files changed, 7 insertions(+), 4 deletions(-)
+
+commit d8028a076208d95fa66050d158f2c4b8c50040ad
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 15 13:34:36 2021 -0600
+
+    [buffer] HB_NODISCARD enlarge()
+
+ src/hb-buffer.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 3f1998a065075284e7fe57788411bcc086259349
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 15 13:33:44 2021 -0600
+
+    [buffer] HB_NODISCARD replace_glyph()
+
+ src/hb-aat-layout-morx-table.hh | 4 ++--
+ src/hb-buffer.hh                | 2 +-
+ src/hb-ot-layout-gsubgpos.hh    | 4 ++--
+ src/hb-ot-shape-complex-thai.cc | 5 ++---
+ 4 files changed, 7 insertions(+), 8 deletions(-)
+
+commit 607979d12f85eb8260b7d7b786a7866e60c3c49b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 15 13:23:48 2021 -0600
+
+    [buffer] HB_NODISCARD replace_glyphs()
+
+ src/hb-buffer.hh                  |  7 ++++---
+ src/hb-ot-shape-complex-hangul.cc | 10 ++++------
+ src/hb-ot-shape-normalize.cc      |  2 +-
+ 3 files changed, 9 insertions(+), 10 deletions(-)
+
+commit 906c9928bb49a1694f6e32d80bb2a1ed637674f8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 15 13:13:45 2021 -0600
+
+    [buffer] Return success status from buffer ops that can fail
+    
+    Previous error-handling philosophy was that user doesn't need to
+    immediately know whether operation failed. But as can be seen after
+    we added malloc-failing fuzzing, there's just so many places in the
+    code that a failure of these operations needs to be mitigated before
+    further operations. So I'm moving towards returning success here,
+    and possibly making it nodiscard.
+
+ src/hb-buffer.cc |  6 ++++--
+ src/hb-buffer.hh | 33 ++++++++++++++++++---------------
+ 2 files changed, 22 insertions(+), 17 deletions(-)
+
+commit a5b8e7db4d4a9aca46169e2be27be5bba1cdd4bd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 15 12:46:58 2021 -0600
+
+    [hangul] Improve error handling
+    
+    I did a review; changed some "return"s to "break"s, which should be identical.
+    Removed one check just before "continue" because not necessary.
+    The added error check is the actual fix.
+    
+    Should fix https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=31755
+
+ src/hb-ot-shape-complex-hangul.cc | 9 ++++-----
+ 1 file changed, 4 insertions(+), 5 deletions(-)
+
+commit 99767f938689d308765ba96feb9ea67534b0c0d9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 15 12:36:59 2021 -0600
+
+    [hangul] Whitespace
+
+ src/hb-ot-shape-complex-hangul.cc | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+commit 3622120fab4e7d324a1b5e8465e7a6cfeb246e8d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 10 12:21:43 2021 -0700
+
+    [subset] Make ClassDef format2 .intersects() return false if range value 0
+    
+    We treat Class0 as "doesn't intersect".  That's the only meaningful
+    interpretation. If one allos Class0 to mean "intersects", then the
+    intersects() result should be true iff glyphset is non-empty.
+    
+    Related to https://github.com/harfbuzz/harfbuzz/issues/2703
+
+ src/hb-ot-layout-common.hh | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit e19de65eaeca135b2c735439185e35bfe1c0aeb7
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Mon Mar 8 13:12:47 2021 -0500
+
+    Update hb-ot-tag-table.hh (#2890)
+
+ src/gen-tag-table.py   |  1 +
+ src/hb-ot-tag-table.hh | 15 ++++++++++++---
+ 2 files changed, 13 insertions(+), 3 deletions(-)
+
+commit 7686ff854bbb9698bb1469dcfe6d288c695a76b7
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Thu Mar 4 23:09:32 2021 +0200
+
+    [ot] Keep substituted Default_Ignorables (#2886)
+    
+    Don’t replace Default_Ignorables with zero-width space if they are
+    substituted or multiplied, not just when ligated.
+    
+    After this change, HarfBuzz output matches that of Uniscribe and
+    CoreText for the new tests.
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2883
+
+ src/hb-ot-layout.hh                                      |   3 ++-
+ .../fonts/08b4b136f418add748dc641eb4a83033476f1170.ttf   | Bin 0 -> 2396 bytes
+ .../fonts/6677074106f94a2644da6aaaacd5bbd48cbdc7de.ttf   | Bin 0 -> 2388 bytes
+ .../fonts/fcea341ba6489536390384d8403ce5287ba71a4a.ttf   | Bin 0 -> 1824 bytes
+ .../shaping/data/in-house/tests/default-ignorables.tests |   3 +++
+ .../in-house/tests/mongolian-variation-selector.tests    |   2 +-
+ 6 files changed, 6 insertions(+), 2 deletions(-)
+
+commit 5efa04c8909cf61ad1491c0c1f41a6bb3f87e4e4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Mar 2 16:26:41 2021 -0700
+
+    [Makefile] Rebuild .def files if config changed
+    
+    I was getting check-symbols failure because my previous build was
+    without CoreText, and after reconfiguring with CoreText, the old
+    harfbuzz.defs file was not being regenerated.
+
+ src/Makefile.am | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit d351bbf0fb7a20554bf4504fa568f85d4d68f266
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Mar 2 16:24:54 2021 -0700
+
+    [Makefile] Remove unused variable HBNODISTHEADERS
+    
+    Not sure what it was used for before.
+
+ src/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit fd489433a8a223068d904e04d4ce8bafa82900c7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Mar 2 16:21:17 2021 -0700
+
+    [indic] Fix cluster-merging logic with cluster-level=1
+    
+    Was producing non-monotonic cluster numbers because our faulty logic
+    was not merging clusters if something from before base and after base
+    had switched positions.
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2272
+
+ src/hb-ot-shape-complex-indic.cc                   |  28 ++++++++++++++++++---
+ .../6f36d056bad6d478fc0bf7397bd52dc3bd197d5f.ttf   | Bin 0 -> 2920 bytes
+ test/shaping/data/in-house/tests/cluster.tests     |   1 +
+ 3 files changed, 26 insertions(+), 3 deletions(-)
+
+commit 2902529b9276cd15319fa308a9b9e963fa21cc94
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Mar 2 15:05:22 2021 -0700
+
+    [subset] Fix HB_TINY build
+    
+    Fixes https://github.com/harfbuzz/harfbuzzjs/issues/34#issuecomment-789247723
+
+ src/hb-ot-layout-gsubgpos.hh | 9 ++++++---
+ 1 file changed, 6 insertions(+), 3 deletions(-)
+
+commit 7cb22ba7ebf6ef053790a3201cb7014bacd51e46
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 1 12:44:06 2021 -0700
+
+    Include C headers with their C++ names (#2882)
+    
+    Remove unnecessary includes.
+    
+    Fixes build with some known broken SDKs (Nintendo Switch?)
+    
+    https://en.cppreference.com/w/cpp/header
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/pull/2881
+
+ src/hb-blob.cc                    |  3 ---
+ src/hb-coretext.cc                |  1 -
+ src/hb-ot-color.cc                |  3 ---
+ src/hb.hh                         | 20 ++++++++++----------
+ src/test-buffer-serialize.cc      |  2 --
+ src/test-gpos-size-params.cc      |  2 --
+ src/test-gsub-would-substitute.cc |  2 --
+ src/test-ot-glyphname.cc          |  3 ---
+ src/test-ot-meta.cc               |  3 ---
+ src/test-ot-name.cc               |  3 ---
+ src/test.cc                       |  4 ----
+ 11 files changed, 10 insertions(+), 36 deletions(-)
+
+commit dbcf2f417fc545a5fb3a0ee4fb413409a15a0805
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 1 12:43:32 2021 -0700
+
+    [cmake] Fix syntax
+
+ CMakeLists.txt | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 93745f9f49ec6004dfc477a01bdb6fd06b6484d0
+Merge: 8b2f9adf2 486da35cc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 23 14:54:45 2021 -0700
+
+    Merge pull request #2875 from harfbuzz/constexpr-inttype
+    
+    [constexpr] Add constructors to IntType
+
+commit 486da35cc0954505db57b2e0f5b5b0b45a7c4007
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 23 13:58:14 2021 -0700
+
+    m Add comments to IntType cast out operator
+    
+    Okay, bots seem to be happy. Merging.
+
+ src/hb-open-type.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 83b66bfb665bb82fd03ae97c6f0e3eba01c0cba4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 23 13:04:25 2021 -0700
+
+    Another try to fix narrowing error
+    
+    ../src/hb-ot-layout-gsubgpos.hh: In instantiation of ‘void OT::ChainRule::serialize_array(hb_serialize_context_t*, OT::HBUINT16, Iterator) const [with Iterator = hb_map_iter_t<hb_array_t<const OT::IntType<short unsigned int> >, const hb_map_t*&, (hb_function_sortedness_t)0, 0>; typename hb_enable_if<hb_is_iterator_of<Lhs, typename Lhs::item_t>::value>::type* <anonymous> = 0; OT::HBUINT16 = OT::IntType<short unsigned int>]’:
+    ../src/hb-ot-layout-gsubgpos.hh:2341:30:   required from here
+    ../src/hb-ot-layout-gsubgpos.hh:2326:15: error: narrowing conversion of ‘(unsigned int)g’ from ‘unsigned int’ to ‘short unsigned int’ inside { } [-Werror=narrowing]
+           c->copy (HBUINT16 {g});
+           ~~~~~~~~^~~~~~~~~~~~~~
+    
+    https://github.com/harfbuzz/harfbuzz/pull/2875
+
+ src/hb-ot-layout-gsubgpos.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6c4bb60829d6e00647cb7ee74d816d648905cc3f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 22 22:45:32 2021 -0700
+
+    Fix narrowing errors with recent changes
+
+ src/hb-ot-layout-common.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit d6bd00a488ace632d51748b028a0378a2bdaad2c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 22 22:42:50 2021 -0700
+
+    Revert back IntType out cast to signed/unsigned
+    
+    Previous commit didn't fix the bots. Putting it back now that I
+    understand why I initially did the "Wide" casts.  But only doing
+    it for out-cast this time.  This causes "narrowing" warnings
+    whenever we are converting signed/unsigned to smaller HBUINT16
+    etc.  But those are valuable warnings.  We should address those
+    separately instead of ignoring.
+    
+    Maybe we should start using uint16_t more liberally in the
+    internal subsetter function signatures then.
+
+ src/hb-open-type.hh | 7 +------
+ 1 file changed, 1 insertion(+), 6 deletions(-)
+
+commit 09836013995cab2b9f07577a179ad7b024130467
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 22 22:33:17 2021 -0700
+
+    Add back wider cast to IntType
+    
+    My local clang12 is fine, but many bots are not:
+    
+    ../src/hb-ot-cff1-table.hh: In instantiation of ‘bool CFF::Charset1_2<TYPE>::sanitize(hb_sanitize_context_t*, unsigned int) const [with TYPE = OT::IntType<unsigned char>]’:
+    ../src/hb-ot-cff1-table.hh:554:13:   required from here
+    ../src/hb-ot-cff1-table.hh:377:60: error: comparison between signed and unsigned integer expressions [-Werror=sign-compare]
+           if (unlikely (!ranges[i].sanitize (c) || (num_glyphs < ranges[i].nLeft + 1)))
+                                                    ~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
+    
+    Enabling the extra cast operator mentioned in previous commit to see if
+    that fixes this case.
+    
+    Again, I'd be happy to say "use 1u instead of 1" if this was universally
+    erred on.  But since some compilers happily compile this while others
+    err, it would be a huge headache. Let's see...
+    
+    https://github.com/harfbuzz/harfbuzz/pull/2875
+
+ src/hb-open-type.hh | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit 567cedcc5f99aae2db9c7f124b7f3a6f4b5ec57d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 22 22:09:15 2021 -0700
+
+    Narrow down cast operators on IntType
+    
+    Say for USHORT, we were implementing casts from and to unsigned.
+    With this change, we cast from and to uint16_t only.  This allows
+    compiler more opportunities to catch possible narrowing issues in
+    the code.
+    
+    It needed a couple of fixes in the codebase though, because
+    previously, if a USHORT was participating in arithmetic with signed
+    numbers, eg. "u + 1", the result would have been unsigned.  With
+    this change, it would be signed.  The correct fix is to update the
+    code to read "u + 1u".
+    
+    That said, I think about conditionally adding back the cast
+    out to signed/unsigned, to facilitate better type deduction.
+    But I couldn't think of a real situation where that would help
+    with anything.  So I didn't add.  Here's what it was:
+    
+      template <typename Type2 = hb_conditional<hb_is_signed (Type), signed, unsigned>,
+               hb_enable_if (sizeof (Type) < sizeof (Type2))>
+      operator hb_type_identity_t<Type2> () const { return v; }
+    
+    https://github.com/harfbuzz/harfbuzz/pull/2875
+
+ src/hb-aat-layout-common.hh     | 4 ++--
+ src/hb-aat-layout-morx-table.hh | 4 ++--
+ src/hb-open-type.hh             | 9 ++++-----
+ 3 files changed, 8 insertions(+), 9 deletions(-)
+
+commit f4f35a4d5fd595bc6887b9951f1c92ce4d100fe8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 22 22:28:32 2021 -0700
+
+    [constexpr] Use initializer instead of assignment
+
+ src/hb-ot-layout-common.hh   | 6 ++----
+ src/hb-ot-layout-gsubgpos.hh | 7 +------
+ 2 files changed, 3 insertions(+), 10 deletions(-)
+
+commit cc16b26ef4b9e7217ad819a31b9df55855a6f780
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 22 17:55:47 2021 -0700
+
+    [constexpr] IntType
+    
+    See https://github.com/harfbuzz/harfbuzz/pull/2875
+
+ src/hb-algs.hh      | 13 ++++++++-----
+ src/hb-open-type.hh | 12 ++++++++----
+ 2 files changed, 16 insertions(+), 9 deletions(-)
+
+commit 8b2f9adf2938513a183af58246e4b02b6173c359
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 22 17:42:24 2021 -0700
+
+    m Simplify Tag operator char*
+
+ src/hb-open-type.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 021a1725ed6b8b9f7b9b2987cbb89bed03a36477
+Merge: 1c693e8c2 11c28cb5f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 22 17:40:22 2021 -0700
+
+    Merge pull request #2874 from harfbuzz/constexpr2
+    
+    Some more cleanup towards using constexpr to simplify our internal datastrcutures.
+    
+    https://github.com/harfbuzz/harfbuzz/pull/2874
+
+commit 11c28cb5fa101a47b179e702e15ebf39d6483b32
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 22 17:38:53 2021 -0700
+
+    [cmake] Define HAVE_PTHREAD if not on win32
+    
+    Yeah...
+
+ CMakeLists.txt | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit b368a0736be279fe1ae78caa818351d88dc7131a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 22 17:23:53 2021 -0700
+
+    [atomic] Remove IBM/AIX implementation
+    
+    The C++11 implementation shall be enough for everyone.
+
+ src/hb-atomic.hh | 28 +---------------------------
+ 1 file changed, 1 insertion(+), 27 deletions(-)
+
+commit 52f91269607a45e4ae94ecca52df2299d6596de4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 22 17:22:09 2021 -0700
+
+    [atomic] Remove Windows implementation
+    
+    Since we require C++11 now, there's no point to do a macro version check.
+    Which means we don't hit the MSVC issue defining __cplusplus wrongly.
+
+ src/hb-atomic.hh | 28 ++--------------------------
+ 1 file changed, 2 insertions(+), 26 deletions(-)
+
+commit a666fe64a92206cc51d961be0848455d4fbd2bdd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 29 10:43:49 2020 -0700
+
+    [atomic] Comment
+
+ src/hb-atomic.hh | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 3528a21e8d135e65d748895b469bf83c0ebec5ae
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 29 10:40:21 2020 -0700
+
+    [atomic] Remove Apple implementation
+    
+    Continuation of https://github.com/harfbuzz/harfbuzz/pull/676
+
+ src/hb-atomic.hh | 24 ------------------------
+ 1 file changed, 24 deletions(-)
+
+commit 140797d4a2841d4109ad667a38226bfd59de5829
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 29 03:51:09 2020 -0700
+
+    [constexpr] hb_atomic_int_t
+
+ src/hb-atomic.hh | 13 ++++++++-----
+ src/hb-face.cc   |  4 ++--
+ src/hb-object.hh | 11 +++--------
+ 3 files changed, 13 insertions(+), 15 deletions(-)
+
+commit 2ec802b42a0766c3fc159fd47a2596a5eaf27742
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 29 03:48:38 2020 -0700
+
+    [object] Simplify reference_count_t
+
+ src/hb-object.hh | 8 +++-----
+ 1 file changed, 3 insertions(+), 5 deletions(-)
+
+commit 4d116ed0f02920f9ba4634d87f6201343930b657
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 22 17:14:45 2021 -0700
+
+    [ci] Remove cmake
+    
+    Apparently(?) our cmake build never bothered setting up pthreads.
+    So when I removed the busy-loop mutex impl it now doesn't build.
+    
+    711c241f6c7e18c5403602375a733af74df76f83
+    
+    https://github.com/harfbuzz/harfbuzz/pull/2874#issuecomment-782778263
+
+ .circleci/config.yml | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 1c693e8c28478655e115ad6c25ff775222b7ac00
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 20 18:53:20 2021 -0700
+
+    [test] Fix unused-var warning
+
+ test/api/test-buffer.c | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 12a283d5132a3fe03c91e75ef1f7baf65d6b5855
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 22 12:50:41 2021 -0700
+
+    m[ft] No need to use atomic ops for cached_x_scale
+    
+    We have added a mutex since, so no need for atomicity.
+
+ src/hb-ft.cc | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit b39c1f7829bb6c7a69eb783e579246fdb627cd94
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 20 15:46:17 2021 -0700
+
+    a[build] Fix distcheck
+
+ Makefile.am | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit a3c35aee30879cd86351413fc395d3128fe6817a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 29 02:07:20 2020 -0700
+
+    m Move HB_SCRIPT_MYANMAR_ZAWGYI
+
+ src/hb-ot-shape-complex.hh | 3 ++-
+ src/hb.hh                  | 8 --------
+ 2 files changed, 2 insertions(+), 9 deletions(-)
+
+commit c55bf55154887ae485501bf8843e26abb5cdedaa
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 29 02:04:16 2020 -0700
+
+    Remove HB_CONST_FUNC and HB_PURE_FUNC
+    
+    They are not necessary for inline functions.
+
+ src/hb-algs.hh | 6 +++---
+ src/hb-face.hh | 2 +-
+ src/hb.hh      | 4 ----
+ 3 files changed, 4 insertions(+), 8 deletions(-)
+
+commit cba9893ac5470e5d70888ec240453b581a657252
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 29 01:55:57 2020 -0700
+
+    m[algs] Move roundf() here
+
+ src/hb-algs.hh | 7 +++++++
+ src/hb.hh      | 5 -----
+ 2 files changed, 7 insertions(+), 5 deletions(-)
+
+commit f0947717ff43c37a6273e9de7c83d082ffec22eb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 29 01:53:21 2020 -0700
+
+    m[machinery] Move HB_VAR_ARRAY here
+
+ src/hb-machinery.hh | 5 +++++
+ src/hb.hh           | 5 -----
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+commit 69464e9da04b9e9b7f5ac33688d3832b84a8318d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 20 15:42:44 2021 -0700
+
+    [algs] Another try at fixing BEInt constexpr
+    
+    ../src/hb-algs.hh:120:3: error: body of constexpr function ‘constexpr BEInt<Type, 2>::operator Type() const [with Type = short unsigned int]’ not a return-statement
+
+ src/hb-algs.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit ff7bf88192b0ceed3e9489c82f6b902ced37e1b4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 20 15:39:29 2021 -0700
+
+    m[algs] Fix BEInt -Wnarrowing errors
+
+ src/hb-algs.hh | 20 ++++++++++----------
+ 1 file changed, 10 insertions(+), 10 deletions(-)
+
+commit a89d9f25b4baa538293c397920e5a4489859878c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 20 15:35:28 2021 -0700
+
+    m Err on -Wnarrowing instead of -Wc++11-narrowing
+    
+    On clang, -Wnarrowing is synonym for -Wc++11-narrowing.
+    On gcc it isn't. So, use the widely-available one
+
+ src/hb.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e208f80449caccea19f68e395ad4c38353849da6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 20 15:31:27 2021 -0700
+
+    Make constexpr BEInt<Type, 2>::operator Type() C++11-compatible
+    
+    Multiple return values not permitted until C++14
+
+ src/hb-algs.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit c2fc2aa44cc8018ac689dde36efa34a635544197
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 29 01:49:28 2020 -0700
+
+    [atomic] Remove Solaris intrinsics
+
+ CMakeLists.txt                             | 17 -----------------
+ configure.ac                               | 18 ------------------
+ meson-cc-tests/solaris-atomic-operations.c |  8 --------
+ meson.build                                |  4 ----
+ src/hb-atomic.hh                           | 29 -----------------------------
+ 5 files changed, 76 deletions(-)
+
+commit 7099a6dca18c12a3bb062adba4d429abc46d76a9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 29 01:47:37 2020 -0700
+
+    [atomic] Remove old Intel primitives implementation
+
+ .github/workflows/coverity-scan.yml           |  6 +++---
+ CMakeLists.txt                                | 14 --------------
+ configure.ac                                  | 16 ----------------
+ meson-cc-tests/intel-atomic-primitives-test.c |  6 ------
+ meson.build                                   |  4 ----
+ src/hb-atomic.hh                              |  9 ---------
+ 6 files changed, 3 insertions(+), 52 deletions(-)
+
+commit 711c241f6c7e18c5403602375a733af74df76f83
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 29 01:40:30 2020 -0700
+
+    m[mutex] Remove busyloop mutex implemenation
+    
+    Don't know why I ever added this. :)
+
+ configure.ac    |  5 -----
+ meson.build     |  3 ---
+ src/hb-mutex.hh | 18 ------------------
+ 3 files changed, 26 deletions(-)
+
+commit 47f01c0726388102b82c1e04a5f134abb74b1831
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 29 01:25:35 2020 -0700
+
+    m[algs] Move BEInt here
+
+ src/hb-algs.hh | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
+ src/hb.hh      | 76 ------------------------------------------------------
+ 2 files changed, 80 insertions(+), 77 deletions(-)
+
+commit e5b7bc424dd08c206f8c5baf5ac1b67d1dfd116e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 29 01:24:02 2020 -0700
+
+    m Add default value to BEInt<> Size template parameter
+
+ src/hb-open-type.hh | 14 +++++++-------
+ src/hb-serialize.hh |  2 +-
+ src/hb.hh           |  4 ++--
+ 3 files changed, 10 insertions(+), 10 deletions(-)
+
+commit 2caae4a59aadf889b410c4e2f42c0285013c22e6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 29 01:18:28 2020 -0700
+
+    m Move class traits
+
+ src/hb-meta.hh | 11 +++++++++++
+ src/hb.hh      |  8 --------
+ 2 files changed, 11 insertions(+), 8 deletions(-)
+
+commit c2dbd6cc0f9f30b2faed1fa0f40cfff742baae86
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 29 01:15:36 2020 -0700
+
+    Remove static_assert of sizeof basic sized int types
+
+ src/hb.hh | 8 --------
+ 1 file changed, 8 deletions(-)
+
+commit e1706ffecdc0469063b90bbef6178c092dd7f32b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 29 00:59:06 2020 -0700
+
+    m [algs] Move flags here
+
+ src/hb-algs.hh | 36 ++++++++++++++++++++++++++++++++++++
+ src/hb.hh      | 36 ------------------------------------
+ 2 files changed, 36 insertions(+), 36 deletions(-)
+
+commit 017f6b0d2441dc7602d9cb4b6783aaf5a0424f96
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 29 00:44:41 2020 -0700
+
+    m Move static_assert_expr<>
+
+ src/hb-meta.hh | 4 ++++
+ src/hb.hh      | 5 -----
+ 2 files changed, 4 insertions(+), 5 deletions(-)
+
+commit 61f8d0e57dd9eee7e174f091f4e43646251dbb06
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 29 00:38:56 2020 -0700
+
+    m Rename ASSERT_STATIC_EXPR_ZERO to static_assert_expr
+
+ src/hb-ot-shape-complex-arabic-win1256.hh | 4 ++--
+ src/hb-ot-shape-complex-indic.hh          | 2 +-
+ src/hb.hh                                 | 8 ++++----
+ 3 files changed, 7 insertions(+), 7 deletions(-)
+
+commit 59cfffb1af82c706e181db64e81794f43af05cf4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 29 00:34:07 2020 -0700
+
+    m Change ASSERT_STATIC_EXPR_ZERO template arg type to bool
+
+ src/hb.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 1981d83d7fefbc22d28d69714bfdac7aa5064d15
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 29 00:28:31 2020 -0700
+
+    [constexpr] HB_MARK_AS_FLAG_T
+
+ src/hb.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit a4a99de0eb17b1de1be99534b5184fd1f1c53c37
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 29 00:22:02 2020 -0700
+
+    [constexpr] bswap
+
+ src/hb.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit f8ebe1dacd71d93dc2b401d0afbac86f5e14311d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 29 00:20:45 2020 -0700
+
+    [constexpr] BEInt
+
+ src/hb.hh | 64 +++++++++++++++++++++++----------------------------------------
+ 1 file changed, 23 insertions(+), 41 deletions(-)
+
+commit 2fbd34f89a80fb25aa0f8edd1dbb692c66211842
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jun 28 22:41:09 2020 -0700
+
+    m[set/map] Add operator bool()
+    
+    Probably should use in places..
+
+ src/hb-map.hh | 1 +
+ src/hb-set.hh | 1 +
+ 2 files changed, 2 insertions(+)
+
+commit bf75a0a03ac910879ee91cd29a4581c304edc644
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 19 18:18:38 2021 -0700
+
+    m[dispatch] Use inline class member initialization
+    
+    Let's see how bots like this...
+
+ src/hb-dispatch.hh | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 82928d9cf65e275362188e9d855690d2ae71f005
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jun 28 22:03:57 2020 -0700
+
+    m[blob] Move immutable check to C API boundary
+    
+    Similarly to 08ed9e3f779253e3b5f01c38d44d0e5db2d5e7aa
+
+ src/hb-blob.cc | 10 +++-------
+ 1 file changed, 3 insertions(+), 7 deletions(-)
+
+commit 4020c6b286a5a2bacf8ca97a402b39bbf29f18c6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jun 28 21:59:46 2020 -0700
+
+    m[blob] An empty blob can always be made writable
+
+ src/hb-blob.cc | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+commit 2d39031f7b03543d8e9638354afad1af68872f06
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jun 28 20:48:48 2020 -0700
+
+    [buffer/set/map] Move immutable check only to C API boundary
+    
+    The immutable objects are a concept only enforced by the C API.
+    So move checks only to that region.
+    
+    This does assume that the rest of the code is careful not getting
+    into these internal methods on immutable objects, which something
+    we do, but have no way of enforcing (currently).
+    
+    .
+
+ src/hb-buffer.cc | 21 ++++++---------------
+ src/hb-map.cc    |  3 +++
+ src/hb-map.hh    |  4 ----
+ src/hb-set.cc    |  3 +++
+ src/hb-set.hh    |  5 -----
+ 5 files changed, 12 insertions(+), 24 deletions(-)
+
+commit 6d83d44052d85f1a67ad14101b1a0a89cca642c9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jun 28 21:02:51 2020 -0700
+
+    m[set] Recover set from error in .reset()
+
+ src/hb-set.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 445efe8d04b76e14148e7a53c891adb96e199dad
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jun 28 20:59:01 2020 -0700
+
+    m[vector] Recover vector from error in .reset()
+
+ src/hb-vector.hh | 11 ++++++++---
+ 1 file changed, 8 insertions(+), 3 deletions(-)
+
+commit 21433fa563028b1dda5f044bdeef9221511806f3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jun 28 20:46:02 2020 -0700
+
+    m[buffer] In hb_buffer_append() don't change until allocation success
+
+ src/hb-buffer.cc | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit 0f61a6213acd3f8ad5dd93f11c526bacceff699c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jun 28 20:40:25 2020 -0700
+
+    m[vowels] Simplify
+    
+    If we didn't "process" anything, swap_buffers() becomes a no-op.
+
+ src/gen-vowel-constraints.py                 |  5 +----
+ src/hb-ot-shape-complex-vowel-constraints.cc | 19 +------------------
+ 2 files changed, 2 insertions(+), 22 deletions(-)
+
+commit 3b91e0b5920a4a1c16dc349c4c93b4a4daf006bc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jun 28 20:33:54 2020 -0700
+
+    m[buffer] Rename internal variable
+
+ src/hb-buffer.cc | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+commit 9fcba109bf62aaff3dd8469ecb387e7451031a76
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jun 28 20:30:39 2020 -0700
+
+    [buffer] Make swap_buffers() copy rest
+
+ src/gen-vowel-constraints.py                 | 4 ----
+ src/hb-aat-layout-common.hh                  | 4 ----
+ src/hb-buffer.cc                             | 3 +++
+ src/hb-ot-shape-complex-vowel-constraints.cc | 4 ----
+ src/hb-ot-shape.cc                           | 2 --
+ 5 files changed, 3 insertions(+), 14 deletions(-)
+
+commit 86993c09a1f1d72b972592693ccfb18a5ab28af4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 19 17:09:33 2021 -0700
+
+    Ignore -Wrange-loop-analysis
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2834
+
+ src/hb.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 6d94194497b49ee4cd05c9f590f6cd871a5708e9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 19 17:08:10 2021 -0700
+
+    Use auto in range-for-loop more
+
+ src/hb-ot-cff-common.hh      | 2 +-
+ src/hb-ot-cmap-table.hh      | 8 ++++----
+ src/hb-ot-layout-gsubgpos.hh | 6 ++++--
+ 3 files changed, 9 insertions(+), 7 deletions(-)
+
+commit 1551f3d51862ab8f6428c9c35c7f424b00af72ee
+Author: justvanrossum <justvanrossum@gmail.com>
+Date:   Thu Feb 18 11:57:37 2021 +0100
+
+    fixing more expected test results
+
+ test/api/test-draw.c | 20 ++++++++++----------
+ 1 file changed, 10 insertions(+), 10 deletions(-)
+
+commit 79e4f436e7fc4634ed285d548cad48069c6390eb
+Author: justvanrossum <justvanrossum@gmail.com>
+Date:   Wed Feb 17 10:21:58 2021 +0100
+
+    Apply rounding correctly when calculating glyph extents for CFF and CFF2; adjust expected test results
+
+ src/hb-ot-cff1-table.cc        | 4 ++--
+ src/hb-ot-cff2-table.cc        | 4 ++--
+ test/api/test-ot-extents-cff.c | 6 +++---
+ 3 files changed, 7 insertions(+), 7 deletions(-)
+
+commit d01ebeae21b8f17a7eff92b091340fdf804b4de2
+Author: justvanrossum <justvanrossum@gmail.com>
+Date:   Wed Feb 17 10:13:54 2021 +0100
+
+    calculate extents based on scaled then rounded values; undo two of the earlier test result adjustments
+
+ src/hb-ot-glyf-table.hh           | 4 ++--
+ test/api/test-ot-metrics-tt-var.c | 4 ++--
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 1d02e9c63bde6f5d064671401a292ffc440a9e99
+Author: justvanrossum <justvanrossum@gmail.com>
+Date:   Tue Feb 16 21:39:43 2021 +0100
+
+    two more adjusted expected extents results (still not convinced this is the right thing, though)
+
+ test/api/test-ot-metrics-tt-var.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit cd0babe6a66ad8286fd8e60d7a87d7691b249482
+Author: justvanrossum <justvanrossum@gmail.com>
+Date:   Tue Feb 16 21:05:30 2021 +0100
+
+    adjust expected test result
+
+ test/api/test-ot-metrics-tt-var.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 1d8a89504bc2fc37372f10ea699453992ae8fc0b
+Author: justvanrossum <justvanrossum@gmail.com>
+Date:   Tue Feb 16 20:55:16 2021 +0100
+
+    do not round added deltas; fixes #2866
+
+ src/hb-ot-var-gvar-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 103ed7da83758e6327a0b0b3e8f521dd41f2232b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 19 16:48:30 2021 -0700
+
+    [subset] Use dagger
+    
+    Better fix for https://github.com/harfbuzz/harfbuzz/pull/2858
+
+ src/hb-ot-layout-gpos-table.hh | 12 +++---------
+ 1 file changed, 3 insertions(+), 9 deletions(-)
+
+commit d8ea552d1095b92f44657ca8a90e4fc9fcdbd37a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 18 12:07:46 2021 -0700
+
+    [aat] Improve unsafe-to-break logic
+    
+    Reduces false-positives.  See comments for new logic.
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2860
+    
+    Adjusts run-tests.sh to allow unhashed absolute filenames.
+
+ src/hb-aat-layout-common.hh                  | 91 +++++++++++++++++++++-------
+ test/shaping/data/in-house/tests/macos.tests |  3 +
+ test/shaping/run-tests.py                    | 17 +++---
+ 3 files changed, 81 insertions(+), 30 deletions(-)
+
+commit cf203936d7ba74dfb567a92378476c3125010023
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 18 12:03:26 2021 -0700
+
+    [aat] Unbreak builds
+    
+    Some compilers don't like this:
+    
+    ../src/hb-aat-layout-common.hh:732:9: error: declaration of 'using StateTable = struct AAT::StateTable<Types, EntryData>' changes meaning of 'StateTable' [-fpermissive]
+    732 |   using StateTable = StateTable<Types, EntryData>;
+
+ src/hb-aat-layout-common.hh | 14 +++++++-------
+ 1 file changed, 7 insertions(+), 7 deletions(-)
+
+commit b6fdaa6948a31beffa5a0715aca9718493bb9644
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 18 11:16:37 2021 -0700
+
+    [minor:aat] Use injected class name
+
+ src/hb-aat-layout-common.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e27420bb189bff7b15f8830e834eaf486de63505
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 18 11:15:25 2021 -0700
+
+    [minor:aat] Simplify template reference
+
+ src/hb-aat-layout-common.hh | 14 ++++++++------
+ 1 file changed, 8 insertions(+), 6 deletions(-)
+
+commit 7b8a8adb7d3d273e16ad5933b1a958f4d13a6572
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 18 09:47:24 2021 -0700
+
+    [aat] Fix unsafe-to-break marking when end-of-text action kicks in
+    
+    The state we are dealing with here is the previous state; so it should
+    cause unsafe_to_break before current glyph.
+    
+    I'm surprised this wasn't caught by any tests. Guess we don't have any
+    fonts with fancy end-of-text forms.
+
+ src/hb-aat-layout-common.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit aa80c7c8b4242d61e771b28775638bf2a2c5100f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 18 09:31:46 2021 -0700
+
+    [aat] Add buffer->successful check before buffer->next_glyph()
+
+ src/hb-aat-layout-common.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit bcd10bf2741266e16d514269cc1c8902105187db
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 17 13:58:56 2021 -0700
+
+    [normalize] Add buffer success check before ->next_glyph()
+    
+    Speculative fix for:
+    https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=27843
+
+ src/hb-ot-shape-normalize.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 505b3fc6cfbed95a4101c9a9c75a76645eb6fb6b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 17 11:34:47 2021 -0700
+
+    [harfbuzz.cc] Fix OffsetTable name clash with Mac headers
+    
+    There's no easy way to undo a "using namespace" in our sources, so by the time
+    we get to include hb-coretext.cc from harfbuzz.cc, we already have "using namespace OT"
+    active, which clashes with Mac headers.
+    
+    Error was:
+    $ gcc -O3 -Wall -arch i386 -DHAVE_CORETEXT=1 -c harfbuzz.cc -o harfbuzz.o -std=c++11
+    /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/CoreServices.framework/Frameworks/CarbonCore.framework/Headers/TextUtils.h:288:3: error:
+          reference to 'OffsetTable' is ambiguous
+      OffsetTable     offsets,
+      ^
+    /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/CoreServices.framework/Frameworks/CarbonCore.framework/Headers/IntlResources.h:115:41: note:
+          candidate found by name lookup is 'OffsetTable'
+    typedef OffPair                         OffsetTable[3];
+                                            ^
+    ./hb-open-file.hh:81:16: note: candidate found by name lookup is 'OT::OffsetTable'
+    typedef struct OffsetTable
+                   ^
+    1 error generated.
+
+ src/hb-open-file.hh     | 6 +++---
+ src/hb-ot-head-table.hh | 2 +-
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 6a9f576fd438aef23242e72bd04285d0ea1279ad
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 17 11:31:32 2021 -0700
+
+    [coretext] Silence CoreText deprecation warning
+    
+    As suggested by Ned, just ignoring it.
+    
+    warning: 'CTGetCoreTextVersion' is deprecated: first deprecated in macOS 11.0 - Use
+          -[NSProcessInfo operatingSystemVersion] [-Wdeprecated-declarations]
+
+ src/hb-coretext.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 8e53c7c125ad93c1e83224da378d53caee00ca1e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 17 11:12:56 2021 -0700
+
+    [coretext] Fix more CGFloat double-promotion warnings
+    
+    The warning is:
+    warning: implicit conversion increases floating-point precision: 'CGFloat' (aka 'float') to
+          'double' [-Wdouble-promotion]
+
+ src/hb-coretext.cc | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit cd08c2528c69cc91d06efc3947ab21007269b00d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 16 18:51:43 2021 -0700
+
+    Fix typo
+
+ CONFIG.md | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 9c8032cb4b436e093c16dd8476284d8fdcc1c93e
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Tue Feb 16 22:00:20 2021 +0200
+
+    [meson] Don’t build FontConfig subproject from master
+    
+    Pin it to a known working tag instead.
+
+ subprojects/fontconfig.wrap | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 5ca353a2d026f655af61ae159adcaeace1fdb09c
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 12 15:16:59 2021 -0800
+
+    [subset] fix heap buffer overflow found by fuzzer.
+
+ src/hb-ot-layout-gpos-table.hh                            |   3 +++
+ ...z-testcase-minimized-hb-subset-fuzzer-4901143794810880 | Bin 0 -> 565 bytes
+ ...z-testcase-minimized-hb-subset-fuzzer-6372147008241664 | Bin 0 -> 775 bytes
+ 3 files changed, 3 insertions(+)
+
+commit ae860db893f74a7025b7656697a10c017e38e261
+Merge: 7a60f4e3a 751ed68fe
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 16 12:39:47 2021 -0700
+
+    Merge pull request #2859 from harfbuzz/override-0b55
+    
+    [indic] Fix shaping of U+0B55 ORIYA SIGN OVERLINE
+
+commit 751ed68fee1d32f8a2c13b4fdc4bfaa9856608e8
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Sun Feb 14 12:47:34 2021 -0500
+
+    [indic] Fix shaping of U+0B55 ORIYA SIGN OVERLINE
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2849
+
+ src/hb-ot-shape-complex-indic.hh                          |   1 +
+ .../fonts/b3075ca42b27dde7341c2d0ae16703c5b6640df0.ttf    | Bin 0 -> 920 bytes
+ test/shaping/data/in-house/tests/indic-syllable.tests     |   2 ++
+ 3 files changed, 3 insertions(+)
+
+commit 7a60f4e3a407cdadedc3b723eb2f1d716e99cd72
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 12 14:14:17 2021 -0700
+
+    [subset] Remove debug burden
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2360
+
+ src/hb-subset-plan.hh | 15 +++++++++------
+ 1 file changed, 9 insertions(+), 6 deletions(-)
+
+commit 00d9276343f4c3d5fe6919308e0ba229c2f9ff10
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Oct 14 14:48:11 2020 -0700
+
+    Add gpos9 expected files to Makefile.am
+
+ test/subset/data/Makefile.am | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 08a4997fdec4f8df388d73dab7274b67ace8dc67
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Oct 6 13:02:12 2020 -0700
+
+    [subset] Add subset support for Extension lookups (GPOS 9, GSUB 7).
+
+ src/hb-ot-layout-gsubgpos.hh                       |  30 +++++++++++++++++++++
+ test/subset/data/Makefile.sources                  |   1 +
+ .../gpos9_font2.keep-layout-retain-gids.41,42.otf  | Bin 0 -> 1976 bytes
+ .../gpos9_font2.keep-layout-retain-gids.41.otf     | Bin 0 -> 1936 bytes
+ .../gpos9_font2.keep-layout-retain-gids.42.otf     | Bin 0 -> 1808 bytes
+ .../layout.gpos9/gpos9_font2.keep-layout.41,42.otf | Bin 0 -> 1272 bytes
+ .../layout.gpos9/gpos9_font2.keep-layout.41.otf    | Bin 0 -> 1236 bytes
+ .../layout.gpos9/gpos9_font2.keep-layout.42.otf    | Bin 0 -> 1096 bytes
+ test/subset/data/fonts/gpos9_font2.otf             | Bin 0 -> 4588 bytes
+ test/subset/data/tests/layout.gpos9.tests          |  11 ++++++++
+ test/subset/meson.build                            |   1 +
+ 11 files changed, 43 insertions(+)
+
+commit bbbea3dbd86ece2ba0f6a0f7f70ea240fbc5a40f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 11 12:23:33 2021 -0700
+
+    [minor] Rewrite set operation in OS/2 subsetting
+    
+    This patch could be nicer:
+    https://github.com/harfbuzz/harfbuzz/pull/2572/files
+    
+    Just tiny touchup now.
+
+ src/hb-ot-os2-table.hh | 9 ++++-----
+ 1 file changed, 4 insertions(+), 5 deletions(-)
+
+commit cdb9197b4137ccac7d775b0e10adf0e9ef485f0c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 11 11:32:49 2021 -0700
+
+    [khmer] Remove more unused code
+    
+    Prodded by https://github.com/harfbuzz/harfbuzz/pull/2583
+    
+    These are leftovers from when we forked Khmer shaper from the Indic shaper.
+
+ src/hb-ot-shape-complex-khmer.cc | 23 -----------------------
+ 1 file changed, 23 deletions(-)
+
+commit dfa9d7acdc320005749bb21b4c4711224a87d511
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 11 11:08:52 2021 -0700
+
+    [minor] Use serializer->propagate_error() to simplify code
+
+ src/hb-ot-color-cbdt-table.hh |  8 ++++----
+ src/hb-ot-layout-gsubgpos.hh  | 18 ++++++++----------
+ src/hb-serialize.hh           |  9 +++++----
+ 3 files changed, 17 insertions(+), 18 deletions(-)
+
+commit 5faae8260ac9f81dbc022317edd63643c83bc8e4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 11 10:58:02 2021 -0700
+
+    [post] Remove unneeded error check
+
+ src/hb-ot-post-table.hh | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit d7e2a51de2fb6c18c05bbc4c270efb01e9d744e1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 11 10:55:03 2021 -0700
+
+    [minor] Add unlikely() when checking for error
+
+ src/hb-face.cc               | 2 +-
+ src/hb-ot-glyf-table.hh      | 2 +-
+ src/hb-ot-layout-gsubgpos.hh | 8 ++++----
+ 3 files changed, 6 insertions(+), 6 deletions(-)
+
+commit eb069f3948ee6e79b9ac5396a4fd1aa37e4e9136
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 10 19:13:51 2021 -0700
+
+    [tests] Update expected output of recently-merged gpos5
+    
+    The merged PR was from before landing this:
+    
+    commit 7a72b20aa2b604053696e731185a17286de73b08
+    Author: Garret Rieger <grieger@google.com>
+    Date:   Thu Sep 24 15:58:48 2020 -0700
+    
+        [subset] Subset GDEF during layout subsetting tests.
+
+ ...1.keep-layout-retain-gids.retain-all-codepoint.otf | Bin 3840 -> 3884 bytes
+ .../gpos5_font1.keep-layout.retain-all-codepoint.otf  | Bin 3840 -> 3884 bytes
+ 2 files changed, 0 insertions(+), 0 deletions(-)
+
+commit c7d232ce4e8eccdeaf8fc4bb4b73818b581d3fb9
+Merge: 68d576224 be33704c0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 10 18:13:38 2021 -0700
+
+    Merge pull request #2701 from googlefonts/Mark-To-Ligature_grieger
+    
+    [subset] GPOS 5 MarkToLigature subsetting support
+
+commit 68d576224fcd6fd649a20c77b4573203a781f9c4
+Merge: 094406b67 7b9e23f28
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 10 14:56:29 2021 -0700
+
+    Merge pull request #2853 from harfbuzz/fix-g-ir-scanner
+    
+    [introspection] Fix g-ir-scanner syntax errors
+
+commit 7b9e23f28b2bf0540a2c49914f5d9c89079c96ba
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Feb 10 23:37:43 2021 +0200
+
+    [introspection] Fix g-ir-scanner syntax errors
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2851
+
+ src/Makefile.am             |  9 +--------
+ src/hb-aat-layout.h         |  2 +-
+ src/hb-blob.h               |  2 +-
+ src/hb-buffer.h             |  2 +-
+ src/hb-common.h             |  2 +-
+ src/hb-deprecated.h         |  2 +-
+ src/hb-draw.h               |  2 +-
+ src/hb-face.h               |  2 +-
+ src/hb-font.h               |  2 +-
+ src/hb-gobject-enums.h.tmpl |  2 +-
+ src/hb-gobject-structs.h    |  2 +-
+ src/hb-map.h                |  2 +-
+ src/hb-ot-color.h           |  2 +-
+ src/hb-ot-deprecated.h      |  2 +-
+ src/hb-ot-font.h            |  2 +-
+ src/hb-ot-layout.h          |  2 +-
+ src/hb-ot-math.h            |  2 +-
+ src/hb-ot-meta.h            |  2 +-
+ src/hb-ot-metrics.h         |  2 +-
+ src/hb-ot-name.h            |  2 +-
+ src/hb-ot-shape.h           |  2 +-
+ src/hb-ot-var.h             |  2 +-
+ src/hb-set.h                |  2 +-
+ src/hb-shape-plan.h         |  2 +-
+ src/hb-shape.h              |  2 +-
+ src/hb-style.h              |  2 +-
+ src/hb-unicode.h            |  2 +-
+ src/hb-version.h            |  2 +-
+ src/hb-version.h.in         |  2 +-
+ src/meson.build             | 10 ++--------
+ 30 files changed, 31 insertions(+), 44 deletions(-)
+
+commit 094406b67b074c460d8c44e31c847f9c1bec3d05
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Feb 10 22:49:27 2021 +0200
+
+    [ci] Disable failing Arch Linux job
+    
+    Some g-ir-scanner failure that does not seem to be related to us. The
+    job does not seem to be testing anything interesting anyway.
+
+ .circleci/config.yml | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 554aaa0c5deb4c4f315184be8540eebe9077fe27
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Feb 10 22:25:16 2021 +0200
+
+    [build] Fix make distcheck
+    
+    A regression from 7b77ce0507e18fb981a9b865f3eaac0c2ae06044.
+    It was caught by the CI build in the PR, but apparently we are now used
+    to CI failures that they are effectively ignored.
+    
+    Also, yay for multiple build systems.
+
+ test/subset/data/Makefile.am | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 1da75afbe8804ede5b2843759a9c185e015918b0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 10 00:03:30 2021 -0700
+
+    [minor] Add unlikely()
+
+ src/hb-ot-layout-gsubgpos.hh | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 6e1afac64bbf3222d3e7f484749bbd2d17fc1a25
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 9 18:48:46 2021 -0700
+
+    [minor] Rename internal variable
+    
+    To address review comment:
+    https://github.com/harfbuzz/harfbuzz/pull/2699#discussion_r573370781
+
+ src/hb-ot-layout-gsubgpos.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 836814a571a18bca344c0b35d136b2122122f82e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 5 13:41:19 2021 -0500
+
+    [array] Swap order of args to hb_equal()
+    
+    Prioritizes Key::cmp() over table's cmp.
+
+ src/hb-array.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 98374cebe1001e726b40a588b9fdc13208c8a9b1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 5 13:40:10 2021 -0500
+
+    Conditionalize IntType::cmp() so it never fails to compile
+    
+    Useful with lfind() since that calls hb_equal() which SFINAEs which
+    cmp() to use.
+
+ src/hb-open-type.hh | 17 ++++++++++++-----
+ 1 file changed, 12 insertions(+), 5 deletions(-)
+
+commit ed04174a64c77e6ba7a68294d0672391740d2d75
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 5 13:36:46 2021 -0500
+
+    Whitespace
+
+ src/hb-algs.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 6a3fd94f3b8fa8f4aa1d4e4c9cfe74d0c3b88270
+Merge: 8f47dd577 aace09a3a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 9 20:49:04 2021 -0500
+
+    Merge pull request #2699 from googlefonts/gpos_8
+    
+    [subset] Add a more complex layout subsetting test case and fix the issues it exposed.
+
+commit 8f47dd5779f7f78b5c11f307a74128892ec1d26c
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Nov 4 11:05:22 2020 -0800
+
+    [subset] don't set lookup visited in closure_lookups_context_t::recurse.
+    - Lookup::closure_lookups also checks if the lookups visited and sets the lookup to visited. If we set visited in 'recurse' then Lookup::closure_lookups will fail to recurse into the children of the lookup.
+    - Also when copying ChainRule's skip LookupRecord's that point to lookups which aren't retained. This matches FontTool's behaviour.
+
+ src/hb-ot-layout-gsubgpos.hh | 16 +++++++++++-----
+ 1 file changed, 11 insertions(+), 5 deletions(-)
+
+commit feeff5928b7764934cec376d047a5c808e9412a6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 9 14:59:40 2021 -0700
+
+    [docs] Add destroy() call to sample
+
+ docs/usermanual-fonts-and-faces.xml | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 319e5b3200a2896acb2b01cc047f1144305acc14
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Fri Jan 1 01:31:19 2021 +0200
+
+    [manual] Fix font functions section
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2731
+
+ docs/usermanual-fonts-and-faces.xml | 27 ++++++++++++++++++++-------
+ 1 file changed, 20 insertions(+), 7 deletions(-)
+
+commit 3583fce86d7c4a75b89d19107c9e0de45e169507
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Thu Dec 31 19:45:11 2020 +0200
+
+    [manual] Give all chapters & sections pretty links
+
+ docs/harfbuzz-docs.xml               | 12 ++++++------
+ docs/usermanual-getting-started.xml  |  6 +++---
+ docs/usermanual-what-is-harfbuzz.xml |  2 +-
+ 3 files changed, 10 insertions(+), 10 deletions(-)
+
+commit 84d4d9fc4d3b6811cefac097537136ef11ab78ee
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Thu Dec 31 18:27:10 2020 +0200
+
+    [manual] We don’t use ucdn library anymore
+
+ docs/usermanual-utilities.xml | 28 +---------------------------
+ 1 file changed, 1 insertion(+), 27 deletions(-)
+
+commit 68d2e1b221ca90a76f9a5179b05868e350ed0bd3
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Thu Jan 21 14:39:19 2021 +0200
+
+    [meson] Disable benchmark feature by default
+    
+    It downloads a dependency from the internet, and in the same time not
+    used anywhere (one needs to explicitly call ninja benchmark), not even
+    on the CI (not sure if it that would make much sense since it does not
+    seem to ever fail).
+
+ meson.build       | 12 ++----------
+ meson_options.txt |  2 +-
+ 2 files changed, 3 insertions(+), 11 deletions(-)
+
+commit b6f47af555e17dbc3b5cacc061bd22c54e0c80f9
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Thu Jan 21 14:34:01 2021 +0200
+
+    [meson] Report more options in the summary
+
+ meson.build | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit 33a0f0b6860e0a48f92bc855c179a0fc5864112f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 9 12:55:45 2021 -0700
+
+    [test] Remove fuzzed test font that triggers virus alert
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2750
+
+ ...testcase-minimized-hb-subset-fuzzer-5741295280848896 | Bin 98822 -> 0 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit 99184fbe2b22b2662fdf1b29edd9aabc1abc040b
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Feb 3 13:40:39 2021 +0200
+
+    [ci] Add top level directory to win32 zip file
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2840
+
+ .ci/build-win32.sh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit d9e0244cdfa522d5dfdd523197078968d83dc038
+Author: josephshen <joseph.smeng@gmail.com>
+Date:   Tue Feb 2 16:04:44 2021 +0800
+
+    remove duplicate file names
+
+ src/Makefile.sources | 2 --
+ src/meson.build      | 2 --
+ 2 files changed, 4 deletions(-)
+
+commit dad41c07e4076ff247042116a0815f33e41aa0d6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 1 13:54:12 2021 -0500
+
+    [use] Typo
+
+ src/hb-ot-shape-complex-use-machine.rl | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 63a716c540657d2e0c71d3443a87ac97530cf265
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 29 20:36:42 2021 -0700
+
+    [indic] Use lfind()
+
+ src/hb-ot-shape-complex-indic.hh | 5 +----
+ 1 file changed, 1 insertion(+), 4 deletions(-)
+
+commit 921b4e46b0096873cee8c182cade0dafa8b35b43
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 29 20:35:05 2021 -0700
+
+    [algs] Add hb_equal()
+    
+    Use in hb_array_t::lfind()
+
+ src/hb-algs.hh  | 42 ++++++++++++++++++++++++++++++++++++++++--
+ src/hb-array.hh |  2 +-
+ 2 files changed, 41 insertions(+), 3 deletions(-)
+
+commit f4ed3bf20bb8522189a8d5d12242089121617896
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 29 20:05:38 2021 -0700
+
+    [indic] Remove categorization of Khmer Ra
+    
+    Khmer goes through its own shaper these days.
+
+ src/hb-ot-shape-complex-indic.hh | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 676d1e6adf9572f79544182491af1abb229d2ccf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 29 19:53:39 2021 -0700
+
+    [indic] Spell out INDIC_TABLE_ELEMENT_TYPE
+
+ src/gen-indic-table.py                   |    4 +-
+ src/hb-ot-shape-complex-indic-table.cc   |    4 +-
+ src/hb-ot-shape-complex-indic.hh         |    4 +-
+ src/hb-ot-shape-complex-khmer-machine.hh |  665 ++++++++++---------
+ src/hb-ot-shape-complex-use-machine.hh   | 1034 +++++++++++++++++-------------
+ 5 files changed, 953 insertions(+), 758 deletions(-)
+
+commit 769c2b19a3c3e87923928b9c9de4ded7307b3ed8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 29 11:40:59 2021 -0700
+
+    [indic/khmer/myanmar/use] Minor shuffling of found_syllable() macros
+
+ src/hb-ot-shape-complex-indic-machine.hh   | 32 +++++++++++++++---------------
+ src/hb-ot-shape-complex-indic-machine.rl   | 14 ++++++-------
+ src/hb-ot-shape-complex-khmer-machine.hh   | 18 ++++++++---------
+ src/hb-ot-shape-complex-khmer-machine.rl   |  8 ++++----
+ src/hb-ot-shape-complex-myanmar-machine.hh | 18 ++++++++---------
+ src/hb-ot-shape-complex-myanmar-machine.rl | 12 +++++------
+ src/hb-ot-shape-complex-use-machine.hh     | 30 ++++++++++++++--------------
+ src/hb-ot-shape-complex-use-machine.rl     | 22 ++++++++++----------
+ 8 files changed, 77 insertions(+), 77 deletions(-)
+
+commit 59721c2f372918555f3d238b449a61907d1fc94c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 29 11:34:59 2021 -0700
+
+    [use] Move data table into same compilation unit
+
+ src/Makefile.sources                               |  2 +-
+ src/gen-use-table.py                               | 11 +++--
+ src/harfbuzz.cc                                    |  1 -
+ src/hb-ot-shape-complex-use-machine.hh             | 55 ++++++++++------------
+ src/hb-ot-shape-complex-use-machine.rl             |  5 --
+ ...e-table.cc => hb-ot-shape-complex-use-table.hh} | 11 +++--
+ src/hb-ot-shape-complex-use.cc                     |  1 +
+ src/meson.build                                    |  2 +-
+ src/update-unicode-tables.make                     |  4 +-
+ 9 files changed, 42 insertions(+), 50 deletions(-)
+
+commit d9b167da3d261737ed7f5874f308eed3ad37fd0f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 28 20:40:42 2021 -0700
+
+    [use] Remove hb-ot-shape-complex-use.hh
+    
+    Inline into ragel machine.
+
+ src/Makefile.sources                   |   1 -
+ src/gen-use-table.py                   |   1 -
+ src/hb-ot-shape-complex-use-machine.hh | 100 ++++++++++++++++++++++++---------
+ src/hb-ot-shape-complex-use-machine.rl |  50 ++++++++++++++++-
+ src/hb-ot-shape-complex-use-table.cc   |   1 -
+ src/hb-ot-shape-complex-use.cc         |   1 -
+ src/hb-ot-shape-complex-use.hh         |  83 ---------------------------
+ src/meson.build                        |   1 -
+ 8 files changed, 123 insertions(+), 115 deletions(-)
+
+commit 3bb2653a5e843338ab42cc929a874923cc14bafa
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 28 20:36:51 2021 -0700
+
+    [use] Reuse category numbers exported from ragel machine
+    
+    Part of https://github.com/harfbuzz/harfbuzz/pull/2726
+
+ src/gen-use-table.py                   |  7 +--
+ src/hb-ot-shape-complex-use-machine.hh | 57 ++++++++++++------------
+ src/hb-ot-shape-complex-use-machine.rl | 11 +++--
+ src/hb-ot-shape-complex-use-table.cc   | 81 +++++++++++++++++-----------------
+ src/hb-ot-shape-complex-use.cc         | 48 ++++++++++----------
+ src/hb-ot-shape-complex-use.hh         | 53 +---------------------
+ 6 files changed, 107 insertions(+), 150 deletions(-)
+
+commit c417e0d2f91f673dfb55c6d04e9d1fcda985abe7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 28 20:27:59 2021 -0700
+
+    [indic/khmer/myanmar/use] Move enum category around
+    
+    Such that the generated -machine.hh headers are independent.
+
+ src/hb-ot-shape-complex-indic-machine.hh   | 61 +++++++++++++++------------
+ src/hb-ot-shape-complex-indic-machine.rl   |  9 ++++
+ src/hb-ot-shape-complex-indic.cc           | 14 +------
+ src/hb-ot-shape-complex-khmer-machine.hh   | 44 +++++++++++---------
+ src/hb-ot-shape-complex-khmer-machine.rl   |  6 +++
+ src/hb-ot-shape-complex-khmer.cc           | 10 +----
+ src/hb-ot-shape-complex-myanmar-machine.hh | 45 +++++++++++---------
+ src/hb-ot-shape-complex-myanmar-machine.rl |  7 ++++
+ src/hb-ot-shape-complex-myanmar.cc         | 12 +-----
+ src/hb-ot-shape-complex-use-machine.hh     | 66 +++++++++++++++++++-----------
+ src/hb-ot-shape-complex-use-machine.rl     | 16 ++++++++
+ src/hb-ot-shape-complex-use.cc             | 20 +--------
+ 12 files changed, 169 insertions(+), 141 deletions(-)
+
+commit 675b6c29947befe1c893b1c7ec33741386ca2bad
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 28 20:17:33 2021 -0700
+
+    [indic/khmer/myanmar/use] Remove unused dump-*-data programs
+    
+    In prep for streamlining tables.
+
+ src/Makefile.am          | 19 -------------------
+ src/dump-indic-data.cc   | 43 -------------------------------------------
+ src/dump-khmer-data.cc   | 41 -----------------------------------------
+ src/dump-myanmar-data.cc | 43 -------------------------------------------
+ src/dump-use-data.cc     | 38 --------------------------------------
+ src/meson.build          | 15 ---------------
+ 6 files changed, 199 deletions(-)
+
+commit 0a5c6311409547c7a24efbbd595ed5a50f754107
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 28 19:53:20 2021 -0700
+
+    [use] Rename internal enum joinint_form_t members
+    
+    To ease upcoming change.
+
+ src/hb-ot-shape-complex-use.cc | 22 +++++++++++-----------
+ 1 file changed, 11 insertions(+), 11 deletions(-)
+
+commit 880fdb7460caa88a0a08a535555e54cf5037eed3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 28 19:47:53 2021 -0700
+
+    [indic/khmer/myanmar/use] Export categories from Ragel source
+    
+    Not hooked up yet.
+    
+    Part of alternative approach to
+    https://github.com/harfbuzz/harfbuzz/pull/2726
+
+ src/hb-ot-shape-complex-indic-machine.hh   | 32 +++++++++--
+ src/hb-ot-shape-complex-indic-machine.rl   | 36 ++++++------
+ src/hb-ot-shape-complex-khmer-machine.hh   | 30 ++++++++--
+ src/hb-ot-shape-complex-khmer-machine.rl   | 32 +++++------
+ src/hb-ot-shape-complex-myanmar-machine.hh | 40 ++++++++++++--
+ src/hb-ot-shape-complex-myanmar-machine.rl | 52 +++++++++---------
+ src/hb-ot-shape-complex-use-machine.hh     | 88 ++++++++++++++++++++++--------
+ src/hb-ot-shape-complex-use-machine.rl     | 87 +++++++++++++++--------------
+ 8 files changed, 252 insertions(+), 145 deletions(-)
+
+commit f94bf9f06ff46d6fc33d04fbb4e92e5d25fcaa42
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Jan 25 15:57:42 2021 -0800
+
+    [set fuzzer] limit the total number of set members in a fuzzing input.
+    Currently the fuzzer can create arbitarily long inputs which once big enough will trigger a timeout.
+
+ test/fuzzing/hb-set-fuzzer.cc | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+commit b198d944890f107d8be09fded0ad402332230229
+Author: ckitagawa <ckitagawa@chromium.org>
+Date:   Mon Jan 25 16:34:11 2021 -0500
+
+    use {} rather than {0}
+
+ src/hb-ot-color-colr-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 2e50b517e1f5346d87349c965ef0469ed61892da
+Author: ckitagawa <ckitagawa@chromium.org>
+Date:   Mon Jan 25 16:19:07 2021 -0500
+
+    Nicer more idiomatic fix
+
+ src/hb-ot-color-colr-table.hh | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 8f6559a373363e8992cb964ecae2ce2a115e2d7d
+Author: ckitagawa <ckitagawa@chromium.org>
+Date:   Mon Jan 25 10:37:59 2021 -0500
+
+    [subet/COLR] Default initialize firstLayerIdx
+
+ src/hb-ot-color-colr-table.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit a650243d3994e5098a8528cce262d4ffb258b11d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 24 13:30:06 2021 -0700
+
+    [sanitize] Fix typo
+
+ src/hb-sanitize.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit e05e56061c75588dbc31a4ced73e13207e537fd9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 24 12:28:04 2021 -0700
+
+    [mingw] Reinstate win32 cross-compiling with autotools instructions
+    
+    Was removed in favor of meson in 6058ede3ae983c53d1d6f5352d4235bafce3499a.
+    However, those fail to build for me.
+
+ Makefile.am        |  1 +
+ README.mingw.md    | 32 ++++++++++++++++++++++++--------
+ mingw-configure.sh | 28 ++++++++++++++++++++++++++++
+ 3 files changed, 53 insertions(+), 8 deletions(-)
+
+commit 881ad720fe78b27421945824e3c30f7536a8e6bf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 21 14:27:45 2021 -0700
+
+    [algs] Remove passthru declaration
+    
+    Let compiler figure it out.
+
+ src/hb-algs.hh |  8 --------
+ src/hb-set.hh  | 25 ++++++++++++++-----------
+ 2 files changed, 14 insertions(+), 19 deletions(-)
+
+commit ca0b7afee9422338886cfb163f0a68e2f1868f24
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 21 12:18:48 2021 -0700
+
+    [set] Use hb_fill()
+
+ src/hb-ot-layout-common.hh | 8 ++++----
+ src/hb-set.hh              | 5 ++---
+ 2 files changed, 6 insertions(+), 7 deletions(-)
+
+commit 5fce8898e0be354a890c629516ecae76a3383a64
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 21 12:14:20 2021 -0700
+
+    [iter] Allow passing rvalue iters to hb_fill()
+
+ src/hb-iter.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6463ee02d6127fa2bfc4ada5e65468a4f8815531
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 21 12:01:13 2021 -0700
+
+    Speed up ClassDef/Coverage intersect methods
+    
+    Just avoiding overhead as measured by Garret.
+    Should rewrite as dagger in the future and confirm that it has the
+    same benefits. Later on, rewrite as lfind() maybe.
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2826
+
+ src/hb-ot-layout-common.hh | 34 ++++++++++++++++++++++++----------
+ 1 file changed, 24 insertions(+), 10 deletions(-)
+
+commit 33368a12b7f7b394cc2b36048a04f76aa1f7009e
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Jan 21 11:06:58 2021 -0800
+
+    uint32_t to unsigned in hb-set.hh
+
+ src/hb-set.hh | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+commit 2a0d0b901f687915eab4b270c48e658e52b95676
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Jan 21 10:45:09 2021 -0800
+
+    Make set  clear work even when set is in failed state.
+
+ src/hb-set.hh | 28 ++++++++++++++--------------
+ 1 file changed, 14 insertions(+), 14 deletions(-)
+
+commit 0ba73e980c210ea5b3542327aa889177f9e44a2e
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Sep 16 13:56:33 2020 -0700
+
+    [ENOMEM] handle allocation failures during page compaction.
+
+ src/hb-set.hh | 50 +++++++++++++++++++++++++++++++++++++++-----------
+ 1 file changed, 39 insertions(+), 11 deletions(-)
+
+commit a4c3732f59188046322e599a1a67279680385cbd
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Sep 16 12:35:09 2020 -0700
+
+    [ENOMEM] fix set clear() causing corruption if the set is in_error().
+
+ src/hb-set.hh                                            |  11 ++++++++---
+ ...-testcase-minimized-hb-subset-fuzzer-5345734743031808 | Bin 0 -> 1240 bytes
+ 2 files changed, 8 insertions(+), 3 deletions(-)
+
+commit 9b8be9643cba165abf9256df1b8b8413b0574ab0
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Jan 20 23:49:24 2021 +0200
+
+    [docs] Ignore hb-gobject headers
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2797
+
+ docs/Makefile.am           |  3 --
+ docs/harfbuzz-docs.xml     |  1 -
+ docs/harfbuzz-sections.txt | 72 ----------------------------------------------
+ docs/meson.build           | 17 +++++------
+ src/hb-gobject-structs.h   | 30 -------------------
+ 5 files changed, 7 insertions(+), 116 deletions(-)
+
+commit 2a6a49c90b1255d687e52121ba7b3b3c272c4a70
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Thu Jan 21 00:06:03 2021 +0200
+
+    [meson] Don’t scan files outside src for docs
+    
+    Similar to what we do in Makefile.am.
+
+ docs/meson.build | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 051a3c7b9a9b9064cf0a9fc8a2a32e6114f103ec
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Jan 20 22:35:34 2021 +0200
+
+    [docs] Fix typo
+
+ src/hb-font.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a44dd339f9ebf789b2642b5a7eef2785fca6d809
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Fri Jan 1 01:36:57 2021 +0200
+
+    [docs] Missing param docs
+
+ src/hb-font.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 478d169c0fdbecbf859352ae2f03d5261cb49b11
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Thu Dec 31 18:17:33 2020 +0200
+
+    [docs] Document more deprecated symbols
+
+ src/hb-deprecated.h    | 13 ++++++++++++-
+ src/hb-graphite2.cc    |  5 +++++
+ src/hb-ot-deprecated.h |  2 ++
+ 3 files changed, 19 insertions(+), 1 deletion(-)
+
+commit ca0a7a838447947ea2530bb51487c775f02d48b4
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Thu Dec 31 17:29:03 2020 +0200
+
+    [docs] Document hb_ot_math_constant_t somehow
+
+ src/hb-ot-math.h | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--
+ 1 file changed, 59 insertions(+), 2 deletions(-)
+
+commit 3ba1e7e783d2beab39fce656d98f5ce79fdf2843
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Thu Dec 31 17:11:35 2020 +0200
+
+    [docs] Document HB_OT_TAG_DEFAULT_LANGUAGE/SCRIPT
+
+ src/hb-ot-layout.h | 12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+commit 4bfa0b3c0214a35a2c7c0400aef9797a82bc5cac
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Thu Dec 31 16:30:05 2020 +0200
+
+    [docs] Fix hb_color_get_* docs
+
+ src/hb-common.cc | 16 ++++++++++++----
+ 1 file changed, 12 insertions(+), 4 deletions(-)
+
+commit 2cdc92c0c27ecdd07735e1a7d3768651991ea0e1
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Sat Aug 29 19:41:40 2020 -0400
+
+    [use] Move most joining scripts to USE
+
+ src/hb-ot-shape-complex.hh | 37 +++++++++----------------------------
+ 1 file changed, 9 insertions(+), 28 deletions(-)
+
+commit 5c73c9082b32a5dd955c1c0f0a4e08e85304c2e2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 18 12:47:25 2021 -0700
+
+    [syllabic] Fix signed/unsigned comparision errors
+
+ src/hb-ot-shape-complex-syllabic.cc | 6 +++---
+ src/hb-ot-shape-complex-syllabic.hh | 4 ++--
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+commit e3d4c2972759f0fd578213d450da7e4d8b5c83e8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 15 19:23:33 2021 -0700
+
+    [indic/khmer/myanmar] Minor: Fix mask
+    
+    Seems like a typo. No behavior change.
+
+ src/hb-ot-shape-complex-indic.hh   | 2 +-
+ src/hb-ot-shape-complex-khmer.hh   | 2 +-
+ src/hb-ot-shape-complex-myanmar.hh | 2 +-
+ 3 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 0ddade44cf02455bf78ebb782841c76f3c4cea9a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 15 19:13:47 2021 -0700
+
+    [syllabic] Merge various insert_dotted_circles implementations
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1810
+
+ src/hb-ot-shape-complex-indic.cc    | 70 ++++--------------------------------
+ src/hb-ot-shape-complex-khmer.cc    | 71 ++++--------------------------------
+ src/hb-ot-shape-complex-myanmar.cc  | 64 +++------------------------------
+ src/hb-ot-shape-complex-syllabic.cc | 67 ++++++++++++++++++++++++++++++++++
+ src/hb-ot-shape-complex-syllabic.hh |  8 +++++
+ src/hb-ot-shape-complex-use.cc      | 72 +++++--------------------------------
+ 6 files changed, 101 insertions(+), 251 deletions(-)
+
+commit e8e9fd9556816e7d43f3c5c0a678789cd6b2cf24
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 15 18:52:57 2021 -0700
+
+    [syllabic] Add hb-ot-shape-complex-syllabic.cc/hh
+    
+    Empty for now.
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1810
+
+ src/Makefile.sources                |  2 ++
+ src/harfbuzz.cc                     |  1 +
+ src/hb-ot-shape-complex-indic.hh    |  2 +-
+ src/hb-ot-shape-complex-syllabic.cc | 33 +++++++++++++++++++++++++++++++++
+ src/hb-ot-shape-complex-syllabic.hh | 33 +++++++++++++++++++++++++++++++++
+ src/hb-ot-shape-complex-use.hh      |  3 +--
+ src/meson.build                     |  2 ++
+ 7 files changed, 73 insertions(+), 3 deletions(-)
+
+commit 8af85c4e86ae88c02921b048c5100a57f27857c6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 15 18:48:12 2021 -0700
+
+    Remove hb-ot-shape-complex-machine-index.hh file
+    
+    Inline code into USE header.
+
+ src/Makefile.sources                     |  1 -
+ src/hb-ot-shape-complex-machine-index.hh | 69 --------------------------------
+ src/hb-ot-shape-complex-use-machine.hh   | 49 +++++++++++------------
+ src/hb-ot-shape-complex-use-machine.rl   |  1 -
+ src/hb-ot-shape-complex-use.hh           | 39 ++++++++++++++++++
+ 5 files changed, 63 insertions(+), 96 deletions(-)
+
+commit 9dd61c5b78dfc229e36f5ffe23fd448fc9bf82f5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 15 18:42:30 2021 -0700
+
+    Rename internal buffer var use
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1810
+
+ src/hb-ot-shape-complex-arabic.cc | 2 +-
+ src/hb-ot-shape-complex-hangul.cc | 2 +-
+ src/hb-ot-shape-complex-indic.hh  | 4 ++--
+ src/hb-ot-shape-complex-use.cc    | 2 +-
+ src/hb-ot-shape-complex.hh        | 4 ++--
+ 5 files changed, 7 insertions(+), 7 deletions(-)
+
+commit 6a140ef570bc29aafc1078d16d5399fceadd476f
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Sun Jan 17 22:48:50 2021 +0200
+
+    [meson] Pin Cairo subproject 1.17.4
+    
+    There is now a release with meson build support.
+
+ subprojects/cairo.wrap | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit fb1b29cee4bdea6805f14a530cb2984185f0d3ac
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Sun Jan 17 22:55:12 2021 +0200
+
+    [ci] Fix msys2 breakage
+    
+    What package manger randomly changes package names without fallback!
+
+ .github/workflows/msys2-ci.yml | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 3c5b7886ebeee112ba7d2f2f7d7e581981ab61b0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 15 19:26:04 2021 -0700
+
+    Revert "Avoid category duplication between C++ and Ragel"
+    
+    This reverts commit 67ea8133d3fa82b3365cd917fb266ba752f16169.
+    
+    Merged accidentally on https://github.com/harfbuzz/harfbuzz/pull/2726
+
+ src/Makefile.sources                       |  2 -
+ src/gen-ragel-artifacts.py                 |  2 +-
+ src/hb-ot-shape-complex-indic-category.hh  | 89 ------------------------------
+ src/hb-ot-shape-complex-indic-machine.hh   | 36 ++++++------
+ src/hb-ot-shape-complex-indic-machine.rl   | 19 ++++++-
+ src/hb-ot-shape-complex-indic.hh           | 36 +++++++++++-
+ src/hb-ot-shape-complex-khmer-machine.hh   | 22 ++++----
+ src/hb-ot-shape-complex-khmer-machine.rl   | 17 +++++-
+ src/hb-ot-shape-complex-khmer.hh           | 29 +++++++---
+ src/hb-ot-shape-complex-myanmar-machine.hh | 22 ++++----
+ src/hb-ot-shape-complex-myanmar-machine.rl | 31 ++++++++++-
+ src/hb-ot-shape-complex-myanmar.hh         | 32 +++++++++--
+ src/hb-ot-shape-complex-use-category.hh    | 87 -----------------------------
+ src/hb-ot-shape-complex-use-machine.hh     | 34 ++++++------
+ src/hb-ot-shape-complex-use-machine.rl     | 45 ++++++++++++++-
+ src/hb-ot-shape-complex-use.hh             | 53 +++++++++++++++++-
+ src/meson.build                            |  2 -
+ 17 files changed, 299 insertions(+), 259 deletions(-)
+
+commit 67ea8133d3fa82b3365cd917fb266ba752f16169
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Sat Oct 17 14:37:22 2020 -0400
+
+    Avoid category duplication between C++ and Ragel
+
+ src/Makefile.sources                       |  2 +
+ src/gen-ragel-artifacts.py                 |  2 +-
+ src/hb-ot-shape-complex-indic-category.hh  | 89 ++++++++++++++++++++++++++++++
+ src/hb-ot-shape-complex-indic-machine.hh   | 36 ++++++------
+ src/hb-ot-shape-complex-indic-machine.rl   | 19 +------
+ src/hb-ot-shape-complex-indic.hh           | 36 +-----------
+ src/hb-ot-shape-complex-khmer-machine.hh   | 22 ++++----
+ src/hb-ot-shape-complex-khmer-machine.rl   | 17 +-----
+ src/hb-ot-shape-complex-khmer.hh           | 29 +++-------
+ src/hb-ot-shape-complex-myanmar-machine.hh | 22 ++++----
+ src/hb-ot-shape-complex-myanmar-machine.rl | 31 +----------
+ src/hb-ot-shape-complex-myanmar.hh         | 32 ++---------
+ src/hb-ot-shape-complex-use-category.hh    | 87 +++++++++++++++++++++++++++++
+ src/hb-ot-shape-complex-use-machine.hh     | 34 ++++++------
+ src/hb-ot-shape-complex-use-machine.rl     | 45 +--------------
+ src/hb-ot-shape-complex-use.hh             | 53 +-----------------
+ src/meson.build                            |  2 +
+ 17 files changed, 259 insertions(+), 299 deletions(-)
+
+commit c8c5e52aba904cfede1c7e8e1043a392053938e6
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Mon Jan 4 20:31:12 2021 -0500
+
+    [use] Update overrides to 2021-01-04
+    
+    This uses the data files from
+    <https://github.com/microsoft/font-tools/tree/ed7b825ddbbd072d8bc731b7f12c54cb375e2f89/USE>.
+
+ src/hb-ot-shape-complex-use-table.cc            | 2 +-
+ src/ms-use/IndicSyllabicCategory-Additional.txt | 1 -
+ 2 files changed, 1 insertion(+), 2 deletions(-)
+
+commit 1fb7f3bda6de03279e2971086b6935a0970f4b98
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Thu Dec 31 03:03:48 2020 +0200
+
+    [docs] Document various HB_SCRIPT_*
+    
+    Need to have something for all of them to keep GTK-Doc happy.
+
+ src/hb-common.h | 500 ++++++++++++++++++++++++++++++++++++--------------------
+ 1 file changed, 326 insertions(+), 174 deletions(-)
+
+commit ea0907abf938f787ebfc0c41f439d1e2b2ef98ba
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Thu Dec 31 02:34:45 2020 +0200
+
+    [docs] Document version macros
+
+ src/hb-version.h    | 29 +++++++++++++++++++++++++++++
+ src/hb-version.h.in | 29 +++++++++++++++++++++++++++++
+ 2 files changed, 58 insertions(+)
+
+commit 5e9f05ff3f7dad07ba593f4a38989e0d90311b36
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Thu Dec 31 02:23:55 2020 +0200
+
+    [docs] Expand memory modes docs
+    
+    Per Behdad suggestions.
+
+ src/hb-blob.h | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit 5151c2b668e76eac73a044c478319887e3fa9acb
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Thu Dec 31 00:28:27 2020 +0200
+
+    [introspection] Replace deprecated allow-none
+    
+    Use optional or nullable as appropriate.
+
+ src/hb-aat-layout.cc       |  2 +-
+ src/hb-buffer-serialize.cc | 16 ++++++++--------
+ src/hb-ot-layout.cc        | 32 ++++++++++++++++----------------
+ src/hb-ot-name.cc          |  8 ++++----
+ src/hb-ot-tag.cc           | 14 +++++++-------
+ src/hb-ot-var.cc           |  6 +++---
+ src/hb-shape.cc            |  6 +++---
+ 7 files changed, 42 insertions(+), 42 deletions(-)
+
+commit a64d56a3e5c7ecc0f0ecc491987487b9481dbdbc
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Thu Dec 31 00:27:49 2020 +0200
+
+    [introspection] nullable is for pointers
+
+ src/hb-font.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9936490c04e9333f4c3360312c4431a3e14468b8
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Thu Dec 31 00:19:29 2020 +0200
+
+    [docs] Invalid use of "optional" annotation
+    
+    It is valid only for out and inout parameters.
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1787
+
+ src/hb-blob.cc       |  4 ++--
+ src/hb-buffer.cc     |  4 ++--
+ src/hb-deprecated.h  |  6 +++---
+ src/hb-face.cc       |  4 ++--
+ src/hb-font.cc       | 12 ++++++------
+ src/hb-font.h        | 32 ++++++++++++++++----------------
+ src/hb-ft.cc         |  4 ++--
+ src/hb-map.cc        |  2 +-
+ src/hb-set.cc        |  2 +-
+ src/hb-shape-plan.cc |  2 +-
+ src/hb-unicode.cc    |  2 +-
+ src/hb-unicode.h     | 12 ++++++------
+ 12 files changed, 43 insertions(+), 43 deletions(-)
+
+commit bf5b4b71c589e8cbe1a528b1091229825c6fec77
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Thu Dec 31 00:38:47 2020 +0200
+
+    [docs] Duplicated documentation
+
+ src/hb-unicode.h | 28 ----------------------------
+ 1 file changed, 28 deletions(-)
+
+commit 3d7a3616485e7d0ad8389547ab607234eb6ec11d
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Dec 30 23:58:37 2020 +0200
+
+    [docs] Miscellaneous missing docs
+
+ docs/harfbuzz-sections.txt |  3 +--
+ src/hb-blob.h              |  8 ++++----
+ src/hb-coretext.cc         |  2 +-
+ src/hb-directwrite.cc      |  4 ++++
+ src/hb-face.cc             |  2 +-
+ src/hb-face.h              | 13 +++++++++++++
+ src/hb-gdi.cc              |  2 ++
+ src/hb-map.h               |  6 +++++-
+ src/hb-ot-deprecated.h     |  7 +++++++
+ src/hb-ot-meta.cc          |  4 +++-
+ src/hb-ot-var.h            | 26 ++++++++++++++++----------
+ src/hb-set.h               |  6 +++++-
+ 12 files changed, 62 insertions(+), 21 deletions(-)
+
+commit a31a51cdec8cab763e7b29c42d161381c652d32d
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Dec 30 23:48:25 2020 +0200
+
+    [docs] Complete hb-ft docs a bit
+
+ src/hb-ft.cc | 18 +++++++++---------
+ 1 file changed, 9 insertions(+), 9 deletions(-)
+
+commit 8c492d5c321ceee19102986e3eb2733bb5e6c5d7
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Dec 30 23:47:33 2020 +0200
+
+    [docs] Complete hb-ot-math docs a bit
+
+ src/hb-ot-deprecated.h |  7 +++++++
+ src/hb-ot-math.h       | 22 +++++++++++++++++++++-
+ 2 files changed, 28 insertions(+), 1 deletion(-)
+
+commit 3f7ffd1b3d0bff1c641e5adf47de9be1925aa897
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Dec 30 23:46:13 2020 +0200
+
+    [docs] Complete hb-unicode docs a bit
+
+ src/hb-deprecated.h | 33 ++++++++++++++++++++++-----------
+ src/hb-unicode.cc   |  2 +-
+ src/hb-unicode.h    |  4 +++-
+ 3 files changed, 26 insertions(+), 13 deletions(-)
+
+commit 2fdab788ad20ae6256542afe0d856b63b5cfc0e2
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Dec 30 23:44:30 2020 +0200
+
+    [docs] Complete hb-buffer docs a bit
+
+ src/hb-buffer-serialize.cc | 32 +++++++++++++++-----------
+ src/hb-buffer.cc           | 32 +++++++++++++-------------
+ src/hb-buffer.h            | 57 ++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-deprecated.h        | 10 ++++++++
+ 4 files changed, 102 insertions(+), 29 deletions(-)
+
+commit 492a5a9096cc36f6d1860f576ccf09b6117e86b5
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Dec 30 23:42:49 2020 +0200
+
+    [docs] Complete hb-aat docs a bit
+
+ src/hb-aat-layout.cc | 14 ++++-----
+ src/hb-aat-layout.h  | 88 ++++++++++++++++++++++++++++------------------------
+ 2 files changed, 55 insertions(+), 47 deletions(-)
+
+commit 3a012cc469d22b9889907a79717524e983ac95b7
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Dec 30 23:40:25 2020 +0200
+
+    [docs] Complete hb-metrics docs a bit
+
+ src/hb-ot-metrics.cc | 31 ++++++++++++++++++++-----------
+ src/hb-ot-metrics.h  |  3 ++-
+ 2 files changed, 22 insertions(+), 12 deletions(-)
+
+commit 5a55b31a383deadc3d479f83a6122cca821765eb
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Dec 30 23:39:08 2020 +0200
+
+    [docs] Complete hb-shape-plan docs a bit
+
+ src/hb-shape-plan.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 8e8c3e5878028f4fba783bb92e25e03db662c664
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Dec 30 23:37:49 2020 +0200
+
+    [docs] Complete hb-ot-layout docs a bit
+
+ docs/harfbuzz-sections.txt |  2 ++
+ src/hb-ot-layout.cc        | 59 ++++++++++++++++++++++++++++------------------
+ src/hb-ot-layout.h         | 51 ++++++++++++++++++++++++++++++++++++++-
+ src/hb-ot-tag.cc           | 15 ++++++++++--
+ 4 files changed, 101 insertions(+), 26 deletions(-)
+
+commit 5b7b730d4b94b33a9915e5fa0908e84e343aae41
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Mon Dec 28 05:23:26 2020 +0200
+
+    [docs] Complete hb-color docs a bit
+
+ src/hb-ot-color.h | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit aa107e657b7940506548d003d5fda1510e8dfefa
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Dec 30 23:34:17 2020 +0200
+
+    [docs] Complete hb-font docs a bit
+
+ docs/harfbuzz-sections.txt |   4 +-
+ src/hb-deprecated.h        |  37 +++++++++++--
+ src/hb-font.cc             |  28 +++++++---
+ src/hb-font.h              | 135 +++++++++++++++++++++++++++++++++++++++++----
+ 4 files changed, 179 insertions(+), 25 deletions(-)
+
+commit 9b602e8e22d399d494f4e0a0eb22b2b4ea0d4a6a
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Dec 30 23:28:54 2020 +0200
+
+    [docs] Complete hb-common docs a bit
+
+ docs/harfbuzz-docs.xml |   3 +
+ src/hb-common.cc       |  30 ++++++-
+ src/hb-common.h        | 239 ++++++++++++++++---------------------------------
+ 3 files changed, 107 insertions(+), 165 deletions(-)
+
+commit 53ed5597b2a0615299aa52e36e75a93437f9844a
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Dec 30 23:11:33 2020 +0200
+
+    [docs] Add missing API indices
+
+ docs/harfbuzz-docs.xml | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit c9c3b3c94c4dc8e8bd1af723de287b49c8acbf42
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Dec 30 23:09:59 2020 +0200
+
+    [docs] Use correct syntax
+
+ src/hb-blob.cc |  2 +-
+ src/hb-set.cc  | 12 ++++++------
+ 2 files changed, 7 insertions(+), 7 deletions(-)
+
+commit a8e72ee7842bb0f7cff9d3b703d335215cfbc1af
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Dec 30 23:08:40 2020 +0200
+
+    [docs] Use %true and %false consistently
+
+ src/hb-aat-layout.cc |  6 +++---
+ src/hb-blob.cc       |  2 +-
+ src/hb-common.cc     |  4 ++--
+ src/hb-face.cc       |  2 +-
+ src/hb-font.cc       | 32 ++++++++++++++++----------------
+ src/hb-map.cc        |  4 ++--
+ src/hb-ot-color.cc   |  8 ++++----
+ src/hb-ot-layout.cc  | 32 ++++++++++++++++----------------
+ src/hb-ot-math.cc    |  4 ++--
+ src/hb-ot-var.cc     |  4 ++--
+ src/hb-sanitize.hh   |  2 +-
+ src/hb-set.cc        | 16 ++++++++--------
+ src/hb-unicode.cc    |  6 +++---
+ src/hb-unicode.h     |  8 ++++----
+ 14 files changed, 65 insertions(+), 65 deletions(-)
+
+commit a3fe43a41024f197936a12a62515c43a03a7c810
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Dec 30 21:58:43 2020 +0200
+
+    [docs] Hide private enum values
+    
+    "/*< skip >*/" does not seem to hide them.
+
+ src/hb-ot-layout.h  | 1 +
+ src/hb-ot-meta.h    | 1 +
+ src/hb-ot-metrics.h | 1 +
+ src/hb-ot-var.h     | 1 +
+ src/hb-style.cc     | 1 +
+ 5 files changed, 5 insertions(+)
+
+commit b8e6f17eed5eec3715e9d16f7f3db4c352f6d312
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Sun Dec 27 15:03:57 2020 +0200
+
+    [docs] Move note about harfbuzz-old to proper place
+    
+    Commit 443f87213272be5ae0579dce4749b2036dfe3815 seems to have moved it
+    to the API part by mistake.
+
+ docs/harfbuzz-docs.xml | 60 ++++++++++++++++++++++++--------------------------
+ 1 file changed, 29 insertions(+), 31 deletions(-)
+
+commit e93de6362b2388a3f11fa5cfa4f699d805c61c5d
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Sun Dec 27 00:57:29 2020 +0200
+
+    [docs] Document unused language in get_baseline
+    
+    Document that language_tag in hb_ot_layout_get_baseline() is currently
+    unused.
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2662
+
+ src/hb-ot-layout.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c7b2e64c6d9e2f9b130c8fd581f0e5a67021b76d
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Sun Dec 27 00:53:23 2020 +0200
+
+    [docs] make it clear that FT_Face must have size
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2590
+
+ src/hb-ft.cc | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 4136ecf74149c533f9a31e039d67e9a234e1f9ce
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Sun Dec 27 00:22:31 2020 +0200
+
+    [docs] Don’t use FreeType in the simple example
+    
+    Also make the code actually compile.
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2106
+
+ docs/usermanual-getting-started.xml | 31 ++++++++++++++++++-------------
+ 1 file changed, 18 insertions(+), 13 deletions(-)
+
+commit bfe4bbfc05319400572dd4547b093f7bcae7eba2
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Sun Dec 27 18:38:54 2020 +0200
+
+    [docs] Older GTK-Doc does not support HB_DEPRECATED_FOR() at all
+    
+    Fixes CI build failure.
+
+ docs/Makefile.am | 2 +-
+ docs/meson.build | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 4161146e62f7fae28afc42c297e824d298741bb3
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Sun Dec 27 18:27:19 2020 +0200
+
+    [docs] Fix generated docs for deprecated symbols
+    
+    Without ignoring HB_DEPRECATED, most deprecated symbols get missing from
+    documentation. Ignoring HB_DEPRECATED_FOR does not work, but this seems
+    to be a GTK-Doc bug.
+
+ docs/Makefile.am | 2 +-
+ docs/meson.build | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 7236c7e29cef1c2d76c7a284c5081ff4d3aa1127
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Sun Dec 27 01:59:00 2020 +0200
+
+    2.7.4
+
+ NEWS             | 7 +++++++
+ configure.ac     | 2 +-
+ meson.build      | 2 +-
+ src/hb-version.h | 4 ++--
+ 4 files changed, 11 insertions(+), 4 deletions(-)
+
+commit 6808b1fb3075990c389e3a2e80cee8c4874a8f6f
+Merge: 010bd5404 e8c15b7a1
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Sun Dec 27 01:55:15 2020 +0200
+
+    Merge pull request #2781 from harfbuzz/g-i-dist
+    
+    [ci] Install gobject-introspection on distcheck job
+
+commit e8c15b7a1cd2c2174658e221193bb83d1ca4c635
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Sat Dec 26 23:05:48 2020 +0200
+
+    [ci] Install gobject-introspection on distcheck job
+    
+    To fix missing --enable-introspection from release tarballs.
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2779
+
+ .circleci/config.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 010bd5404008e45bb23ff63613551a03e3b60f58
+Merge: 462b71eaf fdf3e448f
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Sat Dec 26 01:17:27 2020 +0200
+
+    Merge pull request #2777 from harfbuzz/docs-unicode
+    
+    [docs] Improve hb-unicode docs a bit
+
+commit 462b71eaf3aff628cc50554f2ebcb78e27262e39
+Merge: 954167143 22468c8a9
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Sat Dec 26 01:16:32 2020 +0200
+
+    Merge pull request #1676 from n8willis/docs-gtkdoc-core
+    
+    [Docs] Add gtkdoc comments for low-level core APIs
+
+commit 22468c8a9046d03751039ae82626c780c74fdc66
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Thu Dec 24 22:38:06 2020 +0200
+
+    [docs] Give destroy callbacks have (optional) annotation
+
+ src/hb-blob.cc       |  4 ++--
+ src/hb-font.h        | 30 +++++++++++++++---------------
+ src/hb-ft.cc         |  2 +-
+ src/hb-map.cc        |  2 +-
+ src/hb-set.cc        |  2 +-
+ src/hb-shape-plan.cc |  2 +-
+ src/hb-unicode.cc    |  2 +-
+ src/hb-unicode.h     | 12 ++++++------
+ 8 files changed, 28 insertions(+), 28 deletions(-)
+
+commit 35c4a15a676beb6d9198e2a9b7f06ac5ab669b2c
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Thu Dec 24 22:34:02 2020 +0200
+
+    [docs] Update hb-font documentation
+
+ src/hb-font.cc | 20 +++++++++++---------
+ 1 file changed, 11 insertions(+), 9 deletions(-)
+
+commit 8586f15957ac593aad786ad839b49596e45c0fa8
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Thu Dec 24 22:23:47 2020 +0200
+
+    [docs] Update hb-common documentation
+
+ src/hb-common.cc |  5 +++--
+ src/hb-common.h  | 16 +++++++---------
+ 2 files changed, 10 insertions(+), 11 deletions(-)
+
+commit e8c21e003dfe84a2b8c8801821176575bfa7bbb4
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Thu Dec 24 21:56:31 2020 +0200
+
+    [docs] Remove comments the duplicate docs
+
+ src/hb-font.h | 14 +++++++-------
+ 1 file changed, 7 insertions(+), 7 deletions(-)
+
+commit ff96f73f8f62344fc9d0c557bcc79cd6c2d0b95f
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Thu Dec 24 21:53:11 2020 +0200
+
+    [docs] Add some missing API to harfbuzz-sections.txt
+
+ docs/harfbuzz-sections.txt | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit cb319f0d80ab76da00c7263a7e0a433558fa73a2
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Thu Dec 24 21:47:05 2020 +0200
+
+    [docs] Add some missing annotations to hb-buffer.cc
+
+ src/hb-buffer.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 9af0edd9511cdba61ad3bd2ce23eb789e9eb58fe
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Thu Dec 24 21:40:41 2020 +0200
+
+    [docs] Document return value of hb_blob_get_data()
+
+ src/hb-blob.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f88e845fc789cb1af3956b53b749987af8d6adc8
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Thu Dec 24 21:28:37 2020 +0200
+
+    [docs] Minor fixes
+
+ src/hb-blob.cc    | 6 +++---
+ src/hb-buffer.cc  | 4 ++--
+ src/hb-face.cc    | 2 +-
+ src/hb-font.cc    | 2 +-
+ src/hb-map.cc     | 2 +-
+ src/hb-set.cc     | 2 +-
+ src/hb-unicode.cc | 2 +-
+ 7 files changed, 10 insertions(+), 10 deletions(-)
+
+commit 82092d4005aa1ce38e069b43d35282089af4ea79
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Mon Apr 22 15:31:24 2019 +0100
+
+    [docs] Update gtk-doc comments in hb-font
+
+ src/hb-font.cc | 623 +++++++++++++++++++++++++++++++++++----------------------
+ src/hb-font.h  | 371 ++++++++++++++++++++++++++--------
+ 2 files changed, 679 insertions(+), 315 deletions(-)
+
+commit e8de26e1ef7b4486ff7b13aadb89c06300f1b705
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Sun Apr 21 20:31:54 2019 +0100
+
+    [docs] Add gtkdoc comments to hb-buffer
+
+ src/hb-buffer.cc | 235 +++++++++++++++++++++++++++++--------------------------
+ src/hb-buffer.h  |  17 ++++
+ 2 files changed, 139 insertions(+), 113 deletions(-)
+
+commit d13b7eaaf18e772387ce25e899e2b3d4252c9e96
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Sun Apr 21 20:31:31 2019 +0100
+
+    [docs] Add gtkdoc comments to hb-blob
+
+ src/hb-blob.cc | 48 +++++++++++++++++++++++++++---------------------
+ src/hb-blob.h  | 35 ++++++++++++++++++++++++++---------
+ 2 files changed, 53 insertions(+), 30 deletions(-)
+
+commit 4cdb12a3fa804392ec93e29633235f9552a4e106
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Sun Apr 21 20:31:09 2019 +0100
+
+    [docs] Add gtkdoc comments to hb-common
+
+ src/hb-common.cc |  82 +++++++++-------
+ src/hb-common.h  | 295 +++++++++++++++++++++++++++++++++++++++++++++++++++++--
+ 2 files changed, 337 insertions(+), 40 deletions(-)
+
+commit 922c32eb2df9bfedc15420ceef99f35c6be07e12
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Sun Apr 21 20:30:54 2019 +0100
+
+    [docs] Add gtkdoc comments to hb-map
+
+ src/hb-map.cc | 87 ++++++++++++++++++++++++++++++++++++-----------------------
+ src/hb-map.h  |  6 +++++
+ 2 files changed, 60 insertions(+), 33 deletions(-)
+
+commit 71af2c6d9b58213963577a01c97dc9dc021dc6b7
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Sun Apr 21 20:30:36 2019 +0100
+
+    [docs] Add gtkdoc comments to hb-set
+
+ src/hb-set.cc | 207 ++++++++++++++++++++++++++++++++--------------------------
+ src/hb-set.h  |   9 +++
+ 2 files changed, 124 insertions(+), 92 deletions(-)
+
+commit ec98730ff69a744955c5d98aa38078eb0bb8fd24
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Wed Apr 17 14:44:25 2019 +0100
+
+    [docs] regularize whitespace in function params
+
+ src/hb-font.cc | 563 ++++++++++++++++++++++++++++++---------------------------
+ 1 file changed, 295 insertions(+), 268 deletions(-)
+
+commit fdf3e448fdf92385675e64563b0489d8aea2e1b8
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Thu Dec 24 00:41:45 2020 +0200
+
+    [docs] Improve hb-unicode docs a bit
+    
+    Down to only one warning.
+
+ src/hb-unicode.h | 80 ++++++++++++++++++++++++++++++++++++++++----------------
+ 1 file changed, 58 insertions(+), 22 deletions(-)
+
+commit 0fd6144a5fd0de86c509e35a552105faca458fb2
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Thu Dec 24 00:10:27 2020 +0200
+
+    [docs] Fix warnings about unknown annotations
+    
+    Use square brackets so that gtk-doc does not consider these to be
+    annotations.
+
+ src/hb-unicode.h | 168 +++++++++++++++++++++++++++----------------------------
+ 1 file changed, 84 insertions(+), 84 deletions(-)
+
+commit 954167143befde8366150dcb885f50a9e64346a3
+Merge: 8560c3e35 71a3b54f3
+Author: Khaled Hosny <dr.khaled.hosny@gmail.com>
+Date:   Wed Dec 23 23:04:17 2020 +0200
+
+    Merge pull request #2776 from harfbuzz/release
+    
+    2.7.3
+
+commit 71a3b54f3c6c6fba52a2f99e6a9258c62b5104cd
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Dec 23 15:33:15 2020 +0200
+
+    2.7.3
+
+ NEWS             | 23 +++++++++++++++++++++++
+ configure.ac     |  2 +-
+ meson.build      |  2 +-
+ src/hb-buffer.cc |  2 +-
+ src/hb-version.h |  4 ++--
+ 5 files changed, 28 insertions(+), 5 deletions(-)
+
+commit 8560c3e355dbfd199fbd9e7052151c40a9039b29
+Merge: 769a21aab 296e9d7f3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 23 00:25:10 2020 -0800
+
+    Merge pull request #2774 from harfbuzz/misc-doc
+    
+    Doc fixes
+
+commit 769a21aab6a2b1c43cc10d56de3861a3add723de
+Author: Ryan <ryan@luciaonline.net>
+Date:   Wed Dec 23 02:31:03 2020 -0500
+
+    meson: avoid regenerating hb-version.h unnecessarily
+    
+    The file is a dependency for the library as a whole, so previously editing the Meson build files at all would force a full rebuild. This will only rebuild it if the version has changed.
+
+ src/gen-hb-version.py | 11 ++++++++++-
+ 1 file changed, 10 insertions(+), 1 deletion(-)
+
+commit 296e9d7f33fb314d0bd4e0dad5a85f60aefdade9
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Dec 23 01:18:10 2020 +0200
+
+    [ci] Install fonttools using pip on msys2
+    
+    Hopefully fixes the broken package.
+
+ .github/workflows/msys2-ci.yml | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit 3dba7ea93638df814b93d75d31ad3da24605704d
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Dec 23 00:55:21 2020 +0200
+
+    [docs] Add missing API index for 1.4.0 release
+
+ docs/harfbuzz-docs.xml | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit c2e2c40bacb296526e1b395a957af0e13da4486f
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Dec 23 00:49:23 2020 +0200
+
+    [docs] Fix gtk-doc comment syntax
+    
+    The documentation was not picked otherwise.
+
+ src/hb-aat-layout.cc | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 0826940821e9b8068b0341dae4d3ea237df86aa2
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Dec 23 00:45:39 2020 +0200
+
+    [docs] Add messing sections
+    
+    Docs for these sections were not generated at all.
+
+ docs/harfbuzz-docs.xml |  4 ++++
+ src/hb-directwrite.cc  |  9 +++++++++
+ src/hb-gdi.cc          | 10 ++++++++++
+ src/hb-ot-metrics.cc   |  9 +++++++++
+ 4 files changed, 32 insertions(+)
+
+commit b8b13018edc4115e9857d7871d254c5737f90046
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Wed Dec 23 00:22:56 2020 +0200
+
+    [docs] Make gtk-doc find these typedef’s
+
+ src/hb-aat-layout.h    | 3 +--
+ src/hb-buffer.h        | 3 +--
+ src/hb-font.h          | 6 ++----
+ src/hb-ot-color.h      | 3 +--
+ src/hb-ot-deprecated.h | 3 +--
+ src/hb-ot-name.h       | 3 +--
+ src/hb-ot-var.h        | 3 +--
+ 7 files changed, 8 insertions(+), 16 deletions(-)
+
+commit 8c3a530fd7aa832215b84f4f38d58f58ac8a5832
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Tue Dec 22 23:52:46 2020 +0200
+
+    [docs] Some formatting fixes
+
+ src/hb-buffer-serialize.cc | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+commit b029a45caa6067c752643e49b30233a74a8be721
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Tue Dec 22 23:32:48 2020 +0200
+
+    [docs] Add new API to harfbuzz-sections.txt
+
+ docs/harfbuzz-docs.xml     | 1 +
+ docs/harfbuzz-sections.txt | 3 +++
+ 2 files changed, 4 insertions(+)
+
+commit ea4476d7389b8b5d30f1d969787c752856c32088
+Author: Khaled Hosny <khaled@aliftype.com>
+Date:   Mon Dec 21 17:44:03 2020 +0200
+
+    [autotools] Don’t fallback to icu-config
+    
+    ICU pkg-config support have been available for a long time, and
+    icu-config often breaks cross-compiling when the one from host system is
+    found.
+
+ configure.ac | 19 -------------------
+ 1 file changed, 19 deletions(-)
+
+commit 2953a66ab685957f57e52fb45f42445030d41e06
+Author: Chun-wei Fan <fanchunwei@src.gnome.org>
+Date:   Wed Dec 9 12:24:18 2020 +0800
+
+    CMake: Define HAVE_GOBJECT when harfbuzz-gobject is built
+    
+    Without this, the built library for harfbuzz-gobject is unuseful.
+
+ CMakeLists.txt | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 25c0a792e3c2642e3796e0428fb315da9dc2618e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 10 14:29:47 2020 -0700
+
+    Remove unused+wrong UnsizedArrayOf<> operators
+    
+    Said compiler is wrong to err since they are unused. But yeah, they
+    didn't make sense and were copy/paste leftover.
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2763
+
+ src/hb-open-type.hh | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 07e304b2a488261a89e74f396902399cb28f5608
+Merge: 7c241651a 5f32fdff1
+Author: Khaled Hosny <dr.khaled.hosny@gmail.com>
+Date:   Tue Dec 1 22:32:19 2020 +0200
+
+    Merge pull request #2755 from Myaamori/master
+    
+    meson: use meson.current_source_dir() instead of @CURRENT_SOURCE_DIR@
+
+commit 7c241651ac3c8a4d97a0a04d4db5bd0088988ed9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 30 16:38:53 2020 -0700
+
+    [algs] Don't forward rvalue twice
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/2293
+
+ src/hb-algs.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 53806e5b83cee0e275eac038d0780f95ac56588c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 25 11:51:37 2020 -0700
+
+    Tiny improvement on previous commit
+    
+    Functionally the same.
+
+ src/hb-blob.hh               | 1 +
+ src/hb-null.hh               | 1 +
+ src/hb-ot-layout-gsubgpos.hh | 2 +-
+ 3 files changed, 3 insertions(+), 1 deletion(-)
+
+commit a5f6f869e80c371665026dfe9d156f0088f2553d
+Author: Dominik Röttsches <drott@chromium.org>
+Date:   Fri Oct 23 14:25:05 2020 +0300
+
+    Drop layout table if layout lookup accelerator allocation failed
+    
+    If the table is kept, when the table is present but only the accelerator
+    allocation failed, then we run into nullptr dereferences downstream in
+    hb_ot_map_t::apply when trying to access proxy.accels[i].
+    
+    To fix this, instead of only setting lookup_count of accelerator_t
+    itself, drop the whole table to avoid hb-ot-map construction assuming
+    that the lookups will work correctly despite accelerator allocation
+    having failed.
+    
+    Fixes:
+    https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=24490
+    https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=24490
+
+ src/hb-ot-layout-gsubgpos.hh | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 5f32fdff11bca45ca842dea583f1afd51a6435b9
+Author: Myaamori <myaamori1993@gmail.com>
+Date:   Tue Nov 24 01:29:24 2020 +0000
+
+    meson: use meson.current_source_dir() instead of @CURRENT_SOURCE_DIR@
+    
+    @CURRENT_SOURCE_DIR@ is not listed as a valid string substitution
+    for custom targets in the Meson reference, and in practice
+    it does not get substituted when using the vs2019 backend.
+
+ src/meson.build | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit b2e7bb2a7caa20af244b7452ec960f9957eb8bba
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Tue Oct 27 19:50:33 2020 -0400
+
+    Don’t map BCP 47 to coincidentally similar OT tag
+
+ src/gen-tag-table.py   |  34 ++++++++---
+ src/hb-ot-tag-table.hh | 163 +++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-tag.cc       |   1 +
+ test/api/test-ot-tag.c |   4 ++
+ 4 files changed, 194 insertions(+), 8 deletions(-)
+
+commit e1df2c5277a365d5e0c83d811f0b95f66428430b
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Mon Oct 26 19:16:35 2020 -0400
+
+    Map ISO 639 code qul to language system tag 'QUH '
+
+ src/gen-tag-table.py   | 1 +
+ src/hb-ot-tag-table.hh | 1 +
+ 2 files changed, 2 insertions(+)
+
+commit bac8a856f8ce034fde04f024065455c8b29bba5e
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Sat Nov 21 16:07:57 2020 +0200
+
+    Revert "[CI] Don’t install ragel on circleci jobs"
+    
+    This reverts commit 9a9da110a54ea03a0bdd1e64fa9ff7a2b98ba53c.
+
+ .circleci/config.yml | 14 +++++++-------
+ 1 file changed, 7 insertions(+), 7 deletions(-)
+
+commit f579c66108d4b9d122213704078c998bc194d427
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Sat Nov 21 16:06:27 2020 +0200
+
+    Mark variable unused
+    
+    Hopefully fixes build with newer ragel.
+    
+    https://github.com/adrian-thurston/ragel/issues/56
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2752
+
+ src/hb-ot-shape-complex-use-machine.hh | 2 +-
+ src/hb-ot-shape-complex-use-machine.rl | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit f83496a9101f764e4eaec2ce205d55aa4f78558f
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Fri Nov 20 08:16:36 2020 -0500
+
+    [use] Remove workaround for reserved code points
+    
+    See <https://github.com/microsoft/font-tools/issues/12>.
+
+ src/gen-use-table.py                            | 4 +---
+ src/ms-use/IndicSyllabicCategory-Additional.txt | 5 ++++-
+ 2 files changed, 5 insertions(+), 4 deletions(-)
+
+commit 17da41bd06f2b993976379c8ab9287b485f58dee
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Tue Nov 17 14:29:05 2020 -0500
+
+    Update language system tag registry to OT 1.8.4
+
+ src/gen-tag-table.py   |   7 +-
+ src/hb-ot-tag-table.hh | 909 +++++++++++++++++++++++++++++++++++++------------
+ test/api/test-ot-tag.c |   6 +-
+ 3 files changed, 704 insertions(+), 218 deletions(-)
+
+commit 385d9c08d8906002690a7fbff86c1592f5b627b9
+Merge: c4ade4fdd 9722b4b26
+Author: Khaled Hosny <dr.khaled.hosny@gmail.com>
+Date:   Tue Nov 17 19:43:22 2020 +0200
+
+    Merge pull request #2700 from xclaesse/cairo-ft
+    
+    meson: Fix cairo_ft_dep when fontconfig is a subproject
+
+commit 9722b4b269bda2d7e84c3164d69caa1324f8f8b3
+Author: Xavier Claessens <xavier.claessens@collabora.com>
+Date:   Tue Nov 17 11:56:52 2020 -0500
+
+    Meson: Update all wrap files to latest version
+
+ subprojects/expat.wrap            | 19 +++++++++----------
+ subprojects/fontconfig.wrap       |  6 +++---
+ subprojects/google-benchmark.wrap | 15 ++++++++-------
+ subprojects/libpng.wrap           | 22 ++++++++++++----------
+ subprojects/zlib.wrap             | 17 ++++++++++++-----
+ 5 files changed, 44 insertions(+), 35 deletions(-)
+
+commit a082fe400d1c981e22061168299334c853ad85a6
+Author: Xavier Claessens <xavier.claessens@collabora.com>
+Date:   Fri Nov 6 13:02:21 2020 -0500
+
+    ci: Install meson 0.56.0 in crossbuild-win32
+    
+    It is required for using cairo as subproject.
+
+ .circleci/config.yml | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit e2ba0e009e499e82b2922db7e58e91bc5f452d03
+Author: Xavier Claessens <xavier.claessens@collabora.com>
+Date:   Sat Oct 3 21:34:24 2020 -0400
+
+    meson: Fix check for cairo and cairo-ft dependencies
+    
+    When cairo comes from a subproject fallback it should still take
+    cairo-ft dependency, otherwise it miss freetype2 cflags.
+    
+    Also update wrap file to use upstream repository now that meson support
+    has been merged.
+    
+    This requires Meson >= 0.54.0 because cairo itself requires that version
+    and we use the new `fallback: 'cairo'` syntax without specifying a
+    variable name because cairo does not provide a variable name for
+    cairo-ft.
+
+ meson.build            | 37 +++++++++++++++++--------------------
+ subprojects/cairo.wrap |  4 ++--
+ 2 files changed, 19 insertions(+), 22 deletions(-)
+
+commit c4ade4fdd681b59c0694b7422d7a123fd1e9e6b8
+Merge: e6c21d7b5 fd8f4ffcc
+Author: Khaled Hosny <dr.khaled.hosny@gmail.com>
+Date:   Tue Nov 17 14:32:04 2020 +0200
+
+    Merge pull request #2686 from simoncozens/more-tracing
+    
+    More tracing
+
+commit fd8f4ffcc6851ff9024957779be50411e87724d5
+Author: Simon Cozens <simon@simon-cozens.org>
+Date:   Fri Sep 18 16:37:22 2020 +0100
+
+    Trace reorder, not normalize
+
+ src/hb-ot-shape-normalize.cc | 3 ++-
+ src/hb-ot-shape.cc           | 5 +----
+ 2 files changed, 3 insertions(+), 5 deletions(-)
+
+commit 2e0193d7417d1134e1710bf3fa7690332bc561e0
+Author: Simon Cozens <simon@simon-cozens.org>
+Date:   Fri Sep 18 16:28:29 2020 +0100
+
+    Add more cast spaces
+
+ src/hb-ot-shape.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 4bb6d54e3bd16ae42364587f9703128b95de89de
+Author: Simon Cozens <simon@simon-cozens.org>
+Date:   Fri Sep 18 16:26:08 2020 +0100
+
+    Missing cast
+
+ src/hb-ot-shape-complex-indic.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 8e1bedc50b13d19e1fb3c0fbb0cfa6d87f042f51
+Author: Simon Cozens <simon@simon-cozens.org>
+Date:   Fri Sep 18 16:25:43 2020 +0100
+
+    Keep phase names
+
+ src/hb-ot-shape.cc | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 428c111f1389e3ebf8b694f342ffdc011f2ee043
+Author: Simon Cozens <simon@simon-cozens.org>
+Date:   Fri Sep 18 16:24:47 2020 +0100
+
+    Fix spacing around casts
+
+ src/hb-ot-layout.cc                | 4 ++--
+ src/hb-ot-shape-complex-indic.cc   | 2 +-
+ src/hb-ot-shape-complex-khmer.cc   | 2 +-
+ src/hb-ot-shape-complex-myanmar.cc | 2 +-
+ src/hb-ot-shape-complex-use.cc     | 2 +-
+ 5 files changed, 6 insertions(+), 6 deletions(-)
+
+commit f19018da412cf0949748dc8ba80e1a0a376238af
+Author: Simon Cozens <simon@simon-cozens.org>
+Date:   Thu Sep 17 15:08:32 2020 +0100
+
+    Smaller issues from review
+
+ src/hb-ot-shape-complex-indic.cc   | 12 ++++++------
+ src/hb-ot-shape-complex-myanmar.cc |  2 +-
+ src/hb-ot-shape.cc                 |  6 +++---
+ 3 files changed, 10 insertions(+), 10 deletions(-)
+
+commit 8b3b835a0aaf7b21825ad87f0e0ab9efbff34dcc
+Author: Simon Cozens <simon@simon-cozens.org>
+Date:   Thu Sep 17 14:27:31 2020 +0100
+
+    Trace normalization and preprocessing stages
+
+ src/hb-ot-shape.cc | 15 ++++++++++++---
+ 1 file changed, 12 insertions(+), 3 deletions(-)
+
+commit b50099bff22f9add10e100b6ace5a063a574a066
+Author: Simon Cozens <simon@simon-cozens.org>
+Date:   Thu Sep 17 14:25:30 2020 +0100
+
+    Trace reordering in pause functions
+
+ src/hb-ot-shape-complex-indic.cc   | 10 ++++++++--
+ src/hb-ot-shape-complex-khmer.cc   | 10 ++++++----
+ src/hb-ot-shape-complex-myanmar.cc |  9 ++++++---
+ src/hb-ot-shape-complex-use.cc     | 10 +++++++---
+ 4 files changed, 27 insertions(+), 12 deletions(-)
+
+commit e6c21d7b58224f483395a6c9355fe89d88aedd54
+Merge: 3bd43bd02 0c3dcfae1
+Author: Khaled Hosny <dr.khaled.hosny@gmail.com>
+Date:   Tue Nov 17 08:53:32 2020 +0200
+
+    Merge pull request #2692 from ffontaine/master
+    
+    src/meson.build: allow introspection when cross-compiling
+
+commit 0c3dcfae193efd8d5333c44075ba01932edc1059
+Merge: 2604201ae 3bd43bd02
+Author: Fabrice Fontaine <fontaine.fabrice@gmail.com>
+Date:   Tue Nov 17 07:31:07 2020 +0100
+
+    Merge remote-tracking branch 'upstream/master'
+
+commit 3bd43bd023ab713781058f9ce5bcb7566ecb2d68
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Mon Nov 16 21:55:02 2020 -0500
+
+    Map more ISO 15924 variants to `hb_script_t`s
+
+ src/hb-common.cc | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit 27170e058d2925ea05bf59f1ee8f56fb0bcb576a
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Wed Oct 28 18:02:55 2020 -0400
+
+    Fix names for language tag in gen-tag-table.py
+    
+    A BCP 47 language tag with both a script subtag and a region subtag
+    would be printed as a human-readable name in hb-ot-tag-table.hh as if it
+    only had its language subtag.
+
+ src/gen-tag-table.py   |  18 +++----
+ src/hb-ot-tag-table.hh | 126 ++++++++++++++++++++++++-------------------------
+ 2 files changed, 73 insertions(+), 71 deletions(-)
+
+commit 5091ea7e247b118009c719076650a93b3e2dde6d
+Merge: 69cc214c9 07961daed
+Author: Khaled Hosny <dr.khaled.hosny@gmail.com>
+Date:   Sat Oct 24 22:37:52 2020 +0200
+
+    Merge pull request #2733 from astiob/buffer-context-doc
+    
+    [docs] Describe buffer context applicability more explicitly
+
+commit 07961daed06d181615d8087b25122985c83760cc
+Author: Oleg Oshmyan <chortos@inbox.lv>
+Date:   Sat Oct 24 21:58:02 2020 +0300
+
+    [docs] Describe buffer context applicability more explicitly
+    
+    Make it abundantly clear that the context's script etc. don't matter.
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2730
+
+ docs/usermanual-buffers-language-script-and-direction.xml | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+commit 69cc214c9a47ec9f19bfe477149c6c68cff6a483
+Merge: 49ebb9ebd 5adc1344a
+Author: Khaled Hosny <dr.khaled.hosny@gmail.com>
+Date:   Sat Oct 24 10:41:33 2020 +0200
+
+    Merge pull request #2729 from khaledhosny/autotools-pkg-config
+    
+    [autotools] Require pkg-config 0.28
+
+commit 5adc1344a4c695ed655aabd02c8bfab114bb4d52
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Fri Oct 23 18:39:34 2020 +0200
+
+    [ci] Upload meason logs on some CircleCI jobs
+
+ .circleci/config.yml | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit 71376f88ef07163f1330f1f54f9f479cd3a67306
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Fri Oct 23 18:21:41 2020 +0200
+
+    [ci] CircleCI removed xcode:9.0.1 image
+    
+    The replacement run newer versions of macOS (10.13.3), making this job
+    obsolete as it tests nothing the other jobs don’t test.
+
+ .circleci/config.yml | 12 ------------
+ 1 file changed, 12 deletions(-)
+
+commit 05403a07b5accbc248064ec44fb884efeb811fa2
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Fri Oct 23 17:24:29 2020 +0200
+
+    [autotools] Require pkg-config 0.28
+    
+    Follow up 0615c7b64b63400b2a70a1a6dd8a57d0b0fff10c, which fixes #1565.
+    This seems to be the version that fixed the circular dependency, based
+    on the ChangeLog:
+    https://cgit.freedesktop.org/pkg-config/commit/?h=pkg-config-0.28&id=74ceac54ef6f9247c00f08eecd8cca811a3c5934
+
+ configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 49ebb9ebdd689490c74da835a3fb829f14df6ed1
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Sat Oct 17 12:03:44 2020 -0400
+
+    [use] Remove redundant O entries from the table
+
+ src/gen-use-table.py                 | 11 +++---
+ src/hb-ot-shape-complex-use-table.cc | 69 ++++++++++++++++++------------------
+ 2 files changed, 39 insertions(+), 41 deletions(-)
+
+commit 79fd5ce22e03d9db6553dadc0a5e3862b0bfa20d
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Sat Oct 17 11:57:08 2020 -0400
+
+    [use] Merge IND and Rsv classes into O
+
+ src/gen-use-table.py                   | 10 ++-------
+ src/hb-ot-shape-complex-use-machine.hh | 40 +++++++++++++++++-----------------
+ src/hb-ot-shape-complex-use-machine.rl |  6 ++---
+ src/hb-ot-shape-complex-use-table.cc   | 20 +++++++----------
+ src/hb-ot-shape-complex-use.hh         |  2 --
+ 5 files changed, 32 insertions(+), 46 deletions(-)
+
+commit c2cdcd4901132ea7690bda655602d84e63505eb1
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Sat Oct 17 21:57:27 2020 +0200
+
+    [tests] warning: unused variable 'num_glyphs'
+
+ test/api/test-buffer.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit e25aa49a1bcd8f25eeda1846c7daf9b887571d84
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Sat Oct 17 12:32:41 2020 -0400
+
+    Fix a dead link in CMakeLists.txt
+
+ CMakeLists.txt | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9a9da110a54ea03a0bdd1e64fa9ff7a2b98ba53c
+Author: Khaled Hosny <dr.khaled.hosny@gmail.com>
+Date:   Sat Oct 17 17:58:11 2020 +0200
+
+    [CI] Don’t install ragel on circleci jobs
+    
+    Latest ragel version is broken (https://github.com/adrian-thurston/ragel/issues/56), but we also don’t need to regenerate state machine on CI jobs.
+
+ .circleci/config.yml | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+commit cde2cf84c0d6515c701296351b9d5a80a41d78c5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 16 23:49:31 2020 -0600
+
+    [use] Minor clean-up of unused categories
+
+ src/hb-ot-shape-complex-use-machine.hh | 34 +++++++++++++++++-----------------
+ src/hb-ot-shape-complex-use-machine.rl |  7 -------
+ src/hb-ot-shape-complex-use.cc         |  3 +--
+ src/hb-ot-shape-complex-use.hh         |  7 -------
+ 4 files changed, 18 insertions(+), 33 deletions(-)
+
+commit 0792690b73010e24848fe82d5983ef01f38ed1fb
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Fri Oct 16 22:41:12 2020 -0400
+
+    [use] Skip WJ and ZWJ when clustering
+
+ src/gen-use-table.py                               |  13 +-
+ src/hb-ot-shape-complex-use-machine.hh             | 580 ++++++++++-----------
+ src/hb-ot-shape-complex-use-machine.rl             |   9 +-
+ src/hb-ot-shape-complex-use-table.cc               |   8 +-
+ src/hb-ot-shape-complex-use.hh                     |   2 -
+ .../shaping/data/in-house/tests/use-syllable.tests |   2 +
+ 6 files changed, 272 insertions(+), 342 deletions(-)
+
+commit 3fcf466b7b77f8eaf281f7a1a4e6ca90b5be54fe
+Author: Laurenz <laurmaedje@gmail.com>
+Date:   Fri Oct 16 23:03:01 2020 +0200
+
+    [hb-shape-fallback] Use signed int for correction
+
+ src/hb-ot-shape-fallback.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 77e704d1dbfbdb6c54127112814b24358ec52eea
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 15 02:02:04 2020 -0600
+
+    [buffer] Add assert_unicode()/assert_glyphs() and use internally
+
+ src/hb-buffer-serialize.cc | 13 ++++---------
+ src/hb-buffer.cc           | 10 ++++------
+ src/hb-buffer.hh           | 10 ++++++++++
+ src/hb-shape-plan.cc       |  3 ++-
+ 4 files changed, 20 insertions(+), 16 deletions(-)
+
+commit 5ef0613909b8223396f2342119d217e2f24aff26
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 15 01:54:28 2020 -0600
+
+    [buffer] Add ensure_glyphs()/ensure_unicode()
+    
+    Use in deserialize. To be used more.
+
+ src/hb-buffer-deserialize-json.hh | 1257 +++++++++++++-----------------
+ src/hb-buffer-deserialize-json.rl |   21 +-
+ src/hb-buffer-deserialize-text.hh | 1531 +++++++++++++++++--------------------
+ src/hb-buffer-deserialize-text.rl |   21 +-
+ src/hb-buffer.hh                  |   23 +
+ 5 files changed, 1270 insertions(+), 1583 deletions(-)
+
+commit 84dd65a8740a91e58eaef43c0006ace3a3aa54a7
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Tue Oct 13 20:21:28 2020 +0200
+
+    [test] Remove timeout from test runners
+    
+    See https://github.com/harfbuzz/harfbuzz/issues/2707#issuecomment-707744079
+    
+    This wasn’t inconsistent as well, HB_TEST_SUBSET_FUZZER_TIMEOUT defaulted
+    to 12 in the test runner, but it was overridden to 50 in meson.build,
+    and then meson has its own test timeout.
+
+ .circleci/config.yml                    | 2 +-
+ test/fuzzing/meson.build                | 1 -
+ test/fuzzing/run-draw-fuzzer-tests.py   | 2 +-
+ test/fuzzing/run-shape-fuzzer-tests.py  | 2 +-
+ test/fuzzing/run-subset-fuzzer-tests.py | 2 +-
+ 5 files changed, 4 insertions(+), 5 deletions(-)
+
+commit 3232e6f2a9053e31da67fc7ff293e007e698ef39
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 15 00:20:17 2020 -0600
+
+    [buffer] Add hb_buffer_has_positions()
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2716
+
+ docs/harfbuzz-sections.txt |  1 +
+ src/hb-buffer.cc           | 21 ++++++++++++++++++++-
+ src/hb-buffer.h            |  3 +++
+ 3 files changed, 24 insertions(+), 1 deletion(-)
+
+commit 97a093c52f87dbfb0c800dd09a23436479e69861
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Mon Oct 12 15:32:22 2020 +0200
+
+    [hb-subset] Improve error handling a bit
+    
+    * Check that output-file option is actually set before trying to open
+      it.
+    * Print file name and errno when opening the output file fails.
+    * Be more resilient when writing output file and use ferror() to check
+      for errors.
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2711
+
+ util/hb-subset.cc | 36 ++++++++++++++++++------------------
+ 1 file changed, 18 insertions(+), 18 deletions(-)
+
+commit fa771a7f85d6d07ed64db438c8f07cd6b3f65e3e
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Sun Oct 11 22:11:17 2020 +0200
+
+    [tests] Fix memory leak in test
+    
+    To make valgrind bot happy.
+
+ test/api/test-buffer.c | 21 +++++++++++----------
+ 1 file changed, 11 insertions(+), 10 deletions(-)
+
+commit dec52006d939755e38dfc3da6de100f2443d574c
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Sat Oct 10 14:49:55 2020 -0400
+
+    Map BCP 47 tags to all macrolanguages
+    
+    The general rule is that if a BCP 47 macrolanguage maps to an OpenType
+    language system tag, all its individual languages map to it too.
+    Previously, a tag like "prs" (Dari) would not map to the language system
+    tag ('FAR ') of its macrolanguage ("fa") because "prs" already has its
+    own language system tag ('DRI '). That exception has been removed: now
+    "prs" maps to 'DRI ' and falls back to 'FAR '.
+
+ src/gen-tag-table.py   |   7 +--
+ src/hb-ot-tag-table.hh | 128 ++++++++++++++++++++++++++++++++++++++++++-------
+ 2 files changed, 112 insertions(+), 23 deletions(-)
+
+commit 1d53268dfe39b6842b5129ce731f67021cb1d844
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Sat Oct 10 14:46:36 2020 -0400
+
+    Fix two-way mapping of "man" and 'MNK '
+
+ src/gen-tag-table.py   | 4 ++--
+ src/hb-ot-tag-table.hh | 2 ++
+ test/api/test-ot-tag.c | 2 ++
+ 3 files changed, 6 insertions(+), 2 deletions(-)
+
+commit ab38cf674658fbdde5732171b218fddaaccecbf9
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Sat Oct 10 14:21:20 2020 -0400
+
+    Map hy-arevmda to 'HYE ' instead of HYE0
+
+ src/gen-tag-table.py   | 3 +++
+ src/hb-ot-tag-table.hh | 7 +++++++
+ 2 files changed, 10 insertions(+)
+
+commit 916c5a900708f25b3b6efa7079ae0b9ce701643c
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Sat Oct 10 14:15:16 2020 -0400
+
+    Consistently emit BCP 47 subtag scope suffixes
+
+ src/gen-tag-table.py   |  23 ++++++++---
+ src/hb-ot-tag-table.hh | 102 ++++++++++++++++++++++++-------------------------
+ 2 files changed, 69 insertions(+), 56 deletions(-)
+
+commit 1c05f6789b86ae7bf54fb74255b3c8cea31d9978
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 11 12:28:25 2020 -0600
+
+    [buffer] Increase work limits
+    
+    Our previous limits of 64 per input character was already hit
+    by David Corbett's under-development Duployan font.
+    
+    Increase work limits by factor of 16, and number of glyphs by factor of 2.
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2707
+
+ src/hb-buffer.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit b37edebfcb10ef9d37258d504de4d1a97847d6eb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 9 21:26:09 2020 -0600
+
+    [buffer/deserialize] Do not clear() buffer upon content type mismatch
+    
+    We return false. I don't see reason to clear buffer.
+
+ src/hb-buffer-deserialize-json.hh | 54 +++++++++++-------------
+ src/hb-buffer-deserialize-json.rl |  8 +---
+ src/hb-buffer-deserialize-text.hh | 86 ++++++++++++++++-----------------------
+ src/hb-buffer-deserialize-text.rl |  8 +---
+ 4 files changed, 63 insertions(+), 93 deletions(-)
+
+commit c396e1600f732e6e53a8733815b0a215ab9be6ce
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 9 21:13:10 2020 -0600
+
+    [buffer/deserialize] Accept arbitrary glyph names
+    
+    Accepts escapes. Added TODO items for matching escaping in serialize().
+
+ src/hb-buffer-deserialize-json.hh | 201 ++++++------
+ src/hb-buffer-deserialize-json.rl |  17 +-
+ src/hb-buffer-deserialize-text.hh | 630 +++++++++++++++++++++++---------------
+ src/hb-buffer-deserialize-text.rl |   9 +-
+ src/hb-buffer-serialize.cc        |  14 +-
+ 5 files changed, 524 insertions(+), 347 deletions(-)
+
+commit 4a4eebcf86f258b3dc465400092063300a588bbf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 9 21:06:20 2020 -0600
+
+    [buffer/serialize] Minor renames in Ragel machines
+    
+    As per my previous review on:
+    https://github.com/harfbuzz/harfbuzz/pull/2687
+
+ src/hb-buffer-deserialize-json.hh |   2 +-
+ src/hb-buffer-deserialize-json.rl |  18 +++----
+ src/hb-buffer-deserialize-text.hh | 104 +++++++++++++++++++++++---------------
+ src/hb-buffer-deserialize-text.rl |  20 +++++---
+ 4 files changed, 86 insertions(+), 58 deletions(-)
+
+commit 540d2cdddb4ae4a39194d3cf0efc19a9e9edaf22
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 9 18:07:28 2020 -0600
+
+    [tests/buffer] Revert unintended whitespace changes
+    
+    From 9e5538d6a3d6f1ffbee7fad3c821621f17d61494
+    
+    Tried squashing into, but too much merge conflict.
+
+ test/api/test-buffer.c | 1332 ++++++++++++++++++++++++------------------------
+ 1 file changed, 667 insertions(+), 665 deletions(-)
+
+commit 78fb6a11afde1b4b62c343d72ea31f9f21580402
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 9 18:02:16 2020 -0600
+
+    Whitespace
+
+ src/hb-buffer-serialize.cc | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit 140552cec98684cdab72a29ee59ba6ddfcca75b4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 9 18:01:32 2020 -0600
+
+    [buffer/serialize] Only serialize empty buffers of CONTENT_TYPE_INVALID
+
+ src/hb-buffer-serialize.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 04658ec48f9c934e8453583b161e7b5260231a8d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 9 17:59:54 2020 -0600
+
+    [tests/buffer] Update tests for previous commit
+
+ test/api/test-buffer.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 8f5d8b155c0cbf9f61cf6a23d73dbc7130df21e0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 9 17:58:57 2020 -0600
+
+    [buffer] Buffer start <= end <= len requirement in (de-)serialize
+
+ src/hb-buffer-serialize.cc | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit 3b64122a7fd5218df6e0f8b345becb7ff73510f7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 9 17:55:21 2020 -0600
+
+    [buffer] Fix immutable case with end_ptr==nullptr
+
+ src/hb-buffer-serialize.cc | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit 7c0bc0bb926a37a5bc1289c1c0867843e476e863
+Author: Simon Cozens <simon@simon-cozens.org>
+Date:   Fri Sep 25 21:24:41 2020 +0100
+
+    Serialize invalid buffer to !! (text) or [] (json)
+    
+    There is no generic deserialize - you have to choose glyphs or unicode - so there is no way to deserialize this buffer.
+
+ src/hb-buffer-serialize.cc | 49 +++++++++++++++++++++++++++++++++++++++++-----
+ test/api/test-buffer.c     | 20 ++++++++++++++++---
+ 2 files changed, 61 insertions(+), 8 deletions(-)
+
+commit 5bb88c4f4569a2740d392c1a432ebb3537935e9c
+Author: Simon Cozens <simon@simon-cozens.org>
+Date:   Fri Sep 25 10:08:00 2020 +0100
+
+    Oops debug print
+
+ src/hb-buffer-serialize.cc | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit f56eb402f06003ef66f3922dd948257516fec18e
+Author: Simon Cozens <simon@simon-cozens.org>
+Date:   Fri Sep 25 10:06:33 2020 +0100
+
+    Immutable buffer fix
+
+ src/hb-buffer-serialize.cc | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+commit 150f391438a56ada7227fbcb94a6a86f3305c68e
+Author: Simon Cozens <simon@simon-cozens.org>
+Date:   Fri Sep 25 10:04:39 2020 +0100
+
+    Prohibit mixed glyphs/unicode buffers in deserialization
+
+ src/hb-buffer-deserialize-json.hh |  190 ++++--
+ src/hb-buffer-deserialize-json.rl |   28 +-
+ src/hb-buffer-deserialize-text.hh |  130 ++--
+ src/hb-buffer-deserialize-text.rl |   28 +-
+ test/api/test-buffer.c            | 1315 +++++++++++++++++++------------------
+ 5 files changed, 938 insertions(+), 753 deletions(-)
+
+commit 6b1726b6efcd5c2a7c610277d58be57b0ec659dd
+Author: Simon Cozens <simon@simon-cozens.org>
+Date:   Mon Sep 21 16:35:40 2020 +0100
+
+    Typos
+
+ src/hb-buffer-serialize.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 3d3c87e7e7bb8a6ec104da72aa7e6103941045bd
+Author: Simon Cozens <simon@simon-cozens.org>
+Date:   Mon Sep 21 14:35:05 2020 +0100
+
+    Put the flags back in and serialize clusters.
+    
+    Note that now JSON glyph buffers and Unicode buffers look very similar, except for the g/u property difference.
+
+ src/hb-buffer-deserialize-json.hh | 467 +++++++++++++++++---------------------
+ src/hb-buffer-deserialize-json.rl |   9 +-
+ src/hb-buffer-deserialize-text.hh | 434 +++++++++++++++++++----------------
+ src/hb-buffer-deserialize-text.rl |   2 +-
+ src/hb-buffer-serialize.cc        |  45 +++-
+ src/hb-buffer.h                   |   3 +-
+ test/api/test-buffer.c            |  19 +-
+ 7 files changed, 500 insertions(+), 479 deletions(-)
+
+commit 432a05b2af8522c2c5f0c7c21f06e44ab6d6a07a
+Author: Simon Cozens <simon@simon-cozens.org>
+Date:   Fri Sep 18 14:19:39 2020 +0100
+
+    (Simple) tests for Unicode serialization/deserialization
+
+ test/api/test-buffer.c | 41 +++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 41 insertions(+)
+
+commit c03a2001b2e19ff8b88e24f5b489af58952a86e7
+Author: Simon Cozens <simon@simon-cozens.org>
+Date:   Fri Sep 18 14:19:17 2020 +0100
+
+    Deserialization routines for Unicode buffers
+
+ src/hb-buffer-deserialize-json.hh | 467 ++++++++++++++++++++++----------------
+ src/hb-buffer-deserialize-json.rl |   8 +-
+ src/hb-buffer-deserialize-text.hh | 456 +++++++++++++++++++++++--------------
+ src/hb-buffer-deserialize-text.rl |  19 +-
+ src/hb-buffer-serialize.cc        |  87 ++++++-
+ src/hb-buffer.h                   |   8 +
+ 6 files changed, 655 insertions(+), 390 deletions(-)
+
+commit c0716bb5dc8b25ec452e71afc74ebebbc927fed8
+Author: Simon Cozens <simon@simon-cozens.org>
+Date:   Fri Sep 18 10:31:28 2020 +0100
+
+    Move delimiter addition into hb-buffer-serialize
+
+ src/hb-buffer-serialize.cc | 23 ++++++++++++++++++++++-
+ util/options.cc            |  8 --------
+ 2 files changed, 22 insertions(+), 9 deletions(-)
+
+commit 36ede569622f64406b441758d03c7a44a55a3c50
+Author: Simon Cozens <simon@simon-cozens.org>
+Date:   Fri Sep 18 10:24:29 2020 +0100
+
+    Fix docs
+    
+    Note the delimiters stuff isn’t true yet, will be working on that
+
+ src/hb-buffer-serialize.cc | 59 +++++++++++++++++++++++++++++++++++++++++++++-
+ 1 file changed, 58 insertions(+), 1 deletion(-)
+
+commit bb7b634cd044846e95f47538fe0f3bb8c35abd5f
+Author: Simon Cozens <simon@simon-cozens.org>
+Date:   Fri Sep 18 09:49:19 2020 +0100
+
+    Simplify JSON unicode serialization
+    
+    It’s just an array of codepoints; no need to turn them into objects
+
+ src/hb-buffer-serialize.cc | 5 -----
+ 1 file changed, 5 deletions(-)
+
+commit 57a528ab2ca09b2252598008e3d83a9bda1576ae
+Author: Simon Cozens <simon@simon-cozens.org>
+Date:   Fri Sep 18 09:35:05 2020 +0100
+
+    Convert tabs to spaces
+
+ src/hb-buffer-serialize.cc | 298 +++++++++++++++++++++------------------------
+ 1 file changed, 136 insertions(+), 162 deletions(-)
+
+commit aff6a362665cd6c582c9f79cbc3724fb918e22ce
+Author: Simon Cozens <simon@simon-cozens.org>
+Date:   Fri Sep 18 09:27:27 2020 +0100
+
+    Use auxbuffer for serialize_unicode_text
+
+ src/hb-buffer-serialize.cc | 39 ++++++++++++++++++++++-----------------
+ 1 file changed, 22 insertions(+), 17 deletions(-)
+
+commit a0203a28bb8e22a960eaeda8256ea7e657b2552a
+Author: Simon Cozens <simon@simon-cozens.org>
+Date:   Thu Sep 17 16:49:59 2020 +0100
+
+    Use hb_buffer_serialize to trace in utils
+
+ util/hb-shape.cc |  2 +-
+ util/options.cc  | 37 +++++++++++++------------------------
+ util/options.hh  |  4 +---
+ 3 files changed, 15 insertions(+), 28 deletions(-)
+
+commit 58bcc1cedd5a38a0a0da569e7e11c7641cdfc910
+Author: Simon Cozens <simon@simon-cozens.org>
+Date:   Thu Sep 17 16:29:40 2020 +0100
+
+    Serialize Unicode buffers
+
+ src/hb-buffer-serialize.cc | 181 +++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-buffer.h            |  20 +++++
+ 2 files changed, 201 insertions(+)
+
+commit be33704c003732a7a45b8136736b42ca54be98b3
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Oct 9 16:46:46 2020 -0700
+
+    Add gpos 5 tests to meson build file.
+
+ test/subset/meson.build | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit c39ab82c90479341dcf28eaa8174af6f08c0d7ae
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Tue Oct 6 16:51:40 2020 -0400
+
+    Fix usage text of gen-use-table.py
+
+ src/gen-use-table.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit aace09a3ad4249ee5b11c07a7ba343f763545d01
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Oct 6 10:26:17 2020 -0700
+
+    [subset] Use glyphset gsub for layout variation indices collection.
+
+ src/hb-subset-plan.cc | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit 1d9801e01290a62cfb802971061b2cc9f7c43bc1
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Oct 5 14:41:55 2020 -0700
+
+    [subset] In AnchorMatrix::subset eliminate the use of dynamically allocated vector.
+
+ src/hb-ot-layout-gpos-table.hh | 17 +++++------------
+ 1 file changed, 5 insertions(+), 12 deletions(-)
+
+commit 093909b2ffb1d938206b4a543652ae02c99491b2
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Oct 5 13:14:53 2020 -0700
+
+    [subset] Fix wrong offset base for subsetting LigatureArray.
+    Offsets from LigatureArray must be relative to the beginning of the LigatureArray table. For the serialization mechanism to use the correct beginning point the LigatureArray must be created using the push()/pop() mechanism. So convert LigatureArray subsetting to use serialize_subset() instead of a manually called serialize and subset.
+
+ src/hb-ot-layout-gpos-table.hh | 78 +++++++++++++++++++-----------------------
+ 1 file changed, 36 insertions(+), 42 deletions(-)
+
+commit 147e93b910010b581f1abf8f835aa2f7eecc483d
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Oct 1 16:44:16 2020 -0700
+
+    [subset] Fixes to get GPOS 5 subsetting code compiling.
+
+ src/hb-ot-layout-gpos-table.hh | 37 ++++++++++++++++++++++++++++---------
+ 1 file changed, 28 insertions(+), 9 deletions(-)
+
+commit 3a0b05faf18afc5f1cfc436c55d0776d26b80e53
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Thu Feb 6 15:08:26 2020 -0800
+
+    [subset] GPOS 5 MarkToLigature subsetting support
+
+ src/hb-ot-layout-gpos-table.hh                     | 109 +++++++++++++++++++--
+ test/subset/data/Makefile.am                       |   1 +
+ test/subset/data/Makefile.sources                  |   1 +
+ ...5_font1.keep-layout-retain-gids.41,42,43,44.otf | Bin 0 -> 2372 bytes
+ ...5_font1.keep-layout-retain-gids.41,42,43,45.otf | Bin 0 -> 2380 bytes
+ ...pos5_font1.keep-layout-retain-gids.41,42,43.otf | Bin 0 -> 2132 bytes
+ ...pos5_font1.keep-layout-retain-gids.41,42,44.otf | Bin 0 -> 2304 bytes
+ ...pos5_font1.keep-layout-retain-gids.41,42,45.otf | Bin 0 -> 2284 bytes
+ .../gpos5_font1.keep-layout-retain-gids.41,42.otf  | Bin 0 -> 2032 bytes
+ .../gpos5_font1.keep-layout-retain-gids.41,43.otf  | Bin 0 -> 2048 bytes
+ .../gpos5_font1.keep-layout-retain-gids.41.otf     | Bin 0 -> 1916 bytes
+ .../gpos5_font1.keep-layout-retain-gids.42.otf     | Bin 0 -> 1788 bytes
+ ...eep-layout-retain-gids.retain-all-codepoint.otf | Bin 0 -> 3840 bytes
+ .../gpos5_font1.keep-layout.41,42,43,44.otf        | Bin 0 -> 1668 bytes
+ .../gpos5_font1.keep-layout.41,42,43,45.otf        | Bin 0 -> 1660 bytes
+ .../gpos5_font1.keep-layout.41,42,43.otf           | Bin 0 -> 1432 bytes
+ .../gpos5_font1.keep-layout.41,42,44.otf           | Bin 0 -> 1588 bytes
+ .../gpos5_font1.keep-layout.41,42,45.otf           | Bin 0 -> 1560 bytes
+ .../layout.gpos5/gpos5_font1.keep-layout.41,42.otf | Bin 0 -> 1328 bytes
+ .../layout.gpos5/gpos5_font1.keep-layout.41,43.otf | Bin 0 -> 1332 bytes
+ .../layout.gpos5/gpos5_font1.keep-layout.41.otf    | Bin 0 -> 1216 bytes
+ .../layout.gpos5/gpos5_font1.keep-layout.42.otf    | Bin 0 -> 1076 bytes
+ ...pos5_font1.keep-layout.retain-all-codepoint.otf | Bin 0 -> 3840 bytes
+ test/subset/data/fonts/gpos5_font1.otf             | Bin 0 -> 4780 bytes
+ test/subset/data/tests/layout.gpos5.tests          |  18 ++++
+ 25 files changed, 121 insertions(+), 8 deletions(-)
+
+commit 718bf5aab397290ab5214c6a6bff3e248c4ab094
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Sep 29 13:16:01 2020 -0700
+
+    [subset] only keep features reachable from script in the final subset.
+    Matches fontTools behaviour.
+
+ src/hb-ot-layout-gsubgpos.hh | 31 +++++++++++++++++++++----------
+ src/hb-subset-plan.cc        | 21 +++++++++++++++++----
+ 2 files changed, 38 insertions(+), 14 deletions(-)
+
+commit e583505334a5b0990b545fde6ed7e9d874b8db4d
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Sep 29 11:05:08 2020 -0700
+
+    [subset] Use plan->glyphset_gsub instead of plan->glyphset for GSUB/GPOS
+    This matches fontTools behaviour. glyphset_gsub does not contain gids added from closing over composite glyphs in glyf, since these cannot particpate in GSUB/GPOS processing.
+
+ src/hb-ot-layout-common.hh     |  8 ++++----
+ src/hb-ot-layout-gpos-table.hh | 16 ++++++++--------
+ src/hb-ot-layout-gsub-table.hh | 12 ++++++------
+ src/hb-ot-layout-gsubgpos.hh   |  6 +++---
+ 4 files changed, 21 insertions(+), 21 deletions(-)
+
+commit a99e8721bfdb3f346d169e0d3ff0a52e13fbd1d7
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Mon Sep 28 21:12:46 2020 -0400
+
+    [use] Fix tests with MSVC
+
+ src/hb-ot-shape-complex-use-machine.hh | 17 +++++++++--------
+ src/hb-ot-shape-complex-use-machine.rl |  3 ++-
+ 2 files changed, 11 insertions(+), 9 deletions(-)
+
+commit 010accb3d5343b32c0ab8b98a0d48626df975cb8
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Sep 28 17:39:09 2020 -0700
+
+    [subset] Add additional test cases for the Amiri tests.
+
+ ...ayout-retain-gids.627,644,623,62D,644,627,645,2E.ttf | Bin 0 -> 48640 bytes
+ ...-Regular.keep-layout-retain-gids.627,644,62D,628.ttf | Bin 0 -> 42884 bytes
+ ...ep-layout-retain-gids.633,645,627,621,20,644,627.ttf | Bin 0 -> 46724 bytes
+ ...miri-Regular.keep-layout-retain-gids.63A,64A,631.ttf | Bin 0 -> 42896 bytes
+ ...gular.keep-layout.627,644,623,62D,644,627,645,2E.ttf | Bin 0 -> 13332 bytes
+ .../Amiri-Regular.keep-layout.627,644,62D,628.ttf       | Bin 0 -> 10232 bytes
+ ...i-Regular.keep-layout.633,645,627,621,20,644,627.ttf | Bin 0 -> 10372 bytes
+ .../Amiri-Regular.keep-layout.63A,64A,631.ttf           | Bin 0 -> 7824 bytes
+ test/subset/data/tests/layout.gpos8.amiri.tests         |   4 ++++
+ 9 files changed, 4 insertions(+)
+
+commit 940e1c6f9838b245839f742cca0e71cf37a9c87a
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Sep 28 17:22:01 2020 -0700
+
+    [subset] ChainContextFormat3 - don't subset glyph sequences.
+    The backtrack, input, and lookahead sequence must be matched in their entirety so these sequences should not be subset. If any of the coverage tables in a sequence subsets to empty then the whole subtable should be dropped since it's not possible for this lookup to be activated.
+
+ src/hb-ot-layout-gsubgpos.hh | 18 +++++++++---------
+ 1 file changed, 9 insertions(+), 9 deletions(-)
+
+commit e31c2690f80c312d13dd4691e6e51da1cab94813
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Sep 28 16:51:25 2020 -0700
+
+    [subset] remove unnecessary returns.
+
+ src/hb-ot-layout-gsubgpos.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 3271a7cdaadcab3756261db42177500436e1c37e
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Sep 28 16:46:15 2020 -0700
+
+    [subset] Remove redundant langys from Amiri test font.
+    FontTools removes these when subsetting but harfbuzz does not yet support redundant langsys removal. So this gets the Amiri tests passing for now.
+
+ ...iri-Regular.keep-layout-retain-gids.627,644.ttf | Bin 36892 -> 36940 bytes
+ .../Amiri-Regular.keep-layout.627,644.ttf          | Bin 4364 -> 4412 bytes
+ test/subset/data/fonts/Amiri-Regular.ttf           | Bin 562980 -> 562684 bytes
+ 3 files changed, 0 insertions(+), 0 deletions(-)
+
+commit ad241f991726b38cbda566fe00ac4eab55b14679
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Sep 28 15:26:13 2020 -0700
+
+    [subset] check that sub rules in ChainContextFormat 1 and 2 intersect the glyphs set before recursing during closure lookups.
+
+ src/hb-ot-layout-gsubgpos.hh | 42 +++++++++++++++++++++++++++++++++++-------
+ 1 file changed, 35 insertions(+), 7 deletions(-)
+
+commit 9fad540245bcfa0a5c07380ea075d8c264b3abcf
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Sep 28 13:24:25 2020 -0700
+
+    [subset] check that sub rules in ContextFormat 1 and 2 intersect the glyphs set before recursing during closure lookups.
+
+ src/hb-ot-layout-gsubgpos.hh | 40 +++++++++++++++++++++++++++++++---------
+ test/subset/meson.build      |  1 +
+ 2 files changed, 32 insertions(+), 9 deletions(-)
+
+commit 7e6070a47f2127c90ad233ab3794097357a3f4ed
+Author: Koji Ishii <kojii@chromium.org>
+Date:   Mon Aug 31 17:21:21 2020 +0900
+
+    Set *coord to nullptr
+
+ src/hb-ot-layout-base-table.hh | 18 +++++++++++++++---
+ 1 file changed, 15 insertions(+), 3 deletions(-)
+
+commit 4e0bddb7fea3ada6dc1ba05ed2fab9f2b813640d
+Author: Koji Ishii <kojii@chromium.org>
+Date:   Wed Aug 19 20:49:10 2020 +0900
+
+    get_baseline
+
+ src/hb-ot-layout-base-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 48fcb9094aeb04bb4ff581c04603fbb7acfd71df
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Sep 27 16:53:32 2020 -0600
+
+    [docs] Remove misleading wording re OpenType
+    
+    HarfBuzz has not *just* been implementing OpenType for a while.
+    At least since 2.0, where we added native AAT support in Oct 2018.
+
+ docs/harfbuzz-docs.xml | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 5539d158b75470dcf41bb86e2e8b9a7a986447c0
+Merge: 1a15bf1c5 cc7b3a1ab
+Author: Khaled Hosny <dr.khaled.hosny@gmail.com>
+Date:   Sat Sep 26 10:41:38 2020 +0200
+
+    Merge pull request #1679 from n8willis/docs-gtkdoc-extern
+    
+    [Docs] Add GTK-Doc comments for external APIs
+
+commit 1a15bf1c535236c4117dcf5eb9afa4e462fbe364
+Merge: 8c5d1332f fb0195ba8
+Author: Khaled Hosny <dr.khaled.hosny@gmail.com>
+Date:   Sat Sep 26 10:41:04 2020 +0200
+
+    Merge pull request #2695 from khaledhosny/docs-fix
+    
+    Minor build docs improvement
+
+commit cc7b3a1abd24aebabd812a151e0c206bf6f09635
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Sat Sep 26 10:22:39 2020 +0200
+
+    [Docs] Address review comments
+
+ src/hb-face.cc    | 11 ++++++-----
+ src/hb-face.h     |  2 --
+ src/hb-unicode.cc |  5 +++++
+ 3 files changed, 11 insertions(+), 7 deletions(-)
+
+commit 41b46a3cb2d18417d642c3101aacc38fc6a56dc9
+Author: n8willis <n8willis@users.noreply.github.com>
+Date:   Sun Apr 26 16:01:31 2020 +0100
+
+    Update hb-face.cc
+
+ src/hb-face.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 726e320ece912a75918f4a3208dff973b18c4b45
+Author: n8willis <n8willis@users.noreply.github.com>
+Date:   Sun Apr 26 15:56:57 2020 +0100
+
+    Update inline doc for hb_face_create: explain index
+
+ src/hb-face.cc | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 70331ca4850427b2c5b235ab46f6b5fb6f7036f6
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Mon Apr 22 19:25:42 2019 +0100
+
+    [Docs] Minor
+    
+    update GTK-Doc comments in hb-ot-layout.
+
+ src/hb-ot-layout.cc | 36 ++++++++++++++++++------------------
+ 1 file changed, 18 insertions(+), 18 deletions(-)
+
+commit eb10ef46aa1c62d6871f4780831e7ea326af10cf
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Mon Apr 22 19:22:24 2019 +0100
+
+    [Docs] Add GTK-Doc comments for hb-ot-font and hb-ot-shape.
+
+ src/hb-ot-font.cc  |  3 +++
+ src/hb-ot-shape.cc | 15 +++++++++++++++
+ 2 files changed, 18 insertions(+)
+
+commit 3e72febde020649cb7c213f71675804e09fb1926
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Mon Apr 22 19:21:27 2019 +0100
+
+    [Docs] Add GTK-Doc comments for hb-face.
+
+ src/hb-face.cc | 174 +++++++++++++++++++++++++++++++++------------------------
+ src/hb-face.h  |   8 +++
+ 2 files changed, 110 insertions(+), 72 deletions(-)
+
+commit 88cdea60e07187139419c0dc2cc76eb7a3c81a6e
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Mon Apr 22 19:17:40 2019 +0100
+
+    [Docs] Add GTK-Doc comments to hb-shape-plan.
+
+ src/hb-shape-plan.cc | 140 ++++++++++++++++++++++++++++++++++-----------------
+ src/hb-shape-plan.h  |  14 ++++++
+ 2 files changed, 109 insertions(+), 45 deletions(-)
+
+commit 5b43eb5a4caadd1494a7402ff0bea893102556d7
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Mon Apr 22 19:16:48 2019 +0100
+
+    [Docs] Add GTK-Dod comments to hb-unicode.
+
+ src/hb-unicode.cc | 118 ++++++++++++---------
+ src/hb-unicode.h  | 307 +++++++++++++++++++++++++++++++++++++++++++++++-------
+ 2 files changed, 339 insertions(+), 86 deletions(-)
+
+commit fb0195ba8314a3e15e436ad82b68a65b20711098
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Sat Sep 26 09:33:41 2020 +0200
+
+    [docs] Fix syntax and expand Windows section a tiny bit
+
+ docs/usermanual-install-harfbuzz.xml | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+commit db2381c92d2ffae66f155567b09576ecbfaca0af
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Sat Sep 26 09:30:25 2020 +0200
+
+    [docs] Fix indentation of commands
+    
+    DocBook outputs the extra spacing before the commands verbatim.
+
+ docs/usermanual-install-harfbuzz.xml | 52 +++++++++---------------------------
+ 1 file changed, 13 insertions(+), 39 deletions(-)
+
+commit a5c0ec7516e8f44ced7a5531c3565e74e34d8092
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Sep 25 14:57:20 2020 -0700
+
+    [subset] For [Chain]ContextFormat3 make sure the sub table intersects the retained glyphset before recursing to its lookups.
+    Otherwise the lookup closure will potentially pull in lookups which cannot be accessed via the retained glyph set.
+
+ src/hb-ot-layout-gsubgpos.hh | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit dc375559fd8aec33b28ea5775f2288250fd7ede7
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Sep 25 13:08:46 2020 -0700
+
+    [subset] shrink the serialize buffer when pruning empty offsets in ChainContextFormat2.
+    Currently the code reduces the array length, but does not trim back the space allocated in the serializer for those empty offsets.
+
+ src/hb-ot-layout-gsubgpos.hh | 16 +++++++++-------
+ 1 file changed, 9 insertions(+), 7 deletions(-)
+
+commit 90eb1a40eb4498b8bcfd73e67cbc69a0eaab1423
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Sep 25 12:36:32 2020 -0700
+
+    [subset] In ChainContextFormat3 don't skip subsetting if backtrack or lookahead are empty.
+    It's valid to have a ChainContextFormat3 with either an empty backtrack or lookahead. Only drop the lookup if the input sequence is empty.
+
+ src/hb-ot-layout-gsubgpos.hh | 11 +++++++----
+ 1 file changed, 7 insertions(+), 4 deletions(-)
+
+commit 2604201ae0f4f4e5b659d7af00684cb38d79c502
+Author: Fabrice Fontaine <fontaine.fabrice@gmail.com>
+Date:   Thu Sep 24 21:00:34 2020 +0200
+
+    src/meson.build: allow introspection when cross-compiling
+    
+    introspection can be enabled when cross-compiling on certains conditions
+    (for example it is supported by buildroot) so, as suggested by
+    Tim-Philipp Müller, disable it by default for cross builds unless the
+    option was explicitly enabled by the user
+    
+    Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
+
+ src/meson.build | 7 +------
+ 1 file changed, 1 insertion(+), 6 deletions(-)
+
+commit 7b77ce0507e18fb981a9b865f3eaac0c2ae06044
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Sep 24 16:35:59 2020 -0700
+
+    [subset] Add subsetting integration test using Amiri.
+    Demonstrates a failure in subsetting GPOS 8/GSUB 6.
+
+ test/subset/data/Makefile.sources                      |   1 +
+ .../Amiri-Regular.keep-layout-retain-gids.627,644.ttf  | Bin 0 -> 36892 bytes
+ .../Amiri-Regular.keep-layout.627,644.ttf              | Bin 0 -> 4364 bytes
+ test/subset/data/fonts/Amiri-Regular.ttf               | Bin 0 -> 562980 bytes
+ test/subset/data/tests/layout.gpos8.amiri.tests        |   9 +++++++++
+ 5 files changed, 10 insertions(+)
+
+commit 7a72b20aa2b604053696e731185a17286de73b08
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Sep 24 15:58:48 2020 -0700
+
+    [subset] Subset GDEF during layout subsetting tests.
+
+ ...1.keep-layout-retain-gids.retain-all-codepoint.otf | Bin 3756 -> 3812 bytes
+ ...e_subrules_f1.keep-layout.retain-all-codepoint.otf | Bin 3756 -> 3812 bytes
+ ...1.keep-layout-retain-gids.retain-all-codepoint.otf | Bin 3772 -> 3828 bytes
+ ...e_subrules_f1.keep-layout.retain-all-codepoint.otf | Bin 3772 -> 3828 bytes
+ ...1.keep-layout-retain-gids.retain-all-codepoint.otf | Bin 3736 -> 3792 bytes
+ ...xt3_simple_f1.keep-layout.retain-all-codepoint.otf | Bin 3736 -> 3792 bytes
+ ...3.keep-layout-retain-gids.retain-all-codepoint.otf | Bin 3692 -> 3728 bytes
+ .../gpos3_font3.keep-layout.retain-all-codepoint.otf  | Bin 3692 -> 3728 bytes
+ ...1.keep-layout-retain-gids.retain-all-codepoint.otf | Bin 3772 -> 3816 bytes
+ ...ple_anchors_1.keep-layout.retain-all-codepoint.otf | Bin 3772 -> 3816 bytes
+ ...1.keep-layout-retain-gids.retain-all-codepoint.otf | Bin 3748 -> 3792 bytes
+ .../gpos6_font1.keep-layout.retain-all-codepoint.otf  | Bin 3748 -> 3792 bytes
+ ...1.keep-layout-retain-gids.retain-all-codepoint.otf | Bin 3776 -> 3832 bytes
+ ...e_subrules_f1.keep-layout.retain-all-codepoint.otf | Bin 3776 -> 3832 bytes
+ ...1.keep-layout-retain-gids.retain-all-codepoint.otf | Bin 3808 -> 3864 bytes
+ ...e_subrules_f1.keep-layout.retain-all-codepoint.otf | Bin 3808 -> 3864 bytes
+ ...1.keep-layout-retain-gids.retain-all-codepoint.otf | Bin 3744 -> 3800 bytes
+ ...ng3_simple_f1.keep-layout.retain-all-codepoint.otf | Bin 3744 -> 3800 bytes
+ ...1.keep-layout-retain-gids.retain-all-codepoint.otf | Bin 3748 -> 3804 bytes
+ ...e_subrules_f1.keep-layout.retain-all-codepoint.otf | Bin 3748 -> 3804 bytes
+ ...1.keep-layout-retain-gids.retain-all-codepoint.otf | Bin 3780 -> 3836 bytes
+ ...e_subrules_f1.keep-layout.retain-all-codepoint.otf | Bin 3780 -> 3836 bytes
+ ...2.keep-layout-retain-gids.retain-all-codepoint.otf | Bin 3716 -> 3772 bytes
+ ...ng3_simple_f2.keep-layout.retain-all-codepoint.otf | Bin 3716 -> 3772 bytes
+ ...lar.smallcaps.keep-layout-retain-gids.41,42,43.ttf | Bin 6780 -> 6844 bytes
+ ...egular.smallcaps.keep-layout-retain-gids.41,43.ttf | Bin 6396 -> 6472 bytes
+ ...o-Regular.smallcaps.keep-layout-retain-gids.41.ttf | Bin 6032 -> 6096 bytes
+ ...o-Regular.smallcaps.keep-layout-retain-gids.43.ttf | Bin 6088 -> 6152 bytes
+ ...egular.smallcaps.keep-layout-retain-gids.CA,CB.ttf | Bin 7932 -> 7996 bytes
+ .../Roboto-Regular.smallcaps.keep-layout.41,42,43.ttf | Bin 2972 -> 3028 bytes
+ .../Roboto-Regular.smallcaps.keep-layout.41,43.ttf    | Bin 2572 -> 2628 bytes
+ .../Roboto-Regular.smallcaps.keep-layout.41.ttf       | Bin 2196 -> 2252 bytes
+ .../Roboto-Regular.smallcaps.keep-layout.43.ttf       | Bin 2268 -> 2324 bytes
+ .../Roboto-Regular.smallcaps.keep-layout.CA,CB.ttf    | Bin 2612 -> 2668 bytes
+ test/subset/data/profiles/keep-layout-retain-gids.txt |   2 +-
+ test/subset/data/profiles/keep-layout.txt             |   2 +-
+ 36 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 8c5d1332f152383563c2ef4b3377b9d54b151def
+Merge: 82fe13182 df00f45e2
+Author: Khaled Hosny <dr.khaled.hosny@gmail.com>
+Date:   Thu Sep 24 13:09:38 2020 +0200
+
+    Merge pull request #1664 from n8willis/docs-gtkdoc-otvar
+    
+    [Docs] Add gtk-doc comments for hb-ot-var
+
+commit df00f45e261df757caf42d9435ec06f015e4a54d
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Thu Sep 24 11:57:12 2020 +0200
+
+    Fix annotation in previous commits
+
+ src/hb-ot-var.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 5a695a79a0f1269b1ad3b4601f5dfb9794729982
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Sat May 11 13:54:40 2019 +0100
+
+    Swap # for () in gtk-doc function mention.
+
+ src/hb-ot-var.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 379be7b7c8d25f86f3d302ea4179e1bf93f025b9
+Author: n8willis <n8willis@users.noreply.github.com>
+Date:   Thu May 9 14:40:57 2019 +0100
+
+    Update src/hb-ot-var.cc
+    
+    Co-Authored-By: Khaled Hosny <khaledhosny@eglug.org>
+
+ src/hb-ot-var.cc | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 938add712a25d20fbc9752963885a32753e30937
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Thu Apr 11 19:45:12 2019 +0100
+
+    Add GTK-Doc comments for hb-ot-var.
+
+ src/hb-ot-var.cc | 115 ++++++++++++++++++++++++++++++++++++++++++++++++++++---
+ src/hb-ot-var.h  |  41 +++++++++++++++++++-
+ 2 files changed, 150 insertions(+), 6 deletions(-)
+
+commit 82fe13182d928e5d0e7f2c93528bddc0848e163b
+Merge: a1f4d285e 9a1be3fed
+Author: Khaled Hosny <dr.khaled.hosny@gmail.com>
+Date:   Tue Sep 22 17:40:38 2020 +0200
+
+    Merge pull request #1661 from n8willis/docs-gtkdoc-aat
+    
+    [Docs] Add gtk-doc comments for hb-aat-layout
+
+commit 9a1be3fed58e75d23dcda087de63f7e410680631
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Tue Sep 22 16:46:03 2020 +0200
+
+    Fix enum documentation syntax
+
+ src/hb-aat-layout.h | 643 +++++++++++++++++++++++-----------------------------
+ 1 file changed, 283 insertions(+), 360 deletions(-)
+
+commit 3c9244e662c8225ed11c72db0c095dfe04b0f925
+Author: n8willis <n8willis@users.noreply.github.com>
+Date:   Sat May 11 16:44:30 2019 +0100
+
+    Update src/hb-aat-layout.cc
+    
+    Co-Authored-By: Khaled Hosny <khaledhosny@eglug.org>
+
+ src/hb-aat-layout.cc | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit d619ba0681504a107e0bb8bde85d0564f9327edd
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Mon Apr 8 20:17:38 2019 +0100
+
+    Add gtk-doc documentation to AAT layout functions and enums.
+
+ src/hb-aat-layout.cc | 26 ++++++++++-----
+ src/hb-aat-layout.h  | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++--
+ 2 files changed, 106 insertions(+), 12 deletions(-)
+
+commit 514e6baaf061ee5c601f6b181f8dd9cd436843a9
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Thu Apr 4 10:18:29 2019 +0100
+
+    [gtk-doc] document AAT functions and enums.
+
+ src/hb-aat-layout.cc |  63 ++++++++---
+ src/hb-aat-layout.h  | 293 +++++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 341 insertions(+), 15 deletions(-)
+
+commit a1f4d285e1305fda5da771c3c5555c912b8e2d65
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 21 16:50:11 2020 -0600
+
+    [buffer] Fix invalid write access in hb_buffer_deserialize_glyphs()
+    
+    If buffer is immutable, we were trying to set content_type on it.
+    Ouch!
+
+ src/hb-buffer-serialize.cc | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit 18b8046c6aa2e311f0b47bfa66613c764d13283e
+Merge: 1f8b1e7f1 e43b9a29a
+Author: Caleb Maclennan <caleb@chiefworks.com>
+Date:   Mon Sep 21 17:32:34 2020 +0300
+
+    Merge pull request #2678 from alerque/post-artifacts
+
+commit 1f8b1e7f186f44db575e18d0958c9fb3ea14a594
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Mon Sep 21 11:39:38 2020 +0330
+
+    [ENOMEM] Return gracefully if stages isn't initialized correctly (#2639)
+    
+    This happens if calls to 'm.lookups[table_index].push ()' has been
+    silently failed due to lack of memory.
+    
+    This change just returns gracefully instead issuing the assert.
+    
+    Fixes https://crbug.com/oss-fuzz/24494
+
+ src/hb-ot-map.hh                                         |   4 ++--
+ ...z-testcase-minimized-hb-shape-fuzzer-5753845452636160 | Bin 0 -> 2109 bytes
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit a0ebea5280abddb9eb22dcc8fd97c521c38da597
+Merge: e40c0d82e f9f473a4c
+Author: Khaled Hosny <dr.khaled.hosny@gmail.com>
+Date:   Fri Sep 18 17:04:38 2020 +0200
+
+    Merge pull request #2665 from khaledhosny/doc-default-features
+    
+    [docs] Improve documentation for default features
+
+commit f9f473a4c40d95392fd314ff7e31f89d8b3b452d
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Wed Sep 2 16:40:52 2020 +0200
+
+    [docs] Improve documentation for default features
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2213
+
+ docs/usermanual-opentype-features.xml | 44 +++++++++++++++++++++++++++++------
+ 1 file changed, 37 insertions(+), 7 deletions(-)
+
+commit e40c0d82e2c01af4c180f7e4f8ccc4200e6a5362
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Sep 16 12:48:30 2020 -0600
+
+    [ENOMEM] Handle immutable buffer in shape_full()
+    
+    Move the content_type changing to shape_plan_execute() where it belongs.
+    Skip setting if content type is UNKNOWN, which happens with empty buffers
+    only, including the immutable buffer.
+    
+    Alternate fix to https://github.com/harfbuzz/harfbuzz/pull/2606
+    and https://github.com/harfbuzz/harfbuzz/pull/2625
+
+ src/hb-shape-plan.cc | 55 +++++++++++++++++++++++++++++++++-------------------
+ src/hb-shape.cc      |  4 ----
+ 2 files changed, 35 insertions(+), 24 deletions(-)
+
+commit bbbcad0dbbe980209be946612de352cadae98522
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Sep 16 11:19:40 2020 -0700
+
+    Revert "[ENOMEM] don't perform set process operations if the other set is in an error state."
+    
+    This reverts commit f3929abafe3b64f15d0dc2d21ad7b493eeb92dfe.
+
+ src/hb-set.hh                                            |   1 -
+ ...-testcase-minimized-hb-subset-fuzzer-5345734743031808 | Bin 1240 -> 0 bytes
+ 2 files changed, 1 deletion(-)
+
+commit f3929abafe3b64f15d0dc2d21ad7b493eeb92dfe
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Sep 15 13:06:36 2020 -0700
+
+    [ENOMEM] don't perform set process operations if the other set is in an error state.
+    Running a process while the other set is in an error state can potentially corrupt this sets map map (for example by overwritting all of the major values with 0).
+
+ src/hb-set.hh                                            |   1 +
+ ...-testcase-minimized-hb-subset-fuzzer-5345734743031808 | Bin 0 -> 1240 bytes
+ 2 files changed, 1 insertion(+)
+
+commit 584d3a43b269032322b00a19e240e3222425f2a9
+Merge: 8c3d4de79 7d64b0976
+Author: Simon Cozens <simon@simon-cozens.org>
+Date:   Wed Sep 16 15:08:50 2020 +0100
+
+    Merge pull request #2681 from khaledhosny/myanmar-liga
+    
+    [myanmar] Don’t disable liga feature
+
+commit 7d64b09765e326da810e98d3234ca72209cd5aae
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Sat Sep 12 21:17:18 2020 +0200
+
+    [myanmar] Don’t disable liga feature
+    
+    This seems to have been carried over from the Indic shaper, but
+    Uniscribe enables it by default.
+    
+    See https://github.com/harfbuzz/harfbuzz/issues/2213#issuecomment-686062915
+
+ src/hb-ot-shape-complex-myanmar.cc                       |   8 +-------
+ test/shaping/data/in-house/Makefile.sources              |   1 +
+ .../fonts/065b01e54f35f0d849fd43bd5b936212739a50cb.ttf   | Bin 0 -> 1808 bytes
+ test/shaping/data/in-house/meson.build                   |   1 +
+ test/shaping/data/in-house/tests/myanmar-misc.tests      |   1 +
+ 5 files changed, 4 insertions(+), 7 deletions(-)
+
+commit 8c3d4de796d8d691c63d5c20ac32051c652d72b8
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Sep 9 12:38:34 2020 -0700
+
+    [subset] Fix integer underflow in ContextFormat2.
+
+ src/hb-ot-layout-gsubgpos.hh                            |   2 +-
+ ...testcase-minimized-hb-subset-fuzzer-5689082504806400 | Bin 0 -> 84172 bytes
+ 2 files changed, 1 insertion(+), 1 deletion(-)
+
+commit e43b9a29a98d303240976bb0a7de27a0e3a56504
+Author: Caleb Maclennan <caleb@alerque.com>
+Date:   Fri Sep 11 22:15:10 2020 +0300
+
+    [ci] Trigger dependencies of publish jobs on tags
+
+ .circleci/config.yml | 14 ++++++++++----
+ 1 file changed, 10 insertions(+), 4 deletions(-)
+
+commit deb09e0d7556cbe88e8003c6ff0fa2192052c337
+Author: Caleb Maclennan <caleb@alerque.com>
+Date:   Fri Sep 11 19:52:46 2020 +0300
+
+    [ci] Tweak job names so config is valid Circle 2.1 schema
+
+ .circleci/config.yml | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+commit f4dea33f6d9acd6eea16f4a3130c9ec5d57928bf
+Author: Caleb Maclennan <caleb@alerque.com>
+Date:   Fri Sep 11 17:23:00 2020 +0300
+
+    [ci] Move repeated artifact upload job code to script
+
+ .ci/publish_release_artifact.sh | 20 ++++++++++++++++++++
+ .circleci/config.yml            | 22 +++++-----------------
+ 2 files changed, 25 insertions(+), 17 deletions(-)
+
+commit 65be538fffb01a03d98212e77f5240225580dfe0
+Author: Caleb Maclennan <caleb@alerque.com>
+Date:   Fri Sep 11 16:46:34 2020 +0300
+
+    [ci] Add job to publish autotools dist file to GitHub
+
+ .circleci/config.yml | 27 +++++++++++++++++++++++++++
+ 1 file changed, 27 insertions(+)
+
+commit 42bcc47d01d86eb44feae2df9d9fc6d4345270bb
+Author: Caleb Maclennan <caleb@alerque.com>
+Date:   Fri Sep 11 16:40:32 2020 +0300
+
+    [ci] Use executor with Circle's image for autotools job
+
+ .circleci/config.yml | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+commit c70f5090229ea4dbdea823d5f92cc17e3d2e73f3
+Author: Caleb Maclennan <caleb@alerque.com>
+Date:   Fri Sep 11 14:54:02 2020 +0300
+
+    [ci] Use `ghr` CLI tool to post Win32 artifact to GitHub
+
+ .circleci/config.yml | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+commit 610ed3b42c8a1b411f99654f45c68aba2215afbd
+Author: Caleb Maclennan <caleb@alerque.com>
+Date:   Fri Sep 11 10:47:08 2020 +0300
+
+    [ci] Add job to publish Win32 releases and pass it artifacts
+
+ .circleci/config.yml | 18 ++++++++++++++++++
+ 1 file changed, 18 insertions(+)
+
+commit a2d45cd5f7a16c8757f148f452561fdbe531ee4c
+Author: Caleb Maclennan <caleb@alerque.com>
+Date:   Fri Sep 11 14:14:20 2020 +0300
+
+    [ci] Use Circle's customized image for workspace support
+
+ .circleci/config.yml | 12 ++++++++----
+ 1 file changed, 8 insertions(+), 4 deletions(-)
+
+commit ac3f859a30731fcd2cf4be044d69a64cc43b5225
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Wed Sep 9 11:49:56 2020 -0400
+
+    Demote unregistered vendor-specific language tags
+
+ src/gen-tag-table.py   | 12 +-----------
+ src/hb-ot-tag-table.hh |  4 +---
+ 2 files changed, 2 insertions(+), 14 deletions(-)
+
+commit ee12c078ed775cda64f177055a1d1640675fb2d2
+Merge: 695d85ca3 5aff83104
+Author: Khaled Hosny <dr.khaled.hosny@gmail.com>
+Date:   Tue Sep 8 15:37:30 2020 +0200
+
+    Merge pull request #2668 from rossburton/meson
+    
+    meson: add hb-version.h to dependencies correctly
+
+commit 695d85ca327cf6aaafcde36870a21f70d46fa863
+Merge: 91fe20f0f e876886d1
+Author: Khaled Hosny <dr.khaled.hosny@gmail.com>
+Date:   Tue Sep 8 15:37:00 2020 +0200
+
+    Merge pull request #2674 from rossburton/reprod
+    
+    src/hb-gobject-enums.cc.tmpl: write out only the filename, not the full path
+
+commit 91fe20f0f5b868fc375291c525a32a6777554bd3
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Fri Sep 4 09:18:19 2020 -0400
+
+    Disambiguate OT tags when primary tag is not first
+
+ src/gen-tag-table.py   | 4 ++++
+ src/hb-ot-tag-table.hh | 8 +++++++-
+ test/api/test-ot-tag.c | 3 +++
+ 3 files changed, 14 insertions(+), 1 deletion(-)
+
+commit e876886d1e877ad90b6f02badefd6ebee1bc0b09
+Author: Alexander Kanavin <alex.kanavin@gmail.com>
+Date:   Tue Aug 18 10:31:47 2020 +0000
+
+    src/hb-gobject-enums.cc.tmpl: write out only the filename, not the full path
+    
+    This is beneficial for reproducible builds, as build paths can vary
+    between builds.
+
+ src/hb-gobject-enums.cc.tmpl | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 5aff83104e03d6d2617987d24a51e490ab7a5cd1
+Author: Ross Burton <ross.burton@arm.com>
+Date:   Mon Sep 7 10:55:33 2020 +0100
+
+    [build] generate hb-version.h once at configure time with Meson
+    
+    Currently with Meson hb-version.h is generated during the build without
+    any explicit dependencies which can result in build failures due races
+    over the file.
+    
+    Change this to be generated at configure time, so that the file is always
+    generated once before the build itself.
+    
+    Closes #2667
+
+ src/meson.build | 17 ++++++++---------
+ 1 file changed, 8 insertions(+), 9 deletions(-)
+
+commit bc1c93fbe04459a4b12c76c713ba1b750d2d9108
+Author: Ross Burton <ross.burton@arm.com>
+Date:   Mon Sep 7 17:11:17 2020 +0100
+
+    [build] No need to pass source directory to gen-hb-version
+    
+    The input file is by definition in the source directory, so dirname()
+    that instead of needing the directory to be passed.
+    
+    Needed because a follow-up commit will change when this is called, and the
+    source directory isn't trivially available at that point.
+
+ src/gen-hb-version.py | 6 +++---
+ src/meson.build       | 2 +-
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit faf09f5466370a45e1a9d7c07968af517d680d78
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Fri Aug 14 18:30:20 2020 -0400
+
+    [USE] Support hieroglyph clusters
+
+ src/gen-use-table.py                   |  24 ++
+ src/hb-ot-shape-complex-use-machine.hh | 465 +++++++++++++++++----------------
+ src/hb-ot-shape-complex-use-machine.rl |   6 +
+ src/hb-ot-shape-complex-use-table.cc   | 104 +++++++-
+ src/hb-ot-shape-complex-use.cc         |   2 +
+ src/hb-ot-shape-complex-use.hh         |   4 +
+ 6 files changed, 366 insertions(+), 239 deletions(-)
+
+commit 06f49fc8ae40f083758e1ca8e9bd9879549d8c39
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Thu Aug 13 13:37:45 2020 -0400
+
+    [USE] Update to the 2020-08-13 USE specification
+    
+    This also uses the data files from
+    <https://github.com/microsoft/font-tools/tree/78b2134fdca84df41a931d30d5c48fec115eca41/USE>.
+
+ src/gen-use-table.py                              | 210 +++++++-----
+ src/hb-ot-shape-complex-use-machine.hh            | 330 +++++++++---------
+ src/hb-ot-shape-complex-use-machine.rl            |   3 +-
+ src/hb-ot-shape-complex-use-table.cc              | 398 ++++++++++++++++++----
+ src/hb-ot-shape-complex-vowel-constraints.cc      |   2 +-
+ src/hb-ot-shape-complex.hh                        |   7 +
+ src/ms-use/IndicPositionalCategory-Additional.txt | 102 ++++++
+ src/ms-use/IndicShapingInvalidCluster.txt         |   4 +-
+ src/ms-use/IndicSyllabicCategory-Additional.txt   | 207 +++++++++++
+ src/update-unicode-tables.make                    |   2 +-
+ 10 files changed, 946 insertions(+), 319 deletions(-)
+
+commit e3db84a9d05f40c5281d889a726eb2e4baa12328
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Fri May 3 23:29:58 2019 -0400
+
+    [use] Test CGJ and ZWNJ
+
+ test/shaping/data/in-house/tests/use-syllable.tests | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 6a38adeb577444cd164eeb6ace70741fe1a33791
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Fri May 3 14:16:50 2019 -0400
+
+    [use] Skip most default ignorables when clustering
+
+ src/Makefile.sources                     |   1 +
+ src/gen-use-table.py                     |  12 +-
+ src/hb-ot-shape-complex-machine-index.hh |  69 ++++
+ src/hb-ot-shape-complex-use-machine.hh   | 592 +++++++++++++++----------------
+ src/hb-ot-shape-complex-use-machine.rl   |  55 ++-
+ src/hb-ot-shape-complex-use-table.cc     |  76 ++--
+ src/hb-ot-shape-complex-use.hh           |   2 -
+ 7 files changed, 422 insertions(+), 385 deletions(-)
+
+commit 645f4e7cdd874bd454fceec76b33e57c0a205775
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Fri May 3 18:28:18 2019 -0400
+
+    Unhide CGJ before ccc=0 characters
+    
+    If a CGJ precedes a starter, then it cannot have blocked any reordering,
+    so it can safely be skipped.
+
+ src/hb-ot-shape-normalize.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9825e3dd2eaea4e267054adebc8d972e1f01cc0d
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Aug 26 17:31:50 2020 -0700
+
+    [ENOMEM] fix access to unitialized memory.
+    If the serialize() call fails to write the object then we can't safely read varstore_prime fields. Fixes https://oss-fuzz.com/testcase-detail/5137462782066688.
+
+ src/hb-ot-layout-common.hh                              |   5 ++++-
+ ...testcase-minimized-hb-subset-fuzzer-5137462782066688 | Bin 0 -> 76354 bytes
+ 2 files changed, 4 insertions(+), 1 deletion(-)
+
+commit 45de128930a902004baa875831e38ef62780ae2e
+Merge: 9c98b2b9a fe6381d9f
+Author: Khaled Hosny <dr.khaled.hosny@gmail.com>
+Date:   Tue Sep 1 04:58:50 2020 +0300
+
+    Merge pull request #2661 from khaledhosny/failing-dw-build
+    
+    [ci] Fix failing DirectWrite build
+
+commit fe6381d9f1a34f33f020d4f7c871304376dc2844
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Tue Sep 1 03:44:01 2020 +0200
+
+    [build] Minor
+
+ src/meson.build | 12 ++++--------
+ 1 file changed, 4 insertions(+), 8 deletions(-)
+
+commit a4f3a752ddd89b1155978fe862d6f45bd5a89d53
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Tue Sep 1 03:21:12 2020 +0200
+
+    [build] hb-directwrite needs a C++ linker
+
+ src/meson.build | 10 +++++++++-
+ 1 file changed, 9 insertions(+), 1 deletion(-)
+
+commit 9c98b2b9a9e43669c5e2b37eaa41b1e07de1ede3
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Sat Aug 29 00:39:42 2020 +0200
+
+    2.7.2
+
+ NEWS             | 9 ++++++++-
+ configure.ac     | 2 +-
+ meson.build      | 2 +-
+ src/hb-version.h | 4 ++--
+ 4 files changed, 12 insertions(+), 5 deletions(-)
+
+commit c0a76cb5192f6c334c6713444ac5a02d59faaf74
+Merge: fcddf3b9b a495a5423
+Author: Khaled Hosny <dr.khaled.hosny@gmail.com>
+Date:   Sat Aug 29 00:14:01 2020 +0300
+
+    Merge pull request #2660 from harfbuzz/arabic-shaping-in-use
+    
+    [USE] Fix assertion failure for joining scripts
+
+commit a495a54236d69def7e8b1293f2887f18a6b2fecc
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Fri Aug 28 14:33:25 2020 -0400
+
+    Ignore T & U when determining the joining scripts
+
+ src/gen-arabic-joining-list.py                 | 2 ++
+ src/hb-ot-shape-complex-arabic-joining-list.hh | 1 -
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+commit 420a74f7725bec2d3d4688fda226163b06f9a564
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Fri Aug 28 14:11:48 2020 -0400
+
+    [USE] Fix assertion failure for joining scripts
+
+ src/hb-ot-shape-complex-use.cc             | 2 +-
+ test/shaping/data/in-house/tests/use.tests | 1 +
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+commit fcddf3b9b43e391a9ec33c823ef22827d18a1fb9
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Fri Aug 14 10:19:33 2020 +0430
+
+    [docs] Minor in TESTING.md
+    
+    Start the fuzzer with test/fuzzing/fonts seeds
+
+ TESTING.md | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 99b8a84cc50346b6788a67eadfe0ebe17545724a
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Fri Aug 14 10:14:14 2020 +0430
+
+    [docs] Reorder TESTING.md sections
+    
+    And use --reconfigure where makes sense
+
+ TESTING.md | 42 ++++++++++++++++++++----------------------
+ 1 file changed, 20 insertions(+), 22 deletions(-)
+
+commit 1e48225ca312a955cc7f4a4b7683492e83d77117
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Thu Aug 13 23:22:14 2020 +0430
+
+    [ENOMEM] Check whether serialize context isn't in error
+
+ src/hb-ot-shape-complex-arabic-fallback.hh                 |   4 ++--
+ ...uzz-testcase-minimized-hb-shape-fuzzer-5138182937772032 | Bin 0 -> 68 bytes
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 05ef75c55340400d4b318bd24d742653bbf825d9
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Aug 13 20:52:03 2020 +0430
+
+    2.7.1
+
+ NEWS             | 8 ++++++++
+ configure.ac     | 2 +-
+ meson.build      | 2 +-
+ src/hb-version.h | 4 ++--
+ 4 files changed, 12 insertions(+), 4 deletions(-)
+
+commit 0a02f1e760db5c0568dc6e15c00fa394aa43ccbb
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Aug 13 15:33:39 2020 +0430
+
+    [meson] Abort if GDI/Uniscribe headers couldn't be found
+
+ meson.build | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit 253a8f7a510ddfb8e2eb90de95db9763f2f42282
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Aug 13 09:23:29 2020 +0430
+
+    [meson] Another approach to skip tests incompatible with MSVC
+
+ src/meson.build | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit 24b42002434d3e8dc8d164f02dda7a9c3e5386b5
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Aug 13 09:06:39 2020 +0430
+
+    [meson] Avoid using has_headers as that has added in 0.50.0
+
+ meson.build | 55 +++++++++++++++++++++++++++++--------------------------
+ 1 file changed, 29 insertions(+), 26 deletions(-)
+
+commit 411b426c692f611dbcdec7a6516781aa4375d07e
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Aug 13 01:23:46 2020 +0430
+
+    [meson] minor
+
+ src/meson.build | 14 ++++----------
+ 1 file changed, 4 insertions(+), 10 deletions(-)
+
+commit 6e32145dc91e866132a3a3911870441e98737b16
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Aug 13 00:13:06 2020 +0430
+
+    [meson] Make compatbile with 0.47.0
+
+ .circleci/config.yml     |  2 +-
+ docs/meson.build         |  4 ++--
+ meson.build              | 18 +++++++++++-------
+ perf/meson.build         |  2 +-
+ src/meson.build          | 21 ++++++++++-----------
+ test/fuzzing/meson.build |  6 +++---
+ test/shaping/meson.build | 12 ++++++------
+ test/subset/meson.build  |  4 ++--
+ 8 files changed, 36 insertions(+), 33 deletions(-)
+
+commit 58209c86a0d2d536ce3d35953ffe340762ad1f48
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Aug 12 23:04:26 2020 +0430
+
+    [meson] Make compatbile with 0.49.0
+    
+    Contains a just put together summary feature polyfill and workaround
+    to broken ternary operator.
+
+ .circleci/config.yml |   3 +-
+ meson.build          | 102 +++++++++++++++++++++++++++++++++------------------
+ perf/meson.build     |   8 +++-
+ src/meson.build      |  28 +++++++++++---
+ 4 files changed, 98 insertions(+), 43 deletions(-)
+
+commit 1e4fe10b98a291787ae561beca80cb70b481b108
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Aug 12 13:06:37 2020 -0700
+
+    [ENOMEM] check for error in visited map during closure features.
+
+ src/hb-ot-layout-gsubgpos.hh | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 9562239f0531c0e49e6ab7e157da578d454432c8
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Aug 12 13:01:22 2020 -0700
+
+    [ENOMEM] check for error in lookup visited set.
+
+ src/hb-ot-layout-gsubgpos.hh                           |   3 +++
+ ...estcase-minimized-hb-subset-fuzzer-5741735372914688 | Bin 0 -> 560294 bytes
+ 2 files changed, 3 insertions(+)
+
+commit eea9b59fc5c7ad5649ba598765f335383795778f
+Author: Tom Schoonjans <Tom.Schoonjans@rfi.ac.uk>
+Date:   Wed Aug 12 06:40:23 2020 +0200
+
+    [meson] fix generating introspection
+    
+    Only libharfbuzz_gobject is introspectable, not libharfbuzz. Therefore,
+    it makes no sense to target the latter for introspection: it should
+    instead be listed as a dependency.
+
+ src/meson.build | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 7bffb5d7baf4dc8b96fab1f8dbc83740a6817b1a
+Author: David Corbett <corbett.dav@northeastern.edu>
+Date:   Tue Aug 11 19:24:46 2020 -0400
+
+    Generate `has_arabic_joining`
+
+ src/Makefile.am                                |   1 +
+ src/Makefile.sources                           |   1 +
+ src/gen-arabic-joining-list.py                 | 104 +++++++++++++++++++++++++
+ src/hb-ot-shape-complex-arabic-joining-list.hh |  47 +++++++++++
+ src/hb-ot-shape-complex-use.cc                 |  35 +--------
+ src/meson.build                                |   1 +
+ src/update-unicode-tables.make                 |   3 +
+ 7 files changed, 158 insertions(+), 34 deletions(-)
+
+commit 6f754852c19ff26d693a1d78de55bab263281a72
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Aug 11 15:40:47 2020 -0700
+
+    [ENOMEM] skip asserts in to_bias if serializer is in an error state.
+
+ src/hb-serialize.hh                                     |   1 +
+ ...testcase-minimized-hb-subset-fuzzer-5927551890096128 | Bin 0 -> 73364 bytes
+ 2 files changed, 1 insertion(+)
+
+commit 057769b1a316c604cf84c343a4a85a10f46c057c
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Aug 12 02:30:33 2020 +0430
+
+    [fuzzer] minor
+
+ test/fuzzing/hb-draw-fuzzer.cc   |  2 +-
+ test/fuzzing/hb-fuzzer.hh        |  2 +-
+ test/fuzzing/hb-shape-fuzzer.cc  |  2 +-
+ test/fuzzing/hb-subset-fuzzer.cc | 18 ++++++++----------
+ 4 files changed, 11 insertions(+), 13 deletions(-)
+
+commit 04179380116d6e1efcf95a70f0d79b8e095b69c6
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Aug 12 02:19:06 2020 +0430
+
+    [fuzzer] Mark alloc_state as unused
+    
+    It is really unused when failing-alloc isn't on.
+
+ test/fuzzing/hb-fuzzer.hh | 8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+commit 2af58c351812603498f0b67e66f84f4a33a74455
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Aug 12 00:51:07 2020 +0430
+
+    Revert "Remove cmake build files"
+    
+    This reverts commit 4e572c940724cdae6f140df924c9ad7f4baea35e.
+
+ .circleci/config.yml       |   3 +-
+ CMakeLists.txt             | 768 +++++++++++++++++++++++++++++++++++++++++++++
+ Makefile.am                |   2 +
+ replace-enum-strings.cmake |  21 ++
+ 4 files changed, 793 insertions(+), 1 deletion(-)
+
+commit ef2e3803429efe0f5a1fcb2679ae332139297917
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Aug 12 00:50:33 2020 +0430
+
+    Revert "Remove cmake-config support of HarfBuzz"
+    
+    This reverts commit 75efa893433b6f352c28bda9d0a92683244900aa.
+
+ configure.ac                 |  1 +
+ meson.build                  |  1 +
+ src/Makefile.am              |  4 ++-
+ src/harfbuzz-config.cmake.in | 86 ++++++++++++++++++++++++++++++++++++++++++++
+ src/meson.build              | 10 ++++++
+ 5 files changed, 101 insertions(+), 1 deletion(-)
+
+commit 0ca35570481ee16c44577913263032726a0c0a51
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Aug 9 16:10:06 2020 +0430
+
+    Turn -Wunused-but-set-variable to warning
+    
+    As #2555 turned out some glib headers are imposing that so let's turn it to warning
+
+ src/hb.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 519335783224e2cbfd8a4a5b9071216fe2b139b5
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Aug 11 23:51:59 2020 +0430
+
+    Revert "Remove autotools build support"
+    
+    This reverts commit 01ac32aab2109681abc58bb2f96a4ef4a7f0c6df.
+
+ .circleci/config.yml                               |  15 +
+ Makefile.am                                        |  96 ++
+ README                                             |  15 +
+ RELEASING.md                                       |   2 +-
+ autogen.sh                                         |  48 +
+ configure.ac                                       | 540 +++++++++++
+ docs/Makefile.am                                   | 126 +++
+ git.mk                                             | 400 +++++++++
+ m4/ax_check_link_flag.m4                           |  74 ++
+ m4/ax_code_coverage.m4                             | 264 ++++++
+ m4/ax_cxx_compile_stdcxx.m4                        | 982 +++++++++++++++++++++
+ m4/ax_pthread.m4                                   | 485 ++++++++++
+ src/Makefile.am                                    | 476 ++++++++++
+ src/Makefile.sources                               | 284 ++++++
+ test/Makefile.am                                   |  15 +
+ test/api/Makefile.am                               | 222 +++++
+ test/fuzzing/Makefile.am                           |  86 ++
+ test/shaping/Makefile.am                           |  39 +
+ test/shaping/data/Makefile.am                      |  14 +
+ test/shaping/data/aots/Makefile.am                 |  27 +
+ test/shaping/data/aots/Makefile.sources            | 126 +++
+ test/shaping/data/in-house/Makefile.am             |  26 +
+ test/shaping/data/in-house/Makefile.sources        |  66 ++
+ test/shaping/data/text-rendering-tests/Makefile.am |  32 +
+ .../data/text-rendering-tests/Makefile.sources     |  95 ++
+ test/subset/Makefile.am                            |  23 +
+ test/subset/data/Makefile.am                       |  45 +
+ test/subset/data/Makefile.sources                  |  31 +
+ util/Makefile.am                                   |  78 ++
+ util/Makefile.sources                              |  38 +
+ 30 files changed, 4769 insertions(+), 1 deletion(-)
+
+commit 9748ae7299330f0245e97f7b1f18cd1207043e62
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Aug 11 17:52:48 2020 +0430
+
+    Revert "Reordering fails when GDEF table is absent #2140"
+    
+    This reverts commit f4cd99f28eefe695b86876736166fd119e22e04e.
+    
+    As requested in https://github.com/harfbuzz/harfbuzz/issues/2516#issuecomment-670969185
+
+ src/hb-ot-layout-gsubgpos.hh | 37 +++++++++++++++++--------------------
+ src/hb-ot-layout.hh          |  8 ++++----
+ 2 files changed, 21 insertions(+), 24 deletions(-)
+
+commit d03eecb4d63e1cdac77a08d081179c28440b2d18
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Tue Aug 11 16:40:40 2020 +0430
+
+    [glyf] minor
+    
+    style improvement
+
+ src/hb-ot-glyf-table.hh | 21 ++++++++++++---------
+ 1 file changed, 12 insertions(+), 9 deletions(-)
+
+commit 732a9164d9c778a3d4315b189922d5b9c4a51495
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Tue Aug 11 16:37:55 2020 +0430
+
+    [gvar] minor
+
+ src/hb-ot-var-gvar-table.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit c0107c1e6ecf627d7dba344529fb5f054344f498
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Mon Aug 10 14:30:34 2020 +0430
+
+    [ci] test experimental APIs in Arch Linux and sanitizers
+
+ .circleci/config.yml | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 0c1561894ac4899cd09ebef4b3d33a095e35c981
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Mon Aug 10 08:52:01 2020 +0430
+
+    [glyf] minor
+
+ src/hb-ot-glyf-table.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit f06d7331e8b1643680df7f0126b2d89254563dcb
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Aug 10 08:35:06 2020 +0430
+
+    [glyf] minor
+
+ src/hb-ot-glyf-table.hh | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit db96c7f67aac93ea025cf992c20acdf2364d93bc
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Aug 10 08:23:21 2020 +0430
+
+    [glyf] protect CompositeGlyph fields
+    
+    Introduce methods instead
+
+ src/hb-ot-glyf-table.hh | 30 ++++++++++++++++++++----------
+ 1 file changed, 20 insertions(+), 10 deletions(-)
+
+commit e5fe363aa5d06a4dfe665b97a22971f12c3f84f4
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Mon Aug 10 07:39:36 2020 +0430
+
+    [glyf] Minor, don't pass accelerator_t to points_aggregator_t
+    
+    No need to pass it to aggregator itself
+
+ src/hb-ot-glyf-table.hh | 10 ++++------
+ 1 file changed, 4 insertions(+), 6 deletions(-)
+
+commit 2b9927f7e16c7b25194b8aae36146bf23c73f131
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Mon Aug 10 06:26:21 2020 +0430
+
+    [glyf] minor
+    
+    No need to pass glyph_for_gid as a lambda now that we are passing the accelerator itself
+
+ src/hb-ot-glyf-table.hh | 8 +++-----
+ 1 file changed, 3 insertions(+), 5 deletions(-)
+
+commit fce64a407d381372c92fcb5f0e551c17185ea735
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 8 14:04:54 2020 -0600
+
+    Minor
+
+ src/hb-ot-layout-gpos-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ffe06c8f0498d7f5fe53c76e9d6fba9127997258
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Aug 8 13:17:34 2020 +0430
+
+    [glyf] Guard all the public APIs against null pool runs
+    
+    Fixes https://crbug.com/oss-fuzz/24575 and https://crbug.com/oss-fuzz/24737
+
+ src/hb-ot-glyf-table.hh                                |  17 ++++++++++++-----
+ ...-testcase-minimized-hb-draw-fuzzer-5103082208493568 | Bin 0 -> 1069 bytes
+ ...-testcase-minimized-hb-draw-fuzzer-5641612227772416 | Bin 0 -> 1069 bytes
+ 3 files changed, 12 insertions(+), 5 deletions(-)
+
+commit 01ac32aab2109681abc58bb2f96a4ef4a7f0c6df
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Aug 2 11:35:55 2020 +0430
+
+    Remove autotools build support
+
+ .circleci/config.yml                               |  15 -
+ Makefile.am                                        |  96 --
+ README                                             |  15 -
+ RELEASING.md                                       |   2 +-
+ autogen.sh                                         |  48 -
+ configure.ac                                       | 540 -----------
+ docs/Makefile.am                                   | 126 ---
+ git.mk                                             | 400 ---------
+ m4/ax_check_link_flag.m4                           |  74 --
+ m4/ax_code_coverage.m4                             | 264 ------
+ m4/ax_cxx_compile_stdcxx.m4                        | 982 ---------------------
+ m4/ax_pthread.m4                                   | 485 ----------
+ src/Makefile.am                                    | 476 ----------
+ src/Makefile.sources                               | 284 ------
+ test/Makefile.am                                   |  15 -
+ test/api/Makefile.am                               | 222 -----
+ test/fuzzing/Makefile.am                           |  86 --
+ test/shaping/Makefile.am                           |  39 -
+ test/shaping/data/Makefile.am                      |  14 -
+ test/shaping/data/aots/Makefile.am                 |  27 -
+ test/shaping/data/aots/Makefile.sources            | 126 ---
+ test/shaping/data/in-house/Makefile.am             |  26 -
+ test/shaping/data/in-house/Makefile.sources        |  66 --
+ test/shaping/data/text-rendering-tests/Makefile.am |  32 -
+ .../data/text-rendering-tests/Makefile.sources     |  95 --
+ test/subset/Makefile.am                            |  23 -
+ test/subset/data/Makefile.am                       |  45 -
+ test/subset/data/Makefile.sources                  |  31 -
+ util/Makefile.am                                   |  78 --
+ util/Makefile.sources                              |  38 -
+ 30 files changed, 1 insertion(+), 4769 deletions(-)
+
+commit 3d164d5883ceb5698a98ca025b5f75ce465e1f51
+Author: Ryan Schmidt <git@ryandesign.com>
+Date:   Thu Aug 6 20:45:44 2020 -0500
+
+    Use printf instead of echo -n in autogen.sh
+    
+    "echo -n" is not portable and on some POSIX systems it literally prints "-n".
+
+ autogen.sh | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit 1f519c25670e8dfe694a7b3fa71c5bc7263b1b1f
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Aug 7 01:21:19 2020 +0430
+
+    [glyf] Optimize retrieval of hmtx/vmtx/gvar
+    
+    This should make glyf/gvar faster as makes it to invoke less table wrapper atomic operations and things.
+    
+    $ meson build -Dexperimental_api=true --buildtype=release && ninja -Cbuild && build/perf/perf "--benchmark_filter=glyf.*- ot -"
+    
+    Before:
+    extents/glyf - ot - SourceSerifVariable         46091 ns      46036 ns      16173
+    extents/glyf/vf - ot - SourceSerifVariable    4160142 ns    4154913 ns        174
+    extents/glyf - ot - Comfortaa                   25754 ns      25726 ns      27030
+    extents/glyf/vf - ot - Comfortaa              2627804 ns    2624596 ns        265
+    extents/glyf - ot - Roboto                      33556 ns      33540 ns      18513
+    draw/glyf - ot - SourceSerifVariable          2716848 ns    2715438 ns        256
+    draw/glyf/vf - ot - SourceSerifVariable       4602379 ns    4598907 ns        151
+    draw/glyf - ot - Comfortaa                    1659364 ns    1658142 ns        417
+    draw/glyf/vf - ot - Comfortaa                 2845100 ns    2842549 ns        246
+    draw/glyf - ot - Roboto                       1571509 ns    1570060 ns        442
+    
+    After:
+    extents/glyf - ot - SourceSerifVariable         34738 ns      34713 ns      21332
+    extents/glyf/vf - ot - SourceSerifVariable    3700510 ns    3698104 ns        187
+    extents/glyf - ot - Comfortaa                   21604 ns      21595 ns      31907
+    extents/glyf/vf - ot - Comfortaa              2324787 ns    2323440 ns        296
+    extents/glyf - ot - Roboto                      31259 ns      31246 ns      21814
+    draw/glyf - ot - SourceSerifVariable          2689230 ns    2687589 ns        260
+    draw/glyf/vf - ot - SourceSerifVariable       4625135 ns    4622036 ns        131
+    draw/glyf - ot - Comfortaa                    1690336 ns    1689454 ns        402
+    draw/glyf/vf - ot - Comfortaa                 2898748 ns    2897074 ns        241
+    draw/glyf - ot - Roboto                       1570911 ns    1570138 ns        440
+
+ src/hb-ot-glyf-table.hh | 70 ++++++++++++++++++++++++++++++-------------------
+ 1 file changed, 43 insertions(+), 27 deletions(-)
+
+commit 0907c10214c9b989c76a34b260042e88c707f9bd
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Aug 7 00:15:32 2020 +0430
+
+    [gvar] minor
+
+ src/hb-ot-var-gvar-table.hh | 11 +++--------
+ 1 file changed, 3 insertions(+), 8 deletions(-)
+
+commit 679fac87dfbdef3192184b2d2374fda334205b41
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jul 30 15:29:43 2020 +0430
+
+    Skip hb_shape if buffer object is immutable
+
+ src/hb-shape.cc                 | 2 ++
+ test/fuzzing/hb-shape-fuzzer.cc | 6 ++----
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 55c41f219f539464335c16dc8392787fd0ac1b46
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Aug 6 23:37:43 2020 +0430
+
+    [glyf] Clamp advance value result
+    
+    Fixes a sanitizer complain https://circleci.com/gh/harfbuzz/harfbuzz/150247 revealed by 02d1ec1
+
+ src/hb-ot-glyf-table.hh | 9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
+
+commit 02d1ec16585738d5e55354224bcfcc552b079a76
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Aug 6 22:18:35 2020 +0430
+
+    [gvar] Don't fail on imprefect gvar
+    
+    No need to fail even if gvar doesn't have that much glyphs
+
+ src/hb-ot-var-gvar-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ec17b6245755a7527c7f5d5242868ce0886327c9
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Aug 6 20:16:11 2020 +0430
+
+    [var] Apply variations on empty glyphs
+    
+    It was ignoring empty glyphs for no good reason, this fixes it.
+    
+    Fixes #2618
+
+ src/hb-ot-glyf-table.hh                                  |   6 ++++--
+ src/hb-ot-var-gvar-table.hh                              |   2 ++
+ test/shaping/data/in-house/Makefile.sources              |   1 +
+ .../fonts/ab40c89624a6104e5d0a2308e448a989302f515b.ttf   | Bin 0 -> 7440 bytes
+ test/shaping/data/in-house/meson.build                   |   1 +
+ test/shaping/data/in-house/tests/variations-space.tests  |   2 ++
+ 6 files changed, 10 insertions(+), 2 deletions(-)
+
+commit 5cab55ca90a64da281ef2c55e892bb0d6ebb3019
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Aug 6 18:54:58 2020 +0430
+
+    [gvar] minor
+
+ src/hb-ot-var-gvar-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 20e42a212849554687b808b316f077a023126a95
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Aug 4 16:49:27 2020 +0430
+
+    [docs] minor on TESTING.md
+
+ TESTING.md | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 5a2d216f309fa91faf76a1ebebbcf8a36e21f592
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Aug 4 15:25:48 2020 +0430
+
+    [docs] meson related updates on install
+
+ docs/usermanual-install-harfbuzz.xml | 83 +++++++++++++-----------------------
+ 1 file changed, 29 insertions(+), 54 deletions(-)
+
+commit 34a05320921629f430ed36c30e24494c9841079c
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Aug 4 15:14:59 2020 +0430
+
+    [meson] minor note
+
+ meson.build | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit cac483bf1563381a6081b06592a96f7055427e10
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Aug 3 18:41:49 2020 +0430
+
+    [docs] Update README.python.md with meson
+
+ README.python.md | 9 ++-------
+ 1 file changed, 2 insertions(+), 7 deletions(-)
+
+commit 75efa893433b6f352c28bda9d0a92683244900aa
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jul 30 01:17:42 2020 +0430
+
+    Remove cmake-config support of HarfBuzz
+    
+    Reverts d38f37b2 as discussed in #2316
+
+ configure.ac                 |  1 -
+ meson.build                  |  1 -
+ src/Makefile.am              |  4 +--
+ src/harfbuzz-config.cmake.in | 86 --------------------------------------------
+ src/meson.build              | 10 ------
+ 5 files changed, 1 insertion(+), 101 deletions(-)
+
+commit 97079a7c8f7d52ff381b2b3d6e0c430358d1b340
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Aug 2 12:34:21 2020 +0430
+
+    [meson] Pass cpp_eh=none and cpp_rtti=false as default options
+    
+    If we want to support a build with exception handling and RTTI
+    We should reflect that on library(..., link_language: 'c') also so for
+    now it is ok to just set it here to get MSVC support also and we
+    can remove hard coded flags later upon request.
+    
+    One other concern over just relying on it is on when harfbuzz is used
+    as a subproject and the parent project hasn't provided the same options,
+    that should be resolved first I think.
+    
+    Closes #2584
+
+ meson.build | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 749e2754c83583e51034da09d3581af0f8d9e1a3
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Aug 2 12:21:51 2020 +0430
+
+    [meson] remove useless note about -fvisibility-inlines-hidden
+    
+    It was put there as current situation of autotools but msys2 is ok
+    with the flag, if something like is needed for other it can handled
+    as a local patch.
+
+ meson.build | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 903d6a1f1418a20094af53200a9da45214c1b6af
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Aug 2 11:40:47 2020 +0430
+
+    [perf] Enable ttf-parser build just with experimental_api
+    
+    ttf-parser API is subject to breaking change and we are interested on its
+    hb-draw like API so let's hide it more.
+
+ perf/meson.build | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit cdb7d2b9bc0d5928ae4f6ba16fe905f603583688
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Aug 2 11:26:29 2020 +0430
+
+    [docs] Update README.python.md with meson
+
+ README.python.md | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9fd48de6f0316fe6f1879879b96992b0471af88b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Aug 2 11:22:09 2020 +0430
+
+    [docs] Adopt CONFIG.md with meson
+
+ CONFIG.md | 15 +++++++--------
+ 1 file changed, 7 insertions(+), 8 deletions(-)
+
+commit b0a4860d3429e9effc3e642d6ef57b92332d796b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Aug 2 11:15:15 2020 +0430
+
+    [docs] Remove packagers related part
+    
+    Covered by https://github.com/harfbuzz/harfbuzz/wiki/Notes-on-migration-to-meson
+
+ BUILD.md | 18 ++----------------
+ 1 file changed, 2 insertions(+), 16 deletions(-)
+
+commit 50151567c13b8a3a2a838cbe1714b3cc1fd94bd6
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Aug 2 10:43:25 2020 +0430
+
+    [ci] Disable Travis CI
+
+ .ci/build-freetype.sh | 17 -----------------
+ .ci/fail.sh           | 18 ------------------
+ .ci/run-coveralls.sh  | 14 --------------
+ .circleci/config.yml  |  2 +-
+ .travis.yml           | 43 -------------------------------------------
+ README.md             |  2 +-
+ 6 files changed, 2 insertions(+), 94 deletions(-)
+
+commit 11bb8aa83e57b288241b9156706e6f8d25eaf383
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Aug 2 00:47:21 2020 +0430
+
+    [meson] limit check-libstdc++ check to 0.55
+    
+    library(..., link_language: 'c') is introduced in 0.55 but we were relying on this anyway
+    assuming b_asneeded being true on meson.
+    
+    #2614
+
+ src/meson.build | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit 9d3fbe0588f8f4d5883e425680fc37778660b284
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jul 30 14:54:00 2020 +0430
+
+    [meson] Add darwin versions to library()
+    
+    We now have,
+    
+    $ otool -L src/libharfbuzz.dylib
+    src/libharfbuzz.dylib:
+            @rpath/libharfbuzz.0.dylib (compatibility version 0.0.0, current version 0.0.0)
+    
+    And with the change should we get
+    
+    $ otool -L src/libharfbuzz.dylib
+    src/libharfbuzz.dylib:
+            @rpath/libharfbuzz.0.dylib (compatibility version 20700.0.0, current version 20700.0.0)
+
+ src/meson.build | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit 18ab8029d5aab6ac20c240515ad1795bd31dca1e
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Jul 31 14:40:49 2020 -0700
+
+    [ENOMEM] check vector status in cmap subsetting.
+
+ src/hb-ot-cmap-table.hh                                  |   3 +++
+ ...-testcase-minimized-hb-subset-fuzzer-6316256152780800 | Bin 0 -> 1335 bytes
+ 2 files changed, 3 insertions(+)
+
+commit 06dbb6acbbd322b3123820c73ed4371560efc558
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Jul 31 15:56:14 2020 -0700
+
+    [ENOMEM] in GSUB ChainContext subsetting check maps for allocation errors.
+
+ src/hb-ot-layout-gsubgpos.hh                            |   6 ++++++
+ ...testcase-minimized-hb-subset-fuzzer-4880059756969984 | Bin 0 -> 45902 bytes
+ 2 files changed, 6 insertions(+)
+
+commit fb1477795cb950b25472efa8d47febe81340a45b
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Jul 31 14:00:38 2020 -0700
+
+    [ENOMEM] Check result of vector resize in CBDT subsetting.
+
+ src/hb-ot-color-cbdt-table.hh                            |   6 +++++-
+ ...-testcase-minimized-hb-subset-fuzzer-6241118484955136 | Bin 0 -> 7345 bytes
+ 2 files changed, 5 insertions(+), 1 deletion(-)
+
+commit 8586bad2bdadccecd830fb0a1c973423115240fb
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jul 31 09:28:51 2020 +0430
+
+    [ci] don't install rustc on linux-ci
+    
+    https://github.com/harfbuzz/harfbuzz/pull/2610/checks?check_run_id=930572217
+
+ .github/workflows/linux-ci.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit efd716de3f4c7616aedd5c449bf8d27d565d4ab6
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jul 31 08:58:53 2020 +0430
+
+    [cff] Check for scalars array resize result
+    
+    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=24504
+
+ src/hb-cff2-interp-cs.hh                                 |   8 +++++---
+ ...zz-testcase-minimized-hb-draw-fuzzer-6231698648596480 | Bin 0 -> 2707 bytes
+ 2 files changed, 5 insertions(+), 3 deletions(-)
+
+commit 040ed094ef3cf032d84c4d65bd81f40c26f6f9e0
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Jul 30 15:14:02 2020 -0700
+
+    [ENOMEM] popragate packed/packed_map errors to the serializer.
+    Will disable further modifications based on a bad state.
+
+ src/hb-serialize.hh                                       |   3 +++
+ ...z-testcase-minimized-hb-subset-fuzzer-5661567174311936 | Bin 0 -> 473 bytes
+ 2 files changed, 3 insertions(+)
+
+commit 7f358a55f4b3c0eb6654be9e8c31ece29965b4d6
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Jul 30 13:57:30 2020 -0700
+
+    [ENOMEM] unchecked resize in CFF2.
+
+ src/hb-ot-cff2-table.hh                                  |   3 ++-
+ ...-testcase-minimized-hb-subset-fuzzer-5181909018345472 | Bin 0 -> 2559 bytes
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+commit 32f052b033f12fbeb8741c9616860743b1f567c4
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Jul 30 13:45:04 2020 -0700
+
+    [ENOMEM] Fix several instances of not checking resize in CFF.
+
+ src/hb-subset-cff-common.hh                        |  27 ++++++++++++++++++---
+ src/hb-subset-cff1.cc                              |  14 +++++++++--
+ src/hb-subset-plan.hh                              |   6 +++++
+ ...ase-minimized-hb-subset-fuzzer-5707809174585344 | Bin 0 -> 107592 bytes
+ ...ase-minimized-hb-subset-fuzzer-5708623339323392 | Bin 0 -> 151 bytes
+ 5 files changed, 41 insertions(+), 6 deletions(-)
+
+commit 4cbc7d61bc5e7f0658fc58d807f94f3b7c335f0d
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Jul 30 12:20:31 2020 -0700
+
+    [ENOMEM] check for unset current in serializer->length().
+
+ src/hb-serialize.hh | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit 0d22fb38b97afb6082fb4e5791e6fdd0166fa4a9
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jul 30 23:18:57 2020 +0430
+
+    Copy parts of README.md to README
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2591
+
+ README | 16 +++++++++++++++-
+ 1 file changed, 15 insertions(+), 1 deletion(-)
+
+commit cac30711834d343d36b0bea1138562beeb22340f
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jul 30 16:25:42 2020 +0430
+
+    [meson] minor, use null_dep one more place
+
+ perf/meson.build | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 4e572c940724cdae6f140df924c9ad7f4baea35e
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jul 30 16:19:15 2020 +0430
+
+    Remove cmake build files
+    
+    As discussed in https://github.com/harfbuzz/harfbuzz/pull/2252
+
+ .circleci/config.yml       |   3 +-
+ CMakeLists.txt             | 768 ---------------------------------------------
+ Makefile.am                |   2 -
+ replace-enum-strings.cmake |  21 --
+ 4 files changed, 1 insertion(+), 793 deletions(-)
+
+commit 5f9ff04fb0002351f130f13cdb8719d81d1683e0
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jun 18 02:33:05 2020 +0430
+
+    Add comparison against ttf-parser
+
+ .github/workflows/linux-ci.yml |   2 +-
+ perf/meson.build               |  14 +++++-
+ perf/perf-draw.hh              | 112 +++++++++++++++++++++++++++++------------
+ perf/perf-extents.hh           |  81 ++++++++++++++++++++---------
+ perf/perf.cc                   |   1 +
+ subprojects/ttf-parser.wrap    |   5 ++
+ 6 files changed, 157 insertions(+), 58 deletions(-)
+
+commit 87f4aada9964d4eff92de50fa2cd3708c81b5066
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jul 30 15:20:17 2020 +0430
+
+    [docs] Update TESTING.md with meson
+
+ TESTING.md | 67 ++++++++++++++++++--------------------------------------------
+ 1 file changed, 19 insertions(+), 48 deletions(-)
+
+commit 15644ee60ecebb65fc4d8e6a5b999a3f1629c241
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Jul 29 16:37:39 2020 -0700
+
+    [ENOMEM] fix memory leak if allocation fails during pop_pack().
+
+ src/hb-serialize.hh                                        |   6 +++++-
+ ...zz-testcase-minimized-hb-subset-fuzzer-5684542900535296 | Bin 0 -> 70 bytes
+ 2 files changed, 5 insertions(+), 1 deletion(-)
+
+commit 42237adffcfd951616efc2f8fba2cd195eb002ea
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Jul 29 15:18:25 2020 -0700
+
+    [ENOMEM] make serializer modification operations no-ops if it's in an error state.
+
+ src/hb-serialize.hh                                       |  14 ++++++++++++++
+ ...z-testcase-minimized-hb-subset-fuzzer-6231212713312256 | Bin 0 -> 76 bytes
+ 2 files changed, 14 insertions(+)
+
+commit d1f13014906d2540ea3f3e6f2aa2781e1314a869
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jul 30 02:01:43 2020 +0430
+
+    [icu] Remove support for versions older than 49
+    
+    It just doesn't make sense anymore, https://github.com/harfbuzz/harfbuzz/commit/c9e5da8ded390b816613839214fe96137ca0a0a2#r41018112
+
+ src/hb-icu.cc | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 0b74aaece71a3546c8ed4f60866c67b98e3659c0
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jul 30 01:47:30 2020 +0430
+
+    [icu] Remove useless HB_UNUSED tags
+    
+    As https://github.com/harfbuzz/harfbuzz/commit/c9e5da8ded390b816613839214fe96137ca0a0a2#r41018040
+
+ src/hb-icu.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit c9e5da8ded390b816613839214fe96137ca0a0a2
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jul 30 00:53:40 2020 +0430
+
+    [icu] Remove support of ICU versions before 42
+    
+    ICU 42 is released in 2012, see also https://github.com/harfbuzz/harfbuzz/commit/44a3136ae6a28222922da13582bd2dfd3eb823c7#commitcomment-41016353
+
+ src/hb-icu.cc | 145 ++++++++++------------------------------------------------
+ 1 file changed, 23 insertions(+), 122 deletions(-)
+
+commit 4ba8e3c6fd34cf0ab5f97e607bac708a978fa9b3
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Jul 29 12:33:42 2020 -0700
+
+    [ENOMEM] Fix failure to check calloc return.
+    Fixes https://oss-fuzz.com/testcase-detail/6246465148813312.
+
+ src/hb-ot-name-table.hh                                 |   2 ++
+ ...testcase-minimized-hb-subset-fuzzer-6246465148813312 | Bin 0 -> 24246 bytes
+ 2 files changed, 2 insertions(+)
+
+commit d307c24abf37b2702706cf9df0fab571a99e2a70
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Jul 29 12:23:37 2020 -0700
+
+    [ENOMEM] check resize() return.
+    Fixes https://oss-fuzz.com/testcase-detail/5641892164009984.
+
+ src/hb-ot-cff1-table.hh                                |   3 ++-
+ ...estcase-minimized-hb-subset-fuzzer-5641892164009984 | Bin 0 -> 124518 bytes
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+commit 8b63de110921f139ffb74cf159e2b042b0cd73d8
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jul 29 17:25:00 2020 +0430
+
+    [docs] Use untouched result of rsvg-convert for HarfBuzz.svg render
+    
+    See also https://github.com/harfbuzz/harfbuzz/commit/1ec77522d838dd751733d3927e3d9589bf298853?short_path=1bb7b85
+
+ docs/HarfBuzz.png | Bin 4740 -> 6254 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit 7bab6087bf1b7809ce05a9fb07a40d5708e4ff5d
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jul 29 08:49:01 2020 +0430
+
+    [ci] Install meson's master
+    
+    As https://github.com/mesonbuild/meson/issues/7437
+
+ .github/workflows/linux-ci.yml | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 58a5961ca1f1d7c8ed89acf07620242208d33edf
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jul 29 08:44:23 2020 +0430
+
+    minor spacing tweak
+
+ src/hb-subset-plan.cc | 4 ++--
+ util/hb-fc-list.c     | 2 +-
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 07c43b8cf6c89c79eb3e23550c6a843eaade166b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jul 29 08:42:52 2020 +0430
+
+    minor spacing tweak
+
+ src/hb-subset-plan.cc  |  2 +-
+ util/options-subset.cc | 16 ++++++++--------
+ 2 files changed, 9 insertions(+), 9 deletions(-)
+
+commit 5a7cc7fd8b6f7381c40be993faffb81b9608e9bf
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jul 29 08:33:32 2020 +0430
+
+    minor spacing tweak
+
+ perf/perf-draw.hh              |   2 +-
+ src/hb-ot-cmap-table.hh        | 154 ++++++++++++++++++++---------------------
+ src/hb-ot-layout-common.hh     |   8 +--
+ src/hb-ot-layout-gdef-table.hh |  18 ++---
+ src/hb-ot-layout-gpos-table.hh |  82 +++++++++++-----------
+ src/hb-ot-layout-gsub-table.hh |   4 +-
+ src/hb-ot-layout-gsubgpos.hh   |  20 +++---
+ src/hb-subset-plan.cc          |   7 +-
+ src/hb-subset-plan.hh          |   5 +-
+ util/options-subset.cc         |   2 +-
+ 10 files changed, 149 insertions(+), 153 deletions(-)
+
+commit 48ad745996159337fb4733561e834a0ffbe3a1ae
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jul 29 08:09:08 2020 +0430
+
+    [ENOMEM] Fix buffer's content check logic
+    
+    So now rest of shape fuzzer also can be enabled.
+    
+    Fixes #2571
+
+ src/hb-buffer-serialize.cc      |  8 ++++----
+ src/hb-buffer.cc                | 12 ++++++------
+ test/fuzzing/hb-shape-fuzzer.cc | 14 ++++++--------
+ 3 files changed, 16 insertions(+), 18 deletions(-)
+
+commit c33e8006fdaec3b4acf8927c75e04129e0410a59
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Jul 14 19:29:58 2020 +0430
+
+    [fuzz] Implement failing allocator
+
+ src/failing-alloc.c              | 57 ++++++++++++++++++++++++++++++++++++++++
+ src/meson.build                  |  8 ++++++
+ test/fuzzing/hb-draw-fuzzer.cc   |  2 ++
+ test/fuzzing/hb-fuzzer.hh        |  8 ++++++
+ test/fuzzing/hb-set-fuzzer.cc    |  2 ++
+ test/fuzzing/hb-shape-fuzzer.cc  |  6 +++++
+ test/fuzzing/hb-subset-fuzzer.cc |  2 ++
+ test/fuzzing/meson.build         |  4 ++-
+ 8 files changed, 88 insertions(+), 1 deletion(-)
+
+commit 44a3136ae6a28222922da13582bd2dfd3eb823c7
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jul 29 07:03:44 2020 +0430
+
+    [glib] Default to glib's script type handling
+    
+    2.29.14 is almost released a decade ago, no need to support archaic glib versions.
+
+ src/hb-glib.cc | 148 +--------------------------------------------------------
+ 1 file changed, 1 insertion(+), 147 deletions(-)
+
+commit dae32b4f12da5d90de32886b0fd16653e3853e25
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Jul 28 18:31:46 2020 -0700
+
+    [subset] bail out of subsetting if plan allocation fails.
+
+ src/hb-face.cc        | 3 +++
+ src/hb-subset-plan.cc | 6 +++++-
+ src/hb-subset-plan.hh | 6 ++++++
+ src/hb-subset.cc      | 3 +++
+ 4 files changed, 17 insertions(+), 1 deletion(-)
+
+commit d38d63319bcec35a5dccb5e6ab49eee123bd4c0e
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jul 27 09:19:29 2020 +0430
+
+    [tests] minor
+
+ test/subset/run-tests.py | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit 322426f8c8ef818a60ec9090670ff077647fdfa2
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jul 27 09:03:35 2020 +0430
+
+    [tests] Use TTFont of fonttools to avoid temp files
+
+ test/subset/run-tests.py | 56 +++++++++++++++++-------------------------------
+ 1 file changed, 20 insertions(+), 36 deletions(-)
+
+commit 08fef15818013e12ae49e44261f0bf8773124591
+Author: Hamidreza Bayat <hamidrezabayat76@gmail.com>
+Date:   Sun Jul 26 17:16:07 2020 +0430
+
+    Use fonttools's python package instead of cli
+
+ test/subset/run-tests.py | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+commit bec3db49bd1002b4fbe5baf3ca462bce85fb7da5
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jul 25 13:45:34 2020 +0430
+
+    [ci] meson-gcc-mingw to crossbuild-win32
+
+ .circleci/config.yml | 16 +++-------------
+ 1 file changed, 3 insertions(+), 13 deletions(-)
+
+commit 24a6f046e467b875c71b8897078af1311dda11be
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jul 25 13:18:54 2020 +0430
+
+    [releasing] unbreak the build
+    
+    Use lower number of parallel jobs as https://circleci.com/gh/harfbuzz/harfbuzz/149413 apparent compiler OOM issue
+
+ .ci/build-win32.sh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit cddfe4ea275f869afedc9adfae65d6b1317552da
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jul 25 13:09:57 2020 +0430
+
+    [releasing] Use release buildtype
+    
+    guess will optimize speed and size of the output, non important things anyway for the test only win32 packs
+
+ .ci/build-win32.sh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a01c7a380b9a3351bc7056c816e1340b5374a6f8
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jul 25 12:27:31 2020 +0430
+
+    2.7.0
+
+ NEWS             | 21 +++++++++++++++++++++
+ configure.ac     |  9 +++------
+ meson.build      |  4 +---
+ src/hb-version.h |  6 +++---
+ 4 files changed, 28 insertions(+), 12 deletions(-)
+
+commit b32f2e8b490b3909c2ba6eb1b97506710efcbe5f
+Author: Evgeniy Reizner <razrfalcon@gmail.com>
+Date:   Thu Jul 23 11:48:19 2020 +0300
+
+    Remove unused code from the Khmer shaper.
+
+ src/hb-ot-shape-complex-khmer.cc | 4 ----
+ 1 file changed, 4 deletions(-)
+
+commit f9ac6ddbef0eba3ab172b1e2439ce776870b969f
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jul 22 17:53:04 2020 +0430
+
+    [meson] Rename 'gtk_doc' option to 'docs'
+
+ docs/meson.build  | 2 +-
+ meson.build       | 2 +-
+ meson_options.txt | 2 +-
+ 3 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 11ae45f6ebbff8ef1d8706c384e3ee74889917a7
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jul 22 17:52:16 2020 +0430
+
+    [ci] Don't run cov-analyze
+    
+    https://stackoverflow.com/a/59353318
+
+ .github/workflows/coverity-scan.yml | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 46ec6db9656537997b29581cabb6dba901565767
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jul 22 17:30:48 2020 +0430
+
+    minor
+
+ src/hb-aat-layout-kerx-table.hh | 4 +---
+ src/hb-ot-map.hh                | 4 ++--
+ src/hb-subset-cff1.cc           | 2 +-
+ 3 files changed, 4 insertions(+), 6 deletions(-)
+
+commit 5c46683ab8b3f390a8aa043be97d89674e24162d
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jul 22 17:23:22 2020 +0430
+
+    [fuzz] increase shape fuzzer timeout
+    
+    as https://circleci.com/gh/harfbuzz/harfbuzz/149203
+
+ test/fuzzing/meson.build | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 83c44f69d3724acbb16b25c1c1dee564ca1c3604
+Author: insilications <boboniboni@gmail.com>
+Date:   Mon Jul 20 17:35:10 2020 -0300
+
+    [tests] fix PGO build testing
+    
+    Adds 'mangle_path' to IGNORED_SYMBOLS
+
+ src/check-symbols.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 024fc665da00be5b8615af88cd00ed1a0f7485e9
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jul 20 23:57:27 2020 +0430
+
+    [ci] disable clang nightly installation
+    
+    they don't like to work apparently for some reason https://circleci.com/gh/harfbuzz/harfbuzz/149164
+    
+    better to use oss-fuzz docker images, gcr.io/oss-fuzz-base/base-clang, but the fact it uses 16.04 is showstopper for us.
+
+ .circleci/config.yml | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit d058e56cf1015f6b922642d2cd7ccef27efd9958
+Author: Christoph Reiter <reiter.christoph@gmail.com>
+Date:   Mon Jul 20 20:50:09 2020 +0200
+
+    [ci] Update to msys2/setup-msys2@v2
+    
+    This update introduces better error handling and package caching by default.
+
+ .github/workflows/msys2-ci.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ae8a71dfb8ad3b6f7cb48ff79dbc8a103f6d6fca
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jul 20 20:16:15 2020 +0430
+
+    [ci] minor, use --auto-features=enabled
+
+ .github/workflows/linux-ci.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9bb15ee2edf563797ab5cdded6bb3ea186cd2fd6
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Jul 19 22:24:13 2020 +0430
+
+    [ci] remove irc notification
+    
+    is just a noise there, yet, done to see if is anyone really wants it let's see how I can bring it back in some other bot
+
+ .travis.yml | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit f65a8a33b60d04548ee755d1e052fc01ff6f1248
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Jul 19 18:13:48 2020 +0430
+
+    [ci] run cov-analyze
+    
+    apparently we have to run that also ourselves, let's see
+
+ .github/workflows/coverity-scan.yml | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit ab1079b04621311b9e5b776adf77ab6038fefa66
+Merge: 05ed1ee0c 93aea76a2
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jul 18 23:05:50 2020 +0430
+
+    Merge pull request #2577 from lazka/gha-msvc
+    
+    Use GitHub Actions for msvc bots
+
+commit 05ed1ee0c41088481baf8aafddd8d6976db0bdac
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jul 18 23:05:26 2020 +0430
+
+    [ci] Remove appveyor ci badge
+    
+    As https://github.com/harfbuzz/harfbuzz/pull/2577
+
+ README.md | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 93aea76a25640d923168272f001db43e776c8bdb
+Author: Christoph Reiter <reiter.christoph@gmail.com>
+Date:   Sat Jul 18 19:32:19 2020 +0200
+
+    Fix the GHA msvc build
+    
+    Use the 'ilammy/msvc-dev-cmd' action for setting up the msvc env,
+    so we can use powershell everywhere.
+    
+    Remove a directory from PATH which was interfering with the meson build
+    by providing an unrelated pkg-config.exe.
+
+ .github/workflows/msvc-ci.yml | 26 +++++++++++++++++++-------
+ 1 file changed, 19 insertions(+), 7 deletions(-)
+
+commit d0e2addd43dad705d9f54134b97ae81757f5e25e
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jul 18 22:14:52 2020 +0430
+
+    minor
+
+ src/hb-aat-layout-bsln-table.hh |  2 +-
+ src/hb-aat-layout-kerx-table.hh |  8 +++-----
+ src/hb-aat-layout-morx-table.hh |  2 +-
+ src/hb-buffer.cc                |  4 ++--
+ src/hb-buffer.hh                |  2 +-
+ src/hb-cff2-interp-cs.hh        |  2 +-
+ src/hb-font.hh                  |  2 +-
+ src/hb-ot-cmap-table.hh         | 30 +++++++++++++--------------
+ src/hb-ot-layout-common.hh      | 14 ++++++-------
+ src/hb-ot-layout-gdef-table.hh  |  8 ++++----
+ src/hb-ot-layout-gpos-table.hh  | 45 ++++++++++++++++++++++++-----------------
+ src/hb-ot-layout-gsub-table.hh  |  4 ++--
+ src/hb-ot-layout-gsubgpos.hh    |  8 ++++----
+ src/hb-ot-math-table.hh         | 16 +++++++--------
+ src/hb-ot-shape.cc              |  4 ++--
+ src/hb-ot-var-gvar-table.hh     |  2 +-
+ src/hb-subset-cff2.cc           | 14 ++++++-------
+ 17 files changed, 87 insertions(+), 80 deletions(-)
+
+commit 3a46ae51273ce086aaec8ccf14420bbf5a36dffb
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jul 15 12:46:34 2020 +0430
+
+    Use GitHub Actions for msvc bots
+
+ .github/workflows/msvc-ci.yml | 38 ++++++++++++++++++++++++++++++++++++++
+ appveyor.yml                  | 37 -------------------------------------
+ 2 files changed, 38 insertions(+), 37 deletions(-)
+
+commit 7e3edfa4541189cc3f9f477192629ad1a197b727
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jul 18 19:03:36 2020 +0430
+
+    minor
+
+ src/hb-open-type.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 8e5bc535d10fb166f721520db6977cc4e949f1c5
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Wed Jul 15 18:54:52 2020 -0700
+
+    [subset] call collect_mapping only when --gids option is used.
+    
+    collect_mapping is time consuming as it iterates all codepoints in all
+    cmap subtables, only trigger it when necessary
+
+ src/hb-ot-cmap-table.hh | 11 +++++++----
+ src/hb-ot-os2-table.hh  | 39 ++++++++++++++++++++++-----------------
+ 2 files changed, 29 insertions(+), 21 deletions(-)
+
+commit 1ebe5bad1a0b54b73ef0ab7cd1f67030120b3482
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jul 16 01:45:38 2020 +0430
+
+    [ci] minor fix
+
+ appveyor.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e9b71c296b45f1dc254f015caaa82b5b5f0792a4
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jul 16 01:40:48 2020 +0430
+
+    [ci] cleanup
+
+ appveyor.yml | 13 +++----------
+ 1 file changed, 3 insertions(+), 10 deletions(-)
+
+commit 8cbdb6fa41b7364f59bb03295a307dd903908eef
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jul 15 13:32:57 2020 +0430
+
+    [meson] Don't enable benchmark under the conditions ever
+    
+    As we don't want to make headache for packagers as we don't want to
+    enable it when --auto-features=enabled is used.
+
+ .github/workflows/msys2-ci.yml | 3 +--
+ meson.build                    | 8 ++++----
+ 2 files changed, 5 insertions(+), 6 deletions(-)
+
+commit dc981fe951f10e88723452d3eeab8be2ed7d1c55
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jul 15 13:15:27 2020 +0430
+
+    [meson] Merge gdi and uniscribe
+    
+    They are the same thing obviously
+
+ meson.build | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 8e7a9b6eebfa2fbdfe90b80189d4428a1fb3b14e
+Author: Christoph Reiter <reiter.christoph@gmail.com>
+Date:   Wed Jul 15 09:01:53 2020 +0200
+
+    msys2-ci: clean up
+
+ .github/workflows/msys2-ci.yml | 20 +++++++-------------
+ 1 file changed, 7 insertions(+), 13 deletions(-)
+
+commit 9a4d590eeeda7f24e80c272aa4906f5446c07c1d
+Author: Christoph Reiter <reiter.christoph@gmail.com>
+Date:   Wed Jul 15 07:38:20 2020 +0200
+
+    CI: Port MSYS2 jobs from appveyor to github actions
+
+ .github/workflows/msys2-ci.yml | 66 ++++++++++++++++++++++++++++++++++++++++++
+ appveyor.yml                   | 18 ------------
+ 2 files changed, 66 insertions(+), 18 deletions(-)
+
+commit 945bcd7230277e648734b7d8a82e868d1f13257f
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jul 15 09:54:32 2020 +0430
+
+    minor
+
+ test/fuzzing/hb-subset-fuzzer.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit fa0436ddd16e463dfd4600822b90f8943ff7baf5
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jul 15 09:52:40 2020 +0430
+
+    [ENOMEM][fuzzer/subset] early return if the result is null
+    
+    I don't see _or_fail APIs idiomatic for the project but since it is there, let's have this
+
+ test/fuzzing/hb-subset-fuzzer.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 7c433ffde2d566d849cd54a881abddad4d7e2f51
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jul 15 09:38:12 2020 +0430
+
+    Add HB_CUSTOM_MALLOC definition
+    
+    So one can use just HB_CUSTOM_MALLOC instead need for define each of hb_*alloc_impl
+
+ src/hb.hh | 13 +++++++++----
+ 1 file changed, 9 insertions(+), 4 deletions(-)
+
+commit 60959b08e532c0c61d0c5c89507a983595079df1
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Jul 14 20:28:06 2020 +0430
+
+    [meson] execute find_program('gen-ragel-artifacts.py') only once
+    
+    should rename the script also
+
+ src/meson.build | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 5c8e1bd2370e6b78de8d2b6ef6968c0429b37633
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Jul 14 17:47:10 2020 +0430
+
+    [meson] Don't allow introspection on static library
+
+ src/meson.build | 12 +++++++++++-
+ 1 file changed, 11 insertions(+), 1 deletion(-)
+
+commit 9566904cb3eee5c33c166641debf1567d9ca301b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Jul 14 15:17:17 2020 +0430
+
+    [morx] minor, mark with unlikely
+    
+    at least just to show this is the unusual path
+
+ src/hb-aat-layout-morx-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 11d583a9eaf5089418d0091a01e8e10be37485e1
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Jul 14 06:23:06 2020 +0430
+
+    [aat] Consume glyph insertion from buffer's max_ops (#2223)
+    
+    Glyph insertion is an expensive operation and we like to have it limited
+    based on buffer's input size which is handled by buffer's max_ops.
+    
+    clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5754958982021120:
+    
+    Before the change: 0.67s user 0.00s system 99% cpu 0.674 total
+     After the change: 0.02s user 0.00s system 98% cpu 0.024 total
+    
+    Which takes much longer on valgrind and tsan bots.
+
+ src/hb-aat-layout-morx-table.hh                           |   2 ++
+ ...zz-testcase-minimized-harfbuzz_fuzzer-5754958982021120 | Bin 0 -> 319 bytes
+ 2 files changed, 2 insertions(+)
+
+commit 6937092a66aefa7602a38827a52b4241d3f96168
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jul 13 21:32:15 2020 +0430
+
+    [py] apply lgtm.com python suggestions
+
+ src/gen-indic-table.py | 5 ++---
+ src/gen-use-table.py   | 5 ++---
+ 2 files changed, 4 insertions(+), 6 deletions(-)
+
+commit 2a182128b9c1ffd825f5c0b1f94cbff8b28a8934
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jul 13 20:41:13 2020 +0430
+
+    [py] minor, comment buffer_add_utf8 call
+    
+    mainly to apply lgtm suggestion, looks better also however,
+    some minor spacing is also applied.
+
+ src/sample.py | 29 ++++++++++++++---------------
+ 1 file changed, 14 insertions(+), 15 deletions(-)
+
+commit 2c1d699409cd43af4b86649143f533418b03cf29
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jul 13 20:26:57 2020 +0430
+
+    [ci] use clang for cov-build
+    
+    to be honest this is done as a let's see what
+    happens move but the background is coverity
+    reveals more things for Firefox project and there
+    should be an interesting reason for it.
+
+ .github/workflows/coverity-scan.yml | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit cdf18e8338325f4d6fdc307f3b2216b4c4a24e14
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jul 13 20:07:51 2020 +0430
+
+    [py] minor, remove unnecessary pass
+    
+    discovered by lgtm
+
+ src/gen-arabic-table.py | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 45d9e8d76c128fff73e6cf9291df60cfd8d1b25b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jul 13 19:25:53 2020 +0430
+
+    [py] minor, remove unused import
+
+ src/gen-ragel-artifacts.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9ab7525a0623048ac924467745683231488bc399
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jul 13 01:15:36 2020 +0430
+
+    [ci] use a fixed version of meson in gh actions bot
+    
+    a patch is uploaded to fix the issue with b_coverage in meson upstream thus let's revive our bot at least for now
+
+ .github/workflows/linux-ci.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 3236db625b77337a048b9f3ab04fc28f4f6dcb0c
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jul 13 01:06:24 2020 +0430
+
+    [ci] install a fixed version of meson in msys2 bots
+    
+    for some reason apparently msys2 installation here has 0.51 version, which, is weird, lets use a fixed version anyway
+
+ appveyor.yml | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 51a8eb1c028ba430986bbe4b1e6afaf0063a6f76
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Jul 12 23:40:50 2020 +0430
+
+    [ci] use meson package from msys2
+    
+    as https://github.com/harfbuzz/harfbuzz/issues/2561#issuecomment-657261692
+
+ appveyor.yml | 17 +++++++----------
+ 1 file changed, 7 insertions(+), 10 deletions(-)
+
+commit 3163e9fedb1029439f381c1192f0e057870437ea
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Jul 12 23:11:45 2020 +0430
+
+    [ci] Remove HB_TEST_SUBSET_FUZZER_TIMEOUT
+    
+    meson is passing it itself
+    
+    Fortunately oss-fuzz has its own timeout value, I just like to be conservative here
+    and not involve outsiders with flakiness of tests specially as meson which runs
+    them concurrently so consuming more time is expected on meson.
+
+ .circleci/config.yml | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit cd6f62d9608c7fabd75028c2146a7e034bcc6a85
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Jul 12 23:05:11 2020 +0430
+
+    [meson] Raise timeout value of subset fuzzer testcases
+    
+    happens when tsan is enabled
+
+ test/fuzzing/meson.build | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 1dfa33854f065d5bee104e880f138b994448f44f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jul 12 09:24:03 2020 -0700
+
+    [arabic] Remove stale comment
+
+ src/hb-ot-shape-complex-arabic.cc | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit f8d345ee06596f90f0588d97e012dd3f62245897
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jul 9 10:57:51 2020 +0430
+
+    [ci] Remove ambiguous-reversed-operator warning from whitelist
+    
+    Should be fixed by 6a45df0
+
+ .circleci/config.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6a45df0a543a74d6d19e249f043c9b223aae1935
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 8 18:17:40 2020 -0500
+
+    Fix -Wambiguous-reversed-operator warning
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2554
+
+ src/hb-map.hh    | 2 +-
+ src/hb-object.hh | 4 ++--
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 5ea11cb817efbad0daae1a6ca5b60edf55c19d79
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jul 8 19:29:47 2020 +0430
+
+    [ci] don't use harfbuzz.cc with -Weverything
+    
+    Causes
+    
+    In file included from src/harfbuzz.cc:13:
+    src/hb-ot-cff1-table.cc:36:17: error: using namespace directive in global context in header [-Werror,-Wheader-hygiene]
+    using namespace CFF;
+                    ^
+    In file included from src/harfbuzz.cc:14:
+    src/hb-ot-cff2-table.cc:35:17: error: using namespace directive in global context in header [-Werror,-Wheader-hygiene]
+    using namespace CFF;
+                    ^
+    2 errors generated.
+
+ .circleci/config.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e4f9969108f7a01d7c37c856e6833b400d0278de
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jul 8 15:10:25 2020 +0430
+
+    [ci] migrate to meson
+    
+    two bots, one bot here (distcheck) and one in travis still run autotools and
+    won't be removed till we decide about autotools
+
+ .circleci/config.yml                    | 210 ++++++++------------------------
+ test/fuzzing/run-draw-fuzzer-tests.py   |   6 +-
+ test/fuzzing/run-shape-fuzzer-tests.py  |   6 +-
+ test/fuzzing/run-subset-fuzzer-tests.py |   6 +-
+ 4 files changed, 55 insertions(+), 173 deletions(-)
+
+commit f62f4e388b1a904ea4b2863ec62bb7b4db153fe2
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jul 8 00:26:40 2020 +0430
+
+    [meson] minor on gdi, dwrite and icu
+
+ meson.build | 49 ++++++++++++++++++++++---------------------------
+ 1 file changed, 22 insertions(+), 27 deletions(-)
+
+commit 69a1e07acb721cc2345e731f4b85a786a1d95323
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jul 8 03:12:09 2020 +0430
+
+    [meson] don't enable benchmark if is in nodownload wrap mode
+    
+    Fixes #2551
+
+ meson.build | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit e04050e3b856d275779a2d010fc59ff230a8c4d8
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jul 8 01:06:30 2020 +0430
+
+    [meson] split fuzzer_ldflags before use
+
+ test/fuzzing/meson.build | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 747f65f9ef28c552b53d4afa95cd7706acf78e44
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Jul 7 11:37:16 2020 +0430
+
+    [meson] Remove HAVE_OT and HAVE_FALLBACK
+    
+    No need as 1e8fdd2 and 23768a9
+
+ meson.build | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit c5def347300b37368d3b342fc0f6e7a5fbd76ff4
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jul 6 23:29:56 2020 +0430
+
+    [meson] don't underscorify fuzzers names
+
+ test/fuzzing/meson.build | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit d608f2ac85c5f7b5b98ffd8e9be76567af3aefb0
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jul 6 22:40:51 2020 +0430
+
+    [meson] Add fuzzer_ldflags
+    
+    As ots, https://github.com/khaledhosny/ots/commit/4d37b9b
+
+ meson_options.txt        |  2 ++
+ test/fuzzing/meson.build | 12 +++++++++++-
+ 2 files changed, 13 insertions(+), 1 deletion(-)
+
+commit e1c35ca581886a0fe761ea95fdda2cfc3f720403
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jul 6 22:29:11 2020 +0430
+
+    [meson] rename the section
+    
+    As Behdad's comment
+
+ meson.build | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ddb103ea1a729893a8a0dde24881f13534727207
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jul 6 22:27:39 2020 +0430
+
+    [meson] minor
+
+ meson.build | 20 +++++++++++---------
+ 1 file changed, 11 insertions(+), 9 deletions(-)
+
+commit 13d78b50f2b8a3941e495bc47f0a019a1f6b5fa5
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jul 6 22:22:42 2020 +0430
+
+    [doc] minor
+
+ BUILD.md | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e5dd7d3ef94d68c3f28763962aa3855baf3488b8
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jul 6 21:40:19 2020 +0430
+
+    [doc] more on build
+
+ BUILD.md | 24 ++++++++++++++++++++----
+ 1 file changed, 20 insertions(+), 4 deletions(-)
+
+commit 471ae786ce1544e03181ff06d33f5e5a8a71aff4
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jul 6 18:29:23 2020 +0430
+
+    [ci] Install a newer meson version
+
+ .circleci/config.yml | 12 ++++++++----
+ 1 file changed, 8 insertions(+), 4 deletions(-)
+
+commit 694a0c6bbc7c7f8dae9617bb3e1718bba940ce6a
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jul 6 18:28:31 2020 +0430
+
+    [meson] Always add icu deps
+
+ .circleci/config.yml |  4 ++--
+ test/api/meson.build | 15 +++++++--------
+ 2 files changed, 9 insertions(+), 10 deletions(-)
+
+commit 28554cb831f60876c0c844b5016118ce11145fcd
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jul 6 17:04:54 2020 +0430
+
+    [doc] add a note for packagers
+
+ BUILD.md | 8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+commit 0fc52d3b2d918e0123d2083a005799b30cb9733b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jul 6 16:47:50 2020 +0430
+
+    [doc] Simplify and extend build instructions
+
+ BUILD.md | 44 ++++++++------------------------------------
+ 1 file changed, 8 insertions(+), 36 deletions(-)
+
+commit 3a8d137c2c0c06dd672894ed1b2dcd97f6bab27e
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jul 6 16:31:32 2020 +0430
+
+    [ci] migrate macOS bots to meson
+
+ .circleci/config.yml | 33 ++++++++++++++++-----------------
+ 1 file changed, 16 insertions(+), 17 deletions(-)
+
+commit a2b52cbb77e37b5287608b457f483e1b7712e1b2
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Mon Jul 6 17:01:23 2020 +0200
+
+    [ci] Use --wrap-mode=default for MSVC builds
+
+ appveyor.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit dc684103d4aededf91e92ead21a8c42ac2acef87
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Mon Jul 6 14:48:37 2020 +0200
+
+    [meson] Set the default wrap mode to nofallback
+    
+    This, I believe, will prevent any automatic use of subprojects be
+    default and will only look for dependencies on the system.
+    https://mesonbuild.com/Subprojects.html#commandline-options
+
+ meson.build | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 52199349aa898ae64ec83896d2a0edf6284a0715
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jul 6 16:30:59 2020 +0430
+
+    [meson] mark meson as tested
+    
+    tested in a CI bot that in a `-Dcoretext=enabled` build, `build/util/hb-shape --shaper=ot` works fine.
+
+ meson.build | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ba810ce83d392daeaa0c69af5549d020436a5ac7
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Apr 5 22:51:58 2020 +0430
+
+    [tests] Replace space with colon in batch mode
+
+ test/shaping/run-tests.py | 17 ++++++-----------
+ util/hb-shape.cc          |  7 +++++--
+ 2 files changed, 11 insertions(+), 13 deletions(-)
+
+commit 2013babcbffbd94e9fc0649d2862527a635d4e12
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jul 6 11:57:45 2020 +0430
+
+    [tests] Use HAVE_FREETYPE itself instead NO_FT_FUNCS
+
+ test/shaping/data/aots/Makefile.am                 | 5 +++++
+ test/shaping/data/in-house/Makefile.am             | 5 +++++
+ test/shaping/data/text-rendering-tests/Makefile.am | 5 +++++
+ test/shaping/meson.build                           | 2 +-
+ test/shaping/run-tests.py                          | 6 +++---
+ 5 files changed, 19 insertions(+), 4 deletions(-)
+
+commit d5238c18337e88e6ad3bb071296531d7a3354fb2
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jul 6 01:53:27 2020 +0430
+
+    [RELEASE] Rely to GitHub's tarball generation
+
+ RELEASING.md | 36 +++++++++++++-----------------------
+ 1 file changed, 13 insertions(+), 23 deletions(-)
+
+commit a08ba46d86b1f6ba1a303fbb55ceebccd91f2fe2
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jul 6 00:31:42 2020 +0430
+
+    [meson] move meson version so can be referenced easier
+
+ RELEASING.md | 2 +-
+ meson.build  | 3 ++-
+ 2 files changed, 3 insertions(+), 2 deletions(-)
+
+commit 6d3d0ebba3103ec63737383385ed51d65f4e0eae
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jul 6 00:26:07 2020 +0430
+
+    Remove .tarball-revision generation from meson dist
+    
+    Toward making release tarball identical to git checkout now that we are moving to meson.
+
+ Makefile.am               |  1 -
+ meson.build               |  4 ----
+ write-tarball-revision.py | 13 -------------
+ 3 files changed, 18 deletions(-)
+
+commit 1e6027e29cd5d900337b23a20886b2a8d81bb2de
+Author: jfkthame <jfkthame@gmail.com>
+Date:   Sun Jul 5 22:44:10 2020 +0100
+
+    [aat] Correct array indexing when looking up actions in KerxSubTableFormat4 (#2539)
+    
+    * [aat] Correct array indexing when looking up actions in KerxSubTableFormat4.
+    
+    - For action_type 0 and 1, there are 2 values per action record; for action_type 2, there are 4. So we need to account for these factors when indexing into the ankrData array.
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2531.
+
+ src/hb-aat-layout-kerx-table.hh              | 20 +++++++++++++-------
+ test/shaping/data/in-house/tests/macos.tests |  1 +
+ 2 files changed, 14 insertions(+), 7 deletions(-)
+
+commit aa732e454a69ce48bf9a878a43b1bb3c364dca4d
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jul 6 00:10:16 2020 +0430
+
+    [tests] minor, ligcarets is fetched from gdef not gsub
+
+ test/api/test-ot-ligature-carets.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 122a2897e4782c5e0a39ec7bb0eedb2e7d568913
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Jul 5 22:45:11 2020 +0430
+
+    [aat] Remove lcar support
+    
+    Very low use, only two distinct font files, Apple Chancery.ttf and Hoefler Text.ttc
+    have it so it really doesn't worth the size addition and so, but one may argue that
+    whole ligature caret is low use but guess we better to encourage GDEF one anyway.
+
+ src/Makefile.sources               |   1 -
+ src/hb-aat-layout-lcar-table.hh    | 174 -------------------------------------
+ src/hb-ot-face-table-list.hh       |   1 -
+ src/hb-ot-layout.cc                |  18 +---
+ src/meson.build                    |   1 -
+ test/api/fonts/lcar.ttf            | Bin 808 -> 0 bytes
+ test/api/test-ot-ligature-carets.c |  75 ----------------
+ 7 files changed, 1 insertion(+), 269 deletions(-)
+
+commit a3b9b94b63ba5b99803f9ed62ad5f951d19b61d2
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jul 6 00:05:21 2020 +0430
+
+    [style] Remove fdsc support (#2541)
+    
+    It isn't exposed yet and low use between Apple fonts,
+    32 fdsc table vs 767 OS/2 tables, even Apple doesn't
+    support it anymore per Ned.
+
+ src/Makefile.sources         |   1 -
+ src/hb-aat-fdsc-table.hh     | 126 -------------------------------------------
+ src/hb-aat-layout.cc         |   1 -
+ src/hb-ot-face-table-list.hh |   1 -
+ src/hb-style.cc              |  14 -----
+ src/meson.build              |   1 -
+ test/api/fonts/aat-fdsc.ttf  | Bin 556 -> 0 bytes
+ test/api/test-style.c        |  20 -------
+ 8 files changed, 164 deletions(-)
+
+commit 6a50aa4e54d3c1f678c589c7bbe0d53958bd5d60
+Author: Dirk Lemstra <dirk@lemstra.org>
+Date:   Sun Jul 5 18:46:29 2020 +0200
+
+    Corrected the link to the releases.
+
+ docs/usermanual-install-harfbuzz.xml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a6fb8ce98a6ee7b62fe42e233c946a427587bbd7
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jul 4 23:43:21 2020 +0430
+
+    Minor, fix -Wrange-loop-analysis warnings
+    
+    Fixing these complains raised by newer versions of clang,
+    
+    ./hb-ot-layout-common.hh:1720:53: error: loop variable 'gid_klass_pair' is always a copy because the range of type 'hb_map_iter_t<hb_sorted_array_t<OT::HBGlyphID>, (lambda at ./hb-ot-layout-common.hh:1672:29), hb_function_sortedness_t::RETAINS_SORTING, nullptr>' does not return a reference [-Werror,-Wrange-loop-analysis]
+        for (const hb_pair_t<hb_codepoint_t, unsigned>& gid_klass_pair : + it)
+    
+    And
+    
+    ./hb-ot-color-colr-table.hh:177:44: error: loop variable '_' is always a copy because the range of type 'hb_map_iter_t<hb_filter_iter_t<hb_map_iter_t<hb_range_iter_t<unsigned int, unsigned int>, (lambda at ./hb-ot-color-colr-table.hh:209:31), hb_function_sortedness_t::RETAINS_SORTING, nullptr>, (anonymous struct at ./hb-algs.hh:331:1) &, (anonymous struct at ./hb-algs.hh:51:1) &, nullptr>, (anonymous struct at ./hb-algs.hh:338:1) &, hb_function_sortedness_t::RETAINS_SORTING, nullptr>' does not return a reference [-Werror,-Wrange-loop-analysis]
+        for (const hb_item_type<BaseIterator>& _ : + base_it.iter ())
+
+ src/hb-ot-color-colr-table.hh | 2 +-
+ src/hb-ot-layout-common.hh    | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit a470b0b20545229a51209e470692f1ad607bd17e
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jul 4 23:56:10 2020 +0430
+
+    Minor, disable strict-aliasing warning in set fuzzer
+    
+    ../test/fuzzing/hb-set-fuzzer.cc: In function ‘int LLVMFuzzerTestOneInput(const uint8_t*, size_t)’:
+    ../test/fuzzing/hb-set-fuzzer.cc:38:82: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
+       38 |   const instructions_t &instructions = reinterpret_cast<const instructions_t &> (data);
+          |
+    
+    And it is already disabled at project level so let's disable it here also.
+
+ test/fuzzing/hb-set-fuzzer.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 44444822979615b284f679564c48b59ea6927ad8
+Author: Jan Alexander Steffens (heftig) <jan.steffens@gmail.com>
+Date:   Thu Jul 2 17:46:56 2020 +0000
+
+    meson: Pin harfbuzz in .pc files to the built version
+    
+    This ensures that we link -subset, -icu and -gobject with a matching
+    version of the main library.
+
+ src/meson.build | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 3adcf398a02f3b647d149b65e4dfd4506b4cc73e
+Author: Jan Alexander Steffens (heftig) <jan.steffens@gmail.com>
+Date:   Thu Jul 2 16:41:22 2020 +0000
+
+    meson: Make Requires in .pc files match autotools
+    
+    Libreoffice tries to use only harfbuzz-icu.pc and assumes this includes
+    -lharfbuzz.
+
+ src/meson.build | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 4db1b4f1a266b4b26ad0c445691abcc634a23ab8
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jul 4 15:02:19 2020 +0430
+
+    [tests] rename no_ft_funcs to NO_FT_FUNCS
+
+ test/shaping/meson.build  | 4 +---
+ test/shaping/run-tests.py | 2 +-
+ 2 files changed, 2 insertions(+), 4 deletions(-)
+
+commit 6a2b0ba78a88c92b8fe2fcb2c4dd73289fce236f
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jul 4 14:45:15 2020 +0430
+
+    [py] minor, replace exit with sys.exit
+
+ src/gen-harfbuzzcc.py      | 2 +-
+ src/gen-ragel-artifacts.py | 4 ++--
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit a07672d353a943d7133bc545bb4b9f0189e9d4d8
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jul 4 14:12:55 2020 +0430
+
+    [py] minor, replace os.environ.get with os.getenv
+
+ src/check-c-linkage-decls.py                     |  6 +++---
+ src/check-externs.py                             |  4 ++--
+ src/check-header-guards.py                       |  6 +++---
+ src/check-includes.py                            |  6 +++---
+ src/check-libstdc++.py                           |  4 ++--
+ src/check-static-inits.py                        |  4 ++--
+ src/check-symbols.py                             |  4 ++--
+ src/gen-def.py                                   |  2 +-
+ test/fuzzing/run-draw-fuzzer-tests.py            | 12 ++++++------
+ test/fuzzing/run-shape-fuzzer-tests.py           | 12 ++++++------
+ test/fuzzing/run-subset-fuzzer-tests.py          | 12 ++++++------
+ test/shaping/data/aots/update.py                 |  2 +-
+ test/shaping/data/text-rendering-tests/update.py |  2 +-
+ write-tarball-revision.py                        |  4 ++--
+ 14 files changed, 40 insertions(+), 40 deletions(-)
+
+commit 43e3ab019c6b6ab8e429b3dd3aa13a7b9e8316e6
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jul 2 17:34:24 2020 +0430
+
+    [tests] make tests work when ft isn't present
+
+ test/shaping/meson.build  |  8 ++++++++
+ test/shaping/run-tests.py | 31 ++++++++++++++++++-------------
+ 2 files changed, 26 insertions(+), 13 deletions(-)
+
+commit c4b6bad73ae71c6372c97b9a2bb443138e1461b4
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jul 2 18:07:01 2020 +0430
+
+    [tests] revert da95a8c and use the shared hb-shape process
+
+ test/shaping/run-tests.py | 40 +++++++++++++---------------------------
+ 1 file changed, 13 insertions(+), 27 deletions(-)
+
+commit 359dbc97ae610a78759fb9dbad1b89ee2540cdf0
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jul 4 12:28:06 2020 +0430
+
+    [meson] Use the recommended way to generate harfbuzz.cc
+    
+    As https://github.com/harfbuzz/harfbuzz/pull/2532
+
+ src/gen-harfbuzzcc.py | 24 ++++++++++--------------
+ src/meson.build       | 14 +++++++-------
+ 2 files changed, 17 insertions(+), 21 deletions(-)
+
+commit a7e82e4ffdc377a2c18001beca36b5ebf0f08daa
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jul 4 12:04:41 2020 +0430
+
+    [meson] use the recommended way to generate hb-version.h
+    
+    As https://github.com/harfbuzz/harfbuzz/pull/2532
+
+ src/gen-hb-version.py      | 40 ++++++++++++++++++----------------------
+ src/gen-ragel-artifacts.py |  4 +++-
+ src/meson.build            |  3 ++-
+ 3 files changed, 23 insertions(+), 24 deletions(-)
+
+commit 404ecc252c7f8af6bc071e7b0823c7d406be6e3b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jul 4 03:13:32 2020 +0430
+
+    [meson] use basename in check scripts now that meson passes dir also
+
+ src/check-c-linkage-decls.py | 4 ++--
+ src/check-externs.py         | 2 +-
+ src/check-header-guards.py   | 4 ++--
+ src/check-includes.py        | 4 ++--
+ src/meson.build              | 4 ++--
+ 5 files changed, 9 insertions(+), 9 deletions(-)
+
+commit 785a9a8f8ae9c8f88d7dc38d1ed1dae4d5896877
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jul 4 02:08:30 2020 +0430
+
+    [meson] use the recommended way to generate ragel headers
+    
+    As described in https://github.com/mesonbuild/meson/issues/7156#issuecomment-629622827
+
+ src/gen-harfbuzzcc.py      |  2 +-
+ src/gen-ragel-artifacts.py | 45 ++++++++----------------
+ src/meson.build            | 87 +++++++++++++++++++++++++++-------------------
+ 3 files changed, 66 insertions(+), 68 deletions(-)
+
+commit 5c07c291c74050bfa74a661c1e3a9a753b1f221c
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jul 4 04:33:46 2020 +0430
+
+    [make] use sed the way autotools used to generate hb-version.h
+    
+    Left from 1853f84 and now exactly is like 4fc6189a329c
+
+ src/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 63322513e42193ee27f3f50c90f9e6e0781fea78
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jul 4 03:34:58 2020 +0430
+
+    [make] Revert the way harfbuzz.cc and hb-version.h are generated
+    
+    Partially reverts 4fc6189
+
+ src/Makefile.am | 14 +++++++++++---
+ 1 file changed, 11 insertions(+), 3 deletions(-)
+
+commit 1853f84abc64ed9dee6ef913760b0295c36a4ef5
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jul 3 15:14:10 2020 +0430
+
+    [py] overwrite harfbuzz.cc only when there is a needed change
+
+ src/gen-harfbuzzcc.py | 12 ++++++++----
+ 1 file changed, 8 insertions(+), 4 deletions(-)
+
+commit 82c6ddb986b2fe5333a92cb27526d7639972f905
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jul 3 15:09:10 2020 +0430
+
+    [py] remove not needed imports
+
+ src/gen-emoji-table.py       | 1 -
+ src/gen-harfbuzzcc.py        | 2 +-
+ src/gen-hb-version.py        | 2 +-
+ src/gen-indic-table.py       | 1 -
+ src/gen-ragel-artifacts.py   | 2 +-
+ src/gen-ucd-table.py         | 2 +-
+ src/gen-use-table.py         | 1 -
+ src/gen-vowel-constraints.py | 2 --
+ 8 files changed, 4 insertions(+), 9 deletions(-)
+
+commit 38fa924904d9d9bb08a4371c5ee48fd3833c3ed7
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jul 3 11:44:44 2020 +0430
+
+    [meson] revert 020b182 as meson fails when there is cyclic dependency
+
+ meson.build | 6 ------
+ 1 file changed, 6 deletions(-)
+
+commit 42d039cc995f8b895dc3294e8888a45863e35c10
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jul 3 04:32:32 2020 +0430
+
+    [meson] minor
+
+ meson.build     | 13 ++++---------
+ src/meson.build |  6 ++----
+ 2 files changed, 6 insertions(+), 13 deletions(-)
+
+commit f2a80ab2c2ee2631ac4d12f10e2dd591e6cfb8c9
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jul 3 04:28:08 2020 +0430
+
+    [meson] use null_dep idiom
+
+ meson.build     | 15 ++++++++-------
+ src/meson.build |  4 ++--
+ 2 files changed, 10 insertions(+), 9 deletions(-)
+
+commit 05ab073d9b252e39a3fc4bf60c86827045d3000f
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jul 2 23:54:09 2020 +0430
+
+    [meson] Improve the way cairo-ft availability is checked
+
+ meson.build | 17 +++++++++--------
+ 1 file changed, 9 insertions(+), 8 deletions(-)
+
+commit d5439232946333b60f655d9ed37ec7dadf439287
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jul 2 01:30:24 2020 +0430
+
+    [fvar] minor
+
+ src/hb-ot-var-fvar-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit aadcd3ed8af0ca8eac77a4aacd746be703d55a15
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jul 1 14:31:33 2020 +0430
+
+    [meson] use dependency's has_headers to make pulled cairo has ft support
+
+ meson.build | 18 ++++++------------
+ 1 file changed, 6 insertions(+), 12 deletions(-)
+
+commit 020b182c790ec7f401236b5cc595e3f186942d96
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jul 1 14:22:46 2020 +0430
+
+    [meson] try freetype without harfbuzz just as a last resort
+
+ meson.build | 15 +++++++++++----
+ 1 file changed, 11 insertions(+), 4 deletions(-)
+
+commit 01fa55e88fc03374214a961b9ced089d6812358f
+Author: Xavier Claessens <xavier.claessens@collabora.com>
+Date:   Wed Jun 24 15:56:09 2020 -0400
+
+    meson: Allow freetype and cairo subprojects to fail
+    
+    If their respective option is set to 'auto' configuration of the
+    fallback subproject should be allowed to fail for any reason.
+
+ meson.build | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit 00c652adab5e1be9a3c35a0cc60f1684ca6bb81b
+Author: Xavier Claessens <xavier.claessens@collabora.com>
+Date:   Wed Jun 24 14:11:32 2020 -0400
+
+    meson: Fallback to cairo subproject when option is 'auto'
+
+ meson.build | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit 571365df335f03f9fe0c9593f60db8226bd6d2ef
+Author: Xavier Claessens <xavier.claessens@collabora.com>
+Date:   Wed Jun 24 14:11:07 2020 -0400
+
+    meson: Simplify check for cairo library and headers
+
+ meson.build | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+commit c4bbe89b53570025f00d2302e56e1396229716ad
+Author: Xavier Claessens <xavier.claessens@collabora.com>
+Date:   Wed Jun 24 13:40:55 2020 -0400
+
+    meson: Fallback to freetype2 subproject when option is 'auto'
+    
+    But disable harfbuzz support when configuring freetype2 subproject to
+    avoid dependency cycle.
+
+ meson.build | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 33252ce5761a997c23da2b05bc95e7e5b0be6e35
+Author: Xavier Claessens <xavier.claessens@collabora.com>
+Date:   Wed Jun 24 13:40:32 2020 -0400
+
+    meson: Simplify check for freetype2 library and headers
+
+ meson.build | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+commit 40ec187dec07e97ed4004b9831e7be844e6e7948
+Author: Hugo Beauzée-Luyssen <hugo@beauzee.fr>
+Date:   Fri Apr 24 14:01:07 2020 +0200
+
+    win32: Cleanup PARTITION handling
+    
+    Use the WINAPI_PARTITION macro to filter desktop/app flavors.
+    We use a negated desktop check because the default (for mingw-w64 at
+    least) is to allow all API by combining desktop + app partitions.
+    This causes build failures if we were to filter using
+    WINAPI_PARTITION(WINAPI_FAMILY_APP) because it would always be true, but
+    those API also require Windows 8 or later, while we only require Vista
+    
+    Fixes warnings like
+    ../src/hb-blob.cc:572:47: warning: 'WINAPI_FAMILY_PC_APP' is not defined, evaluates to 0 [-Wundef]
+     #if defined(WINAPI_FAMILY) && (WINAPI_FAMILY==WINAPI_FAMILY_PC_APP || WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP)
+                                                  ^
+    ../src/hb-blob.cc:572:86: warning: 'WINAPI_FAMILY_PHONE_APP' is not defined, evaluates to 0 [-Wundef]
+     #if defined(WINAPI_FAMILY) && (WINAPI_FAMILY==WINAPI_FAMILY_PC_APP || WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP)
+
+ src/hb-blob.cc  |  6 +++---
+ src/hb-mutex.hh |  3 +--
+ src/hb.hh       | 10 +++++++---
+ 3 files changed, 11 insertions(+), 8 deletions(-)
+
+commit f3f9205fac1580085d0d0a0f76cdb258e6536a78
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jul 1 03:01:25 2020 +0430
+
+    [meson] Assume cairo_ft always available when cairo isn't from pkgconfig
+
+ meson.build | 18 ++++++++++++------
+ 1 file changed, 12 insertions(+), 6 deletions(-)
+
+commit aa8bade97eb9280f53ef0f235b930ed883c4fd5e
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jul 1 01:30:13 2020 +0430
+
+    [meson] enable cairo as subproject
+
+ .ci/build-win32.sh             |  2 +-
+ subprojects/.gitignore         |  5 ++++-
+ subprojects/cairo.wrap         |  5 +++++
+ subprojects/libpng.wrap        | 10 ++++++++++
+ subprojects/pixman.wrap        |  6 ++++++
+ subprojects/proxy-libintl.wrap |  2 +-
+ 6 files changed, 27 insertions(+), 3 deletions(-)
+
+commit ea8e784146664f807dc19a6273dc7651627a06ff
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Jun 30 12:54:29 2020 +0430
+
+    [fvar] Improve naming
+
+ src/hb-ot-var-fvar-table.hh | 20 ++++++++++----------
+ 1 file changed, 10 insertions(+), 10 deletions(-)
+
+commit 5de07b8acd226d2e3152d9890afb2117002c3716
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Jun 30 11:08:42 2020 +0430
+
+    [fvar] Move normalize logic where it is actually filled
+
+ src/hb-ot-var-fvar-table.hh | 62 ++++++++++++++++++++++++---------------------
+ 1 file changed, 33 insertions(+), 29 deletions(-)
+
+commit 0f8dda2cf2c73e9f0feec8375bac4c434c62b205
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Jun 30 10:53:12 2020 +0430
+
+    [fvar] Move shared axis filling values into a new method
+
+ src/hb-ot-var-fvar-table.hh | 19 +++++++++++--------
+ 1 file changed, 11 insertions(+), 8 deletions(-)
+
+commit 98c42b3bc72079a335937e5cee84fb5d6e8677da
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Jun 30 10:48:36 2020 +0430
+
+    [fvar] Make AxisRecord fields protected
+
+ src/hb-ot-var-fvar-table.hh | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit 5f870dfadb6ce3f85e5289131c4291cda31706c6
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jun 29 02:22:02 2020 +0430
+
+    [meson] Make benchmark buildable also in dists
+
+ Makefile.am | 14 ++++++++++++++
+ 1 file changed, 14 insertions(+)
+
+commit 702847aadd6f46a37a79b66b088b1ccaba401010
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jun 29 00:39:43 2020 +0430
+
+    [meson] Turn benchmark to a feature
+
+ .circleci/config.yml           | 2 +-
+ .github/workflows/linux-ci.yml | 2 +-
+ meson.build                    | 5 ++++-
+ meson_options.txt              | 2 +-
+ 4 files changed, 7 insertions(+), 4 deletions(-)
+
+commit 7ee3194f9825e988716d760c0c765b7af2a10639
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jun 28 15:41:44 2020 -0700
+
+    [meta] Remove wrong comment
+
+ src/hb-meta.hh | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 26b9670d996465161964bf1a0a7c4ecf2bf2212e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jun 28 14:52:15 2020 -0700
+
+    [ft] Better handle allocation failures
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2513
+
+ src/hb-ft.cc | 15 +++++----------
+ 1 file changed, 5 insertions(+), 10 deletions(-)
+
+commit 26111a11ad1a648f8075b5289c05c48126cc2d3f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jun 28 02:59:47 2020 -0700
+
+    [dagger] Minor cleanup using hb_enumerate
+
+ src/hb-ot-layout-gsubgpos.hh | 18 +++++++++++-------
+ 1 file changed, 11 insertions(+), 7 deletions(-)
+
+commit fd8b0a44c4768be62d162fee0a681ab9a8be7970
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jun 29 00:19:38 2020 +0430
+
+    [ci] Limit number of processes ninja uses
+    
+    Our CricleCI bots run with 32 cores last time I check which makes random compile issues
+    like this https://circleci.com/gh/harfbuzz/harfbuzz/146030 to happen. Guess that has
+    something to do with the way virtualization is done in Circle CI so let's limit number of processes.
+
+ .circleci/config.yml | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 831b09000120ce5b9c448d156e6f099011bfd10d
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Jun 28 14:31:21 2020 +0430
+
+    rebase draw test as recent roundf changes
+
+ test/api/test-draw.c | 145 ++++++++++++++++++++++++++-------------------------
+ 1 file changed, 73 insertions(+), 72 deletions(-)
+
+commit cb7fb3cf4a018d6d8eafd2584c7f6934e1413324
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Jun 28 13:41:33 2020 +0430
+
+    Add test for a783840789c93add42e4d70fdb407eb4ad6e062e
+
+ test/shaping/data/in-house/Makefile.sources              |   1 +
+ test/shaping/data/in-house/fonts/HBTest-VF.ttf           | Bin 0 -> 1128 bytes
+ test/shaping/data/in-house/meson.build                   |   1 +
+ .../data/in-house/tests/variations-rounding.tests        |   2 ++
+ 4 files changed, 4 insertions(+)
+
+commit 1536271f6b4940eb0a4f28e406bfc96f00d1293d
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Jun 28 13:35:13 2020 +0430
+
+    Don't check roundf availability in cmake and meson
+
+ CMakeLists.txt | 2 +-
+ meson.build    | 1 -
+ 2 files changed, 1 insertion(+), 2 deletions(-)
+
+commit 08d57d9eca94c3695a495be504e9e63b6ad1aa59
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Jun 28 13:13:25 2020 +0430
+
+    Add hb_array_t::lfind
+
+ src/hb-array.hh             | 25 ++++++++++++++++---------
+ src/hb-open-type.hh         |  6 ++++++
+ src/hb-ot-stat-table.hh     | 17 ++---------------
+ src/hb-ot-var-fvar-table.hh | 26 ++++++++------------------
+ src/hb-vector.hh            |  3 +++
+ 5 files changed, 35 insertions(+), 42 deletions(-)
+
+commit a783840789c93add42e4d70fdb407eb4ad6e062e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jun 27 22:23:59 2020 -0700
+
+    Always round up
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2496
+
+ configure.ac | 2 +-
+ src/hb.hh    | 9 ++-------
+ 2 files changed, 3 insertions(+), 8 deletions(-)
+
+commit ca8202208a09376d061f50a8b400f5e276d8da06
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Jun 28 11:34:01 2020 +0430
+
+    [ci] retire psvita and djgpp bots
+    
+    till update and overhaul
+
+ .circleci/config.yml | 27 ---------------------------
+ 1 file changed, 27 deletions(-)
+
+commit 2267da4ee0d7cafe8f00d94e7a4d48179e3d28b5
+Author: Sebastian Rasmussen <sebras@gmail.com>
+Date:   Sun Jun 28 11:18:16 2020 +0800
+
+    [ft] Do not deference ft_font if it is nullptr (#2502)
+
+ src/hb-ft.cc | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit a373e16131ecc79be47edaaddc528efc6b411752
+Author: Sebastian Rasmussen <sebras@gmail.com>
+Date:   Sun Jun 28 11:09:45 2020 +0800
+
+    [ot-shape] Free shape plan maps upon error creating data (#2497)
+
+ src/hb-ot-shape.cc | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit dbf9896e7aded3693a6e2080fa51b142a682a1f3
+Author: Sebastian Rasmussen <sebras@gmail.com>
+Date:   Sun Jun 28 10:57:34 2020 +0800
+
+    [ft] Handle nullptr when destroying freetype font (#2494)
+
+ src/hb-ft.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 20d1fa3671134de585df993ab1ec9fc46a74634d
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jun 25 12:50:46 2020 +0430
+
+    [perf] fix the build
+
+ perf/perf-draw.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 76ba619daa2a3e01a37528270774f9011ea42d53
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Jun 23 20:49:43 2020 +0430
+
+    Fix autotools's harfbuzz.cc build
+    
+    How this works? gen-harfbuzzcc.py operates at its own source path (see its 7th line)
+    and that is reliable when used both on meson and autotools.
+    
+    Just like 19ecabed, weirdly this didn't come up sooner, guess it has something
+    to do with timestamps. Fortunately whole harfbuzz.cc just doesn't matter for
+    packagers but we can tag a release only for this if needed.
+
+ src/Makefile.am | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 95b1081be432e18642b889c8d3960ddac8ae643b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Jun 9 17:37:36 2020 +0430
+
+    Add performance benchmark for shaping, get extents and draw
+
+ .circleci/config.yml              |   4 +-
+ .github/workflows/linux-ci.yml    |  19 +++++-
+ meson.build                       |   4 ++
+ meson_options.txt                 |   2 +
+ perf/meson.build                  |   9 +++
+ perf/perf-draw.hh                 | 128 ++++++++++++++++++++++++++++++++++++++
+ perf/perf-extents.hh              |  65 +++++++++++++++++++
+ perf/perf-shaping.hh              |  65 +++++++++++++++++++
+ perf/perf.cc                      |  15 +++++
+ subprojects/.gitignore            |   1 +
+ subprojects/google-benchmark.wrap |   8 +++
+ 11 files changed, 318 insertions(+), 2 deletions(-)
+
+commit 12a9d572925a324be376440a1a26758eff832bcf
+Author: Sebastian Rasmussen <sebras@gmail.com>
+Date:   Wed Jun 24 03:25:43 2020 +0800
+
+    [face] Destroy blob if face closure can not be created (#2490)
+    
+    This fixes issue #2489.
+
+ src/hb-face.cc | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+commit 53b0a183c7a40cd208b893ffd02fb4ba54137fc1
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jun 22 18:04:01 2020 +0430
+
+    Remove concept of stable/unstable from build tools
+    
+    We never practiced the concept of stable and unstable releases, let's
+    remove the code and always use the stable scheme.
+
+ configure.ac    | 11 +----------
+ meson.build     |  9 +--------
+ src/meson.build |  2 +-
+ 3 files changed, 3 insertions(+), 19 deletions(-)
+
+commit e4203c14699cc0903a2b4611167a7b99532cfdb0
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jun 22 05:03:27 2020 +0430
+
+    2.6.8
+
+ NEWS                | 13 +++++++++++++
+ configure.ac        |  2 +-
+ meson.build         |  2 +-
+ src/hb-ot-layout.cc |  2 +-
+ src/hb-version.h    |  4 ++--
+ 5 files changed, 18 insertions(+), 5 deletions(-)
+
+commit 8c84fee2e568c7b0a1852a7dad26386bbf6a9d0b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jun 22 04:04:40 2020 +0430
+
+    Update build systems status messages
+
+ CMakeLists.txt |  2 +-
+ configure.ac   | 11 +++++++++++
+ meson.build    |  2 +-
+ 3 files changed, 13 insertions(+), 2 deletions(-)
+
+commit e541fb474cc948659855dee9374946829de14581
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Jun 21 09:49:48 2020 +0430
+
+    minor, replace single hb_apply daggers with foreach
+
+ src/hb-map.hh           | 10 ++++------
+ src/hb-ot-hmtx-table.hh | 36 +++++++++++++++++-------------------
+ src/hb-ot-math-table.hh | 15 ++++++---------
+ 3 files changed, 27 insertions(+), 34 deletions(-)
+
+commit 8bca9a420e1fcf460e2f3c115fbf7541c81abd9d
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Jun 21 09:18:12 2020 +0430
+
+    [fvar] minor
+
+ src/hb-ot-var-fvar-table.hh | 19 ++++++++-----------
+ 1 file changed, 8 insertions(+), 11 deletions(-)
+
+commit b5ae8eab44e92089a184d1901758aac6650eeab0
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Jun 21 08:51:46 2020 +0430
+
+    [ci] raise msan bot subset timeout
+
+ .circleci/config.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 82ec9ef2e9c1a2c148b0fc7f91a2ca2c2a064ef5
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Jun 21 01:36:16 2020 +0430
+
+    [fvar] minor simplification
+
+ src/hb-ot-var-fvar-table.hh | 10 ++++------
+ 1 file changed, 4 insertions(+), 6 deletions(-)
+
+commit 4e37c48e375f3721157e919497a7114bdcb0d454
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jun 20 23:57:45 2020 +0430
+
+    [fvar] Remove get_axis_info and get_axis_deprecated
+
+ src/hb-ot-var-fvar-table.hh | 22 ++++++++--------------
+ 1 file changed, 8 insertions(+), 14 deletions(-)
+
+commit 61c240f39963064852a2e58fc42897351e37d8b5
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jun 20 13:24:32 2020 +0430
+
+    [fvar] Push _axis_info fill logic deeper
+
+ src/hb-ot-var-fvar-table.hh | 54 ++++++++++++++++++++++++---------------------
+ 1 file changed, 29 insertions(+), 25 deletions(-)
+
+commit 47a0fbec31c2e49a2b895f6f926bf755820cacab
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Jun 21 02:34:59 2020 +0430
+
+    [meson] Mark longer tests with slow
+    
+    So one can skip them easily by `meson test -Cbuild --no-suite slow`
+
+ src/meson.build          | 2 +-
+ test/fuzzing/meson.build | 4 ++--
+ test/subset/meson.build  | 2 +-
+ 3 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 47dedc7500843ac9c5a036621a7a65e1b1861a58
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Jun 21 01:54:57 2020 +0430
+
+    [ci] increase tsan and ubsan subset fuzzer timeout
+    
+    as https://circleci.com/gh/harfbuzz/harfbuzz/144966 and https://circleci.com/gh/harfbuzz/harfbuzz/144970
+
+ .circleci/config.yml | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit b2d0dba5ef2ea9530c9c0d2a8ed33849a59b56f8
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jun 20 12:07:42 2020 +0430
+
+    [cpal] Port to dagger
+
+ src/hb-ot-color-cpal-table.hh | 9 +++------
+ 1 file changed, 3 insertions(+), 6 deletions(-)
+
+commit 08816117788491a989888c30b9676bc8d7849f96
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jun 20 01:02:50 2020 +0430
+
+    [fuzzer] Make some use for test_font API calls
+    
+    Making some use for result of some of the test_font calls to make
+    sure compilers in fuzzers aren't just optimizing the calls.
+
+ test/api/test-ot-face.c         | 42 +++++++++++++++++++++++++----------------
+ test/fuzzing/hb-shape-fuzzer.cc |  8 ++++----
+ 2 files changed, 30 insertions(+), 20 deletions(-)
+
+commit b4f34539c26561e35eaa09160784e07cec6b1b9c
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jun 20 00:47:00 2020 +0430
+
+    [fuzzer] test more of ot-layout APIs
+
+ test/api/test-ot-face.c | 17 +++++++++++++++++
+ 1 file changed, 17 insertions(+)
+
+commit a6bcc577a9062c875854305aeebe4e90a9abe5f7
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jun 20 14:19:12 2020 +0430
+
+    [meson] don't `add_dist_script` when we are subproject
+    
+    Happens when harfbuzz is used as a meson subproject,
+      `ERROR: add_dist_script may not be used in a subproject.`
+
+ meson.build | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 175d93bbdaaf4640eb41baed2698fe0e2ee78831
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jun 20 14:03:10 2020 +0430
+
+    [mesos/docs] fix gobject headers ignoring logic
+    
+    fixes #2463
+
+ docs/meson.build | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 25cf6874430afdb9bf93fcb7f92ae4c11f51be89
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jun 20 01:36:50 2020 +0430
+
+    Use dagger in OffsetTable::get_table_tags (#2477)
+
+ src/hb-open-file.hh | 13 ++++---------
+ 1 file changed, 4 insertions(+), 9 deletions(-)
+
+commit dce4353f86fe9c5e1b62194b89c844ba5da86143
+Merge: 89a2c46e6 d38eb49f4
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jun 20 01:24:41 2020 +0430
+
+    Merge pull request #2476 from ebraminio/cv-get-chars
+    
+    [layout] Use dagger in hb_ot_layout_feature_get_characters
+
+commit 89a2c46e6198f188393415151620f6fb5f160e11
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jun 20 00:31:46 2020 +0430
+
+    [math] Use dagger (#2478)
+    
+    * [math] Use dagger
+    
+    * [ot-math] Address Behdad's review
+
+ src/hb-ot-math-table.hh | 20 +++++++++-----------
+ 1 file changed, 9 insertions(+), 11 deletions(-)
+
+commit d38eb49f46a3381c7930568b4bfb35af4052c0f9
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jun 19 23:40:42 2020 +0430
+
+    Move the iteration logic to FeatureParamsCharacterVariants
+    
+    Hopefully I can make members protected also.
+
+ src/hb-ot-layout-common.hh | 12 ++++++++++++
+ src/hb-ot-layout.cc        | 15 ++++-----------
+ 2 files changed, 16 insertions(+), 11 deletions(-)
+
+commit 9b3d4f457ef0010a1bd3f0a8186f886f2499f688
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jun 19 23:33:07 2020 +0430
+
+    Use dagger in hb_ot_layout_feature_get_characters
+    
+    The way it used to work was a bit nonidiomatic but the replacment
+    is idiomatic way of iterating used elsewhere.
+    
+    The new code just doesn't check nullability of "characters", which isn't
+    what we do anywhere else.
+
+ src/hb-ot-layout.cc | 10 ++++------
+ 1 file changed, 4 insertions(+), 6 deletions(-)
+
+commit 675854b2bac03612ef7f5bd406a7ff7207b89b59
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jun 19 23:27:39 2020 +0430
+
+    [test] Add one more test for hb_ot_layout_feature_get_characters
+
+ test/api/test-ot-name.c | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+commit 63422c4cbc4cb53a19f3986b3c20312c1085b29f
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jun 19 23:24:04 2020 +0430
+
+    [ot-layout] simplify
+
+ src/hb-ot-layout.cc | 11 +++--------
+ 1 file changed, 3 insertions(+), 8 deletions(-)
+
+commit 407bba3e0d591a5708955e76ae914aa67198044e
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jun 19 23:12:42 2020 +0430
+
+    minor
+    
+    move FeatureParamsCharacterVariants::sanitize method right above members
+
+ src/hb-ot-layout-common.hh | 14 +++++++-------
+ 1 file changed, 7 insertions(+), 7 deletions(-)
+
+commit f1488152bd47d4434532226d94f1be38c24ac735
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jun 19 23:07:28 2020 +0430
+
+    [doc] Remove the not needed comment
+    
+    All the other similar iterating API are like this and don't have such
+    comment, written at the time I wasn't familiar enough with the way such
+    API are shaped.
+
+ src/hb-ot-layout.cc | 6 ------
+ 1 file changed, 6 deletions(-)
+
+commit 1535440b48a081cea04cffb7f12cd63c197ae9d4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 19 08:30:59 2020 -0700
+
+    [dispatch] Fix debug builds
+
+ src/hb-aat-layout-common.hh  | 1 -
+ src/hb-aat-layout.cc         | 3 +--
+ src/hb-dispatch.hh           | 3 ++-
+ src/hb-ot-layout-common.hh   | 2 --
+ src/hb-ot-layout-gsubgpos.hh | 6 +-----
+ src/hb-sanitize.hh           | 2 --
+ src/hb-subset.hh             | 4 +---
+ 7 files changed, 5 insertions(+), 16 deletions(-)
+
+commit bb9a40da653b5bab595f79de76a8feda18cb1b5c
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jun 19 19:22:47 2020 +0430
+
+    [lcar] Use dagger
+
+ src/hb-aat-layout-lcar-table.hh | 23 +++++++++++++----------
+ 1 file changed, 13 insertions(+), 10 deletions(-)
+
+commit 6fbb59aba6680225d13a6c3e0ba7d033096e6c55
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jun 18 15:12:37 2020 -0700
+
+    Use daggers in a few get_array functions
+    
+    As I review https://github.com/harfbuzz/harfbuzz/pull/2471
+
+ src/hb-ot-layout-common.hh     | 21 +++++++++++----------
+ src/hb-ot-layout-gdef-table.hh |  7 +++----
+ 2 files changed, 14 insertions(+), 14 deletions(-)
+
+commit a512ca8eae70710974e845062305d73bf4012466
+Merge: 03bd3efaa 70d6696cc
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jun 19 10:46:12 2020 +0430
+
+    Merge pull request #2473 from harfbuzz/gsub-alternate
+    
+    fixes #673
+
+commit 03bd3efaa7072021b702ab3f4ce8abcd1ac47d46
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jun 19 10:32:46 2020 +0430
+
+    [meson] Write git revision to .tarball-revision on dist tarball
+
+ Makefile.am               |  1 +
+ meson.build               |  2 ++
+ write-tarball-revision.py | 13 +++++++++++++
+ 3 files changed, 16 insertions(+)
+
+commit 70d6696cc6c863673a580b3bfc79d16d3a5d393d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jun 18 17:09:39 2020 -0700
+
+    [dispatch] Don't require debug_depth for untraced objects
+
+ src/hb-dispatch.hh           |  1 +
+ src/hb-ot-layout-common.hh   |  4 +---
+ src/hb-ot-layout-gsubgpos.hh | 20 ++++----------------
+ src/hb-ot-layout.cc          |  4 +---
+ 4 files changed, 7 insertions(+), 22 deletions(-)
+
+commit 5bc4cedde67854ecda72305d839c7e7ad297e83e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jun 18 17:04:35 2020 -0700
+
+    Rename
+
+ src/hb-ot-layout.cc | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit dc492d7c8a49f0c0322848348d35ac8b818fce57
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jun 18 17:03:05 2020 -0700
+
+    [dispatch] Comment
+
+ src/hb-ot-layout-gsubgpos.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 25aec0265c1a1030c7d6453e85b2463589c8688a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jun 18 16:58:01 2020 -0700
+
+    [dispatch] Default return type to hb_empty_t
+
+ src/hb-dispatch.hh           | 2 +-
+ src/hb-ot-layout-common.hh   | 2 +-
+ src/hb-ot-layout-gsubgpos.hh | 8 ++++----
+ 3 files changed, 6 insertions(+), 6 deletions(-)
+
+commit 8d0a90ac1bd9f6485d3e0fead7c648caa735eb81
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jun 18 16:53:54 2020 -0700
+
+    [dispatch] Default debug level to 0
+
+ src/hb-dispatch.hh           |  2 +-
+ src/hb-ot-layout-common.hh   |  2 +-
+ src/hb-ot-layout-gsubgpos.hh | 14 +++++++-------
+ src/hb-ot-layout.cc          |  2 +-
+ 4 files changed, 10 insertions(+), 10 deletions(-)
+
+commit d7d8604ec8526f96618b4f0f83ed9b3204e7b597
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jun 18 16:51:01 2020 -0700
+
+    Remove excessive trace routes
+
+ src/hb-debug.hh              | 4 ----
+ src/hb-ot-layout-gsubgpos.hh | 6 ++----
+ 2 files changed, 2 insertions(+), 8 deletions(-)
+
+commit e47a2ab8f8a90d903653a1d0d970c220f0957158
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jun 18 16:48:07 2020 -0700
+
+    Remove unused dispatcher names
+
+ src/hb-dispatch.hh           | 1 +
+ src/hb-ot-layout-common.hh   | 1 -
+ src/hb-ot-layout-gsubgpos.hh | 5 -----
+ src/hb-ot-layout.cc          | 1 -
+ 4 files changed, 1 insertion(+), 7 deletions(-)
+
+commit b2a1acccd9776beddb25fb4f9e24ca6e272958f4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jun 18 16:41:31 2020 -0700
+
+    Simplify get_glyph_alternates() dispatcher
+    
+    Trying to make it **very simple** to add a specialized dispatcher for
+    one API to be routed to just a few objects (one in this case).
+
+ src/hb-ot-layout-gsub-table.hh |  9 ++++++---
+ src/hb-ot-layout-gsubgpos.hh   | 40 ----------------------------------------
+ src/hb-ot-layout.cc            | 32 ++++++++++++++++++++++++++++++--
+ 3 files changed, 36 insertions(+), 45 deletions(-)
+
+commit ffe8d3f39d5a742e51f87b5af66a2a7e63c87037
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jun 18 16:31:39 2020 -0700
+
+    Use dispatch for get_glyph_alternates_t
+    
+    First time we do this in a way that if target object doesn't have the matching
+    function we basically "ignore".  Risky but I feel like is the right decision
+    for this case.
+    
+    I'm going to put back the template varargs and use those, which would make
+    the dispatcher be just that: "dispatcher", and wouldn't need to carry the
+    call context.  That would be a refreshing change I think.
+
+ src/hb-ot-layout-gsub-table.hh | 41 +++--------------------------------------
+ src/hb-ot-layout-gsubgpos.hh   | 39 +++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-layout.cc            |  5 ++++-
+ 3 files changed, 46 insertions(+), 39 deletions(-)
+
+commit bedf4171218ef7c64386aa492b574356277fc21f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jun 18 15:49:01 2020 -0700
+
+    Push get_glyph_alternates() work all the way down
+
+ src/hb-ot-layout-gsub-table.hh | 36 ++++++++++++------------------------
+ 1 file changed, 12 insertions(+), 24 deletions(-)
+
+commit 5bede33885a5349c05e0724e8ee6948af8a25670
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jun 18 15:25:19 2020 -0700
+
+    Whitespace
+
+ src/hb-ot-layout.cc | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit e13aaaaa4566c8aa1a790402b38448713c6621ab
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jun 18 15:22:54 2020 -0700
+
+    Move API to right place in header
+
+ src/hb-ot-layout.h | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+commit 26514ad70e4e96b862ff6bd63fb2a03e136e7620
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jun 18 15:22:07 2020 -0700
+
+    Fix API comment
+
+ src/hb-ot-layout.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 1bac85828c134835ce0a3ecd517aefdcecf43d9a
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jun 18 22:56:07 2020 +0430
+
+    [layout] Rename _get_alternates to _get_glyph_alternates
+
+ docs/harfbuzz-sections.txt     |  2 +-
+ src/hb-ot-layout-gsub-table.hh | 36 ++++++++++++++++++------------------
+ src/hb-ot-layout.cc            | 16 ++++++++--------
+ src/hb-ot-layout.h             | 12 ++++++------
+ test/api/test-ot-alternates.c  |  6 +++---
+ 5 files changed, 36 insertions(+), 36 deletions(-)
+
+commit 9ef9ac3749abdc814088571108760144b0f6f812
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 17 17:41:15 2020 -0700
+
+    [gpos] Break cycle-of-2 when cursive attaching
+    
+    Fix thinko this time around.
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2469
+
+ src/hb-ot-layout-gpos-table.hh | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit d3c169792ba4771b459c37a4430fab6f2dcbda5e
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jun 18 08:37:21 2020 +0430
+
+    [layout] move alternate buffer iteration logic to AlternateSet
+
+ src/hb-ot-layout-gsub-table.hh | 72 +++++++++++++++++++++++++++++++-----------
+ src/hb-ot-layout.cc            | 13 ++------
+ 2 files changed, 57 insertions(+), 28 deletions(-)
+
+commit 1348a2c865d368a4f6e83add0edfa9945d84914f
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Jun 16 21:05:16 2020 -0400
+
+    [layout] hb_ot_layout_lookup_get_alternates, a new API
+    
+    An API to retrieve one-to-one alternates from a given GSUB lookup index.
+
+ docs/harfbuzz-sections.txt     |  1 +
+ src/hb-ot-layout-gsub-table.hh | 30 ++++++++++++++++++++++++
+ src/hb-ot-layout.cc            | 37 +++++++++++++++++++++++++++++
+ src/hb-ot-layout.h             |  7 ++++++
+ test/api/Makefile.am           |  1 +
+ test/api/meson.build           |  1 +
+ test/api/test-ot-alternates.c  | 53 ++++++++++++++++++++++++++++++++++++++++++
+ 7 files changed, 130 insertions(+)
+
+commit a4955e21fdd4069cad6f519900b9ce130408581b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jun 18 08:59:49 2020 +0430
+
+    [ci] install gobject-instrospection on linux ci
+
+ .github/workflows/linux-ci.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 3fe719571362e39e70eb12ea9d7be9dabb505c4c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 17 17:51:08 2020 -0700
+
+    Revert "[gpos] Break cycle-of-2 when cursive attaching"
+    
+    This reverts commit 7090707de67e660ae626ecf774f6af8a63a692ab.
+
+ src/hb-ot-layout-gpos-table.hh | 6 ------
+ 1 file changed, 6 deletions(-)
+
+commit 7090707de67e660ae626ecf774f6af8a63a692ab
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 17 17:41:15 2020 -0700
+
+    [gpos] Break cycle-of-2 when cursive attaching
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2469
+
+ src/hb-ot-layout-gpos-table.hh | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit 09dedb1b382d0f2f8725ead891c27b87359c072c
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Thu Jun 18 02:29:12 2020 +0200
+
+    [tests] I’m an idiot
+
+ test/shaping/data/in-house/Makefile.sources                           | 1 +
+ test/shaping/data/in-house/meson.build                                | 1 +
+ test/shaping/data/in-house/tests/reverse-sub.tests                    | 1 +
+ test/shaping/texts/in-house/shaper-default/script-latin/misc/misc.txt | 1 -
+ 4 files changed, 3 insertions(+), 1 deletion(-)
+
+commit 2598855454b77b69633220e7e912b2ac82f450f9
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Thu Jun 18 02:15:59 2020 +0200
+
+    [tests] Add test for ReverseChainSingleSubstFormat1 missing substitute
+    
+    https://github.com/harfbuzz/harfbuzz/issues/2467
+
+ .../fonts/a706511c65fb278fda87eaf2180ca6684a80f423.ttf    | Bin 0 -> 924 bytes
+ .../in-house/shaper-default/script-latin/misc/misc.txt    |   1 +
+ 2 files changed, 1 insertion(+)
+
+commit e5de3918f7fbed754ff912c78bec8f9825b06d52
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 17 16:54:23 2020 -0700
+
+    [indic] Add comment
+    
+    https://github.com/harfbuzz/harfbuzz/issues/2298#issuecomment-615318654
+
+ src/hb-ot-shape-complex-indic.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 41ef75f64afc36a8d7d6ab8382dd2093ad86fc49
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 17 16:29:09 2020 -0700
+
+    [gsub] Don't substitute in ReverseChainSingleSubstFormat1 if missing substitute
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2467
+
+ src/hb-ot-layout-gsub-table.hh | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit e7c79e16b8cb0983ee9cfed478d721c75949e757
+Merge: f31e3d426 fe926970b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 17 15:32:40 2020 -0700
+
+    Merge pull request #2287 from simoncozens/instrumentation
+    
+    Add messages for GPOS/GSUB (take 2)
+
+commit fe926970bc16ee438fe74d8ee366393ed3576bd5
+Author: Simon Cozens <simon@simon-cozens.org>
+Date:   Tue Jun 16 09:12:44 2020 +0100
+
+    Reformat messages again
+    
+    Messages can be:
+    
+    start/end table  XXXX
+    start/end lookup NNNN
+    start/end subtable NNNN (for kerx/kern)
+    start/end chainsubtable NNNN (for morx)
+
+ src/hb-aat-layout-kerx-table.hh | 4 ++--
+ src/hb-aat-layout-morx-table.hh | 4 ++--
+ src/hb-ot-layout.cc             | 4 ++--
+ 3 files changed, 6 insertions(+), 6 deletions(-)
+
+commit f31e3d426dbbc096bca4892cbc2dc3f541a36d1d
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jun 12 17:33:11 2020 +0430
+
+    [ci] raise subset fuzzer timeout for asan and valgrind bots
+
+ .circleci/config.yml | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit cccdaf45df8a0664bc20c54055064460080ccbb8
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jun 12 11:15:37 2020 +0430
+
+    [docs] minor
+    
+    revealed now that we turned gobject/gir build to 'auto'
+
+ src/hb-ot-meta.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit be278acf44e862c5cf83a0ca118058e1cb61372d
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jun 12 01:46:23 2020 +0430
+
+    [ci] raise subset fuzzer cases runner timeout
+    
+    the bots are either not optimized ones or sanitizer ones so not much value
+    on trying to optimize them further.
+
+ .circleci/config.yml | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit b86bfe52915f61c0b1c228d967c42b14627fed5d
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jun 12 01:42:27 2020 +0430
+
+    minor, fix lists sorting
+
+ test/shaping/data/in-house/meson.build | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 4e7cb7e2c4b182e8062c3c0c9a15059bcfd40700
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jun 12 01:38:16 2020 +0430
+
+    minor, fix lists sorting
+
+ src/Makefile.sources                        |  6 +++---
+ src/meson.build                             |  6 +++---
+ test/shaping/data/in-house/Makefile.sources |  6 +++---
+ test/subset/data/Makefile.sources           | 18 +++++++++---------
+ 4 files changed, 18 insertions(+), 18 deletions(-)
+
+commit 973c47f6c9886cd2a50d29e09c978831b4e355f6
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Thu Jun 11 11:27:57 2020 -0700
+
+    [subset] Move 2 experimental public api methods to be private methods in GSUB/GPOS.
+    
+    2 methods are: hb_ot_layout_closure_lookups and hb_ot_layout_closure_features
+
+ docs/harfbuzz-sections.txt        |  2 --
+ src/gen-def.py                    |  4 +--
+ src/hb-ot-layout-gpos-table.hh    |  5 +++
+ src/hb-ot-layout-gsub-table.hh    |  5 +++
+ src/hb-ot-layout-gsubgpos.hh      | 15 +++++++++
+ src/hb-ot-layout.cc               | 66 ---------------------------------------
+ src/hb-ot-layout.h                | 14 ---------
+ src/hb-subset-plan.cc             | 35 ++++++++-------------
+ test/api/test-ot-face.c           |  6 ----
+ test/subset/data/Makefile.sources |  3 --
+ test/subset/meson.build           |  5 ---
+ 11 files changed, 39 insertions(+), 121 deletions(-)
+
+commit 62de2f749c16ebbb3908dba09e5dfcd670765140
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jun 11 19:09:24 2020 +0430
+
+    [meson] Remove spaces before named parameter colons
+    
+    meson documentations sometimes adds the space and sometimes don't and we
+    aren't adding it most of the times unconsciously so let's the cases and
+    be consistent.
+
+ meson.build       | 18 +++++++++---------
+ meson_options.txt | 10 +++++-----
+ 2 files changed, 14 insertions(+), 14 deletions(-)
+
+commit 2d91662294ebe8d4856342464243f0a9fa734702
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jun 11 19:04:08 2020 +0430
+
+    [meson] move tests lists to their directories
+    
+    We had to do so for text-rendering-tests list, let's apply the same for the rest also.
+
+ test/shaping/data/aots/Makefile.am     |   1 +
+ test/shaping/data/aots/meson.build     | 123 +++++++++++++++++++++
+ test/shaping/data/in-house/Makefile.am |   1 +
+ test/shaping/data/in-house/meson.build |  60 +++++++++++
+ test/shaping/meson.build               | 189 +--------------------------------
+ 5 files changed, 188 insertions(+), 186 deletions(-)
+
+commit b8454c3d61808bb85996d8e734cdb87e5be059ae
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jun 11 18:32:13 2020 +0430
+
+    [meson] use if blocks to separate different dependencies
+
+ meson.build | 106 ++++++++++++++++++++++++++++++++----------------------------
+ 1 file changed, 56 insertions(+), 50 deletions(-)
+
+commit 8571b3551c6bbb032503c7c301c13d3d961923b5
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jun 6 20:16:50 2020 +0430
+
+    [releasing] Remove tar signing procedure
+    
+    https://github.com/harfbuzz/harfbuzz/issues/2449#issuecomment-639898473
+
+ Makefile.am  | 11 -----------
+ RELEASING.md |  6 ++----
+ 2 files changed, 2 insertions(+), 15 deletions(-)
+
+commit ebab4b8658ed415b06d3014fca78e0e1c0bba5df
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jun 10 16:52:32 2020 +0430
+
+    [meson] Implement disabled state for cairo/freetype/icu
+    
+    'disabled' wasn't implemented for some of the features so they were
+    getting found even with explicit -Dfeature=disabled, this implements it.
+    
+    Run the following command to test this change and check whether 'disabled'
+    was actually effective,
+      meson build -Dglib=disabled -Dgobject=disabled -Dcairo=disabled -Dfontconfig=disabled -Dicu=disabled -Dfreetype=disabled -Dintrospection=disabled -Dgtk_doc=disabled
+    
+    This is useful when one wants to integrate harfbuzz into another project via
+    meson's subproject mechanism.
+
+ meson.build | 28 ++++++++++++++++++----------
+ 1 file changed, 18 insertions(+), 10 deletions(-)
+
+commit b88f1096ad88c8ee3a88b6d483387c4e6eab6f61
+Author: Nirbheek Chauhan <nirbheek@centricular.com>
+Date:   Tue Jun 9 20:06:50 2020 +0530
+
+    meson: Export symbols for a DLL when not building statically
+    
+    `default_library` might be 'both', in which case we will fail to link
+    when building with MSVC.
+
+ src/meson.build | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 5c8900efe43c0f408a8683bfd2be274cd0dac8c4
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Mon Jun 8 02:29:04 2020 +0200
+
+    [coretext] Properly check for macOS 10.10
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2452
+
+ src/hb-coretext.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 0151da23d605c7709d432ebfb17a337a5f662839
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jun 6 01:48:23 2020 +0430
+
+    [meson] Remove with_libstdcxx build option
+    
+    This was done in #770 but no indication of anyone is using it,
+    let's remove it from our meson port and we can just don't care about
+    it in autotools port after the migration to meson.
+
+ meson_options.txt |  2 --
+ src/meson.build   | 21 +++++----------------
+ 2 files changed, 5 insertions(+), 18 deletions(-)
+
+commit 56719474c208508220f24b78fd295d94564882fa
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 5 12:57:23 2020 -0700
+
+    s/blacklist/blocklist/g
+
+ src/hb-ot-layout-gdef-table.hh   | 4 ++--
+ src/hb-ot-layout-gpos-table.hh   | 2 +-
+ src/hb-ot-layout-gsub-table.hh   | 2 +-
+ src/hb-ot-layout-gsubgpos.hh     | 2 +-
+ src/hb-ot-layout.cc              | 8 ++++----
+ src/hb-ot-shape-complex-indic.cc | 2 +-
+ 6 files changed, 10 insertions(+), 10 deletions(-)
+
+commit 22048d55aa37acfe50a0f5ae7b361db8d323905e
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jun 5 04:09:07 2020 +0430
+
+    [meson] Add -Bsymbolic-functions
+
+ meson.build | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit e98aa0c89712d676f8db328a192cd19a009f28ce
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Jun 2 16:25:22 2020 +0430
+
+    [meson] Make gobject and introspection features automatic
+    
+    Meson doesn't have DISTCHECK_CONFIGURE_FLAGS like concept IIUC
+    and enabling them is the main thing we are doing with
+    distcheck flags anyway so lets turn them to auto.
+
+ meson_options.txt | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 65462c4b0bf4b1656bacc5377d248f53e9966fd0
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jun 5 01:08:08 2020 +0430
+
+    minor, improve the need for graphite comment
+
+ configure.ac | 2 +-
+ meson.build  | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 03bd6ead445b78560083caa22ce144058dcf4385
+Author: Christoph Reiter <reiter.christoph@gmail.com>
+Date:   Wed Jun 3 23:52:10 2020 +0200
+
+    [meson] Only pass required dependencies to everything
+    
+    Instead of passing dependencies as required we used one giant shared
+    dependency list containing all dependencies for every library/executable.
+    While this kinda works, the specified deps are also used for generating
+    the pkg-config files and this leads to lots of Requires.private and Libs.private
+    entries which aren't really needed.
+    
+    This removes the "deps" array and replaces it with a few smaller ones and
+    makes sure the public libraries only get passed the dependencies actually
+    needed.
+    
+    Fixes #2441
+
+ meson.build              | 29 ++++++++++-------------------
+ src/meson.build          | 24 ++++++++++++++++--------
+ test/api/meson.build     |  2 +-
+ test/fuzzing/meson.build |  1 -
+ util/meson.build         | 10 ++++++----
+ 5 files changed, 33 insertions(+), 33 deletions(-)
+
+commit 759df46575db49dd7d15da6e6df441d622e65470
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jun 4 15:49:54 2020 +0430
+
+    [style] Hide behind HB_EXPERIMENTAL_API compile flag
+
+ docs/harfbuzz-sections.txt |  6 ------
+ src/gen-def.py             |  1 +
+ src/hb-style.cc            | 40 ++++++++++++++++++++++++++++++++++++++--
+ src/hb-style.h             | 38 +++-----------------------------------
+ test/api/test-ot-face.c    |  2 ++
+ test/api/test-style.c      | 10 ++++++++++
+ 6 files changed, 54 insertions(+), 43 deletions(-)
+
+commit d54de56870d136e59b6239b9d1db023fe8f002ab
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Apr 21 16:33:50 2020 +0430
+
+    [style] Adopt with meson
+
+ src/meson.build      | 2 ++
+ test/api/meson.build | 1 +
+ 2 files changed, 3 insertions(+)
+
+commit de0ec5f4fef8730d10ca049c43991ede7ae42f6d
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Feb 8 14:09:09 2020 +0330
+
+    [style] give ptem value when asked for opsz
+    
+    ptem, used for AAT's tracking/`trak` table is equivalent to opsz of variable fonts.
+    
+    For variable AAT fonts, such as SFNS, ideally variable axis of the hb_font_t
+    should be set and equivalent to ptem, https://crbug.com/1005969#c37
+
+ src/hb-style.cc       | 3 +++
+ test/api/test-style.c | 3 +++
+ 2 files changed, 6 insertions(+)
+
+commit 22037499b42d9fce100ee771a229b961b5e1cb2d
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Aug 4 11:31:31 2019 +0430
+
+    [style] New experimental API, hb_style_get_value
+    
+    Searches variation axes of a hb_font_t object for a specific axis first,
+    if not set, then tries to get default style values from different
+    tables of the font.
+
+ docs/harfbuzz-sections.txt   |   6 ++
+ src/Makefile.sources         |   2 +
+ src/harfbuzz.cc              |   1 +
+ src/hb-config.hh             |   2 +-
+ src/hb-ot-face-table-list.hh |   5 +-
+ src/hb-ot-stat-table.hh      |  73 ++++++++++++++++++
+ src/hb-style.cc              | 110 +++++++++++++++++++++++++++
+ src/hb-style.h               |  75 ++++++++++++++++++
+ src/hb-subset-plan.cc        |   2 +-
+ src/hb.h                     |   1 +
+ test/api/Makefile.am         |   1 +
+ test/api/fonts/aat-fdsc.ttf  | Bin 0 -> 556 bytes
+ test/api/test-ot-face.c      |   6 ++
+ test/api/test-style.c        | 177 +++++++++++++++++++++++++++++++++++++++++++
+ 14 files changed, 457 insertions(+), 4 deletions(-)
+
+commit d67553d12fc72c4a89fcb75400829b62d53ca064
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jun 4 12:31:57 2020 +0430
+
+    [meson] fix with_libstdcxx effect
+    
+    oops
+
+ src/meson.build | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6f7048b917e7c81d276a7dc4a832a4cf042ffffe
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jun 4 10:18:35 2020 +0430
+
+    [meson] Update subset tests list from autotools
+
+ test/subset/meson.build | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 7e74aa6a7811ddb0999be5f33581d7933af6ba1c
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jun 4 09:32:20 2020 +0430
+
+    [ci] fix meson-gcc-mingw bot
+    
+    keep build folder for dist testing
+
+ .circleci/config.yml | 7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
+
+commit b35764334e1ddf11c9aa4d0b1d0f9b7467d79106
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jun 4 04:10:11 2020 +0430
+
+    [ci] check workability of meson based dist
+
+ .circleci/config.yml | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 6bf5e8e7e62620501b068230f398db1e9219f1b8
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jun 4 04:03:14 2020 +0430
+
+    [ci] Deploy only when there is something to push
+    
+    Apparently the previous version of gtk-doc was doing weird changes like https://github.com/harfbuzz/harfbuzz.github.io/commit/1b40da99bbd1985d060d273ef37f1ccad16913c4 and https://github.com/harfbuzz/harfbuzz.github.io/commit/d1d9bff14c805d1bcbd2446a4c22e633e8d365cf
+    in order to make every to have something for pushing and
+    now that we don't have such changes it will fail.
+    
+    Alternatively we can go for `git commit --allow-empty`, guess better to
+    pollute history of https://github.com/harfbuzz/harfbuzz.github.io however.
+
+ .ci/deploy-docs.sh | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+commit 029ecf326e75071a84609a7510a8d4e58182f3e9
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jun 4 03:31:15 2020 +0430
+
+    [meson] Fix gen-hb-version.py run
+    
+    It gets complicated apparently when executed in the dist process, let's use raw
+    names now that we are operating in the script folder anyway.
+
+ src/meson.build | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 870304df766f0518898a09cd191c1fb6d94240f7
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jun 4 03:19:53 2020 +0430
+
+    [meson] Remove amalgam build option
+    
+    Fixes #2444
+
+ .circleci/config.yml | 6 ++----
+ meson_options.txt    | 2 --
+ src/meson.build      | 9 +--------
+ 3 files changed, 3 insertions(+), 14 deletions(-)
+
+commit 5293fdba239846e677ba4ef6139ee6593e60b4f0
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jun 4 02:38:27 2020 +0430
+
+    [ci] Move docs deployment from autotools to meson
+
+ .ci/deploy-docs.sh             |  9 ++-------
+ .github/workflows/linux-ci.yml | 10 ++++++++++
+ .travis.yml                    |  1 -
+ 3 files changed, 12 insertions(+), 8 deletions(-)
+
+commit b8320340cebace11cd3781fc029afbd50e82ad97
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jun 3 23:40:57 2020 +0430
+
+    [meson] fix gen script input
+    
+    matters more when harfbuzz is a subproject
+
+ src/meson.build | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 50d3f531ee96ffa862bc05429814ba104dddd4a2
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jun 3 17:59:41 2020 +0430
+
+    Use output names in update-unicode-tables.make
+
+ src/update-unicode-tables.make | 51 +++++++++++++++++++-----------------------
+ 1 file changed, 23 insertions(+), 28 deletions(-)
+
 commit fb46a32ed0322d3f617dbfc7b982ff26f47d789c
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
 Date:   Wed Jun 3 12:54:26 2020 +0430
@@ -847,7 +32643,7 @@ Date:   Fri Apr 17 11:58:31 2020 -0700
  39 files changed, 176 insertions(+), 10 deletions(-)
 
 commit 00aba82a6d4b00b2d512e13ea1ee7aefea5d7441
-Merge: ca2705f1 461cd5a1
+Merge: ca2705f1f 461cd5a15
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
 Date:   Thu May 21 00:10:33 2020 +0430
 
@@ -962,7 +32758,7 @@ Date:   Fri May 15 10:10:27 2020 +0430
  1 file changed, 1 insertion(+), 2 deletions(-)
 
 commit c15146448b534479de08b6aa8e6b1795221a2e1e
-Merge: 069c5de9 7a961692
+Merge: 069c5de9f 7a961692e
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Thu May 14 19:12:41 2020 -0700
 
@@ -1557,7 +33353,7 @@ Date:   Thu Apr 23 10:50:02 2020 -0700
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit cc1ed76f381531c800833cb0f5b41fc524ed20a3
-Merge: 5a0936f5 a11db0b9
+Merge: 5a0936f53 a11db0b9d
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Fri Apr 24 08:15:32 2020 -0700
 
@@ -1575,7 +33371,7 @@ Date:   Thu Apr 23 19:09:00 2020 -0400
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit a11db0b9d4d3e7cc22a4a53374d4f8a049ce067e
-Merge: 1ed30515 19346524
+Merge: 1ed30515c 19346524c
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Thu Apr 23 15:32:43 2020 -0700
 
@@ -2591,6 +34387,47 @@ Date:   Tue Mar 31 17:46:19 2020 -0700
  ...ase-minimized-hb-subset-fuzzer-5719588814979072 | Bin 0 -> 1048576 bytes
  2 files changed, 18 insertions(+), 7 deletions(-)
 
+commit bdda2ff6092a3ddce2fe236dfe8cf3176330589b
+Author: Simon Cozens <simon@simon-cozens.org>
+Date:   Mon Mar 30 16:40:29 2020 +0100
+
+    More strictly follow noun/verb/identifier format for GPOS/GSUB lookups
+    
+    Less generic than the previous commit, but more descriptive and more consistent.
+
+ src/hb-ot-layout.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit bef7ef81da8030628ca99c27a3eb52ab642e6a85
+Author: Simon Cozens <simon@simon-cozens.org>
+Date:   Mon Mar 30 16:39:43 2020 +0100
+
+    Reformat kerx/morx instrumentation to 'verb noun identifier'
+
+ src/hb-aat-layout-kerx-table.hh | 4 ++--
+ src/hb-aat-layout-morx-table.hh | 4 ++--
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 42aac64030c54e514c4c031b49f646ece2b878fa
+Author: Simon Cozens <simon@simon-cozens.org>
+Date:   Mon Mar 30 16:06:30 2020 +0100
+
+    Add table index to lookup messages
+    
+    We could say GSUB/GPOS explicitly, but using the index is more general, in case future tables (such as JSTF, Silf) become supported.
+
+ src/hb-ot-layout.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 2cea796b75702d4fd433da2f4733810cf3dd3cfa
+Author: Simon Cozens <simon@simon-cozens.org>
+Date:   Mon Mar 30 16:04:17 2020 +0100
+
+    Instrument entering GSUB/GPOS tables
+
+ src/hb-ot-layout.cc | 4 ++++
+ 1 file changed, 4 insertions(+)
+
 commit 1b64b73080994ac577a6d936a0109b3c6f5d21de
 Author: Khaled Hosny <khaledhosny@eglug.org>
 Date:   Mon Mar 30 16:49:23 2020 +0200
@@ -4787,7 +36624,7 @@ Date:   Wed Feb 26 15:14:41 2020 +0330
  3 files changed, 93 insertions(+), 104 deletions(-)
 
 commit c400cb8863abb5f894e021da5d524c1e28b1e980
-Merge: c21eb86b 4081439d
+Merge: c21eb86bf 4081439d2
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Tue Feb 25 16:06:03 2020 -0800
 
@@ -4802,7 +36639,7 @@ Date:   Tue Feb 25 16:06:03 2020 -0800
     * coding & comment tweaks
 
 commit c21eb86bfd671b04aca54395988cbfe6c9fd2e27
-Merge: 152000d9 4aa354be
+Merge: 152000d9c 4aa354beb
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
 Date:   Wed Feb 26 02:54:38 2020 +0330
 
@@ -5860,7 +37697,7 @@ Date:   Wed Feb 5 09:26:45 2020 -0500
  1 file changed, 1 insertion(+), 2 deletions(-)
 
 commit 43253e404d25da31d8b8a57f1fc3ef5c2bb1d1fd
-Merge: 71a20186 774725b4
+Merge: 71a201860 774725b43
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
 Date:   Wed Feb 5 17:45:19 2020 +0330
 
@@ -5890,7 +37727,7 @@ Date:   Wed Feb 5 17:02:03 2020 +0330
  4 files changed, 43 insertions(+), 90 deletions(-)
 
 commit a7f694d4b0d5e95a6202da926ba3c29df6fbb6f0
-Merge: 43016715 b114b26a
+Merge: 43016715e b114b26a5
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
 Date:   Wed Feb 5 16:31:21 2020 +0330
 
@@ -6356,7 +38193,7 @@ Date:   Tue Jan 28 09:30:51 2020 -0800
  30 files changed, 30 insertions(+), 3 deletions(-)
 
 commit 777ba47b50f6379b9f9abf1d72559316b7116b9e
-Merge: 5b069c36 92f43a99
+Merge: 5b069c361 92f43a99c
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
 Date:   Thu Jan 30 22:38:43 2020 +0330
 
@@ -7256,7 +39093,7 @@ Date:   Wed Jan 22 11:20:56 2020 -0800
  2 files changed, 4 insertions(+), 6 deletions(-)
 
 commit 7633b7695e5b6188d6180fc5592c0678f03327ed
-Merge: 3747b329 02f324c9
+Merge: 3747b329b 02f324c94
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
 Date:   Thu Jan 23 18:51:40 2020 +0330
 
@@ -7608,7 +39445,7 @@ Date:   Sat Jan 11 01:30:05 2020 +0330
  1 file changed, 2 insertions(+), 1 deletion(-)
 
 commit d7454cf07eeb87600d8fcf23ada3617b6bda0f35
-Merge: 9cd76813 0b39c480
+Merge: 9cd76813a 0b39c4806
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
 Date:   Sat Jan 11 01:24:39 2020 +0330
 
@@ -8004,7 +39841,7 @@ Date:   Tue Dec 31 15:53:02 2019 +0330
  23 files changed, 114 insertions(+), 113 deletions(-)
 
 commit 33c3d63a0a9734a9cca9411a666d6ba9793d642f
-Merge: 68c1798a ea8fdfa0
+Merge: 68c1798a6 ea8fdfa07
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
 Date:   Tue Dec 31 13:52:50 2019 +0330
 
@@ -8798,7 +40635,7 @@ Date:   Sat Nov 16 18:20:16 2019 -0800
  3 files changed, 144 insertions(+), 55 deletions(-)
 
 commit ea8fdfa07939b97db6636327c8d55cd3b5a62b4c
-Merge: 453050ad d5338ba1
+Merge: 453050ad3 d5338ba18
 Author: blueshade7 <ariza@typekit.com>
 Date:   Fri Nov 22 15:59:09 2019 -0800
 
@@ -9122,7 +40959,7 @@ Date:   Tue Oct 29 21:30:04 2019 +0330
  1 file changed, 26 insertions(+), 21 deletions(-)
 
 commit 773ee8041e8905bfb06c1a71d2b4fc99110b3dc6
-Merge: 47b4074d 0efbda7a
+Merge: 47b4074d5 0efbda7a4
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Tue Oct 29 10:58:56 2019 -0700
 
@@ -9140,7 +40977,7 @@ Date:   Tue Oct 29 21:03:26 2019 +0330
  1 file changed, 13 insertions(+), 14 deletions(-)
 
 commit 47b4074d5f98d71d2983470602eff9b93f102af4
-Merge: dd8a8460 dd288840
+Merge: dd8a84603 dd288840d
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Tue Oct 29 03:16:34 2019 -0700
 
@@ -9240,7 +41077,7 @@ Date:   Mon Oct 28 13:46:56 2019 -0700
  1 file changed, 1 insertion(+), 7 deletions(-)
 
 commit 2714dc31b8d0ffe3c043935dd7619be0dd7b7635
-Merge: aca63902 14ad96ff
+Merge: aca639028 14ad96ffb
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Mon Oct 28 13:01:34 2019 -0700
 
@@ -9497,7 +41334,7 @@ Date:   Wed Oct 16 13:28:15 2019 +0330
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit 453050ad3083ed344bc2ab3b1651babbed34934d
-Merge: d7df7db1 b0b8551a
+Merge: d7df7db16 b0b8551af
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
 Date:   Sun Oct 13 08:38:56 2019 +0330
 
@@ -9576,7 +41413,7 @@ Date:   Thu Oct 10 15:30:48 2019 -0400
  2 files changed, 18 insertions(+), 1 deletion(-)
 
 commit e637a4b3de2fb8bdbc1b82e822f4a6cc579e794b
-Merge: 670fec23 e4464f44
+Merge: 670fec231 e4464f448
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Fri Oct 11 10:28:58 2019 +0700
 
@@ -9783,7 +41620,7 @@ Date:   Sun Oct 6 18:09:14 2019 +0330
  10 files changed, 66 insertions(+), 75 deletions(-)
 
 commit d7df7db160992e92c31afb6c79c7ccdad510fec1
-Merge: 74a2dbbc f2339964
+Merge: 74a2dbbce f2339964b
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
 Date:   Sun Oct 6 17:18:59 2019 +0330
 
@@ -9850,14 +41687,14 @@ Date:   Sun Oct 6 13:49:45 2019 +0330
  2 files changed, 85 insertions(+), 126 deletions(-)
 
 commit 100dbccaa50b2f965f3877f2156d388453f0948a
-Merge: c54ee485 b7684fa9
+Merge: c54ee4853 b7684fa9f
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
 Date:   Sun Oct 6 09:18:22 2019 +0330
 
     Merge remote-tracking branch 'upstream/master' into var-subset
 
 commit b7684fa9f42dffa6bd81acfade163123b30800b8
-Merge: 79ec65ae 21c80d95
+Merge: 79ec65ae1 21c80d955
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
 Date:   Sun Oct 6 09:00:48 2019 +0330
 
@@ -9961,7 +41798,7 @@ Date:   Tue Oct 1 16:13:40 2019 +0330
  13 files changed, 1588 insertions(+), 109 deletions(-)
 
 commit c54ee4853092b8a7f9a47da36407455992f55d93
-Merge: 19d45dca 79ec65ae
+Merge: 19d45dcab 79ec65ae1
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
 Date:   Thu Oct 3 14:28:37 2019 +0330
 
@@ -9977,7 +41814,7 @@ Date:   Thu Oct 3 14:27:51 2019 +0330
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit 19d45dcab732f3a836e17d31be9ca92f01c818b0
-Merge: 8106ba7f 3fd555be
+Merge: 8106ba7f8 3fd555be5
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
 Date:   Thu Oct 3 13:39:17 2019 +0330
 
@@ -10067,7 +41904,7 @@ Date:   Tue Oct 1 12:06:22 2019 +0330
  1 file changed, 2 insertions(+), 2 deletions(-)
 
 commit faace9437ea09d89ef5f5f9c9fc3ce0dbc672142
-Merge: e48ef080 f0dd724c
+Merge: e48ef0804 f0dd724c1
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Mon Sep 30 13:34:05 2019 -0700
 
@@ -11364,7 +43201,7 @@ Date:   Thu Aug 29 20:12:53 2019 +0430
  1 file changed, 90 insertions(+), 72 deletions(-)
 
 commit 9ff32b79b37e686bab0b4baa924c97b841bd8413
-Merge: 6b3e0939 49902964
+Merge: 6b3e09391 499029644
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
 Date:   Thu Aug 29 19:53:18 2019 +0430
 
@@ -11888,7 +43725,7 @@ Date:   Tue Aug 20 13:07:17 2019 +0430
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit 20b1a27c8a319d43a582c3efa8233b9f2c3cc73e
-Merge: 5ee1e451 37de38ad
+Merge: 5ee1e451c 37de38ade
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
 Date:   Tue Aug 20 13:04:51 2019 +0430
 
@@ -11897,7 +43734,7 @@ Date:   Tue Aug 20 13:04:51 2019 +0430
     Remove assumption about Core Text working in 96 DPI
 
 commit 37de38adeae48e1855c2431a39639db873a74554
-Merge: f401f85a 5ee1e451
+Merge: f401f85a5 5ee1e451c
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
 Date:   Tue Aug 20 12:59:33 2019 +0430
 
@@ -12247,14 +44084,14 @@ Date:   Sat Aug 3 13:47:55 2019 +0430
  1 file changed, 7 insertions(+), 1 deletion(-)
 
 commit 6b3e093911aaf834c0adf5b2a114d357914322ee
-Merge: 07f27acc 521c7013
+Merge: 07f27accb 521c7013a
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Wed Jul 31 16:04:48 2019 -0700
 
     Merge branch 'master' into var-subset
 
 commit 07f27accb9c3823cef5d652150701f24af89fca2
-Merge: a87fbb87 6e3bfecf
+Merge: a87fbb872 6e3bfecf3
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Wed Jul 31 14:58:53 2019 -0700
 
@@ -12376,14 +44213,14 @@ Date:   Sat Jul 27 14:56:18 2019 +0430
  1 file changed, 10 insertions(+), 6 deletions(-)
 
 commit f0dd724c1e091f42f289efbebd2c50e830e59c6e
-Merge: 68ac767e 4e1da6bb
+Merge: 68ac767e4 4e1da6bb6
 Author: blueshade7 <ariza@typekit.com>
 Date:   Mon Jul 29 14:21:05 2019 -0700
 
     Merge branch 'master' into subset-varstore
 
 commit 6e3bfecf358a1785995a64c18eb4c1d7cf926ca5
-Merge: 5988ab8a 4e1da6bb
+Merge: 5988ab8a4 4e1da6bb6
 Author: blueshade7 <ariza@typekit.com>
 Date:   Mon Jul 29 12:25:43 2019 -0700
 
@@ -12515,7 +44352,7 @@ Date:   Fri Jul 26 14:34:26 2019 -0700
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit 60d0fe2eda9c0eb67f50d61e905b584b8edc3e95
-Merge: 6d53cda1 658424b2
+Merge: 6d53cda1b 658424b29
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
 Date:   Sat Jul 27 01:20:55 2019 +0430
 
@@ -12713,7 +44550,7 @@ Date:   Wed Jul 24 00:47:19 2019 +0430
  2 files changed, 3 insertions(+), 3 deletions(-)
 
 commit 5988ab8a4e0d2b6d174f2ff0f18addc3f41b7a94
-Merge: 4cba7bda 636ae422
+Merge: 4cba7bdae 636ae4223
 Author: blueshade7 <ariza@typekit.com>
 Date:   Mon Jul 22 14:36:16 2019 -0700
 
@@ -12729,7 +44566,7 @@ Date:   Mon Jul 22 22:50:21 2019 +0430
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit 04c11a19b75663af35d16c827e295aa2e555d110
-Merge: 41ab56e0 c9796d15
+Merge: 41ab56e09 c9796d15e
 Author: Khaled Hosny <khaledhosny@eglug.org>
 Date:   Mon Jul 22 16:44:47 2019 +0200
 
@@ -12939,7 +44776,7 @@ Date:   Sat Jul 20 14:08:11 2019 +0430
  1 file changed, 6 insertions(+), 5 deletions(-)
 
 commit ac8b6e330a443a66c3e0fb83af9794310688d848
-Merge: ec8dde81 08b48e89
+Merge: ec8dde814 08b48e89d
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
 Date:   Sat Jul 20 13:16:16 2019 +0430
 
@@ -13070,7 +44907,7 @@ Date:   Mon Jun 17 10:16:24 2019 -0400
  1 file changed, 3 deletions(-)
 
 commit a76d8b0d5531a6a8d682ea9d5150ee7893932269
-Merge: 386a4a64 504bb172
+Merge: 386a4a64f 504bb1728
 Author: blueshade7 <ariza@typekit.com>
 Date:   Wed Jul 17 14:12:06 2019 -0700
 
@@ -13352,7 +45189,7 @@ Date:   Tue Jul 9 11:43:59 2019 -0700
  28 files changed, 85 insertions(+), 46 deletions(-)
 
 commit a87fbb872b31c7a292ed8b414be728aa951e2833
-Merge: 49252c42 6e35668b
+Merge: 49252c42b 6e35668b4
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Tue Jul 9 10:25:54 2019 -0700
 
@@ -13369,7 +45206,7 @@ Date:   Tue Jul 9 09:47:54 2019 -0700
  2 files changed, 2 insertions(+), 1 deletion(-)
 
 commit 8bf989ea70804dad66fb1c2d0c625ef5e562a309
-Merge: 5763a927 2e7021da
+Merge: 5763a9274 2e7021da7
 Author: blueshade7 <ariza@typekit.com>
 Date:   Mon Jul 8 17:13:29 2019 -0700
 
@@ -13726,7 +45563,7 @@ Date:   Mon Jul 1 18:52:57 2019 -0700
  1 file changed, 163 insertions(+), 2 deletions(-)
 
 commit 5763a92749386e134f2b4073531c10e9586d1d19
-Merge: 6f35cf7a 6bcbe495
+Merge: 6f35cf7a6 6bcbe495b
 Author: Michiharu Ariza <ariza@typekit.com>
 Date:   Mon Jul 1 15:17:19 2019 -0700
 
@@ -13744,7 +45581,7 @@ Date:   Sun Jun 30 16:13:07 2019 -0700
  3 files changed, 85 insertions(+), 1 deletion(-)
 
 commit 9c93f5cc2de5c60d5464a65890fc7d8c25aa9702
-Merge: ad341d5f 4ab2d1d6
+Merge: ad341d5f1 4ab2d1d67
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
 Date:   Mon Jul 1 20:08:22 2019 +0430
 
@@ -13883,7 +45720,7 @@ Date:   Wed Jun 26 21:10:11 2019 -0400
  1 file changed, 138 insertions(+), 4 deletions(-)
 
 commit 7185bd6ffb4dd8c0efebdab5b930e62c5695e3ab
-Merge: cd65305b 8341c0b3
+Merge: cd65305b0 8341c0b30
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
 Date:   Thu Jun 27 22:09:28 2019 +0430
 
@@ -14263,7 +46100,7 @@ Date:   Wed Jun 12 11:02:48 2019 -0700
  2 files changed, 39 insertions(+), 91 deletions(-)
 
 commit 8062979990d348671b465c877e4dd672e1337665
-Merge: ad97ec95 c2d7dfc6
+Merge: ad97ec950 c2d7dfc68
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
 Date:   Sun Jun 23 11:19:48 2019 +0430
 
@@ -15570,14 +47407,14 @@ Date:   Wed Jun 5 12:13:49 2019 -0700
  2 files changed, 7 insertions(+), 4 deletions(-)
 
 commit 4ddab6facc0c7ffe7623bf6449ab9b27166924a6
-Merge: 157a414b 4b1b0bf2
+Merge: 157a414bd 4b1b0bf2f
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Wed Jun 5 11:21:27 2019 -0700
 
     Merge branch 'master' into var-subset
 
 commit 4b1b0bf2f51f806d3285a7e7dec378b9eab9333e
-Merge: 659eeddb 815f002b
+Merge: 659eeddb2 815f002bb
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
 Date:   Wed Jun 5 12:57:28 2019 +0430
 
@@ -15636,7 +47473,7 @@ Date:   Wed May 29 14:03:17 2019 -0700
  2 files changed, 59 insertions(+), 62 deletions(-)
 
 commit 89a7a880a1d5cd5e585d43fdde6d44c6dba559cf
-Merge: 760eb1bf 12febd68
+Merge: 760eb1bf9 12febd68d
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
 Date:   Tue Jun 4 10:52:16 2019 +0430
 
@@ -16195,7 +48032,7 @@ Date:   Sat May 25 11:15:15 2019 -0400
  2 files changed, 10 insertions(+), 8 deletions(-)
 
 commit e7ed85de95d3ccdb674ec5a30ae66d53cea74b3a
-Merge: f93a5e6a 97ba206b
+Merge: f93a5e6a7 97ba206be
 Author: n8willis <n8willis@users.noreply.github.com>
 Date:   Sat May 25 16:05:07 2019 +0100
 
@@ -16327,7 +48164,7 @@ Date:   Fri May 24 19:23:19 2019 +0100
  1 file changed, 45 insertions(+), 2 deletions(-)
 
 commit 96de94768b08287325be8947255917502368c337
-Merge: c96c6b28 1197bef2
+Merge: c96c6b287 1197bef26
 Author: rsheeter <rsheeter@google.com>
 Date:   Fri May 24 11:22:41 2019 -0700
 
@@ -16481,7 +48318,7 @@ Date:   Wed May 22 15:46:19 2019 -0400
  1 file changed, 27 insertions(+), 3 deletions(-)
 
 commit 15a9e32b566fbf6f4a2c6fd488d8cc3865234b17
-Merge: 993d81b9 ff7fc6d4
+Merge: 993d81b9c ff7fc6d48
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
 Date:   Thu May 23 11:02:15 2019 +0430
 
@@ -16714,7 +48551,7 @@ Date:   Tue May 21 11:14:31 2019 -0700
  1 file changed, 19 insertions(+), 16 deletions(-)
 
 commit d1b12a546561a78ae3c3e9d6bffa057caf82dbee
-Merge: 3a43603e f49a5bec
+Merge: 3a43603ec f49a5bec9
 Author: Rod Sheeter <rsheeter@google.com>
 Date:   Mon May 20 21:29:54 2019 -0700
 
@@ -16750,7 +48587,7 @@ Date:   Thu May 16 19:14:16 2019 -0700
  2 files changed, 86 insertions(+), 35 deletions(-)
 
 commit 82bbec306376d61b6700461c4038c6789e60a998
-Merge: 9d09ac13 b7be5931
+Merge: 9d09ac13a b7be59311
 Author: Rod Sheeter <rsheeter@google.com>
 Date:   Thu May 16 15:14:01 2019 -0700
 
@@ -16805,7 +48642,7 @@ Date:   Thu May 9 22:12:20 2019 -0700
  1 file changed, 59 insertions(+), 29 deletions(-)
 
 commit f8de063b48c243d551c8892bdd2a799606fda3f4
-Merge: 0d7fef2d 8f174870
+Merge: 0d7fef2d5 8f174870e
 Author: Rod Sheeter <rsheeter@google.com>
 Date:   Thu May 9 20:02:38 2019 -0700
 
@@ -16854,14 +48691,14 @@ Date:   Wed May 8 16:52:00 2019 -0700
  1 file changed, 58 insertions(+), 39 deletions(-)
 
 commit 723d054dcb6ad44e9eab4dc8cc55f8d480d2ff16
-Merge: ed727d4b e2a51ff7
+Merge: ed727d4bb e2a51ff72
 Author: rsheeter <rsheeter@google.com>
 Date:   Wed May 8 16:45:35 2019 -0700
 
     Merge branch 'master' of https://github.com/harfbuzz/harfbuzz into glyf
 
 commit ed727d4bb74860c126675e94f87f65ff7874dbb6
-Merge: fb9bff95 e8b45c19
+Merge: fb9bff955 e8b45c193
 Author: rsheeter <rsheeter@google.com>
 Date:   Wed May 8 16:39:45 2019 -0700
 
@@ -18034,7 +49871,7 @@ Date:   Sun May 12 15:33:31 2019 -0700
  2 files changed, 14 insertions(+), 1 deletion(-)
 
 commit 3d9be2ad5036aaf02b69095faaf9c18705c2c5bc
-Merge: a20db496 1a850abd
+Merge: a20db496f 1a850abd6
 Author: n8willis <n8willis@users.noreply.github.com>
 Date:   Sun May 12 20:03:29 2019 +0100
 
@@ -18128,7 +49965,7 @@ Date:   Sat May 11 19:50:42 2019 +0000
  1 file changed, 7 insertions(+), 3 deletions(-)
 
 commit 1a850abd66999707b6f4795050e748fc879b92ef
-Merge: 8a544171 a6048e4c
+Merge: 8a544171d a6048e4cd
 Author: n8willis <n8willis@users.noreply.github.com>
 Date:   Sat May 11 20:16:57 2019 +0100
 
@@ -19311,7 +51148,7 @@ Date:   Thu May 9 10:46:49 2019 -0700
  1 file changed, 11 insertions(+), 11 deletions(-)
 
 commit 6bc82579100992e3f04c11f36b9c2f0014d880f2
-Merge: 34764454 6d9a86ae
+Merge: 347644542 6d9a86ae7
 Author: n8willis <n8willis@users.noreply.github.com>
 Date:   Thu May 9 14:39:05 2019 +0100
 
@@ -20715,7 +52552,7 @@ Date:   Tue Apr 30 16:09:01 2019 +0100
  1 file changed, 22 insertions(+), 13 deletions(-)
 
 commit 1223a352b7c8d1cc362693b850f348af4d4d03fb
-Merge: aa3ac592 9542bdd0
+Merge: aa3ac5924 9542bdd0e
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Mon Apr 29 16:43:48 2019 -0700
 
@@ -21465,7 +53302,7 @@ Date:   Wed Apr 17 12:43:53 2019 -0700
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit c87488b46d1f302e1ad313c365e2cd440e60141a
-Merge: 49fe81fd c67a0d58
+Merge: 49fe81fde c67a0d581
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Wed Apr 17 12:07:15 2019 -0700
 
@@ -21621,7 +53458,7 @@ Date:   Tue Apr 16 16:45:53 2019 -0400
  9 files changed, 19 insertions(+), 18 deletions(-)
 
 commit 6cde814a360eaeab6755685cf7980887af3225d1
-Merge: 007bb3e0 1ce11b44
+Merge: 007bb3e0d 1ce11b443
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Tue Apr 16 11:35:07 2019 -0700
 
@@ -21847,7 +53684,7 @@ Date:   Mon Apr 15 00:34:04 2019 +0430
  1 file changed, 2 insertions(+), 2 deletions(-)
 
 commit ad126036643e44a98c4c42d2a2a4a3b4a3649937
-Merge: 341b70a3 47e538a3
+Merge: 341b70a3b 47e538a35
 Author: Nathan Willis <nwillis@glyphography.com>
 Date:   Sun Apr 14 15:42:42 2019 +0100
 
@@ -22096,7 +53933,7 @@ Date:   Thu Apr 11 17:54:38 2019 -0400
  1 file changed, 3 insertions(+)
 
 commit a90e4916df74f6f84ce78eb2a73b6f325e7e8617
-Merge: 94573702 3db22726
+Merge: 945737026 3db227265
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Thu Apr 11 15:57:32 2019 -0700
 
@@ -22225,14 +54062,14 @@ Date:   Thu Apr 11 11:16:01 2019 -0400
  4 files changed, 13 insertions(+), 13 deletions(-)
 
 commit 9e79285ef3b4d7490b4bbad0eef16dd73fd8fb62
-Merge: 6d79a25b c5509be9
+Merge: 6d79a25be c5509be93
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Wed Apr 10 17:24:29 2019 -0700
 
     Merge branch 'master' into var-subset
 
 commit 6d79a25bed110b2d8842bd102ffdb5606023b8a1
-Merge: ab9d3096 196481cc
+Merge: ab9d30965 196481ccb
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Wed Apr 10 17:23:00 2019 -0700
 
@@ -22522,7 +54359,7 @@ Date:   Wed Apr 3 14:15:01 2019 -0700
  1 file changed, 6 insertions(+), 3 deletions(-)
 
 commit b999ce9bf06fc90c4cb3c531357967835d7e706d
-Merge: c2d727a4 6215fb8e
+Merge: c2d727a47 6215fb8e6
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Wed Apr 3 10:34:09 2019 -0700
 
@@ -22993,7 +54830,7 @@ Date:   Sun Mar 31 00:23:58 2019 -0700
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit f7700fc479c25599e89b9d59edaad66e103a742d
-Merge: 43725d36 d6005b49
+Merge: 43725d363 d6005b49b
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Sat Mar 30 20:49:34 2019 -0700
 
@@ -23090,7 +54927,7 @@ Date:   Sat Mar 30 19:01:23 2019 -0700
  1 file changed, 7 insertions(+), 15 deletions(-)
 
 commit 43725d36322b7277d515b958b5e894e1c892cede
-Merge: 294d520f a7c63cd8
+Merge: 294d520f6 a7c63cd8f
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Sat Mar 30 18:51:15 2019 -0700
 
@@ -23372,14 +55209,14 @@ Date:   Fri Mar 29 23:53:06 2019 -0700
  3 files changed, 22 insertions(+), 23 deletions(-)
 
 commit 8a8965be39d909198d6c91d5a45aede6802ebd71
-Merge: cc94a9ed 3236623e
+Merge: cc94a9ed3 3236623e1
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Fri Mar 29 23:38:16 2019 -0700
 
     Merge branch 'var-subset' of https://github.com/harfbuzz/harfbuzz into var-subset
 
 commit cc94a9ed3b63cf74aa64c83a203137f16c6e152c
-Merge: 435bc7f3 ce6093a9
+Merge: 435bc7f3e ce6093a96
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Fri Mar 29 18:41:38 2019 -0700
 
@@ -23398,14 +55235,14 @@ Date:   Fri Mar 29 23:31:07 2019 -0700
  3 files changed, 9 insertions(+), 9 deletions(-)
 
 commit ce6093a96ba4c68b4eb4f1cd4b695eb41f1fa334
-Merge: ddb84dce a1177fec
+Merge: ddb84dcec a1177fec8
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Fri Mar 29 10:32:45 2019 -0700
 
     Merge branch 'var-subset' of https://github.com/harfbuzz/harfbuzz into var-subset
 
 commit a1177fec8f43a65bca6696378995d6d39d8f6330
-Merge: 58c8c7a4 f505b5d5
+Merge: 58c8c7a49 f505b5d5c
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Fri Mar 29 08:43:47 2019 -0700
 
@@ -23662,7 +55499,7 @@ Date:   Fri Mar 29 20:01:37 2019 -0700
  1 file changed, 14 insertions(+), 10 deletions(-)
 
 commit 3236623e1f4a11c23f8f2fb41d886d1255c2bc63
-Merge: 435bc7f3 d30e5e74
+Merge: 435bc7f3e d30e5e748
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Fri Mar 29 18:41:38 2019 -0700
 
@@ -24785,7 +56622,7 @@ Date:   Fri Mar 29 15:20:34 2019 -0700
  1 file changed, 81 deletions(-)
 
 commit 8e7887ca5f8a2822345bdcbdc873c73a31c81177
-Merge: 7929b0f0 90aebc6c
+Merge: 7929b0f07 90aebc6cf
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Fri Mar 29 14:37:04 2019 -0700
 
@@ -24858,7 +56695,7 @@ Date:   Fri Mar 29 10:46:44 2019 -0700
  2 files changed, 10 deletions(-)
 
 commit d30e5e74814c6db23fdedbe75fd9b89c0dfb4dce
-Merge: ddb84dce a252392b
+Merge: ddb84dcec a252392bc
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Fri Mar 29 10:32:45 2019 -0700
 
@@ -24875,7 +56712,7 @@ Date:   Fri Mar 29 10:32:42 2019 -0700
  2 files changed, 8 insertions(+), 1 deletion(-)
 
 commit a252392bc05e8e9e4127e0002b10fe514323730f
-Merge: 58c8c7a4 d6fc1d49
+Merge: 58c8c7a49 d6fc1d49a
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Fri Mar 29 08:43:47 2019 -0700
 
@@ -24914,7 +56751,7 @@ Date:   Thu Mar 28 21:34:47 2019 -0700
  2 files changed, 10 insertions(+)
 
 commit a030ce4ff83e0948e4f865accc5670e8b5e78dde
-Merge: 11456b2d d6fc1d49
+Merge: 11456b2d9 d6fc1d49a
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Thu Mar 28 21:26:50 2019 -0700
 
@@ -24986,7 +56823,7 @@ Date:   Thu Mar 28 16:57:56 2019 -0700
  1 file changed, 3 insertions(+), 3 deletions(-)
 
 commit 58c8c7a495fcc353d09158fc23a45f35b2dab2dc
-Merge: 485fe06f a548d1da
+Merge: 485fe06f7 a548d1da7
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Thu Mar 28 16:17:41 2019 -0700
 
@@ -25012,7 +56849,7 @@ Date:   Thu Mar 28 15:42:45 2019 -0700
  2 files changed, 3 insertions(+), 20 deletions(-)
 
 commit 5f36771c2ab612b403e55504b7901b0390b1b76d
-Merge: 99f0c107 061bd0a9
+Merge: 99f0c107f 061bd0a99
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Thu Mar 28 15:07:53 2019 -0700
 
@@ -25069,14 +56906,14 @@ Date:   Thu Mar 28 19:06:12 2019 +0300
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit 061bd0a99b0724953fcbdaaef4ea91a54cd7d3ce
-Merge: d8e3e360 67175987
+Merge: d8e3e3607 67175987b
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Wed Mar 27 08:53:50 2019 -0700
 
     Merge branch 'var-subset' of https://github.com/harfbuzz/harfbuzz into var-subset
 
 commit d8e3e3607e6435b994a3e2f4285c5b4d17c5dfa4
-Merge: bcd689bb 717181c5
+Merge: bcd689bb1 717181c59
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Wed Mar 27 08:53:48 2019 -0700
 
@@ -25121,7 +56958,7 @@ Date:   Tue Mar 26 20:35:01 2019 -0700
  1 file changed, 14 insertions(+), 10 deletions(-)
 
 commit bcd689bb1090a1bf5113e67edfce583832bb2187
-Merge: 49f93596 ec2a5dc8
+Merge: 49f935963 ec2a5dc85
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Tue Mar 26 17:13:31 2019 -0700
 
@@ -25255,7 +57092,7 @@ Date:   Thu Mar 21 18:09:37 2019 -0700
  6 files changed, 108 insertions(+), 4 deletions(-)
 
 commit 8ec279072e039c7a75ea90e2284d46bd9faee8ee
-Merge: 0593a95e 5390e393
+Merge: 0593a95e2 5390e3934
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Thu Mar 21 10:38:12 2019 -0700
 
@@ -25271,14 +57108,14 @@ Date:   Thu Mar 21 10:36:53 2019 -0700
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit 5390e39342e78566095b580603bd1f76cdafc010
-Merge: 084be9a0 5f15fca6
+Merge: 084be9a0f 5f15fca66
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Thu Mar 21 10:21:50 2019 -0700
 
     Merge branch 'var-subset' of https://github.com/harfbuzz/harfbuzz into var-subset
 
 commit 084be9a0f466134998da79e9a81191836f847ab8
-Merge: 3faaa52a bcb4e505
+Merge: 3faaa52aa bcb4e505d
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Thu Mar 21 10:21:31 2019 -0700
 
@@ -25546,21 +57383,21 @@ Date:   Fri Mar 15 13:46:25 2019 -0700
  4 files changed, 1 insertion(+)
 
 commit a5118c1db51d6d3b24622a52e50246e00b07fa74
-Merge: 90ea140a 079c386c
+Merge: 90ea140ac 079c386ca
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Fri Mar 15 10:33:03 2019 -0700
 
     Merge branch 'var-subset' of https://github.com/harfbuzz/harfbuzz into var-subset
 
 commit 079c386ca89b6d2833786db3ba54b7137d045188
-Merge: 99502b32 8aaab78e
+Merge: 99502b324 8aaab78ef
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Fri Mar 15 10:12:19 2019 -0700
 
     Merge branch 'master' into var-subset
 
 commit 90ea140aca18d073401fc971681ce48403fbf399
-Merge: d23c201f 99502b32
+Merge: d23c201f5 99502b324
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Thu Mar 14 16:58:19 2019 -0700
 
@@ -25813,7 +57650,7 @@ Date:   Tue Mar 12 11:03:53 2019 -0700
  4 files changed, 175 insertions(+), 14 deletions(-)
 
 commit 23e2d5ac86968c7548df0d212c1a321d09328ffa
-Merge: f5a46638 e52ec3fc
+Merge: f5a466389 e52ec3fc2
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Tue Mar 12 10:53:15 2019 -0700
 
@@ -25999,7 +57836,7 @@ Date:   Fri Mar 1 18:24:56 2019 -0800
  2 files changed, 7 insertions(+), 8 deletions(-)
 
 commit 3f3da718632e9beef9a1d9cf8b5775025ffe3fd6
-Merge: 21aaf300 f448195a
+Merge: 21aaf3005 f448195a4
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Fri Mar 1 18:12:35 2019 -0800
 
@@ -26026,7 +57863,7 @@ Date:   Sat Mar 2 03:24:49 2019 +0330
  1 file changed, 2 insertions(+), 5 deletions(-)
 
 commit f448195a4b041db83b0e515c829b99d2349bf73f
-Merge: fa2b3d30 4f37ab63
+Merge: fa2b3d30f 4f37ab63d
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Fri Mar 1 15:22:17 2019 -0800
 
@@ -26313,7 +58150,7 @@ Date:   Fri Feb 15 16:09:29 2019 -0800
  1 file changed, 7 insertions(+), 4 deletions(-)
 
 commit c1e5ba81fe4888143c1cf4a3deb3597875580c6d
-Merge: b8b3b3e3 3da79dd5
+Merge: b8b3b3e38 3da79dd5b
 Author: Behdad Esfahbod <behdad@fb.com>
 Date:   Fri Feb 15 16:06:03 2019 -0800
 
@@ -26330,7 +58167,7 @@ Date:   Fri Feb 15 16:05:36 2019 -0800
  2 files changed, 49 insertions(+), 22 deletions(-)
 
 commit 3da79dd5b92b89fbf062cbe591e6b1ba83083aec
-Merge: 50005501 d8a68728
+Merge: 500055018 d8a68728a
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Fri Feb 15 15:54:51 2019 -0800
 
@@ -26339,7 +58176,7 @@ Date:   Fri Feb 15 15:54:51 2019 -0800
     CFF more arrayof fixes
 
 commit 5000550183022db8c9cfef63a9ed90eb9f37764d
-Merge: 5c2bb1de 90c8bbf9
+Merge: 5c2bb1de8 90c8bbf98
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Fri Feb 15 15:54:13 2019 -0800
 
@@ -26348,14 +58185,14 @@ Date:   Fri Feb 15 15:54:13 2019 -0800
     [subset] Implement --retain-gids with CFF/CFF2
 
 commit d8a68728a077a8c5fc8ceae19f2866cdc8b70baf
-Merge: 1cb1d5d7 5c2bb1de
+Merge: 1cb1d5d7f 5c2bb1de8
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Fri Feb 15 14:48:10 2019 -0800
 
     Merge branch 'master' into cff-more-arrayof-fixes
 
 commit 90c8bbf98747eb29687471da892b4a34a9236242
-Merge: 6f1dfd08 5c2bb1de
+Merge: 6f1dfd082 5c2bb1de8
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Fri Feb 15 14:47:38 2019 -0800
 
@@ -26488,7 +58325,7 @@ Date:   Thu Feb 14 11:40:22 2019 -0800
  2 files changed, 33 insertions(+)
 
 commit 5b725784e53a96ba4d983184a2670aba2aa0fd9c
-Merge: 00db9409 28f77361
+Merge: 00db94095 28f773613
 Author: Behdad Esfahbod <behdad@fb.com>
 Date:   Thu Feb 14 11:34:55 2019 -0800
 
@@ -26598,14 +58435,14 @@ Date:   Thu Feb 14 10:39:58 2019 -0800
  1 file changed, 25 insertions(+)
 
 commit 1cb1d5d7fb74e9f42dc8361dcdf669ed479d595d
-Merge: 8a568a88 d5287e1b
+Merge: 8a568a885 d5287e1ba
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Thu Feb 14 10:09:19 2019 -0800
 
     Merge branch 'master' into cff-more-arrayof-fixes
 
 commit 6f1dfd082cf79488ae6773e7d99172f13575668c
-Merge: b1dbc77f d5287e1b
+Merge: b1dbc77fa d5287e1ba
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Thu Feb 14 10:08:16 2019 -0800
 
@@ -26628,7 +58465,7 @@ Date:   Wed Feb 13 23:54:36 2019 -0800
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit 4103252323b15a821f0a912b580c2107211b918f
-Merge: f1b89344 d5287e1b
+Merge: f1b893440 d5287e1ba
 Author: Behdad Esfahbod <behdad@fb.com>
 Date:   Wed Feb 13 23:46:43 2019 -0800
 
@@ -26671,7 +58508,7 @@ Date:   Wed Feb 13 23:30:21 2019 -0800
  1 file changed, 13 deletions(-)
 
 commit 7d2376de336c7fc14d69e01add02115335f92db8
-Merge: 2d940946 890d0ee7
+Merge: 2d940946d 890d0ee77
 Author: Behdad Esfahbod <behdad@fb.com>
 Date:   Wed Feb 13 22:08:54 2019 -0800
 
@@ -26687,14 +58524,14 @@ Date:   Thu Feb 14 00:27:01 2019 +0330
  1 file changed, 3 insertions(+), 3 deletions(-)
 
 commit 8a568a8858b44a81ca43a82761a70bf8d53e7c26
-Merge: c83412e4 1e1d0e63
+Merge: c83412e4c 1e1d0e63d
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Wed Feb 13 11:25:00 2019 -0800
 
     Merge branch 'master' into cff-more-arrayof-fixes
 
 commit b1dbc77fa62a99047df539663cfd1e8778d2c907
-Merge: c3a3536c 1e1d0e63
+Merge: c3a3536c9 1e1d0e63d
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Wed Feb 13 11:24:38 2019 -0800
 
@@ -26716,14 +58553,14 @@ Date:   Wed Feb 13 12:58:01 2019 +0330
  2 files changed, 5 insertions(+), 5 deletions(-)
 
 commit c3a3536c9a00a989ebd83d52e67d06525ed669bc
-Merge: bc33c617 85a6d312
+Merge: bc33c617b 85a6d3121
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Tue Feb 12 15:10:59 2019 -0800
 
     Merge branch 'cff-retain-gids' of https://github.com/harfbuzz/harfbuzz into cff-retain-gids
 
 commit bc33c617b85988f4d81312e62a75f92601852c76
-Merge: c6af8461 fdfa3d29
+Merge: c6af84617 fdfa3d29b
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Tue Feb 12 15:10:50 2019 -0800
 
@@ -26739,14 +58576,14 @@ Date:   Tue Feb 12 15:10:43 2019 -0800
  1 file changed, 24 insertions(+), 2 deletions(-)
 
 commit 85a6d3121a26c9bcbec60d37b64643ff8dc97a0a
-Merge: d9ded069 fdfa3d29
+Merge: d9ded0699 fdfa3d29b
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Mon Feb 11 14:25:21 2019 -0800
 
     Merge branch 'master' into cff-retain-gids
 
 commit c83412e4cec10f6f6f6ac38f202b3ce373da5daf
-Merge: 1239b6b2 fdfa3d29
+Merge: 1239b6b2b fdfa3d29b
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Mon Feb 11 14:16:25 2019 -0800
 
@@ -26792,7 +58629,7 @@ Date:   Sat Feb 9 16:33:28 2019 +0330
  1 file changed, 2 insertions(+), 2 deletions(-)
 
 commit d9ded069926bf46a5d8e5edbf5201c98044db78e
-Merge: a5e933eb 84694af7
+Merge: a5e933eba 84694af72
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Fri Feb 8 14:44:20 2019 -0800
 
@@ -26885,14 +58722,14 @@ Date:   Thu Feb 7 15:32:32 2019 -0800
  2 files changed, 4 insertions(+), 8 deletions(-)
 
 commit 1239b6b2b4430658aea78216a1dcc885724a7ab4
-Merge: 9f80eb01 126abca9
+Merge: 9f80eb017 126abca98
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Thu Feb 7 10:29:40 2019 -0800
 
     Merge branch 'master' into cff-more-arrayof-fixes
 
 commit a5fa76977b5bdf3bd40ede3cdd0da9c5546557a6
-Merge: 214d0b02 126abca9
+Merge: 214d0b024 126abca98
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Thu Feb 7 10:28:13 2019 -0800
 
@@ -26908,7 +58745,7 @@ Date:   Thu Feb 7 10:27:43 2019 -0800
  1 file changed, 2 insertions(+), 2 deletions(-)
 
 commit 126abca98a954f7ec3374d0593fee25f78dc10f3
-Merge: 1e062821 7859decd
+Merge: 1e0628210 7859decdd
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Wed Feb 6 13:36:52 2019 -0800
 
@@ -27027,7 +58864,7 @@ Date:   Fri Feb 1 15:58:03 2019 -0800
  6 files changed, 0 insertions(+), 0 deletions(-)
 
 commit 30b781f20a8e386732f8e2858a22665d7af98061
-Merge: c1286265 1e062821
+Merge: c12862657 1e0628210
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Fri Feb 1 14:50:34 2019 -0800
 
@@ -27137,7 +58974,7 @@ Date:   Thu Jan 31 13:49:18 2019 -0800
  1 file changed, 5 deletions(-)
 
 commit 9f80eb0177e527253818ad9171fc75fb565318cb
-Merge: b3799007 d14d2c20
+Merge: b37990075 d14d2c20b
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Thu Jan 31 12:54:36 2019 -0800
 
@@ -27167,7 +59004,7 @@ Date:   Wed Jan 30 16:03:16 2019 -0800
  2 files changed, 6 insertions(+), 2 deletions(-)
 
 commit d14d2c20b05c5acf0a6f9c6dc36a7b8d8966153e
-Merge: acf5f0a3 dc04261a
+Merge: acf5f0a3a dc04261a5
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Wed Jan 30 18:36:57 2019 -0500
 
@@ -27186,7 +59023,7 @@ Date:   Wed Jan 30 15:23:19 2019 -0800
  1 file changed, 19 insertions(+), 13 deletions(-)
 
 commit 2e675d49f2f705a5b5d95574a5336d5e670a0fba
-Merge: ede117dc acf5f0a3
+Merge: ede117dc4 acf5f0a3a
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Wed Jan 30 15:10:43 2019 -0800
 
@@ -27211,7 +59048,7 @@ Date:   Wed Jan 30 15:10:23 2019 -0800
  1 file changed, 5 insertions(+), 6 deletions(-)
 
 commit cbe2118c588622070612ba7ac7eae7496a092e3c
-Merge: 8b46c2d9 6b834c1c
+Merge: 8b46c2d93 6b834c1c7
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Wed Jan 30 15:07:09 2019 -0800
 
@@ -27273,7 +59110,7 @@ Date:   Wed Jan 30 14:42:48 2019 -0800
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit d983c529b66b530715e9c813c69e699b1d8029d3
-Merge: 55d1d7c8 e6ffcc59
+Merge: 55d1d7c8b e6ffcc590
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Wed Jan 30 17:17:59 2019 -0500
 
@@ -27556,7 +59393,7 @@ Date:   Thu Jan 17 18:55:56 2019 -0800
  5 files changed, 74 insertions(+), 13 deletions(-)
 
 commit b3799007554f2909170df941b07c72f7dc02dfcd
-Merge: c6856443 fe532923
+Merge: c68564438 fe5329231
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Tue Jan 29 12:19:57 2019 -0800
 
@@ -27575,7 +59412,7 @@ Date:   Mon Jan 28 21:26:23 2019 -0500
  4 files changed, 14 insertions(+), 15 deletions(-)
 
 commit 6cf25c2971aa9a7471b1cc00176ef36e9acacad4
-Merge: 71157a45 fe532923
+Merge: 71157a452 fe5329231
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Mon Jan 28 21:23:28 2019 -0500
 
@@ -27677,7 +59514,7 @@ Date:   Mon Jan 28 16:17:36 2019 -0500
  1 file changed, 2 insertions(+), 2 deletions(-)
 
 commit 073fa4ac5aff4ee72bbb38676bd351b5aa1ec167
-Merge: d592bd16 9a1df82e
+Merge: d592bd16c 9a1df82e3
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Mon Jan 28 14:35:41 2019 -0500
 
@@ -27862,7 +59699,7 @@ Date:   Sat Jan 26 22:15:59 2019 +0100
  2 files changed, 4 insertions(+), 4 deletions(-)
 
 commit ac90f17c552e5264ad0a9d17c50fac9008d6ebe7
-Merge: 090fe56d 60022ecc
+Merge: 090fe56dc 60022ecce
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Sat Jan 26 14:05:39 2019 +0100
 
@@ -27898,7 +59735,7 @@ Date:   Fri Jan 25 16:08:25 2019 +0100
  2 files changed, 12 insertions(+), 12 deletions(-)
 
 commit 090fe56dc6ef5f7afa297f2cb200418a520a2026
-Merge: 21c0713a 06358ae9
+Merge: 21c0713a1 06358ae97
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Fri Jan 25 15:34:03 2019 +0100
 
@@ -27914,7 +59751,7 @@ Date:   Fri Jan 25 15:11:47 2019 +0100
  1 file changed, 2 insertions(+)
 
 commit c685644386d1c88d6df6e024e56d61c792d94418
-Merge: 0bd0a331 e970de48
+Merge: 0bd0a3311 e970de48b
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Thu Jan 24 13:19:18 2019 -0800
 
@@ -27968,7 +59805,7 @@ Date:   Thu Jan 24 18:01:07 2019 +0100
  3 files changed, 21 insertions(+), 37 deletions(-)
 
 commit 0bd0a3311cfded5ffa4d9d488d404558cf65e8ed
-Merge: 12cd3171 f60282c5
+Merge: 12cd3171b f60282c5b
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Thu Jan 24 08:53:28 2019 -0800
 
@@ -28092,7 +59929,7 @@ Date:   Thu Jan 24 12:08:23 2019 +0100
  6 files changed, 30 insertions(+), 15 deletions(-)
 
 commit 12cd3171ba3b84eff9f359778fabcab8f66ce36e
-Merge: 261a7421 36fb2b4d
+Merge: 261a74218 36fb2b4da
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Wed Jan 23 14:05:42 2019 -0800
 
@@ -32270,7 +64107,7 @@ Date:   Wed Dec 12 15:14:37 2018 +0330
  18 files changed, 211 insertions(+), 262 deletions(-)
 
 commit a33f238f8888cc969e1e393deda0518fb8dd6b13
-Merge: 7146718b 1e09add2
+Merge: 7146718be 1e09add23
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
 Date:   Wed Dec 12 12:44:06 2018 +0330
 
@@ -32545,7 +64382,7 @@ Date:   Thu Dec 6 10:19:03 2018 -0800
  2 files changed, 7 insertions(+), 8 deletions(-)
 
 commit 6ad3fcddaf2ba8ebc9ad49ff9e7b33b60fcad16a
-Merge: f95324a3 ae087d10
+Merge: f95324a33 ae087d10c
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
 Date:   Thu Dec 6 10:21:00 2018 +0330
 
@@ -32563,7 +64400,7 @@ Date:   Wed Dec 5 21:47:34 2018 -0800
  1 file changed, 0 insertions(+), 0 deletions(-)
 
 commit 1ccbdcf73bbc967f5f94c0bc7f7e869bd87d9fa0
-Merge: 14d29a10 f95324a3
+Merge: 14d29a104 f95324a33
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Wed Dec 5 21:37:38 2018 -0800
 
@@ -32579,7 +64416,7 @@ Date:   Wed Dec 5 21:33:29 2018 -0800
  1 file changed, 5 insertions(+)
 
 commit f95324a3351c1f699214ad84d073268218ea83a3
-Merge: 6727c4b6 9d8f3b0d
+Merge: 6727c4b6f 9d8f3b0df
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
 Date:   Thu Dec 6 08:33:44 2018 +0330
 
@@ -32588,7 +64425,7 @@ Date:   Thu Dec 6 08:33:44 2018 +0330
     [CFF] oss-fuzz issue 11713 (CFF2VariationStore::serialize)
 
 commit 6727c4b6f0356b08803b4d5cde608ec004e3533f
-Merge: d9dabc00 34e3ef8f
+Merge: d9dabc00e 34e3ef8ff
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Wed Dec 5 17:37:21 2018 -0800
 
@@ -32615,7 +64452,7 @@ Date:   Wed Dec 5 17:04:55 2018 -0800
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit 34e3ef8ff394f281b8d7e2c08f346a9495692edc
-Merge: 72d8f763 d9dabc00
+Merge: 72d8f7636 d9dabc00e
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Wed Dec 5 15:50:05 2018 -0800
 
@@ -32631,7 +64468,7 @@ Date:   Wed Dec 5 15:49:11 2018 -0800
  1 file changed, 0 insertions(+), 0 deletions(-)
 
 commit d9dabc00e9278a346e85538212c126da7e610d55
-Merge: 81cfd3c7 010e2ddb
+Merge: 81cfd3c77 010e2ddb3
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Wed Dec 5 15:39:34 2018 -0800
 
@@ -32640,7 +64477,7 @@ Date:   Wed Dec 5 15:39:34 2018 -0800
     [CFF] fix oss-fuzz issue 11674: parse_bcd
 
 commit 81cfd3c775dbc470f57d7fe2775cc068ffa367b6
-Merge: 8394a6cb 6708c559
+Merge: 8394a6cb2 6708c5595
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Wed Dec 5 15:37:15 2018 -0800
 
@@ -32680,7 +64517,7 @@ Date:   Wed Dec 5 12:23:58 2018 -0800
  1 file changed, 0 insertions(+), 0 deletions(-)
 
 commit 2cb9d4c183afc838ecf2ba0d47814e9eaa6f09c6
-Merge: a5fa843c 8394a6cb
+Merge: a5fa843c7 8394a6cb2
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Wed Dec 5 11:25:29 2018 -0800
 
@@ -32735,7 +64572,7 @@ Date:   Wed Dec 5 13:51:14 2018 +0330
  3 files changed, 88 insertions(+), 2 deletions(-)
 
 commit 79e7e3445efef2dc57f8a10c7e355e802af08868
-Merge: cf4b7db6 78f639b8
+Merge: cf4b7db6b 78f639b8b
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
 Date:   Wed Dec 5 13:25:18 2018 +0330
 
@@ -32744,7 +64581,7 @@ Date:   Wed Dec 5 13:25:18 2018 +0330
     [CFF] fix for oss-fuzz 11657: Charset overrun
 
 commit cf4b7db6b1e01c11d7a8a26d95cf947935a234a7
-Merge: 32cc46c7 803d2f92
+Merge: 32cc46c75 803d2f92d
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
 Date:   Wed Dec 5 13:23:23 2018 +0330
 
@@ -32871,7 +64708,7 @@ Date:   Tue Dec 4 23:42:13 2018 +0330
  1 file changed, 2 insertions(+), 14 deletions(-)
 
 commit 803d2f92dca329a84d92c224a73e13906e8b8d56
-Merge: 6ce8d10b c775adc1
+Merge: 6ce8d10b4 c775adc13
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Tue Dec 4 11:01:26 2018 -0800
 
@@ -32907,7 +64744,7 @@ Date:   Tue Dec 4 10:22:35 2018 -0800
  2 files changed, 3 insertions(+), 2 deletions(-)
 
 commit c775adc1383f72f02b1329628b3eba1dc377a0f7
-Merge: c968869f 04f2ca94
+Merge: c968869f2 04f2ca942
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
 Date:   Tue Dec 4 21:30:07 2018 +0330
 
@@ -32934,7 +64771,7 @@ Date:   Tue Dec 4 09:24:07 2018 -0800
  1 file changed, 1 insertion(+), 2 deletions(-)
 
 commit c968869f212dbfcb86d42fb36049328521cbf00c
-Merge: 8c05b955 c48f53d3
+Merge: 8c05b955e c48f53d30
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Tue Dec 4 04:14:13 2018 -0500
 
@@ -32994,7 +64831,7 @@ Date:   Mon Dec 3 14:48:46 2018 -0800
  1 file changed, 13 insertions(+), 71 deletions(-)
 
 commit 8c05b955eb4aa088b2b5df9b6415863486eaf59c
-Merge: d19b1680 01f628cf
+Merge: d19b1680b 01f628cf5
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Mon Dec 3 14:30:51 2018 -0500
 
@@ -33216,7 +65053,7 @@ Date:   Fri Nov 30 22:43:22 2018 -0500
  6 files changed, 9372 deletions(-)
 
 commit 5e64e0f53259dbc0a3ea8e220ded15e85bbc1782
-Merge: 09096aa8 d8c69137
+Merge: 09096aa89 d8c691376
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Fri Nov 30 22:40:54 2018 -0500
 
@@ -33252,14 +65089,14 @@ Date:   Fri Nov 30 18:58:14 2018 -0800
  5 files changed, 8 insertions(+), 8 deletions(-)
 
 commit 2c859b3880868b30823eb00bed90dc0de873628b
-Merge: 9483da14 bb72de66
+Merge: 9483da145 bb72de66d
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Fri Nov 30 18:47:34 2018 -0800
 
     Merge branch 'master' into cff-subset
 
 commit bb72de66ddf3ae9ae53cf68642cb228e88aa64f5
-Merge: fedd8e6c fb059082
+Merge: fedd8e6c1 fb0590821
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Fri Nov 30 21:36:35 2018 -0500
 
@@ -33358,7 +65195,7 @@ Date:   Fri Nov 30 15:15:31 2018 -0800
  1 file changed, 2 insertions(+), 2 deletions(-)
 
 commit 9ae954f43ad1eb703d54db98ce46157370b71a9c
-Merge: 471db3aa fedd8e6c
+Merge: 471db3aa6 fedd8e6c1
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Fri Nov 30 15:00:52 2018 -0800
 
@@ -33450,7 +65287,7 @@ Date:   Fri Nov 30 12:52:21 2018 -0500
  1 file changed, 2 insertions(+), 2 deletions(-)
 
 commit 67fd94da98f950b5feb719ac805f2a45379fc935
-Merge: abd81ed4 ae79fdaa
+Merge: abd81ed4f ae79fdaa7
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Fri Nov 30 11:53:30 2018 -0500
 
@@ -33784,7 +65621,7 @@ Date:   Thu Nov 29 11:34:22 2018 -0500
  1 file changed, 2 insertions(+), 2 deletions(-)
 
 commit 0bcb1de1265368a27e53c6d935c965cbcb4130a0
-Merge: e0307de8 a85886fc
+Merge: e0307de81 a85886fc7
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Thu Nov 29 10:39:18 2018 -0500
 
@@ -33811,14 +65648,14 @@ Date:   Wed Nov 28 17:06:11 2018 -0800
  1 file changed, 9 insertions(+)
 
 commit 32d291ae899eb095500052bed2a22e5255a34838
-Merge: 1ecbf4d3 949655aa
+Merge: 1ecbf4d3e 949655aa7
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Wed Nov 28 16:27:45 2018 -0800
 
     Merge branch 'master' into cff-subset
 
 commit 949655aa7853a4513af6b5247b9822be38f5d322
-Merge: 7b78d223 d3d0f15f
+Merge: 7b78d2233 d3d0f15f7
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Wed Nov 28 17:21:57 2018 -0500
 
@@ -33871,7 +65708,7 @@ Date:   Wed Nov 28 15:24:30 2018 -0500
  2 files changed, 15 insertions(+), 1 deletion(-)
 
 commit 9e4f03b6ed80a81f8aee5ba93564f5eabab4299c
-Merge: 19863c80 a3267cf8
+Merge: 19863c805 a3267cf80
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Wed Nov 28 15:08:01 2018 -0500
 
@@ -33918,7 +65755,7 @@ Date:   Wed Nov 28 20:28:42 2018 +0330
  2 files changed, 33 insertions(+), 36 deletions(-)
 
 commit 987f4187722a05e3f360b85c66309a351fc5d6ad
-Merge: 1042d9fb 4e2a03b6
+Merge: 1042d9fbc 4e2a03b6b
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Tue Nov 27 17:40:32 2018 -0500
 
@@ -35395,7 +67232,7 @@ Date:   Fri Nov 23 15:24:17 2018 -0500
  1 file changed, 17 insertions(+), 2 deletions(-)
 
 commit 992b7128656e72f935089dc2e12c2d2a25511886
-Merge: c9cc96c0 018ba46e
+Merge: c9cc96c0c 018ba46e4
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Fri Nov 23 13:49:34 2018 -0500
 
@@ -35482,7 +67319,7 @@ Date:   Thu Nov 22 22:40:57 2018 -0500
  1 file changed, 4 insertions(+), 4 deletions(-)
 
 commit 8280459e74cff2dec3de012abd309cda9578b759
-Merge: e4a4555d 3c7792ca
+Merge: e4a4555d1 3c7792ca3
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Thu Nov 22 22:39:12 2018 -0500
 
@@ -35874,7 +67711,7 @@ Date:   Wed Nov 21 23:19:00 2018 -0500
  1 file changed, 2 insertions(+), 2 deletions(-)
 
 commit f961c1eb88af0d178e5d3431b9d57bdf79669488
-Merge: ecdceea8 264439c6
+Merge: ecdceea86 264439c6c
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Wed Nov 21 17:27:27 2018 -0500
 
@@ -35893,7 +67730,7 @@ Date:   Wed Nov 21 16:33:45 2018 -0500
  2 files changed, 1 insertion(+)
 
 commit ecdceea861952be003e1d435aa3282a4e3e200a9
-Merge: b89c7fd3 b3d5b0a5
+Merge: b89c7fd3d b3d5b0a5d
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Wed Nov 21 16:12:32 2018 -0500
 
@@ -35988,14 +67825,14 @@ Date:   Tue Nov 20 11:33:33 2018 -0500
  1 file changed, 14 insertions(+), 13 deletions(-)
 
 commit 1ecbf4d3e3de7edc86651c6f805788747d6d89af
-Merge: 515f1a16 064f703c
+Merge: 515f1a161 064f703c7
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Tue Nov 20 17:19:05 2018 -0800
 
     Merge branch 'master' into cff-subset
 
 commit 064f703c7ac5a28803a8221720e922ea6dbd2505
-Merge: be1828da 82951182
+Merge: be1828daa 829511827
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Tue Nov 20 16:29:30 2018 -0500
 
@@ -36180,7 +68017,7 @@ Date:   Mon Nov 19 11:30:40 2018 -0500
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit 515f1a16140f78c9ec379854851f77a1b44af145
-Merge: a6da9b94 e3a1a835
+Merge: a6da9b941 e3a1a8350
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Fri Nov 16 17:38:47 2018 -0800
 
@@ -36335,7 +68172,7 @@ Date:   Fri Nov 16 13:46:58 2018 -0800
  2 files changed, 12 insertions(+), 3 deletions(-)
 
 commit b403be8ad98ffd2dbe95dad73e96c7ed1295d9fc
-Merge: b67a7c73 50d1a41c
+Merge: b67a7c731 50d1a41c0
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Fri Nov 16 12:29:18 2018 -0800
 
@@ -36561,7 +68398,7 @@ Date:   Thu Nov 15 12:10:23 2018 -0800
  2 files changed, 10 insertions(+), 5 deletions(-)
 
 commit c37aecd41c5b55e5ef496f3c4cc255a1e2ce7f9f
-Merge: ecdb77f0 cabe433f
+Merge: ecdb77f0a cabe433fb
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Thu Nov 15 11:03:46 2018 -0800
 
@@ -36615,7 +68452,7 @@ Date:   Wed Nov 14 14:49:34 2018 -0500
  7 files changed, 43 insertions(+), 29 deletions(-)
 
 commit 892ab37e7c9580e35b35a4d82a99e2ea73ac7b0b
-Merge: 3787c078 7867c2ba
+Merge: 3787c0785 7867c2bad
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Wed Nov 14 13:54:07 2018 -0800
 
@@ -36674,7 +68511,7 @@ Date:   Wed Nov 14 12:13:16 2018 +0330
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit a9c27d576ffe4452d1a3dae73964a8f4d6dcc088
-Merge: 3c3eb5ea e543e1a0
+Merge: 3c3eb5ea9 e543e1a08
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
 Date:   Wed Nov 14 08:29:17 2018 +0330
 
@@ -36716,7 +68553,7 @@ Date:   Tue Nov 13 20:48:46 2018 -0500
  1 file changed, 10 insertions(+), 4 deletions(-)
 
 commit 086235f59310ed77542d4916d31a4285c68630ff
-Merge: 2092f595 c565fc3f
+Merge: 2092f595c c565fc3fb
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Tue Nov 13 19:50:25 2018 -0500
 
@@ -36725,7 +68562,7 @@ Date:   Tue Nov 13 19:50:25 2018 -0500
     Change USE Category for Grantha Virama
 
 commit 2092f595c7a4c591cace41cb99d31620fa6d5fa4
-Merge: 475be9d5 eee5b5ed
+Merge: 475be9d5c eee5b5ed0
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Tue Nov 13 19:49:06 2018 -0500
 
@@ -37019,7 +68856,7 @@ Date:   Mon Nov 12 13:01:22 2018 -0500
  2 files changed, 1 insertion(+), 1 deletion(-)
 
 commit 41a8bc7fd9399def8f580b02627a77f3972cc0e9
-Merge: 0dfa584c 77bd0a64
+Merge: 0dfa584cb 77bd0a645
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Mon Nov 12 08:49:00 2018 -0800
 
@@ -37413,7 +69250,7 @@ Date:   Sat Nov 10 19:54:08 2018 -0500
  5 files changed, 20 insertions(+), 13 deletions(-)
 
 commit fb2a037f54f3cd323a447925f6534eccd1c709c1
-Merge: 87984165 b4c61130
+Merge: 879841658 b4c611303
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Sat Nov 10 16:23:11 2018 -0800
 
@@ -37483,7 +69320,7 @@ Date:   Sat Nov 10 15:38:48 2018 -0500
  1 file changed, 5 insertions(+), 3 deletions(-)
 
 commit 5547bfa9f2815df727fa524b0ea0f136a6f955b7
-Merge: 3a9fa8c0 1d82b476
+Merge: 3a9fa8c02 1d82b4761
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Sat Nov 10 15:35:12 2018 -0500
 
@@ -37576,7 +69413,7 @@ Date:   Fri Nov 9 10:01:50 2018 -0500
  2 files changed, 5 insertions(+), 2 deletions(-)
 
 commit f51bb6ee7bd4ebca9b432851adc527ec086360fe
-Merge: 2d987110 b986fead
+Merge: 2d987110c b986fead0
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Thu Nov 8 14:42:40 2018 -0500
 
@@ -37631,7 +69468,7 @@ Date:   Thu Nov 8 20:48:54 2018 +0330
  2 files changed, 12 insertions(+), 11 deletions(-)
 
 commit 26c291aaa023d31c793b6f505c76e0dd7acbff9b
-Merge: 417963dd f9042384
+Merge: 417963dd9 f90423847
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Thu Nov 8 09:06:49 2018 -0800
 
@@ -37712,7 +69549,7 @@ Date:   Wed Nov 7 19:11:43 2018 -0500
  1 file changed, 13 insertions(+), 11 deletions(-)
 
 commit 517a1bac97b6273e03562deefcca129648698c31
-Merge: 9d502769 b18a56a2
+Merge: 9d5027696 b18a56a29
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Wed Nov 7 18:40:48 2018 -0500
 
@@ -37730,14 +69567,14 @@ Date:   Wed Nov 7 18:13:22 2018 -0500
  1 file changed, 4 insertions(+)
 
 commit 4d740206943ecb72e4be7cc4815e0a3aa3edaa9d
-Merge: e0c30b96 9d502769
+Merge: e0c30b961 9d5027696
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Wed Nov 7 15:09:30 2018 -0800
 
     Merge branch 'master' into cff-subset
 
 commit e0c30b961de87d38bff8dd49e86785a5b74fcad3
-Merge: 0996c0ff ae8fd0db
+Merge: 0996c0ff6 ae8fd0dbf
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Wed Nov 7 15:08:55 2018 -0800
 
@@ -38543,7 +70380,7 @@ Date:   Tue Nov 6 13:59:07 2018 -0800
  1 file changed, 2 insertions(+), 2 deletions(-)
 
 commit 43ee0e4d006ce7b4ade4483f2c8ec3d39723fc94
-Merge: ec6817c1 bfafe208
+Merge: ec6817c1b bfafe208d
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Tue Nov 6 09:57:17 2018 -0800
 
@@ -38992,7 +70829,7 @@ Date:   Sun Nov 4 14:17:30 2018 -0800
  1 file changed, 2 insertions(+)
 
 commit 1682d1bbecaeeddc8a1678a01c57c0e0023bf7c4
-Merge: d8fadec0 b605db2f
+Merge: d8fadec09 b605db2f6
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Sun Nov 4 13:25:41 2018 -0800
 
@@ -39360,7 +71197,7 @@ Date:   Fri Nov 2 16:40:20 2018 -0700
  3 files changed, 4 insertions(+), 4 deletions(-)
 
 commit 481fdfdc23f557400ad3aceeceeab07add78f005
-Merge: 1bc710a8 2840a104
+Merge: 1bc710a8c 2840a104c
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Fri Nov 2 15:28:09 2018 -0700
 
@@ -39622,7 +71459,7 @@ Date:   Thu Nov 1 16:18:13 2018 -0700
  7 files changed, 22 insertions(+), 26 deletions(-)
 
 commit e600e5440b3b77294df47fae947758137ea02501
-Merge: 82248b92 de96e5c8
+Merge: 82248b928 de96e5c81
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Thu Nov 1 16:13:56 2018 -0700
 
@@ -40764,7 +72601,7 @@ Date:   Mon Oct 29 13:11:01 2018 +0330
  3 files changed, 8 insertions(+), 9 deletions(-)
 
 commit 1dfe964378e97e45eedf9db9b9a7f675fe38c0bf
-Merge: f10252b4 9c692e5b
+Merge: f10252b4b 9c692e5b8
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
 Date:   Mon Oct 29 12:34:33 2018 +0330
 
@@ -41459,7 +73296,7 @@ Date:   Sat Oct 27 04:01:19 2018 -0700
  2 files changed, 4 insertions(+), 4 deletions(-)
 
 commit 524e854c15f9d6c50c5456ae0e188f039dcf153c
-Merge: 4ee3c827 8180c37d
+Merge: 4ee3c8272 8180c37df
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
 Date:   Sat Oct 27 15:04:43 2018 +0330
 
@@ -42492,7 +74329,7 @@ Date:   Thu Oct 25 13:19:34 2018 -0700
  5 files changed, 6 insertions(+), 6 deletions(-)
 
 commit 2ebf36010206cebdbe58bab6edf4e3bc011b6479
-Merge: 36c2c374 94e421ab
+Merge: 36c2c374b 94e421abb
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Thu Oct 25 13:05:06 2018 -0700
 
@@ -42719,7 +74556,7 @@ Date:   Tue Oct 23 13:09:30 2018 -0700
  2 files changed, 13 insertions(+), 14 deletions(-)
 
 commit e1241636d60a63cbfd741288716b55797a4dc8ee
-Merge: 960267fc cf92d657
+Merge: 960267fc4 cf92d6579
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Tue Oct 23 11:25:51 2018 -0700
 
@@ -43199,7 +75036,7 @@ Date:   Sun Oct 21 19:23:11 2018 -0700
  5 files changed, 85 insertions(+), 60 deletions(-)
 
 commit 570b77f7d2b41262ccb20fadbee2c6b455cd06c6
-Merge: 857c5827 d440c8d3
+Merge: 857c58279 d440c8d3f
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Mon Oct 22 13:06:47 2018 -0700
 
@@ -43254,7 +75091,7 @@ Date:   Mon Oct 22 22:07:59 2018 +0330
  9 files changed, 55 insertions(+), 4 deletions(-)
 
 commit 857c58279e82897ed69e8ade2f736073fa12883b
-Merge: 51fba41c b92b9d7e
+Merge: 51fba41cc b92b9d7e5
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Mon Oct 22 09:57:20 2018 -0700
 
@@ -43485,7 +75322,7 @@ Date:   Sun Oct 21 11:37:38 2018 +0330
  1 file changed, 0 insertions(+), 0 deletions(-)
 
 commit 4fa94a3e39c21bc1dcdbbd5bda99bff1e1490b0e
-Merge: 217a3728 c110878c
+Merge: 217a3728b c110878cb
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
 Date:   Sun Oct 21 11:36:41 2018 +0330
 
@@ -43644,7 +75481,7 @@ Date:   Sat Oct 20 12:20:30 2018 +0330
  2 files changed, 0 insertions(+), 0 deletions(-)
 
 commit 1e55e21dea78aaaddc0715e7df96fd198ec8f78a
-Merge: 964ae32a d084719f
+Merge: 964ae32aa d084719ff
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
 Date:   Sat Oct 20 07:45:46 2018 +0330
 
@@ -43976,7 +75813,7 @@ Date:   Fri Oct 19 08:09:53 2018 +0330
  13 files changed, 0 insertions(+), 0 deletions(-)
 
 commit 51fba41cc958ded3afc6c1e738895b0a81993e18
-Merge: e555ed96 3d9a0306
+Merge: e555ed961 3d9a0306e
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Thu Oct 18 13:08:42 2018 -0700
 
@@ -44263,7 +76100,7 @@ Date:   Wed Oct 17 15:04:35 2018 -0700
  18 files changed, 7 insertions(+), 7 deletions(-)
 
 commit 1f34388e8b40a77157f61c8e1a2fc7c4846c192e
-Merge: 9ade3e7b 2e7c7165
+Merge: 9ade3e7bb 2e7c71651
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Wed Oct 17 09:34:48 2018 -0700
 
@@ -44726,7 +76563,7 @@ Date:   Mon Oct 15 19:46:45 2018 -0700
  1 file changed, 4 insertions(+), 3 deletions(-)
 
 commit 9ade3e7bb81be43b3c0811614b9b9533127894b0
-Merge: 6420ffe0 0f85edb7
+Merge: 6420ffe00 0f85edb77
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Mon Oct 15 14:03:23 2018 -0700
 
@@ -44925,7 +76762,7 @@ Date:   Sun Oct 14 14:52:17 2018 -0700
  1 file changed, 3 insertions(+), 2 deletions(-)
 
 commit db0d83ddc73ecf50ec4489fc10eddf3fa5835ae2
-Merge: 9228db06 56b8dd17
+Merge: 9228db06f 56b8dd17f
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Sat Oct 13 17:25:38 2018 -0700
 
@@ -45189,7 +77026,7 @@ Date:   Thu Oct 11 21:18:20 2018 -0400
  1 file changed, 4 deletions(-)
 
 commit fc0153a1d4903a57b21974cc8d0b0a82d7bc43dc
-Merge: 7d99a6ce c5510000
+Merge: 7d99a6cef c55100000
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Fri Oct 12 12:16:50 2018 -0700
 
@@ -45719,7 +77556,7 @@ Date:   Thu Dec 28 22:59:29 2017 +0800
  2 files changed, 4 insertions(+), 4 deletions(-)
 
 commit ce6639cd27f79856466a5e8abf58f544f069e25d
-Merge: a6b6faf2 0b9d60e1
+Merge: a6b6faf2b 0b9d60e1a
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Thu Oct 11 10:53:48 2018 -0700
 
@@ -45973,7 +77810,7 @@ Date:   Wed Oct 10 21:46:58 2018 -0400
  1 file changed, 10 insertions(+), 5 deletions(-)
 
 commit b5aa5dbb1158a5dfba29f7b119df9b4b319e8489
-Merge: af61c3b1 ab1f30bd
+Merge: af61c3b10 ab1f30bd0
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Wed Oct 10 18:36:35 2018 -0700
 
@@ -46352,7 +78189,7 @@ Date:   Wed Oct 10 17:12:52 2018 +0330
  2 files changed, 100 insertions(+), 52 deletions(-)
 
 commit c06a5dff0b0f8d1c5aba53bcfd7fb0b680f1ca92
-Merge: 83c5298f 0537a401
+Merge: 83c5298f3 0537a4019
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Tue Oct 9 22:00:10 2018 -0700
 
@@ -46725,7 +78562,7 @@ Date:   Tue Oct 9 14:12:59 2018 -0400
  1 file changed, 4 insertions(+), 10 deletions(-)
 
 commit f5f505b5120c316f06306318c6c2f0db4496ba04
-Merge: 8b349040 4035158d
+Merge: 8b349040e 4035158de
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Tue Oct 9 10:10:35 2018 -0700
 
@@ -46881,7 +78718,7 @@ Date:   Tue Oct 9 00:56:33 2018 -0400
  3 files changed, 18 insertions(+), 27 deletions(-)
 
 commit 8b349040e92b8894a7f8a609fac8070bcb110f96
-Merge: df964a09 fc509165
+Merge: df964a093 fc5091658
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Mon Oct 8 21:46:23 2018 -0700
 
@@ -47054,7 +78891,7 @@ Date:   Mon Oct 8 15:38:05 2018 -0700
  2 files changed, 4 insertions(+), 5 deletions(-)
 
 commit a90fd8b9feeee3b02d139f2e7db774766d7855cb
-Merge: b51418f5 e42cd58c
+Merge: b51418f59 e42cd58c9
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Mon Oct 8 15:07:58 2018 -0700
 
@@ -47719,7 +79556,7 @@ Date:   Wed Oct 3 17:44:45 2018 -0700
  2 files changed, 2 insertions(+), 2 deletions(-)
 
 commit 8be5a9186be3ca4c50c73f372be4dbad08ac1863
-Merge: d7b384ad 5de2d9cd
+Merge: d7b384ad0 5de2d9cdb
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Wed Oct 3 17:06:18 2018 -0700
 
@@ -48183,7 +80020,7 @@ Date:   Tue Oct 2 13:45:14 2018 -0700
  1 file changed, 174 insertions(+), 174 deletions(-)
 
 commit 9cdd70b344b9dc34a29aeca79028cbb5d949ca1d
-Merge: 3dd43f02 6353cc1f
+Merge: 3dd43f023 6353cc1f8
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Tue Oct 2 13:43:21 2018 -0700
 
@@ -48566,7 +80403,7 @@ Date:   Mon Oct 1 19:09:58 2018 +0200
  5 files changed, 270 insertions(+), 177 deletions(-)
 
 commit 3dd43f0234febd434d89927adf2ee19f0489c5a7
-Merge: ab16b24c eb1e6028
+Merge: ab16b24cc eb1e60287
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Mon Oct 1 10:22:06 2018 -0700
 
@@ -49259,7 +81096,7 @@ Date:   Thu Sep 27 16:54:23 2018 -0400
  1 file changed, 4 insertions(+), 1 deletion(-)
 
 commit 341b70a3b47ef3ceeb81e715937d6b2305258060
-Merge: bbf2a095 9e9a36ee
+Merge: bbf2a0954 9e9a36ee6
 Author: n8willis <n8willis@users.noreply.github.com>
 Date:   Thu Sep 27 11:15:22 2018 -0500
 
@@ -49595,7 +81432,7 @@ Date:   Mon Sep 24 13:11:34 2018 -0400
  1 file changed, 2 insertions(+), 2 deletions(-)
 
 commit 0604bf2b3846b200c56447ffe542bf69c0529a06
-Merge: 76e54d2b 45f5aa97
+Merge: 76e54d2bd 45f5aa979
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Mon Sep 24 10:09:25 2018 -0700
 
@@ -50017,7 +81854,7 @@ Date:   Mon Sep 17 13:56:39 2018 -0700
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit d050ab8d3e73debfb414fc8c9426180459150b61
-Merge: f0a4e0c2 388ab916
+Merge: f0a4e0c2c 388ab9164
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Mon Sep 17 13:07:29 2018 -0700
 
@@ -50342,7 +82179,7 @@ Date:   Fri Sep 14 10:58:00 2018 +0200
  1 file changed, 1 insertion(+), 2 deletions(-)
 
 commit f2c4720ae696096d90493db218ef1283681561e7
-Merge: 1234a813 ca746f26
+Merge: 1234a8136 ca746f261
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Thu Sep 13 12:44:00 2018 -0700
 
@@ -50637,7 +82474,7 @@ Date:   Tue Sep 11 10:43:15 2018 -0700
  2 files changed, 44 insertions(+), 15 deletions(-)
 
 commit 45e564a51917475ef6481825a6efb5b99bf1912e
-Merge: c6f75c30 d5c50927
+Merge: c6f75c304 d5c509272
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Tue Sep 11 09:46:37 2018 -0700
 
@@ -51236,7 +83073,7 @@ Date:   Fri Sep 7 15:02:57 2018 -0400
  8 files changed, 18 insertions(+), 18 deletions(-)
 
 commit 1e88b1755c37eaa171c08f7bedb93f110238c80f
-Merge: 22b88632 ebe67137
+Merge: 22b88632d ebe67137a
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Fri Sep 7 10:50:55 2018 -0700
 
@@ -51261,7 +83098,7 @@ Date:   Fri Sep 7 10:24:22 2018 -0400
  1 file changed, 3 insertions(+)
 
 commit 22b88632d5bd3676642b0a1d93f27e47438c140b
-Merge: 2a74536a 21bf1470
+Merge: 2a74536aa 21bf14705
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Thu Sep 6 22:27:44 2018 -0700
 
@@ -51764,7 +83601,7 @@ Date:   Wed Aug 29 13:36:39 2018 -0700
  5 files changed, 15 insertions(+), 15 deletions(-)
 
 commit 8af9690ac7ce41fb1db878d556df5c4ee624eaa0
-Merge: 0ad081ec fee0f41c
+Merge: 0ad081ec3 fee0f41c6
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Wed Aug 29 13:26:17 2018 -0700
 
@@ -52662,7 +84499,7 @@ Date:   Wed Aug 15 15:30:24 2018 -0700
  1 file changed, 2 insertions(+), 2 deletions(-)
 
 commit 25b8310b2a3e074c9d1d723ab6d10a29f8d189be
-Merge: 7aa23f35 22defe09
+Merge: 7aa23f359 22defe096
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Wed Aug 15 15:00:55 2018 -0700
 
@@ -53054,7 +84891,7 @@ Date:   Thu Aug 9 15:16:32 2018 +0700
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit a3a8c85b027779365bb33e2063221b4650fbac3b
-Merge: 145f371d 652cd45c
+Merge: 145f371d7 652cd45c6
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Fri Aug 10 13:41:42 2018 -0700
 
@@ -53361,7 +85198,7 @@ Date:   Mon Aug 6 15:32:13 2018 -0700
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit 161ece4c3097096f355dc5ea514320a8dc678bea
-Merge: e8d695eb 79e21984
+Merge: e8d695eba 79e21984b
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Mon Aug 6 11:23:50 2018 -0700
 
@@ -53776,7 +85613,7 @@ Date:   Thu Aug 2 12:23:10 2018 -0700
  1 file changed, 14 insertions(+), 15 deletions(-)
 
 commit e2fd49e4779663e3138bd1990736a9cf850303bf
-Merge: 693ae804 d4d1bf81
+Merge: 693ae8047 d4d1bf817
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Thu Aug 2 11:39:22 2018 -0700
 
@@ -54666,7 +86503,7 @@ Date:   Mon Jul 30 14:28:40 2018 -0700
  3 files changed, 72 insertions(+), 23 deletions(-)
 
 commit 161b642ec5babc7e4b81d41f725d81ad2caa9330
-Merge: 3a61c3e9 5edf454a
+Merge: 3a61c3e93 5edf454aa
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Mon Jul 30 12:22:09 2018 -0700
 
@@ -55183,7 +87020,7 @@ Date:   Mon Jul 16 15:41:09 2018 +0200
  3 files changed, 26 insertions(+), 5 deletions(-)
 
 commit 524411224054b23bab4adad7343314df45c9c183
-Merge: 2aae617a 269eb456
+Merge: 2aae617a8 269eb4565
 Author: Cosimo Lupo <cosimo@anthrotype.com>
 Date:   Mon Jul 16 14:42:43 2018 +0200
 
@@ -55500,7 +87337,7 @@ Date:   Tue Jul 10 12:51:29 2018 +0200
  1 file changed, 1 insertion(+)
 
 commit bf9e9676dda686f5b76826b4e3148f4a0b512e3c
-Merge: 46d8f0d5 53f73409
+Merge: 46d8f0d55 53f73409a
 Author: Cosimo Lupo <cosimo@anthrotype.com>
 Date:   Mon Jul 9 20:24:22 2018 +0200
 
@@ -55879,7 +87716,7 @@ Date:   Fri Jun 22 15:29:34 2018 -0700
  1 file changed, 0 insertions(+), 0 deletions(-)
 
 commit bbf2a09549a88bd52ac3db89a0ae93f3b71b3e37
-Merge: 8db058d2 35ce8f31
+Merge: 8db058d20 35ce8f31d
 Author: Nathan Willis <nwillis@glyphography.com>
 Date:   Mon Jun 25 13:02:11 2018 -0500
 
@@ -57291,7 +89128,7 @@ Date:   Tue May 8 16:42:45 2018 -0700
  1 file changed, 5 insertions(+), 5 deletions(-)
 
 commit 0644d92ef32b09e32d473c758d2a968f2d125628
-Merge: 2a2e28e7 3be050f0
+Merge: 2a2e28e70 3be050f07
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Tue May 8 15:21:09 2018 -0700
 
@@ -58200,7 +90037,7 @@ Date:   Sun Apr 15 21:18:48 2018 +0430
  3 files changed, 5 insertions(+), 5 deletions(-)
 
 commit 3737c652a5e0b6d73b6090dc6c3863008c9dc8fd
-Merge: 632713ba 8f4c1230
+Merge: 632713bab 8f4c12308
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
 Date:   Fri Apr 13 23:19:19 2018 +0430
 
@@ -59271,7 +91108,7 @@ Date:   Wed Mar 14 15:51:33 2018 +0100
  1 file changed, 13 deletions(-)
 
 commit 791d80a1d42ce0bd7c5f0a3d3d10c562a6161a82
-Merge: d4907e83 22de9bf5
+Merge: d4907e83e 22de9bf56
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
 Date:   Thu Mar 15 11:40:52 2018 +0330
 
@@ -59321,7 +91158,7 @@ Date:   Wed Mar 14 00:50:32 2018 +0000
  1 file changed, 12 insertions(+), 8 deletions(-)
 
 commit a12dd6f75d85cf29ed78182ac97a12ebbcf77375
-Merge: 28f25f32 7c43adab
+Merge: 28f25f32f 7c43adab6
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
 Date:   Wed Mar 14 02:54:07 2018 +0330
 
@@ -59475,7 +91312,7 @@ Date:   Sat Mar 10 00:44:36 2018 +0330
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit 743ef317619a57ebf5a75935db0eecccade5d5b7
-Merge: 9206762b 39b2f69f
+Merge: 9206762bb 39b2f69fa
 Author: Garret Rieger <grieger@google.com>
 Date:   Fri Mar 9 12:06:52 2018 -0700
 
@@ -59515,7 +91352,7 @@ Date:   Thu Mar 8 16:30:36 2018 -0800
  1 file changed, 34 insertions(+), 15 deletions(-)
 
 commit dbe552770fa7cec91bba750e0e81aaeae96b3caf
-Merge: 2ebf4c69 8548fa15
+Merge: 2ebf4c69b 8548fa152
 Author: Garret Rieger <grieger@google.com>
 Date:   Thu Mar 8 15:50:25 2018 -0700
 
@@ -59582,7 +91419,7 @@ Date:   Thu Mar 1 18:20:00 2018 -0800
  14 files changed, 18 insertions(+)
 
 commit 2ebf4c69b18452caa0c871aebec9785e80348166
-Merge: 1ab51480 869ccac5
+Merge: 1ab514805 869ccac5a
 Author: Garret Rieger <grieger@google.com>
 Date:   Thu Mar 8 14:41:59 2018 -0700
 
@@ -59621,7 +91458,7 @@ Date:   Tue Mar 6 18:33:39 2018 -0800
  2 files changed, 32 insertions(+)
 
 commit 1ab514805ced190efdabc2103e4800d40b248300
-Merge: 70ad69f2 362f2824
+Merge: 70ad69f24 362f28240
 Author: Garret Rieger <grieger@google.com>
 Date:   Wed Mar 7 12:36:00 2018 -0700
 
@@ -60020,7 +91857,7 @@ Date:   Wed Feb 28 15:44:00 2018 -0800
  1 file changed, 23 insertions(+), 2 deletions(-)
 
 commit 588a4e0f9b2d71362503a274de7200f3eb4367f7
-Merge: 55a4dfa3 b3f1a045
+Merge: 55a4dfa37 b3f1a045a
 Author: rsheeter <rsheeter@google.com>
 Date:   Wed Feb 28 13:52:29 2018 -0800
 
@@ -60058,7 +91895,7 @@ Date:   Wed Feb 28 15:43:23 2018 +0330
  1 file changed, 2 insertions(+), 2 deletions(-)
 
 commit 3821978bcd92cbdb607111452796e051c456f391
-Merge: 77227462 f671f7f0
+Merge: 772274625 f671f7f0a
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
 Date:   Wed Feb 28 13:30:17 2018 +0330
 
@@ -60082,7 +91919,7 @@ Date:   Wed Feb 28 13:19:40 2018 +0330
  7 files changed, 122 insertions(+), 18 deletions(-)
 
 commit 772274625e9f17d726f2a1da8192ec3ec24793a3
-Merge: 0eec3315 5b9c2340
+Merge: 0eec33154 5b9c23404
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
 Date:   Wed Feb 28 12:05:49 2018 +0330
 
@@ -60140,7 +91977,7 @@ Date:   Tue Feb 27 20:17:04 2018 -0800
  3 files changed, 3 insertions(+), 4 deletions(-)
 
 commit c8b230e4377bc8e80d37835a229511ce0e30cc47
-Merge: b3790a65 904dd7be
+Merge: b3790a65a 904dd7bee
 Author: Rod Sheeter <rsheeter@google.com>
 Date:   Tue Feb 27 17:25:32 2018 -0800
 
@@ -60230,7 +92067,7 @@ Date:   Tue Feb 27 17:23:30 2018 -0800
  2 files changed, 29 insertions(+), 6 deletions(-)
 
 commit 4c6023f861a4b87782c17ac626ffee7e93f15fc8
-Merge: d7633d0a 921b65cb
+Merge: d7633d0a4 921b65cbc
 Author: Garret Rieger <grieger@google.com>
 Date:   Tue Feb 27 17:06:27 2018 -0700
 
@@ -60295,14 +92132,14 @@ Date:   Tue Feb 27 12:45:26 2018 -0800
  2 files changed, 125 insertions(+), 139 deletions(-)
 
 commit 101850f9e6b9e0932fe1dd4169f88d6764c669c1
-Merge: 5967eaba f110c0c8
+Merge: 5967eaba7 f110c0c88
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
 Date:   Tue Feb 27 20:15:54 2018 +0330
 
     Merge with master
 
 commit f110c0c8866c853c0d5a930564a2b69231a33322
-Merge: 4a1d51ef 0ad8c663
+Merge: 4a1d51ef1 0ad8c663e
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
 Date:   Tue Feb 27 11:41:12 2018 +0330
 
@@ -60322,7 +92159,7 @@ Date:   Mon Feb 26 12:45:08 2018 +0330
  3 files changed, 35 insertions(+), 37 deletions(-)
 
 commit 4a1d51ef15a423706406f784a146078073147885
-Merge: d0caf7e5 903771b6
+Merge: d0caf7e5e 903771b6c
 Author: rsheeter <rsheeter@google.com>
 Date:   Mon Feb 26 20:23:41 2018 -0800
 
@@ -60341,7 +92178,7 @@ Date:   Mon Feb 26 19:50:06 2018 -0800
  2 files changed, 13 insertions(+), 12 deletions(-)
 
 commit d0caf7e5e3294c25230ed0e5580c647fa0f1a2c8
-Merge: 6c844ae8 44dc36dd
+Merge: 6c844ae8e 44dc36dd8
 Author: Garret Rieger <grieger@google.com>
 Date:   Mon Feb 26 19:24:18 2018 -0700
 
@@ -60648,7 +92485,7 @@ Date:   Sun Feb 25 16:32:17 2018 -0800
  5 files changed, 105 insertions(+), 92 deletions(-)
 
 commit 05699fd996ed9c0e5dde8918388ac188e58df1a7
-Merge: 83af6c23 3ebcd5a3
+Merge: 83af6c237 3ebcd5a38
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Sat Feb 24 12:01:54 2018 -0800
 
@@ -60733,7 +92570,7 @@ Date:   Fri Feb 23 18:18:54 2018 -0800
  2 files changed, 10 insertions(+), 4 deletions(-)
 
 commit d78393b5547135b8db0356b0ec14d5ed0d334768
-Merge: 1454d82a 83af6c23
+Merge: 1454d82a9 83af6c237
 Author: Rod Sheeter <rsheeter@google.com>
 Date:   Fri Feb 23 17:53:26 2018 -0800
 
@@ -60761,7 +92598,7 @@ Date:   Fri Feb 23 17:43:00 2018 -0800
  3 files changed, 21 insertions(+), 8 deletions(-)
 
 commit 83af6c237f2bfd66af76a8647a62b3d1ab996744
-Merge: 7e5e1feb dc5c7927
+Merge: 7e5e1feb6 dc5c7927e
 Author: Garret Rieger <grieger@google.com>
 Date:   Fri Feb 23 18:33:25 2018 -0700
 
@@ -60784,7 +92621,7 @@ Date:   Fri Feb 23 16:42:06 2018 -0800
  3 files changed, 43 insertions(+), 12 deletions(-)
 
 commit 7e5e1feb666d6a861b5cd64bf29a16e3854fb812
-Merge: ec2538c8 99967e21
+Merge: ec2538c88 99967e21c
 Author: Garret Rieger <grieger@google.com>
 Date:   Fri Feb 23 17:59:08 2018 -0700
 
@@ -60904,7 +92741,7 @@ Date:   Fri Feb 23 13:05:58 2018 -0800
  7 files changed, 117 insertions(+), 24 deletions(-)
 
 commit b1ec82105189053d648a798cf5b3ab2887046298
-Merge: e15e41ef c2e4713b
+Merge: e15e41ef1 c2e4713b5
 Author: Garret Rieger <grieger@google.com>
 Date:   Fri Feb 23 12:32:18 2018 -0700
 
@@ -61250,7 +93087,7 @@ Date:   Tue Feb 20 15:33:03 2018 -0800
  1 file changed, 41 insertions(+), 14 deletions(-)
 
 commit 73e20ec6e9ad86bea023fc8b6fc10287889ed048
-Merge: 6ae4013f 69e443b2
+Merge: 6ae4013f2 69e443b25
 Author: Garret Rieger <grieger@google.com>
 Date:   Tue Feb 20 17:34:59 2018 -0700
 
@@ -61521,7 +93358,7 @@ Date:   Mon Feb 19 03:17:44 2018 +0330
  4 files changed, 381 insertions(+)
 
 commit 279c70a5b36446f444e5d2f4ac1db7614c8a3db8
-Merge: e9164478 89b82814
+Merge: e91644786 89b82814b
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Sun Feb 18 14:04:33 2018 -0800
 
@@ -61570,7 +93407,7 @@ Date:   Sun Feb 18 23:25:15 2018 +0330
  1 file changed, 2 insertions(+), 3 deletions(-)
 
 commit 79d0d791b9ee920e1f687a93de5adf5d113cc829
-Merge: 21646cc4 97a71102
+Merge: 21646cc4a 97a711021
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Sun Feb 18 11:35:51 2018 -0800
 
@@ -61590,7 +93427,7 @@ Date:   Sun Feb 18 10:50:24 2018 -0800
  1 file changed, 2 insertions(+), 2 deletions(-)
 
 commit fe8f40a4180e7b02831a264c0b3c66763156abb6
-Merge: cd11107b 21646cc4
+Merge: cd11107bb 21646cc4a
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Sun Feb 18 10:45:33 2018 -0800
 
@@ -61849,7 +93686,7 @@ Date:   Fri Feb 16 15:36:20 2018 -0800
  1 file changed, 1 insertion(+)
 
 commit 926db874552519734fab6c04258887ea634f5324
-Merge: 882a3bf4 c7a633f9
+Merge: 882a3bf4a c7a633f95
 Author: rsheeter <rsheeter@google.com>
 Date:   Fri Feb 16 15:27:29 2018 -0800
 
@@ -61938,7 +93775,7 @@ Date:   Fri Feb 16 06:26:02 2018 -0800
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit be0a01a67613f45db7f7e9be84cb883f0344c817
-Merge: 7acaa3b7 139c9928
+Merge: 7acaa3b78 139c9928f
 Author: Rod Sheeter <rsheeter@google.com>
 Date:   Fri Feb 16 06:01:41 2018 -0800
 
@@ -62103,7 +93940,7 @@ Date:   Wed Feb 14 18:43:53 2018 -0800
  1 file changed, 1 insertion(+)
 
 commit 5ae6526ef4aa9b3c943cad984dc2fff09cdf597b
-Merge: 2903b2f3 04c1ec2b
+Merge: 2903b2f35 04c1ec2b7
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Wed Feb 14 18:42:32 2018 -0800
 
@@ -62364,7 +94201,7 @@ Date:   Wed Feb 14 10:52:41 2018 -0800
  1 file changed, 4 insertions(+), 10 deletions(-)
 
 commit d008b62887afe631f50009f40e605c8456ddd011
-Merge: b0eefacf 109314cb
+Merge: b0eefacf4 109314cb5
 Author: Garret Rieger <grieger@google.com>
 Date:   Wed Feb 14 10:38:52 2018 -0800
 
@@ -63337,7 +95174,7 @@ Date:   Sat Feb 10 13:25:49 2018 -0600
  1 file changed, 6 insertions(+), 9 deletions(-)
 
 commit 570d523761b23a3c668d9071712d5f10944d21fc
-Merge: 71130a20 d18decd2
+Merge: 71130a20f d18decd20
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Sat Feb 10 13:24:22 2018 -0600
 
@@ -64300,7 +96137,7 @@ Date:   Sun Feb 4 20:22:07 2018 -0500
  1 file changed, 1 insertion(+), 6 deletions(-)
 
 commit fc1e82a5aef410138381bc8f5476dcff5679b464
-Merge: ae39fc81 2ea22893
+Merge: ae39fc817 2ea228935
 Author: Garret Rieger <grieger@google.com>
 Date:   Mon Feb 5 15:35:13 2018 -0800
 
@@ -64377,7 +96214,7 @@ Date:   Sun Feb 4 20:08:50 2018 -0500
  3 files changed, 7 insertions(+), 7 deletions(-)
 
 commit 257022b1789f928975b04b5d214bbe9192e11997
-Merge: 3615f344 edcd3b80
+Merge: 3615f344e edcd3b80e
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Sun Feb 4 20:01:35 2018 -0500
 
@@ -67466,7 +99303,7 @@ Date:   Fri Jan 5 12:55:39 2018 +0000
  1 file changed, 0 insertions(+), 0 deletions(-)
 
 commit 127bcc6ece4da64e807f652dd84a17c6a8c5e300
-Merge: 72bec1cd 8c0d1916
+Merge: 72bec1cd0 8c0d1916a
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Fri Jan 5 12:50:22 2018 +0000
 
@@ -69335,7 +101172,7 @@ Date:   Tue Oct 31 14:25:46 2017 -0600
  1 file changed, 3 insertions(+), 3 deletions(-)
 
 commit 0f78d78aae604cb8e61bd21785adb915da74626e
-Merge: b7982c9e 0feff4ba
+Merge: b7982c9e6 0feff4ba7
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Tue Oct 31 14:13:31 2017 -0600
 
@@ -69870,7 +101707,7 @@ Date:   Mon Oct 16 10:05:42 2017 +0200
  5 files changed, 143 insertions(+), 5 deletions(-)
 
 commit bf133497e53e8b1dcd22df62080d33e7f3d85b68
-Merge: fd786c76 49a41dc7
+Merge: fd786c768 49a41dc75
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Wed Oct 25 17:23:20 2017 -0600
 
@@ -70038,7 +101875,7 @@ Date:   Mon Oct 23 08:34:30 2017 -0400
  1 file changed, 6 insertions(+), 6 deletions(-)
 
 commit 57cf978fa314bd87405a2b133e58fcb116e574a6
-Merge: ce979454 6cc49762
+Merge: ce9794544 6cc49762c
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Sun Oct 22 18:24:59 2017 -0400
 
@@ -70054,7 +101891,7 @@ Date:   Sun Oct 22 18:23:38 2017 -0400
  1 file changed, 2 insertions(+), 2 deletions(-)
 
 commit 6cc49762c4fdfd0e2770a84d1b1f055acf42376f
-Merge: 8b9d9b71 19923279
+Merge: 8b9d9b71b 19923279a
 Author: ebraminio <ebrahim@gnu.org>
 Date:   Mon Oct 23 01:48:22 2017 +0330
 
@@ -70094,7 +101931,7 @@ Date:   Sun Oct 22 17:38:33 2017 -0400
  2 files changed, 14 insertions(+), 1 deletion(-)
 
 commit d59d5dc7d339deb45cc84cffd084b52752765a08
-Merge: ced86da7 3ee15a60
+Merge: ced86da7d 3ee15a603
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Sun Oct 22 17:08:29 2017 -0400
 
@@ -70110,7 +101947,7 @@ Date:   Sun Oct 22 17:03:36 2017 -0400
  1 file changed, 3 insertions(+), 3 deletions(-)
 
 commit bc1183aa6ba45a527084d391d6e7f801d6196060
-Merge: d45a2138 bfe0faf1
+Merge: d45a2138d bfe0faf1a
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Sun Oct 22 17:06:00 2017 -0400
 
@@ -70135,7 +101972,7 @@ Date:   Sun Oct 22 15:54:50 2017 -0400
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit d45a2138d9d54eab158046d6503f1bb104efce25
-Merge: d8adaa97 41b18251
+Merge: d8adaa97f 41b182519
 Author: ebraminio <ebrahim@gnu.org>
 Date:   Sat Oct 21 10:19:55 2017 +0330
 
@@ -70690,7 +102527,7 @@ Date:   Fri Oct 13 10:21:07 2017 +0200
  1 file changed, 11 insertions(+), 7 deletions(-)
 
 commit 4f9a83ec2109b754a75c962e88117d063e6fed43
-Merge: fa48ccbe 40b05d7b
+Merge: fa48ccbe1 40b05d7b7
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Thu Oct 12 14:08:58 2017 +0200
 
@@ -70934,7 +102771,7 @@ Date:   Wed Oct 11 14:09:30 2017 +0200
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit 7b23c286a71883ac3e5777a2dee262af48c76854
-Merge: 8d450dd1 a5ebe1d4
+Merge: 8d450dd18 a5ebe1d4a
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Wed Oct 11 13:35:32 2017 +0200
 
@@ -71330,7 +103167,7 @@ Date:   Tue Oct 3 13:46:25 2017 +0200
  4 files changed, 5 insertions(+), 1 deletion(-)
 
 commit ea772932d2430ebc7ea712a8c46ec2500966225d
-Merge: 771970ef c44657a0
+Merge: 771970efa c44657a05
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Tue Oct 3 13:25:44 2017 +0200
 
@@ -73318,7 +105155,7 @@ Date:   Thu Feb 9 14:13:25 2017 -0800
  1 file changed, 3 insertions(+)
 
 commit c8dfed8e1ee4ab64b6936f5c8561db0666e37647
-Merge: 7c47474f b435c7c4
+Merge: 7c47474f2 b435c7c46
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Wed Feb 8 14:36:18 2017 -0800
 
@@ -75243,7 +107080,7 @@ Date:   Sun Oct 23 14:39:43 2016 +0200
  1 file changed, 3 insertions(+)
 
 commit 8c854dc023b1f9e081a3bbd16416b88a4671c267
-Merge: bb9805f5 c3fa5d0e
+Merge: bb9805f54 c3fa5d0e0
 Author: Khaled Hosny <khaledhosny@eglug.org>
 Date:   Tue Oct 25 00:31:36 2016 +0300
 
@@ -75261,7 +107098,7 @@ Date:   Mon Oct 24 21:42:04 2016 +0200
  1 file changed, 1 deletion(-)
 
 commit bb9805f5419f18c7f5cab32d660fd4109c30f7cc
-Merge: 702d9f52 755a0c20
+Merge: 702d9f522 755a0c207
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
 Date:   Sat Oct 22 12:23:05 2016 +0330
 
@@ -75289,7 +107126,7 @@ Date:   Tue Oct 18 14:30:00 2016 +0330
  2 files changed, 10 insertions(+)
 
 commit 702d9f522d1ac4797700f0ea056f69169b8d1a78
-Merge: 331c46c7 d8e2eb9e
+Merge: 331c46c79 d8e2eb9ee
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
 Date:   Fri Oct 14 13:54:55 2016 +0330
 
@@ -75329,7 +107166,7 @@ Date:   Tue Oct 11 13:45:22 2016 -0700
  1 file changed, 2 insertions(+), 1 deletion(-)
 
 commit f6e194e77a2c34cd118b47c0d73a22afde85dfda
-Merge: 7201fdd0 bef240b3
+Merge: 7201fdd0a bef240b36
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
 Date:   Tue Oct 11 17:23:41 2016 +0330
 
@@ -75399,7 +107236,7 @@ Date:   Tue Sep 27 17:56:35 2016 +0200
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit 6d3e6abf0c6ad55dabae96c76b4da9ab14bf16ef
-Merge: f73a87d9 c3e21a66
+Merge: f73a87d9a c3e21a662
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Tue Sep 27 17:15:59 2016 +0200
 
@@ -75886,7 +107723,7 @@ Date:   Sat Aug 27 16:38:42 2016 +0300
  1 file changed, 3 insertions(+), 2 deletions(-)
 
 commit 547ddb0721365dca985aef5b759d08718f7c5f82
-Merge: bd1aac9c e7ecbba2
+Merge: bd1aac9c0 e7ecbba2c
 Author: Sascha Brawer <sascha@brawer.ch>
 Date:   Thu Aug 18 22:33:14 2016 +0200
 
@@ -75911,7 +107748,7 @@ Date:   Thu Aug 18 12:48:38 2016 +0200
  2 files changed, 18 insertions(+), 2 deletions(-)
 
 commit bd1aac9c0021a936058637424a478abf792533dd
-Merge: 18c19dd3 a0f1b44b
+Merge: 18c19dd34 a0f1b44b6
 Author: Sascha Brawer <sascha@brawer.ch>
 Date:   Thu Aug 18 13:59:38 2016 +0200
 
@@ -76166,7 +108003,7 @@ Date:   Mon Jul 11 21:57:26 2016 +0200
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit 2f522fd485c2e946c9bce9e3828b6ff6247c59e4
-Merge: d3e2a06b e4d451ee
+Merge: d3e2a06b0 e4d451ee5
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Fri Jul 1 17:09:28 2016 -0700
 
@@ -76204,7 +108041,7 @@ Date:   Thu Jun 30 09:46:52 2016 -0700
  1 file changed, 9 insertions(+), 9 deletions(-)
 
 commit 46809dee30232d493539519b1bb527fa816c37db
-Merge: 70e72e5f 1bea49eb
+Merge: 70e72e5f6 1bea49eb4
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Thu Jun 30 09:41:03 2016 -0700
 
@@ -76213,7 +108050,7 @@ Date:   Thu Jun 30 09:41:03 2016 -0700
     Discard reconfigured CTFont if URL changes
 
 commit 1bea49eb4b7a94ab6222f9c3c40320cbdb247b2d
-Merge: 7aa3631d 70e72e5f
+Merge: 7aa3631dd 70e72e5f6
 Author: Dominik Röttsches <d-r@roettsches.de>
 Date:   Wed Jun 29 12:10:41 2016 +0200
 
@@ -76234,7 +108071,7 @@ Date:   Tue Jun 28 21:00:37 2016 -0700
  4 files changed, 13 insertions(+), 18 deletions(-)
 
 commit d8273aac19771033c5064a2f079c29d09a86e7c0
-Merge: abae93fa ae9054c7
+Merge: abae93fae ae9054c74
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Tue Jun 28 21:15:28 2016 -0700
 
@@ -76252,14 +108089,14 @@ Date:   Tue Jun 28 21:14:38 2016 -0700
  1 file changed, 1 insertion(+), 2 deletions(-)
 
 commit 7aa3631dd06af74a1fa9f0bfaa5f721876be817f
-Merge: f7da0486 abae93fa
+Merge: f7da0486e abae93fae
 Author: Dominik Röttsches <d-r@roettsches.de>
 Date:   Tue Jun 28 09:52:18 2016 +0200
 
     Merge branch 'master' into conflictingFontFix
 
 commit abae93faef32562f34a72981d252c848cc4f7565
-Merge: 07461d06 8179ff5d
+Merge: 07461d06d 8179ff5d7
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Mon Jun 27 14:33:27 2016 -0400
 
@@ -76342,7 +108179,7 @@ Date:   Tue Jun 21 13:57:26 2016 +0430
  2 files changed, 135 insertions(+), 217 deletions(-)
 
 commit f7da0486ed8884481d477ce08fcf928c4da9a0a3
-Merge: a0223274 07461d06
+Merge: a0223274b 07461d06d
 Author: Dominik Röttsches <d-r@roettsches.de>
 Date:   Mon Jun 20 10:25:43 2016 +0300
 
@@ -76380,7 +108217,7 @@ Date:   Sat Jun 18 22:46:38 2016 +0000
  1 file changed, 2 insertions(+), 1 deletion(-)
 
 commit fca0c61d67aa309fc824fb18f247493c2b7701ef
-Merge: 4b8de1ea 98835058
+Merge: 4b8de1ea8 988350586
 Author: Khaled Hosny <khaledhosny@eglug.org>
 Date:   Sun Jun 19 00:08:51 2016 +0300
 
@@ -76705,7 +108542,7 @@ Date:   Sat Apr 30 19:20:56 2016 +0200
  4 files changed, 132 insertions(+), 1 deletion(-)
 
 commit 9abaaac409b8e3a0a9182b67dc384133013f7878
-Merge: 2f560ee4 264b7a72
+Merge: 2f560ee44 264b7a728
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Wed Apr 27 03:38:24 2016 -0700
 
@@ -76738,7 +108575,7 @@ Date:   Wed Apr 27 02:44:35 2016 -0700
  1 file changed, 612 insertions(+)
 
 commit 264b7a728a41becfbf23ce258fc2a3af19d0cbbe
-Merge: 7e2da035 adafdcdd
+Merge: 7e2da035f adafdcddc
 Author: Khaled Hosny <khaledhosny@eglug.org>
 Date:   Wed Apr 27 03:48:23 2016 +0300
 
@@ -76819,7 +108656,7 @@ Date:   Tue Apr 26 10:35:23 2016 -0700
  1 file changed, 12 insertions(+), 6 deletions(-)
 
 commit 14bb4a56971fd45063cd6c1288d911627088abb2
-Merge: 1c625dff 5069062d
+Merge: 1c625dff2 5069062d0
 Author: Sascha Brawer <sascha@brawer.ch>
 Date:   Tue Apr 26 11:38:16 2016 +0200
 
@@ -76877,7 +108714,7 @@ Date:   Fri Apr 8 13:41:20 2016 -0700
  1 file changed, 2 insertions(+)
 
 commit ef476be80d773332e0c768a3465d99381d76edd9
-Merge: a0331b55 d3134a66
+Merge: a0331b55f d3134a66a
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Fri Apr 8 13:16:33 2016 -0700
 
@@ -77076,7 +108913,7 @@ Date:   Thu Mar 17 11:59:43 2016 -0700
  2 files changed, 20 insertions(+), 31 deletions(-)
 
 commit fef5dd9a72f326c160a7194f558749d24bac7283
-Merge: 01ea9eaa 5f995db1
+Merge: 01ea9eaac 5f995db10
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Sat Mar 12 19:15:15 2016 -0800
 
@@ -77121,7 +108958,7 @@ Date:   Tue Mar 8 12:16:41 2016 -0800
  2 files changed, 5 deletions(-)
 
 commit ce8ae9970102f83b67bb1e8e8b2bf894a0e26c07
-Merge: 731a430c 71248a84
+Merge: 731a430cd 71248a843
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Fri Mar 4 17:20:35 2016 -0800
 
@@ -78154,7 +109991,7 @@ Date:   Wed Feb 10 14:11:43 2016 +0700
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit bdaa784bb610ec65626d63cc068a0958ff5005fc
-Merge: a168db47 f6ffba63
+Merge: a168db473 f6ffba634
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Wed Feb 10 11:11:36 2016 +0700
 
@@ -78298,7 +110135,7 @@ Date:   Tue Feb 2 16:39:19 2016 +0800
  3 files changed, 3 insertions(+), 3 deletions(-)
 
 commit b693992ea160b66541f678dc9be29b513c77a30b
-Merge: 9a6a33cc 498574e6
+Merge: 9a6a33ccb 498574e6c
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Tue Feb 2 12:33:32 2016 +0800
 
@@ -78326,7 +110163,7 @@ Date:   Thu Jan 28 12:14:12 2016 -0600
  2 files changed, 305 insertions(+)
 
 commit 9a6a33ccbea8a2e23e779bd955958fa41974c1c7
-Merge: d05b7833 146fe252
+Merge: d05b78332 146fe252c
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Mon Jan 18 12:47:18 2016 +0100
 
@@ -78524,7 +110361,7 @@ Date:   Sat Jan 2 13:25:18 2016 +0000
  1 file changed, 3 insertions(+), 1 deletion(-)
 
 commit 3a48c776701a919e11b067129586e40372d90d54
-Merge: 9230911f 4b4948d3
+Merge: 9230911fa 4b4948d36
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Sat Jan 2 00:59:14 2016 +0000
 
@@ -78558,7 +110395,7 @@ Date:   Fri Jan 1 19:06:43 2016 +0000
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit 6f66f05757d3d5738571b3d4ee40afffb8f26ff9
-Merge: bfdf684f 9ab9f974
+Merge: bfdf684f7 9ab9f974d
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Fri Jan 1 16:44:01 2016 +0000
 
@@ -78580,7 +110417,7 @@ Date:   Fri Jan 1 20:38:21 2016 +0400
  5 files changed, 187 insertions(+), 81 deletions(-)
 
 commit bfdf684f7957645dd016fbf76700c5911c4bee2d
-Merge: d7ed6f50 85c2443b
+Merge: d7ed6f50b 85c2443b7
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Wed Dec 30 22:20:14 2015 +0100
 
@@ -78589,7 +110426,7 @@ Date:   Wed Dec 30 22:20:14 2015 +0100
     More docs
 
 commit d7ed6f50b4ff13a94701131913d931f13a4d1266
-Merge: b758e5ea a7f0e25d
+Merge: b758e5ea2 a7f0e25da
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Wed Dec 30 22:20:00 2015 +0100
 
@@ -78631,7 +110468,7 @@ Date:   Wed Dec 30 22:50:08 2015 +0400
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit b758e5ea223eced0fde9a3e62d0fdf04c04914a1
-Merge: 266bfa37 8b1224f0
+Merge: 266bfa377 8b1224f0e
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Wed Dec 30 16:44:19 2015 +0100
 
@@ -78688,7 +110525,7 @@ Date:   Wed Dec 30 15:45:43 2015 +0100
  1 file changed, 27 insertions(+), 19 deletions(-)
 
 commit 8f31d0a94b27bb658aabe600472fc10bc47885f6
-Merge: 9d280cf4 fb192c26
+Merge: 9d280cf49 fb192c263
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Wed Dec 30 15:13:37 2015 +0100
 
@@ -78802,7 +110639,7 @@ Date:   Fri Dec 25 18:41:41 2015 +0100
  2 files changed, 1 insertion(+), 2 deletions(-)
 
 commit e75c1ffdf548185ce1f1df7937f0d028e5e40efe
-Merge: 6173c2a6 d25317f6
+Merge: 6173c2a6f d25317f67
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Fri Dec 25 18:21:08 2015 +0100
 
@@ -79145,7 +110982,7 @@ Date:   Wed Dec 16 17:08:36 2015 +0100
  1 file changed, 3 insertions(+), 3 deletions(-)
 
 commit 15f2c055c17c54b0a6ae6eef50dcda13c58cda75
-Merge: 49e72634 a13b023d
+Merge: 49e72634a a13b023db
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Mon Dec 14 14:19:03 2015 +0100
 
@@ -79184,7 +111021,7 @@ Date:   Thu Dec 10 17:44:19 2015 +0100
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit e1d4d0f1dbd8518b5672245c05d73f22a9ed03ea
-Merge: 70b33eda 808d3fc0
+Merge: 70b33edae 808d3fc0e
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Thu Dec 10 16:56:07 2015 +0100
 
@@ -79255,7 +111092,7 @@ Date:   Mon Dec 7 21:38:47 2015 +0100
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit dee0fbf9e2eac8b61730efc4978bc10c552b5227
-Merge: 255df680 a7ffe353
+Merge: 255df6801 a7ffe3535
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Mon Dec 7 10:44:08 2015 +0100
 
@@ -79300,7 +111137,7 @@ Date:   Mon Dec 7 10:28:46 2015 +0100
  2 files changed, 31 insertions(+), 1 deletion(-)
 
 commit 8c37556f730d7e961394075cd863f624af4c53c4
-Merge: 8e5f9026 f35b3e93
+Merge: 8e5f90265 f35b3e931
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Mon Dec 7 09:34:58 2015 +0100
 
@@ -79452,7 +111289,7 @@ Date:   Thu Nov 26 18:43:15 2015 -0500
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit 766963adba6770dcd45de4417481ed8eda60a716
-Merge: b344af80 f798b8e2
+Merge: b344af80c f798b8e2d
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Tue Nov 24 15:38:43 2015 -0600
 
@@ -79461,7 +111298,7 @@ Date:   Tue Nov 24 15:38:43 2015 -0600
     Fix all VC++ warnings and errors
 
 commit b344af80ca95b9eddfd6017aa6ae103388d6b5f8
-Merge: 662acd26 835bbdc7
+Merge: 662acd26d 835bbdc7c
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Tue Nov 24 15:30:27 2015 -0600
 
@@ -79470,7 +111307,7 @@ Date:   Tue Nov 24 15:30:27 2015 -0600
     Enable use of compiler directives to export symbols
 
 commit 662acd26d10c38e96a9afcdaab2cb2979794966f
-Merge: b24e93e3 1979f6fe
+Merge: b24e93e3a 1979f6fed
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Tue Nov 24 15:29:44 2015 -0600
 
@@ -79489,7 +111326,7 @@ Date:   Tue Nov 24 13:18:20 2015 -0600
  2 files changed, 8 insertions(+), 1 deletion(-)
 
 commit 233944ac91bb81250c0e63150eecfedfaf09f590
-Merge: 5a24b1d2 d5382019
+Merge: 5a24b1d25 d53820191
 Author: Khaled Hosny <khaledhosny@eglug.org>
 Date:   Tue Nov 24 18:37:35 2015 +0400
 
@@ -79574,7 +111411,7 @@ Date:   Sat Nov 21 16:57:26 2015 -0500
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit a6991813659376a6a11c00a9f67d85b4f7ba9b5d
-Merge: 1dc32ea4 f19c6db1
+Merge: 1dc32ea4d f19c6db18
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Fri Nov 20 13:28:42 2015 -0800
 
@@ -79792,7 +111629,7 @@ Date:   Tue Nov 17 18:42:13 2015 -0800
  1 file changed, 11 insertions(+), 11 deletions(-)
 
 commit dde8cc87bd880bd35baf764820f4c85bd0a58696
-Merge: e97835ad 167c3271
+Merge: e97835ad4 167c32717
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Tue Nov 17 18:40:10 2015 -0800
 
@@ -79887,7 +111724,7 @@ Date:   Tue Nov 10 11:37:01 2015 -0800
  1 file changed, 3 insertions(+)
 
 commit d5f0d7c9fb14255388ab616f56e178cb7ca10ec2
-Merge: 04ff23e7 529a9331
+Merge: 04ff23e73 529a93312
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Sat Nov 7 07:50:58 2015 -0800
 
@@ -80819,7 +112656,7 @@ Date:   Tue Oct 20 15:21:18 2015 -0200
  1 file changed, 1 insertion(+)
 
 commit 5d7a30fde09320c2c62c7c73570ce3f2e298eba6
-Merge: 904b0dc3 2fb95a0c
+Merge: 904b0dc38 2fb95a0c9
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Tue Oct 20 15:19:41 2015 -0200
 
@@ -80828,7 +112665,7 @@ Date:   Tue Oct 20 15:19:41 2015 -0200
     Add BUILD.md based on harfbuzz.org docs
 
 commit 904b0dc3811464cf61dc9457664de95ee4f61a86
-Merge: 86cadc2c ba096bcc
+Merge: 86cadc2cd ba096bcc2
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Mon Oct 19 16:59:43 2015 -0200
 
@@ -81482,7 +113319,7 @@ Date:   Mon Aug 31 19:16:41 2015 +0100
  8 files changed, 14 insertions(+), 7 deletions(-)
 
 commit 3899795fa3c3e058e3885ec7a6638f0597a752cc
-Merge: d2059652 01e16e88
+Merge: d20596528 01e16e88f
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Mon Aug 31 10:46:01 2015 +0100
 
@@ -81531,7 +113368,7 @@ Date:   Mon Aug 31 10:12:05 2015 +0100
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit c424b41705b50055c7f92b268cf78a2680af73af
-Merge: 31594b98 5470e744
+Merge: 31594b98a 5470e744d
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Mon Aug 31 09:53:16 2015 +0100
 
@@ -81836,7 +113673,7 @@ Date:   Fri Aug 14 01:19:08 2015 -0400
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit 5c99cf93d6242803bddcac2ca8300fdec7e0f8a7
-Merge: 8ad89f05 539a610e
+Merge: 8ad89f057 539a610e2
 Author: ThePhD <phdofthehouse@gmail.com>
 Date:   Fri Aug 14 01:02:00 2015 -0400
 
@@ -81907,7 +113744,7 @@ Date:   Fri Aug 7 11:13:27 2015 +0200
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit 02d6439f420d959183dd446abd0b0118ee1ee061
-Merge: 9002c27b 160f6355
+Merge: 9002c27b2 160f63552
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Mon Aug 3 22:47:18 2015 +0300
 
@@ -81964,7 +113801,7 @@ Date:   Sun Jul 26 23:39:10 2015 +0200
  3 files changed, 13 insertions(+), 3 deletions(-)
 
 commit df6cb84449a473d540821e41fb5007b59644780f
-Merge: 2ed6be66 786ba458
+Merge: 2ed6be667 786ba4584
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Sun Jul 26 19:40:55 2015 +0200
 
@@ -82915,7 +114752,7 @@ Date:   Wed Jun 3 11:53:42 2015 -0700
  1 file changed, 4 insertions(+)
 
 commit 37c8daf724add4a41a06385e571277d137dc2a2f
-Merge: f1b44303 01c3a885
+Merge: f1b44303d 01c3a8854
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Mon Jun 1 13:27:37 2015 -0700
 
@@ -83019,7 +114856,7 @@ Date:   Mon May 18 14:16:28 2015 -0700
  1 file changed, 13 insertions(+), 13 deletions(-)
 
 commit fbecde3d5c5c6d5af315140e4966dc850388ad63
-Merge: 58015215 74139f98
+Merge: 580152153 74139f983
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Thu May 7 10:46:42 2015 -0700
 
@@ -83058,7 +114895,7 @@ Date:   Tue May 5 22:31:19 2015 -0700
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit 42b00118eae46a5183e885e89e0856f41361f57e
-Merge: c60f3c8e cfeb0562
+Merge: c60f3c8e1 cfeb0562e
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Tue May 5 14:49:47 2015 -0700
 
@@ -83220,7 +115057,7 @@ Date:   Mon Apr 13 23:51:45 2015 -0700
  1 file changed, 11 insertions(+), 7 deletions(-)
 
 commit 76d57331117be8e0c2d4a2aee8341969b62b6888
-Merge: 89cbd4d9 9ee176ee
+Merge: 89cbd4d95 9ee176ee9
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Mon Apr 13 23:40:35 2015 -0700
 
@@ -83241,7 +115078,7 @@ Date:   Mon Apr 13 12:27:08 2015 -0700
  1 file changed, 1 insertion(+)
 
 commit 713f99ff6138b4149d9fd382f9af3ace01ee0da5
-Merge: 1086f21e 22524a51
+Merge: 1086f21e5 22524a514
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Fri Apr 10 14:34:05 2015 -0700
 
@@ -83261,14 +115098,14 @@ Date:   Fri Apr 10 18:14:45 2015 +0200
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit 1086f21e546e2435d9da6024fd6afa7a36ba3707
-Merge: 125cb083 fe97b65a
+Merge: 125cb0834 fe97b65a5
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Fri Apr 10 12:21:04 2015 -0700
 
     Merge branch 'hb-fc'
 
 commit 125cb08345a7f27e565329d37093b1a60a41a403
-Merge: e8fd8393 855a5d7c
+Merge: e8fd83932 855a5d7cb
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Fri Apr 10 12:19:57 2015 -0700
 
@@ -83506,7 +115343,7 @@ Date:   Mon Apr 6 14:51:31 2015 -0700
  11 files changed, 11 insertions(+), 11 deletions(-)
 
 commit bfcddd32a674dd19fca1bf521e95466a0eec5179
-Merge: ce01ad7c 363ceec3
+Merge: ce01ad7c2 363ceec3f
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Mon Apr 6 14:41:32 2015 -0700
 
@@ -83560,7 +115397,7 @@ Date:   Thu Mar 26 14:13:53 2015 -0400
  1 file changed, 2 insertions(+), 2 deletions(-)
 
 commit 8886ab430ca68539cb318e175647e9f6973718b0
-Merge: e3671b8f a394bb66
+Merge: e3671b8f8 a394bb667
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Sun Mar 22 16:18:57 2015 -0400
 
@@ -84151,7 +115988,7 @@ Date:   Wed Jan 28 20:29:48 2015 -0800
  1 file changed, 4 insertions(+)
 
 commit faaae64bf28abdcdd15185374bc09a3809794118
-Merge: 7888a6b0 9768e651
+Merge: 7888a6b07 9768e651b
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Wed Feb 25 15:34:34 2015 -0800
 
@@ -84323,7 +116160,7 @@ Date:   Mon Jan 26 14:08:36 2015 -0800
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit 70c25ee215635db23eb0757641bd372940c0d85d
-Merge: 28f5e0b2 f3537b62
+Merge: 28f5e0b2f f3537b620
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Sun Jan 25 13:06:03 2015 -0800
 
@@ -84501,7 +116338,7 @@ Date:   Mon Jan 19 14:42:11 2015 -0800
  1 file changed, 2 insertions(+)
 
 commit 3704628d1f124234324b5f2bdd5fdd61c14c7801
-Merge: 1aaa7d67 5eb939dd
+Merge: 1aaa7d679 5eb939ddf
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Mon Jan 19 16:15:00 2015 -0800
 
@@ -84616,7 +116453,7 @@ Date:   Mon Jan 5 14:43:13 2015 -0800
  1 file changed, 1 insertion(+), 2 deletions(-)
 
 commit 8cb41cb9508eb1bb6319e92f900cfe5e8a131be3
-Merge: 365c03fc fb85d618
+Merge: 365c03fc2 fb85d618f
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Sun Jan 4 20:32:18 2015 -0800
 
@@ -84637,7 +116474,7 @@ Date:   Sun Jan 4 19:31:10 2015 -0800
  4 files changed, 10 insertions(+), 4 deletions(-)
 
 commit 365c03fc2bcdb4098314a0e123c46018fb882586
-Merge: c36c4a99 d1897a98
+Merge: c36c4a992 d1897a98d
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Sat Jan 3 21:55:30 2015 -0800
 
@@ -86031,7 +117868,7 @@ Date:   Sat Aug 2 16:17:44 2014 -0400
  2 files changed, 20 insertions(+), 21 deletions(-)
 
 commit 0a5ae9336231c4d189e1682e4fd9c9c4552b8bbf
-Merge: ac53443f 6ab6be32
+Merge: ac53443f1 6ab6be32c
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Sat Aug 2 15:00:34 2014 -0400
 
@@ -89193,7 +121030,7 @@ Date:   Wed Jan 22 07:53:55 2014 -0500
  1 file changed, 2 insertions(+), 1 deletion(-)
 
 commit 0596343bfeb80ad6b19d459654edf7dfded6affe
-Merge: 62cb28df 83d7e791
+Merge: 62cb28dfc 83d7e7915
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Wed Jan 22 04:43:51 2014 -0800
 
@@ -91077,7 +122914,7 @@ Date:   Mon Sep 30 08:55:52 2013 +0000
  1 file changed, 17 insertions(+), 41 deletions(-)
 
 commit 622bc3d829cab84c3a4148b88f2c91fee491ef39
-Merge: 3d2c4f0c d583df1e
+Merge: 3d2c4f0c2 d583df1e7
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Sun Sep 29 13:31:58 2013 -0700
 
@@ -92273,7 +124110,7 @@ Date:   Wed Jun 26 19:46:55 2013 -0400
  1 file changed, 2 insertions(+), 8 deletions(-)
 
 commit f5da11e0fa5adf8f782883dc5c30d8faaafc9c27
-Merge: 79d1007a 89312b74
+Merge: 79d1007a5 89312b741
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Sat Jun 22 08:04:05 2013 -0700
 
@@ -92707,7 +124544,7 @@ Date:   Thu May 23 17:05:39 2013 -0400
  1 file changed, 6 insertions(+), 4 deletions(-)
 
 commit fb502a22787f4110472771ef771619342e64577a
-Merge: b9408d24 9d9e72e9
+Merge: b9408d24f 9d9e72e94
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Thu May 23 15:54:52 2013 -0400
 
@@ -117658,7 +149495,7 @@ Date:   Wed May 26 10:48:10 2010 -0400
  11 files changed, 119 insertions(+), 160 deletions(-)
 
 commit 80af2812fb3b231ddcb4608ec13c6038a681c818
-Merge: c442672e 3109a86a
+Merge: c442672ec 3109a86ad
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Mon May 24 18:14:24 2010 +0100
 
@@ -117743,7 +149580,7 @@ Date:   Sat May 22 19:58:00 2010 +0100
  3 files changed, 88 insertions(+), 26 deletions(-)
 
 commit 72631c9d06b131d82080f212908e7d0b0266b841
-Merge: 1432ab15 1094a294
+Merge: 1432ab15c 1094a294f
 Author: Martin Hosken <martin_hosken@sil.org>
 Date:   Sat May 22 09:38:02 2010 +0100
 
@@ -119474,7 +151311,7 @@ Date:   Mon May 3 22:47:22 2010 -0400
  1 file changed, 2 insertions(+), 2 deletions(-)
 
 commit 6b84198f9d471defb6f55d44d4f5423df70b2a10
-Merge: 631d10b7 eaf29edb
+Merge: 631d10b72 eaf29edb8
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Mon May 3 22:46:52 2010 -0400
 
@@ -125155,7 +156992,7 @@ Date:   Wed Apr 15 22:56:15 2009 -0400
  14 files changed, 151 insertions(+), 56 deletions(-)
 
 commit ce48f03946bef895912019046bdbe62bb1301d0b
-Merge: 0e13beeb 2d15e72c
+Merge: 0e13beeb9 2d15e72c7
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Mon Nov 2 14:35:51 2009 -0500
 
index 4a2a8c8..3055e5a 100644 (file)
@@ -19,15 +19,27 @@ EXTRA_DIST = \
        replace-enum-strings.cmake \
        meson.build \
        meson_options.txt \
-       subprojects/expat.wrap \
-       subprojects/fontconfig.wrap \
+       subprojects/cairo.wrap \
        subprojects/freetype2.wrap \
        subprojects/glib.wrap \
-       subprojects/libffi.wrap \
-       subprojects/proxy-libintl.wrap \
-       subprojects/zlib.wrap \
-       meson-cc-tests/intel-atomic-primitives-test.c \
-       meson-cc-tests/solaris-atomic-operations.c \
+       subprojects/google-benchmark.wrap \
+       subprojects/ragel.wrap \
+       subprojects/packagefiles/ragel/meson.build \
+       subprojects/ttf-parser.wrap \
+       perf/meson.build \
+       perf/perf-draw.hh \
+       perf/perf-extents.hh \
+       perf/perf-shaping.hh \
+       perf/perf.cc \
+       perf/fonts/Amiri-Regular.ttf \
+       perf/fonts/NotoNastaliqUrdu-Regular.ttf \
+       perf/fonts/NotoSansDevanagari-Regular.ttf \
+       perf/fonts/Roboto-Regular.ttf \
+       perf/texts/en-thelittleprince.txt \
+       perf/texts/en-words.txt \
+       perf/texts/fa-monologue.txt \
+       perf/texts/fa-thelittleprince.txt \
+       mingw-configure.sh \
        $(NULL)
 
 MAINTAINERCLEANFILES = \
@@ -81,15 +93,4 @@ dist-hook: dist-clear-sticky-bits
 dist-clear-sticky-bits:
        chmod -R a-s $(distdir)
 
-tar_file = $(PACKAGE_TARNAME)-$(VERSION).tar.xz
-sha256_file = $(tar_file).sha256
-gpg_file = $(sha256_file).asc
-$(sha256_file): $(tar_file)
-       sha256sum $^ > $@
-$(gpg_file): $(sha256_file)
-       @echo "Please enter your GPG password to sign the checksum."
-       gpg --armor --sign $^
-
-release-files: $(tar_file) $(sha256_file) $(gpg_file)
-
 -include $(top_srcdir)/git.mk
index 74e52e8..540a3e7 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.16.2 from Makefile.am.
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2020 Free Software Foundation, Inc.
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -143,8 +143,8 @@ am__recursive_targets = \
   $(am__extra_recursive_targets)
 AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
        cscope distdir distdir-am dist dist-all distcheck
-am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) \
-       config.h.in
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \
+       $(LISP)config.h.in
 # Read a list of newline-separated strings from the standard input,
 # and print each of them once, without duplicates.  Input order is
 # *not* preserved.
@@ -167,8 +167,7 @@ CSCOPE = cscope
 DIST_SUBDIRS = $(SUBDIRS)
 am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in AUTHORS \
        COPYING ChangeLog INSTALL NEWS README THANKS TODO ar-lib \
-       compile config.guess config.sub depcomp install-sh ltmain.sh \
-       missing
+       compile config.guess config.sub install-sh ltmain.sh missing
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 distdir = $(PACKAGE)-$(VERSION)
 top_distdir = $(distdir)
@@ -226,6 +225,8 @@ CAIRO_LIBS = @CAIRO_LIBS@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
+CHAFA_CFLAGS = @CHAFA_CFLAGS@
+CHAFA_LIBS = @CHAFA_LIBS@
 CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
 CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
 CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
@@ -254,8 +255,6 @@ ECHO_T = @ECHO_T@
 EGREP = @EGREP@
 EXEEXT = @EXEEXT@
 FGREP = @FGREP@
-FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@
-FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
 FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
 FREETYPE_DEPS = @FREETYPE_DEPS@
 FREETYPE_LIBS = @FREETYPE_LIBS@
@@ -288,7 +287,6 @@ HB_VERSION_MICRO = @HB_VERSION_MICRO@
 HB_VERSION_MINOR = @HB_VERSION_MINOR@
 HTML_DIR = @HTML_DIR@
 ICU_CFLAGS = @ICU_CFLAGS@
-ICU_CONFIG = @ICU_CONFIG@
 ICU_LIBS = @ICU_LIBS@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
@@ -394,6 +392,7 @@ pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -418,15 +417,27 @@ EXTRA_DIST = \
        replace-enum-strings.cmake \
        meson.build \
        meson_options.txt \
-       subprojects/expat.wrap \
-       subprojects/fontconfig.wrap \
+       subprojects/cairo.wrap \
        subprojects/freetype2.wrap \
        subprojects/glib.wrap \
-       subprojects/libffi.wrap \
-       subprojects/proxy-libintl.wrap \
-       subprojects/zlib.wrap \
-       meson-cc-tests/intel-atomic-primitives-test.c \
-       meson-cc-tests/solaris-atomic-operations.c \
+       subprojects/google-benchmark.wrap \
+       subprojects/ragel.wrap \
+       subprojects/packagefiles/ragel/meson.build \
+       subprojects/ttf-parser.wrap \
+       perf/meson.build \
+       perf/perf-draw.hh \
+       perf/perf-extents.hh \
+       perf/perf-shaping.hh \
+       perf/perf.cc \
+       perf/fonts/Amiri-Regular.ttf \
+       perf/fonts/NotoNastaliqUrdu-Regular.ttf \
+       perf/fonts/NotoSansDevanagari-Regular.ttf \
+       perf/fonts/Roboto-Regular.ttf \
+       perf/texts/en-thelittleprince.txt \
+       perf/texts/en-words.txt \
+       perf/texts/fa-monologue.txt \
+       perf/texts/fa-thelittleprince.txt \
+       mingw-configure.sh \
        $(NULL)
 
 MAINTAINERCLEANFILES = \
@@ -458,9 +469,6 @@ DISTCHECK_CONFIGURE_FLAGS = \
 
 # TAR_OPTIONS is not set as env var for 'make dist'.  How to fix that?
 TAR_OPTIONS = --owner=0 --group=0
-tar_file = $(PACKAGE_TARNAME)-$(VERSION).tar.xz
-sha256_file = $(tar_file).sha256
-gpg_file = $(sha256_file).asc
 all: config.h
        $(MAKE) $(AM_MAKEFLAGS) all-recursive
 
@@ -720,10 +728,6 @@ dist-xz: distdir
        tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
        $(am__post_remove_distdir)
 
-dist-zstd: distdir
-       tardir=$(distdir) && $(am__tar) | zstd -c $${ZSTD_CLEVEL-$${ZSTD_OPT--19}} >$(distdir).tar.zst
-       $(am__post_remove_distdir)
-
 dist-tarZ: distdir
        @echo WARNING: "Support for distribution archives compressed with" \
                       "legacy program 'compress' is deprecated." >&2
@@ -766,8 +770,6 @@ distcheck: dist
          eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\
        *.zip*) \
          unzip $(distdir).zip ;;\
-       *.tar.zst*) \
-         zstd -dc $(distdir).tar.zst | $(am__untar) ;;\
        esac
        chmod -R a-w $(distdir)
        chmod u+w $(distdir)
@@ -946,7 +948,7 @@ uninstall-am:
        am--refresh check check-am clean clean-cscope clean-generic \
        clean-libtool cscope cscopelist-am ctags ctags-am dist \
        dist-all dist-bzip2 dist-gzip dist-hook dist-lzip dist-shar \
-       dist-tarZ dist-xz dist-zip dist-zstd distcheck distclean \
+       dist-tarZ dist-xz dist-zip distcheck distclean \
        distclean-generic distclean-hdr distclean-libtool \
        distclean-tags distcleancheck distdir distuninstallcheck dvi \
        dvi-am html html-am info info-am install install-am \
@@ -981,13 +983,6 @@ dist-hook: dist-clear-sticky-bits
 # Clean up any sticky bits we may inherit from parent dir
 dist-clear-sticky-bits:
        chmod -R a-s $(distdir)
-$(sha256_file): $(tar_file)
-       sha256sum $^ > $@
-$(gpg_file): $(sha256_file)
-       @echo "Please enter your GPG password to sign the checksum."
-       gpg --armor --sign $^
-
-release-files: $(tar_file) $(sha256_file) $(gpg_file)
 
 -include $(top_srcdir)/git.mk
 
diff --git a/NEWS b/NEWS
index 04fbe13..dbe1755 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,335 @@
+Overview of changes leading to 3.4.0
+Sunday, February 13, 2022
+====================================
+- Perform sanity checks on shaping results is now part of “harfbuzz” library
+  and can be enabled by setting the buffer flag HB_BUFFER_FLAG_VERIFY.
+  (Behdad Esfahbod)
+- Arabic Mark Transient Reordering Algorithm have been updated to revision 6.
+  (Khaled Hosny)
+- ISO 15924 code for mathematical notation, ‘Zmth’, now maps to the OpenType
+  ‘math’ tag. (Alexis King)
+- It is now possible to get at once all math kerning values for a given glyph
+  at a given corner. (Alexis King)
+- Fix locale_t portability issues on systems the typdef’s it to a void pointer.
+  (Behdad Esfahbod)
+
+- New API:
++HB_BUFFER_FLAG_VERIFY
++HB_OT_TAG_MATH_SCRIPT
++HB_SCRIPT_MATH
++hb_ot_math_kern_entry_t
++hb_ot_math_get_glyph_kernings
+
+- Deprecated API
++HB_OT_MATH_SCRIPT
+
+
+Overview of changes leading to 3.3.2
+Sunday, February 6, 2022
+====================================
+- Revert splitting of pair positioning values introduced in 3.3.0 as it proved
+  problematic. (Behdad Esfahbod)
+
+
+Overview of changes leading to 3.3.1
+Monday, January 31, 2022
+====================================
+- Fix heap-use-after-free in harfbuzz-subset introduced in previous release.
+  (Garret Rieger)
+
+
+Overview of changes leading to 3.3.0
+Monday, January 31, 2022
+====================================
+- Improved documentation. (Matthias Clasen)
+- Internal code cleanup, using C++ standard library more. (Behdad Esfahbod)
+- The low 16-bits of face index will be used by hb_face_create() to select a
+  face inside a font collection file format, while the high 16-bits will be
+  used by hb_font_create() to load the named instance. (Behdad Esfahbod)
+- Glyph positions and other font metrics now apply synthetic slant set by
+  hb_font_set_synthetic_slant(), for improved positioning for synthetically
+  slanted fonts. (Behdad Esfahbod)
+- Fixed unintentional locale dependency in hb_variation_to_string() for decimal
+  point representation. (Matthias Clasen)
+- When applying pair positioning (kerning) the positioning value is split
+  between the two sides of the pair for improved cursor positioning between
+  such pairs. (Behdad Esfahbod)
+- Introduced new HB_GLYPH_FLAG_UNSAFE_TO_CONCAT, to be used in conjunction
+  with HB_GLYPH_FLAG_UNSAFE_TO_BREAK for optimizing re-shaping during line
+  breaking. Check the documentation for further details. (Behdad Esfahbod)
+- Improved handling of macrolanguages when mapping BCP 47 codes to OpenType
+  tags. (David Corbett)
+
+- New API:
++HB_GLYPH_FLAG_UNSAFE_TO_CONCAT
++hb_segment_properties_overlay()
++hb_buffer_create_similar()
++hb_font_set_synthetic_slant()
++hb_font_get_synthetic_slant()
++hb_font_get_var_coords_design()
+
+
+Overview of changes leading to 3.2.0
+Friday, November 26, 2021
+====================================
+“harfbuzz” library improvements:
+- Fixed shaping of Apple Color Emoji flags in right-to-left context. (Behdad Esfahbod)
+- Fixed positioning of CFF fonts in HB_TINY profile. (Behdad Esfahbod)
+- OpenType 1.9 language tags update. (David Corbett)
+- Add HB_NO_VERTICAL config option.
+- Add HB_CONFIG_OVERRIDE_H for easier configuration. (Behdad Esfahbod)
+
+“harfbuzz-subset” library improvements:
+- Improved packing of cmap, loca, and Ligature tables. (Garret Rieger)
+- Significantly improved overflow-resolution strategy in the repacker. (Garret Rieger)
+
+
+Overview of changes leading to 3.1.2
+Friday, November 26, 2021
+====================================
+- hb-shape / hb-view: revert treating text on the commandline as single
+  paragraph (was introduced in 3.0.0); add new --single-par to do that.
+  (Behdad Esfahbod)
+- Subsetter bug fixes. (Garret Rieger, Qunxin Liu, Behdad Esfahbod)
+
+
+Overview of changes leading to 3.1.1
+Wednesday, November 8, 2021
+====================================
+- Work around GCC cast-align error/warning on some platforms. (Behdad Esfahbod)
+- Documentation improvements. (Matthias Clasen)
+
+
+Overview of changes leading to 3.1.0
+Wednesday, November 3, 2021
+====================================
+- Better offset-overflow handling in the subsetter library. (Garret Rieger)
+- Improved Unicode 14 properties in the USE shaper, and various other USE
+  shaper fixes. (David Corbett)
+- MATH and COLR v1 tables subsetting support, and various other subsetter fixes.
+  (Qunxin Liu)
+- Support for Pwo Karen / Ason Chin medial la. (Simon Cozens)
+- Apply GPOS positioning when substituting with morx table, if kerx is missing.
+  (Behdad Esfahbod)
+- Apply calt and clig features across syllable boundaries in Indic shaper.
+  (Behdad Esfahbod)
+- meson option for enabling Graphite 2 has been renamed to graphite2.
+- Build and documentation fixes.
+
+- New API:
++hb_buffer_set_not_found_glyph()
++hb_buffer_get_not_found_glyph()
+
+
+Overview of changes leading to 3.0.0
+Friday, September 17, 2021
+====================================
+- Unicode 14.0 support (David Corbett).
+- The hb-subset API and the harfbuzz-subset library's ABI are now declared
+  stable. The harfbuzz-subset library would not have been possible without the
+  work of Garret Rieger and Qunxin Liu from Google Fonts, and the earlier work
+  of Michiharu Ariza from Adobe.
+- The hb-style API is now stable and no longer experimental.
+
+- New API:
++hb_style_tag_t
++hb_style_get_value()
++hb_subset_input_t
++hb_subset_flags_t
++hb_subset_sets_t
++hb_subset_input_create_or_fail()
++hb_subset_input_reference()
++hb_subset_input_destroy()
++hb_subset_input_set_user_data()
++hb_subset_input_get_user_data()
++hb_subset_input_unicode_set()
++hb_subset_input_glyph_set()
++hb_subset_input_set()
++hb_subset_input_get_flags()
++hb_subset_input_set_flags()
++hb_subset_or_fail()
+
+- Removed old unstable harfbuzz-subset API:
+-hb_subset_input_nameid_set()
+-hb_subset_input_namelangid_set()
+-hb_subset_input_layout_features_set()
+-hb_subset_input_no_subset_tables_set()
+-hb_subset_input_drop_tables_set()
+-hb_subset_input_set_drop_hints()
+-hb_subset_input_get_drop_hints()
+-hb_subset_input_set_desubroutinize()
+-hb_subset_input_get_desubroutinize()
+-hb_subset_input_set_retain_gids()
+-hb_subset_input_get_retain_gids()
+-hb_subset_input_set_name_legacy()
+-hb_subset_input_get_name_legacy()
+-hb_subset_input_set_overlaps_flag()
+-hb_subset_input_get_overlaps_flag()
+-hb_subset_input_set_notdef_outline()
+-hb_subset_input_get_notdef_outline()
+-hb_subset_input_set_no_prune_unicode_ranges()
+-hb_subset_input_get_no_prune_unicode_ranges()
+-hb_subset()
+
+
+Overview of changes leading to 2.9.1
+Tuesday, September 7, 2021
+====================================
+- Final subset API is in place and if no issues are discovered, it will be the
+  stable subset API of HarfBuzz 3.0.0. Old API is kept to ease transition, but
+  will be removed in 3.0.0.
+- Various fuzzer-found bug fixes.
+- hb_buffer_append() now handles the pre- and post-context which previously
+  were left unchanged in the destination buffer.
+- hb-view / hb-shape now accept following new arguments:
+  o --unicodes-before/after: takes a list of hex numbers that represent Unicode
+    codepoints.
+- Undeprecated API:
+  hb_set_invert()
+
+
+Overview of changes leading to 2.9.0
+Wednesday, August 18, 2021
+History Repeats Itself (Afghanistan)
+====================================
+- Subsetter API is being stabilized, with the first stable API to happen in
+  3.0.0 release (https://github.com/harfbuzz/harfbuzz/issues/3078).
+- Support multiple variation axes with same tag, aka HOI.
+- The “coretext” testing shaper now passes font variations to CoreText.
+- hb-shape/hb-view does not break line at new lines unless text is read from
+  file.
+- hb-view and hb-subset has a --batch now, similar to hb-shape.
+- The --batch mode now uses ; as argument separator instead of : used previously.
+- The --batch in hb-shape does not expect 0th argument anymore. That is, the
+  lines read are interpreted as argv[1:], instead of argv[0:].
+- The --batch option has been undocumented. We are ready to document it; send
+  feedback if you find it useful.
+- hb-subset got arguments revamps. Added much-requested --gids-file, --glyphs,
+  --glyphs-file, --unicodes-file, supporting ranges in --unicodes.
+- Various bug fixes.
+
+
+Overview of changes leading to 2.8.2
+Tuesday, July 8, 2021
+====================================
+- Shaping LTR digits for RTL scripts now makes the native direction of the
+  digits LTR, applying shaping and positioning rules on the same glyph order as
+  Uniscribe. (Jonathan Kew, Khaled Hosny).
+- Subsetting COLR v1 and CPAL tables is now supported. (Garret Rieger, Qunxin Liu)
+- Various fixes and improvements to the subsetter. (Garret Rieger, Qunxin Liu, Behdad)
+- When applying morx table, mark glyph widths should not be zeroed. (Jonathan Kew)
+- GPOS is preferred over kerx, if GSUB was applied. (Behdad)
+- Regional_Indicator pairs are grouped together when clustering. (Behdad)
+- New API:
++hb_blob_create_or_fail()
++hb_blob_create_from_file_or_fail()
++hb_set_copy()
+
+
+Overview of changes leading to 2.8.1
+Tuesday, May 4, 2021
+====================================
+- Subsetter now fully supports GSUB/GPOS/GDEF tables (including variations); as
+  such, layout tables are retained by subsetter by default. (Garret Rieger, Qunxin Liu)
+- Build scripts no longer check for FontConfig as HarfBuzz does not use it.
+- hb-view supports iTerm2 and kitty inline image protocols (Khaled Hosny),
+  it can also use Chafa for terminal graphics if available (Hans Petter Jansson).
+
+Overview of changes leading to 2.8.0
+Tuesday, March 16, 2021
+====================================
+- Shape joining scripts other than Arabic/Syriac using the Universal Shaping Engine.
+  Previously these were shaped using the generalized Arabic shaper. (David Corbett)
+- Fix regression in shaping of U+0B55 ORIYA SIGN OVERLINE. (David Corbett)
+- Update language tags. (David Corbett)
+- Variations: reduce error: do not round each interpolated delta. (Just van Rossum) 
+- Documentation improvements. (Khaled Hosny, Nathan Willis)
+- Subsetter improvements: subsets most, if not all, lookup types now. (Garret Rieger, Qunxin Liu)
+- Fuzzer-found fixes and other improvements when memory failures happen. (Behdad)
+- Removed most atomic implementations now that we have C++11 atomic impl. (Behdad)
+- General codebase upkeep; using more C++11 features: constexpr constructors, etc. (Behdad)
+
+
+Overview of changes leading to 2.7.4
+Sunday, December 27, 2020
+====================================
+- Fix missing --enable-introspection configure option from previous release
+  tarball.
+- Documentation updates.
+
+
+Overview of changes leading to 2.7.3
+Wednesday, December 23, 2020
+====================================
+- Update USE shaper to 2020-08-13 specification, and other improvements.
+- Don’t disable liga feature in myanmar shaper, to match Uniscribe.
+- Improvements to language and script tags handling.
+- Update language system tag registry to OpenType 1.8.4
+- Support for serializing and deserializing Unicode buffers. Serialized buffers
+  are now delimited with `<>` or `[]` based on whether it is a Unicode or
+  glyphs buffer.
+- Increase buffer work limits to handle fonts with many complex lookups.
+- Handle more shaping operations in trace output.
+- Memory access fixes.
+- More OOM fixes.
+- Improved documentation.
+- Build system improvements.
+- New API:
++hb_buffer_has_positions()
++hb_buffer_serialize()
++hb_buffer_serialize_unicode()
++hb_buffer_deserialize_unicode()
+
+
+Overview of changes leading to 2.7.2
+Saturday, August 29, 2020
+====================================
+- Fix a regression in the previous release that caused a crash with Kaithi.
+- More OOM fixes.
+
+
+Overview of changes leading to 2.7.1
+Thursday, August 13, 2020
+====================================
+- ot-funcs now handles variable empty glyphs better when hvar/vvar isn't present.
+- Reverted a GDEF processing regression.
+- A couple of fixes to handle OOM better.
+
+
+Overview of changes leading to 2.7.0
+Saturday, July 25, 2020
+====================================
+- Use an implementation for round that always rounds up, some minor fluctuations
+  are expected on var font specially when hb-ot callback is used.
+- Fix an AAT's `kerx` issue on broken rendering of Devanagari Sangam MN.
+- Remove AAT's `lcar` table support from _get_ligature_carets API, not even much
+  use on macOS installed fonts (only two files).  GDEF support is the recommended
+  one and expected to work properly after issues fixed two releases ago.
+- Minor memory fixes to handle OOM better specially in hb-ft.
+- Minor .so files versioning scheme change and remove stable/unstable scheme
+  differences, was never used in practice (always default to stable scheme).
+- We are now suggesting careful packaging of the library using meson,
+  https://github.com/harfbuzz/harfbuzz/wiki/Notes-on-migration-to-meson
+  for more information.
+- Distribution package URL is changed, either use GitHub generated tarballs,
+  `https://github.com/harfbuzz/harfbuzz/archive/$pkgver.tar.gz`
+  or, even more preferably use commit hash of the release and git checkouts like,
+  `git+https://github.com/harfbuzz/harfbuzz#commit=$commit`
+
+
+Overview of changes leading to 2.6.8
+Monday, June 22, 2020
+====================================
+- New API to fetch glyph alternates from GSUB table.
+- hb-coretext build fix for macOS < 10.10.
+- Meson build fixes, cmake port removal is postponed but please prepare for
+  it and give us feedback.
+  Autotools is still our main build system however please consider
+  experimenting with meson also for packaging the library.
+- New API:
++hb_ot_layout_lookup_get_glyph_alternates()
+
+
 Overview of changes leading to 2.6.7
 Wednesday, June 3, 2020
 ====================================
@@ -122,7 +454,7 @@ Friday, May 24, 2019
   code-base changes.  We now require C++11.  Support for gcc 4.8 and earlier has been
   dropped.
 - New hb-config.hh facility for compiling smaller library for embedded and web usecases.
-- New Unicode Character Databse implementation that is half the size of previously-used
+- New Unicode Character Database implementation that is half the size of previously-used
   UCDN.
 - Subsetter improvements.
 - Improved documentation, thanks to Nathan Willis.
@@ -970,7 +1302,7 @@ Thursday, February 25, 2016
   due to bug in glyph class of ASCII double-quote character.  This should
   address "regression" introduced in 1.2.0 when we switched mark zeroing
   in most shapers from BY_UNICODE_LATE to BY_GDEF_LATE.
-  This fourth release in a week should finally stablize things...
+  This fourth release in a week should finally stabilize things...
 
 - hb-ot-font's get_glyph() implementation saw some optimizations.  Though,
   might be really hard to measure in real-world situations.
@@ -2018,7 +2350,7 @@ o Changed API:
   - hb_buffer_create() takes zero arguments now.
     Use hb_buffer_pre_allocate() to pre-allocate.
 
-  - hb_buffer_add_utf*() now accept -1 for length parameteres,
+  - hb_buffer_add_utf*() now accept -1 for length parameters,
     meaning "nul-terminated".
 
   - hb_direction_t enum values changed.
diff --git a/README b/README
index 3610912..84c542f 100644 (file)
--- a/README
+++ b/README
@@ -1,34 +1,15 @@
-[![Travis Build Status](https://travis-ci.org/harfbuzz/harfbuzz.svg?branch=master)](https://travis-ci.org/harfbuzz/harfbuzz)
-[![AppVeyor Build Status](https://ci.appveyor.com/api/projects/status/0t0flrxpstj9lb9w?svg=true&branch=master)](https://ci.appveyor.com/project/harfbuzz/harfbuzz)
-[![CircleCI Build Status](https://circleci.com/gh/harfbuzz/harfbuzz/tree/master.svg?style=svg)](https://circleci.com/gh/harfbuzz/harfbuzz/tree/master)
-[![OSS-Fuzz Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/harfbuzz.svg)](https://oss-fuzz-build-logs.storage.googleapis.com/index.html)
-[![Coverity Code Health](https://img.shields.io/coverity/scan/5450.svg)](https://scan.coverity.com/projects/behdad-harfbuzz)
-[![Codacy Code Health](https://api.codacy.com/project/badge/Grade/f17f1708783c447488bc8dd317150eaa)](https://app.codacy.com/app/behdad/harfbuzz)
-[![Codecov Code Coverage](https://codecov.io/gh/harfbuzz/harfbuzz/branch/master/graph/badge.svg)](https://codecov.io/gh/harfbuzz/harfbuzz)
-[![Coverals Code Coverage](https://img.shields.io/coveralls/harfbuzz/harfbuzz.svg)](https://coveralls.io/r/harfbuzz/harfbuzz)
-[![Packaging status](https://repology.org/badge/tiny-repos/harfbuzz.svg)](https://repology.org/project/harfbuzz/versions)
-[ABI Tracker](http://abi-laboratory.pro/tracker/timeline/harfbuzz/)
-
 This is HarfBuzz, a text shaping library.
 
 For bug reports, mailing list, and other information please visit:
 
   http://harfbuzz.org/
 
-For license information, see [COPYING](COPYING).
+For license information, see https://github.com/harfbuzz/harfbuzz/blob/main/COPYING
 
-For build information, see [BUILD.md](BUILD.md).
+For build information, see https://github.com/harfbuzz/harfbuzz/blob/main/BUILD.md
 
-For custom configurations, see [CONFIG.md](CONFIG.md).
+For custom configurations, see https://github.com/harfbuzz/harfbuzz/blob/main/CONFIG.md
 
-For test execution, see [TESTING.md](TESTING.md).
+For test execution, see https://github.com/harfbuzz/harfbuzz/blob/main/TESTING.md
 
 Documentation: https://harfbuzz.github.io
-
-
-<details>
-  <summary>Packaging status of HarfBuzz</summary>
-
-[![Packaging status](https://repology.org/badge/vertical-allrepos/harfbuzz.svg?header=harfbuzz)](https://repology.org/project/harfbuzz/versions)
-
-</details>
index 3610912..9deb32c 100644 (file)
--- a/README.md
+++ b/README.md
@@ -1,10 +1,9 @@
-[![Travis Build Status](https://travis-ci.org/harfbuzz/harfbuzz.svg?branch=master)](https://travis-ci.org/harfbuzz/harfbuzz)
-[![AppVeyor Build Status](https://ci.appveyor.com/api/projects/status/0t0flrxpstj9lb9w?svg=true&branch=master)](https://ci.appveyor.com/project/harfbuzz/harfbuzz)
-[![CircleCI Build Status](https://circleci.com/gh/harfbuzz/harfbuzz/tree/master.svg?style=svg)](https://circleci.com/gh/harfbuzz/harfbuzz/tree/master)
+[![Linux CI Status](https://github.com/harfbuzz/harfbuzz/workflows/linux-ci/badge.svg)](https://github.com/harfbuzz/harfbuzz/workflows/linux-ci/badge.svg)
+[![CircleCI Build Status](https://circleci.com/gh/harfbuzz/harfbuzz/tree/main.svg?style=svg)](https://circleci.com/gh/harfbuzz/harfbuzz/tree/main)
 [![OSS-Fuzz Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/harfbuzz.svg)](https://oss-fuzz-build-logs.storage.googleapis.com/index.html)
 [![Coverity Code Health](https://img.shields.io/coverity/scan/5450.svg)](https://scan.coverity.com/projects/behdad-harfbuzz)
 [![Codacy Code Health](https://api.codacy.com/project/badge/Grade/f17f1708783c447488bc8dd317150eaa)](https://app.codacy.com/app/behdad/harfbuzz)
-[![Codecov Code Coverage](https://codecov.io/gh/harfbuzz/harfbuzz/branch/master/graph/badge.svg)](https://codecov.io/gh/harfbuzz/harfbuzz)
+[![Codecov Code Coverage](https://codecov.io/gh/harfbuzz/harfbuzz/branch/main/graph/badge.svg)](https://codecov.io/gh/harfbuzz/harfbuzz)
 [![Coverals Code Coverage](https://img.shields.io/coveralls/harfbuzz/harfbuzz.svg)](https://coveralls.io/r/harfbuzz/harfbuzz)
 [![Packaging status](https://repology.org/badge/tiny-repos/harfbuzz.svg)](https://repology.org/project/harfbuzz/versions)
 [ABI Tracker](http://abi-laboratory.pro/tracker/timeline/harfbuzz/)
index d9aaf89..7496f04 100644 (file)
@@ -6,13 +6,8 @@ you can install that this way:
 sudo apt-get install libgirepository1.0-dev
 ```
 
-And then run `autogen.sh` (if building from git), and then:
-
-```bash
-./configure --with-gobject --enable-introspection
-```
-
-Make sure that gobject-introspection is reported enabled then in the `configure` script output.
+And then run `meson setup` and make sure that `Introspection` is reported
+enabled in output.
 
 Compile and install.
 
index a26350b..8d5a406 100644 (file)
@@ -1,56 +1,37 @@
-HarfBuzz release walk-through checklist:
+HarfBuzz release walk-through checklist:
 
-1. Open gitk and review changes since last release.
+- [ ] Open gitk and review changes since last release.
 
-   * `git diff $(git describe | sed 's/-.*//').. src/*.h` prints all public API
-     changes.
+       - [ ] Print all public API changes:
+        `git diff $(git describe | sed 's/-.*//').. src/*.h`
 
-     Document them in NEWS.  All API and API semantic changes should be clearly
-     marked as API additions, API changes, or API deletions.  Document
-     deprecations.  Ensure all new API / deprecations are in listed correctly in
-     docs/harfbuzz-sections.txt.  If release added new API, add entry for new
-     API index at the end of docs/harfbuzz-docs.xml.
+    - [ ]  Document them in NEWS.
+        All API and API semantic changes should be clearly marked as API additions, API changes, or API deletions.
 
-     If there's a backward-incompatible API change (including deletions for API
-     used anywhere), that's a release blocker.  Do NOT release.
+    - [ ] Document deprecations.
+        Ensure all new API / deprecations are in listed correctly in docs/harfbuzz-sections.txt.
+        If release added new API, add entry for new API index at the end of docs/harfbuzz-docs.xml.
 
-2. Based on severity of changes, decide whether it's a minor or micro release
-   number bump,
+     If there's a backward-incompatible API change (including deletions for API used anywhere), that's a release blocker.
+     Do NOT release.
 
-3. Search for REPLACEME on the repository and replace it with the chosen version
-   for the release.
+- [ ] Based on severity of changes, decide whether it's a minor or micro release number bump.
 
-4. Make sure you have correct date and new version at the top of NEWS file,
+- [ ] Search for REPLACEME on the repository and replace it with the chosen version for the release.
 
-5. Bump version in configure.ac line 3 and meson.build line 4.
+- [ ] Make sure you have correct date and new version at the top of NEWS file.
 
-6. Do "make distcheck", if it passes, you get a tarball.
-   Otherwise, fix things and commit them separately before making release,
-   Note: Check src/hb-version.h and make sure the new version number is
-   there.  Sometimes, it does not get updated.  If that's the case,
-   "touch configure.ac" and rebuild.  Also check that there is no hb-version.h
-   in your build/src file. Typically it will fail the distcheck if there is.
-   That's what happened to 2.0.0 going out with 1.8.0 hb-version.h...  So, that's
-   a clue.
+- [ ] Bump version in line 3 of meson.build and configure.ac.
 
-7. Now that you have release files, commit NEWS, configure.ac, and src/hb-version.h,
-   as well as any REPLACEME changes you made.  The commit message is simply the
-   release number.  Eg. "1.4.7"
+- [ ] Do a `meson test -Cbuild` so it both checks the tests and updates hb-version.h (use `git diff` to see if is really updated).
 
-8. "make dist" again to get a tarball with your new commit in the ChangeLog.  Then
-   "make release-files".  Enter your GPG password.  This creates a sha256 hash
-   and signs it.  Check the size of the three resulting files.
+- [ ] Commit NEWS, meson.build, configure.ac, and src/hb-version.h, as well as any REPLACEME changes you made.
+        The commit message is simply the release number, e. g. "1.4.7"
 
-9. Tag the release and sign it: Eg. "git tag -s 1.4.7 -m 1.4.7".  Enter your
-   GPG password again.
+- [ ] Do a `meson dist -Cbuild` that runs the tests against the latest committed changes.
+   If doesn't pass, something fishy is going on, reset the repo and start over.
 
-10. Build win32 bundle.  See [README.mingw.md](README.mingw.md).
+- [ ] Tag the release and sign it: e.g. `git tag -s 1.4.7 -m 1.4.7`.
+         Enter your GPG password.
 
-11. Quickly double-check the size of the .tar.xz and .zip files against their
-    previous releases to make sure nothing bad happened.
-    They should be in the ballpark, perhaps slightly larger.  Sometimes they
-    do shrink, that's not by itself a stopper.
-
-12. Push the commit and tag out: "git push --follow-tags".  Go to GitHub release
-    page [here](https://github.com/harfbuzz/harfbuzz/releases), edit the tag,
-    upload artefacts and NEWS entry and save.
+- [ ] Push the commit and tag out: `git push --follow-tags`.
index d70da07..c722834 100644 (file)
@@ -1,85 +1,55 @@
-## Build & Run
-
-Depending on what area you are working in change or add `HB_DEBUG_<whatever>`.
-Values defined in `hb-debug.hh`.
+## Build and Test
 
 ```shell
-# quick sanity check
-time (make -j4 CPPFLAGS='-DHB_DEBUG_SUBSET=100' \
-  && (make -j4 -C test/api check || cat test/api/test-suite.log))
-
-# slower sanity check
-time (make -j4 CPPFLAGS='-DHB_DEBUG_SUBSET=100' \
-   && make -j4 -C src check \
-   && make -j4 -C test/api check \
-   && make -j4 -C test/subset check)
-
-# confirm you didn't break anything else
-time (make -j4 CPPFLAGS='-DHB_DEBUG_SUBSET=100' \
-  && make -j4 check)
-
-# often catches files you didn't add, e.g. test fonts to EXTRA_DIST
-make distcheck
+meson build
+ninja -Cbuild
+meson test -Cbuild
 ```
 
-### Run tests with asan
-
-**NOTE**: this sometimes yields harder to read results than the full fuzzer
+### Debug with GDB
 
 ```shell
-# For nice symbols tell asan how to symoblize. Note that it doesn't like versioned copies like llvm-symbolizer-3.8
-# export ASAN_SYMBOLIZER_PATH=path to version-less llvm-symbolizer
-# ex
-export ASAN_SYMBOLIZER_PATH=/usr/lib/llvm-3.8/bin/llvm-symbolizer
-
-./configure CC=clang CXX=clang++ CPPFLAGS=-fsanitize=address LDFLAGS=-fsanitize=address
-# make/run tests as usual
+meson test -Cbuild --gdb testname
 ```
 
-### Debug with GDB
+## Build and Run
 
-```
-cd ./util
-../libtool --mode=execute gdb --args ./hb-subset ...
+Depending on what area you are working in change or add `HB_DEBUG_<whatever>`.
+Values defined in `hb-debug.hh`.
+
+```shell
+CPPFLAGS='-DHB_DEBUG_SUBSET=100' meson setup build --reconfigure
+meson test -C build
 ```
 
-### Enable Debug Logging
+### Run tests with asan
 
 ```shell
-# make clean if you previously build w/o debug logging
-make CPPFLAGS=-DHB_DEBUG_SUBSET=100
+meson setup build -Db_sanitize=address --reconfigure
+meson compile -C build
+meson test -C build
 ```
 
-## Build and Test via CMake
-
-Note: You'll need to first install ninja-build via apt-get.
+### Enable Debug Logging
 
 ```shell
-meson build && ninja -Cbuild && ninja -Cbuild test
+CPPFLAGS=-DHB_DEBUG_SUBSET=100 meson build --reconfigure
+ninja -C build
 ```
 
 ## Test with the Fuzzer
 
 ```shell
-# push your changs to a branch on googlefonts/harfbuzz
-# In a local copy of oss-fuzz, edit projects/harfbuzz/Dockerfile
-# Change the git clone to pull your branch
-
-# Do this periodically
-sudo python infra/helper.py build_image harfbuzz
-
-# Do these to update/run
-sudo python infra/helper.py build_fuzzers --sanitizer address harfbuzz
-sudo python infra/helper.py run_fuzzer harfbuzz hb-subset-fuzzer
+CXXFLAGS="-fsanitize=address,fuzzer-no-link" meson fuzzbuild --default-library=static -Dfuzzer_ldflags="-fsanitize=address,fuzzer" -Dexperimental_api=true
+ninja -Cfuzzbuild test/fuzzing/hb-{shape,draw,subset,set}-fuzzer
+fuzzbuild/test/fuzzing/hb-subset-fuzzer test/fuzzing/fonts
 ```
 
 ## Profiling
 
 ```
-make clean
-./configure CXXFLAGS="-fno-omit-frame-pointer -g"
-make
-perf record -o <perf output file> -g <command to run>
-perf report -i<perf output file>
+meson build --reconfigure
+meson compile -C build
+build/perf/perf
 ```
 
index 23e51cd..ce5c0af 100644 (file)
@@ -1,6 +1,6 @@
-# generated automatically by aclocal 1.16.2 -*- Autoconf -*-
+# generated automatically by aclocal 1.16.1 -*- Autoconf -*-
 
-# Copyright (C) 1996-2020 Free Software Foundation, Inc.
+# Copyright (C) 1996-2018 Free Software Foundation, Inc.
 
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -163,9 +163,9 @@ AC_DEFUN([GOBJECT_INTROSPECTION_REQUIRE],
   _GOBJECT_INTROSPECTION_CHECK_INTERNAL([$1], [require])
 ])
 
-# pkg.m4 - Macros to locate and utilise pkg-config.   -*- Autoconf -*-
-# serial 11 (pkg-config-0.29.1)
-
+dnl pkg.m4 - Macros to locate and utilise pkg-config.   -*- Autoconf -*-
+dnl serial 11 (pkg-config-0.29.1)
+dnl
 dnl Copyright © 2004 Scott James Remnant <scott@netsplit.com>.
 dnl Copyright © 2012-2015 Dan Nicholson <dbn.lists@gmail.com>
 dnl
@@ -439,75 +439,7 @@ AS_VAR_COPY([$1], [pkg_cv_][$1])
 AS_VAR_IF([$1], [""], [$5], [$4])dnl
 ])dnl PKG_CHECK_VAR
 
-dnl PKG_WITH_MODULES(VARIABLE-PREFIX, MODULES,
-dnl   [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND],
-dnl   [DESCRIPTION], [DEFAULT])
-dnl ------------------------------------------
-dnl
-dnl Prepare a "--with-" configure option using the lowercase
-dnl [VARIABLE-PREFIX] name, merging the behaviour of AC_ARG_WITH and
-dnl PKG_CHECK_MODULES in a single macro.
-AC_DEFUN([PKG_WITH_MODULES],
-[
-m4_pushdef([with_arg], m4_tolower([$1]))
-
-m4_pushdef([description],
-           [m4_default([$5], [build with ]with_arg[ support])])
-
-m4_pushdef([def_arg], [m4_default([$6], [auto])])
-m4_pushdef([def_action_if_found], [AS_TR_SH([with_]with_arg)=yes])
-m4_pushdef([def_action_if_not_found], [AS_TR_SH([with_]with_arg)=no])
-
-m4_case(def_arg,
-            [yes],[m4_pushdef([with_without], [--without-]with_arg)],
-            [m4_pushdef([with_without],[--with-]with_arg)])
-
-AC_ARG_WITH(with_arg,
-     AS_HELP_STRING(with_without, description[ @<:@default=]def_arg[@:>@]),,
-    [AS_TR_SH([with_]with_arg)=def_arg])
-
-AS_CASE([$AS_TR_SH([with_]with_arg)],
-            [yes],[PKG_CHECK_MODULES([$1],[$2],$3,$4)],
-            [auto],[PKG_CHECK_MODULES([$1],[$2],
-                                        [m4_n([def_action_if_found]) $3],
-                                        [m4_n([def_action_if_not_found]) $4])])
-
-m4_popdef([with_arg])
-m4_popdef([description])
-m4_popdef([def_arg])
-
-])dnl PKG_WITH_MODULES
-
-dnl PKG_HAVE_WITH_MODULES(VARIABLE-PREFIX, MODULES,
-dnl   [DESCRIPTION], [DEFAULT])
-dnl -----------------------------------------------
-dnl
-dnl Convenience macro to trigger AM_CONDITIONAL after PKG_WITH_MODULES
-dnl check._[VARIABLE-PREFIX] is exported as make variable.
-AC_DEFUN([PKG_HAVE_WITH_MODULES],
-[
-PKG_WITH_MODULES([$1],[$2],,,[$3],[$4])
-
-AM_CONDITIONAL([HAVE_][$1],
-               [test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"])
-])dnl PKG_HAVE_WITH_MODULES
-
-dnl PKG_HAVE_DEFINE_WITH_MODULES(VARIABLE-PREFIX, MODULES,
-dnl   [DESCRIPTION], [DEFAULT])
-dnl ------------------------------------------------------
-dnl
-dnl Convenience macro to run AM_CONDITIONAL and AC_DEFINE after
-dnl PKG_WITH_MODULES check. HAVE_[VARIABLE-PREFIX] is exported as make
-dnl and preprocessor variable.
-AC_DEFUN([PKG_HAVE_DEFINE_WITH_MODULES],
-[
-PKG_HAVE_WITH_MODULES([$1],[$2],[$3],[$4])
-
-AS_IF([test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"],
-        [AC_DEFINE([HAVE_][$1], 1, [Enable ]m4_tolower([$1])[ support])])
-])dnl PKG_HAVE_DEFINE_WITH_MODULES
-
-# Copyright (C) 2002-2020 Free Software Foundation, Inc.
+# Copyright (C) 2002-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -522,7 +454,7 @@ AC_DEFUN([AM_AUTOMAKE_VERSION],
 [am__api_version='1.16'
 dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
 dnl require some minimum version.  Point them to the right macro.
-m4_if([$1], [1.16.2], [],
+m4_if([$1], [1.16.1], [],
       [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
 ])
 
@@ -538,12 +470,12 @@ m4_define([_AM_AUTOCONF_VERSION], [])
 # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
 # This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
 AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.16.2])dnl
+[AM_AUTOMAKE_VERSION([1.16.1])dnl
 m4_ifndef([AC_AUTOCONF_VERSION],
   [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
 _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
 
-# Copyright (C) 2011-2020 Free Software Foundation, Inc.
+# Copyright (C) 2011-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -605,7 +537,7 @@ AC_SUBST([AR])dnl
 
 # AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
 
-# Copyright (C) 2001-2020 Free Software Foundation, Inc.
+# Copyright (C) 2001-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -657,7 +589,7 @@ am_aux_dir=`cd "$ac_aux_dir" && pwd`
 
 # AM_CONDITIONAL                                            -*- Autoconf -*-
 
-# Copyright (C) 1997-2020 Free Software Foundation, Inc.
+# Copyright (C) 1997-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -688,7 +620,7 @@ AC_CONFIG_COMMANDS_PRE(
 Usually this means the macro was only invoked conditionally.]])
 fi])])
 
-# Copyright (C) 1999-2020 Free Software Foundation, Inc.
+# Copyright (C) 1999-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -879,7 +811,7 @@ _AM_SUBST_NOTMAKE([am__nodep])dnl
 
 # Generate code to set up dependency tracking.              -*- Autoconf -*-
 
-# Copyright (C) 1999-2020 Free Software Foundation, Inc.
+# Copyright (C) 1999-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -918,9 +850,7 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
   done
   if test $am_rc -ne 0; then
     AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments
-    for automatic dependency tracking.  If GNU make was not used, consider
-    re-running the configure script with MAKE="gmake" (or whatever is
-    necessary).  You can also try re-running configure with the
+    for automatic dependency tracking.  Try re-running configure with the
     '--disable-dependency-tracking' option to at least be able to build
     the package (albeit without support for automatic dependency tracking).])
   fi
@@ -947,7 +877,7 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
 
 # Do all the work for Automake.                             -*- Autoconf -*-
 
-# Copyright (C) 1996-2020 Free Software Foundation, Inc.
+# Copyright (C) 1996-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1144,7 +1074,7 @@ for _am_header in $config_headers :; do
 done
 echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
 
-# Copyright (C) 2001-2020 Free Software Foundation, Inc.
+# Copyright (C) 2001-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1165,7 +1095,7 @@ if test x"${install_sh+set}" != xset; then
 fi
 AC_SUBST([install_sh])])
 
-# Copyright (C) 2003-2020 Free Software Foundation, Inc.
+# Copyright (C) 2003-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1186,7 +1116,7 @@ AC_SUBST([am__leading_dot])])
 
 # Check to see how 'make' treats includes.                 -*- Autoconf -*-
 
-# Copyright (C) 2001-2020 Free Software Foundation, Inc.
+# Copyright (C) 2001-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1229,7 +1159,7 @@ AC_SUBST([am__quote])])
 
 # Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
 
-# Copyright (C) 1997-2020 Free Software Foundation, Inc.
+# Copyright (C) 1997-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1268,7 +1198,7 @@ fi
 
 # Helper functions for option handling.                     -*- Autoconf -*-
 
-# Copyright (C) 2001-2020 Free Software Foundation, Inc.
+# Copyright (C) 2001-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1297,7 +1227,7 @@ AC_DEFUN([_AM_SET_OPTIONS],
 AC_DEFUN([_AM_IF_OPTION],
 [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
 
-# Copyright (C) 1999-2020 Free Software Foundation, Inc.
+# Copyright (C) 1999-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1344,7 +1274,7 @@ AC_LANG_POP([C])])
 # For backward compatibility.
 AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
 
-# Copyright (C) 2001-2020 Free Software Foundation, Inc.
+# Copyright (C) 2001-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1363,7 +1293,7 @@ AC_DEFUN([AM_RUN_LOG],
 
 # Check to make sure that the build environment is sane.    -*- Autoconf -*-
 
-# Copyright (C) 1996-2020 Free Software Foundation, Inc.
+# Copyright (C) 1996-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1444,7 +1374,7 @@ AC_CONFIG_COMMANDS_PRE(
 rm -f conftest.file
 ])
 
-# Copyright (C) 2009-2020 Free Software Foundation, Inc.
+# Copyright (C) 2009-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1504,7 +1434,7 @@ AC_SUBST([AM_BACKSLASH])dnl
 _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
 ])
 
-# Copyright (C) 2001-2020 Free Software Foundation, Inc.
+# Copyright (C) 2001-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1532,7 +1462,7 @@ fi
 INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
 AC_SUBST([INSTALL_STRIP_PROGRAM])])
 
-# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+# Copyright (C) 2006-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1551,7 +1481,7 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
 
 # Check how to create a tarball.                            -*- Autoconf -*-
 
-# Copyright (C) 2004-2020 Free Software Foundation, Inc.
+# Copyright (C) 2004-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
diff --git a/ar-lib b/ar-lib
index 1e9388e..0baa4f6 100755 (executable)
--- a/ar-lib
+++ b/ar-lib
@@ -2,9 +2,9 @@
 # Wrapper for Microsoft lib.exe
 
 me=ar-lib
-scriptversion=2019-07-04.01; # UTC
+scriptversion=2012-03-01.08; # UTC
 
-# Copyright (C) 2010-2020 Free Software Foundation, Inc.
+# Copyright (C) 2010-2018 Free Software Foundation, Inc.
 # Written by Peter Rosin <peda@lysator.liu.se>.
 #
 # This program is free software; you can redistribute it and/or modify
@@ -53,7 +53,7 @@ func_file_conv ()
          MINGW*)
            file_conv=mingw
            ;;
-         CYGWIN* | MSYS*)
+         CYGWIN*)
            file_conv=cygwin
            ;;
          *)
@@ -65,7 +65,7 @@ func_file_conv ()
        mingw)
          file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
          ;;
-       cygwin | msys)
+       cygwin)
          file=`cygpath -m "$file" || echo "$file"`
          ;;
        wine)
@@ -224,11 +224,10 @@ elif test -n "$extract"; then
       esac
     done
   else
-    $AR -NOLOGO -LIST "$archive" | tr -d '\r' | sed -e 's/\\/\\\\/g' \
-      | while read member
-        do
-          $AR -NOLOGO -EXTRACT:"$member" "$archive" || exit $?
-        done
+    $AR -NOLOGO -LIST "$archive" | sed -e 's/\\/\\\\/g' | while read member
+    do
+      $AR -NOLOGO -EXTRACT:"$member" "$archive" || exit $?
+    done
   fi
 
 elif test -n "$quick$replace"; then
index fd5c198..085b4d8 100755 (executable)
@@ -7,24 +7,24 @@ test -n "$srcdir" || srcdir=.
 olddir=`pwd`
 cd $srcdir
 
-#echo -n "checking for ragel... "
+#printf "checking for ragel... "
 #which ragel || {
 #      echo "You need to install ragel... See http://www.complang.org/ragel/"
 #      exit 1
 #}
 
-echo -n "checking for pkg-config... "
+printf "checking for pkg-config... "
 which pkg-config || {
        echo "*** No pkg-config found, please install it ***"
        exit 1
 }
 
-echo -n "checking for libtoolize... "
+printf "checking for libtoolize... "
 which glibtoolize || which libtoolize || {
        echo "*** No libtoolize (libtool) found, please install it ***"
        exit 1
 }
-echo -n "checking for gtkdocize... "
+printf "checking for gtkdocize... "
 if which gtkdocize ; then
        gtkdocize --copy || exit 1
 else
@@ -32,7 +32,7 @@ else
        echo "EXTRA_DIST = " > gtk-doc.make
 fi
 
-echo -n "checking for autoreconf... "
+printf "checking for autoreconf... "
 which autoreconf || {
        echo "*** No autoreconf (autoconf) found, please install it ***"
        exit 1
diff --git a/compile b/compile
index 23fcba0..99e5052 100755 (executable)
--- a/compile
+++ b/compile
@@ -3,7 +3,7 @@
 
 scriptversion=2018-03-07.03; # UTC
 
-# Copyright (C) 1999-2020 Free Software Foundation, Inc.
+# Copyright (C) 1999-2018 Free Software Foundation, Inc.
 # Written by Tom Tromey <tromey@cygnus.com>.
 #
 # This program is free software; you can redistribute it and/or modify
@@ -53,7 +53,7 @@ func_file_conv ()
          MINGW*)
            file_conv=mingw
            ;;
-         CYGWIN* | MSYS*)
+         CYGWIN*)
            file_conv=cygwin
            ;;
          *)
@@ -67,7 +67,7 @@ func_file_conv ()
        mingw/*)
          file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
          ;;
-       cygwin/* | msys/*)
+       cygwin/*)
          file=`cygpath -m "$file" || echo "$file"`
          ;;
        wine/*)
index 45001cf..f50dcdb 100755 (executable)
@@ -1,8 +1,8 @@
 #! /bin/sh
 # Attempt to guess a canonical system name.
-#   Copyright 1992-2020 Free Software Foundation, Inc.
+#   Copyright 1992-2018 Free Software Foundation, Inc.
 
-timestamp='2020-01-01'
+timestamp='2018-02-24'
 
 # This file is free software; you can redistribute it and/or modify it
 # under the terms of the GNU General Public License as published by
@@ -50,7 +50,7 @@ version="\
 GNU config.guess ($timestamp)
 
 Originally written by Per Bothner.
-Copyright 1992-2020 Free Software Foundation, Inc.
+Copyright 1992-2018 Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -84,6 +84,8 @@ if test $# != 0; then
   exit 1
 fi
 
+trap 'exit 1' 1 2 15
+
 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a
 # compiler to aid in system detection is discouraged as it requires
 # temporary files to be created and, as you can see below, it is a
@@ -94,40 +96,34 @@ fi
 
 # Portable tmp directory creation inspired by the Autoconf team.
 
-tmp=
-# shellcheck disable=SC2172
-trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15
-
-set_cc_for_build() {
-    # prevent multiple calls if $tmp is already set
-    test "$tmp" && return 0
-    : "${TMPDIR=/tmp}"
-    # shellcheck disable=SC2039
-    { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
-       { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } ||
-       { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } ||
-       { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; }
-    dummy=$tmp/dummy
-    case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in
-       ,,)    echo "int x;" > "$dummy.c"
-              for driver in cc gcc c89 c99 ; do
-                  if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then
-                      CC_FOR_BUILD="$driver"
-                      break
-                  fi
-              done
-              if test x"$CC_FOR_BUILD" = x ; then
-                  CC_FOR_BUILD=no_compiler_found
-              fi
-              ;;
-       ,,*)   CC_FOR_BUILD=$CC ;;
-       ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
-    esac
-}
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,)    echo "int x;" > "$dummy.c" ;
+       for c in cc gcc c89 c99 ; do
+         if ($c -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then
+            CC_FOR_BUILD="$c"; break ;
+         fi ;
+       done ;
+       if test x"$CC_FOR_BUILD" = x ; then
+         CC_FOR_BUILD=no_compiler_found ;
+       fi
+       ;;
+ ,,*)   CC_FOR_BUILD=$CC ;;
+ ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
+esac ; set_cc_for_build= ;'
 
 # This is needed to find uname on a Pyramid OSx when run in the BSD universe.
 # (ghazi@noc.rutgers.edu 1994-08-24)
-if test -f /.attbin/uname ; then
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
        PATH=$PATH:/.attbin ; export PATH
 fi
 
@@ -142,7 +138,7 @@ Linux|GNU|GNU/*)
        # We could probably try harder.
        LIBC=gnu
 
-       set_cc_for_build
+       eval "$set_cc_for_build"
        cat <<-EOF > "$dummy.c"
        #include <features.h>
        #if defined(__UCLIBC__)
@@ -203,7 +199,7 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
                os=netbsdelf
                ;;
            arm*|i386|m68k|ns32k|sh3*|sparc|vax)
-               set_cc_for_build
+               eval "$set_cc_for_build"
                if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
                        | grep -q __ELF__
                then
@@ -241,7 +237,7 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
        # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
        # contains redundant information, the shorter form:
        # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
-       echo "$machine-${os}${release}${abi-}"
+       echo "$machine-${os}${release}${abi}"
        exit ;;
     *:Bitrig:*:*)
        UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
@@ -264,9 +260,6 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
     *:SolidBSD:*:*)
        echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE"
        exit ;;
-    *:OS108:*:*)
-       echo "$UNAME_MACHINE"-unknown-os108_"$UNAME_RELEASE"
-       exit ;;
     macppc:MirBSD:*:*)
        echo powerpc-unknown-mirbsd"$UNAME_RELEASE"
        exit ;;
@@ -276,15 +269,12 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
     *:Sortix:*:*)
        echo "$UNAME_MACHINE"-unknown-sortix
        exit ;;
-    *:Twizzler:*:*)
-       echo "$UNAME_MACHINE"-unknown-twizzler
-       exit ;;
     *:Redox:*:*)
        echo "$UNAME_MACHINE"-unknown-redox
        exit ;;
     mips:OSF1:*.*)
-       echo mips-dec-osf1
-       exit ;;
+        echo mips-dec-osf1
+        exit ;;
     alpha:OSF1:*:*)
        case $UNAME_RELEASE in
        *4.0)
@@ -399,7 +389,7 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
        echo i386-pc-auroraux"$UNAME_RELEASE"
        exit ;;
     i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
-       set_cc_for_build
+       eval "$set_cc_for_build"
        SUN_ARCH=i386
        # If there is a compiler, see if it is configured for 64-bit objects.
        # Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
@@ -492,7 +482,7 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
        echo clipper-intergraph-clix"$UNAME_RELEASE"
        exit ;;
     mips:*:*:UMIPS | mips:*:*:RISCos)
-       set_cc_for_build
+       eval "$set_cc_for_build"
        sed 's/^        //' << EOF > "$dummy.c"
 #ifdef __cplusplus
 #include <stdio.h>  /* for printf() prototype */
@@ -589,7 +579,7 @@ EOF
        exit ;;
     *:AIX:2:3)
        if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
-               set_cc_for_build
+               eval "$set_cc_for_build"
                sed 's/^                //' << EOF > "$dummy.c"
                #include <sys/systemcfg.h>
 
@@ -670,7 +660,7 @@ EOF
                    esac
                fi
                if [ "$HP_ARCH" = "" ]; then
-                   set_cc_for_build
+                   eval "$set_cc_for_build"
                    sed 's/^            //' << EOF > "$dummy.c"
 
                #define _HPUX_SOURCE
@@ -710,7 +700,7 @@ EOF
        esac
        if [ "$HP_ARCH" = hppa2.0w ]
        then
-           set_cc_for_build
+           eval "$set_cc_for_build"
 
            # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
            # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
@@ -736,7 +726,7 @@ EOF
        echo ia64-hp-hpux"$HPUX_REV"
        exit ;;
     3050*:HI-UX:*:*)
-       set_cc_for_build
+       eval "$set_cc_for_build"
        sed 's/^        //' << EOF > "$dummy.c"
        #include <unistd.h>
        int
@@ -850,17 +840,6 @@ EOF
     *:BSD/OS:*:*)
        echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE"
        exit ;;
-    arm:FreeBSD:*:*)
-       UNAME_PROCESSOR=`uname -p`
-       set_cc_for_build
-       if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
-           | grep -q __ARM_PCS_VFP
-       then
-           echo "${UNAME_PROCESSOR}"-unknown-freebsd"`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`"-gnueabi
-       else
-           echo "${UNAME_PROCESSOR}"-unknown-freebsd"`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`"-gnueabihf
-       fi
-       exit ;;
     *:FreeBSD:*:*)
        UNAME_PROCESSOR=`/usr/bin/uname -p`
        case "$UNAME_PROCESSOR" in
@@ -902,7 +881,7 @@ EOF
        echo "$UNAME_MACHINE"-pc-uwin
        exit ;;
     amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
-       echo x86_64-pc-cygwin
+       echo x86_64-unknown-cygwin
        exit ;;
     prep*:SunOS:5.*:*)
        echo powerpcle-unknown-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`"
@@ -915,8 +894,8 @@ EOF
        # other systems with GNU libc and userland
        echo "$UNAME_MACHINE-unknown-`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`-$LIBC"
        exit ;;
-    *:Minix:*:*)
-       echo "$UNAME_MACHINE"-unknown-minix
+    i*86:Minix:*:*)
+       echo "$UNAME_MACHINE"-pc-minix
        exit ;;
     aarch64:Linux:*:*)
        echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
@@ -926,7 +905,7 @@ EOF
        echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
        exit ;;
     alpha:Linux:*:*)
-       case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null` in
+       case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
          EV5)   UNAME_MACHINE=alphaev5 ;;
          EV56)  UNAME_MACHINE=alphaev56 ;;
          PCA56) UNAME_MACHINE=alphapca56 ;;
@@ -943,7 +922,7 @@ EOF
        echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
        exit ;;
     arm*:Linux:*:*)
-       set_cc_for_build
+       eval "$set_cc_for_build"
        if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
            | grep -q __ARM_EABI__
        then
@@ -992,51 +971,23 @@ EOF
        echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
        exit ;;
     mips:Linux:*:* | mips64:Linux:*:*)
-       set_cc_for_build
-       IS_GLIBC=0
-       test x"${LIBC}" = xgnu && IS_GLIBC=1
+       eval "$set_cc_for_build"
        sed 's/^        //' << EOF > "$dummy.c"
        #undef CPU
-       #undef mips
-       #undef mipsel
-       #undef mips64
-       #undef mips64el
-       #if ${IS_GLIBC} && defined(_ABI64)
-       LIBCABI=gnuabi64
-       #else
-       #if ${IS_GLIBC} && defined(_ABIN32)
-       LIBCABI=gnuabin32
-       #else
-       LIBCABI=${LIBC}
-       #endif
-       #endif
-
-       #if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6
-       CPU=mipsisa64r6
-       #else
-       #if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6
-       CPU=mipsisa32r6
-       #else
-       #if defined(__mips64)
-       CPU=mips64
-       #else
-       CPU=mips
-       #endif
-       #endif
-       #endif
-
+       #undef ${UNAME_MACHINE}
+       #undef ${UNAME_MACHINE}el
        #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
-       MIPS_ENDIAN=el
+       CPU=${UNAME_MACHINE}el
        #else
        #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
-       MIPS_ENDIAN=
+       CPU=${UNAME_MACHINE}
        #else
-       MIPS_ENDIAN=
+       CPU=
        #endif
        #endif
 EOF
-       eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'`"
-       test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; }
+       eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU'`"
+       test "x$CPU" != x && { echo "$CPU-unknown-linux-$LIBC"; exit; }
        ;;
     mips64el:Linux:*:*)
        echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
@@ -1095,7 +1046,11 @@ EOF
        echo "$UNAME_MACHINE"-dec-linux-"$LIBC"
        exit ;;
     x86_64:Linux:*:*)
-       echo "$UNAME_MACHINE"-pc-linux-"$LIBC"
+       if objdump -f /bin/sh | grep -q elf32-x86-64; then
+           echo "$UNAME_MACHINE"-pc-linux-"$LIBC"x32
+       else
+           echo "$UNAME_MACHINE"-pc-linux-"$LIBC"
+       fi
        exit ;;
     xtensa*:Linux:*:*)
        echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
@@ -1149,7 +1104,7 @@ EOF
            *Pentium)        UNAME_MACHINE=i586 ;;
            *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
        esac
-       echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}"
+       echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}{$UNAME_VERSION}"
        exit ;;
     i*86:*:3.2:*)
        if test -f /usr/options/cb.name; then
@@ -1333,39 +1288,38 @@ EOF
        echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE"
        exit ;;
     *:Darwin:*:*)
-       UNAME_PROCESSOR=`uname -p`
-       case $UNAME_PROCESSOR in
-           unknown) UNAME_PROCESSOR=powerpc ;;
-       esac
-       if command -v xcode-select > /dev/null 2> /dev/null && \
-               ! xcode-select --print-path > /dev/null 2> /dev/null ; then
-           # Avoid executing cc if there is no toolchain installed as
-           # cc will be a stub that puts up a graphical alert
-           # prompting the user to install developer tools.
-           CC_FOR_BUILD=no_compiler_found
-       else
-           set_cc_for_build
+       UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+       eval "$set_cc_for_build"
+       if test "$UNAME_PROCESSOR" = unknown ; then
+           UNAME_PROCESSOR=powerpc
        fi
-       if [ "$CC_FOR_BUILD" != no_compiler_found ]; then
-           if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
-                  (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
-                  grep IS_64BIT_ARCH >/dev/null
-           then
-               case $UNAME_PROCESSOR in
-                   i386) UNAME_PROCESSOR=x86_64 ;;
-                   powerpc) UNAME_PROCESSOR=powerpc64 ;;
-               esac
-           fi
-           # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc
-           if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \
-                  (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
-                  grep IS_PPC >/dev/null
-           then
-               UNAME_PROCESSOR=powerpc
+       if test "`echo "$UNAME_RELEASE" | sed -e 's/\..*//'`" -le 10 ; then
+           if [ "$CC_FOR_BUILD" != no_compiler_found ]; then
+               if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+                      (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+                      grep IS_64BIT_ARCH >/dev/null
+               then
+                   case $UNAME_PROCESSOR in
+                       i386) UNAME_PROCESSOR=x86_64 ;;
+                       powerpc) UNAME_PROCESSOR=powerpc64 ;;
+                   esac
+               fi
+               # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc
+               if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \
+                      (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+                      grep IS_PPC >/dev/null
+               then
+                   UNAME_PROCESSOR=powerpc
+               fi
            fi
        elif test "$UNAME_PROCESSOR" = i386 ; then
-           # uname -m returns i386 or x86_64
-           UNAME_PROCESSOR=$UNAME_MACHINE
+           # Avoid executing cc on OS X 10.9, as it ships with a stub
+           # that puts up a graphical alert prompting to install
+           # developer tools.  Any system running Mac OS X 10.7 or
+           # later (Darwin 11 and later) is required to have a 64-bit
+           # processor. This is not true of the ARM version of Darwin
+           # that Apple uses in portable devices.
+           UNAME_PROCESSOR=x86_64
        fi
        echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE"
        exit ;;
@@ -1408,7 +1362,6 @@ EOF
        # "uname -m" is not consistent, so use $cputype instead. 386
        # is converted to i386 for consistency with other x86
        # operating systems.
-       # shellcheck disable=SC2154
        if test "$cputype" = 386; then
            UNAME_MACHINE=i386
        else
@@ -1465,148 +1418,8 @@ EOF
     amd64:Isilon\ OneFS:*:*)
        echo x86_64-unknown-onefs
        exit ;;
-    *:Unleashed:*:*)
-       echo "$UNAME_MACHINE"-unknown-unleashed"$UNAME_RELEASE"
-       exit ;;
 esac
 
-# No uname command or uname output not recognized.
-set_cc_for_build
-cat > "$dummy.c" <<EOF
-#ifdef _SEQUENT_
-#include <sys/types.h>
-#include <sys/utsname.h>
-#endif
-#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__)
-#if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__)
-#include <signal.h>
-#if defined(_SIZE_T_) || defined(SIGLOST)
-#include <sys/utsname.h>
-#endif
-#endif
-#endif
-main ()
-{
-#if defined (sony)
-#if defined (MIPSEB)
-  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
-     I don't know....  */
-  printf ("mips-sony-bsd\n"); exit (0);
-#else
-#include <sys/param.h>
-  printf ("m68k-sony-newsos%s\n",
-#ifdef NEWSOS4
-  "4"
-#else
-  ""
-#endif
-  ); exit (0);
-#endif
-#endif
-
-#if defined (NeXT)
-#if !defined (__ARCHITECTURE__)
-#define __ARCHITECTURE__ "m68k"
-#endif
-  int version;
-  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
-  if (version < 4)
-    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
-  else
-    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
-  exit (0);
-#endif
-
-#if defined (MULTIMAX) || defined (n16)
-#if defined (UMAXV)
-  printf ("ns32k-encore-sysv\n"); exit (0);
-#else
-#if defined (CMU)
-  printf ("ns32k-encore-mach\n"); exit (0);
-#else
-  printf ("ns32k-encore-bsd\n"); exit (0);
-#endif
-#endif
-#endif
-
-#if defined (__386BSD__)
-  printf ("i386-pc-bsd\n"); exit (0);
-#endif
-
-#if defined (sequent)
-#if defined (i386)
-  printf ("i386-sequent-dynix\n"); exit (0);
-#endif
-#if defined (ns32000)
-  printf ("ns32k-sequent-dynix\n"); exit (0);
-#endif
-#endif
-
-#if defined (_SEQUENT_)
-  struct utsname un;
-
-  uname(&un);
-  if (strncmp(un.version, "V2", 2) == 0) {
-    printf ("i386-sequent-ptx2\n"); exit (0);
-  }
-  if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
-    printf ("i386-sequent-ptx1\n"); exit (0);
-  }
-  printf ("i386-sequent-ptx\n"); exit (0);
-#endif
-
-#if defined (vax)
-#if !defined (ultrix)
-#include <sys/param.h>
-#if defined (BSD)
-#if BSD == 43
-  printf ("vax-dec-bsd4.3\n"); exit (0);
-#else
-#if BSD == 199006
-  printf ("vax-dec-bsd4.3reno\n"); exit (0);
-#else
-  printf ("vax-dec-bsd\n"); exit (0);
-#endif
-#endif
-#else
-  printf ("vax-dec-bsd\n"); exit (0);
-#endif
-#else
-#if defined(_SIZE_T_) || defined(SIGLOST)
-  struct utsname un;
-  uname (&un);
-  printf ("vax-dec-ultrix%s\n", un.release); exit (0);
-#else
-  printf ("vax-dec-ultrix\n"); exit (0);
-#endif
-#endif
-#endif
-#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__)
-#if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__)
-#if defined(_SIZE_T_) || defined(SIGLOST)
-  struct utsname *un;
-  uname (&un);
-  printf ("mips-dec-ultrix%s\n", un.release); exit (0);
-#else
-  printf ("mips-dec-ultrix\n"); exit (0);
-#endif
-#endif
-#endif
-
-#if defined (alliant) && defined (i860)
-  printf ("i860-alliant-bsd\n"); exit (0);
-#endif
-
-  exit (1);
-}
-EOF
-
-$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=`$dummy` &&
-       { echo "$SYSTEM_NAME"; exit; }
-
-# Apollos put the system type in the environment.
-test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; }
-
 echo "$0: unable to guess system type" >&2
 
 case "$UNAME_MACHINE:$UNAME_SYSTEM" in
@@ -1660,7 +1473,7 @@ EOF
 exit 1
 
 # Local variables:
-# eval: (add-hook 'before-save-hook 'time-stamp)
+# eval: (add-hook 'write-file-functions 'time-stamp)
 # time-stamp-start: "timestamp='"
 # time-stamp-format: "%:y-%02m-%02d"
 # time-stamp-end: "'"
index 934252e..409cc8e 100644 (file)
@@ -12,6 +12,9 @@
 /* Have cairo-ft support in cairo graphics library */
 #undef HAVE_CAIRO_FT
 
+/* Have chafa terminal graphics library */
+#undef HAVE_CHAFA
+
 /* Have Core Text backend */
 #undef HAVE_CORETEXT
 
@@ -27,9 +30,6 @@
 /* Define to 1 if you have the <dwrite.h> header file. */
 #undef HAVE_DWRITE_H
 
-/* Have fontconfig library */
-#undef HAVE_FONTCONFIG
-
 /* Have FreeType 2 library */
 #undef HAVE_FREETYPE
 
@@ -63,9 +63,6 @@
 /* Use hb-icu Unicode callbacks */
 #undef HAVE_ICU_BUILTIN
 
-/* Have Intel __sync_* atomic primitives */
-#undef HAVE_INTEL_ATOMIC_PRIMITIVES
-
 /* Define to 1 if you have the <inttypes.h> header file. */
 #undef HAVE_INTTYPES_H
 
 /* Define to 1 if you have the `mprotect' function. */
 #undef HAVE_MPROTECT
 
+/* Define to 1 if you have the `newlocale' function. */
+#undef HAVE_NEWLOCALE
+
 /* Have POSIX threads */
 #undef HAVE_PTHREAD
 
 /* Have PTHREAD_PRIO_INHERIT. */
 #undef HAVE_PTHREAD_PRIO_INHERIT
 
-/* Define to 1 if you have the `roundf' function. */
-#undef HAVE_ROUNDF
-
-/* Define to 1 if you have the <sched.h> header file. */
-#undef HAVE_SCHED_H
-
-/* Have sched_yield */
-#undef HAVE_SCHED_YIELD
-
-/* Have Solaris __machine_*_barrier and atomic_* operations */
-#undef HAVE_SOLARIS_ATOMIC_OPS
-
 /* Define to 1 if you have the <stdbool.h> header file. */
 #undef HAVE_STDBOOL_H
 
 /* Define to 1 if you have the <unistd.h> header file. */
 #undef HAVE_UNISTD_H
 
+/* Define to 1 if you have the `uselocale' function. */
+#undef HAVE_USELOCALE
+
 /* Define to 1 if you have the <usp10.h> header file. */
 #undef HAVE_USP10_H
 
 /* Define to 1 if you have the <windows.h> header file. */
 #undef HAVE_WINDOWS_H
 
+/* Define to 1 if you have the <xlocale.h> header file. */
+#undef HAVE_XLOCALE_H
+
 /* Define to the sub-directory where libtool stores uninstalled libraries. */
 #undef LT_OBJDIR
 
index f02d43a..1d8e98b 100755 (executable)
@@ -1,8 +1,8 @@
 #! /bin/sh
 # Configuration validation subroutine script.
-#   Copyright 1992-2020 Free Software Foundation, Inc.
+#   Copyright 1992-2018 Free Software Foundation, Inc.
 
-timestamp='2020-01-01'
+timestamp='2018-02-22'
 
 # This file is free software; you can redistribute it and/or modify it
 # under the terms of the GNU General Public License as published by
@@ -67,7 +67,7 @@ Report bugs and patches to <config-patches@gnu.org>."
 version="\
 GNU config.sub ($timestamp)
 
-Copyright 1992-2020 Free Software Foundation, Inc.
+Copyright 1992-2018 Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -89,7 +89,7 @@ while test $# -gt 0 ; do
     - )        # Use stdin as input.
        break ;;
     -* )
-       echo "$me: invalid option $1$help" >&2
+       echo "$me: invalid option $1$help"
        exit 1 ;;
 
     *local*)
@@ -110,1164 +110,1223 @@ case $# in
     exit 1;;
 esac
 
-# Split fields of configuration type
-# shellcheck disable=SC2162
-IFS="-" read field1 field2 field3 field4 <<EOF
-$1
-EOF
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+  nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
+  linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
+  knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \
+  kopensolaris*-gnu* | cloudabi*-eabi* | \
+  storm-chaos* | os2-emx* | rtmk-nova*)
+    os=-$maybe_os
+    basic_machine=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+    ;;
+  android-linux)
+    os=-linux-android
+    basic_machine=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown
+    ;;
+  *)
+    basic_machine=`echo "$1" | sed 's/-[^-]*$//'`
+    if [ "$basic_machine" != "$1" ]
+    then os=`echo "$1" | sed 's/.*-/-/'`
+    else os=; fi
+    ;;
+esac
 
-# Separate into logical components for further validation
-case $1 in
-       *-*-*-*-*)
-               echo Invalid configuration \`"$1"\': more than four components >&2
-               exit 1
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work.  We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+       -sun*os*)
+               # Prevent following clause from handling this invalid input.
                ;;
-       *-*-*-*)
-               basic_machine=$field1-$field2
-               os=$field3-$field4
+       -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+       -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+       -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+       -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+       -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+       -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+       -apple | -axis | -knuth | -cray | -microblaze*)
+               os=
+               basic_machine=$1
                ;;
-       *-*-*)
-               # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two
-               # parts
-               maybe_os=$field2-$field3
-               case $maybe_os in
-                       nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc \
-                       | linux-newlib* | linux-musl* | linux-uclibc* | uclinux-uclibc* \
-                       | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \
-                       | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \
-                       | storm-chaos* | os2-emx* | rtmk-nova*)
-                               basic_machine=$field1
-                               os=$maybe_os
-                               ;;
-                       android-linux)
-                               basic_machine=$field1-unknown
-                               os=linux-android
-                               ;;
-                       *)
-                               basic_machine=$field1-$field2
-                               os=$field3
-                               ;;
-               esac
+       -bluegene*)
+               os=-cnk
                ;;
-       *-*)
-               # A lone config we happen to match not fitting any pattern
-               case $field1-$field2 in
-                       decstation-3100)
-                               basic_machine=mips-dec
-                               os=
-                               ;;
-                       *-*)
-                               # Second component is usually, but not always the OS
-                               case $field2 in
-                                       # Prevent following clause from handling this valid os
-                                       sun*os*)
-                                               basic_machine=$field1
-                                               os=$field2
-                                               ;;
-                                       # Manufacturers
-                                       dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \
-                                       | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \
-                                       | unicom* | ibm* | next | hp | isi* | apollo | altos* \
-                                       | convergent* | ncr* | news | 32* | 3600* | 3100* \
-                                       | hitachi* | c[123]* | convex* | sun | crds | omron* | dg \
-                                       | ultra | tti* | harris | dolphin | highlevel | gould \
-                                       | cbm | ns | masscomp | apple | axis | knuth | cray \
-                                       | microblaze* | sim | cisco \
-                                       | oki | wec | wrs | winbond)
-                                               basic_machine=$field1-$field2
-                                               os=
-                                               ;;
-                                       *)
-                                               basic_machine=$field1
-                                               os=$field2
-                                               ;;
-                               esac
-                       ;;
-               esac
+       -sim | -cisco | -oki | -wec | -winbond)
+               os=
+               basic_machine=$1
                ;;
-       *)
-               # Convert single-component short-hands not valid as part of
-               # multi-component configurations.
-               case $field1 in
-                       386bsd)
-                               basic_machine=i386-pc
-                               os=bsd
-                               ;;
-                       a29khif)
-                               basic_machine=a29k-amd
-                               os=udi
-                               ;;
-                       adobe68k)
-                               basic_machine=m68010-adobe
-                               os=scout
-                               ;;
-                       alliant)
-                               basic_machine=fx80-alliant
-                               os=
-                               ;;
-                       altos | altos3068)
-                               basic_machine=m68k-altos
-                               os=
-                               ;;
-                       am29k)
-                               basic_machine=a29k-none
-                               os=bsd
-                               ;;
-                       amdahl)
-                               basic_machine=580-amdahl
-                               os=sysv
-                               ;;
-                       amiga)
-                               basic_machine=m68k-unknown
-                               os=
-                               ;;
-                       amigaos | amigados)
-                               basic_machine=m68k-unknown
-                               os=amigaos
-                               ;;
-                       amigaunix | amix)
-                               basic_machine=m68k-unknown
-                               os=sysv4
-                               ;;
-                       apollo68)
-                               basic_machine=m68k-apollo
-                               os=sysv
-                               ;;
-                       apollo68bsd)
-                               basic_machine=m68k-apollo
-                               os=bsd
-                               ;;
-                       aros)
-                               basic_machine=i386-pc
-                               os=aros
-                               ;;
-                       aux)
-                               basic_machine=m68k-apple
-                               os=aux
-                               ;;
-                       balance)
-                               basic_machine=ns32k-sequent
-                               os=dynix
-                               ;;
-                       blackfin)
-                               basic_machine=bfin-unknown
-                               os=linux
-                               ;;
-                       cegcc)
-                               basic_machine=arm-unknown
-                               os=cegcc
-                               ;;
-                       convex-c1)
-                               basic_machine=c1-convex
-                               os=bsd
-                               ;;
-                       convex-c2)
-                               basic_machine=c2-convex
-                               os=bsd
-                               ;;
-                       convex-c32)
-                               basic_machine=c32-convex
-                               os=bsd
-                               ;;
-                       convex-c34)
-                               basic_machine=c34-convex
-                               os=bsd
-                               ;;
-                       convex-c38)
-                               basic_machine=c38-convex
-                               os=bsd
-                               ;;
-                       cray)
-                               basic_machine=j90-cray
-                               os=unicos
-                               ;;
-                       crds | unos)
-                               basic_machine=m68k-crds
-                               os=
-                               ;;
-                       da30)
-                               basic_machine=m68k-da30
-                               os=
-                               ;;
-                       decstation | pmax | pmin | dec3100 | decstatn)
-                               basic_machine=mips-dec
-                               os=
-                               ;;
-                       delta88)
-                               basic_machine=m88k-motorola
-                               os=sysv3
-                               ;;
-                       dicos)
-                               basic_machine=i686-pc
-                               os=dicos
-                               ;;
-                       djgpp)
-                               basic_machine=i586-pc
-                               os=msdosdjgpp
-                               ;;
-                       ebmon29k)
-                               basic_machine=a29k-amd
-                               os=ebmon
-                               ;;
-                       es1800 | OSE68k | ose68k | ose | OSE)
-                               basic_machine=m68k-ericsson
-                               os=ose
-                               ;;
-                       gmicro)
-                               basic_machine=tron-gmicro
-                               os=sysv
-                               ;;
-                       go32)
-                               basic_machine=i386-pc
-                               os=go32
-                               ;;
-                       h8300hms)
-                               basic_machine=h8300-hitachi
-                               os=hms
-                               ;;
-                       h8300xray)
-                               basic_machine=h8300-hitachi
-                               os=xray
-                               ;;
-                       h8500hms)
-                               basic_machine=h8500-hitachi
-                               os=hms
-                               ;;
-                       harris)
-                               basic_machine=m88k-harris
-                               os=sysv3
-                               ;;
-                       hp300 | hp300hpux)
-                               basic_machine=m68k-hp
-                               os=hpux
-                               ;;
-                       hp300bsd)
-                               basic_machine=m68k-hp
-                               os=bsd
-                               ;;
-                       hppaosf)
-                               basic_machine=hppa1.1-hp
-                               os=osf
-                               ;;
-                       hppro)
-                               basic_machine=hppa1.1-hp
-                               os=proelf
-                               ;;
-                       i386mach)
-                               basic_machine=i386-mach
-                               os=mach
-                               ;;
-                       isi68 | isi)
-                               basic_machine=m68k-isi
-                               os=sysv
-                               ;;
-                       m68knommu)
-                               basic_machine=m68k-unknown
-                               os=linux
-                               ;;
-                       magnum | m3230)
-                               basic_machine=mips-mips
-                               os=sysv
-                               ;;
-                       merlin)
-                               basic_machine=ns32k-utek
-                               os=sysv
-                               ;;
-                       mingw64)
-                               basic_machine=x86_64-pc
-                               os=mingw64
-                               ;;
-                       mingw32)
-                               basic_machine=i686-pc
-                               os=mingw32
-                               ;;
-                       mingw32ce)
-                               basic_machine=arm-unknown
-                               os=mingw32ce
-                               ;;
-                       monitor)
-                               basic_machine=m68k-rom68k
-                               os=coff
-                               ;;
-                       morphos)
-                               basic_machine=powerpc-unknown
-                               os=morphos
-                               ;;
-                       moxiebox)
-                               basic_machine=moxie-unknown
-                               os=moxiebox
-                               ;;
-                       msdos)
-                               basic_machine=i386-pc
-                               os=msdos
-                               ;;
-                       msys)
-                               basic_machine=i686-pc
-                               os=msys
-                               ;;
-                       mvs)
-                               basic_machine=i370-ibm
-                               os=mvs
-                               ;;
-                       nacl)
-                               basic_machine=le32-unknown
-                               os=nacl
-                               ;;
-                       ncr3000)
-                               basic_machine=i486-ncr
-                               os=sysv4
-                               ;;
-                       netbsd386)
-                               basic_machine=i386-pc
-                               os=netbsd
-                               ;;
-                       netwinder)
-                               basic_machine=armv4l-rebel
-                               os=linux
-                               ;;
-                       news | news700 | news800 | news900)
-                               basic_machine=m68k-sony
-                               os=newsos
-                               ;;
-                       news1000)
-                               basic_machine=m68030-sony
-                               os=newsos
-                               ;;
-                       necv70)
-                               basic_machine=v70-nec
-                               os=sysv
-                               ;;
-                       nh3000)
-                               basic_machine=m68k-harris
-                               os=cxux
-                               ;;
-                       nh[45]000)
-                               basic_machine=m88k-harris
-                               os=cxux
-                               ;;
-                       nindy960)
-                               basic_machine=i960-intel
-                               os=nindy
-                               ;;
-                       mon960)
-                               basic_machine=i960-intel
-                               os=mon960
-                               ;;
-                       nonstopux)
-                               basic_machine=mips-compaq
-                               os=nonstopux
-                               ;;
-                       os400)
-                               basic_machine=powerpc-ibm
-                               os=os400
-                               ;;
-                       OSE68000 | ose68000)
-                               basic_machine=m68000-ericsson
-                               os=ose
-                               ;;
-                       os68k)
-                               basic_machine=m68k-none
-                               os=os68k
-                               ;;
-                       paragon)
-                               basic_machine=i860-intel
-                               os=osf
-                               ;;
-                       parisc)
-                               basic_machine=hppa-unknown
-                               os=linux
-                               ;;
-                       pw32)
-                               basic_machine=i586-unknown
-                               os=pw32
-                               ;;
-                       rdos | rdos64)
-                               basic_machine=x86_64-pc
-                               os=rdos
-                               ;;
-                       rdos32)
-                               basic_machine=i386-pc
-                               os=rdos
-                               ;;
-                       rom68k)
-                               basic_machine=m68k-rom68k
-                               os=coff
-                               ;;
-                       sa29200)
-                               basic_machine=a29k-amd
-                               os=udi
-                               ;;
-                       sei)
-                               basic_machine=mips-sei
-                               os=seiux
-                               ;;
-                       sequent)
-                               basic_machine=i386-sequent
-                               os=
-                               ;;
-                       sps7)
-                               basic_machine=m68k-bull
-                               os=sysv2
-                               ;;
-                       st2000)
-                               basic_machine=m68k-tandem
-                               os=
-                               ;;
-                       stratus)
-                               basic_machine=i860-stratus
-                               os=sysv4
-                               ;;
-                       sun2)
-                               basic_machine=m68000-sun
-                               os=
-                               ;;
-                       sun2os3)
-                               basic_machine=m68000-sun
-                               os=sunos3
-                               ;;
-                       sun2os4)
-                               basic_machine=m68000-sun
-                               os=sunos4
-                               ;;
-                       sun3)
-                               basic_machine=m68k-sun
-                               os=
-                               ;;
-                       sun3os3)
-                               basic_machine=m68k-sun
-                               os=sunos3
-                               ;;
-                       sun3os4)
-                               basic_machine=m68k-sun
-                               os=sunos4
-                               ;;
-                       sun4)
-                               basic_machine=sparc-sun
-                               os=
-                               ;;
-                       sun4os3)
-                               basic_machine=sparc-sun
-                               os=sunos3
-                               ;;
-                       sun4os4)
-                               basic_machine=sparc-sun
-                               os=sunos4
-                               ;;
-                       sun4sol2)
-                               basic_machine=sparc-sun
-                               os=solaris2
-                               ;;
-                       sun386 | sun386i | roadrunner)
-                               basic_machine=i386-sun
-                               os=
-                               ;;
-                       sv1)
-                               basic_machine=sv1-cray
-                               os=unicos
-                               ;;
-                       symmetry)
-                               basic_machine=i386-sequent
-                               os=dynix
-                               ;;
-                       t3e)
-                               basic_machine=alphaev5-cray
-                               os=unicos
-                               ;;
-                       t90)
-                               basic_machine=t90-cray
-                               os=unicos
-                               ;;
-                       toad1)
-                               basic_machine=pdp10-xkl
-                               os=tops20
-                               ;;
-                       tpf)
-                               basic_machine=s390x-ibm
-                               os=tpf
-                               ;;
-                       udi29k)
-                               basic_machine=a29k-amd
-                               os=udi
-                               ;;
-                       ultra3)
-                               basic_machine=a29k-nyu
-                               os=sym1
-                               ;;
-                       v810 | necv810)
-                               basic_machine=v810-nec
-                               os=none
-                               ;;
-                       vaxv)
-                               basic_machine=vax-dec
-                               os=sysv
-                               ;;
-                       vms)
-                               basic_machine=vax-dec
-                               os=vms
-                               ;;
-                       vsta)
-                               basic_machine=i386-pc
-                               os=vsta
-                               ;;
-                       vxworks960)
-                               basic_machine=i960-wrs
-                               os=vxworks
-                               ;;
-                       vxworks68)
-                               basic_machine=m68k-wrs
-                               os=vxworks
-                               ;;
-                       vxworks29k)
-                               basic_machine=a29k-wrs
-                               os=vxworks
-                               ;;
-                       xbox)
-                               basic_machine=i686-pc
-                               os=mingw32
-                               ;;
-                       ymp)
-                               basic_machine=ymp-cray
-                               os=unicos
-                               ;;
-                       *)
-                               basic_machine=$1
-                               os=
-                               ;;
-               esac
+       -scout)
+               ;;
+       -wrs)
+               os=-vxworks
+               basic_machine=$1
+               ;;
+       -chorusos*)
+               os=-chorusos
+               basic_machine=$1
+               ;;
+       -chorusrdb)
+               os=-chorusrdb
+               basic_machine=$1
+               ;;
+       -hiux*)
+               os=-hiuxwe2
+               ;;
+       -sco6)
+               os=-sco5v6
+               basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco5)
+               os=-sco3.2v5
+               basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco4)
+               os=-sco3.2v4
+               basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco3.2.[4-9]*)
+               os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+               basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco3.2v[4-9]*)
+               # Don't forget version if it is 3.2v4 or newer.
+               basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco5v6*)
+               # Don't forget version if it is 3.2v4 or newer.
+               basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco*)
+               os=-sco3.2v2
+               basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -udk*)
+               basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -isc)
+               os=-isc2.2
+               basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -clix*)
+               basic_machine=clipper-intergraph
+               ;;
+       -isc*)
+               basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -lynx*178)
+               os=-lynxos178
+               ;;
+       -lynx*5)
+               os=-lynxos5
+               ;;
+       -lynx*)
+               os=-lynxos
+               ;;
+       -ptx*)
+               basic_machine=`echo "$1" | sed -e 's/86-.*/86-sequent/'`
+               ;;
+       -psos*)
+               os=-psos
+               ;;
+       -mint | -mint[0-9]*)
+               basic_machine=m68k-atari
+               os=-mint
                ;;
 esac
 
-# Decode 1-component or ad-hoc basic machines
+# Decode aliases for certain CPU-COMPANY combinations.
 case $basic_machine in
-       # Here we handle the default manufacturer of certain CPU types.  It is in
-       # some cases the only manufacturer, in others, it is the most popular.
-       w89k)
-               cpu=hppa1.1
-               vendor=winbond
+       # Recognize the basic CPU types without company name.
+       # Some are omitted here because they have special meanings below.
+       1750a | 580 \
+       | a29k \
+       | aarch64 | aarch64_be \
+       | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+       | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+       | am33_2.0 \
+       | arc | arceb \
+       | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
+       | avr | avr32 \
+       | ba \
+       | be32 | be64 \
+       | bfin \
+       | c4x | c8051 | clipper \
+       | d10v | d30v | dlx | dsp16xx \
+       | e2k | epiphany \
+       | fido | fr30 | frv | ft32 \
+       | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+       | hexagon \
+       | i370 | i860 | i960 | ia16 | ia64 \
+       | ip2k | iq2000 \
+       | k1om \
+       | le32 | le64 \
+       | lm32 \
+       | m32c | m32r | m32rle | m68000 | m68k | m88k \
+       | maxq | mb | microblaze | microblazeel | mcore | mep | metag \
+       | mips | mipsbe | mipseb | mipsel | mipsle \
+       | mips16 \
+       | mips64 | mips64el \
+       | mips64octeon | mips64octeonel \
+       | mips64orion | mips64orionel \
+       | mips64r5900 | mips64r5900el \
+       | mips64vr | mips64vrel \
+       | mips64vr4100 | mips64vr4100el \
+       | mips64vr4300 | mips64vr4300el \
+       | mips64vr5000 | mips64vr5000el \
+       | mips64vr5900 | mips64vr5900el \
+       | mipsisa32 | mipsisa32el \
+       | mipsisa32r2 | mipsisa32r2el \
+       | mipsisa32r6 | mipsisa32r6el \
+       | mipsisa64 | mipsisa64el \
+       | mipsisa64r2 | mipsisa64r2el \
+       | mipsisa64r6 | mipsisa64r6el \
+       | mipsisa64sb1 | mipsisa64sb1el \
+       | mipsisa64sr71k | mipsisa64sr71kel \
+       | mipsr5900 | mipsr5900el \
+       | mipstx39 | mipstx39el \
+       | mn10200 | mn10300 \
+       | moxie \
+       | mt \
+       | msp430 \
+       | nds32 | nds32le | nds32be \
+       | nios | nios2 | nios2eb | nios2el \
+       | ns16k | ns32k \
+       | open8 | or1k | or1knd | or32 \
+       | pdp10 | pj | pjl \
+       | powerpc | powerpc64 | powerpc64le | powerpcle \
+       | pru \
+       | pyramid \
+       | riscv32 | riscv64 \
+       | rl78 | rx \
+       | score \
+       | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+       | sh64 | sh64le \
+       | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
+       | sparcv8 | sparcv9 | sparcv9b | sparcv9v \
+       | spu \
+       | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
+       | ubicom32 \
+       | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
+       | visium \
+       | wasm32 \
+       | x86 | xc16x | xstormy16 | xtensa \
+       | z8k | z80)
+               basic_machine=$basic_machine-unknown
+               ;;
+       c54x)
+               basic_machine=tic54x-unknown
+               ;;
+       c55x)
+               basic_machine=tic55x-unknown
+               ;;
+       c6x)
+               basic_machine=tic6x-unknown
                ;;
-       op50n)
-               cpu=hppa1.1
-               vendor=oki
+       leon|leon[3-9])
+               basic_machine=sparc-$basic_machine
                ;;
-       op60c)
-               cpu=hppa1.1
-               vendor=oki
+       m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip)
+               basic_machine=$basic_machine-unknown
+               os=-none
                ;;
-       ibm*)
-               cpu=i370
-               vendor=ibm
+       m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65)
                ;;
-       orion105)
-               cpu=clipper
-               vendor=highlevel
+       ms1)
+               basic_machine=mt-unknown
                ;;
-       mac | mpw | mac-mpw)
-               cpu=m68k
-               vendor=apple
+
+       strongarm | thumb | xscale)
+               basic_machine=arm-unknown
                ;;
-       pmac | pmac-mpw)
-               cpu=powerpc
-               vendor=apple
+       xgate)
+               basic_machine=$basic_machine-unknown
+               os=-none
+               ;;
+       xscaleeb)
+               basic_machine=armeb-unknown
+               ;;
+
+       xscaleel)
+               basic_machine=armel-unknown
                ;;
 
+       # We use `pc' rather than `unknown'
+       # because (1) that's what they normally are, and
+       # (2) the word "unknown" tends to confuse beginning users.
+       i*86 | x86_64)
+         basic_machine=$basic_machine-pc
+         ;;
+       # Object if more than one company name word.
+       *-*-*)
+               echo Invalid configuration \`"$1"\': machine \`"$basic_machine"\' not recognized 1>&2
+               exit 1
+               ;;
+       # Recognize the basic CPU types with company name.
+       580-* \
+       | a29k-* \
+       | aarch64-* | aarch64_be-* \
+       | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+       | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+       | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \
+       | arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
+       | avr-* | avr32-* \
+       | ba-* \
+       | be32-* | be64-* \
+       | bfin-* | bs2000-* \
+       | c[123]* | c30-* | [cjt]90-* | c4x-* \
+       | c8051-* | clipper-* | craynv-* | cydra-* \
+       | d10v-* | d30v-* | dlx-* \
+       | e2k-* | elxsi-* \
+       | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
+       | h8300-* | h8500-* \
+       | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+       | hexagon-* \
+       | i*86-* | i860-* | i960-* | ia16-* | ia64-* \
+       | ip2k-* | iq2000-* \
+       | k1om-* \
+       | le32-* | le64-* \
+       | lm32-* \
+       | m32c-* | m32r-* | m32rle-* \
+       | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+       | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \
+       | microblaze-* | microblazeel-* \
+       | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+       | mips16-* \
+       | mips64-* | mips64el-* \
+       | mips64octeon-* | mips64octeonel-* \
+       | mips64orion-* | mips64orionel-* \
+       | mips64r5900-* | mips64r5900el-* \
+       | mips64vr-* | mips64vrel-* \
+       | mips64vr4100-* | mips64vr4100el-* \
+       | mips64vr4300-* | mips64vr4300el-* \
+       | mips64vr5000-* | mips64vr5000el-* \
+       | mips64vr5900-* | mips64vr5900el-* \
+       | mipsisa32-* | mipsisa32el-* \
+       | mipsisa32r2-* | mipsisa32r2el-* \
+       | mipsisa32r6-* | mipsisa32r6el-* \
+       | mipsisa64-* | mipsisa64el-* \
+       | mipsisa64r2-* | mipsisa64r2el-* \
+       | mipsisa64r6-* | mipsisa64r6el-* \
+       | mipsisa64sb1-* | mipsisa64sb1el-* \
+       | mipsisa64sr71k-* | mipsisa64sr71kel-* \
+       | mipsr5900-* | mipsr5900el-* \
+       | mipstx39-* | mipstx39el-* \
+       | mmix-* \
+       | mt-* \
+       | msp430-* \
+       | nds32-* | nds32le-* | nds32be-* \
+       | nios-* | nios2-* | nios2eb-* | nios2el-* \
+       | none-* | np1-* | ns16k-* | ns32k-* \
+       | open8-* \
+       | or1k*-* \
+       | orion-* \
+       | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+       | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
+       | pru-* \
+       | pyramid-* \
+       | riscv32-* | riscv64-* \
+       | rl78-* | romp-* | rs6000-* | rx-* \
+       | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
+       | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+       | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
+       | sparclite-* \
+       | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \
+       | tahoe-* \
+       | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+       | tile*-* \
+       | tron-* \
+       | ubicom32-* \
+       | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
+       | vax-* \
+       | visium-* \
+       | wasm32-* \
+       | we32k-* \
+       | x86-* | x86_64-* | xc16x-* | xps100-* \
+       | xstormy16-* | xtensa*-* \
+       | ymp-* \
+       | z8k-* | z80-*)
+               ;;
+       # Recognize the basic CPU types without company name, with glob match.
+       xtensa*)
+               basic_machine=$basic_machine-unknown
+               ;;
        # Recognize the various machine names and aliases which stand
        # for a CPU type and a company and sometimes even an OS.
+       386bsd)
+               basic_machine=i386-pc
+               os=-bsd
+               ;;
        3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
-               cpu=m68000
-               vendor=att
+               basic_machine=m68000-att
                ;;
        3b*)
-               cpu=we32k
-               vendor=att
+               basic_machine=we32k-att
+               ;;
+       a29khif)
+               basic_machine=a29k-amd
+               os=-udi
+               ;;
+       abacus)
+               basic_machine=abacus-unknown
+               ;;
+       adobe68k)
+               basic_machine=m68010-adobe
+               os=-scout
+               ;;
+       alliant | fx80)
+               basic_machine=fx80-alliant
+               ;;
+       altos | altos3068)
+               basic_machine=m68k-altos
+               ;;
+       am29k)
+               basic_machine=a29k-none
+               os=-bsd
+               ;;
+       amd64)
+               basic_machine=x86_64-pc
+               ;;
+       amd64-*)
+               basic_machine=x86_64-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+               ;;
+       amdahl)
+               basic_machine=580-amdahl
+               os=-sysv
+               ;;
+       amiga | amiga-*)
+               basic_machine=m68k-unknown
+               ;;
+       amigaos | amigados)
+               basic_machine=m68k-unknown
+               os=-amigaos
+               ;;
+       amigaunix | amix)
+               basic_machine=m68k-unknown
+               os=-sysv4
+               ;;
+       apollo68)
+               basic_machine=m68k-apollo
+               os=-sysv
+               ;;
+       apollo68bsd)
+               basic_machine=m68k-apollo
+               os=-bsd
+               ;;
+       aros)
+               basic_machine=i386-pc
+               os=-aros
+               ;;
+       asmjs)
+               basic_machine=asmjs-unknown
+               ;;
+       aux)
+               basic_machine=m68k-apple
+               os=-aux
+               ;;
+       balance)
+               basic_machine=ns32k-sequent
+               os=-dynix
+               ;;
+       blackfin)
+               basic_machine=bfin-unknown
+               os=-linux
+               ;;
+       blackfin-*)
+               basic_machine=bfin-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+               os=-linux
                ;;
        bluegene*)
-               cpu=powerpc
-               vendor=ibm
-               os=cnk
+               basic_machine=powerpc-ibm
+               os=-cnk
+               ;;
+       c54x-*)
+               basic_machine=tic54x-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+               ;;
+       c55x-*)
+               basic_machine=tic55x-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+               ;;
+       c6x-*)
+               basic_machine=tic6x-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+               ;;
+       c90)
+               basic_machine=c90-cray
+               os=-unicos
+               ;;
+       cegcc)
+               basic_machine=arm-unknown
+               os=-cegcc
+               ;;
+       convex-c1)
+               basic_machine=c1-convex
+               os=-bsd
+               ;;
+       convex-c2)
+               basic_machine=c2-convex
+               os=-bsd
+               ;;
+       convex-c32)
+               basic_machine=c32-convex
+               os=-bsd
+               ;;
+       convex-c34)
+               basic_machine=c34-convex
+               os=-bsd
+               ;;
+       convex-c38)
+               basic_machine=c38-convex
+               os=-bsd
+               ;;
+       cray | j90)
+               basic_machine=j90-cray
+               os=-unicos
+               ;;
+       craynv)
+               basic_machine=craynv-cray
+               os=-unicosmp
+               ;;
+       cr16 | cr16-*)
+               basic_machine=cr16-unknown
+               os=-elf
+               ;;
+       crds | unos)
+               basic_machine=m68k-crds
+               ;;
+       crisv32 | crisv32-* | etraxfs*)
+               basic_machine=crisv32-axis
+               ;;
+       cris | cris-* | etrax*)
+               basic_machine=cris-axis
+               ;;
+       crx)
+               basic_machine=crx-unknown
+               os=-elf
+               ;;
+       da30 | da30-*)
+               basic_machine=m68k-da30
+               ;;
+       decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+               basic_machine=mips-dec
                ;;
        decsystem10* | dec10*)
-               cpu=pdp10
-               vendor=dec
-               os=tops10
+               basic_machine=pdp10-dec
+               os=-tops10
                ;;
        decsystem20* | dec20*)
-               cpu=pdp10
-               vendor=dec
-               os=tops20
+               basic_machine=pdp10-dec
+               os=-tops20
                ;;
        delta | 3300 | motorola-3300 | motorola-delta \
              | 3300-motorola | delta-motorola)
-               cpu=m68k
-               vendor=motorola
+               basic_machine=m68k-motorola
+               ;;
+       delta88)
+               basic_machine=m88k-motorola
+               os=-sysv3
+               ;;
+       dicos)
+               basic_machine=i686-pc
+               os=-dicos
+               ;;
+       djgpp)
+               basic_machine=i586-pc
+               os=-msdosdjgpp
+               ;;
+       dpx20 | dpx20-*)
+               basic_machine=rs6000-bull
+               os=-bosx
                ;;
        dpx2*)
-               cpu=m68k
-               vendor=bull
-               os=sysv3
+               basic_machine=m68k-bull
+               os=-sysv3
                ;;
-       encore | umax | mmax)
-               cpu=ns32k
-               vendor=encore
+       e500v[12])
+               basic_machine=powerpc-unknown
+               os=$os"spe"
+               ;;
+       e500v[12]-*)
+               basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+               os=$os"spe"
+               ;;
+       ebmon29k)
+               basic_machine=a29k-amd
+               os=-ebmon
                ;;
        elxsi)
-               cpu=elxsi
-               vendor=elxsi
-               os=${os:-bsd}
+               basic_machine=elxsi-elxsi
+               os=-bsd
+               ;;
+       encore | umax | mmax)
+               basic_machine=ns32k-encore
+               ;;
+       es1800 | OSE68k | ose68k | ose | OSE)
+               basic_machine=m68k-ericsson
+               os=-ose
                ;;
        fx2800)
-               cpu=i860
-               vendor=alliant
+               basic_machine=i860-alliant
                ;;
        genix)
-               cpu=ns32k
-               vendor=ns
+               basic_machine=ns32k-ns
+               ;;
+       gmicro)
+               basic_machine=tron-gmicro
+               os=-sysv
+               ;;
+       go32)
+               basic_machine=i386-pc
+               os=-go32
                ;;
        h3050r* | hiux*)
-               cpu=hppa1.1
-               vendor=hitachi
-               os=hiuxwe2
+               basic_machine=hppa1.1-hitachi
+               os=-hiuxwe2
+               ;;
+       h8300hms)
+               basic_machine=h8300-hitachi
+               os=-hms
+               ;;
+       h8300xray)
+               basic_machine=h8300-hitachi
+               os=-xray
+               ;;
+       h8500hms)
+               basic_machine=h8500-hitachi
+               os=-hms
+               ;;
+       harris)
+               basic_machine=m88k-harris
+               os=-sysv3
+               ;;
+       hp300-*)
+               basic_machine=m68k-hp
+               ;;
+       hp300bsd)
+               basic_machine=m68k-hp
+               os=-bsd
+               ;;
+       hp300hpux)
+               basic_machine=m68k-hp
+               os=-hpux
                ;;
        hp3k9[0-9][0-9] | hp9[0-9][0-9])
-               cpu=hppa1.0
-               vendor=hp
+               basic_machine=hppa1.0-hp
                ;;
        hp9k2[0-9][0-9] | hp9k31[0-9])
-               cpu=m68000
-               vendor=hp
+               basic_machine=m68000-hp
                ;;
        hp9k3[2-9][0-9])
-               cpu=m68k
-               vendor=hp
+               basic_machine=m68k-hp
                ;;
        hp9k6[0-9][0-9] | hp6[0-9][0-9])
-               cpu=hppa1.0
-               vendor=hp
+               basic_machine=hppa1.0-hp
                ;;
        hp9k7[0-79][0-9] | hp7[0-79][0-9])
-               cpu=hppa1.1
-               vendor=hp
+               basic_machine=hppa1.1-hp
                ;;
        hp9k78[0-9] | hp78[0-9])
                # FIXME: really hppa2.0-hp
-               cpu=hppa1.1
-               vendor=hp
+               basic_machine=hppa1.1-hp
                ;;
        hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
                # FIXME: really hppa2.0-hp
-               cpu=hppa1.1
-               vendor=hp
+               basic_machine=hppa1.1-hp
                ;;
        hp9k8[0-9][13679] | hp8[0-9][13679])
-               cpu=hppa1.1
-               vendor=hp
+               basic_machine=hppa1.1-hp
                ;;
        hp9k8[0-9][0-9] | hp8[0-9][0-9])
-               cpu=hppa1.0
-               vendor=hp
+               basic_machine=hppa1.0-hp
+               ;;
+       hppaosf)
+               basic_machine=hppa1.1-hp
+               os=-osf
+               ;;
+       hppro)
+               basic_machine=hppa1.1-hp
+               os=-proelf
+               ;;
+       i370-ibm* | ibm*)
+               basic_machine=i370-ibm
                ;;
        i*86v32)
-               cpu=`echo "$1" | sed -e 's/86.*/86/'`
-               vendor=pc
-               os=sysv32
+               basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'`
+               os=-sysv32
                ;;
        i*86v4*)
-               cpu=`echo "$1" | sed -e 's/86.*/86/'`
-               vendor=pc
-               os=sysv4
+               basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'`
+               os=-sysv4
                ;;
        i*86v)
-               cpu=`echo "$1" | sed -e 's/86.*/86/'`
-               vendor=pc
-               os=sysv
+               basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'`
+               os=-sysv
                ;;
        i*86sol2)
-               cpu=`echo "$1" | sed -e 's/86.*/86/'`
-               vendor=pc
-               os=solaris2
+               basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'`
+               os=-solaris2
+               ;;
+       i386mach)
+               basic_machine=i386-mach
+               os=-mach
                ;;
-       j90 | j90-cray)
-               cpu=j90
-               vendor=cray
-               os=${os:-unicos}
+       vsta)
+               basic_machine=i386-unknown
+               os=-vsta
                ;;
        iris | iris4d)
-               cpu=mips
-               vendor=sgi
+               basic_machine=mips-sgi
                case $os in
-                   irix*)
+                   -irix*)
                        ;;
                    *)
-                       os=irix4
+                       os=-irix4
                        ;;
                esac
                ;;
+       isi68 | isi)
+               basic_machine=m68k-isi
+               os=-sysv
+               ;;
+       leon-*|leon[3-9]-*)
+               basic_machine=sparc-`echo "$basic_machine" | sed 's/-.*//'`
+               ;;
+       m68knommu)
+               basic_machine=m68k-unknown
+               os=-linux
+               ;;
+       m68knommu-*)
+               basic_machine=m68k-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+               os=-linux
+               ;;
+       magnum | m3230)
+               basic_machine=mips-mips
+               os=-sysv
+               ;;
+       merlin)
+               basic_machine=ns32k-utek
+               os=-sysv
+               ;;
+       microblaze*)
+               basic_machine=microblaze-xilinx
+               ;;
+       mingw64)
+               basic_machine=x86_64-pc
+               os=-mingw64
+               ;;
+       mingw32)
+               basic_machine=i686-pc
+               os=-mingw32
+               ;;
+       mingw32ce)
+               basic_machine=arm-unknown
+               os=-mingw32ce
+               ;;
        miniframe)
-               cpu=m68000
-               vendor=convergent
+               basic_machine=m68000-convergent
+               ;;
+       *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+               basic_machine=m68k-atari
+               os=-mint
+               ;;
+       mips3*-*)
+               basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'`
+               ;;
+       mips3*)
+               basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'`-unknown
+               ;;
+       monitor)
+               basic_machine=m68k-rom68k
+               os=-coff
+               ;;
+       morphos)
+               basic_machine=powerpc-unknown
+               os=-morphos
+               ;;
+       moxiebox)
+               basic_machine=moxie-unknown
+               os=-moxiebox
+               ;;
+       msdos)
+               basic_machine=i386-pc
+               os=-msdos
+               ;;
+       ms1-*)
+               basic_machine=`echo "$basic_machine" | sed -e 's/ms1-/mt-/'`
+               ;;
+       msys)
+               basic_machine=i686-pc
+               os=-msys
+               ;;
+       mvs)
+               basic_machine=i370-ibm
+               os=-mvs
+               ;;
+       nacl)
+               basic_machine=le32-unknown
+               os=-nacl
+               ;;
+       ncr3000)
+               basic_machine=i486-ncr
+               os=-sysv4
                ;;
-       *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*)
-               cpu=m68k
-               vendor=atari
-               os=mint
+       netbsd386)
+               basic_machine=i386-unknown
+               os=-netbsd
+               ;;
+       netwinder)
+               basic_machine=armv4l-rebel
+               os=-linux
+               ;;
+       news | news700 | news800 | news900)
+               basic_machine=m68k-sony
+               os=-newsos
+               ;;
+       news1000)
+               basic_machine=m68030-sony
+               os=-newsos
                ;;
        news-3600 | risc-news)
-               cpu=mips
-               vendor=sony
-               os=newsos
+               basic_machine=mips-sony
+               os=-newsos
+               ;;
+       necv70)
+               basic_machine=v70-nec
+               os=-sysv
                ;;
        next | m*-next)
-               cpu=m68k
-               vendor=next
+               basic_machine=m68k-next
                case $os in
-                   openstep*)
-                       ;;
-                   nextstep*)
+                   -nextstep* )
                        ;;
-                   ns2*)
-                     os=nextstep2
+                   -ns2*)
+                     os=-nextstep2
                        ;;
                    *)
-                     os=nextstep3
+                     os=-nextstep3
                        ;;
                esac
                ;;
+       nh3000)
+               basic_machine=m68k-harris
+               os=-cxux
+               ;;
+       nh[45]000)
+               basic_machine=m88k-harris
+               os=-cxux
+               ;;
+       nindy960)
+               basic_machine=i960-intel
+               os=-nindy
+               ;;
+       mon960)
+               basic_machine=i960-intel
+               os=-mon960
+               ;;
+       nonstopux)
+               basic_machine=mips-compaq
+               os=-nonstopux
+               ;;
        np1)
-               cpu=np1
-               vendor=gould
+               basic_machine=np1-gould
+               ;;
+       neo-tandem)
+               basic_machine=neo-tandem
+               ;;
+       nse-tandem)
+               basic_machine=nse-tandem
+               ;;
+       nsr-tandem)
+               basic_machine=nsr-tandem
+               ;;
+       nsv-tandem)
+               basic_machine=nsv-tandem
+               ;;
+       nsx-tandem)
+               basic_machine=nsx-tandem
                ;;
        op50n-* | op60c-*)
-               cpu=hppa1.1
-               vendor=oki
-               os=proelf
+               basic_machine=hppa1.1-oki
+               os=-proelf
+               ;;
+       openrisc | openrisc-*)
+               basic_machine=or32-unknown
+               ;;
+       os400)
+               basic_machine=powerpc-ibm
+               os=-os400
+               ;;
+       OSE68000 | ose68000)
+               basic_machine=m68000-ericsson
+               os=-ose
+               ;;
+       os68k)
+               basic_machine=m68k-none
+               os=-os68k
                ;;
        pa-hitachi)
-               cpu=hppa1.1
-               vendor=hitachi
-               os=hiuxwe2
+               basic_machine=hppa1.1-hitachi
+               os=-hiuxwe2
+               ;;
+       paragon)
+               basic_machine=i860-intel
+               os=-osf
+               ;;
+       parisc)
+               basic_machine=hppa-unknown
+               os=-linux
+               ;;
+       parisc-*)
+               basic_machine=hppa-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+               os=-linux
                ;;
        pbd)
-               cpu=sparc
-               vendor=tti
+               basic_machine=sparc-tti
                ;;
        pbb)
-               cpu=m68k
-               vendor=tti
+               basic_machine=m68k-tti
                ;;
-       pc532)
-               cpu=ns32k
-               vendor=pc532
+       pc532 | pc532-*)
+               basic_machine=ns32k-pc532
+               ;;
+       pc98)
+               basic_machine=i386-pc
+               ;;
+       pc98-*)
+               basic_machine=i386-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+               ;;
+       pentium | p5 | k5 | k6 | nexgen | viac3)
+               basic_machine=i586-pc
+               ;;
+       pentiumpro | p6 | 6x86 | athlon | athlon_*)
+               basic_machine=i686-pc
+               ;;
+       pentiumii | pentium2 | pentiumiii | pentium3)
+               basic_machine=i686-pc
+               ;;
+       pentium4)
+               basic_machine=i786-pc
+               ;;
+       pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+               basic_machine=i586-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+               ;;
+       pentiumpro-* | p6-* | 6x86-* | athlon-*)
+               basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+               ;;
+       pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+               basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+               ;;
+       pentium4-*)
+               basic_machine=i786-`echo "$basic_machine" | sed 's/^[^-]*-//'`
                ;;
        pn)
-               cpu=pn
-               vendor=gould
+               basic_machine=pn-gould
                ;;
-       power)
-               cpu=power
-               vendor=ibm
+       power)  basic_machine=power-ibm
                ;;
-       ps2)
-               cpu=i386
-               vendor=ibm
+       ppc | ppcbe)    basic_machine=powerpc-unknown
                ;;
-       rm[46]00)
-               cpu=mips
-               vendor=siemens
+       ppc-* | ppcbe-*)
+               basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'`
                ;;
-       rtpc | rtpc-*)
-               cpu=romp
-               vendor=ibm
+       ppcle | powerpclittle)
+               basic_machine=powerpcle-unknown
                ;;
-       sde)
-               cpu=mipsisa32
-               vendor=sde
-               os=${os:-elf}
+       ppcle-* | powerpclittle-*)
+               basic_machine=powerpcle-`echo "$basic_machine" | sed 's/^[^-]*-//'`
                ;;
-       simso-wrs)
-               cpu=sparclite
-               vendor=wrs
-               os=vxworks
+       ppc64)  basic_machine=powerpc64-unknown
                ;;
-       tower | tower-32)
-               cpu=m68k
-               vendor=ncr
+       ppc64-*) basic_machine=powerpc64-`echo "$basic_machine" | sed 's/^[^-]*-//'`
                ;;
-       vpp*|vx|vx-*)
-               cpu=f301
-               vendor=fujitsu
+       ppc64le | powerpc64little)
+               basic_machine=powerpc64le-unknown
                ;;
-       w65)
-               cpu=w65
-               vendor=wdc
+       ppc64le-* | powerpc64little-*)
+               basic_machine=powerpc64le-`echo "$basic_machine" | sed 's/^[^-]*-//'`
                ;;
-       w89k-*)
-               cpu=hppa1.1
-               vendor=winbond
-               os=proelf
+       ps2)
+               basic_machine=i386-ibm
                ;;
-       none)
-               cpu=none
-               vendor=none
+       pw32)
+               basic_machine=i586-unknown
+               os=-pw32
                ;;
-       leon|leon[3-9])
-               cpu=sparc
-               vendor=$basic_machine
+       rdos | rdos64)
+               basic_machine=x86_64-pc
+               os=-rdos
                ;;
-       leon-*|leon[3-9]-*)
-               cpu=sparc
-               vendor=`echo "$basic_machine" | sed 's/-.*//'`
+       rdos32)
+               basic_machine=i386-pc
+               os=-rdos
                ;;
-
-       *-*)
-               # shellcheck disable=SC2162
-               IFS="-" read cpu vendor <<EOF
-$basic_machine
-EOF
+       rom68k)
+               basic_machine=m68k-rom68k
+               os=-coff
                ;;
-       # We use `pc' rather than `unknown'
-       # because (1) that's what they normally are, and
-       # (2) the word "unknown" tends to confuse beginning users.
-       i*86 | x86_64)
-               cpu=$basic_machine
-               vendor=pc
+       rm[46]00)
+               basic_machine=mips-siemens
                ;;
-       # These rules are duplicated from below for sake of the special case above;
-       # i.e. things that normalized to x86 arches should also default to "pc"
-       pc98)
-               cpu=i386
-               vendor=pc
+       rtpc | rtpc-*)
+               basic_machine=romp-ibm
                ;;
-       x64 | amd64)
-               cpu=x86_64
-               vendor=pc
+       s390 | s390-*)
+               basic_machine=s390-ibm
                ;;
-       # Recognize the basic CPU types without company name.
-       *)
-               cpu=$basic_machine
-               vendor=unknown
+       s390x | s390x-*)
+               basic_machine=s390x-ibm
                ;;
-esac
-
-unset -v basic_machine
-
-# Decode basic machines in the full and proper CPU-Company form.
-case $cpu-$vendor in
-       # Here we handle the default manufacturer of certain CPU types in canonical form. It is in
-       # some cases the only manufacturer, in others, it is the most popular.
-       craynv-unknown)
-               vendor=cray
-               os=${os:-unicosmp}
+       sa29200)
+               basic_machine=a29k-amd
+               os=-udi
                ;;
-       c90-unknown | c90-cray)
-               vendor=cray
-               os=${os:-unicos}
+       sb1)
+               basic_machine=mipsisa64sb1-unknown
                ;;
-       fx80-unknown)
-               vendor=alliant
+       sb1el)
+               basic_machine=mipsisa64sb1el-unknown
                ;;
-       romp-unknown)
-               vendor=ibm
+       sde)
+               basic_machine=mipsisa32-sde
+               os=-elf
                ;;
-       mmix-unknown)
-               vendor=knuth
+       sei)
+               basic_machine=mips-sei
+               os=-seiux
                ;;
-       microblaze-unknown | microblazeel-unknown)
-               vendor=xilinx
+       sequent)
+               basic_machine=i386-sequent
                ;;
-       rs6000-unknown)
-               vendor=ibm
+       sh5el)
+               basic_machine=sh5le-unknown
                ;;
-       vax-unknown)
-               vendor=dec
+       simso-wrs)
+               basic_machine=sparclite-wrs
+               os=-vxworks
                ;;
-       pdp11-unknown)
-               vendor=dec
+       sps7)
+               basic_machine=m68k-bull
+               os=-sysv2
                ;;
-       we32k-unknown)
-               vendor=att
+       spur)
+               basic_machine=spur-unknown
                ;;
-       cydra-unknown)
-               vendor=cydrome
+       st2000)
+               basic_machine=m68k-tandem
                ;;
-       i370-ibm*)
-               vendor=ibm
+       stratus)
+               basic_machine=i860-stratus
+               os=-sysv4
                ;;
-       orion-unknown)
-               vendor=highlevel
+       strongarm-* | thumb-*)
+               basic_machine=arm-`echo "$basic_machine" | sed 's/^[^-]*-//'`
                ;;
-       xps-unknown | xps100-unknown)
-               cpu=xps100
-               vendor=honeywell
+       sun2)
+               basic_machine=m68000-sun
                ;;
-
-       # Here we normalize CPU types with a missing or matching vendor
-       dpx20-unknown | dpx20-bull)
-               cpu=rs6000
-               vendor=bull
-               os=${os:-bosx}
+       sun2os3)
+               basic_machine=m68000-sun
+               os=-sunos3
                ;;
-
-       # Here we normalize CPU types irrespective of the vendor
-       amd64-*)
-               cpu=x86_64
+       sun2os4)
+               basic_machine=m68000-sun
+               os=-sunos4
                ;;
-       blackfin-*)
-               cpu=bfin
-               os=linux
+       sun3os3)
+               basic_machine=m68k-sun
+               os=-sunos3
                ;;
-       c54x-*)
-               cpu=tic54x
+       sun3os4)
+               basic_machine=m68k-sun
+               os=-sunos4
                ;;
-       c55x-*)
-               cpu=tic55x
+       sun4os3)
+               basic_machine=sparc-sun
+               os=-sunos3
                ;;
-       c6x-*)
-               cpu=tic6x
+       sun4os4)
+               basic_machine=sparc-sun
+               os=-sunos4
                ;;
-       e500v[12]-*)
-               cpu=powerpc
-               os=$os"spe"
+       sun4sol2)
+               basic_machine=sparc-sun
+               os=-solaris2
                ;;
-       mips3*-*)
-               cpu=mips64
+       sun3 | sun3-*)
+               basic_machine=m68k-sun
                ;;
-       ms1-*)
-               cpu=mt
+       sun4)
+               basic_machine=sparc-sun
                ;;
-       m68knommu-*)
-               cpu=m68k
-               os=linux
+       sun386 | sun386i | roadrunner)
+               basic_machine=i386-sun
                ;;
-       m9s12z-* | m68hcs12z-* | hcs12z-* | s12z-*)
-               cpu=s12z
+       sv1)
+               basic_machine=sv1-cray
+               os=-unicos
                ;;
-       openrisc-*)
-               cpu=or32
+       symmetry)
+               basic_machine=i386-sequent
+               os=-dynix
                ;;
-       parisc-*)
-               cpu=hppa
-               os=linux
+       t3e)
+               basic_machine=alphaev5-cray
+               os=-unicos
                ;;
-       pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
-               cpu=i586
+       t90)
+               basic_machine=t90-cray
+               os=-unicos
                ;;
-       pentiumpro-* | p6-* | 6x86-* | athlon-* | athalon_*-*)
-               cpu=i686
+       tile*)
+               basic_machine=$basic_machine-unknown
+               os=-linux-gnu
                ;;
-       pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
-               cpu=i686
+       tx39)
+               basic_machine=mipstx39-unknown
                ;;
-       pentium4-*)
-               cpu=i786
+       tx39el)
+               basic_machine=mipstx39el-unknown
                ;;
-       pc98-*)
-               cpu=i386
+       toad1)
+               basic_machine=pdp10-xkl
+               os=-tops20
                ;;
-       ppc-* | ppcbe-*)
-               cpu=powerpc
+       tower | tower-32)
+               basic_machine=m68k-ncr
                ;;
-       ppcle-* | powerpclittle-*)
-               cpu=powerpcle
+       tpf)
+               basic_machine=s390x-ibm
+               os=-tpf
                ;;
-       ppc64-*)
-               cpu=powerpc64
+       udi29k)
+               basic_machine=a29k-amd
+               os=-udi
                ;;
-       ppc64le-* | powerpc64little-*)
-               cpu=powerpc64le
+       ultra3)
+               basic_machine=a29k-nyu
+               os=-sym1
+               ;;
+       v810 | necv810)
+               basic_machine=v810-nec
+               os=-none
                ;;
-       sb1-*)
-               cpu=mipsisa64sb1
+       vaxv)
+               basic_machine=vax-dec
+               os=-sysv
                ;;
-       sb1el-*)
-               cpu=mipsisa64sb1el
+       vms)
+               basic_machine=vax-dec
+               os=-vms
                ;;
-       sh5e[lb]-*)
-               cpu=`echo "$cpu" | sed 's/^\(sh.\)e\(.\)$/\1\2e/'`
+       vpp*|vx|vx-*)
+               basic_machine=f301-fujitsu
                ;;
-       spur-*)
-               cpu=spur
+       vxworks960)
+               basic_machine=i960-wrs
+               os=-vxworks
                ;;
-       strongarm-* | thumb-*)
-               cpu=arm
+       vxworks68)
+               basic_machine=m68k-wrs
+               os=-vxworks
                ;;
-       tx39-*)
-               cpu=mipstx39
+       vxworks29k)
+               basic_machine=a29k-wrs
+               os=-vxworks
+               ;;
+       w65*)
+               basic_machine=w65-wdc
+               os=-none
+               ;;
+       w89k-*)
+               basic_machine=hppa1.1-winbond
+               os=-proelf
                ;;
-       tx39el-*)
-               cpu=mipstx39el
+       x64)
+               basic_machine=x86_64-pc
                ;;
-       x64-*)
-               cpu=x86_64
+       xbox)
+               basic_machine=i686-pc
+               os=-mingw32
+               ;;
+       xps | xps100)
+               basic_machine=xps100-honeywell
                ;;
        xscale-* | xscalee[bl]-*)
-               cpu=`echo "$cpu" | sed 's/^xscale/arm/'`
+               basic_machine=`echo "$basic_machine" | sed 's/^xscale/arm/'`
+               ;;
+       ymp)
+               basic_machine=ymp-cray
+               os=-unicos
+               ;;
+       none)
+               basic_machine=none-none
+               os=-none
                ;;
 
-       # Recognize the canonical CPU Types that limit and/or modify the
-       # company names they are paired with.
-       cr16-*)
-               os=${os:-elf}
+# Here we handle the default manufacturer of certain CPU types.  It is in
+# some cases the only manufacturer, in others, it is the most popular.
+       w89k)
+               basic_machine=hppa1.1-winbond
+               ;;
+       op50n)
+               basic_machine=hppa1.1-oki
                ;;
-       crisv32-* | etraxfs*-*)
-               cpu=crisv32
-               vendor=axis
+       op60c)
+               basic_machine=hppa1.1-oki
                ;;
-       cris-* | etrax*-*)
-               cpu=cris
-               vendor=axis
+       romp)
+               basic_machine=romp-ibm
                ;;
-       crx-*)
-               os=${os:-elf}
+       mmix)
+               basic_machine=mmix-knuth
                ;;
-       neo-tandem)
-               cpu=neo
-               vendor=tandem
+       rs6000)
+               basic_machine=rs6000-ibm
                ;;
-       nse-tandem)
-               cpu=nse
-               vendor=tandem
+       vax)
+               basic_machine=vax-dec
                ;;
-       nsr-tandem)
-               cpu=nsr
-               vendor=tandem
+       pdp11)
+               basic_machine=pdp11-dec
                ;;
-       nsv-tandem)
-               cpu=nsv
-               vendor=tandem
+       we32k)
+               basic_machine=we32k-att
                ;;
-       nsx-tandem)
-               cpu=nsx
-               vendor=tandem
+       sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
+               basic_machine=sh-unknown
                ;;
-       s390-*)
-               cpu=s390
-               vendor=ibm
+       cydra)
+               basic_machine=cydra-cydrome
                ;;
-       s390x-*)
-               cpu=s390x
-               vendor=ibm
+       orion)
+               basic_machine=orion-highlevel
                ;;
-       tile*-*)
-               os=${os:-linux-gnu}
+       orion105)
+               basic_machine=clipper-highlevel
+               ;;
+       mac | mpw | mac-mpw)
+               basic_machine=m68k-apple
+               ;;
+       pmac | pmac-mpw)
+               basic_machine=powerpc-apple
+               ;;
+       *-unknown)
+               # Make sure to match an already-canonicalized machine name.
                ;;
-
        *)
-               # Recognize the canonical CPU types that are allowed with any
-               # company name.
-               case $cpu in
-                       1750a | 580 \
-                       | a29k \
-                       | aarch64 | aarch64_be \
-                       | abacus \
-                       | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] \
-                       | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] \
-                       | alphapca5[67] | alpha64pca5[67] \
-                       | am33_2.0 \
-                       | amdgcn \
-                       | arc | arceb \
-                       | arm  | arm[lb]e | arme[lb] | armv* \
-                       | avr | avr32 \
-                       | asmjs \
-                       | ba \
-                       | be32 | be64 \
-                       | bfin | bpf | bs2000 \
-                       | c[123]* | c30 | [cjt]90 | c4x \
-                       | c8051 | clipper | craynv | csky | cydra \
-                       | d10v | d30v | dlx | dsp16xx \
-                       | e2k | elxsi | epiphany \
-                       | f30[01] | f700 | fido | fr30 | frv | ft32 | fx80 \
-                       | h8300 | h8500 \
-                       | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
-                       | hexagon \
-                       | i370 | i*86 | i860 | i960 | ia16 | ia64 \
-                       | ip2k | iq2000 \
-                       | k1om \
-                       | le32 | le64 \
-                       | lm32 \
-                       | m32c | m32r | m32rle \
-                       | m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \
-                       | m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \
-                       | m88110 | m88k | maxq | mb | mcore | mep | metag \
-                       | microblaze | microblazeel \
-                       | mips | mipsbe | mipseb | mipsel | mipsle \
-                       | mips16 \
-                       | mips64 | mips64eb | mips64el \
-                       | mips64octeon | mips64octeonel \
-                       | mips64orion | mips64orionel \
-                       | mips64r5900 | mips64r5900el \
-                       | mips64vr | mips64vrel \
-                       | mips64vr4100 | mips64vr4100el \
-                       | mips64vr4300 | mips64vr4300el \
-                       | mips64vr5000 | mips64vr5000el \
-                       | mips64vr5900 | mips64vr5900el \
-                       | mipsisa32 | mipsisa32el \
-                       | mipsisa32r2 | mipsisa32r2el \
-                       | mipsisa32r6 | mipsisa32r6el \
-                       | mipsisa64 | mipsisa64el \
-                       | mipsisa64r2 | mipsisa64r2el \
-                       | mipsisa64r6 | mipsisa64r6el \
-                       | mipsisa64sb1 | mipsisa64sb1el \
-                       | mipsisa64sr71k | mipsisa64sr71kel \
-                       | mipsr5900 | mipsr5900el \
-                       | mipstx39 | mipstx39el \
-                       | mmix \
-                       | mn10200 | mn10300 \
-                       | moxie \
-                       | mt \
-                       | msp430 \
-                       | nds32 | nds32le | nds32be \
-                       | nfp \
-                       | nios | nios2 | nios2eb | nios2el \
-                       | none | np1 | ns16k | ns32k | nvptx \
-                       | open8 \
-                       | or1k* \
-                       | or32 \
-                       | orion \
-                       | picochip \
-                       | pdp10 | pdp11 | pj | pjl | pn | power \
-                       | powerpc | powerpc64 | powerpc64le | powerpcle | powerpcspe \
-                       | pru \
-                       | pyramid \
-                       | riscv | riscv32 | riscv64 \
-                       | rl78 | romp | rs6000 | rx \
-                       | score \
-                       | sh | shl \
-                       | sh[1234] | sh[24]a | sh[24]ae[lb] | sh[23]e | she[lb] | sh[lb]e \
-                       | sh[1234]e[lb] |  sh[12345][lb]e | sh[23]ele | sh64 | sh64le \
-                       | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet \
-                       | sparclite \
-                       | sparcv8 | sparcv9 | sparcv9b | sparcv9v | sv1 | sx* \
-                       | spu \
-                       | tahoe \
-                       | tic30 | tic4x | tic54x | tic55x | tic6x | tic80 \
-                       | tron \
-                       | ubicom32 \
-                       | v70 | v850 | v850e | v850e1 | v850es | v850e2 | v850e2v3 \
-                       | vax \
-                       | visium \
-                       | w65 \
-                       | wasm32 | wasm64 \
-                       | we32k \
-                       | x86 | x86_64 | xc16x | xgate | xps100 \
-                       | xstormy16 | xtensa* \
-                       | ymp \
-                       | z8k | z80)
-                               ;;
-
-                       *)
-                               echo Invalid configuration \`"$1"\': machine \`"$cpu-$vendor"\' not recognized 1>&2
-                               exit 1
-                               ;;
-               esac
+               echo Invalid configuration \`"$1"\': machine \`"$basic_machine"\' not recognized 1>&2
+               exit 1
                ;;
 esac
 
 # Here we canonicalize certain aliases for manufacturers.
-case $vendor in
-       digital*)
-               vendor=dec
+case $basic_machine in
+       *-digital*)
+               basic_machine=`echo "$basic_machine" | sed 's/digital.*/dec/'`
                ;;
-       commodore*)
-               vendor=cbm
+       *-commodore*)
+               basic_machine=`echo "$basic_machine" | sed 's/commodore.*/cbm/'`
                ;;
        *)
                ;;
@@ -1275,243 +1334,199 @@ esac
 
 # Decode manufacturer-specific aliases for certain operating systems.
 
-if [ x$os != x ]
+if [ x"$os" != x"" ]
 then
 case $os in
        # First match some system type aliases that might get confused
        # with valid system types.
-       # solaris* is a basic system type, with this one exception.
-       auroraux)
-               os=auroraux
+       # -solaris* is a basic system type, with this one exception.
+       -auroraux)
+               os=-auroraux
                ;;
-       bluegene*)
-               os=cnk
-               ;;
-       solaris1 | solaris1.*)
+       -solaris1 | -solaris1.*)
                os=`echo $os | sed -e 's|solaris1|sunos4|'`
                ;;
-       solaris)
-               os=solaris2
+       -solaris)
+               os=-solaris2
                ;;
-       unixware*)
-               os=sysv4.2uw
+       -unixware*)
+               os=-sysv4.2uw
                ;;
-       gnu/linux*)
+       -gnu/linux*)
                os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
                ;;
        # es1800 is here to avoid being matched by es* (a different OS)
-       es1800*)
-               os=ose
-               ;;
-       # Some version numbers need modification
-       chorusos*)
-               os=chorusos
-               ;;
-       isc)
-               os=isc2.2
-               ;;
-       sco6)
-               os=sco5v6
-               ;;
-       sco5)
-               os=sco3.2v5
-               ;;
-       sco4)
-               os=sco3.2v4
-               ;;
-       sco3.2.[4-9]*)
-               os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
-               ;;
-       sco3.2v[4-9]* | sco5v6*)
-               # Don't forget version if it is 3.2v4 or newer.
-               ;;
-       scout)
-               # Don't match below
-               ;;
-       sco*)
-               os=sco3.2v2
-               ;;
-       psos*)
-               os=psos
+       -es1800*)
+               os=-ose
                ;;
        # Now accept the basic system types.
        # The portable systems comes first.
        # Each alternative MUST end in a * to match a version number.
-       # sysv* is not here because it comes later, after sysvr4.
-       gnu* | bsd* | mach* | minix* | genix* | ultrix* | irix* \
-            | *vms* | esix* | aix* | cnk* | sunos | sunos[34]*\
-            | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \
-            | sym* | kopensolaris* | plan9* \
-            | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \
-            | aos* | aros* | cloudabi* | sortix* | twizzler* \
-            | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \
-            | clix* | riscos* | uniplus* | iris* | isc* | rtu* | xenix* \
-            | knetbsd* | mirbsd* | netbsd* \
-            | bitrig* | openbsd* | solidbsd* | libertybsd* | os108* \
-            | ekkobsd* | kfreebsd* | freebsd* | riscix* | lynxos* \
-            | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \
-            | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \
-            | udi* | eabi* | lites* | ieee* | go32* | aux* | hcos* \
-            | chorusrdb* | cegcc* | glidix* \
-            | cygwin* | msys* | pe* | moss* | proelf* | rtems* \
-            | midipix* | mingw32* | mingw64* | linux-gnu* | linux-android* \
-            | linux-newlib* | linux-musl* | linux-uclibc* \
-            | uxpv* | beos* | mpeix* | udk* | moxiebox* \
-            | interix* | uwin* | mks* | rhapsody* | darwin* \
-            | openstep* | oskit* | conix* | pw32* | nonstopux* \
-            | storm-chaos* | tops10* | tenex* | tops20* | its* \
-            | os2* | vos* | palmos* | uclinux* | nucleus* \
-            | morphos* | superux* | rtmk* | windiss* \
-            | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \
-            | skyos* | haiku* | rdos* | toppers* | drops* | es* \
-            | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \
-            | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \
-            | nsk* | powerunix)
+       # -sysv* is not here because it comes later, after sysvr4.
+       -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+             | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
+             | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
+             | -sym* | -kopensolaris* | -plan9* \
+             | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+             | -aos* | -aros* | -cloudabi* | -sortix* \
+             | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+             | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+             | -hiux* | -knetbsd* | -mirbsd* | -netbsd* \
+             | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \
+             | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+             | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+             | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+             | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+             | -chorusos* | -chorusrdb* | -cegcc* | -glidix* \
+             | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+             | -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
+             | -linux-newlib* | -linux-musl* | -linux-uclibc* \
+             | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \
+             | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* \
+             | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+             | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+             | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+             | -morphos* | -superux* | -rtmk* | -windiss* \
+             | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+             | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \
+             | -onefs* | -tirtos* | -phoenix* | -fuchsia* | -redox* | -bme* \
+             | -midnightbsd*)
        # Remember, each alternative MUST END IN *, to match a version number.
                ;;
-       qnx*)
-               case $cpu in
-                   x86 | i*86)
+       -qnx*)
+               case $basic_machine in
+                   x86-* | i*86-*)
                        ;;
                    *)
-                       os=nto-$os
+                       os=-nto$os
                        ;;
                esac
                ;;
-       hiux*)
-               os=hiuxwe2
+       -nto-qnx*)
                ;;
-       nto-qnx*)
-               ;;
-       nto*)
+       -nto*)
                os=`echo $os | sed -e 's|nto|nto-qnx|'`
                ;;
-       sim | xray | os68k* | v88r* \
-           | windows* | osx | abug | netware* | os9* \
-           | macos* | mpw* | magic* | mmixware* | mon960* | lnews*)
-               ;;
-       linux-dietlibc)
-               os=linux-dietlibc
-               ;;
-       linux*)
-               os=`echo $os | sed -e 's|linux|linux-gnu|'`
-               ;;
-       lynx*178)
-               os=lynxos178
-               ;;
-       lynx*5)
-               os=lynxos5
+       -sim | -xray | -os68k* | -v88r* \
+             | -windows* | -osx | -abug | -netware* | -os9* \
+             | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
                ;;
-       lynx*)
-               os=lynxos
-               ;;
-       mac*)
+       -mac*)
                os=`echo "$os" | sed -e 's|mac|macos|'`
                ;;
-       opened*)
-               os=openedition
+       -linux-dietlibc)
+               os=-linux-dietlibc
                ;;
-       os400*)
-               os=os400
+       -linux*)
+               os=`echo $os | sed -e 's|linux|linux-gnu|'`
                ;;
-       sunos5*)
+       -sunos5*)
                os=`echo "$os" | sed -e 's|sunos5|solaris2|'`
                ;;
-       sunos6*)
+       -sunos6*)
                os=`echo "$os" | sed -e 's|sunos6|solaris3|'`
                ;;
-       wince*)
-               os=wince
+       -opened*)
+               os=-openedition
                ;;
-       utek*)
-               os=bsd
+       -os400*)
+               os=-os400
                ;;
-       dynix*)
-               os=bsd
+       -wince*)
+               os=-wince
                ;;
-       acis*)
-               os=aos
+       -utek*)
+               os=-bsd
                ;;
-       atheos*)
-               os=atheos
+       -dynix*)
+               os=-bsd
                ;;
-       syllable*)
-               os=syllable
+       -acis*)
+               os=-aos
                ;;
-       386bsd)
-               os=bsd
+       -atheos*)
+               os=-atheos
+               ;;
+       -syllable*)
+               os=-syllable
                ;;
-       ctix* | uts*)
-               os=sysv
+       -386bsd)
+               os=-bsd
                ;;
-       nova*)
-               os=rtmk-nova
+       -ctix* | -uts*)
+               os=-sysv
                ;;
-       ns2)
-               os=nextstep2
+       -nova*)
+               os=-rtmk-nova
+               ;;
+       -ns2)
+               os=-nextstep2
+               ;;
+       -nsk*)
+               os=-nsk
                ;;
        # Preserve the version number of sinix5.
-       sinix5.*)
+       -sinix5.*)
                os=`echo $os | sed -e 's|sinix|sysv|'`
                ;;
-       sinix*)
-               os=sysv4
+       -sinix*)
+               os=-sysv4
                ;;
-       tpf*)
-               os=tpf
+       -tpf*)
+               os=-tpf
                ;;
-       triton*)
-               os=sysv3
+       -triton*)
+               os=-sysv3
                ;;
-       oss*)
-               os=sysv3
+       -oss*)
+               os=-sysv3
                ;;
-       svr4*)
-               os=sysv4
+       -svr4*)
+               os=-sysv4
                ;;
-       svr3)
-               os=sysv3
+       -svr3)
+               os=-sysv3
                ;;
-       sysvr4)
-               os=sysv4
+       -sysvr4)
+               os=-sysv4
                ;;
-       # This must come after sysvr4.
-       sysv*)
+       # This must come after -sysvr4.
+       -sysv*)
                ;;
-       ose*)
-               os=ose
+       -ose*)
+               os=-ose
                ;;
-       *mint | mint[0-9]* | *MiNT | MiNT[0-9]*)
-               os=mint
+       -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+               os=-mint
                ;;
-       zvmoe)
-               os=zvmoe
+       -zvmoe)
+               os=-zvmoe
                ;;
-       dicos*)
-               os=dicos
+       -dicos*)
+               os=-dicos
                ;;
-       pikeos*)
+       -pikeos*)
                # Until real need of OS specific support for
                # particular features comes up, bare metal
                # configurations are quite functional.
-               case $cpu in
+               case $basic_machine in
                    arm*)
-                       os=eabi
+                       os=-eabi
                        ;;
                    *)
-                       os=elf
+                       os=-elf
                        ;;
                esac
                ;;
-       nacl*)
+       -nacl*)
                ;;
-       ios)
+       -ios)
                ;;
-       none)
-               ;;
-       *-eabi)
+       -none)
                ;;
        *)
+               # Get rid of the `-' at the beginning of $os.
+               os=`echo $os | sed 's/[^-]*-//'`
                echo Invalid configuration \`"$1"\': system \`"$os"\' not recognized 1>&2
                exit 1
                ;;
@@ -1528,265 +1543,258 @@ else
 # will signal an error saying that MANUFACTURER isn't an operating
 # system, and we'll never get to this point.
 
-case $cpu-$vendor in
+case $basic_machine in
        score-*)
-               os=elf
+               os=-elf
                ;;
        spu-*)
-               os=elf
+               os=-elf
                ;;
        *-acorn)
-               os=riscix1.2
+               os=-riscix1.2
                ;;
        arm*-rebel)
-               os=linux
+               os=-linux
                ;;
        arm*-semi)
-               os=aout
+               os=-aout
                ;;
        c4x-* | tic4x-*)
-               os=coff
+               os=-coff
                ;;
        c8051-*)
-               os=elf
-               ;;
-       clipper-intergraph)
-               os=clix
+               os=-elf
                ;;
        hexagon-*)
-               os=elf
+               os=-elf
                ;;
        tic54x-*)
-               os=coff
+               os=-coff
                ;;
        tic55x-*)
-               os=coff
+               os=-coff
                ;;
        tic6x-*)
-               os=coff
+               os=-coff
                ;;
        # This must come before the *-dec entry.
        pdp10-*)
-               os=tops20
+               os=-tops20
                ;;
        pdp11-*)
-               os=none
+               os=-none
                ;;
        *-dec | vax-*)
-               os=ultrix4.2
+               os=-ultrix4.2
                ;;
        m68*-apollo)
-               os=domain
+               os=-domain
                ;;
        i386-sun)
-               os=sunos4.0.2
+               os=-sunos4.0.2
                ;;
        m68000-sun)
-               os=sunos3
+               os=-sunos3
                ;;
        m68*-cisco)
-               os=aout
+               os=-aout
                ;;
        mep-*)
-               os=elf
+               os=-elf
                ;;
        mips*-cisco)
-               os=elf
+               os=-elf
                ;;
        mips*-*)
-               os=elf
+               os=-elf
                ;;
        or32-*)
-               os=coff
+               os=-coff
                ;;
        *-tti)  # must be before sparc entry or we get the wrong os.
-               os=sysv3
+               os=-sysv3
                ;;
        sparc-* | *-sun)
-               os=sunos4.1.1
+               os=-sunos4.1.1
                ;;
        pru-*)
-               os=elf
+               os=-elf
                ;;
        *-be)
-               os=beos
+               os=-beos
                ;;
        *-ibm)
-               os=aix
+               os=-aix
                ;;
        *-knuth)
-               os=mmixware
+               os=-mmixware
                ;;
        *-wec)
-               os=proelf
+               os=-proelf
                ;;
        *-winbond)
-               os=proelf
+               os=-proelf
                ;;
        *-oki)
-               os=proelf
+               os=-proelf
                ;;
        *-hp)
-               os=hpux
+               os=-hpux
                ;;
        *-hitachi)
-               os=hiux
+               os=-hiux
                ;;
        i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
-               os=sysv
+               os=-sysv
                ;;
        *-cbm)
-               os=amigaos
+               os=-amigaos
                ;;
        *-dg)
-               os=dgux
+               os=-dgux
                ;;
        *-dolphin)
-               os=sysv3
+               os=-sysv3
                ;;
        m68k-ccur)
-               os=rtu
+               os=-rtu
                ;;
        m88k-omron*)
-               os=luna
+               os=-luna
                ;;
        *-next)
-               os=nextstep
+               os=-nextstep
                ;;
        *-sequent)
-               os=ptx
+               os=-ptx
                ;;
        *-crds)
-               os=unos
+               os=-unos
                ;;
        *-ns)
-               os=genix
+               os=-genix
                ;;
        i370-*)
-               os=mvs
+               os=-mvs
                ;;
        *-gould)
-               os=sysv
+               os=-sysv
                ;;
        *-highlevel)
-               os=bsd
+               os=-bsd
                ;;
        *-encore)
-               os=bsd
+               os=-bsd
                ;;
        *-sgi)
-               os=irix
+               os=-irix
                ;;
        *-siemens)
-               os=sysv4
+               os=-sysv4
                ;;
        *-masscomp)
-               os=rtu
+               os=-rtu
                ;;
        f30[01]-fujitsu | f700-fujitsu)
-               os=uxpv
+               os=-uxpv
                ;;
        *-rom68k)
-               os=coff
+               os=-coff
                ;;
        *-*bug)
-               os=coff
+               os=-coff
                ;;
        *-apple)
-               os=macos
+               os=-macos
                ;;
        *-atari*)
-               os=mint
-               ;;
-       *-wrs)
-               os=vxworks
+               os=-mint
                ;;
        *)
-               os=none
+               os=-none
                ;;
 esac
 fi
 
 # Here we handle the case where we know the os, and the CPU type, but not the
 # manufacturer.  We pick the logical manufacturer.
-case $vendor in
-       unknown)
+vendor=unknown
+case $basic_machine in
+       *-unknown)
                case $os in
-                       riscix*)
+                       -riscix*)
                                vendor=acorn
                                ;;
-                       sunos*)
+                       -sunos*)
                                vendor=sun
                                ;;
-                       cnk*|-aix*)
+                       -cnk*|-aix*)
                                vendor=ibm
                                ;;
-                       beos*)
+                       -beos*)
                                vendor=be
                                ;;
-                       hpux*)
+                       -hpux*)
                                vendor=hp
                                ;;
-                       mpeix*)
+                       -mpeix*)
                                vendor=hp
                                ;;
-                       hiux*)
+                       -hiux*)
                                vendor=hitachi
                                ;;
-                       unos*)
+                       -unos*)
                                vendor=crds
                                ;;
-                       dgux*)
+                       -dgux*)
                                vendor=dg
                                ;;
-                       luna*)
+                       -luna*)
                                vendor=omron
                                ;;
-                       genix*)
+                       -genix*)
                                vendor=ns
                                ;;
-                       clix*)
-                               vendor=intergraph
-                               ;;
-                       mvs* | opened*)
+                       -mvs* | -opened*)
                                vendor=ibm
                                ;;
-                       os400*)
+                       -os400*)
                                vendor=ibm
                                ;;
-                       ptx*)
+                       -ptx*)
                                vendor=sequent
                                ;;
-                       tpf*)
+                       -tpf*)
                                vendor=ibm
                                ;;
-                       vxsim* | vxworks* | windiss*)
+                       -vxsim* | -vxworks* | -windiss*)
                                vendor=wrs
                                ;;
-                       aux*)
+                       -aux*)
                                vendor=apple
                                ;;
-                       hms*)
+                       -hms*)
                                vendor=hitachi
                                ;;
-                       mpw* | macos*)
+                       -mpw* | -macos*)
                                vendor=apple
                                ;;
-                       *mint | mint[0-9]* | *MiNT | MiNT[0-9]*)
+                       -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
                                vendor=atari
                                ;;
-                       vos*)
+                       -vos*)
                                vendor=stratus
                                ;;
                esac
+               basic_machine=`echo "$basic_machine" | sed "s/unknown/$vendor/"`
                ;;
 esac
 
-echo "$cpu-$vendor-$os"
+echo "$basic_machine$os"
 exit
 
 # Local variables:
-# eval: (add-hook 'before-save-hook 'time-stamp)
+# eval: (add-hook 'write-file-functions 'time-stamp)
 # time-stamp-start: "timestamp='"
 # time-stamp-format: "%:y-%02m-%02d"
 # time-stamp-end: "'"
index 1b5bc56..969a83a 100755 (executable)
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for HarfBuzz 2.6.7.
+# Generated by GNU Autoconf 2.69 for HarfBuzz 3.4.0.
 #
 # Report bugs to <https://github.com/harfbuzz/harfbuzz/issues/new>.
 #
@@ -590,8 +590,8 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='HarfBuzz'
 PACKAGE_TARNAME='harfbuzz'
-PACKAGE_VERSION='2.6.7'
-PACKAGE_STRING='HarfBuzz 2.6.7'
+PACKAGE_VERSION='3.4.0'
+PACKAGE_STRING='HarfBuzz 3.4.0'
 PACKAGE_BUGREPORT='https://github.com/harfbuzz/harfbuzz/issues/new'
 PACKAGE_URL='http://harfbuzz.org/'
 
@@ -666,13 +666,12 @@ HAVE_ICU_BUILTIN_FALSE
 HAVE_ICU_BUILTIN_TRUE
 HAVE_ICU_FALSE
 HAVE_ICU_TRUE
-ICU_CONFIG
 ICU_LIBS
 ICU_CFLAGS
-HAVE_FONTCONFIG_FALSE
-HAVE_FONTCONFIG_TRUE
-FONTCONFIG_LIBS
-FONTCONFIG_CFLAGS
+HAVE_CHAFA_FALSE
+HAVE_CHAFA_TRUE
+CHAFA_LIBS
+CHAFA_CFLAGS
 HAVE_CAIRO_FT_FALSE
 HAVE_CAIRO_FT_TRUE
 CAIRO_FT_LIBS
@@ -858,6 +857,7 @@ infodir
 docdir
 oldincludedir
 includedir
+runstatedir
 localstatedir
 sharedstatedir
 sysconfdir
@@ -903,7 +903,7 @@ with_glib
 with_gobject
 enable_introspection
 with_cairo
-with_fontconfig
+with_chafa
 with_icu
 with_graphite2
 with_freetype
@@ -939,8 +939,8 @@ CAIRO_CFLAGS
 CAIRO_LIBS
 CAIRO_FT_CFLAGS
 CAIRO_FT_LIBS
-FONTCONFIG_CFLAGS
-FONTCONFIG_LIBS
+CHAFA_CFLAGS
+CHAFA_LIBS
 ICU_CFLAGS
 ICU_LIBS
 GRAPHITE2_CFLAGS
@@ -985,6 +985,7 @@ datadir='${datarootdir}'
 sysconfdir='${prefix}/etc'
 sharedstatedir='${prefix}/com'
 localstatedir='${prefix}/var'
+runstatedir='${localstatedir}/run'
 includedir='${prefix}/include'
 oldincludedir='/usr/include'
 docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
@@ -1237,6 +1238,15 @@ do
   | -silent | --silent | --silen | --sile | --sil)
     silent=yes ;;
 
+  -runstatedir | --runstatedir | --runstatedi | --runstated \
+  | --runstate | --runstat | --runsta | --runst | --runs \
+  | --run | --ru | --r)
+    ac_prev=runstatedir ;;
+  -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
+  | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \
+  | --run=* | --ru=* | --r=*)
+    runstatedir=$ac_optarg ;;
+
   -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
     ac_prev=sbindir ;;
   -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
@@ -1374,7 +1384,7 @@ fi
 for ac_var in  exec_prefix prefix bindir sbindir libexecdir datarootdir \
                datadir sysconfdir sharedstatedir localstatedir includedir \
                oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
-               libdir localedir mandir
+               libdir localedir mandir runstatedir
 do
   eval ac_val=\$$ac_var
   # Remove trailing slashes.
@@ -1487,7 +1497,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures HarfBuzz 2.6.7 to adapt to many kinds of systems.
+\`configure' configures HarfBuzz 3.4.0 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1527,6 +1537,7 @@ Fine tuning of the installation directories:
   --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
   --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
   --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
+  --runstatedir=DIR       modifiable per-process data [LOCALSTATEDIR/run]
   --libdir=DIR            object code libraries [EPREFIX/lib]
   --includedir=DIR        C header files [PREFIX/include]
   --oldincludedir=DIR     C header files for non-gcc [/usr/include]
@@ -1557,7 +1568,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of HarfBuzz 2.6.7:";;
+     short | recursive ) echo "Configuration of HarfBuzz 3.4.0:";;
    esac
   cat <<\_ACEOF
 
@@ -1605,8 +1616,8 @@ Optional Packages:
                           Use gobject [default=no]
   --with-cairo=[yes/no/auto]
                           Use cairo [default=auto]
-  --with-fontconfig=[yes/no/auto]
-                          Use fontconfig [default=auto]
+  --with-chafa=[yes/no/auto]
+                          Use chafa [default=auto]
   --with-icu=[yes/no/builtin/auto]
                           Use ICU [default=auto]
   --with-graphite2=[yes/no/auto]
@@ -1659,10 +1670,9 @@ Some influential environment variables:
               C compiler flags for CAIRO_FT, overriding pkg-config
   CAIRO_FT_LIBS
               linker flags for CAIRO_FT, overriding pkg-config
-  FONTCONFIG_CFLAGS
-              C compiler flags for FONTCONFIG, overriding pkg-config
-  FONTCONFIG_LIBS
-              linker flags for FONTCONFIG, overriding pkg-config
+  CHAFA_CFLAGS
+              C compiler flags for CHAFA, overriding pkg-config
+  CHAFA_LIBS  linker flags for CHAFA, overriding pkg-config
   ICU_CFLAGS  C compiler flags for ICU, overriding pkg-config
   ICU_LIBS    linker flags for ICU, overriding pkg-config
   GRAPHITE2_CFLAGS
@@ -1741,7 +1751,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-HarfBuzz configure 2.6.7
+HarfBuzz configure 3.4.0
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2559,7 +2569,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by HarfBuzz $as_me 2.6.7, which was
+It was created by HarfBuzz $as_me 3.4.0, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -3428,7 +3438,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='harfbuzz'
- VERSION='2.6.7'
+ VERSION='3.4.0'
 
 
 # Some tools Automake needs.
@@ -5328,8 +5338,8 @@ esac
 
 
 
-macro_version='2.4.6.42-b88ce-dirty'
-macro_revision='2.4.6.42'
+macro_version='2.4.6'
+macro_revision='2.4.6'
 
 
 
@@ -6629,7 +6639,7 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
   lt_cv_deplibs_check_method=pass_all
   ;;
 
-netbsd*)
+netbsd* | netbsdelf*-gnu)
   if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
     lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
   else
@@ -6991,29 +7001,13 @@ esac
 fi
 
 : ${AR=ar}
+: ${AR_FLAGS=cr}
 
 
 
 
 
 
-# Use ARFLAGS variable as AR's operation code to sync the variable naming with
-# Automake.  If both AR_FLAGS and ARFLAGS are specified, AR_FLAGS should have
-# higher priority because thats what people were doing historically (setting
-# ARFLAGS for automake and AR_FLAGS for libtool).  FIXME: Make the AR_FLAGS
-# variable obsoleted/removed.
-
-test ${AR_FLAGS+y} || AR_FLAGS=${ARFLAGS-cr}
-lt_ar_flags=$AR_FLAGS
-
-
-
-
-
-
-# Make AR_FLAGS overridable by 'make ARFLAGS='.  Don't try to run-time override
-# by AR_FLAGS because that was never working and AR_FLAGS is about to die.
-
 
 
 
@@ -7462,7 +7456,7 @@ for ac_symprfx in "" "_"; do
   if test "$lt_cv_nm_interface" = "MS dumpbin"; then
     # Fake it for dumpbin and say T for any non-static function,
     # D for any global variable and I for any imported variable.
-    # Also find C++ and __fastcall symbols from MSVC++ or ICC,
+    # Also find C++ and __fastcall symbols from MSVC++,
     # which start with @ or ?.
     lt_cv_sys_global_symbol_pipe="$AWK '"\
 "     {last_section=section; section=\$ 3};"\
@@ -7508,11 +7502,8 @@ _LT_EOF
   test $ac_status = 0; }; then
     # Now try to grab the symbols.
     nlist=conftest.nm
-    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5
-  (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s "$nlist"; then
+    $ECHO "$as_me:$LINENO: $NM conftest.$ac_objext | $lt_cv_sys_global_symbol_pipe > $nlist" >&5
+    if eval "$NM" conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist 2>&5 && test -s "$nlist"; then
       # Try sorting and uniquifying the output.
       if sort "$nlist" | uniq > "$nlist"T; then
        mv -f "$nlist"T "$nlist"
@@ -8731,8 +8722,8 @@ int forced_loaded() { return 2;}
 _LT_EOF
       echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5
       $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5
-      echo "$AR $AR_FLAGS libconftest.a conftest.o" >&5
-      $AR $AR_FLAGS libconftest.a conftest.o 2>&5
+      echo "$AR cr libconftest.a conftest.o" >&5
+      $AR cr libconftest.a conftest.o 2>&5
       echo "$RANLIB libconftest.a" >&5
       $RANLIB libconftest.a 2>&5
       cat > conftest.c << _LT_EOF
@@ -9394,8 +9385,8 @@ esac
 ofile=libtool
 can_build_shared=yes
 
-# All known linkers require a '.a' archive for static linking (except MSVC and
-# ICC, which need '.lib').
+# All known linkers require a '.a' archive for static linking (except MSVC,
+# which needs '.lib').
 libext=a
 
 with_gnu_ld=$lt_cv_prog_gnu_ld
@@ -9860,6 +9851,12 @@ lt_prog_compiler_static=
        lt_prog_compiler_pic='-KPIC'
        lt_prog_compiler_static='-static'
         ;;
+      # flang / f18. f95 an alias for gfortran or flang on Debian
+      flang* | f18* | f95*)
+       lt_prog_compiler_wl='-Wl,'
+       lt_prog_compiler_pic='-fPIC'
+       lt_prog_compiler_static='-static'
+        ;;
       # icc used to be incompatible with GCC.
       # ICC 10 doesn't accept -KPIC any more.
       icc* | ifort*)
@@ -10322,20 +10319,23 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
 
   case $host_os in
   cygwin* | mingw* | pw32* | cegcc*)
-    # FIXME: the MSVC++ and ICC port hasn't been tested in a loooong time
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
     # When not using gcc, we currently assume that we are using
-    # Microsoft Visual C++ or Intel C++ Compiler.
+    # Microsoft Visual C++.
     if test yes != "$GCC"; then
       with_gnu_ld=no
     fi
     ;;
   interix*)
-    # we just hope/assume this is gcc and not c89 (= MSVC++ or ICC)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
     with_gnu_ld=yes
     ;;
   openbsd* | bitrig*)
     with_gnu_ld=no
     ;;
+  linux* | k*bsd*-gnu | gnu*)
+    link_all_deplibs=no
+    ;;
   esac
 
   ld_shlibs=yes
@@ -10494,7 +10494,6 @@ _LT_EOF
        emximp -o $lib $output_objdir/$libname.def'
       old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
       enable_shared_with_static_runtimes=yes
-      file_list_spec='@'
       ;;
 
     interix[3-9]*)
@@ -10591,7 +10590,7 @@ _LT_EOF
       fi
       ;;
 
-    netbsd*)
+    netbsd* | netbsdelf*-gnu)
       if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
        archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
        wlarc=
@@ -10712,7 +10711,7 @@ _LT_EOF
        if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
          export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
        else
-         export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
+         export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
        fi
        aix_use_runtimelinking=no
 
 
     cygwin* | mingw* | pw32* | cegcc*)
       # When not using gcc, we currently assume that we are using
-      # Microsoft Visual C++ or Intel C++ Compiler.
+      # Microsoft Visual C++.
       # hardcode_libdir_flag_spec is actually meaningless, as there is
       # no search path for DLLs.
       case $cc_basename in
-      cl* | icl*)
-       # Native MSVC or ICC
+      cl*)
+       # Native MSVC
        hardcode_libdir_flag_spec=' '
        allow_undefined_flag=unsupported
        always_export_symbols=yes
@@ -11025,7 +11024,7 @@ fi
           fi'
        ;;
       *)
-       # Assume MSVC and ICC wrapper
+       # Assume MSVC wrapper
        hardcode_libdir_flag_spec=' '
        allow_undefined_flag=unsupported
        # Tell ltmain to make .lib files, not .a files.
@@ -11261,6 +11260,7 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
        if test yes = "$lt_cv_irix_exported_symbol"; then
           archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib'
        fi
+       link_all_deplibs=no
       else
        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
        archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib'
@@ -11282,7 +11282,7 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
       esac
       ;;
 
-    netbsd*)
+    netbsd* | netbsdelf*-gnu)
       if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
        archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
       else
@@ -11349,7 +11349,6 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
        emximp -o $lib $output_objdir/$libname.def'
       old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
       enable_shared_with_static_runtimes=yes
-      file_list_spec='@'
       ;;
 
     osf3*)
@@ -12057,8 +12056,8 @@ cygwin* | mingw* | pw32* | cegcc*)
     dynamic_linker='Win32 ld.exe'
     ;;
 
-  *,cl* | *,icl*)
-    # Native MSVC or ICC
+  *,cl*)
+    # Native MSVC
     libname_spec='$name'
     soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
     library_names_spec='$libname.dll.lib'
@@ -12114,7 +12113,7 @@ cygwin* | mingw* | pw32* | cegcc*)
     ;;
 
   *)
-    # Assume MSVC and ICC wrapper
+    # Assume MSVC wrapper
     library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib'
     dynamic_linker='Win32 ld.exe'
     ;;
   dynamic_linker='GNU/Linux ld.so'
   ;;
 
+netbsdelf*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='NetBSD ld.elf_so'
+  ;;
+
 netbsd*)
   version_type=sunos
   need_lib_prefix=no
@@ -13293,41 +13304,30 @@ striplib=
 old_striplib=
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5
 $as_echo_n "checking whether stripping libraries is possible... " >&6; }
-if test -z "$STRIP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-else
-  if $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
-    old_striplib="$STRIP --strip-debug"
-    striplib="$STRIP --strip-unneeded"
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
 $as_echo "yes" >&6; }
-  else
-    case $host_os in
-    darwin*)
-      # FIXME - insert some real tests, host_os isn't really good enough
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+  case $host_os in
+  darwin*)
+    if test -n "$STRIP"; then
       striplib="$STRIP -x"
       old_striplib="$STRIP -S"
       { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
 $as_echo "yes" >&6; }
-      ;;
-    freebsd*)
-      if $STRIP -V 2>&1 | $GREP "elftoolchain" >/dev/null; then
-        old_striplib="$STRIP --strip-debug"
-        striplib="$STRIP --strip-unneeded"
-        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-      else
-        { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-      fi
-      ;;
-    *)
+    else
       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
-      ;;
-    esac
-  fi
+    fi
+    ;;
+  *)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    ;;
+  esac
 fi
 
 
@@ -15122,7 +15122,7 @@ with_gnu_ld=$lt_cv_prog_gnu_ld
       # Commands to make compiler produce verbose output that lists
       # what "hidden" libraries, object files and flags are used when
       # linking a shared library.
-      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"'
 
     else
       GXX=no
@@ -15418,8 +15418,8 @@ fi
 
       cygwin* | mingw* | pw32* | cegcc*)
        case $GXX,$cc_basename in
-       ,cl* | no,cl* | ,icl* | no,icl*)
-         # Native MSVC or ICC
+       ,cl* | no,cl*)
+         # Native MSVC
          # hardcode_libdir_flag_spec is actually meaningless, as there is
          # no search path for DLLs.
          hardcode_libdir_flag_spec_CXX=' '
@@ -15549,7 +15549,6 @@ fi
          emximp -o $lib $output_objdir/$libname.def'
        old_archive_From_new_cmds_CXX='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
        enable_shared_with_static_runtimes_CXX=yes
-       file_list_spec_CXX='@'
        ;;
 
       dgux*)
@@ -15615,7 +15614,7 @@ fi
             # explicitly linking system object files so we need to strip them
             # from the output so that they don't get included in the library
             # dependencies.
-            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP " \-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
             ;;
           *)
             if test yes = "$GXX"; then
@@ -15680,7 +15679,7 @@ fi
            # explicitly linking system object files so we need to strip them
            # from the output so that they don't get included in the library
            # dependencies.
-           output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+           output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP " \-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
            ;;
           *)
            if test yes = "$GXX"; then
@@ -16019,7 +16018,7 @@ fi
              # Commands to make compiler produce verbose output that lists
              # what "hidden" libraries, object files and flags are used when
              # linking a shared library.
-             output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+             output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"'
 
            else
              # FIXME: insert proper C++ library support
@@ -16103,7 +16102,7 @@ fi
                # Commands to make compiler produce verbose output that lists
                # what "hidden" libraries, object files and flags are used when
                # linking a shared library.
-               output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+               output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"'
              else
                # g++ 2.7 appears to require '-G' NOT '-shared' on this
                # platform.
@@ -16114,7 +16113,7 @@ fi
                # Commands to make compiler produce verbose output that lists
                # what "hidden" libraries, object files and flags are used when
                # linking a shared library.
-               output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+               output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"'
              fi
 
              hardcode_libdir_flag_spec_CXX='$wl-R $wl$libdir'
@@ -16627,7 +16626,7 @@ lt_prog_compiler_static_CXX=
            ;;
        esac
        ;;
-      netbsd*)
+      netbsd* | netbsdelf*-gnu)
        ;;
       *qnx* | *nto*)
         # QNX uses GNU C++, but need to define -shared option too, otherwise
@@ -16985,7 +16984,7 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
     if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
       export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
     else
-      export_symbols_cmds_CXX='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
+      export_symbols_cmds_CXX='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
     fi
     ;;
   pw32*)
@@ -16993,7 +16992,7 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
     ;;
   cygwin* | mingw* | cegcc*)
     case $cc_basename in
-    cl* | icl*)
+    cl*)
       exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
       ;;
     *)
@@ -17002,6 +17001,9 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
       ;;
     esac
     ;;
+  linux* | k*bsd*-gnu | gnu*)
+    link_all_deplibs_CXX=no
+    ;;
   *)
     export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
     ;;
@@ -17355,8 +17357,8 @@ cygwin* | mingw* | pw32* | cegcc*)
     dynamic_linker='Win32 ld.exe'
     ;;
 
-  *,cl* | *,icl*)
-    # Native MSVC or ICC
+  *,cl*)
+    # Native MSVC
     libname_spec='$name'
     soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
     library_names_spec='$libname.dll.lib'
@@ -17412,7 +17414,7 @@ cygwin* | mingw* | pw32* | cegcc*)
     ;;
 
   *)
-    # Assume MSVC and ICC wrapper
+    # Assume MSVC wrapper
     library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib'
     dynamic_linker='Win32 ld.exe'
     ;;
   dynamic_linker='GNU/Linux ld.so'
   ;;
 
+netbsdelf*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='NetBSD ld.elf_so'
+  ;;
+
 netbsd*)
   version_type=sunos
   need_lib_prefix=no
@@ -19033,7 +19047,7 @@ else
     We can't simply define LARGE_OFF_T to be 9223372036854775807,
     since some C++ compilers masquerading as C compilers
     incorrectly reject 9223372036854775807.  */
-#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
   int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
                       && LARGE_OFF_T % 2147483647 == 1)
                      ? 1 : -1];
@@ -19079,7 +19093,7 @@ else
     We can't simply define LARGE_OFF_T to be 9223372036854775807,
     since some C++ compilers masquerading as C compilers
     incorrectly reject 9223372036854775807.  */
-#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
   int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
                       && LARGE_OFF_T % 2147483647 == 1)
                      ? 1 : -1];
@@ -19103,7 +19117,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
     We can't simply define LARGE_OFF_T to be 9223372036854775807,
     since some C++ compilers masquerading as C compilers
     incorrectly reject 9223372036854775807.  */
-#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
   int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
                       && LARGE_OFF_T % 2147483647 == 1)
                      ? 1 : -1];
@@ -19148,7 +19162,7 @@ else
     We can't simply define LARGE_OFF_T to be 9223372036854775807,
     since some C++ compilers masquerading as C compilers
     incorrectly reject 9223372036854775807.  */
-#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
   int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
                       && LARGE_OFF_T % 2147483647 == 1)
                      ? 1 : -1];
@@ -19172,7 +19186,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
     We can't simply define LARGE_OFF_T to be 9223372036854775807,
     since some C++ compilers masquerading as C compilers
     incorrectly reject 9223372036854775807.  */
-#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
   int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
                       && LARGE_OFF_T % 2147483647 == 1)
                      ? 1 : -1];
@@ -19316,7 +19330,7 @@ fi
 
 fi
 if test -n "$PKG_CONFIG"; then
-       _pkg_min_version=0.20
+       _pkg_min_version=0.28
        { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5
 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; }
        if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
@@ -19340,10 +19354,10 @@ GIT=${GIT-"${am_missing_run}git"}
 
 
 
-HB_VERSION_MAJOR=2
-HB_VERSION_MINOR=6
-HB_VERSION_MICRO=7
-HB_VERSION=2.6.7
+HB_VERSION_MAJOR=3
+HB_VERSION_MINOR=4
+HB_VERSION_MICRO=0
+HB_VERSION=3.4.0
 
 
 
@@ -19351,10 +19365,7 @@ HB_VERSION=2.6.7
 
 # Libtool version
 
-
-
-
-HB_LIBTOOL_VERSION_INFO=20600:7:20600
+HB_LIBTOOL_VERSION_INFO=30400:0:30400
 
 
 
@@ -19753,7 +19764,7 @@ fi
 
 
 # Functions and headers
-for ac_func in atexit mprotect sysconf getpagesize mmap isatty roundf
+for ac_func in atexit mprotect sysconf getpagesize mmap isatty newlocale uselocale
 do :
   as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
 ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
@@ -19765,7 +19776,7 @@ _ACEOF
 fi
 done
 
-for ac_header in unistd.h sys/mman.h stdbool.h
+for ac_header in unistd.h sys/mman.h stdbool.h xlocale.h
 do :
   as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
 ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
 
 
 
-# Check whether --with-fontconfig was given.
-if test "${with_fontconfig+set}" = set; then :
-  withval=$with_fontconfig;
+# Check whether --with-chafa was given.
+if test "${with_chafa+set}" = set; then :
+  withval=$with_chafa;
 else
-  with_fontconfig=auto
+  with_chafa=auto
 fi
 
-have_fontconfig=false
-if test "x$with_fontconfig" = "xyes" -o "x$with_fontconfig" = "xauto"; then
+have_chafa=false
+if test "x$with_chafa" = "xyes" -o "x$with_chafa" = "xauto"; then
 
 pkg_failed=no
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for FONTCONFIG" >&5
-$as_echo_n "checking for FONTCONFIG... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for CHAFA" >&5
+$as_echo_n "checking for CHAFA... " >&6; }
 
-if test -n "$FONTCONFIG_CFLAGS"; then
-    pkg_cv_FONTCONFIG_CFLAGS="$FONTCONFIG_CFLAGS"
+if test -n "$CHAFA_CFLAGS"; then
+    pkg_cv_CHAFA_CFLAGS="$CHAFA_CFLAGS"
  elif test -n "$PKG_CONFIG"; then
     if test -n "$PKG_CONFIG" && \
-    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fontconfig\""; } >&5
-  ($PKG_CONFIG --exists --print-errors "fontconfig") 2>&5
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"chafa >= 1.6.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "chafa >= 1.6.0") 2>&5
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; then
-  pkg_cv_FONTCONFIG_CFLAGS=`$PKG_CONFIG --cflags "fontconfig" 2>/dev/null`
+  pkg_cv_CHAFA_CFLAGS=`$PKG_CONFIG --cflags "chafa >= 1.6.0" 2>/dev/null`
                      test "x$?" != "x0" && pkg_failed=yes
 else
   pkg_failed=yes
  else
     pkg_failed=untried
 fi
-if test -n "$FONTCONFIG_LIBS"; then
-    pkg_cv_FONTCONFIG_LIBS="$FONTCONFIG_LIBS"
+if test -n "$CHAFA_LIBS"; then
+    pkg_cv_CHAFA_LIBS="$CHAFA_LIBS"
  elif test -n "$PKG_CONFIG"; then
     if test -n "$PKG_CONFIG" && \
-    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fontconfig\""; } >&5
-  ($PKG_CONFIG --exists --print-errors "fontconfig") 2>&5
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"chafa >= 1.6.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "chafa >= 1.6.0") 2>&5
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; then
-  pkg_cv_FONTCONFIG_LIBS=`$PKG_CONFIG --libs "fontconfig" 2>/dev/null`
+  pkg_cv_CHAFA_LIBS=`$PKG_CONFIG --libs "chafa >= 1.6.0" 2>/dev/null`
                      test "x$?" != "x0" && pkg_failed=yes
 else
   pkg_failed=yes
@@ -21193,12 +21204,12 @@ else
         _pkg_short_errors_supported=no
 fi
         if test $_pkg_short_errors_supported = yes; then
-               FONTCONFIG_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "fontconfig" 2>&1`
+               CHAFA_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "chafa >= 1.6.0" 2>&1`
         else
-               FONTCONFIG_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "fontconfig" 2>&1`
+               CHAFA_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "chafa >= 1.6.0" 2>&1`
         fi
        # Put the nasty error message in config.log where it belongs
-       echo "$FONTCONFIG_PKG_ERRORS" >&5
+       echo "$CHAFA_PKG_ERRORS" >&5
 
        :
 elif test $pkg_failed = untried; then
@@ -21206,27 +21217,27 @@ elif test $pkg_failed = untried; then
 $as_echo "no" >&6; }
        :
 else
-       FONTCONFIG_CFLAGS=$pkg_cv_FONTCONFIG_CFLAGS
-       FONTCONFIG_LIBS=$pkg_cv_FONTCONFIG_LIBS
+       CHAFA_CFLAGS=$pkg_cv_CHAFA_CFLAGS
+       CHAFA_LIBS=$pkg_cv_CHAFA_LIBS
         { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
 $as_echo "yes" >&6; }
-       have_fontconfig=true
+       have_chafa=true
 fi
 fi
-if test "x$with_fontconfig" = "xyes" -a "x$have_fontconfig" != "xtrue"; then
-       as_fn_error $? "fontconfig support requested but not found" "$LINENO" 5
+if test "x$with_chafa" = "xyes" -a "x$have_chafa" != "xtrue"; then
+       as_fn_error $? "chafa support requested but not found" "$LINENO" 5
 fi
-if $have_fontconfig; then
+if $have_chafa; then
 
-$as_echo "#define HAVE_FONTCONFIG 1" >>confdefs.h
+$as_echo "#define HAVE_CHAFA 1" >>confdefs.h
 
 fi
- if $have_fontconfig; then
-  HAVE_FONTCONFIG_TRUE=
-  HAVE_FONTCONFIG_FALSE='#'
+ if $have_chafa; then
+  HAVE_CHAFA_TRUE=
+  HAVE_CHAFA_FALSE='#'
 else
-  HAVE_FONTCONFIG_TRUE='#'
-  HAVE_FONTCONFIG_FALSE=
+  HAVE_CHAFA_TRUE='#'
+  HAVE_CHAFA_FALSE=
 fi
 
 
@@ -21312,118 +21323,6 @@ else
 $as_echo "yes" >&6; }
        have_icu=true
 fi
-
-               if test "$have_icu" != "true"; then
-               if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}icu-config", so it can be a program name with args.
-set dummy ${ac_tool_prefix}icu-config; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ICU_CONFIG+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ICU_CONFIG"; then
-  ac_cv_prog_ICU_CONFIG="$ICU_CONFIG" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ICU_CONFIG="${ac_tool_prefix}icu-config"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ICU_CONFIG=$ac_cv_prog_ICU_CONFIG
-if test -n "$ICU_CONFIG"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ICU_CONFIG" >&5
-$as_echo "$ICU_CONFIG" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_ICU_CONFIG"; then
-  ac_ct_ICU_CONFIG=$ICU_CONFIG
-  # Extract the first word of "icu-config", so it can be a program name with args.
-set dummy icu-config; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_ICU_CONFIG+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_ICU_CONFIG"; then
-  ac_cv_prog_ac_ct_ICU_CONFIG="$ac_ct_ICU_CONFIG" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_ICU_CONFIG="icu-config"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_ICU_CONFIG=$ac_cv_prog_ac_ct_ICU_CONFIG
-if test -n "$ac_ct_ICU_CONFIG"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_ICU_CONFIG" >&5
-$as_echo "$ac_ct_ICU_CONFIG" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_ICU_CONFIG" = x; then
-    ICU_CONFIG="no"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    ICU_CONFIG=$ac_ct_ICU_CONFIG
-  fi
-else
-  ICU_CONFIG="$ac_cv_prog_ICU_CONFIG"
-fi
-
-               { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ICU by using icu-config fallback" >&5
-$as_echo_n "checking for ICU by using icu-config fallback... " >&6; }
-               if test "$ICU_CONFIG" != "no" && "$ICU_CONFIG" --version >/dev/null; then
-                       have_icu=true
-                       # We don't use --cflags as this gives us a lot of things that we don't
-                       # necessarily want, like debugging and optimization flags
-                       # See man (1) icu-config for more info.
-                       ICU_CFLAGS=`$ICU_CONFIG --cppflags`
-                       ICU_LIBS=`$ICU_CONFIG --ldflags-searchpath --ldflags-libsonly`
-
-
-                       { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-               else
-                       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-               fi
-       fi
 fi
 if test \( "x$with_icu" = "xyes" -o "x$with_icu" = "xbuiltin" \) -a "x$have_icu" != "xtrue"; then
        as_fn_error $? "icu support requested but icu-uc not found" "$LINENO" 5
 
 
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Intel atomic primitives" >&5
-$as_echo_n "checking for Intel atomic primitives... " >&6; }
-if ${hb_cv_have_intel_atomic_primitives+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-       hb_cv_have_intel_atomic_primitives=false
-       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-               void memory_barrier (void) { __sync_synchronize (); }
-               int atomic_add (int *i) { return __sync_fetch_and_add (i, 1); }
-               int mutex_trylock (int *m) { return __sync_lock_test_and_set (m, 1); }
-               void mutex_unlock (int *m) { __sync_lock_release (m); }
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  hb_cv_have_intel_atomic_primitives=true
-
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hb_cv_have_intel_atomic_primitives" >&5
-$as_echo "$hb_cv_have_intel_atomic_primitives" >&6; }
-if $hb_cv_have_intel_atomic_primitives; then
-
-$as_echo "#define HAVE_INTEL_ATOMIC_PRIMITIVES 1" >>confdefs.h
-
-fi
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Solaris atomic operations" >&5
-$as_echo_n "checking for Solaris atomic operations... " >&6; }
-if ${hb_cv_have_solaris_atomic_ops+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-       hb_cv_have_solaris_atomic_ops=false
-       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-               #include <atomic.h>
-               /* This requires Solaris Studio 12.2 or newer: */
-               #include <mbarrier.h>
-               void memory_barrier (void) { __machine_rw_barrier (); }
-               int atomic_add (volatile unsigned *i) { return atomic_add_int_nv (i, 1); }
-               void *atomic_ptr_cmpxchg (volatile void **target, void *cmp, void *newval) { return atomic_cas_ptr (target, cmp, newval); }
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  hb_cv_have_solaris_atomic_ops=true
-
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hb_cv_have_solaris_atomic_ops" >&5
-$as_echo "$hb_cv_have_solaris_atomic_ops" >&6; }
-if $hb_cv_have_solaris_atomic_ops; then
-
-$as_echo "#define HAVE_SOLARIS_ATOMIC_OPS 1" >>confdefs.h
-
-fi
-
-if test "$os_win32" = no && ! $have_pthread; then
-       for ac_header in sched.h
-do :
-  ac_fn_c_check_header_mongrel "$LINENO" "sched.h" "ac_cv_header_sched_h" "$ac_includes_default"
-if test "x$ac_cv_header_sched_h" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_SCHED_H 1
-_ACEOF
-
-fi
-
-done
-
-       { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing sched_yield" >&5
-$as_echo_n "checking for library containing sched_yield... " >&6; }
-if ${ac_cv_search_sched_yield+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_func_search_save_LIBS=$LIBS
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char sched_yield ();
-int
-main ()
-{
-return sched_yield ();
-  ;
-  return 0;
-}
-_ACEOF
-for ac_lib in '' rt; do
-  if test -z "$ac_lib"; then
-    ac_res="none required"
-  else
-    ac_res=-l$ac_lib
-    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
-  fi
-  if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_search_sched_yield=$ac_res
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext
-  if ${ac_cv_search_sched_yield+:} false; then :
-  break
-fi
-done
-if ${ac_cv_search_sched_yield+:} false; then :
-
-else
-  ac_cv_search_sched_yield=no
-fi
-rm conftest.$ac_ext
-LIBS=$ac_func_search_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_sched_yield" >&5
-$as_echo "$ac_cv_search_sched_yield" >&6; }
-ac_res=$ac_cv_search_sched_yield
-if test "$ac_res" != no; then :
-  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
-
-$as_echo "#define HAVE_SCHED_YIELD 1" >>confdefs.h
-
-fi
-
-fi
-
-
-ac_config_files="$ac_config_files Makefile src/Makefile src/harfbuzz-config.cmake util/Makefile test/Makefile test/api/Makefile test/fuzzing/Makefile test/shaping/Makefile test/shaping/data/Makefile test/shaping/data/aots/Makefile test/shaping/data/in-house/Makefile test/shaping/data/text-rendering-tests/Makefile test/subset/Makefile test/subset/data/Makefile docs/Makefile docs/version.xml"
+ac_config_files="$ac_config_files Makefile src/Makefile src/harfbuzz-config.cmake util/Makefile test/Makefile test/api/Makefile test/fuzzing/Makefile test/shape/Makefile test/shape/data/Makefile test/shape/data/aots/Makefile test/shape/data/in-house/Makefile test/shape/data/text-rendering-tests/Makefile test/subset/Makefile test/subset/data/Makefile test/subset/data/repack_tests/Makefile docs/Makefile docs/version.xml"
 
 
 cat >confcache <<\_ACEOF
@@ -22271,8 +22015,8 @@ if test -z "${HAVE_CAIRO_FT_TRUE}" && test -z "${HAVE_CAIRO_FT_FALSE}"; then
   as_fn_error $? "conditional \"HAVE_CAIRO_FT\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
-if test -z "${HAVE_FONTCONFIG_TRUE}" && test -z "${HAVE_FONTCONFIG_FALSE}"; then
-  as_fn_error $? "conditional \"HAVE_FONTCONFIG\" was never defined.
+if test -z "${HAVE_CHAFA_TRUE}" && test -z "${HAVE_CHAFA_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_CHAFA\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
 if test -z "${HAVE_ICU_TRUE}" && test -z "${HAVE_ICU_FALSE}"; then
@@ -22704,7 +22448,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by HarfBuzz $as_me 2.6.7, which was
+This file was extended by HarfBuzz $as_me 3.4.0, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -22771,7 +22515,7 @@ _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-HarfBuzz config.status 2.6.7
+HarfBuzz config.status 3.4.0
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
@@ -22942,7 +22686,6 @@ want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`'
 DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`'
 sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`'
 AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`'
-lt_ar_flags='`$ECHO "$lt_ar_flags" | $SED "$delay_single_quote_subst"`'
 AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`'
 archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`'
 STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`'
@@ -23125,6 +22868,7 @@ want_nocaseglob \
 DLLTOOL \
 sharedlib_from_linklib_cmd \
 AR \
+AR_FLAGS \
 archiver_list_spec \
 STRIP \
 RANLIB \
     "test/Makefile") CONFIG_FILES="$CONFIG_FILES test/Makefile" ;;
     "test/api/Makefile") CONFIG_FILES="$CONFIG_FILES test/api/Makefile" ;;
     "test/fuzzing/Makefile") CONFIG_FILES="$CONFIG_FILES test/fuzzing/Makefile" ;;
-    "test/shaping/Makefile") CONFIG_FILES="$CONFIG_FILES test/shaping/Makefile" ;;
-    "test/shaping/data/Makefile") CONFIG_FILES="$CONFIG_FILES test/shaping/data/Makefile" ;;
-    "test/shaping/data/aots/Makefile") CONFIG_FILES="$CONFIG_FILES test/shaping/data/aots/Makefile" ;;
-    "test/shaping/data/in-house/Makefile") CONFIG_FILES="$CONFIG_FILES test/shaping/data/in-house/Makefile" ;;
-    "test/shaping/data/text-rendering-tests/Makefile") CONFIG_FILES="$CONFIG_FILES test/shaping/data/text-rendering-tests/Makefile" ;;
+    "test/shape/Makefile") CONFIG_FILES="$CONFIG_FILES test/shape/Makefile" ;;
+    "test/shape/data/Makefile") CONFIG_FILES="$CONFIG_FILES test/shape/data/Makefile" ;;
+    "test/shape/data/aots/Makefile") CONFIG_FILES="$CONFIG_FILES test/shape/data/aots/Makefile" ;;
+    "test/shape/data/in-house/Makefile") CONFIG_FILES="$CONFIG_FILES test/shape/data/in-house/Makefile" ;;
+    "test/shape/data/text-rendering-tests/Makefile") CONFIG_FILES="$CONFIG_FILES test/shape/data/text-rendering-tests/Makefile" ;;
     "test/subset/Makefile") CONFIG_FILES="$CONFIG_FILES test/subset/Makefile" ;;
     "test/subset/data/Makefile") CONFIG_FILES="$CONFIG_FILES test/subset/data/Makefile" ;;
+    "test/subset/data/repack_tests/Makefile") CONFIG_FILES="$CONFIG_FILES test/subset/data/repack_tests/Makefile" ;;
     "docs/Makefile") CONFIG_FILES="$CONFIG_FILES docs/Makefile" ;;
     "docs/version.xml") CONFIG_FILES="$CONFIG_FILES docs/version.xml" ;;
 
@@ -23977,9 +23722,7 @@ $as_echo X/"$am_mf" |
     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
 as_fn_error $? "Something went wrong bootstrapping makefile fragments
-    for automatic dependency tracking.  If GNU make was not used, consider
-    re-running the configure script with MAKE=\"gmake\" (or whatever is
-    necessary).  You can also try re-running configure with the
+    for automatic dependency tracking.  Try re-running configure with the
     '--disable-dependency-tracking' option to at least be able to build
     the package (albeit without support for automatic dependency tracking).
 See \`config.log' for more details" "$LINENO" 5; }
@@ -24149,11 +23892,8 @@ sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd
 # The archiver.
 AR=$lt_AR
 
-# Flags to create an archive (by configure).
-lt_ar_flags=$lt_ar_flags
-
 # Flags to create an archive.
-AR_FLAGS=\${ARFLAGS-"\$lt_ar_flags"}
+AR_FLAGS=$lt_AR_FLAGS
 
 # How to feed a file listing to the archiver.
 archiver_list_spec=$lt_archiver_list_spec
@@ -24749,6 +24489,20 @@ echo
 
 { $as_echo "$as_me:${as_lineno-$LINENO}:
 
+Autotools is no longer our supported build system for building the library
+for *nix distributions, please migrate to meson.
+
+" >&5
+$as_echo "$as_me:
+
+Autotools is no longer our supported build system for building the library
+for *nix distributions, please migrate to meson.
+
+" >&6;}
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}:
+
 Build configuration:
 
 Unicode callbacks (you want at least one):
@@ -24761,9 +24515,9 @@ Font callbacks (the more the merrier):
 
 Tools used for command-line utilities:
        Cairo:                  ${have_cairo}
-       Fontconfig:             ${have_fontconfig}
+       Chafa:                  ${have_chafa}
 
-Additional shapers (the more the merrier):
+Additional shapers:
        Graphite2:              ${have_graphite2}
 
 Platform shapers (not normally needed):
@@ -24791,9 +24545,9 @@ Font callbacks (the more the merrier):
 
 Tools used for command-line utilities:
        Cairo:                  ${have_cairo}
-       Fontconfig:             ${have_fontconfig}
+       Chafa:                  ${have_chafa}
 
-Additional shapers (the more the merrier):
+Additional shapers:
        Graphite2:              ${have_graphite2}
 
 Platform shapers (not normally needed):
index 3af266b..24048cf 100644 (file)
@@ -1,6 +1,6 @@
 AC_PREREQ([2.64])
 AC_INIT([HarfBuzz],
-        [2.6.7],
+        [3.4.0],
         [https://github.com/harfbuzz/harfbuzz/issues/new],
         [harfbuzz],
         [http://harfbuzz.org/])
@@ -25,7 +25,7 @@ AM_PROG_CC_C_O
 AC_PROG_CXX
 AX_CXX_COMPILE_STDCXX(11)
 AC_SYS_LARGEFILE
-PKG_PROG_PKG_CONFIG([0.20])
+PKG_PROG_PKG_CONFIG([0.28])
 AM_MISSING_PROG([RAGEL], [ragel])
 AM_MISSING_PROG([GIT], [git])
 
@@ -46,16 +46,7 @@ AC_SUBST(HB_VERSION)
 # Libtool version
 m4_define([hb_version_int],
          m4_eval(hb_version_major*10000 + hb_version_minor*100 + hb_version_micro))
-m4_if(m4_eval(hb_version_minor % 2), [1],
-      dnl for unstable releases
-      [m4_define([hb_libtool_revision], 0)],
-      dnl for stable releases
-      [m4_define([hb_libtool_revision], hb_version_micro)])
-m4_define([hb_libtool_age],
-         m4_eval(hb_version_int - hb_libtool_revision))
-m4_define([hb_libtool_current],
-         m4_eval(hb_libtool_age))
-HB_LIBTOOL_VERSION_INFO=hb_libtool_current:hb_libtool_revision:hb_libtool_age
+HB_LIBTOOL_VERSION_INFO=hb_version_int:0:hb_version_int
 AC_SUBST(HB_LIBTOOL_VERSION_INFO)
 
 AC_ARG_WITH([libstdc++],
@@ -77,8 +68,8 @@ GTK_DOC_CHECK([1.15],[--flavour no-tmpl])
 ])
 
 # Functions and headers
-AC_CHECK_FUNCS(atexit mprotect sysconf getpagesize mmap isatty roundf)
-AC_CHECK_HEADERS(unistd.h sys/mman.h stdbool.h)
+AC_CHECK_FUNCS(atexit mprotect sysconf getpagesize mmap isatty newlocale uselocale)
+AC_CHECK_HEADERS(unistd.h sys/mman.h stdbool.h xlocale.h)
 
 # Compiler flags
 AC_CANONICAL_HOST
@@ -223,21 +214,21 @@ AM_CONDITIONAL(HAVE_CAIRO_FT, $have_cairo_ft)
 
 dnl ==========================================================================
 
-AC_ARG_WITH(fontconfig,
-       [AS_HELP_STRING([--with-fontconfig=@<:@yes/no/auto@:>@],
-                       [Use fontconfig @<:@default=auto@:>@])],,
-       [with_fontconfig=auto])
-have_fontconfig=false
-if test "x$with_fontconfig" = "xyes" -o "x$with_fontconfig" = "xauto"; then
-       PKG_CHECK_MODULES(FONTCONFIG, fontconfig, have_fontconfig=true, :)
+AC_ARG_WITH(chafa,
+       [AS_HELP_STRING([--with-chafa=@<:@yes/no/auto@:>@],
+                       [Use chafa @<:@default=auto@:>@])],,
+       [with_chafa=auto])
+have_chafa=false
+if test "x$with_chafa" = "xyes" -o "x$with_chafa" = "xauto"; then
+       PKG_CHECK_MODULES(CHAFA, chafa >= 1.6.0, have_chafa=true, :)
 fi
-if test "x$with_fontconfig" = "xyes" -a "x$have_fontconfig" != "xtrue"; then
-       AC_MSG_ERROR([fontconfig support requested but not found])
+if test "x$with_chafa" = "xyes" -a "x$have_chafa" != "xtrue"; then
+       AC_MSG_ERROR([chafa support requested but not found])
 fi
-if $have_fontconfig; then
-       AC_DEFINE(HAVE_FONTCONFIG, 1, [Have fontconfig library])
+if $have_chafa; then
+       AC_DEFINE(HAVE_CHAFA, 1, [Have chafa terminal graphics library])
 fi
-AM_CONDITIONAL(HAVE_FONTCONFIG, $have_fontconfig)
+AM_CONDITIONAL(HAVE_CHAFA, $have_chafa)
 
 dnl ==========================================================================
 
@@ -248,25 +239,6 @@ AC_ARG_WITH(icu,
 have_icu=false
 if test "x$with_icu" = "xyes" -o "x$with_icu" = "xbuiltin" -o "x$with_icu" = "xauto"; then
        PKG_CHECK_MODULES(ICU, icu-uc, have_icu=true, :)
-
-       dnl Fallback to icu-config if ICU pkg-config files could not be found
-       if test "$have_icu" != "true"; then
-               AC_CHECK_TOOL(ICU_CONFIG, icu-config, no)
-               AC_MSG_CHECKING([for ICU by using icu-config fallback])
-               if test "$ICU_CONFIG" != "no" && "$ICU_CONFIG" --version >/dev/null; then
-                       have_icu=true
-                       # We don't use --cflags as this gives us a lot of things that we don't
-                       # necessarily want, like debugging and optimization flags
-                       # See man (1) icu-config for more info.
-                       ICU_CFLAGS=`$ICU_CONFIG --cppflags`
-                       ICU_LIBS=`$ICU_CONFIG --ldflags-searchpath --ldflags-libsonly`
-                       AC_SUBST(ICU_CFLAGS)
-                       AC_SUBST(ICU_LIBS)
-                       AC_MSG_RESULT([yes])
-               else
-                       AC_MSG_RESULT([no])
-               fi
-       fi
 fi
 if test \( "x$with_icu" = "xyes" -o "x$with_icu" = "xbuiltin" \) -a "x$have_icu" != "xtrue"; then
        AC_MSG_ERROR([icu support requested but icu-uc not found])
@@ -445,45 +417,6 @@ AM_CONDITIONAL(HAVE_CORETEXT, $have_coretext)
 
 dnl ===========================================================================
 
-AC_CACHE_CHECK([for Intel atomic primitives], hb_cv_have_intel_atomic_primitives, [
-       hb_cv_have_intel_atomic_primitives=false
-       AC_TRY_LINK([
-               void memory_barrier (void) { __sync_synchronize (); }
-               int atomic_add (int *i) { return __sync_fetch_and_add (i, 1); }
-               int mutex_trylock (int *m) { return __sync_lock_test_and_set (m, 1); }
-               void mutex_unlock (int *m) { __sync_lock_release (m); }
-               ], [], hb_cv_have_intel_atomic_primitives=true
-       )
-])
-if $hb_cv_have_intel_atomic_primitives; then
-       AC_DEFINE(HAVE_INTEL_ATOMIC_PRIMITIVES, 1, [Have Intel __sync_* atomic primitives])
-fi
-
-dnl ===========================================================================
-
-AC_CACHE_CHECK([for Solaris atomic operations], hb_cv_have_solaris_atomic_ops, [
-       hb_cv_have_solaris_atomic_ops=false
-       AC_TRY_LINK([
-               #include <atomic.h>
-               /* This requires Solaris Studio 12.2 or newer: */
-               #include <mbarrier.h>
-               void memory_barrier (void) { __machine_rw_barrier (); }
-               int atomic_add (volatile unsigned *i) { return atomic_add_int_nv (i, 1); }
-               void *atomic_ptr_cmpxchg (volatile void **target, void *cmp, void *newval) { return atomic_cas_ptr (target, cmp, newval); }
-               ], [], hb_cv_have_solaris_atomic_ops=true
-       )
-])
-if $hb_cv_have_solaris_atomic_ops; then
-       AC_DEFINE(HAVE_SOLARIS_ATOMIC_OPS, 1, [Have Solaris __machine_*_barrier and atomic_* operations])
-fi
-
-if test "$os_win32" = no && ! $have_pthread; then
-       AC_CHECK_HEADERS(sched.h)
-       AC_SEARCH_LIBS(sched_yield,rt,AC_DEFINE(HAVE_SCHED_YIELD, 1, [Have sched_yield]))
-fi
-
-dnl ===========================================================================
-
 AC_CONFIG_FILES([
 Makefile
 src/Makefile
@@ -492,13 +425,14 @@ util/Makefile
 test/Makefile
 test/api/Makefile
 test/fuzzing/Makefile
-test/shaping/Makefile
-test/shaping/data/Makefile
-test/shaping/data/aots/Makefile
-test/shaping/data/in-house/Makefile
-test/shaping/data/text-rendering-tests/Makefile
+test/shape/Makefile
+test/shape/data/Makefile
+test/shape/data/aots/Makefile
+test/shape/data/in-house/Makefile
+test/shape/data/text-rendering-tests/Makefile
 test/subset/Makefile
 test/subset/data/Makefile
+test/subset/data/repack_tests/Makefile
 docs/Makefile
 docs/version.xml
 ])
@@ -512,6 +446,14 @@ echo
 
 AC_MSG_NOTICE([
 
+Autotools is no longer our supported build system for building the library
+for *nix distributions, please migrate to meson.
+
+])
+
+
+AC_MSG_NOTICE([
+
 Build configuration:
 
 Unicode callbacks (you want at least one):
@@ -524,9 +466,9 @@ Font callbacks (the more the merrier):
 
 Tools used for command-line utilities:
        Cairo:                  ${have_cairo}
-       Fontconfig:             ${have_fontconfig}
+       Chafa:                  ${have_chafa}
 
-Additional shapers (the more the merrier):
+Additional shapers:
        Graphite2:              ${have_graphite2}
 
 Platform shapers (not normally needed):
diff --git a/depcomp b/depcomp
index 6b39162..65cbf70 100755 (executable)
--- a/depcomp
+++ b/depcomp
@@ -3,7 +3,7 @@
 
 scriptversion=2018-03-07.03; # UTC
 
-# Copyright (C) 1999-2020 Free Software Foundation, Inc.
+# Copyright (C) 1999-2018 Free Software Foundation, Inc.
 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
index 44a9b66..c9d2e7b 100644 (file)
Binary files a/docs/HarfBuzz.png and b/docs/HarfBuzz.png differ
index 987feb5..36da8ae 100644 (file)
@@ -29,15 +29,12 @@ SCANGOBJ_OPTIONS=
 # Extra options to supply to gtkdoc-scan.
 # e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED"
 SCAN_OPTIONS=--rebuild-types --deprecated-guards="HB_DISABLE_DEPRECATED" \
-       --ignore-decorators="HB_EXTERN"
+       --ignore-decorators='HB_EXTERN|HB_DEPRECATED'
 
 # Header files or dirs to ignore when scanning. Use base file/dir names
 # e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h private_code
 IGNORE_HFILES=`cd $(top_srcdir)/src; find . -path './*/*.h' | sed 's@^.*/@@'`
-if HAVE_GOBJECT
-else
 IGNORE_HFILES+=hb-gobject.h hb-gobject-enums.h hb-gobject-structs.h
-endif
 
 # Extra options to supply to gtkdoc-mkdb.
 # e.g. MKDB_OPTIONS=--xml-mode --output-format=xml
@@ -86,7 +83,7 @@ content_files=        \
        usermanual-integration.xml \
        version.xml
 
-# SGML files where gtk-doc abbrevations (#GtkWidget) are expanded
+# SGML files where gtk-doc abbreviations (#GtkWidget) are expanded
 # These files must be listed here *and* in content_files
 # e.g. expand_content_files=running.sgml
 expand_content_files=
index 2df1092..8e0aeb2 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.16.2 from Makefile.am.
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2020 Free Software Foundation, Inc.
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -113,8 +113,7 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-@HAVE_GOBJECT_FALSE@am__append_1 = hb-gobject.h hb-gobject-enums.h hb-gobject-structs.h
-@HAVE_GOBJECT_TRUE@am__append_2 = $(top_builddir)/src/libharfbuzz-gobject.la
+@HAVE_GOBJECT_TRUE@am__append_1 = $(top_builddir)/src/libharfbuzz-gobject.la
 subdir = docs
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_link_flag.m4 \
@@ -169,6 +168,8 @@ CAIRO_LIBS = @CAIRO_LIBS@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
+CHAFA_CFLAGS = @CHAFA_CFLAGS@
+CHAFA_LIBS = @CHAFA_LIBS@
 CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
 CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
 CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
@@ -197,8 +198,6 @@ ECHO_T = @ECHO_T@
 EGREP = @EGREP@
 EXEEXT = @EXEEXT@
 FGREP = @FGREP@
-FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@
-FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
 FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
 FREETYPE_DEPS = @FREETYPE_DEPS@
 FREETYPE_LIBS = @FREETYPE_LIBS@
@@ -231,7 +230,6 @@ HB_VERSION_MICRO = @HB_VERSION_MICRO@
 HB_VERSION_MINOR = @HB_VERSION_MINOR@
 HTML_DIR = @HTML_DIR@
 ICU_CFLAGS = @ICU_CFLAGS@
-ICU_CONFIG = @ICU_CONFIG@
 ICU_LIBS = @ICU_LIBS@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
@@ -337,6 +335,7 @@ pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -375,13 +374,14 @@ SCANGOBJ_OPTIONS =
 # Extra options to supply to gtkdoc-scan.
 # e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED"
 SCAN_OPTIONS = --rebuild-types --deprecated-guards="HB_DISABLE_DEPRECATED" \
-       --ignore-decorators="HB_EXTERN"
+       --ignore-decorators='HB_EXTERN|HB_DEPRECATED'
 
 
 # Header files or dirs to ignore when scanning. Use base file/dir names
 # e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h private_code
 IGNORE_HFILES = `cd $(top_srcdir)/src; find . -path './*/*.h' | sed \
-       's@^.*/@@'` $(am__append_1)
+       's@^.*/@@'` hb-gobject.h hb-gobject-enums.h \
+       hb-gobject-structs.h
 
 # Extra options to supply to gtkdoc-mkdb.
 # e.g. MKDB_OPTIONS=--xml-mode --output-format=xml
@@ -432,7 +432,7 @@ content_files = \
        version.xml
 
 
-# SGML files where gtk-doc abbrevations (#GtkWidget) are expanded
+# SGML files where gtk-doc abbreviations (#GtkWidget) are expanded
 # These files must be listed here *and* in content_files
 # e.g. expand_content_files=running.sgml
 expand_content_files = 
@@ -443,7 +443,7 @@ expand_content_files =
 # e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS)
 # e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib)
 GTKDOC_CFLAGS = 
-GTKDOC_LIBS = $(top_builddir)/src/libharfbuzz.la $(am__append_2)
+GTKDOC_LIBS = $(top_builddir)/src/libharfbuzz.la $(am__append_1)
 @GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_CC = $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
 @GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_CC = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
 @GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_LD = $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS)
index 96965f4..d81b9fd 100644 (file)
@@ -11,8 +11,7 @@
       <title>HarfBuzz</title>
       <graphic fileref="HarfBuzz.png" format="PNG" align="center"/>
       <para>
-        HarfBuzz is an <ulink url="http://www.microsoft.com/typography/otspec/">OpenType</ulink>
-        text shaping engine. Using the HarfBuzz library allows
+        HarfBuzz is a text shaping library. Using the HarfBuzz library allows
        programs to convert a sequence of Unicode input into
        properly formatted and positioned glyph output&mdash;for any writing
        system and language.
@@ -27,7 +26,7 @@
     </abstract>
   </bookinfo>
 
-  <part>
+  <part id="user-manual">
     <title>User's manual</title>
       <xi:include href="usermanual-what-is-harfbuzz.xml"/>
       <xi:include href="usermanual-install-harfbuzz.xml"/>
@@ -42,7 +41,7 @@
       <xi:include href="usermanual-integration.xml"/>
   </part>
 
-  <part>
+  <part id="reference-manual">
     <partinfo>
       <releaseinfo>
         This document is for HarfBuzz &version;.
       </releaseinfo>
     </partinfo>
 
-    <note>
-      <para>
-        The current HarfBuzz codebase is versioned 2.x.x and is stable
-       and under active maintenance. This is what is used in latest
-       versions of Firefox, GNOME, ChromeOS, Chrome, LibreOffice,
-       XeTeX, Android, and KDE, among other places. 
-      </para>
-      <para>
-        Prior to 2012, the original HarfBuzz codebase (which, these
-       days, is referred to as <emphasis>harfbuzz-old</emphasis>) was 
-        derived from code in <ulink
-       url="http://freetype.org/">FreeType</ulink>, <ulink
-       url="http://pango.org/">Pango</ulink>, and 
-        <ulink url="http://qt-project.org/">Qt</ulink>.
-        It is <emphasis>not</emphasis> actively developed or
-       maintained, and is extremely buggy. All users of harfbuzz-old
-       are encouraged to switch over to the new HarfBuzz as soon as possible.
-      </para>
-      <para>
-       To make this distinction clearer in discussions, the current
-       HarfBuzz codebase is sometimes referred to as
-       <emphasis>harfbuzz-ng</emphasis>.
-      </para>
-      <para>
-       For reference purposes, the harfbuzz-old source tree is archived 
-        <ulink
-           url="http://cgit.freedesktop.org/harfbuzz.old/">here</ulink>. There
-       are no release tarballs of harfbuzz-old whatsoever.
-      </para>
-    </note>
-      
     <title>Reference manual</title>
-      <chapter>
+      <chapter id="core-api">
         <title>Core API</title>
         <xi:include href="xml/hb-blob.xml"/>
         <xi:include href="xml/hb-buffer.xml"/>
         <xi:include href="xml/hb-version.xml"/>
       </chapter>
 
-      <chapter>
+      <chapter id="opentype-api">
         <title>OpenType API</title>
         <xi:include href="xml/hb-ot-color.xml"/>
         <xi:include href="xml/hb-ot-font.xml"/>
         <xi:include href="xml/hb-ot-layout.xml"/>
         <xi:include href="xml/hb-ot-math.xml"/>
+        <xi:include href="xml/hb-ot-meta.xml"/>
+        <xi:include href="xml/hb-ot-metrics.xml"/>
         <xi:include href="xml/hb-ot-name.xml"/>
         <xi:include href="xml/hb-ot-shape.xml"/>
         <xi:include href="xml/hb-ot-var.xml"/>
       </chapter>
 
-      <chapter>
+      <chapter id="apple-advanced-typography-api">
         <title>Apple Advanced Typography API</title>
         <xi:include href="xml/hb-aat-layout.xml"/>
       </chapter>
 
-      <chapter>
+      <chapter id="integration-api">
         <title>Integration API</title>
         <xi:include href="xml/hb-coretext.xml"/>
         <xi:include href="xml/hb-ft.xml"/>
         <xi:include href="xml/hb-glib.xml"/>
-        <xi:include href="xml/hb-gobject.xml"/>
         <xi:include href="xml/hb-graphite2.xml"/>
         <xi:include href="xml/hb-icu.xml"/>
         <xi:include href="xml/hb-uniscribe.xml"/>
+        <xi:include href="xml/hb-gdi.xml"/>
+        <xi:include href="xml/hb-directwrite.xml"/>
       </chapter>
 
+      <chapter id="style-api">
+        <title>Style API</title>
+        <xi:include href="xml/hb-style.xml"/>
+      </chapter>
+
+      <chapter id="subset-api">
+        <title>Subset API</title>
+        <xi:include href="xml/hb-subset.xml"/>
+      </chapter>
+
+
       <!--chapter id="object-tree">
         <title>Object Hierarchy</title>
          <xi:include href="xml/tree_index.sgml"/>
       <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-3-4-0" role="3.4.0"><title>Index of new symbols in 3.4.0</title><xi:include href="xml/api-index-3.4.0.xml"><xi:fallback /></xi:include></index>
+      <index id="api-index-3-3-0" role="3.3.0"><title>Index of new symbols in 3.3.0</title><xi:include href="xml/api-index-3.3.0.xml"><xi:fallback /></xi:include></index>
+      <index id="api-index-3-1-0" role="3.1.0"><title>Index of new symbols in 3.1.0</title><xi:include href="xml/api-index-3.1.0.xml"><xi:fallback /></xi:include></index>
+      <index id="api-index-3-0-0" role="3.0.0"><title>Index of new symbols in 3.0.0</title><xi:include href="xml/api-index-3.0.0.xml"><xi:fallback /></xi:include></index>
+      <index id="api-index-2-9-1" role="2.9.1"><title>Index of new symbols in 2.9.1</title><xi:include href="xml/api-index-2.9.1.xml"><xi:fallback /></xi:include></index>
+      <index id="api-index-2-9-0" role="2.9.0"><title>Index of new symbols in 2.9.0</title><xi:include href="xml/api-index-2.9.0.xml"><xi:fallback /></xi:include></index>
+      <index id="api-index-2-8-2" role="2.8.2"><title>Index of new symbols in 2.8.2</title><xi:include href="xml/api-index-2.8.2.xml"><xi:fallback /></xi:include></index>
+      <index id="api-index-2-7-3" role="2.7.3"><title>Index of new symbols in 2.7.3</title><xi:include href="xml/api-index-2.7.3.xml"><xi:fallback /></xi:include></index>
+      <index id="api-index-2-6-8" role="2.6.8"><title>Index of new symbols in 2.6.8</title><xi:include href="xml/api-index-2.6.8.xml"><xi:fallback /></xi:include></index>
+      <index id="api-index-2-6-5" role="2.6.5"><title>Index of new symbols in 2.6.5</title><xi:include href="xml/api-index-2.6.5.xml"><xi:fallback /></xi:include></index>
+      <index id="api-index-2-6-3" role="2.6.3"><title>Index of new symbols in 2.6.3</title><xi:include href="xml/api-index-2.6.3.xml"><xi:fallback /></xi:include></index>
       <index id="api-index-2-6-0" role="2.6.0"><title>Index of new symbols in 2.6.0</title><xi:include href="xml/api-index-2.6.0.xml"><xi:fallback /></xi:include></index>
       <index id="api-index-2-5-0" role="2.5.0"><title>Index of new symbols in 2.5.0</title><xi:include href="xml/api-index-2.5.0.xml"><xi:fallback /></xi:include></index>
       <index id="api-index-2-4-0" role="2.4.0"><title>Index of new symbols in 2.4.0</title><xi:include href="xml/api-index-2.4.0.xml"><xi:fallback /></xi:include></index>
       <index id="api-index-1-8-0" role="1.8.0"><title>Index of new symbols in 1.8.0</title><xi:include href="xml/api-index-1.8.0.xml"><xi:fallback /></xi:include></index>
       <index id="api-index-1-7-7" role="1.7.7"><title>Index of new symbols in 1.7.7</title><xi:include href="xml/api-index-1.7.7.xml"><xi:fallback /></xi:include></index>
       <index id="api-index-1-7-5" role="1.7.5"><title>Index of new symbols in 1.7.5</title><xi:include href="xml/api-index-1.7.5.xml"><xi:fallback /></xi:include></index>
+      <index id="api-index-1-7-2" role="1.7.2"><title>Index of new symbols in 1.7.2</title><xi:include href="xml/api-index-1.7.2.xml"><xi:fallback /></xi:include></index>
       <index id="api-index-1-6-0" role="1.6.0"><title>Index of new symbols in 1.6.0</title><xi:include href="xml/api-index-1.6.0.xml"><xi:fallback /></xi:include></index>
       <index id="api-index-1-5-0" role="1.5.0"><title>Index of new symbols in 1.5.0</title><xi:include href="xml/api-index-1.5.0.xml"><xi:fallback /></xi:include></index>
       <index id="api-index-1-4-3" role="1.4.3"><title>Index of new symbols in 1.4.3</title><xi:include href="xml/api-index-1.4.3.xml"><xi:fallback /></xi:include></index>
       <index id="api-index-1-4-2" role="1.4.2"><title>Index of new symbols in 1.4.2</title><xi:include href="xml/api-index-1.4.2.xml"><xi:fallback /></xi:include></index>
+      <index id="api-index-1-4-0" role="1.4.0"><title>Index of new symbols in 1.4.0</title><xi:include href="xml/api-index-1.4.0.xml"><xi:fallback /></xi:include></index>
       <index id="api-index-1-3-3" role="1.3.3"><title>Index of new symbols in 1.3.3</title><xi:include href="xml/api-index-1.3.3.xml"><xi:fallback /></xi:include></index>
       <index id="api-index-1-2-3" role="1.2.3"><title>Index of new symbols in 1.2.3</title><xi:include href="xml/api-index-1.2.3.xml"><xi:fallback /></xi:include></index>
       <index id="api-index-1-1-3" role="1.1.3"><title>Index of new symbols in 1.1.3</title><xi:include href="xml/api-index-1.1.3.xml"><xi:fallback /></xi:include></index>
       <index id="api-index-0-9-41" role="0.9.41"><title>Index of new symbols in 0.9.41</title><xi:include href="xml/api-index-0.9.41.xml"><xi:fallback /></xi:include></index>
       <index id="api-index-0-9-39" role="0.9.39"><title>Index of new symbols in 0.9.39</title><xi:include href="xml/api-index-0.9.39.xml"><xi:fallback /></xi:include></index>
       <index id="api-index-0-9-38" role="0.9.38"><title>Index of new symbols in 0.9.38</title><xi:include href="xml/api-index-0.9.38.xml"><xi:fallback /></xi:include></index>
+      <index id="api-index-0-9-33" role="0.9.33"><title>Index of new symbols in 0.9.33</title><xi:include href="xml/api-index-0.9.33.xml"><xi:fallback /></xi:include></index>
       <index id="api-index-0-9-31" role="0.9.31"><title>Index of new symbols in 0.9.31</title><xi:include href="xml/api-index-0.9.31.xml"><xi:fallback /></xi:include></index>
       <index id="api-index-0-9-30" role="0.9.30"><title>Index of new symbols in 0.9.30</title><xi:include href="xml/api-index-0.9.30.xml"><xi:fallback /></xi:include></index>
       <index id="api-index-0-9-28" role="0.9.28"><title>Index of new symbols in 0.9.28</title><xi:include href="xml/api-index-0.9.28.xml"><xi:fallback /></xi:include></index>
+      <index id="api-index-0-9-26" role="0.9.26"><title>Index of new symbols in 0.9.26</title><xi:include href="xml/api-index-0.9.26.xml"><xi:fallback /></xi:include></index>
       <index id="api-index-0-9-22" role="0.9.22"><title>Index of new symbols in 0.9.22</title><xi:include href="xml/api-index-0.9.22.xml"><xi:fallback /></xi:include></index>
+      <index id="api-index-0-9-21" role="0.9.21"><title>Index of new symbols in 0.9.21</title><xi:include href="xml/api-index-0.9.21.xml"><xi:fallback /></xi:include></index>
       <index id="api-index-0-9-20" role="0.9.20"><title>Index of new symbols in 0.9.20</title><xi:include href="xml/api-index-0.9.20.xml"><xi:fallback /></xi:include></index>
       <index id="api-index-0-9-11" role="0.9.11"><title>Index of new symbols in 0.9.11</title><xi:include href="xml/api-index-0.9.11.xml"><xi:fallback /></xi:include></index>
       <index id="api-index-0-9-10" role="0.9.10"><title>Index of new symbols in 0.9.10</title><xi:include href="xml/api-index-0.9.10.xml"><xi:fallback /></xi:include></index>
       <index id="api-index-0-9-7" role="0.9.7"><title>Index of new symbols in 0.9.7</title><xi:include href="xml/api-index-0.9.7.xml"><xi:fallback /></xi:include></index>
       <index id="api-index-0-9-5" role="0.9.5"><title>Index of new symbols in 0.9.5</title><xi:include href="xml/api-index-0.9.5.xml"><xi:fallback /></xi:include></index>
       <index id="api-index-0-9-2" role="0.9.2"><title>Index of new symbols in 0.9.2</title><xi:include href="xml/api-index-0.9.2.xml"><xi:fallback /></xi:include></index>
+      <index id="api-index-0-6-0" role="0.6.0"><title>Index of new symbols in 0.6.0</title><xi:include href="xml/api-index-0.6.0.xml"><xi:fallback /></xi:include></index>
 
       <xi:include href="xml/annotation-glossary.xml"><xi:fallback /></xi:include>
   </part>
+
+  <note>
+    <para>
+      The current HarfBuzz codebase is versioned 2.x.x and is stable
+      and under active maintenance. This is what is used in latest
+      versions of Firefox, GNOME, ChromeOS, Chrome, LibreOffice,
+      XeTeX, Android, and KDE, among other places.
+    </para>
+    <para>
+      Prior to 2012, the original HarfBuzz codebase (which, these days, is
+      referred to as <emphasis>harfbuzz-old</emphasis>) was derived from code
+      in <ulink url="http://freetype.org/">FreeType</ulink>,
+      <ulink url="http://pango.org/">Pango</ulink>, and
+      <ulink url="http://qt-project.org/">Qt</ulink>.
+      It is <emphasis>not</emphasis> actively developed or  maintained, and is
+      extremely buggy. All users of harfbuzz-old are encouraged to switch over
+      to the new HarfBuzz as soon as possible.
+    </para>
+    <para>
+      To make this distinction clearer in discussions, the current HarfBuzz
+      codebase is sometimes referred to as <emphasis>harfbuzz-ng</emphasis>.
+    </para>
+    <para>
+      For reference purposes, the harfbuzz-old source tree is archived
+      <ulink url="http://cgit.freedesktop.org/harfbuzz.old/">here</ulink>.
+      There are no release tarballs of harfbuzz-old whatsoever.
+    </para>
+  </note>
+
 </book>
index bcad37a..8f21edf 100644 (file)
@@ -21,7 +21,9 @@ hb_aat_layout_has_tracking
 <SECTION>
 <FILE>hb-blob</FILE>
 hb_blob_create
+hb_blob_create_or_fail
 hb_blob_create_from_file
+hb_blob_create_from_file_or_fail
 hb_blob_create_sub_blob
 hb_blob_copy_writable_or_fail
 hb_blob_destroy
@@ -43,6 +45,7 @@ hb_memory_mode_t
 HB_SEGMENT_PROPERTIES_DEFAULT
 HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT
 hb_buffer_create
+hb_buffer_create_similar
 hb_buffer_reference
 hb_buffer_get_empty
 hb_buffer_destroy
@@ -80,21 +83,28 @@ hb_buffer_set_user_data
 hb_buffer_get_user_data
 hb_buffer_get_glyph_infos
 hb_buffer_get_glyph_positions
+hb_buffer_has_positions
 hb_buffer_get_invisible_glyph
 hb_buffer_set_invisible_glyph
+hb_buffer_get_not_found_glyph
+hb_buffer_set_not_found_glyph
 hb_buffer_set_replacement_codepoint
 hb_buffer_get_replacement_codepoint
 hb_buffer_normalize_glyphs
 hb_buffer_reverse
 hb_buffer_reverse_range
 hb_buffer_reverse_clusters
+hb_buffer_serialize
 hb_buffer_serialize_glyphs
 hb_buffer_deserialize_glyphs
+hb_buffer_serialize_unicode
+hb_buffer_deserialize_unicode
 hb_buffer_serialize_format_from_string
 hb_buffer_serialize_format_to_string
 hb_buffer_serialize_list_formats
 hb_segment_properties_equal
 hb_segment_properties_hash
+hb_segment_properties_overlay
 hb_buffer_diff
 hb_buffer_set_message_func
 hb_buffer_t
@@ -141,7 +151,6 @@ hb_position_t
 hb_tag_t
 hb_script_t
 hb_user_data_key_t
-hb_var_int_t
 HB_TAG
 HB_TAG_NONE
 HB_TAG_MAX
@@ -159,6 +168,7 @@ HB_FEATURE_GLOBAL_START
 <SUBSECTION Private>
 HB_BEGIN_DECLS
 HB_END_DECLS
+hb_var_int_t
 int16_t
 int32_t
 int64_t
@@ -181,6 +191,7 @@ HB_SCRIPT_CANADIAN_ABORIGINAL
 hb_font_funcs_set_glyph_func
 hb_font_get_glyph_func_t
 HB_MATH_GLYPH_PART_FLAG_EXTENDER
+HB_OT_MATH_SCRIPT
 hb_ot_layout_table_choose_script
 hb_ot_layout_table_find_script
 hb_ot_tag_from_language
@@ -189,7 +200,6 @@ HB_OT_VAR_NO_AXIS_INDEX
 hb_ot_var_axis_t
 hb_ot_var_find_axis
 hb_ot_var_get_axes
-hb_set_invert
 hb_unicode_eastasian_width_func_t
 hb_unicode_eastasian_width
 hb_unicode_funcs_set_eastasian_width_func
@@ -322,6 +332,7 @@ hb_font_get_parent
 hb_font_get_ppem
 hb_font_get_ptem
 hb_font_get_scale
+hb_font_get_synthetic_slant
 hb_font_get_user_data
 hb_font_get_variation_glyph
 hb_font_get_variation_glyph_func_t
@@ -339,6 +350,7 @@ hb_font_set_parent
 hb_font_set_ppem
 hb_font_set_ptem
 hb_font_set_scale
+hb_font_set_synthetic_slant
 hb_font_set_user_data
 hb_font_set_variations
 hb_font_set_var_coords_design
@@ -355,6 +367,11 @@ hb_font_get_font_h_extents_func_t
 hb_font_get_font_v_extents_func_t
 hb_font_get_h_extents
 hb_font_get_v_extents
+hb_font_extents_t
+hb_glyph_extents_t
+<SUBSECTION Private>
+hb_font_get_var_coords_design
+hb_font_draw_glyph
 </SECTION>
 
 <SECTION>
@@ -387,78 +404,6 @@ hb_glib_blob_create
 </SECTION>
 
 <SECTION>
-<FILE>hb-gobject</FILE>
-HB_GOBJECT_TYPE_BLOB
-HB_GOBJECT_TYPE_BUFFER
-HB_GOBJECT_TYPE_BUFFER_CONTENT_TYPE
-HB_GOBJECT_TYPE_BUFFER_DIFF_FLAGS
-HB_GOBJECT_TYPE_BUFFER_FLAGS
-HB_GOBJECT_TYPE_BUFFER_SERIALIZE_FLAGS
-HB_GOBJECT_TYPE_BUFFER_SERIALIZE_FORMAT
-HB_GOBJECT_TYPE_DIRECTION
-HB_GOBJECT_TYPE_FACE
-HB_GOBJECT_TYPE_FONT
-HB_GOBJECT_TYPE_FONT_FUNCS
-HB_GOBJECT_TYPE_GLYPH_FLAGS
-HB_GOBJECT_TYPE_MAP
-HB_GOBJECT_TYPE_MEMORY_MODE
-HB_GOBJECT_TYPE_OT_COLOR_PALETTE_FLAGS
-HB_GOBJECT_TYPE_OT_LAYOUT_GLYPH_CLASS
-HB_GOBJECT_TYPE_OT_MATH_CONSTANT
-HB_GOBJECT_TYPE_OT_MATH_GLYPH_PART
-HB_GOBJECT_TYPE_OT_MATH_GLYPH_PART_FLAGS
-HB_GOBJECT_TYPE_OT_MATH_GLYPH_VARIANT
-HB_GOBJECT_TYPE_OT_MATH_KERN
-HB_GOBJECT_TYPE_SCRIPT
-HB_GOBJECT_TYPE_SHAPE_PLAN
-HB_GOBJECT_TYPE_UNICODE_COMBINING_CLASS
-HB_GOBJECT_TYPE_UNICODE_FUNCS
-HB_GOBJECT_TYPE_UNICODE_GENERAL_CATEGORY
-HB_GOBJECT_TYPE_BUFFER_CLUSTER_LEVEL
-HB_GOBJECT_TYPE_FEATURE
-HB_GOBJECT_TYPE_GLYPH_INFO
-HB_GOBJECT_TYPE_GLYPH_POSITION
-HB_GOBJECT_TYPE_SEGMENT_PROPERTIES
-HB_GOBJECT_TYPE_SET
-HB_GOBJECT_TYPE_USER_DATA_KEY
-hb_gobject_blob_get_type
-hb_gobject_buffer_content_type_get_type
-hb_gobject_buffer_diff_flags_get_type
-hb_gobject_buffer_flags_get_type
-hb_gobject_buffer_get_type
-hb_gobject_buffer_serialize_flags_get_type
-hb_gobject_buffer_serialize_format_get_type
-hb_gobject_direction_get_type
-hb_gobject_face_get_type
-hb_gobject_font_funcs_get_type
-hb_gobject_font_get_type
-hb_gobject_glyph_flags_get_type
-hb_gobject_map_get_type
-hb_gobject_memory_mode_get_type
-hb_gobject_ot_color_palette_flags_get_type
-hb_gobject_ot_layout_glyph_class_get_type
-hb_gobject_ot_math_constant_get_type
-hb_gobject_ot_math_glyph_part_get_type
-hb_gobject_ot_math_glyph_part_flags_get_type
-hb_gobject_ot_math_glyph_variant_get_type
-hb_gobject_ot_math_kern_get_type
-hb_gobject_script_get_type
-hb_gobject_shape_plan_get_type
-hb_gobject_unicode_combining_class_get_type
-hb_gobject_unicode_funcs_get_type
-hb_gobject_unicode_general_category_get_type
-hb_gobject_buffer_cluster_level_get_type
-hb_gobject_feature_get_type
-hb_gobject_glyph_info_get_type
-hb_gobject_glyph_position_get_type
-hb_gobject_segment_properties_get_type
-hb_gobject_set_get_type
-hb_gobject_user_data_key_get_type
-<SUBSECTION Private>
-HB_GOBJECT_H_IN
-</SECTION>
-
-<SECTION>
 <FILE>hb-graphite2</FILE>
 HB_GRAPHITE2_TAG_SILF
 hb_graphite2_face_get_gr_face
@@ -552,8 +497,6 @@ HB_OT_TAG_GPOS
 HB_OT_TAG_GSUB
 HB_OT_TAG_JSTF
 hb_ot_layout_baseline_tag_t
-hb_ot_layout_closure_lookups
-hb_ot_layout_closure_features
 hb_ot_layout_collect_lookups
 hb_ot_layout_collect_features
 hb_ot_layout_feature_get_characters
@@ -567,7 +510,6 @@ hb_ot_layout_get_glyphs_in_class
 hb_ot_layout_get_ligature_carets
 hb_ot_layout_get_size_params
 hb_ot_layout_glyph_class_t
-hb_ot_layout_glyph_sequence_func_t
 hb_ot_layout_has_glyph_classes
 hb_ot_layout_has_positioning
 hb_ot_layout_has_substitution
@@ -576,6 +518,7 @@ hb_ot_layout_language_get_feature_indexes
 hb_ot_layout_language_get_feature_tags
 hb_ot_layout_language_get_required_feature
 hb_ot_layout_lookup_collect_glyphs
+hb_ot_layout_lookup_get_glyph_alternates
 hb_ot_layout_lookup_substitute_closure
 hb_ot_layout_lookups_substitute_closure
 hb_ot_layout_lookup_would_substitute
@@ -593,14 +536,17 @@ hb_ot_layout_language_get_required_feature_index
 Xhb_ot_layout_lookup_enumerate_sequences
 Xhb_ot_layout_lookup_position
 Xhb_ot_layout_lookup_substitute
+hb_ot_layout_glyph_sequence_t
+hb_ot_layout_glyph_sequence_func_t
 </SECTION>
 
 <SECTION>
 <FILE>hb-ot-math</FILE>
 HB_OT_TAG_MATH
-HB_OT_MATH_SCRIPT
+HB_OT_TAG_MATH_SCRIPT
 hb_ot_math_constant_t
 hb_ot_math_kern_t
+hb_ot_math_kern_entry_t
 hb_ot_math_glyph_variant_t
 hb_ot_math_glyph_part_flags_t
 hb_ot_math_glyph_part_t
@@ -609,6 +555,7 @@ hb_ot_math_get_constant
 hb_ot_math_get_glyph_italics_correction
 hb_ot_math_get_glyph_top_accent_attachment
 hb_ot_math_get_glyph_kerning
+hb_ot_math_get_glyph_kernings
 hb_ot_math_is_glyph_extended_shape
 hb_ot_math_get_glyph_variants
 hb_ot_math_get_min_connector_overlap
@@ -663,6 +610,7 @@ HB_SET_VALUE_INVALID
 hb_set_add
 hb_set_add_range
 hb_set_allocation_successful
+hb_set_copy
 hb_set_clear
 hb_set_create
 hb_set_del
@@ -675,6 +623,7 @@ hb_set_get_population
 hb_set_get_user_data
 hb_set_has
 hb_set_intersect
+hb_set_invert
 hb_set_is_empty
 hb_set_is_equal
 hb_set_is_subset
@@ -767,3 +716,27 @@ hb_version
 hb_version_atleast
 hb_version_string
 </SECTION>
+
+<SECTION>
+<FILE>hb-style</FILE>
+hb_style_tag_t
+hb_style_get_value
+</SECTION>
+
+<SECTION>
+<FILE>hb-subset</FILE>
+hb_subset_flags_t
+hb_subset_input_t
+hb_subset_sets_t
+hb_subset_input_create_or_fail
+hb_subset_input_reference
+hb_subset_input_destroy
+hb_subset_input_set_user_data
+hb_subset_input_get_user_data
+hb_subset_input_get_flags
+hb_subset_input_set_flags
+hb_subset_input_unicode_set
+hb_subset_input_glyph_set
+hb_subset_input_set
+hb_subset_or_fail
+</SECTION>
index 44a9b66..c9d2e7b 100644 (file)
Binary files a/docs/html/HarfBuzz.png and b/docs/html/HarfBuzz.png differ
index 6a28e03..7fcc6f8 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>A clustering example for levels 0 and 1: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="clusters.html" title="Clusters">
 <link rel="prev" href="working-with-harfbuzz-clusters.html" title="Working with HarfBuzz clusters">
 <link rel="next" href="reordering-in-levels-0-and-1.html" title="Reordering in levels 0 and 1">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/html/a-simple-shaping-example.html b/docs/html/a-simple-shaping-example.html
new file mode 100644 (file)
index 0000000..ba96d0e
--- /dev/null
@@ -0,0 +1,104 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>A simple shaping example: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="getting-started.html" title="Getting started with HarfBuzz">
+<link rel="prev" href="terminology.html" title="Terminology">
+<link rel="next" href="shaping-concepts.html" title="Shaping concepts">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="getting-started.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="terminology.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="shaping-concepts.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="a-simple-shaping-example"></a>A simple shaping example</h2></div></div></div>
+<p>
+      Below is the simplest HarfBuzz shaping example possible.
+    </p>
+<div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><p>
+          Create a buffer and put your text in it.
+       </p></li></ol></div>
+<pre class="programlisting">
+      #include &lt;hb.h&gt;
+
+      hb_buffer_t *buf;
+      buf = hb_buffer_create();
+      hb_buffer_add_utf8(buf, text, -1, 0, -1);
+    </pre>
+<div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem" value="2"><p>
+          Set the script, language and direction of the buffer.
+       </p></li></ol></div>
+<pre class="programlisting">
+      hb_buffer_set_direction(buf, HB_DIRECTION_LTR);
+      hb_buffer_set_script(buf, HB_SCRIPT_LATIN);
+      hb_buffer_set_language(buf, hb_language_from_string("en", -1));
+    </pre>
+<div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem" value="3"><p>
+          Create a face and a font from a font file.
+       </p></li></ol></div>
+<pre class="programlisting">
+      hb_blob_t *blob = hb_blob_create_from_file(filename); /* or hb_blob_create_from_file_or_fail() */
+      hb_face_t *face = hb_face_create(blob, 0);
+      hb_font_t *font = hb_font_create(face);
+    </pre>
+<div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem" value="4"><p>
+          Shape!
+       </p></li></ol></div>
+<pre class="programlisting">
+      hb_shape(font, buf, NULL, 0);
+    </pre>
+<div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem" value="5"><p>
+          Get the glyph and position information.
+       </p></li></ol></div>
+<pre class="programlisting">
+      unsigned int glyph_count;
+      hb_glyph_info_t *glyph_info    = hb_buffer_get_glyph_infos(buf, &amp;glyph_count);
+      hb_glyph_position_t *glyph_pos = hb_buffer_get_glyph_positions(buf, &amp;glyph_count);
+    </pre>
+<div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem" value="6"><p>
+          Iterate over each glyph.
+       </p></li></ol></div>
+<pre class="programlisting">
+      hb_position_t cursor_x = 0;
+      hb_position_t cursor_y = 0;
+      for (unsigned int i = 0; i &lt; glyph_count; i++) {
+          hb_codepoint_t glyphid  = glyph_info[i].codepoint;
+          hb_position_t x_offset  = glyph_pos[i].x_offset;
+          hb_position_t y_offset  = glyph_pos[i].y_offset;
+          hb_position_t x_advance = glyph_pos[i].x_advance;
+          hb_position_t y_advance = glyph_pos[i].y_advance;
+       /* draw_glyph(glyphid, cursor_x + x_offset, cursor_y + y_offset); */
+          cursor_x += x_advance;
+          cursor_y += y_advance;
+      }
+    </pre>
+<div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem" value="7"><p>
+          Tidy up.
+       </p></li></ol></div>
+<pre class="programlisting">
+      hb_buffer_destroy(buf);
+      hb_font_destroy(font);
+      hb_face_destroy(face);
+      hb_blob_destroy(blob);
+    </pre>
+<p>
+      This example shows enough to get us started using HarfBuzz. In
+      the sections that follow, we will use the remainder of
+      HarfBuzz's API to refine and extend the example and improve its
+      text-shaping capabilities.
+    </p>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
index 165567d..ead4cd7 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>AAT shaping: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="shaping-concepts.html" title="Shaping concepts">
 <link rel="prev" href="graphite-shaping.html" title="Graphite shaping">
 <link rel="next" href="object-model.html" title="The HarfBuzz object model">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -40,6 +40,6 @@
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index 72fcd2e..dfc5b7c 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Adding text to the buffer: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="buffers-language-script-and-direction.html" title="Buffers, language, script and direction">
 <link rel="prev" href="buffers-language-script-and-direction.html" title="Buffers, language, script and direction">
 <link rel="next" href="setting-buffer-properties.html" title="Setting buffer properties">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
       determine which glyph to return.
     </p>
 <p>
-      The safest approach is to add all of the text available, then
-      use <em class="parameter"><code>item_offset</code></em> and
+      The safest approach is to add all of the text available (even
+      if your text contains a mix of scripts, directions, languages
+      and fonts), then use <em class="parameter"><code>item_offset</code></em> and
       <em class="parameter"><code>item_length</code></em> to indicate which characters you
-      want shaped, so that HarfBuzz has access to any context.
+      want shaped (which must all have the same script, direction,
+      language and font), so that HarfBuzz has access to any context.
     </p>
 <p>
       You can also add Unicode code points directly with
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index a4b2b16..ccdfc03 100644 (file)
@@ -3,11 +3,11 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Annotation Glossary: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="pt02.html" title="Part II. Reference manual">
-<link rel="prev" href="api-index-0-9-2.html" title="Index of new symbols in 0.9.2">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-0-6-0.html" title="Index of new symbols in 0.6.0">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
                      <span class="dim">|</span> 
                   <a class="shortcut" href="#glsT">T</a></span></td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
-<td><a accesskey="p" href="api-index-0-9-2.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-0-6-0.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
 <td><img src="right-insensitive.png" width="16" height="16" border="0"></td>
 </tr></table>
 <div class="glossary">
 <div class="titlepage"><div><div><h2 class="title">
 <a name="annotation-glossary"></a>Annotation Glossary</h2></div></div></div>
 <a name="glsA"></a><h3 class="title">A</h3>
-<dt><span class="glossterm"><a name="annotation-glossterm-allow-none"></a>allow-none</span></dt>
-<dd class="glossdef"><p>NULL is OK, both for passing and for returning.</p></dd>
 <dt><span class="glossterm"><a name="annotation-glossterm-array"></a>array</span></dt>
 <dd class="glossdef"><p>Parameter points to an array of items.</p></dd>
 <a name="glsC"></a><h3 class="title">C</h3>
@@ -52,8 +50,6 @@
 <dt><span class="glossterm"><a name="annotation-glossterm-element-type"></a>element-type</span></dt>
 <dd class="glossdef"><p>Generics and defining elements of containers and arrays.</p></dd>
 <a name="glsI"></a><h3 class="title">I</h3>
-<dt><span class="glossterm"><a name="annotation-glossterm-in"></a>in</span></dt>
-<dd class="glossdef"><p>Parameter for input. Default is <acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>.</p></dd>
 <dt><span class="glossterm"><a name="annotation-glossterm-inout"></a>inout</span></dt>
 <dd class="glossdef"><p>Parameter for input and for returning results. Default is <acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>.</p></dd>
 <a name="glsN"></a><h3 class="title">N</h3>
@@ -78,6 +74,6 @@
 <dd class="glossdef"><p>Don't free data after the code is done.</p></dd>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/html/api-index-0-6-0.html b/docs/html/api-index-0-6-0.html
new file mode 100644 (file)
index 0000000..73a22a7
--- /dev/null
@@ -0,0 +1,41 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 0.6.0: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-0-9-2.html" title="Index of new symbols in 0.9.2">
+<link rel="next" href="annotation-glossary.html" title="Annotation Glossary">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxL">L</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxU">U</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-0-9-2.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="annotation-glossary.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-0-6-0"></a>Index of new symbols in 0.6.0</h2></div></div></div>
+<a name="idx"></a><a name="idxL"></a><h3 class="title">L</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#HB-LANGUAGE-INVALID:CAPS" title="HB_LANGUAGE_INVALID">HB_LANGUAGE_INVALID</a>, macro in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<a name="idxU"></a><h3 class="title">U</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#HB-UNTAG:CAPS" title="HB_UNTAG()">HB_UNTAG</a>, macro in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-0-9-10.html b/docs/html/api-index-0-9-10.html
new file mode 100644 (file)
index 0000000..0eccb3b
--- /dev/null
@@ -0,0 +1,56 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 0.9.10: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-0-9-11.html" title="Index of new symbols in 0.9.11">
+<link rel="next" href="api-index-0-9-8.html" title="Index of new symbols in 0.9.8">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxC">C</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxG">G</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxO">O</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-0-9-11.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-0-9-8.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-0-9-10"></a>Index of new symbols in 0.9.10</h2></div></div></div>
+<a name="idx"></a><a name="idxC"></a><h3 class="title">C</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-coretext.html#hb-coretext-face-create" title="hb_coretext_face_create ()">hb_coretext_face_create</a>, function in <a class="link" href="harfbuzz-hb-coretext.html" title="hb-coretext">hb-coretext</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-coretext.html#hb-coretext-face-get-cg-font" title="hb_coretext_face_get_cg_font ()">hb_coretext_face_get_cg_font</a>, function in <a class="link" href="harfbuzz-hb-coretext.html" title="hb-coretext">hb-coretext</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-coretext.html#hb-coretext-font-get-ct-font" title="hb_coretext_font_get_ct_font ()">hb_coretext_font_get_ct_font</a>, function in <a class="link" href="harfbuzz-hb-coretext.html" title="hb-coretext">hb-coretext</a>
+</dt>
+<dd></dd>
+<a name="idxG"></a><h3 class="title">G</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-graphite2.html#hb-graphite2-face-get-gr-face" title="hb_graphite2_face_get_gr_face ()">hb_graphite2_face_get_gr_face</a>, function in <a class="link" href="harfbuzz-hb-graphite2.html" title="hb-graphite2">hb-graphite2</a>
+</dt>
+<dd></dd>
+<a name="idxO"></a><h3 class="title">O</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-get-size-params" title="hb_ot_layout_get_size_params ()">hb_ot_layout_get_size_params</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-0-9-11.html b/docs/html/api-index-0-9-11.html
new file mode 100644 (file)
index 0000000..45beabd
--- /dev/null
@@ -0,0 +1,34 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 0.9.11: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-0-9-20.html" title="Index of new symbols in 0.9.20">
+<link rel="next" href="api-index-0-9-10.html" title="Index of new symbols in 0.9.10">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxB">B</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-0-9-20.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-0-9-10.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-0-9-11"></a>Index of new symbols in 0.9.11</h2></div></div></div>
+<a name="idx"></a><a name="idxB"></a><h3 class="title">B</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-clear-contents" title="hb_buffer_clear_contents ()">hb_buffer_clear_contents</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-0-9-2.html b/docs/html/api-index-0-9-2.html
new file mode 100644 (file)
index 0000000..0c7bb34
--- /dev/null
@@ -0,0 +1,757 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 0.9.2: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-0-9-5.html" title="Index of new symbols in 0.9.5">
+<link rel="next" href="api-index-0-6-0.html" title="Index of new symbols in 0.6.0">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxB">B</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxD">D</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxF">F</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxL">L</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxO">O</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxR">R</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxS">S</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxT">T</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxU">U</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxV">V</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-0-9-5.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-0-6-0.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-0-9-2"></a>Index of new symbols in 0.9.2</h2></div></div></div>
+<a name="idx"></a><a name="idxB"></a><h3 class="title">B</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-create" title="hb_blob_create ()">hb_blob_create</a>, function in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-create-sub-blob" title="hb_blob_create_sub_blob ()">hb_blob_create_sub_blob</a>, function in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-destroy" title="hb_blob_destroy ()">hb_blob_destroy</a>, function in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-get-data" title="hb_blob_get_data ()">hb_blob_get_data</a>, function in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-get-data-writable" title="hb_blob_get_data_writable ()">hb_blob_get_data_writable</a>, function in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-get-empty" title="hb_blob_get_empty ()">hb_blob_get_empty</a>, function in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-get-length" title="hb_blob_get_length ()">hb_blob_get_length</a>, function in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-get-user-data" title="hb_blob_get_user_data ()">hb_blob_get_user_data</a>, function in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-is-immutable" title="hb_blob_is_immutable ()">hb_blob_is_immutable</a>, function in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-make-immutable" title="hb_blob_make_immutable ()">hb_blob_make_immutable</a>, function in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-reference" title="hb_blob_reference ()">hb_blob_reference</a>, function in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-set-user-data" title="hb_blob_set_user_data ()">hb_blob_set_user_data</a>, function in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-add-utf16" title="hb_buffer_add_utf16 ()">hb_buffer_add_utf16</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-add-utf32" title="hb_buffer_add_utf32 ()">hb_buffer_add_utf32</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-add-utf8" title="hb_buffer_add_utf8 ()">hb_buffer_add_utf8</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-allocation-successful" title="hb_buffer_allocation_successful ()">hb_buffer_allocation_successful</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-create" title="hb_buffer_create ()">hb_buffer_create</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-destroy" title="hb_buffer_destroy ()">hb_buffer_destroy</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-direction" title="hb_buffer_get_direction ()">hb_buffer_get_direction</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-empty" title="hb_buffer_get_empty ()">hb_buffer_get_empty</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-glyph-infos" title="hb_buffer_get_glyph_infos ()">hb_buffer_get_glyph_infos</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-glyph-positions" title="hb_buffer_get_glyph_positions ()">hb_buffer_get_glyph_positions</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-language" title="hb_buffer_get_language ()">hb_buffer_get_language</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-length" title="hb_buffer_get_length ()">hb_buffer_get_length</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-script" title="hb_buffer_get_script ()">hb_buffer_get_script</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-unicode-funcs" title="hb_buffer_get_unicode_funcs ()">hb_buffer_get_unicode_funcs</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-user-data" title="hb_buffer_get_user_data ()">hb_buffer_get_user_data</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-normalize-glyphs" title="hb_buffer_normalize_glyphs ()">hb_buffer_normalize_glyphs</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-pre-allocate" title="hb_buffer_pre_allocate ()">hb_buffer_pre_allocate</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-reference" title="hb_buffer_reference ()">hb_buffer_reference</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-reset" title="hb_buffer_reset ()">hb_buffer_reset</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-reverse" title="hb_buffer_reverse ()">hb_buffer_reverse</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-reverse-clusters" title="hb_buffer_reverse_clusters ()">hb_buffer_reverse_clusters</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-format-t" title="enum hb_buffer_serialize_format_t">hb_buffer_serialize_format_t</a>, enum in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-direction" title="hb_buffer_set_direction ()">hb_buffer_set_direction</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-language" title="hb_buffer_set_language ()">hb_buffer_set_language</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-length" title="hb_buffer_set_length ()">hb_buffer_set_length</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-script" title="hb_buffer_set_script ()">hb_buffer_set_script</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-unicode-funcs" title="hb_buffer_set_unicode_funcs ()">hb_buffer_set_unicode_funcs</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-user-data" title="hb_buffer_set_user_data ()">hb_buffer_set_user_data</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<a name="idxD"></a><h3 class="title">D</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#hb-direction-from-string" title="hb_direction_from_string ()">hb_direction_from_string</a>, function in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#hb-direction-to-string" title="hb_direction_to_string ()">hb_direction_to_string</a>, function in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<a name="idxF"></a><h3 class="title">F</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-create" title="hb_face_create ()">hb_face_create</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-create-for-tables" title="hb_face_create_for_tables ()">hb_face_create_for_tables</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-destroy" title="hb_face_destroy ()">hb_face_destroy</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-get-empty" title="hb_face_get_empty ()">hb_face_get_empty</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-get-index" title="hb_face_get_index ()">hb_face_get_index</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-get-upem" title="hb_face_get_upem ()">hb_face_get_upem</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-get-user-data" title="hb_face_get_user_data ()">hb_face_get_user_data</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-is-immutable" title="hb_face_is_immutable ()">hb_face_is_immutable</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-make-immutable" title="hb_face_make_immutable ()">hb_face_make_immutable</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-reference" title="hb_face_reference ()">hb_face_reference</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-reference-blob" title="hb_face_reference_blob ()">hb_face_reference_blob</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-reference-table" title="hb_face_reference_table ()">hb_face_reference_table</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-set-index" title="hb_face_set_index ()">hb_face_set_index</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-set-upem" title="hb_face_set_upem ()">hb_face_set_upem</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-set-user-data" title="hb_face_set_user_data ()">hb_face_set_user_data</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-add-glyph-origin-for-direction" title="hb_font_add_glyph_origin_for_direction ()">hb_font_add_glyph_origin_for_direction</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-create" title="hb_font_create ()">hb_font_create</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-create-sub-font" title="hb_font_create_sub_font ()">hb_font_create_sub_font</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-destroy" title="hb_font_destroy ()">hb_font_destroy</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-create" title="hb_font_funcs_create ()">hb_font_funcs_create</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-destroy" title="hb_font_funcs_destroy ()">hb_font_funcs_destroy</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-get-empty" title="hb_font_funcs_get_empty ()">hb_font_funcs_get_empty</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-get-user-data" title="hb_font_funcs_get_user_data ()">hb_font_funcs_get_user_data</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-is-immutable" title="hb_font_funcs_is_immutable ()">hb_font_funcs_is_immutable</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-make-immutable" title="hb_font_funcs_make_immutable ()">hb_font_funcs_make_immutable</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-reference" title="hb_font_funcs_reference ()">hb_font_funcs_reference</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-glyph-contour-point-func" title="hb_font_funcs_set_glyph_contour_point_func ()">hb_font_funcs_set_glyph_contour_point_func</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-glyph-extents-func" title="hb_font_funcs_set_glyph_extents_func ()">hb_font_funcs_set_glyph_extents_func</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-glyph-from-name-func" title="hb_font_funcs_set_glyph_from_name_func ()">hb_font_funcs_set_glyph_from_name_func</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-glyph-h-advance-func" title="hb_font_funcs_set_glyph_h_advance_func ()">hb_font_funcs_set_glyph_h_advance_func</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-glyph-h-kerning-func" title="hb_font_funcs_set_glyph_h_kerning_func ()">hb_font_funcs_set_glyph_h_kerning_func</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-glyph-h-origin-func" title="hb_font_funcs_set_glyph_h_origin_func ()">hb_font_funcs_set_glyph_h_origin_func</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-glyph-name-func" title="hb_font_funcs_set_glyph_name_func ()">hb_font_funcs_set_glyph_name_func</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-glyph-v-advance-func" title="hb_font_funcs_set_glyph_v_advance_func ()">hb_font_funcs_set_glyph_v_advance_func</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-font-funcs-set-glyph-v-kerning-func" title="hb_font_funcs_set_glyph_v_kerning_func ()">hb_font_funcs_set_glyph_v_kerning_func</a>, function in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-glyph-v-origin-func" title="hb_font_funcs_set_glyph_v_origin_func ()">hb_font_funcs_set_glyph_v_origin_func</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-user-data" title="hb_font_funcs_set_user_data ()">hb_font_funcs_set_user_data</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-empty" title="hb_font_get_empty ()">hb_font_get_empty</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-face" title="hb_font_get_face ()">hb_font_get_face</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph" title="hb_font_get_glyph ()">hb_font_get_glyph</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-advance-for-direction" title="hb_font_get_glyph_advance_for_direction ()">hb_font_get_glyph_advance_for_direction</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-contour-point" title="hb_font_get_glyph_contour_point ()">hb_font_get_glyph_contour_point</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-contour-point-for-origin" title="hb_font_get_glyph_contour_point_for_origin ()">hb_font_get_glyph_contour_point_for_origin</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-extents" title="hb_font_get_glyph_extents ()">hb_font_get_glyph_extents</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-extents-for-origin" title="hb_font_get_glyph_extents_for_origin ()">hb_font_get_glyph_extents_for_origin</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-from-name" title="hb_font_get_glyph_from_name ()">hb_font_get_glyph_from_name</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-h-advance" title="hb_font_get_glyph_h_advance ()">hb_font_get_glyph_h_advance</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-h-kerning" title="hb_font_get_glyph_h_kerning ()">hb_font_get_glyph_h_kerning</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-h-origin" title="hb_font_get_glyph_h_origin ()">hb_font_get_glyph_h_origin</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-kerning-for-direction" title="hb_font_get_glyph_kerning_for_direction ()">hb_font_get_glyph_kerning_for_direction</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-name" title="hb_font_get_glyph_name ()">hb_font_get_glyph_name</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-origin-for-direction" title="hb_font_get_glyph_origin_for_direction ()">hb_font_get_glyph_origin_for_direction</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-v-advance" title="hb_font_get_glyph_v_advance ()">hb_font_get_glyph_v_advance</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-font-get-glyph-v-kerning" title="hb_font_get_glyph_v_kerning ()">hb_font_get_glyph_v_kerning</a>, function in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-v-origin" title="hb_font_get_glyph_v_origin ()">hb_font_get_glyph_v_origin</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-parent" title="hb_font_get_parent ()">hb_font_get_parent</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-ppem" title="hb_font_get_ppem ()">hb_font_get_ppem</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-scale" title="hb_font_get_scale ()">hb_font_get_scale</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-user-data" title="hb_font_get_user_data ()">hb_font_get_user_data</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-glyph-from-string" title="hb_font_glyph_from_string ()">hb_font_glyph_from_string</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-glyph-to-string" title="hb_font_glyph_to_string ()">hb_font_glyph_to_string</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-is-immutable" title="hb_font_is_immutable ()">hb_font_is_immutable</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-make-immutable" title="hb_font_make_immutable ()">hb_font_make_immutable</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-reference" title="hb_font_reference ()">hb_font_reference</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-funcs" title="hb_font_set_funcs ()">hb_font_set_funcs</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-funcs-data" title="hb_font_set_funcs_data ()">hb_font_set_funcs_data</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-ppem" title="hb_font_set_ppem ()">hb_font_set_ppem</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-scale" title="hb_font_set_scale ()">hb_font_set_scale</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-user-data" title="hb_font_set_user_data ()">hb_font_set_user_data</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-subtract-glyph-origin-for-direction" title="hb_font_subtract_glyph_origin_for_direction ()">hb_font_subtract_glyph_origin_for_direction</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ft.html#hb-ft-face-create" title="hb_ft_face_create ()">hb_ft_face_create</a>, function in <a class="link" href="harfbuzz-hb-ft.html" title="hb-ft">hb-ft</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ft.html#hb-ft-face-create-cached" title="hb_ft_face_create_cached ()">hb_ft_face_create_cached</a>, function in <a class="link" href="harfbuzz-hb-ft.html" title="hb-ft">hb-ft</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ft.html#hb-ft-font-create" title="hb_ft_font_create ()">hb_ft_font_create</a>, function in <a class="link" href="harfbuzz-hb-ft.html" title="hb-ft">hb-ft</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ft.html#hb-ft-font-get-face" title="hb_ft_font_get_face ()">hb_ft_font_get_face</a>, function in <a class="link" href="harfbuzz-hb-ft.html" title="hb-ft">hb-ft</a>
+</dt>
+<dd></dd>
+<a name="idxL"></a><h3 class="title">L</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#hb-language-from-string" title="hb_language_from_string ()">hb_language_from_string</a>, function in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#hb-language-get-default" title="hb_language_get_default ()">hb_language_get_default</a>, function in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#hb-language-to-string" title="hb_language_to_string ()">hb_language_to_string</a>, function in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<a name="idxO"></a><h3 class="title">O</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-shape.html#hb-ot-shape-glyphs-closure" title="hb_ot_shape_glyphs_closure ()">hb_ot_shape_glyphs_closure</a>, function in <a class="link" href="harfbuzz-hb-ot-shape.html" title="hb-ot-shape">hb-ot-shape</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-tag-to-language" title="hb_ot_tag_to_language ()">hb_ot_tag_to_language</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<a name="idxR"></a><h3 class="title">R</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-reference-table-func-t" title="hb_reference_table_func_t ()">hb_reference_table_func_t</a>, user_function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<a name="idxS"></a><h3 class="title">S</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#hb-script-from-iso15924-tag" title="hb_script_from_iso15924_tag ()">hb_script_from_iso15924_tag</a>, function in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#hb-script-from-string" title="hb_script_from_string ()">hb_script_from_string</a>, function in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#hb-script-get-horizontal-direction" title="hb_script_get_horizontal_direction ()">hb_script_get_horizontal_direction</a>, function in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#hb-script-to-iso15924-tag" title="hb_script_to_iso15924_tag ()">hb_script_to_iso15924_tag</a>, function in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-add" title="hb_set_add ()">hb_set_add</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-allocation-successful" title="hb_set_allocation_successful ()">hb_set_allocation_successful</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-clear" title="hb_set_clear ()">hb_set_clear</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-create" title="hb_set_create ()">hb_set_create</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-del" title="hb_set_del ()">hb_set_del</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-destroy" title="hb_set_destroy ()">hb_set_destroy</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-get-empty" title="hb_set_get_empty ()">hb_set_get_empty</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-get-user-data" title="hb_set_get_user_data ()">hb_set_get_user_data</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-has" title="hb_set_has ()">hb_set_has</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-intersect" title="hb_set_intersect ()">hb_set_intersect</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-next" title="hb_set_next ()">hb_set_next</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-reference" title="hb_set_reference ()">hb_set_reference</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-set" title="hb_set_set ()">hb_set_set</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-set-user-data" title="hb_set_set_user_data ()">hb_set_set_user_data</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-subtract" title="hb_set_subtract ()">hb_set_subtract</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-symmetric-difference" title="hb_set_symmetric_difference ()">hb_set_symmetric_difference</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-union" title="hb_set_union ()">hb_set_union</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-shape.html#hb-shape" title="hb_shape ()">hb_shape</a>, function in <a class="link" href="harfbuzz-hb-shape.html" title="hb-shape">hb-shape</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-shape.html#hb-shape-full" title="hb_shape_full ()">hb_shape_full</a>, function in <a class="link" href="harfbuzz-hb-shape.html" title="hb-shape">hb-shape</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-shape.html#hb-shape-list-shapers" title="hb_shape_list_shapers ()">hb_shape_list_shapers</a>, function in <a class="link" href="harfbuzz-hb-shape.html" title="hb-shape">hb-shape</a>
+</dt>
+<dd></dd>
+<a name="idxT"></a><h3 class="title">T</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#hb-tag-from-string" title="hb_tag_from_string ()">hb_tag_from_string</a>, function in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<a name="idxU"></a><h3 class="title">U</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-combining-class" title="hb_unicode_combining_class ()">hb_unicode_combining_class</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-compose" title="hb_unicode_compose ()">hb_unicode_compose</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-decompose" title="hb_unicode_decompose ()">hb_unicode_decompose</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-unicode-decompose-compatibility" title="hb_unicode_decompose_compatibility ()">hb_unicode_decompose_compatibility</a>, function in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-unicode-eastasian-width" title="hb_unicode_eastasian_width ()">hb_unicode_eastasian_width</a>, function in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-create" title="hb_unicode_funcs_create ()">hb_unicode_funcs_create</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-destroy" title="hb_unicode_funcs_destroy ()">hb_unicode_funcs_destroy</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-get-default" title="hb_unicode_funcs_get_default ()">hb_unicode_funcs_get_default</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-get-empty" title="hb_unicode_funcs_get_empty ()">hb_unicode_funcs_get_empty</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-get-parent" title="hb_unicode_funcs_get_parent ()">hb_unicode_funcs_get_parent</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-get-user-data" title="hb_unicode_funcs_get_user_data ()">hb_unicode_funcs_get_user_data</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-is-immutable" title="hb_unicode_funcs_is_immutable ()">hb_unicode_funcs_is_immutable</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-make-immutable" title="hb_unicode_funcs_make_immutable ()">hb_unicode_funcs_make_immutable</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-reference" title="hb_unicode_funcs_reference ()">hb_unicode_funcs_reference</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-set-combining-class-func" title="hb_unicode_funcs_set_combining_class_func ()">hb_unicode_funcs_set_combining_class_func</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-set-compose-func" title="hb_unicode_funcs_set_compose_func ()">hb_unicode_funcs_set_compose_func</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-unicode-funcs-set-decompose-compatibility-func" title="hb_unicode_funcs_set_decompose_compatibility_func ()">hb_unicode_funcs_set_decompose_compatibility_func</a>, function in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-set-decompose-func" title="hb_unicode_funcs_set_decompose_func ()">hb_unicode_funcs_set_decompose_func</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-unicode-funcs-set-eastasian-width-func" title="hb_unicode_funcs_set_eastasian_width_func ()">hb_unicode_funcs_set_eastasian_width_func</a>, function in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-set-general-category-func" title="hb_unicode_funcs_set_general_category_func ()">hb_unicode_funcs_set_general_category_func</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-set-mirroring-func" title="hb_unicode_funcs_set_mirroring_func ()">hb_unicode_funcs_set_mirroring_func</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-set-script-func" title="hb_unicode_funcs_set_script_func ()">hb_unicode_funcs_set_script_func</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-set-user-data" title="hb_unicode_funcs_set_user_data ()">hb_unicode_funcs_set_user_data</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-general-category" title="hb_unicode_general_category ()">hb_unicode_general_category</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-mirroring" title="hb_unicode_mirroring ()">hb_unicode_mirroring</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-script" title="hb_unicode_script ()">hb_unicode_script</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+<a name="idxV"></a><h3 class="title">V</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-version.html#hb-version" title="hb_version ()">hb_version</a>, function in <a class="link" href="harfbuzz-hb-version.html" title="hb-version">hb-version</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-version.html#hb-version-string" title="hb_version_string ()">hb_version_string</a>, function in <a class="link" href="harfbuzz-hb-version.html" title="hb-version">hb-version</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-0-9-20.html b/docs/html/api-index-0-9-20.html
new file mode 100644 (file)
index 0000000..741876b
--- /dev/null
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 0.9.20: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-0-9-21.html" title="Index of new symbols in 0.9.21">
+<link rel="next" href="api-index-0-9-11.html" title="Index of new symbols in 0.9.11">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxB">B</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-0-9-21.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-0-9-11.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-0-9-20"></a>Index of new symbols in 0.9.20</h2></div></div></div>
+<a name="idx"></a><a name="idxB"></a><h3 class="title">B</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-flags-t" title="enum hb_buffer_flags_t">hb_buffer_flags_t</a>, enum in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-flags-t" title="enum hb_buffer_serialize_flags_t">hb_buffer_serialize_flags_t</a>, enum in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-0-9-21.html b/docs/html/api-index-0-9-21.html
new file mode 100644 (file)
index 0000000..5872def
--- /dev/null
@@ -0,0 +1,34 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 0.9.21: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-0-9-22.html" title="Index of new symbols in 0.9.22">
+<link rel="next" href="api-index-0-9-20.html" title="Index of new symbols in 0.9.20">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxS">S</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-0-9-22.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-0-9-20.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-0-9-21"></a>Index of new symbols in 0.9.21</h2></div></div></div>
+<a name="idx"></a><a name="idxS"></a><h3 class="title">S</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#HB-SET-VALUE-INVALID:CAPS" title="HB_SET_VALUE_INVALID">HB_SET_VALUE_INVALID</a>, macro in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-0-9-22.html b/docs/html/api-index-0-9-22.html
new file mode 100644 (file)
index 0000000..2cb1da6
--- /dev/null
@@ -0,0 +1,34 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 0.9.22: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-0-9-26.html" title="Index of new symbols in 0.9.26">
+<link rel="next" href="api-index-0-9-21.html" title="Index of new symbols in 0.9.21">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxO">O</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-0-9-26.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-0-9-21.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-0-9-22"></a>Index of new symbols in 0.9.22</h2></div></div></div>
+<a name="idx"></a><a name="idxO"></a><h3 class="title">O</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-table-get-lookup-count" title="hb_ot_layout_table_get_lookup_count ()">hb_ot_layout_table_get_lookup_count</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-0-9-26.html b/docs/html/api-index-0-9-26.html
new file mode 100644 (file)
index 0000000..d9aeee5
--- /dev/null
@@ -0,0 +1,34 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 0.9.26: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-0-9-28.html" title="Index of new symbols in 0.9.28">
+<link rel="next" href="api-index-0-9-22.html" title="Index of new symbols in 0.9.22">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxT">T</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-0-9-28.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-0-9-22.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-0-9-26"></a>Index of new symbols in 0.9.26</h2></div></div></div>
+<a name="idx"></a><a name="idxT"></a><h3 class="title">T</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#HB-TAG-MAX:CAPS" title="HB_TAG_MAX">HB_TAG_MAX</a>, macro in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-0-9-28.html b/docs/html/api-index-0-9-28.html
new file mode 100644 (file)
index 0000000..d60024d
--- /dev/null
@@ -0,0 +1,34 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 0.9.28: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-0-9-30.html" title="Index of new symbols in 0.9.30">
+<link rel="next" href="api-index-0-9-26.html" title="Index of new symbols in 0.9.26">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxO">O</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-0-9-30.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-0-9-26.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-0-9-28"></a>Index of new symbols in 0.9.28</h2></div></div></div>
+<a name="idx"></a><a name="idxO"></a><h3 class="title">O</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-font.html#hb-ot-font-set-funcs" title="hb_ot_font_set_funcs ()">hb_ot_font_set_funcs</a>, function in <a class="link" href="harfbuzz-hb-ot-font.html" title="hb-ot-font">hb-ot-font</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-0-9-30.html b/docs/html/api-index-0-9-30.html
new file mode 100644 (file)
index 0000000..19c70ed
--- /dev/null
@@ -0,0 +1,41 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 0.9.30: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-0-9-31.html" title="Index of new symbols in 0.9.31">
+<link rel="next" href="api-index-0-9-28.html" title="Index of new symbols in 0.9.28">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxO">O</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxV">V</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-0-9-31.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-0-9-28.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-0-9-30"></a>Index of new symbols in 0.9.30</h2></div></div></div>
+<a name="idx"></a><a name="idxO"></a><h3 class="title">O</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-language-get-required-feature" title="hb_ot_layout_language_get_required_feature ()">hb_ot_layout_language_get_required_feature</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<a name="idxV"></a><h3 class="title">V</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-version.html#hb-version-atleast" title="hb_version_atleast ()">hb_version_atleast</a>, function in <a class="link" href="harfbuzz-hb-version.html" title="hb-version">hb-version</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-0-9-31.html b/docs/html/api-index-0-9-31.html
new file mode 100644 (file)
index 0000000..0129bfc
--- /dev/null
@@ -0,0 +1,46 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 0.9.31: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-0-9-33.html" title="Index of new symbols in 0.9.33">
+<link rel="next" href="api-index-0-9-30.html" title="Index of new symbols in 0.9.30">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxB">B</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-0-9-33.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-0-9-30.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-0-9-31"></a>Index of new symbols in 0.9.31</h2></div></div></div>
+<a name="idx"></a><a name="idxB"></a><h3 class="title">B</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-add-codepoints" title="hb_buffer_add_codepoints ()">hb_buffer_add_codepoints</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-replacement-codepoint" title="hb_buffer_get_replacement_codepoint ()">hb_buffer_get_replacement_codepoint</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#HB-BUFFER-REPLACEMENT-CODEPOINT-DEFAULT:CAPS" title="HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT">HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT</a>, macro in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-replacement-codepoint" title="hb_buffer_set_replacement_codepoint ()">hb_buffer_set_replacement_codepoint</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-0-9-33.html b/docs/html/api-index-0-9-33.html
new file mode 100644 (file)
index 0000000..a4593f9
--- /dev/null
@@ -0,0 +1,34 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 0.9.33: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-0-9-38.html" title="Index of new symbols in 0.9.38">
+<link rel="next" href="api-index-0-9-31.html" title="Index of new symbols in 0.9.31">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxT">T</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-0-9-38.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-0-9-31.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-0-9-33"></a>Index of new symbols in 0.9.33</h2></div></div></div>
+<a name="idx"></a><a name="idxT"></a><h3 class="title">T</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#HB-TAG-MAX-SIGNED:CAPS" title="HB_TAG_MAX_SIGNED">HB_TAG_MAX_SIGNED</a>, macro in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-0-9-38.html b/docs/html/api-index-0-9-38.html
new file mode 100644 (file)
index 0000000..971b83a
--- /dev/null
@@ -0,0 +1,64 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 0.9.38: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-0-9-39.html" title="Index of new symbols in 0.9.39">
+<link rel="next" href="api-index-0-9-33.html" title="Index of new symbols in 0.9.33">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxF">F</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxG">G</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxI">I</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-0-9-39.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-0-9-33.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-0-9-38"></a>Index of new symbols in 0.9.38</h2></div></div></div>
+<a name="idx"></a><a name="idxF"></a><h3 class="title">F</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-ft.html#hb-ft-face-create-referenced" title="hb_ft_face_create_referenced ()">hb_ft_face_create_referenced</a>, function in <a class="link" href="harfbuzz-hb-ft.html" title="hb-ft">hb-ft</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ft.html#hb-ft-font-create-referenced" title="hb_ft_font_create_referenced ()">hb_ft_font_create_referenced</a>, function in <a class="link" href="harfbuzz-hb-ft.html" title="hb-ft">hb-ft</a>
+</dt>
+<dd></dd>
+<a name="idxG"></a><h3 class="title">G</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-glib.html#hb-glib-blob-create" title="hb_glib_blob_create ()">hb_glib_blob_create</a>, function in <a class="link" href="harfbuzz-hb-glib.html" title="hb-glib">hb-glib</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-glib.html#hb-glib-get-unicode-funcs" title="hb_glib_get_unicode_funcs ()">hb_glib_get_unicode_funcs</a>, function in <a class="link" href="harfbuzz-hb-glib.html" title="hb-glib">hb-glib</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-glib.html#hb-glib-script-from-script" title="hb_glib_script_from_script ()">hb_glib_script_from_script</a>, function in <a class="link" href="harfbuzz-hb-glib.html" title="hb-glib">hb-glib</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-glib.html#hb-glib-script-to-script" title="hb_glib_script_to_script ()">hb_glib_script_to_script</a>, function in <a class="link" href="harfbuzz-hb-glib.html" title="hb-glib">hb-glib</a>
+</dt>
+<dd></dd>
+<a name="idxI"></a><h3 class="title">I</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-icu.html#hb-icu-get-unicode-funcs" title="hb_icu_get_unicode_funcs ()">hb_icu_get_unicode_funcs</a>, function in <a class="link" href="harfbuzz-hb-icu.html" title="hb-icu">hb-icu</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-0-9-39.html b/docs/html/api-index-0-9-39.html
new file mode 100644 (file)
index 0000000..c379f3e
--- /dev/null
@@ -0,0 +1,34 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 0.9.39: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-0-9-41.html" title="Index of new symbols in 0.9.41">
+<link rel="next" href="api-index-0-9-38.html" title="Index of new symbols in 0.9.38">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxB">B</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-0-9-41.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-0-9-38.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-0-9-39"></a>Index of new symbols in 0.9.39</h2></div></div></div>
+<a name="idx"></a><a name="idxB"></a><h3 class="title">B</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-add-latin1" title="hb_buffer_add_latin1 ()">hb_buffer_add_latin1</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-0-9-41.html b/docs/html/api-index-0-9-41.html
new file mode 100644 (file)
index 0000000..f8489fa
--- /dev/null
@@ -0,0 +1,34 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 0.9.41: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-0-9-42.html" title="Index of new symbols in 0.9.42">
+<link rel="next" href="api-index-0-9-39.html" title="Index of new symbols in 0.9.39">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxB">B</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-0-9-42.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-0-9-39.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-0-9-41"></a>Index of new symbols in 0.9.41</h2></div></div></div>
+<a name="idx"></a><a name="idxB"></a><h3 class="title">B</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-reverse-range" title="hb_buffer_reverse_range ()">hb_buffer_reverse_range</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-0-9-42.html b/docs/html/api-index-0-9-42.html
new file mode 100644 (file)
index 0000000..546e5a8
--- /dev/null
@@ -0,0 +1,42 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 0.9.42: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-1-0-5.html" title="Index of new symbols in 1.0.5">
+<link rel="next" href="api-index-0-9-41.html" title="Index of new symbols in 0.9.41">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxB">B</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-1-0-5.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-0-9-41.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-0-9-42"></a>Index of new symbols in 0.9.42</h2></div></div></div>
+<a name="idx"></a><a name="idxB"></a><h3 class="title">B</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-cluster-level-t" title="enum hb_buffer_cluster_level_t">hb_buffer_cluster_level_t</a>, enum in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-cluster-level" title="hb_buffer_get_cluster_level ()">hb_buffer_get_cluster_level</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-cluster-level" title="hb_buffer_set_cluster_level ()">hb_buffer_set_cluster_level</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-0-9-5.html b/docs/html/api-index-0-9-5.html
new file mode 100644 (file)
index 0000000..d6c96ad
--- /dev/null
@@ -0,0 +1,56 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 0.9.5: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-0-9-7.html" title="Index of new symbols in 0.9.7">
+<link rel="next" href="api-index-0-9-2.html" title="Index of new symbols in 0.9.2">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxB">B</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxF">F</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxT">T</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-0-9-7.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-0-9-2.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-0-9-5"></a>Index of new symbols in 0.9.5</h2></div></div></div>
+<a name="idx"></a><a name="idxB"></a><h3 class="title">B</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-content-type" title="hb_buffer_get_content_type ()">hb_buffer_get_content_type</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-content-type" title="hb_buffer_set_content_type ()">hb_buffer_set_content_type</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<a name="idxF"></a><h3 class="title">F</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#hb-feature-from-string" title="hb_feature_from_string ()">hb_feature_from_string</a>, function in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#hb-feature-to-string" title="hb_feature_to_string ()">hb_feature_to_string</a>, function in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<a name="idxT"></a><h3 class="title">T</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#hb-tag-to-string" title="hb_tag_to_string ()">hb_tag_to_string</a>, function in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-0-9-7.html b/docs/html/api-index-0-9-7.html
new file mode 100644 (file)
index 0000000..7d82d78
--- /dev/null
@@ -0,0 +1,195 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 0.9.7: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-0-9-8.html" title="Index of new symbols in 0.9.8">
+<link rel="next" href="api-index-0-9-5.html" title="Index of new symbols in 0.9.5">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxB">B</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxF">F</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxO">O</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxS">S</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-0-9-8.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-0-9-5.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-0-9-7"></a>Index of new symbols in 0.9.7</h2></div></div></div>
+<a name="idx"></a><a name="idxB"></a><h3 class="title">B</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-add" title="hb_buffer_add ()">hb_buffer_add</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-deserialize-glyphs" title="hb_buffer_deserialize_glyphs ()">hb_buffer_deserialize_glyphs</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-flags" title="hb_buffer_get_flags ()">hb_buffer_get_flags</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-segment-properties" title="hb_buffer_get_segment_properties ()">hb_buffer_get_segment_properties</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-guess-segment-properties" title="hb_buffer_guess_segment_properties ()">hb_buffer_guess_segment_properties</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-format-from-string" title="hb_buffer_serialize_format_from_string ()">hb_buffer_serialize_format_from_string</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-format-to-string" title="hb_buffer_serialize_format_to_string ()">hb_buffer_serialize_format_to_string</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-glyphs" title="hb_buffer_serialize_glyphs ()">hb_buffer_serialize_glyphs</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-list-formats" title="hb_buffer_serialize_list_formats ()">hb_buffer_serialize_list_formats</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-flags" title="hb_buffer_set_flags ()">hb_buffer_set_flags</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-segment-properties" title="hb_buffer_set_segment_properties ()">hb_buffer_set_segment_properties</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<a name="idxF"></a><h3 class="title">F</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-get-glyph-count" title="hb_face_get_glyph_count ()">hb_face_get_glyph_count</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-set-glyph-count" title="hb_face_set_glyph_count ()">hb_face_set_glyph_count</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<a name="idxO"></a><h3 class="title">O</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-feature-get-lookups" title="hb_ot_layout_feature_get_lookups ()">hb_ot_layout_feature_get_lookups</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-get-glyphs-in-class" title="hb_ot_layout_get_glyphs_in_class ()">hb_ot_layout_get_glyphs_in_class</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-get-glyph-class" title="hb_ot_layout_get_glyph_class ()">hb_ot_layout_get_glyph_class</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-lookup-collect-glyphs" title="hb_ot_layout_lookup_collect_glyphs ()">hb_ot_layout_lookup_collect_glyphs</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-lookup-substitute-closure" title="hb_ot_layout_lookup_substitute_closure ()">hb_ot_layout_lookup_substitute_closure</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-lookup-would-substitute" title="hb_ot_layout_lookup_would_substitute ()">hb_ot_layout_lookup_would_substitute</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-shape-plan-collect-lookups" title="hb_ot_shape_plan_collect_lookups ()">hb_ot_shape_plan_collect_lookups</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<a name="idxS"></a><h3 class="title">S</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-equal" title="hb_segment_properties_equal ()">hb_segment_properties_equal</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-hash" title="hb_segment_properties_hash ()">hb_segment_properties_hash</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-add-range" title="hb_set_add_range ()">hb_set_add_range</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-del-range" title="hb_set_del_range ()">hb_set_del_range</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-get-max" title="hb_set_get_max ()">hb_set_get_max</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-get-min" title="hb_set_get_min ()">hb_set_get_min</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-get-population" title="hb_set_get_population ()">hb_set_get_population</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-is-empty" title="hb_set_is_empty ()">hb_set_is_empty</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-is-equal" title="hb_set_is_equal ()">hb_set_is_equal</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-next-range" title="hb_set_next_range ()">hb_set_next_range</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-create" title="hb_shape_plan_create ()">hb_shape_plan_create</a>, function in <a class="link" href="harfbuzz-hb-shape-plan.html" title="hb-shape-plan">hb-shape-plan</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-create-cached" title="hb_shape_plan_create_cached ()">hb_shape_plan_create_cached</a>, function in <a class="link" href="harfbuzz-hb-shape-plan.html" title="hb-shape-plan">hb-shape-plan</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-destroy" title="hb_shape_plan_destroy ()">hb_shape_plan_destroy</a>, function in <a class="link" href="harfbuzz-hb-shape-plan.html" title="hb-shape-plan">hb-shape-plan</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-execute" title="hb_shape_plan_execute ()">hb_shape_plan_execute</a>, function in <a class="link" href="harfbuzz-hb-shape-plan.html" title="hb-shape-plan">hb-shape-plan</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-get-empty" title="hb_shape_plan_get_empty ()">hb_shape_plan_get_empty</a>, function in <a class="link" href="harfbuzz-hb-shape-plan.html" title="hb-shape-plan">hb-shape-plan</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-get-shaper" title="hb_shape_plan_get_shaper ()">hb_shape_plan_get_shaper</a>, function in <a class="link" href="harfbuzz-hb-shape-plan.html" title="hb-shape-plan">hb-shape-plan</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-get-user-data" title="hb_shape_plan_get_user_data ()">hb_shape_plan_get_user_data</a>, function in <a class="link" href="harfbuzz-hb-shape-plan.html" title="hb-shape-plan">hb-shape-plan</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-reference" title="hb_shape_plan_reference ()">hb_shape_plan_reference</a>, function in <a class="link" href="harfbuzz-hb-shape-plan.html" title="hb-shape-plan">hb-shape-plan</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-set-user-data" title="hb_shape_plan_set_user_data ()">hb_shape_plan_set_user_data</a>, function in <a class="link" href="harfbuzz-hb-shape-plan.html" title="hb-shape-plan">hb-shape-plan</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-0-9-8.html b/docs/html/api-index-0-9-8.html
new file mode 100644 (file)
index 0000000..92f7c4b
--- /dev/null
@@ -0,0 +1,34 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 0.9.8: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-0-9-10.html" title="Index of new symbols in 0.9.10">
+<link rel="next" href="api-index-0-9-7.html" title="Index of new symbols in 0.9.7">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxO">O</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-0-9-10.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-0-9-7.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-0-9-8"></a>Index of new symbols in 0.9.8</h2></div></div></div>
+<a name="idx"></a><a name="idxO"></a><h3 class="title">O</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-collect-lookups" title="hb_ot_layout_collect_lookups ()">hb_ot_layout_collect_lookups</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-1-0-5.html b/docs/html/api-index-1-0-5.html
new file mode 100644 (file)
index 0000000..7b214c0
--- /dev/null
@@ -0,0 +1,50 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 1.0.5: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-1-1-2.html" title="Index of new symbols in 1.1.2">
+<link rel="next" href="api-index-0-9-42.html" title="Index of new symbols in 0.9.42">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxF">F</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-1-1-2.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-0-9-42.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-1-0-5"></a>Index of new symbols in 1.0.5</h2></div></div></div>
+<a name="idx"></a><a name="idxF"></a><h3 class="title">F</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-parent" title="hb_font_set_parent ()">hb_font_set_parent</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ft.html#hb-ft-font-changed" title="hb_ft_font_changed ()">hb_ft_font_changed</a>, function in <a class="link" href="harfbuzz-hb-ft.html" title="hb-ft">hb-ft</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ft.html#hb-ft-font-get-load-flags" title="hb_ft_font_get_load_flags ()">hb_ft_font_get_load_flags</a>, function in <a class="link" href="harfbuzz-hb-ft.html" title="hb-ft">hb-ft</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ft.html#hb-ft-font-set-funcs" title="hb_ft_font_set_funcs ()">hb_ft_font_set_funcs</a>, function in <a class="link" href="harfbuzz-hb-ft.html" title="hb-ft">hb-ft</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ft.html#hb-ft-font-set-load-flags" title="hb_ft_font_set_load_flags ()">hb_ft_font_set_load_flags</a>, function in <a class="link" href="harfbuzz-hb-ft.html" title="hb-ft">hb-ft</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-1-1-2.html b/docs/html/api-index-1-1-2.html
new file mode 100644 (file)
index 0000000..5e0e51e
--- /dev/null
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 1.1.2: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-1-1-3.html" title="Index of new symbols in 1.1.3">
+<link rel="next" href="api-index-1-0-5.html" title="Index of new symbols in 1.0.5">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxF">F</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-1-1-3.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-1-0-5.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-1-1-2"></a>Index of new symbols in 1.1.2</h2></div></div></div>
+<a name="idx"></a><a name="idxF"></a><h3 class="title">F</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-font-h-extents-func" title="hb_font_funcs_set_font_h_extents_func ()">hb_font_funcs_set_font_h_extents_func</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-font-v-extents-func" title="hb_font_funcs_set_font_v_extents_func ()">hb_font_funcs_set_font_v_extents_func</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-1-1-3.html b/docs/html/api-index-1-1-3.html
new file mode 100644 (file)
index 0000000..dbde650
--- /dev/null
@@ -0,0 +1,53 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 1.1.3: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-1-2-3.html" title="Index of new symbols in 1.2.3">
+<link rel="next" href="api-index-1-1-2.html" title="Index of new symbols in 1.1.2">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxB">B</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxF">F</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-1-2-3.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-1-1-2.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-1-1-3"></a>Index of new symbols in 1.1.3</h2></div></div></div>
+<a name="idx"></a><a name="idxB"></a><h3 class="title">B</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-message-func-t" title="hb_buffer_message_func_t ()">hb_buffer_message_func_t</a>, user_function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-message-func" title="hb_buffer_set_message_func ()">hb_buffer_set_message_func</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<a name="idxF"></a><h3 class="title">F</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-extents-for-direction" title="hb_font_get_extents_for_direction ()">hb_font_get_extents_for_direction</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-h-extents" title="hb_font_get_h_extents ()">hb_font_get_h_extents</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-v-extents" title="hb_font_get_v_extents ()">hb_font_get_v_extents</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-1-2-3.html b/docs/html/api-index-1-2-3.html
new file mode 100644 (file)
index 0000000..97856dd
--- /dev/null
@@ -0,0 +1,46 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 1.2.3: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-1-3-3.html" title="Index of new symbols in 1.3.3">
+<link rel="next" href="api-index-1-1-3.html" title="Index of new symbols in 1.1.3">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxF">F</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-1-3-3.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-1-1-3.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-1-2-3"></a>Index of new symbols in 1.2.3</h2></div></div></div>
+<a name="idx"></a><a name="idxF"></a><h3 class="title">F</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-nominal-glyph-func" title="hb_font_funcs_set_nominal_glyph_func ()">hb_font_funcs_set_nominal_glyph_func</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-variation-glyph-func" title="hb_font_funcs_set_variation_glyph_func ()">hb_font_funcs_set_variation_glyph_func</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-nominal-glyph" title="hb_font_get_nominal_glyph ()">hb_font_get_nominal_glyph</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-variation-glyph" title="hb_font_get_variation_glyph ()">hb_font_get_variation_glyph</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-1-3-3.html b/docs/html/api-index-1-3-3.html
new file mode 100644 (file)
index 0000000..27fc33b
--- /dev/null
@@ -0,0 +1,94 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 1.3.3: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-1-4-0.html" title="Index of new symbols in 1.4.0">
+<link rel="next" href="api-index-1-2-3.html" title="Index of new symbols in 1.2.3">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxO">O</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-1-4-0.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-1-2-3.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-1-3-3"></a>Index of new symbols in 1.3.3</h2></div></div></div>
+<a name="idx"></a><a name="idxO"></a><h3 class="title">O</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-constant-t" title="enum hb_ot_math_constant_t">hb_ot_math_constant_t</a>, enum in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-get-constant" title="hb_ot_math_get_constant ()">hb_ot_math_get_constant</a>, function in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-get-glyph-assembly" title="hb_ot_math_get_glyph_assembly ()">hb_ot_math_get_glyph_assembly</a>, function in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-get-glyph-italics-correction" title="hb_ot_math_get_glyph_italics_correction ()">hb_ot_math_get_glyph_italics_correction</a>, function in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-get-glyph-kerning" title="hb_ot_math_get_glyph_kerning ()">hb_ot_math_get_glyph_kerning</a>, function in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-get-glyph-top-accent-attachment" title="hb_ot_math_get_glyph_top_accent_attachment ()">hb_ot_math_get_glyph_top_accent_attachment</a>, function in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-get-glyph-variants" title="hb_ot_math_get_glyph_variants ()">hb_ot_math_get_glyph_variants</a>, function in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-get-min-connector-overlap" title="hb_ot_math_get_min_connector_overlap ()">hb_ot_math_get_min_connector_overlap</a>, function in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-part-flags-t" title="enum hb_ot_math_glyph_part_flags_t">hb_ot_math_glyph_part_flags_t</a>, enum in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-part-t" title="hb_ot_math_glyph_part_t">hb_ot_math_glyph_part_t</a>, struct in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-variant-t" title="hb_ot_math_glyph_variant_t">hb_ot_math_glyph_variant_t</a>, struct in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-has-data" title="hb_ot_math_has_data ()">hb_ot_math_has_data</a>, function in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-is-glyph-extended-shape" title="hb_ot_math_is_glyph_extended_shape ()">hb_ot_math_is_glyph_extended_shape</a>, function in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-kern-t" title="enum hb_ot_math_kern_t">hb_ot_math_kern_t</a>, enum in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#HB-OT-MATH-SCRIPT:CAPS" title="HB_OT_MATH_SCRIPT">HB_OT_MATH_SCRIPT</a>, macro in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-math.html#HB-OT-TAG-MATH:CAPS" title="HB_OT_TAG_MATH">HB_OT_TAG_MATH</a>, macro in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-1-4-0.html b/docs/html/api-index-1-4-0.html
new file mode 100644 (file)
index 0000000..2a5080b
--- /dev/null
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 1.4.0: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-1-4-2.html" title="Index of new symbols in 1.4.2">
+<link rel="next" href="api-index-1-3-3.html" title="Index of new symbols in 1.3.3">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxS">S</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-1-4-2.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-1-3-3.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-1-4-0"></a>Index of new symbols in 1.4.0</h2></div></div></div>
+<a name="idx"></a><a name="idxS"></a><h3 class="title">S</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-create2" title="hb_shape_plan_create2 ()">hb_shape_plan_create2</a>, function in <a class="link" href="harfbuzz-hb-shape-plan.html" title="hb-shape-plan">hb-shape-plan</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-create-cached2" title="hb_shape_plan_create_cached2 ()">hb_shape_plan_create_cached2</a>, function in <a class="link" href="harfbuzz-hb-shape-plan.html" title="hb-shape-plan">hb-shape-plan</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-1-4-2.html b/docs/html/api-index-1-4-2.html
new file mode 100644 (file)
index 0000000..2f231f9
--- /dev/null
@@ -0,0 +1,88 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 1.4.2: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-1-4-3.html" title="Index of new symbols in 1.4.3">
+<link rel="next" href="api-index-1-4-0.html" title="Index of new symbols in 1.4.0">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxF">F</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxO">O</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxV">V</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-1-4-3.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-1-4-0.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-1-4-2"></a>Index of new symbols in 1.4.2</h2></div></div></div>
+<a name="idx"></a><a name="idxF"></a><h3 class="title">F</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-var-coords-normalized" title="hb_font_get_var_coords_normalized ()">hb_font_get_var_coords_normalized</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-variations" title="hb_font_set_variations ()">hb_font_set_variations</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-var-coords-design" title="hb_font_set_var_coords_design ()">hb_font_set_var_coords_design</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-var-coords-normalized" title="hb_font_set_var_coords_normalized ()">hb_font_set_var_coords_normalized</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<a name="idxO"></a><h3 class="title">O</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-ot-var-axis-t" title="hb_ot_var_axis_t">hb_ot_var_axis_t</a>, struct in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-var.html#hb-ot-var-get-axis-count" title="hb_ot_var_get_axis_count ()">hb_ot_var_get_axis_count</a>, function in <a class="link" href="harfbuzz-hb-ot-var.html" title="hb-ot-var">hb-ot-var</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-var.html#hb-ot-var-has-data" title="hb_ot_var_has_data ()">hb_ot_var_has_data</a>, function in <a class="link" href="harfbuzz-hb-ot-var.html" title="hb-ot-var">hb-ot-var</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-var.html#hb-ot-var-normalize-coords" title="hb_ot_var_normalize_coords ()">hb_ot_var_normalize_coords</a>, function in <a class="link" href="harfbuzz-hb-ot-var.html" title="hb-ot-var">hb-ot-var</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-var.html#hb-ot-var-normalize-variations" title="hb_ot_var_normalize_variations ()">hb_ot_var_normalize_variations</a>, function in <a class="link" href="harfbuzz-hb-ot-var.html" title="hb-ot-var">hb-ot-var</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#HB-OT-VAR-NO-AXIS-INDEX:CAPS" title="HB_OT_VAR_NO_AXIS_INDEX">HB_OT_VAR_NO_AXIS_INDEX</a>, macro in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<a name="idxV"></a><h3 class="title">V</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#hb-variation-from-string" title="hb_variation_from_string ()">hb_variation_from_string</a>, function in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#hb-variation-t" title="hb_variation_t">hb_variation_t</a>, struct in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#hb-variation-to-string" title="hb_variation_to_string ()">hb_variation_to_string</a>, function in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-1-4-3.html b/docs/html/api-index-1-4-3.html
new file mode 100644 (file)
index 0000000..80a5c53
--- /dev/null
@@ -0,0 +1,34 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 1.4.3: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-1-5-0.html" title="Index of new symbols in 1.5.0">
+<link rel="next" href="api-index-1-4-2.html" title="Index of new symbols in 1.4.2">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxF">F</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-1-5-0.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-1-4-2.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-1-4-3"></a>Index of new symbols in 1.4.3</h2></div></div></div>
+<a name="idx"></a><a name="idxF"></a><h3 class="title">F</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-face" title="hb_font_set_face ()">hb_font_set_face</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-1-5-0.html b/docs/html/api-index-1-5-0.html
new file mode 100644 (file)
index 0000000..d46687e
--- /dev/null
@@ -0,0 +1,53 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 1.5.0: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-1-6-0.html" title="Index of new symbols in 1.6.0">
+<link rel="next" href="api-index-1-4-3.html" title="Index of new symbols in 1.4.3">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxB">B</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxG">G</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-1-6-0.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-1-4-3.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-1-5-0"></a>Index of new symbols in 1.5.0</h2></div></div></div>
+<a name="idx"></a><a name="idxB"></a><h3 class="title">B</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-append" title="hb_buffer_append ()">hb_buffer_append</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-diff" title="hb_buffer_diff ()">hb_buffer_diff</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-diff-flags-t" title="enum hb_buffer_diff_flags_t">hb_buffer_diff_flags_t</a>, enum in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<a name="idxG"></a><h3 class="title">G</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-flags-t" title="enum hb_glyph_flags_t">hb_glyph_flags_t</a>, enum in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-info-get-glyph-flags" title="hb_glyph_info_get_glyph_flags ()">hb_glyph_info_get_glyph_flags</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-1-6-0.html b/docs/html/api-index-1-6-0.html
new file mode 100644 (file)
index 0000000..4f7c28b
--- /dev/null
@@ -0,0 +1,42 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 1.6.0: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-1-7-2.html" title="Index of new symbols in 1.7.2">
+<link rel="next" href="api-index-1-5-0.html" title="Index of new symbols in 1.5.0">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxF">F</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-1-7-2.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-1-5-0.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-1-6-0"></a>Index of new symbols in 1.6.0</h2></div></div></div>
+<a name="idx"></a><a name="idxF"></a><h3 class="title">F</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-get-table-tags" title="hb_face_get_table_tags ()">hb_face_get_table_tags</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-ptem" title="hb_font_get_ptem ()">hb_font_get_ptem</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-ptem" title="hb_font_set_ptem ()">hb_font_set_ptem</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-1-7-2.html b/docs/html/api-index-1-7-2.html
new file mode 100644 (file)
index 0000000..b2932dc
--- /dev/null
@@ -0,0 +1,34 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 1.7.2: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-1-7-5.html" title="Index of new symbols in 1.7.5">
+<link rel="next" href="api-index-1-6-0.html" title="Index of new symbols in 1.6.0">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxC">C</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-1-7-5.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-1-6-0.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-1-7-2"></a>Index of new symbols in 1.7.2</h2></div></div></div>
+<a name="idx"></a><a name="idxC"></a><h3 class="title">C</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-coretext.html#hb-coretext-font-create" title="hb_coretext_font_create ()">hb_coretext_font_create</a>, function in <a class="link" href="harfbuzz-hb-coretext.html" title="hb-coretext">hb-coretext</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-1-7-5.html b/docs/html/api-index-1-7-5.html
new file mode 100644 (file)
index 0000000..243f9da
--- /dev/null
@@ -0,0 +1,30 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 1.7.5: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-1-7-7.html" title="Index of new symbols in 1.7.7">
+<link rel="next" href="api-index-1-7-2.html" title="Index of new symbols in 1.7.2">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-1-7-7.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-1-7-2.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-1-7-5"></a>Index of new symbols in 1.7.5</h2></div></div></div>
+<a name="idx"></a>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-1-7-7.html b/docs/html/api-index-1-7-7.html
new file mode 100644 (file)
index 0000000..c2375f2
--- /dev/null
@@ -0,0 +1,104 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 1.7.7: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-1-8-0.html" title="Index of new symbols in 1.8.0">
+<link rel="next" href="api-index-1-7-5.html" title="Index of new symbols in 1.7.5">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxB">B</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxF">F</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxM">M</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-1-8-0.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-1-7-5.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-1-7-7"></a>Index of new symbols in 1.7.7</h2></div></div></div>
+<a name="idx"></a><a name="idxB"></a><h3 class="title">B</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-create-from-file" title="hb_blob_create_from_file ()">hb_blob_create_from_file</a>, function in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
+</dt>
+<dd></dd>
+<a name="idxF"></a><h3 class="title">F</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-count" title="hb_face_count ()">hb_face_count</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<a name="idxM"></a><h3 class="title">M</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-map.html#hb-map-allocation-successful" title="hb_map_allocation_successful ()">hb_map_allocation_successful</a>, function in <a class="link" href="harfbuzz-hb-map.html" title="hb-map">hb-map</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-map.html#hb-map-clear" title="hb_map_clear ()">hb_map_clear</a>, function in <a class="link" href="harfbuzz-hb-map.html" title="hb-map">hb-map</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-map.html#hb-map-create" title="hb_map_create ()">hb_map_create</a>, function in <a class="link" href="harfbuzz-hb-map.html" title="hb-map">hb-map</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-map.html#hb-map-del" title="hb_map_del ()">hb_map_del</a>, function in <a class="link" href="harfbuzz-hb-map.html" title="hb-map">hb-map</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-map.html#hb-map-destroy" title="hb_map_destroy ()">hb_map_destroy</a>, function in <a class="link" href="harfbuzz-hb-map.html" title="hb-map">hb-map</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-map.html#hb-map-get" title="hb_map_get ()">hb_map_get</a>, function in <a class="link" href="harfbuzz-hb-map.html" title="hb-map">hb-map</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-map.html#hb-map-get-empty" title="hb_map_get_empty ()">hb_map_get_empty</a>, function in <a class="link" href="harfbuzz-hb-map.html" title="hb-map">hb-map</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-map.html#hb-map-get-population" title="hb_map_get_population ()">hb_map_get_population</a>, function in <a class="link" href="harfbuzz-hb-map.html" title="hb-map">hb-map</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-map.html#hb-map-get-user-data" title="hb_map_get_user_data ()">hb_map_get_user_data</a>, function in <a class="link" href="harfbuzz-hb-map.html" title="hb-map">hb-map</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-map.html#hb-map-has" title="hb_map_has ()">hb_map_has</a>, function in <a class="link" href="harfbuzz-hb-map.html" title="hb-map">hb-map</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-map.html#hb-map-is-empty" title="hb_map_is_empty ()">hb_map_is_empty</a>, function in <a class="link" href="harfbuzz-hb-map.html" title="hb-map">hb-map</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-map.html#hb-map-reference" title="hb_map_reference ()">hb_map_reference</a>, function in <a class="link" href="harfbuzz-hb-map.html" title="hb-map">hb-map</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-map.html#hb-map-set" title="hb_map_set ()">hb_map_set</a>, function in <a class="link" href="harfbuzz-hb-map.html" title="hb-map">hb-map</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-map.html#hb-map-set-user-data" title="hb_map_set_user_data ()">hb_map_set_user_data</a>, function in <a class="link" href="harfbuzz-hb-map.html" title="hb-map">hb-map</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-map.html#HB-MAP-VALUE-INVALID:CAPS" title="HB_MAP_VALUE_INVALID">HB_MAP_VALUE_INVALID</a>, macro in <a class="link" href="harfbuzz-hb-map.html" title="hb-map">hb-map</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-1-8-0.html b/docs/html/api-index-1-8-0.html
new file mode 100644 (file)
index 0000000..da6ce0b
--- /dev/null
@@ -0,0 +1,65 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 1.8.0: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-1-8-1.html" title="Index of new symbols in 1.8.1">
+<link rel="next" href="api-index-1-7-7.html" title="Index of new symbols in 1.7.7">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxB">B</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxS">S</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-1-8-1.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-1-7-7.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-1-8-0"></a>Index of new symbols in 1.8.0</h2></div></div></div>
+<a name="idx"></a><a name="idxB"></a><h3 class="title">B</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-copy-writable-or-fail" title="hb_blob_copy_writable_or_fail ()">hb_blob_copy_writable_or_fail</a>, function in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
+</dt>
+<dd></dd>
+<a name="idxS"></a><h3 class="title">S</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-previous" title="hb_set_previous ()">hb_set_previous</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-previous-range" title="hb_set_previous_range ()">hb_set_previous_range</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-create-or-fail" title="hb_subset_input_create_or_fail ()">hb_subset_input_create_or_fail</a>, function in <a class="link" href="harfbuzz-hb-subset.html" title="hb-subset">hb-subset</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-destroy" title="hb_subset_input_destroy ()">hb_subset_input_destroy</a>, function in <a class="link" href="harfbuzz-hb-subset.html" title="hb-subset">hb-subset</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-glyph-set" title="hb_subset_input_glyph_set ()">hb_subset_input_glyph_set</a>, function in <a class="link" href="harfbuzz-hb-subset.html" title="hb-subset">hb-subset</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-reference" title="hb_subset_input_reference ()">hb_subset_input_reference</a>, function in <a class="link" href="harfbuzz-hb-subset.html" title="hb-subset">hb-subset</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-unicode-set" title="hb_subset_input_unicode_set ()">hb_subset_input_unicode_set</a>, function in <a class="link" href="harfbuzz-hb-subset.html" title="hb-subset">hb-subset</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-1-8-1.html b/docs/html/api-index-1-8-1.html
new file mode 100644 (file)
index 0000000..c773b0f
--- /dev/null
@@ -0,0 +1,41 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 1.8.1: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-1-8-5.html" title="Index of new symbols in 1.8.5">
+<link rel="next" href="api-index-1-8-0.html" title="Index of new symbols in 1.8.0">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxO">O</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxS">S</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-1-8-5.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-1-8-0.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-1-8-1"></a>Index of new symbols in 1.8.1</h2></div></div></div>
+<a name="idx"></a><a name="idxO"></a><h3 class="title">O</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-lookups-substitute-closure" title="hb_ot_layout_lookups_substitute_closure ()">hb_ot_layout_lookups_substitute_closure</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<a name="idxS"></a><h3 class="title">S</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-is-subset" title="hb_set_is_subset ()">hb_set_is_subset</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-1-8-5.html b/docs/html/api-index-1-8-5.html
new file mode 100644 (file)
index 0000000..d5bbc06
--- /dev/null
@@ -0,0 +1,34 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 1.8.5: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-1-8-6.html" title="Index of new symbols in 1.8.6">
+<link rel="next" href="api-index-1-8-1.html" title="Index of new symbols in 1.8.1">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxO">O</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-1-8-6.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-1-8-1.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-1-8-5"></a>Index of new symbols in 1.8.5</h2></div></div></div>
+<a name="idx"></a><a name="idxO"></a><h3 class="title">O</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-collect-features" title="hb_ot_layout_collect_features ()">hb_ot_layout_collect_features</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-1-8-6.html b/docs/html/api-index-1-8-6.html
new file mode 100644 (file)
index 0000000..eedfdf9
--- /dev/null
@@ -0,0 +1,50 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 1.8.6: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-1-9-0.html" title="Index of new symbols in 1.9.0">
+<link rel="next" href="api-index-1-8-5.html" title="Index of new symbols in 1.8.5">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxF">F</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-1-9-0.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-1-8-5.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-1-8-6"></a>Index of new symbols in 1.8.6</h2></div></div></div>
+<a name="idx"></a><a name="idxF"></a><h3 class="title">F</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-glyph-h-advances-func" title="hb_font_funcs_set_glyph_h_advances_func ()">hb_font_funcs_set_glyph_h_advances_func</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-glyph-v-advances-func" title="hb_font_funcs_set_glyph_v_advances_func ()">hb_font_funcs_set_glyph_v_advances_func</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-advances-for-direction" title="hb_font_get_glyph_advances_for_direction ()">hb_font_get_glyph_advances_for_direction</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-h-advances" title="hb_font_get_glyph_h_advances ()">hb_font_get_glyph_h_advances</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-v-advances" title="hb_font_get_glyph_v_advances ()">hb_font_get_glyph_v_advances</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-1-9-0.html b/docs/html/api-index-1-9-0.html
new file mode 100644 (file)
index 0000000..43cab97
--- /dev/null
@@ -0,0 +1,57 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 1.9.0: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-2-0-0.html" title="Index of new symbols in 2.0.0">
+<link rel="next" href="api-index-1-8-6.html" title="Index of new symbols in 1.8.6">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxF">F</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxU">U</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-2-0-0.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-1-8-6.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-1-9-0"></a>Index of new symbols in 1.9.0</h2></div></div></div>
+<a name="idx"></a><a name="idxF"></a><h3 class="title">F</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-builder-add-table" title="hb_face_builder_add_table ()">hb_face_builder_add_table</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-builder-create" title="hb_face_builder_create ()">hb_face_builder_create</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-collect-unicodes" title="hb_face_collect_unicodes ()">hb_face_collect_unicodes</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-collect-variation-selectors" title="hb_face_collect_variation_selectors ()">hb_face_collect_variation_selectors</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-collect-variation-unicodes" title="hb_face_collect_variation_unicodes ()">hb_face_collect_variation_unicodes</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<a name="idxU"></a><h3 class="title">U</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-unicode.html#HB-UNICODE-MAX:CAPS" title="HB_UNICODE_MAX">HB_UNICODE_MAX</a>, macro in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-2-0-0.html b/docs/html/api-index-2-0-0.html
new file mode 100644 (file)
index 0000000..c1538eb
--- /dev/null
@@ -0,0 +1,92 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 2.0.0: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-2-1-0.html" title="Index of new symbols in 2.1.0">
+<link rel="next" href="api-index-1-9-0.html" title="Index of new symbols in 1.9.0">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxB">B</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxF">F</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxO">O</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-2-1-0.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-1-9-0.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-2-0-0"></a>Index of new symbols in 2.0.0</h2></div></div></div>
+<a name="idx"></a><a name="idxB"></a><h3 class="title">B</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-invisible-glyph" title="hb_buffer_get_invisible_glyph ()">hb_buffer_get_invisible_glyph</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-invisible-glyph" title="hb_buffer_set_invisible_glyph ()">hb_buffer_set_invisible_glyph</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<a name="idxF"></a><h3 class="title">F</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#HB-FEATURE-GLOBAL-END:CAPS" title="HB_FEATURE_GLOBAL_END">HB_FEATURE_GLOBAL_END</a>, macro in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-common.html#HB-FEATURE-GLOBAL-START:CAPS" title="HB_FEATURE_GLOBAL_START">HB_FEATURE_GLOBAL_START</a>, macro in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-nominal-glyphs-func" title="hb_font_funcs_set_nominal_glyphs_func ()">hb_font_funcs_set_nominal_glyphs_func</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<a name="idxO"></a><h3 class="title">O</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-feature-get-characters" title="hb_ot_layout_feature_get_characters ()">hb_ot_layout_feature_get_characters</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-feature-get-name-ids" title="hb_ot_layout_feature_get_name_ids ()">hb_ot_layout_feature_get_name_ids</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-script-select-language" title="hb_ot_layout_script_select_language ()">hb_ot_layout_script_select_language</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-table-select-script" title="hb_ot_layout_table_select_script ()">hb_ot_layout_table_select_script</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-MAX-TAGS-PER-LANGUAGE:CAPS" title="HB_OT_MAX_TAGS_PER_LANGUAGE">HB_OT_MAX_TAGS_PER_LANGUAGE</a>, macro in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-MAX-TAGS-PER-SCRIPT:CAPS" title="HB_OT_MAX_TAGS_PER_SCRIPT">HB_OT_MAX_TAGS_PER_SCRIPT</a>, macro in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-id-t" title="hb_ot_name_id_t">hb_ot_name_id_t</a>, typedef in <a class="link" href="harfbuzz-hb-ot-name.html" title="hb-ot-name">hb-ot-name</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-tags-from-script-and-language" title="hb_ot_tags_from_script_and_language ()">hb_ot_tags_from_script_and_language</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-tags-to-script-and-language" title="hb_ot_tags_to_script_and_language ()">hb_ot_tags_to_script_and_language</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-2-1-0.html b/docs/html/api-index-2-1-0.html
new file mode 100644 (file)
index 0000000..20ad84b
--- /dev/null
@@ -0,0 +1,133 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 2.1.0: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-2-2-0.html" title="Index of new symbols in 2.2.0">
+<link rel="next" href="api-index-2-0-0.html" title="Index of new symbols in 2.0.0">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxC">C</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxO">O</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-2-2-0.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-2-0-0.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-2-1-0"></a>Index of new symbols in 2.1.0</h2></div></div></div>
+<a name="idx"></a><a name="idxC"></a><h3 class="title">C</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#HB-COLOR:CAPS" title="HB_COLOR()">HB_COLOR</a>, macro in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-color-get-alpha" title="hb_color_get_alpha ()">hb_color_get_alpha</a>, function in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-color-get-blue" title="hb_color_get_blue ()">hb_color_get_blue</a>, function in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-color-get-green" title="hb_color_get_green ()">hb_color_get_green</a>, function in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-color-get-red" title="hb_color_get_red ()">hb_color_get_red</a>, function in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-color-t" title="hb_color_t">hb_color_t</a>, typedef in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<a name="idxO"></a><h3 class="title">O</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-glyph-get-layers" title="hb_ot_color_glyph_get_layers ()">hb_ot_color_glyph_get_layers</a>, function in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-glyph-reference-png" title="hb_ot_color_glyph_reference_png ()">hb_ot_color_glyph_reference_png</a>, function in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-glyph-reference-svg" title="hb_ot_color_glyph_reference_svg ()">hb_ot_color_glyph_reference_svg</a>, function in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-has-layers" title="hb_ot_color_has_layers ()">hb_ot_color_has_layers</a>, function in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-has-palettes" title="hb_ot_color_has_palettes ()">hb_ot_color_has_palettes</a>, function in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-has-png" title="hb_ot_color_has_png ()">hb_ot_color_has_png</a>, function in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-has-svg" title="hb_ot_color_has_svg ()">hb_ot_color_has_svg</a>, function in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-layer-t" title="hb_ot_color_layer_t">hb_ot_color_layer_t</a>, struct in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-palette-color-get-name-id" title="hb_ot_color_palette_color_get_name_id ()">hb_ot_color_palette_color_get_name_id</a>, function in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-palette-flags-t" title="enum hb_ot_color_palette_flags_t">hb_ot_color_palette_flags_t</a>, enum in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-palette-get-colors" title="hb_ot_color_palette_get_colors ()">hb_ot_color_palette_get_colors</a>, function in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-palette-get-count" title="hb_ot_color_palette_get_count ()">hb_ot_color_palette_get_count</a>, function in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-palette-get-flags" title="hb_ot_color_palette_get_flags ()">hb_ot_color_palette_get_flags</a>, function in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-palette-get-name-id" title="hb_ot_color_palette_get_name_id ()">hb_ot_color_palette_get_name_id</a>, function in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-entry-t" title="hb_ot_name_entry_t">hb_ot_name_entry_t</a>, struct in <a class="link" href="harfbuzz-hb-ot-name.html" title="hb-ot-name">hb-ot-name</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-get-utf16" title="hb_ot_name_get_utf16 ()">hb_ot_name_get_utf16</a>, function in <a class="link" href="harfbuzz-hb-ot-name.html" title="hb-ot-name">hb-ot-name</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-get-utf32" title="hb_ot_name_get_utf32 ()">hb_ot_name_get_utf32</a>, function in <a class="link" href="harfbuzz-hb-ot-name.html" title="hb-ot-name">hb-ot-name</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-get-utf8" title="hb_ot_name_get_utf8 ()">hb_ot_name_get_utf8</a>, function in <a class="link" href="harfbuzz-hb-ot-name.html" title="hb-ot-name">hb-ot-name</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-list-names" title="hb_ot_name_list_names ()">hb_ot_name_list_names</a>, function in <a class="link" href="harfbuzz-hb-ot-name.html" title="hb-ot-name">hb-ot-name</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-2-2-0.html b/docs/html/api-index-2-2-0.html
new file mode 100644 (file)
index 0000000..679cc4b
--- /dev/null
@@ -0,0 +1,85 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 2.2.0: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-2-3-0.html" title="Index of new symbols in 2.3.0">
+<link rel="next" href="api-index-2-1-0.html" title="Index of new symbols in 2.1.0">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxA">A</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxO">O</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-2-3-0.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-2-1-0.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-2-2-0"></a>Index of new symbols in 2.2.0</h2></div></div></div>
+<a name="idx"></a><a name="idxA"></a><h3 class="title">A</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-aat-layout.html#hb-aat-layout-feature-selector-t" title="enum hb_aat_layout_feature_selector_t">hb_aat_layout_feature_selector_t</a>, enum in <a class="link" href="harfbuzz-hb-aat-layout.html" title="hb-aat-layout">hb-aat-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-aat-layout.html#hb-aat-layout-feature-type-get-name-id" title="hb_aat_layout_feature_type_get_name_id ()">hb_aat_layout_feature_type_get_name_id</a>, function in <a class="link" href="harfbuzz-hb-aat-layout.html" title="hb-aat-layout">hb-aat-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-aat-layout.html#hb-aat-layout-feature-type-get-selector-infos" title="hb_aat_layout_feature_type_get_selector_infos ()">hb_aat_layout_feature_type_get_selector_infos</a>, function in <a class="link" href="harfbuzz-hb-aat-layout.html" title="hb-aat-layout">hb-aat-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-aat-layout.html#hb-aat-layout-feature-type-t" title="enum hb_aat_layout_feature_type_t">hb_aat_layout_feature_type_t</a>, enum in <a class="link" href="harfbuzz-hb-aat-layout.html" title="hb-aat-layout">hb-aat-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-aat-layout.html#hb-aat-layout-get-feature-types" title="hb_aat_layout_get_feature_types ()">hb_aat_layout_get_feature_types</a>, function in <a class="link" href="harfbuzz-hb-aat-layout.html" title="hb-aat-layout">hb-aat-layout</a>
+</dt>
+<dd></dd>
+<a name="idxO"></a><h3 class="title">O</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-var.html#hb-ot-var-axis-flags-t" title="enum hb_ot_var_axis_flags_t">hb_ot_var_axis_flags_t</a>, enum in <a class="link" href="harfbuzz-hb-ot-var.html" title="hb-ot-var">hb-ot-var</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-var.html#hb-ot-var-axis-info-t" title="hb_ot_var_axis_info_t">hb_ot_var_axis_info_t</a>, struct in <a class="link" href="harfbuzz-hb-ot-var.html" title="hb-ot-var">hb-ot-var</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-var.html#hb-ot-var-find-axis-info" title="hb_ot_var_find_axis_info ()">hb_ot_var_find_axis_info</a>, function in <a class="link" href="harfbuzz-hb-ot-var.html" title="hb-ot-var">hb-ot-var</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-var.html#hb-ot-var-get-axis-infos" title="hb_ot_var_get_axis_infos ()">hb_ot_var_get_axis_infos</a>, function in <a class="link" href="harfbuzz-hb-ot-var.html" title="hb-ot-var">hb-ot-var</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-var.html#hb-ot-var-get-named-instance-count" title="hb_ot_var_get_named_instance_count ()">hb_ot_var_get_named_instance_count</a>, function in <a class="link" href="harfbuzz-hb-ot-var.html" title="hb-ot-var">hb-ot-var</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-var.html#hb-ot-var-named-instance-get-design-coords" title="hb_ot_var_named_instance_get_design_coords ()">hb_ot_var_named_instance_get_design_coords</a>, function in <a class="link" href="harfbuzz-hb-ot-var.html" title="hb-ot-var">hb-ot-var</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-var.html#hb-ot-var-named-instance-get-postscript-name-id" title="hb_ot_var_named_instance_get_postscript_name_id ()">hb_ot_var_named_instance_get_postscript_name_id</a>, function in <a class="link" href="harfbuzz-hb-ot-var.html" title="hb-ot-var">hb-ot-var</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-var.html#hb-ot-var-named-instance-get-subfamily-name-id" title="hb_ot_var_named_instance_get_subfamily_name_id ()">hb_ot_var_named_instance_get_subfamily_name_id</a>, function in <a class="link" href="harfbuzz-hb-ot-var.html" title="hb-ot-var">hb-ot-var</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-2-3-0.html b/docs/html/api-index-2-3-0.html
new file mode 100644 (file)
index 0000000..a5d1469
--- /dev/null
@@ -0,0 +1,42 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 2.3.0: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-2-4-0.html" title="Index of new symbols in 2.4.0">
+<link rel="next" href="api-index-2-2-0.html" title="Index of new symbols in 2.2.0">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxA">A</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-2-4-0.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-2-2-0.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-2-3-0"></a>Index of new symbols in 2.3.0</h2></div></div></div>
+<a name="idx"></a><a name="idxA"></a><h3 class="title">A</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-aat-layout.html#hb-aat-layout-has-positioning" title="hb_aat_layout_has_positioning ()">hb_aat_layout_has_positioning</a>, function in <a class="link" href="harfbuzz-hb-aat-layout.html" title="hb-aat-layout">hb-aat-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-aat-layout.html#hb-aat-layout-has-substitution" title="hb_aat_layout_has_substitution ()">hb_aat_layout_has_substitution</a>, function in <a class="link" href="harfbuzz-hb-aat-layout.html" title="hb-aat-layout">hb-aat-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-aat-layout.html#hb-aat-layout-has-tracking" title="hb_aat_layout_has_tracking ()">hb_aat_layout_has_tracking</a>, function in <a class="link" href="harfbuzz-hb-aat-layout.html" title="hb-aat-layout">hb-aat-layout</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-2-4-0.html b/docs/html/api-index-2-4-0.html
new file mode 100644 (file)
index 0000000..a139e30
--- /dev/null
@@ -0,0 +1,34 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 2.4.0: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-2-5-0.html" title="Index of new symbols in 2.5.0">
+<link rel="next" href="api-index-2-3-0.html" title="Index of new symbols in 2.3.0">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxD">D</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-2-5-0.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-2-3-0.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-2-4-0"></a>Index of new symbols in 2.4.0</h2></div></div></div>
+<a name="idx"></a><a name="idxD"></a><h3 class="title">D</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-directwrite.html#hb-directwrite-face-create" title="hb_directwrite_face_create ()">hb_directwrite_face_create</a>, function in <a class="link" href="harfbuzz-hb-directwrite.html" title="hb-directwrite">hb-directwrite</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-2-5-0.html b/docs/html/api-index-2-5-0.html
new file mode 100644 (file)
index 0000000..dd424af
--- /dev/null
@@ -0,0 +1,34 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 2.5.0: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-2-6-0.html" title="Index of new symbols in 2.6.0">
+<link rel="next" href="api-index-2-4-0.html" title="Index of new symbols in 2.4.0">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxD">D</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-2-6-0.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-2-4-0.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-2-5-0"></a>Index of new symbols in 2.5.0</h2></div></div></div>
+<a name="idx"></a><a name="idxD"></a><h3 class="title">D</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-directwrite.html#hb-directwrite-face-get-font-face" title="hb_directwrite_face_get_font_face ()">hb_directwrite_face_get_font_face</a>, function in <a class="link" href="harfbuzz-hb-directwrite.html" title="hb-directwrite">hb-directwrite</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-2-6-0.html b/docs/html/api-index-2-6-0.html
new file mode 100644 (file)
index 0000000..7918cd7
--- /dev/null
@@ -0,0 +1,84 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 2.6.0: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-2-6-3.html" title="Index of new symbols in 2.6.3">
+<link rel="next" href="api-index-2-5-0.html" title="Index of new symbols in 2.5.0">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxF">F</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxG">G</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxO">O</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-2-6-3.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-2-5-0.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-2-6-0"></a>Index of new symbols in 2.6.0</h2></div></div></div>
+<a name="idx"></a><a name="idxF"></a><h3 class="title">F</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-var-named-instance" title="hb_font_set_var_named_instance ()">hb_font_set_var_named_instance</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<a name="idxG"></a><h3 class="title">G</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-gdi.html#hb-gdi-face-create" title="hb_gdi_face_create ()">hb_gdi_face_create</a>, function in <a class="link" href="harfbuzz-hb-gdi.html" title="hb-gdi">hb-gdi</a>
+</dt>
+<dd></dd>
+<a name="idxO"></a><h3 class="title">O</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-baseline-tag-t" title="enum hb_ot_layout_baseline_tag_t">hb_ot_layout_baseline_tag_t</a>, enum in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-get-baseline" title="hb_ot_layout_get_baseline ()">hb_ot_layout_get_baseline</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-meta.html#hb-ot-meta-get-entry-tags" title="hb_ot_meta_get_entry_tags ()">hb_ot_meta_get_entry_tags</a>, function in <a class="link" href="harfbuzz-hb-ot-meta.html" title="hb-ot-meta">hb-ot-meta</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-meta.html#hb-ot-meta-reference-entry" title="hb_ot_meta_reference_entry ()">hb_ot_meta_reference_entry</a>, function in <a class="link" href="harfbuzz-hb-ot-meta.html" title="hb-ot-meta">hb-ot-meta</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-meta.html#hb-ot-meta-tag-t" title="enum hb_ot_meta_tag_t">hb_ot_meta_tag_t</a>, enum in <a class="link" href="harfbuzz-hb-ot-meta.html" title="hb-ot-meta">hb-ot-meta</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-metrics.html#hb-ot-metrics-get-position" title="hb_ot_metrics_get_position ()">hb_ot_metrics_get_position</a>, function in <a class="link" href="harfbuzz-hb-ot-metrics.html" title="hb-ot-metrics">hb-ot-metrics</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-metrics.html#hb-ot-metrics-get-variation" title="hb_ot_metrics_get_variation ()">hb_ot_metrics_get_variation</a>, function in <a class="link" href="harfbuzz-hb-ot-metrics.html" title="hb-ot-metrics">hb-ot-metrics</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-metrics.html#hb-ot-metrics-get-x-variation" title="hb_ot_metrics_get_x_variation ()">hb_ot_metrics_get_x_variation</a>, function in <a class="link" href="harfbuzz-hb-ot-metrics.html" title="hb-ot-metrics">hb-ot-metrics</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-metrics.html#hb-ot-metrics-get-y-variation" title="hb_ot_metrics_get_y_variation ()">hb_ot_metrics_get_y_variation</a>, function in <a class="link" href="harfbuzz-hb-ot-metrics.html" title="hb-ot-metrics">hb-ot-metrics</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-metrics.html#hb-ot-metrics-tag-t" title="enum hb_ot_metrics_tag_t">hb_ot_metrics_tag_t</a>, enum in <a class="link" href="harfbuzz-hb-ot-metrics.html" title="hb-ot-metrics">hb-ot-metrics</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-2-6-3.html b/docs/html/api-index-2-6-3.html
new file mode 100644 (file)
index 0000000..da3e73d
--- /dev/null
@@ -0,0 +1,34 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 2.6.3: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-2-6-5.html" title="Index of new symbols in 2.6.5">
+<link rel="next" href="api-index-2-6-0.html" title="Index of new symbols in 2.6.0">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxF">F</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-2-6-5.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-2-6-0.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-2-6-3"></a>Index of new symbols in 2.6.3</h2></div></div></div>
+<a name="idx"></a><a name="idxF"></a><h3 class="title">F</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-nominal-glyphs" title="hb_font_get_nominal_glyphs ()">hb_font_get_nominal_glyphs</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-2-6-5.html b/docs/html/api-index-2-6-5.html
new file mode 100644 (file)
index 0000000..0c5d9d6
--- /dev/null
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 2.6.5: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-2-6-8.html" title="Index of new symbols in 2.6.8">
+<link rel="next" href="api-index-2-6-3.html" title="Index of new symbols in 2.6.3">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxF">F</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-2-6-8.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-2-6-3.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-2-6-5"></a>Index of new symbols in 2.6.5</h2></div></div></div>
+<a name="idx"></a><a name="idxF"></a><h3 class="title">F</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-ft.html#hb-ft-font-lock-face" title="hb_ft_font_lock_face ()">hb_ft_font_lock_face</a>, function in <a class="link" href="harfbuzz-hb-ft.html" title="hb-ft">hb-ft</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ft.html#hb-ft-font-unlock-face" title="hb_ft_font_unlock_face ()">hb_ft_font_unlock_face</a>, function in <a class="link" href="harfbuzz-hb-ft.html" title="hb-ft">hb-ft</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-2-6-8.html b/docs/html/api-index-2-6-8.html
new file mode 100644 (file)
index 0000000..07c9b88
--- /dev/null
@@ -0,0 +1,34 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 2.6.8: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-2-7-3.html" title="Index of new symbols in 2.7.3">
+<link rel="next" href="api-index-2-6-5.html" title="Index of new symbols in 2.6.5">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxO">O</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-2-7-3.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-2-6-5.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-2-6-8"></a>Index of new symbols in 2.6.8</h2></div></div></div>
+<a name="idx"></a><a name="idxO"></a><h3 class="title">O</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-lookup-get-glyph-alternates" title="hb_ot_layout_lookup_get_glyph_alternates ()">hb_ot_layout_lookup_get_glyph_alternates</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-2-7-3.html b/docs/html/api-index-2-7-3.html
new file mode 100644 (file)
index 0000000..9eee8e1
--- /dev/null
@@ -0,0 +1,46 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 2.7.3: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-2-8-2.html" title="Index of new symbols in 2.8.2">
+<link rel="next" href="api-index-2-6-8.html" title="Index of new symbols in 2.6.8">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxB">B</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-2-8-2.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-2-6-8.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-2-7-3"></a>Index of new symbols in 2.7.3</h2></div></div></div>
+<a name="idx"></a><a name="idxB"></a><h3 class="title">B</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-deserialize-unicode" title="hb_buffer_deserialize_unicode ()">hb_buffer_deserialize_unicode</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-has-positions" title="hb_buffer_has_positions ()">hb_buffer_has_positions</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize" title="hb_buffer_serialize ()">hb_buffer_serialize</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-unicode" title="hb_buffer_serialize_unicode ()">hb_buffer_serialize_unicode</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-2-8-2.html b/docs/html/api-index-2-8-2.html
new file mode 100644 (file)
index 0000000..8ef0da9
--- /dev/null
@@ -0,0 +1,45 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 2.8.2: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-2-9-0.html" title="Index of new symbols in 2.9.0">
+<link rel="next" href="api-index-2-7-3.html" title="Index of new symbols in 2.7.3">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxB">B</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxS">S</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-2-9-0.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-2-7-3.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-2-8-2"></a>Index of new symbols in 2.8.2</h2></div></div></div>
+<a name="idx"></a><a name="idxB"></a><h3 class="title">B</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-create-from-file-or-fail" title="hb_blob_create_from_file_or_fail ()">hb_blob_create_from_file_or_fail</a>, function in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-create-or-fail" title="hb_blob_create_or_fail ()">hb_blob_create_or_fail</a>, function in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
+</dt>
+<dd></dd>
+<a name="idxS"></a><h3 class="title">S</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-copy" title="hb_set_copy ()">hb_set_copy</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-2-9-0.html b/docs/html/api-index-2-9-0.html
new file mode 100644 (file)
index 0000000..c5291d2
--- /dev/null
@@ -0,0 +1,54 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 2.9.0: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-2-9-1.html" title="Index of new symbols in 2.9.1">
+<link rel="next" href="api-index-2-8-2.html" title="Index of new symbols in 2.8.2">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxS">S</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-2-9-1.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-2-8-2.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-2-9-0"></a>Index of new symbols in 2.9.0</h2></div></div></div>
+<a name="idx"></a><a name="idxS"></a><h3 class="title">S</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-subset.html#hb-subset-flags-t" title="enum hb_subset_flags_t">hb_subset_flags_t</a>, enum in <a class="link" href="harfbuzz-hb-subset.html" title="hb-subset">hb-subset</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-get-flags" title="hb_subset_input_get_flags ()">hb_subset_input_get_flags</a>, function in <a class="link" href="harfbuzz-hb-subset.html" title="hb-subset">hb-subset</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-get-user-data" title="hb_subset_input_get_user_data ()">hb_subset_input_get_user_data</a>, function in <a class="link" href="harfbuzz-hb-subset.html" title="hb-subset">hb-subset</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-set-flags" title="hb_subset_input_set_flags ()">hb_subset_input_set_flags</a>, function in <a class="link" href="harfbuzz-hb-subset.html" title="hb-subset">hb-subset</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-set-user-data" title="hb_subset_input_set_user_data ()">hb_subset_input_set_user_data</a>, function in <a class="link" href="harfbuzz-hb-subset.html" title="hb-subset">hb-subset</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-subset.html#hb-subset-or-fail" title="hb_subset_or_fail ()">hb_subset_or_fail</a>, function in <a class="link" href="harfbuzz-hb-subset.html" title="hb-subset">hb-subset</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-2-9-1.html b/docs/html/api-index-2-9-1.html
new file mode 100644 (file)
index 0000000..d387c38
--- /dev/null
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 2.9.1: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-3-0-0.html" title="Index of new symbols in 3.0.0">
+<link rel="next" href="api-index-2-9-0.html" title="Index of new symbols in 2.9.0">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxS">S</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-3-0-0.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-2-9-0.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-2-9-1"></a>Index of new symbols in 2.9.1</h2></div></div></div>
+<a name="idx"></a><a name="idxS"></a><h3 class="title">S</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-set" title="hb_subset_input_set ()">hb_subset_input_set</a>, function in <a class="link" href="harfbuzz-hb-subset.html" title="hb-subset">hb-subset</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-subset.html#hb-subset-sets-t" title="enum hb_subset_sets_t">hb_subset_sets_t</a>, enum in <a class="link" href="harfbuzz-hb-subset.html" title="hb-subset">hb-subset</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-3-0-0.html b/docs/html/api-index-3-0-0.html
new file mode 100644 (file)
index 0000000..642cac3
--- /dev/null
@@ -0,0 +1,42 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 3.0.0: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-3-1-0.html" title="Index of new symbols in 3.1.0">
+<link rel="next" href="api-index-2-9-1.html" title="Index of new symbols in 2.9.1">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxS">S</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-3-1-0.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-2-9-1.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-3-0-0"></a>Index of new symbols in 3.0.0</h2></div></div></div>
+<a name="idx"></a><a name="idxS"></a><h3 class="title">S</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-invert" title="hb_set_invert ()">hb_set_invert</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-style.html#hb-style-get-value" title="hb_style_get_value ()">hb_style_get_value</a>, function in <a class="link" href="harfbuzz-hb-style.html" title="hb-style">hb-style</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-style.html#hb-style-tag-t" title="enum hb_style_tag_t">hb_style_tag_t</a>, enum in <a class="link" href="harfbuzz-hb-style.html" title="hb-style">hb-style</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-3-1-0.html b/docs/html/api-index-3-1-0.html
new file mode 100644 (file)
index 0000000..2da6cdc
--- /dev/null
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 3.1.0: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-3-3-0.html" title="Index of new symbols in 3.3.0">
+<link rel="next" href="api-index-3-0-0.html" title="Index of new symbols in 3.0.0">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxB">B</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-3-3-0.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-3-0-0.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-3-1-0"></a>Index of new symbols in 3.1.0</h2></div></div></div>
+<a name="idx"></a><a name="idxB"></a><h3 class="title">B</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-not-found-glyph" title="hb_buffer_get_not_found_glyph ()">hb_buffer_get_not_found_glyph</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-not-found-glyph" title="hb_buffer_set_not_found_glyph ()">hb_buffer_set_not_found_glyph</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-3-3-0.html b/docs/html/api-index-3-3-0.html
new file mode 100644 (file)
index 0000000..8978725
--- /dev/null
@@ -0,0 +1,56 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 3.3.0: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-3-4-0.html" title="Index of new symbols in 3.4.0">
+<link rel="next" href="api-index-3-1-0.html" title="Index of new symbols in 3.1.0">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxB">B</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxF">F</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxS">S</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-3-4-0.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-3-1-0.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-3-3-0"></a>Index of new symbols in 3.3.0</h2></div></div></div>
+<a name="idx"></a><a name="idxB"></a><h3 class="title">B</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-create-similar" title="hb_buffer_create_similar ()">hb_buffer_create_similar</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<a name="idxF"></a><h3 class="title">F</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-synthetic-slant" title="hb_font_get_synthetic_slant ()">hb_font_get_synthetic_slant</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-var-coords-design" title="hb_font_get_var_coords_design ()">hb_font_get_var_coords_design</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-synthetic-slant" title="hb_font_set_synthetic_slant ()">hb_font_set_synthetic_slant</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<a name="idxS"></a><h3 class="title">S</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-overlay" title="hb_segment_properties_overlay ()">hb_segment_properties_overlay</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-3-4-0.html b/docs/html/api-index-3-4-0.html
new file mode 100644 (file)
index 0000000..a543f49
--- /dev/null
@@ -0,0 +1,42 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 3.4.0: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="deprecated-api-index.html" title="Index of deprecated API">
+<link rel="next" href="api-index-3-3-0.html" title="Index of new symbols in 3.3.0">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxO">O</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="deprecated-api-index.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-3-3-0.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-3-4-0"></a>Index of new symbols in 3.4.0</h2></div></div></div>
+<a name="idx"></a><a name="idxO"></a><h3 class="title">O</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-get-glyph-kernings" title="hb_ot_math_get_glyph_kernings ()">hb_ot_math_get_glyph_kernings</a>, function in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-kern-entry-t" title="hb_ot_math_kern_entry_t">hb_ot_math_kern_entry_t</a>, struct in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-math.html#HB-OT-TAG-MATH-SCRIPT:CAPS" title="HB_OT_TAG_MATH_SCRIPT">HB_OT_TAG_MATH_SCRIPT</a>, macro in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
index c6c152e..4cbdff0 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>API Index: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="pt02.html" title="Part II. Reference manual">
-<link rel="prev" href="harfbuzz-hb-uniscribe.html" title="hb-uniscribe">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="harfbuzz-hb-subset.html" title="hb-subset">
 <link rel="next" href="deprecated-api-index.html" title="Index of deprecated API">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -45,8 +45,8 @@
                      <span class="dim">|</span> 
                   <a class="shortcut" href="#idxV">V</a></span></td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
-<td><a accesskey="p" href="harfbuzz-hb-uniscribe.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="harfbuzz-hb-subset.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
 <td><a accesskey="n" href="deprecated-api-index.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <div class="index">
 <a name="api-index-full"></a>API Index</h2></div></div></div>
 <a name="idx"></a><a name="idxA"></a><h3 class="title">A</h3>
 <dt>
+<a class="link" href="harfbuzz-hb-aat-layout.html#hb-aat-layout-feature-selector-info-t" title="hb_aat_layout_feature_selector_info_t">hb_aat_layout_feature_selector_info_t</a>, struct in <a class="link" href="harfbuzz-hb-aat-layout.html" title="hb-aat-layout">hb-aat-layout</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="harfbuzz-hb-aat-layout.html#hb-aat-layout-feature-selector-t" title="enum hb_aat_layout_feature_selector_t">hb_aat_layout_feature_selector_t</a>, enum in <a class="link" href="harfbuzz-hb-aat-layout.html" title="hb-aat-layout">hb-aat-layout</a>
 </dt>
 <dd></dd>
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-create-from-file-or-fail" title="hb_blob_create_from_file_or_fail ()">hb_blob_create_from_file_or_fail</a>, function in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-create-or-fail" title="hb_blob_create_or_fail ()">hb_blob_create_or_fail</a>, function in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="harfbuzz-hb-blob.html#hb-blob-create-sub-blob" title="hb_blob_create_sub_blob ()">hb_blob_create_sub_blob</a>, function in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
 </dt>
 <dd></dd>
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-create-similar" title="hb_buffer_create_similar ()">hb_buffer_create_similar</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-deserialize-glyphs" title="hb_buffer_deserialize_glyphs ()">hb_buffer_deserialize_glyphs</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-deserialize-unicode" title="hb_buffer_deserialize_unicode ()">hb_buffer_deserialize_unicode</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-destroy" title="hb_buffer_destroy ()">hb_buffer_destroy</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
 </dt>
 <dd></dd>
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-not-found-glyph" title="hb_buffer_get_not_found_glyph ()">hb_buffer_get_not_found_glyph</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-replacement-codepoint" title="hb_buffer_get_replacement_codepoint ()">hb_buffer_get_replacement_codepoint</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
 </dt>
 <dd></dd>
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-has-positions" title="hb_buffer_has_positions ()">hb_buffer_has_positions</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-message-func-t" title="hb_buffer_message_func_t ()">hb_buffer_message_func_t</a>, user_function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
 </dt>
 <dd></dd>
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize" title="hb_buffer_serialize ()">hb_buffer_serialize</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="harfbuzz-hb-deprecated.html#HB-BUFFER-SERIALIZE-FLAGS-DEFAULT:CAPS" title="HB_BUFFER_SERIALIZE_FLAGS_DEFAULT">HB_BUFFER_SERIALIZE_FLAGS_DEFAULT</a>, macro in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
 </dt>
 <dd></dd>
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-unicode" title="hb_buffer_serialize_unicode ()">hb_buffer_serialize_unicode</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-cluster-level" title="hb_buffer_set_cluster_level ()">hb_buffer_set_cluster_level</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
 </dt>
 <dd></dd>
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-not-found-glyph" title="hb_buffer_set_not_found_glyph ()">hb_buffer_set_not_found_glyph</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-replacement-codepoint" title="hb_buffer_set_replacement_codepoint ()">hb_buffer_set_replacement_codepoint</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
 </dt>
 <dd></dd>
 </dt>
 <dd></dd>
 <dt>
-hb_directwrite_face_create, function in hb-directwrite
+<a class="link" href="harfbuzz-hb-directwrite.html#hb-directwrite-face-create" title="hb_directwrite_face_create ()">hb_directwrite_face_create</a>, function in <a class="link" href="harfbuzz-hb-directwrite.html" title="hb-directwrite">hb-directwrite</a>
 </dt>
 <dd></dd>
 <dt>
-hb_directwrite_face_get_font_face, function in hb-directwrite
+<a class="link" href="harfbuzz-hb-directwrite.html#hb-directwrite-face-get-font-face" title="hb_directwrite_face_get_font_face ()">hb_directwrite_face_get_font_face</a>, function in <a class="link" href="harfbuzz-hb-directwrite.html" title="hb-directwrite">hb-directwrite</a>
 </dt>
 <dd></dd>
 <a name="idxF"></a><h3 class="title">F</h3>
@@ -654,6 +694,10 @@ hb_directwrite_face_get_font_face, function in hb-directwrite
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-extents-t" title="hb_font_extents_t">hb_font_extents_t</a>, struct in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-create" title="hb_font_funcs_create ()">hb_font_funcs_create</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
 </dt>
 <dd></dd>
@@ -962,6 +1006,10 @@ hb_directwrite_face_get_font_face, function in hb-directwrite
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-synthetic-slant" title="hb_font_get_synthetic_slant ()">hb_font_get_synthetic_slant</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="harfbuzz-hb-font.html#hb-font-get-user-data" title="hb_font_get_user_data ()">hb_font_get_user_data</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
 </dt>
 <dd></dd>
@@ -1034,6 +1082,10 @@ hb_directwrite_face_get_font_face, function in hb-directwrite
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-synthetic-slant" title="hb_font_set_synthetic_slant ()">hb_font_set_synthetic_slant</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="harfbuzz-hb-font.html#hb-font-set-user-data" title="hb_font_set_user_data ()">hb_font_set_user_data</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
 </dt>
 <dd></dd>
@@ -1111,7 +1163,7 @@ hb_directwrite_face_get_font_face, function in hb-directwrite
 <dd></dd>
 <a name="idxG"></a><h3 class="title">G</h3>
 <dt>
-hb_gdi_face_create, function in hb-gdi
+<a class="link" href="harfbuzz-hb-gdi.html#hb-gdi-face-create" title="hb_gdi_face_create ()">hb_gdi_face_create</a>, function in <a class="link" href="harfbuzz-hb-gdi.html" title="hb-gdi">hb-gdi</a>
 </dt>
 <dd></dd>
 <dt>
@@ -1131,6 +1183,10 @@ hb_gdi_face_create, function in hb-gdi
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-glyph-extents-t" title="hb_glyph_extents_t">hb_glyph_extents_t</a>, struct in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-flags-t" title="enum hb_glyph_flags_t">hb_glyph_flags_t</a>, enum in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
 </dt>
 <dd></dd>
@@ -1139,6 +1195,10 @@ hb_gdi_face_create, function in hb-gdi
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-info-t" title="hb_glyph_info_t">hb_glyph_info_t</a>, struct in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-position-t" title="hb_glyph_position_t">hb_glyph_position_t</a>, struct in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
 </dt>
 <dd></dd>
@@ -1291,6 +1351,10 @@ hb_gdi_face_create, function in hb-gdi
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-layer-t" title="hb_ot_color_layer_t">hb_ot_color_layer_t</a>, struct in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-palette-color-get-name-id" title="hb_ot_color_palette_color_get_name_id ()">hb_ot_color_palette_color_get_name_id</a>, function in <a class="link" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">hb-ot-color</a>
 </dt>
 <dd></dd>
@@ -1323,14 +1387,6 @@ hb_gdi_face_create, function in hb-gdi
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-closure-features" title="hb_ot_layout_closure_features ()">hb_ot_layout_closure_features</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-closure-lookups" title="hb_ot_layout_closure_lookups ()">hb_ot_layout_closure_lookups</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
-</dt>
-<dd></dd>
-<dt>
 <a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-collect-features" title="hb_ot_layout_collect_features ()">hb_ot_layout_collect_features</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
 </dt>
 <dd></dd>
@@ -1387,10 +1443,6 @@ hb_gdi_face_create, function in hb-gdi
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-glyph-sequence-func-t" title="hb_ot_layout_glyph_sequence_func_t ()">hb_ot_layout_glyph_sequence_func_t</a>, user_function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
-</dt>
-<dd></dd>
-<dt>
 <a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-has-glyph-classes" title="hb_ot_layout_has_glyph_classes ()">hb_ot_layout_has_glyph_classes</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
 </dt>
 <dd></dd>
@@ -1431,6 +1483,10 @@ hb_gdi_face_create, function in hb-gdi
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-lookup-get-glyph-alternates" title="hb_ot_layout_lookup_get_glyph_alternates ()">hb_ot_layout_lookup_get_glyph_alternates</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-lookup-substitute-closure" title="hb_ot_layout_lookup_substitute_closure ()">hb_ot_layout_lookup_substitute_closure</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
 </dt>
 <dd></dd>
@@ -1503,6 +1559,10 @@ hb_gdi_face_create, function in hb-gdi
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-get-glyph-kernings" title="hb_ot_math_get_glyph_kernings ()">hb_ot_math_get_glyph_kernings</a>, function in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-get-glyph-top-accent-attachment" title="hb_ot_math_get_glyph_top_accent_attachment ()">hb_ot_math_get_glyph_top_accent_attachment</a>, function in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
 </dt>
 <dd></dd>
@@ -1535,11 +1595,15 @@ hb_gdi_face_create, function in hb-gdi
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-kern-entry-t" title="hb_ot_math_kern_entry_t">hb_ot_math_kern_entry_t</a>, struct in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-kern-t" title="enum hb_ot_math_kern_t">hb_ot_math_kern_t</a>, enum in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="harfbuzz-hb-ot-math.html#HB-OT-MATH-SCRIPT:CAPS" title="HB_OT_MATH_SCRIPT">HB_OT_MATH_SCRIPT</a>, macro in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+<a class="link" href="harfbuzz-hb-deprecated.html#HB-OT-MATH-SCRIPT:CAPS" title="HB_OT_MATH_SCRIPT">HB_OT_MATH_SCRIPT</a>, macro in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
 </dt>
 <dd></dd>
 <dt>
@@ -1551,35 +1615,39 @@ hb_gdi_face_create, function in hb-gdi
 </dt>
 <dd></dd>
 <dt>
-hb_ot_meta_get_entry_tags, function in hb-ot-meta
+<a class="link" href="harfbuzz-hb-ot-meta.html#hb-ot-meta-get-entry-tags" title="hb_ot_meta_get_entry_tags ()">hb_ot_meta_get_entry_tags</a>, function in <a class="link" href="harfbuzz-hb-ot-meta.html" title="hb-ot-meta">hb-ot-meta</a>
 </dt>
 <dd></dd>
 <dt>
-hb_ot_meta_reference_entry, function in hb-ot-meta
+<a class="link" href="harfbuzz-hb-ot-meta.html#hb-ot-meta-reference-entry" title="hb_ot_meta_reference_entry ()">hb_ot_meta_reference_entry</a>, function in <a class="link" href="harfbuzz-hb-ot-meta.html" title="hb-ot-meta">hb-ot-meta</a>
 </dt>
 <dd></dd>
 <dt>
-hb_ot_meta_tag_t, enum in hb-ot-meta
+<a class="link" href="harfbuzz-hb-ot-meta.html#hb-ot-meta-tag-t" title="enum hb_ot_meta_tag_t">hb_ot_meta_tag_t</a>, enum in <a class="link" href="harfbuzz-hb-ot-meta.html" title="hb-ot-meta">hb-ot-meta</a>
 </dt>
 <dd></dd>
 <dt>
-hb_ot_metrics_get_position, function in hb-ot-metrics
+<a class="link" href="harfbuzz-hb-ot-metrics.html#hb-ot-metrics-get-position" title="hb_ot_metrics_get_position ()">hb_ot_metrics_get_position</a>, function in <a class="link" href="harfbuzz-hb-ot-metrics.html" title="hb-ot-metrics">hb-ot-metrics</a>
 </dt>
 <dd></dd>
 <dt>
-hb_ot_metrics_get_variation, function in hb-ot-metrics
+<a class="link" href="harfbuzz-hb-ot-metrics.html#hb-ot-metrics-get-variation" title="hb_ot_metrics_get_variation ()">hb_ot_metrics_get_variation</a>, function in <a class="link" href="harfbuzz-hb-ot-metrics.html" title="hb-ot-metrics">hb-ot-metrics</a>
 </dt>
 <dd></dd>
 <dt>
-hb_ot_metrics_get_x_variation, function in hb-ot-metrics
+<a class="link" href="harfbuzz-hb-ot-metrics.html#hb-ot-metrics-get-x-variation" title="hb_ot_metrics_get_x_variation ()">hb_ot_metrics_get_x_variation</a>, function in <a class="link" href="harfbuzz-hb-ot-metrics.html" title="hb-ot-metrics">hb-ot-metrics</a>
 </dt>
 <dd></dd>
 <dt>
-hb_ot_metrics_get_y_variation, function in hb-ot-metrics
+<a class="link" href="harfbuzz-hb-ot-metrics.html#hb-ot-metrics-get-y-variation" title="hb_ot_metrics_get_y_variation ()">hb_ot_metrics_get_y_variation</a>, function in <a class="link" href="harfbuzz-hb-ot-metrics.html" title="hb-ot-metrics">hb-ot-metrics</a>
 </dt>
 <dd></dd>
 <dt>
-hb_ot_metrics_tag_t, enum in hb-ot-metrics
+<a class="link" href="harfbuzz-hb-ot-metrics.html#hb-ot-metrics-tag-t" title="enum hb_ot_metrics_tag_t">hb_ot_metrics_tag_t</a>, enum in <a class="link" href="harfbuzz-hb-ot-metrics.html" title="hb-ot-metrics">hb-ot-metrics</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-entry-t" title="hb_ot_name_entry_t">hb_ot_name_entry_t</a>, struct in <a class="link" href="harfbuzz-hb-ot-name.html" title="hb-ot-name">hb-ot-name</a>
 </dt>
 <dd></dd>
 <dt>
@@ -1651,6 +1719,10 @@ hb_ot_metrics_tag_t, enum in hb-ot-metrics
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="harfbuzz-hb-ot-math.html#HB-OT-TAG-MATH-SCRIPT:CAPS" title="HB_OT_TAG_MATH_SCRIPT">HB_OT_TAG_MATH_SCRIPT</a>, macro in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-tag-to-language" title="hb_ot_tag_to_language ()">hb_ot_tag_to_language</a>, function in <a class="link" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">hb-ot-layout</a>
 </dt>
 <dd></dd>
@@ -1683,6 +1755,14 @@ hb_ot_metrics_tag_t, enum in hb-ot-metrics
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="harfbuzz-hb-ot-var.html#hb-ot-var-axis-info-t" title="hb_ot_var_axis_info_t">hb_ot_var_axis_info_t</a>, struct in <a class="link" href="harfbuzz-hb-ot-var.html" title="hb-ot-var">hb-ot-var</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-ot-var-axis-t" title="hb_ot_var_axis_t">hb_ot_var_axis_t</a>, struct in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="harfbuzz-hb-ot-var.html#hb-ot-var-find-axis-info" title="hb_ot_var_find_axis_info ()">hb_ot_var_find_axis_info</a>, function in <a class="link" href="harfbuzz-hb-ot-var.html" title="hb-ot-var">hb-ot-var</a>
 </dt>
 <dd></dd>
@@ -1774,6 +1854,10 @@ hb_ot_metrics_tag_t, enum in hb-ot-metrics
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-overlay" title="hb_segment_properties_overlay ()">hb_segment_properties_overlay</a>, function in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-t" title="hb_segment_properties_t">hb_segment_properties_t</a>, struct in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
 </dt>
 <dd></dd>
@@ -1794,6 +1878,10 @@ hb_ot_metrics_tag_t, enum in hb-ot-metrics
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-copy" title="hb_set_copy ()">hb_set_copy</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="harfbuzz-hb-set.html#hb-set-create" title="hb_set_create ()">hb_set_create</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
 </dt>
 <dd></dd>
@@ -1838,6 +1926,10 @@ hb_ot_metrics_tag_t, enum in hb-ot-metrics
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-invert" title="hb_set_invert ()">hb_set_invert</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="harfbuzz-hb-set.html#hb-set-is-empty" title="hb_set_is_empty ()">hb_set_is_empty</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
 </dt>
 <dd></dd>
@@ -1957,6 +2049,70 @@ hb_ot_metrics_tag_t, enum in hb-ot-metrics
 <a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t" title="hb_shape_plan_t">hb_shape_plan_t</a>, typedef in <a class="link" href="harfbuzz-hb-shape-plan.html" title="hb-shape-plan">hb-shape-plan</a>
 </dt>
 <dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-style.html#hb-style-get-value" title="hb_style_get_value ()">hb_style_get_value</a>, function in <a class="link" href="harfbuzz-hb-style.html" title="hb-style">hb-style</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-style.html#hb-style-tag-t" title="enum hb_style_tag_t">hb_style_tag_t</a>, enum in <a class="link" href="harfbuzz-hb-style.html" title="hb-style">hb-style</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-subset.html#hb-subset-flags-t" title="enum hb_subset_flags_t">hb_subset_flags_t</a>, enum in <a class="link" href="harfbuzz-hb-subset.html" title="hb-subset">hb-subset</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-create-or-fail" title="hb_subset_input_create_or_fail ()">hb_subset_input_create_or_fail</a>, function in <a class="link" href="harfbuzz-hb-subset.html" title="hb-subset">hb-subset</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-destroy" title="hb_subset_input_destroy ()">hb_subset_input_destroy</a>, function in <a class="link" href="harfbuzz-hb-subset.html" title="hb-subset">hb-subset</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-get-flags" title="hb_subset_input_get_flags ()">hb_subset_input_get_flags</a>, function in <a class="link" href="harfbuzz-hb-subset.html" title="hb-subset">hb-subset</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-get-user-data" title="hb_subset_input_get_user_data ()">hb_subset_input_get_user_data</a>, function in <a class="link" href="harfbuzz-hb-subset.html" title="hb-subset">hb-subset</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-glyph-set" title="hb_subset_input_glyph_set ()">hb_subset_input_glyph_set</a>, function in <a class="link" href="harfbuzz-hb-subset.html" title="hb-subset">hb-subset</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-reference" title="hb_subset_input_reference ()">hb_subset_input_reference</a>, function in <a class="link" href="harfbuzz-hb-subset.html" title="hb-subset">hb-subset</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-set" title="hb_subset_input_set ()">hb_subset_input_set</a>, function in <a class="link" href="harfbuzz-hb-subset.html" title="hb-subset">hb-subset</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-set-flags" title="hb_subset_input_set_flags ()">hb_subset_input_set_flags</a>, function in <a class="link" href="harfbuzz-hb-subset.html" title="hb-subset">hb-subset</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-set-user-data" title="hb_subset_input_set_user_data ()">hb_subset_input_set_user_data</a>, function in <a class="link" href="harfbuzz-hb-subset.html" title="hb-subset">hb-subset</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-t" title="hb_subset_input_t">hb_subset_input_t</a>, typedef in <a class="link" href="harfbuzz-hb-subset.html" title="hb-subset">hb-subset</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-unicode-set" title="hb_subset_input_unicode_set ()">hb_subset_input_unicode_set</a>, function in <a class="link" href="harfbuzz-hb-subset.html" title="hb-subset">hb-subset</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-subset.html#hb-subset-or-fail" title="hb_subset_or_fail ()">hb_subset_or_fail</a>, function in <a class="link" href="harfbuzz-hb-subset.html" title="hb-subset">hb-subset</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-subset.html#hb-subset-sets-t" title="enum hb_subset_sets_t">hb_subset_sets_t</a>, enum in <a class="link" href="harfbuzz-hb-subset.html" title="hb-subset">hb-subset</a>
+</dt>
+<dd></dd>
 <a name="idxT"></a><h3 class="title">T</h3>
 <dt>
 <a class="link" href="harfbuzz-hb-common.html#HB-TAG:CAPS" title="HB_TAG()">HB_TAG</a>, macro in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
@@ -2012,6 +2168,10 @@ hb_ot_metrics_tag_t, enum in hb-ot-metrics
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-unicode-decompose-compatibility" title="hb_unicode_decompose_compatibility ()">hb_unicode_decompose_compatibility</a>, function in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="harfbuzz-hb-deprecated.html#hb-unicode-decompose-compatibility-func-t" title="hb_unicode_decompose_compatibility_func_t ()">hb_unicode_decompose_compatibility_func_t</a>, user_function in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
 </dt>
 <dd></dd>
@@ -2020,6 +2180,10 @@ hb_ot_metrics_tag_t, enum in hb-ot-metrics
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-unicode-eastasian-width" title="hb_unicode_eastasian_width ()">hb_unicode_eastasian_width</a>, function in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="harfbuzz-hb-deprecated.html#hb-unicode-eastasian-width-func-t" title="hb_unicode_eastasian_width_func_t ()">hb_unicode_eastasian_width_func_t</a>, user_function in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
 </dt>
 <dd></dd>
@@ -2068,10 +2232,18 @@ hb_ot_metrics_tag_t, enum in hb-ot-metrics
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-unicode-funcs-set-decompose-compatibility-func" title="hb_unicode_funcs_set_decompose_compatibility_func ()">hb_unicode_funcs_set_decompose_compatibility_func</a>, function in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-set-decompose-func" title="hb_unicode_funcs_set_decompose_func ()">hb_unicode_funcs_set_decompose_func</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-unicode-funcs-set-eastasian-width-func" title="hb_unicode_funcs_set_eastasian_width_func ()">hb_unicode_funcs_set_eastasian_width_func</a>, function in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-set-general-category-func" title="hb_unicode_funcs_set_general_category_func ()">hb_unicode_funcs_set_general_category_func</a>, function in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
 </dt>
 <dd></dd>
@@ -2157,10 +2329,6 @@ hb_ot_metrics_tag_t, enum in hb-ot-metrics
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="harfbuzz-hb-common.html#hb-var-int-t" title="hb_var_int_t">hb_var_int_t</a>, union in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
-</dt>
-<dd></dd>
-<dt>
 <a class="link" href="harfbuzz-hb-version.html#hb-version" title="hb_version ()">hb_version</a>, function in <a class="link" href="harfbuzz-hb-version.html" title="hb-version">hb-version</a>
 </dt>
 <dd></dd>
@@ -2194,6 +2362,6 @@ hb_ot_metrics_tag_t, enum in hb-ot-metrics
 <dd></dd>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/html/apple-advanced-typography-api.html b/docs/html/apple-advanced-typography-api.html
new file mode 100644 (file)
index 0000000..d4c49fd
--- /dev/null
@@ -0,0 +1,32 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Apple Advanced Typography API: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="harfbuzz-hb-ot-var.html" title="hb-ot-var">
+<link rel="next" href="harfbuzz-hb-aat-layout.html" title="hb-aat-layout">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="harfbuzz-hb-ot-var.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="harfbuzz-hb-aat-layout.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="chapter">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="apple-advanced-typography-api"></a>Apple Advanced Typography API</h2></div></div></div>
+<div class="toc"><dl class="toc"><dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-aat-layout.html">hb-aat-layout</a></span><span class="refpurpose"> — Apple Advanced Typography Layout</span>
+</dt></dl></div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
index 68f2772..4f55a19 100644 (file)
@@ -3,19 +3,19 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Buffers, language, script and direction: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="pt01.html" title="Part I. User's manual">
+<link rel="up" href="user-manual.html" title="Part I. User's manual">
 <link rel="prev" href="object-model-blobs.html" title="Blobs">
 <link rel="next" href="adding-text-to-the-buffer.html" title="Adding text to the buffer">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
 <td width="100%" align="left" class="shortcuts"></td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><a accesskey="u" href="pt01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="u" href="user-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
 <td><a accesskey="p" href="object-model-blobs.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
 <td><a accesskey="n" href="adding-text-to-the-buffer.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
@@ -95,6 +95,6 @@
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index 84feb5f..c6c7134 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Building HarfBuzz: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="install-harfbuzz.html" title="Installing HarfBuzz">
 <link rel="prev" href="install-harfbuzz.html" title="Installing HarfBuzz">
 <link rel="next" href="getting-started.html" title="Getting started with HarfBuzz">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <p>
       For example, on an Ubuntu or Debian system, you would run:
       </p>
-<pre class="programlisting">
-       <span class="command"><strong>sudo apt install</strong></span> <span class="package">gcc g++ libfreetype6-dev libglib2.0-dev libcairo2-dev</span>
-      </pre>
+<pre class="programlisting"><span class="command"><strong>sudo apt install</strong></span> <span class="package">gcc g++ libfreetype6-dev libglib2.0-dev libcairo2-dev</span></pre>
 <p>
       On Fedora, RHEL, CentOS, or other Red-Hat–based systems, you would run:
       </p>
-<pre class="programlisting">
-       <span class="command"><strong>sudo yum install</strong></span> <span class="package">gcc gcc-c++ freetype-devel glib2-devel cairo-devel</span>
-      </pre>
+<pre class="programlisting"><span class="command"><strong>sudo yum install</strong></span> <span class="package">gcc gcc-c++ freetype-devel glib2-devel cairo-devel</span></pre>
 <p>
 
     </p>
@@ -57,8 +53,8 @@
     </p>
 <p>
       From a shell in the top-level directory of the extracted source
-      code, you can run <span class="command"><strong>./configure</strong></span> followed by
-      <span class="command"><strong>make</strong></span> as with any other standard package.
+      code, you can run <span class="command"><strong>meson build</strong></span> followed by
+      <span class="command"><strong>meson compile -C build</strong></span> as with any other standard package.
     </p>
 <p>
       This should leave you with a shared
       <span class="emphasis"><em>(2)(b)</em></span> If you are building from the source in the HarfBuzz git
       repository, rather than installing from a downloaded tarball
       release, then you must install two more auxiliary tools before you 
-      can build for the first time: <span class="package">pkg-config</span> and
-      <a class="ulink" href="http://www.complang.org/ragel/" target="_top">ragel</a>.
+      can build for the first time: <span class="package">pkg-config</span>.
     </p>
 <p>
       On Ubuntu or Debian, run:
       </p>
-<pre class="programlisting">
-       <span class="command"><strong>sudo apt-get install</strong></span> <span class="package">autoconf automake libtool pkg-config ragel gtk-doc-tools</span>
-      </pre>
+<pre class="programlisting"><span class="command"><strong>sudo apt-get install</strong></span> <span class="package">meson pkg-config gtk-doc-tools</span></pre>
 <p>
       On Fedora, RHEL, CentOS, run:
       </p>
-<pre class="programlisting">
-       <span class="command"><strong>sudo yum install</strong></span> <span class="package">autoconf automake libtool pkgconfig ragel gtk-doc</span>
-      </pre>
+<pre class="programlisting"><span class="command"><strong>sudo yum install</strong></span> <span class="package">meson pkgconfig gtk-doc</span></pre>
 <p>
       
     </p>
 <p>
-      With <span class="package">pkg-config</span> and <span class="package">ragel</span>
-      installed, you can now run <span class="command"><strong>./autogen.sh</strong></span>,
-      followed by <span class="command"><strong>./configure</strong></span> and
-      <span class="command"><strong>make</strong></span> to build HarfBuzz.
+      With <span class="package">pkg-config</span> installed, you can now run
+      <span class="command"><strong>meson build</strong></span> then
+      <span class="command"><strong>meson compile -C build</strong></span> to build HarfBuzz.
     </p>
 </div>
 <div class="section">
 <div class="titlepage"><div><div><h3 class="title">
 <a name="building.windows"></a>Building on Windows</h3></div></div></div>
 <p>
-       On Windows, consider using Microsoft's free <a class="ulink" href="https://github.com/Microsoft/vcpkg" target="_top">vcpkg</a> utility
-       to build HarfBuzz, its dependencies, and other open-source
-       libraries. 
-      </p>
-<p>
-       If you need to build HarfBuzz from source, first put the
-       <span class="package">ragel</span> binary on your
-       <code class="literal">PATH</code>, then follow the appveyor CI cmake
-       <a class="ulink" href="https://github.com/harfbuzz/harfbuzz/blob/master/appveyor.yml" target="_top">build
-       instructions</a>. 
+        <a class="ulink" href="https://mesonbuild.com/Getting-meson.html" target="_top">Install meson</a>
+        and run (from the console) <span class="command"><strong>meson build</strong></span> (by default
+        bundled dependencies are not built, <span class="command"><strong>--wrap-mode=default</strong></span>
+        overrides this), then <span class="command"><strong>meson compile -C build</strong></span> to
+       build HarfBuzz.
       </p>
 </div>
 <div class="section">
        development packages for FreeType, Cairo, and GLib. If you are
        using MacPorts, you should run:
       </p>
-<pre class="programlisting">
-       <span class="command"><strong>sudo port install</strong></span> <span class="package">freetype glib2 cairo</span>
-      </pre>
+<pre class="programlisting"><span class="command"><strong>sudo port install</strong></span> <span class="package">freetype glib2 cairo</span></pre>
 <p>
       </p>
 <p>
        If you are using Homebrew, you should run:
        </p>
-<pre class="programlisting">   
-         <span class="command"><strong>brew install</strong></span> <span class="package">freetype glib cairo</span>
-       </pre>
+<pre class="programlisting"><span class="command"><strong>brew install</strong></span> <span class="package">freetype glib cairo</span></pre>
 <p>
       </p>
 <p>
        from a downloaded tarball release, extract the tarball and
        open a Terminal in the extracted source-code directory. Run:
        </p>
-<pre class="programlisting">
-         <span class="command"><strong>./configure</strong></span>
-       </pre>
+<pre class="programlisting"><span class="command"><strong>meson build</strong></span></pre>
 <p>
        followed by:
        </p>
-<pre class="programlisting">   
-         <span class="command"><strong>make</strong></span>
-       </pre>
+<pre class="programlisting"><span class="command"><strong>meson compile -C build</strong></span></pre>
 <p>
        to build HarfBuzz.
       </p>
 <p>If you are
        using MacPorts, you should run:
       </p>
-<pre class="programlisting">
-       <span class="command"><strong>sudo port install</strong></span> <span class="package">autoconf automake libtool pkgconfig ragel gtk-doc</span> 
-      </pre>
+<pre class="programlisting"><span class="command"><strong>sudo port install</strong></span> <span class="package">meson pkgconfig gtk-doc</span></pre>
 <p>
       to install the build dependencies.
       </p>
 <p>If you are using Homebrew, you should run:
        </p>
-<pre class="programlisting">   
-         <span class="command"><strong>brew install</strong></span> <span class="package">autoconf automake libtool pkgconfig ragel gtk-doc</span>
-       </pre>
+<pre class="programlisting"><span class="command"><strong>brew install</strong></span> <span class="package">meson pkgconfig gtk-doc</span></pre>
 <p>
        Finally, you can run:
        </p>
-<pre class="programlisting">
-         <span class="command"><strong>./autogen.sh</strong></span>
-       </pre>
+<pre class="programlisting"><span class="command"><strong>meson build</strong></span></pre>
 <p>
       </p>
 <p>
        <span class="emphasis"><em>(3)</em></span> You can now build HarfBuzz (on either
        a MacPorts or a Homebrew system) by running:
        </p>
-<pre class="programlisting">
-         <span class="command"><strong>./configure</strong></span>
-       </pre>
+<pre class="programlisting"><span class="command"><strong>meson build</strong></span></pre>
 <p>
        followed by:
        </p>
-<pre class="programlisting">
-         <span class="command"><strong>make</strong></span>
-       </pre>
+<pre class="programlisting"><span class="command"><strong>meson compile -C build</strong></span></pre>
 <p>
       </p>
 <p>
 </colgroup>
 <tbody>
 <tr>
-<td><p><span class="term"><span class="command"><strong>--with-libstdc++</strong></span></span></p></td>
-<td>
-<p>
-             Allow linking with libstdc++. <span class="emphasis"><em>(Default = no)</em></span>
-           </p>
-<p>
-             This option enables or disables linking HarfBuzz to the
-             system's libstdc++ library.
-           </p>
-</td>
-</tr>
-<tr>
-<td><p><span class="term"><span class="command"><strong>--with-glib</strong></span></span></p></td>
+<td><p><span class="term"><span class="command"><strong>-Dglib=enabled</strong></span></span></p></td>
 <td>
 <p>
             Use <a class="ulink" href="https://developer.gnome.org/glib/" target="_top">GLib</a>. <span class="emphasis"><em>(Default = auto)</em></span>
 </td>
 </tr>
 <tr>
-<td><p><span class="term"><span class="command"><strong>--with-gobject</strong></span></span></p></td>
+<td><p><span class="term"><span class="command"><strong>-Dgobject=enabled</strong></span></span></p></td>
 <td>
 <p>
              Use <a class="ulink" href="https://developer.gnome.org/gobject/stable/" target="_top">GObject</a>. <span class="emphasis"><em>(Default = no)</em></span>
 </td>
 </tr>
 <tr>
-<td><p><span class="term"><span class="command"><strong>--with-cairo</strong></span></span></p></td>
+<td><p><span class="term"><span class="command"><strong>-Dcairo=enabled</strong></span></span></p></td>
 <td>
 <p>
              Use <a class="ulink" href="https://cairographics.org/" target="_top">Cairo</a>. <span class="emphasis"><em>(Default = auto)</em></span>
 </td>
 </tr>
 <tr>
-<td><p><span class="term"><span class="command"><strong>--with-fontconfig</strong></span></span></p></td>
-<td>
-<p>
-             Use <a class="ulink" href="https://www.freedesktop.org/wiki/Software/fontconfig/" target="_top">Fontconfig</a>. <span class="emphasis"><em>(Default = auto)</em></span>
-           </p>
-<p>
-             This option enables or disables usage of the Fontconfig
-             library, which provides font-matching functions and
-             provides access to font properties. The default setting
-             is to check for the presence of Fontconfig and, if it is
-             found, build with Fontconfig support.
-           </p>
-<p>
-             Note: Fontconfig is used only by the HarfBuzz
-             command-line utilities, and not by the HarfBuzz library.
-           </p>
-</td>
-</tr>
-<tr>
-<td><p><span class="term"><span class="command"><strong>--with-icu</strong></span></span></p></td>
+<td><p><span class="term"><span class="command"><strong>-Dicu=enabled</strong></span></span></p></td>
 <td>
 <p>
              Use the <a class="ulink" href="http://site.icu-project.org/home" target="_top">ICU</a> library. <span class="emphasis"><em>(Default = auto)</em></span>
 </td>
 </tr>
 <tr>
-<td><p><span class="term"><span class="command"><strong>--with-graphite2</strong></span></span></p></td>
+<td><p><span class="term"><span class="command"><strong>-Dgraphite=enabled</strong></span></span></p></td>
 <td>
 <p>
              Use the <a class="ulink" href="http://graphite.sil.org/" target="_top">Graphite2</a> library. <span class="emphasis"><em>(Default = no)</em></span>
 </td>
 </tr>
 <tr>
-<td><p><span class="term"><span class="command"><strong>--with-freetype</strong></span></span></p></td>
+<td><p><span class="term"><span class="command"><strong>-Dfreetype=enabled</strong></span></span></p></td>
 <td>
 <p>
              Use the <a class="ulink" href="https://www.freetype.org/" target="_top">FreeType</a> library. <span class="emphasis"><em>(Default = auto)</em></span>
 </td>
 </tr>
 <tr>
-<td><p><span class="term"><span class="command"><strong>--with-uniscribe</strong></span></span></p></td>
+<td><p><span class="term"><span class="command"><strong>-Dgdi=enabled</strong></span></span></p></td>
 <td>
 <p>
              Use the <a class="ulink" href="https://docs.microsoft.com/en-us/windows/desktop/intl/uniscribe" target="_top">Uniscribe</a>
 </td>
 </tr>
 <tr>
-<td><p><span class="term"><span class="command"><strong>--with-directwrite</strong></span></span></p></td>
+<td><p><span class="term"><span class="command"><strong>-Ddirectwrite=enabled</strong></span></span></p></td>
 <td>
 <p>
              Use the <a class="ulink" href="https://docs.microsoft.com/en-us/windows/desktop/directwrite/direct-write-portal" target="_top">DirectWrite</a> library (experimental). <span class="emphasis"><em>(Default = no)</em></span>
 </td>
 </tr>
 <tr>
-<td><p><span class="term"><span class="command"><strong>--with-coretext</strong></span></span></p></td>
+<td><p><span class="term"><span class="command"><strong>-Dcoretext=enabled</strong></span></span></p></td>
 <td>
 <p>
              Use the <a class="ulink" href="https://developer.apple.com/documentation/coretext" target="_top">CoreText</a> library. <span class="emphasis"><em>(Default = no)</em></span>
 </td>
 </tr>
 <tr>
-<td><p><span class="term"><span class="command"><strong>--enable-gtk-doc</strong></span></span></p></td>
+<td><p><span class="term"><span class="command"><strong>-Ddocs=enabled</strong></span></span></p></td>
 <td>
 <p>
-             Use <a class="ulink" href="https://www.gtk.org/gtk-doc/" target="_top">GTK-Doc</a>. <span class="emphasis"><em>(Default = no)</em></span>
+             Use <a class="ulink" href="https://github.com/GNOME/gtk-doc" target="_top">GTK-Doc</a>. <span class="emphasis"><em>(Default = no)</em></span>
            </p>
 <p>
              This option enables the building of the documentation.
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/html/ch01s03.html b/docs/html/ch01s03.html
deleted file mode 100644 (file)
index d820afb..0000000
+++ /dev/null
@@ -1,108 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>What does HarfBuzz do?: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
-<link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="what-is-harfbuzz.html" title="What is HarfBuzz?">
-<link rel="prev" href="why-do-i-need-a-shaping-engine.html" title="Why do I need a shaping engine?">
-<link rel="next" href="what-harfbuzz-doesnt-do.html" title="What HarfBuzz doesn't do">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
-<link rel="stylesheet" href="style.css" type="text/css">
-</head>
-<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
-<td width="100%" align="left" class="shortcuts"></td>
-<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><a accesskey="u" href="what-is-harfbuzz.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
-<td><a accesskey="p" href="why-do-i-need-a-shaping-engine.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="what-harfbuzz-doesnt-do.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
-</tr></table>
-<div class="section">
-<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="id-1.2.2.6"></a>What does HarfBuzz do?</h2></div></div></div>
-<p>
-      HarfBuzz provides text shaping through a cross-platform
-      C API that accepts sequences of Unicode codepoints as input. Currently,
-      the following OpenType shaping models are supported:
-    </p>
-<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
-<li class="listitem"><p>
-         Indic (covering Devanagari, Bengali, Gujarati,
-         Gurmukhi, Kannada, Malayalam, Oriya, Tamil, Telugu, and
-         Sinhala)
-       </p></li>
-<li class="listitem"><p>
-         Arabic (covering Arabic, N'Ko, Syriac, and Mongolian)
-       </p></li>
-<li class="listitem"><p>
-         Thai and Lao
-       </p></li>
-<li class="listitem"><p>
-         Khmer
-       </p></li>
-<li class="listitem"><p>
-         Myanmar
-       </p></li>
-<li class="listitem"><p>
-         Tibetan
-       </p></li>
-<li class="listitem"><p>
-         Hangul
-       </p></li>
-<li class="listitem"><p>
-         Hebrew
-       </p></li>
-<li class="listitem"><p>
-         The Universal Shaping Engine or <span class="emphasis"><em>USE</em></span>
-         (covering complex scripts not covered by the above shaping
-         models)
-       </p></li>
-<li class="listitem"><p>
-         A default shaping model for non-complex scripts
-         (covering Latin, Cyrillic, Greek, Armenian, Georgian, Tifinagh,
-         and many others)
-       </p></li>
-<li class="listitem"><p>
-         Emoji (including emoji modifier sequences, flag sequences,
-         and ZWJ sequences)
-       </p></li>
-</ul></div>
-<p>
-      In addition to OpenType shaping, HarfBuzz supports the latest
-      version of Graphite shaping (the "Graphite 2" model) and AAT
-      shaping.
-    </p>
-<p>
-      HarfBuzz can read and understand TrueType fonts (.ttf), TrueType
-      collections (.ttc), and OpenType fonts (.otf, including those
-      fonts that contain TrueType-style outlines and those that
-      contain PostScript CFF or CFF2 outlines).
-    </p>
-<p>
-      HarfBuzz is designed and tested to run on top of the FreeType
-      font renderer. It can run on Linux, Android, Windows, macOS, and
-      iOS systems.
-    </p>
-<p>
-      In addition to its core shaping functionality, HarfBuzz provides
-      functions for accessing other font features, including optional
-      GSUB and GPOS OpenType features, as well as
-      all color-font formats (<code class="literal">CBDT</code>,
-      <code class="literal">sbix</code>, <code class="literal">COLR/CPAL</code>, and
-      <code class="literal">SVG-OT</code>) and OpenType variable fonts. HarfBuzz
-      also includes a font-subsetting feature. HarfBuzz can perform
-      some low-level math-shaping operations, although it does not
-      currently perform full shaping for mathematical typesetting.
-    </p>
-<p>
-      A suite of command-line utilities is also provided in the
-      source-code tree, designed to help users test and debug
-      HarfBuzz's features on real-world fonts and input.
-    </p>
-</div>
-<div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
-</body>
-</html>
\ No newline at end of file
diff --git a/docs/html/ch03s02.html b/docs/html/ch03s02.html
deleted file mode 100644 (file)
index fc3884c..0000000
+++ /dev/null
@@ -1,150 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Terminology: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
-<link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="getting-started.html" title="Getting started with HarfBuzz">
-<link rel="prev" href="getting-started.html" title="Getting started with HarfBuzz">
-<link rel="next" href="ch03s03.html" title="A simple shaping example">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
-<link rel="stylesheet" href="style.css" type="text/css">
-</head>
-<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
-<td width="100%" align="left" class="shortcuts"></td>
-<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><a accesskey="u" href="getting-started.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
-<td><a accesskey="p" href="getting-started.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="ch03s03.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
-</tr></table>
-<div class="section">
-<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="id-1.2.4.3"></a>Terminology</h2></div></div></div>
-<p>
-      
-    </p>
-<div class="variablelist"><table border="0" class="variablelist">
-<colgroup>
-<col align="left" valign="top">
-<col>
-</colgroup>
-<tbody>
-<tr>
-<td><p><span class="term">script</span></p></td>
-<td>
-<p>
-             In text shaping, a <span class="emphasis"><em>script</em></span> is a
-             writing system: a set of symbols, rules, and conventions
-             that is used to represent a language or multiple
-             languages.
-           </p>
-<p>
-             In general computing lingo, the word "script" can also
-             be used to mean an executable program (usually one
-             written in a human-readable programming language). For
-             the sake of clarity, HarfBuzz documents will always use
-             more specific terminology when referring to this
-             meaning, such as "Python script" or "shell script." In
-             all other instances, "script" refers to a writing system.
-           </p>
-<p>
-             For developers using HarfBuzz, it is important to note
-             the distinction between a script and a language. Most
-             scripts are used to write a variety of different
-             languages, and many languages may be written in more
-             than one script.
-           </p>
-</td>
-</tr>
-<tr>
-<td><p><span class="term">shaper</span></p></td>
-<td><p>
-             In HarfBuzz, a <span class="emphasis"><em>shaper</em></span> is a
-             handler for a specific script-shaping model. HarfBuzz
-             implements separate shapers for Indic, Arabic, Thai and
-             Lao, Khmer, Myanmar, Tibetan, Hangul, Hebrew, the
-             Universal Shaping Engine (USE), and a default shaper for
-             non-complex scripts. 
-           </p></td>
-</tr>
-<tr>
-<td><p><span class="term">cluster</span></p></td>
-<td>
-<p>
-             In text shaping, a <span class="emphasis"><em>cluster</em></span> is a
-             sequence of codepoints that must be treated as an
-             indivisible unit. Clusters can include code-point
-             sequences that form a ligature or base-and-mark
-             sequences. Tracking and preserving clusters is important
-             when shaping operations might separate or reorder
-             code points.
-           </p>
-<p>
-             HarfBuzz provides three cluster
-             <span class="emphasis"><em>levels</em></span> that implement different
-             approaches to the problem of preserving clusters during
-             shaping operations.
-           </p>
-</td>
-</tr>
-<tr>
-<td><p><span class="term">grapheme</span></p></td>
-<td>
-<p>
-             In linguistics, a <span class="emphasis"><em>grapheme</em></span> is one
-             of the indivisible units that make up a writing system or
-             script. Often, graphemes are individual symbols (letters,
-             numbers, punctuation marks, logograms, etc.) but,
-             depending on the writing system, a particular grapheme
-             might correspond to a sequence of several Unicode code
-             points.
-           </p>
-<p>
-             In practice, HarfBuzz and other text-shaping engines
-             are not generally concerned with graphemes. However, it
-             is important for developers using HarfBuzz to recognize
-             that there is a difference between graphemes and shaping
-             clusters (see above). The two concepts may overlap
-             frequently, but there is no guarantee that they will be
-             identical.
-           </p>
-</td>
-</tr>
-<tr>
-<td><p><span class="term">syllable</span></p></td>
-<td>
-<p>
-             In linguistics, a <span class="emphasis"><em>syllable</em></span> is an 
-             a sequence of sounds that makes up a building block of a
-             particular language. Every language has its own set of
-             rules describing what constitutes a valid syllable.
-           </p>
-<p>
-             For text-shaping purposes, the various definitions of
-             "syllable" are important because script-specific shaping
-             operations may be applied at the syllable level. For
-             example, a reordering rule might specify that a vowel
-             mark be reordered to the beginning of the syllable.
-           </p>
-<p>
-             Syllables will consist of one or more Unicode code
-             points. The definition of a syllable for a particular
-             writing system might correspond to how HarfBuzz
-             identifies clusters (see above) for the same writing
-             system. However, it is important for developers using
-             HarfBuzz to recognize that there is a difference between
-             syllables and shaping clusters. The two concepts may
-             overlap frequently, but there is no guarantee that they
-             will be identical.
-           </p>
-</td>
-</tr>
-</tbody>
-</table></div>
-</div>
-<div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
-</body>
-</html>
\ No newline at end of file
diff --git a/docs/html/ch03s03.html b/docs/html/ch03s03.html
deleted file mode 100644 (file)
index 69e2e81..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>A simple shaping example: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
-<link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="getting-started.html" title="Getting started with HarfBuzz">
-<link rel="prev" href="ch03s02.html" title="Terminology">
-<link rel="next" href="shaping-concepts.html" title="Shaping concepts">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
-<link rel="stylesheet" href="style.css" type="text/css">
-</head>
-<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
-<td width="100%" align="left" class="shortcuts"></td>
-<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><a accesskey="u" href="getting-started.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
-<td><a accesskey="p" href="ch03s02.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="shaping-concepts.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
-</tr></table>
-<div class="section">
-<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="id-1.2.4.4"></a>A simple shaping example</h2></div></div></div>
-<p>
-      Below is the simplest HarfBuzz shaping example possible.
-    </p>
-<div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><p>
-          Create a buffer and put your text in it.
-       </p></li></ol></div>
-<pre class="programlisting">
-      #include &lt;hb.h&gt;
-      hb_buffer_t *buf;
-      buf = hb_buffer_create();
-      hb_buffer_add_utf8(buf, text, -1, 0, -1);
-    </pre>
-<div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem" value="2"><p>
-          Set the script, language and direction of the buffer.
-       </p></li></ol></div>
-<pre class="programlisting">
-      hb_buffer_set_direction(buf, HB_DIRECTION_LTR);
-      hb_buffer_set_script(buf, HB_SCRIPT_LATIN);
-      hb_buffer_set_language(buf, hb_language_from_string("en", -1));
-    </pre>
-<div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem" value="3"><p>
-          Create a face and a font, using FreeType for now.
-       </p></li></ol></div>
-<pre class="programlisting">
-      #include &lt;hb-ft.h&gt;
-      FT_New_Face(ft_library, font_path, index, &amp;face);
-      FT_Set_Char_Size(face, 0, 1000, 0, 0);
-      hb_font_t *font = hb_ft_font_create(face);
-    </pre>
-<div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem" value="4"><p>
-          Shape!
-       </p></li></ol></div>
-<pre class="programlisting">
-      hb_shape(font, buf, NULL, 0);
-    </pre>
-<div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem" value="5"><p>
-          Get the glyph and position information.
-       </p></li></ol></div>
-<pre class="programlisting">
-      hb_glyph_info_t *glyph_info    = hb_buffer_get_glyph_infos(buf, &amp;glyph_count);
-      hb_glyph_position_t *glyph_pos = hb_buffer_get_glyph_positions(buf, &amp;glyph_count);
-    </pre>
-<div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem" value="6"><p>
-          Iterate over each glyph.
-       </p></li></ol></div>
-<pre class="programlisting">
-      for (i = 0; i &lt; glyph_count; ++i) {
-          glyphid = glyph_info[i].codepoint;
-          x_offset = glyph_pos[i].x_offset / 64.0;
-          y_offset = glyph_pos[i].y_offset / 64.0;
-          x_advance = glyph_pos[i].x_advance / 64.0;
-          y_advance = glyph_pos[i].y_advance / 64.0;
-          draw_glyph(glyphid, cursor_x + x_offset, cursor_y + y_offset);
-          cursor_x += x_advance;
-          cursor_y += y_advance;
-      }
-    </pre>
-<div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem" value="7"><p>
-          Tidy up.
-       </p></li></ol></div>
-<pre class="programlisting">
-      hb_buffer_destroy(buf);
-      hb_font_destroy(hb_ft_font);
-    </pre>
-<p>
-      This example shows enough to get us started using HarfBuzz. In
-      the sections that follow, we will use the remainder of
-      HarfBuzz's API to refine and extend the example and improve its
-      text-shaping capabilities.
-    </p>
-</div>
-<div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
-</body>
-</html>
\ No newline at end of file
diff --git a/docs/html/ch12.html b/docs/html/ch12.html
deleted file mode 100644 (file)
index 3c3fed8..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Core API: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
-<link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="pt02.html" title="Part II. Reference manual">
-<link rel="prev" href="pt02.html" title="Part II. Reference manual">
-<link rel="next" href="harfbuzz-hb-blob.html" title="hb-blob">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
-<link rel="stylesheet" href="style.css" type="text/css">
-</head>
-<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
-<td width="100%" align="left" class="shortcuts"></td>
-<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
-<td><a accesskey="p" href="pt02.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="harfbuzz-hb-blob.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
-</tr></table>
-<div class="chapter">
-<div class="titlepage"><div><div><h2 class="title">
-<a name="id-1.3.4"></a>Core API</h2></div></div></div>
-<div class="toc"><dl class="toc">
-<dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-blob.html">hb-blob</a></span><span class="refpurpose"> — Binary data containers</span>
-</dt>
-<dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-buffer.html">hb-buffer</a></span><span class="refpurpose"> — Input and output buffers</span>
-</dt>
-<dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-common.html">hb-common</a></span><span class="refpurpose"> — Common data types</span>
-</dt>
-<dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-deprecated.html">hb-deprecated</a></span><span class="refpurpose"> — Deprecated API</span>
-</dt>
-<dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-face.html">hb-face</a></span><span class="refpurpose"> — Font face objects</span>
-</dt>
-<dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-font.html">hb-font</a></span><span class="refpurpose"> — Font objects</span>
-</dt>
-<dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-map.html">hb-map</a></span><span class="refpurpose"> — Object representing integer to integer mapping</span>
-</dt>
-<dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-set.html">hb-set</a></span><span class="refpurpose"> — Object representing a set of integers</span>
-</dt>
-<dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-shape-plan.html">hb-shape-plan</a></span><span class="refpurpose"> — Object representing a shaping plan</span>
-</dt>
-<dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-shape.html">hb-shape</a></span><span class="refpurpose"> — Conversion of text strings into positioned glyphs</span>
-</dt>
-<dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-unicode.html">hb-unicode</a></span><span class="refpurpose"> — Unicode character property access</span>
-</dt>
-<dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-version.html">hb-version</a></span><span class="refpurpose"> — Information about the version of HarfBuzz in use</span>
-</dt>
-</dl></div>
-</div>
-<div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
-</body>
-</html>
\ No newline at end of file
diff --git a/docs/html/ch13.html b/docs/html/ch13.html
deleted file mode 100644 (file)
index ba6f99a..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>OpenType API: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
-<link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="pt02.html" title="Part II. Reference manual">
-<link rel="prev" href="harfbuzz-hb-version.html" title="hb-version">
-<link rel="next" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
-<link rel="stylesheet" href="style.css" type="text/css">
-</head>
-<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
-<td width="100%" align="left" class="shortcuts"></td>
-<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
-<td><a accesskey="p" href="harfbuzz-hb-version.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="harfbuzz-hb-ot-color.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
-</tr></table>
-<div class="chapter">
-<div class="titlepage"><div><div><h2 class="title">
-<a name="id-1.3.5"></a>OpenType API</h2></div></div></div>
-<div class="toc"><dl class="toc">
-<dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-ot-color.html">hb-ot-color</a></span><span class="refpurpose"> — OpenType Color Fonts</span>
-</dt>
-<dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-ot-font.html">hb-ot-font</a></span><span class="refpurpose"> — OpenType font implementation</span>
-</dt>
-<dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-ot-layout.html">hb-ot-layout</a></span><span class="refpurpose"> — OpenType Layout</span>
-</dt>
-<dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-ot-math.html">hb-ot-math</a></span><span class="refpurpose"> — OpenType Math information</span>
-</dt>
-<dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-ot-name.html">hb-ot-name</a></span><span class="refpurpose"> — OpenType font name information</span>
-</dt>
-<dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-ot-shape.html">hb-ot-shape</a></span><span class="refpurpose"> — OpenType shaping support</span>
-</dt>
-<dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-ot-var.html">hb-ot-var</a></span><span class="refpurpose"> — OpenType Font Variations</span>
-</dt>
-</dl></div>
-</div>
-<div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
-</body>
-</html>
\ No newline at end of file
diff --git a/docs/html/ch14.html b/docs/html/ch14.html
deleted file mode 100644 (file)
index 28645ba..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Apple Advanced Typography API: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
-<link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="pt02.html" title="Part II. Reference manual">
-<link rel="prev" href="harfbuzz-hb-ot-var.html" title="hb-ot-var">
-<link rel="next" href="harfbuzz-hb-aat-layout.html" title="hb-aat-layout">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
-<link rel="stylesheet" href="style.css" type="text/css">
-</head>
-<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
-<td width="100%" align="left" class="shortcuts"></td>
-<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
-<td><a accesskey="p" href="harfbuzz-hb-ot-var.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="harfbuzz-hb-aat-layout.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
-</tr></table>
-<div class="chapter">
-<div class="titlepage"><div><div><h2 class="title">
-<a name="id-1.3.6"></a>Apple Advanced Typography API</h2></div></div></div>
-<div class="toc"><dl class="toc"><dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-aat-layout.html">hb-aat-layout</a></span><span class="refpurpose"> — Apple Advanced Typography Layout</span>
-</dt></dl></div>
-</div>
-<div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
-</body>
-</html>
\ No newline at end of file
diff --git a/docs/html/ch15.html b/docs/html/ch15.html
deleted file mode 100644 (file)
index 95cb975..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Integration API: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
-<link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="pt02.html" title="Part II. Reference manual">
-<link rel="prev" href="harfbuzz-hb-aat-layout.html" title="hb-aat-layout">
-<link rel="next" href="harfbuzz-hb-coretext.html" title="hb-coretext">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
-<link rel="stylesheet" href="style.css" type="text/css">
-</head>
-<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
-<td width="100%" align="left" class="shortcuts"></td>
-<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
-<td><a accesskey="p" href="harfbuzz-hb-aat-layout.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="harfbuzz-hb-coretext.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
-</tr></table>
-<div class="chapter">
-<div class="titlepage"><div><div><h2 class="title">
-<a name="id-1.3.7"></a>Integration API</h2></div></div></div>
-<div class="toc"><dl class="toc">
-<dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-coretext.html">hb-coretext</a></span><span class="refpurpose"> — CoreText integration</span>
-</dt>
-<dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-ft.html">hb-ft</a></span><span class="refpurpose"> — FreeType integration</span>
-</dt>
-<dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-glib.html">hb-glib</a></span><span class="refpurpose"> — GLib integration</span>
-</dt>
-<dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-gobject.html">hb-gobject</a></span><span class="refpurpose"> — GObject integration support</span>
-</dt>
-<dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-graphite2.html">hb-graphite2</a></span><span class="refpurpose"> — Graphite2 integration</span>
-</dt>
-<dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-icu.html">hb-icu</a></span><span class="refpurpose"> — ICU integration</span>
-</dt>
-<dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-uniscribe.html">hb-uniscribe</a></span><span class="refpurpose"> — Windows integration</span>
-</dt>
-</dl></div>
-</div>
-<div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
-</body>
-</html>
\ No newline at end of file
index 7dd84ac..7c56777 100644 (file)
@@ -3,19 +3,19 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Clusters: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="pt01.html" title="Part I. User's manual">
+<link rel="up" href="user-manual.html" title="Part I. User's manual">
 <link rel="prev" href="shaping-plans-and-caching.html" title="Plans and caching">
 <link rel="next" href="working-with-harfbuzz-clusters.html" title="Working with HarfBuzz clusters">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
 <td width="100%" align="left" class="shortcuts"></td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><a accesskey="u" href="pt01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="u" href="user-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
 <td><a accesskey="p" href="shaping-plans-and-caching.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
 <td><a accesskey="n" href="working-with-harfbuzz-clusters.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index 4198a58..fcce71f 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Complex scripts: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="shaping-concepts.html" title="Shaping concepts">
 <link rel="prev" href="shaping-concepts.html" title="Shaping concepts">
 <link rel="next" href="shaping-operations.html" title="Shaping operations">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -52,6 +52,6 @@
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/html/core-api.html b/docs/html/core-api.html
new file mode 100644 (file)
index 0000000..cda3f06
--- /dev/null
@@ -0,0 +1,67 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Core API: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="next" href="harfbuzz-hb-blob.html" title="hb-blob">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="reference-manual.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="harfbuzz-hb-blob.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="chapter">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="core-api"></a>Core API</h2></div></div></div>
+<div class="toc"><dl class="toc">
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-blob.html">hb-blob</a></span><span class="refpurpose"> — Binary data containers</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-buffer.html">hb-buffer</a></span><span class="refpurpose"> — Input and output buffers</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-common.html">hb-common</a></span><span class="refpurpose"> — Common data types</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-deprecated.html">hb-deprecated</a></span><span class="refpurpose"> — Deprecated API</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-face.html">hb-face</a></span><span class="refpurpose"> — Font face objects</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-font.html">hb-font</a></span><span class="refpurpose"> — Font objects</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-map.html">hb-map</a></span><span class="refpurpose"> — Object representing integer to integer mapping</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-set.html">hb-set</a></span><span class="refpurpose"> — Objects representing a set of integers</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-shape-plan.html">hb-shape-plan</a></span><span class="refpurpose"> — Object representing a shaping plan</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-shape.html">hb-shape</a></span><span class="refpurpose"> — Conversion of text strings into positioned glyphs</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-unicode.html">hb-unicode</a></span><span class="refpurpose"> — Unicode character property access</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-version.html">hb-version</a></span><span class="refpurpose"> — Information about the version of HarfBuzz in use</span>
+</dt>
+</dl></div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
index 8160f4f..e7694ca 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Customizing Unicode functions: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="buffers-language-script-and-direction.html" title="Buffers, language, script and direction">
 <link rel="prev" href="setting-buffer-properties.html" title="Setting buffer properties">
 <link rel="next" href="fonts-and-faces.html" title="Fonts, faces, and output">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/html/deprecated-api-index.html b/docs/html/deprecated-api-index.html
new file mode 100644 (file)
index 0000000..2333c5b
--- /dev/null
@@ -0,0 +1,117 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of deprecated API: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-full.html" title="API Index">
+<link rel="next" href="api-index-3-4-0.html" title="Index of new symbols in 3.4.0">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"><span id="nav_index"><a class="shortcut" href="#idxB">B</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxF">F</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxM">M</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxO">O</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxS">S</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxU">U</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-full.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-3-4-0.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="deprecated-api-index"></a>Index of deprecated API</h2></div></div></div>
+<a name="idx"></a><a name="idxB"></a><h3 class="title">B</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#HB-BUFFER-FLAGS-DEFAULT:CAPS" title="HB_BUFFER_FLAGS_DEFAULT">HB_BUFFER_FLAGS_DEFAULT</a>, macro in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#HB-BUFFER-SERIALIZE-FLAGS-DEFAULT:CAPS" title="HB_BUFFER_SERIALIZE_FLAGS_DEFAULT">HB_BUFFER_SERIALIZE_FLAGS_DEFAULT</a>, macro in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<a name="idxF"></a><h3 class="title">F</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-font-funcs-set-glyph-v-kerning-func" title="hb_font_funcs_set_glyph_v_kerning_func ()">hb_font_funcs_set_glyph_v_kerning_func</a>, function in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-font-get-glyph-func-t" title="hb_font_get_glyph_func_t ()">hb_font_get_glyph_func_t</a>, user_function in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-font-get-glyph-v-kerning" title="hb_font_get_glyph_v_kerning ()">hb_font_get_glyph_v_kerning</a>, function in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-font-get-glyph-v-kerning-func-t" title="hb_font_get_glyph_v_kerning_func_t">hb_font_get_glyph_v_kerning_func_t</a>, typedef in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<a name="idxM"></a><h3 class="title">M</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#HB-MATH-GLYPH-PART-FLAG-EXTENDER:CAPS" title="HB_MATH_GLYPH_PART_FLAG_EXTENDER">HB_MATH_GLYPH_PART_FLAG_EXTENDER</a>, macro in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<a name="idxO"></a><h3 class="title">O</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#HB-OT-MATH-SCRIPT:CAPS" title="HB_OT_MATH_SCRIPT">HB_OT_MATH_SCRIPT</a>, macro in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-ot-var-axis-t" title="hb_ot_var_axis_t">hb_ot_var_axis_t</a>, struct in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#HB-OT-VAR-NO-AXIS-INDEX:CAPS" title="HB_OT_VAR_NO_AXIS_INDEX">HB_OT_VAR_NO_AXIS_INDEX</a>, macro in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<a name="idxS"></a><h3 class="title">S</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#HB-SCRIPT-CANADIAN-ABORIGINAL:CAPS" title="HB_SCRIPT_CANADIAN_ABORIGINAL">HB_SCRIPT_CANADIAN_ABORIGINAL</a>, macro in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<a name="idxU"></a><h3 class="title">U</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-unicode-decompose-compatibility" title="hb_unicode_decompose_compatibility ()">hb_unicode_decompose_compatibility</a>, function in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-unicode-decompose-compatibility-func-t" title="hb_unicode_decompose_compatibility_func_t ()">hb_unicode_decompose_compatibility_func_t</a>, user_function in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-unicode-eastasian-width" title="hb_unicode_eastasian_width ()">hb_unicode_eastasian_width</a>, function in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-unicode-eastasian-width-func-t" title="hb_unicode_eastasian_width_func_t ()">hb_unicode_eastasian_width_func_t</a>, user_function in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-unicode-funcs-set-decompose-compatibility-func" title="hb_unicode_funcs_set_decompose_compatibility_func ()">hb_unicode_funcs_set_decompose_compatibility_func</a>, function in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-unicode-funcs-set-eastasian-width-func" title="hb_unicode_funcs_set_eastasian_width_func ()">hb_unicode_funcs_set_eastasian_width_func</a>, function in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#HB-UNICODE-MAX-DECOMPOSITION-LEN:CAPS" title="HB_UNICODE_MAX_DECOMPOSITION_LEN">HB_UNICODE_MAX_DECOMPOSITION_LEN</a>, macro in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
index ff09212..38c9422 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Customizing font functions: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="fonts-and-faces.html" title="Fonts, faces, and output">
 <link rel="prev" href="fonts-and-faces.html" title="Fonts, faces, and output">
 <link rel="next" href="fonts-and-faces-native-opentype.html" title="Font objects and HarfBuzz's native OpenType implementation">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
     </p></li>
 </ul></div>
 <p>
-      You can fetch the font-functions configuration for a font object
-      by calling <code class="function">hb_font_get_font_funcs()</code>:
+      You can create new font-functions by calling
+      <code class="function">hb_font_funcs_create()</code>:
     </p>
 <pre class="programlisting">
-      hb_font_funcs_t *ffunctions;
-      ffunctions = hb_font_get_font_funcs (font);
+      hb_font_funcs_t *ffunctions = hb_font_funcs_create ();
+      hb_font_set_funcs (font, ffunctions, font_data, destroy);
     </pre>
 <p>
-      The individual methods can each be replaced with their own setter
+      The individual methods can each be set with their own setter
       function, such as
-      <code class="function">hb_font_funcs_set_nominal_glyph_func(*ffunctions,
-      func, *user_data, destroy)</code>. 
+      <code class="function">hb_font_funcs_set_nominal_glyph_func(ffunctions,
+      func, user_data, destroy)</code>.
     </p>
 <p>
       Font-functions structures can be reused for multiple font
       programs from changing the configuration and introducing
       inconsistencies and errors downstream.
     </p>
+<p>
+      To override only some functions while using the default implementation
+      for the others, you will need to create a sub-font. By default, the
+      sub-font uses the font functions of its parent except for the functions
+      that were explicitly set. The following code will override only the
+      <code class="function">hb_font_get_nominal_glyph_func_t</code> for the sub-font:
+    </p>
+<pre class="programlisting">
+      hb_font_t *subfont = hb_font_create_sub_font (font)
+      hb_font_funcs_t *ffunctions = hb_font_funcs_create ();
+      hb_font_funcs_set_nominal_glyph_func (ffunctions, func, user_data, destroy);
+      hb_font_set_funcs (subfont, ffunctions, font_data, destroy);
+      hb_font_funcs_destroy (ffunctions);
+    </pre>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index 218051e..16b913d 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Font objects and HarfBuzz's native OpenType implementation: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="fonts-and-faces.html" title="Fonts, faces, and output">
 <link rel="prev" href="fonts-and-faces-custom-functions.html" title="Customizing font functions">
 <link rel="next" href="fonts-and-faces-variable.html" title="Working with OpenType Variable Fonts">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -88,6 +88,6 @@
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index b336252..b857d3b 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Working with OpenType Variable Fonts: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="fonts-and-faces.html" title="Fonts, faces, and output">
 <link rel="prev" href="fonts-and-faces-native-opentype.html" title="Font objects and HarfBuzz's native OpenType implementation">
 <link rel="next" href="shaping-and-shape-plans.html" title="Shaping and shape plans">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -95,6 +95,6 @@
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index 3db404e..841f255 100644 (file)
@@ -3,19 +3,19 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Fonts, faces, and output: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="pt01.html" title="Part I. User's manual">
+<link rel="up" href="user-manual.html" title="Part I. User's manual">
 <link rel="prev" href="customizing-unicode-functions.html" title="Customizing Unicode functions">
 <link rel="next" href="fonts-and-faces-custom-functions.html" title="Customizing font functions">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
 <td width="100%" align="left" class="shortcuts"></td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><a accesskey="u" href="pt01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="u" href="user-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
 <td><a accesskey="p" href="customizing-unicode-functions.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
 <td><a accesskey="n" href="fonts-and-faces-custom-functions.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index 5cbeb90..9b725d5 100644 (file)
@@ -3,33 +3,33 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Getting started with HarfBuzz: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="pt01.html" title="Part I. User's manual">
+<link rel="up" href="user-manual.html" title="Part I. User's manual">
 <link rel="prev" href="building.html" title="Building HarfBuzz">
-<link rel="next" href="ch03s02.html" title="Terminology">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<link rel="next" href="terminology.html" title="Terminology">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
 <td width="100%" align="left" class="shortcuts"></td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><a accesskey="u" href="pt01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="u" href="user-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
 <td><a accesskey="p" href="building.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="ch03s02.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+<td><a accesskey="n" href="terminology.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <div class="chapter">
 <div class="titlepage"><div><div><h2 class="title">
 <a name="getting-started"></a>Getting started with HarfBuzz</h2></div></div></div>
 <div class="toc"><dl class="toc">
-<dt><span class="section"><a href="getting-started.html#id-1.2.4.2">An overview of the HarfBuzz shaping API</a></span></dt>
-<dt><span class="section"><a href="ch03s02.html">Terminology</a></span></dt>
-<dt><span class="section"><a href="ch03s03.html">A simple shaping example</a></span></dt>
+<dt><span class="section"><a href="getting-started.html#an-overview-of-the-harfbuzz-shaping-api">An overview of the HarfBuzz shaping API</a></span></dt>
+<dt><span class="section"><a href="terminology.html">Terminology</a></span></dt>
+<dt><span class="section"><a href="a-simple-shaping-example.html">A simple shaping example</a></span></dt>
 </dl></div>
 <div class="section">
 <div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="id-1.2.4.2"></a>An overview of the HarfBuzz shaping API</h2></div></div></div>
+<a name="an-overview-of-the-harfbuzz-shaping-api"></a>An overview of the HarfBuzz shaping API</h2></div></div></div>
 <p>
       The core of the HarfBuzz shaping API is the function
       <code class="function">hb_shape()</code>. This function takes a font, a
@@ -70,7 +70,7 @@
     </p>
 <p>
       Although the default <code class="function">hb_shape()</code> function is
-      sufficient for most use cases, a variant is also provide that
+      sufficient for most use cases, a variant is also provided that
       lets you specify which of HarfBuzz's shapers to use on a buffer. 
     </p>
 <p>
@@ -91,6 +91,6 @@
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index 527a2e3..0ca5af3 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Graphite shaping: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="shaping-concepts.html" title="Shaping concepts">
 <link rel="prev" href="opentype-shaping-models.html" title="OpenType shaping models">
 <link rel="next" href="aat-shaping.html" title="AAT shaping">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -40,6 +40,6 @@
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index f4bfc30..ac9e89a 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-aat-layout: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch14.html" title="Apple Advanced Typography API">
-<link rel="prev" href="ch14.html" title="Apple Advanced Typography API">
-<link rel="next" href="ch15.html" title="Integration API">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<link rel="up" href="apple-advanced-typography-api.html" title="Apple Advanced Typography API">
+<link rel="prev" href="apple-advanced-typography-api.html" title="Apple Advanced Typography API">
+<link rel="next" href="integration-api.html" title="Integration API">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -18,9 +18,9 @@
                   <a href="#harfbuzz-hb-aat-layout.description" class="shortcut">Description</a></span>
 </td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><a accesskey="u" href="ch14.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
-<td><a accesskey="p" href="ch14.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="ch15.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+<td><a accesskey="u" href="apple-advanced-typography-api.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="apple-advanced-typography-api.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="integration-api.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <div class="refentry">
 <a name="harfbuzz-hb-aat-layout"></a><div class="titlepage"></div>
 <td class="datatype_keyword">enum</td>
 <td class="function_name"><a class="link" href="harfbuzz-hb-aat-layout.html#hb-aat-layout-feature-selector-t" title="enum hb_aat_layout_feature_selector_t">hb_aat_layout_feature_selector_t</a></td>
 </tr>
+<tr>
+<td class="datatype_keyword"> </td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-aat-layout.html#hb-aat-layout-feature-selector-info-t" title="hb_aat_layout_feature_selector_info_t">hb_aat_layout_feature_selector_info_t</a></td>
+</tr>
 </tbody>
 </table></div>
 </div>
 </div>
 <div class="refsect1">
 <a name="harfbuzz-hb-aat-layout.description"></a><h2>Description</h2>
-<p>Functions for querying OpenType Layout features in the font face.</p>
+<p>Functions for querying AAT Layout features in the font face.</p>
+<p>HarfBuzz supports all of the AAT tables used to implement shaping. Other
+AAT tables and their associated features are not supported.</p>
 </div>
 <div class="refsect1">
 <a name="harfbuzz-hb-aat-layout.functions_details"></a><h2>Functions</h2>
 hb_aat_layout_feature_type_get_name_id
                                (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> *face</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-aat-layout.html#hb-aat-layout-feature-type-t" title="enum hb_aat_layout_feature_type_t"><span class="type">hb_aat_layout_feature_type_t</span></a> feature_type</code></em>);</pre>
+<p>Fetches the name identifier of the specified feature type in the face's <code class="literal">name</code> table.</p>
 <div class="refsect3">
 <a name="hb-aat-layout-feature-type-get-name-id.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -139,12 +146,12 @@ hb_aat_layout_feature_type_get_name_id
 <tbody>
 <tr>
 <td class="parameter_name"><p>face</p></td>
-<td class="parameter_description"><p>a face object</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> to work upon</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>feature_type</p></td>
-<td class="parameter_description"><p>feature id</p></td>
+<td class="parameter_description"><p>The <a class="link" href="harfbuzz-hb-aat-layout.html#hb-aat-layout-feature-type-t" title="enum hb_aat_layout_feature_type_t"><span class="type">hb_aat_layout_feature_type_t</span></a> of the requested feature type</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 </tbody>
@@ -152,7 +159,7 @@ hb_aat_layout_feature_type_get_name_id
 </div>
 <div class="refsect3">
 <a name="hb-aat-layout-feature-type-get-name-id.returns"></a><h4>Returns</h4>
-<p> Name ID index</p>
+<p> Name identifier of the requested feature type</p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-2-2-0.html#api-index-2.2.0">2.2.0</a></p>
 </div>
@@ -165,8 +172,62 @@ hb_aat_layout_feature_type_get_selector_infos
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-aat-layout.html#hb-aat-layout-feature-type-t" title="enum hb_aat_layout_feature_type_t"><span class="type">hb_aat_layout_feature_type_t</span></a> feature_type</code></em>,
                                 <em class="parameter"><code>unsigned <span class="type">int</span> start_offset</code></em>,
                                 <em class="parameter"><code>unsigned <span class="type">int</span> *selector_count</code></em>,
-                                <em class="parameter"><code><span class="type">hb_aat_layout_feature_selector_info_t</span> *selectors</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-aat-layout.html#hb-aat-layout-feature-selector-info-t" title="hb_aat_layout_feature_selector_info_t"><span class="type">hb_aat_layout_feature_selector_info_t</span></a> *selectors</code></em>,
                                 <em class="parameter"><code>unsigned <span class="type">int</span> *default_index</code></em>);</pre>
+<p>Fetches a list of the selectors available for the specified feature in the given face.</p>
+<p>If upon return, <em class="parameter"><code>default_index</code></em>
+ is set to <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-NO-SELECTOR-INDEX:CAPS" title="HB_AAT_LAYOUT_NO_SELECTOR_INDEX"><span class="type">HB_AAT_LAYOUT_NO_SELECTOR_INDEX</span></a>, then
+the feature type is non-exclusive.  Otherwise, <em class="parameter"><code>default_index</code></em>
+ is the index of
+the selector that is selected by default.</p>
+<div class="refsect3">
+<a name="hb-aat-layout-feature-type-get-selector-infos.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>feature_type</p></td>
+<td class="parameter_description"><p>The <a class="link" href="harfbuzz-hb-aat-layout.html#hb-aat-layout-feature-type-t" title="enum hb_aat_layout_feature_type_t"><span class="type">hb_aat_layout_feature_type_t</span></a> of the requested feature type</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>start_offset</p></td>
+<td class="parameter_description"><p>offset of the first feature type to retrieve</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>selector_count</p></td>
+<td class="parameter_description"><p>Input = the maximum number of selectors to return;
+Output = the actual number of selectors returned (may be zero). </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<acronym title="NULL may be passed instead of a pointer to a location."><span class="acronym">optional</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>selectors</p></td>
+<td class="parameter_description"><p>A buffer pointer. The selectors available for the feature type queries. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Out parameter, where caller must allocate storage."><span class="acronym">out caller-allocates</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=selector_count][<acronym title="NULL may be passed instead of a pointer to a location."><span class="acronym">optional</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>default_index</p></td>
+<td class="parameter_description"><p>The index of the feature's default selector, if any. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL may be passed instead of a pointer to a location."><span class="acronym">optional</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-aat-layout-feature-type-get-selector-infos.returns"></a><h4>Returns</h4>
+<p> Number of all available feature selectors</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-2-0.html#api-index-2.2.0">2.2.0</a></p>
 </div>
 <hr>
 <div class="refsect2">
@@ -176,6 +237,7 @@ hb_aat_layout_get_feature_types (<em class="parameter"><code><a class="link" hre
                                  <em class="parameter"><code>unsigned <span class="type">int</span> start_offset</code></em>,
                                  <em class="parameter"><code>unsigned <span class="type">int</span> *feature_count</code></em>,
                                  <em class="parameter"><code><a class="link" href="harfbuzz-hb-aat-layout.html#hb-aat-layout-feature-type-t" title="enum hb_aat_layout_feature_type_t"><span class="type">hb_aat_layout_feature_type_t</span></a> *features</code></em>);</pre>
+<p>Fetches a list of the AAT feature types included in the specified face.</p>
 <div class="refsect3">
 <a name="hb-aat-layout-get-feature-types.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -187,22 +249,23 @@ hb_aat_layout_get_feature_types (<em class="parameter"><code><a class="link" hre
 <tbody>
 <tr>
 <td class="parameter_name"><p>face</p></td>
-<td class="parameter_description"><p>a face object</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> to work upon</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>start_offset</p></td>
-<td class="parameter_description"><p>iteration's start offset</p></td>
+<td class="parameter_description"><p>offset of the first feature type to retrieve</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>feature_count</p></td>
-<td class="parameter_description"><p>buffer size as input, filled size as output. </p></td>
-<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+<td class="parameter_description"><p>Input = the maximum number of feature types to return;
+Output = the actual number of feature types returned (may be zero). </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<acronym title="NULL may be passed instead of a pointer to a location."><span class="acronym">optional</span></acronym>]</span></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>features</p></td>
-<td class="parameter_description"><p>features buffer. </p></td>
+<td class="parameter_description"><p>Array of feature types found. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Out parameter, where caller must allocate storage."><span class="acronym">out caller-allocates</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=feature_count]</span></td>
 </tr>
 </tbody>
@@ -219,18 +282,86 @@ hb_aat_layout_get_feature_types (<em class="parameter"><code><a class="link" hre
 <a name="hb-aat-layout-has-positioning"></a><h3>hb_aat_layout_has_positioning ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 hb_aat_layout_has_positioning (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+<p>Tests whether the specified face includes any positioning information
+in the <code class="literal">kerx</code> table.</p>
+<div class="note">Note: does not examine the `GPOS` table.</div>
+<div class="refsect3">
+<a name="hb-aat-layout-has-positioning.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-aat-layout-has-positioning.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> if data found, <code class="literal">false</code> otherwise</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-3-0.html#api-index-2.3.0">2.3.0</a></p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="hb-aat-layout-has-substitution"></a><h3>hb_aat_layout_has_substitution ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 hb_aat_layout_has_substitution (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+<p>Tests whether the specified face includes any substitutions in the
+<code class="literal">morx</code> or <code class="literal">mort</code> tables.</p>
+<div class="note">Note: does not examine the `GSUB` table.</div>
+<div class="refsect3">
+<a name="hb-aat-layout-has-substitution.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-aat-layout-has-substitution.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> if data found, <code class="literal">false</code> otherwise</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-3-0.html#api-index-2.3.0">2.3.0</a></p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="hb-aat-layout-has-tracking"></a><h3>hb_aat_layout_has_tracking ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 hb_aat_layout_has_tracking (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+<p>Tests whether the specified face includes any tracking information
+in the <code class="literal">trak</code> table.</p>
+<div class="refsect3">
+<a name="hb-aat-layout-has-tracking.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>: <a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-aat-layout-has-tracking.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> if data found, <code class="literal">false</code> otherwise</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-3-0.html#api-index-2.3.0">2.3.0</a></p>
 </div>
 </div>
 <div class="refsect1">
@@ -239,10 +370,13 @@ hb_aat_layout_has_tracking (<em class="parameter"><code><a class="link" href="ha
 <a name="HB-AAT-LAYOUT-NO-SELECTOR-INDEX:CAPS"></a><h3>HB_AAT_LAYOUT_NO_SELECTOR_INDEX</h3>
 <pre class="programlisting">#define HB_AAT_LAYOUT_NO_SELECTOR_INDEX            0xFFFFu
 </pre>
+<p>Used when getting or setting AAT feature selectors. Indicates that
+there is no selector index corresponding to the selector of interest.</p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="hb-aat-layout-feature-type-t"></a><h3>enum hb_aat_layout_feature_type_t</h3>
+<p>The possible feature types defined for AAT shaping, from Apple <a class="ulink" href="https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html" target="_top">Font Feature Registry</a>.</p>
 <div class="refsect3">
 <a name="hb-aat-layout-feature-type-t.members"></a><h4>Members</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -254,208 +388,283 @@ hb_aat_layout_has_tracking (<em class="parameter"><code><a class="link" href="ha
 <tbody>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-INVALID:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_INVALID</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>Initial, unset feature type</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-ALL-TYPOGRAPHIC:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_ALL_TYPOGRAPHIC</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p><a class="ulink" href="https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type0" target="_top">All Typographic Features</a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-LIGATURES:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p><a class="ulink" href="https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type1" target="_top">Ligatures</a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-CURISVE-CONNECTION:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_CURISVE_CONNECTION</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p><a class="ulink" href="https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type2" target="_top">Cursive Connection</a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-LETTER-CASE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_LETTER_CASE</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p><a class="ulink" href="https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type3" target="_top">Letter Case</a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-VERTICAL-SUBSTITUTION:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_SUBSTITUTION</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p><a class="ulink" href="https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type4" target="_top">Vertical Substitution</a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-LINGUISTIC-REARRANGEMENT:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_LINGUISTIC_REARRANGEMENT</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p><a class="ulink" href="https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type5" target="_top">Linguistic Rearrangement</a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-NUMBER-SPACING:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_SPACING</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p><a class="ulink" href="https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type6" target="_top">Number Spacing</a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-SMART-SWASH-TYPE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_SMART_SWASH_TYPE</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p><a class="ulink" href="https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type8" target="_top">Smart Swash</a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-DIACRITICS-TYPE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_DIACRITICS_TYPE</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p><a class="ulink" href="https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type9" target="_top">Diacritics</a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-VERTICAL-POSITION:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_POSITION</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p><a class="ulink" href="https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type10" target="_top">Vertical Position</a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-FRACTIONS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_FRACTIONS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p><a class="ulink" href="https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type11" target="_top">Fractions</a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-OVERLAPPING-CHARACTERS-TYPE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_OVERLAPPING_CHARACTERS_TYPE</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p><a class="ulink" href="https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type13" target="_top">Overlapping Characters</a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-TYPOGRAPHIC-EXTRAS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p><a class="ulink" href="https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type14" target="_top">Typographic Extras</a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-MATHEMATICAL-EXTRAS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p><a class="ulink" href="https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type15" target="_top">Mathematical Extras</a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-ORNAMENT-SETS-TYPE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_ORNAMENT_SETS_TYPE</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p><a class="ulink" href="https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type16" target="_top">Ornament Sets</a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-CHARACTER-ALTERNATIVES:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_ALTERNATIVES</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p><a class="ulink" href="https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type17" target="_top">Character Alternatives</a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-DESIGN-COMPLEXITY-TYPE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_DESIGN_COMPLEXITY_TYPE</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p><a class="ulink" href="https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type18" target="_top">Design Complexity</a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-STYLE-OPTIONS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_STYLE_OPTIONS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p><a class="ulink" href="https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type19" target="_top">Style Options</a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-CHARACTER-SHAPE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p><a class="ulink" href="https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type20" target="_top">Character Shape</a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-NUMBER-CASE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_CASE</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p><a class="ulink" href="https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type21" target="_top">Number Case</a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-TEXT-SPACING:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p><a class="ulink" href="https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type22" target="_top">Text Spacing</a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-TRANSLITERATION:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_TRANSLITERATION</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p><a class="ulink" href="https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type23" target="_top">Transliteration</a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-ANNOTATION-TYPE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_ANNOTATION_TYPE</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p><a class="ulink" href="https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type24" target="_top">Annotation</a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-KANA-SPACING-TYPE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_KANA_SPACING_TYPE</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p><a class="ulink" href="https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type25" target="_top">Kana Spacing</a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-IDEOGRAPHIC-SPACING-TYPE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_SPACING_TYPE</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p><a class="ulink" href="https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type26" target="_top">Ideographic Spacing</a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-UNICODE-DECOMPOSITION-TYPE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_UNICODE_DECOMPOSITION_TYPE</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p><a class="ulink" href="https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type27" target="_top">Unicode Decomposition</a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-RUBY-KANA:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_RUBY_KANA</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p><a class="ulink" href="https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type28" target="_top">Ruby Kana</a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-CJK-SYMBOL-ALTERNATIVES-TYPE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_CJK_SYMBOL_ALTERNATIVES_TYPE</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p><a class="ulink" href="https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type29" target="_top">CJK Symbol Alternatives</a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-IDEOGRAPHIC-ALTERNATIVES-TYPE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_ALTERNATIVES_TYPE</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p><a class="ulink" href="https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type30" target="_top">Ideographic Alternatives</a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-CJK-VERTICAL-ROMAN-PLACEMENT-TYPE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_CJK_VERTICAL_ROMAN_PLACEMENT_TYPE</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p><a class="ulink" href="https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type31" target="_top">CJK Vertical Roman Placement</a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-ITALIC-CJK-ROMAN:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_ITALIC_CJK_ROMAN</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p><a class="ulink" href="https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type32" target="_top">Italic CJK Roman</a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-CASE-SENSITIVE-LAYOUT:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_CASE_SENSITIVE_LAYOUT</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p><a class="ulink" href="https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type33" target="_top">Case Sensitive Layout</a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-ALTERNATE-KANA:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_ALTERNATE_KANA</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p><a class="ulink" href="https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type34" target="_top">Alternate Kana</a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-STYLISTIC-ALTERNATIVES:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p><a class="ulink" href="https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type35" target="_top">Stylistic Alternatives</a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-CONTEXTUAL-ALTERNATIVES:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_CONTEXTUAL_ALTERNATIVES</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p><a class="ulink" href="https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type36" target="_top">Contextual Alternatives</a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-LOWER-CASE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_LOWER_CASE</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p><a class="ulink" href="https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type37" target="_top">Lower Case</a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-UPPER-CASE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_UPPER_CASE</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p><a class="ulink" href="https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type38" target="_top">Upper Case</a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-LANGUAGE-TAG-TYPE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_LANGUAGE_TAG_TYPE</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p><a class="ulink" href="https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type39" target="_top">Language Tag</a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-CJK-ROMAN-SPACING-TYPE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_TYPE_CJK_ROMAN_SPACING_TYPE</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-TYPE-MAX-VALUE:CAPS"></a>_HB_AAT_LAYOUT_FEATURE_TYPE_MAX_VALUE</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p><a class="ulink" href="https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type103" target="_top">CJK Roman Spacing</a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 </tbody>
 </table></div>
@@ -465,6 +674,7 @@ hb_aat_layout_has_tracking (<em class="parameter"><code><a class="link" href="ha
 <hr>
 <div class="refsect2">
 <a name="hb-aat-layout-feature-selector-t"></a><h3>enum hb_aat_layout_feature_selector_t</h3>
+<p>The selectors defined for specifying AAT feature settings.</p>
 <div class="refsect3">
 <a name="hb-aat-layout-feature-selector-t.members"></a><h4>Members</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -476,1272 +686,1807 @@ hb_aat_layout_has_tracking (<em class="parameter"><code><a class="link" href="ha
 <tbody>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-INVALID:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_INVALID</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>Initial, unset feature selector</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-ALL-TYPE-FEATURES-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_ALL_TYPE_FEATURES_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-ALL-TYPOGRAPHIC:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_ALL_TYPOGRAPHIC</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-ALL-TYPE-FEATURES-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_ALL_TYPE_FEATURES_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-ALL-TYPOGRAPHIC:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_ALL_TYPOGRAPHIC</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-REQUIRED-LIGATURES-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_REQUIRED_LIGATURES_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-LIGATURES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-REQUIRED-LIGATURES-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_REQUIRED_LIGATURES_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-LIGATURES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-COMMON-LIGATURES-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_COMMON_LIGATURES_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-LIGATURES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-COMMON-LIGATURES-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_COMMON_LIGATURES_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-LIGATURES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-RARE-LIGATURES-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_RARE_LIGATURES_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-LIGATURES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-RARE-LIGATURES-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_RARE_LIGATURES_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-LIGATURES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-LOGOS-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_LOGOS_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-LIGATURES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-LOGOS-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_LOGOS_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-LIGATURES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-REBUS-PICTURES-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_REBUS_PICTURES_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-LIGATURES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-REBUS-PICTURES-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_REBUS_PICTURES_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-LIGATURES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-DIPHTHONG-LIGATURES-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_DIPHTHONG_LIGATURES_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-LIGATURES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-DIPHTHONG-LIGATURES-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_DIPHTHONG_LIGATURES_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-LIGATURES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-SQUARED-LIGATURES-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_SQUARED_LIGATURES_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-LIGATURES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-SQUARED-LIGATURES-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_SQUARED_LIGATURES_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-LIGATURES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-ABBREV-SQUARED-LIGATURES-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_ABBREV_SQUARED_LIGATURES_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-LIGATURES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-ABBREV-SQUARED-LIGATURES-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_ABBREV_SQUARED_LIGATURES_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-LIGATURES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-SYMBOL-LIGATURES-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_SYMBOL_LIGATURES_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-LIGATURES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-SYMBOL-LIGATURES-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_SYMBOL_LIGATURES_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-LIGATURES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-CONTEXTUAL-LIGATURES-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_LIGATURES_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-LIGATURES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-CONTEXTUAL-LIGATURES-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_LIGATURES_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-LIGATURES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-HISTORICAL-LIGATURES-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_HISTORICAL_LIGATURES_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-LIGATURES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-HISTORICAL-LIGATURES-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_HISTORICAL_LIGATURES_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-LIGATURES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-UNCONNECTED:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_UNCONNECTED</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-LIGATURES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-PARTIALLY-CONNECTED:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_PARTIALLY_CONNECTED</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-LIGATURES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-CURSIVE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_CURSIVE</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-LIGATURES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-UPPER-AND-LOWER-CASE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_AND_LOWER_CASE</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>Deprecated</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-ALL-CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_ALL_CAPS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>Deprecated</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-ALL-LOWER-CASE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_ALL_LOWER_CASE</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>Deprecated</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-SMALL-CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_SMALL_CAPS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>Deprecated</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-INITIAL-CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_INITIAL_CAPS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>Deprecated</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-INITIAL-CAPS-AND-SMALL-CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_INITIAL_CAPS_AND_SMALL_CAPS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>Deprecated</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-SUBSTITUTE-VERTICAL-FORMS-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_SUBSTITUTE_VERTICAL_FORMS_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-VERTICAL-SUBSTITUTION:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_SUBSTITUTION</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-SUBSTITUTE-VERTICAL-FORMS-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_SUBSTITUTE_VERTICAL_FORMS_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-VERTICAL-SUBSTITUTION:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_SUBSTITUTION</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-LINGUISTIC-REARRANGEMENT-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_LINGUISTIC_REARRANGEMENT_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-LINGUISTIC-REARRANGEMENT:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_LINGUISTIC_REARRANGEMENT</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-LINGUISTIC-REARRANGEMENT-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_LINGUISTIC_REARRANGEMENT_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-LINGUISTIC-REARRANGEMENT:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_LINGUISTIC_REARRANGEMENT</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-MONOSPACED-NUMBERS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_MONOSPACED_NUMBERS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-NUMBER-SPACING:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_SPACING</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-PROPORTIONAL-NUMBERS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_NUMBERS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-NUMBER-SPACING:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_SPACING</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-THIRD-WIDTH-NUMBERS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_THIRD_WIDTH_NUMBERS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-NUMBER-SPACING:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_SPACING</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-QUARTER-WIDTH-NUMBERS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_QUARTER_WIDTH_NUMBERS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-NUMBER-SPACING:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_SPACING</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-WORD-INITIAL-SWASHES-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_WORD_INITIAL_SWASHES_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-SMART-SWASH-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_SMART_SWASH_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-WORD-INITIAL-SWASHES-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_WORD_INITIAL_SWASHES_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-SMART-SWASH-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_SMART_SWASH_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-WORD-FINAL-SWASHES-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_WORD_FINAL_SWASHES_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-SMART-SWASH-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_SMART_SWASH_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-WORD-FINAL-SWASHES-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_WORD_FINAL_SWASHES_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-SMART-SWASH-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_SMART_SWASH_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-LINE-INITIAL-SWASHES-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_LINE_INITIAL_SWASHES_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-SMART-SWASH-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_SMART_SWASH_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-LINE-INITIAL-SWASHES-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_LINE_INITIAL_SWASHES_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-SMART-SWASH-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_SMART_SWASH_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-LINE-FINAL-SWASHES-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_LINE_FINAL_SWASHES_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-SMART-SWASH-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_SMART_SWASH_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-LINE-FINAL-SWASHES-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_LINE_FINAL_SWASHES_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-SMART-SWASH-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_SMART_SWASH_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-NON-FINAL-SWASHES-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_NON_FINAL_SWASHES_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-SMART-SWASH-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_SMART_SWASH_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-NON-FINAL-SWASHES-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_NON_FINAL_SWASHES_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-SMART-SWASH-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_SMART_SWASH_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-SHOW-DIACRITICS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_SHOW_DIACRITICS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-DIACRITICS-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_DIACRITICS_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-HIDE-DIACRITICS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_HIDE_DIACRITICS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-DIACRITICS-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_DIACRITICS_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-DECOMPOSE-DIACRITICS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_DECOMPOSE_DIACRITICS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-DIACRITICS-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_DIACRITICS_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-NORMAL-POSITION:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_NORMAL_POSITION</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-VERTICAL-POSITION:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_POSITION</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-SUPERIORS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_SUPERIORS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-VERTICAL-POSITION:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_POSITION</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-INFERIORS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_INFERIORS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-VERTICAL-POSITION:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_POSITION</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-ORDINALS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_ORDINALS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-VERTICAL-POSITION:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_POSITION</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-SCIENTIFIC-INFERIORS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_SCIENTIFIC_INFERIORS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-VERTICAL-POSITION:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_POSITION</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-NO-FRACTIONS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_FRACTIONS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-FRACTIONS:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_FRACTIONS</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-VERTICAL-FRACTIONS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_VERTICAL_FRACTIONS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-FRACTIONS:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_FRACTIONS</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-DIAGONAL-FRACTIONS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_DIAGONAL_FRACTIONS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-FRACTIONS:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_FRACTIONS</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-PREVENT-OVERLAP-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_PREVENT_OVERLAP_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-OVERLAPPING-CHARACTERS-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_OVERLAPPING_CHARACTERS_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-PREVENT-OVERLAP-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_PREVENT_OVERLAP_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-OVERLAPPING-CHARACTERS-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_OVERLAPPING_CHARACTERS_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-HYPHENS-TO-EM-DASH-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHENS_TO_EM_DASH_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-TYPOGRAPHIC-EXTRAS:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-HYPHENS-TO-EM-DASH-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHENS_TO_EM_DASH_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-TYPOGRAPHIC-EXTRAS:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-HYPHEN-TO-EN-DASH-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHEN_TO_EN_DASH_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-TYPOGRAPHIC-EXTRAS:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-HYPHEN-TO-EN-DASH-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHEN_TO_EN_DASH_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-TYPOGRAPHIC-EXTRAS:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-SLASHED-ZERO-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASHED_ZERO_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-TYPOGRAPHIC-EXTRAS:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-SLASHED-ZERO-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASHED_ZERO_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-TYPOGRAPHIC-EXTRAS:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-FORM-INTERROBANG-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_FORM_INTERROBANG_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-TYPOGRAPHIC-EXTRAS:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-FORM-INTERROBANG-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_FORM_INTERROBANG_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-TYPOGRAPHIC-EXTRAS:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-SMART-QUOTES-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_SMART_QUOTES_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-TYPOGRAPHIC-EXTRAS:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-SMART-QUOTES-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_SMART_QUOTES_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-TYPOGRAPHIC-EXTRAS:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-PERIODS-TO-ELLIPSIS-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_PERIODS_TO_ELLIPSIS_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-TYPOGRAPHIC-EXTRAS:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-PERIODS-TO-ELLIPSIS-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_PERIODS_TO_ELLIPSIS_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-TYPOGRAPHIC-EXTRAS:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-HYPHEN-TO-MINUS-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHEN_TO_MINUS_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-MATHEMATICAL-EXTRAS:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-HYPHEN-TO-MINUS-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHEN_TO_MINUS_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-MATHEMATICAL-EXTRAS:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-ASTERISK-TO-MULTIPLY-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_ASTERISK_TO_MULTIPLY_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-MATHEMATICAL-EXTRAS:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-ASTERISK-TO-MULTIPLY-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_ASTERISK_TO_MULTIPLY_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-MATHEMATICAL-EXTRAS:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-SLASH-TO-DIVIDE-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASH_TO_DIVIDE_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-MATHEMATICAL-EXTRAS:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-SLASH-TO-DIVIDE-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASH_TO_DIVIDE_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-MATHEMATICAL-EXTRAS:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-INEQUALITY-LIGATURES-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_INEQUALITY_LIGATURES_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-MATHEMATICAL-EXTRAS:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-INEQUALITY-LIGATURES-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_INEQUALITY_LIGATURES_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-MATHEMATICAL-EXTRAS:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-EXPONENTS-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_EXPONENTS_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-MATHEMATICAL-EXTRAS:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-EXPONENTS-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_EXPONENTS_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-MATHEMATICAL-EXTRAS:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-MATHEMATICAL-GREEK-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_MATHEMATICAL_GREEK_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-MATHEMATICAL-EXTRAS:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-MATHEMATICAL-GREEK-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_MATHEMATICAL_GREEK_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-MATHEMATICAL-EXTRAS:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-NO-ORNAMENTS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_ORNAMENTS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-ORNAMENT-SETS-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_ORNAMENT_SETS_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-DINGBATS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_DINGBATS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-ORNAMENT-SETS-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_ORNAMENT_SETS_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-PI-CHARACTERS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_PI_CHARACTERS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-ORNAMENT-SETS-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_ORNAMENT_SETS_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-FLEURONS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_FLEURONS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-ORNAMENT-SETS-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_ORNAMENT_SETS_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-DECORATIVE-BORDERS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_DECORATIVE_BORDERS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-ORNAMENT-SETS-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_ORNAMENT_SETS_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-INTERNATIONAL-SYMBOLS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_INTERNATIONAL_SYMBOLS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-ORNAMENT-SETS-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_ORNAMENT_SETS_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-MATH-SYMBOLS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_MATH_SYMBOLS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-ORNAMENT-SETS-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_ORNAMENT_SETS_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-NO-ALTERNATES:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_ALTERNATES</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-CHARACTER-ALTERNATIVES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_ALTERNATIVES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-DESIGN-LEVEL1:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL1</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-DESIGN-COMPLEXITY-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_DESIGN_COMPLEXITY_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-DESIGN-LEVEL2:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL2</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-DESIGN-COMPLEXITY-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_DESIGN_COMPLEXITY_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-DESIGN-LEVEL3:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL3</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-DESIGN-COMPLEXITY-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_DESIGN_COMPLEXITY_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-DESIGN-LEVEL4:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL4</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-DESIGN-COMPLEXITY-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_DESIGN_COMPLEXITY_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-DESIGN-LEVEL5:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL5</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-DESIGN-COMPLEXITY-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_DESIGN_COMPLEXITY_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-NO-STYLE-OPTIONS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_STYLE_OPTIONS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-STYLE-OPTIONS:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_STYLE_OPTIONS</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-DISPLAY-TEXT:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_DISPLAY_TEXT</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-STYLE-OPTIONS:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_STYLE_OPTIONS</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-ENGRAVED-TEXT:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_ENGRAVED_TEXT</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-STYLE-OPTIONS:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_STYLE_OPTIONS</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-ILLUMINATED-CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_ILLUMINATED_CAPS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-STYLE-OPTIONS:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_STYLE_OPTIONS</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-TITLING-CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_TITLING_CAPS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-STYLE-OPTIONS:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_STYLE_OPTIONS</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-TALL-CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_TALL_CAPS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-STYLE-OPTIONS:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_STYLE_OPTIONS</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-TRADITIONAL-CHARACTERS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_CHARACTERS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-CHARACTER-SHAPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-SIMPLIFIED-CHARACTERS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_SIMPLIFIED_CHARACTERS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-CHARACTER-SHAPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-JIS1978-CHARACTERS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS1978_CHARACTERS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-CHARACTER-SHAPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-JIS1983-CHARACTERS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS1983_CHARACTERS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-CHARACTER-SHAPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-JIS1990-CHARACTERS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS1990_CHARACTERS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-CHARACTER-SHAPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-TRADITIONAL-ALT-ONE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_ONE</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-CHARACTER-SHAPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-TRADITIONAL-ALT-TWO:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_TWO</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-CHARACTER-SHAPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-TRADITIONAL-ALT-THREE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_THREE</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-CHARACTER-SHAPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-TRADITIONAL-ALT-FOUR:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_FOUR</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-CHARACTER-SHAPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-TRADITIONAL-ALT-FIVE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_FIVE</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-CHARACTER-SHAPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-EXPERT-CHARACTERS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_EXPERT_CHARACTERS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-CHARACTER-SHAPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-JIS2004-CHARACTERS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS2004_CHARACTERS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-CHARACTER-SHAPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-HOJO-CHARACTERS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_HOJO_CHARACTERS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-CHARACTER-SHAPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-NLCCHARACTERS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_NLCCHARACTERS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-CHARACTER-SHAPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-TRADITIONAL-NAMES-CHARACTERS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_NAMES_CHARACTERS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-CHARACTER-SHAPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-LOWER-CASE-NUMBERS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_NUMBERS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-NUMBER-CASE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_CASE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-UPPER-CASE-NUMBERS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_CASE_NUMBERS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-NUMBER-CASE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_CASE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-PROPORTIONAL-TEXT:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_TEXT</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-TEXT-SPACING:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-MONOSPACED-TEXT:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_MONOSPACED_TEXT</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-TEXT-SPACING:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-HALF-WIDTH-TEXT:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_HALF_WIDTH_TEXT</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-TEXT-SPACING:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-THIRD-WIDTH-TEXT:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_THIRD_WIDTH_TEXT</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-TEXT-SPACING:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-QUARTER-WIDTH-TEXT:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_QUARTER_WIDTH_TEXT</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-TEXT-SPACING:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-ALT-PROPORTIONAL-TEXT:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_ALT_PROPORTIONAL_TEXT</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-TEXT-SPACING:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-ALT-HALF-WIDTH-TEXT:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_ALT_HALF_WIDTH_TEXT</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-TEXT-SPACING:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-NO-TRANSLITERATION:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_TRANSLITERATION</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-TRANSLITERATION:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_TRANSLITERATION</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-HANJA-TO-HANGUL:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_HANJA_TO_HANGUL</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-TRANSLITERATION:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_TRANSLITERATION</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-HIRAGANA-TO-KATAKANA:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_HIRAGANA_TO_KATAKANA</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-TRANSLITERATION:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_TRANSLITERATION</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-KATAKANA-TO-HIRAGANA:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_KATAKANA_TO_HIRAGANA</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-TRANSLITERATION:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_TRANSLITERATION</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-KANA-TO-ROMANIZATION:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_KANA_TO_ROMANIZATION</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-TRANSLITERATION:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_TRANSLITERATION</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-ROMANIZATION-TO-HIRAGANA:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_ROMANIZATION_TO_HIRAGANA</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-TRANSLITERATION:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_TRANSLITERATION</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-ROMANIZATION-TO-KATAKANA:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_ROMANIZATION_TO_KATAKANA</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-TRANSLITERATION:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_TRANSLITERATION</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-HANJA-TO-HANGUL-ALT-ONE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_HANJA_TO_HANGUL_ALT_ONE</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-TRANSLITERATION:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_TRANSLITERATION</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-HANJA-TO-HANGUL-ALT-TWO:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_HANJA_TO_HANGUL_ALT_TWO</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-TRANSLITERATION:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_TRANSLITERATION</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-HANJA-TO-HANGUL-ALT-THREE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_HANJA_TO_HANGUL_ALT_THREE</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-TRANSLITERATION:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_TRANSLITERATION</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-NO-ANNOTATION:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_ANNOTATION</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-ANNOTATION-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_ANNOTATION_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-BOX-ANNOTATION:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_BOX_ANNOTATION</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-ANNOTATION-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_ANNOTATION_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-ROUNDED-BOX-ANNOTATION:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_ROUNDED_BOX_ANNOTATION</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-ANNOTATION-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_ANNOTATION_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-CIRCLE-ANNOTATION:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_CIRCLE_ANNOTATION</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-ANNOTATION-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_ANNOTATION_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-INVERTED-CIRCLE-ANNOTATION:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_INVERTED_CIRCLE_ANNOTATION</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-ANNOTATION-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_ANNOTATION_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-PARENTHESIS-ANNOTATION:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_PARENTHESIS_ANNOTATION</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-ANNOTATION-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_ANNOTATION_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-PERIOD-ANNOTATION:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_PERIOD_ANNOTATION</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-ANNOTATION-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_ANNOTATION_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-ROMAN-NUMERAL-ANNOTATION:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_ROMAN_NUMERAL_ANNOTATION</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-ANNOTATION-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_ANNOTATION_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-DIAMOND-ANNOTATION:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_DIAMOND_ANNOTATION</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-ANNOTATION-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_ANNOTATION_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-INVERTED-BOX-ANNOTATION:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_INVERTED_BOX_ANNOTATION</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-ANNOTATION-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_ANNOTATION_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-INVERTED-ROUNDED-BOX-ANNOTATION:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_INVERTED_ROUNDED_BOX_ANNOTATION</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-ANNOTATION-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_ANNOTATION_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-FULL-WIDTH-KANA:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_FULL_WIDTH_KANA</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-KANA-SPACING-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_KANA_SPACING_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-PROPORTIONAL-KANA:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_KANA</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-KANA-SPACING-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_KANA_SPACING_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-FULL-WIDTH-IDEOGRAPHS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_FULL_WIDTH_IDEOGRAPHS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-IDEOGRAPHIC-SPACING-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_SPACING_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-PROPORTIONAL-IDEOGRAPHS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_IDEOGRAPHS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-IDEOGRAPHIC-SPACING-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_SPACING_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-HALF-WIDTH-IDEOGRAPHS:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_HALF_WIDTH_IDEOGRAPHS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-IDEOGRAPHIC-SPACING-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_SPACING_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-CANONICAL-COMPOSITION-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_CANONICAL_COMPOSITION_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-UNICODE-DECOMPOSITION-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_UNICODE_DECOMPOSITION_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-CANONICAL-COMPOSITION-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_CANONICAL_COMPOSITION_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-UNICODE-DECOMPOSITION-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_UNICODE_DECOMPOSITION_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-COMPATIBILITY-COMPOSITION-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_COMPATIBILITY_COMPOSITION_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-UNICODE-DECOMPOSITION-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_UNICODE_DECOMPOSITION_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-COMPATIBILITY-COMPOSITION-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_COMPATIBILITY_COMPOSITION_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-UNICODE-DECOMPOSITION-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_UNICODE_DECOMPOSITION_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-TRANSCODING-COMPOSITION-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_TRANSCODING_COMPOSITION_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-UNICODE-DECOMPOSITION-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_UNICODE_DECOMPOSITION_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-TRANSCODING-COMPOSITION-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_TRANSCODING_COMPOSITION_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-UNICODE-DECOMPOSITION-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_UNICODE_DECOMPOSITION_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-NO-RUBY-KANA:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_RUBY_KANA</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>Deprecated; use <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-RUBY-KANA-OFF:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA_OFF</span></a> instead</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-RUBY-KANA:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>Deprecated; use <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-RUBY-KANA-ON:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA_ON</span></a> instead</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-RUBY-KANA-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-RUBY-KANA:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_RUBY_KANA</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-RUBY-KANA-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-RUBY-KANA:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_RUBY_KANA</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-NO-CJK-SYMBOL-ALTERNATIVES:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_CJK_SYMBOL_ALTERNATIVES</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-CJK-SYMBOL-ALTERNATIVES-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_CJK_SYMBOL_ALTERNATIVES_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-CJK-SYMBOL-ALT-ONE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_ONE</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-CJK-SYMBOL-ALTERNATIVES-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_CJK_SYMBOL_ALTERNATIVES_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-CJK-SYMBOL-ALT-TWO:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_TWO</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-CJK-SYMBOL-ALTERNATIVES-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_CJK_SYMBOL_ALTERNATIVES_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-CJK-SYMBOL-ALT-THREE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_THREE</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-CJK-SYMBOL-ALTERNATIVES-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_CJK_SYMBOL_ALTERNATIVES_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-CJK-SYMBOL-ALT-FOUR:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_FOUR</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-CJK-SYMBOL-ALTERNATIVES-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_CJK_SYMBOL_ALTERNATIVES_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-CJK-SYMBOL-ALT-FIVE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_FIVE</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-CJK-SYMBOL-ALTERNATIVES-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_CJK_SYMBOL_ALTERNATIVES_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-NO-IDEOGRAPHIC-ALTERNATIVES:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_IDEOGRAPHIC_ALTERNATIVES</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-IDEOGRAPHIC-ALTERNATIVES-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_ALTERNATIVES_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-IDEOGRAPHIC-ALT-ONE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_ONE</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-IDEOGRAPHIC-ALTERNATIVES-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_ALTERNATIVES_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-IDEOGRAPHIC-ALT-TWO:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_TWO</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-IDEOGRAPHIC-ALTERNATIVES-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_ALTERNATIVES_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-IDEOGRAPHIC-ALT-THREE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_THREE</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-IDEOGRAPHIC-ALTERNATIVES-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_ALTERNATIVES_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-IDEOGRAPHIC-ALT-FOUR:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_FOUR</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-IDEOGRAPHIC-ALTERNATIVES-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_ALTERNATIVES_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-IDEOGRAPHIC-ALT-FIVE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_FIVE</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-IDEOGRAPHIC-ALTERNATIVES-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_ALTERNATIVES_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-CJK-VERTICAL-ROMAN-CENTERED:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_VERTICAL_ROMAN_CENTERED</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-CJK-VERTICAL-ROMAN-PLACEMENT-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_CJK_VERTICAL_ROMAN_PLACEMENT_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-CJK-VERTICAL-ROMAN-HBASELINE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_VERTICAL_ROMAN_HBASELINE</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-CJK-VERTICAL-ROMAN-PLACEMENT-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_CJK_VERTICAL_ROMAN_PLACEMENT_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-NO-CJK-ITALIC-ROMAN:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_CJK_ITALIC_ROMAN</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>Deprecated; use <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-CJK-ITALIC-ROMAN-OFF:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN_OFF</span></a> instead</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-CJK-ITALIC-ROMAN:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>Deprecated; use <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-CJK-ITALIC-ROMAN-ON:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN_ON</span></a> instead</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-CJK-ITALIC-ROMAN-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-ITALIC-CJK-ROMAN:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_ITALIC_CJK_ROMAN</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-CJK-ITALIC-ROMAN-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-ITALIC-CJK-ROMAN:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_ITALIC_CJK_ROMAN</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-CASE-SENSITIVE-LAYOUT-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_LAYOUT_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-CASE-SENSITIVE-LAYOUT:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_CASE_SENSITIVE_LAYOUT</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-CASE-SENSITIVE-LAYOUT-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_LAYOUT_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-CASE-SENSITIVE-LAYOUT:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_CASE_SENSITIVE_LAYOUT</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-CASE-SENSITIVE-SPACING-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_SPACING_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-CASE-SENSITIVE-LAYOUT:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_CASE_SENSITIVE_LAYOUT</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-CASE-SENSITIVE-SPACING-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_SPACING_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-CASE-SENSITIVE-LAYOUT:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_CASE_SENSITIVE_LAYOUT</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-ALTERNATE-HORIZ-KANA-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_HORIZ_KANA_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-ALTERNATE-KANA:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_ALTERNATE_KANA</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-ALTERNATE-HORIZ-KANA-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_HORIZ_KANA_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-ALTERNATE-KANA:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_ALTERNATE_KANA</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-ALTERNATE-VERT-KANA-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_VERT_KANA_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-ALTERNATE-KANA:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_ALTERNATE_KANA</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-ALTERNATE-VERT-KANA-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_VERT_KANA_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-ALTERNATE-KANA:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_ALTERNATE_KANA</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-NO-STYLISTIC-ALTERNATES:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_STYLISTIC_ALTERNATES</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-STYLISTIC-ALTERNATIVES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-ONE-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ONE_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-STYLISTIC-ALTERNATIVES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-ONE-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ONE_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-STYLISTIC-ALTERNATIVES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-TWO-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWO_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-STYLISTIC-ALTERNATIVES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-TWO-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWO_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-STYLISTIC-ALTERNATIVES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-THREE-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THREE_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-STYLISTIC-ALTERNATIVES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-THREE-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THREE_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-STYLISTIC-ALTERNATIVES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-FOUR-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOUR_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-STYLISTIC-ALTERNATIVES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-FOUR-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOUR_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-STYLISTIC-ALTERNATIVES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-FIVE-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIVE_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-STYLISTIC-ALTERNATIVES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-FIVE-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIVE_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-STYLISTIC-ALTERNATIVES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-SIX-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIX_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-STYLISTIC-ALTERNATIVES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-SIX-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIX_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-STYLISTIC-ALTERNATIVES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-SEVEN-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVEN_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-STYLISTIC-ALTERNATIVES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-SEVEN-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVEN_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-STYLISTIC-ALTERNATIVES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-EIGHT-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHT_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-STYLISTIC-ALTERNATIVES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-EIGHT-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHT_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-STYLISTIC-ALTERNATIVES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-NINE-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINE_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-STYLISTIC-ALTERNATIVES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-NINE-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINE_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-STYLISTIC-ALTERNATIVES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-TEN-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TEN_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-STYLISTIC-ALTERNATIVES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-TEN-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TEN_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-STYLISTIC-ALTERNATIVES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-ELEVEN-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ELEVEN_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-STYLISTIC-ALTERNATIVES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-ELEVEN-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ELEVEN_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-STYLISTIC-ALTERNATIVES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-TWELVE-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWELVE_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-STYLISTIC-ALTERNATIVES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-TWELVE-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWELVE_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-STYLISTIC-ALTERNATIVES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-THIRTEEN-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THIRTEEN_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-STYLISTIC-ALTERNATIVES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-THIRTEEN-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THIRTEEN_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-STYLISTIC-ALTERNATIVES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-FOURTEEN-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOURTEEN_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-STYLISTIC-ALTERNATIVES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-FOURTEEN-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOURTEEN_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-STYLISTIC-ALTERNATIVES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-FIFTEEN-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIFTEEN_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-STYLISTIC-ALTERNATIVES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-FIFTEEN-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIFTEEN_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-STYLISTIC-ALTERNATIVES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-SIXTEEN-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIXTEEN_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-STYLISTIC-ALTERNATIVES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-SIXTEEN-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIXTEEN_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-STYLISTIC-ALTERNATIVES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-SEVENTEEN-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVENTEEN_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-STYLISTIC-ALTERNATIVES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-SEVENTEEN-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVENTEEN_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-STYLISTIC-ALTERNATIVES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-EIGHTEEN-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHTEEN_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-STYLISTIC-ALTERNATIVES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-EIGHTEEN-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHTEEN_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-STYLISTIC-ALTERNATIVES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-NINETEEN-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINETEEN_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-STYLISTIC-ALTERNATIVES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-NINETEEN-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINETEEN_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-STYLISTIC-ALTERNATIVES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-TWENTY-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWENTY_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-STYLISTIC-ALTERNATIVES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-STYLISTIC-ALT-TWENTY-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWENTY_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-STYLISTIC-ALTERNATIVES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-CONTEXTUAL-ALTERNATES-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_ALTERNATES_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-CONTEXTUAL-ALTERNATIVES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_CONTEXTUAL_ALTERNATIVES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-CONTEXTUAL-ALTERNATES-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_ALTERNATES_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-CONTEXTUAL-ALTERNATIVES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_CONTEXTUAL_ALTERNATIVES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-SWASH-ALTERNATES-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_SWASH_ALTERNATES_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-CONTEXTUAL-ALTERNATIVES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_CONTEXTUAL_ALTERNATIVES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-SWASH-ALTERNATES-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_SWASH_ALTERNATES_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-CONTEXTUAL-ALTERNATIVES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_CONTEXTUAL_ALTERNATIVES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-CONTEXTUAL-SWASH-ALTERNATES-ON:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_SWASH_ALTERNATES_ON</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-CONTEXTUAL-ALTERNATIVES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_CONTEXTUAL_ALTERNATIVES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-CONTEXTUAL-SWASH-ALTERNATES-OFF:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_SWASH_ALTERNATES_OFF</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-CONTEXTUAL-ALTERNATIVES:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_CONTEXTUAL_ALTERNATIVES</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-DEFAULT-LOWER-CASE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_LOWER_CASE</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-LOWER-CASE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_LOWER_CASE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-LOWER-CASE-SMALL-CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_SMALL_CAPS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-LOWER-CASE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_LOWER_CASE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-LOWER-CASE-PETITE-CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_PETITE_CAPS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-LOWER-CASE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_LOWER_CASE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-DEFAULT-UPPER-CASE:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_UPPER_CASE</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-UPPER-CASE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_UPPER_CASE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-UPPER-CASE-SMALL-CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_CASE_SMALL_CAPS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-UPPER-CASE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_UPPER_CASE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-UPPER-CASE-PETITE-CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_CASE_PETITE_CAPS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-UPPER-CASE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_UPPER_CASE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-HALF-WIDTH-CJK-ROMAN:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_HALF_WIDTH_CJK_ROMAN</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-CJK-ROMAN-SPACING-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_CJK_ROMAN_SPACING_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-PROPORTIONAL-CJK-ROMAN:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_CJK_ROMAN</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-CJK-ROMAN-SPACING-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_CJK_ROMAN_SPACING_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-DEFAULT-CJK-ROMAN:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_CJK_ROMAN</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-CJK-ROMAN-SPACING-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_CJK_ROMAN_SPACING_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-FULL-WIDTH-CJK-ROMAN:CAPS"></a>HB_AAT_LAYOUT_FEATURE_SELECTOR_FULL_WIDTH_CJK_ROMAN</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>for <a class="link" href="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-CJK-ROMAN-SPACING-TYPE:CAPS"><span class="type">HB_AAT_LAYOUT_FEATURE_TYPE_CJK_ROMAN_SPACING_TYPE</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-2-0.html#api-index-2.2.0">2.2.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-aat-layout-feature-selector-info-t"></a><h3>hb_aat_layout_feature_selector_info_t</h3>
+<pre class="programlisting">typedef struct {
+  hb_ot_name_id_t                      name_id;
+  hb_aat_layout_feature_selector_t enable;
+  hb_aat_layout_feature_selector_t disable;
+} hb_aat_layout_feature_selector_info_t;
+</pre>
+<p>Structure representing a setting for an <a class="link" href="harfbuzz-hb-aat-layout.html#hb-aat-layout-feature-type-t" title="enum hb_aat_layout_feature_type_t"><span class="type">hb_aat_layout_feature_type_t</span></a>.</p>
+<div class="refsect3">
+<a name="hb-aat-layout-feature-selector-info-t.members"></a><h4>Members</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="300px" class="struct_members_name">
+<col class="struct_members_description">
+<col width="200px" class="struct_members_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="struct_member_name"><p><a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-id-t" title="hb_ot_name_id_t"><span class="type">hb_ot_name_id_t</span></a> <em class="structfield"><code><a name="hb-aat-layout-feature-selector-info-t.name-id"></a>name_id</code></em>;</p></td>
+<td class="struct_member_description"><p>The selector's name identifier</p></td>
+<td class="struct_member_annotations"> </td>
 </tr>
 <tr>
-<td class="enum_member_name"><p><a name="HB-AAT-LAYOUT-FEATURE-SELECTOR-MAX-VALUE:CAPS"></a>_HB_AAT_LAYOUT_FEATURE_SELECTOR_MAX_VALUE</p></td>
-<td> </td>
-<td> </td>
+<td class="struct_member_name"><p><a class="link" href="harfbuzz-hb-aat-layout.html#hb-aat-layout-feature-selector-t" title="enum hb_aat_layout_feature_selector_t"><span class="type">hb_aat_layout_feature_selector_t</span></a> <em class="structfield"><code><a name="hb-aat-layout-feature-selector-info-t.enable"></a>enable</code></em>;</p></td>
+<td class="struct_member_description"><p>The value to turn the selector on</p></td>
+<td class="struct_member_annotations"> </td>
+</tr>
+<tr>
+<td class="struct_member_name"><p><a class="link" href="harfbuzz-hb-aat-layout.html#hb-aat-layout-feature-selector-t" title="enum hb_aat_layout_feature_selector_t"><span class="type">hb_aat_layout_feature_selector_t</span></a> <em class="structfield"><code><a name="hb-aat-layout-feature-selector-info-t.disable"></a>disable</code></em>;</p></td>
+<td class="struct_member_description"><p>The value to turn the selector off</p></td>
+<td class="struct_member_annotations"> </td>
 </tr>
 </tbody>
 </table></div>
 </div>
-<p class="since">Since: <a class="link" href="api-index-2-2-0.html#api-index-2.2.0">2.2.0</a></p>
 </div>
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index 88c5ee3..822fb52 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-blob: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch12.html" title="Core API">
-<link rel="prev" href="ch12.html" title="Core API">
+<link rel="up" href="core-api.html" title="Core API">
+<link rel="prev" href="core-api.html" title="Core API">
 <link rel="next" href="harfbuzz-hb-buffer.html" title="hb-buffer">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -18,8 +18,8 @@
                   <a href="#harfbuzz-hb-blob.description" class="shortcut">Description</a></span>
 </td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><a accesskey="u" href="ch12.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
-<td><a accesskey="p" href="ch12.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="core-api.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="core-api.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
 <td><a accesskey="n" href="harfbuzz-hb-buffer.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <div class="refentry">
 <a class="link" href="harfbuzz-hb-blob.html#hb-blob-t" title="hb_blob_t"><span class="returnvalue">hb_blob_t</span></a> *
 </td>
 <td class="function_name">
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-create-or-fail" title="hb_blob_create_or_fail ()">hb_blob_create_or_fail</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-t" title="hb_blob_t"><span class="returnvalue">hb_blob_t</span></a> *
+</td>
+<td class="function_name">
 <a class="link" href="harfbuzz-hb-blob.html#hb-blob-create-from-file" title="hb_blob_create_from_file ()">hb_blob_create_from_file</a> <span class="c_punctuation">()</span>
 </td>
 </tr>
 <a class="link" href="harfbuzz-hb-blob.html#hb-blob-t" title="hb_blob_t"><span class="returnvalue">hb_blob_t</span></a> *
 </td>
 <td class="function_name">
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-create-from-file-or-fail" title="hb_blob_create_from_file_or_fail ()">hb_blob_create_from_file_or_fail</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-t" title="hb_blob_t"><span class="returnvalue">hb_blob_t</span></a> *
+</td>
+<td class="function_name">
 <a class="link" href="harfbuzz-hb-blob.html#hb-blob-create-sub-blob" title="hb_blob_create_sub_blob ()">hb_blob_create_sub_blob</a> <span class="c_punctuation">()</span>
 </td>
 </tr>
@@ -234,8 +250,8 @@ in bytes.</p></td>
 <tr>
 <td class="parameter_name"><p>destroy</p></td>
 <td class="parameter_description"><p>Callback to call when <em class="parameter"><code>data</code></em>
-is not needed anymore.</p></td>
-<td class="parameter_annotations"> </td>
+is not needed anymore. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></td>
 </tr>
 </tbody>
 </table></div>
@@ -250,9 +266,78 @@ zero.  Destroy with <a class="link" href="harfbuzz-hb-blob.html#hb-blob-destroy"
 </div>
 <hr>
 <div class="refsect2">
+<a name="hb-blob-create-or-fail"></a><h3>hb_blob_create_or_fail ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t" title="hb_blob_t"><span class="returnvalue">hb_blob_t</span></a> *
+hb_blob_create_or_fail (<em class="parameter"><code>const <span class="type">char</span> *data</code></em>,
+                        <em class="parameter"><code>unsigned <span class="type">int</span> length</code></em>,
+                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-blob.html#hb-memory-mode-t" title="enum hb_memory_mode_t"><span class="type">hb_memory_mode_t</span></a> mode</code></em>,
+                        <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
+                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<p>Creates a new "blob" object wrapping <em class="parameter"><code>data</code></em>
+.  The <em class="parameter"><code>mode</code></em>
+ parameter is used
+to negotiate ownership and lifecycle of <em class="parameter"><code>data</code></em>
+.</p>
+<p>Note that this function returns a freshly-allocated empty blob even if <em class="parameter"><code>length</code></em>
+
+is zero. This is in contrast to <a class="link" href="harfbuzz-hb-blob.html#hb-blob-create" title="hb_blob_create ()"><code class="function">hb_blob_create()</code></a>, which returns the singleton
+empty blob (as returned by <a class="link" href="harfbuzz-hb-blob.html#hb-blob-get-empty" title="hb_blob_get_empty ()"><code class="function">hb_blob_get_empty()</code></a>) if <em class="parameter"><code>length</code></em>
+ is zero.</p>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
+<div class="refsect3">
+<a name="hb-blob-create-or-fail.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>data</p></td>
+<td class="parameter_description"><p>Pointer to blob data.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>length</p></td>
+<td class="parameter_description"><p>Length of <em class="parameter"><code>data</code></em>
+in bytes.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>mode</p></td>
+<td class="parameter_description"><p>Memory mode for <em class="parameter"><code>data</code></em>
+.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>Data parameter to pass to <em class="parameter"><code>destroy</code></em>
+.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>destroy</p></td>
+<td class="parameter_description"><p>Callback to call when <em class="parameter"><code>data</code></em>
+is not needed anymore. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-blob-create-or-fail.returns"></a><h4>Returns</h4>
+<p> New blob, or <code class="literal">NULL</code> if failed.  Destroy with <a class="link" href="harfbuzz-hb-blob.html#hb-blob-destroy" title="hb_blob_destroy ()"><code class="function">hb_blob_destroy()</code></a>.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-8-2.html#api-index-2.8.2">2.8.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="hb-blob-create-from-file"></a><h3>hb_blob_create_from_file ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t" title="hb_blob_t"><span class="returnvalue">hb_blob_t</span></a> *
 hb_blob_create_from_file (<em class="parameter"><code>const <span class="type">char</span> *file_name</code></em>);</pre>
+<p>Creates a new blob containing the data from the
+specified binary font file.</p>
 <div class="refsect3">
 <a name="hb-blob-create-from-file.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -263,19 +348,49 @@ hb_blob_create_from_file (<em class="parameter"><code>const <span class="type">c
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>file_name</p></td>
-<td class="parameter_description"><p>font filename.</p></td>
+<td class="parameter_description"><p>A font filename</p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
 </div>
 <div class="refsect3">
 <a name="hb-blob-create-from-file.returns"></a><h4>Returns</h4>
-<p> A hb_blob_t pointer with the content of the file</p>
+<p> An <a class="link" href="harfbuzz-hb-blob.html#hb-blob-t" title="hb_blob_t"><span class="type">hb_blob_t</span></a> pointer with the content of the file,
+or <a class="link" href="harfbuzz-hb-blob.html#hb-blob-get-empty" title="hb_blob_get_empty ()"><code class="function">hb_blob_get_empty()</code></a> if failed.</p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-1-7-7.html#api-index-1.7.7">1.7.7</a></p>
 </div>
 <hr>
 <div class="refsect2">
+<a name="hb-blob-create-from-file-or-fail"></a><h3>hb_blob_create_from_file_or_fail ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t" title="hb_blob_t"><span class="returnvalue">hb_blob_t</span></a> *
+hb_blob_create_from_file_or_fail (<em class="parameter"><code>const <span class="type">char</span> *file_name</code></em>);</pre>
+<p>Creates a new blob containing the data from the
+specified binary font file.</p>
+<div class="refsect3">
+<a name="hb-blob-create-from-file-or-fail.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>file_name</p></td>
+<td class="parameter_description"><p>A font filename</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-blob-create-from-file-or-fail.returns"></a><h4>Returns</h4>
+<p> An <a class="link" href="harfbuzz-hb-blob.html#hb-blob-t" title="hb_blob_t"><span class="type">hb_blob_t</span></a> pointer with the content of the file,
+or <code class="literal">NULL</code> if failed.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-8-2.html#api-index-2.8.2">2.8.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="hb-blob-create-sub-blob"></a><h3>hb_blob_create_sub_blob ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t" title="hb_blob_t"><span class="returnvalue">hb_blob_t</span></a> *
 hb_blob_create_sub_blob (<em class="parameter"><code><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t" title="hb_blob_t"><span class="type">hb_blob_t</span></a> *parent</code></em>,
@@ -283,7 +398,7 @@ hb_blob_create_sub_blob (<em class="parameter"><code><a class="link" href="harfb
                          <em class="parameter"><code>unsigned <span class="type">int</span> length</code></em>);</pre>
 <p>Returns a blob that represents a range of bytes in <em class="parameter"><code>parent</code></em>
 .  The new
-blob is always created with <a class="link" href="harfbuzz-hb-blob.html#HB-MEMORY-MODE-READONLY:CAPS"><code class="literal">HB_MEMORY_MODE_READONLY</code></a>, meaning that it
+blob is always created with <a class="link" href="harfbuzz-hb-blob.html#HB-MEMORY-MODE-READONLY:CAPS"><span class="type">HB_MEMORY_MODE_READONLY</span></a>, meaning that it
 will never modify data in the parent blob.  The parent data is not
 expected to be modified, and will result in undefined behavior if it
 is.</p>
@@ -352,7 +467,7 @@ hb_blob_copy_writable_or_fail (<em class="parameter"><code><a class="link" href=
 </div>
 <div class="refsect3">
 <a name="hb-blob-copy-writable-or-fail.returns"></a><h4>Returns</h4>
-<p> New blob, or nullptr if allocation failed.</p>
+<p> The new blob, or nullptr if allocation failed</p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-1-8-0.html#api-index-1.8.0">1.8.0</a></p>
 </div>
@@ -391,6 +506,7 @@ was created for if it has not been called already.</p>
 <pre class="programlisting">const <span class="returnvalue">char</span> *
 hb_blob_get_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t" title="hb_blob_t"><span class="type">hb_blob_t</span></a> *blob</code></em>,
                   <em class="parameter"><code>unsigned <span class="type">int</span> *length</code></em>);</pre>
+<p>Fetches the data from a blob.</p>
 <div class="refsect3">
 <a name="hb-blob-get-data.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -407,7 +523,7 @@ hb_blob_get_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 </tr>
 <tr>
 <td class="parameter_name"><p>length</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The length in bytes of the data retrieved. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
 </tr>
 </tbody>
@@ -415,7 +531,8 @@ hb_blob_get_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 </div>
 <div class="refsect3">
 <a name="hb-blob-get-data.returns"></a><h4>Returns</h4>
-<p>. </p>
+<p>the byte data of <em class="parameter"><code>blob</code></em>
+. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=length]</span></p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
@@ -455,7 +572,7 @@ fails.</p>
 <div class="refsect3">
 <a name="hb-blob-get-data-writable.returns"></a><h4>Returns</h4>
 <p>Writable blob data,
-or <a href="/usr/share/gtk-doc/html/glib/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> if failed. </p>
+or <code class="literal">NULL</code> if failed. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=length]</span></p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
@@ -469,7 +586,7 @@ hb_blob_get_empty (<em class="parameter"><code><span class="type">void</span></c
 <p>See TODO:link object types for more information.</p>
 <div class="refsect3">
 <a name="hb-blob-get-empty.returns"></a><h4>Returns</h4>
-<p>the empty blob. </p>
+<p>The empty blob. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
@@ -479,6 +596,7 @@ hb_blob_get_empty (<em class="parameter"><code><span class="type">void</span></c
 <a name="hb-blob-get-length"></a><h3>hb_blob_get_length ()</h3>
 <pre class="programlisting">unsigned <span class="returnvalue">int</span>
 hb_blob_get_length (<em class="parameter"><code><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t" title="hb_blob_t"><span class="type">hb_blob_t</span></a> *blob</code></em>);</pre>
+<p>Fetches the length of a blob's data.</p>
 <div class="refsect3">
 <a name="hb-blob-get-length.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -496,7 +614,8 @@ hb_blob_get_length (<em class="parameter"><code><a class="link" href="harfbuzz-h
 </div>
 <div class="refsect3">
 <a name="hb-blob-get-length.returns"></a><h4>Returns</h4>
-<p> the length of blob data in bytes.</p>
+<p> the length of <em class="parameter"><code>blob</code></em>
+data in bytes.</p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
@@ -506,6 +625,8 @@ hb_blob_get_length (<em class="parameter"><code><a class="link" href="harfbuzz-h
 <pre class="programlisting"><span class="returnvalue">void</span> *
 hb_blob_get_user_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t" title="hb_blob_t"><span class="type">hb_blob_t</span></a> *blob</code></em>,
                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-user-data-key-t" title="hb_user_data_key_t"><span class="type">hb_user_data_key_t</span></a> *key</code></em>);</pre>
+<p>Fetches the user data associated with the specified key,
+attached to the specified font-functions structure.</p>
 <p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
 <div class="refsect3">
 <a name="hb-blob-get-user-data.parameters"></a><h4>Parameters</h4>
@@ -518,12 +639,12 @@ hb_blob_get_user_data (<em class="parameter"><code><a class="link" href="harfbuz
 <tbody>
 <tr>
 <td class="parameter_name"><p>blob</p></td>
-<td class="parameter_description"><p>a blob.</p></td>
+<td class="parameter_description"><p>a blob</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>key</p></td>
-<td class="parameter_description"><p>key for data to get.</p></td>
+<td class="parameter_description"><p>The user-data key to query</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 </tbody>
@@ -531,7 +652,7 @@ hb_blob_get_user_data (<em class="parameter"><code><a class="link" href="harfbuz
 </div>
 <div class="refsect3">
 <a name="hb-blob-get-user-data.returns"></a><h4>Returns</h4>
-<p>. </p>
+<p>A pointer to the user data. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
@@ -541,6 +662,7 @@ hb_blob_get_user_data (<em class="parameter"><code><a class="link" href="harfbuz
 <a name="hb-blob-is-immutable"></a><h3>hb_blob_is_immutable ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 hb_blob_is_immutable (<em class="parameter"><code><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t" title="hb_blob_t"><span class="type">hb_blob_t</span></a> *blob</code></em>);</pre>
+<p>Tests whether a blob is immutable.</p>
 <div class="refsect3">
 <a name="hb-blob-is-immutable.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -558,7 +680,8 @@ hb_blob_is_immutable (<em class="parameter"><code><a class="link" href="harfbuzz
 </div>
 <div class="refsect3">
 <a name="hb-blob-is-immutable.returns"></a><h4>Returns</h4>
-<p> TODO</p>
+<p> <code class="literal">true</code> if <em class="parameter"><code>blob</code></em>
+is immutable, <code class="literal">false</code> otherwise</p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
@@ -567,6 +690,7 @@ hb_blob_is_immutable (<em class="parameter"><code><a class="link" href="harfbuzz
 <a name="hb-blob-make-immutable"></a><h3>hb_blob_make_immutable ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_blob_make_immutable (<em class="parameter"><code><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t" title="hb_blob_t"><span class="type">hb_blob_t</span></a> *blob</code></em>);</pre>
+<p>Makes a blob immutable.</p>
 <div class="refsect3">
 <a name="hb-blob-make-immutable.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -577,7 +701,7 @@ hb_blob_make_immutable (<em class="parameter"><code><a class="link" href="harfbu
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>blob</p></td>
-<td class="parameter_description"><p>a blob.</p></td>
+<td class="parameter_description"><p>a blob</p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
@@ -624,6 +748,7 @@ hb_blob_set_user_data (<em class="parameter"><code><a class="link" href="harfbuz
                        <em class="parameter"><code><span class="type">void</span> *data</code></em>,
                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>,
                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="type">hb_bool_t</span></a> replace</code></em>);</pre>
+<p>Attaches a user-data key/data pair to the specified blob.</p>
 <p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
 <div class="refsect3">
 <a name="hb-blob-set-user-data.parameters"></a><h4>Parameters</h4>
@@ -636,33 +761,37 @@ hb_blob_set_user_data (<em class="parameter"><code><a class="link" href="harfbuz
 <tbody>
 <tr>
 <td class="parameter_name"><p>blob</p></td>
-<td class="parameter_description"><p>a blob.</p></td>
+<td class="parameter_description"><p>An <a class="link" href="harfbuzz-hb-blob.html#hb-blob-t" title="hb_blob_t"><span class="type">hb_blob_t</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>key</p></td>
-<td class="parameter_description"><p>key for data to set.</p></td>
+<td class="parameter_description"><p>The user-data key to set</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>data</p></td>
-<td class="parameter_description"><p>data to set.</p></td>
+<td class="parameter_description"><p>A pointer to the user data to set</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>destroy</p></td>
-<td class="parameter_description"><p>callback to call when <em class="parameter"><code>data</code></em>
-is not needed anymore.</p></td>
-<td class="parameter_annotations"> </td>
+<td class="parameter_description"><p>callback to call when <em class="parameter"><code>data</code></em>
+is not needed anymore. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>replace</p></td>
-<td class="parameter_description"><p>whether to replace an existing data with the same key.</p></td>
+<td class="parameter_description"><p>Whether to replace an existing data with the same key</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 </tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-blob-set-user-data.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> if success, <code class="literal">false</code> otherwise</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
 </div>
@@ -672,10 +801,35 @@ is not needed anymore.</p></td>
 <a name="hb-blob-t"></a><h3>hb_blob_t</h3>
 <pre class="programlisting">typedef struct hb_blob_t hb_blob_t;
 </pre>
+<p>Data type for blobs. A blob wraps a chunk of binary
+data and facilitates its lifecycle management between
+a client program and HarfBuzz.</p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="hb-memory-mode-t"></a><h3>enum hb_memory_mode_t</h3>
+<p>Data type holding the memory modes available to
+client programs.</p>
+<p>Regarding these various memory-modes:</p>
+<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
+<li class="listitem"><p>In no case shall the HarfBuzz client modify memory
+that is passed to HarfBuzz in a blob.  If there is
+any such possibility, <em class="parameter"><code>HB_MEMORY_MODE_DUPLICATE</code></em>
+ should be used
+such that HarfBuzz makes a copy immediately,</p></li>
+<li class="listitem"><p>Use <em class="parameter"><code>HB_MEMORY_MODE_READONLY</code></em>
+ otherwise, unless you really really
+really know what you are doing,</p></li>
+<li class="listitem"><p><em class="parameter"><code>HB_MEMORY_MODE_WRITABLE</code></em>
+ is appropriate if you really made a
+copy of data solely for the purpose of passing to
+HarfBuzz and doing that just once (no reuse!),</p></li>
+<li class="listitem"><p>If the font is <code class="function">mmap()</code>ed, it's okay to use
+<em class="parameter"><code>HB_MEMORY_READONLY_MAY_MAKE_WRITABLE</code></em>
+, however, using that mode
+correctly is very tricky.  Use <em class="parameter"><code>HB_MEMORY_MODE_READONLY</code></em>
+ instead.</p></li>
+</ul></div>
 <div class="refsect3">
 <a name="hb-memory-mode-t.members"></a><h4>Members</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -687,23 +841,33 @@ is not needed anymore.</p></td>
 <tbody>
 <tr>
 <td class="enum_member_name"><p><a name="HB-MEMORY-MODE-DUPLICATE:CAPS"></a>HB_MEMORY_MODE_DUPLICATE</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>HarfBuzz immediately makes a copy of the data.</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-MEMORY-MODE-READONLY:CAPS"></a>HB_MEMORY_MODE_READONLY</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>HarfBuzz client will never modify the data,
+and HarfBuzz will never modify the data.</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-MEMORY-MODE-WRITABLE:CAPS"></a>HB_MEMORY_MODE_WRITABLE</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>HarfBuzz client made a copy of the data solely
+for HarfBuzz, so HarfBuzz may modify the data.</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-MEMORY-MODE-READONLY-MAY-MAKE-WRITABLE:CAPS"></a>HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>See above</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 </tbody>
 </table></div>
@@ -712,6 +876,6 @@ is not needed anymore.</p></td>
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index 6eba9bd..7c12c6b 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-buffer: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch12.html" title="Core API">
+<link rel="up" href="core-api.html" title="Core API">
 <link rel="prev" href="harfbuzz-hb-blob.html" title="hb-blob">
 <link rel="next" href="harfbuzz-hb-common.html" title="hb-common">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -18,7 +18,7 @@
                   <a href="#harfbuzz-hb-buffer.description" class="shortcut">Description</a></span>
 </td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><a accesskey="u" href="ch12.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="u" href="core-api.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
 <td><a accesskey="p" href="harfbuzz-hb-blob.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
 <td><a accesskey="n" href="harfbuzz-hb-common.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="returnvalue">hb_buffer_t</span></a> *
 </td>
 <td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-create-similar" title="hb_buffer_create_similar ()">hb_buffer_create_similar</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="returnvalue">hb_buffer_t</span></a> *
+</td>
+<td class="function_name">
 <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-reference" title="hb_buffer_reference ()">hb_buffer_reference</a> <span class="c_punctuation">()</span>
 </td>
 </tr>
 </tr>
 <tr>
 <td class="function_type">
-<span class="returnvalue">hb_glyph_info_t</span> *
+<a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-info-t" title="hb_glyph_info_t"><span class="returnvalue">hb_glyph_info_t</span></a> *
 </td>
 <td class="function_name">
 <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-glyph-infos" title="hb_buffer_get_glyph_infos ()">hb_buffer_get_glyph_infos</a> <span class="c_punctuation">()</span>
 </tr>
 <tr>
 <td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-has-positions" title="hb_buffer_has_positions ()">hb_buffer_has_positions</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
 <a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="returnvalue">hb_codepoint_t</span></a>
 </td>
 <td class="function_name">
 </tr>
 <tr>
 <td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="returnvalue">hb_codepoint_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-not-found-glyph" title="hb_buffer_get_not_found_glyph ()">hb_buffer_get_not_found_glyph</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-not-found-glyph" title="hb_buffer_set_not_found_glyph ()">hb_buffer_set_not_found_glyph</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
 <span class="returnvalue">void</span>
 </td>
 <td class="function_name">
 <td class="function_type">unsigned <span class="returnvalue">int</span>
 </td>
 <td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize" title="hb_buffer_serialize ()">hb_buffer_serialize</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">unsigned <span class="returnvalue">int</span>
+</td>
+<td class="function_name">
 <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-glyphs" title="hb_buffer_serialize_glyphs ()">hb_buffer_serialize_glyphs</a> <span class="c_punctuation">()</span>
 </td>
 </tr>
 </td>
 </tr>
 <tr>
+<td class="function_type">unsigned <span class="returnvalue">int</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-unicode" title="hb_buffer_serialize_unicode ()">hb_buffer_serialize_unicode</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-deserialize-unicode" title="hb_buffer_deserialize_unicode ()">hb_buffer_deserialize_unicode</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
 <td class="function_type">
 <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-format-t" title="enum hb_buffer_serialize_format_t"><span class="returnvalue">hb_buffer_serialize_format_t</span></a>
 </td>
 </tr>
 <tr>
 <td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-overlay" title="hb_segment_properties_overlay ()">hb_segment_properties_overlay</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
 <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-diff-flags-t" title="enum hb_buffer_diff_flags_t"><span class="returnvalue">hb_buffer_diff_flags_t</span></a>
 </td>
 <td class="function_name">
 <td class="function_name"><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t">hb_buffer_t</a></td>
 </tr>
 <tr>
+<td class="datatype_keyword"> </td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-info-t" title="hb_glyph_info_t">hb_glyph_info_t</a></td>
+</tr>
+<tr>
 <td class="datatype_keyword">enum</td>
 <td class="function_name"><a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-flags-t" title="enum hb_glyph_flags_t">hb_glyph_flags_t</a></td>
 </tr>
 </div>
 <div class="refsect1">
 <a name="harfbuzz-hb-buffer.description"></a><h2>Description</h2>
-<p>Buffers serve dual role in HarfBuzz; they hold the input characters that are
-passed to <a class="link" href="harfbuzz-hb-shape.html#hb-shape" title="hb_shape ()"><code class="function">hb_shape()</code></a>, and after shaping they hold the output glyphs.</p>
+<p>Buffers serve a dual role in HarfBuzz; before shaping, they hold
+the input characters that are passed to <a class="link" href="harfbuzz-hb-shape.html#hb-shape" title="hb_shape ()"><code class="function">hb_shape()</code></a>, and after
+shaping they hold the output glyphs.</p>
 </div>
 <div class="refsect1">
 <a name="harfbuzz-hb-buffer.functions_details"></a><h2>Functions</h2>
@@ -574,7 +641,7 @@ hb_buffer_create (<em class="parameter"><code><span class="type">void</span></co
 <a name="hb-buffer-create.returns"></a><h4>Returns</h4>
 <p>A newly allocated <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a> with a reference count of 1. The initial
 reference count should be released with <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-destroy" title="hb_buffer_destroy ()"><code class="function">hb_buffer_destroy()</code></a> when you are done
-using the <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>. This function never returns <a href="/usr/share/gtk-doc/html/glib/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. If memory cannot
+using the <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>. This function never returns <code class="literal">NULL</code>. If memory cannot
 be allocated, a special <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a> object will be returned on which
 <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-allocation-successful" title="hb_buffer_allocation_successful ()"><code class="function">hb_buffer_allocation_successful()</code></a> returns <code class="literal">false</code>. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
@@ -583,6 +650,36 @@ be allocated, a special <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-
 </div>
 <hr>
 <div class="refsect2">
+<a name="hb-buffer-create-similar"></a><h3>hb_buffer_create_similar ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="returnvalue">hb_buffer_t</span></a> *
+hb_buffer_create_similar (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a> *src</code></em>);</pre>
+<p>Creates a new <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>, similar to <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-create" title="hb_buffer_create ()"><code class="function">hb_buffer_create()</code></a>. The only
+difference is that the buffer is configured similarly to <em class="parameter"><code>src</code></em>
+.</p>
+<div class="refsect3">
+<a name="hb-buffer-create-similar.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>src</p></td>
+<td class="parameter_description"><p>An <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-buffer-create-similar.returns"></a><h4>Returns</h4>
+<p>A newly allocated <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>, similar to <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-create" title="hb_buffer_create ()"><code class="function">hb_buffer_create()</code></a>. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-3-3-0.html#api-index-3.3.0">3.3.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="hb-buffer-reference"></a><h3>hb_buffer_reference ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="returnvalue">hb_buffer_t</span></a> *
 hb_buffer_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
@@ -601,7 +698,7 @@ being destroyed until a matching call to <a class="link" href="harfbuzz-hb-buffe
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>buffer</p></td>
-<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_description"><p>An <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
@@ -618,9 +715,10 @@ being destroyed until a matching call to <a class="link" href="harfbuzz-hb-buffe
 <a name="hb-buffer-get-empty"></a><h3>hb_buffer_get_empty ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="returnvalue">hb_buffer_t</span></a> *
 hb_buffer_get_empty (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>Fetches an empty <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>.</p>
 <div class="refsect3">
 <a name="hb-buffer-get-empty.returns"></a><h4>Returns</h4>
-<p>. </p>
+<p>The empty buffer. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
@@ -647,7 +745,7 @@ Decreases the reference count on <em class="parameter"><code>buffer</code></em>
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>buffer</p></td>
-<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_description"><p>An <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
@@ -671,7 +769,7 @@ with <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-create" title="hb_b
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>buffer</p></td>
-<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_description"><p>An <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
@@ -695,7 +793,7 @@ the replacement code point.</p>
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>buffer</p></td>
-<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_description"><p>An <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
@@ -722,12 +820,12 @@ hb_buffer_pre_allocate (<em class="parameter"><code><a class="link" href="harfbu
 <tbody>
 <tr>
 <td class="parameter_name"><p>buffer</p></td>
-<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_description"><p>An <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>size</p></td>
-<td class="parameter_description"><p>number of items to pre allocate.</p></td>
+<td class="parameter_description"><p>Number of items to pre allocate.</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 </tbody>
@@ -736,7 +834,7 @@ hb_buffer_pre_allocate (<em class="parameter"><code><a class="link" href="harfbu
 <div class="refsect3">
 <a name="hb-buffer-pre-allocate.returns"></a><h4>Returns</h4>
 <p><code class="literal">true</code> if <em class="parameter"><code>buffer</code></em>
-memory allocation succeeded, <code class="literal">false</code> otherwise.</p>
+memory allocation succeeded, <code class="literal">false</code> otherwise</p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
@@ -756,7 +854,7 @@ hb_buffer_allocation_successful (<em class="parameter"><code><a class="link" hre
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>buffer</p></td>
-<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_description"><p>An <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
@@ -782,7 +880,7 @@ gives it the initial cluster value of <em class="parameter"><code>cluster</code>
 . Clusters can be any thing
 the client wants, they are usually used to refer to the index of the
 character in the input text stream and are output in
-<span class="type">hb_glyph_info_t.cluster</span> field.</p>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-info-t.cluster"><span class="type">hb_glyph_info_t.cluster</span></a> field.</p>
 <p>This function does not check the validity of <em class="parameter"><code>codepoint</code></em>
 , it is up to the
 caller to ensure it is a valid Unicode code point.</p>
@@ -797,17 +895,17 @@ caller to ensure it is a valid Unicode code point.</p>
 <tbody>
 <tr>
 <td class="parameter_name"><p>buffer</p></td>
-<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_description"><p>An <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>codepoint</p></td>
-<td class="parameter_description"><p>a Unicode code point.</p></td>
+<td class="parameter_description"><p>A Unicode code point.</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>cluster</p></td>
-<td class="parameter_description"><p>the cluster value of <em class="parameter"><code>codepoint</code></em>
+<td class="parameter_description"><p>The cluster value of <em class="parameter"><code>codepoint</code></em>
 .</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
@@ -866,7 +964,7 @@ to ensure it contains a valid Unicode code points.</p>
 <tr>
 <td class="parameter_name"><p>text_length</p></td>
 <td class="parameter_description"><p>the length of the <em class="parameter"><code>text</code></em>
-, or -1 if it is <a href="/usr/share/gtk-doc/html/glib/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> terminated.</p></td>
+, or -1 if it is <code class="literal">NULL</code> terminated.</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
@@ -880,7 +978,7 @@ to ensure it contains a valid Unicode code points.</p>
 <td class="parameter_description"><p>the number of code points to add to the <em class="parameter"><code>buffer</code></em>
 , or -1 for the
 end of <em class="parameter"><code>text</code></em>
-(assuming it is <a href="/usr/share/gtk-doc/html/glib/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> terminated).</p></td>
+(assuming it is <code class="literal">NULL</code> terminated).</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 </tbody>
@@ -912,32 +1010,32 @@ see <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-replacement-code
 <tbody>
 <tr>
 <td class="parameter_name"><p>buffer</p></td>
-<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_description"><p>An <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>text</p></td>
-<td class="parameter_description"><p>an array of UTF-32 characters to append. </p></td>
+<td class="parameter_description"><p>An array of UTF-32 characters to append. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=text_length]</span></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>text_length</p></td>
-<td class="parameter_description"><p>the length of the <em class="parameter"><code>text</code></em>
-, or -1 if it is <a href="/usr/share/gtk-doc/html/glib/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> terminated.</p></td>
+<td class="parameter_description"><p>The length of the <em class="parameter"><code>text</code></em>
+, or -1 if it is <code class="literal">NULL</code> terminated</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>item_offset</p></td>
-<td class="parameter_description"><p>the offset of the first character to add to the <em class="parameter"><code>buffer</code></em>
-.</p></td>
+<td class="parameter_description"><p>The offset of the first character to add to the <em class="parameter"><code>buffer</code></em>
+</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>item_length</p></td>
-<td class="parameter_description"><p>the number of characters to add to the <em class="parameter"><code>buffer</code></em>
+<td class="parameter_description"><p>The number of characters to add to the <em class="parameter"><code>buffer</code></em>
 , or -1 for the
 end of <em class="parameter"><code>text</code></em>
-(assuming it is <a href="/usr/share/gtk-doc/html/glib/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> terminated).</p></td>
+(assuming it is <code class="literal">NULL</code> terminated)</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 </tbody>
@@ -969,32 +1067,32 @@ see <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-replacement-code
 <tbody>
 <tr>
 <td class="parameter_name"><p>buffer</p></td>
-<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_description"><p>An <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>text</p></td>
-<td class="parameter_description"><p>an array of UTF-16 characters to append. </p></td>
+<td class="parameter_description"><p>An array of UTF-16 characters to append. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=text_length]</span></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>text_length</p></td>
-<td class="parameter_description"><p>the length of the <em class="parameter"><code>text</code></em>
-, or -1 if it is <a href="/usr/share/gtk-doc/html/glib/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> terminated.</p></td>
+<td class="parameter_description"><p>The length of the <em class="parameter"><code>text</code></em>
+, or -1 if it is <code class="literal">NULL</code> terminated</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>item_offset</p></td>
-<td class="parameter_description"><p>the offset of the first character to add to the <em class="parameter"><code>buffer</code></em>
-.</p></td>
+<td class="parameter_description"><p>The offset of the first character to add to the <em class="parameter"><code>buffer</code></em>
+</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>item_length</p></td>
-<td class="parameter_description"><p>the number of characters to add to the <em class="parameter"><code>buffer</code></em>
+<td class="parameter_description"><p>The number of characters to add to the <em class="parameter"><code>buffer</code></em>
 , or -1 for the
 end of <em class="parameter"><code>text</code></em>
-(assuming it is <a href="/usr/share/gtk-doc/html/glib/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> terminated).</p></td>
+(assuming it is <code class="literal">NULL</code> terminated)</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 </tbody>
@@ -1026,33 +1124,33 @@ see <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-replacement-code
 <tbody>
 <tr>
 <td class="parameter_name"><p>buffer</p></td>
-<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_description"><p>An <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>text</p></td>
-<td class="parameter_description"><p>an array of UTF-8
+<td class="parameter_description"><p>An array of UTF-8
 characters to append. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=text_length][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> uint8_t]</span></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>text_length</p></td>
-<td class="parameter_description"><p>the length of the <em class="parameter"><code>text</code></em>
-, or -1 if it is <a href="/usr/share/gtk-doc/html/glib/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> terminated.</p></td>
+<td class="parameter_description"><p>The length of the <em class="parameter"><code>text</code></em>
+, or -1 if it is <code class="literal">NULL</code> terminated.</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>item_offset</p></td>
-<td class="parameter_description"><p>the offset of the first character to add to the <em class="parameter"><code>buffer</code></em>
+<td class="parameter_description"><p>The offset of the first character to add to the <em class="parameter"><code>buffer</code></em>
 .</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>item_length</p></td>
-<td class="parameter_description"><p>the number of characters to add to the <em class="parameter"><code>buffer</code></em>
+<td class="parameter_description"><p>The number of characters to add to the <em class="parameter"><code>buffer</code></em>
 , or -1 for the
 end of <em class="parameter"><code>text</code></em>
-(assuming it is <a href="/usr/share/gtk-doc/html/glib/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> terminated).</p></td>
+(assuming it is <code class="literal">NULL</code> terminated).</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 </tbody>
@@ -1083,7 +1181,7 @@ Unicode code points that can fit in 8-bit strings.</p>
 <tbody>
 <tr>
 <td class="parameter_name"><p>buffer</p></td>
-<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_description"><p>An <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
@@ -1095,13 +1193,13 @@ characters to append. </p></td>
 <tr>
 <td class="parameter_name"><p>text_length</p></td>
 <td class="parameter_description"><p>the length of the <em class="parameter"><code>text</code></em>
-, or -1 if it is <a href="/usr/share/gtk-doc/html/glib/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> terminated.</p></td>
+, or -1 if it is <code class="literal">NULL</code> terminated</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>item_offset</p></td>
 <td class="parameter_description"><p>the offset of the first character to add to the <em class="parameter"><code>buffer</code></em>
-.</p></td>
+</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
@@ -1109,7 +1207,7 @@ characters to append. </p></td>
 <td class="parameter_description"><p>the number of characters to add to the <em class="parameter"><code>buffer</code></em>
 , or -1 for the
 end of <em class="parameter"><code>text</code></em>
-(assuming it is <a href="/usr/share/gtk-doc/html/glib/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> terminated).</p></td>
+(assuming it is <code class="literal">NULL</code> terminated)</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 </tbody>
@@ -1122,7 +1220,7 @@ end of <em class="parameter"><code>text</code></em>
 <a name="hb-buffer-append"></a><h3>hb_buffer_append ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_buffer_append (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
-                  <em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a> *source</code></em>,
+                  <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a> *source</code></em>,
                   <em class="parameter"><code>unsigned <span class="type">int</span> start</code></em>,
                   <em class="parameter"><code>unsigned <span class="type">int</span> end</code></em>);</pre>
 <p>Append (part of) contents of another buffer to this buffer.</p>
@@ -1137,12 +1235,12 @@ hb_buffer_append (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 <tbody>
 <tr>
 <td class="parameter_name"><p>buffer</p></td>
-<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_description"><p>An <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>source</p></td>
-<td class="parameter_description"><p>source <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_description"><p>source <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
@@ -1168,8 +1266,8 @@ to copy to end of buffer.</p></td>
 hb_buffer_set_content_type (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-content-type-t" title="enum hb_buffer_content_type_t"><span class="type">hb_buffer_content_type_t</span></a> content_type</code></em>);</pre>
 <p>Sets the type of <em class="parameter"><code>buffer</code></em>
- contents, buffers are either empty, contain
-characters (before shaping) or glyphs (the result of shaping).</p>
+ contents. Buffers are either empty, contain
+characters (before shaping), or contain glyphs (the result of shaping).</p>
 <div class="refsect3">
 <a name="hb-buffer-set-content-type.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -1181,12 +1279,12 @@ characters (before shaping) or glyphs (the result of shaping).</p>
 <tbody>
 <tr>
 <td class="parameter_name"><p>buffer</p></td>
-<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_description"><p>An <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>content_type</p></td>
-<td class="parameter_description"><p>the type of buffer contents to set</p></td>
+<td class="parameter_description"><p>The type of buffer contents to set</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 </tbody>
@@ -1199,7 +1297,9 @@ characters (before shaping) or glyphs (the result of shaping).</p>
 <a name="hb-buffer-get-content-type"></a><h3>hb_buffer_get_content_type ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-content-type-t" title="enum hb_buffer_content_type_t"><span class="returnvalue">hb_buffer_content_type_t</span></a>
 hb_buffer_get_content_type (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
-<p>see <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-content-type" title="hb_buffer_set_content_type ()"><code class="function">hb_buffer_set_content_type()</code></a>.</p>
+<p>Fetches the type of <em class="parameter"><code>buffer</code></em>
+ contents. Buffers are either empty, contain
+characters (before shaping), or contain glyphs (the result of shaping).</p>
 <div class="refsect3">
 <a name="hb-buffer-get-content-type.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -1210,7 +1310,7 @@ hb_buffer_get_content_type (<em class="parameter"><code><a class="link" href="ha
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>buffer</p></td>
-<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_description"><p>An <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
@@ -1218,7 +1318,7 @@ hb_buffer_get_content_type (<em class="parameter"><code><a class="link" href="ha
 <div class="refsect3">
 <a name="hb-buffer-get-content-type.returns"></a><h4>Returns</h4>
 <p>The type of <em class="parameter"><code>buffer</code></em>
-contents.</p>
+contents</p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-5.html#api-index-0.9.5">0.9.5</a></p>
 </div>
@@ -1247,7 +1347,7 @@ direction.</p>
 <tbody>
 <tr>
 <td class="parameter_name"><p>buffer</p></td>
-<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_description"><p>An <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
@@ -1277,7 +1377,7 @@ hb_buffer_get_direction (<em class="parameter"><code><a class="link" href="harfb
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>buffer</p></td>
-<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_description"><p>An <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
@@ -1315,12 +1415,12 @@ corresponding script from an ISO 15924 script tag.</p>
 <tbody>
 <tr>
 <td class="parameter_name"><p>buffer</p></td>
-<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_description"><p>An <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>script</p></td>
-<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="type">hb_script_t</span></a> to set.</p></td>
+<td class="parameter_description"><p>An <a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="type">hb_script_t</span></a> to set.</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 </tbody>
@@ -1333,7 +1433,8 @@ corresponding script from an ISO 15924 script tag.</p>
 <a name="hb-buffer-get-script"></a><h3>hb_buffer_get_script ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="returnvalue">hb_script_t</span></a>
 hb_buffer_get_script (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
-<p>See <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-script" title="hb_buffer_set_script ()"><code class="function">hb_buffer_set_script()</code></a>.</p>
+<p>Fetches the script of <em class="parameter"><code>buffer</code></em>
+.</p>
 <div class="refsect3">
 <a name="hb-buffer-get-script.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -1344,7 +1445,7 @@ hb_buffer_get_script (<em class="parameter"><code><a class="link" href="harfbuzz
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>buffer</p></td>
-<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_description"><p>An <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
@@ -1352,7 +1453,7 @@ hb_buffer_get_script (<em class="parameter"><code><a class="link" href="harfbuzz
 <div class="refsect3">
 <a name="hb-buffer-get-script.returns"></a><h4>Returns</h4>
 <p>The <a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="type">hb_script_t</span></a> of the <em class="parameter"><code>buffer</code></em>
-.</p>
+</p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
@@ -1382,12 +1483,12 @@ different concepts and should not be confused with each other.</p>
 <tbody>
 <tr>
 <td class="parameter_name"><p>buffer</p></td>
-<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_description"><p>An <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>language</p></td>
-<td class="parameter_description"><p>an hb_language_t to set.</p></td>
+<td class="parameter_description"><p>An hb_language_t to set</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 </tbody>
@@ -1411,7 +1512,7 @@ hb_buffer_get_language (<em class="parameter"><code><a class="link" href="harfbu
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>buffer</p></td>
-<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_description"><p>An <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
@@ -1443,12 +1544,12 @@ hb_buffer_set_flags (<em class="parameter"><code><a class="link" href="harfbuzz-
 <tbody>
 <tr>
 <td class="parameter_name"><p>buffer</p></td>
-<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_description"><p>An <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>flags</p></td>
-<td class="parameter_description"><p>the buffer flags to set.</p></td>
+<td class="parameter_description"><p>The buffer flags to set</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 </tbody>
@@ -1461,7 +1562,8 @@ hb_buffer_set_flags (<em class="parameter"><code><a class="link" href="harfbuzz-
 <a name="hb-buffer-get-flags"></a><h3>hb_buffer_get_flags ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-flags-t" title="enum hb_buffer_flags_t"><span class="returnvalue">hb_buffer_flags_t</span></a>
 hb_buffer_get_flags (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
-<p>See <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-flags" title="hb_buffer_set_flags ()"><code class="function">hb_buffer_set_flags()</code></a>.</p>
+<p>Fetches the <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-flags-t" title="enum hb_buffer_flags_t"><span class="type">hb_buffer_flags_t</span></a> of <em class="parameter"><code>buffer</code></em>
+.</p>
 <div class="refsect3">
 <a name="hb-buffer-get-flags.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -1472,7 +1574,7 @@ hb_buffer_get_flags (<em class="parameter"><code><a class="link" href="harfbuzz-
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>buffer</p></td>
-<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_description"><p>An <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
@@ -1480,7 +1582,7 @@ hb_buffer_get_flags (<em class="parameter"><code><a class="link" href="harfbuzz-
 <div class="refsect3">
 <a name="hb-buffer-get-flags.returns"></a><h4>Returns</h4>
 <p>The <em class="parameter"><code>buffer</code></em>
-flags.</p>
+flags</p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
 </div>
@@ -1490,6 +1592,9 @@ flags.</p>
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_buffer_set_cluster_level (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-cluster-level-t" title="enum hb_buffer_cluster_level_t"><span class="type">hb_buffer_cluster_level_t</span></a> cluster_level</code></em>);</pre>
+<p>Sets the cluster level of a buffer. The <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-cluster-level-t" title="enum hb_buffer_cluster_level_t"><span class="type">hb_buffer_cluster_level_t</span></a>
+dictates one aspect of how HarfBuzz will treat non-base characters 
+during shaping.</p>
 <div class="refsect3">
 <a name="hb-buffer-set-cluster-level.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -1498,11 +1603,18 @@ hb_buffer_set_cluster_level (<em class="parameter"><code><a class="link" href="h
 <col class="parameters_description">
 <col width="200px" class="parameters_annotations">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
 <td class="parameter_name"><p>buffer</p></td>
-<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_description"><p>An <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a></p></td>
 <td class="parameter_annotations"> </td>
-</tr></tbody>
+</tr>
+<tr>
+<td class="parameter_name"><p>cluster_level</p></td>
+<td class="parameter_description"><p>The cluster level to set on the buffer</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
 </table></div>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-42.html#api-index-0.9.42">0.9.42</a></p>
@@ -1512,6 +1624,9 @@ hb_buffer_set_cluster_level (<em class="parameter"><code><a class="link" href="h
 <a name="hb-buffer-get-cluster-level"></a><h3>hb_buffer_get_cluster_level ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-cluster-level-t" title="enum hb_buffer_cluster_level_t"><span class="returnvalue">hb_buffer_cluster_level_t</span></a>
 hb_buffer_get_cluster_level (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
+<p>Fetches the cluster level of a buffer. The <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-cluster-level-t" title="enum hb_buffer_cluster_level_t"><span class="type">hb_buffer_cluster_level_t</span></a>
+dictates one aspect of how HarfBuzz will treat non-base characters 
+during shaping.</p>
 <div class="refsect3">
 <a name="hb-buffer-get-cluster-level.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -1522,11 +1637,16 @@ hb_buffer_get_cluster_level (<em class="parameter"><code><a class="link" href="h
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>buffer</p></td>
-<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_description"><p>An <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-buffer-get-cluster-level.returns"></a><h4>Returns</h4>
+<p> The cluster level of <em class="parameter"><code>buffer</code></em>
+</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-42.html#api-index-0.9.42">0.9.42</a></p>
 </div>
 <hr>
@@ -1548,13 +1668,13 @@ end.</p>
 <tbody>
 <tr>
 <td class="parameter_name"><p>buffer</p></td>
-<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_description"><p>An <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>length</p></td>
-<td class="parameter_description"><p>the new length of <em class="parameter"><code>buffer</code></em>
-.</p></td>
+<td class="parameter_description"><p>The new length of <em class="parameter"><code>buffer</code></em>
+</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 </tbody>
@@ -1583,7 +1703,7 @@ hb_buffer_get_length (<em class="parameter"><code><a class="link" href="harfbuzz
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>buffer</p></td>
-<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_description"><p>An <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
@@ -1616,12 +1736,12 @@ hb_buffer_set_segment_properties (<em class="parameter"><code><a class="link" hr
 <tbody>
 <tr>
 <td class="parameter_name"><p>buffer</p></td>
-<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_description"><p>An <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>props</p></td>
-<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-t" title="hb_segment_properties_t"><span class="type">hb_segment_properties_t</span></a> to use.</p></td>
+<td class="parameter_description"><p>An <a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-t" title="hb_segment_properties_t"><span class="type">hb_segment_properties_t</span></a> to use</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 </tbody>
@@ -1649,12 +1769,12 @@ hb_buffer_get_segment_properties (<em class="parameter"><code><a class="link" hr
 <tbody>
 <tr>
 <td class="parameter_name"><p>buffer</p></td>
-<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_description"><p>An <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>props</p></td>
-<td class="parameter_description"><p>the output <a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-t" title="hb_segment_properties_t"><span class="type">hb_segment_properties_t</span></a>. </p></td>
+<td class="parameter_description"><p>The output <a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-t" title="hb_segment_properties_t"><span class="type">hb_segment_properties_t</span></a>. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
 </tr>
 </tbody>
@@ -1669,17 +1789,17 @@ hb_buffer_get_segment_properties (<em class="parameter"><code><a class="link" hr
 hb_buffer_guess_segment_properties (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
 <p>Sets unset buffer segment properties based on buffer Unicode
 contents.  If buffer is not empty, it must have content type
-<a class="link" href="harfbuzz-hb-buffer.html#HB-BUFFER-CONTENT-TYPE-UNICODE:CAPS"><code class="literal">HB_BUFFER_CONTENT_TYPE_UNICODE</code></a>.</p>
-<p>If buffer script is not set (ie. is <a class="link" href="harfbuzz-hb-common.html#HB-SCRIPT-INVALID:CAPS"><code class="literal">HB_SCRIPT_INVALID</code></a>), it
+<a class="link" href="harfbuzz-hb-buffer.html#HB-BUFFER-CONTENT-TYPE-UNICODE:CAPS"><span class="type">HB_BUFFER_CONTENT_TYPE_UNICODE</span></a>.</p>
+<p>If buffer script is not set (ie. is <a class="link" href="harfbuzz-hb-common.html#HB-SCRIPT-INVALID:CAPS"><span class="type">HB_SCRIPT_INVALID</span></a>), it
 will be set to the Unicode script of the first character in
-the buffer that has a script other than <code class="literal">HB_SCRIPT_COMMON</code>,
-<code class="literal">HB_SCRIPT_INHERITED</code>, and <code class="literal">HB_SCRIPT_UNKNOWN</code>.</p>
-<p>Next, if buffer direction is not set (ie. is <a class="link" href="harfbuzz-hb-common.html#HB-DIRECTION-INVALID:CAPS"><code class="literal">HB_DIRECTION_INVALID</code></a>),
+the buffer that has a script other than <a class="link" href="harfbuzz-hb-common.html#HB-SCRIPT-COMMON:CAPS"><span class="type">HB_SCRIPT_COMMON</span></a>,
+<a class="link" href="harfbuzz-hb-common.html#HB-SCRIPT-INHERITED:CAPS"><span class="type">HB_SCRIPT_INHERITED</span></a>, and <a class="link" href="harfbuzz-hb-common.html#HB-SCRIPT-UNKNOWN:CAPS"><span class="type">HB_SCRIPT_UNKNOWN</span></a>.</p>
+<p>Next, if buffer direction is not set (ie. is <a class="link" href="harfbuzz-hb-common.html#HB-DIRECTION-INVALID:CAPS"><span class="type">HB_DIRECTION_INVALID</span></a>),
 it will be set to the natural horizontal direction of the
 buffer script as returned by <a class="link" href="harfbuzz-hb-common.html#hb-script-get-horizontal-direction" title="hb_script_get_horizontal_direction ()"><code class="function">hb_script_get_horizontal_direction()</code></a>.
-If <a class="link" href="harfbuzz-hb-common.html#hb-script-get-horizontal-direction" title="hb_script_get_horizontal_direction ()"><code class="function">hb_script_get_horizontal_direction()</code></a> returns <a class="link" href="harfbuzz-hb-common.html#HB-DIRECTION-INVALID:CAPS"><code class="literal">HB_DIRECTION_INVALID</code></a>,
-then <a class="link" href="harfbuzz-hb-common.html#HB-DIRECTION-LTR:CAPS"><code class="literal">HB_DIRECTION_LTR</code></a> is used.</p>
-<p>Finally, if buffer language is not set (ie. is <a class="link" href="harfbuzz-hb-common.html#HB-LANGUAGE-INVALID:CAPS" title="HB_LANGUAGE_INVALID"><code class="literal">HB_LANGUAGE_INVALID</code></a>),
+If <a class="link" href="harfbuzz-hb-common.html#hb-script-get-horizontal-direction" title="hb_script_get_horizontal_direction ()"><code class="function">hb_script_get_horizontal_direction()</code></a> returns <a class="link" href="harfbuzz-hb-common.html#HB-DIRECTION-INVALID:CAPS"><span class="type">HB_DIRECTION_INVALID</span></a>,
+then <a class="link" href="harfbuzz-hb-common.html#HB-DIRECTION-LTR:CAPS"><span class="type">HB_DIRECTION_LTR</span></a> is used.</p>
+<p>Finally, if buffer language is not set (ie. is <a class="link" href="harfbuzz-hb-common.html#HB-LANGUAGE-INVALID:CAPS" title="HB_LANGUAGE_INVALID"><span class="type">HB_LANGUAGE_INVALID</span></a>),
 it will be set to the process's default language as returned by
 <a class="link" href="harfbuzz-hb-common.html#hb-language-get-default" title="hb_language_get_default ()"><code class="function">hb_language_get_default()</code></a>.  This may change in the future by
 taking buffer script into consideration when choosing a language.
@@ -1695,7 +1815,7 @@ it is called.  See documentation for that function for details.</p>
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>buffer</p></td>
-<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_description"><p>An <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
@@ -1708,6 +1828,9 @@ it is called.  See documentation for that function for details.</p>
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_buffer_set_unicode_funcs (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t" title="hb_unicode_funcs_t"><span class="type">hb_unicode_funcs_t</span></a> *unicode_funcs</code></em>);</pre>
+<p>Sets the Unicode-functions structure of a buffer to
+<em class="parameter"><code>unicode_funcs</code></em>
+.</p>
 <div class="refsect3">
 <a name="hb-buffer-set-unicode-funcs.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -1716,11 +1839,18 @@ hb_buffer_set_unicode_funcs (<em class="parameter"><code><a class="link" href="h
 <col class="parameters_description">
 <col width="200px" class="parameters_annotations">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
 <td class="parameter_name"><p>buffer</p></td>
-<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_description"><p>An <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a></p></td>
 <td class="parameter_annotations"> </td>
-</tr></tbody>
+</tr>
+<tr>
+<td class="parameter_name"><p>unicode_funcs</p></td>
+<td class="parameter_description"><p>The Unicode-functions structure</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
 </table></div>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
@@ -1730,6 +1860,7 @@ hb_buffer_set_unicode_funcs (<em class="parameter"><code><a class="link" href="h
 <a name="hb-buffer-get-unicode-funcs"></a><h3>hb_buffer_get_unicode_funcs ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t" title="hb_unicode_funcs_t"><span class="returnvalue">hb_unicode_funcs_t</span></a> *
 hb_buffer_get_unicode_funcs (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
+<p>Fetches the Unicode-functions structure of a buffer.</p>
 <div class="refsect3">
 <a name="hb-buffer-get-unicode-funcs.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -1740,11 +1871,15 @@ hb_buffer_get_unicode_funcs (<em class="parameter"><code><a class="link" href="h
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>buffer</p></td>
-<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_description"><p>An <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-buffer-get-unicode-funcs.returns"></a><h4>Returns</h4>
+<p> The Unicode-functions structure</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
 <hr>
@@ -1756,6 +1891,7 @@ hb_buffer_set_user_data (<em class="parameter"><code><a class="link" href="harfb
                          <em class="parameter"><code><span class="type">void</span> *data</code></em>,
                          <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>,
                          <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="type">hb_bool_t</span></a> replace</code></em>);</pre>
+<p>Attaches a user-data key/data pair to the specified buffer.</p>
 <p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
 <div class="refsect3">
 <a name="hb-buffer-set-user-data.parameters"></a><h4>Parameters</h4>
@@ -1765,13 +1901,40 @@ hb_buffer_set_user_data (<em class="parameter"><code><a class="link" href="harfb
 <col class="parameters_description">
 <col width="200px" class="parameters_annotations">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
 <td class="parameter_name"><p>buffer</p></td>
-<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_description"><p>An <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a></p></td>
 <td class="parameter_annotations"> </td>
-</tr></tbody>
+</tr>
+<tr>
+<td class="parameter_name"><p>key</p></td>
+<td class="parameter_description"><p>The user-data key</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>data</p></td>
+<td class="parameter_description"><p>A pointer to the user data</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>destroy</p></td>
+<td class="parameter_description"><p>A callback to call when <em class="parameter"><code>data</code></em>
+is not needed anymore. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>replace</p></td>
+<td class="parameter_description"><p>Whether to replace an existing data with the same key</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-buffer-set-user-data.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> if success, <code class="literal">false</code> otherwise</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
 <hr>
@@ -1780,6 +1943,8 @@ hb_buffer_set_user_data (<em class="parameter"><code><a class="link" href="harfb
 <pre class="programlisting"><span class="returnvalue">void</span> *
 hb_buffer_get_user_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
                          <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-user-data-key-t" title="hb_user_data_key_t"><span class="type">hb_user_data_key_t</span></a> *key</code></em>);</pre>
+<p>Fetches the user data associated with the specified key,
+attached to the specified buffer.</p>
 <p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
 <div class="refsect3">
 <a name="hb-buffer-get-user-data.parameters"></a><h4>Parameters</h4>
@@ -1789,19 +1954,31 @@ hb_buffer_get_user_data (<em class="parameter"><code><a class="link" href="harfb
 <col class="parameters_description">
 <col width="200px" class="parameters_annotations">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
 <td class="parameter_name"><p>buffer</p></td>
-<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_description"><p>An <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a></p></td>
 <td class="parameter_annotations"> </td>
-</tr></tbody>
+</tr>
+<tr>
+<td class="parameter_name"><p>key</p></td>
+<td class="parameter_description"><p>The user-data key to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-buffer-get-user-data.returns"></a><h4>Returns</h4>
+<p>A pointer to the user data. </p>
+<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="hb-buffer-get-glyph-infos"></a><h3>hb_buffer_get_glyph_infos ()</h3>
-<pre class="programlisting"><span class="returnvalue">hb_glyph_info_t</span> *
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-info-t" title="hb_glyph_info_t"><span class="returnvalue">hb_glyph_info_t</span></a> *
 hb_buffer_get_glyph_infos (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
                            <em class="parameter"><code>unsigned <span class="type">int</span> *length</code></em>);</pre>
 <p>Returns <em class="parameter"><code>buffer</code></em>
@@ -1819,12 +1996,12 @@ is valid as long as <em class="parameter"><code>buffer</code></em>
 <tbody>
 <tr>
 <td class="parameter_name"><p>buffer</p></td>
-<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_description"><p>An <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>length</p></td>
-<td class="parameter_description"><p>output array length. </p></td>
+<td class="parameter_description"><p>The output-array length. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
 </tr>
 </tbody>
@@ -1849,6 +2026,10 @@ hb_buffer_get_glyph_positions (<em class="parameter"><code><a class="link" href=
  glyph position array.  Returned pointer
 is valid as long as <em class="parameter"><code>buffer</code></em>
  contents are not modified.</p>
+<p>If buffer did not have positions before, the positions will be
+initialized to zeros, unless this function is called from
+within a buffer message callback (see <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-message-func" title="hb_buffer_set_message_func ()"><code class="function">hb_buffer_set_message_func()</code></a>),
+in which case <code class="literal">NULL</code> is returned.</p>
 <div class="refsect3">
 <a name="hb-buffer-get-glyph-positions.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -1860,12 +2041,12 @@ is valid as long as <em class="parameter"><code>buffer</code></em>
 <tbody>
 <tr>
 <td class="parameter_name"><p>buffer</p></td>
-<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_description"><p>An <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>length</p></td>
-<td class="parameter_description"><p>output length. </p></td>
+<td class="parameter_description"><p>The output length. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
 </tr>
 </tbody>
@@ -1882,6 +2063,37 @@ The value valid as long as buffer has not been modified. </p>
 </div>
 <hr>
 <div class="refsect2">
+<a name="hb-buffer-has-positions"></a><h3>hb_buffer_has_positions ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_buffer_has_positions (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
+<p>Returns whether <em class="parameter"><code>buffer</code></em>
+ has glyph position data.
+A buffer gains position data when <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-glyph-positions" title="hb_buffer_get_glyph_positions ()"><code class="function">hb_buffer_get_glyph_positions()</code></a> is called on it,
+and cleared of position data when <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-clear-contents" title="hb_buffer_clear_contents ()"><code class="function">hb_buffer_clear_contents()</code></a> is called.</p>
+<div class="refsect3">
+<a name="hb-buffer-has-positions.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-buffer-has-positions.returns"></a><h4>Returns</h4>
+<p><code class="literal">true</code> if the <em class="parameter"><code>buffer</code></em>
+has position array, <code class="literal">false</code> otherwise.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-7-3.html#api-index-2.7.3">2.7.3</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="hb-buffer-get-invisible-glyph"></a><h3>hb_buffer_get_invisible_glyph ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="returnvalue">hb_codepoint_t</span></a>
 hb_buffer_get_invisible_glyph (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
@@ -1896,7 +2108,7 @@ hb_buffer_get_invisible_glyph (<em class="parameter"><code><a class="link" href=
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>buffer</p></td>
-<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_description"><p>An <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
@@ -1904,7 +2116,7 @@ hb_buffer_get_invisible_glyph (<em class="parameter"><code><a class="link" href=
 <div class="refsect3">
 <a name="hb-buffer-get-invisible-glyph.returns"></a><h4>Returns</h4>
 <p>The <em class="parameter"><code>buffer</code></em>
-invisible <a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a>.</p>
+invisible <a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a></p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-2-0-0.html#api-index-2.0.0">2.0.0</a></p>
 </div>
@@ -1929,7 +2141,7 @@ verbatim.</p>
 <tbody>
 <tr>
 <td class="parameter_name"><p>buffer</p></td>
-<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_description"><p>An <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
@@ -1944,6 +2156,68 @@ verbatim.</p>
 </div>
 <hr>
 <div class="refsect2">
+<a name="hb-buffer-get-not-found-glyph"></a><h3>hb_buffer_get_not_found_glyph ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="returnvalue">hb_codepoint_t</span></a>
+hb_buffer_get_not_found_glyph (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
+<p>See <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-not-found-glyph" title="hb_buffer_set_not_found_glyph ()"><code class="function">hb_buffer_set_not_found_glyph()</code></a>.</p>
+<div class="refsect3">
+<a name="hb-buffer-get-not-found-glyph.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>An <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-buffer-get-not-found-glyph.returns"></a><h4>Returns</h4>
+<p>The <em class="parameter"><code>buffer</code></em>
+not-found <a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-3-1-0.html#api-index-3.1.0">3.1.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-set-not-found-glyph"></a><h3>hb_buffer_set_not_found_glyph ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_buffer_set_not_found_glyph (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+                               <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> not_found</code></em>);</pre>
+<p>Sets the <a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> that replaces characters not found in
+the font during shaping.</p>
+<p>The not-found glyph defaults to zero, sometimes knows as the
+".notdef" glyph.  This API allows for differentiating the two.</p>
+<div class="refsect3">
+<a name="hb-buffer-set-not-found-glyph.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>An <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>not_found</p></td>
+<td class="parameter_description"><p>the not-found <a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-3-1-0.html#api-index-3.1.0">3.1.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="hb-buffer-set-replacement-codepoint"></a><h3>hb_buffer_set_replacement_codepoint ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_buffer_set_replacement_codepoint (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
@@ -1951,7 +2225,7 @@ hb_buffer_set_replacement_codepoint (<em class="parameter"><code><a class="link"
 <p>Sets the <a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> that replaces invalid entries for a given encoding
 when adding text to <em class="parameter"><code>buffer</code></em>
 .</p>
-<p>Default is <a class="link" href="harfbuzz-hb-buffer.html#HB-BUFFER-REPLACEMENT-CODEPOINT-DEFAULT:CAPS" title="HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT"><code class="literal">HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT</code></a>.</p>
+<p>Default is <a class="link" href="harfbuzz-hb-buffer.html#HB-BUFFER-REPLACEMENT-CODEPOINT-DEFAULT:CAPS" title="HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT"><span class="type">HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT</span></a>.</p>
 <div class="refsect3">
 <a name="hb-buffer-set-replacement-codepoint.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -1963,7 +2237,7 @@ when adding text to <em class="parameter"><code>buffer</code></em>
 <tbody>
 <tr>
 <td class="parameter_name"><p>buffer</p></td>
-<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_description"><p>An <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
@@ -1981,7 +2255,9 @@ when adding text to <em class="parameter"><code>buffer</code></em>
 <a name="hb-buffer-get-replacement-codepoint"></a><h3>hb_buffer_get_replacement_codepoint ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="returnvalue">hb_codepoint_t</span></a>
 hb_buffer_get_replacement_codepoint (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
-<p>See <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-replacement-codepoint" title="hb_buffer_set_replacement_codepoint ()"><code class="function">hb_buffer_set_replacement_codepoint()</code></a>.</p>
+<p>Fetches the <a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> that replaces invalid entries for a given encoding
+when adding text to <em class="parameter"><code>buffer</code></em>
+.</p>
 <div class="refsect3">
 <a name="hb-buffer-get-replacement-codepoint.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -1992,7 +2268,7 @@ hb_buffer_get_replacement_codepoint (<em class="parameter"><code><a class="link"
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>buffer</p></td>
-<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_description"><p>An <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
@@ -2000,7 +2276,7 @@ hb_buffer_get_replacement_codepoint (<em class="parameter"><code><a class="link"
 <div class="refsect3">
 <a name="hb-buffer-get-replacement-codepoint.returns"></a><h4>Returns</h4>
 <p>The <em class="parameter"><code>buffer</code></em>
-replacement <a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a>.</p>
+replacement <a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a></p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-31.html#api-index-0.9.31">0.9.31</a></p>
 </div>
@@ -2022,7 +2298,7 @@ The resulting clusters should behave identical to pre-reordering clusters.</p>
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>buffer</p></td>
-<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_description"><p>An <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
@@ -2045,7 +2321,7 @@ hb_buffer_reverse (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>buffer</p></td>
-<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_description"><p>An <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
@@ -2059,7 +2335,9 @@ hb_buffer_reverse (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 hb_buffer_reverse_range (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
                          <em class="parameter"><code>unsigned <span class="type">int</span> start</code></em>,
                          <em class="parameter"><code>unsigned <span class="type">int</span> end</code></em>);</pre>
-<p>Reverses buffer contents between start to end.</p>
+<p>Reverses buffer contents between <em class="parameter"><code>start</code></em>
+ and <em class="parameter"><code>end</code></em>
+.</p>
 <div class="refsect3">
 <a name="hb-buffer-reverse-range.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -2071,17 +2349,17 @@ hb_buffer_reverse_range (<em class="parameter"><code><a class="link" href="harfb
 <tbody>
 <tr>
 <td class="parameter_name"><p>buffer</p></td>
-<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_description"><p>An <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>start</p></td>
-<td class="parameter_description"><p>start index.</p></td>
+<td class="parameter_description"><p>start index</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>end</p></td>
-<td class="parameter_description"><p>end index.</p></td>
+<td class="parameter_description"><p>end index</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 </tbody>
@@ -2107,7 +2385,7 @@ same cluster number) are reversed again.</p>
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>buffer</p></td>
-<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_description"><p>An <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
@@ -2116,6 +2394,95 @@ same cluster number) are reversed again.</p>
 </div>
 <hr>
 <div class="refsect2">
+<a name="hb-buffer-serialize"></a><h3>hb_buffer_serialize ()</h3>
+<pre class="programlisting">unsigned <span class="returnvalue">int</span>
+hb_buffer_serialize (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+                     <em class="parameter"><code>unsigned <span class="type">int</span> start</code></em>,
+                     <em class="parameter"><code>unsigned <span class="type">int</span> end</code></em>,
+                     <em class="parameter"><code><span class="type">char</span> *buf</code></em>,
+                     <em class="parameter"><code>unsigned <span class="type">int</span> buf_size</code></em>,
+                     <em class="parameter"><code>unsigned <span class="type">int</span> *buf_consumed</code></em>,
+                     <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                     <em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-format-t" title="enum hb_buffer_serialize_format_t"><span class="type">hb_buffer_serialize_format_t</span></a> format</code></em>,
+                     <em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-flags-t" title="enum hb_buffer_serialize_flags_t"><span class="type">hb_buffer_serialize_flags_t</span></a> flags</code></em>);</pre>
+<p>Serializes <em class="parameter"><code>buffer</code></em>
+ into a textual representation of its content, whether
+Unicode codepoints or glyph identifiers and positioning information. This is
+useful for showing the contents of the buffer, for example during debugging.
+See the documentation of <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-unicode" title="hb_buffer_serialize_unicode ()"><code class="function">hb_buffer_serialize_unicode()</code></a> and
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-glyphs" title="hb_buffer_serialize_glyphs ()"><code class="function">hb_buffer_serialize_glyphs()</code></a> for a description of the output format.</p>
+<div class="refsect3">
+<a name="hb-buffer-serialize.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a> buffer.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>start</p></td>
+<td class="parameter_description"><p>the first item in <em class="parameter"><code>buffer</code></em>
+to serialize.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>end</p></td>
+<td class="parameter_description"><p>the last item in <em class="parameter"><code>buffer</code></em>
+to serialize.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>buf</p></td>
+<td class="parameter_description"><p>output string to
+write serialized buffer into. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=buf_size][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> uint8_t]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>buf_size</p></td>
+<td class="parameter_description"><p>the size of <em class="parameter"><code>buf</code></em>
+.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>buf_consumed</p></td>
+<td class="parameter_description"><p>if not <code class="literal">NULL</code>, will be set to the number of byes written into <em class="parameter"><code>buf</code></em>
+. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL may be passed instead of a pointer to a location."><span class="acronym">optional</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>the <a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> used to shape this buffer, needed to
+read glyph names and extents. If <code class="literal">NULL</code>, and empty font will be used. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>format</p></td>
+<td class="parameter_description"><p>the <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-format-t" title="enum hb_buffer_serialize_format_t"><span class="type">hb_buffer_serialize_format_t</span></a> to use for formatting the output.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>flags</p></td>
+<td class="parameter_description"><p>the <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-flags-t" title="enum hb_buffer_serialize_flags_t"><span class="type">hb_buffer_serialize_flags_t</span></a> that control what glyph properties
+to serialize.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-buffer-serialize.returns"></a><h4>Returns</h4>
+<p>The number of serialized items.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-7-3.html#api-index-2.7.3">2.7.3</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="hb-buffer-serialize-glyphs"></a><h3>hb_buffer_serialize_glyphs ()</h3>
 <pre class="programlisting">unsigned <span class="returnvalue">int</span>
 hb_buffer_serialize_glyphs (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
@@ -2132,7 +2499,7 @@ hb_buffer_serialize_glyphs (<em class="parameter"><code><a class="link" href="ha
 useful for showing the contents of the buffer, for example during debugging.
 There are currently two supported serialization formats:</p>
 <div class="refsect3">
-<a name="id-1.3.4.3.7.48.5"></a><h4>text</h4>
+<a name="id-1.3.3.3.7.53.5"></a><h4>text</h4>
 <p>A human-readable, plain text format.
 The serialized glyphs will look something like:</p>
 <p><code class="literal">
@@ -2145,7 +2512,7 @@ The serialized glyphs will look something like:</p>
 <p>Each glyph starts with glyph name, or glyph index if
 <a class="link" href="harfbuzz-hb-buffer.html#HB-BUFFER-SERIALIZE-FLAG-NO-GLYPH-NAMES:CAPS"><span class="type">HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES</span></a> flag is set. Then,</p>
 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: circle; ">
-<li class="listitem"><p>If <a class="link" href="harfbuzz-hb-buffer.html#HB-BUFFER-SERIALIZE-FLAG-NO-CLUSTERS:CAPS"><span class="type">HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS</span></a> is not set, <code class="literal">=</code> then <span class="type">hb_glyph_info_t.cluster</span>.</p></li>
+<li class="listitem"><p>If <a class="link" href="harfbuzz-hb-buffer.html#HB-BUFFER-SERIALIZE-FLAG-NO-CLUSTERS:CAPS"><span class="type">HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS</span></a> is not set, <code class="literal">=</code> then <a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-info-t.cluster"><span class="type">hb_glyph_info_t.cluster</span></a>.</p></li>
 <li class="listitem">
 <p>If <a class="link" href="harfbuzz-hb-buffer.html#HB-BUFFER-SERIALIZE-FLAG-NO-POSITIONS:CAPS"><span class="type">HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS</span></a> is not set, the <a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-position-t" title="hb_glyph_position_t"><span class="type">hb_glyph_position_t</span></a> in the format:</p>
 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: square; ">
@@ -2153,16 +2520,32 @@ The serialized glyphs will look something like:</p>
 <li class="listitem"><p><code class="literal">+x_advance</code>, then <code class="literal">,y_advance</code> if <a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-position-t.y-advance"><span class="type">hb_glyph_position_t.y_advance</span></a> is not 0. Then,</p></li>
 </ul></div>
 </li>
-<li class="listitem"><p>If <a class="link" href="harfbuzz-hb-buffer.html#HB-BUFFER-SERIALIZE-FLAG-GLYPH-EXTENTS:CAPS"><span class="type">HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS</span></a> is set, the
-<span class="type">hb_glyph_extents_t</span> in the format
-<code class="literal">&amp;lt;x_bearing,y_bearing,width,height&amp;gt;</code></p></li>
+<li class="listitem"><p>If <a class="link" href="harfbuzz-hb-buffer.html#HB-BUFFER-SERIALIZE-FLAG-GLYPH-EXTENTS:CAPS"><span class="type">HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS</span></a> is set, the <a class="link" href="harfbuzz-hb-font.html#hb-glyph-extents-t" title="hb_glyph_extents_t"><span class="type">hb_glyph_extents_t</span></a> in the format <code class="literal">&lt;x_bearing,y_bearing,width,height&gt;</code></p></li>
 </ul></div>
 </li>
 </ul></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.4.3.7.48.6"></a><h4>json</h4>
-<p>TODO.</p>
+<a name="id-1.3.3.3.7.53.6"></a><h4>json</h4>
+<p>A machine-readable, structured format.
+The serialized glyphs will look something like:</p>
+<p><code class="literal">
+[{"g":"uni0651","cl":0,"dx":518,"dy":0,"ax":0,"ay":0},
+{"g":"uni0628","cl":0,"dx":0,"dy":0,"ax":1897,"ay":0}]
+</code></p>
+<p>Each glyph is a JSON object, with the following properties:</p>
+<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
+<li class="listitem"><p><code class="literal">g</code>: the glyph name or glyph index if
+<a class="link" href="harfbuzz-hb-buffer.html#HB-BUFFER-SERIALIZE-FLAG-NO-GLYPH-NAMES:CAPS"><span class="type">HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES</span></a> flag is set.</p></li>
+<li class="listitem"><p><code class="literal">cl</code>: <a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-info-t.cluster"><span class="type">hb_glyph_info_t.cluster</span></a> if
+<a class="link" href="harfbuzz-hb-buffer.html#HB-BUFFER-SERIALIZE-FLAG-NO-CLUSTERS:CAPS"><span class="type">HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS</span></a> is not set.</p></li>
+<li class="listitem"><p><code class="literal">dx</code>,<code class="literal">dy</code>,<code class="literal">ax</code>,<code class="literal">ay</code>: <a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-position-t.x-offset"><span class="type">hb_glyph_position_t.x_offset</span></a>, <a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-position-t.y-offset"><span class="type">hb_glyph_position_t.y_offset</span></a>,
+<a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-position-t.x-advance"><span class="type">hb_glyph_position_t.x_advance</span></a> and <a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-position-t.y-advance"><span class="type">hb_glyph_position_t.y_advance</span></a>
+respectively, if <a class="link" href="harfbuzz-hb-buffer.html#HB-BUFFER-SERIALIZE-FLAG-NO-POSITIONS:CAPS"><span class="type">HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS</span></a> is not set.</p></li>
+<li class="listitem"><p><code class="literal">xb</code>,<code class="literal">yb</code>,<code class="literal">w</code>,<code class="literal">h</code>: <a class="link" href="harfbuzz-hb-font.html#hb-glyph-extents-t.x-bearing"><span class="type">hb_glyph_extents_t.x_bearing</span></a>, <a class="link" href="harfbuzz-hb-font.html#hb-glyph-extents-t.y-bearing"><span class="type">hb_glyph_extents_t.y_bearing</span></a>,
+<a class="link" href="harfbuzz-hb-font.html#hb-glyph-extents-t.width"><span class="type">hb_glyph_extents_t.width</span></a> and <a class="link" href="harfbuzz-hb-font.html#hb-glyph-extents-t.height"><span class="type">hb_glyph_extents_t.height</span></a> respectively if
+<a class="link" href="harfbuzz-hb-buffer.html#HB-BUFFER-SERIALIZE-FLAG-GLYPH-EXTENTS:CAPS"><span class="type">HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS</span></a> is set.</p></li>
+</ul></div>
 </div>
 <div class="refsect3">
 <a name="hb-buffer-serialize-glyphs.parameters"></a><h4>Parameters</h4>
@@ -2204,15 +2587,15 @@ write serialized buffer into. </p></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>buf_consumed</p></td>
-<td class="parameter_description"><p>if not <a href="/usr/share/gtk-doc/html/glib/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>, will be set to the number of byes written into <em class="parameter"><code>buf</code></em>
+<td class="parameter_description"><p>if not <code class="literal">NULL</code>, will be set to the number of byes written into <em class="parameter"><code>buf</code></em>
 . </p></td>
-<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL may be passed instead of a pointer to a location."><span class="acronym">optional</span></acronym>]</span></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>font</p></td>
 <td class="parameter_description"><p>the <a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> used to shape this buffer, needed to
-read glyph names and extents. If <a href="/usr/share/gtk-doc/html/glib/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>, and empty font will be used. </p></td>
-<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+read glyph names and extents. If <code class="literal">NULL</code>, and empty font will be used. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>format</p></td>
@@ -2244,6 +2627,9 @@ hb_buffer_deserialize_glyphs (<em class="parameter"><code><a class="link" href="
                               <em class="parameter"><code>const <span class="type">char</span> **end_ptr</code></em>,
                               <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> *font</code></em>,
                               <em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-format-t" title="enum hb_buffer_serialize_format_t"><span class="type">hb_buffer_serialize_format_t</span></a> format</code></em>);</pre>
+<p>Deserializes glyphs <em class="parameter"><code>buffer</code></em>
+ from textual representation in the format
+produced by <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-glyphs" title="hb_buffer_serialize_glyphs ()"><code class="function">hb_buffer_serialize_glyphs()</code></a>.</p>
 <div class="refsect3">
 <a name="hb-buffer-deserialize-glyphs.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -2260,21 +2646,214 @@ hb_buffer_deserialize_glyphs (<em class="parameter"><code><a class="link" href="
 </tr>
 <tr>
 <td class="parameter_name"><p>buf</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>string to deserialize. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=buf_len]</span></td>
 </tr>
 <tr>
+<td class="parameter_name"><p>buf_len</p></td>
+<td class="parameter_description"><p>the size of <em class="parameter"><code>buf</code></em>
+, or -1 if it is <code class="literal">NULL</code>-terminated</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
 <td class="parameter_name"><p>end_ptr</p></td>
-<td class="parameter_description"><p>. </p></td>
-<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+<td class="parameter_description"><p>output pointer to the character after last
+consumed one. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL may be passed instead of a pointer to a location."><span class="acronym">optional</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>font for getting glyph IDs. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>format</p></td>
+<td class="parameter_description"><p>the <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-format-t" title="enum hb_buffer_serialize_format_t"><span class="type">hb_buffer_serialize_format_t</span></a> of the input <em class="parameter"><code>buf</code></em>
+</p></td>
+<td class="parameter_annotations"> </td>
 </tr>
 </tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-buffer-deserialize-glyphs.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> if <em class="parameter"><code>buf</code></em>
+is not fully consumed, <code class="literal">false</code> otherwise.</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
 </div>
 <hr>
 <div class="refsect2">
+<a name="hb-buffer-serialize-unicode"></a><h3>hb_buffer_serialize_unicode ()</h3>
+<pre class="programlisting">unsigned <span class="returnvalue">int</span>
+hb_buffer_serialize_unicode (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+                             <em class="parameter"><code>unsigned <span class="type">int</span> start</code></em>,
+                             <em class="parameter"><code>unsigned <span class="type">int</span> end</code></em>,
+                             <em class="parameter"><code><span class="type">char</span> *buf</code></em>,
+                             <em class="parameter"><code>unsigned <span class="type">int</span> buf_size</code></em>,
+                             <em class="parameter"><code>unsigned <span class="type">int</span> *buf_consumed</code></em>,
+                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-format-t" title="enum hb_buffer_serialize_format_t"><span class="type">hb_buffer_serialize_format_t</span></a> format</code></em>,
+                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-flags-t" title="enum hb_buffer_serialize_flags_t"><span class="type">hb_buffer_serialize_flags_t</span></a> flags</code></em>);</pre>
+<p>Serializes <em class="parameter"><code>buffer</code></em>
+ into a textual representation of its content,
+when the buffer contains Unicode codepoints (i.e., before shaping). This is
+useful for showing the contents of the buffer, for example during debugging.
+There are currently two supported serialization formats:</p>
+<div class="refsect3">
+<a name="id-1.3.3.3.7.55.5"></a><h4>text</h4>
+<p>A human-readable, plain text format.
+The serialized codepoints will look something like:</p>
+<p><code class="literal">
+ &lt;U+0651=0|U+0628=1&gt;
+</code></p>
+<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
+<li class="listitem"><p>Glyphs are separated with <code class="literal">|</code></p></li>
+<li class="listitem"><p>Unicode codepoints are expressed as zero-padded four (or more)
+digit hexadecimal numbers preceded by <code class="literal">U+</code></p></li>
+<li class="listitem"><p>If <a class="link" href="harfbuzz-hb-buffer.html#HB-BUFFER-SERIALIZE-FLAG-NO-CLUSTERS:CAPS"><span class="type">HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS</span></a> is not set, the cluster
+will be indicated with a <code class="literal">=</code> then <a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-info-t.cluster"><span class="type">hb_glyph_info_t.cluster</span></a>.</p></li>
+</ul></div>
+</div>
+<div class="refsect3">
+<a name="id-1.3.3.3.7.55.6"></a><h4>json</h4>
+<p>A machine-readable, structured format.
+The serialized codepoints will be a list of objects with the following
+properties:</p>
+<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
+<li class="listitem"><p><code class="literal">u</code>: the Unicode codepoint as a decimal integer</p></li>
+<li class="listitem"><p><code class="literal">cl</code>: <a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-info-t.cluster"><span class="type">hb_glyph_info_t.cluster</span></a> if
+<a class="link" href="harfbuzz-hb-buffer.html#HB-BUFFER-SERIALIZE-FLAG-NO-CLUSTERS:CAPS"><span class="type">HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS</span></a> is not set.</p></li>
+</ul></div>
+<p>For example:</p>
+<p><code class="literal">
+[{u:1617,cl:0},{u:1576,cl:1}]
+</code></p>
+</div>
+<div class="refsect3">
+<a name="hb-buffer-serialize-unicode.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a> buffer.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>start</p></td>
+<td class="parameter_description"><p>the first item in <em class="parameter"><code>buffer</code></em>
+to serialize.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>end</p></td>
+<td class="parameter_description"><p>the last item in <em class="parameter"><code>buffer</code></em>
+to serialize.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>buf</p></td>
+<td class="parameter_description"><p>output string to
+write serialized buffer into. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=buf_size][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> uint8_t]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>buf_size</p></td>
+<td class="parameter_description"><p>the size of <em class="parameter"><code>buf</code></em>
+.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>buf_consumed</p></td>
+<td class="parameter_description"><p>if not <code class="literal">NULL</code>, will be set to the number of byes written into <em class="parameter"><code>buf</code></em>
+. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL may be passed instead of a pointer to a location."><span class="acronym">optional</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>format</p></td>
+<td class="parameter_description"><p>the <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-format-t" title="enum hb_buffer_serialize_format_t"><span class="type">hb_buffer_serialize_format_t</span></a> to use for formatting the output.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>flags</p></td>
+<td class="parameter_description"><p>the <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-flags-t" title="enum hb_buffer_serialize_flags_t"><span class="type">hb_buffer_serialize_flags_t</span></a> that control what glyph properties
+to serialize.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-buffer-serialize-unicode.returns"></a><h4>Returns</h4>
+<p>The number of serialized items.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-7-3.html#api-index-2.7.3">2.7.3</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-deserialize-unicode"></a><h3>hb_buffer_deserialize_unicode ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_buffer_deserialize_unicode (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+                               <em class="parameter"><code>const <span class="type">char</span> *buf</code></em>,
+                               <em class="parameter"><code><span class="type">int</span> buf_len</code></em>,
+                               <em class="parameter"><code>const <span class="type">char</span> **end_ptr</code></em>,
+                               <em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-format-t" title="enum hb_buffer_serialize_format_t"><span class="type">hb_buffer_serialize_format_t</span></a> format</code></em>);</pre>
+<p>Deserializes Unicode <em class="parameter"><code>buffer</code></em>
+ from textual representation in the format
+produced by <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-unicode" title="hb_buffer_serialize_unicode ()"><code class="function">hb_buffer_serialize_unicode()</code></a>.</p>
+<div class="refsect3">
+<a name="hb-buffer-deserialize-unicode.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a> buffer.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>buf</p></td>
+<td class="parameter_description"><p>string to deserialize. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=buf_len]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>buf_len</p></td>
+<td class="parameter_description"><p>the size of <em class="parameter"><code>buf</code></em>
+, or -1 if it is <code class="literal">NULL</code>-terminated</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>end_ptr</p></td>
+<td class="parameter_description"><p>output pointer to the character after last
+consumed one. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL may be passed instead of a pointer to a location."><span class="acronym">optional</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>format</p></td>
+<td class="parameter_description"><p>the <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-format-t" title="enum hb_buffer_serialize_format_t"><span class="type">hb_buffer_serialize_format_t</span></a> of the input <em class="parameter"><code>buf</code></em>
+</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-buffer-deserialize-unicode.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> if <em class="parameter"><code>buf</code></em>
+is not fully consumed, <code class="literal">false</code> otherwise.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-7-3.html#api-index-2.7.3">2.7.3</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="hb-buffer-serialize-format-from-string"></a><h3>hb_buffer_serialize_format_from_string ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-format-t" title="enum hb_buffer_serialize_format_t"><span class="returnvalue">hb_buffer_serialize_format_t</span></a>
 hb_buffer_serialize_format_from_string
@@ -2301,7 +2880,7 @@ hb_buffer_serialize_format_from_string
 <tr>
 <td class="parameter_name"><p>len</p></td>
 <td class="parameter_description"><p>length of <em class="parameter"><code>str</code></em>
-, or -1 if string is <a href="/usr/share/gtk-doc/html/glib/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> terminated</p></td>
+, or -1 if string is <code class="literal">NULL</code> terminated</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 </tbody>
@@ -2319,7 +2898,7 @@ hb_buffer_serialize_format_from_string
 <pre class="programlisting">const <span class="returnvalue">char</span> *
 hb_buffer_serialize_format_to_string (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-format-t" title="enum hb_buffer_serialize_format_t"><span class="type">hb_buffer_serialize_format_t</span></a> format</code></em>);</pre>
 <p>Converts <em class="parameter"><code>format</code></em>
- to the string corresponding it, or <a href="/usr/share/gtk-doc/html/glib/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> if it is not a valid
+ to the string corresponding it, or <code class="literal">NULL</code> if it is not a valid
 <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-format-t" title="enum hb_buffer_serialize_format_t"><span class="type">hb_buffer_serialize_format_t</span></a>.</p>
 <div class="refsect3">
 <a name="hb-buffer-serialize-format-to-string.parameters"></a><h4>Parameters</h4>
@@ -2338,7 +2917,7 @@ hb_buffer_serialize_format_to_string (<em class="parameter"><code><a class="link
 </div>
 <div class="refsect3">
 <a name="hb-buffer-serialize-format-to-string.returns"></a><h4>Returns</h4>
-<p>A <a href="/usr/share/gtk-doc/html/glib/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> terminated string corresponding to <em class="parameter"><code>format</code></em>
+<p>A <code class="literal">NULL</code> terminated string corresponding to <em class="parameter"><code>format</code></em>
 . Should not be freed. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
 </div>
@@ -2390,7 +2969,7 @@ hb_segment_properties_equal (<em class="parameter"><code>const <a class="link" h
 <a name="hb-segment-properties-equal.returns"></a><h4>Returns</h4>
 <p><code class="literal">true</code> if all properties of <em class="parameter"><code>a</code></em>
 equal those of <em class="parameter"><code>b</code></em>
-, false otherwise.</p>
+, <code class="literal">false</code> otherwise.</p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
 </div>
@@ -2425,14 +3004,63 @@ hb_segment_properties_hash (<em class="parameter"><code>const <a class="link" hr
 </div>
 <hr>
 <div class="refsect2">
+<a name="hb-segment-properties-overlay"></a><h3>hb_segment_properties_overlay ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_segment_properties_overlay (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-t" title="hb_segment_properties_t"><span class="type">hb_segment_properties_t</span></a> *p</code></em>,
+                               <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-t" title="hb_segment_properties_t"><span class="type">hb_segment_properties_t</span></a> *src</code></em>);</pre>
+<p>Fills in missing fields of <em class="parameter"><code>p</code></em>
+ from <em class="parameter"><code>src</code></em>
+ in a considered manner.</p>
+<p>First, if <em class="parameter"><code>p</code></em>
+ does not have direction set, direction is copied from <em class="parameter"><code>src</code></em>
+.</p>
+<p>Next, if <em class="parameter"><code>p</code></em>
+ and <em class="parameter"><code>src</code></em>
+ have the same direction (which can be unset), if <em class="parameter"><code>p</code></em>
+
+does not have script set, script is copied from <em class="parameter"><code>src</code></em>
+.</p>
+<p>Finally, if <em class="parameter"><code>p</code></em>
+ and <em class="parameter"><code>src</code></em>
+ have the same direction and script (which either
+can be unset), if <em class="parameter"><code>p</code></em>
+ does not have language set, language is copied from
+<em class="parameter"><code>src</code></em>
+.</p>
+<div class="refsect3">
+<a name="hb-segment-properties-overlay.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>p</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-t" title="hb_segment_properties_t"><span class="type">hb_segment_properties_t</span></a> to fill in.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>src</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-t" title="hb_segment_properties_t"><span class="type">hb_segment_properties_t</span></a> to fill in from.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-3-3-0.html#api-index-3.3.0">3.3.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="hb-buffer-diff"></a><h3>hb_buffer_diff ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-diff-flags-t" title="enum hb_buffer_diff_flags_t"><span class="returnvalue">hb_buffer_diff_flags_t</span></a>
 hb_buffer_diff (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a> *reference</code></em>,
                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> dottedcircle_glyph</code></em>,
                 <em class="parameter"><code>unsigned <span class="type">int</span> position_fuzz</code></em>);</pre>
-<p>If dottedcircle_glyph is (hb_codepoint_t) -1 then <a class="link" href="harfbuzz-hb-buffer.html#HB-BUFFER-DIFF-FLAG-DOTTED-CIRCLE-PRESENT:CAPS"><code class="literal">HB_BUFFER_DIFF_FLAG_DOTTED_CIRCLE_PRESENT</code></a>
-and <a class="link" href="harfbuzz-hb-buffer.html#HB-BUFFER-DIFF-FLAG-NOTDEF-PRESENT:CAPS"><code class="literal">HB_BUFFER_DIFF_FLAG_NOTDEF_PRESENT</code></a> are never returned.  This should be used by most
+<p>If dottedcircle_glyph is (hb_codepoint_t) -1 then <a class="link" href="harfbuzz-hb-buffer.html#HB-BUFFER-DIFF-FLAG-DOTTED-CIRCLE-PRESENT:CAPS"><span class="type">HB_BUFFER_DIFF_FLAG_DOTTED_CIRCLE_PRESENT</span></a>
+and <a class="link" href="harfbuzz-hb-buffer.html#HB-BUFFER-DIFF-FLAG-NOTDEF-PRESENT:CAPS"><span class="type">HB_BUFFER_DIFF_FLAG_NOTDEF_PRESENT</span></a> are never returned.  This should be used by most
 callers if just comparing two buffers is needed.</p>
 <div class="refsect3">
 <a name="hb-buffer-diff.parameters"></a><h4>Parameters</h4>
@@ -2476,6 +3104,7 @@ hb_buffer_set_message_func (<em class="parameter"><code><a class="link" href="ha
                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-message-func-t" title="hb_buffer_message_func_t ()"><span class="type">hb_buffer_message_func_t</span></a> func</code></em>,
                             <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<p>Sets the implementation function for <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-message-func-t" title="hb_buffer_message_func_t ()"><span class="type">hb_buffer_message_func_t</span></a>.</p>
 <div class="refsect3">
 <a name="hb-buffer-set-message-func.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -2487,14 +3116,26 @@ hb_buffer_set_message_func (<em class="parameter"><code><a class="link" href="ha
 <tbody>
 <tr>
 <td class="parameter_name"><p>buffer</p></td>
-<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_description"><p>An <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>func</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>Callback function. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> user_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
 </tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>Data to pass to <em class="parameter"><code>func</code></em>
+. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>destroy</p></td>
+<td class="parameter_description"><p>The function to call when <em class="parameter"><code>user_data</code></em>
+is not needed anymore. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></td>
+</tr>
 </tbody>
 </table></div>
 </div>
@@ -2504,8 +3145,8 @@ hb_buffer_set_message_func (<em class="parameter"><code><a class="link" href="ha
 <div class="refsect2">
 <a name="hb-glyph-info-get-glyph-flags"></a><h3>hb_glyph_info_get_glyph_flags ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-flags-t" title="enum hb_glyph_flags_t"><span class="returnvalue">hb_glyph_flags_t</span></a>
-hb_glyph_info_get_glyph_flags (<em class="parameter"><code>const <span class="type">hb_glyph_info_t</span> *info</code></em>);</pre>
-<p>Returns glyph flags encoded within a <span class="type">hb_glyph_info_t</span>.</p>
+hb_glyph_info_get_glyph_flags (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-info-t" title="hb_glyph_info_t"><span class="type">hb_glyph_info_t</span></a> *info</code></em>);</pre>
+<p>Returns glyph flags encoded within a <a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-info-t" title="hb_glyph_info_t"><span class="type">hb_glyph_info_t</span></a>.</p>
 <div class="refsect3">
 <a name="hb-glyph-info-get-glyph-flags.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -2516,7 +3157,7 @@ hb_glyph_info_get_glyph_flags (<em class="parameter"><code>const <span class="ty
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>info</p></td>
-<td class="parameter_description"><p>a <span class="type">hb_glyph_info_t</span>.</p></td>
+<td class="parameter_description"><p>a <a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-info-t" title="hb_glyph_info_t"><span class="type">hb_glyph_info_t</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
@@ -2524,7 +3165,7 @@ hb_glyph_info_get_glyph_flags (<em class="parameter"><code>const <span class="ty
 <div class="refsect3">
 <a name="hb-glyph-info-get-glyph-flags.returns"></a><h4>Returns</h4>
 <p>The <a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-flags-t" title="enum hb_glyph_flags_t"><span class="type">hb_glyph_flags_t</span></a> encoded within <em class="parameter"><code>info</code></em>
-.</p>
+</p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-1-5-0.html#api-index-1.5.0">1.5.0</a></p>
 </div>
@@ -2536,6 +3177,49 @@ hb_glyph_info_get_glyph_flags (<em class="parameter"><code>const <span class="ty
                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> *font</code></em>,
                              <em class="parameter"><code>const <span class="type">char</span> *message</code></em>,
                              <em class="parameter"><code><span class="type">void</span> *user_data</code></em>);</pre>
+<p>A callback method for <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>. The method gets called with the
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a> it was set on, the <a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> the buffer is shaped with and a
+message describing what step of the shaping process will be performed.
+Returning <code class="literal">false</code> from this method will skip this shaping step and move to
+the next one.</p>
+<div class="refsect3">
+<a name="hb-buffer-message-func-t.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>An <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>The <a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> the <em class="parameter"><code>buffer</code></em>
+is shaped with</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>message</p></td>
+<td class="parameter_description"><p><code class="literal">NULL</code>-terminated message passed to the function</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>User data pointer passed by the caller</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-buffer-message-func-t.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> to perform the shaping step, <code class="literal">false</code> to skip it.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-1-3.html#api-index-1.1.3">1.1.3</a></p>
 </div>
 </div>
 <div class="refsect1">
@@ -2543,6 +3227,7 @@ hb_glyph_info_get_glyph_flags (<em class="parameter"><code>const <span class="ty
 <div class="refsect2">
 <a name="HB-SEGMENT-PROPERTIES-DEFAULT:CAPS"></a><h3>HB_SEGMENT_PROPERTIES_DEFAULT</h3>
 <pre class="programlisting">#define             HB_SEGMENT_PROPERTIES_DEFAULT</pre>
+<p>The default <a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-t" title="hb_segment_properties_t"><span class="type">hb_segment_properties_t</span></a> of of freshly created <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>.</p>
 </div>
 <hr>
 <div class="refsect2">
@@ -2563,7 +3248,53 @@ and output glyphs and their information after shaping.</p>
 </div>
 <hr>
 <div class="refsect2">
+<a name="hb-glyph-info-t"></a><h3>hb_glyph_info_t</h3>
+<pre class="programlisting">typedef struct {
+  hb_codepoint_t codepoint;
+  uint32_t       cluster;
+} hb_glyph_info_t;
+</pre>
+<p>The <a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-info-t" title="hb_glyph_info_t"><span class="type">hb_glyph_info_t</span></a> is the structure that holds information about the
+glyphs and their relation to input text.</p>
+<div class="refsect3">
+<a name="hb-glyph-info-t.members"></a><h4>Members</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="300px" class="struct_members_name">
+<col class="struct_members_description">
+<col width="200px" class="struct_members_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="struct_member_name"><p><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> <em class="structfield"><code><a name="hb-glyph-info-t.codepoint"></a>codepoint</code></em>;</p></td>
+<td class="struct_member_description"><p>either a Unicode code point (before shaping) or a glyph index
+(after shaping).</p></td>
+<td class="struct_member_annotations"> </td>
+</tr>
+<tr>
+<td class="struct_member_name"><p><span class="type">uint32_t</span> <em class="structfield"><code><a name="hb-glyph-info-t.cluster"></a>cluster</code></em>;</p></td>
+<td class="struct_member_description"><p>the index of the character in the original text that corresponds
+to this <a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-info-t" title="hb_glyph_info_t"><span class="type">hb_glyph_info_t</span></a>, or whatever the client passes to
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-add" title="hb_buffer_add ()"><code class="function">hb_buffer_add()</code></a>. More than one <a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-info-t" title="hb_glyph_info_t"><span class="type">hb_glyph_info_t</span></a> can have the same
+<em class="parameter"><code>cluster</code></em>
+value, if they resulted from the same character (e.g. one
+to many glyph substitution), and when more than one character gets
+merged in the same glyph (e.g. many to one glyph substitution) the
+<a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-info-t" title="hb_glyph_info_t"><span class="type">hb_glyph_info_t</span></a> will have the smallest cluster value of them.
+By default some characters are merged into the same cluster
+(e.g. combining marks have the same cluster as their bases)
+even if they are separate glyphs, <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-cluster-level" title="hb_buffer_set_cluster_level ()"><code class="function">hb_buffer_set_cluster_level()</code></a>
+allow selecting more fine-grained cluster handling.</p></td>
+<td class="struct_member_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<hr>
+<div class="refsect2">
 <a name="hb-glyph-flags-t"></a><h3>enum hb_glyph_flags_t</h3>
+<p>Flags for <a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-info-t" title="hb_glyph_info_t"><span class="type">hb_glyph_info_t</span></a>.</p>
 <div class="refsect3">
 <a name="hb-glyph-flags-t.members"></a><h4>Members</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -2579,18 +3310,74 @@ and output glyphs and their information after shaping.</p>
 <p>Indicates that if input text is broken at the
                                   beginning of the cluster this glyph is part of,
                                   then both sides need to be re-shaped, as the
-                                  result might be different.  On the flip side,
-                                  it means that when this flag is not present,
-                                  then it's safe to break the glyph-run at the
-                                  beginning of this cluster, and the two sides
-                                  represent the exact same result one would get
-                                  if breaking input text at the beginning of
-                                  this cluster and shaping the two sides
-                                  separately.  This can be used to optimize
-                                  paragraph layout, by avoiding re-shaping
-                                  of each line after line-breaking, or limiting
-                                  the reshaping to a small piece around the
-                                  breaking point only.</p>
+                                  result might be different.
+                                  On the flip side, it means that when this
+                                  flag is not present, then it is safe to break
+                                  the glyph-run at the beginning of this
+                                  cluster, and the two sides will represent the
+                                  exact same result one would get if breaking
+                                  input text at the beginning of this cluster
+                                  and shaping the two sides separately.
+                                  This can be used to optimize paragraph
+                                  layout, by avoiding re-shaping of each line
+                                  after line-breaking.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-GLYPH-FLAG-UNSAFE-TO-CONCAT:CAPS"></a>HB_GLYPH_FLAG_UNSAFE_TO_CONCAT</p></td>
+<td class="enum_member_description">
+<p>Indicates that if input text is changed on one
+                                  side of the beginning of the cluster this glyph
+                                  is part of, then the shaping results for the
+                                  other side might change.
+                                  Note that the absence of this flag will NOT by
+                                  itself mean that it IS safe to concat text.
+                                  Only two pieces of text both of which clear of
+                                  this flag can be concatenated safely.
+                                  This can be used to optimize paragraph
+                                  layout, by avoiding re-shaping of each line
+                                  after line-breaking, by limiting the
+                                  reshaping to a small piece around the
+                                  breaking positin only, even if the breaking
+                                  position carries the
+                                  <a class="link" href="harfbuzz-hb-buffer.html#HB-GLYPH-FLAG-UNSAFE-TO-BREAK:CAPS"><span class="type">HB_GLYPH_FLAG_UNSAFE_TO_BREAK</span></a> or when
+                                  hyphenation or other text transformation
+                                  happens at line-break position, in the following
+                                  way:
+                                  1. Iterate back from the line-break position
+                                  until the first cluster start position that is
+                                  NOT unsafe-to-concat, 2. shape the segment from
+                                  there till the end of line, 3. check whether the
+                                  resulting glyph-run also is clear of the
+                                  unsafe-to-concat at its start-of-text position;
+                                  if it is, just splice it into place and the line
+                                  is shaped; If not, move on to a position further
+                                  back that is clear of unsafe-to-concat and retry
+                                  from there, and repeat.
+                                  At the start of next line a similar algorithm can
+                                  be implemented. That is: 1. Iterate forward from
+                                  the line-break position untill the first cluster
+                                  start position that is NOT unsafe-to-concat, 2.
+                                  shape the segment from beginning of the line to
+                                  that position, 3. check whether the resulting
+                                  glyph-run also is clear of the unsafe-to-concat
+                                  at its end-of-text position; if it is, just splice
+                                  it into place and the beginning is shaped; If not,
+                                  move on to a position further forward that is clear
+                                  of unsafe-to-concat and retry up to there, and repeat.
+                                  A slight complication will arise in the
+                                  implementation of the algorithm above,
+                                  because while our buffer API has a way to
+                                  return flags for position corresponding to
+                                  start-of-text, there is currently no position
+                                  corresponding to end-of-text.  This limitation
+                                  can be alleviated by shaping more text than needed
+                                  and looking for unsafe-to-concat flag within text
+                                  clusters.
+                                  The <a class="link" href="harfbuzz-hb-buffer.html#HB-GLYPH-FLAG-UNSAFE-TO-BREAK:CAPS"><span class="type">HB_GLYPH_FLAG_UNSAFE_TO_BREAK</span></a> flag will
+                                  always imply this flag.
+                                  Since: 3.3.0</p>
 </td>
 <td class="enum_member_annotations"> </td>
 </tr>
@@ -2659,6 +3446,7 @@ should not affect how much the line advances.</p></td>
 <hr>
 <div class="refsect2">
 <a name="hb-buffer-content-type-t"></a><h3>enum hb_buffer_content_type_t</h3>
+<p>The type of <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a> contents.</p>
 <div class="refsect3">
 <a name="hb-buffer-content-type-t.members"></a><h4>Members</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -2696,6 +3484,7 @@ should not affect how much the line advances.</p></td>
 <hr>
 <div class="refsect2">
 <a name="hb-buffer-flags-t"></a><h3>enum hb_buffer_flags_t</h3>
+<p>Flags for <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>.</p>
 <div class="refsect3">
 <a name="hb-buffer-flags-t.members"></a><h4>Members</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -2763,7 +3552,20 @@ precedence over this flag. Since: 1.8.0</p>
 <td class="enum_member_description">
 <p>flag indicating that a dotted circle should
 not be inserted in the rendering of incorrect
-character sequences (such at &lt;0905 093E&gt;). Since: 2.4</p>
+character sequences (such at &lt;0905 093E&gt;). Since: 2.4.0</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-BUFFER-FLAG-VERIFY:CAPS"></a>HB_BUFFER_FLAG_VERIFY</p></td>
+<td class="enum_member_description">
+<p>flag indicating that the <a class="link" href="harfbuzz-hb-shape.html#hb-shape" title="hb_shape ()"><code class="function">hb_shape()</code></a> call and its variants
+should perform various verification processes on the results
+of the shaping operation on the buffer.  If the verification
+fails, then either a buffer message is sent, if a message
+handler is installed on the buffer, or a message is written
+to standard error.  In either case, the shaping result might
+be modified to show the failed output. Since: 3.4.0</p>
 </td>
 <td class="enum_member_annotations"> </td>
 </tr>
@@ -2775,6 +3577,24 @@ character sequences (such at &lt;0905 093E&gt;). Since: 2.4</p>
 <hr>
 <div class="refsect2">
 <a name="hb-buffer-cluster-level-t"></a><h3>enum hb_buffer_cluster_level_t</h3>
+<p>Data type for holding HarfBuzz's clustering behavior options. The cluster level
+dictates one aspect of how HarfBuzz will treat non-base characters
+
+during shaping.</p>
+<p>In <em class="parameter"><code>HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES</code></em>
+, non-base
+characters are merged into the cluster of the base character that precedes them.</p>
+<p>In <em class="parameter"><code>HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS</code></em>
+, non-base characters are initially
+assigned their own cluster values, which are not merged into preceding base
+clusters. This allows HarfBuzz to perform additional operations like reorder
+sequences of adjacent marks.</p>
+<p><em class="parameter"><code>HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES</code></em>
+ is the default, because it maintains
+backward compatibility with older versions of HarfBuzz. New client programs that
+do not need to maintain such backward compatibility are recommended to use
+<em class="parameter"><code>HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS</code></em>
+ instead of the default.</p>
 <div class="refsect3">
 <a name="hb-buffer-cluster-level-t.members"></a><h4>Members</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -2971,6 +3791,14 @@ glyph offsets will reflect absolute glyph positions. Since: 1.8.0</p>
 <hr>
 <div class="refsect2">
 <a name="hb-buffer-diff-flags-t"></a><h3>enum hb_buffer_diff_flags_t</h3>
+<p>Flags from comparing two <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>'s.</p>
+<p>Buffer with different <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-content-type-t" title="enum hb_buffer_content_type_t"><span class="type">hb_buffer_content_type_t</span></a> cannot be meaningfully
+compared in any further detail.</p>
+<p>For buffers with differing length, the per-glyph comparison is not
+attempted, though we do still scan reference buffer for dotted circle and
+<code class="literal">.notdef</code> glyphs.</p>
+<p>If the buffers have the same length, we compare them glyph-by-glyph and
+report which aspect(s) of the glyph info/position are different.</p>
 <div class="refsect3">
 <a name="hb-buffer-diff-flags-t.members"></a><h4>Members</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -2982,56 +3810,78 @@ glyph offsets will reflect absolute glyph positions. Since: 1.8.0</p>
 <tbody>
 <tr>
 <td class="enum_member_name"><p><a name="HB-BUFFER-DIFF-FLAG-EQUAL:CAPS"></a>HB_BUFFER_DIFF_FLAG_EQUAL</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>equal buffers.</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-BUFFER-DIFF-FLAG-CONTENT-TYPE-MISMATCH:CAPS"></a>HB_BUFFER_DIFF_FLAG_CONTENT_TYPE_MISMATCH</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>buffers with different
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-content-type-t" title="enum hb_buffer_content_type_t"><span class="type">hb_buffer_content_type_t</span></a>.</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-BUFFER-DIFF-FLAG-LENGTH-MISMATCH:CAPS"></a>HB_BUFFER_DIFF_FLAG_LENGTH_MISMATCH</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>buffers with differing length.</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-BUFFER-DIFF-FLAG-NOTDEF-PRESENT:CAPS"></a>HB_BUFFER_DIFF_FLAG_NOTDEF_PRESENT</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p><code class="literal">.notdef</code> glyph is present in the
+reference buffer.</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-BUFFER-DIFF-FLAG-DOTTED-CIRCLE-PRESENT:CAPS"></a>HB_BUFFER_DIFF_FLAG_DOTTED_CIRCLE_PRESENT</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>dotted circle glyph is present
+in the reference buffer.</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-BUFFER-DIFF-FLAG-CODEPOINT-MISMATCH:CAPS"></a>HB_BUFFER_DIFF_FLAG_CODEPOINT_MISMATCH</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>difference in <a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-info-t.codepoint"><span class="type">hb_glyph_info_t.codepoint</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-BUFFER-DIFF-FLAG-CLUSTER-MISMATCH:CAPS"></a>HB_BUFFER_DIFF_FLAG_CLUSTER_MISMATCH</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>difference in <a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-info-t.cluster"><span class="type">hb_glyph_info_t.cluster</span></a></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-BUFFER-DIFF-FLAG-GLYPH-FLAGS-MISMATCH:CAPS"></a>HB_BUFFER_DIFF_FLAG_GLYPH_FLAGS_MISMATCH</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>difference in <a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-flags-t" title="enum hb_glyph_flags_t"><span class="type">hb_glyph_flags_t</span></a>.</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-BUFFER-DIFF-FLAG-POSITION-MISMATCH:CAPS"></a>HB_BUFFER_DIFF_FLAG_POSITION_MISMATCH</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>difference in <a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-position-t" title="hb_glyph_position_t"><span class="type">hb_glyph_position_t</span></a>.</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 </tbody>
 </table></div>
 </div>
+<p class="since">Since: <a class="link" href="api-index-1-5-0.html#api-index-1.5.0">1.5.0</a></p>
 </div>
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index b754d4a..2f34bbd 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-common: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch12.html" title="Core API">
+<link rel="up" href="core-api.html" title="Core API">
 <link rel="prev" href="harfbuzz-hb-buffer.html" title="hb-buffer">
 <link rel="next" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -18,7 +18,7 @@
                   <a href="#harfbuzz-hb-common.description" class="shortcut">Description</a></span>
 </td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><a accesskey="u" href="ch12.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="u" href="core-api.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
 <td><a accesskey="p" href="harfbuzz-hb-buffer.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
 <td><a accesskey="n" href="harfbuzz-hb-deprecated.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <td class="function_name"><a class="link" href="harfbuzz-hb-common.html#hb-user-data-key-t" title="hb_user_data_key_t">hb_user_data_key_t</a></td>
 </tr>
 <tr>
-<td class="datatype_keyword"> </td>
-<td class="function_name"><a class="link" href="harfbuzz-hb-common.html#hb-var-int-t" title="hb_var_int_t">hb_var_int_t</a></td>
-</tr>
-<tr>
 <td class="define_keyword">#define</td>
 <td class="function_name"><a class="link" href="harfbuzz-hb-common.html#HB-TAG-NONE:CAPS" title="HB_TAG_NONE">HB_TAG_NONE</a></td>
 </tr>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="returnvalue">hb_tag_t</span></a>
 hb_tag_from_string (<em class="parameter"><code>const <span class="type">char</span> *str</code></em>,
                     <em class="parameter"><code><span class="type">int</span> len</code></em>);</pre>
+<p>Converts a string into an <a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a>. Valid tags
+are four characters. Shorter input strings will be
+padded with spaces. Longer input strings will be
+truncated.</p>
 <div class="refsect3">
 <a name="hb-tag-from-string.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -323,13 +323,26 @@ hb_tag_from_string (<em class="parameter"><code>const <span class="type">char</s
 <col class="parameters_description">
 <col width="200px" class="parameters_annotations">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
 <td class="parameter_name"><p>str</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>String to convert. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=len][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> uint8_t]</span></td>
-</tr></tbody>
+</tr>
+<tr>
+<td class="parameter_name"><p>len</p></td>
+<td class="parameter_description"><p>Length of <em class="parameter"><code>str</code></em>
+, or -1 if it is <code class="literal">NULL</code>-terminated</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-tag-from-string.returns"></a><h4>Returns</h4>
+<p> The <a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> corresponding to <em class="parameter"><code>str</code></em>
+</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
 <hr>
@@ -338,6 +351,9 @@ hb_tag_from_string (<em class="parameter"><code>const <span class="type">char</s
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_tag_to_string (<em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> tag</code></em>,
                   <em class="parameter"><code><span class="type">char</span> *buf</code></em>);</pre>
+<p>Converts an <a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> to a string and returns it in <em class="parameter"><code>buf</code></em>
+.
+Strings will be four characters long.</p>
 <div class="refsect3">
 <a name="hb-tag-to-string.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -346,11 +362,18 @@ hb_tag_to_string (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 <col class="parameters_description">
 <col width="200px" class="parameters_annotations">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
+<td class="parameter_name"><p>tag</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> to convert</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
 <td class="parameter_name"><p>buf</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>Converted string. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Out parameter, where caller must allocate storage."><span class="acronym">out caller-allocates</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> fixed-size=4][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> uint8_t]</span></td>
-</tr></tbody>
+</tr>
+</tbody>
 </table></div>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-5.html#api-index-0.9.5">0.9.5</a></p>
@@ -361,6 +384,10 @@ hb_tag_to_string (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="returnvalue">hb_direction_t</span></a>
 hb_direction_from_string (<em class="parameter"><code>const <span class="type">char</span> *str</code></em>,
                           <em class="parameter"><code><span class="type">int</span> len</code></em>);</pre>
+<p>Converts a string to an <a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="type">hb_direction_t</span></a>.</p>
+<p>Matching is loose and applies only to the first letter. For
+examples, "LTR" and "left-to-right" will both return <a class="link" href="harfbuzz-hb-common.html#HB-DIRECTION-LTR:CAPS"><span class="type">HB_DIRECTION_LTR</span></a>.</p>
+<p>Unmatched strings will return <a class="link" href="harfbuzz-hb-common.html#HB-DIRECTION-INVALID:CAPS"><span class="type">HB_DIRECTION_INVALID</span></a>.</p>
 <div class="refsect3">
 <a name="hb-direction-from-string.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -369,13 +396,26 @@ hb_direction_from_string (<em class="parameter"><code>const <span class="type">c
 <col class="parameters_description">
 <col width="200px" class="parameters_annotations">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
 <td class="parameter_name"><p>str</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>String to convert. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=len][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> uint8_t]</span></td>
-</tr></tbody>
+</tr>
+<tr>
+<td class="parameter_name"><p>len</p></td>
+<td class="parameter_description"><p>Length of <em class="parameter"><code>str</code></em>
+, or -1 if it is <code class="literal">NULL</code>-terminated</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-direction-from-string.returns"></a><h4>Returns</h4>
+<p> The <a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="type">hb_direction_t</span></a> matching <em class="parameter"><code>str</code></em>
+</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
 <hr>
@@ -383,9 +423,26 @@ hb_direction_from_string (<em class="parameter"><code>const <span class="type">c
 <a name="hb-direction-to-string"></a><h3>hb_direction_to_string ()</h3>
 <pre class="programlisting">const <span class="returnvalue">char</span> *
 hb_direction_to_string (<em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="type">hb_direction_t</span></a> direction</code></em>);</pre>
+<p>Converts an <a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="type">hb_direction_t</span></a> to a string.</p>
+<div class="refsect3">
+<a name="hb-direction-to-string.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>direction</p></td>
+<td class="parameter_description"><p>The <a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="type">hb_direction_t</span></a> to convert</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
 <div class="refsect3">
 <a name="hb-direction-to-string.returns"></a><h4>Returns</h4>
-<p>. </p>
+<p>The string corresponding to <em class="parameter"><code>direction</code></em>
+. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
@@ -445,7 +502,7 @@ ISO 15924 tag. </p></td>
 <tr>
 <td class="parameter_name"><p>len</p></td>
 <td class="parameter_description"><p>length of the <em class="parameter"><code>str</code></em>
-, or -1 if it is <a href="/usr/share/gtk-doc/html/glib/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>-terminated.</p></td>
+, or -1 if it is <code class="literal">NULL</code>-terminated.</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 </tbody>
@@ -462,7 +519,7 @@ ISO 15924 tag. </p></td>
 <a name="hb-script-to-iso15924-tag"></a><h3>hb_script_to_iso15924_tag ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="returnvalue">hb_tag_t</span></a>
 hb_script_to_iso15924_tag (<em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="type">hb_script_t</span></a> script</code></em>);</pre>
-<p>See <a class="link" href="harfbuzz-hb-common.html#hb-script-from-iso15924-tag" title="hb_script_from_iso15924_tag ()"><code class="function">hb_script_from_iso15924_tag()</code></a>.</p>
+<p>Converts an <a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="type">hb_script_t</span></a> to a corresponding ISO 15924 script tag.</p>
 <div class="refsect3">
 <a name="hb-script-to-iso15924-tag.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -489,6 +546,32 @@ hb_script_to_iso15924_tag (<em class="parameter"><code><a class="link" href="har
 <a name="hb-script-get-horizontal-direction"></a><h3>hb_script_get_horizontal_direction ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="returnvalue">hb_direction_t</span></a>
 hb_script_get_horizontal_direction (<em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="type">hb_script_t</span></a> script</code></em>);</pre>
+<p>Fetches the <a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="type">hb_direction_t</span></a> of a script when it is
+set horizontally. All right-to-left scripts will return
+<a class="link" href="harfbuzz-hb-common.html#HB-DIRECTION-RTL:CAPS"><span class="type">HB_DIRECTION_RTL</span></a>. All left-to-right scripts will return
+<a class="link" href="harfbuzz-hb-common.html#HB-DIRECTION-LTR:CAPS"><span class="type">HB_DIRECTION_LTR</span></a>.  Scripts that can be written either
+horizontally or vertically will return <a class="link" href="harfbuzz-hb-common.html#HB-DIRECTION-INVALID:CAPS"><span class="type">HB_DIRECTION_INVALID</span></a>.
+Unknown scripts will return <a class="link" href="harfbuzz-hb-common.html#HB-DIRECTION-LTR:CAPS"><span class="type">HB_DIRECTION_LTR</span></a>.</p>
+<div class="refsect3">
+<a name="hb-script-get-horizontal-direction.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>script</p></td>
+<td class="parameter_description"><p>The <a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="type">hb_script_t</span></a> to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-script-get-horizontal-direction.returns"></a><h4>Returns</h4>
+<p> The horizontal <a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="type">hb_direction_t</span></a> of <em class="parameter"><code>script</code></em>
+</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
 <hr>
@@ -518,7 +601,7 @@ a BCP 47 language tag. </p></td>
 <tr>
 <td class="parameter_name"><p>len</p></td>
 <td class="parameter_description"><p>length of the <em class="parameter"><code>str</code></em>
-, or -1 if it is <a href="/usr/share/gtk-doc/html/glib/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>-terminated.</p></td>
+, or -1 if it is <code class="literal">NULL</code>-terminated.</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 </tbody>
@@ -536,7 +619,7 @@ a BCP 47 language tag. </p></td>
 <a name="hb-language-to-string"></a><h3>hb_language_to_string ()</h3>
 <pre class="programlisting">const <span class="returnvalue">char</span> *
 hb_language_to_string (<em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-language-t" title="hb_language_t"><span class="type">hb_language_t</span></a> language</code></em>);</pre>
-<p>See <a class="link" href="harfbuzz-hb-common.html#hb-language-from-string" title="hb_language_from_string ()"><code class="function">hb_language_from_string()</code></a>.</p>
+<p>Converts an <a class="link" href="harfbuzz-hb-common.html#hb-language-t" title="hb_language_t"><span class="type">hb_language_t</span></a> to a string.</p>
 <div class="refsect3">
 <a name="hb-language-to-string.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -547,14 +630,14 @@ hb_language_to_string (<em class="parameter"><code><a class="link" href="harfbuz
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>language</p></td>
-<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-common.html#hb-language-t" title="hb_language_t"><span class="type">hb_language_t</span></a> to convert.</p></td>
+<td class="parameter_description"><p>The <a class="link" href="harfbuzz-hb-common.html#hb-language-t" title="hb_language_t"><span class="type">hb_language_t</span></a> to convert</p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
 </div>
 <div class="refsect3">
 <a name="hb-language-to-string.returns"></a><h4>Returns</h4>
-<p>A <a href="/usr/share/gtk-doc/html/glib/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>-terminated string representing the <em class="parameter"><code>language</code></em>
+<p>A <code class="literal">NULL</code>-terminated string representing the <em class="parameter"><code>language</code></em>
 . Must not be freed by
 the caller. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
@@ -566,16 +649,17 @@ the caller. </p>
 <a name="hb-language-get-default"></a><h3>hb_language_get_default ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-language-t" title="hb_language_t"><span class="returnvalue">hb_language_t</span></a>
 hb_language_get_default (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
-<p>Get default language from current locale.</p>
-<p>Note that the first time this function is called, it calls
+<p>Fetch the default language from current locale.</p>
+<div class="note">Note that the first time this function is called, it calls
 "setlocale (LC_CTYPE, nullptr)" to fetch current locale.  The underlying
 setlocale function is, in many implementations, NOT threadsafe.  To avoid
 problems, call this function once before multiple threads can call it.
 This function is only used from <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-guess-segment-properties" title="hb_buffer_guess_segment_properties ()"><code class="function">hb_buffer_guess_segment_properties()</code></a> by
-HarfBuzz itself.</p>
+HarfBuzz itself.</div>
 <div class="refsect3">
 <a name="hb-language-get-default.returns"></a><h4>Returns</h4>
-<p>. </p>
+<p>The default language of the locale as
+an <a class="link" href="harfbuzz-hb-common.html#hb-language-t" title="hb_language_t"><span class="type">hb_language_t</span></a>. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
@@ -742,7 +826,7 @@ position before the first character is always 0.</p>
 <tr>
 <td class="parameter_name"><p>len</p></td>
 <td class="parameter_description"><p>length of <em class="parameter"><code>str</code></em>
-, or -1 if string is <a href="/usr/share/gtk-doc/html/glib/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> terminated</p></td>
+, or -1 if string is <code class="literal">NULL</code> terminated</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
@@ -756,7 +840,7 @@ position before the first character is always 0.</p>
 <div class="refsect3">
 <a name="hb-feature-from-string.returns"></a><h4>Returns</h4>
 <p><code class="literal">true</code> if <em class="parameter"><code>str</code></em>
-is successfully parsed, <code class="literal">false</code> otherwise.</p>
+is successfully parsed, <code class="literal">false</code> otherwise</p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-5.html#api-index-0.9.5">0.9.5</a></p>
 </div>
@@ -767,7 +851,7 @@ is successfully parsed, <code class="literal">false</code> otherwise.</p>
 hb_feature_to_string (<em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-feature-t" title="hb_feature_t"><span class="type">hb_feature_t</span></a> *feature</code></em>,
                       <em class="parameter"><code><span class="type">char</span> *buf</code></em>,
                       <em class="parameter"><code>unsigned <span class="type">int</span> size</code></em>);</pre>
-<p>Converts a <a class="link" href="harfbuzz-hb-common.html#hb-feature-t" title="hb_feature_t"><span class="type">hb_feature_t</span></a> into a <a href="/usr/share/gtk-doc/html/glib/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>-terminated string in the format
+<p>Converts a <a class="link" href="harfbuzz-hb-common.html#hb-feature-t" title="hb_feature_t"><span class="type">hb_feature_t</span></a> into a <code class="literal">NULL</code>-terminated string in the format
 understood by <a class="link" href="harfbuzz-hb-common.html#hb-feature-from-string" title="hb_feature_from_string ()"><code class="function">hb_feature_from_string()</code></a>. The client in responsible for
 allocating big enough size for <em class="parameter"><code>buf</code></em>
 , 128 bytes is more than enough.</p>
@@ -808,6 +892,45 @@ allocating big enough size for <em class="parameter"><code>buf</code></em>
 hb_variation_from_string (<em class="parameter"><code>const <span class="type">char</span> *str</code></em>,
                           <em class="parameter"><code><span class="type">int</span> len</code></em>,
                           <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-variation-t" title="hb_variation_t"><span class="type">hb_variation_t</span></a> *variation</code></em>);</pre>
+<p>Parses a string into a <a class="link" href="harfbuzz-hb-common.html#hb-variation-t" title="hb_variation_t"><span class="type">hb_variation_t</span></a>.</p>
+<p>The format for specifying variation settings follows. All valid CSS
+font-variation-settings values other than 'normal' and 'inherited' are also
+accepted, though, not documented below.</p>
+<p>The format is a tag, optionally followed by an equals sign, followed by a
+number. For example <code class="literal">wght=500</code>, or <code class="literal">slnt=-7.5</code>.</p>
+<div class="refsect3">
+<a name="hb-variation-from-string.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>str</p></td>
+<td class="parameter_description"><p>a string to parse. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=len][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> uint8_t]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>len</p></td>
+<td class="parameter_description"><p>length of <em class="parameter"><code>str</code></em>
+, or -1 if string is <code class="literal">NULL</code> terminated</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>variation</p></td>
+<td class="parameter_description"><p>the <a class="link" href="harfbuzz-hb-common.html#hb-variation-t" title="hb_variation_t"><span class="type">hb_variation_t</span></a> to initialize with the parsed values. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-variation-from-string.returns"></a><h4>Returns</h4>
+<p><code class="literal">true</code> if <em class="parameter"><code>str</code></em>
+is successfully parsed, <code class="literal">false</code> otherwise</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-1-4-2.html#api-index-1.4.2">1.4.2</a></p>
 </div>
 <hr>
@@ -817,6 +940,38 @@ hb_variation_from_string (<em class="parameter"><code>const <span class="type">c
 hb_variation_to_string (<em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-variation-t" title="hb_variation_t"><span class="type">hb_variation_t</span></a> *variation</code></em>,
                         <em class="parameter"><code><span class="type">char</span> *buf</code></em>,
                         <em class="parameter"><code>unsigned <span class="type">int</span> size</code></em>);</pre>
+<p>Converts an <a class="link" href="harfbuzz-hb-common.html#hb-variation-t" title="hb_variation_t"><span class="type">hb_variation_t</span></a> into a <code class="literal">NULL</code>-terminated string in the format
+understood by <a class="link" href="harfbuzz-hb-common.html#hb-variation-from-string" title="hb_variation_from_string ()"><code class="function">hb_variation_from_string()</code></a>. The client in responsible for
+allocating big enough size for <em class="parameter"><code>buf</code></em>
+, 128 bytes is more than enough.</p>
+<div class="refsect3">
+<a name="hb-variation-to-string.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>variation</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-common.html#hb-variation-t" title="hb_variation_t"><span class="type">hb_variation_t</span></a> to convert</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>buf</p></td>
+<td class="parameter_description"><p>output string. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=size][<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>size</p></td>
+<td class="parameter_description"><p>the allocated size of <em class="parameter"><code>buf</code></em>
+</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
 <p class="since">Since: <a class="link" href="api-index-1-4-2.html#api-index-1.4.2">1.4.2</a></p>
 </div>
 <hr>
@@ -824,54 +979,221 @@ hb_variation_to_string (<em class="parameter"><code><a class="link" href="harfbu
 <a name="hb-destroy-func-t"></a><h3>hb_destroy_func_t ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 <span class="c_punctuation">(</span>*hb_destroy_func_t<span class="c_punctuation">)</span> (<em class="parameter"><code><span class="type">void</span> *user_data</code></em>);</pre>
+<p>A virtual method for destroy user-data callbacks.</p>
+<div class="refsect3">
+<a name="hb-destroy-func-t.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>the data to be destroyed</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
 </div>
 <hr>
 <div class="refsect2">
 <a name="HB-TAG:CAPS"></a><h3>HB_TAG()</h3>
 <pre class="programlisting">#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&amp;0xFF)&lt;&lt;24)|(((uint32_t)(c2)&amp;0xFF)&lt;&lt;16)|(((uint32_t)(c3)&amp;0xFF)&lt;&lt;8)|((uint32_t)(c4)&amp;0xFF)))
 </pre>
+<p>Constructs an <a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> from four character literals.</p>
+<div class="refsect3">
+<a name="HB-TAG.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>c1</p></td>
+<td class="parameter_description"><p>1st character of the tag</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>c2</p></td>
+<td class="parameter_description"><p>2nd character of the tag</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>c3</p></td>
+<td class="parameter_description"><p>3rd character of the tag</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>c4</p></td>
+<td class="parameter_description"><p>4th character of the tag</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
 </div>
 <hr>
 <div class="refsect2">
 <a name="HB-UNTAG:CAPS"></a><h3>HB_UNTAG()</h3>
 <pre class="programlisting">#define HB_UNTAG(tag)   (uint8_t)(((tag)&gt;&gt;24)&amp;0xFF), (uint8_t)(((tag)&gt;&gt;16)&amp;0xFF), (uint8_t)(((tag)&gt;&gt;8)&amp;0xFF), (uint8_t)((tag)&amp;0xFF)
 </pre>
+<p>Extracts four character literals from an <a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a>.</p>
+<div class="refsect3">
+<a name="HB-UNTAG.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>tag</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-6-0.html#api-index-0.6.0">0.6.0</a></p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="HB-DIRECTION-REVERSE:CAPS"></a><h3>HB_DIRECTION_REVERSE()</h3>
 <pre class="programlisting">#define HB_DIRECTION_REVERSE(dir) ((hb_direction_t) (((unsigned int) (dir)) ^ 1))
 </pre>
+<p>Reverses a text direction. Requires that the direction
+be valid.</p>
+<div class="refsect3">
+<a name="HB-DIRECTION-REVERSE.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>dir</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="type">hb_direction_t</span></a> to reverse</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
 </div>
 <hr>
 <div class="refsect2">
 <a name="HB-DIRECTION-IS-BACKWARD:CAPS"></a><h3>HB_DIRECTION_IS_BACKWARD()</h3>
 <pre class="programlisting">#define HB_DIRECTION_IS_BACKWARD(dir) ((((unsigned int) (dir)) &amp; ~2U) == 5)
 </pre>
+<p>Tests whether a text direction moves backward (from right to left, or from
+bottom to top). Requires that the direction be valid.</p>
+<div class="refsect3">
+<a name="HB-DIRECTION-IS-BACKWARD.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>dir</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="type">hb_direction_t</span></a> to test</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
 </div>
 <hr>
 <div class="refsect2">
 <a name="HB-DIRECTION-IS-FORWARD:CAPS"></a><h3>HB_DIRECTION_IS_FORWARD()</h3>
 <pre class="programlisting">#define HB_DIRECTION_IS_FORWARD(dir) ((((unsigned int) (dir)) &amp; ~2U) == 4)
 </pre>
+<p>Tests whether a text direction moves forward (from left to right, or from
+top to bottom). Requires that the direction be valid.</p>
+<div class="refsect3">
+<a name="HB-DIRECTION-IS-FORWARD.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>dir</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="type">hb_direction_t</span></a> to test</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
 </div>
 <hr>
 <div class="refsect2">
 <a name="HB-DIRECTION-IS-HORIZONTAL:CAPS"></a><h3>HB_DIRECTION_IS_HORIZONTAL()</h3>
 <pre class="programlisting">#define HB_DIRECTION_IS_HORIZONTAL(dir) ((((unsigned int) (dir)) &amp; ~1U) == 4)
 </pre>
+<p>Tests whether a text direction is horizontal. Requires
+that the direction be valid.</p>
+<div class="refsect3">
+<a name="HB-DIRECTION-IS-HORIZONTAL.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>dir</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="type">hb_direction_t</span></a> to test</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
 </div>
 <hr>
 <div class="refsect2">
 <a name="HB-DIRECTION-IS-VALID:CAPS"></a><h3>HB_DIRECTION_IS_VALID()</h3>
 <pre class="programlisting">#define HB_DIRECTION_IS_VALID(dir) ((((unsigned int) (dir)) &amp; ~3U) == 4)
 </pre>
+<p>Tests whether a text direction is valid.</p>
+<div class="refsect3">
+<a name="HB-DIRECTION-IS-VALID.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>dir</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="type">hb_direction_t</span></a> to test</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
 </div>
 <hr>
 <div class="refsect2">
 <a name="HB-DIRECTION-IS-VERTICAL:CAPS"></a><h3>HB_DIRECTION_IS_VERTICAL()</h3>
 <pre class="programlisting">#define HB_DIRECTION_IS_VERTICAL(dir) ((((unsigned int) (dir)) &amp; ~1U) == 6)
 </pre>
+<p>Tests whether a text direction is vertical. Requires
+that the direction be valid.</p>
+<div class="refsect3">
+<a name="HB-DIRECTION-IS-VERTICAL.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>dir</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="type">hb_direction_t</span></a> to test</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
 </div>
 </div>
 <div class="refsect1">
@@ -880,16 +1202,24 @@ hb_variation_to_string (<em class="parameter"><code><a class="link" href="harfbu
 <a name="hb-bool-t"></a><h3>hb_bool_t</h3>
 <pre class="programlisting">typedef int hb_bool_t;
 </pre>
+<p>Data type for booleans.</p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="hb-codepoint-t"></a><h3>hb_codepoint_t</h3>
 <pre class="programlisting">typedef uint32_t hb_codepoint_t;
 </pre>
+<p>Data type for holding Unicode codepoints. Also
+used to hold glyph IDs.</p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="hb-direction-t"></a><h3>enum hb_direction_t</h3>
+<p>The direction of a text segment or buffer.</p>
+<p>A segment can also be tested for horizontal or vertical
+orientation (irrespective of specific direction) with
+
+<a class="link" href="harfbuzz-hb-common.html#HB-DIRECTION-IS-HORIZONTAL:CAPS" title="HB_DIRECTION_IS_HORIZONTAL()"><code class="function">HB_DIRECTION_IS_HORIZONTAL()</code></a> or <a class="link" href="harfbuzz-hb-common.html#HB-DIRECTION-IS-VERTICAL:CAPS" title="HB_DIRECTION_IS_VERTICAL()"><code class="function">HB_DIRECTION_IS_VERTICAL()</code></a>.</p>
 <div class="refsect3">
 <a name="hb-direction-t.members"></a><h4>Members</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -943,6 +1273,8 @@ hb_variation_to_string (<em class="parameter"><code><a class="link" href="harfbu
 <a name="hb-language-t"></a><h3>hb_language_t</h3>
 <pre class="programlisting">typedef const struct hb_language_impl_t *hb_language_t;
 </pre>
+<p>Data type for languages. Each <a class="link" href="harfbuzz-hb-common.html#hb-language-t" title="hb_language_t"><span class="type">hb_language_t</span></a> corresponds to a BCP 47
+language tag.</p>
 </div>
 <hr>
 <div class="refsect2">
@@ -959,9 +1291,7 @@ feature application. The feature will be applied with the given value to all
 glyphs which are in clusters between <em class="parameter"><code>start</code></em>
  (inclusive) and <em class="parameter"><code>end</code></em>
  (exclusive).
-Setting start to <em class="parameter"><code>HB_FEATURE_GLOBAL_START</code></em>
- and end to <em class="parameter"><code>HB_FEATURE_GLOBAL_END</code></em>
-
+Setting start to <a class="link" href="harfbuzz-hb-common.html#HB-FEATURE-GLOBAL-START:CAPS" title="HB_FEATURE_GLOBAL_START"><span class="type">HB_FEATURE_GLOBAL_START</span></a> and end to <a class="link" href="harfbuzz-hb-common.html#HB-FEATURE-GLOBAL-END:CAPS" title="HB_FEATURE_GLOBAL_END"><span class="type">HB_FEATURE_GLOBAL_END</span></a>
 specifies that the feature always applies to the entire buffer.</p>
 <div class="refsect3">
 <a name="hb-feature-t.members"></a><h4>Members</h4>
@@ -974,15 +1304,15 @@ specifies that the feature always applies to the entire buffer.</p>
 <tbody>
 <tr>
 <td class="struct_member_name"><p><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> <em class="structfield"><code><a name="hb-feature-t.tag"></a>tag</code></em>;</p></td>
-<td class="struct_member_description"><p>a feature tag</p></td>
+<td class="struct_member_description"><p>The <a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> tag of the feature</p></td>
 <td class="struct_member_annotations"> </td>
 </tr>
 <tr>
 <td class="struct_member_name"><p><span class="type">uint32_t</span> <em class="structfield"><code><a name="hb-feature-t.value"></a>value</code></em>;</p></td>
-<td class="struct_member_description"><p>0 disables the feature, non-zero (usually 1) enables the feature.
-For features implemented as lookup type 3 (like 'salt') the <em class="parameter"><code>value</code></em>
-is a one
-based index into the alternates.</p></td>
+<td class="struct_member_description"><p>The value of the feature. 0 disables the feature, non-zero (usually
+1) enables the feature.  For features implemented as lookup type 3 (like
+'salt') the <em class="parameter"><code>value</code></em>
+is a one based index into the alternates.</p></td>
 <td class="struct_member_annotations"> </td>
 </tr>
 <tr>
@@ -1007,29 +1337,66 @@ based index into the alternates.</p></td>
   float    value;
 } hb_variation_t;
 </pre>
-<p class="since">Since: <a class="link" href="api-index-1-4-2.html#api-index-1.4.2">1.4.2</a></p>
-</div>
-<hr>
-<div class="refsect2">
-<a name="hb-mask-t"></a><h3>hb_mask_t</h3>
-<pre class="programlisting">typedef uint32_t hb_mask_t;
-</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="hb-position-t"></a><h3>hb_position_t</h3>
-<pre class="programlisting">typedef int32_t hb_position_t;
-</pre>
-</div>
-<hr>
-<div class="refsect2">
+<p>Data type for holding variation data. Registered OpenType
+variation-axis tags are listed in
+<a class="ulink" href="https://docs.microsoft.com/en-us/typography/opentype/spec/dvaraxisreg" target="_top">OpenType Axis Tag Registry</a>.</p>
+<div class="refsect3">
+<a name="hb-variation-t.members"></a><h4>Members</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="300px" class="struct_members_name">
+<col class="struct_members_description">
+<col width="200px" class="struct_members_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="struct_member_name"><p><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> <em class="structfield"><code><a name="hb-variation-t.tag"></a>tag</code></em>;</p></td>
+<td class="struct_member_description"><p>The <a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> tag of the variation-axis name</p></td>
+<td class="struct_member_annotations"> </td>
+</tr>
+<tr>
+<td class="struct_member_name"><p><span class="type">float</span> <em class="structfield"><code><a name="hb-variation-t.value"></a>value</code></em>;</p></td>
+<td class="struct_member_description"><p>The value of the variation axis</p></td>
+<td class="struct_member_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-4-2.html#api-index-1.4.2">1.4.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-mask-t"></a><h3>hb_mask_t</h3>
+<pre class="programlisting">typedef uint32_t hb_mask_t;
+</pre>
+<p>Data type for bitmasks.</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-position-t"></a><h3>hb_position_t</h3>
+<pre class="programlisting">typedef int32_t hb_position_t;
+</pre>
+<p>Data type for holding a single coordinate value.
+Contour points and other multi-dimensional data are
+stored as tuples of <a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a>'s.</p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="hb-tag-t"></a><h3>hb_tag_t</h3>
 <pre class="programlisting">typedef uint32_t hb_tag_t;
 </pre>
+<p>Data type for tag identifiers. Tags are four
+byte integers, each byte representing a character.</p>
+<p>Tags are used to identify tables, design-variation axes,
+scripts, languages, font features, and baselines with
+human-readable names.</p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="hb-script-t"></a><h3>enum hb_script_t</h3>
+<p>Data type for scripts. Each <a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="type">hb_script_t</span></a>'s value is an <a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> corresponding
+to the four-letter values defined by <a class="ulink" href="https://unicode.org/iso15924/" target="_top">ISO 15924</a>.</p>
+<p>See also the Script (sc) property of the Unicode Character Database.</p>
 <div class="refsect3">
 <a name="hb-script-t.members"></a><h4>Members</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -1040,94 +1407,1203 @@ based index into the alternates.</p></td>
 </colgroup>
 <tbody>
 <tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-BASSA-VAH:CAPS"></a>HB_SCRIPT_BASSA_VAH</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-COMMON:CAPS"></a>HB_SCRIPT_COMMON</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Zyyy</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-ADLAM:CAPS"></a>HB_SCRIPT_ADLAM</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-INHERITED:CAPS"></a>HB_SCRIPT_INHERITED</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Zinh</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-MASARAM-GONDI:CAPS"></a>HB_SCRIPT_MASARAM_GONDI</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-UNKNOWN:CAPS"></a>HB_SCRIPT_UNKNOWN</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Zzzz</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-DOGRA:CAPS"></a>HB_SCRIPT_DOGRA</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-ARABIC:CAPS"></a>HB_SCRIPT_ARABIC</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Arab</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-ELYMAIC:CAPS"></a>HB_SCRIPT_ELYMAIC</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-ARMENIAN:CAPS"></a>HB_SCRIPT_ARMENIAN</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Armn</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-CHORASMIAN:CAPS"></a>HB_SCRIPT_CHORASMIAN</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-BENGALI:CAPS"></a>HB_SCRIPT_BENGALI</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Beng</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-INVALID:CAPS"></a>HB_SCRIPT_INVALID</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-CYRILLIC:CAPS"></a>HB_SCRIPT_CYRILLIC</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Cyrl</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-DEVANAGARI:CAPS"></a>HB_SCRIPT_DEVANAGARI</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Deva</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-MAX-VALUE:CAPS"></a>_HB_SCRIPT_MAX_VALUE</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-GEORGIAN:CAPS"></a>HB_SCRIPT_GEORGIAN</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Geor</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-MAX-VALUE-SIGNED:CAPS"></a>_HB_SCRIPT_MAX_VALUE_SIGNED</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-GREEK:CAPS"></a>HB_SCRIPT_GREEK</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Grek</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
-</tbody>
-</table></div>
-</div>
-</div>
-<hr>
-<div class="refsect2">
-<a name="hb-user-data-key-t"></a><h3>hb_user_data_key_t</h3>
-<pre class="programlisting">typedef struct {
-} hb_user_data_key_t;
-</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="hb-var-int-t"></a><h3>hb_var_int_t</h3>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-GUJARATI:CAPS"></a>HB_SCRIPT_GUJARATI</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Gujr</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-GURMUKHI:CAPS"></a>HB_SCRIPT_GURMUKHI</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Guru</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-HANGUL:CAPS"></a>HB_SCRIPT_HANGUL</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Hang</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-HAN:CAPS"></a>HB_SCRIPT_HAN</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Hani</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-HEBREW:CAPS"></a>HB_SCRIPT_HEBREW</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Hebr</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-HIRAGANA:CAPS"></a>HB_SCRIPT_HIRAGANA</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Hira</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-KANNADA:CAPS"></a>HB_SCRIPT_KANNADA</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Knda</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-KATAKANA:CAPS"></a>HB_SCRIPT_KATAKANA</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Kana</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-LAO:CAPS"></a>HB_SCRIPT_LAO</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Laoo</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-LATIN:CAPS"></a>HB_SCRIPT_LATIN</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Latn</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-MALAYALAM:CAPS"></a>HB_SCRIPT_MALAYALAM</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Mlym</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-ORIYA:CAPS"></a>HB_SCRIPT_ORIYA</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Orya</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-TAMIL:CAPS"></a>HB_SCRIPT_TAMIL</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Taml</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-TELUGU:CAPS"></a>HB_SCRIPT_TELUGU</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Telu</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-THAI:CAPS"></a>HB_SCRIPT_THAI</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Thai</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-TIBETAN:CAPS"></a>HB_SCRIPT_TIBETAN</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Tibt</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-BOPOMOFO:CAPS"></a>HB_SCRIPT_BOPOMOFO</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Bopo</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-BRAILLE:CAPS"></a>HB_SCRIPT_BRAILLE</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Brai</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-CANADIAN-SYLLABICS:CAPS"></a>HB_SCRIPT_CANADIAN_SYLLABICS</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Cans</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-CHEROKEE:CAPS"></a>HB_SCRIPT_CHEROKEE</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Cher</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-ETHIOPIC:CAPS"></a>HB_SCRIPT_ETHIOPIC</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Ethi</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-KHMER:CAPS"></a>HB_SCRIPT_KHMER</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Khmr</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-MONGOLIAN:CAPS"></a>HB_SCRIPT_MONGOLIAN</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Mong</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-MYANMAR:CAPS"></a>HB_SCRIPT_MYANMAR</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Mymr</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-OGHAM:CAPS"></a>HB_SCRIPT_OGHAM</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Ogam</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-RUNIC:CAPS"></a>HB_SCRIPT_RUNIC</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Runr</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-SINHALA:CAPS"></a>HB_SCRIPT_SINHALA</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Sinh</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-SYRIAC:CAPS"></a>HB_SCRIPT_SYRIAC</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Syrc</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-THAANA:CAPS"></a>HB_SCRIPT_THAANA</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Thaa</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-YI:CAPS"></a>HB_SCRIPT_YI</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Yiii</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-DESERET:CAPS"></a>HB_SCRIPT_DESERET</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Dsrt</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-GOTHIC:CAPS"></a>HB_SCRIPT_GOTHIC</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Goth</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-OLD-ITALIC:CAPS"></a>HB_SCRIPT_OLD_ITALIC</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Ital</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-BUHID:CAPS"></a>HB_SCRIPT_BUHID</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Buhd</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-HANUNOO:CAPS"></a>HB_SCRIPT_HANUNOO</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Hano</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-TAGALOG:CAPS"></a>HB_SCRIPT_TAGALOG</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Tglg</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-TAGBANWA:CAPS"></a>HB_SCRIPT_TAGBANWA</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Tagb</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-CYPRIOT:CAPS"></a>HB_SCRIPT_CYPRIOT</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Cprt</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-LIMBU:CAPS"></a>HB_SCRIPT_LIMBU</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Limb</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-LINEAR-B:CAPS"></a>HB_SCRIPT_LINEAR_B</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Linb</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-OSMANYA:CAPS"></a>HB_SCRIPT_OSMANYA</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Osma</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-SHAVIAN:CAPS"></a>HB_SCRIPT_SHAVIAN</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Shaw</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-TAI-LE:CAPS"></a>HB_SCRIPT_TAI_LE</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Tale</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-UGARITIC:CAPS"></a>HB_SCRIPT_UGARITIC</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Ugar</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-BUGINESE:CAPS"></a>HB_SCRIPT_BUGINESE</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Bugi</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-COPTIC:CAPS"></a>HB_SCRIPT_COPTIC</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Copt</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-GLAGOLITIC:CAPS"></a>HB_SCRIPT_GLAGOLITIC</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Glag</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-KHAROSHTHI:CAPS"></a>HB_SCRIPT_KHAROSHTHI</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Khar</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-NEW-TAI-LUE:CAPS"></a>HB_SCRIPT_NEW_TAI_LUE</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Talu</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-OLD-PERSIAN:CAPS"></a>HB_SCRIPT_OLD_PERSIAN</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Xpeo</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-SYLOTI-NAGRI:CAPS"></a>HB_SCRIPT_SYLOTI_NAGRI</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Sylo</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-TIFINAGH:CAPS"></a>HB_SCRIPT_TIFINAGH</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Tfng</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-BALINESE:CAPS"></a>HB_SCRIPT_BALINESE</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Bali</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-CUNEIFORM:CAPS"></a>HB_SCRIPT_CUNEIFORM</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Xsux</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-NKO:CAPS"></a>HB_SCRIPT_NKO</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Nkoo</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-PHAGS-PA:CAPS"></a>HB_SCRIPT_PHAGS_PA</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Phag</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-PHOENICIAN:CAPS"></a>HB_SCRIPT_PHOENICIAN</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Phnx</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-CARIAN:CAPS"></a>HB_SCRIPT_CARIAN</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Cari</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-CHAM:CAPS"></a>HB_SCRIPT_CHAM</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Cham</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-KAYAH-LI:CAPS"></a>HB_SCRIPT_KAYAH_LI</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Kali</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-LEPCHA:CAPS"></a>HB_SCRIPT_LEPCHA</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Lepc</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-LYCIAN:CAPS"></a>HB_SCRIPT_LYCIAN</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Lyci</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-LYDIAN:CAPS"></a>HB_SCRIPT_LYDIAN</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Lydi</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-OL-CHIKI:CAPS"></a>HB_SCRIPT_OL_CHIKI</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Olck</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-REJANG:CAPS"></a>HB_SCRIPT_REJANG</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Rjng</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-SAURASHTRA:CAPS"></a>HB_SCRIPT_SAURASHTRA</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Saur</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-SUNDANESE:CAPS"></a>HB_SCRIPT_SUNDANESE</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Sund</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-VAI:CAPS"></a>HB_SCRIPT_VAI</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Vaii</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-AVESTAN:CAPS"></a>HB_SCRIPT_AVESTAN</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Avst</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-BAMUM:CAPS"></a>HB_SCRIPT_BAMUM</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Bamu</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-EGYPTIAN-HIEROGLYPHS:CAPS"></a>HB_SCRIPT_EGYPTIAN_HIEROGLYPHS</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Egyp</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-IMPERIAL-ARAMAIC:CAPS"></a>HB_SCRIPT_IMPERIAL_ARAMAIC</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Armi</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-INSCRIPTIONAL-PAHLAVI:CAPS"></a>HB_SCRIPT_INSCRIPTIONAL_PAHLAVI</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Phli</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-INSCRIPTIONAL-PARTHIAN:CAPS"></a>HB_SCRIPT_INSCRIPTIONAL_PARTHIAN</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Prti</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-JAVANESE:CAPS"></a>HB_SCRIPT_JAVANESE</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Java</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-KAITHI:CAPS"></a>HB_SCRIPT_KAITHI</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Kthi</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-LISU:CAPS"></a>HB_SCRIPT_LISU</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Lisu</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-MEETEI-MAYEK:CAPS"></a>HB_SCRIPT_MEETEI_MAYEK</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Mtei</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-OLD-SOUTH-ARABIAN:CAPS"></a>HB_SCRIPT_OLD_SOUTH_ARABIAN</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Sarb</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-OLD-TURKIC:CAPS"></a>HB_SCRIPT_OLD_TURKIC</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Orkh</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-SAMARITAN:CAPS"></a>HB_SCRIPT_SAMARITAN</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Samr</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-TAI-THAM:CAPS"></a>HB_SCRIPT_TAI_THAM</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Lana</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-TAI-VIET:CAPS"></a>HB_SCRIPT_TAI_VIET</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Tavt</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-BATAK:CAPS"></a>HB_SCRIPT_BATAK</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Batk</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-BRAHMI:CAPS"></a>HB_SCRIPT_BRAHMI</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Brah</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-MANDAIC:CAPS"></a>HB_SCRIPT_MANDAIC</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Mand</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-CHAKMA:CAPS"></a>HB_SCRIPT_CHAKMA</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Cakm</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-MEROITIC-CURSIVE:CAPS"></a>HB_SCRIPT_MEROITIC_CURSIVE</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Merc</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-MEROITIC-HIEROGLYPHS:CAPS"></a>HB_SCRIPT_MEROITIC_HIEROGLYPHS</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Mero</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-MIAO:CAPS"></a>HB_SCRIPT_MIAO</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Plrd</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-SHARADA:CAPS"></a>HB_SCRIPT_SHARADA</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Shrd</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-SORA-SOMPENG:CAPS"></a>HB_SCRIPT_SORA_SOMPENG</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Sora</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-TAKRI:CAPS"></a>HB_SCRIPT_TAKRI</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Takr</code></p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-BASSA-VAH:CAPS"></a>HB_SCRIPT_BASSA_VAH</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Bass</code>, Since: 0.9.30</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-CAUCASIAN-ALBANIAN:CAPS"></a>HB_SCRIPT_CAUCASIAN_ALBANIAN</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Aghb</code>, Since: 0.9.30</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-DUPLOYAN:CAPS"></a>HB_SCRIPT_DUPLOYAN</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Dupl</code>, Since: 0.9.30</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-ELBASAN:CAPS"></a>HB_SCRIPT_ELBASAN</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Elba</code>, Since: 0.9.30</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-GRANTHA:CAPS"></a>HB_SCRIPT_GRANTHA</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Gran</code>, Since: 0.9.30</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-KHOJKI:CAPS"></a>HB_SCRIPT_KHOJKI</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Khoj</code>, Since: 0.9.30</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-KHUDAWADI:CAPS"></a>HB_SCRIPT_KHUDAWADI</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Sind</code>, Since: 0.9.30</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-LINEAR-A:CAPS"></a>HB_SCRIPT_LINEAR_A</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Lina</code>, Since: 0.9.30</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-MAHAJANI:CAPS"></a>HB_SCRIPT_MAHAJANI</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Mahj</code>, Since: 0.9.30</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-MANICHAEAN:CAPS"></a>HB_SCRIPT_MANICHAEAN</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Mani</code>, Since: 0.9.30</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-MENDE-KIKAKUI:CAPS"></a>HB_SCRIPT_MENDE_KIKAKUI</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Mend</code>, Since: 0.9.30</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-MODI:CAPS"></a>HB_SCRIPT_MODI</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Modi</code>, Since: 0.9.30</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-MRO:CAPS"></a>HB_SCRIPT_MRO</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Mroo</code>, Since: 0.9.30</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-NABATAEAN:CAPS"></a>HB_SCRIPT_NABATAEAN</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Nbat</code>, Since: 0.9.30</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-OLD-NORTH-ARABIAN:CAPS"></a>HB_SCRIPT_OLD_NORTH_ARABIAN</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Narb</code>, Since: 0.9.30</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-OLD-PERMIC:CAPS"></a>HB_SCRIPT_OLD_PERMIC</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Perm</code>, Since: 0.9.30</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-PAHAWH-HMONG:CAPS"></a>HB_SCRIPT_PAHAWH_HMONG</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Hmng</code>, Since: 0.9.30</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-PALMYRENE:CAPS"></a>HB_SCRIPT_PALMYRENE</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Palm</code>, Since: 0.9.30</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-PAU-CIN-HAU:CAPS"></a>HB_SCRIPT_PAU_CIN_HAU</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Pauc</code>, Since: 0.9.30</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-PSALTER-PAHLAVI:CAPS"></a>HB_SCRIPT_PSALTER_PAHLAVI</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Phlp</code>, Since: 0.9.30</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-SIDDHAM:CAPS"></a>HB_SCRIPT_SIDDHAM</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Sidd</code>, Since: 0.9.30</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-TIRHUTA:CAPS"></a>HB_SCRIPT_TIRHUTA</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Tirh</code>, Since: 0.9.30</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-WARANG-CITI:CAPS"></a>HB_SCRIPT_WARANG_CITI</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Wara</code>, Since: 0.9.30</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-AHOM:CAPS"></a>HB_SCRIPT_AHOM</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Ahom</code>, Since: 0.9.30</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-ANATOLIAN-HIEROGLYPHS:CAPS"></a>HB_SCRIPT_ANATOLIAN_HIEROGLYPHS</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Hluw</code>, Since: 0.9.30</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-HATRAN:CAPS"></a>HB_SCRIPT_HATRAN</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Hatr</code>, Since: 0.9.30</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-MULTANI:CAPS"></a>HB_SCRIPT_MULTANI</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Mult</code>, Since: 0.9.30</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-OLD-HUNGARIAN:CAPS"></a>HB_SCRIPT_OLD_HUNGARIAN</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Hung</code>, Since: 0.9.30</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-SIGNWRITING:CAPS"></a>HB_SCRIPT_SIGNWRITING</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Sgnw</code>, Since: 0.9.30</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-ADLAM:CAPS"></a>HB_SCRIPT_ADLAM</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Adlm</code>, Since: 1.3.0</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-BHAIKSUKI:CAPS"></a>HB_SCRIPT_BHAIKSUKI</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Bhks</code>, Since: 1.3.0</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-MARCHEN:CAPS"></a>HB_SCRIPT_MARCHEN</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Marc</code>, Since: 1.3.0</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-OSAGE:CAPS"></a>HB_SCRIPT_OSAGE</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Osge</code>, Since: 1.3.0</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-TANGUT:CAPS"></a>HB_SCRIPT_TANGUT</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Tang</code>, Since: 1.3.0</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-NEWA:CAPS"></a>HB_SCRIPT_NEWA</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Newa</code>, Since: 1.3.0</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-MASARAM-GONDI:CAPS"></a>HB_SCRIPT_MASARAM_GONDI</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Gonm</code>, Since: 1.6.0</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-NUSHU:CAPS"></a>HB_SCRIPT_NUSHU</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Nshu</code>, Since: 1.6.0</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-SOYOMBO:CAPS"></a>HB_SCRIPT_SOYOMBO</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Soyo</code>, Since: 1.6.0</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-ZANABAZAR-SQUARE:CAPS"></a>HB_SCRIPT_ZANABAZAR_SQUARE</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Zanb</code>, Since: 1.6.0</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-DOGRA:CAPS"></a>HB_SCRIPT_DOGRA</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Dogr</code>, Since: 1.8.0</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-GUNJALA-GONDI:CAPS"></a>HB_SCRIPT_GUNJALA_GONDI</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Gong</code>, Since: 1.8.0</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-HANIFI-ROHINGYA:CAPS"></a>HB_SCRIPT_HANIFI_ROHINGYA</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Rohg</code>, Since: 1.8.0</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-MAKASAR:CAPS"></a>HB_SCRIPT_MAKASAR</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Maka</code>, Since: 1.8.0</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-MEDEFAIDRIN:CAPS"></a>HB_SCRIPT_MEDEFAIDRIN</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Medf</code>, Since: 1.8.0</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-OLD-SOGDIAN:CAPS"></a>HB_SCRIPT_OLD_SOGDIAN</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Sogo</code>, Since: 1.8.0</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-SOGDIAN:CAPS"></a>HB_SCRIPT_SOGDIAN</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Sogd</code>, Since: 1.8.0</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-ELYMAIC:CAPS"></a>HB_SCRIPT_ELYMAIC</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Elym</code>, Since: 2.4.0</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-NANDINAGARI:CAPS"></a>HB_SCRIPT_NANDINAGARI</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Nand</code>, Since: 2.4.0</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-NYIAKENG-PUACHUE-HMONG:CAPS"></a>HB_SCRIPT_NYIAKENG_PUACHUE_HMONG</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Hmnp</code>, Since: 2.4.0</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-WANCHO:CAPS"></a>HB_SCRIPT_WANCHO</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Wcho</code>, Since: 2.4.0</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-CHORASMIAN:CAPS"></a>HB_SCRIPT_CHORASMIAN</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Chrs</code>, Since: 2.6.7</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-DIVES-AKURU:CAPS"></a>HB_SCRIPT_DIVES_AKURU</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Diak</code>, Since: 2.6.7</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-KHITAN-SMALL-SCRIPT:CAPS"></a>HB_SCRIPT_KHITAN_SMALL_SCRIPT</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Kits</code>, Since: 2.6.7</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-YEZIDI:CAPS"></a>HB_SCRIPT_YEZIDI</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Yezi</code>, Since: 2.6.7</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-CYPRO-MINOAN:CAPS"></a>HB_SCRIPT_CYPRO_MINOAN</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Cpmn</code>, Since: 3.0.0</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-OLD-UYGHUR:CAPS"></a>HB_SCRIPT_OLD_UYGHUR</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Ougr</code>, Since: 3.0.0</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-TANGSA:CAPS"></a>HB_SCRIPT_TANGSA</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Tnsa</code>, Since: 3.0.0</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-TOTO:CAPS"></a>HB_SCRIPT_TOTO</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Toto</code>, Since: 3.0.0</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-VITHKUQI:CAPS"></a>HB_SCRIPT_VITHKUQI</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Vith</code>, Since: 3.0.0</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-MATH:CAPS"></a>HB_SCRIPT_MATH</p></td>
+<td class="enum_member_description">
+<p><code class="literal">Zmth</code>, Since: 3.4.0</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-INVALID:CAPS"></a>HB_SCRIPT_INVALID</p></td>
+<td class="enum_member_description">
+<p>No script set</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-user-data-key-t"></a><h3>hb_user_data_key_t</h3>
+<pre class="programlisting">typedef struct {
+} hb_user_data_key_t;
+</pre>
+<p>Data structure for holding user-data keys.</p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="HB-TAG-NONE:CAPS"></a><h3>HB_TAG_NONE</h3>
 <pre class="programlisting">#define HB_TAG_NONE HB_TAG(0,0,0,0)
 </pre>
+<p>Unset <a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a>.</p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="HB-TAG-MAX:CAPS"></a><h3>HB_TAG_MAX</h3>
 <pre class="programlisting">#define HB_TAG_MAX HB_TAG(0xff,0xff,0xff,0xff)
 </pre>
+<p>Maximum possible unsigned <a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a>.</p>
+<p class="since">Since: <a class="link" href="api-index-0-9-26.html#api-index-0.9.26">0.9.26</a></p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="HB-TAG-MAX-SIGNED:CAPS"></a><h3>HB_TAG_MAX_SIGNED</h3>
 <pre class="programlisting">#define HB_TAG_MAX_SIGNED HB_TAG(0x7f,0xff,0xff,0xff)
 </pre>
+<p>Maximum possible signed <a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a>.</p>
+<p class="since">Since: <a class="link" href="api-index-0-9-33.html#api-index-0.9.33">0.9.33</a></p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="HB-LANGUAGE-INVALID:CAPS"></a><h3>HB_LANGUAGE_INVALID</h3>
 <pre class="programlisting">#define HB_LANGUAGE_INVALID ((hb_language_t) 0)
 </pre>
+<p>An unset <a class="link" href="harfbuzz-hb-common.html#hb-language-t" title="hb_language_t"><span class="type">hb_language_t</span></a>.</p>
+<p class="since">Since: <a class="link" href="api-index-0-6-0.html#api-index-0.6.0">0.6.0</a></p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="HB-FEATURE-GLOBAL-END:CAPS"></a><h3>HB_FEATURE_GLOBAL_END</h3>
 <pre class="programlisting">#define HB_FEATURE_GLOBAL_END ((unsigned int) -1)
 </pre>
+<p>Special setting for <a class="link" href="harfbuzz-hb-common.html#hb-feature-t.end"><span class="type">hb_feature_t.end</span></a> to apply the feature from to the end
+of the buffer.</p>
 <p class="since">Since: <a class="link" href="api-index-2-0-0.html#api-index-2.0.0">2.0.0</a></p>
 </div>
 <hr>
@@ -1135,11 +2611,13 @@ based index into the alternates.</p></td>
 <a name="HB-FEATURE-GLOBAL-START:CAPS"></a><h3>HB_FEATURE_GLOBAL_START</h3>
 <pre class="programlisting">#define HB_FEATURE_GLOBAL_START 0
 </pre>
+<p>Special setting for <a class="link" href="harfbuzz-hb-common.html#hb-feature-t.start"><span class="type">hb_feature_t.start</span></a> to apply the feature from the start
+of the buffer.</p>
 <p class="since">Since: <a class="link" href="api-index-2-0-0.html#api-index-2.0.0">2.0.0</a></p>
 </div>
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index 5554484..f30de41 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-coretext: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch15.html" title="Integration API">
-<link rel="prev" href="ch15.html" title="Integration API">
+<link rel="up" href="integration-api.html" title="Integration API">
+<link rel="prev" href="integration-api.html" title="Integration API">
 <link rel="next" href="harfbuzz-hb-ft.html" title="hb-ft">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -18,8 +18,8 @@
                   <a href="#harfbuzz-hb-coretext.description" class="shortcut">Description</a></span>
 </td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><a accesskey="u" href="ch15.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
-<td><a accesskey="p" href="ch15.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="integration-api.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="integration-api.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
 <td><a accesskey="n" href="harfbuzz-hb-ft.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <div class="refentry">
@@ -161,7 +161,7 @@ CTFontRef.</p>
 <a name="hb-coretext-font-create.returns"></a><h4>Returns</h4>
 <p> the new <a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> font object</p>
 </div>
-<p class="since">Since: 1.7.2</p>
+<p class="since">Since: <a class="link" href="api-index-1-7-2.html#api-index-1.7.2">1.7.2</a></p>
 </div>
 <hr>
 <div class="refsect2">
@@ -196,6 +196,28 @@ face object</p>
 <a name="hb-coretext-font-get-ct-font"></a><h3>hb_coretext_font_get_ct_font ()</h3>
 <pre class="programlisting"><span class="returnvalue">CTFontRef</span>
 hb_coretext_font_get_ct_font (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
+<p>Fetches the CTFontRef associated with the specified
+<a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> font object.</p>
+<div class="refsect3">
+<a name="hb-coretext-font-get-ct-font.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-coretext-font-get-ct-font.returns"></a><h4>Returns</h4>
+<p> the CTFontRef found</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-10.html#api-index-0.9.10">0.9.10</a></p>
 </div>
 </div>
 <div class="refsect1">
@@ -234,6 +256,6 @@ https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6morx.html<
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index f15cda5..2564146 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-deprecated: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch12.html" title="Core API">
+<link rel="up" href="core-api.html" title="Core API">
 <link rel="prev" href="harfbuzz-hb-common.html" title="hb-common">
 <link rel="next" href="harfbuzz-hb-face.html" title="hb-face">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -18,7 +18,7 @@
                   <a href="#harfbuzz-hb-deprecated.description" class="shortcut">Description</a></span>
 </td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><a accesskey="u" href="ch12.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="u" href="core-api.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
 <td><a accesskey="p" href="harfbuzz-hb-common.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
 <td><a accesskey="n" href="harfbuzz-hb-face.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <td class="function_type">unsigned <span class="returnvalue">int</span>
 </td>
 <td class="function_name">
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-unicode-eastasian-width" title="hb_unicode_eastasian_width ()">hb_unicode_eastasian_width</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-unicode-funcs-set-eastasian-width-func" title="hb_unicode_funcs_set_eastasian_width_func ()">hb_unicode_funcs_set_eastasian_width_func</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">unsigned <span class="returnvalue">int</span>
+</td>
+<td class="function_name">
 <span class="c_punctuation">(</span><a class="link" href="harfbuzz-hb-deprecated.html#hb-unicode-decompose-compatibility-func-t" title="hb_unicode_decompose_compatibility_func_t ()">*hb_unicode_decompose_compatibility_func_t</a><span class="c_punctuation">)</span> <span class="c_punctuation">()</span>
 </td>
 </tr>
 <tr>
+<td class="function_type">unsigned <span class="returnvalue">int</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-unicode-decompose-compatibility" title="hb_unicode_decompose_compatibility ()">hb_unicode_decompose_compatibility</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-unicode-funcs-set-decompose-compatibility-func" title="hb_unicode_funcs_set_decompose_compatibility_func ()">hb_unicode_funcs_set_decompose_compatibility_func</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
 <td class="function_type">
 <span class="returnvalue">void</span>
 </td>
 </tr>
 <tr>
 <td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-deprecated.html#HB-OT-MATH-SCRIPT:CAPS" title="HB_OT_MATH_SCRIPT">HB_OT_MATH_SCRIPT</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
 <td class="function_name"><a class="link" href="harfbuzz-hb-deprecated.html#HB-OT-VAR-NO-AXIS-INDEX:CAPS" title="HB_OT_VAR_NO_AXIS_INDEX">HB_OT_VAR_NO_AXIS_INDEX</a></td>
 </tr>
 <tr>
+<td class="datatype_keyword"> </td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-deprecated.html#hb-ot-var-axis-t" title="hb_ot_var_axis_t">hb_ot_var_axis_t</a></td>
+</tr>
+<tr>
 <td class="define_keyword">#define</td>
 <td class="function_name"><a class="link" href="harfbuzz-hb-deprecated.html#HB-UNICODE-MAX-DECOMPOSITION-LEN:CAPS" title="HB_UNICODE_MAX_DECOMPOSITION_LEN">HB_UNICODE_MAX_DECOMPOSITION_LEN</a></td>
 </tr>
@@ -148,7 +186,57 @@ were deemed unnecessary.</p>
                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> variation_selector</code></em>,
                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *glyph</code></em>,
                              <em class="parameter"><code><span class="type">void</span> *user_data</code></em>);</pre>
-<div class="warning"><p><code class="literal">hb_font_get_glyph_func_t</code> is deprecated and should not be used in newly-written code.</p></div>
+<div class="warning"><p><code class="literal">hb_font_get_glyph_func_t</code> has been deprecated since version 1.2.3 and should not be used in newly-written code.</p></div>
+<p>A virtual method for the <a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t" title="hb_font_funcs_t"><span class="type">hb_font_funcs_t</span></a> of an <a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> object.</p>
+<p>This method should retrieve the glyph ID for a specified Unicode code point
+font, with an optional variation selector.</p>
+<div class="refsect3">
+<a name="hb-font-get-glyph-func-t.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>font_data</p></td>
+<td class="parameter_description"><p><em class="parameter"><code>font</code></em>
+user data pointer</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>unicode</p></td>
+<td class="parameter_description"><p>The Unicode code point to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>variation_selector</p></td>
+<td class="parameter_description"><p>The  variation-selector code point to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>glyph</p></td>
+<td class="parameter_description"><p>The glyph ID retrieved. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>User data pointer passed by the caller</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-font-get-glyph-func-t.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> if data found, <code class="literal">false</code> otherwise</p>
+</div>
 </div>
 <hr>
 <div class="refsect2">
@@ -176,7 +264,7 @@ or GPOS table.</p>
 </tr>
 <tr>
 <td class="parameter_name"><p>table_tag</p></td>
-<td class="parameter_description"><p>HB_OT_TAG_GSUB or HB_OT_TAG_GPOS</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-TAG-GSUB:CAPS" title="HB_OT_TAG_GSUB"><span class="type">HB_OT_TAG_GSUB</span></a> or <a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-TAG-GPOS:CAPS" title="HB_OT_TAG_GPOS"><span class="type">HB_OT_TAG_GPOS</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
@@ -194,7 +282,7 @@ or GPOS table.</p>
 </div>
 <div class="refsect3">
 <a name="hb-ot-layout-table-find-script.returns"></a><h4>Returns</h4>
-<p> true if the script is found, false otherwise</p>
+<p> <code class="literal">true</code> if the script is found, <code class="literal">false</code> otherwise</p>
 </div>
 </div>
 <hr>
@@ -205,6 +293,113 @@ or GPOS table.</p>
                                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> unicode</code></em>,
                                       <em class="parameter"><code><span class="type">void</span> *user_data</code></em>);</pre>
 <div class="warning"><p><code class="literal">hb_unicode_eastasian_width_func_t</code> has been deprecated since version 2.0.0 and should not be used in newly-written code.</p></div>
+<p>A virtual method for the <a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t" title="hb_unicode_funcs_t"><span class="type">hb_unicode_funcs_t</span></a> structure.</p>
+<div class="refsect3">
+<a name="hb-unicode-eastasian-width-func-t.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>ufuncs</p></td>
+<td class="parameter_description"><p>A Unicode-functions structure</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>unicode</p></td>
+<td class="parameter_description"><p>The code point to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>User data pointer passed by the caller</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-unicode-eastasian-width"></a><h3>hb_unicode_eastasian_width ()</h3>
+<pre class="programlisting">unsigned <span class="returnvalue">int</span>
+hb_unicode_eastasian_width (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t" title="hb_unicode_funcs_t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>,
+                            <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> unicode</code></em>);</pre>
+<div class="warning"><p><code class="literal">hb_unicode_eastasian_width</code> has been deprecated since version 2.0.0 and should not be used in newly-written code.</p></div>
+<p>Don't use. Not used by HarfBuzz.</p>
+<div class="refsect3">
+<a name="hb-unicode-eastasian-width.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>ufuncs</p></td>
+<td class="parameter_description"><p>a Unicode-function structure</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>unicode</p></td>
+<td class="parameter_description"><p>The code point to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-unicode-funcs-set-eastasian-width-func"></a><h3>hb_unicode_funcs_set_eastasian_width_func ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_unicode_funcs_set_eastasian_width_func
+                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t" title="hb_unicode_funcs_t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-deprecated.html#hb-unicode-eastasian-width-func-t" title="hb_unicode_eastasian_width_func_t ()"><span class="type">hb_unicode_eastasian_width_func_t</span></a> func</code></em>,
+                                <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<div class="warning"><p><code class="literal">hb_unicode_funcs_set_eastasian_width_func</code> has been deprecated since version 2.0.0 and should not be used in newly-written code.</p></div>
+<p>Sets the implementation function for <a class="link" href="harfbuzz-hb-deprecated.html#hb-unicode-eastasian-width-func-t" title="hb_unicode_eastasian_width_func_t ()"><span class="type">hb_unicode_eastasian_width_func_t</span></a>.</p>
+<div class="refsect3">
+<a name="hb-unicode-funcs-set-eastasian-width-func.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>ufuncs</p></td>
+<td class="parameter_description"><p>a Unicode-function structure</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>func</p></td>
+<td class="parameter_description"><p>The callback function to assign. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> user_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>Data to pass to <em class="parameter"><code>func</code></em>
+</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>destroy</p></td>
+<td class="parameter_description"><p>The function to call when <em class="parameter"><code>user_data</code></em>
+is not needed anymore. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
 <hr>
 <div class="refsect2">
@@ -222,7 +417,7 @@ or GPOS table.</p>
 The complete length of the decomposition will be returned.</p>
 <p>If <em class="parameter"><code>u</code></em>
  has no compatibility decomposition, zero should be returned.</p>
-<p>The Unicode standard guarantees that a buffer of length <a class="link" href="harfbuzz-hb-deprecated.html#HB-UNICODE-MAX-DECOMPOSITION-LEN:CAPS" title="HB_UNICODE_MAX_DECOMPOSITION_LEN"><code class="literal">HB_UNICODE_MAX_DECOMPOSITION_LEN</code></a> codepoints will always be sufficient for any
+<p>The Unicode standard guarantees that a buffer of length <a class="link" href="harfbuzz-hb-deprecated.html#HB-UNICODE-MAX-DECOMPOSITION-LEN:CAPS" title="HB_UNICODE_MAX_DECOMPOSITION_LEN"><span class="type">HB_UNICODE_MAX_DECOMPOSITION_LEN</span></a> codepoints will always be sufficient for any
 compatibility decomposition plus an terminating value of 0.  Consequently, <em class="parameter"><code>decompose</code></em>
  must be allocated by the caller to be at least this length.  Implementations
 of this function type must ensure that they do not write past the provided array.</p>
@@ -247,12 +442,12 @@ of this function type must ensure that they do not write past the provided array
 </tr>
 <tr>
 <td class="parameter_name"><p>decomposed</p></td>
-<td class="parameter_description"><p>address of codepoint array (of length <a class="link" href="harfbuzz-hb-deprecated.html#HB-UNICODE-MAX-DECOMPOSITION-LEN:CAPS" title="HB_UNICODE_MAX_DECOMPOSITION_LEN"><code class="literal">HB_UNICODE_MAX_DECOMPOSITION_LEN</code></a>) to write decomposition into</p></td>
+<td class="parameter_description"><p>address of codepoint array (of length <a class="link" href="harfbuzz-hb-deprecated.html#HB-UNICODE-MAX-DECOMPOSITION-LEN:CAPS" title="HB_UNICODE_MAX_DECOMPOSITION_LEN"><span class="type">HB_UNICODE_MAX_DECOMPOSITION_LEN</span></a>) to write decomposition into</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>user_data</p></td>
-<td class="parameter_description"><p>user data pointer as passed to <code class="function">hb_unicode_funcs_set_decompose_compatibility_func()</code></p></td>
+<td class="parameter_description"><p>user data pointer as passed to <a class="link" href="harfbuzz-hb-deprecated.html#hb-unicode-funcs-set-decompose-compatibility-func" title="hb_unicode_funcs_set_decompose_compatibility_func ()"><code class="function">hb_unicode_funcs_set_decompose_compatibility_func()</code></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 </tbody>
@@ -266,6 +461,98 @@ of this function type must ensure that they do not write past the provided array
 </div>
 <hr>
 <div class="refsect2">
+<a name="hb-unicode-decompose-compatibility"></a><h3>hb_unicode_decompose_compatibility ()</h3>
+<pre class="programlisting">unsigned <span class="returnvalue">int</span>
+hb_unicode_decompose_compatibility (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t" title="hb_unicode_funcs_t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>,
+                                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> u</code></em>,
+                                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *decomposed</code></em>);</pre>
+<div class="warning"><p><code class="literal">hb_unicode_decompose_compatibility</code> has been deprecated since version 2.0.0 and should not be used in newly-written code.</p></div>
+<p>Fetches the compatibility decomposition of a Unicode
+code point. Deprecated.</p>
+<div class="refsect3">
+<a name="hb-unicode-decompose-compatibility.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>ufuncs</p></td>
+<td class="parameter_description"><p>The Unicode-functions structure</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>u</p></td>
+<td class="parameter_description"><p>Code point to decompose</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>decomposed</p></td>
+<td class="parameter_description"><p>Compatibility decomposition of <em class="parameter"><code>u</code></em>
+. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-unicode-decompose-compatibility.returns"></a><h4>Returns</h4>
+<p> length of <em class="parameter"><code>decomposed</code></em>
+.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-unicode-funcs-set-decompose-compatibility-func"></a><h3>hb_unicode_funcs_set_decompose_compatibility_func ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_unicode_funcs_set_decompose_compatibility_func
+                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t" title="hb_unicode_funcs_t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-deprecated.html#hb-unicode-decompose-compatibility-func-t" title="hb_unicode_decompose_compatibility_func_t ()"><span class="type">hb_unicode_decompose_compatibility_func_t</span></a> func</code></em>,
+                                <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<div class="warning"><p><code class="literal">hb_unicode_funcs_set_decompose_compatibility_func</code> has been deprecated since version 2.0.0 and should not be used in newly-written code.</p></div>
+<p>Sets the implementation function for <a class="link" href="harfbuzz-hb-deprecated.html#hb-unicode-decompose-compatibility-func-t" title="hb_unicode_decompose_compatibility_func_t ()"><span class="type">hb_unicode_decompose_compatibility_func_t</span></a>.</p>
+<div class="refsect3">
+<a name="hb-unicode-funcs-set-decompose-compatibility-func.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>ufuncs</p></td>
+<td class="parameter_description"><p>A Unicode-functions structure</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>func</p></td>
+<td class="parameter_description"><p>The callback function to assign. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> user_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>Data to pass to <em class="parameter"><code>func</code></em>
+</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>destroy</p></td>
+<td class="parameter_description"><p>The function to call when <em class="parameter"><code>user_data</code></em>
+is not needed anymore. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="hb-font-funcs-set-glyph-v-kerning-func"></a><h3>hb_font_funcs_set_glyph_v_kerning_func ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_font_funcs_set_glyph_v_kerning_func
@@ -274,6 +561,7 @@ hb_font_funcs_set_glyph_v_kerning_func
                                 <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
 <div class="warning"><p><code class="literal">hb_font_funcs_set_glyph_v_kerning_func</code> has been deprecated since version 2.0.0 and should not be used in newly-written code.</p></div>
+<p>Sets the implementation function for <a class="link" href="harfbuzz-hb-deprecated.html#hb-font-get-glyph-v-kerning-func-t" title="hb_font_get_glyph_v_kerning_func_t"><span class="type">hb_font_get_glyph_v_kerning_func_t</span></a>.</p>
 <div class="refsect3">
 <a name="hb-font-funcs-set-glyph-v-kerning-func.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -285,14 +573,26 @@ hb_font_funcs_set_glyph_v_kerning_func
 <tbody>
 <tr>
 <td class="parameter_name"><p>ffuncs</p></td>
-<td class="parameter_description"><p>font functions.</p></td>
+<td class="parameter_description"><p>A font-function structure</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>func</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The callback function to assign. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> user_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
 </tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>Data to pass to <em class="parameter"><code>func</code></em>
+</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>destroy</p></td>
+<td class="parameter_description"><p>The function to call when <em class="parameter"><code>user_data</code></em>
+is not needed anymore. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></td>
+</tr>
 </tbody>
 </table></div>
 </div>
@@ -306,6 +606,10 @@ hb_font_get_glyph_v_kerning (<em class="parameter"><code><a class="link" href="h
                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> top_glyph</code></em>,
                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> bottom_glyph</code></em>);</pre>
 <div class="warning"><p><code class="literal">hb_font_get_glyph_v_kerning</code> has been deprecated since version 2.0.0 and should not be used in newly-written code.</p></div>
+<p>Fetches the kerning-adjustment value for a glyph-pair in
+the specified font, for vertical text segments.</p>
+<div class="note">It handles legacy kerning only (as returned by the corresponding
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t" title="hb_font_funcs_t"><span class="type">hb_font_funcs_t</span></a> function).</div>
 <div class="refsect3">
 <a name="hb-font-get-glyph-v-kerning.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -314,13 +618,29 @@ hb_font_get_glyph_v_kerning (<em class="parameter"><code><a class="link" href="h
 <col class="parameters_description">
 <col width="200px" class="parameters_annotations">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
 <td class="parameter_name"><p>font</p></td>
-<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>top_glyph</p></td>
+<td class="parameter_description"><p>The glyph ID of the top glyph in the glyph pair</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>bottom_glyph</p></td>
+<td class="parameter_description"><p>The glyph ID of the bottom glyph in the glyph pair</p></td>
 <td class="parameter_annotations"> </td>
-</tr></tbody>
+</tr>
+</tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-font-get-glyph-v-kerning.returns"></a><h4>Returns</h4>
+<p> The kerning adjustment value</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
 </div>
@@ -330,28 +650,44 @@ hb_font_get_glyph_v_kerning (<em class="parameter"><code><a class="link" href="h
 <a name="HB-BUFFER-FLAGS-DEFAULT:CAPS"></a><h3>HB_BUFFER_FLAGS_DEFAULT</h3>
 <pre class="programlisting">#define HB_BUFFER_FLAGS_DEFAULT                    HB_BUFFER_FLAG_DEFAULT
 </pre>
-<div class="warning"><p><code class="literal">HB_BUFFER_FLAGS_DEFAULT</code> is deprecated and should not be used in newly-written code.</p></div>
+<div class="warning"><p><code class="literal">HB_BUFFER_FLAGS_DEFAULT</code> has been deprecated since version 0.9.20 and should not be used in newly-written code.</p></div>
+<p>Use <a class="link" href="harfbuzz-hb-buffer.html#HB-BUFFER-FLAG-DEFAULT:CAPS"><span class="type">HB_BUFFER_FLAG_DEFAULT</span></a> instead.</p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="HB-BUFFER-SERIALIZE-FLAGS-DEFAULT:CAPS"></a><h3>HB_BUFFER_SERIALIZE_FLAGS_DEFAULT</h3>
 <pre class="programlisting">#define HB_BUFFER_SERIALIZE_FLAGS_DEFAULT HB_BUFFER_SERIALIZE_FLAG_DEFAULT
 </pre>
-<div class="warning"><p><code class="literal">HB_BUFFER_SERIALIZE_FLAGS_DEFAULT</code> is deprecated and should not be used in newly-written code.</p></div>
+<div class="warning"><p><code class="literal">HB_BUFFER_SERIALIZE_FLAGS_DEFAULT</code> has been deprecated since version 0.9.20 and should not be used in newly-written code.</p></div>
+<p>Use <a class="link" href="harfbuzz-hb-buffer.html#HB-BUFFER-SERIALIZE-FLAG-DEFAULT:CAPS"><span class="type">HB_BUFFER_SERIALIZE_FLAG_DEFAULT</span></a> instead.</p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="HB-SCRIPT-CANADIAN-ABORIGINAL:CAPS"></a><h3>HB_SCRIPT_CANADIAN_ABORIGINAL</h3>
 <pre class="programlisting">#define HB_SCRIPT_CANADIAN_ABORIGINAL              HB_SCRIPT_CANADIAN_SYLLABICS
 </pre>
-<div class="warning"><p><code class="literal">HB_SCRIPT_CANADIAN_ABORIGINAL</code> is deprecated and should not be used in newly-written code.</p></div>
+<div class="warning"><p><code class="literal">HB_SCRIPT_CANADIAN_ABORIGINAL</code> has been deprecated since version 0.9.20 and should not be used in newly-written code.</p></div>
+<p>Use <a class="link" href="harfbuzz-hb-common.html#HB-SCRIPT-CANADIAN-SYLLABICS:CAPS"><span class="type">HB_SCRIPT_CANADIAN_SYLLABICS</span></a> instead:</p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="HB-MATH-GLYPH-PART-FLAG-EXTENDER:CAPS"></a><h3>HB_MATH_GLYPH_PART_FLAG_EXTENDER</h3>
 <pre class="programlisting">#define HB_MATH_GLYPH_PART_FLAG_EXTENDER HB_OT_MATH_GLYPH_PART_FLAG_EXTENDER
 </pre>
-<div class="warning"><p><code class="literal">HB_MATH_GLYPH_PART_FLAG_EXTENDER</code> is deprecated and should not be used in newly-written code.</p></div>
+<div class="warning"><p><code class="literal">HB_MATH_GLYPH_PART_FLAG_EXTENDER</code> has been deprecated since version 2.5.1 and should not be used in newly-written code.</p></div>
+<p>Use <a class="link" href="harfbuzz-hb-ot-math.html#HB-OT-MATH-GLYPH-PART-FLAG-EXTENDER:CAPS"><span class="type">HB_OT_MATH_GLYPH_PART_FLAG_EXTENDER</span></a> instead.</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="HB-OT-MATH-SCRIPT:CAPS"></a><h3>HB_OT_MATH_SCRIPT</h3>
+<pre class="programlisting">#define HB_OT_MATH_SCRIPT HB_OT_TAG_MATH_SCRIPT
+</pre>
+<div class="warning"><p><code class="literal">HB_OT_MATH_SCRIPT</code> has been deprecated since version 3.4.0 and should not be used in newly-written code.</p></div>
+<p>Use <a class="link" href="harfbuzz-hb-common.html#HB-SCRIPT-MATH:CAPS"><span class="type">HB_SCRIPT_MATH</span></a> or <a class="link" href="harfbuzz-hb-ot-math.html#HB-OT-TAG-MATH-SCRIPT:CAPS" title="HB_OT_TAG_MATH_SCRIPT"><span class="type">HB_OT_TAG_MATH_SCRIPT</span></a> instead.</p>
+<div class="note">Previous versions of this documentation recommended passing
+<a class="link" href="harfbuzz-hb-deprecated.html#HB-OT-MATH-SCRIPT:CAPS" title="HB_OT_MATH_SCRIPT"><span class="type">HB_OT_MATH_SCRIPT</span></a> to <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-script" title="hb_buffer_set_script ()"><code class="function">hb_buffer_set_script()</code></a> to enable math shaping, but this
+usage is no longer supported. Use <a class="link" href="harfbuzz-hb-common.html#HB-SCRIPT-MATH:CAPS"><span class="type">HB_SCRIPT_MATH</span></a> instead.</div>
+<p class="since">Since: <a class="link" href="api-index-1-3-3.html#api-index-1.3.3">1.3.3</a></p>
 </div>
 <hr>
 <div class="refsect2">
@@ -359,6 +695,59 @@ hb_font_get_glyph_v_kerning (<em class="parameter"><code><a class="link" href="h
 <pre class="programlisting">#define HB_OT_VAR_NO_AXIS_INDEX            0xFFFFFFFFu
 </pre>
 <div class="warning"><p><code class="literal">HB_OT_VAR_NO_AXIS_INDEX</code> has been deprecated since version 2.2.0 and should not be used in newly-written code.</p></div>
+<p>Do not use.</p>
+<p class="since">Since: <a class="link" href="api-index-1-4-2.html#api-index-1.4.2">1.4.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-var-axis-t"></a><h3>hb_ot_var_axis_t</h3>
+<pre class="programlisting">typedef struct {
+  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;
+</pre>
+<div class="warning"><p><code class="literal">hb_ot_var_axis_t</code> has been deprecated since version 2.2.0 and should not be used in newly-written code.</p></div>
+<p>Use <a class="link" href="harfbuzz-hb-ot-var.html#hb-ot-var-axis-info-t" title="hb_ot_var_axis_info_t"><span class="type">hb_ot_var_axis_info_t</span></a> instead.</p>
+<div class="refsect3">
+<a name="hb-ot-var-axis-t.members"></a><h4>Members</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="300px" class="struct_members_name">
+<col class="struct_members_description">
+<col width="200px" class="struct_members_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="struct_member_name"><p><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> <em class="structfield"><code><a name="hb-ot-var-axis-t.tag"></a>tag</code></em>;</p></td>
+<td class="struct_member_description"><p>axis tag</p></td>
+<td class="struct_member_annotations"> </td>
+</tr>
+<tr>
+<td class="struct_member_name"><p><a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-id-t" title="hb_ot_name_id_t"><span class="type">hb_ot_name_id_t</span></a> <em class="structfield"><code><a name="hb-ot-var-axis-t.name-id"></a>name_id</code></em>;</p></td>
+<td class="struct_member_description"><p>axis name identifier</p></td>
+<td class="struct_member_annotations"> </td>
+</tr>
+<tr>
+<td class="struct_member_name"><p><span class="type">float</span> <em class="structfield"><code><a name="hb-ot-var-axis-t.min-value"></a>min_value</code></em>;</p></td>
+<td class="struct_member_description"><p>minimum value of the axis</p></td>
+<td class="struct_member_annotations"> </td>
+</tr>
+<tr>
+<td class="struct_member_name"><p><span class="type">float</span> <em class="structfield"><code><a name="hb-ot-var-axis-t.default-value"></a>default_value</code></em>;</p></td>
+<td class="struct_member_description"><p>default value of the axis</p></td>
+<td class="struct_member_annotations"> </td>
+</tr>
+<tr>
+<td class="struct_member_name"><p><span class="type">float</span> <em class="structfield"><code><a name="hb-ot-var-axis-t.max-value"></a>max_value</code></em>;</p></td>
+<td class="struct_member_description"><p>maximum value of the axis</p></td>
+<td class="struct_member_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
 <p class="since">Since: <a class="link" href="api-index-1-4-2.html#api-index-1.4.2">1.4.2</a></p>
 </div>
 <hr>
@@ -375,10 +764,13 @@ hb_font_get_glyph_v_kerning (<em class="parameter"><code><a class="link" href="h
 <pre class="programlisting">typedef hb_font_get_glyph_kerning_func_t hb_font_get_glyph_v_kerning_func_t;
 </pre>
 <div class="warning"><p><code class="literal">hb_font_get_glyph_v_kerning_func_t</code> is deprecated and should not be used in newly-written code.</p></div>
+<p>A virtual method for the <a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t" title="hb_font_funcs_t"><span class="type">hb_font_funcs_t</span></a> of an <a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> object.</p>
+<p>This method should retrieve the kerning-adjustment value for a glyph-pair in
+the specified font, for vertical text segments.</p>
 </div>
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/html/harfbuzz-hb-directwrite.html b/docs/html/harfbuzz-hb-directwrite.html
new file mode 100644 (file)
index 0000000..cfca7a3
--- /dev/null
@@ -0,0 +1,131 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>hb-directwrite: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="integration-api.html" title="Integration API">
+<link rel="prev" href="harfbuzz-hb-gdi.html" title="hb-gdi">
+<link rel="next" href="style-api.html" title="Style API">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts">
+<a href="#" class="shortcut">Top</a><span id="nav_description">  <span class="dim">|</span> 
+                  <a href="#harfbuzz-hb-directwrite.description" class="shortcut">Description</a></span>
+</td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="integration-api.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="harfbuzz-hb-gdi.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="style-api.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="harfbuzz-hb-directwrite"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="harfbuzz-hb-directwrite.top_of_page"></a>hb-directwrite</span></h2>
+<p>hb-directwrite — DirectWrite integration</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="harfbuzz-hb-directwrite.functions"></a><h2>Functions</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="functions_proto_type">
+<col class="functions_proto_name">
+</colgroup>
+<tbody>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="returnvalue">hb_face_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-directwrite.html#hb-directwrite-face-create" title="hb_directwrite_face_create ()">hb_directwrite_face_create</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">IDWriteFontFace</span> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-directwrite.html#hb-directwrite-face-get-font-face" title="hb_directwrite_face_get_font_face ()">hb_directwrite_face_get_font_face</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-directwrite.includes"></a><h2>Includes</h2>
+<pre class="synopsis">#include &lt;hb-directwrite.h&gt;
+</pre>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-directwrite.description"></a><h2>Description</h2>
+<p>Functions for using HarfBuzz with DirectWrite fonts.</p>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-directwrite.functions_details"></a><h2>Functions</h2>
+<div class="refsect2">
+<a name="hb-directwrite-face-create"></a><h3>hb_directwrite_face_create ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="returnvalue">hb_face_t</span></a> *
+hb_directwrite_face_create (<em class="parameter"><code><span class="type">IDWriteFontFace</span> *font_face</code></em>);</pre>
+<p>Constructs a new face object from the specified DirectWrite IDWriteFontFace.</p>
+<div class="refsect3">
+<a name="hb-directwrite-face-create.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>font_face</p></td>
+<td class="parameter_description"><p>a DirectWrite IDWriteFontFace object.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-directwrite-face-create.returns"></a><h4>Returns</h4>
+<p> <a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> object corresponding to the given input</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-4-0.html#api-index-2.4.0">2.4.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-directwrite-face-get-font-face"></a><h3>hb_directwrite_face_get_font_face ()</h3>
+<pre class="programlisting"><span class="returnvalue">IDWriteFontFace</span> *
+hb_directwrite_face_get_font_face (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+<p>Gets the DirectWrite IDWriteFontFace associated with <em class="parameter"><code>face</code></em>
+.</p>
+<div class="refsect3">
+<a name="hb-directwrite-face-get-font-face.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>a <a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> object</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-directwrite-face-get-font-face.returns"></a><h4>Returns</h4>
+<p> DirectWrite IDWriteFontFace object corresponding to the given input</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-5-0.html#api-index-2.5.0">2.5.0</a></p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
index f3f615d..3f28c1e 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-face: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch12.html" title="Core API">
+<link rel="up" href="core-api.html" title="Core API">
 <link rel="prev" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">
 <link rel="next" href="harfbuzz-hb-font.html" title="hb-font">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -18,7 +18,7 @@
                   <a href="#harfbuzz-hb-face.description" class="shortcut">Description</a></span>
 </td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><a accesskey="u" href="ch12.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="u" href="core-api.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
 <td><a accesskey="p" href="harfbuzz-hb-deprecated.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
 <td><a accesskey="n" href="harfbuzz-hb-font.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 </div>
 <div class="refsect1">
 <a name="harfbuzz-hb-face.description"></a><h2>Description</h2>
-<p>Font face is objects represent a single face in a font family.
-More exactly, a font face represents a single face in a binary font file.
+<p>A font face is an object that represents a single face from within a
+font family.</p>
+<p>More precisely, a font face represents a single face in a binary font file.
 Font faces are typically built from a binary blob and a face index.
 Font faces are used to create fonts.</p>
 </div>
@@ -260,7 +261,7 @@ Font faces are used to create fonts.</p>
 <a name="hb-face-count"></a><h3>hb_face_count ()</h3>
 <pre class="programlisting">unsigned <span class="returnvalue">int</span>
 hb_face_count (<em class="parameter"><code><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t" title="hb_blob_t"><span class="type">hb_blob_t</span></a> *blob</code></em>);</pre>
-<p>Get number of faces in a blob.</p>
+<p>Fetches the number of faces in a blob.</p>
 <div class="refsect3">
 <a name="hb-face-count.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -289,10 +290,44 @@ hb_face_count (<em class="parameter"><code><a class="link" href="harfbuzz-hb-blo
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="returnvalue">hb_face_t</span></a> *
 hb_face_create (<em class="parameter"><code><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t" title="hb_blob_t"><span class="type">hb_blob_t</span></a> *blob</code></em>,
                 <em class="parameter"><code>unsigned <span class="type">int</span> index</code></em>);</pre>
+<p>Constructs a new face object from the specified blob and
+a face index into that blob.</p>
+<p>The face index is used for blobs of file formats such as TTC and
+and DFont that can contain more than one face.  Face indices within
+such collections are zero-based.</p>
+<div class="note">Note: If the blob font format is not a collection, <em class="parameter"><code>index</code></em>
+is ignored.  Otherwise, only the lower 16-bits of <em class="parameter"><code>index</code></em> are used.
+The unmodified <em class="parameter"><code>index</code></em> can be accessed via <a class="link" href="harfbuzz-hb-face.html#hb-face-get-index" title="hb_face_get_index ()"><code class="function">hb_face_get_index()</code></a>.</div>
+<div class="note">Note: The high 16-bits of <em class="parameter"><code>index</code></em>, if non-zero, are used by
+<a class="link" href="harfbuzz-hb-font.html#hb-font-create" title="hb_font_create ()"><code class="function">hb_font_create()</code></a> to load named-instances in variable fonts.  See
+<a class="link" href="harfbuzz-hb-font.html#hb-font-create" title="hb_font_create ()"><code class="function">hb_font_create()</code></a> for details.</div>
 <p><span class="annotation">[Xconstructor]</span></p>
 <div class="refsect3">
+<a name="hb-face-create.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>blob</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t" title="hb_blob_t"><span class="type">hb_blob_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>index</p></td>
+<td class="parameter_description"><p>The index of the face within <em class="parameter"><code>blob</code></em>
+</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
 <a name="hb-face-create.returns"></a><h4>Returns</h4>
-<p>. </p>
+<p>The new face object. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
@@ -304,6 +339,15 @@ hb_face_create (<em class="parameter"><code><a class="link" href="harfbuzz-hb-bl
 hb_face_create_for_tables (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-reference-table-func-t" title="hb_reference_table_func_t ()"><span class="type">hb_reference_table_func_t</span></a> reference_table_func</code></em>,
                            <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                            <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<p>Variant of <a class="link" href="harfbuzz-hb-face.html#hb-face-create" title="hb_face_create ()"><code class="function">hb_face_create()</code></a>, built for those cases where it is more
+convenient to provide data for individual tables instead of the whole font
+data. With the caveat that <a class="link" href="harfbuzz-hb-face.html#hb-face-get-table-tags" title="hb_face_get_table_tags ()"><code class="function">hb_face_get_table_tags()</code></a> does not currently work
+with faces created this way.</p>
+<p>Creates a new face object from the specified <em class="parameter"><code>user_data</code></em>
+ and <em class="parameter"><code>reference_table_func</code></em>
+,
+with the <em class="parameter"><code>destroy</code></em>
+ callback.</p>
 <div class="refsect3">
 <a name="hb-face-create-for-tables.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -312,16 +356,30 @@ hb_face_create_for_tables (<em class="parameter"><code><a class="link" href="har
 <col class="parameters_description">
 <col width="200px" class="parameters_annotations">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
 <td class="parameter_name"><p>reference_table_func</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>Table-referencing function. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> user_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
-</tr></tbody>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>A pointer to the user data</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>destroy</p></td>
+<td class="parameter_description"><p>A callback to call when <em class="parameter"><code>data</code></em>
+is not needed anymore. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></td>
+</tr>
+</tbody>
 </table></div>
 </div>
 <div class="refsect3">
 <a name="hb-face-create-for-tables.returns"></a><h4>Returns</h4>
-<p> (transfer full)</p>
+<p>The new face object. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
@@ -330,6 +388,9 @@ hb_face_create_for_tables (<em class="parameter"><code><a class="link" href="har
 <a name="hb-face-destroy"></a><h3>hb_face_destroy ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_face_destroy (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+<p>Decreases the reference count on a face object. When the
+reference count reaches zero, the face is destroyed,
+freeing all memory.</p>
 <p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
 <div class="refsect3">
 <a name="hb-face-destroy.parameters"></a><h4>Parameters</h4>
@@ -341,7 +402,7 @@ hb_face_destroy (<em class="parameter"><code><a class="link" href="harfbuzz-hb-f
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>face</p></td>
-<td class="parameter_description"><p>a face.</p></td>
+<td class="parameter_description"><p>A face object</p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
@@ -353,9 +414,11 @@ hb_face_destroy (<em class="parameter"><code><a class="link" href="harfbuzz-hb-f
 <a name="hb-face-get-empty"></a><h3>hb_face_get_empty ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="returnvalue">hb_face_t</span></a> *
 hb_face_get_empty (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>Fetches the singleton empty face object.</p>
 <div class="refsect3">
 <a name="hb-face-get-empty.returns"></a><h4>Returns</h4>
-<p> (transfer full)</p>
+<p>The empty face object. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
@@ -367,7 +430,8 @@ hb_face_get_table_tags (<em class="parameter"><code>const <a class="link" href="
                         <em class="parameter"><code>unsigned <span class="type">int</span> start_offset</code></em>,
                         <em class="parameter"><code>unsigned <span class="type">int</span> *table_count</code></em>,
                         <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> *table_tags</code></em>);</pre>
-<p>Retrieves table tags for a face, if possible.</p>
+<p>Fetches a list of all table tags for a face, if possible. The list returned will
+begin at the offset provided</p>
 <div class="refsect3">
 <a name="hb-face-get-table-tags.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -379,31 +443,31 @@ hb_face_get_table_tags (<em class="parameter"><code>const <a class="link" href="
 <tbody>
 <tr>
 <td class="parameter_name"><p>face</p></td>
-<td class="parameter_description"><p>a face.</p></td>
+<td class="parameter_description"><p>A face object</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>start_offset</p></td>
-<td class="parameter_description"><p>index of first tag to return.</p></td>
+<td class="parameter_description"><p>The index of first table tag to retrieve</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>table_count</p></td>
-<td class="parameter_description"><p>input length of <em class="parameter"><code>table_tags</code></em>
-array, output number of items written.</p></td>
-<td class="parameter_annotations"> </td>
+<td class="parameter_description"><p>Input = the maximum number of table tags to return;
+Output = the actual number of table tags returned (may be zero). </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>]</span></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>table_tags</p></td>
-<td class="parameter_description"><p>array to write tags into.</p></td>
-<td class="parameter_annotations"> </td>
+<td class="parameter_description"><p>The array of table tags found. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=table_count]</span></td>
 </tr>
 </tbody>
 </table></div>
 </div>
 <div class="refsect3">
 <a name="hb-face-get-table-tags.returns"></a><h4>Returns</h4>
-<p> total number of tables, or 0 if not possible to list.</p>
+<p> Total number of tables, or zero if it is not possible to list</p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-1-6-0.html#api-index-1.6.0">1.6.0</a></p>
 </div>
@@ -412,6 +476,7 @@ array, output number of items written.</p></td>
 <a name="hb-face-get-glyph-count"></a><h3>hb_face_get_glyph_count ()</h3>
 <pre class="programlisting">unsigned <span class="returnvalue">int</span>
 hb_face_get_glyph_count (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+<p>Fetches the glyph-count value of the specified face object.</p>
 <div class="refsect3">
 <a name="hb-face-get-glyph-count.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -422,11 +487,16 @@ hb_face_get_glyph_count (<em class="parameter"><code>const <a class="link" href=
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>face</p></td>
-<td class="parameter_description"><p>a face.</p></td>
+<td class="parameter_description"><p>A face object</p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-face-get-glyph-count.returns"></a><h4>Returns</h4>
+<p> The glyph-count value of <em class="parameter"><code>face</code></em>
+</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
 </div>
 <hr>
@@ -434,6 +504,8 @@ hb_face_get_glyph_count (<em class="parameter"><code>const <a class="link" href=
 <a name="hb-face-get-index"></a><h3>hb_face_get_index ()</h3>
 <pre class="programlisting">unsigned <span class="returnvalue">int</span>
 hb_face_get_index (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+<p>Fetches the face-index corresponding to the given face.</p>
+<div class="note">Note: face indices within a collection are zero-based.</div>
 <div class="refsect3">
 <a name="hb-face-get-index.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -444,11 +516,16 @@ hb_face_get_index (<em class="parameter"><code>const <a class="link" href="harfb
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>face</p></td>
-<td class="parameter_description"><p>a face.</p></td>
+<td class="parameter_description"><p>A face object</p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-face-get-index.returns"></a><h4>Returns</h4>
+<p> The index of <em class="parameter"><code>face</code></em>
+.</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
 <hr>
@@ -456,6 +533,7 @@ hb_face_get_index (<em class="parameter"><code>const <a class="link" href="harfb
 <a name="hb-face-get-upem"></a><h3>hb_face_get_upem ()</h3>
 <pre class="programlisting">unsigned <span class="returnvalue">int</span>
 hb_face_get_upem (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+<p>Fetches the units-per-em (upem) value of the specified face object.</p>
 <div class="refsect3">
 <a name="hb-face-get-upem.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -466,11 +544,16 @@ hb_face_get_upem (<em class="parameter"><code>const <a class="link" href="harfbu
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>face</p></td>
-<td class="parameter_description"><p>a face.</p></td>
+<td class="parameter_description"><p>A face object</p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-face-get-upem.returns"></a><h4>Returns</h4>
+<p> The upem value of <em class="parameter"><code>face</code></em>
+</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
 <hr>
@@ -479,6 +562,8 @@ hb_face_get_upem (<em class="parameter"><code>const <a class="link" href="harfbu
 <pre class="programlisting"><span class="returnvalue">void</span> *
 hb_face_get_user_data (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> *face</code></em>,
                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-user-data-key-t" title="hb_user_data_key_t"><span class="type">hb_user_data_key_t</span></a> *key</code></em>);</pre>
+<p>Fetches the user data associated with the specified key,
+attached to the specified face object.</p>
 <p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
 <div class="refsect3">
 <a name="hb-face-get-user-data.parameters"></a><h4>Parameters</h4>
@@ -488,16 +573,23 @@ hb_face_get_user_data (<em class="parameter"><code>const <a class="link" href="h
 <col class="parameters_description">
 <col width="200px" class="parameters_annotations">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
 <td class="parameter_name"><p>face</p></td>
-<td class="parameter_description"><p>a face.</p></td>
+<td class="parameter_description"><p>A face object</p></td>
 <td class="parameter_annotations"> </td>
-</tr></tbody>
+</tr>
+<tr>
+<td class="parameter_name"><p>key</p></td>
+<td class="parameter_description"><p>The user-data key to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
 </table></div>
 </div>
 <div class="refsect3">
 <a name="hb-face-get-user-data.returns"></a><h4>Returns</h4>
-<p>. </p>
+<p>A pointer to the user data. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
@@ -507,6 +599,7 @@ hb_face_get_user_data (<em class="parameter"><code>const <a class="link" href="h
 <a name="hb-face-is-immutable"></a><h3>hb_face_is_immutable ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 hb_face_is_immutable (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+<p>Tests whether the given face object is immutable.</p>
 <div class="refsect3">
 <a name="hb-face-is-immutable.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -517,11 +610,16 @@ hb_face_is_immutable (<em class="parameter"><code>const <a class="link" href="ha
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>face</p></td>
-<td class="parameter_description"><p>a face.</p></td>
+<td class="parameter_description"><p>A face object</p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-face-is-immutable.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> is <em class="parameter"><code>face</code></em>
+is immutable, <code class="literal">false</code> otherwise</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
 <hr>
@@ -529,6 +627,7 @@ hb_face_is_immutable (<em class="parameter"><code>const <a class="link" href="ha
 <a name="hb-face-make-immutable"></a><h3>hb_face_make_immutable ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_face_make_immutable (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+<p>Makes the given face object immutable.</p>
 <div class="refsect3">
 <a name="hb-face-make-immutable.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -539,7 +638,7 @@ hb_face_make_immutable (<em class="parameter"><code><a class="link" href="harfbu
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>face</p></td>
-<td class="parameter_description"><p>a face.</p></td>
+<td class="parameter_description"><p>A face object</p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
@@ -551,6 +650,7 @@ hb_face_make_immutable (<em class="parameter"><code><a class="link" href="harfbu
 <a name="hb-face-reference"></a><h3>hb_face_reference ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="returnvalue">hb_face_t</span></a> *
 hb_face_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+<p>Increases the reference count on a face object.</p>
 <p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
 <div class="refsect3">
 <a name="hb-face-reference.parameters"></a><h4>Parameters</h4>
@@ -562,11 +662,16 @@ hb_face_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>face</p></td>
-<td class="parameter_description"><p>a face.</p></td>
+<td class="parameter_description"><p>A face object</p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-face-reference.returns"></a><h4>Returns</h4>
+<p> The <em class="parameter"><code>face</code></em>
+object</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
 <hr>
@@ -574,6 +679,9 @@ hb_face_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 <a name="hb-face-reference-blob"></a><h3>hb_face_reference_blob ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t" title="hb_blob_t"><span class="returnvalue">hb_blob_t</span></a> *
 hb_face_reference_blob (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+<p>Fetches a pointer to the binary blob that contains the
+specified face. Returns an empty blob if referencing face data is not
+possible.</p>
 <div class="refsect3">
 <a name="hb-face-reference-blob.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -584,14 +692,15 @@ hb_face_reference_blob (<em class="parameter"><code><a class="link" href="harfbu
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>face</p></td>
-<td class="parameter_description"><p>a face.</p></td>
+<td class="parameter_description"><p>A face object</p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
 </div>
 <div class="refsect3">
 <a name="hb-face-reference-blob.returns"></a><h4>Returns</h4>
-<p>. </p>
+<p>A pointer to the blob for <em class="parameter"><code>face</code></em>
+. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
@@ -602,6 +711,8 @@ hb_face_reference_blob (<em class="parameter"><code><a class="link" href="harfbu
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t" title="hb_blob_t"><span class="returnvalue">hb_blob_t</span></a> *
 hb_face_reference_table (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> *face</code></em>,
                          <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> tag</code></em>);</pre>
+<p>Fetches a reference to the specified table within
+the specified face.</p>
 <div class="refsect3">
 <a name="hb-face-reference-table.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -610,16 +721,25 @@ hb_face_reference_table (<em class="parameter"><code>const <a class="link" href=
 <col class="parameters_description">
 <col width="200px" class="parameters_annotations">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
 <td class="parameter_name"><p>face</p></td>
-<td class="parameter_description"><p>a face.</p></td>
+<td class="parameter_description"><p>A face object</p></td>
 <td class="parameter_annotations"> </td>
-</tr></tbody>
+</tr>
+<tr>
+<td class="parameter_name"><p>tag</p></td>
+<td class="parameter_description"><p>The <a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> of the table to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
 </table></div>
 </div>
 <div class="refsect3">
 <a name="hb-face-reference-table.returns"></a><h4>Returns</h4>
-<p>. </p>
+<p>A pointer to the <em class="parameter"><code>tag</code></em>
+table within <em class="parameter"><code>face</code></em>
+. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
@@ -630,6 +750,7 @@ hb_face_reference_table (<em class="parameter"><code>const <a class="link" href=
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_face_set_glyph_count (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> *face</code></em>,
                          <em class="parameter"><code>unsigned <span class="type">int</span> glyph_count</code></em>);</pre>
+<p>Sets the glyph count for a face object to the specified value.</p>
 <div class="refsect3">
 <a name="hb-face-set-glyph-count.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -638,11 +759,18 @@ hb_face_set_glyph_count (<em class="parameter"><code><a class="link" href="harfb
 <col class="parameters_description">
 <col width="200px" class="parameters_annotations">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
 <td class="parameter_name"><p>face</p></td>
-<td class="parameter_description"><p>a face.</p></td>
+<td class="parameter_description"><p>A face object</p></td>
 <td class="parameter_annotations"> </td>
-</tr></tbody>
+</tr>
+<tr>
+<td class="parameter_name"><p>glyph_count</p></td>
+<td class="parameter_description"><p>The glyph-count value to assign</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
 </table></div>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
@@ -653,6 +781,11 @@ hb_face_set_glyph_count (<em class="parameter"><code><a class="link" href="harfb
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_face_set_index (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> *face</code></em>,
                    <em class="parameter"><code>unsigned <span class="type">int</span> index</code></em>);</pre>
+<p>Assigns the specified face-index to <em class="parameter"><code>face</code></em>
+. Fails if the
+face is immutable.</p>
+<div class="note">Note: changing the index has no effect on the face itself
+This only changes the value returned by <a class="link" href="harfbuzz-hb-face.html#hb-face-get-index" title="hb_face_get_index ()"><code class="function">hb_face_get_index()</code></a>.</div>
 <div class="refsect3">
 <a name="hb-face-set-index.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -661,11 +794,18 @@ hb_face_set_index (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 <col class="parameters_description">
 <col width="200px" class="parameters_annotations">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
 <td class="parameter_name"><p>face</p></td>
-<td class="parameter_description"><p>a face.</p></td>
+<td class="parameter_description"><p>A face object</p></td>
 <td class="parameter_annotations"> </td>
-</tr></tbody>
+</tr>
+<tr>
+<td class="parameter_name"><p>index</p></td>
+<td class="parameter_description"><p>The index to assign</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
 </table></div>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
@@ -676,6 +816,7 @@ hb_face_set_index (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_face_set_upem (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> *face</code></em>,
                   <em class="parameter"><code>unsigned <span class="type">int</span> upem</code></em>);</pre>
+<p>Sets the units-per-em (upem) for a face object to the specified value.</p>
 <div class="refsect3">
 <a name="hb-face-set-upem.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -684,11 +825,18 @@ hb_face_set_upem (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 <col class="parameters_description">
 <col width="200px" class="parameters_annotations">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
 <td class="parameter_name"><p>face</p></td>
-<td class="parameter_description"><p>a face.</p></td>
+<td class="parameter_description"><p>A face object</p></td>
 <td class="parameter_annotations"> </td>
-</tr></tbody>
+</tr>
+<tr>
+<td class="parameter_name"><p>upem</p></td>
+<td class="parameter_description"><p>The units-per-em value to assign</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
 </table></div>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
@@ -702,6 +850,7 @@ hb_face_set_user_data (<em class="parameter"><code><a class="link" href="harfbuz
                        <em class="parameter"><code><span class="type">void</span> *data</code></em>,
                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>,
                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="type">hb_bool_t</span></a> replace</code></em>);</pre>
+<p>Attaches a user-data key/data pair to the given face object.</p>
 <p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
 <div class="refsect3">
 <a name="hb-face-set-user-data.parameters"></a><h4>Parameters</h4>
@@ -711,13 +860,40 @@ hb_face_set_user_data (<em class="parameter"><code><a class="link" href="harfbuz
 <col class="parameters_description">
 <col width="200px" class="parameters_annotations">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
 <td class="parameter_name"><p>face</p></td>
-<td class="parameter_description"><p>a face.</p></td>
+<td class="parameter_description"><p>A face object</p></td>
 <td class="parameter_annotations"> </td>
-</tr></tbody>
+</tr>
+<tr>
+<td class="parameter_name"><p>key</p></td>
+<td class="parameter_description"><p>The user-data key to set</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>data</p></td>
+<td class="parameter_description"><p>A pointer to the user data</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>destroy</p></td>
+<td class="parameter_description"><p>A callback to call when <em class="parameter"><code>data</code></em>
+is not needed anymore. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>replace</p></td>
+<td class="parameter_description"><p>Whether to replace an existing data with the same key</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-face-set-user-data.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> if success, <code class="literal">false</code> otherwise</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
 <hr>
@@ -726,6 +902,10 @@ hb_face_set_user_data (<em class="parameter"><code><a class="link" href="harfbuz
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_face_collect_unicodes (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> *face</code></em>,
                           <em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a> *out</code></em>);</pre>
+<p>Collects all of the Unicode characters covered by <em class="parameter"><code>face</code></em>
+ and adds
+them to the <a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a> set <em class="parameter"><code>out</code></em>
+.</p>
 <div class="refsect3">
 <a name="hb-face-collect-unicodes.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -737,13 +917,12 @@ hb_face_collect_unicodes (<em class="parameter"><code><a class="link" href="harf
 <tbody>
 <tr>
 <td class="parameter_name"><p>face</p></td>
-<td class="parameter_description"><p>font face.</p></td>
+<td class="parameter_description"><p>A face object</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>out</p></td>
-<td class="parameter_description"><p>set to add Unicode characters covered by <em class="parameter"><code>face</code></em>
-to.</p></td>
+<td class="parameter_description"><p>The set to add Unicode characters to</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 </tbody>
@@ -757,6 +936,10 @@ to.</p></td>
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_face_collect_variation_selectors (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> *face</code></em>,
                                      <em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a> *out</code></em>);</pre>
+<p>Collects all Unicode "Variation Selector" characters covered by <em class="parameter"><code>face</code></em>
+ and adds
+them to the <a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a> set <em class="parameter"><code>out</code></em>
+.</p>
 <div class="refsect3">
 <a name="hb-face-collect-variation-selectors.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -768,13 +951,12 @@ hb_face_collect_variation_selectors (<em class="parameter"><code><a class="link"
 <tbody>
 <tr>
 <td class="parameter_name"><p>face</p></td>
-<td class="parameter_description"><p>font face.</p></td>
+<td class="parameter_description"><p>A face object</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>out</p></td>
-<td class="parameter_description"><p>set to add Variation Selector characters covered by <em class="parameter"><code>face</code></em>
-to.</p></td>
+<td class="parameter_description"><p>The set to add Variation Selector characters to</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 </tbody>
@@ -789,6 +971,11 @@ to.</p></td>
 hb_face_collect_variation_unicodes (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> *face</code></em>,
                                     <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> variation_selector</code></em>,
                                     <em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a> *out</code></em>);</pre>
+<p>Collects all Unicode characters for <em class="parameter"><code>variation_selector</code></em>
+ covered by <em class="parameter"><code>face</code></em>
+ and adds
+them to the <a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a> set <em class="parameter"><code>out</code></em>
+.</p>
 <div class="refsect3">
 <a name="hb-face-collect-variation-unicodes.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -800,14 +987,17 @@ hb_face_collect_variation_unicodes (<em class="parameter"><code><a class="link"
 <tbody>
 <tr>
 <td class="parameter_name"><p>face</p></td>
-<td class="parameter_description"><p>font face.</p></td>
+<td class="parameter_description"><p>A face object</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>variation_selector</p></td>
+<td class="parameter_description"><p>The Variation Selector to query</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>out</p></td>
-<td class="parameter_description"><p>set to add Unicode characters for <em class="parameter"><code>variation_selector</code></em>
-covered by <em class="parameter"><code>face</code></em>
-to.</p></td>
+<td class="parameter_description"><p>The set to add Unicode characters to</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 </tbody>
@@ -842,6 +1032,33 @@ hb_face_builder_add_table (<em class="parameter"><code><a class="link" href="har
  to the face.  <em class="parameter"><code>face</code></em>
  must
 be created using <a class="link" href="harfbuzz-hb-face.html#hb-face-builder-create" title="hb_face_builder_create ()"><code class="function">hb_face_builder_create()</code></a>.</p>
+<div class="refsect3">
+<a name="hb-face-builder-add-table.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>A face object created with <a class="link" href="harfbuzz-hb-face.html#hb-face-builder-create" title="hb_face_builder_create ()"><code class="function">hb_face_builder_create()</code></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>tag</p></td>
+<td class="parameter_description"><p>The <a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> of the table to add</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>blob</p></td>
+<td class="parameter_description"><p>The blob containing the table data to add</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
 <p class="since">Since: <a class="link" href="api-index-1-9-0.html#api-index-1.9.0">1.9.0</a></p>
 </div>
 </div>
@@ -851,10 +1068,11 @@ be created using <a class="link" href="harfbuzz-hb-face.html#hb-face-builder-cre
 <a name="hb-face-t"></a><h3>hb_face_t</h3>
 <pre class="programlisting">typedef struct hb_face_t hb_face_t;
 </pre>
+<p>Data type for holding font faces.</p>
 </div>
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index 0ec95ad..de1f8a2 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-font: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch12.html" title="Core API">
+<link rel="up" href="core-api.html" title="Core API">
 <link rel="prev" href="harfbuzz-hb-face.html" title="hb-face">
 <link rel="next" href="harfbuzz-hb-map.html" title="hb-map">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -18,7 +18,7 @@
                   <a href="#harfbuzz-hb-font.description" class="shortcut">Description</a></span>
 </td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><a accesskey="u" href="ch12.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="u" href="core-api.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
 <td><a accesskey="p" href="harfbuzz-hb-face.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
 <td><a accesskey="n" href="harfbuzz-hb-map.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 </tr>
 <tr>
 <td class="function_type">
+<span class="returnvalue">float</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-synthetic-slant" title="hb_font_get_synthetic_slant ()">hb_font_get_synthetic_slant</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
 <span class="returnvalue">void</span> *
 </td>
 <td class="function_name">
 </tr>
 <tr>
 <td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-synthetic-slant" title="hb_font_set_synthetic_slant ()">hb_font_set_synthetic_slant</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
 <a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 </td>
 <td class="function_name">
 <td class="typedef_keyword">typedef</td>
 <td class="function_name"><a class="link" href="harfbuzz-hb-font.html#hb-font-get-font-v-extents-func-t" title="hb_font_get_font_v_extents_func_t">hb_font_get_font_v_extents_func_t</a></td>
 </tr>
+<tr>
+<td class="datatype_keyword"> </td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-font.html#hb-font-extents-t" title="hb_font_extents_t">hb_font_extents_t</a></td>
+</tr>
+<tr>
+<td class="datatype_keyword"> </td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-font.html#hb-glyph-extents-t" title="hb_glyph_extents_t">hb_glyph_extents_t</a></td>
+</tr>
 </tbody>
 </table></div>
 </div>
 </div>
 <div class="refsect1">
 <a name="harfbuzz-hb-font.description"></a><h2>Description</h2>
-<p>Font objects represent a font face at a certain size and other
-parameters (pixels per EM, points per EM, variation settings.)
-Fonts are created from font faces, and are used as input to
-<a class="link" href="harfbuzz-hb-shape.html#hb-shape" title="hb_shape ()"><code class="function">hb_shape()</code></a> among other things.</p>
+<p>Functions for working with font objects.</p>
+<p>A font object represents a font face at a specific size and with
+certain other parameters (pixels-per-em, points-per-em, variation
+settings) specified. Font objects are created from font face
+objects, and are used as input to <a class="link" href="harfbuzz-hb-shape.html#hb-shape" title="hb_shape ()"><code class="function">hb_shape()</code></a>, among other things.</p>
+<p>Client programs can optionally pass in their own functions that
+implement the basic, lower-level queries of font objects. This set
+of font functions is defined by the virtual methods in
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t" title="hb_font_funcs_t"><span class="type">hb_font_funcs_t</span></a>.</p>
+<p>HarfBuzz provides a built-in set of lightweight default
+functions for each method in <a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t" title="hb_font_funcs_t"><span class="type">hb_font_funcs_t</span></a>.</p>
 </div>
 <div class="refsect1">
 <a name="harfbuzz-hb-font.functions_details"></a><h2>Functions</h2>
@@ -852,6 +883,11 @@ hb_font_add_glyph_origin_for_direction
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="type">hb_direction_t</span></a> direction</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *x</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *y</code></em>);</pre>
+<p>Adds the origin coordinates to an (X,Y) point coordinate, in
+the specified glyph ID in the specified font.</p>
+<p>Calls the appropriate direction-specific variant (horizontal
+or vertical) depending on the value of <em class="parameter"><code>direction</code></em>
+.</p>
 <div class="refsect3">
 <a name="hb-font-add-glyph-origin-for-direction.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -863,18 +899,30 @@ hb_font_add_glyph_origin_for_direction
 <tbody>
 <tr>
 <td class="parameter_name"><p>font</p></td>
-<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>glyph</p></td>
+<td class="parameter_description"><p>The glyph ID to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>direction</p></td>
+<td class="parameter_description"><p>The direction of the text segment</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>x</p></td>
-<td class="parameter_description"><p>. </p></td>
-<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+<td class="parameter_description"><p>Input = The original X coordinate
+Output = The X coordinate plus the X-coordinate of the origin. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>]</span></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>y</p></td>
-<td class="parameter_description"><p>. </p></td>
-<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+<td class="parameter_description"><p>Input = The original Y coordinate
+Output = The Y coordinate plus the Y-coordinate of the origin. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>]</span></td>
 </tr>
 </tbody>
 </table></div>
@@ -886,6 +934,13 @@ hb_font_add_glyph_origin_for_direction
 <a name="hb-font-create"></a><h3>hb_font_create ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="returnvalue">hb_font_t</span></a> *
 hb_font_create (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+<p>Constructs a new font object from the specified face.</p>
+<div class="note">Note: If <em class="parameter"><code>face</code></em>'s index value (as passed to <a class="link" href="harfbuzz-hb-face.html#hb-face-create" title="hb_face_create ()"><code class="function">hb_face_create()</code></a>
+has non-zero top 16-bits, those bits minus one are passed to
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-var-named-instance" title="hb_font_set_var_named_instance ()"><code class="function">hb_font_set_var_named_instance()</code></a>, effectively loading a named-instance
+of a variable font, instead of the default-instance.  This allows
+specifying which named-instance to load by default when creating the
+face.</div>
 <p><span class="annotation">[Xconstructor]</span></p>
 <div class="refsect3">
 <a name="hb-font-create.parameters"></a><h4>Parameters</h4>
@@ -904,7 +959,7 @@ hb_font_create (<em class="parameter"><code><a class="link" href="harfbuzz-hb-fa
 </div>
 <div class="refsect3">
 <a name="hb-font-create.returns"></a><h4>Returns</h4>
-<p>. </p>
+<p>The new font object. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
@@ -914,6 +969,9 @@ hb_font_create (<em class="parameter"><code><a class="link" href="harfbuzz-hb-fa
 <a name="hb-font-create-sub-font"></a><h3>hb_font_create_sub_font ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="returnvalue">hb_font_t</span></a> *
 hb_font_create_sub_font (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> *parent</code></em>);</pre>
+<p>Constructs a sub-font font object from the specified <em class="parameter"><code>parent</code></em>
+ font,
+replicating the parent's properties.</p>
 <div class="refsect3">
 <a name="hb-font-create-sub-font.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -924,14 +982,14 @@ hb_font_create_sub_font (<em class="parameter"><code><a class="link" href="harfb
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>parent</p></td>
-<td class="parameter_description"><p>parent font.</p></td>
+<td class="parameter_description"><p>The parent font object</p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
 </div>
 <div class="refsect3">
 <a name="hb-font-create-sub-font.returns"></a><h4>Returns</h4>
-<p>. </p>
+<p>The new sub-font font object. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
@@ -941,6 +999,9 @@ hb_font_create_sub_font (<em class="parameter"><code><a class="link" href="harfb
 <a name="hb-font-destroy"></a><h3>hb_font_destroy ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_font_destroy (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
+<p>Decreases the reference count on the given font object. When the
+reference count reaches zero, the font is destroyed,
+freeing all memory.</p>
 <p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
 <div class="refsect3">
 <a name="hb-font-destroy.parameters"></a><h4>Parameters</h4>
@@ -952,7 +1013,7 @@ hb_font_destroy (<em class="parameter"><code><a class="link" href="harfbuzz-hb-f
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>font</p></td>
-<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
@@ -964,10 +1025,11 @@ hb_font_destroy (<em class="parameter"><code><a class="link" href="harfbuzz-hb-f
 <a name="hb-font-funcs-create"></a><h3>hb_font_funcs_create ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t" title="hb_font_funcs_t"><span class="returnvalue">hb_font_funcs_t</span></a> *
 hb_font_funcs_create (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>Creates a new <a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t" title="hb_font_funcs_t"><span class="type">hb_font_funcs_t</span></a> structure of font functions.</p>
 <p><span class="annotation">[Xconstructor]</span></p>
 <div class="refsect3">
 <a name="hb-font-funcs-create.returns"></a><h4>Returns</h4>
-<p>. </p>
+<p>The font-functions structure. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
@@ -977,6 +1039,9 @@ hb_font_funcs_create (<em class="parameter"><code><span class="type">void</span>
 <a name="hb-font-funcs-destroy"></a><h3>hb_font_funcs_destroy ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_font_funcs_destroy (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t" title="hb_font_funcs_t"><span class="type">hb_font_funcs_t</span></a> *ffuncs</code></em>);</pre>
+<p>Decreases the reference count on a font-functions structure. When
+the reference count reaches zero, the font-functions structure is
+destroyed, freeing all memory.</p>
 <p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
 <div class="refsect3">
 <a name="hb-font-funcs-destroy.parameters"></a><h4>Parameters</h4>
@@ -988,7 +1053,7 @@ hb_font_funcs_destroy (<em class="parameter"><code><a class="link" href="harfbuz
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>ffuncs</p></td>
-<td class="parameter_description"><p>font functions.</p></td>
+<td class="parameter_description"><p>The font-functions structure</p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
@@ -1000,9 +1065,10 @@ hb_font_funcs_destroy (<em class="parameter"><code><a class="link" href="harfbuz
 <a name="hb-font-funcs-get-empty"></a><h3>hb_font_funcs_get_empty ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t" title="hb_font_funcs_t"><span class="returnvalue">hb_font_funcs_t</span></a> *
 hb_font_funcs_get_empty (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>Fetches an empty font-functions structure.</p>
 <div class="refsect3">
 <a name="hb-font-funcs-get-empty.returns"></a><h4>Returns</h4>
-<p>. </p>
+<p>The font-functions structure. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
@@ -1013,6 +1079,8 @@ hb_font_funcs_get_empty (<em class="parameter"><code><span class="type">void</sp
 <pre class="programlisting"><span class="returnvalue">void</span> *
 hb_font_funcs_get_user_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t" title="hb_font_funcs_t"><span class="type">hb_font_funcs_t</span></a> *ffuncs</code></em>,
                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-user-data-key-t" title="hb_user_data_key_t"><span class="type">hb_user_data_key_t</span></a> *key</code></em>);</pre>
+<p>Fetches the user data associated with the specified key,
+attached to the specified font-functions structure.</p>
 <p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
 <div class="refsect3">
 <a name="hb-font-funcs-get-user-data.parameters"></a><h4>Parameters</h4>
@@ -1022,16 +1090,23 @@ hb_font_funcs_get_user_data (<em class="parameter"><code><a class="link" href="h
 <col class="parameters_description">
 <col width="200px" class="parameters_annotations">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
 <td class="parameter_name"><p>ffuncs</p></td>
-<td class="parameter_description"><p>font functions.</p></td>
+<td class="parameter_description"><p>The font-functions structure</p></td>
 <td class="parameter_annotations"> </td>
-</tr></tbody>
+</tr>
+<tr>
+<td class="parameter_name"><p>key</p></td>
+<td class="parameter_description"><p>The user-data key to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
 </table></div>
 </div>
 <div class="refsect3">
 <a name="hb-font-funcs-get-user-data.returns"></a><h4>Returns</h4>
-<p>. </p>
+<p>A pointer to the user data. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
@@ -1041,6 +1116,7 @@ hb_font_funcs_get_user_data (<em class="parameter"><code><a class="link" href="h
 <a name="hb-font-funcs-is-immutable"></a><h3>hb_font_funcs_is_immutable ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 hb_font_funcs_is_immutable (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t" title="hb_font_funcs_t"><span class="type">hb_font_funcs_t</span></a> *ffuncs</code></em>);</pre>
+<p>Tests whether a font-functions structure is immutable.</p>
 <div class="refsect3">
 <a name="hb-font-funcs-is-immutable.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -1051,11 +1127,16 @@ hb_font_funcs_is_immutable (<em class="parameter"><code><a class="link" href="ha
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>ffuncs</p></td>
-<td class="parameter_description"><p>font functions.</p></td>
+<td class="parameter_description"><p>The font-functions structure</p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-font-funcs-is-immutable.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> if <em class="parameter"><code>ffuncs</code></em>
+is immutable, <code class="literal">false</code> otherwise</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
 <hr>
@@ -1063,6 +1144,7 @@ hb_font_funcs_is_immutable (<em class="parameter"><code><a class="link" href="ha
 <a name="hb-font-funcs-make-immutable"></a><h3>hb_font_funcs_make_immutable ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_font_funcs_make_immutable (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t" title="hb_font_funcs_t"><span class="type">hb_font_funcs_t</span></a> *ffuncs</code></em>);</pre>
+<p>Makes a font-functions structure immutable.</p>
 <div class="refsect3">
 <a name="hb-font-funcs-make-immutable.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -1073,7 +1155,7 @@ hb_font_funcs_make_immutable (<em class="parameter"><code><a class="link" href="
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>ffuncs</p></td>
-<td class="parameter_description"><p>font functions.</p></td>
+<td class="parameter_description"><p>The font-functions structure</p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
@@ -1085,6 +1167,7 @@ hb_font_funcs_make_immutable (<em class="parameter"><code><a class="link" href="
 <a name="hb-font-funcs-reference"></a><h3>hb_font_funcs_reference ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t" title="hb_font_funcs_t"><span class="returnvalue">hb_font_funcs_t</span></a> *
 hb_font_funcs_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t" title="hb_font_funcs_t"><span class="type">hb_font_funcs_t</span></a> *ffuncs</code></em>);</pre>
+<p>Increases the reference count on a font-functions structure.</p>
 <p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
 <div class="refsect3">
 <a name="hb-font-funcs-reference.parameters"></a><h4>Parameters</h4>
@@ -1096,11 +1179,15 @@ hb_font_funcs_reference (<em class="parameter"><code><a class="link" href="harfb
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>ffuncs</p></td>
-<td class="parameter_description"><p>font functions.</p></td>
+<td class="parameter_description"><p>The font-functions structure</p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-font-funcs-reference.returns"></a><h4>Returns</h4>
+<p> The font-functions structure</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
 <hr>
@@ -1112,6 +1199,7 @@ hb_font_funcs_set_glyph_contour_point_func
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-contour-point-func-t" title="hb_font_get_glyph_contour_point_func_t ()"><span class="type">hb_font_get_glyph_contour_point_func_t</span></a> func</code></em>,
                                 <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<p>Sets the implementation function for <a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-contour-point-func-t" title="hb_font_get_glyph_contour_point_func_t ()"><span class="type">hb_font_get_glyph_contour_point_func_t</span></a>.</p>
 <div class="refsect3">
 <a name="hb-font-funcs-set-glyph-contour-point-func.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -1123,14 +1211,26 @@ hb_font_funcs_set_glyph_contour_point_func
 <tbody>
 <tr>
 <td class="parameter_name"><p>ffuncs</p></td>
-<td class="parameter_description"><p>font functions.</p></td>
+<td class="parameter_description"><p>A font-function structure</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>func</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The callback function to assign. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> user_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
 </tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>Data to pass to <em class="parameter"><code>func</code></em>
+</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>destroy</p></td>
+<td class="parameter_description"><p>The function to call when <em class="parameter"><code>user_data</code></em>
+is not needed anymore. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></td>
+</tr>
 </tbody>
 </table></div>
 </div>
@@ -1144,6 +1244,7 @@ hb_font_funcs_set_glyph_extents_func (<em class="parameter"><code><a class="link
                                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-extents-func-t" title="hb_font_get_glyph_extents_func_t ()"><span class="type">hb_font_get_glyph_extents_func_t</span></a> func</code></em>,
                                       <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<p>Sets the implementation function for <a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-extents-func-t" title="hb_font_get_glyph_extents_func_t ()"><span class="type">hb_font_get_glyph_extents_func_t</span></a>.</p>
 <div class="refsect3">
 <a name="hb-font-funcs-set-glyph-extents-func.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -1155,14 +1256,26 @@ hb_font_funcs_set_glyph_extents_func (<em class="parameter"><code><a class="link
 <tbody>
 <tr>
 <td class="parameter_name"><p>ffuncs</p></td>
-<td class="parameter_description"><p>font functions.</p></td>
+<td class="parameter_description"><p>A font-function structure</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>func</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The callback function to assign. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> user_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
 </tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>Data to pass to <em class="parameter"><code>func</code></em>
+</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>destroy</p></td>
+<td class="parameter_description"><p>The function to call when <em class="parameter"><code>user_data</code></em>
+is not needed anymore. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></td>
+</tr>
 </tbody>
 </table></div>
 </div>
@@ -1177,6 +1290,7 @@ hb_font_funcs_set_glyph_from_name_func
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-from-name-func-t" title="hb_font_get_glyph_from_name_func_t ()"><span class="type">hb_font_get_glyph_from_name_func_t</span></a> func</code></em>,
                                 <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<p>Sets the implementation function for <a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-from-name-func-t" title="hb_font_get_glyph_from_name_func_t ()"><span class="type">hb_font_get_glyph_from_name_func_t</span></a>.</p>
 <div class="refsect3">
 <a name="hb-font-funcs-set-glyph-from-name-func.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -1188,14 +1302,26 @@ hb_font_funcs_set_glyph_from_name_func
 <tbody>
 <tr>
 <td class="parameter_name"><p>ffuncs</p></td>
-<td class="parameter_description"><p>font functions.</p></td>
+<td class="parameter_description"><p>A font-function structure</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>func</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The callback function to assign. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> user_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
 </tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>Data to pass to <em class="parameter"><code>func</code></em>
+</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>destroy</p></td>
+<td class="parameter_description"><p>The function to call when <em class="parameter"><code>user_data</code></em>
+is not needed anymore. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></td>
+</tr>
 </tbody>
 </table></div>
 </div>
@@ -1210,6 +1336,7 @@ hb_font_funcs_set_glyph_h_advance_func
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-h-advance-func-t" title="hb_font_get_glyph_h_advance_func_t"><span class="type">hb_font_get_glyph_h_advance_func_t</span></a> func</code></em>,
                                 <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<p>Sets the implementation function for <a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-h-advance-func-t" title="hb_font_get_glyph_h_advance_func_t"><span class="type">hb_font_get_glyph_h_advance_func_t</span></a>.</p>
 <div class="refsect3">
 <a name="hb-font-funcs-set-glyph-h-advance-func.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -1221,14 +1348,26 @@ hb_font_funcs_set_glyph_h_advance_func
 <tbody>
 <tr>
 <td class="parameter_name"><p>ffuncs</p></td>
-<td class="parameter_description"><p>font functions.</p></td>
+<td class="parameter_description"><p>A font-function structure</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>func</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The callback function to assign. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> user_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
 </tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>Data to pass to <em class="parameter"><code>func</code></em>
+</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>destroy</p></td>
+<td class="parameter_description"><p>The function to call when <em class="parameter"><code>user_data</code></em>
+is not needed anymore. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></td>
+</tr>
 </tbody>
 </table></div>
 </div>
@@ -1243,6 +1382,7 @@ hb_font_funcs_set_glyph_h_advances_func
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-h-advances-func-t" title="hb_font_get_glyph_h_advances_func_t"><span class="type">hb_font_get_glyph_h_advances_func_t</span></a> func</code></em>,
                                 <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<p>Sets the implementation function for <a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-h-advances-func-t" title="hb_font_get_glyph_h_advances_func_t"><span class="type">hb_font_get_glyph_h_advances_func_t</span></a>.</p>
 <div class="refsect3">
 <a name="hb-font-funcs-set-glyph-h-advances-func.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -1254,14 +1394,26 @@ hb_font_funcs_set_glyph_h_advances_func
 <tbody>
 <tr>
 <td class="parameter_name"><p>ffuncs</p></td>
-<td class="parameter_description"><p>font functions.</p></td>
+<td class="parameter_description"><p>A font-function structure</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>func</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The callback function to assign. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> user_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
 </tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>Data to pass to <em class="parameter"><code>func</code></em>
+</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>destroy</p></td>
+<td class="parameter_description"><p>The function to call when <em class="parameter"><code>user_data</code></em>
+is not needed anymore. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></td>
+</tr>
 </tbody>
 </table></div>
 </div>
@@ -1276,6 +1428,7 @@ hb_font_funcs_set_glyph_h_kerning_func
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-h-kerning-func-t" title="hb_font_get_glyph_h_kerning_func_t"><span class="type">hb_font_get_glyph_h_kerning_func_t</span></a> func</code></em>,
                                 <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<p>Sets the implementation function for <a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-h-kerning-func-t" title="hb_font_get_glyph_h_kerning_func_t"><span class="type">hb_font_get_glyph_h_kerning_func_t</span></a>.</p>
 <div class="refsect3">
 <a name="hb-font-funcs-set-glyph-h-kerning-func.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -1287,14 +1440,26 @@ hb_font_funcs_set_glyph_h_kerning_func
 <tbody>
 <tr>
 <td class="parameter_name"><p>ffuncs</p></td>
-<td class="parameter_description"><p>font functions.</p></td>
+<td class="parameter_description"><p>A font-function structure</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>func</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The callback function to assign. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> user_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
 </tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>Data to pass to <em class="parameter"><code>func</code></em>
+</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>destroy</p></td>
+<td class="parameter_description"><p>The function to call when <em class="parameter"><code>user_data</code></em>
+is not needed anymore. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></td>
+</tr>
 </tbody>
 </table></div>
 </div>
@@ -1308,6 +1473,7 @@ hb_font_funcs_set_glyph_h_origin_func (<em class="parameter"><code><a class="lin
                                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-h-origin-func-t" title="hb_font_get_glyph_h_origin_func_t"><span class="type">hb_font_get_glyph_h_origin_func_t</span></a> func</code></em>,
                                        <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<p>Sets the implementation function for <a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-h-origin-func-t" title="hb_font_get_glyph_h_origin_func_t"><span class="type">hb_font_get_glyph_h_origin_func_t</span></a>.</p>
 <div class="refsect3">
 <a name="hb-font-funcs-set-glyph-h-origin-func.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -1319,14 +1485,26 @@ hb_font_funcs_set_glyph_h_origin_func (<em class="parameter"><code><a class="lin
 <tbody>
 <tr>
 <td class="parameter_name"><p>ffuncs</p></td>
-<td class="parameter_description"><p>font functions.</p></td>
+<td class="parameter_description"><p>A font-function structure</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>func</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The callback function to assign. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> user_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
 </tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>Data to pass to <em class="parameter"><code>func</code></em>
+</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>destroy</p></td>
+<td class="parameter_description"><p>The function to call when <em class="parameter"><code>user_data</code></em>
+is not needed anymore. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></td>
+</tr>
 </tbody>
 </table></div>
 </div>
@@ -1340,6 +1518,7 @@ hb_font_funcs_set_glyph_name_func (<em class="parameter"><code><a class="link" h
                                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-name-func-t" title="hb_font_get_glyph_name_func_t ()"><span class="type">hb_font_get_glyph_name_func_t</span></a> func</code></em>,
                                    <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<p>Sets the implementation function for <a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-name-func-t" title="hb_font_get_glyph_name_func_t ()"><span class="type">hb_font_get_glyph_name_func_t</span></a>.</p>
 <div class="refsect3">
 <a name="hb-font-funcs-set-glyph-name-func.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -1351,14 +1530,26 @@ hb_font_funcs_set_glyph_name_func (<em class="parameter"><code><a class="link" h
 <tbody>
 <tr>
 <td class="parameter_name"><p>ffuncs</p></td>
-<td class="parameter_description"><p>font functions.</p></td>
+<td class="parameter_description"><p>A font-function structure</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>func</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The callback function to assign. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> user_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
 </tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>Data to pass to <em class="parameter"><code>func</code></em>
+</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>destroy</p></td>
+<td class="parameter_description"><p>The function to call when <em class="parameter"><code>user_data</code></em>
+is not needed anymore. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></td>
+</tr>
 </tbody>
 </table></div>
 </div>
@@ -1373,6 +1564,7 @@ hb_font_funcs_set_glyph_v_advance_func
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-v-advance-func-t" title="hb_font_get_glyph_v_advance_func_t"><span class="type">hb_font_get_glyph_v_advance_func_t</span></a> func</code></em>,
                                 <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<p>Sets the implementation function for <a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-v-advance-func-t" title="hb_font_get_glyph_v_advance_func_t"><span class="type">hb_font_get_glyph_v_advance_func_t</span></a>.</p>
 <div class="refsect3">
 <a name="hb-font-funcs-set-glyph-v-advance-func.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -1384,14 +1576,26 @@ hb_font_funcs_set_glyph_v_advance_func
 <tbody>
 <tr>
 <td class="parameter_name"><p>ffuncs</p></td>
-<td class="parameter_description"><p>font functions.</p></td>
+<td class="parameter_description"><p>A font-function structure</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>func</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The callback function to assign. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> user_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
 </tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>Data to pass to <em class="parameter"><code>func</code></em>
+</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>destroy</p></td>
+<td class="parameter_description"><p>The function to call when <em class="parameter"><code>user_data</code></em>
+is not needed anymore. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></td>
+</tr>
 </tbody>
 </table></div>
 </div>
@@ -1406,6 +1610,7 @@ hb_font_funcs_set_glyph_v_advances_func
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-v-advances-func-t" title="hb_font_get_glyph_v_advances_func_t"><span class="type">hb_font_get_glyph_v_advances_func_t</span></a> func</code></em>,
                                 <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<p>Sets the implementation function for <a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-v-advances-func-t" title="hb_font_get_glyph_v_advances_func_t"><span class="type">hb_font_get_glyph_v_advances_func_t</span></a>.</p>
 <div class="refsect3">
 <a name="hb-font-funcs-set-glyph-v-advances-func.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -1417,14 +1622,26 @@ hb_font_funcs_set_glyph_v_advances_func
 <tbody>
 <tr>
 <td class="parameter_name"><p>ffuncs</p></td>
-<td class="parameter_description"><p>font functions.</p></td>
+<td class="parameter_description"><p>A font-function structure</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>func</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The callback function to assign. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> user_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
 </tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>Data to pass to <em class="parameter"><code>func</code></em>
+</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>destroy</p></td>
+<td class="parameter_description"><p>The function to call when <em class="parameter"><code>user_data</code></em>
+is not needed anymore. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></td>
+</tr>
 </tbody>
 </table></div>
 </div>
@@ -1438,6 +1655,7 @@ hb_font_funcs_set_glyph_v_origin_func (<em class="parameter"><code><a class="lin
                                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-v-origin-func-t" title="hb_font_get_glyph_v_origin_func_t"><span class="type">hb_font_get_glyph_v_origin_func_t</span></a> func</code></em>,
                                        <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<p>Sets the implementation function for <a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph-v-origin-func-t" title="hb_font_get_glyph_v_origin_func_t"><span class="type">hb_font_get_glyph_v_origin_func_t</span></a>.</p>
 <div class="refsect3">
 <a name="hb-font-funcs-set-glyph-v-origin-func.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -1449,14 +1667,26 @@ hb_font_funcs_set_glyph_v_origin_func (<em class="parameter"><code><a class="lin
 <tbody>
 <tr>
 <td class="parameter_name"><p>ffuncs</p></td>
-<td class="parameter_description"><p>font functions.</p></td>
+<td class="parameter_description"><p>A font-function structure</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>func</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The callback function to assign. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> user_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
 </tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>Data to pass to <em class="parameter"><code>func</code></em>
+</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>destroy</p></td>
+<td class="parameter_description"><p>The function to call when <em class="parameter"><code>user_data</code></em>
+is not needed anymore. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></td>
+</tr>
 </tbody>
 </table></div>
 </div>
@@ -1470,6 +1700,7 @@ hb_font_funcs_set_nominal_glyph_func (<em class="parameter"><code><a class="link
                                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-get-nominal-glyph-func-t" title="hb_font_get_nominal_glyph_func_t ()"><span class="type">hb_font_get_nominal_glyph_func_t</span></a> func</code></em>,
                                       <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<p>Sets the implementation function for <a class="link" href="harfbuzz-hb-font.html#hb-font-get-nominal-glyph-func-t" title="hb_font_get_nominal_glyph_func_t ()"><span class="type">hb_font_get_nominal_glyph_func_t</span></a>.</p>
 <div class="refsect3">
 <a name="hb-font-funcs-set-nominal-glyph-func.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -1481,14 +1712,26 @@ hb_font_funcs_set_nominal_glyph_func (<em class="parameter"><code><a class="link
 <tbody>
 <tr>
 <td class="parameter_name"><p>ffuncs</p></td>
-<td class="parameter_description"><p>font functions.</p></td>
+<td class="parameter_description"><p>A font-function structure</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>func</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The callback function to assign. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> user_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
 </tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>Data to pass to <em class="parameter"><code>func</code></em>
+</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>destroy</p></td>
+<td class="parameter_description"><p>The function to call when <em class="parameter"><code>user_data</code></em>
+is not needed anymore. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></td>
+</tr>
 </tbody>
 </table></div>
 </div>
@@ -1502,6 +1745,7 @@ hb_font_funcs_set_nominal_glyphs_func (<em class="parameter"><code><a class="lin
                                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-get-nominal-glyphs-func-t" title="hb_font_get_nominal_glyphs_func_t ()"><span class="type">hb_font_get_nominal_glyphs_func_t</span></a> func</code></em>,
                                        <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<p>Sets the implementation function for <a class="link" href="harfbuzz-hb-font.html#hb-font-get-nominal-glyphs-func-t" title="hb_font_get_nominal_glyphs_func_t ()"><span class="type">hb_font_get_nominal_glyphs_func_t</span></a>.</p>
 <div class="refsect3">
 <a name="hb-font-funcs-set-nominal-glyphs-func.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -1513,14 +1757,26 @@ hb_font_funcs_set_nominal_glyphs_func (<em class="parameter"><code><a class="lin
 <tbody>
 <tr>
 <td class="parameter_name"><p>ffuncs</p></td>
-<td class="parameter_description"><p>font functions.</p></td>
+<td class="parameter_description"><p>A font-function structure</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>func</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The callback function to assign. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> user_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
 </tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>Data to pass to <em class="parameter"><code>func</code></em>
+</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>destroy</p></td>
+<td class="parameter_description"><p>The function to call when <em class="parameter"><code>user_data</code></em>
+is not needed anymore. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></td>
+</tr>
 </tbody>
 </table></div>
 </div>
@@ -1535,6 +1791,7 @@ hb_font_funcs_set_user_data (<em class="parameter"><code><a class="link" href="h
                              <em class="parameter"><code><span class="type">void</span> *data</code></em>,
                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>,
                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="type">hb_bool_t</span></a> replace</code></em>);</pre>
+<p>Attaches a user-data key/data pair to the specified font-functions structure.</p>
 <p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
 <div class="refsect3">
 <a name="hb-font-funcs-set-user-data.parameters"></a><h4>Parameters</h4>
@@ -1544,13 +1801,40 @@ hb_font_funcs_set_user_data (<em class="parameter"><code><a class="link" href="h
 <col class="parameters_description">
 <col width="200px" class="parameters_annotations">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
 <td class="parameter_name"><p>ffuncs</p></td>
-<td class="parameter_description"><p>font functions.</p></td>
+<td class="parameter_description"><p>The font-functions structure</p></td>
 <td class="parameter_annotations"> </td>
-</tr></tbody>
+</tr>
+<tr>
+<td class="parameter_name"><p>key</p></td>
+<td class="parameter_description"><p>The user-data key to set</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>data</p></td>
+<td class="parameter_description"><p>A pointer to the user data set</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>destroy</p></td>
+<td class="parameter_description"><p>A callback to call when <em class="parameter"><code>data</code></em>
+is not needed anymore. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>replace</p></td>
+<td class="parameter_description"><p>Whether to replace an existing data with the same key</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-font-funcs-set-user-data.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> if success, <code class="literal">false</code> otherwise</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
 <hr>
@@ -1562,6 +1846,7 @@ hb_font_funcs_set_variation_glyph_func
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-get-variation-glyph-func-t" title="hb_font_get_variation_glyph_func_t ()"><span class="type">hb_font_get_variation_glyph_func_t</span></a> func</code></em>,
                                 <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<p>Sets the implementation function for <a class="link" href="harfbuzz-hb-font.html#hb-font-get-variation-glyph-func-t" title="hb_font_get_variation_glyph_func_t ()"><span class="type">hb_font_get_variation_glyph_func_t</span></a>.</p>
 <div class="refsect3">
 <a name="hb-font-funcs-set-variation-glyph-func.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -1573,14 +1858,26 @@ hb_font_funcs_set_variation_glyph_func
 <tbody>
 <tr>
 <td class="parameter_name"><p>ffuncs</p></td>
-<td class="parameter_description"><p>font functions.</p></td>
+<td class="parameter_description"><p>A font-function structure</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>func</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The callback function to assign. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> user_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
 </tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>Data to pass to <em class="parameter"><code>func</code></em>
+</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>destroy</p></td>
+<td class="parameter_description"><p>The function to call when <em class="parameter"><code>user_data</code></em>
+is not needed anymore. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></td>
+</tr>
 </tbody>
 </table></div>
 </div>
@@ -1591,9 +1888,11 @@ hb_font_funcs_set_variation_glyph_func
 <a name="hb-font-get-empty"></a><h3>hb_font_get_empty ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="returnvalue">hb_font_t</span></a> *
 hb_font_get_empty (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>Fetches the empty font object.</p>
 <div class="refsect3">
 <a name="hb-font-get-empty.returns"></a><h4>Returns</h4>
-<p> (transfer full)</p>
+<p>The empty font object. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
@@ -1602,6 +1901,7 @@ hb_font_get_empty (<em class="parameter"><code><span class="type">void</span></c
 <a name="hb-font-get-face"></a><h3>hb_font_get_face ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="returnvalue">hb_face_t</span></a> *
 hb_font_get_face (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
+<p>Fetches the face associated with the specified font object.</p>
 <div class="refsect3">
 <a name="hb-font-get-face.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -1612,14 +1912,14 @@ hb_font_get_face (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>font</p></td>
-<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
 </div>
 <div class="refsect3">
 <a name="hb-font-get-face.returns"></a><h4>Returns</h4>
-<p>. </p>
+<p>The <a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> value. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
@@ -1632,6 +1932,11 @@ hb_font_get_glyph (<em class="parameter"><code><a class="link" href="harfbuzz-hb
                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> unicode</code></em>,
                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> variation_selector</code></em>,
                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *glyph</code></em>);</pre>
+<p>Fetches the glyph ID for a Unicode code point in the specified
+font, with an optional variation selector.</p>
+<p>If <em class="parameter"><code>variation_selector</code></em>
+ is 0, calls <a class="link" href="harfbuzz-hb-font.html#hb-font-get-nominal-glyph" title="hb_font_get_nominal_glyph ()"><code class="function">hb_font_get_nominal_glyph()</code></a>;
+otherwise calls <a class="link" href="harfbuzz-hb-font.html#hb-font-get-variation-glyph" title="hb_font_get_variation_glyph ()"><code class="function">hb_font_get_variation_glyph()</code></a>.</p>
 <div class="refsect3">
 <a name="hb-font-get-glyph.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -1643,17 +1948,31 @@ hb_font_get_glyph (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 <tbody>
 <tr>
 <td class="parameter_name"><p>font</p></td>
-<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>unicode</p></td>
+<td class="parameter_description"><p>The Unicode code point to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>variation_selector</p></td>
+<td class="parameter_description"><p>A variation-selector code point</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>glyph</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The glyph ID retrieved. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
 </tr>
 </tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-font-get-glyph.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> if data found, <code class="literal">false</code> otherwise</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
 <hr>
@@ -1666,6 +1985,11 @@ hb_font_get_glyph_advance_for_direction
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="type">hb_direction_t</span></a> direction</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *x</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *y</code></em>);</pre>
+<p>Fetches the advance for a glyph ID from the specified font,
+in a text segment of the specified direction.</p>
+<p>Calls the appropriate direction-specific variant (horizontal
+or vertical) depending on the value of <em class="parameter"><code>direction</code></em>
+.</p>
 <div class="refsect3">
 <a name="hb-font-get-glyph-advance-for-direction.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -1677,17 +2001,27 @@ hb_font_get_glyph_advance_for_direction
 <tbody>
 <tr>
 <td class="parameter_name"><p>font</p></td>
-<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>glyph</p></td>
+<td class="parameter_description"><p>The glyph ID to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>direction</p></td>
+<td class="parameter_description"><p>The direction of the text segment</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>x</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The horizontal advance retrieved. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>y</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The vertical advance retrieved. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
 </tr>
 </tbody>
@@ -1703,6 +2037,48 @@ hb_font_get_glyph_advance_for_direction
                                      <em class="parameter"><code><span class="type">void</span> *font_data</code></em>,
                                      <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> glyph</code></em>,
                                      <em class="parameter"><code><span class="type">void</span> *user_data</code></em>);</pre>
+<p>A virtual method for the <a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t" title="hb_font_funcs_t"><span class="type">hb_font_funcs_t</span></a> of an <a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> object.</p>
+<p>This method should retrieve the advance for a specified glyph. The
+method must return an <a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a>.</p>
+<div class="refsect3">
+<a name="hb-font-get-glyph-advance-func-t.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>font_data</p></td>
+<td class="parameter_description"><p><em class="parameter"><code>font</code></em>
+user data pointer</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>glyph</p></td>
+<td class="parameter_description"><p>The glyph ID to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>User data pointer passed by the caller</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-font-get-glyph-advance-func-t.returns"></a><h4>Returns</h4>
+<p> The advance of <em class="parameter"><code>glyph</code></em>
+within <em class="parameter"><code>font</code></em>
+</p>
+</div>
 </div>
 <hr>
 <div class="refsect2">
@@ -1716,6 +2092,11 @@ hb_font_get_glyph_advances_for_direction
                                 <em class="parameter"><code><span class="type">unsigned </span> glyph_stride</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *first_advance</code></em>,
                                 <em class="parameter"><code><span class="type">unsigned </span> advance_stride</code></em>);</pre>
+<p>Fetches the advances for a sequence of glyph IDs in the specified
+font, in a text segment of the specified direction.</p>
+<p>Calls the appropriate direction-specific variant (horizontal
+or vertical) depending on the value of <em class="parameter"><code>direction</code></em>
+.</p>
 <div class="refsect3">
 <a name="hb-font-get-glyph-advances-for-direction.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -1724,11 +2105,43 @@ hb_font_get_glyph_advances_for_direction
 <col class="parameters_description">
 <col width="200px" class="parameters_annotations">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
 <td class="parameter_name"><p>font</p></td>
-<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
 <td class="parameter_annotations"> </td>
-</tr></tbody>
+</tr>
+<tr>
+<td class="parameter_name"><p>direction</p></td>
+<td class="parameter_description"><p>The direction of the text segment</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>count</p></td>
+<td class="parameter_description"><p>The number of glyph IDs in the sequence queried</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>first_glyph</p></td>
+<td class="parameter_description"><p>The first glyph ID to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>glyph_stride</p></td>
+<td class="parameter_description"><p>The stride between successive glyph IDs</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>first_advance</p></td>
+<td class="parameter_description"><p>The first advance retrieved. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>advance_stride</p></td>
+<td class="parameter_description"><p>The stride between successive advances. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+</tbody>
 </table></div>
 </div>
 <p class="since">Since: <a class="link" href="api-index-1-8-6.html#api-index-1.8.6">1.8.6</a></p>
@@ -1745,6 +2158,61 @@ hb_font_get_glyph_advances_for_direction
                                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *first_advance</code></em>,
                                       <em class="parameter"><code><span class="type">unsigned </span> advance_stride</code></em>,
                                       <em class="parameter"><code><span class="type">void</span> *user_data</code></em>);</pre>
+<p>A virtual method for the <a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t" title="hb_font_funcs_t"><span class="type">hb_font_funcs_t</span></a> of an <a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> object.</p>
+<p>This method should retrieve the advances for a sequence of glyphs.</p>
+<div class="refsect3">
+<a name="hb-font-get-glyph-advances-func-t.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>font_data</p></td>
+<td class="parameter_description"><p><em class="parameter"><code>font</code></em>
+user data pointer</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>count</p></td>
+<td class="parameter_description"><p>The number of glyph IDs in the sequence queried</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>first_glyph</p></td>
+<td class="parameter_description"><p>The first glyph ID to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>glyph_stride</p></td>
+<td class="parameter_description"><p>The stride between successive glyph IDs</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>first_advance</p></td>
+<td class="parameter_description"><p>The first advance retrieved. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>advance_stride</p></td>
+<td class="parameter_description"><p>The stride between successive advances</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>User data pointer passed by the caller</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
 </div>
 <hr>
 <div class="refsect2">
@@ -1755,6 +2223,8 @@ hb_font_get_glyph_contour_point (<em class="parameter"><code><a class="link" hre
                                  <em class="parameter"><code>unsigned <span class="type">int</span> point_index</code></em>,
                                  <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *x</code></em>,
                                  <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *y</code></em>);</pre>
+<p>Fetches the (x,y) coordinates of a specified contour-point index
+in the specified glyph, within the specified font.</p>
 <div class="refsect3">
 <a name="hb-font-get-glyph-contour-point.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -1766,22 +2236,36 @@ hb_font_get_glyph_contour_point (<em class="parameter"><code><a class="link" hre
 <tbody>
 <tr>
 <td class="parameter_name"><p>font</p></td>
-<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>glyph</p></td>
+<td class="parameter_description"><p>The glyph ID to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>point_index</p></td>
+<td class="parameter_description"><p>The contour-point index to query</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>x</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The X value retrieved for the contour point. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>y</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The Y value retrieved for the contour point. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
 </tr>
 </tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-font-get-glyph-contour-point.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> if data found, <code class="literal">false</code> otherwise</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
 <hr>
@@ -1795,6 +2279,12 @@ hb_font_get_glyph_contour_point_for_origin
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="type">hb_direction_t</span></a> direction</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *x</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *y</code></em>);</pre>
+<p>Fetches the (X,Y) coordinates of a specified contour-point index
+in the specified glyph ID in the specified font, with respect
+to the origin in a text segment in the specified direction.</p>
+<p>Calls the appropriate direction-specific variant (horizontal
+or vertical) depending on the value of <em class="parameter"><code>direction</code></em>
+.</p>
 <div class="refsect3">
 <a name="hb-font-get-glyph-contour-point-for-origin.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -1806,22 +2296,41 @@ hb_font_get_glyph_contour_point_for_origin
 <tbody>
 <tr>
 <td class="parameter_name"><p>font</p></td>
-<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
-<td class="parameter_name"><p>x</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_name"><p>glyph</p></td>
+<td class="parameter_description"><p>The glyph ID to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>point_index</p></td>
+<td class="parameter_description"><p>The contour-point index to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>direction</p></td>
+<td class="parameter_description"><p>The direction of the text segment</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>x</p></td>
+<td class="parameter_description"><p>The X value retrieved for the contour point. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>y</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The Y value retrieved for the contour point. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
 </tr>
 </tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-font-get-glyph-contour-point-for-origin.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> if data found, <code class="literal">false</code> otherwise</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
 <hr>
@@ -1836,6 +2345,62 @@ hb_font_get_glyph_contour_point_for_origin
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *x</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *y</code></em>,
                                 <em class="parameter"><code><span class="type">void</span> *user_data</code></em>);</pre>
+<p>A virtual method for the <a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t" title="hb_font_funcs_t"><span class="type">hb_font_funcs_t</span></a> of an <a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> object.</p>
+<p>This method should retrieve the (X,Y) coordinates (in font units) for a
+specified contour point in a glyph. Each coordinate must be returned as
+an <a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> output parameter.</p>
+<div class="refsect3">
+<a name="hb-font-get-glyph-contour-point-func-t.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>font_data</p></td>
+<td class="parameter_description"><p><em class="parameter"><code>font</code></em>
+user data pointer</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>glyph</p></td>
+<td class="parameter_description"><p>The glyph ID to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>point_index</p></td>
+<td class="parameter_description"><p>The contour-point index to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>x</p></td>
+<td class="parameter_description"><p>The X value retrieved for the contour point. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>y</p></td>
+<td class="parameter_description"><p>The Y value retrieved for the contour point. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>User data pointer passed by the caller</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-font-get-glyph-contour-point-func-t.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> if data found, <code class="literal">false</code> otherwise</p>
+</div>
 </div>
 <hr>
 <div class="refsect2">
@@ -1843,7 +2408,9 @@ hb_font_get_glyph_contour_point_for_origin
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 hb_font_get_glyph_extents (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> *font</code></em>,
                            <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> glyph</code></em>,
-                           <em class="parameter"><code><span class="type">hb_glyph_extents_t</span> *extents</code></em>);</pre>
+                           <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-glyph-extents-t" title="hb_glyph_extents_t"><span class="type">hb_glyph_extents_t</span></a> *extents</code></em>);</pre>
+<p>Fetches the <a class="link" href="harfbuzz-hb-font.html#hb-glyph-extents-t" title="hb_glyph_extents_t"><span class="type">hb_glyph_extents_t</span></a> data for a glyph ID
+in the specified font.</p>
 <div class="refsect3">
 <a name="hb-font-get-glyph-extents.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -1855,17 +2422,26 @@ hb_font_get_glyph_extents (<em class="parameter"><code><a class="link" href="har
 <tbody>
 <tr>
 <td class="parameter_name"><p>font</p></td>
-<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>glyph</p></td>
+<td class="parameter_description"><p>The glyph ID to query</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>extents</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The <a class="link" href="harfbuzz-hb-font.html#hb-glyph-extents-t" title="hb_glyph_extents_t"><span class="type">hb_glyph_extents_t</span></a> retrieved. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
 </tr>
 </tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-font-get-glyph-extents.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> if data found, <code class="literal">false</code> otherwise</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
 <hr>
@@ -1875,7 +2451,13 @@ hb_font_get_glyph_extents (<em class="parameter"><code><a class="link" href="har
 hb_font_get_glyph_extents_for_origin (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> *font</code></em>,
                                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> glyph</code></em>,
                                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="type">hb_direction_t</span></a> direction</code></em>,
-                                      <em class="parameter"><code><span class="type">hb_glyph_extents_t</span> *extents</code></em>);</pre>
+                                      <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-glyph-extents-t" title="hb_glyph_extents_t"><span class="type">hb_glyph_extents_t</span></a> *extents</code></em>);</pre>
+<p>Fetches the <a class="link" href="harfbuzz-hb-font.html#hb-glyph-extents-t" title="hb_glyph_extents_t"><span class="type">hb_glyph_extents_t</span></a> data for a glyph ID
+in the specified font, with respect to the origin in
+a text segment in the specified direction.</p>
+<p>Calls the appropriate direction-specific variant (horizontal
+or vertical) depending on the value of <em class="parameter"><code>direction</code></em>
+.</p>
 <div class="refsect3">
 <a name="hb-font-get-glyph-extents-for-origin.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -1887,17 +2469,31 @@ hb_font_get_glyph_extents_for_origin (<em class="parameter"><code><a class="link
 <tbody>
 <tr>
 <td class="parameter_name"><p>font</p></td>
-<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>glyph</p></td>
+<td class="parameter_description"><p>The glyph ID to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>direction</p></td>
+<td class="parameter_description"><p>The direction of the text segment</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>extents</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The <a class="link" href="harfbuzz-hb-font.html#hb-glyph-extents-t" title="hb_glyph_extents_t"><span class="type">hb_glyph_extents_t</span></a> retrieved. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
 </tr>
 </tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-font-get-glyph-extents-for-origin.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> if data found, <code class="literal">false</code> otherwise</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
 <hr>
@@ -1907,8 +2503,53 @@ hb_font_get_glyph_extents_for_origin (<em class="parameter"><code><a class="link
 <span class="c_punctuation">(</span>*hb_font_get_glyph_extents_func_t<span class="c_punctuation">)</span> (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> *font</code></em>,
                                      <em class="parameter"><code><span class="type">void</span> *font_data</code></em>,
                                      <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> glyph</code></em>,
-                                     <em class="parameter"><code><span class="type">hb_glyph_extents_t</span> *extents</code></em>,
+                                     <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-glyph-extents-t" title="hb_glyph_extents_t"><span class="type">hb_glyph_extents_t</span></a> *extents</code></em>,
                                      <em class="parameter"><code><span class="type">void</span> *user_data</code></em>);</pre>
+<p>A virtual method for the <a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t" title="hb_font_funcs_t"><span class="type">hb_font_funcs_t</span></a> of an <a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> object.</p>
+<p>This method should retrieve the extents for a specified glyph. Extents must be 
+returned in an <span class="type">hb_glyph_extents</span> output parameter.</p>
+<div class="refsect3">
+<a name="hb-font-get-glyph-extents-func-t.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>font_data</p></td>
+<td class="parameter_description"><p><em class="parameter"><code>font</code></em>
+user data pointer</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>glyph</p></td>
+<td class="parameter_description"><p>The glyph ID to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>extents</p></td>
+<td class="parameter_description"><p>The <a class="link" href="harfbuzz-hb-font.html#hb-glyph-extents-t" title="hb_glyph_extents_t"><span class="type">hb_glyph_extents_t</span></a> retrieved. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>User data pointer passed by the caller</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-font-get-glyph-extents-func-t.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> if data found, <code class="literal">false</code> otherwise</p>
+</div>
 </div>
 <hr>
 <div class="refsect2">
@@ -1918,6 +2559,9 @@ hb_font_get_glyph_from_name (<em class="parameter"><code><a class="link" href="h
                              <em class="parameter"><code>const <span class="type">char</span> *name</code></em>,
                              <em class="parameter"><code><span class="type">int</span> len</code></em>,
                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *glyph</code></em>);</pre>
+<p>Fetches the glyph ID that corresponds to a name string in the specified <em class="parameter"><code>font</code></em>
+.</p>
+<div class="note">Note: <em class="parameter"><code>len</code></em> == -1 means the name string is null-terminated.</div>
 <div class="refsect3">
 <a name="hb-font-get-glyph-from-name.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -1929,22 +2573,31 @@ hb_font_get_glyph_from_name (<em class="parameter"><code><a class="link" href="h
 <tbody>
 <tr>
 <td class="parameter_name"><p>font</p></td>
-<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>name</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The name string to query. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=len]</span></td>
 </tr>
 <tr>
+<td class="parameter_name"><p>len</p></td>
+<td class="parameter_description"><p>The length of the name queried</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
 <td class="parameter_name"><p>glyph</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The glyph ID retrieved. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
 </tr>
 </tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-font-get-glyph-from-name.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> if data found, <code class="literal">false</code> otherwise</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
 <hr>
@@ -1957,6 +2610,56 @@ hb_font_get_glyph_from_name (<em class="parameter"><code><a class="link" href="h
                                        <em class="parameter"><code><span class="type">int</span> len</code></em>,
                                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *glyph</code></em>,
                                        <em class="parameter"><code><span class="type">void</span> *user_data</code></em>);</pre>
+<p>A virtual method for the <a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t" title="hb_font_funcs_t"><span class="type">hb_font_funcs_t</span></a> of an <a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> object.</p>
+<p>This method should retrieve the glyph ID that corresponds to a glyph-name
+string.</p>
+<div class="refsect3">
+<a name="hb-font-get-glyph-from-name-func-t.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>font_data</p></td>
+<td class="parameter_description"><p><em class="parameter"><code>font</code></em>
+user data pointer</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>name</p></td>
+<td class="parameter_description"><p>The name string to query. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=len]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>len</p></td>
+<td class="parameter_description"><p>The length of the name queried</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>glyph</p></td>
+<td class="parameter_description"><p>The glyph ID retrieved. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>User data pointer passed by the caller</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-font-get-glyph-from-name-func-t.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> if data found, <code class="literal">false</code> otherwise</p>
+</div>
 </div>
 <hr>
 <div class="refsect2">
@@ -1964,6 +2667,8 @@ hb_font_get_glyph_from_name (<em class="parameter"><code><a class="link" href="h
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="returnvalue">hb_position_t</span></a>
 hb_font_get_glyph_h_advance (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> *font</code></em>,
                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> glyph</code></em>);</pre>
+<p>Fetches the advance for a glyph ID in the specified font,
+for horizontal text segments.</p>
 <div class="refsect3">
 <a name="hb-font-get-glyph-h-advance.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -1972,13 +2677,26 @@ hb_font_get_glyph_h_advance (<em class="parameter"><code><a class="link" href="h
 <col class="parameters_description">
 <col width="200px" class="parameters_annotations">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
 <td class="parameter_name"><p>font</p></td>
-<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
 <td class="parameter_annotations"> </td>
-</tr></tbody>
+</tr>
+<tr>
+<td class="parameter_name"><p>glyph</p></td>
+<td class="parameter_description"><p>The glyph ID to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-font-get-glyph-h-advance.returns"></a><h4>Returns</h4>
+<p> The advance of <em class="parameter"><code>glyph</code></em>
+within <em class="parameter"><code>font</code></em>
+</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
 <hr>
@@ -1991,6 +2709,8 @@ hb_font_get_glyph_h_advances (<em class="parameter"><code><a class="link" href="
                               <em class="parameter"><code><span class="type">unsigned </span> glyph_stride</code></em>,
                               <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *first_advance</code></em>,
                               <em class="parameter"><code><span class="type">unsigned </span> advance_stride</code></em>);</pre>
+<p>Fetches the advances for a sequence of glyph IDs in the specified
+font, for horizontal text segments.</p>
 <div class="refsect3">
 <a name="hb-font-get-glyph-h-advances.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -1999,11 +2719,38 @@ hb_font_get_glyph_h_advances (<em class="parameter"><code><a class="link" href="
 <col class="parameters_description">
 <col width="200px" class="parameters_annotations">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
 <td class="parameter_name"><p>font</p></td>
-<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
 <td class="parameter_annotations"> </td>
-</tr></tbody>
+</tr>
+<tr>
+<td class="parameter_name"><p>count</p></td>
+<td class="parameter_description"><p>The number of glyph IDs in the sequence queried</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>first_glyph</p></td>
+<td class="parameter_description"><p>The first glyph ID to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>glyph_stride</p></td>
+<td class="parameter_description"><p>The stride between successive glyph IDs</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>first_advance</p></td>
+<td class="parameter_description"><p>The first advance retrieved. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>advance_stride</p></td>
+<td class="parameter_description"><p>The stride between successive advances</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
 </table></div>
 </div>
 <p class="since">Since: <a class="link" href="api-index-1-8-6.html#api-index-1.8.6">1.8.6</a></p>
@@ -2015,6 +2762,10 @@ hb_font_get_glyph_h_advances (<em class="parameter"><code><a class="link" href="
 hb_font_get_glyph_h_kerning (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> *font</code></em>,
                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> left_glyph</code></em>,
                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> right_glyph</code></em>);</pre>
+<p>Fetches the kerning-adjustment value for a glyph-pair in
+the specified font, for horizontal text segments.</p>
+<div class="note">It handles legacy kerning only (as returned by the corresponding
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t" title="hb_font_funcs_t"><span class="type">hb_font_funcs_t</span></a> function).</div>
 <div class="refsect3">
 <a name="hb-font-get-glyph-h-kerning.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -2023,13 +2774,29 @@ hb_font_get_glyph_h_kerning (<em class="parameter"><code><a class="link" href="h
 <col class="parameters_description">
 <col width="200px" class="parameters_annotations">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
 <td class="parameter_name"><p>font</p></td>
-<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
 <td class="parameter_annotations"> </td>
-</tr></tbody>
+</tr>
+<tr>
+<td class="parameter_name"><p>left_glyph</p></td>
+<td class="parameter_description"><p>The glyph ID of the left glyph in the glyph pair</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>right_glyph</p></td>
+<td class="parameter_description"><p>The glyph ID of the right glyph in the glyph pair</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-font-get-glyph-h-kerning.returns"></a><h4>Returns</h4>
+<p> The kerning adjustment value</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
 <hr>
@@ -2040,6 +2807,8 @@ hb_font_get_glyph_h_origin (<em class="parameter"><code><a class="link" href="ha
                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> glyph</code></em>,
                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *x</code></em>,
                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *y</code></em>);</pre>
+<p>Fetches the (X,Y) coordinates of the origin for a glyph ID
+in the specified font, for horizontal text segments.</p>
 <div class="refsect3">
 <a name="hb-font-get-glyph-h-origin.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -2051,22 +2820,31 @@ hb_font_get_glyph_h_origin (<em class="parameter"><code><a class="link" href="ha
 <tbody>
 <tr>
 <td class="parameter_name"><p>font</p></td>
-<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>glyph</p></td>
+<td class="parameter_description"><p>The glyph ID to query</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>x</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The X coordinate of the origin. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>y</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The Y coordinate of the origin. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
 </tr>
 </tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-font-get-glyph-h-origin.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> if data found, <code class="literal">false</code> otherwise</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
 <hr>
@@ -2080,6 +2858,10 @@ hb_font_get_glyph_kerning_for_direction
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="type">hb_direction_t</span></a> direction</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *x</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *y</code></em>);</pre>
+<p>Fetches the kerning-adjustment value for a glyph-pair in the specified font.</p>
+<p>Calls the appropriate direction-specific variant (horizontal
+or vertical) depending on the value of <em class="parameter"><code>direction</code></em>
+.</p>
 <div class="refsect3">
 <a name="hb-font-get-glyph-kerning-for-direction.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -2091,17 +2873,32 @@ hb_font_get_glyph_kerning_for_direction
 <tbody>
 <tr>
 <td class="parameter_name"><p>font</p></td>
-<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>first_glyph</p></td>
+<td class="parameter_description"><p>The glyph ID of the first glyph in the glyph pair to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>second_glyph</p></td>
+<td class="parameter_description"><p>The glyph ID of the second glyph in the glyph pair to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>direction</p></td>
+<td class="parameter_description"><p>The direction of the text segment</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>x</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The horizontal kerning-adjustment value retrieved. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>y</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The vertical kerning-adjustment value retrieved. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
 </tr>
 </tbody>
@@ -2118,6 +2915,46 @@ hb_font_get_glyph_kerning_for_direction
                                      <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> first_glyph</code></em>,
                                      <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> second_glyph</code></em>,
                                      <em class="parameter"><code><span class="type">void</span> *user_data</code></em>);</pre>
+<p>This method should retrieve the kerning-adjustment value for a glyph-pair in
+the specified font, for horizontal text segments.</p>
+<div class="refsect3">
+<a name="hb-font-get-glyph-kerning-func-t.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>font_data</p></td>
+<td class="parameter_description"><p><em class="parameter"><code>font</code></em>
+user data pointer</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>first_glyph</p></td>
+<td class="parameter_description"><p>The glyph ID of the first glyph in the glyph pair</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>second_glyph</p></td>
+<td class="parameter_description"><p>The glyph ID of the second glyph in the glyph pair</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>User data pointer passed by the caller</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
 </div>
 <hr>
 <div class="refsect2">
@@ -2127,6 +2964,8 @@ hb_font_get_glyph_name (<em class="parameter"><code><a class="link" href="harfbu
                         <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> glyph</code></em>,
                         <em class="parameter"><code><span class="type">char</span> *name</code></em>,
                         <em class="parameter"><code>unsigned <span class="type">int</span> size</code></em>);</pre>
+<p>Fetches the glyph-name string for a glyph ID in the specified <em class="parameter"><code>font</code></em>
+.</p>
 <div class="refsect3">
 <a name="hb-font-get-glyph-name.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -2138,17 +2977,31 @@ hb_font_get_glyph_name (<em class="parameter"><code><a class="link" href="harfbu
 <tbody>
 <tr>
 <td class="parameter_name"><p>font</p></td>
-<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>glyph</p></td>
+<td class="parameter_description"><p>The glyph ID to query</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>name</p></td>
-<td class="parameter_description"><p>. </p></td>
-<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=size]</span></td>
+<td class="parameter_description"><p>Name string retrieved for the glyph ID. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=size]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>size</p></td>
+<td class="parameter_description"><p>Length of the glyph-name string retrieved</p></td>
+<td class="parameter_annotations"> </td>
 </tr>
 </tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-font-get-glyph-name.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> if data found, <code class="literal">false</code> otherwise</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
 <hr>
@@ -2161,6 +3014,56 @@ hb_font_get_glyph_name (<em class="parameter"><code><a class="link" href="harfbu
                                   <em class="parameter"><code><span class="type">char</span> *name</code></em>,
                                   <em class="parameter"><code>unsigned <span class="type">int</span> size</code></em>,
                                   <em class="parameter"><code><span class="type">void</span> *user_data</code></em>);</pre>
+<p>A virtual method for the <a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t" title="hb_font_funcs_t"><span class="type">hb_font_funcs_t</span></a> of an <a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> object.</p>
+<p>This method should retrieve the glyph name that corresponds to a
+glyph ID. The name should be returned in a string output parameter.</p>
+<div class="refsect3">
+<a name="hb-font-get-glyph-name-func-t.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>font_data</p></td>
+<td class="parameter_description"><p><em class="parameter"><code>font</code></em>
+user data pointer</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>glyph</p></td>
+<td class="parameter_description"><p>The glyph ID to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>name</p></td>
+<td class="parameter_description"><p>Name string retrieved for the glyph ID. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=size]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>size</p></td>
+<td class="parameter_description"><p>Length of the glyph-name string retrieved</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>User data pointer passed by the caller</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-font-get-glyph-name-func-t.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> if data found, <code class="literal">false</code> otherwise</p>
+</div>
 </div>
 <hr>
 <div class="refsect2">
@@ -2172,6 +3075,11 @@ hb_font_get_glyph_origin_for_direction
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="type">hb_direction_t</span></a> direction</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *x</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *y</code></em>);</pre>
+<p>Fetches the (X,Y) coordinates of the origin for a glyph in
+the specified font.</p>
+<p>Calls the appropriate direction-specific variant (horizontal
+or vertical) depending on the value of <em class="parameter"><code>direction</code></em>
+.</p>
 <div class="refsect3">
 <a name="hb-font-get-glyph-origin-for-direction.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -2183,17 +3091,27 @@ hb_font_get_glyph_origin_for_direction
 <tbody>
 <tr>
 <td class="parameter_name"><p>font</p></td>
-<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>glyph</p></td>
+<td class="parameter_description"><p>The glyph ID to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>direction</p></td>
+<td class="parameter_description"><p>The direction of the text segment</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>x</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The X coordinate retrieved for the origin. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>y</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The Y coordinate retrieved for the origin. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
 </tr>
 </tbody>
@@ -2211,6 +3129,57 @@ hb_font_get_glyph_origin_for_direction
                                     <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *x</code></em>,
                                     <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *y</code></em>,
                                     <em class="parameter"><code><span class="type">void</span> *user_data</code></em>);</pre>
+<p>A virtual method for the <a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t" title="hb_font_funcs_t"><span class="type">hb_font_funcs_t</span></a> of an <a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> object.</p>
+<p>This method should retrieve the (X,Y) coordinates (in font units) of the
+origin for a glyph. Each coordinate must be returned in an <a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a>
+output parameter.</p>
+<div class="refsect3">
+<a name="hb-font-get-glyph-origin-func-t.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>font_data</p></td>
+<td class="parameter_description"><p><em class="parameter"><code>font</code></em>
+user data pointer</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>glyph</p></td>
+<td class="parameter_description"><p>The glyph ID to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>x</p></td>
+<td class="parameter_description"><p>The X coordinate of the origin. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>y</p></td>
+<td class="parameter_description"><p>The Y coordinate of the origin. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>User data pointer passed by the caller</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-font-get-glyph-origin-func-t.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> if data found, <code class="literal">false</code> otherwise</p>
+</div>
 </div>
 <hr>
 <div class="refsect2">
@@ -2218,6 +3187,8 @@ hb_font_get_glyph_origin_for_direction
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="returnvalue">hb_position_t</span></a>
 hb_font_get_glyph_v_advance (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> *font</code></em>,
                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> glyph</code></em>);</pre>
+<p>Fetches the advance for a glyph ID in the specified font,
+for vertical text segments.</p>
 <div class="refsect3">
 <a name="hb-font-get-glyph-v-advance.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -2226,13 +3197,26 @@ hb_font_get_glyph_v_advance (<em class="parameter"><code><a class="link" href="h
 <col class="parameters_description">
 <col width="200px" class="parameters_annotations">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
 <td class="parameter_name"><p>font</p></td>
-<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
 <td class="parameter_annotations"> </td>
-</tr></tbody>
+</tr>
+<tr>
+<td class="parameter_name"><p>glyph</p></td>
+<td class="parameter_description"><p>The glyph ID to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-font-get-glyph-v-advance.returns"></a><h4>Returns</h4>
+<p> The advance of <em class="parameter"><code>glyph</code></em>
+within <em class="parameter"><code>font</code></em>
+</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
 <hr>
@@ -2245,6 +3229,8 @@ hb_font_get_glyph_v_advances (<em class="parameter"><code><a class="link" href="
                               <em class="parameter"><code><span class="type">unsigned </span> glyph_stride</code></em>,
                               <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *first_advance</code></em>,
                               <em class="parameter"><code><span class="type">unsigned </span> advance_stride</code></em>);</pre>
+<p>Fetches the advances for a sequence of glyph IDs in the specified
+font, for vertical text segments.</p>
 <div class="refsect3">
 <a name="hb-font-get-glyph-v-advances.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -2253,11 +3239,38 @@ hb_font_get_glyph_v_advances (<em class="parameter"><code><a class="link" href="
 <col class="parameters_description">
 <col width="200px" class="parameters_annotations">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
 <td class="parameter_name"><p>font</p></td>
-<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
 <td class="parameter_annotations"> </td>
-</tr></tbody>
+</tr>
+<tr>
+<td class="parameter_name"><p>count</p></td>
+<td class="parameter_description"><p>The number of glyph IDs in the sequence queried</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>first_glyph</p></td>
+<td class="parameter_description"><p>The first glyph ID to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>glyph_stride</p></td>
+<td class="parameter_description"><p>The stride between successive glyph IDs</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>first_advance</p></td>
+<td class="parameter_description"><p>The first advance retrieved. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>advance_stride</p></td>
+<td class="parameter_description"><p>The stride between successive advances. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+</tbody>
 </table></div>
 </div>
 <p class="since">Since: <a class="link" href="api-index-1-8-6.html#api-index-1.8.6">1.8.6</a></p>
@@ -2270,6 +3283,8 @@ hb_font_get_glyph_v_origin (<em class="parameter"><code><a class="link" href="ha
                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> glyph</code></em>,
                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *x</code></em>,
                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *y</code></em>);</pre>
+<p>Fetches the (X,Y) coordinates of the origin for a glyph ID
+in the specified font, for vertical text segments.</p>
 <div class="refsect3">
 <a name="hb-font-get-glyph-v-origin.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -2281,22 +3296,31 @@ hb_font_get_glyph_v_origin (<em class="parameter"><code><a class="link" href="ha
 <tbody>
 <tr>
 <td class="parameter_name"><p>font</p></td>
-<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>glyph</p></td>
+<td class="parameter_description"><p>The glyph ID to query</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>x</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The X coordinate of the origin. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>y</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The Y coordinate of the origin. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
 </tr>
 </tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-font-get-glyph-v-origin.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> if data found, <code class="literal">false</code> otherwise</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
 <hr>
@@ -2306,6 +3330,11 @@ hb_font_get_glyph_v_origin (<em class="parameter"><code><a class="link" href="ha
 hb_font_get_nominal_glyph (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> *font</code></em>,
                            <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> unicode</code></em>,
                            <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *glyph</code></em>);</pre>
+<p>Fetches the nominal glyph ID for a Unicode code point in the
+specified font.</p>
+<p>This version of the function should not be used to fetch glyph IDs
+for code points modified by variation selectors. For variation-selector
+support, user <a class="link" href="harfbuzz-hb-font.html#hb-font-get-variation-glyph" title="hb_font_get_variation_glyph ()"><code class="function">hb_font_get_variation_glyph()</code></a> or use <a class="link" href="harfbuzz-hb-font.html#hb-font-get-glyph" title="hb_font_get_glyph ()"><code class="function">hb_font_get_glyph()</code></a>.</p>
 <div class="refsect3">
 <a name="hb-font-get-nominal-glyph.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -2317,17 +3346,26 @@ hb_font_get_nominal_glyph (<em class="parameter"><code><a class="link" href="har
 <tbody>
 <tr>
 <td class="parameter_name"><p>font</p></td>
-<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>unicode</p></td>
+<td class="parameter_description"><p>The Unicode code point to query</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>glyph</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The glyph ID retrieved. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
 </tr>
 </tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-font-get-nominal-glyph.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> if data found, <code class="literal">false</code> otherwise</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-1-2-3.html#api-index-1.2.3">1.2.3</a></p>
 </div>
 <hr>
@@ -2339,6 +3377,51 @@ hb_font_get_nominal_glyph (<em class="parameter"><code><a class="link" href="har
                                      <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> unicode</code></em>,
                                      <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *glyph</code></em>,
                                      <em class="parameter"><code><span class="type">void</span> *user_data</code></em>);</pre>
+<p>A virtual method for the <a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t" title="hb_font_funcs_t"><span class="type">hb_font_funcs_t</span></a> of an <a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> object.</p>
+<p>This method should retrieve the nominal glyph ID for a specified Unicode code
+point. Glyph IDs must be returned in a <a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> output parameter.</p>
+<div class="refsect3">
+<a name="hb-font-get-nominal-glyph-func-t.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>font_data</p></td>
+<td class="parameter_description"><p><em class="parameter"><code>font</code></em>
+user data pointer</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>unicode</p></td>
+<td class="parameter_description"><p>The Unicode code point to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>glyph</p></td>
+<td class="parameter_description"><p>The glyph ID retrieved. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>User data pointer passed by the caller</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-font-get-nominal-glyph-func-t.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> if data found, <code class="literal">false</code> otherwise</p>
+</div>
 </div>
 <hr>
 <div class="refsect2">
@@ -2350,6 +3433,8 @@ hb_font_get_nominal_glyphs (<em class="parameter"><code><a class="link" href="ha
                             <em class="parameter"><code>unsigned <span class="type">int</span> unicode_stride</code></em>,
                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *first_glyph</code></em>,
                             <em class="parameter"><code>unsigned <span class="type">int</span> glyph_stride</code></em>);</pre>
+<p>Fetches the nominal glyph IDs for a sequence of Unicode code points. Glyph
+IDs must be returned in a <a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> output parameter.</p>
 <div class="refsect3">
 <a name="hb-font-get-nominal-glyphs.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -2358,14 +3443,45 @@ hb_font_get_nominal_glyphs (<em class="parameter"><code><a class="link" href="ha
 <col class="parameters_description">
 <col width="200px" class="parameters_annotations">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
 <td class="parameter_name"><p>font</p></td>
-<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
 <td class="parameter_annotations"> </td>
-</tr></tbody>
+</tr>
+<tr>
+<td class="parameter_name"><p>count</p></td>
+<td class="parameter_description"><p>number of code points to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>first_unicode</p></td>
+<td class="parameter_description"><p>The first Unicode code point to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>unicode_stride</p></td>
+<td class="parameter_description"><p>The stride between successive code points</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>first_glyph</p></td>
+<td class="parameter_description"><p>The first glyph ID retrieved. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>glyph_stride</p></td>
+<td class="parameter_description"><p>The stride between successive glyph IDs</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
 </table></div>
 </div>
-<p class="since">Since: 2.6.3</p>
+<div class="refsect3">
+<a name="hb-font-get-nominal-glyphs.returns"></a><h4>Returns</h4>
+<p> the number of code points processed</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-6-3.html#api-index-2.6.3">2.6.3</a></p>
 </div>
 <hr>
 <div class="refsect2">
@@ -2379,12 +3495,75 @@ hb_font_get_nominal_glyphs (<em class="parameter"><code><a class="link" href="ha
                                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *first_glyph</code></em>,
                                       <em class="parameter"><code>unsigned <span class="type">int</span> glyph_stride</code></em>,
                                       <em class="parameter"><code><span class="type">void</span> *user_data</code></em>);</pre>
+<p>A virtual method for the <a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t" title="hb_font_funcs_t"><span class="type">hb_font_funcs_t</span></a> of an <a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> object.</p>
+<p>This method should retrieve the nominal glyph IDs for a sequence of
+Unicode code points. Glyph IDs must be returned in a <a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a>
+output parameter.</p>
+<div class="refsect3">
+<a name="hb-font-get-nominal-glyphs-func-t.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>font_data</p></td>
+<td class="parameter_description"><p><em class="parameter"><code>font</code></em>
+user data pointer</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>count</p></td>
+<td class="parameter_description"><p>number of code points to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>first_unicode</p></td>
+<td class="parameter_description"><p>The first Unicode code point to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>unicode_stride</p></td>
+<td class="parameter_description"><p>The stride between successive code points</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>first_glyph</p></td>
+<td class="parameter_description"><p>The first glyph ID retrieved. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>glyph_stride</p></td>
+<td class="parameter_description"><p>The stride between successive glyph IDs</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>User data pointer passed by the caller</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-font-get-nominal-glyphs-func-t.returns"></a><h4>Returns</h4>
+<p> the number of code points processed</p>
+</div>
 </div>
 <hr>
 <div class="refsect2">
 <a name="hb-font-get-parent"></a><h3>hb_font_get_parent ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="returnvalue">hb_font_t</span></a> *
 hb_font_get_parent (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
+<p>Fetches the parent font of <em class="parameter"><code>font</code></em>
+.</p>
 <div class="refsect3">
 <a name="hb-font-get-parent.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -2395,14 +3574,14 @@ hb_font_get_parent (<em class="parameter"><code><a class="link" href="harfbuzz-h
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>font</p></td>
-<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
 </div>
 <div class="refsect3">
 <a name="hb-font-get-parent.returns"></a><h4>Returns</h4>
-<p>. </p>
+<p>The parent font object. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
@@ -2414,6 +3593,7 @@ hb_font_get_parent (<em class="parameter"><code><a class="link" href="harfbuzz-h
 hb_font_get_ppem (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> *font</code></em>,
                   <em class="parameter"><code>unsigned <span class="type">int</span> *x_ppem</code></em>,
                   <em class="parameter"><code>unsigned <span class="type">int</span> *y_ppem</code></em>);</pre>
+<p>Fetches the horizontal and vertical points-per-em (ppem) of a font.</p>
 <div class="refsect3">
 <a name="hb-font-get-ppem.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -2425,17 +3605,17 @@ hb_font_get_ppem (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 <tbody>
 <tr>
 <td class="parameter_name"><p>font</p></td>
-<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>x_ppem</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>Horizontal ppem value. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>y_ppem</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>Vertical ppem value. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
 </tr>
 </tbody>
@@ -2448,7 +3628,8 @@ hb_font_get_ppem (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 <a name="hb-font-get-ptem"></a><h3>hb_font_get_ptem ()</h3>
 <pre class="programlisting"><span class="returnvalue">float</span>
 hb_font_get_ptem (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
-<p>Gets the "point size" of the font.  A value of 0 means unset.</p>
+<p>Fetches the "point size" of a font. Used in CoreText to
+implement optical sizing.</p>
 <div class="refsect3">
 <a name="hb-font-get-ptem.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -2459,16 +3640,16 @@ hb_font_get_ptem (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>font</p></td>
-<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
 </div>
 <div class="refsect3">
 <a name="hb-font-get-ptem.returns"></a><h4>Returns</h4>
-<p> Point size.</p>
+<p> Point size.  A value of zero means "not set."</p>
 </div>
-<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+<p class="since">Since: <a class="link" href="api-index-1-6-0.html#api-index-1.6.0">1.6.0</a></p>
 </div>
 <hr>
 <div class="refsect2">
@@ -2477,6 +3658,7 @@ hb_font_get_ptem (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 hb_font_get_scale (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> *font</code></em>,
                    <em class="parameter"><code><span class="type">int</span> *x_scale</code></em>,
                    <em class="parameter"><code><span class="type">int</span> *y_scale</code></em>);</pre>
+<p>Fetches the horizontal and vertical scale of a font.</p>
 <div class="refsect3">
 <a name="hb-font-get-scale.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -2488,17 +3670,17 @@ hb_font_get_scale (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 <tbody>
 <tr>
 <td class="parameter_name"><p>font</p></td>
-<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>x_scale</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>Horizontal scale value. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>y_scale</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>Vertical scale value. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
 </tr>
 </tbody>
@@ -2508,10 +3690,39 @@ hb_font_get_scale (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 </div>
 <hr>
 <div class="refsect2">
+<a name="hb-font-get-synthetic-slant"></a><h3>hb_font_get_synthetic_slant ()</h3>
+<pre class="programlisting"><span class="returnvalue">float</span>
+hb_font_get_synthetic_slant (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
+<p>Fetches the "synthetic slant" of a font.</p>
+<div class="refsect3">
+<a name="hb-font-get-synthetic-slant.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-font-get-synthetic-slant.returns"></a><h4>Returns</h4>
+<p> Synthetic slant.  By default is zero.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-3-3-0.html#api-index-3.3.0">3.3.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="hb-font-get-user-data"></a><h3>hb_font_get_user_data ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span> *
 hb_font_get_user_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> *font</code></em>,
                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-user-data-key-t" title="hb_user_data_key_t"><span class="type">hb_user_data_key_t</span></a> *key</code></em>);</pre>
+<p>Fetches the user-data object associated with the specified key,
+attached to the specified font object.</p>
 <p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
 <div class="refsect3">
 <a name="hb-font-get-user-data.parameters"></a><h4>Parameters</h4>
@@ -2521,16 +3732,23 @@ hb_font_get_user_data (<em class="parameter"><code><a class="link" href="harfbuz
 <col class="parameters_description">
 <col width="200px" class="parameters_annotations">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
 <td class="parameter_name"><p>font</p></td>
-<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
 <td class="parameter_annotations"> </td>
-</tr></tbody>
+</tr>
+<tr>
+<td class="parameter_name"><p>key</p></td>
+<td class="parameter_description"><p>The user-data key to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
 </table></div>
 </div>
 <div class="refsect3">
 <a name="hb-font-get-user-data.returns"></a><h4>Returns</h4>
-<p>. </p>
+<p>Pointer to the user data. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
@@ -2543,6 +3761,9 @@ hb_font_get_variation_glyph (<em class="parameter"><code><a class="link" href="h
                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> unicode</code></em>,
                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> variation_selector</code></em>,
                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *glyph</code></em>);</pre>
+<p>Fetches the glyph ID for a Unicode code point when followed by
+by the specified variation-selector code point, in the specified
+font.</p>
 <div class="refsect3">
 <a name="hb-font-get-variation-glyph.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -2554,17 +3775,31 @@ hb_font_get_variation_glyph (<em class="parameter"><code><a class="link" href="h
 <tbody>
 <tr>
 <td class="parameter_name"><p>font</p></td>
-<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>unicode</p></td>
+<td class="parameter_description"><p>The Unicode code point to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>variation_selector</p></td>
+<td class="parameter_description"><p>The  variation-selector code point to query</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>glyph</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The glyph ID retrieved. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
 </tr>
 </tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-font-get-variation-glyph.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> if data found, <code class="literal">false</code> otherwise</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-1-2-3.html#api-index-1.2.3">1.2.3</a></p>
 </div>
 <hr>
@@ -2577,6 +3812,57 @@ hb_font_get_variation_glyph (<em class="parameter"><code><a class="link" href="h
                                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> variation_selector</code></em>,
                                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *glyph</code></em>,
                                        <em class="parameter"><code><span class="type">void</span> *user_data</code></em>);</pre>
+<p>A virtual method for the <a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t" title="hb_font_funcs_t"><span class="type">hb_font_funcs_t</span></a> of an <a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> object.</p>
+<p>This method should retrieve the glyph ID for a specified Unicode code point
+followed by a specified Variation Selector code point. Glyph IDs must be
+returned in a <a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> output parameter.</p>
+<div class="refsect3">
+<a name="hb-font-get-variation-glyph-func-t.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>font_data</p></td>
+<td class="parameter_description"><p><em class="parameter"><code>font</code></em>
+user data pointer</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>unicode</p></td>
+<td class="parameter_description"><p>The Unicode code point to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>variation_selector</p></td>
+<td class="parameter_description"><p>The  variation-selector code point to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>glyph</p></td>
+<td class="parameter_description"><p>The glyph ID retrieved. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>User data pointer passed by the caller</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-font-get-variation-glyph-func-t.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> if data found, <code class="literal">false</code> otherwise</p>
+</div>
 </div>
 <hr>
 <div class="refsect2">
@@ -2584,9 +3870,40 @@ hb_font_get_variation_glyph (<em class="parameter"><code><a class="link" href="h
 <pre class="programlisting">const <span class="returnvalue">float</span> *
 hb_font_get_var_coords_design (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> *font</code></em>,
                                <em class="parameter"><code>unsigned <span class="type">int</span> *length</code></em>);</pre>
+<p>Fetches the list of variation coordinates (in design-space units) currently
+set on a font.</p>
+<p>Note that this returned array may only contain values for some
+(or none) of the axes; omitted axes effectively have their default
+values.</p>
 <p>Return value is valid as long as variation coordinates of the font
 are not modified.</p>
-<p class="since">Since: EXPERIMENTAL</p>
+<div class="refsect3">
+<a name="hb-font-get-var-coords-design.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>length</p></td>
+<td class="parameter_description"><p>Number of coordinates retrieved. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-font-get-var-coords-design.returns"></a><h4>Returns</h4>
+<p> coordinates array</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-3-3-0.html#api-index-3.3.0">3.3.0</a></p>
 </div>
 <hr>
 <div class="refsect2">
@@ -2594,8 +3911,38 @@ are not modified.</p>
 <pre class="programlisting">const <span class="returnvalue">int</span> *
 hb_font_get_var_coords_normalized (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> *font</code></em>,
                                    <em class="parameter"><code>unsigned <span class="type">int</span> *length</code></em>);</pre>
+<p>Fetches the list of normalized variation coordinates currently
+set on a font.</p>
+<p>Note that this returned array may only contain values for some
+(or none) of the axes; omitted axes effectively have zero values.</p>
 <p>Return value is valid as long as variation coordinates of the font
 are not modified.</p>
+<div class="refsect3">
+<a name="hb-font-get-var-coords-normalized.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>length</p></td>
+<td class="parameter_description"><p>Number of coordinates retrieved. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-font-get-var-coords-normalized.returns"></a><h4>Returns</h4>
+<p> coordinates array</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-1-4-2.html#api-index-1.4.2">1.4.2</a></p>
 </div>
 <hr>
@@ -2606,6 +3953,10 @@ hb_font_glyph_from_string (<em class="parameter"><code><a class="link" href="har
                            <em class="parameter"><code>const <span class="type">char</span> *s</code></em>,
                            <em class="parameter"><code><span class="type">int</span> len</code></em>,
                            <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *glyph</code></em>);</pre>
+<p>Fetches the glyph ID from <em class="parameter"><code>font</code></em>
+ that matches the specified string.
+Strings of the format <code class="literal">gidDDD</code> or <code class="literal">uniUUUU</code> are parsed automatically.</p>
+<div class="note">Note: <em class="parameter"><code>len</code></em> == -1 means the string is null-terminated.</div>
 <div class="refsect3">
 <a name="hb-font-glyph-from-string.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -2617,22 +3968,32 @@ hb_font_glyph_from_string (<em class="parameter"><code><a class="link" href="har
 <tbody>
 <tr>
 <td class="parameter_name"><p>font</p></td>
-<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>s</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>string to query. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=len][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> uint8_t]</span></td>
 </tr>
 <tr>
+<td class="parameter_name"><p>len</p></td>
+<td class="parameter_description"><p>The length of the string <em class="parameter"><code>s</code></em>
+</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
 <td class="parameter_name"><p>glyph</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The glyph ID corresponding to the string requested. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
 </tr>
 </tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-font-glyph-from-string.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> if data found, <code class="literal">false</code> otherwise</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
 <hr>
@@ -2643,6 +4004,13 @@ hb_font_glyph_to_string (<em class="parameter"><code><a class="link" href="harfb
                          <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> glyph</code></em>,
                          <em class="parameter"><code><span class="type">char</span> *s</code></em>,
                          <em class="parameter"><code>unsigned <span class="type">int</span> size</code></em>);</pre>
+<p>Fetches the name of the specified glyph ID in <em class="parameter"><code>font</code></em>
+ and returns
+it in string <em class="parameter"><code>s</code></em>
+.</p>
+<p>If the glyph ID has no name in <em class="parameter"><code>font</code></em>
+, a string of the form <code class="literal">gidDDD</code> is
+generated, with <code class="literal">DDD</code> being the glyph ID.</p>
 <div class="refsect3">
 <a name="hb-font-glyph-to-string.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -2654,13 +4022,24 @@ hb_font_glyph_to_string (<em class="parameter"><code><a class="link" href="harfb
 <tbody>
 <tr>
 <td class="parameter_name"><p>font</p></td>
-<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>glyph</p></td>
+<td class="parameter_description"><p>The glyph ID to query</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>s</p></td>
-<td class="parameter_description"><p>. </p></td>
-<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=size]</span></td>
+<td class="parameter_description"><p>The string containing the glyph name. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=size]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>size</p></td>
+<td class="parameter_description"><p>Length of string <em class="parameter"><code>s</code></em>
+</p></td>
+<td class="parameter_annotations"> </td>
 </tr>
 </tbody>
 </table></div>
@@ -2672,6 +4051,7 @@ hb_font_glyph_to_string (<em class="parameter"><code><a class="link" href="harfb
 <a name="hb-font-is-immutable"></a><h3>hb_font_is_immutable ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 hb_font_is_immutable (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
+<p>Tests whether a font object is immutable.</p>
 <div class="refsect3">
 <a name="hb-font-is-immutable.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -2682,11 +4062,16 @@ hb_font_is_immutable (<em class="parameter"><code><a class="link" href="harfbuzz
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>font</p></td>
-<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-font-is-immutable.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> if <em class="parameter"><code>font</code></em>
+is immutable, <code class="literal">false</code> otherwise</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
 <hr>
@@ -2694,6 +4079,8 @@ hb_font_is_immutable (<em class="parameter"><code><a class="link" href="harfbuzz
 <a name="hb-font-make-immutable"></a><h3>hb_font_make_immutable ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_font_make_immutable (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
+<p>Makes <em class="parameter"><code>font</code></em>
+ immutable.</p>
 <div class="refsect3">
 <a name="hb-font-make-immutable.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -2704,7 +4091,7 @@ hb_font_make_immutable (<em class="parameter"><code><a class="link" href="harfbu
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>font</p></td>
-<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
@@ -2716,6 +4103,7 @@ hb_font_make_immutable (<em class="parameter"><code><a class="link" href="harfbu
 <a name="hb-font-reference"></a><h3>hb_font_reference ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="returnvalue">hb_font_t</span></a> *
 hb_font_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
+<p>Increases the reference count on the given font object.</p>
 <p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
 <div class="refsect3">
 <a name="hb-font-reference.parameters"></a><h4>Parameters</h4>
@@ -2727,14 +4115,15 @@ hb_font_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>font</p></td>
-<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
 </div>
 <div class="refsect3">
 <a name="hb-font-reference.returns"></a><h4>Returns</h4>
-<p>. </p>
+<p>The <em class="parameter"><code>font</code></em>
+object. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
@@ -2745,7 +4134,8 @@ hb_font_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_font_set_face (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> *font</code></em>,
                   <em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
-<p>Sets font-face of <em class="parameter"><code>font</code></em>
+<p>Sets <em class="parameter"><code>face</code></em>
+ as the font-face value of <em class="parameter"><code>font</code></em>
 .</p>
 <div class="refsect3">
 <a name="hb-font-set-face.parameters"></a><h4>Parameters</h4>
@@ -2758,12 +4148,12 @@ hb_font_set_face (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 <tbody>
 <tr>
 <td class="parameter_name"><p>font</p></td>
-<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>face</p></td>
-<td class="parameter_description"><p>new face.</p></td>
+<td class="parameter_description"><p>The <a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> to assign</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 </tbody>
@@ -2779,6 +4169,10 @@ hb_font_set_funcs (<em class="parameter"><code><a class="link" href="harfbuzz-hb
                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t" title="hb_font_funcs_t"><span class="type">hb_font_funcs_t</span></a> *klass</code></em>,
                    <em class="parameter"><code><span class="type">void</span> *font_data</code></em>,
                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<p>Replaces the font-functions structure attached to a font, updating
+the font's user-data with <em class="parameter"><code>font</code></em>
+-data and the <em class="parameter"><code>destroy</code></em>
+ callback.</p>
 <div class="refsect3">
 <a name="hb-font-set-funcs.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -2790,14 +4184,26 @@ hb_font_set_funcs (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 <tbody>
 <tr>
 <td class="parameter_name"><p>font</p></td>
-<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>klass</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The font-functions structure. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> font_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
 </tr>
+<tr>
+<td class="parameter_name"><p>font_data</p></td>
+<td class="parameter_description"><p>Data to attach to <em class="parameter"><code>font</code></em>
+</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>destroy</p></td>
+<td class="parameter_description"><p>The function to call when <em class="parameter"><code>font_data</code></em>
+is not needed anymore. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></td>
+</tr>
 </tbody>
 </table></div>
 </div>
@@ -2810,6 +4216,9 @@ hb_font_set_funcs (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 hb_font_set_funcs_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> *font</code></em>,
                         <em class="parameter"><code><span class="type">void</span> *font_data</code></em>,
                         <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<p>Replaces the user data attached to a font, updating the font's
+<em class="parameter"><code>destroy</code></em>
+ callback.</p>
 <div class="refsect3">
 <a name="hb-font-set-funcs-data.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -2821,14 +4230,21 @@ hb_font_set_funcs_data (<em class="parameter"><code><a class="link" href="harfbu
 <tbody>
 <tr>
 <td class="parameter_name"><p>font</p></td>
-<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>font_data</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>Data to attach to <em class="parameter"><code>font</code></em>
+. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
 </tr>
+<tr>
+<td class="parameter_name"><p>destroy</p></td>
+<td class="parameter_description"><p>The function to call when <em class="parameter"><code>font_data</code></em>
+is not needed anymore. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></td>
+</tr>
 </tbody>
 </table></div>
 </div>
@@ -2840,7 +4256,7 @@ hb_font_set_funcs_data (<em class="parameter"><code><a class="link" href="harfbu
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_font_set_parent (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> *font</code></em>,
                     <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> *parent</code></em>);</pre>
-<p>Sets parent font of <em class="parameter"><code>font</code></em>
+<p>Sets the parent font of <em class="parameter"><code>font</code></em>
 .</p>
 <div class="refsect3">
 <a name="hb-font-set-parent.parameters"></a><h4>Parameters</h4>
@@ -2853,12 +4269,12 @@ hb_font_set_parent (<em class="parameter"><code><a class="link" href="harfbuzz-h
 <tbody>
 <tr>
 <td class="parameter_name"><p>font</p></td>
-<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>parent</p></td>
-<td class="parameter_description"><p>new parent.</p></td>
+<td class="parameter_description"><p>The parent font object to assign</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 </tbody>
@@ -2873,6 +4289,7 @@ hb_font_set_parent (<em class="parameter"><code><a class="link" href="harfbuzz-h
 hb_font_set_ppem (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> *font</code></em>,
                   <em class="parameter"><code>unsigned <span class="type">int</span> x_ppem</code></em>,
                   <em class="parameter"><code>unsigned <span class="type">int</span> y_ppem</code></em>);</pre>
+<p>Sets the horizontal and vertical pixels-per-em (ppem) of a font.</p>
 <div class="refsect3">
 <a name="hb-font-set-ppem.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -2881,11 +4298,23 @@ hb_font_set_ppem (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 <col class="parameters_description">
 <col width="200px" class="parameters_annotations">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
 <td class="parameter_name"><p>font</p></td>
-<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
 <td class="parameter_annotations"> </td>
-</tr></tbody>
+</tr>
+<tr>
+<td class="parameter_name"><p>x_ppem</p></td>
+<td class="parameter_description"><p>Horizontal ppem value to assign</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>y_ppem</p></td>
+<td class="parameter_description"><p>Vertical ppem value to assign</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
 </table></div>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
@@ -2896,8 +4325,9 @@ hb_font_set_ppem (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_font_set_ptem (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> *font</code></em>,
                   <em class="parameter"><code><span class="type">float</span> ptem</code></em>);</pre>
-<p>Sets "point size" of the font.  Set to 0 to unset.</p>
-<p>There are 72 points in an inch.</p>
+<p>Sets the "point size" of a font. Set to zero to unset.
+Used in CoreText to implement optical sizing.</p>
+<div class="note">Note: There are 72 points in an inch.</div>
 <div class="refsect3">
 <a name="hb-font-set-ptem.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -2909,7 +4339,7 @@ hb_font_set_ptem (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 <tbody>
 <tr>
 <td class="parameter_name"><p>font</p></td>
-<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
@@ -2929,6 +4359,7 @@ hb_font_set_ptem (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 hb_font_set_scale (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> *font</code></em>,
                    <em class="parameter"><code><span class="type">int</span> x_scale</code></em>,
                    <em class="parameter"><code><span class="type">int</span> y_scale</code></em>);</pre>
+<p>Sets the horizontal and vertical scale of a font.</p>
 <div class="refsect3">
 <a name="hb-font-set-scale.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -2937,17 +4368,66 @@ hb_font_set_scale (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 <col class="parameters_description">
 <col width="200px" class="parameters_annotations">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
 <td class="parameter_name"><p>font</p></td>
-<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
 <td class="parameter_annotations"> </td>
-</tr></tbody>
+</tr>
+<tr>
+<td class="parameter_name"><p>x_scale</p></td>
+<td class="parameter_description"><p>Horizontal scale value to assign</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>y_scale</p></td>
+<td class="parameter_description"><p>Vertical scale value to assign</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
 </table></div>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
 <hr>
 <div class="refsect2">
+<a name="hb-font-set-synthetic-slant"></a><h3>hb_font_set_synthetic_slant ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_font_set_synthetic_slant (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                             <em class="parameter"><code><span class="type">float</span> slant</code></em>);</pre>
+<p>Sets the "synthetic slant" of a font.  By default is zero.
+Synthetic slant is the graphical skew that the renderer
+applies to the font at rendering time.</p>
+<p>HarfBuzz needs to know this value to adjust shaping results,
+metrics, and style values to match the slanted rendering.</p>
+<div class="note">Note: The slant value is a ratio.  For example, a
+20% slant would be represented as a 0.2 value.</div>
+<div class="refsect3">
+<a name="hb-font-set-synthetic-slant.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>slant</p></td>
+<td class="parameter_description"><p>synthetic slant value.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-3-3-0.html#api-index-3.3.0">3.3.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="hb-font-set-user-data"></a><h3>hb_font_set_user_data ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 hb_font_set_user_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> *font</code></em>,
@@ -2955,6 +4435,7 @@ hb_font_set_user_data (<em class="parameter"><code><a class="link" href="harfbuz
                        <em class="parameter"><code><span class="type">void</span> *data</code></em>,
                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>,
                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="type">hb_bool_t</span></a> replace</code></em>);</pre>
+<p>Attaches a user-data key/data pair to the specified font object.</p>
 <p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
 <div class="refsect3">
 <a name="hb-font-set-user-data.parameters"></a><h4>Parameters</h4>
@@ -2964,13 +4445,40 @@ hb_font_set_user_data (<em class="parameter"><code><a class="link" href="harfbuz
 <col class="parameters_description">
 <col width="200px" class="parameters_annotations">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
 <td class="parameter_name"><p>font</p></td>
-<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
 <td class="parameter_annotations"> </td>
-</tr></tbody>
+</tr>
+<tr>
+<td class="parameter_name"><p>key</p></td>
+<td class="parameter_description"><p>The user-data key</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>data</p></td>
+<td class="parameter_description"><p>A pointer to the user data</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>destroy</p></td>
+<td class="parameter_description"><p>A callback to call when <em class="parameter"><code>data</code></em>
+is not needed anymore. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>replace</p></td>
+<td class="parameter_description"><p>Whether to replace an existing data with the same key</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-font-set-user-data.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> if success, <code class="literal">false</code> otherwise</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
 <hr>
@@ -2980,6 +4488,39 @@ hb_font_set_user_data (<em class="parameter"><code><a class="link" href="harfbuz
 hb_font_set_variations (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> *font</code></em>,
                         <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-common.html#hb-variation-t" title="hb_variation_t"><span class="type">hb_variation_t</span></a> *variations</code></em>,
                         <em class="parameter"><code>unsigned <span class="type">int</span> variations_length</code></em>);</pre>
+<p>Applies a list of font-variation settings to a font.</p>
+<p>Note that this overrides all existing variations set on <em class="parameter"><code>font</code></em>
+.
+Axes not included in <em class="parameter"><code>variations</code></em>
+ will be effectively set to their
+default values.</p>
+<div class="refsect3">
+<a name="hb-font-set-variations.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>variations</p></td>
+<td class="parameter_description"><p>Array of variation settings to apply. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=variations_length]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>variations_length</p></td>
+<td class="parameter_description"><p>Number of variations to apply</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
 <p class="since">Since: <a class="link" href="api-index-1-4-2.html#api-index-1.4.2">1.4.2</a></p>
 </div>
 <hr>
@@ -2989,6 +4530,40 @@ hb_font_set_variations (<em class="parameter"><code><a class="link" href="harfbu
 hb_font_set_var_coords_design (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> *font</code></em>,
                                <em class="parameter"><code>const <span class="type">float</span> *coords</code></em>,
                                <em class="parameter"><code>unsigned <span class="type">int</span> coords_length</code></em>);</pre>
+<p>Applies a list of variation coordinates (in design-space units)
+to a font.</p>
+<p>Note that this overrides all existing variations set on <em class="parameter"><code>font</code></em>
+.
+Axes not included in <em class="parameter"><code>coords</code></em>
+ will be effectively set to their
+default values.</p>
+<div class="refsect3">
+<a name="hb-font-set-var-coords-design.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>coords</p></td>
+<td class="parameter_description"><p>Array of variation coordinates to apply. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=coords_length]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>coords_length</p></td>
+<td class="parameter_description"><p>Number of coordinates to apply</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
 <p class="since">Since: <a class="link" href="api-index-1-4-2.html#api-index-1.4.2">1.4.2</a></p>
 </div>
 <hr>
@@ -2998,6 +4573,41 @@ hb_font_set_var_coords_design (<em class="parameter"><code><a class="link" href=
 hb_font_set_var_coords_normalized (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> *font</code></em>,
                                    <em class="parameter"><code>const <span class="type">int</span> *coords</code></em>,
                                    <em class="parameter"><code>unsigned <span class="type">int</span> coords_length</code></em>);</pre>
+<p>Applies a list of variation coordinates (in normalized units)
+to a font.</p>
+<p>Note that this overrides all existing variations set on <em class="parameter"><code>font</code></em>
+.
+Axes not included in <em class="parameter"><code>coords</code></em>
+ will be effectively set to their
+default values.</p>
+<div class="note">Note: Coordinates should be normalized to 2.14.</div>
+<div class="refsect3">
+<a name="hb-font-set-var-coords-normalized.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>coords</p></td>
+<td class="parameter_description"><p>Array of variation coordinates to apply. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=coords_length]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>coords_length</p></td>
+<td class="parameter_description"><p>Number of coordinates to apply</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
 <p class="since">Since: <a class="link" href="api-index-1-4-2.html#api-index-1.4.2">1.4.2</a></p>
 </div>
 <hr>
@@ -3041,6 +4651,11 @@ hb_font_subtract_glyph_origin_for_direction
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="type">hb_direction_t</span></a> direction</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *x</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *y</code></em>);</pre>
+<p>Subtracts the origin coordinates from an (X,Y) point coordinate,
+in the specified glyph ID in the specified font.</p>
+<p>Calls the appropriate direction-specific variant (horizontal
+or vertical) depending on the value of <em class="parameter"><code>direction</code></em>
+.</p>
 <div class="refsect3">
 <a name="hb-font-subtract-glyph-origin-for-direction.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -3052,18 +4667,30 @@ hb_font_subtract_glyph_origin_for_direction
 <tbody>
 <tr>
 <td class="parameter_name"><p>font</p></td>
-<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>glyph</p></td>
+<td class="parameter_description"><p>The glyph ID to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>direction</p></td>
+<td class="parameter_description"><p>The direction of the text segment</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>x</p></td>
-<td class="parameter_description"><p>. </p></td>
-<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+<td class="parameter_description"><p>Input = The original X coordinate
+Output = The X coordinate minus the X-coordinate of the origin. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>]</span></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>y</p></td>
-<td class="parameter_description"><p>. </p></td>
-<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+<td class="parameter_description"><p>Input = The original Y coordinate
+Output = The Y coordinate minus the Y-coordinate of the origin. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>]</span></td>
 </tr>
 </tbody>
 </table></div>
@@ -3077,6 +4704,42 @@ hb_font_subtract_glyph_origin_for_direction
 <span class="c_punctuation">(</span>*hb_reference_table_func_t<span class="c_punctuation">)</span> (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> *face</code></em>,
                               <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> tag</code></em>,
                               <em class="parameter"><code><span class="type">void</span> *user_data</code></em>);</pre>
+<p>Callback function for <a class="link" href="harfbuzz-hb-face.html#hb-face-create-for-tables" title="hb_face_create_for_tables ()"><code class="function">hb_face_create_for_tables()</code></a>.</p>
+<div class="refsect3">
+<a name="hb-reference-table-func-t.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> to reference table for</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>tag</p></td>
+<td class="parameter_description"><p>the tag of the table to reference</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>User data pointer passed by the caller</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-reference-table-func-t.returns"></a><h4>Returns</h4>
+<p>A pointer to the <em class="parameter"><code>tag</code></em>
+table within <em class="parameter"><code>face</code></em>
+. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
 <hr>
 <div class="refsect2">
@@ -3086,6 +4749,7 @@ hb_font_funcs_set_font_h_extents_func (<em class="parameter"><code><a class="lin
                                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-get-font-h-extents-func-t" title="hb_font_get_font_h_extents_func_t"><span class="type">hb_font_get_font_h_extents_func_t</span></a> func</code></em>,
                                        <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<p>Sets the implementation function for <a class="link" href="harfbuzz-hb-font.html#hb-font-get-font-h-extents-func-t" title="hb_font_get_font_h_extents_func_t"><span class="type">hb_font_get_font_h_extents_func_t</span></a>.</p>
 <div class="refsect3">
 <a name="hb-font-funcs-set-font-h-extents-func.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -3097,14 +4761,26 @@ hb_font_funcs_set_font_h_extents_func (<em class="parameter"><code><a class="lin
 <tbody>
 <tr>
 <td class="parameter_name"><p>ffuncs</p></td>
-<td class="parameter_description"><p>font functions.</p></td>
+<td class="parameter_description"><p>A font-function structure</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>func</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The callback function to assign. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> user_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
 </tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>Data to pass to <em class="parameter"><code>func</code></em>
+</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>destroy</p></td>
+<td class="parameter_description"><p>The function to call when <em class="parameter"><code>user_data</code></em>
+is not needed anymore. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></td>
+</tr>
 </tbody>
 </table></div>
 </div>
@@ -3118,6 +4794,7 @@ hb_font_funcs_set_font_v_extents_func (<em class="parameter"><code><a class="lin
                                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-get-font-v-extents-func-t" title="hb_font_get_font_v_extents_func_t"><span class="type">hb_font_get_font_v_extents_func_t</span></a> func</code></em>,
                                        <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<p>Sets the implementation function for <a class="link" href="harfbuzz-hb-font.html#hb-font-get-font-v-extents-func-t" title="hb_font_get_font_v_extents_func_t"><span class="type">hb_font_get_font_v_extents_func_t</span></a>.</p>
 <div class="refsect3">
 <a name="hb-font-funcs-set-font-v-extents-func.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -3129,14 +4806,26 @@ hb_font_funcs_set_font_v_extents_func (<em class="parameter"><code><a class="lin
 <tbody>
 <tr>
 <td class="parameter_name"><p>ffuncs</p></td>
-<td class="parameter_description"><p>font functions.</p></td>
+<td class="parameter_description"><p>A font-function structure</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>func</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The callback function to assign. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> user_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
 </tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>Data to pass to <em class="parameter"><code>func</code></em>
+</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>destroy</p></td>
+<td class="parameter_description"><p>The function to call when <em class="parameter"><code>user_data</code></em>
+is not needed anymore. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></td>
+</tr>
 </tbody>
 </table></div>
 </div>
@@ -3148,7 +4837,12 @@ hb_font_funcs_set_font_v_extents_func (<em class="parameter"><code><a class="lin
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_font_get_extents_for_direction (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> *font</code></em>,
                                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="type">hb_direction_t</span></a> direction</code></em>,
-                                   <em class="parameter"><code><span class="type">hb_font_extents_t</span> *extents</code></em>);</pre>
+                                   <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-extents-t" title="hb_font_extents_t"><span class="type">hb_font_extents_t</span></a> *extents</code></em>);</pre>
+<p>Fetches the extents for a font in a text segment of the
+specified direction.</p>
+<p>Calls the appropriate direction-specific variant (horizontal
+or vertical) depending on the value of <em class="parameter"><code>direction</code></em>
+.</p>
 <div class="refsect3">
 <a name="hb-font-get-extents-for-direction.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -3160,12 +4854,17 @@ hb_font_get_extents_for_direction (<em class="parameter"><code><a class="link" h
 <tbody>
 <tr>
 <td class="parameter_name"><p>font</p></td>
-<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>direction</p></td>
+<td class="parameter_description"><p>The direction of the text segment</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>extents</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The <a class="link" href="harfbuzz-hb-font.html#hb-font-extents-t" title="hb_font_extents_t"><span class="type">hb_font_extents_t</span></a> retrieved. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
 </tr>
 </tbody>
@@ -3179,15 +4878,51 @@ hb_font_get_extents_for_direction (<em class="parameter"><code><a class="link" h
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 <span class="c_punctuation">(</span>*hb_font_get_font_extents_func_t<span class="c_punctuation">)</span> (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> *font</code></em>,
                                     <em class="parameter"><code><span class="type">void</span> *font_data</code></em>,
-                                    <em class="parameter"><code><span class="type">hb_font_extents_t</span> *extents</code></em>,
+                                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-extents-t" title="hb_font_extents_t"><span class="type">hb_font_extents_t</span></a> *extents</code></em>,
                                     <em class="parameter"><code><span class="type">void</span> *user_data</code></em>);</pre>
+<p>This method should retrieve the extents for a font.</p>
+<div class="refsect3">
+<a name="hb-font-get-font-extents-func-t.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>font_data</p></td>
+<td class="parameter_description"><p><em class="parameter"><code>font</code></em>
+user data pointer</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>extents</p></td>
+<td class="parameter_description"><p>The font extents retrieved. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>User data pointer passed by the caller</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
 </div>
 <hr>
 <div class="refsect2">
 <a name="hb-font-get-h-extents"></a><h3>hb_font_get_h_extents ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 hb_font_get_h_extents (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> *font</code></em>,
-                       <em class="parameter"><code><span class="type">hb_font_extents_t</span> *extents</code></em>);</pre>
+                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-extents-t" title="hb_font_extents_t"><span class="type">hb_font_extents_t</span></a> *extents</code></em>);</pre>
+<p>Fetches the extents for a specified font, for horizontal
+text segments.</p>
 <div class="refsect3">
 <a name="hb-font-get-h-extents.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -3199,17 +4934,21 @@ hb_font_get_h_extents (<em class="parameter"><code><a class="link" href="harfbuz
 <tbody>
 <tr>
 <td class="parameter_name"><p>font</p></td>
-<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>extents</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The font extents retrieved. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
 </tr>
 </tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-font-get-h-extents.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> if data found, <code class="literal">false</code> otherwise</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-1-1-3.html#api-index-1.1.3">1.1.3</a></p>
 </div>
 <hr>
@@ -3217,7 +4956,9 @@ hb_font_get_h_extents (<em class="parameter"><code><a class="link" href="harfbuz
 <a name="hb-font-get-v-extents"></a><h3>hb_font_get_v_extents ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 hb_font_get_v_extents (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> *font</code></em>,
-                       <em class="parameter"><code><span class="type">hb_font_extents_t</span> *extents</code></em>);</pre>
+                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-extents-t" title="hb_font_extents_t"><span class="type">hb_font_extents_t</span></a> *extents</code></em>);</pre>
+<p>Fetches the extents for a specified font, for vertical
+text segments.</p>
 <div class="refsect3">
 <a name="hb-font-get-v-extents.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -3229,17 +4970,21 @@ hb_font_get_v_extents (<em class="parameter"><code><a class="link" href="harfbuz
 <tbody>
 <tr>
 <td class="parameter_name"><p>font</p></td>
-<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>extents</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The font extents retrieved. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
 </tr>
 </tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-font-get-v-extents.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> if data found, <code class="literal">false</code> otherwise</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-1-1-3.html#api-index-1.1.3">1.1.3</a></p>
 </div>
 </div>
@@ -3249,70 +4994,200 @@ hb_font_get_v_extents (<em class="parameter"><code><a class="link" href="harfbuz
 <a name="hb-font-funcs-t"></a><h3>hb_font_funcs_t</h3>
 <pre class="programlisting">typedef struct hb_font_funcs_t hb_font_funcs_t;
 </pre>
+<p>Data type containing a set of virtual methods used for
+working on <a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> font objects.</p>
+<p>HarfBuzz provides a lightweight default function for each of
+
+the methods in <a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t" title="hb_font_funcs_t"><span class="type">hb_font_funcs_t</span></a>. Client programs can implement
+their own replacements for the individual font functions, as
+needed, and replace the default by calling the setter for a
+method.</p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="hb-font-get-glyph-h-advance-func-t"></a><h3>hb_font_get_glyph_h_advance_func_t</h3>
 <pre class="programlisting">typedef hb_font_get_glyph_advance_func_t hb_font_get_glyph_h_advance_func_t;
 </pre>
+<p>A virtual method for the <a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t" title="hb_font_funcs_t"><span class="type">hb_font_funcs_t</span></a> of an <a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> object.</p>
+<p>This method should retrieve the advance for a specified glyph, in
+horizontal-direction text segments. Advances must be returned in
+an <a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> output parameter.</p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="hb-font-get-glyph-h-advances-func-t"></a><h3>hb_font_get_glyph_h_advances_func_t</h3>
 <pre class="programlisting">typedef hb_font_get_glyph_advances_func_t hb_font_get_glyph_h_advances_func_t;
 </pre>
+<p>A virtual method for the <a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t" title="hb_font_funcs_t"><span class="type">hb_font_funcs_t</span></a> of an <a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> object.</p>
+<p>This method should retrieve the advances for a sequence of glyphs, in
+horizontal-direction text segments.</p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="hb-font-get-glyph-h-kerning-func-t"></a><h3>hb_font_get_glyph_h_kerning_func_t</h3>
 <pre class="programlisting">typedef hb_font_get_glyph_kerning_func_t hb_font_get_glyph_h_kerning_func_t;
 </pre>
+<p>A virtual method for the <a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t" title="hb_font_funcs_t"><span class="type">hb_font_funcs_t</span></a> of an <a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> object.</p>
+<p>This method should retrieve the kerning-adjustment value for a glyph-pair in
+the specified font, for horizontal text segments.</p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="hb-font-get-glyph-h-origin-func-t"></a><h3>hb_font_get_glyph_h_origin_func_t</h3>
 <pre class="programlisting">typedef hb_font_get_glyph_origin_func_t hb_font_get_glyph_h_origin_func_t;
 </pre>
+<p>A virtual method for the <a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t" title="hb_font_funcs_t"><span class="type">hb_font_funcs_t</span></a> of an <a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> object.</p>
+<p>This method should retrieve the (X,Y) coordinates (in font units) of the
+origin for a glyph, for horizontal-direction text segments. Each
+coordinate must be returned in an <a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> output parameter.</p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="hb-font-get-glyph-v-advance-func-t"></a><h3>hb_font_get_glyph_v_advance_func_t</h3>
 <pre class="programlisting">typedef hb_font_get_glyph_advance_func_t hb_font_get_glyph_v_advance_func_t;
 </pre>
+<p>A virtual method for the <a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t" title="hb_font_funcs_t"><span class="type">hb_font_funcs_t</span></a> of an <a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> object.</p>
+<p>This method should retrieve the advance for a specified glyph, in
+vertical-direction text segments. Advances must be returned in
+an <a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> output parameter.</p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="hb-font-get-glyph-v-advances-func-t"></a><h3>hb_font_get_glyph_v_advances_func_t</h3>
 <pre class="programlisting">typedef hb_font_get_glyph_advances_func_t hb_font_get_glyph_v_advances_func_t;
 </pre>
+<p>A virtual method for the <a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t" title="hb_font_funcs_t"><span class="type">hb_font_funcs_t</span></a> of an <a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> object.</p>
+<p>This method should retrieve the advances for a sequence of glyphs, in
+vertical-direction text segments.</p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="hb-font-get-glyph-v-origin-func-t"></a><h3>hb_font_get_glyph_v_origin_func_t</h3>
 <pre class="programlisting">typedef hb_font_get_glyph_origin_func_t hb_font_get_glyph_v_origin_func_t;
 </pre>
+<p>A virtual method for the <a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t" title="hb_font_funcs_t"><span class="type">hb_font_funcs_t</span></a> of an <a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> object.</p>
+<p>This method should retrieve the (X,Y) coordinates (in font units) of the
+origin for a glyph, for vertical-direction text segments. Each coordinate
+must be returned in an <a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> output parameter.</p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="hb-font-t"></a><h3>hb_font_t</h3>
 <pre class="programlisting">typedef struct hb_font_t hb_font_t;
 </pre>
+<p>Data type for holding fonts.</p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="hb-font-get-font-h-extents-func-t"></a><h3>hb_font_get_font_h_extents_func_t</h3>
 <pre class="programlisting">typedef hb_font_get_font_extents_func_t hb_font_get_font_h_extents_func_t;
 </pre>
+<p>A virtual method for the <a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t" title="hb_font_funcs_t"><span class="type">hb_font_funcs_t</span></a> of an <a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> object.</p>
+<p>This method should retrieve the extents for a font, for horizontal-direction
+text segments. Extents must be returned in an <span class="type">hb_glyph_extents</span> output
+parameter.</p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="hb-font-get-font-v-extents-func-t"></a><h3>hb_font_get_font_v_extents_func_t</h3>
 <pre class="programlisting">typedef hb_font_get_font_extents_func_t hb_font_get_font_v_extents_func_t;
 </pre>
+<p>A virtual method for the <a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t" title="hb_font_funcs_t"><span class="type">hb_font_funcs_t</span></a> of an <a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> object.</p>
+<p>This method should retrieve the extents for a font, for vertical-direction
+text segments. Extents must be returned in an <span class="type">hb_glyph_extents</span> output
+parameter.</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-font-extents-t"></a><h3>hb_font_extents_t</h3>
+<pre class="programlisting">typedef struct {
+  hb_position_t ascender;
+  hb_position_t descender;
+  hb_position_t line_gap;
+} hb_font_extents_t;
+</pre>
+<p>Font-wide extent values, measured in font units.</p>
+<p>Note that typically <em class="parameter"><code>ascender</code></em>
+ is positive and <em class="parameter"><code>descender</code></em>
+
+negative, in coordinate systems that grow up.</p>
+<div class="refsect3">
+<a name="hb-font-extents-t.members"></a><h4>Members</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="300px" class="struct_members_name">
+<col class="struct_members_description">
+<col width="200px" class="struct_members_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="struct_member_name"><p><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> <em class="structfield"><code><a name="hb-font-extents-t.ascender"></a>ascender</code></em>;</p></td>
+<td class="struct_member_description"><p>The height of typographic ascenders.</p></td>
+<td class="struct_member_annotations"> </td>
+</tr>
+<tr>
+<td class="struct_member_name"><p><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> <em class="structfield"><code><a name="hb-font-extents-t.descender"></a>descender</code></em>;</p></td>
+<td class="struct_member_description"><p>The depth of typographic descenders.</p></td>
+<td class="struct_member_annotations"> </td>
+</tr>
+<tr>
+<td class="struct_member_name"><p><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> <em class="structfield"><code><a name="hb-font-extents-t.line-gap"></a>line_gap</code></em>;</p></td>
+<td class="struct_member_description"><p>The suggested line-spacing gap.</p></td>
+<td class="struct_member_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-glyph-extents-t"></a><h3>hb_glyph_extents_t</h3>
+<pre class="programlisting">typedef struct {
+  hb_position_t x_bearing;
+  hb_position_t y_bearing;
+  hb_position_t width;
+  hb_position_t height;
+} hb_glyph_extents_t;
+</pre>
+<p>Glyph extent values, measured in font units.</p>
+<p>Note that <em class="parameter"><code>height</code></em>
+ is negative, in coordinate systems that grow up.</p>
+<div class="refsect3">
+<a name="hb-glyph-extents-t.members"></a><h4>Members</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="300px" class="struct_members_name">
+<col class="struct_members_description">
+<col width="200px" class="struct_members_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="struct_member_name"><p><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> <em class="structfield"><code><a name="hb-glyph-extents-t.x-bearing"></a>x_bearing</code></em>;</p></td>
+<td class="struct_member_description"><p>Distance from the x-origin to the left extremum of the glyph.</p></td>
+<td class="struct_member_annotations"> </td>
+</tr>
+<tr>
+<td class="struct_member_name"><p><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> <em class="structfield"><code><a name="hb-glyph-extents-t.y-bearing"></a>y_bearing</code></em>;</p></td>
+<td class="struct_member_description"><p>Distance from the top extremum of the glyph to the y-origin.</p></td>
+<td class="struct_member_annotations"> </td>
+</tr>
+<tr>
+<td class="struct_member_name"><p><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> <em class="structfield"><code><a name="hb-glyph-extents-t.width"></a>width</code></em>;</p></td>
+<td class="struct_member_description"><p>Distance from the left extremum of the glyph to the right extremum.</p></td>
+<td class="struct_member_annotations"> </td>
+</tr>
+<tr>
+<td class="struct_member_name"><p><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> <em class="structfield"><code><a name="hb-glyph-extents-t.height"></a>height</code></em>;</p></td>
+<td class="struct_member_description"><p>Distance from the top extremum of the glyph to the bottom extremum.</p></td>
+<td class="struct_member_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
 </div>
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index ae3cf07..d5705d4 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-ft: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch15.html" title="Integration API">
+<link rel="up" href="integration-api.html" title="Integration API">
 <link rel="prev" href="harfbuzz-hb-coretext.html" title="hb-coretext">
 <link rel="next" href="harfbuzz-hb-glib.html" title="hb-glib">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -18,7 +18,7 @@
                   <a href="#harfbuzz-hb-ft.description" class="shortcut">Description</a></span>
 </td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><a accesskey="u" href="ch15.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="u" href="integration-api.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
 <td><a accesskey="p" href="harfbuzz-hb-coretext.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
 <td><a accesskey="n" href="harfbuzz-hb-glib.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
@@ -182,8 +182,8 @@ after the <a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_
 </tr>
 <tr>
 <td class="parameter_name"><p>destroy</p></td>
-<td class="parameter_description"><p>A callback to call when the face object is not needed anymore</p></td>
-<td class="parameter_annotations"> </td>
+<td class="parameter_description"><p>A callback to call when the face object is not needed anymore</p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></td>
 </tr>
 </tbody>
 </table></div>
@@ -278,8 +278,8 @@ hb_ft_font_create (<em class="parameter"><code><span class="type">FT_Face</span>
                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
 <p>Creates an <a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> font object from the specified FT_Face.</p>
 <div class="note">Note: You must set the face size on <em class="parameter"><code>ft_face</code></em> before calling
-<a class="link" href="harfbuzz-hb-ft.html#hb-ft-font-create" title="hb_ft_font_create ()"><code class="function">hb_ft_font_create()</code></a> on it. Otherwise, HarfBuzz will not pick up
-the face size.</div>
+<a class="link" href="harfbuzz-hb-ft.html#hb-ft-font-create" title="hb_ft_font_create ()"><code class="function">hb_ft_font_create()</code></a> on it. HarfBuzz assumes size is always set and will
+access `size` member of FT_Face unconditionally.</div>
 <p>This variant of the function does not provide any life-cycle management.</p>
 <p>Most client programs should use <a class="link" href="harfbuzz-hb-ft.html#hb-ft-font-create-referenced" title="hb_ft_font_create_referenced ()"><code class="function">hb_ft_font_create_referenced()</code></a>
 instead. </p>
@@ -313,7 +313,7 @@ destroyed only after the <a class="link" href="harfbuzz-hb-font.html#hb-font-t"
 <tr>
 <td class="parameter_name"><p>destroy</p></td>
 <td class="parameter_description"><p>A callback to call when the font object is not needed anymore. </p></td>
-<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL may be passed instead of a pointer to a location."><span class="acronym">optional</span></acronym>]</span></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></td>
 </tr>
 </tbody>
 </table></div>
@@ -332,8 +332,8 @@ destroyed only after the <a class="link" href="harfbuzz-hb-font.html#hb-font-t"
 hb_ft_font_create_referenced (<em class="parameter"><code><span class="type">FT_Face</span> ft_face</code></em>);</pre>
 <p>Creates an <a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> font object from the specified FT_Face.</p>
 <div class="note">Note: You must set the face size on <em class="parameter"><code>ft_face</code></em> before calling
-<code class="function">hb_ft_font_create_references()</code> on it. Otherwise, HarfBuzz will not pick up
-the face size.</div>
+<a class="link" href="harfbuzz-hb-ft.html#hb-ft-font-create-referenced" title="hb_ft_font_create_referenced ()"><code class="function">hb_ft_font_create_referenced()</code></a> on it. HarfBuzz assumes size is always set
+and will access `size` member of FT_Face unconditionally.</div>
 <p>This is the preferred variant of the hb_ft_font_create*
 function family, because it calls <code class="function">FT_Reference_Face()</code> on <em class="parameter"><code>ft_face</code></em>
 ,
@@ -368,26 +368,109 @@ ensuring that <em class="parameter"><code>ft_face</code></em>
 <a name="hb-ft-font-changed"></a><h3>hb_ft_font_changed ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_ft_font_changed (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
+<p>Refreshes the state of <em class="parameter"><code>font</code></em>
+ when the underlying FT_Face has changed.
+This function should be called after changing the size or
+variation-axis settings on the FT_Face.</p>
+<div class="refsect3">
+<a name="hb-ft-font-changed.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-0-5.html#api-index-1.0.5">1.0.5</a></p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="hb-ft-font-get-face"></a><h3>hb_ft_font_get_face ()</h3>
 <pre class="programlisting"><span class="returnvalue">FT_Face</span>
 hb_ft_font_get_face (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
+<p>Fetches the FT_Face associated with the specified <a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a>
+font object.</p>
+<div class="refsect3">
+<a name="hb-ft-font-get-face.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-ft-font-get-face.returns"></a><h4>Returns</h4>
+<p>the FT_Face found or <code class="literal">NULL</code>. </p>
+<p><span class="annotation">[<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="hb-ft-font-lock-face"></a><h3>hb_ft_font_lock_face ()</h3>
 <pre class="programlisting"><span class="returnvalue">FT_Face</span>
 hb_ft_font_lock_face (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
-<p class="since">Since: 2.6.5</p>
+<p>Gets the FT_Face associated with <em class="parameter"><code>font</code></em>
+, This face will be kept around until
+you call <a class="link" href="harfbuzz-hb-ft.html#hb-ft-font-unlock-face" title="hb_ft_font_unlock_face ()"><code class="function">hb_ft_font_unlock_face()</code></a>.</p>
+<div class="refsect3">
+<a name="hb-ft-font-lock-face.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-ft-font-lock-face.returns"></a><h4>Returns</h4>
+<p>the FT_Face associated with <em class="parameter"><code>font</code></em>
+or <code class="literal">NULL</code>. </p>
+<p><span class="annotation">[<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-6-5.html#api-index-2.6.5">2.6.5</a></p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="hb-ft-font-unlock-face"></a><h3>hb_ft_font_unlock_face ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_ft_font_unlock_face (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
-<p class="since">Since: 2.6.5</p>
+<p>Releases an FT_Face previously obtained with <a class="link" href="harfbuzz-hb-ft.html#hb-ft-font-lock-face" title="hb_ft_font_lock_face ()"><code class="function">hb_ft_font_lock_face()</code></a>.</p>
+<div class="refsect3">
+<a name="hb-ft-font-unlock-face.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-6-5.html#api-index-2.6.5">2.6.5</a></p>
 </div>
 <hr>
 <div class="refsect2">
@@ -488,6 +571,6 @@ require this function to be used.</p>
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/html/harfbuzz-hb-gdi.html b/docs/html/harfbuzz-hb-gdi.html
new file mode 100644 (file)
index 0000000..a8eb09a
--- /dev/null
@@ -0,0 +1,93 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>hb-gdi: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="integration-api.html" title="Integration API">
+<link rel="prev" href="harfbuzz-hb-uniscribe.html" title="hb-uniscribe">
+<link rel="next" href="harfbuzz-hb-directwrite.html" title="hb-directwrite">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts">
+<a href="#" class="shortcut">Top</a><span id="nav_description">  <span class="dim">|</span> 
+                  <a href="#harfbuzz-hb-gdi.description" class="shortcut">Description</a></span>
+</td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="integration-api.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="harfbuzz-hb-uniscribe.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="harfbuzz-hb-directwrite.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="harfbuzz-hb-gdi"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="harfbuzz-hb-gdi.top_of_page"></a>hb-gdi</span></h2>
+<p>hb-gdi — GDI integration</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="harfbuzz-hb-gdi.functions"></a><h2>Functions</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="functions_proto_type">
+<col class="functions_proto_name">
+</colgroup>
+<tbody><tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="returnvalue">hb_face_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-gdi.html#hb-gdi-face-create" title="hb_gdi_face_create ()">hb_gdi_face_create</a> <span class="c_punctuation">()</span>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-gdi.includes"></a><h2>Includes</h2>
+<pre class="synopsis">#include &lt;hb-gdi.h&gt;
+</pre>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-gdi.description"></a><h2>Description</h2>
+<p>Functions for using HarfBuzz with GDI fonts.</p>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-gdi.functions_details"></a><h2>Functions</h2>
+<div class="refsect2">
+<a name="hb-gdi-face-create"></a><h3>hb_gdi_face_create ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="returnvalue">hb_face_t</span></a> *
+hb_gdi_face_create (<em class="parameter"><code><span class="type">HFONT</span> hfont</code></em>);</pre>
+<p>Constructs a new face object from the specified GDI HFONT.</p>
+<div class="refsect3">
+<a name="hb-gdi-face-create.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>hfont</p></td>
+<td class="parameter_description"><p>a HFONT object.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-gdi-face-create.returns"></a><h4>Returns</h4>
+<p> <a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> object corresponding to the given input</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-6-0.html#api-index-2.6.0">2.6.0</a></p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
index 4cd3eda..03b4442 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-glib: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch15.html" title="Integration API">
+<link rel="up" href="integration-api.html" title="Integration API">
 <link rel="prev" href="harfbuzz-hb-ft.html" title="hb-ft">
-<link rel="next" href="harfbuzz-hb-gobject.html" title="hb-gobject">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<link rel="next" href="harfbuzz-hb-graphite2.html" title="hb-graphite2">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -18,9 +18,9 @@
                   <a href="#harfbuzz-hb-glib.description" class="shortcut">Description</a></span>
 </td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><a accesskey="u" href="ch15.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="u" href="integration-api.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
 <td><a accesskey="p" href="harfbuzz-hb-ft.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="harfbuzz-hb-gobject.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+<td><a accesskey="n" href="harfbuzz-hb-graphite2.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <div class="refentry">
 <a name="harfbuzz-hb-glib"></a><div class="titlepage"></div>
@@ -49,7 +49,7 @@
 </tr>
 <tr>
 <td class="function_type">
-<a href="/usr/share/gtk-doc/html/glib/glib-Unicode-Manipulation.html#GUnicodeScript"><span class="returnvalue">GUnicodeScript</span></a>
+<span class="returnvalue">GUnicodeScript</span>
 </td>
 <td class="function_name">
 <a class="link" href="harfbuzz-hb-glib.html#hb-glib-script-from-script" title="hb_glib_script_from_script ()">hb_glib_script_from_script</a> <span class="c_punctuation">()</span>
@@ -81,7 +81,7 @@
 </div>
 <div class="refsect1">
 <a name="harfbuzz-hb-glib.description"></a><h2>Description</h2>
-<p>Functions for using HarfBuzz with the GLib library. </p>
+<p>Functions for using HarfBuzz with the GLib library.</p>
 <p>HarfBuzz supports using GLib to provide Unicode data, by attaching
 GLib functions to the virtual methods in a <a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t" title="hb_unicode_funcs_t"><span class="type">hb_unicode_funcs_t</span></a> function
 structure.</p>
@@ -104,7 +104,7 @@ with the appropriate GLib function for each method.</p>
 <hr>
 <div class="refsect2">
 <a name="hb-glib-script-from-script"></a><h3>hb_glib_script_from_script ()</h3>
-<pre class="programlisting"><a href="/usr/share/gtk-doc/html/glib/glib-Unicode-Manipulation.html#GUnicodeScript"><span class="returnvalue">GUnicodeScript</span></a>
+<pre class="programlisting"><span class="returnvalue">GUnicodeScript</span>
 hb_glib_script_from_script (<em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="type">hb_script_t</span></a> script</code></em>);</pre>
 <p>Fetches the GUnicodeScript identifier that corresponds to the
 specified <a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="type">hb_script_t</span></a> script.</p>
@@ -133,7 +133,7 @@ specified <a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum
 <div class="refsect2">
 <a name="hb-glib-script-to-script"></a><h3>hb_glib_script_to_script ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="returnvalue">hb_script_t</span></a>
-hb_glib_script_to_script (<em class="parameter"><code><a href="/usr/share/gtk-doc/html/glib/glib-Unicode-Manipulation.html#GUnicodeScript"><span class="type">GUnicodeScript</span></a> script</code></em>);</pre>
+hb_glib_script_to_script (<em class="parameter"><code><span class="type">GUnicodeScript</span> script</code></em>);</pre>
 <p>Fetches the <a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="type">hb_script_t</span></a> script that corresponds to the
 specified GUnicodeScript identifier.</p>
 <div class="refsect3">
@@ -161,7 +161,7 @@ specified GUnicodeScript identifier.</p>
 <div class="refsect2">
 <a name="hb-glib-blob-create"></a><h3>hb_glib_blob_create ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t" title="hb_blob_t"><span class="returnvalue">hb_blob_t</span></a> *
-hb_glib_blob_create (<em class="parameter"><code><a href="/usr/share/gtk-doc/html/glib/glib-Byte-Arrays.html#GBytes"><span class="type">GBytes</span></a> *gbytes</code></em>);</pre>
+hb_glib_blob_create (<em class="parameter"><code><span class="type">GBytes</span> *gbytes</code></em>);</pre>
 <p>Creates an <a class="link" href="harfbuzz-hb-blob.html#hb-blob-t" title="hb_blob_t"><span class="type">hb_blob_t</span></a> blob from the specified
 GBytes data structure.</p>
 <div class="refsect3">
@@ -189,6 +189,6 @@ GBytes data structure.</p>
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/html/harfbuzz-hb-gobject.html b/docs/html/harfbuzz-hb-gobject.html
deleted file mode 100644 (file)
index 031e875..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>hb-gobject: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
-<link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch15.html" title="Integration API">
-<link rel="prev" href="harfbuzz-hb-glib.html" title="hb-glib">
-<link rel="next" href="harfbuzz-hb-graphite2.html" title="hb-graphite2">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
-<link rel="stylesheet" href="style.css" type="text/css">
-</head>
-<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
-<td width="100%" align="left" class="shortcuts">
-<a href="#" class="shortcut">Top</a><span id="nav_description">  <span class="dim">|</span> 
-                  <a href="#harfbuzz-hb-gobject.description" class="shortcut">Description</a></span>
-</td>
-<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><a accesskey="u" href="ch15.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
-<td><a accesskey="p" href="harfbuzz-hb-glib.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="harfbuzz-hb-graphite2.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
-</tr></table>
-<div class="refentry">
-<a name="harfbuzz-hb-gobject"></a><div class="titlepage"></div>
-<div class="refnamediv"><table width="100%"><tr>
-<td valign="top">
-<h2><span class="refentrytitle"><a name="harfbuzz-hb-gobject.top_of_page"></a>hb-gobject</span></h2>
-<p>hb-gobject — GObject integration support</p>
-</td>
-<td class="gallery_image" valign="top" align="right"></td>
-</tr></table></div>
-<div class="refsect1">
-<a name="harfbuzz-hb-gobject.includes"></a><h2>Includes</h2>
-<pre class="synopsis">#include &lt;hb-gobject.h&gt;
-</pre>
-</div>
-<div class="refsect1">
-<a name="harfbuzz-hb-gobject.description"></a><h2>Description</h2>
-<p>Support for using HarfBuzz with the GObject library to provide
-type data.</p>
-<p>The types and functions listed here are solely a linkage between
-HarfBuzz's public data types and the GTypes used by the GObject framework.
-HarfBuzz uses GObject introspection to generate its Python bindings 
-(and potentially other language bindings); client programs should never need
-to access the GObject-integration mechanics.</p>
-<p>For client programs using the GNOME and GTK software stack, please see the
-GLib and FreeType integration pages.</p>
-</div>
-<div class="refsect1">
-<a name="harfbuzz-hb-gobject.functions_details"></a><h2>Functions</h2>
-<p></p>
-</div>
-</div>
-<div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
-</body>
-</html>
\ No newline at end of file
index 2926fbd..8d2e314 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-graphite2: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch15.html" title="Integration API">
-<link rel="prev" href="harfbuzz-hb-gobject.html" title="hb-gobject">
+<link rel="up" href="integration-api.html" title="Integration API">
+<link rel="prev" href="harfbuzz-hb-glib.html" title="hb-glib">
 <link rel="next" href="harfbuzz-hb-icu.html" title="hb-icu">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -18,8 +18,8 @@
                   <a href="#harfbuzz-hb-graphite2.description" class="shortcut">Description</a></span>
 </td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><a accesskey="u" href="ch15.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
-<td><a accesskey="p" href="harfbuzz-hb-gobject.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="integration-api.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="harfbuzz-hb-glib.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
 <td><a accesskey="n" href="harfbuzz-hb-icu.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <div class="refentry">
@@ -117,6 +117,6 @@ features. </p>
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index 08bfab2..0b8d518 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-icu: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch15.html" title="Integration API">
+<link rel="up" href="integration-api.html" title="Integration API">
 <link rel="prev" href="harfbuzz-hb-graphite2.html" title="hb-graphite2">
 <link rel="next" href="harfbuzz-hb-uniscribe.html" title="hb-uniscribe">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -18,7 +18,7 @@
                   <a href="#harfbuzz-hb-icu.description" class="shortcut">Description</a></span>
 </td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><a accesskey="u" href="ch15.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="u" href="integration-api.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
 <td><a accesskey="p" href="harfbuzz-hb-graphite2.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
 <td><a accesskey="n" href="harfbuzz-hb-uniscribe.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
@@ -150,6 +150,6 @@ specified UScriptCode identifier.</p>
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index e84e30d..c49a42b 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-map: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch12.html" title="Core API">
+<link rel="up" href="core-api.html" title="Core API">
 <link rel="prev" href="harfbuzz-hb-font.html" title="hb-font">
 <link rel="next" href="harfbuzz-hb-set.html" title="hb-set">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -18,7 +18,7 @@
                   <a href="#harfbuzz-hb-map.description" class="shortcut">Description</a></span>
 </td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><a accesskey="u" href="ch12.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="u" href="core-api.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
 <td><a accesskey="p" href="harfbuzz-hb-font.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
 <td><a accesskey="n" href="harfbuzz-hb-set.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
@@ -189,6 +189,7 @@ use if desired.</p>
 <a name="hb-map-allocation-successful"></a><h3>hb_map_allocation_successful ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 hb_map_allocation_successful (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-map.html#hb-map-t" title="hb_map_t"><span class="type">hb_map_t</span></a> *map</code></em>);</pre>
+<p>Tests whether memory allocation for a set was successful.</p>
 <div class="refsect3">
 <a name="hb-map-allocation-successful.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -199,11 +200,15 @@ hb_map_allocation_successful (<em class="parameter"><code>const <a class="link"
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>map</p></td>
-<td class="parameter_description"><p>a map.</p></td>
+<td class="parameter_description"><p>A map</p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-map-allocation-successful.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> if allocation succeeded, <code class="literal">false</code> otherwise</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-1-7-7.html#api-index-1.7.7">1.7.7</a></p>
 </div>
 <hr>
@@ -211,6 +216,8 @@ hb_map_allocation_successful (<em class="parameter"><code>const <a class="link"
 <a name="hb-map-clear"></a><h3>hb_map_clear ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_map_clear (<em class="parameter"><code><a class="link" href="harfbuzz-hb-map.html#hb-map-t" title="hb_map_t"><span class="type">hb_map_t</span></a> *map</code></em>);</pre>
+<p>Clears out the contents of <em class="parameter"><code>map</code></em>
+.</p>
 <div class="refsect3">
 <a name="hb-map-clear.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -221,7 +228,7 @@ hb_map_clear (<em class="parameter"><code><a class="link" href="harfbuzz-hb-map.
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>map</p></td>
-<td class="parameter_description"><p>a map.</p></td>
+<td class="parameter_description"><p>A map</p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
@@ -233,10 +240,11 @@ hb_map_clear (<em class="parameter"><code><a class="link" href="harfbuzz-hb-map.
 <a name="hb-map-create"></a><h3>hb_map_create ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-map.html#hb-map-t" title="hb_map_t"><span class="returnvalue">hb_map_t</span></a> *
 hb_map_create (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>Creates a new, initially empty map.</p>
 <p><span class="annotation">[Xconstructor]</span></p>
 <div class="refsect3">
 <a name="hb-map-create.returns"></a><h4>Returns</h4>
-<p>. </p>
+<p>The new <a class="link" href="harfbuzz-hb-map.html#hb-map-t" title="hb_map_t"><span class="type">hb_map_t</span></a>. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-1-7-7.html#api-index-1.7.7">1.7.7</a></p>
@@ -247,6 +255,9 @@ hb_map_create (<em class="parameter"><code><span class="type">void</span></code>
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_map_del (<em class="parameter"><code><a class="link" href="harfbuzz-hb-map.html#hb-map-t" title="hb_map_t"><span class="type">hb_map_t</span></a> *map</code></em>,
             <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> key</code></em>);</pre>
+<p>Removes <em class="parameter"><code>key</code></em>
+ and its stored value from <em class="parameter"><code>map</code></em>
+.</p>
 <div class="refsect3">
 <a name="hb-map-del.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -255,11 +266,18 @@ hb_map_del (<em class="parameter"><code><a class="link" href="harfbuzz-hb-map.ht
 <col class="parameters_description">
 <col width="200px" class="parameters_annotations">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
 <td class="parameter_name"><p>map</p></td>
-<td class="parameter_description"><p>a map.</p></td>
+<td class="parameter_description"><p>A map</p></td>
 <td class="parameter_annotations"> </td>
-</tr></tbody>
+</tr>
+<tr>
+<td class="parameter_name"><p>key</p></td>
+<td class="parameter_description"><p>The key to delete</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
 </table></div>
 </div>
 <p class="since">Since: <a class="link" href="api-index-1-7-7.html#api-index-1.7.7">1.7.7</a></p>
@@ -269,6 +287,9 @@ hb_map_del (<em class="parameter"><code><a class="link" href="harfbuzz-hb-map.ht
 <a name="hb-map-destroy"></a><h3>hb_map_destroy ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_map_destroy (<em class="parameter"><code><a class="link" href="harfbuzz-hb-map.html#hb-map-t" title="hb_map_t"><span class="type">hb_map_t</span></a> *map</code></em>);</pre>
+<p>Decreases the reference count on a map. When
+the reference count reaches zero, the map is
+destroyed, freeing all memory.</p>
 <p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
 <div class="refsect3">
 <a name="hb-map-destroy.parameters"></a><h4>Parameters</h4>
@@ -280,7 +301,7 @@ hb_map_destroy (<em class="parameter"><code><a class="link" href="harfbuzz-hb-ma
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>map</p></td>
-<td class="parameter_description"><p>a map.</p></td>
+<td class="parameter_description"><p>A map</p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
@@ -293,6 +314,9 @@ hb_map_destroy (<em class="parameter"><code><a class="link" href="harfbuzz-hb-ma
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="returnvalue">hb_codepoint_t</span></a>
 hb_map_get (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-map.html#hb-map-t" title="hb_map_t"><span class="type">hb_map_t</span></a> *map</code></em>,
             <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> key</code></em>);</pre>
+<p>Fetches the value stored for <em class="parameter"><code>key</code></em>
+ in <em class="parameter"><code>map</code></em>
+.</p>
 <div class="refsect3">
 <a name="hb-map-get.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -301,11 +325,18 @@ hb_map_get (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-
 <col class="parameters_description">
 <col width="200px" class="parameters_annotations">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
 <td class="parameter_name"><p>map</p></td>
-<td class="parameter_description"><p>a map.</p></td>
+<td class="parameter_description"><p>A map</p></td>
 <td class="parameter_annotations"> </td>
-</tr></tbody>
+</tr>
+<tr>
+<td class="parameter_name"><p>key</p></td>
+<td class="parameter_description"><p>The key to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
 </table></div>
 </div>
 <p class="since">Since: <a class="link" href="api-index-1-7-7.html#api-index-1.7.7">1.7.7</a></p>
@@ -315,9 +346,10 @@ hb_map_get (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-
 <a name="hb-map-get-empty"></a><h3>hb_map_get_empty ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-map.html#hb-map-t" title="hb_map_t"><span class="returnvalue">hb_map_t</span></a> *
 hb_map_get_empty (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>Fetches the singleton empty <a class="link" href="harfbuzz-hb-map.html#hb-map-t" title="hb_map_t"><span class="type">hb_map_t</span></a>.</p>
 <div class="refsect3">
 <a name="hb-map-get-empty.returns"></a><h4>Returns</h4>
-<p>. </p>
+<p>The empty <a class="link" href="harfbuzz-hb-map.html#hb-map-t" title="hb_map_t"><span class="type">hb_map_t</span></a>. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-1-7-7.html#api-index-1.7.7">1.7.7</a></p>
@@ -327,6 +359,7 @@ hb_map_get_empty (<em class="parameter"><code><span class="type">void</span></co
 <a name="hb-map-get-population"></a><h3>hb_map_get_population ()</h3>
 <pre class="programlisting">unsigned <span class="returnvalue">int</span>
 hb_map_get_population (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-map.html#hb-map-t" title="hb_map_t"><span class="type">hb_map_t</span></a> *map</code></em>);</pre>
+<p>Returns the number of key-value pairs in the map.</p>
 <div class="refsect3">
 <a name="hb-map-get-population.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -337,11 +370,16 @@ hb_map_get_population (<em class="parameter"><code>const <a class="link" href="h
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>map</p></td>
-<td class="parameter_description"><p>a map.</p></td>
+<td class="parameter_description"><p>A map</p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-map-get-population.returns"></a><h4>Returns</h4>
+<p> The population of <em class="parameter"><code>map</code></em>
+</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-1-7-7.html#api-index-1.7.7">1.7.7</a></p>
 </div>
 <hr>
@@ -350,6 +388,8 @@ hb_map_get_population (<em class="parameter"><code>const <a class="link" href="h
 <pre class="programlisting"><span class="returnvalue">void</span> *
 hb_map_get_user_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-map.html#hb-map-t" title="hb_map_t"><span class="type">hb_map_t</span></a> *map</code></em>,
                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-user-data-key-t" title="hb_user_data_key_t"><span class="type">hb_user_data_key_t</span></a> *key</code></em>);</pre>
+<p>Fetches the user data associated with the specified key,
+attached to the specified map.</p>
 <p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
 <div class="refsect3">
 <a name="hb-map-get-user-data.parameters"></a><h4>Parameters</h4>
@@ -359,16 +399,23 @@ hb_map_get_user_data (<em class="parameter"><code><a class="link" href="harfbuzz
 <col class="parameters_description">
 <col width="200px" class="parameters_annotations">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
 <td class="parameter_name"><p>map</p></td>
-<td class="parameter_description"><p>a map.</p></td>
+<td class="parameter_description"><p>A map</p></td>
 <td class="parameter_annotations"> </td>
-</tr></tbody>
+</tr>
+<tr>
+<td class="parameter_name"><p>key</p></td>
+<td class="parameter_description"><p>The user-data key to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
 </table></div>
 </div>
 <div class="refsect3">
 <a name="hb-map-get-user-data.returns"></a><h4>Returns</h4>
-<p>. </p>
+<p>A pointer to the user data. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-1-7-7.html#api-index-1.7.7">1.7.7</a></p>
@@ -379,6 +426,9 @@ hb_map_get_user_data (<em class="parameter"><code><a class="link" href="harfbuzz
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 hb_map_has (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-map.html#hb-map-t" title="hb_map_t"><span class="type">hb_map_t</span></a> *map</code></em>,
             <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> key</code></em>);</pre>
+<p>Tests whether <em class="parameter"><code>key</code></em>
+ is an element of <em class="parameter"><code>map</code></em>
+.</p>
 <div class="refsect3">
 <a name="hb-map-has.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -387,13 +437,26 @@ hb_map_has (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-
 <col class="parameters_description">
 <col width="200px" class="parameters_annotations">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
 <td class="parameter_name"><p>map</p></td>
-<td class="parameter_description"><p>a map.</p></td>
+<td class="parameter_description"><p>A map</p></td>
 <td class="parameter_annotations"> </td>
-</tr></tbody>
+</tr>
+<tr>
+<td class="parameter_name"><p>key</p></td>
+<td class="parameter_description"><p>The key to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-map-has.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> if <em class="parameter"><code>key</code></em>
+is found in <em class="parameter"><code>map</code></em>
+, <code class="literal">false</code> otherwise</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-1-7-7.html#api-index-1.7.7">1.7.7</a></p>
 </div>
 <hr>
@@ -401,6 +464,8 @@ hb_map_has (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-
 <a name="hb-map-is-empty"></a><h3>hb_map_is_empty ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 hb_map_is_empty (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-map.html#hb-map-t" title="hb_map_t"><span class="type">hb_map_t</span></a> *map</code></em>);</pre>
+<p>Tests whether <em class="parameter"><code>map</code></em>
+ is empty (contains no elements).</p>
 <div class="refsect3">
 <a name="hb-map-is-empty.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -411,11 +476,16 @@ hb_map_is_empty (<em class="parameter"><code>const <a class="link" href="harfbuz
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>map</p></td>
-<td class="parameter_description"><p>a map.</p></td>
+<td class="parameter_description"><p>A map</p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-map-is-empty.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> if <em class="parameter"><code>map</code></em>
+is empty</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-1-7-7.html#api-index-1.7.7">1.7.7</a></p>
 </div>
 <hr>
@@ -423,6 +493,7 @@ hb_map_is_empty (<em class="parameter"><code>const <a class="link" href="harfbuz
 <a name="hb-map-reference"></a><h3>hb_map_reference ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-map.html#hb-map-t" title="hb_map_t"><span class="returnvalue">hb_map_t</span></a> *
 hb_map_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb-map.html#hb-map-t" title="hb_map_t"><span class="type">hb_map_t</span></a> *map</code></em>);</pre>
+<p>Increases the reference count on a map.</p>
 <p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
 <div class="refsect3">
 <a name="hb-map-reference.parameters"></a><h4>Parameters</h4>
@@ -434,14 +505,14 @@ hb_map_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>map</p></td>
-<td class="parameter_description"><p>a map.</p></td>
+<td class="parameter_description"><p>A map</p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
 </div>
 <div class="refsect3">
 <a name="hb-map-reference.returns"></a><h4>Returns</h4>
-<p>. </p>
+<p>The map. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-1-7-7.html#api-index-1.7.7">1.7.7</a></p>
@@ -453,6 +524,9 @@ hb_map_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 hb_map_set (<em class="parameter"><code><a class="link" href="harfbuzz-hb-map.html#hb-map-t" title="hb_map_t"><span class="type">hb_map_t</span></a> *map</code></em>,
             <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> key</code></em>,
             <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> value</code></em>);</pre>
+<p>Stores <em class="parameter"><code>key</code></em>
+:<em class="parameter"><code>value</code></em>
+ in the map.</p>
 <div class="refsect3">
 <a name="hb-map-set.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -461,11 +535,24 @@ hb_map_set (<em class="parameter"><code><a class="link" href="harfbuzz-hb-map.ht
 <col class="parameters_description">
 <col width="200px" class="parameters_annotations">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
 <td class="parameter_name"><p>map</p></td>
-<td class="parameter_description"><p>a map.</p></td>
+<td class="parameter_description"><p>A map</p></td>
 <td class="parameter_annotations"> </td>
-</tr></tbody>
+</tr>
+<tr>
+<td class="parameter_name"><p>key</p></td>
+<td class="parameter_description"><p>The key to store in the map</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>value</p></td>
+<td class="parameter_description"><p>The value to store for <em class="parameter"><code>key</code></em>
+</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
 </table></div>
 </div>
 <p class="since">Since: <a class="link" href="api-index-1-7-7.html#api-index-1.7.7">1.7.7</a></p>
@@ -479,6 +566,7 @@ hb_map_set_user_data (<em class="parameter"><code><a class="link" href="harfbuzz
                       <em class="parameter"><code><span class="type">void</span> *data</code></em>,
                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>,
                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="type">hb_bool_t</span></a> replace</code></em>);</pre>
+<p>Attaches a user-data key/data pair to the specified map.</p>
 <p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
 <div class="refsect3">
 <a name="hb-map-set-user-data.parameters"></a><h4>Parameters</h4>
@@ -488,13 +576,40 @@ hb_map_set_user_data (<em class="parameter"><code><a class="link" href="harfbuzz
 <col class="parameters_description">
 <col width="200px" class="parameters_annotations">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
 <td class="parameter_name"><p>map</p></td>
-<td class="parameter_description"><p>a map.</p></td>
+<td class="parameter_description"><p>A map</p></td>
 <td class="parameter_annotations"> </td>
-</tr></tbody>
+</tr>
+<tr>
+<td class="parameter_name"><p>key</p></td>
+<td class="parameter_description"><p>The user-data key to set</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>data</p></td>
+<td class="parameter_description"><p>A pointer to the user data to set</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>destroy</p></td>
+<td class="parameter_description"><p>A callback to call when <em class="parameter"><code>data</code></em>
+is not needed anymore. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>replace</p></td>
+<td class="parameter_description"><p>Whether to replace an existing data with the same key</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-map-set-user-data.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> if success, <code class="literal">false</code> otherwise</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-1-7-7.html#api-index-1.7.7">1.7.7</a></p>
 </div>
 </div>
@@ -504,16 +619,19 @@ hb_map_set_user_data (<em class="parameter"><code><a class="link" href="harfbuzz
 <a name="HB-MAP-VALUE-INVALID:CAPS"></a><h3>HB_MAP_VALUE_INVALID</h3>
 <pre class="programlisting">#define HB_MAP_VALUE_INVALID ((hb_codepoint_t) -1)
 </pre>
+<p>Unset <a class="link" href="harfbuzz-hb-map.html#hb-map-t" title="hb_map_t"><span class="type">hb_map_t</span></a> value.</p>
+<p class="since">Since: <a class="link" href="api-index-1-7-7.html#api-index-1.7.7">1.7.7</a></p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="hb-map-t"></a><h3>hb_map_t</h3>
 <pre class="programlisting">typedef struct hb_map_t hb_map_t;
 </pre>
+<p>Data type for holding integer-to-integer hash maps.</p>
 </div>
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index 6e6998b..62767d1 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-ot-color: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch13.html" title="OpenType API">
-<link rel="prev" href="ch13.html" title="OpenType API">
+<link rel="up" href="opentype-api.html" title="OpenType API">
+<link rel="prev" href="opentype-api.html" title="OpenType API">
 <link rel="next" href="harfbuzz-hb-ot-font.html" title="hb-ot-font">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -18,8 +18,8 @@
                   <a href="#harfbuzz-hb-ot-color.description" class="shortcut">Description</a></span>
 </td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><a accesskey="u" href="ch13.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
-<td><a accesskey="p" href="ch13.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="opentype-api.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="opentype-api.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
 <td><a accesskey="n" href="harfbuzz-hb-ot-font.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <div class="refentry">
 <td class="function_name"><a class="link" href="harfbuzz-hb-ot-color.html#hb-color-t" title="hb_color_t">hb_color_t</a></td>
 </tr>
 <tr>
+<td class="datatype_keyword"> </td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-layer-t" title="hb_ot_color_layer_t">hb_ot_color_layer_t</a></td>
+</tr>
+<tr>
 <td class="datatype_keyword">enum</td>
 <td class="function_name"><a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-palette-flags-t" title="enum hb_ot_color_palette_flags_t">hb_ot_color_palette_flags_t</a></td>
 </tr>
 <a name="HB-COLOR:CAPS"></a><h3>HB_COLOR()</h3>
 <pre class="programlisting">#define HB_COLOR(b,g,r,a) ((hb_color_t) HB_TAG ((b),(g),(r),(a)))
 </pre>
+<p>Constructs an <a class="link" href="harfbuzz-hb-ot-color.html#hb-color-t" title="hb_color_t"><span class="type">hb_color_t</span></a> from four integers.</p>
+<div class="refsect3">
+<a name="HB-COLOR.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>b</p></td>
+<td class="parameter_description"><p>blue channel value</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>g</p></td>
+<td class="parameter_description"><p>green channel value</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>r</p></td>
+<td class="parameter_description"><p>red channel value</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>a</p></td>
+<td class="parameter_description"><p>alpha channel value</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-1-0.html#api-index-2.1.0">2.1.0</a></p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="hb-color-get-alpha"></a><h3>hb_color_get_alpha ()</h3>
 <pre class="programlisting"><span class="returnvalue">uint8_t</span>
 hb_color_get_alpha (<em class="parameter"><code><a class="link" href="harfbuzz-hb-ot-color.html#hb-color-t" title="hb_color_t"><span class="type">hb_color_t</span></a> color</code></em>);</pre>
+<p>Fetches the alpha channel of the given <em class="parameter"><code>color</code></em>
+.</p>
+<div class="refsect3">
+<a name="hb-color-get-alpha.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>color</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-ot-color.html#hb-color-t" title="hb_color_t"><span class="type">hb_color_t</span></a> we are interested in its channels.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
 <div class="refsect3">
 <a name="hb-color-get-alpha.returns"></a><h4>Returns</h4>
-<p> Alpha channel value of the given color</p>
+<p> Alpha channel value</p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-2-1-0.html#api-index-2.1.0">2.1.0</a></p>
 </div>
@@ -225,9 +280,26 @@ hb_color_get_alpha (<em class="parameter"><code><a class="link" href="harfbuzz-h
 <a name="hb-color-get-blue"></a><h3>hb_color_get_blue ()</h3>
 <pre class="programlisting"><span class="returnvalue">uint8_t</span>
 hb_color_get_blue (<em class="parameter"><code><a class="link" href="harfbuzz-hb-ot-color.html#hb-color-t" title="hb_color_t"><span class="type">hb_color_t</span></a> color</code></em>);</pre>
+<p>Fetches the blue channel of the given <em class="parameter"><code>color</code></em>
+.</p>
+<div class="refsect3">
+<a name="hb-color-get-blue.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>color</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-ot-color.html#hb-color-t" title="hb_color_t"><span class="type">hb_color_t</span></a> we are interested in its channels.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
 <div class="refsect3">
 <a name="hb-color-get-blue.returns"></a><h4>Returns</h4>
-<p> Blue channel value of the given color</p>
+<p> Blue channel value</p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-2-1-0.html#api-index-2.1.0">2.1.0</a></p>
 </div>
@@ -236,9 +308,26 @@ hb_color_get_blue (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 <a name="hb-color-get-green"></a><h3>hb_color_get_green ()</h3>
 <pre class="programlisting"><span class="returnvalue">uint8_t</span>
 hb_color_get_green (<em class="parameter"><code><a class="link" href="harfbuzz-hb-ot-color.html#hb-color-t" title="hb_color_t"><span class="type">hb_color_t</span></a> color</code></em>);</pre>
+<p>Fetches the green channel of the given <em class="parameter"><code>color</code></em>
+.</p>
+<div class="refsect3">
+<a name="hb-color-get-green.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>color</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-ot-color.html#hb-color-t" title="hb_color_t"><span class="type">hb_color_t</span></a> we are interested in its channels.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
 <div class="refsect3">
 <a name="hb-color-get-green.returns"></a><h4>Returns</h4>
-<p> Green channel value of the given color</p>
+<p> Green channel value</p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-2-1-0.html#api-index-2.1.0">2.1.0</a></p>
 </div>
@@ -247,9 +336,26 @@ hb_color_get_green (<em class="parameter"><code><a class="link" href="harfbuzz-h
 <a name="hb-color-get-red"></a><h3>hb_color_get_red ()</h3>
 <pre class="programlisting"><span class="returnvalue">uint8_t</span>
 hb_color_get_red (<em class="parameter"><code><a class="link" href="harfbuzz-hb-ot-color.html#hb-color-t" title="hb_color_t"><span class="type">hb_color_t</span></a> color</code></em>);</pre>
+<p>Fetches the red channel of the given <em class="parameter"><code>color</code></em>
+.</p>
+<div class="refsect3">
+<a name="hb-color-get-red.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>color</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-ot-color.html#hb-color-t" title="hb_color_t"><span class="type">hb_color_t</span></a> we are interested in its channels.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
 <div class="refsect3">
 <a name="hb-color-get-red.returns"></a><h4>Returns</h4>
-<p> Red channel value of the given color</p>
+<p> Red channel value</p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-2-1-0.html#api-index-2.1.0">2.1.0</a></p>
 </div>
@@ -261,7 +367,7 @@ hb_ot_color_glyph_get_layers (<em class="parameter"><code><a class="link" href="
                               <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> glyph</code></em>,
                               <em class="parameter"><code>unsigned <span class="type">int</span> start_offset</code></em>,
                               <em class="parameter"><code>unsigned <span class="type">int</span> *layer_count</code></em>,
-                              <em class="parameter"><code><span class="type">hb_ot_color_layer_t</span> *layers</code></em>);</pre>
+                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-layer-t" title="hb_ot_color_layer_t"><span class="type">hb_ot_color_layer_t</span></a> *layers</code></em>);</pre>
 <p>Fetches a list of all color layers for the specified glyph index in the specified
 face. The list returned will begin at the offset provided.</p>
 <div class="refsect3">
@@ -318,6 +424,7 @@ hb_ot_color_glyph_reference_png (<em class="parameter"><code><a class="link" hre
 as input. To get an optimally sized PNG blob, the UPEM value must be set on the <em class="parameter"><code>font</code></em>
 
 object. If UPEM is unset, the blob returned will be the largest PNG available.</p>
+<p>If the glyph has no PNG image, the singleton empty blob is returned.</p>
 <div class="refsect3">
 <a name="hb-ot-color-glyph-reference-png.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -354,6 +461,7 @@ object. If UPEM is unset, the blob returned will be the largest PNG available.</
 hb_ot_color_glyph_reference_svg (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> *face</code></em>,
                                  <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> glyph</code></em>);</pre>
 <p>Fetches the SVG document for a glyph. The blob may be either plain text or gzip-encoded.</p>
+<p>If the glyph has no SVG document, the singleton empty blob is returned.</p>
 <div class="refsect3">
 <a name="hb-ot-color-glyph-reference-svg.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -406,7 +514,7 @@ hb_ot_color_has_layers (<em class="parameter"><code><a class="link" href="harfbu
 </div>
 <div class="refsect3">
 <a name="hb-ot-color-has-layers.returns"></a><h4>Returns</h4>
-<p> true if data found, false otherwise</p>
+<p> <code class="literal">true</code> if data found, <code class="literal">false</code> otherwise</p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-2-1-0.html#api-index-2.1.0">2.1.0</a></p>
 </div>
@@ -433,7 +541,7 @@ hb_ot_color_has_palettes (<em class="parameter"><code><a class="link" href="harf
 </div>
 <div class="refsect3">
 <a name="hb-ot-color-has-palettes.returns"></a><h4>Returns</h4>
-<p> true if data found, false otherwise</p>
+<p> <code class="literal">true</code> if data found, <code class="literal">false</code> otherwise</p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-2-1-0.html#api-index-2.1.0">2.1.0</a></p>
 </div>
@@ -460,7 +568,7 @@ hb_ot_color_has_png (<em class="parameter"><code><a class="link" href="harfbuzz-
 </div>
 <div class="refsect3">
 <a name="hb-ot-color-has-png.returns"></a><h4>Returns</h4>
-<p> true if data found, false otherwise</p>
+<p> <code class="literal">true</code> if data found, <code class="literal">false</code> otherwise</p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-2-1-0.html#api-index-2.1.0">2.1.0</a></p>
 </div>
@@ -487,7 +595,7 @@ hb_ot_color_has_svg (<em class="parameter"><code><a class="link" href="harfbuzz-
 </div>
 <div class="refsect3">
 <a name="hb-ot-color-has-svg.returns"></a><h4>Returns</h4>
-<p> true if data found, false otherwise.</p>
+<p> <code class="literal">true</code> if data found, <code class="literal">false</code> otherwise.</p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-2-1-0.html#api-index-2.1.0">2.1.0</a></p>
 </div>
@@ -498,7 +606,7 @@ hb_ot_color_has_svg (<em class="parameter"><code><a class="link" href="harfbuzz-
 hb_ot_color_palette_color_get_name_id (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> *face</code></em>,
                                        <em class="parameter"><code>unsigned <span class="type">int</span> color_index</code></em>);</pre>
 <p>Fetches the <code class="literal">name</code> table Name ID that provides display names for
-the specificed color in a face's <code class="literal">CPAL</code> color palette. </p>
+the specified color in a face's <code class="literal">CPAL</code> color palette.</p>
 <p>Display names can be generic (e.g., "Background") or specific
 (e.g., "Eye color").</p>
 <div class="refsect3">
@@ -659,7 +767,7 @@ hb_ot_color_palette_get_flags (<em class="parameter"><code><a class="link" href=
 hb_ot_color_palette_get_name_id (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> *face</code></em>,
                                  <em class="parameter"><code>unsigned <span class="type">int</span> palette_index</code></em>);</pre>
 <p>Fetches the <code class="literal">name</code> table Name ID that provides display names for
-a <code class="literal">CPAL</code> color palette. </p>
+a <code class="literal">CPAL</code> color palette.</p>
 <p>Palette display names can be generic (e.g., "Default") or provide
 specific, themed names (e.g., "Spring", "Summer", "Fall", and "Winter").</p>
 <div class="refsect3">
@@ -678,7 +786,7 @@ specific, themed names (e.g., "Spring", "Summer", "Fall", and "Winter").</p>
 </tr>
 <tr>
 <td class="parameter_name"><p>palette_index</p></td>
-<td class="parameter_description"><p>The index of the color palette </p></td>
+<td class="parameter_description"><p>The index of the color palette</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 </tbody>
@@ -698,12 +806,47 @@ If the requested palette has no name the result is <span class="type">HB_OT_NAME
 <a name="hb-color-t"></a><h3>hb_color_t</h3>
 <pre class="programlisting">typedef uint32_t hb_color_t;
 </pre>
-<p>Data type for holding color values.</p>
+<p>Data type for holding color values. Colors are eight bits per
+channel RGB plus alpha transparency.</p>
+<p class="since">Since: <a class="link" href="api-index-2-1-0.html#api-index-2.1.0">2.1.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-color-layer-t"></a><h3>hb_ot_color_layer_t</h3>
+<pre class="programlisting">typedef struct {
+  hb_codepoint_t glyph;
+  unsigned int   color_index;
+} hb_ot_color_layer_t;
+</pre>
+<p>Pairs of glyph and color index.</p>
+<div class="refsect3">
+<a name="hb-ot-color-layer-t.members"></a><h4>Members</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="300px" class="struct_members_name">
+<col class="struct_members_description">
+<col width="200px" class="struct_members_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="struct_member_name"><p><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> <em class="structfield"><code><a name="hb-ot-color-layer-t.glyph"></a>glyph</code></em>;</p></td>
+<td class="struct_member_description"><p>the glyph ID of the layer</p></td>
+<td class="struct_member_annotations"> </td>
+</tr>
+<tr>
+<td class="struct_member_name"><p>unsigned <span class="type">int</span> <em class="structfield"><code><a name="hb-ot-color-layer-t.color-index"></a>color_index</code></em>;</p></td>
+<td class="struct_member_description"><p>the palette color index of the layer</p></td>
+<td class="struct_member_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
 <p class="since">Since: <a class="link" href="api-index-2-1-0.html#api-index-2.1.0">2.1.0</a></p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="hb-ot-color-palette-flags-t"></a><h3>enum hb_ot_color_palette_flags_t</h3>
+<p>Flags that describe the properties of color palette.</p>
 <div class="refsect3">
 <a name="hb-ot-color-palette-flags-t.members"></a><h4>Members</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -745,6 +888,6 @@ palette is appropriate to use when displaying the font on a dark background such
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index 20cea7b..23745aa 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-ot-font: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch13.html" title="OpenType API">
+<link rel="up" href="opentype-api.html" title="OpenType API">
 <link rel="prev" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">
 <link rel="next" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -18,7 +18,7 @@
                   <a href="#harfbuzz-hb-ot-font.description" class="shortcut">Description</a></span>
 </td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><a accesskey="u" href="ch13.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="u" href="opentype-api.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
 <td><a accesskey="p" href="harfbuzz-hb-ot-color.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
 <td><a accesskey="n" href="harfbuzz-hb-ot-layout.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
@@ -65,11 +65,28 @@ never need to call these functions directly.</p>
 <a name="hb-ot-font-set-funcs"></a><h3>hb_ot_font_set_funcs ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_ot_font_set_funcs (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
+<p>Sets the font functions to use when working with <em class="parameter"><code>font</code></em>
+.</p>
+<div class="refsect3">
+<a name="hb-ot-font-set-funcs.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-28.html#api-index-0.9.28">0.9.28</a></p>
 </div>
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index d61416f..a4380a9 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-ot-layout: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch13.html" title="OpenType API">
+<link rel="up" href="opentype-api.html" title="OpenType API">
 <link rel="prev" href="harfbuzz-hb-ot-font.html" title="hb-ot-font">
 <link rel="next" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -18,7 +18,7 @@
                   <a href="#harfbuzz-hb-ot-layout.description" class="shortcut">Description</a></span>
 </td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><a accesskey="u" href="ch13.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="u" href="opentype-api.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
 <td><a accesskey="p" href="harfbuzz-hb-ot-font.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
 <td><a accesskey="n" href="harfbuzz-hb-ot-math.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <span class="returnvalue">void</span>
 </td>
 <td class="function_name">
-<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-closure-lookups" title="hb_ot_layout_closure_lookups ()">hb_ot_layout_closure_lookups</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<span class="returnvalue">void</span>
-</td>
-<td class="function_name">
-<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-closure-features" title="hb_ot_layout_closure_features ()">hb_ot_layout_closure_features</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<span class="returnvalue">void</span>
-</td>
-<td class="function_name">
 <a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-collect-lookups" title="hb_ot_layout_collect_lookups ()">hb_ot_layout_collect_lookups</a> <span class="c_punctuation">()</span>
 </td>
 </tr>
 <a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 </td>
 <td class="function_name">
-<span class="c_punctuation">(</span><a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-glyph-sequence-func-t" title="hb_ot_layout_glyph_sequence_func_t ()">*hb_ot_layout_glyph_sequence_func_t</a><span class="c_punctuation">)</span> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
-</td>
-<td class="function_name">
 <a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-has-glyph-classes" title="hb_ot_layout_has_glyph_classes ()">hb_ot_layout_has_glyph_classes</a> <span class="c_punctuation">()</span>
 </td>
 </tr>
 </tr>
 <tr>
 <td class="function_type">
+<span class="returnvalue">unsigned</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-lookup-get-glyph-alternates" title="hb_ot_layout_lookup_get_glyph_alternates ()">hb_ot_layout_lookup_get_glyph_alternates</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
 <span class="returnvalue">void</span>
 </td>
 <td class="function_name">
 <a name="hb-ot-tag-to-language"></a><h3>hb_ot_tag_to_language ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-language-t" title="hb_language_t"><span class="returnvalue">hb_language_t</span></a>
 hb_ot_tag_to_language (<em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> tag</code></em>);</pre>
+<p>Converts a language tag to an <a class="link" href="harfbuzz-hb-common.html#hb-language-t" title="hb_language_t"><span class="type">hb_language_t</span></a>.</p>
+<div class="refsect3">
+<a name="hb-ot-tag-to-language.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>tag</p></td>
+<td class="parameter_description"><p>an language tag</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
 <div class="refsect3">
 <a name="hb-ot-tag-to-language.returns"></a><h4>Returns</h4>
-<p>. </p>
-<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
+<p>The <a class="link" href="harfbuzz-hb-common.html#hb-language-t" title="hb_language_t"><span class="type">hb_language_t</span></a> corresponding to <em class="parameter"><code>tag</code></em>
+. </p>
+<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
@@ -441,6 +442,27 @@ hb_ot_tag_to_language (<em class="parameter"><code><a class="link" href="harfbuz
 <a name="hb-ot-tag-to-script"></a><h3>hb_ot_tag_to_script ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="returnvalue">hb_script_t</span></a>
 hb_ot_tag_to_script (<em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> tag</code></em>);</pre>
+<p>Converts a script tag to an <a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="type">hb_script_t</span></a>.</p>
+<div class="refsect3">
+<a name="hb-ot-tag-to-script.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>tag</p></td>
+<td class="parameter_description"><p>a script tag</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-ot-tag-to-script.returns"></a><h4>Returns</h4>
+<p> The <a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="type">hb_script_t</span></a> corresponding to <em class="parameter"><code>tag</code></em>
+.</p>
+</div>
 </div>
 <hr>
 <div class="refsect2">
@@ -476,27 +498,27 @@ hb_ot_tags_from_script_and_language (<em class="parameter"><code><a class="link"
 <td class="parameter_name"><p>script_count</p></td>
 <td class="parameter_description"><p>maximum number of script tags to retrieve (IN)
 and actual number of script tags retrieved (OUT). </p></td>
-<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<acronym title="NULL may be passed instead of a pointer to a location."><span class="acronym">optional</span></acronym>]</span></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>script_tags</p></td>
 <td class="parameter_description"><p>array of size at least <em class="parameter"><code>script_count</code></em>
 to store the
 script tag results. </p></td>
-<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL may be passed instead of a pointer to a location."><span class="acronym">optional</span></acronym>]</span></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>language_count</p></td>
 <td class="parameter_description"><p>maximum number of language tags to retrieve
 (IN) and actual number of language tags retrieved (OUT). </p></td>
-<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<acronym title="NULL may be passed instead of a pointer to a location."><span class="acronym">optional</span></acronym>]</span></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>language_tags</p></td>
 <td class="parameter_description"><p>array of size at least <em class="parameter"><code>language_count</code></em>
 to store
 the language tag results. </p></td>
-<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL may be passed instead of a pointer to a location."><span class="acronym">optional</span></acronym>]</span></td>
 </tr>
 </tbody>
 </table></div>
@@ -535,16 +557,16 @@ hb_ot_tags_to_script_and_language (<em class="parameter"><code><a class="link" h
 <tr>
 <td class="parameter_name"><p>script</p></td>
 <td class="parameter_description"><p>the <a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="type">hb_script_t</span></a> corresponding to <em class="parameter"><code>script_tag</code></em>
-(OUT). </p></td>
-<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL may be passed instead of a pointer to a location."><span class="acronym">optional</span></acronym>]</span></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>language</p></td>
 <td class="parameter_description"><p>the <a class="link" href="harfbuzz-hb-common.html#hb-language-t" title="hb_language_t"><span class="type">hb_language_t</span></a> corresponding to <em class="parameter"><code>script_tag</code></em>
 and
 <em class="parameter"><code>language_tag</code></em>
-(OUT). </p></td>
-<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL may be passed instead of a pointer to a location."><span class="acronym">optional</span></acronym>]</span></td>
 </tr>
 </tbody>
 </table></div>
@@ -553,88 +575,6 @@ and
 </div>
 <hr>
 <div class="refsect2">
-<a name="hb-ot-layout-closure-lookups"></a><h3>hb_ot_layout_closure_lookups ()</h3>
-<pre class="programlisting"><span class="returnvalue">void</span>
-hb_ot_layout_closure_lookups (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> *face</code></em>,
-                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> table_tag</code></em>,
-                              <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a> *glyphs</code></em>,
-                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a> *lookup_indexes</code></em>);</pre>
-<p>Returns all inactive lookups reachable from lookup_indices</p>
-<div class="refsect3">
-<a name="hb-ot-layout-closure-lookups.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table class="informaltable" width="100%" border="0">
-<colgroup>
-<col width="150px" class="parameters_name">
-<col class="parameters_description">
-<col width="200px" class="parameters_annotations">
-</colgroup>
-<tbody>
-<tr>
-<td class="parameter_name"><p>face</p></td>
-<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> to work upon</p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-<tr>
-<td class="parameter_name"><p>table_tag</p></td>
-<td class="parameter_description"><p>HB_OT_TAG_GSUB or HB_OT_TAG_GPOS</p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-<tr>
-<td class="parameter_name"><p>lookup_indexes</p></td>
-<td class="parameter_description"><p>lookup_indices collected from feature
-list. </p></td>
-<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>]</span></td>
-</tr>
-</tbody>
-</table></div>
-</div>
-<p class="since">Since: EXPERIMENTAL</p>
-</div>
-<hr>
-<div class="refsect2">
-<a name="hb-ot-layout-closure-features"></a><h3>hb_ot_layout_closure_features ()</h3>
-<pre class="programlisting"><span class="returnvalue">void</span>
-hb_ot_layout_closure_features (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> *face</code></em>,
-                               <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> table_tag</code></em>,
-                               <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-map.html#hb-map-t" title="hb_map_t"><span class="type">hb_map_t</span></a> *lookup_indexes</code></em>,
-                               <em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a> *feature_indexes</code></em>);</pre>
-<p>Returns all active feature indexes</p>
-<div class="refsect3">
-<a name="hb-ot-layout-closure-features.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table class="informaltable" width="100%" border="0">
-<colgroup>
-<col width="150px" class="parameters_name">
-<col class="parameters_description">
-<col width="200px" class="parameters_annotations">
-</colgroup>
-<tbody>
-<tr>
-<td class="parameter_name"><p>face</p></td>
-<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> to work upon</p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-<tr>
-<td class="parameter_name"><p>table_tag</p></td>
-<td class="parameter_description"><p>HB_OT_TAG_GSUB or HB_OT_TAG_GPOS</p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-<tr>
-<td class="parameter_name"><p>lookup_indexes</p></td>
-<td class="parameter_description"><p>collected active lookup_indices. </p></td>
-<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input. Default is transfer none."><span class="acronym">in</span></acronym>]</span></td>
-</tr>
-<tr>
-<td class="parameter_name"><p>feature_indexes</p></td>
-<td class="parameter_description"><p>all active feature indexes collected. </p></td>
-<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
-</tr>
-</tbody>
-</table></div>
-</div>
-<p class="since">Since: EXPERIMENTAL</p>
-</div>
-<hr>
-<div class="refsect2">
 <a name="hb-ot-layout-collect-lookups"></a><h3>hb_ot_layout_collect_lookups ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_ot_layout_collect_lookups (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> *face</code></em>,
@@ -664,7 +604,7 @@ list of features is provided, all features will be queried.</p>
 </tr>
 <tr>
 <td class="parameter_name"><p>table_tag</p></td>
-<td class="parameter_description"><p>HB_OT_TAG_GSUB or HB_OT_TAG_GPOS</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-TAG-GSUB:CAPS" title="HB_OT_TAG_GSUB"><span class="type">HB_OT_TAG_GSUB</span></a> or <a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-TAG-GPOS:CAPS" title="HB_OT_TAG_GPOS"><span class="type">HB_OT_TAG_GPOS</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
@@ -723,7 +663,7 @@ features is provided, all features will be queried.</p>
 </tr>
 <tr>
 <td class="parameter_name"><p>table_tag</p></td>
-<td class="parameter_description"><p>HB_OT_TAG_GSUB or HB_OT_TAG_GPOS</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-TAG-GSUB:CAPS" title="HB_OT_TAG_GSUB"><span class="type">HB_OT_TAG_GSUB</span></a> or <a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-TAG-GPOS:CAPS" title="HB_OT_TAG_GPOS"><span class="type">HB_OT_TAG_GPOS</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
@@ -763,11 +703,6 @@ hb_ot_layout_feature_get_characters (<em class="parameter"><code><a class="link"
                                      <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *characters</code></em>);</pre>
 <p>Fetches a list of the characters defined as having a variant under the specified
 "Character Variant" ("cvXX") feature tag.</p>
-<div class="note">Note: If the char_count output value is equal to its input value, then there
-      is a chance there were more characters defined under the feature tag than were
-      returned. This function can be called with incrementally larger start_offset
-      until the char_count output value is lower than its input value, or the size
-      of the characters array can be increased.</div>
 <div class="refsect3">
 <a name="hb-ot-layout-feature-get-characters.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -801,7 +736,7 @@ hb_ot_layout_feature_get_characters (<em class="parameter"><code><a class="link"
 <td class="parameter_name"><p>char_count</p></td>
 <td class="parameter_description"><p>Input = the maximum number of characters to return;
 Output = the actual number of characters returned (may be zero). </p></td>
-<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<acronym title="NULL may be passed instead of a pointer to a location."><span class="acronym">optional</span></acronym>]</span></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>characters</p></td>
@@ -848,7 +783,7 @@ begin at the offset provided.</p>
 </tr>
 <tr>
 <td class="parameter_name"><p>table_tag</p></td>
-<td class="parameter_description"><p>HB_OT_TAG_GSUB or HB_OT_TAG_GPOS</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-TAG-GSUB:CAPS" title="HB_OT_TAG_GSUB"><span class="type">HB_OT_TAG_GSUB</span></a> or <a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-TAG-GPOS:CAPS" title="HB_OT_TAG_GPOS"><span class="type">HB_OT_TAG_GPOS</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
@@ -865,7 +800,7 @@ begin at the offset provided.</p>
 <td class="parameter_name"><p>lookup_count</p></td>
 <td class="parameter_description"><p>Input = the maximum number of lookups to return;
 Output = the actual number of lookups returned (may be zero). </p></td>
-<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<acronym title="NULL may be passed instead of a pointer to a location."><span class="acronym">optional</span></acronym>]</span></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>lookup_indexes</p></td>
@@ -875,6 +810,10 @@ Output = the actual number of lookups returned (may be zero). </p></td>
 </tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-ot-layout-feature-get-lookups.returns"></a><h4>Returns</h4>
+<p> Total number of lookups.</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
 </div>
 <hr>
@@ -919,39 +858,39 @@ hb_ot_layout_feature_get_name_ids (<em class="parameter"><code><a class="link" h
 <td class="parameter_name"><p>label_id</p></td>
 <td class="parameter_description"><p>The ‘name’ table name ID that specifies a string
 for a user-interface label for this feature. (May be NULL.). </p></td>
-<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL may be passed instead of a pointer to a location."><span class="acronym">optional</span></acronym>]</span></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>tooltip_id</p></td>
 <td class="parameter_description"><p>The ‘name’ table name ID that specifies a string
 that an application can use for tooltip text for this
 feature. (May be NULL.). </p></td>
-<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL may be passed instead of a pointer to a location."><span class="acronym">optional</span></acronym>]</span></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>sample_id</p></td>
 <td class="parameter_description"><p>The ‘name’ table name ID that specifies sample text
 that illustrates the effect of this feature. (May be NULL.). </p></td>
-<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL may be passed instead of a pointer to a location."><span class="acronym">optional</span></acronym>]</span></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>num_named_parameters</p></td>
 <td class="parameter_description"><p>Number of named parameters. (May be zero.). </p></td>
-<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL may be passed instead of a pointer to a location."><span class="acronym">optional</span></acronym>]</span></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>first_param_id</p></td>
 <td class="parameter_description"><p>The first ‘name’ table name ID used to specify
 strings for user-interface labels for the feature
 parameters. (Must be zero if numParameters is zero.). </p></td>
-<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL may be passed instead of a pointer to a location."><span class="acronym">optional</span></acronym>]</span></td>
 </tr>
 </tbody>
 </table></div>
 </div>
 <div class="refsect3">
 <a name="hb-ot-layout-feature-get-name-ids.returns"></a><h4>Returns</h4>
-<p> true if data found, false otherwise</p>
+<p> <code class="literal">true</code> if data found, <code class="literal">false</code> otherwise</p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-2-0-0.html#api-index-2.0.0">2.0.0</a></p>
 </div>
@@ -986,7 +925,7 @@ variations index. The list returned will begin at the offset provided.</p>
 </tr>
 <tr>
 <td class="parameter_name"><p>table_tag</p></td>
-<td class="parameter_description"><p>HB_OT_TAG_GSUB or HB_OT_TAG_GPOS</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-TAG-GSUB:CAPS" title="HB_OT_TAG_GSUB"><span class="type">HB_OT_TAG_GSUB</span></a> or <a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-TAG-GPOS:CAPS" title="HB_OT_TAG_GPOS"><span class="type">HB_OT_TAG_GPOS</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
@@ -1008,7 +947,7 @@ variations index. The list returned will begin at the offset provided.</p>
 <td class="parameter_name"><p>lookup_count</p></td>
 <td class="parameter_description"><p>Input = the maximum number of lookups to return;
 Output = the actual number of lookups returned (may be zero). </p></td>
-<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<acronym title="NULL may be passed instead of a pointer to a location."><span class="acronym">optional</span></acronym>]</span></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>lookup_indexes</p></td>
@@ -1018,6 +957,10 @@ Output = the actual number of lookups returned (may be zero). </p></td>
 </tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-ot-layout-feature-with-variations-get-lookups.returns"></a><h4>Returns</h4>
+<p> Total number of lookups.</p>
+</div>
 </div>
 <hr>
 <div class="refsect2">
@@ -1059,7 +1002,7 @@ table of the face. The list returned will begin at the offset provided.</p>
 <td class="parameter_name"><p>point_count</p></td>
 <td class="parameter_description"><p>Input = the maximum number of attachment points to return;
 Output = the actual number of attachment points returned (may be zero). </p></td>
-<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<acronym title="NULL may be passed instead of a pointer to a location."><span class="acronym">optional</span></acronym>]</span></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>point_array</p></td>
@@ -1069,6 +1012,11 @@ Output = the actual number of attachment points returned (may be zero). </p></td
 </tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-ot-layout-get-attach-points.returns"></a><h4>Returns</h4>
+<p> Total number of attachment points for <em class="parameter"><code>glyph</code></em>
+.</p>
+</div>
 </div>
 <hr>
 <div class="refsect2">
@@ -1112,7 +1060,7 @@ hb_ot_layout_get_baseline (<em class="parameter"><code><a class="link" href="har
 </tr>
 <tr>
 <td class="parameter_name"><p>language_tag</p></td>
-<td class="parameter_description"><p>language tag.</p></td>
+<td class="parameter_description"><p>language tag, currently unused.</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
@@ -1125,7 +1073,7 @@ hb_ot_layout_get_baseline (<em class="parameter"><code><a class="link" href="har
 </div>
 <div class="refsect3">
 <a name="hb-ot-layout-get-baseline.returns"></a><h4>Returns</h4>
-<p> if found baseline value in the font.</p>
+<p> <code class="literal">true</code> if found baseline value in the font.</p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-2-6-0.html#api-index-2.6.0">2.6.0</a></p>
 </div>
@@ -1249,7 +1197,7 @@ table of the font. The list returned will begin at the offset provided.</p>
 <td class="parameter_name"><p>caret_count</p></td>
 <td class="parameter_description"><p>Input = the maximum number of caret positions to return;
 Output = the actual number of caret positions returned (may be zero). </p></td>
-<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<acronym title="NULL may be passed instead of a pointer to a location."><span class="acronym">optional</span></acronym>]</span></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>caret_array</p></td>
@@ -1259,6 +1207,11 @@ Output = the actual number of caret positions returned (may be zero). </p></td>
 </tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-ot-layout-get-ligature-carets.returns"></a><h4>Returns</h4>
+<p> Total number of ligature caret positions for <em class="parameter"><code>glyph</code></em>
+.</p>
+</div>
 </div>
 <hr>
 <div class="refsect2">
@@ -1320,22 +1273,12 @@ a subfamily are not covered by the <code class="literal">size</code> feature.</p
 </div>
 <div class="refsect3">
 <a name="hb-ot-layout-get-size-params.returns"></a><h4>Returns</h4>
-<p> true if data found, false otherwise</p>
+<p> <code class="literal">true</code> if data found, <code class="literal">false</code> otherwise</p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-10.html#api-index-0.9.10">0.9.10</a></p>
 </div>
 <hr>
 <div class="refsect2">
-<a name="hb-ot-layout-glyph-sequence-func-t"></a><h3>hb_ot_layout_glyph_sequence_func_t ()</h3>
-<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
-<span class="c_punctuation">(</span>*hb_ot_layout_glyph_sequence_func_t<span class="c_punctuation">)</span> (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> *font</code></em>,
-                                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> table_tag</code></em>,
-                                       <em class="parameter"><code>unsigned <span class="type">int</span> lookup_index</code></em>,
-                                       <em class="parameter"><code>const <span class="type">hb_ot_layout_glyph_sequence_t</span> *sequence</code></em>,
-                                       <em class="parameter"><code><span class="type">void</span> *user_data</code></em>);</pre>
-</div>
-<hr>
-<div class="refsect2">
 <a name="hb-ot-layout-has-glyph-classes"></a><h3>hb_ot_layout_has_glyph_classes ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 hb_ot_layout_has_glyph_classes (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
@@ -1357,7 +1300,7 @@ hb_ot_layout_has_glyph_classes (<em class="parameter"><code><a class="link" href
 </div>
 <div class="refsect3">
 <a name="hb-ot-layout-has-glyph-classes.returns"></a><h4>Returns</h4>
-<p> true if data found, false otherwise</p>
+<p> <code class="literal">true</code> if data found, <code class="literal">false</code> otherwise</p>
 </div>
 </div>
 <hr>
@@ -1365,6 +1308,7 @@ hb_ot_layout_has_glyph_classes (<em class="parameter"><code><a class="link" href
 <a name="hb-ot-layout-has-positioning"></a><h3>hb_ot_layout_has_positioning ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 hb_ot_layout_has_positioning (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+<p>Tests whether the specified face includes any GPOS positioning.</p>
 <div class="refsect3">
 <a name="hb-ot-layout-has-positioning.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -1382,7 +1326,7 @@ hb_ot_layout_has_positioning (<em class="parameter"><code><a class="link" href="
 </div>
 <div class="refsect3">
 <a name="hb-ot-layout-has-positioning.returns"></a><h4>Returns</h4>
-<p> true if the face has GPOS data, false otherwise</p>
+<p> <code class="literal">true</code> if the face has GPOS data, <code class="literal">false</code> otherwise</p>
 </div>
 </div>
 <hr>
@@ -1408,7 +1352,7 @@ hb_ot_layout_has_substitution (<em class="parameter"><code><a class="link" href=
 </div>
 <div class="refsect3">
 <a name="hb-ot-layout-has-substitution.returns"></a><h4>Returns</h4>
-<p> true if data found, false otherwise</p>
+<p> <code class="literal">true</code> if data found, <code class="literal">false</code> otherwise</p>
 </div>
 </div>
 <hr>
@@ -1439,7 +1383,7 @@ or GPOS table, underneath the specified script and language.</p>
 </tr>
 <tr>
 <td class="parameter_name"><p>table_tag</p></td>
-<td class="parameter_description"><p>HB_OT_TAG_GSUB or HB_OT_TAG_GPOS</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-TAG-GSUB:CAPS" title="HB_OT_TAG_GSUB"><span class="type">HB_OT_TAG_GSUB</span></a> or <a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-TAG-GPOS:CAPS" title="HB_OT_TAG_GPOS"><span class="type">HB_OT_TAG_GPOS</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
@@ -1467,7 +1411,7 @@ or GPOS table, underneath the specified script and language.</p>
 </div>
 <div class="refsect3">
 <a name="hb-ot-layout-language-find-feature.returns"></a><h4>Returns</h4>
-<p> true if the feature is found, false otherwise</p>
+<p> <code class="literal">true</code> if the feature is found, <code class="literal">false</code> otherwise</p>
 </div>
 </div>
 <hr>
@@ -1501,7 +1445,7 @@ returned will begin at the offset provided.</p>
 </tr>
 <tr>
 <td class="parameter_name"><p>table_tag</p></td>
-<td class="parameter_description"><p>HB_OT_TAG_GSUB or HB_OT_TAG_GPOS</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-TAG-GSUB:CAPS" title="HB_OT_TAG_GSUB"><span class="type">HB_OT_TAG_GSUB</span></a> or <a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-TAG-GPOS:CAPS" title="HB_OT_TAG_GPOS"><span class="type">HB_OT_TAG_GPOS</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
@@ -1523,7 +1467,7 @@ returned will begin at the offset provided.</p>
 <td class="parameter_name"><p>feature_count</p></td>
 <td class="parameter_description"><p>Input = the maximum number of feature tags to return;
 Output: the actual number of feature tags returned (may be zero). </p></td>
-<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<acronym title="NULL may be passed instead of a pointer to a location."><span class="acronym">optional</span></acronym>]</span></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>feature_indexes</p></td>
@@ -1533,6 +1477,10 @@ Output: the actual number of feature tags returned (may be zero). </p></td>
 </tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-ot-layout-language-get-feature-indexes.returns"></a><h4>Returns</h4>
+<p> Total number of features.</p>
+</div>
 </div>
 <hr>
 <div class="refsect2">
@@ -1565,7 +1513,7 @@ returned will begin at the offset provided.</p>
 </tr>
 <tr>
 <td class="parameter_name"><p>table_tag</p></td>
-<td class="parameter_description"><p>HB_OT_TAG_GSUB or HB_OT_TAG_GPOS</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-TAG-GSUB:CAPS" title="HB_OT_TAG_GSUB"><span class="type">HB_OT_TAG_GSUB</span></a> or <a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-TAG-GPOS:CAPS" title="HB_OT_TAG_GPOS"><span class="type">HB_OT_TAG_GPOS</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
@@ -1587,7 +1535,7 @@ returned will begin at the offset provided.</p>
 <td class="parameter_name"><p>feature_count</p></td>
 <td class="parameter_description"><p>Input = the maximum number of feature tags to return;
 Output = the actual number of feature tags returned (may be zero). </p></td>
-<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<acronym title="NULL may be passed instead of a pointer to a location."><span class="acronym">optional</span></acronym>]</span></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>feature_tags</p></td>
@@ -1597,6 +1545,10 @@ Output = the actual number of feature tags returned (may be zero). </p></td>
 </tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-ot-layout-language-get-feature-tags.returns"></a><h4>Returns</h4>
+<p> Total number of feature tags.</p>
+</div>
 </div>
 <hr>
 <div class="refsect2">
@@ -1627,7 +1579,7 @@ underneath the specified script and language.</p>
 </tr>
 <tr>
 <td class="parameter_name"><p>table_tag</p></td>
-<td class="parameter_description"><p>HB_OT_TAG_GSUB or HB_OT_TAG_GPOS</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-TAG-GSUB:CAPS" title="HB_OT_TAG_GSUB"><span class="type">HB_OT_TAG_GSUB</span></a> or <a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-TAG-GPOS:CAPS" title="HB_OT_TAG_GPOS"><span class="type">HB_OT_TAG_GPOS</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
@@ -1655,7 +1607,7 @@ underneath the specified script and language.</p>
 </div>
 <div class="refsect3">
 <a name="hb-ot-layout-language-get-required-feature.returns"></a><h4>Returns</h4>
-<p> true if the feature is found, false otherwise</p>
+<p> <code class="literal">true</code> if the feature is found, <code class="literal">false</code> otherwise</p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-30.html#api-index-0.9.30">0.9.30</a></p>
 </div>
@@ -1688,7 +1640,7 @@ specified face's GSUB table or GPOS table.</p>
 </tr>
 <tr>
 <td class="parameter_name"><p>table_tag</p></td>
-<td class="parameter_description"><p>HB_OT_TAG_GSUB or HB_OT_TAG_GPOS</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-TAG-GSUB:CAPS" title="HB_OT_TAG_GSUB"><span class="type">HB_OT_TAG_GSUB</span></a> or <a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-TAG-GPOS:CAPS" title="HB_OT_TAG_GPOS"><span class="type">HB_OT_TAG_GPOS</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
@@ -1713,7 +1665,7 @@ specified face's GSUB table or GPOS table.</p>
 </tr>
 <tr>
 <td class="parameter_name"><p>glyphs_output</p></td>
-<td class="parameter_description"><p>Array of glyphs that would be the substitued output of the lookup. </p></td>
+<td class="parameter_description"><p>Array of glyphs that would be the substituted output of the lookup. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
 </tr>
 </tbody>
@@ -1723,6 +1675,68 @@ specified face's GSUB table or GPOS table.</p>
 </div>
 <hr>
 <div class="refsect2">
+<a name="hb-ot-layout-lookup-get-glyph-alternates"></a><h3>hb_ot_layout_lookup_get_glyph_alternates ()</h3>
+<pre class="programlisting"><span class="returnvalue">unsigned</span>
+hb_ot_layout_lookup_get_glyph_alternates
+                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                                <em class="parameter"><code><span class="type">unsigned </span> lookup_index</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> glyph</code></em>,
+                                <em class="parameter"><code><span class="type">unsigned </span> start_offset</code></em>,
+                                <em class="parameter"><code><span class="type">unsigned</span> *alternate_count</code></em>,
+                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *alternate_glyphs</code></em>);</pre>
+<p>Fetches alternates of a glyph from a given GSUB lookup index.</p>
+<div class="refsect3">
+<a name="hb-ot-layout-lookup-get-glyph-alternates.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>a face.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>lookup_index</p></td>
+<td class="parameter_description"><p>index of the feature lookup to query.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>glyph</p></td>
+<td class="parameter_description"><p>a glyph id.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>start_offset</p></td>
+<td class="parameter_description"><p>starting offset.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>alternate_count</p></td>
+<td class="parameter_description"><p>Input = the maximum number of alternate glyphs to return;
+Output = the actual number of alternate glyphs returned (may be zero). </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<acronym title="NULL may be passed instead of a pointer to a location."><span class="acronym">optional</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>alternate_glyphs</p></td>
+<td class="parameter_description"><p>A glyphs buffer.
+Alternate glyphs associated with the glyph id. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Out parameter, where caller must allocate storage."><span class="acronym">out caller-allocates</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=alternate_count]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-ot-layout-lookup-get-glyph-alternates.returns"></a><h4>Returns</h4>
+<p> Total number of alternates found in the specific lookup index for the given glyph id.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-6-8.html#api-index-2.6.8">2.6.8</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="hb-ot-layout-lookup-substitute-closure"></a><h3>hb_ot_layout_lookup_substitute_closure ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_ot_layout_lookup_substitute_closure
@@ -1841,7 +1855,8 @@ trigger a substitution on the given glyph sequence.</p>
 </tr>
 <tr>
 <td class="parameter_name"><p>zero_context</p></td>
-<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="type">hb_bool_t</span></a> indicating whether substitutions should be context-free</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="type">hb_bool_t</span></a> indicating whether pre-/post-context are disallowed
+in substitutions</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 </tbody>
@@ -1849,7 +1864,7 @@ trigger a substitution on the given glyph sequence.</p>
 </div>
 <div class="refsect3">
 <a name="hb-ot-layout-lookup-would-substitute.returns"></a><h4>Returns</h4>
-<p> true if a substitution would be triggered, false otherwise</p>
+<p> <code class="literal">true</code> if a substitution would be triggered, <code class="literal">false</code> otherwise</p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
 </div>
@@ -1881,7 +1896,7 @@ the specified script index. The list returned will begin at the offset provided.
 </tr>
 <tr>
 <td class="parameter_name"><p>table_tag</p></td>
-<td class="parameter_description"><p>HB_OT_TAG_GSUB or HB_OT_TAG_GPOS</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-TAG-GSUB:CAPS" title="HB_OT_TAG_GSUB"><span class="type">HB_OT_TAG_GSUB</span></a> or <a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-TAG-GPOS:CAPS" title="HB_OT_TAG_GPOS"><span class="type">HB_OT_TAG_GPOS</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
@@ -1898,7 +1913,7 @@ the specified script index. The list returned will begin at the offset provided.
 <td class="parameter_name"><p>language_count</p></td>
 <td class="parameter_description"><p>Input = the maximum number of language tags to return;
 Output = the actual number of language tags returned (may be zero). </p></td>
-<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<acronym title="NULL may be passed instead of a pointer to a location."><span class="acronym">optional</span></acronym>]</span></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>language_tags</p></td>
@@ -1908,6 +1923,10 @@ Output = the actual number of language tags returned (may be zero). </p></td>
 </tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-ot-layout-script-get-language-tags.returns"></a><h4>Returns</h4>
+<p> Total number of language tags.</p>
+</div>
 </div>
 <hr>
 <div class="refsect2">
@@ -1919,8 +1938,13 @@ hb_ot_layout_script_select_language (<em class="parameter"><code><a class="link"
                                      <em class="parameter"><code>unsigned <span class="type">int</span> language_count</code></em>,
                                      <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> *language_tags</code></em>,
                                      <em class="parameter"><code>unsigned <span class="type">int</span> *language_index</code></em>);</pre>
-<p>Fetches the index of a given language tag in the specified face's GSUB table
-or GPOS table, underneath the specified script index.</p>
+<p>Fetches the index of the first language tag fom <em class="parameter"><code>language_tags</code></em>
+ that is present
+in the specified face's GSUB or GPOS table, underneath the specified script
+index.</p>
+<p>If none of the given language tags is found, <code class="literal">false</code> is returned and
+<em class="parameter"><code>language_index</code></em>
+ is set to the default language index.</p>
 <div class="refsect3">
 <a name="hb-ot-layout-script-select-language.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -1937,7 +1961,7 @@ or GPOS table, underneath the specified script index.</p>
 </tr>
 <tr>
 <td class="parameter_name"><p>table_tag</p></td>
-<td class="parameter_description"><p>HB_OT_TAG_GSUB or HB_OT_TAG_GPOS</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-TAG-GSUB:CAPS" title="HB_OT_TAG_GSUB"><span class="type">HB_OT_TAG_GSUB</span></a> or <a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-TAG-GPOS:CAPS" title="HB_OT_TAG_GPOS"><span class="type">HB_OT_TAG_GPOS</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
@@ -1965,7 +1989,7 @@ or GPOS table, underneath the specified script index.</p>
 </div>
 <div class="refsect3">
 <a name="hb-ot-layout-script-select-language.returns"></a><h4>Returns</h4>
-<p> true if the language tag is found, false otherwise</p>
+<p> <code class="literal">true</code> if one of the given language tags is found, <code class="literal">false</code> otherwise</p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-2-0-0.html#api-index-2.0.0">2.0.0</a></p>
 </div>
@@ -1997,7 +2021,7 @@ or GPOS table, at the specified variation coordinates.</p>
 </tr>
 <tr>
 <td class="parameter_name"><p>table_tag</p></td>
-<td class="parameter_description"><p>HB_OT_TAG_GSUB or HB_OT_TAG_GPOS</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-TAG-GSUB:CAPS" title="HB_OT_TAG_GSUB"><span class="type">HB_OT_TAG_GSUB</span></a> or <a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-TAG-GPOS:CAPS" title="HB_OT_TAG_GPOS"><span class="type">HB_OT_TAG_GPOS</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
@@ -2007,7 +2031,7 @@ or GPOS table, at the specified variation coordinates.</p>
 </tr>
 <tr>
 <td class="parameter_name"><p>num_coords</p></td>
-<td class="parameter_description"><p>The number of variation coorinates</p></td>
+<td class="parameter_description"><p>The number of variation coordinates</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
@@ -2018,6 +2042,10 @@ or GPOS table, at the specified variation coordinates.</p>
 </tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-ot-layout-table-find-feature-variations.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> if feature variations were found, <code class="literal">false</code> otherwise.</p>
+</div>
 </div>
 <hr>
 <div class="refsect2">
@@ -2045,7 +2073,7 @@ hb_ot_layout_table_get_feature_tags (<em class="parameter"><code><a class="link"
 </tr>
 <tr>
 <td class="parameter_name"><p>table_tag</p></td>
-<td class="parameter_description"><p>HB_OT_TAG_GSUB or HB_OT_TAG_GPOS</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-TAG-GSUB:CAPS" title="HB_OT_TAG_GSUB"><span class="type">HB_OT_TAG_GSUB</span></a> or <a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-TAG-GPOS:CAPS" title="HB_OT_TAG_GPOS"><span class="type">HB_OT_TAG_GPOS</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
@@ -2057,7 +2085,7 @@ hb_ot_layout_table_get_feature_tags (<em class="parameter"><code><a class="link"
 <td class="parameter_name"><p>feature_count</p></td>
 <td class="parameter_description"><p>Input = the maximum number of feature tags to return;
 Output = the actual number of feature tags returned (may be zero). </p></td>
-<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<acronym title="NULL may be passed instead of a pointer to a location."><span class="acronym">optional</span></acronym>]</span></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>feature_tags</p></td>
@@ -2067,6 +2095,10 @@ Output = the actual number of feature tags returned (may be zero). </p></td>
 </tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-ot-layout-table-get-feature-tags.returns"></a><h4>Returns</h4>
+<p> Total number of feature tags.</p>
+</div>
 </div>
 <hr>
 <div class="refsect2">
@@ -2095,7 +2127,7 @@ or GPOS table. The list returned will begin at the offset provided.</p>
 </tr>
 <tr>
 <td class="parameter_name"><p>table_tag</p></td>
-<td class="parameter_description"><p>HB_OT_TAG_GSUB or HB_OT_TAG_GPOS</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-TAG-GSUB:CAPS" title="HB_OT_TAG_GSUB"><span class="type">HB_OT_TAG_GSUB</span></a> or <a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-TAG-GPOS:CAPS" title="HB_OT_TAG_GPOS"><span class="type">HB_OT_TAG_GPOS</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
@@ -2107,7 +2139,7 @@ or GPOS table. The list returned will begin at the offset provided.</p>
 <td class="parameter_name"><p>script_count</p></td>
 <td class="parameter_description"><p>Input = the maximum number of script tags to return;
 Output = the actual number of script tags returned (may be zero). </p></td>
-<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<acronym title="NULL may be passed instead of a pointer to a location."><span class="acronym">optional</span></acronym>]</span></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>script_tags</p></td>
@@ -2117,6 +2149,10 @@ Output = the actual number of script tags returned (may be zero). </p></td>
 </tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-ot-layout-table-get-script-tags.returns"></a><h4>Returns</h4>
+<p> Total number of script tags.</p>
+</div>
 </div>
 <hr>
 <div class="refsect2">
@@ -2142,12 +2178,16 @@ face's GSUB table or GPOS table.</p>
 </tr>
 <tr>
 <td class="parameter_name"><p>table_tag</p></td>
-<td class="parameter_description"><p>HB_OT_TAG_GSUB or HB_OT_TAG_GPOS</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-TAG-GSUB:CAPS" title="HB_OT_TAG_GSUB"><span class="type">HB_OT_TAG_GSUB</span></a> or <a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-TAG-GPOS:CAPS" title="HB_OT_TAG_GPOS"><span class="type">HB_OT_TAG_GPOS</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 </tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-ot-layout-table-get-lookup-count.returns"></a><h4>Returns</h4>
+<p> Total number of lookups.</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-22.html#api-index-0.9.22">0.9.22</a></p>
 </div>
 <hr>
@@ -2160,6 +2200,15 @@ hb_ot_layout_table_select_script (<em class="parameter"><code><a class="link" hr
                                   <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> *script_tags</code></em>,
                                   <em class="parameter"><code>unsigned <span class="type">int</span> *script_index</code></em>,
                                   <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> *chosen_script</code></em>);</pre>
+<p>Selects an OpenType script for <em class="parameter"><code>table_tag</code></em>
+ from the <em class="parameter"><code>script_tags</code></em>
+ array.</p>
+<p>If the table does not have any of the requested scripts, then <code class="literal">DFLT</code>,
+<code class="literal">dflt</code>, and <code class="literal">latn</code> tags are tried in that order. If the table still does not
+have any of these scripts, <em class="parameter"><code>script_index</code></em>
+ and <em class="parameter"><code>chosen_script</code></em>
+ are set to
+<a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-LAYOUT-NO-SCRIPT-INDEX:CAPS" title="HB_OT_LAYOUT_NO_SCRIPT_INDEX"><span class="type">HB_OT_LAYOUT_NO_SCRIPT_INDEX</span></a>.</p>
 <div class="refsect3">
 <a name="hb-ot-layout-table-select-script.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -2176,7 +2225,7 @@ hb_ot_layout_table_select_script (<em class="parameter"><code><a class="link" hr
 </tr>
 <tr>
 <td class="parameter_name"><p>table_tag</p></td>
-<td class="parameter_description"><p>HB_OT_TAG_GSUB or HB_OT_TAG_GPOS</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-TAG-GSUB:CAPS" title="HB_OT_TAG_GSUB"><span class="type">HB_OT_TAG_GSUB</span></a> or <a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-TAG-GPOS:CAPS" title="HB_OT_TAG_GPOS"><span class="type">HB_OT_TAG_GPOS</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
@@ -2192,16 +2241,21 @@ hb_ot_layout_table_select_script (<em class="parameter"><code><a class="link" hr
 <tr>
 <td class="parameter_name"><p>script_index</p></td>
 <td class="parameter_description"><p>The index of the requested script. </p></td>
-<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL may be passed instead of a pointer to a location."><span class="acronym">optional</span></acronym>]</span></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>chosen_script</p></td>
 <td class="parameter_description"><p><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> of the requested script. </p></td>
-<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL may be passed instead of a pointer to a location."><span class="acronym">optional</span></acronym>]</span></td>
 </tr>
 </tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-ot-layout-table-select-script.returns"></a><h4>Returns</h4>
+<p><code class="literal">true</code> if one of the requested scripts is selected, <code class="literal">false</code> if a fallback
+script is selected or if no scripts are selected.</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-2-0-0.html#api-index-2.0.0">2.0.0</a></p>
 </div>
 <hr>
@@ -2211,6 +2265,36 @@ hb_ot_layout_table_select_script (<em class="parameter"><code><a class="link" hr
 hb_ot_shape_plan_collect_lookups (<em class="parameter"><code><a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t" title="hb_shape_plan_t"><span class="type">hb_shape_plan_t</span></a> *shape_plan</code></em>,
                                   <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> table_tag</code></em>,
                                   <em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a> *lookup_indexes</code></em>);</pre>
+<p>Computes the complete set of GSUB or GPOS lookups that are applicable
+under a given <em class="parameter"><code>shape_plan</code></em>
+.</p>
+<div class="refsect3">
+<a name="hb-ot-shape-plan-collect-lookups.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>shape_plan</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t" title="hb_shape_plan_t"><span class="type">hb_shape_plan_t</span></a> to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>table_tag</p></td>
+<td class="parameter_description"><p>GSUB or GPOS</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>lookup_indexes</p></td>
+<td class="parameter_description"><p>The <a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a> set of lookups returned. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
 </div>
 <hr>
@@ -2241,7 +2325,7 @@ underneath the specified script and language.</p>
 </tr>
 <tr>
 <td class="parameter_name"><p>table_tag</p></td>
-<td class="parameter_description"><p>HB_OT_TAG_GSUB or HB_OT_TAG_GPOS</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-TAG-GSUB:CAPS" title="HB_OT_TAG_GSUB"><span class="type">HB_OT_TAG_GSUB</span></a> or <a class="link" href="harfbuzz-hb-ot-layout.html#HB-OT-TAG-GPOS:CAPS" title="HB_OT_TAG_GPOS"><span class="type">HB_OT_TAG_GPOS</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
@@ -2264,7 +2348,7 @@ underneath the specified script and language.</p>
 </div>
 <div class="refsect3">
 <a name="hb-ot-layout-language-get-required-feature-index.returns"></a><h4>Returns</h4>
-<p> true if the feature is found, false otherwise</p>
+<p> <code class="literal">true</code> if the feature is found, <code class="literal">false</code> otherwise</p>
 </div>
 </div>
 </div>
@@ -2274,6 +2358,7 @@ underneath the specified script and language.</p>
 <a name="HB-OT-MAX-TAGS-PER-LANGUAGE:CAPS"></a><h3>HB_OT_MAX_TAGS_PER_LANGUAGE</h3>
 <pre class="programlisting">#define HB_OT_MAX_TAGS_PER_LANGUAGE 3u
 </pre>
+<p>Maximum number of OpenType tags that can correspond to a give <a class="link" href="harfbuzz-hb-common.html#hb-language-t" title="hb_language_t"><span class="type">hb_language_t</span></a>.</p>
 <p class="since">Since: <a class="link" href="api-index-2-0-0.html#api-index-2.0.0">2.0.0</a></p>
 </div>
 <hr>
@@ -2281,6 +2366,7 @@ underneath the specified script and language.</p>
 <a name="HB-OT-MAX-TAGS-PER-SCRIPT:CAPS"></a><h3>HB_OT_MAX_TAGS_PER_SCRIPT</h3>
 <pre class="programlisting">#define HB_OT_MAX_TAGS_PER_SCRIPT 3u
 </pre>
+<p>Maximum number of OpenType tags that can correspond to a give <a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="type">hb_script_t</span></a>.</p>
 <p class="since">Since: <a class="link" href="api-index-2-0-0.html#api-index-2.0.0">2.0.0</a></p>
 </div>
 <hr>
@@ -2288,71 +2374,83 @@ underneath the specified script and language.</p>
 <a name="HB-OT-TAG-DEFAULT-LANGUAGE:CAPS"></a><h3>HB_OT_TAG_DEFAULT_LANGUAGE</h3>
 <pre class="programlisting">#define HB_OT_TAG_DEFAULT_LANGUAGE HB_TAG ('d', 'f', 'l', 't')
 </pre>
+<p>OpenType language tag, <code class="literal">dflt</code>. Not a valid language tag, but some fonts
+mistakenly use it.</p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="HB-OT-TAG-DEFAULT-SCRIPT:CAPS"></a><h3>HB_OT_TAG_DEFAULT_SCRIPT</h3>
 <pre class="programlisting">#define HB_OT_TAG_DEFAULT_SCRIPT HB_TAG ('D', 'F', 'L', 'T')
 </pre>
+<p>OpenType script tag, <code class="literal">DFLT</code>, for features that are not script-specific.</p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="HB-OT-LAYOUT-DEFAULT-LANGUAGE-INDEX:CAPS"></a><h3>HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX</h3>
 <pre class="programlisting">#define HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX 0xFFFFu
 </pre>
+<p>Special value for language index indicating default or unsupported language.</p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="HB-OT-LAYOUT-NO-FEATURE-INDEX:CAPS"></a><h3>HB_OT_LAYOUT_NO_FEATURE_INDEX</h3>
 <pre class="programlisting">#define HB_OT_LAYOUT_NO_FEATURE_INDEX              0xFFFFu
 </pre>
+<p>Special value for feature index indicating unsupported feature.</p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="HB-OT-LAYOUT-NO-SCRIPT-INDEX:CAPS"></a><h3>HB_OT_LAYOUT_NO_SCRIPT_INDEX</h3>
 <pre class="programlisting">#define HB_OT_LAYOUT_NO_SCRIPT_INDEX               0xFFFFu
 </pre>
+<p>Special value for script index indicating unsupported script.</p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="HB-OT-LAYOUT-NO-VARIATIONS-INDEX:CAPS"></a><h3>HB_OT_LAYOUT_NO_VARIATIONS_INDEX</h3>
 <pre class="programlisting">#define HB_OT_LAYOUT_NO_VARIATIONS_INDEX 0xFFFFFFFFu
 </pre>
+<p>Special value for variations index indicating unsupported variation.</p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="HB-OT-TAG-BASE:CAPS"></a><h3>HB_OT_TAG_BASE</h3>
 <pre class="programlisting">#define HB_OT_TAG_BASE HB_TAG('B','A','S','E')
 </pre>
+<p>OpenType <a class="ulink" href="https://docs.microsoft.com/en-us/typography/opentype/spec/base" target="_top">Baseline Table</a>.</p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="HB-OT-TAG-GDEF:CAPS"></a><h3>HB_OT_TAG_GDEF</h3>
 <pre class="programlisting">#define HB_OT_TAG_GDEF HB_TAG('G','D','E','F')
 </pre>
+<p>OpenType <a class="ulink" href="https://docs.microsoft.com/en-us/typography/opentype/spec/gdef" target="_top">Glyph Definition Table</a>.</p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="HB-OT-TAG-GPOS:CAPS"></a><h3>HB_OT_TAG_GPOS</h3>
 <pre class="programlisting">#define HB_OT_TAG_GPOS HB_TAG('G','P','O','S')
 </pre>
+<p>OpenType <a class="ulink" href="https://docs.microsoft.com/en-us/typography/opentype/spec/gpos" target="_top">Glyph Positioning Table</a>.</p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="HB-OT-TAG-GSUB:CAPS"></a><h3>HB_OT_TAG_GSUB</h3>
 <pre class="programlisting">#define HB_OT_TAG_GSUB HB_TAG('G','S','U','B')
 </pre>
+<p>OpenType <a class="ulink" href="https://docs.microsoft.com/en-us/typography/opentype/spec/gsub" target="_top">Glyph Substitution Table</a>.</p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="HB-OT-TAG-JSTF:CAPS"></a><h3>HB_OT_TAG_JSTF</h3>
 <pre class="programlisting">#define HB_OT_TAG_JSTF HB_TAG('J','S','T','F')
 </pre>
+<p>OpenType <a class="ulink" href="https://docs.microsoft.com/en-us/typography/opentype/spec/jstf" target="_top">Justification Table</a>.</p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="hb-ot-layout-baseline-tag-t"></a><h3>enum hb_ot_layout_baseline_tag_t</h3>
-<p>Baseline tags from https://docs.microsoft.com/en-us/typography/opentype/spec/baselinetags</p>
+<p>Baseline tags from <a class="ulink" href="https://docs.microsoft.com/en-us/typography/opentype/spec/baselinetags" target="_top">Baseline Tags</a> registry.</p>
 <div class="refsect3">
 <a name="hb-ot-layout-baseline-tag-t.members"></a><h4>Members</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -2421,11 +2519,6 @@ In vertical writing mode when mathematical characters rotated 90 degrees clockwi
 </td>
 <td class="enum_member_annotations"> </td>
 </tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-OT-LAYOUT-BASELINE-TAG-MAX-VALUE:CAPS"></a>_HB_OT_LAYOUT_BASELINE_TAG_MAX_VALUE</p></td>
-<td> </td>
-<td> </td>
-</tr>
 </tbody>
 </table></div>
 </div>
@@ -2486,6 +2579,6 @@ In vertical writing mode when mathematical characters rotated 90 degrees clockwi
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index f6d4589..de3fabc 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-ot-math: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch13.html" title="OpenType API">
+<link rel="up" href="opentype-api.html" title="OpenType API">
 <link rel="prev" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">
-<link rel="next" href="harfbuzz-hb-ot-name.html" title="hb-ot-name">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<link rel="next" href="harfbuzz-hb-ot-meta.html" title="hb-ot-meta">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -18,9 +18,9 @@
                   <a href="#harfbuzz-hb-ot-math.description" class="shortcut">Description</a></span>
 </td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><a accesskey="u" href="ch13.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="u" href="opentype-api.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
 <td><a accesskey="p" href="harfbuzz-hb-ot-layout.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="harfbuzz-hb-ot-name.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+<td><a accesskey="n" href="harfbuzz-hb-ot-meta.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <div class="refentry">
 <a name="harfbuzz-hb-ot-math"></a><div class="titlepage"></div>
 </td>
 </tr>
 <tr>
+<td class="function_type">unsigned <span class="returnvalue">int</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-get-glyph-kernings" title="hb_ot_math_get_glyph_kernings ()">hb_ot_math_get_glyph_kernings</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
 <td class="function_type">
 <a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 </td>
 </tr>
 <tr>
 <td class="define_keyword">#define</td>
-<td class="function_name"><a class="link" href="harfbuzz-hb-ot-math.html#HB-OT-MATH-SCRIPT:CAPS" title="HB_OT_MATH_SCRIPT">HB_OT_MATH_SCRIPT</a></td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-ot-math.html#HB-OT-TAG-MATH-SCRIPT:CAPS" title="HB_OT_TAG_MATH_SCRIPT">HB_OT_TAG_MATH_SCRIPT</a></td>
 </tr>
 <tr>
 <td class="datatype_keyword">enum</td>
 </tr>
 <tr>
 <td class="datatype_keyword"> </td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-kern-entry-t" title="hb_ot_math_kern_entry_t">hb_ot_math_kern_entry_t</a></td>
+</tr>
+<tr>
+<td class="datatype_keyword"> </td>
 <td class="function_name"><a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-variant-t" title="hb_ot_math_glyph_variant_t">hb_ot_math_glyph_variant_t</a></td>
 </tr>
 <tr>
@@ -187,7 +198,7 @@ hb_ot_math_has_data (<em class="parameter"><code><a class="link" href="harfbuzz-
 </div>
 <div class="refsect3">
 <a name="hb-ot-math-has-data.returns"></a><h4>Returns</h4>
-<p> true if the table is found, false otherwise</p>
+<p> <code class="literal">true</code> if the table is found, <code class="literal">false</code> otherwise</p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-1-3-3.html#api-index-1.3.3">1.3.3</a></p>
 </div>
@@ -369,6 +380,78 @@ no such height value is found, the last kerning value is returned.</p>
 </div>
 <hr>
 <div class="refsect2">
+<a name="hb-ot-math-get-glyph-kernings"></a><h3>hb_ot_math_get_glyph_kernings ()</h3>
+<pre class="programlisting">unsigned <span class="returnvalue">int</span>
+hb_ot_math_get_glyph_kernings (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                               <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> glyph</code></em>,
+                               <em class="parameter"><code><a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-kern-t" title="enum hb_ot_math_kern_t"><span class="type">hb_ot_math_kern_t</span></a> kern</code></em>,
+                               <em class="parameter"><code>unsigned <span class="type">int</span> start_offset</code></em>,
+                               <em class="parameter"><code>unsigned <span class="type">int</span> *entries_count</code></em>,
+                               <em class="parameter"><code><a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-kern-entry-t" title="hb_ot_math_kern_entry_t"><span class="type">hb_ot_math_kern_entry_t</span></a> *kern_entries</code></em>);</pre>
+<p>Fetches the raw MathKern (cut-in) data for the specified font, glyph index,
+and <em class="parameter"><code>kern</code></em>
+. The corresponding list of kern values and correction heights is
+returned as a list of <a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-kern-entry-t" title="hb_ot_math_kern_entry_t"><span class="type">hb_ot_math_kern_entry_t</span></a> structs.</p>
+<p>See also <a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-get-glyph-kerning" title="hb_ot_math_get_glyph_kerning ()"><span class="type">hb_ot_math_get_glyph_kerning</span></a>, which handles selecting the
+appropriate kern value for a given correction height.</p>
+<div class="note">For a glyph with <em class="parameter"><code>n</code></em> defined kern values (where <em class="parameter"><code>n</code></em> &gt; 0), there are only
+<em class="parameter"><code>n</code></em>−1 defined correction heights, as each correction height defines a boundary
+past which the next kern value should be selected. Therefore, only the
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-kern-entry-t.kern-value"><span class="type">hb_ot_math_kern_entry_t.kern_value</span></a> of the uppermost <a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-kern-entry-t" title="hb_ot_math_kern_entry_t"><span class="type">hb_ot_math_kern_entry_t</span></a>
+actually comes from the font; its corresponding
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-kern-entry-t.max-correction-height"><span class="type">hb_ot_math_kern_entry_t.max_correction_height</span></a> is always set to
+<code class="code">INT32_MAX</code>.</div>
+<div class="refsect3">
+<a name="hb-ot-math-get-glyph-kernings.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>glyph</p></td>
+<td class="parameter_description"><p>The glyph index from which to retrieve the kernings</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>kern</p></td>
+<td class="parameter_description"><p>The <a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-kern-t" title="enum hb_ot_math_kern_t"><span class="type">hb_ot_math_kern_t</span></a> from which to retrieve the kernings</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>start_offset</p></td>
+<td class="parameter_description"><p>offset of the first kern entry to retrieve</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>entries_count</p></td>
+<td class="parameter_description"><p>Input = the maximum number of kern entries to return;
+Output = the actual number of kern entries returned. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<acronym title="NULL may be passed instead of a pointer to a location."><span class="acronym">optional</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>kern_entries</p></td>
+<td class="parameter_description"><p>array of kern entries returned. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Out parameter, where caller must allocate storage."><span class="acronym">out caller-allocates</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=entries_count]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-ot-math-get-glyph-kernings.returns"></a><h4>Returns</h4>
+<p> the total number of kern values available or zero</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-3-4-0.html#api-index-3.4.0">3.4.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="hb-ot-math-is-glyph-extended-shape"></a><h3>hb_ot_math_is_glyph_extended_shape ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 hb_ot_math_is_glyph_extended_shape (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> *face</code></em>,
@@ -398,7 +481,7 @@ hb_ot_math_is_glyph_extended_shape (<em class="parameter"><code><a class="link"
 </div>
 <div class="refsect3">
 <a name="hb-ot-math-is-glyph-extended-shape.returns"></a><h4>Returns</h4>
-<p> true if the glyph is an extended shape, false otherwise</p>
+<p> <code class="literal">true</code> if the glyph is an extended shape, <code class="literal">false</code> otherwise</p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-1-3-3.html#api-index-1.3.3">1.3.3</a></p>
 </div>
@@ -589,18 +672,28 @@ Output = actual number of parts returned. </p></td>
 <a name="HB-OT-TAG-MATH:CAPS"></a><h3>HB_OT_TAG_MATH</h3>
 <pre class="programlisting">#define HB_OT_TAG_MATH HB_TAG('M','A','T','H')
 </pre>
+<p>OpenType <a class="ulink" href="https://docs.microsoft.com/en-us/typography/opentype/spec/math" target="_top">Mathematical Typesetting Table</a>.</p>
+<p class="since">Since: <a class="link" href="api-index-1-3-3.html#api-index-1.3.3">1.3.3</a></p>
 </div>
 <hr>
 <div class="refsect2">
-<a name="HB-OT-MATH-SCRIPT:CAPS"></a><h3>HB_OT_MATH_SCRIPT</h3>
-<pre class="programlisting">#define HB_OT_MATH_SCRIPT HB_TAG('m','a','t','h')
+<a name="HB-OT-TAG-MATH-SCRIPT:CAPS"></a><h3>HB_OT_TAG_MATH_SCRIPT</h3>
+<pre class="programlisting">#define HB_OT_TAG_MATH_SCRIPT HB_TAG('m','a','t','h')
 </pre>
+<p>OpenType script tag, <code class="literal">math</code>, for features specific to math shaping.</p>
+<div class="note">
+<a class="link" href="harfbuzz-hb-ot-math.html#HB-OT-TAG-MATH-SCRIPT:CAPS" title="HB_OT_TAG_MATH_SCRIPT"><span class="type">HB_OT_TAG_MATH_SCRIPT</span></a> is not a valid <a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="type">hb_script_t</span></a> and should only be
+used with functions that accept raw OpenType script tags, such as
+<a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-collect-features" title="hb_ot_layout_collect_features ()"><span class="type">hb_ot_layout_collect_features</span></a>. In other cases, <a class="link" href="harfbuzz-hb-common.html#HB-SCRIPT-MATH:CAPS"><span class="type">HB_SCRIPT_MATH</span></a> should be
+used instead.</div>
+<p class="since">Since: <a class="link" href="api-index-3-4-0.html#api-index-3.4.0">3.4.0</a></p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="hb-ot-math-constant-t"></a><h3>enum hb_ot_math_constant_t</h3>
-<p>The 'MATH' table constants specified at
-https://docs.microsoft.com/en-us/typography/opentype/spec/math</p>
+<p>The 'MATH' table constants, refer to
+<a class="ulink" href="https://docs.microsoft.com/en-us/typography/opentype/spec/math#mathconstants-table" target="_top">OpenType documentation</a>
+For more explanations.</p>
 <div class="refsect3">
 <a name="hb-ot-math-constant-t.members"></a><h4>Members</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -612,283 +705,395 @@ https://docs.microsoft.com/en-us/typography/opentype/spec/math</p>
 <tbody>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-SCRIPT-PERCENT-SCALE-DOWN:CAPS"></a>HB_OT_MATH_CONSTANT_SCRIPT_PERCENT_SCALE_DOWN</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>scriptPercentScaleDown</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-SCRIPT-SCRIPT-PERCENT-SCALE-DOWN:CAPS"></a>HB_OT_MATH_CONSTANT_SCRIPT_SCRIPT_PERCENT_SCALE_DOWN</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>scriptScriptPercentScaleDown</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-DELIMITED-SUB-FORMULA-MIN-HEIGHT:CAPS"></a>HB_OT_MATH_CONSTANT_DELIMITED_SUB_FORMULA_MIN_HEIGHT</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>delimitedSubFormulaMinHeight</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-DISPLAY-OPERATOR-MIN-HEIGHT:CAPS"></a>HB_OT_MATH_CONSTANT_DISPLAY_OPERATOR_MIN_HEIGHT</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>displayOperatorMinHeight</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-MATH-LEADING:CAPS"></a>HB_OT_MATH_CONSTANT_MATH_LEADING</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>mathLeading</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-AXIS-HEIGHT:CAPS"></a>HB_OT_MATH_CONSTANT_AXIS_HEIGHT</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>axisHeight</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-ACCENT-BASE-HEIGHT:CAPS"></a>HB_OT_MATH_CONSTANT_ACCENT_BASE_HEIGHT</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>accentBaseHeight</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-FLATTENED-ACCENT-BASE-HEIGHT:CAPS"></a>HB_OT_MATH_CONSTANT_FLATTENED_ACCENT_BASE_HEIGHT</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>flattenedAccentBaseHeight</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-SUBSCRIPT-SHIFT-DOWN:CAPS"></a>HB_OT_MATH_CONSTANT_SUBSCRIPT_SHIFT_DOWN</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>subscriptShiftDown</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-SUBSCRIPT-TOP-MAX:CAPS"></a>HB_OT_MATH_CONSTANT_SUBSCRIPT_TOP_MAX</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>subscriptTopMax</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-SUBSCRIPT-BASELINE-DROP-MIN:CAPS"></a>HB_OT_MATH_CONSTANT_SUBSCRIPT_BASELINE_DROP_MIN</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>subscriptBaselineDropMin</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-SUPERSCRIPT-SHIFT-UP:CAPS"></a>HB_OT_MATH_CONSTANT_SUPERSCRIPT_SHIFT_UP</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>superscriptShiftUp</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-SUPERSCRIPT-SHIFT-UP-CRAMPED:CAPS"></a>HB_OT_MATH_CONSTANT_SUPERSCRIPT_SHIFT_UP_CRAMPED</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>superscriptShiftUpCramped</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-SUPERSCRIPT-BOTTOM-MIN:CAPS"></a>HB_OT_MATH_CONSTANT_SUPERSCRIPT_BOTTOM_MIN</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>superscriptBottomMin</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-SUPERSCRIPT-BASELINE-DROP-MAX:CAPS"></a>HB_OT_MATH_CONSTANT_SUPERSCRIPT_BASELINE_DROP_MAX</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>superscriptBaselineDropMax</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-SUB-SUPERSCRIPT-GAP-MIN:CAPS"></a>HB_OT_MATH_CONSTANT_SUB_SUPERSCRIPT_GAP_MIN</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>subSuperscriptGapMin</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-SUPERSCRIPT-BOTTOM-MAX-WITH-SUBSCRIPT:CAPS"></a>HB_OT_MATH_CONSTANT_SUPERSCRIPT_BOTTOM_MAX_WITH_SUBSCRIPT</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>superscriptBottomMaxWithSubscript</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-SPACE-AFTER-SCRIPT:CAPS"></a>HB_OT_MATH_CONSTANT_SPACE_AFTER_SCRIPT</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>spaceAfterScript</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-UPPER-LIMIT-GAP-MIN:CAPS"></a>HB_OT_MATH_CONSTANT_UPPER_LIMIT_GAP_MIN</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>upperLimitGapMin</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-UPPER-LIMIT-BASELINE-RISE-MIN:CAPS"></a>HB_OT_MATH_CONSTANT_UPPER_LIMIT_BASELINE_RISE_MIN</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>upperLimitBaselineRiseMin</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-LOWER-LIMIT-GAP-MIN:CAPS"></a>HB_OT_MATH_CONSTANT_LOWER_LIMIT_GAP_MIN</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>lowerLimitGapMin</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-LOWER-LIMIT-BASELINE-DROP-MIN:CAPS"></a>HB_OT_MATH_CONSTANT_LOWER_LIMIT_BASELINE_DROP_MIN</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>lowerLimitBaselineDropMin</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-STACK-TOP-SHIFT-UP:CAPS"></a>HB_OT_MATH_CONSTANT_STACK_TOP_SHIFT_UP</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>stackTopShiftUp</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-STACK-TOP-DISPLAY-STYLE-SHIFT-UP:CAPS"></a>HB_OT_MATH_CONSTANT_STACK_TOP_DISPLAY_STYLE_SHIFT_UP</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>stackTopDisplayStyleShiftUp</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-STACK-BOTTOM-SHIFT-DOWN:CAPS"></a>HB_OT_MATH_CONSTANT_STACK_BOTTOM_SHIFT_DOWN</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>stackBottomShiftDown</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-STACK-BOTTOM-DISPLAY-STYLE-SHIFT-DOWN:CAPS"></a>HB_OT_MATH_CONSTANT_STACK_BOTTOM_DISPLAY_STYLE_SHIFT_DOWN</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>stackBottomDisplayStyleShiftDown</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-STACK-GAP-MIN:CAPS"></a>HB_OT_MATH_CONSTANT_STACK_GAP_MIN</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>stackGapMin</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-STACK-DISPLAY-STYLE-GAP-MIN:CAPS"></a>HB_OT_MATH_CONSTANT_STACK_DISPLAY_STYLE_GAP_MIN</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>stackDisplayStyleGapMin</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-STRETCH-STACK-TOP-SHIFT-UP:CAPS"></a>HB_OT_MATH_CONSTANT_STRETCH_STACK_TOP_SHIFT_UP</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>stretchStackTopShiftUp</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-STRETCH-STACK-BOTTOM-SHIFT-DOWN:CAPS"></a>HB_OT_MATH_CONSTANT_STRETCH_STACK_BOTTOM_SHIFT_DOWN</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>stretchStackBottomShiftDown</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-STRETCH-STACK-GAP-ABOVE-MIN:CAPS"></a>HB_OT_MATH_CONSTANT_STRETCH_STACK_GAP_ABOVE_MIN</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>stretchStackGapAboveMin</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-STRETCH-STACK-GAP-BELOW-MIN:CAPS"></a>HB_OT_MATH_CONSTANT_STRETCH_STACK_GAP_BELOW_MIN</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>stretchStackGapBelowMin</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-FRACTION-NUMERATOR-SHIFT-UP:CAPS"></a>HB_OT_MATH_CONSTANT_FRACTION_NUMERATOR_SHIFT_UP</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>fractionNumeratorShiftUp</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-FRACTION-NUMERATOR-DISPLAY-STYLE-SHIFT-UP:CAPS"></a>HB_OT_MATH_CONSTANT_FRACTION_NUMERATOR_DISPLAY_STYLE_SHIFT_UP</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>fractionNumeratorDisplayStyleShiftUp</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-FRACTION-DENOMINATOR-SHIFT-DOWN:CAPS"></a>HB_OT_MATH_CONSTANT_FRACTION_DENOMINATOR_SHIFT_DOWN</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>fractionDenominatorShiftDown</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-FRACTION-DENOMINATOR-DISPLAY-STYLE-SHIFT-DOWN:CAPS"></a>HB_OT_MATH_CONSTANT_FRACTION_DENOMINATOR_DISPLAY_STYLE_SHIFT_DOWN</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>fractionDenominatorDisplayStyleShiftDown</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-FRACTION-NUMERATOR-GAP-MIN:CAPS"></a>HB_OT_MATH_CONSTANT_FRACTION_NUMERATOR_GAP_MIN</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>fractionNumeratorGapMin</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-FRACTION-NUM-DISPLAY-STYLE-GAP-MIN:CAPS"></a>HB_OT_MATH_CONSTANT_FRACTION_NUM_DISPLAY_STYLE_GAP_MIN</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>fractionNumDisplayStyleGapMin</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-FRACTION-RULE-THICKNESS:CAPS"></a>HB_OT_MATH_CONSTANT_FRACTION_RULE_THICKNESS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>fractionRuleThickness</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-FRACTION-DENOMINATOR-GAP-MIN:CAPS"></a>HB_OT_MATH_CONSTANT_FRACTION_DENOMINATOR_GAP_MIN</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>fractionDenominatorGapMin</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-FRACTION-DENOM-DISPLAY-STYLE-GAP-MIN:CAPS"></a>HB_OT_MATH_CONSTANT_FRACTION_DENOM_DISPLAY_STYLE_GAP_MIN</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>fractionDenomDisplayStyleGapMin</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-SKEWED-FRACTION-HORIZONTAL-GAP:CAPS"></a>HB_OT_MATH_CONSTANT_SKEWED_FRACTION_HORIZONTAL_GAP</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>skewedFractionHorizontalGap</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-SKEWED-FRACTION-VERTICAL-GAP:CAPS"></a>HB_OT_MATH_CONSTANT_SKEWED_FRACTION_VERTICAL_GAP</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>skewedFractionVerticalGap</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-OVERBAR-VERTICAL-GAP:CAPS"></a>HB_OT_MATH_CONSTANT_OVERBAR_VERTICAL_GAP</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>overbarVerticalGap</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-OVERBAR-RULE-THICKNESS:CAPS"></a>HB_OT_MATH_CONSTANT_OVERBAR_RULE_THICKNESS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>overbarRuleThickness</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-OVERBAR-EXTRA-ASCENDER:CAPS"></a>HB_OT_MATH_CONSTANT_OVERBAR_EXTRA_ASCENDER</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>overbarExtraAscender</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-UNDERBAR-VERTICAL-GAP:CAPS"></a>HB_OT_MATH_CONSTANT_UNDERBAR_VERTICAL_GAP</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>underbarVerticalGap</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-UNDERBAR-RULE-THICKNESS:CAPS"></a>HB_OT_MATH_CONSTANT_UNDERBAR_RULE_THICKNESS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>underbarRuleThickness</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-UNDERBAR-EXTRA-DESCENDER:CAPS"></a>HB_OT_MATH_CONSTANT_UNDERBAR_EXTRA_DESCENDER</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>underbarExtraDescender</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-RADICAL-VERTICAL-GAP:CAPS"></a>HB_OT_MATH_CONSTANT_RADICAL_VERTICAL_GAP</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>radicalVerticalGap</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-RADICAL-DISPLAY-STYLE-VERTICAL-GAP:CAPS"></a>HB_OT_MATH_CONSTANT_RADICAL_DISPLAY_STYLE_VERTICAL_GAP</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>radicalDisplayStyleVerticalGap</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-RADICAL-RULE-THICKNESS:CAPS"></a>HB_OT_MATH_CONSTANT_RADICAL_RULE_THICKNESS</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>radicalRuleThickness</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-RADICAL-EXTRA-ASCENDER:CAPS"></a>HB_OT_MATH_CONSTANT_RADICAL_EXTRA_ASCENDER</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>radicalExtraAscender</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-RADICAL-KERN-BEFORE-DEGREE:CAPS"></a>HB_OT_MATH_CONSTANT_RADICAL_KERN_BEFORE_DEGREE</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>radicalKernBeforeDegree</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-RADICAL-KERN-AFTER-DEGREE:CAPS"></a>HB_OT_MATH_CONSTANT_RADICAL_KERN_AFTER_DEGREE</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>radicalKernAfterDegree</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-CONSTANT-RADICAL-DEGREE-BOTTOM-RAISE-PERCENT:CAPS"></a>HB_OT_MATH_CONSTANT_RADICAL_DEGREE_BOTTOM_RAISE_PERCENT</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>radicalDegreeBottomRaisePercent</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 </tbody>
 </table></div>
@@ -911,23 +1116,31 @@ of a glyph.</p>
 <tbody>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-KERN-TOP-RIGHT:CAPS"></a>HB_OT_MATH_KERN_TOP_RIGHT</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>The top right corner of the glyph.</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-KERN-TOP-LEFT:CAPS"></a>HB_OT_MATH_KERN_TOP_LEFT</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>The top left corner of the glyph.</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-KERN-BOTTOM-RIGHT:CAPS"></a>HB_OT_MATH_KERN_BOTTOM_RIGHT</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>The bottom right corner of the glyph.</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-KERN-BOTTOM-LEFT:CAPS"></a>HB_OT_MATH_KERN_BOTTOM_LEFT</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>The bottom left corner of the glyph.</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 </tbody>
 </table></div>
@@ -936,6 +1149,39 @@ of a glyph.</p>
 </div>
 <hr>
 <div class="refsect2">
+<a name="hb-ot-math-kern-entry-t"></a><h3>hb_ot_math_kern_entry_t</h3>
+<pre class="programlisting">typedef struct {
+  hb_position_t max_correction_height;
+  hb_position_t kern_value;
+} hb_ot_math_kern_entry_t;
+</pre>
+<p>Data type to hold math kerning (cut-in) information for a glyph.</p>
+<div class="refsect3">
+<a name="hb-ot-math-kern-entry-t.members"></a><h4>Members</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="300px" class="struct_members_name">
+<col class="struct_members_description">
+<col width="200px" class="struct_members_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="struct_member_name"><p><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> <em class="structfield"><code><a name="hb-ot-math-kern-entry-t.max-correction-height"></a>max_correction_height</code></em>;</p></td>
+<td class="struct_member_description"><p>The maximum height at which this entry should be used</p></td>
+<td class="struct_member_annotations"> </td>
+</tr>
+<tr>
+<td class="struct_member_name"><p><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> <em class="structfield"><code><a name="hb-ot-math-kern-entry-t.kern-value"></a>kern_value</code></em>;</p></td>
+<td class="struct_member_description"><p>The kern value of the entry</p></td>
+<td class="struct_member_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-3-4-0.html#api-index-3.4.0">3.4.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="hb-ot-math-glyph-variant-t"></a><h3>hb_ot_math_glyph_variant_t</h3>
 <pre class="programlisting">typedef struct {
   hb_codepoint_t glyph;
@@ -981,8 +1227,11 @@ of a glyph.</p>
 </colgroup>
 <tbody><tr>
 <td class="enum_member_name"><p><a name="HB-OT-MATH-GLYPH-PART-FLAG-EXTENDER:CAPS"></a>HB_OT_MATH_GLYPH_PART_FLAG_EXTENDER</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>This is an extender glyph part that
+can be repeated to reach the desired length.</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr></tbody>
 </table></div>
 </div>
@@ -1044,6 +1293,6 @@ on the fly from parts.</p>
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/html/harfbuzz-hb-ot-meta.html b/docs/html/harfbuzz-hb-ot-meta.html
new file mode 100644 (file)
index 0000000..209f2c5
--- /dev/null
@@ -0,0 +1,209 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>hb-ot-meta: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="opentype-api.html" title="OpenType API">
+<link rel="prev" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">
+<link rel="next" href="harfbuzz-hb-ot-metrics.html" title="hb-ot-metrics">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts">
+<a href="#" class="shortcut">Top</a><span id="nav_description">  <span class="dim">|</span> 
+                  <a href="#harfbuzz-hb-ot-meta.description" class="shortcut">Description</a></span>
+</td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="opentype-api.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="harfbuzz-hb-ot-math.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="harfbuzz-hb-ot-metrics.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="harfbuzz-hb-ot-meta"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="harfbuzz-hb-ot-meta.top_of_page"></a>hb-ot-meta</span></h2>
+<p>hb-ot-meta — OpenType Metadata</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-meta.functions"></a><h2>Functions</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="functions_proto_type">
+<col class="functions_proto_name">
+</colgroup>
+<tbody>
+<tr>
+<td class="function_type">unsigned <span class="returnvalue">int</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-meta.html#hb-ot-meta-get-entry-tags" title="hb_ot_meta_get_entry_tags ()">hb_ot_meta_get_entry_tags</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-t" title="hb_blob_t"><span class="returnvalue">hb_blob_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-meta.html#hb-ot-meta-reference-entry" title="hb_ot_meta_reference_entry ()">hb_ot_meta_reference_entry</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-meta.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="other_proto_type">
+<col class="other_proto_name">
+</colgroup>
+<tbody><tr>
+<td class="datatype_keyword">enum</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-ot-meta.html#hb-ot-meta-tag-t" title="enum hb_ot_meta_tag_t">hb_ot_meta_tag_t</a></td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-meta.includes"></a><h2>Includes</h2>
+<pre class="synopsis">#include &lt;hb-ot.h&gt;
+</pre>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-meta.description"></a><h2>Description</h2>
+<p>Functions for fetching metadata from fonts.</p>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-meta.functions_details"></a><h2>Functions</h2>
+<div class="refsect2">
+<a name="hb-ot-meta-get-entry-tags"></a><h3>hb_ot_meta_get_entry_tags ()</h3>
+<pre class="programlisting">unsigned <span class="returnvalue">int</span>
+hb_ot_meta_get_entry_tags (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                           <em class="parameter"><code>unsigned <span class="type">int</span> start_offset</code></em>,
+                           <em class="parameter"><code>unsigned <span class="type">int</span> *entries_count</code></em>,
+                           <em class="parameter"><code><a class="link" href="harfbuzz-hb-ot-meta.html#hb-ot-meta-tag-t" title="enum hb_ot_meta_tag_t"><span class="type">hb_ot_meta_tag_t</span></a> *entries</code></em>);</pre>
+<p>Fetches all available feature types.</p>
+<div class="refsect3">
+<a name="hb-ot-meta-get-entry-tags.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>a face object</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>start_offset</p></td>
+<td class="parameter_description"><p>iteration's start offset</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>entries_count</p></td>
+<td class="parameter_description"><p>buffer size as input, filled size as output. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<acronym title="NULL may be passed instead of a pointer to a location."><span class="acronym">optional</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>entries</p></td>
+<td class="parameter_description"><p>entries tags buffer. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Out parameter, where caller must allocate storage."><span class="acronym">out caller-allocates</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=entries_count]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-ot-meta-get-entry-tags.returns"></a><h4>Returns</h4>
+<p> Number of all available feature types.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-6-0.html#api-index-2.6.0">2.6.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-meta-reference-entry"></a><h3>hb_ot_meta_reference_entry ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t" title="hb_blob_t"><span class="returnvalue">hb_blob_t</span></a> *
+hb_ot_meta_reference_entry (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> *face</code></em>,
+                            <em class="parameter"><code><a class="link" href="harfbuzz-hb-ot-meta.html#hb-ot-meta-tag-t" title="enum hb_ot_meta_tag_t"><span class="type">hb_ot_meta_tag_t</span></a> meta_tag</code></em>);</pre>
+<p>It fetches metadata entry of a given tag from a font.</p>
+<div class="refsect3">
+<a name="hb-ot-meta-reference-entry.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>a <a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> object.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>meta_tag</p></td>
+<td class="parameter_description"><p>tag of metadata you like to have.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-ot-meta-reference-entry.returns"></a><h4>Returns</h4>
+<p>A blob containing the blob. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-6-0.html#api-index-2.6.0">2.6.0</a></p>
+</div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-meta.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="hb-ot-meta-tag-t"></a><h3>enum hb_ot_meta_tag_t</h3>
+<p>Known metadata tags from https://docs.microsoft.com/en-us/typography/opentype/spec/meta</p>
+<div class="refsect3">
+<a name="hb-ot-meta-tag-t.members"></a><h4>Members</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="300px" class="enum_members_name">
+<col class="enum_members_description">
+<col width="200px" class="enum_members_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-META-TAG-DESIGN-LANGUAGES:CAPS"></a>HB_OT_META_TAG_DESIGN_LANGUAGES</p></td>
+<td class="enum_member_description">
+<p>Design languages. Text, using only
+Basic Latin (ASCII) characters. Indicates languages and/or scripts
+for the user audiences that the font was primarily designed for.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-META-TAG-SUPPORTED-LANGUAGES:CAPS"></a>HB_OT_META_TAG_SUPPORTED_LANGUAGES</p></td>
+<td class="enum_member_description">
+<p>Supported languages. Text, using
+only Basic Latin (ASCII) characters. Indicates languages and/or scripts
+that the font is declared to be capable of supporting.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-6-0.html#api-index-2.6.0">2.6.0</a></p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/harfbuzz-hb-ot-metrics.html b/docs/html/harfbuzz-hb-ot-metrics.html
new file mode 100644 (file)
index 0000000..6662f42
--- /dev/null
@@ -0,0 +1,479 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>hb-ot-metrics: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="opentype-api.html" title="OpenType API">
+<link rel="prev" href="harfbuzz-hb-ot-meta.html" title="hb-ot-meta">
+<link rel="next" href="harfbuzz-hb-ot-name.html" title="hb-ot-name">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts">
+<a href="#" class="shortcut">Top</a><span id="nav_description">  <span class="dim">|</span> 
+                  <a href="#harfbuzz-hb-ot-metrics.description" class="shortcut">Description</a></span>
+</td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="opentype-api.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="harfbuzz-hb-ot-meta.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="harfbuzz-hb-ot-name.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="harfbuzz-hb-ot-metrics"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="harfbuzz-hb-ot-metrics.top_of_page"></a>hb-ot-metrics</span></h2>
+<p>hb-ot-metrics — OpenType Metrics</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-metrics.functions"></a><h2>Functions</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="functions_proto_type">
+<col class="functions_proto_name">
+</colgroup>
+<tbody>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-metrics.html#hb-ot-metrics-get-position" title="hb_ot_metrics_get_position ()">hb_ot_metrics_get_position</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">float</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-metrics.html#hb-ot-metrics-get-variation" title="hb_ot_metrics_get_variation ()">hb_ot_metrics_get_variation</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="returnvalue">hb_position_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-metrics.html#hb-ot-metrics-get-x-variation" title="hb_ot_metrics_get_x_variation ()">hb_ot_metrics_get_x_variation</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="returnvalue">hb_position_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-ot-metrics.html#hb-ot-metrics-get-y-variation" title="hb_ot_metrics_get_y_variation ()">hb_ot_metrics_get_y_variation</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-metrics.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="other_proto_type">
+<col class="other_proto_name">
+</colgroup>
+<tbody><tr>
+<td class="datatype_keyword">enum</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-ot-metrics.html#hb-ot-metrics-tag-t" title="enum hb_ot_metrics_tag_t">hb_ot_metrics_tag_t</a></td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-metrics.includes"></a><h2>Includes</h2>
+<pre class="synopsis">#include &lt;hb-ot.h&gt;
+</pre>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-metrics.description"></a><h2>Description</h2>
+<p>Functions for fetching metrics from fonts.</p>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-metrics.functions_details"></a><h2>Functions</h2>
+<div class="refsect2">
+<a name="hb-ot-metrics-get-position"></a><h3>hb_ot_metrics_get_position ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_ot_metrics_get_position (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                            <em class="parameter"><code><a class="link" href="harfbuzz-hb-ot-metrics.html#hb-ot-metrics-tag-t" title="enum hb_ot_metrics_tag_t"><span class="type">hb_ot_metrics_tag_t</span></a> metrics_tag</code></em>,
+                            <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *position</code></em>);</pre>
+<p>Fetches metrics value corresponding to <em class="parameter"><code>metrics_tag</code></em>
+ from <em class="parameter"><code>font</code></em>
+.</p>
+<div class="refsect3">
+<a name="hb-ot-metrics-get-position.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> object.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>metrics_tag</p></td>
+<td class="parameter_description"><p>tag of metrics value you like to fetch.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>position</p></td>
+<td class="parameter_description"><p>result of metrics value from the font. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL may be passed instead of a pointer to a location."><span class="acronym">optional</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-ot-metrics-get-position.returns"></a><h4>Returns</h4>
+<p> Whether found the requested metrics in the font.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-6-0.html#api-index-2.6.0">2.6.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-metrics-get-variation"></a><h3>hb_ot_metrics_get_variation ()</h3>
+<pre class="programlisting"><span class="returnvalue">float</span>
+hb_ot_metrics_get_variation (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-ot-metrics.html#hb-ot-metrics-tag-t" title="enum hb_ot_metrics_tag_t"><span class="type">hb_ot_metrics_tag_t</span></a> metrics_tag</code></em>);</pre>
+<p>Fetches metrics value corresponding to <em class="parameter"><code>metrics_tag</code></em>
+ from <em class="parameter"><code>font</code></em>
+ with the
+current font variation settings applied.</p>
+<div class="refsect3">
+<a name="hb-ot-metrics-get-variation.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> object.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>metrics_tag</p></td>
+<td class="parameter_description"><p>tag of metrics value you like to fetch.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-ot-metrics-get-variation.returns"></a><h4>Returns</h4>
+<p> The requested metric value.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-6-0.html#api-index-2.6.0">2.6.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-metrics-get-x-variation"></a><h3>hb_ot_metrics_get_x_variation ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="returnvalue">hb_position_t</span></a>
+hb_ot_metrics_get_x_variation (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                               <em class="parameter"><code><a class="link" href="harfbuzz-hb-ot-metrics.html#hb-ot-metrics-tag-t" title="enum hb_ot_metrics_tag_t"><span class="type">hb_ot_metrics_tag_t</span></a> metrics_tag</code></em>);</pre>
+<p>Fetches horizontal metrics value corresponding to <em class="parameter"><code>metrics_tag</code></em>
+ from <em class="parameter"><code>font</code></em>
+
+with the current font variation settings applied.</p>
+<div class="refsect3">
+<a name="hb-ot-metrics-get-x-variation.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> object.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>metrics_tag</p></td>
+<td class="parameter_description"><p>tag of metrics value you like to fetch.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-ot-metrics-get-x-variation.returns"></a><h4>Returns</h4>
+<p> The requested metric value.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-6-0.html#api-index-2.6.0">2.6.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-metrics-get-y-variation"></a><h3>hb_ot_metrics_get_y_variation ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="returnvalue">hb_position_t</span></a>
+hb_ot_metrics_get_y_variation (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                               <em class="parameter"><code><a class="link" href="harfbuzz-hb-ot-metrics.html#hb-ot-metrics-tag-t" title="enum hb_ot_metrics_tag_t"><span class="type">hb_ot_metrics_tag_t</span></a> metrics_tag</code></em>);</pre>
+<p>Fetches vertical metrics value corresponding to <em class="parameter"><code>metrics_tag</code></em>
+ from <em class="parameter"><code>font</code></em>
+ with
+the current font variation settings applied.</p>
+<div class="refsect3">
+<a name="hb-ot-metrics-get-y-variation.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> object.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>metrics_tag</p></td>
+<td class="parameter_description"><p>tag of metrics value you like to fetch.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-ot-metrics-get-y-variation.returns"></a><h4>Returns</h4>
+<p> The requested metric value.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-6-0.html#api-index-2.6.0">2.6.0</a></p>
+</div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-ot-metrics.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="hb-ot-metrics-tag-t"></a><h3>enum hb_ot_metrics_tag_t</h3>
+<p>Metric tags corresponding to <a class="ulink" href="https://docs.microsoft.com/en-us/typography/opentype/spec/mvar#value-tags" target="_top">MVAR Value
+Tags</a></p>
+<div class="refsect3">
+<a name="hb-ot-metrics-tag-t.members"></a><h4>Members</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="300px" class="enum_members_name">
+<col class="enum_members_description">
+<col width="200px" class="enum_members_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-METRICS-TAG-HORIZONTAL-ASCENDER:CAPS"></a>HB_OT_METRICS_TAG_HORIZONTAL_ASCENDER</p></td>
+<td class="enum_member_description">
+<p>horizontal ascender.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-METRICS-TAG-HORIZONTAL-DESCENDER:CAPS"></a>HB_OT_METRICS_TAG_HORIZONTAL_DESCENDER</p></td>
+<td class="enum_member_description">
+<p>horizontal descender.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-METRICS-TAG-HORIZONTAL-LINE-GAP:CAPS"></a>HB_OT_METRICS_TAG_HORIZONTAL_LINE_GAP</p></td>
+<td class="enum_member_description">
+<p>horizontal line gap.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-METRICS-TAG-HORIZONTAL-CLIPPING-ASCENT:CAPS"></a>HB_OT_METRICS_TAG_HORIZONTAL_CLIPPING_ASCENT</p></td>
+<td class="enum_member_description">
+<p>horizontal clipping ascent.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-METRICS-TAG-HORIZONTAL-CLIPPING-DESCENT:CAPS"></a>HB_OT_METRICS_TAG_HORIZONTAL_CLIPPING_DESCENT</p></td>
+<td class="enum_member_description">
+<p>horizontal clipping descent.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-METRICS-TAG-VERTICAL-ASCENDER:CAPS"></a>HB_OT_METRICS_TAG_VERTICAL_ASCENDER</p></td>
+<td class="enum_member_description">
+<p>vertical ascender.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-METRICS-TAG-VERTICAL-DESCENDER:CAPS"></a>HB_OT_METRICS_TAG_VERTICAL_DESCENDER</p></td>
+<td class="enum_member_description">
+<p>vertical descender.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-METRICS-TAG-VERTICAL-LINE-GAP:CAPS"></a>HB_OT_METRICS_TAG_VERTICAL_LINE_GAP</p></td>
+<td class="enum_member_description">
+<p>vertical line gap.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-METRICS-TAG-HORIZONTAL-CARET-RISE:CAPS"></a>HB_OT_METRICS_TAG_HORIZONTAL_CARET_RISE</p></td>
+<td class="enum_member_description">
+<p>horizontal caret rise.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-METRICS-TAG-HORIZONTAL-CARET-RUN:CAPS"></a>HB_OT_METRICS_TAG_HORIZONTAL_CARET_RUN</p></td>
+<td class="enum_member_description">
+<p>horizontal caret run.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-METRICS-TAG-HORIZONTAL-CARET-OFFSET:CAPS"></a>HB_OT_METRICS_TAG_HORIZONTAL_CARET_OFFSET</p></td>
+<td class="enum_member_description">
+<p>horizontal caret offset.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-METRICS-TAG-VERTICAL-CARET-RISE:CAPS"></a>HB_OT_METRICS_TAG_VERTICAL_CARET_RISE</p></td>
+<td class="enum_member_description">
+<p>vertical caret rise.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-METRICS-TAG-VERTICAL-CARET-RUN:CAPS"></a>HB_OT_METRICS_TAG_VERTICAL_CARET_RUN</p></td>
+<td class="enum_member_description">
+<p>vertical caret run.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-METRICS-TAG-VERTICAL-CARET-OFFSET:CAPS"></a>HB_OT_METRICS_TAG_VERTICAL_CARET_OFFSET</p></td>
+<td class="enum_member_description">
+<p>vertical caret offset.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-METRICS-TAG-X-HEIGHT:CAPS"></a>HB_OT_METRICS_TAG_X_HEIGHT</p></td>
+<td class="enum_member_description">
+<p>x height.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-METRICS-TAG-CAP-HEIGHT:CAPS"></a>HB_OT_METRICS_TAG_CAP_HEIGHT</p></td>
+<td class="enum_member_description">
+<p>cap height.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-METRICS-TAG-SUBSCRIPT-EM-X-SIZE:CAPS"></a>HB_OT_METRICS_TAG_SUBSCRIPT_EM_X_SIZE</p></td>
+<td class="enum_member_description">
+<p>subscript em x size.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-METRICS-TAG-SUBSCRIPT-EM-Y-SIZE:CAPS"></a>HB_OT_METRICS_TAG_SUBSCRIPT_EM_Y_SIZE</p></td>
+<td class="enum_member_description">
+<p>subscript em y size.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-METRICS-TAG-SUBSCRIPT-EM-X-OFFSET:CAPS"></a>HB_OT_METRICS_TAG_SUBSCRIPT_EM_X_OFFSET</p></td>
+<td class="enum_member_description">
+<p>subscript em x offset.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-METRICS-TAG-SUBSCRIPT-EM-Y-OFFSET:CAPS"></a>HB_OT_METRICS_TAG_SUBSCRIPT_EM_Y_OFFSET</p></td>
+<td class="enum_member_description">
+<p>subscript em y offset.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-METRICS-TAG-SUPERSCRIPT-EM-X-SIZE:CAPS"></a>HB_OT_METRICS_TAG_SUPERSCRIPT_EM_X_SIZE</p></td>
+<td class="enum_member_description">
+<p>superscript em x size.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-METRICS-TAG-SUPERSCRIPT-EM-Y-SIZE:CAPS"></a>HB_OT_METRICS_TAG_SUPERSCRIPT_EM_Y_SIZE</p></td>
+<td class="enum_member_description">
+<p>superscript em y size.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-METRICS-TAG-SUPERSCRIPT-EM-X-OFFSET:CAPS"></a>HB_OT_METRICS_TAG_SUPERSCRIPT_EM_X_OFFSET</p></td>
+<td class="enum_member_description">
+<p>superscript em x offset.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-METRICS-TAG-SUPERSCRIPT-EM-Y-OFFSET:CAPS"></a>HB_OT_METRICS_TAG_SUPERSCRIPT_EM_Y_OFFSET</p></td>
+<td class="enum_member_description">
+<p>superscript em y offset.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-METRICS-TAG-STRIKEOUT-SIZE:CAPS"></a>HB_OT_METRICS_TAG_STRIKEOUT_SIZE</p></td>
+<td class="enum_member_description">
+<p>strikeout size.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-METRICS-TAG-STRIKEOUT-OFFSET:CAPS"></a>HB_OT_METRICS_TAG_STRIKEOUT_OFFSET</p></td>
+<td class="enum_member_description">
+<p>strikeout offset.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-METRICS-TAG-UNDERLINE-SIZE:CAPS"></a>HB_OT_METRICS_TAG_UNDERLINE_SIZE</p></td>
+<td class="enum_member_description">
+<p>underline size.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-OT-METRICS-TAG-UNDERLINE-OFFSET:CAPS"></a>HB_OT_METRICS_TAG_UNDERLINE_OFFSET</p></td>
+<td class="enum_member_description">
+<p>underline offset.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-6-0.html#api-index-2.6.0">2.6.0</a></p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
index 0cf4ccc..0eb1f24 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-ot-name: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch13.html" title="OpenType API">
-<link rel="prev" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">
+<link rel="up" href="opentype-api.html" title="OpenType API">
+<link rel="prev" href="harfbuzz-hb-ot-metrics.html" title="hb-ot-metrics">
 <link rel="next" href="harfbuzz-hb-ot-shape.html" title="hb-ot-shape">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -18,8 +18,8 @@
                   <a href="#harfbuzz-hb-ot-name.description" class="shortcut">Description</a></span>
 </td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><a accesskey="u" href="ch13.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
-<td><a accesskey="p" href="harfbuzz-hb-ot-math.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="opentype-api.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="harfbuzz-hb-ot-metrics.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
 <td><a accesskey="n" href="harfbuzz-hb-ot-shape.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <div class="refentry">
@@ -40,7 +40,7 @@
 </colgroup>
 <tbody>
 <tr>
-<td class="function_type">const <span class="returnvalue">hb_ot_name_entry_t</span> *
+<td class="function_type">const <a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-entry-t" title="hb_ot_name_entry_t"><span class="returnvalue">hb_ot_name_entry_t</span></a> *
 </td>
 <td class="function_name">
 <a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-list-names" title="hb_ot_name_list_names ()">hb_ot_name_list_names</a> <span class="c_punctuation">()</span>
 <col width="150px" class="other_proto_type">
 <col class="other_proto_name">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
 <td class="typedef_keyword">typedef</td>
 <td class="function_name"><a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-id-t" title="hb_ot_name_id_t">hb_ot_name_id_t</a></td>
-</tr></tbody>
+</tr>
+<tr>
+<td class="datatype_keyword"> </td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-entry-t" title="hb_ot_name_entry_t">hb_ot_name_entry_t</a></td>
+</tr>
+</tbody>
 </table></div>
 </div>
 <div class="refsect1">
 <a name="harfbuzz-hb-ot-name.functions_details"></a><h2>Functions</h2>
 <div class="refsect2">
 <a name="hb-ot-name-list-names"></a><h3>hb_ot_name_list_names ()</h3>
-<pre class="programlisting">const <span class="returnvalue">hb_ot_name_entry_t</span> *
+<pre class="programlisting">const <a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-entry-t" title="hb_ot_name_entry_t"><span class="returnvalue">hb_ot_name_entry_t</span></a> *
 hb_ot_name_list_names (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> *face</code></em>,
                        <em class="parameter"><code>unsigned <span class="type">int</span> *num_entries</code></em>);</pre>
 <p>Enumerates all available name IDs and language combinations. Returned
@@ -121,7 +127,7 @@ used as long as <em class="parameter"><code>face</code></em>
 <tr>
 <td class="parameter_name"><p>num_entries</p></td>
 <td class="parameter_description"><p>number of returned entries. </p></td>
-<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL may be passed instead of a pointer to a location."><span class="acronym">optional</span></acronym>]</span></td>
 </tr>
 </tbody>
 </table></div>
@@ -129,7 +135,7 @@ used as long as <em class="parameter"><code>face</code></em>
 <div class="refsect3">
 <a name="hb-ot-name-list-names.returns"></a><h4>Returns</h4>
 <p>Array of available name entries. </p>
-<p><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=num_entries]</span></p>
+<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=num_entries]</span></p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-2-1-0.html#api-index-2.1.0">2.1.0</a></p>
 </div>
@@ -145,7 +151,9 @@ hb_ot_name_get_utf16 (<em class="parameter"><code><a class="link" href="harfbuzz
 <p>Fetches a font name from the OpenType 'name' table.
 If <em class="parameter"><code>language</code></em>
  is <a class="link" href="harfbuzz-hb-common.html#HB-LANGUAGE-INVALID:CAPS" title="HB_LANGUAGE_INVALID"><span class="type">HB_LANGUAGE_INVALID</span></a>, English ("en") is assumed.
-Returns string in UTF-16 encoding.</p>
+Returns string in UTF-16 encoding. A NUL terminator is always written
+for convenience, and isn't included in the output <em class="parameter"><code>text_size</code></em>
+.</p>
 <div class="refsect3">
 <a name="hb-ot-name-get-utf16.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -175,7 +183,7 @@ Returns string in UTF-16 encoding.</p>
 <td class="parameter_description"><p>input size of <em class="parameter"><code>text</code></em>
 buffer, and output size of
 text written to buffer. </p></td>
-<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<acronym title="NULL may be passed instead of a pointer to a location."><span class="acronym">optional</span></acronym>]</span></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>text</p></td>
@@ -203,7 +211,9 @@ hb_ot_name_get_utf32 (<em class="parameter"><code><a class="link" href="harfbuzz
 <p>Fetches a font name from the OpenType 'name' table.
 If <em class="parameter"><code>language</code></em>
  is <a class="link" href="harfbuzz-hb-common.html#HB-LANGUAGE-INVALID:CAPS" title="HB_LANGUAGE_INVALID"><span class="type">HB_LANGUAGE_INVALID</span></a>, English ("en") is assumed.
-Returns string in UTF-32 encoding.</p>
+Returns string in UTF-32 encoding. A NUL terminator is always written
+for convenience, and isn't included in the output <em class="parameter"><code>text_size</code></em>
+.</p>
 <div class="refsect3">
 <a name="hb-ot-name-get-utf32.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -233,7 +243,7 @@ Returns string in UTF-32 encoding.</p>
 <td class="parameter_description"><p>input size of <em class="parameter"><code>text</code></em>
 buffer, and output size of
 text written to buffer. </p></td>
-<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<acronym title="NULL may be passed instead of a pointer to a location."><span class="acronym">optional</span></acronym>]</span></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>text</p></td>
@@ -261,7 +271,9 @@ hb_ot_name_get_utf8 (<em class="parameter"><code><a class="link" href="harfbuzz-
 <p>Fetches a font name from the OpenType 'name' table.
 If <em class="parameter"><code>language</code></em>
  is <a class="link" href="harfbuzz-hb-common.html#HB-LANGUAGE-INVALID:CAPS" title="HB_LANGUAGE_INVALID"><span class="type">HB_LANGUAGE_INVALID</span></a>, English ("en") is assumed.
-Returns string in UTF-8 encoding.</p>
+Returns string in UTF-8 encoding. A NUL terminator is always written
+for convenience, and isn't included in the output <em class="parameter"><code>text_size</code></em>
+.</p>
 <div class="refsect3">
 <a name="hb-ot-name-get-utf8.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -291,7 +303,7 @@ Returns string in UTF-8 encoding.</p>
 <td class="parameter_description"><p>input size of <em class="parameter"><code>text</code></em>
 buffer, and output size of
 text written to buffer. </p></td>
-<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<acronym title="NULL may be passed instead of a pointer to a location."><span class="acronym">optional</span></acronym>]</span></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>text</p></td>
@@ -317,11 +329,46 @@ text written to buffer. </p></td>
 <p>An integral type representing an OpenType 'name' table name identifier.
 There are predefined name IDs, as well as name IDs return from other
 API.  These can be used to fetch name strings from a font face.</p>
+<p>For more information on these fields, see the
+<a class="ulink" href="https://docs.microsoft.com/en-us/typography/opentype/spec/name#name-ids" target="_top">OpenType spec</a>.</p>
 <p class="since">Since: <a class="link" href="api-index-2-0-0.html#api-index-2.0.0">2.0.0</a></p>
 </div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-name-entry-t"></a><h3>hb_ot_name_entry_t</h3>
+<pre class="programlisting">typedef struct {
+  hb_ot_name_id_t name_id;
+  hb_language_t   language;
+} hb_ot_name_entry_t;
+</pre>
+<p>Structure representing a name ID in a particular language.</p>
+<div class="refsect3">
+<a name="hb-ot-name-entry-t.members"></a><h4>Members</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="300px" class="struct_members_name">
+<col class="struct_members_description">
+<col width="200px" class="struct_members_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="struct_member_name"><p><a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-id-t" title="hb_ot_name_id_t"><span class="type">hb_ot_name_id_t</span></a> <em class="structfield"><code><a name="hb-ot-name-entry-t.name-id"></a>name_id</code></em>;</p></td>
+<td class="struct_member_description"><p>name ID</p></td>
+<td class="struct_member_annotations"> </td>
+</tr>
+<tr>
+<td class="struct_member_name"><p><a class="link" href="harfbuzz-hb-common.html#hb-language-t" title="hb_language_t"><span class="type">hb_language_t</span></a> <em class="structfield"><code><a name="hb-ot-name-entry-t.language"></a>language</code></em>;</p></td>
+<td class="struct_member_description"><p>language</p></td>
+<td class="struct_member_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-1-0.html#api-index-2.1.0">2.1.0</a></p>
+</div>
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index ce75403..02dbcd8 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-ot-shape: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch13.html" title="OpenType API">
+<link rel="up" href="opentype-api.html" title="OpenType API">
 <link rel="prev" href="harfbuzz-hb-ot-name.html" title="hb-ot-name">
 <link rel="next" href="harfbuzz-hb-ot-var.html" title="hb-ot-var">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -18,7 +18,7 @@
                   <a href="#harfbuzz-hb-ot-shape.description" class="shortcut">Description</a></span>
 </td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><a accesskey="u" href="ch13.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="u" href="opentype-api.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
 <td><a accesskey="p" href="harfbuzz-hb-ot-name.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
 <td><a accesskey="n" href="harfbuzz-hb-ot-var.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
@@ -67,11 +67,51 @@ hb_ot_shape_glyphs_closure (<em class="parameter"><code><a class="link" href="ha
                             <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-common.html#hb-feature-t" title="hb_feature_t"><span class="type">hb_feature_t</span></a> *features</code></em>,
                             <em class="parameter"><code>unsigned <span class="type">int</span> num_features</code></em>,
                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a> *glyphs</code></em>);</pre>
+<p>Computes the transitive closure of glyphs needed for a specified
+input buffer under the given font and feature list. The closure is
+computed as a set, not as a list.</p>
+<div class="refsect3">
+<a name="hb-ot-shape-glyphs-closure.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>The input buffer to compute from</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>features</p></td>
+<td class="parameter_description"><p>The features enabled on the buffer. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=num_features]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>num_features</p></td>
+<td class="parameter_description"><p>The number of features enabled on the buffer</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>glyphs</p></td>
+<td class="parameter_description"><p>The <a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a> set of glyphs comprising the transitive closure of the query. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index d8fe073..98082c9 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-ot-var: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch13.html" title="OpenType API">
+<link rel="up" href="opentype-api.html" title="OpenType API">
 <link rel="prev" href="harfbuzz-hb-ot-shape.html" title="hb-ot-shape">
-<link rel="next" href="ch14.html" title="Apple Advanced Typography API">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<link rel="next" href="apple-advanced-typography-api.html" title="Apple Advanced Typography API">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -18,9 +18,9 @@
                   <a href="#harfbuzz-hb-ot-var.description" class="shortcut">Description</a></span>
 </td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><a accesskey="u" href="ch13.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="u" href="opentype-api.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
 <td><a accesskey="p" href="harfbuzz-hb-ot-shape.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="ch14.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+<td><a accesskey="n" href="apple-advanced-typography-api.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <div class="refentry">
 <a name="harfbuzz-hb-ot-var"></a><div class="titlepage"></div>
 <td class="datatype_keyword">enum</td>
 <td class="function_name"><a class="link" href="harfbuzz-hb-ot-var.html#hb-ot-var-axis-flags-t" title="enum hb_ot_var_axis_flags_t">hb_ot_var_axis_flags_t</a></td>
 </tr>
+<tr>
+<td class="datatype_keyword"> </td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-ot-var.html#hb-ot-var-axis-info-t" title="hb_ot_var_axis_info_t">hb_ot_var_axis_info_t</a></td>
+</tr>
 </tbody>
 </table></div>
 </div>
 <a name="hb-ot-var-has-data"></a><h3>hb_ot_var_has_data ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 hb_ot_var_has_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
-<p>This function allows to verify the presence of OpenType variation data on the face.</p>
+<p>Tests whether a face includes any OpenType variation data in the <code class="literal">fvar</code> table.</p>
 <div class="refsect3">
 <a name="hb-ot-var-has-data.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -179,14 +183,14 @@ hb_ot_var_has_data (<em class="parameter"><code><a class="link" href="harfbuzz-h
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>face</p></td>
-<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> to test</p></td>
+<td class="parameter_description"><p>The <a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> to work on</p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
 </div>
 <div class="refsect3">
 <a name="hb-ot-var-has-data.returns"></a><h4>Returns</h4>
-<p> true if face has a `fvar' table and false otherwise</p>
+<p> <code class="literal">true</code> if data found, <code class="literal">false</code> otherwise</p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-1-4-2.html#api-index-1.4.2">1.4.2</a></p>
 </div>
@@ -196,7 +200,40 @@ hb_ot_var_has_data (<em class="parameter"><code><a class="link" href="harfbuzz-h
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 hb_ot_var_find_axis_info (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> *face</code></em>,
                           <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> axis_tag</code></em>,
-                          <em class="parameter"><code><span class="type">hb_ot_var_axis_info_t</span> *axis_info</code></em>);</pre>
+                          <em class="parameter"><code><a class="link" href="harfbuzz-hb-ot-var.html#hb-ot-var-axis-info-t" title="hb_ot_var_axis_info_t"><span class="type">hb_ot_var_axis_info_t</span></a> *axis_info</code></em>);</pre>
+<p>Fetches the variation-axis information corresponding to the specified axis tag
+in the specified face.</p>
+<div class="refsect3">
+<a name="hb-ot-var-find-axis-info.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>axis_tag</p></td>
+<td class="parameter_description"><p>The <a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> of the variation axis to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>axis_info</p></td>
+<td class="parameter_description"><p>The <a class="link" href="harfbuzz-hb-ot-var.html#hb-ot-var-axis-info-t" title="hb_ot_var_axis_info_t"><span class="type">hb_ot_var_axis_info_t</span></a> of the axis tag queried. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-ot-var-find-axis-info.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> if data found, <code class="literal">false</code> otherwise</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-2-2-0.html#api-index-2.2.0">2.2.0</a></p>
 </div>
 <hr>
@@ -204,6 +241,26 @@ hb_ot_var_find_axis_info (<em class="parameter"><code><a class="link" href="harf
 <a name="hb-ot-var-get-axis-count"></a><h3>hb_ot_var_get_axis_count ()</h3>
 <pre class="programlisting">unsigned <span class="returnvalue">int</span>
 hb_ot_var_get_axis_count (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+<p>Fetches the number of OpenType variation axes included in the face.</p>
+<div class="refsect3">
+<a name="hb-ot-var-get-axis-count.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>The <a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> to work on</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-ot-var-get-axis-count.returns"></a><h4>Returns</h4>
+<p> the number of variation axes defined</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-1-4-2.html#api-index-1.4.2">1.4.2</a></p>
 </div>
 <hr>
@@ -213,7 +270,46 @@ hb_ot_var_get_axis_count (<em class="parameter"><code><a class="link" href="harf
 hb_ot_var_get_axis_infos (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> *face</code></em>,
                           <em class="parameter"><code>unsigned <span class="type">int</span> start_offset</code></em>,
                           <em class="parameter"><code>unsigned <span class="type">int</span> *axes_count</code></em>,
-                          <em class="parameter"><code><span class="type">hb_ot_var_axis_info_t</span> *axes_array</code></em>);</pre>
+                          <em class="parameter"><code><a class="link" href="harfbuzz-hb-ot-var.html#hb-ot-var-axis-info-t" title="hb_ot_var_axis_info_t"><span class="type">hb_ot_var_axis_info_t</span></a> *axes_array</code></em>);</pre>
+<p>Fetches a list of all variation axes in the specified face. The list returned will begin
+at the offset provided.</p>
+<div class="refsect3">
+<a name="hb-ot-var-get-axis-infos.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>start_offset</p></td>
+<td class="parameter_description"><p>offset of the first lookup to retrieve</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>axes_count</p></td>
+<td class="parameter_description"><p>Input = the maximum number of variation axes to return;
+Output = the actual number of variation axes returned (may be zero). </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<acronym title="NULL may be passed instead of a pointer to a location."><span class="acronym">optional</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>axes_array</p></td>
+<td class="parameter_description"><p>The array of variation axes found. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Out parameter, where caller must allocate storage."><span class="acronym">out caller-allocates</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=axes_count]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-ot-var-get-axis-infos.returns"></a><h4>Returns</h4>
+<p> the number of variation axes in the face</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-2-2-0.html#api-index-2.2.0">2.2.0</a></p>
 </div>
 <hr>
@@ -221,6 +317,27 @@ hb_ot_var_get_axis_infos (<em class="parameter"><code><a class="link" href="harf
 <a name="hb-ot-var-get-named-instance-count"></a><h3>hb_ot_var_get_named_instance_count ()</h3>
 <pre class="programlisting">unsigned <span class="returnvalue">int</span>
 hb_ot_var_get_named_instance_count (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+<p>Fetches the number of named instances included in the face.</p>
+<div class="refsect3">
+<a name="hb-ot-var-get-named-instance-count.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>The <a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> to work on</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-ot-var-get-named-instance-count.returns"></a><h4>Returns</h4>
+<p> the number of named instances defined</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-2-0.html#api-index-2.2.0">2.2.0</a></p>
 </div>
 <hr>
 <div class="refsect2">
@@ -229,6 +346,35 @@ hb_ot_var_get_named_instance_count (<em class="parameter"><code><a class="link"
 hb_ot_var_named_instance_get_subfamily_name_id
                                (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> *face</code></em>,
                                 <em class="parameter"><code>unsigned <span class="type">int</span> instance_index</code></em>);</pre>
+<p>Fetches the <code class="literal">name</code> table Name ID that provides display names for
+the "Subfamily name" defined for the given named instance in the face.</p>
+<div class="refsect3">
+<a name="hb-ot-var-named-instance-get-subfamily-name-id.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>The <a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> to work on</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>instance_index</p></td>
+<td class="parameter_description"><p>The index of the named instance to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-ot-var-named-instance-get-subfamily-name-id.returns"></a><h4>Returns</h4>
+<p> the Name ID found for the Subfamily name</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-2-0.html#api-index-2.2.0">2.2.0</a></p>
 </div>
 <hr>
 <div class="refsect2">
@@ -237,6 +383,35 @@ hb_ot_var_named_instance_get_subfamily_name_id
 hb_ot_var_named_instance_get_postscript_name_id
                                (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> *face</code></em>,
                                 <em class="parameter"><code>unsigned <span class="type">int</span> instance_index</code></em>);</pre>
+<p>Fetches the <code class="literal">name</code> table Name ID that provides display names for
+the "PostScript name" defined for the given named instance in the face.</p>
+<div class="refsect3">
+<a name="hb-ot-var-named-instance-get-postscript-name-id.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>The <a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> to work on</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>instance_index</p></td>
+<td class="parameter_description"><p>The index of the named instance to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-ot-var-named-instance-get-postscript-name-id.returns"></a><h4>Returns</h4>
+<p> the Name ID found for the PostScript name</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-2-0.html#api-index-2.2.0">2.2.0</a></p>
 </div>
 <hr>
 <div class="refsect2">
@@ -247,6 +422,46 @@ hb_ot_var_named_instance_get_design_coords
                                 <em class="parameter"><code>unsigned <span class="type">int</span> instance_index</code></em>,
                                 <em class="parameter"><code>unsigned <span class="type">int</span> *coords_length</code></em>,
                                 <em class="parameter"><code><span class="type">float</span> *coords</code></em>);</pre>
+<p>Fetches the design-space coordinates corresponding to the given
+named instance in the face.</p>
+<div class="refsect3">
+<a name="hb-ot-var-named-instance-get-design-coords.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>The <a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> to work on</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>instance_index</p></td>
+<td class="parameter_description"><p>The index of the named instance to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>coords_length</p></td>
+<td class="parameter_description"><p>Input = the maximum number of coordinates to return;
+Output = the actual number of coordinates returned (may be zero). </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<acronym title="NULL may be passed instead of a pointer to a location."><span class="acronym">optional</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>coords</p></td>
+<td class="parameter_description"><p>The array of coordinates found for the query. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=coords_length]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-ot-var-named-instance-get-design-coords.returns"></a><h4>Returns</h4>
+<p> the number of variation axes in the face</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-2-0.html#api-index-2.2.0">2.2.0</a></p>
 </div>
 <hr>
 <div class="refsect2">
@@ -257,6 +472,44 @@ hb_ot_var_normalize_variations (<em class="parameter"><code><a class="link" href
                                 <em class="parameter"><code>unsigned <span class="type">int</span> variations_length</code></em>,
                                 <em class="parameter"><code><span class="type">int</span> *coords</code></em>,
                                 <em class="parameter"><code>unsigned <span class="type">int</span> coords_length</code></em>);</pre>
+<p>Normalizes all of the coordinates in the given list of variation axes.</p>
+<div class="refsect3">
+<a name="hb-ot-var-normalize-variations.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>The <a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> to work on</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>variations</p></td>
+<td class="parameter_description"><p>The array of variations to normalize</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>variations_length</p></td>
+<td class="parameter_description"><p>The number of variations to normalize</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>coords</p></td>
+<td class="parameter_description"><p>The array of normalized coordinates. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=coords_length]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>coords_length</p></td>
+<td class="parameter_description"><p>The length of the coordinate array</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
 <p class="since">Since: <a class="link" href="api-index-1-4-2.html#api-index-1.4.2">1.4.2</a></p>
 </div>
 <hr>
@@ -267,6 +520,45 @@ hb_ot_var_normalize_coords (<em class="parameter"><code><a class="link" href="ha
                             <em class="parameter"><code>unsigned <span class="type">int</span> coords_length</code></em>,
                             <em class="parameter"><code>const <span class="type">float</span> *design_coords</code></em>,
                             <em class="parameter"><code><span class="type">int</span> *normalized_coords</code></em>);</pre>
+<p>Normalizes the given design-space coordinates. The minimum and maximum
+values for the axis are mapped to the interval [-1,1], with the default
+axis value mapped to 0.</p>
+<p>The normalized values have 14 bits of fixed-point sub-integer precision as per
+OpenType specification.</p>
+<p>Any additional scaling defined in the face's <code class="literal">avar</code> table is also
+applied, as described at https://docs.microsoft.com/en-us/typography/opentype/spec/avar</p>
+<div class="refsect3">
+<a name="hb-ot-var-normalize-coords.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>The <a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> to work on</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>coords_length</p></td>
+<td class="parameter_description"><p>The length of the coordinate array</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>design_coords</p></td>
+<td class="parameter_description"><p>The design-space coordinates to normalize</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>normalized_coords</p></td>
+<td class="parameter_description"><p>The normalized coordinates. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
 <p class="since">Since: <a class="link" href="api-index-1-4-2.html#api-index-1.4.2">1.4.2</a></p>
 </div>
 </div>
@@ -276,34 +568,41 @@ hb_ot_var_normalize_coords (<em class="parameter"><code><a class="link" href="ha
 <a name="HB-OT-TAG-VAR-AXIS-ITALIC:CAPS"></a><h3>HB_OT_TAG_VAR_AXIS_ITALIC</h3>
 <pre class="programlisting">#define HB_OT_TAG_VAR_AXIS_ITALIC HB_TAG('i','t','a','l')
 </pre>
+<p>Registered tag for the roman/italic axis.</p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="HB-OT-TAG-VAR-AXIS-OPTICAL-SIZE:CAPS"></a><h3>HB_OT_TAG_VAR_AXIS_OPTICAL_SIZE</h3>
 <pre class="programlisting">#define HB_OT_TAG_VAR_AXIS_OPTICAL_SIZE HB_TAG('o','p','s','z')
 </pre>
+<p>Registered tag for the optical-size axis.</p>
+<div class="note">Note: The optical-size axis supersedes the OpenType `size` feature.</div>
 </div>
 <hr>
 <div class="refsect2">
 <a name="HB-OT-TAG-VAR-AXIS-SLANT:CAPS"></a><h3>HB_OT_TAG_VAR_AXIS_SLANT</h3>
 <pre class="programlisting">#define HB_OT_TAG_VAR_AXIS_SLANT HB_TAG('s','l','n','t')
 </pre>
+<p>Registered tag for the slant axis</p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="HB-OT-TAG-VAR-AXIS-WEIGHT:CAPS"></a><h3>HB_OT_TAG_VAR_AXIS_WEIGHT</h3>
 <pre class="programlisting">#define HB_OT_TAG_VAR_AXIS_WEIGHT HB_TAG('w','g','h','t')
 </pre>
+<p>Registered tag for the weight axis.</p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="HB-OT-TAG-VAR-AXIS-WIDTH:CAPS"></a><h3>HB_OT_TAG_VAR_AXIS_WIDTH</h3>
 <pre class="programlisting">#define HB_OT_TAG_VAR_AXIS_WIDTH HB_TAG('w','d','t','h')
 </pre>
+<p>Registered tag for the width axis.</p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="hb-ot-var-axis-flags-t"></a><h3>enum hb_ot_var_axis_flags_t</h3>
+<p>Flags for <a class="link" href="harfbuzz-hb-ot-var.html#hb-ot-var-axis-info-t" title="hb_ot_var_axis_info_t"><span class="type">hb_ot_var_axis_info_t</span></a>.</p>
 <div class="refsect3">
 <a name="hb-ot-var-axis-flags-t.members"></a><h4>Members</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -312,18 +611,77 @@ hb_ot_var_normalize_coords (<em class="parameter"><code><a class="link" href="ha
 <col class="enum_members_description">
 <col width="200px" class="enum_members_annotations">
 </colgroup>
-<tbody>
-<tr>
+<tbody><tr>
 <td class="enum_member_name"><p><a name="HB-OT-VAR-AXIS-FLAG-HIDDEN:CAPS"></a>HB_OT_VAR_AXIS_FLAG_HIDDEN</p></td>
 <td class="enum_member_description">
 <p>The axis should not be exposed directly in user interfaces.</p>
 </td>
 <td class="enum_member_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-2-0.html#api-index-2.2.0">2.2.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-ot-var-axis-info-t"></a><h3>hb_ot_var_axis_info_t</h3>
+<pre class="programlisting">typedef struct {
+  unsigned int                 axis_index;
+  hb_tag_t                     tag;
+  hb_ot_name_id_t              name_id;
+  hb_ot_var_axis_flags_t flags;
+  float                                min_value;
+  float                                default_value;
+  float                                max_value;
+} hb_ot_var_axis_info_t;
+</pre>
+<p>Data type for holding variation-axis values.</p>
+<p>The minimum, default, and maximum values are in un-normalized, user scales.</p>
+<div class="note">Note: at present, the only flag defined for <em class="parameter"><code>flags</code></em> is
+<a class="link" href="harfbuzz-hb-ot-var.html#HB-OT-VAR-AXIS-FLAG-HIDDEN:CAPS"><span class="type">HB_OT_VAR_AXIS_FLAG_HIDDEN</span></a>.</div>
+<div class="refsect3">
+<a name="hb-ot-var-axis-info-t.members"></a><h4>Members</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="300px" class="struct_members_name">
+<col class="struct_members_description">
+<col width="200px" class="struct_members_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="struct_member_name"><p>unsigned <span class="type">int</span> <em class="structfield"><code><a name="hb-ot-var-axis-info-t.axis-index"></a>axis_index</code></em>;</p></td>
+<td class="struct_member_description"><p>Index of the axis in the variation-axis array</p></td>
+<td class="struct_member_annotations"> </td>
+</tr>
+<tr>
+<td class="struct_member_name"><p><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> <em class="structfield"><code><a name="hb-ot-var-axis-info-t.tag"></a>tag</code></em>;</p></td>
+<td class="struct_member_description"><p>The <a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> tag identifying the design variation of the axis</p></td>
+<td class="struct_member_annotations"> </td>
+</tr>
+<tr>
+<td class="struct_member_name"><p><a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-id-t" title="hb_ot_name_id_t"><span class="type">hb_ot_name_id_t</span></a> <em class="structfield"><code><a name="hb-ot-var-axis-info-t.name-id"></a>name_id</code></em>;</p></td>
+<td class="struct_member_description"><p>The <code class="literal">name</code> table Name ID that provides display names for the axis</p></td>
+<td class="struct_member_annotations"> </td>
+</tr>
+<tr>
+<td class="struct_member_name"><p><a class="link" href="harfbuzz-hb-ot-var.html#hb-ot-var-axis-flags-t" title="enum hb_ot_var_axis_flags_t"><span class="type">hb_ot_var_axis_flags_t</span></a> <em class="structfield"><code><a name="hb-ot-var-axis-info-t.flags"></a>flags</code></em>;</p></td>
+<td class="struct_member_description"><p>The <a class="link" href="harfbuzz-hb-ot-var.html#hb-ot-var-axis-flags-t" title="enum hb_ot_var_axis_flags_t"><span class="type">hb_ot_var_axis_flags_t</span></a> flags for the axis</p></td>
+<td class="struct_member_annotations"> </td>
+</tr>
+<tr>
+<td class="struct_member_name"><p><span class="type">float</span> <em class="structfield"><code><a name="hb-ot-var-axis-info-t.min-value"></a>min_value</code></em>;</p></td>
+<td class="struct_member_description"><p>The minimum value on the variation axis that the font covers</p></td>
+<td class="struct_member_annotations"> </td>
+</tr>
+<tr>
+<td class="struct_member_name"><p><span class="type">float</span> <em class="structfield"><code><a name="hb-ot-var-axis-info-t.default-value"></a>default_value</code></em>;</p></td>
+<td class="struct_member_description"><p>The position on the variation axis corresponding to the font's defaults</p></td>
+<td class="struct_member_annotations"> </td>
 </tr>
 <tr>
-<td class="enum_member_name"><p><a name="HB-OT-VAR-AXIS-FLAG-MAX-VALUE:CAPS"></a>_HB_OT_VAR_AXIS_FLAG_MAX_VALUE</p></td>
-<td</td>
-<td> </td>
+<td class="struct_member_name"><p><span class="type">float</span> <em class="structfield"><code><a name="hb-ot-var-axis-info-t.max-value"></a>max_value</code></em>;</p></td>
+<td class="struct_member_description"><p>The maximum value on the variation axis that the font covers</p></td>
+<td class="struct_member_annotations"> </td>
 </tr>
 </tbody>
 </table></div>
@@ -333,6 +691,6 @@ hb_ot_var_normalize_coords (<em class="parameter"><code><a class="link" href="ha
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index 6cc86d9..4a60fa8 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-set: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch12.html" title="Core API">
+<link rel="up" href="core-api.html" title="Core API">
 <link rel="prev" href="harfbuzz-hb-map.html" title="hb-map">
 <link rel="next" href="harfbuzz-hb-shape-plan.html" title="hb-shape-plan">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -18,7 +18,7 @@
                   <a href="#harfbuzz-hb-set.description" class="shortcut">Description</a></span>
 </td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><a accesskey="u" href="ch12.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="u" href="core-api.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
 <td><a accesskey="p" href="harfbuzz-hb-map.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
 <td><a accesskey="n" href="harfbuzz-hb-shape-plan.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
@@ -27,7 +27,7 @@
 <div class="refnamediv"><table width="100%"><tr>
 <td valign="top">
 <h2><span class="refentrytitle"><a name="harfbuzz-hb-set.top_of_page"></a>hb-set</span></h2>
-<p>hb-set — Object representing a set of integers</p>
+<p>hb-set — Objects representing a set of integers</p>
 </td>
 <td class="gallery_image" valign="top" align="right"></td>
 </tr></table></div>
 </tr>
 <tr>
 <td class="function_type">
+<a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="returnvalue">hb_set_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-set.html#hb-set-copy" title="hb_set_copy ()">hb_set_copy</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
 <span class="returnvalue">void</span>
 </td>
 <td class="function_name">
 </tr>
 <tr>
 <td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-set.html#hb-set-invert" title="hb_set_invert ()">hb_set_invert</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
 <a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 </td>
 <td class="function_name">
 <div class="refsect1">
 <a name="harfbuzz-hb-set.description"></a><h2>Description</h2>
 <p>Set objects represent a mathematical set of integer values.  They are
-used in non-shaping API to query certain set of characters or glyphs,
+used in non-shaping APIs to query certain sets of characters or glyphs,
 or other integer values.</p>
 </div>
 <div class="refsect1">
@@ -302,6 +318,9 @@ or other integer values.</p>
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_set_add (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a> *set</code></em>,
             <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> codepoint</code></em>);</pre>
+<p>Adds <em class="parameter"><code>codepoint</code></em>
+ to <em class="parameter"><code>set</code></em>
+.</p>
 <div class="refsect3">
 <a name="hb-set-add.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -310,11 +329,19 @@ hb_set_add (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.ht
 <col class="parameters_description">
 <col width="200px" class="parameters_annotations">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
 <td class="parameter_name"><p>set</p></td>
-<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_description"><p>A set</p></td>
 <td class="parameter_annotations"> </td>
-</tr></tbody>
+</tr>
+<tr>
+<td class="parameter_name"><p>codepoint</p></td>
+<td class="parameter_description"><p>The element to add to <em class="parameter"><code>set</code></em>
+</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
 </table></div>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
@@ -326,6 +353,11 @@ hb_set_add (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.ht
 hb_set_add_range (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a> *set</code></em>,
                   <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> first</code></em>,
                   <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> last</code></em>);</pre>
+<p>Adds all of the elements from <em class="parameter"><code>first</code></em>
+ to <em class="parameter"><code>last</code></em>
+
+(inclusive) to <em class="parameter"><code>set</code></em>
+.</p>
 <div class="refsect3">
 <a name="hb-set-add-range.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -334,11 +366,25 @@ hb_set_add_range (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 <col class="parameters_description">
 <col width="200px" class="parameters_annotations">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
 <td class="parameter_name"><p>set</p></td>
-<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_description"><p>A set</p></td>
 <td class="parameter_annotations"> </td>
-</tr></tbody>
+</tr>
+<tr>
+<td class="parameter_name"><p>first</p></td>
+<td class="parameter_description"><p>The first element to add to <em class="parameter"><code>set</code></em>
+</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>last</p></td>
+<td class="parameter_description"><p>The final element to add to <em class="parameter"><code>set</code></em>
+</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
 </table></div>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
@@ -348,6 +394,7 @@ hb_set_add_range (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 <a name="hb-set-allocation-successful"></a><h3>hb_set_allocation_successful ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 hb_set_allocation_successful (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a> *set</code></em>);</pre>
+<p>Tests whether memory allocation for a set was successful.</p>
 <div class="refsect3">
 <a name="hb-set-allocation-successful.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -358,18 +405,51 @@ hb_set_allocation_successful (<em class="parameter"><code>const <a class="link"
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>set</p></td>
-<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_description"><p>A set</p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-set-allocation-successful.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> if allocation succeeded, <code class="literal">false</code> otherwise</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
 <hr>
 <div class="refsect2">
+<a name="hb-set-copy"></a><h3>hb_set_copy ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="returnvalue">hb_set_t</span></a> *
+hb_set_copy (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a> *set</code></em>);</pre>
+<p>Allocate a copy of <em class="parameter"><code>set</code></em>
+.</p>
+<div class="refsect3">
+<a name="hb-set-copy.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>set</p></td>
+<td class="parameter_description"><p>A set</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-set-copy.returns"></a><h4>Returns</h4>
+<p> Newly-allocated set.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-8-2.html#api-index-2.8.2">2.8.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="hb-set-clear"></a><h3>hb_set_clear ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_set_clear (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a> *set</code></em>);</pre>
+<p>Clears out the contents of a set.</p>
 <div class="refsect3">
 <a name="hb-set-clear.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -380,7 +460,7 @@ hb_set_clear (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>set</p></td>
-<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_description"><p>A set</p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
@@ -392,10 +472,11 @@ hb_set_clear (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.
 <a name="hb-set-create"></a><h3>hb_set_create ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="returnvalue">hb_set_t</span></a> *
 hb_set_create (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>Creates a new, initially empty set.</p>
 <p><span class="annotation">[Xconstructor]</span></p>
 <div class="refsect3">
 <a name="hb-set-create.returns"></a><h4>Returns</h4>
-<p>. </p>
+<p>The new <a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a>. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
@@ -406,6 +487,9 @@ hb_set_create (<em class="parameter"><code><span class="type">void</span></code>
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_set_del (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a> *set</code></em>,
             <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> codepoint</code></em>);</pre>
+<p>Removes <em class="parameter"><code>codepoint</code></em>
+ from <em class="parameter"><code>set</code></em>
+.</p>
 <div class="refsect3">
 <a name="hb-set-del.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -414,11 +498,20 @@ hb_set_del (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.ht
 <col class="parameters_description">
 <col width="200px" class="parameters_annotations">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
 <td class="parameter_name"><p>set</p></td>
-<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_description"><p>A set</p></td>
 <td class="parameter_annotations"> </td>
-</tr></tbody>
+</tr>
+<tr>
+<td class="parameter_name"><p>codepoint</p></td>
+<td class="parameter_description"><p>Removes <em class="parameter"><code>codepoint</code></em>
+from <em class="parameter"><code>set</code></em>
+</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
 </table></div>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
@@ -430,6 +523,15 @@ hb_set_del (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.ht
 hb_set_del_range (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a> *set</code></em>,
                   <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> first</code></em>,
                   <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> last</code></em>);</pre>
+<p>Removes all of the elements from <em class="parameter"><code>first</code></em>
+ to <em class="parameter"><code>last</code></em>
+
+(inclusive) from <em class="parameter"><code>set</code></em>
+.</p>
+<p>If <em class="parameter"><code>last</code></em>
+ is <a class="link" href="harfbuzz-hb-set.html#HB-SET-VALUE-INVALID:CAPS" title="HB_SET_VALUE_INVALID"><span class="type">HB_SET_VALUE_INVALID</span></a>, then all values
+greater than or equal to <em class="parameter"><code>first</code></em>
+ are removed.</p>
 <div class="refsect3">
 <a name="hb-set-del-range.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -438,11 +540,25 @@ hb_set_del_range (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 <col class="parameters_description">
 <col width="200px" class="parameters_annotations">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
 <td class="parameter_name"><p>set</p></td>
-<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_description"><p>A set</p></td>
 <td class="parameter_annotations"> </td>
-</tr></tbody>
+</tr>
+<tr>
+<td class="parameter_name"><p>first</p></td>
+<td class="parameter_description"><p>The first element to remove from <em class="parameter"><code>set</code></em>
+</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>last</p></td>
+<td class="parameter_description"><p>The final element to remove from <em class="parameter"><code>set</code></em>
+</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
 </table></div>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
@@ -452,6 +568,9 @@ hb_set_del_range (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 <a name="hb-set-destroy"></a><h3>hb_set_destroy ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_set_destroy (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a> *set</code></em>);</pre>
+<p>Decreases the reference count on a set. When
+the reference count reaches zero, the set is
+destroyed, freeing all memory.</p>
 <p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
 <div class="refsect3">
 <a name="hb-set-destroy.parameters"></a><h4>Parameters</h4>
@@ -463,7 +582,7 @@ hb_set_destroy (<em class="parameter"><code><a class="link" href="harfbuzz-hb-se
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>set</p></td>
-<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_description"><p>A set</p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
@@ -475,9 +594,10 @@ hb_set_destroy (<em class="parameter"><code><a class="link" href="harfbuzz-hb-se
 <a name="hb-set-get-empty"></a><h3>hb_set_get_empty ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="returnvalue">hb_set_t</span></a> *
 hb_set_get_empty (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>Fetches the singleton empty <a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a>.</p>
 <div class="refsect3">
 <a name="hb-set-get-empty.returns"></a><h4>Returns</h4>
-<p>. </p>
+<p>The empty <a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a>. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
@@ -487,7 +607,7 @@ hb_set_get_empty (<em class="parameter"><code><span class="type">void</span></co
 <a name="hb-set-get-max"></a><h3>hb_set_get_max ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="returnvalue">hb_codepoint_t</span></a>
 hb_set_get_max (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a> *set</code></em>);</pre>
-<p>Finds the maximum number in the set.</p>
+<p>Finds the largest element in the set.</p>
 <div class="refsect3">
 <a name="hb-set-get-max.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -498,14 +618,16 @@ hb_set_get_max (<em class="parameter"><code>const <a class="link" href="harfbuzz
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>set</p></td>
-<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_description"><p>A set</p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
 </div>
 <div class="refsect3">
 <a name="hb-set-get-max.returns"></a><h4>Returns</h4>
-<p> minimum of the set, or <a class="link" href="harfbuzz-hb-set.html#HB-SET-VALUE-INVALID:CAPS" title="HB_SET_VALUE_INVALID"><code class="literal">HB_SET_VALUE_INVALID</code></a> if set is empty.</p>
+<p> maximum of <em class="parameter"><code>set</code></em>
+, or <a class="link" href="harfbuzz-hb-set.html#HB-SET-VALUE-INVALID:CAPS" title="HB_SET_VALUE_INVALID"><span class="type">HB_SET_VALUE_INVALID</span></a> if <em class="parameter"><code>set</code></em>
+is empty.</p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
 </div>
@@ -514,7 +636,7 @@ hb_set_get_max (<em class="parameter"><code>const <a class="link" href="harfbuzz
 <a name="hb-set-get-min"></a><h3>hb_set_get_min ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="returnvalue">hb_codepoint_t</span></a>
 hb_set_get_min (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a> *set</code></em>);</pre>
-<p>Finds the minimum number in the set.</p>
+<p>Finds the smallest element in the set.</p>
 <div class="refsect3">
 <a name="hb-set-get-min.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -525,14 +647,16 @@ hb_set_get_min (<em class="parameter"><code>const <a class="link" href="harfbuzz
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>set</p></td>
-<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_description"><p>A set</p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
 </div>
 <div class="refsect3">
 <a name="hb-set-get-min.returns"></a><h4>Returns</h4>
-<p> minimum of the set, or <a class="link" href="harfbuzz-hb-set.html#HB-SET-VALUE-INVALID:CAPS" title="HB_SET_VALUE_INVALID"><code class="literal">HB_SET_VALUE_INVALID</code></a> if set is empty.</p>
+<p> minimum of <em class="parameter"><code>set</code></em>
+, or <a class="link" href="harfbuzz-hb-set.html#HB-SET-VALUE-INVALID:CAPS" title="HB_SET_VALUE_INVALID"><span class="type">HB_SET_VALUE_INVALID</span></a> if <em class="parameter"><code>set</code></em>
+is empty.</p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
 </div>
@@ -541,7 +665,7 @@ hb_set_get_min (<em class="parameter"><code>const <a class="link" href="harfbuzz
 <a name="hb-set-get-population"></a><h3>hb_set_get_population ()</h3>
 <pre class="programlisting">unsigned <span class="returnvalue">int</span>
 hb_set_get_population (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a> *set</code></em>);</pre>
-<p>Returns the number of numbers in the set.</p>
+<p>Returns the number of elements in the set.</p>
 <div class="refsect3">
 <a name="hb-set-get-population.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -552,14 +676,15 @@ hb_set_get_population (<em class="parameter"><code>const <a class="link" href="h
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>set</p></td>
-<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_description"><p>A set</p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
 </div>
 <div class="refsect3">
 <a name="hb-set-get-population.returns"></a><h4>Returns</h4>
-<p> set population.</p>
+<p> The population of <em class="parameter"><code>set</code></em>
+</p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
 </div>
@@ -569,6 +694,8 @@ hb_set_get_population (<em class="parameter"><code>const <a class="link" href="h
 <pre class="programlisting"><span class="returnvalue">void</span> *
 hb_set_get_user_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a> *set</code></em>,
                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-user-data-key-t" title="hb_user_data_key_t"><span class="type">hb_user_data_key_t</span></a> *key</code></em>);</pre>
+<p>Fetches the user data associated with the specified key,
+attached to the specified set.</p>
 <p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
 <div class="refsect3">
 <a name="hb-set-get-user-data.parameters"></a><h4>Parameters</h4>
@@ -578,16 +705,23 @@ hb_set_get_user_data (<em class="parameter"><code><a class="link" href="harfbuzz
 <col class="parameters_description">
 <col width="200px" class="parameters_annotations">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
 <td class="parameter_name"><p>set</p></td>
-<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_description"><p>A set</p></td>
 <td class="parameter_annotations"> </td>
-</tr></tbody>
+</tr>
+<tr>
+<td class="parameter_name"><p>key</p></td>
+<td class="parameter_description"><p>The user-data key to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
 </table></div>
 </div>
 <div class="refsect3">
 <a name="hb-set-get-user-data.returns"></a><h4>Returns</h4>
-<p>. </p>
+<p>A pointer to the user data. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
@@ -598,6 +732,9 @@ hb_set_get_user_data (<em class="parameter"><code><a class="link" href="harfbuzz
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 hb_set_has (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a> *set</code></em>,
             <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> codepoint</code></em>);</pre>
+<p>Tests whether <em class="parameter"><code>codepoint</code></em>
+ belongs to <em class="parameter"><code>set</code></em>
+.</p>
 <div class="refsect3">
 <a name="hb-set-has.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -606,13 +743,26 @@ hb_set_has (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-
 <col class="parameters_description">
 <col width="200px" class="parameters_annotations">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
 <td class="parameter_name"><p>set</p></td>
-<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_description"><p>A set</p></td>
 <td class="parameter_annotations"> </td>
-</tr></tbody>
+</tr>
+<tr>
+<td class="parameter_name"><p>codepoint</p></td>
+<td class="parameter_description"><p>The element to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-set-has.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> if <em class="parameter"><code>codepoint</code></em>
+is in <em class="parameter"><code>set</code></em>
+, <code class="literal">false</code> otherwise</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
 <hr>
@@ -621,6 +771,10 @@ hb_set_has (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_set_intersect (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a> *set</code></em>,
                   <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a> *other</code></em>);</pre>
+<p>Makes <em class="parameter"><code>set</code></em>
+ the intersection of <em class="parameter"><code>set</code></em>
+ and <em class="parameter"><code>other</code></em>
+.</p>
 <div class="refsect3">
 <a name="hb-set-intersect.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -629,20 +783,52 @@ hb_set_intersect (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 <col class="parameters_description">
 <col width="200px" class="parameters_annotations">
 </colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>set</p></td>
+<td class="parameter_description"><p>A set</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>other</p></td>
+<td class="parameter_description"><p>Another set</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-set-invert"></a><h3>hb_set_invert ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_set_invert (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a> *set</code></em>);</pre>
+<p>Inverts the contents of <em class="parameter"><code>set</code></em>
+.</p>
+<div class="refsect3">
+<a name="hb-set-invert.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>set</p></td>
-<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_description"><p>A set</p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
 </div>
-<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+<p class="since">Since: <a class="link" href="api-index-3-0-0.html#api-index-3.0.0">3.0.0</a></p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="hb-set-is-empty"></a><h3>hb_set_is_empty ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 hb_set_is_empty (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a> *set</code></em>);</pre>
+<p>Tests whether a set is empty (contains no elements).</p>
 <div class="refsect3">
 <a name="hb-set-is-empty.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -658,6 +844,11 @@ hb_set_is_empty (<em class="parameter"><code>const <a class="link" href="harfbuz
 </tr></tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-set-is-empty.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> if <em class="parameter"><code>set</code></em>
+is empty</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
 </div>
 <hr>
@@ -666,6 +857,10 @@ hb_set_is_empty (<em class="parameter"><code>const <a class="link" href="harfbuz
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 hb_set_is_equal (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a> *set</code></em>,
                  <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a> *other</code></em>);</pre>
+<p>Tests whether <em class="parameter"><code>set</code></em>
+ and <em class="parameter"><code>other</code></em>
+ are equal (contain the same
+elements).</p>
 <div class="refsect3">
 <a name="hb-set-is-equal.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -677,12 +872,12 @@ hb_set_is_equal (<em class="parameter"><code>const <a class="link" href="harfbuz
 <tbody>
 <tr>
 <td class="parameter_name"><p>set</p></td>
-<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_description"><p>A set</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>other</p></td>
-<td class="parameter_description"><p>other set.</p></td>
+<td class="parameter_description"><p>Another set</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 </tbody>
@@ -690,7 +885,7 @@ hb_set_is_equal (<em class="parameter"><code>const <a class="link" href="harfbuz
 </div>
 <div class="refsect3">
 <a name="hb-set-is-equal.returns"></a><h4>Returns</h4>
-<p> <a href="/usr/share/gtk-doc/html/glib/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the two sets are equal, <a href="/usr/share/gtk-doc/html/glib/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise.</p>
+<p> <code class="literal">true</code> if the two sets are equal, <code class="literal">false</code> otherwise.</p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
 </div>
@@ -700,6 +895,9 @@ hb_set_is_equal (<em class="parameter"><code>const <a class="link" href="harfbuz
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 hb_set_is_subset (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a> *set</code></em>,
                   <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a> *larger_set</code></em>);</pre>
+<p>Tests whether <em class="parameter"><code>set</code></em>
+ is a subset of <em class="parameter"><code>larger_set</code></em>
+.</p>
 <div class="refsect3">
 <a name="hb-set-is-subset.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -711,12 +909,12 @@ hb_set_is_subset (<em class="parameter"><code>const <a class="link" href="harfbu
 <tbody>
 <tr>
 <td class="parameter_name"><p>set</p></td>
-<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_description"><p>A set</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>larger_set</p></td>
-<td class="parameter_description"><p>other set.</p></td>
+<td class="parameter_description"><p>Another set</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 </tbody>
@@ -724,9 +922,9 @@ hb_set_is_subset (<em class="parameter"><code>const <a class="link" href="harfbu
 </div>
 <div class="refsect3">
 <a name="hb-set-is-subset.returns"></a><h4>Returns</h4>
-<p> <a href="/usr/share/gtk-doc/html/glib/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the <em class="parameter"><code>set</code></em>
+<p> <code class="literal">true</code> if the <em class="parameter"><code>set</code></em>
 is a subset of (or equal to) <em class="parameter"><code>larger_set</code></em>
-, <a href="/usr/share/gtk-doc/html/glib/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise.</p>
+, <code class="literal">false</code> otherwise.</p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-1-8-1.html#api-index-1.8.1">1.8.1</a></p>
 </div>
@@ -736,11 +934,11 @@ is a subset of (or equal to) <em class="parameter"><code>larger_set</code></em>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 hb_set_next (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a> *set</code></em>,
              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *codepoint</code></em>);</pre>
-<p>Gets the next number in <em class="parameter"><code>set</code></em>
+<p>Fetches the next element in <em class="parameter"><code>set</code></em>
  that is greater than current value of <em class="parameter"><code>codepoint</code></em>
 .</p>
 <p>Set <em class="parameter"><code>codepoint</code></em>
- to <a class="link" href="harfbuzz-hb-set.html#HB-SET-VALUE-INVALID:CAPS" title="HB_SET_VALUE_INVALID"><code class="literal">HB_SET_VALUE_INVALID</code></a> to get started.</p>
+ to <a class="link" href="harfbuzz-hb-set.html#HB-SET-VALUE-INVALID:CAPS" title="HB_SET_VALUE_INVALID"><span class="type">HB_SET_VALUE_INVALID</span></a> to get started.</p>
 <div class="refsect3">
 <a name="hb-set-next.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -752,12 +950,13 @@ hb_set_next (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb
 <tbody>
 <tr>
 <td class="parameter_name"><p>set</p></td>
-<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_description"><p>A set</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>codepoint</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>Input = Code point to query
+Output = Code point retrieved. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>]</span></td>
 </tr>
 </tbody>
@@ -765,7 +964,7 @@ hb_set_next (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb
 </div>
 <div class="refsect3">
 <a name="hb-set-next.returns"></a><h4>Returns</h4>
-<p> whether there was a next value.</p>
+<p> <code class="literal">true</code> if there was a next value, <code class="literal">false</code> otherwise</p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
@@ -776,12 +975,12 @@ hb_set_next (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb
 hb_set_next_range (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a> *set</code></em>,
                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *first</code></em>,
                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *last</code></em>);</pre>
-<p>Gets the next consecutive range of numbers in <em class="parameter"><code>set</code></em>
+<p>Fetches the next consecutive range of elements in <em class="parameter"><code>set</code></em>
  that
 are greater than current value of <em class="parameter"><code>last</code></em>
 .</p>
 <p>Set <em class="parameter"><code>last</code></em>
- to <a class="link" href="harfbuzz-hb-set.html#HB-SET-VALUE-INVALID:CAPS" title="HB_SET_VALUE_INVALID"><code class="literal">HB_SET_VALUE_INVALID</code></a> to get started.</p>
+ to <a class="link" href="harfbuzz-hb-set.html#HB-SET-VALUE-INVALID:CAPS" title="HB_SET_VALUE_INVALID"><span class="type">HB_SET_VALUE_INVALID</span></a> to get started.</p>
 <div class="refsect3">
 <a name="hb-set-next-range.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -793,17 +992,18 @@ are greater than current value of <em class="parameter"><code>last</code></em>
 <tbody>
 <tr>
 <td class="parameter_name"><p>set</p></td>
-<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_description"><p>A set</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>first</p></td>
-<td class="parameter_description"><p>output first codepoint in the range. </p></td>
+<td class="parameter_description"><p>The first code point in the range. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>last</p></td>
-<td class="parameter_description"><p>input current last and output last codepoint in the range. </p></td>
+<td class="parameter_description"><p>Input = The current last code point in the range
+Output = The last code point in the range. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>]</span></td>
 </tr>
 </tbody>
@@ -811,7 +1011,7 @@ are greater than current value of <em class="parameter"><code>last</code></em>
 </div>
 <div class="refsect3">
 <a name="hb-set-next-range.returns"></a><h4>Returns</h4>
-<p> whether there was a next range.</p>
+<p> <code class="literal">true</code> if there was a next range, <code class="literal">false</code> otherwise</p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
 </div>
@@ -821,11 +1021,11 @@ are greater than current value of <em class="parameter"><code>last</code></em>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 hb_set_previous (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a> *set</code></em>,
                  <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *codepoint</code></em>);</pre>
-<p>Gets the previous number in <em class="parameter"><code>set</code></em>
+<p>Fetches the previous element in <em class="parameter"><code>set</code></em>
  that is lower than current value of <em class="parameter"><code>codepoint</code></em>
 .</p>
 <p>Set <em class="parameter"><code>codepoint</code></em>
- to <a class="link" href="harfbuzz-hb-set.html#HB-SET-VALUE-INVALID:CAPS" title="HB_SET_VALUE_INVALID"><code class="literal">HB_SET_VALUE_INVALID</code></a> to get started.</p>
+ to <a class="link" href="harfbuzz-hb-set.html#HB-SET-VALUE-INVALID:CAPS" title="HB_SET_VALUE_INVALID"><span class="type">HB_SET_VALUE_INVALID</span></a> to get started.</p>
 <div class="refsect3">
 <a name="hb-set-previous.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -837,12 +1037,13 @@ hb_set_previous (<em class="parameter"><code>const <a class="link" href="harfbuz
 <tbody>
 <tr>
 <td class="parameter_name"><p>set</p></td>
-<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_description"><p>A set</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>codepoint</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>Input = Code point to query
+Output = Code point retrieved. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>]</span></td>
 </tr>
 </tbody>
@@ -850,7 +1051,7 @@ hb_set_previous (<em class="parameter"><code>const <a class="link" href="harfbuz
 </div>
 <div class="refsect3">
 <a name="hb-set-previous.returns"></a><h4>Returns</h4>
-<p> whether there was a previous value.</p>
+<p> <code class="literal">true</code> if there was a previous value, <code class="literal">false</code> otherwise</p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-1-8-0.html#api-index-1.8.0">1.8.0</a></p>
 </div>
@@ -861,12 +1062,12 @@ hb_set_previous (<em class="parameter"><code>const <a class="link" href="harfbuz
 hb_set_previous_range (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a> *set</code></em>,
                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *first</code></em>,
                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *last</code></em>);</pre>
-<p>Gets the previous consecutive range of numbers in <em class="parameter"><code>set</code></em>
+<p>Fetches the previous consecutive range of elements in <em class="parameter"><code>set</code></em>
  that
-are less than current value of <em class="parameter"><code>first</code></em>
+are greater than current value of <em class="parameter"><code>last</code></em>
 .</p>
 <p>Set <em class="parameter"><code>first</code></em>
- to <a class="link" href="harfbuzz-hb-set.html#HB-SET-VALUE-INVALID:CAPS" title="HB_SET_VALUE_INVALID"><code class="literal">HB_SET_VALUE_INVALID</code></a> to get started.</p>
+ to <a class="link" href="harfbuzz-hb-set.html#HB-SET-VALUE-INVALID:CAPS" title="HB_SET_VALUE_INVALID"><span class="type">HB_SET_VALUE_INVALID</span></a> to get started.</p>
 <div class="refsect3">
 <a name="hb-set-previous-range.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -878,17 +1079,18 @@ are less than current value of <em class="parameter"><code>first</code></em>
 <tbody>
 <tr>
 <td class="parameter_name"><p>set</p></td>
-<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_description"><p>A set</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>first</p></td>
-<td class="parameter_description"><p>input current first and output first codepoint in the range. </p></td>
+<td class="parameter_description"><p>Input = The current first code point in the range
+Output = The first code point in the range. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>]</span></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>last</p></td>
-<td class="parameter_description"><p>output last codepoint in the range. </p></td>
+<td class="parameter_description"><p>The last code point in the range. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
 </tr>
 </tbody>
@@ -896,7 +1098,7 @@ are less than current value of <em class="parameter"><code>first</code></em>
 </div>
 <div class="refsect3">
 <a name="hb-set-previous-range.returns"></a><h4>Returns</h4>
-<p> whether there was a previous range.</p>
+<p> <code class="literal">true</code> if there was a previous range, <code class="literal">false</code> otherwise</p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-1-8-0.html#api-index-1.8.0">1.8.0</a></p>
 </div>
@@ -905,6 +1107,7 @@ are less than current value of <em class="parameter"><code>first</code></em>
 <a name="hb-set-reference"></a><h3>hb_set_reference ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="returnvalue">hb_set_t</span></a> *
 hb_set_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a> *set</code></em>);</pre>
+<p>Increases the reference count on a set.</p>
 <p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
 <div class="refsect3">
 <a name="hb-set-reference.parameters"></a><h4>Parameters</h4>
@@ -916,14 +1119,14 @@ hb_set_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>set</p></td>
-<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_description"><p>A set</p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
 </div>
 <div class="refsect3">
 <a name="hb-set-reference.returns"></a><h4>Returns</h4>
-<p>. </p>
+<p>The set. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
@@ -934,6 +1137,9 @@ hb_set_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_set_set (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a> *set</code></em>,
             <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a> *other</code></em>);</pre>
+<p>Makes the contents of <em class="parameter"><code>set</code></em>
+ equal to the contents of <em class="parameter"><code>other</code></em>
+.</p>
 <div class="refsect3">
 <a name="hb-set-set.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -942,11 +1148,18 @@ hb_set_set (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.ht
 <col class="parameters_description">
 <col width="200px" class="parameters_annotations">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
 <td class="parameter_name"><p>set</p></td>
-<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_description"><p>A set</p></td>
 <td class="parameter_annotations"> </td>
-</tr></tbody>
+</tr>
+<tr>
+<td class="parameter_name"><p>other</p></td>
+<td class="parameter_description"><p>Another set</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
 </table></div>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
@@ -960,6 +1173,7 @@ hb_set_set_user_data (<em class="parameter"><code><a class="link" href="harfbuzz
                       <em class="parameter"><code><span class="type">void</span> *data</code></em>,
                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>,
                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="type">hb_bool_t</span></a> replace</code></em>);</pre>
+<p>Attaches a user-data key/data pair to the specified set.</p>
 <p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
 <div class="refsect3">
 <a name="hb-set-set-user-data.parameters"></a><h4>Parameters</h4>
@@ -969,13 +1183,40 @@ hb_set_set_user_data (<em class="parameter"><code><a class="link" href="harfbuzz
 <col class="parameters_description">
 <col width="200px" class="parameters_annotations">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
 <td class="parameter_name"><p>set</p></td>
-<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_description"><p>A set</p></td>
 <td class="parameter_annotations"> </td>
-</tr></tbody>
+</tr>
+<tr>
+<td class="parameter_name"><p>key</p></td>
+<td class="parameter_description"><p>The user-data key to set</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>data</p></td>
+<td class="parameter_description"><p>A pointer to the user data to set</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>destroy</p></td>
+<td class="parameter_description"><p>A callback to call when <em class="parameter"><code>data</code></em>
+is not needed anymore. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>replace</p></td>
+<td class="parameter_description"><p>Whether to replace an existing data with the same key</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-set-set-user-data.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> if success, <code class="literal">false</code> otherwise</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
 <hr>
@@ -984,6 +1225,9 @@ hb_set_set_user_data (<em class="parameter"><code><a class="link" href="harfbuzz
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_set_subtract (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a> *set</code></em>,
                  <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a> *other</code></em>);</pre>
+<p>Subtracts the contents of <em class="parameter"><code>other</code></em>
+ from <em class="parameter"><code>set</code></em>
+.</p>
 <div class="refsect3">
 <a name="hb-set-subtract.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -992,11 +1236,18 @@ hb_set_subtract (<em class="parameter"><code><a class="link" href="harfbuzz-hb-s
 <col class="parameters_description">
 <col width="200px" class="parameters_annotations">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
 <td class="parameter_name"><p>set</p></td>
-<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_description"><p>A set</p></td>
 <td class="parameter_annotations"> </td>
-</tr></tbody>
+</tr>
+<tr>
+<td class="parameter_name"><p>other</p></td>
+<td class="parameter_description"><p>Another set</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
 </table></div>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
@@ -1007,6 +1258,11 @@ hb_set_subtract (<em class="parameter"><code><a class="link" href="harfbuzz-hb-s
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_set_symmetric_difference (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a> *set</code></em>,
                              <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a> *other</code></em>);</pre>
+<p>Makes <em class="parameter"><code>set</code></em>
+ the symmetric difference of <em class="parameter"><code>set</code></em>
+
+and <em class="parameter"><code>other</code></em>
+.</p>
 <div class="refsect3">
 <a name="hb-set-symmetric-difference.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -1015,11 +1271,18 @@ hb_set_symmetric_difference (<em class="parameter"><code><a class="link" href="h
 <col class="parameters_description">
 <col width="200px" class="parameters_annotations">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
 <td class="parameter_name"><p>set</p></td>
-<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_description"><p>A set</p></td>
 <td class="parameter_annotations"> </td>
-</tr></tbody>
+</tr>
+<tr>
+<td class="parameter_name"><p>other</p></td>
+<td class="parameter_description"><p>Another set</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
 </table></div>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
@@ -1030,6 +1293,10 @@ hb_set_symmetric_difference (<em class="parameter"><code><a class="link" href="h
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_set_union (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a> *set</code></em>,
               <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a> *other</code></em>);</pre>
+<p>Makes <em class="parameter"><code>set</code></em>
+ the union of <em class="parameter"><code>set</code></em>
+ and <em class="parameter"><code>other</code></em>
+.</p>
 <div class="refsect3">
 <a name="hb-set-union.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -1038,11 +1305,18 @@ hb_set_union (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.
 <col class="parameters_description">
 <col width="200px" class="parameters_annotations">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
 <td class="parameter_name"><p>set</p></td>
-<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_description"><p>A set</p></td>
 <td class="parameter_annotations"> </td>
-</tr></tbody>
+</tr>
+<tr>
+<td class="parameter_name"><p>other</p></td>
+<td class="parameter_description"><p>Another set</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
 </table></div>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
@@ -1054,16 +1328,23 @@ hb_set_union (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.
 <a name="HB-SET-VALUE-INVALID:CAPS"></a><h3>HB_SET_VALUE_INVALID</h3>
 <pre class="programlisting">#define HB_SET_VALUE_INVALID ((hb_codepoint_t) -1)
 </pre>
+<p>Unset <a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a> value.</p>
+<p class="since">Since: <a class="link" href="api-index-0-9-21.html#api-index-0.9.21">0.9.21</a></p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="hb-set-t"></a><h3>hb_set_t</h3>
 <pre class="programlisting">typedef struct hb_set_t hb_set_t;
 </pre>
+<p>Data type for holding a set of integers. <a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a>'s are
+used to gather and contain glyph IDs, Unicode code
+points, and various other collections of discrete
+
+values.</p>
 </div>
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index e4d2ea8..92f316c 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-shape-plan: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch12.html" title="Core API">
+<link rel="up" href="core-api.html" title="Core API">
 <link rel="prev" href="harfbuzz-hb-set.html" title="hb-set">
 <link rel="next" href="harfbuzz-hb-shape.html" title="hb-shape">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -18,7 +18,7 @@
                   <a href="#harfbuzz-hb-shape-plan.description" class="shortcut">Description</a></span>
 </td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><a accesskey="u" href="ch12.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="u" href="core-api.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
 <td><a accesskey="p" href="harfbuzz-hb-set.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
 <td><a accesskey="n" href="harfbuzz-hb-shape.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 </div>
 <div class="refsect1">
 <a name="harfbuzz-hb-shape-plan.description"></a><h2>Description</h2>
-<p>Shape plans are not used for shaping directly, but can be access to query
-certain information about how shaping will perform given a set of input
-parameters (script, language, direction, features, etc.)
-Most client would not need to deal with shape plans directly.</p>
+<p>Shape plans are an internal mechanism. Each plan contains state
+describing how HarfBuzz will shape a particular text segment, based on
+the combination of segment properties and the capabilities in the
+font face in use.</p>
+<p>Shape plans are not used for shaping directly, but can be queried to
+access certain information about how shaping will perform, given a set
+of specific input parameters (script, language, direction, features,
+etc.).</p>
+<p>Most client programs will not need to deal with shape plans directly.</p>
 </div>
 <div class="refsect1">
 <a name="harfbuzz-hb-shape-plan.functions_details"></a><h2>Functions</h2>
@@ -164,6 +169,12 @@ hb_shape_plan_create (<em class="parameter"><code><a class="link" href="harfbuzz
                       <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-common.html#hb-feature-t" title="hb_feature_t"><span class="type">hb_feature_t</span></a> *user_features</code></em>,
                       <em class="parameter"><code>unsigned <span class="type">int</span> num_user_features</code></em>,
                       <em class="parameter"><code>const <span class="type">char</span> * const *shaper_list</code></em>);</pre>
+<p>Constructs a shaping plan for a combination of <em class="parameter"><code>face</code></em>
+, <em class="parameter"><code>user_features</code></em>
+, <em class="parameter"><code>props</code></em>
+,
+and <em class="parameter"><code>shaper_list</code></em>
+.</p>
 <p><span class="annotation">[Xconstructor]</span></p>
 <div class="refsect3">
 <a name="hb-shape-plan-create.parameters"></a><h4>Parameters</h4>
@@ -175,13 +186,28 @@ hb_shape_plan_create (<em class="parameter"><code><a class="link" href="harfbuzz
 </colgroup>
 <tbody>
 <tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> to use</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>props</p></td>
+<td class="parameter_description"><p>The <a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-t" title="hb_segment_properties_t"><span class="type">hb_segment_properties_t</span></a> of the segment</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
 <td class="parameter_name"><p>user_features</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The list of user-selected features. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=num_user_features]</span></td>
 </tr>
 <tr>
+<td class="parameter_name"><p>num_user_features</p></td>
+<td class="parameter_description"><p>The number of user-selected features</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
 <td class="parameter_name"><p>shaper_list</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>List of shapers to try. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> zero-terminated=1]</span></td>
 </tr>
 </tbody>
@@ -189,7 +215,7 @@ hb_shape_plan_create (<em class="parameter"><code><a class="link" href="harfbuzz
 </div>
 <div class="refsect3">
 <a name="hb-shape-plan-create.returns"></a><h4>Returns</h4>
-<p>. </p>
+<p>The shaping plan. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
@@ -203,6 +229,12 @@ hb_shape_plan_create_cached (<em class="parameter"><code><a class="link" href="h
                              <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-common.html#hb-feature-t" title="hb_feature_t"><span class="type">hb_feature_t</span></a> *user_features</code></em>,
                              <em class="parameter"><code>unsigned <span class="type">int</span> num_user_features</code></em>,
                              <em class="parameter"><code>const <span class="type">char</span> * const *shaper_list</code></em>);</pre>
+<p>Creates a cached shaping plan suitable for reuse, for a combination
+of <em class="parameter"><code>face</code></em>
+, <em class="parameter"><code>user_features</code></em>
+, <em class="parameter"><code>props</code></em>
+, and <em class="parameter"><code>shaper_list</code></em>
+.</p>
 <div class="refsect3">
 <a name="hb-shape-plan-create-cached.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -213,13 +245,28 @@ hb_shape_plan_create_cached (<em class="parameter"><code><a class="link" href="h
 </colgroup>
 <tbody>
 <tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> to use</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>props</p></td>
+<td class="parameter_description"><p>The <a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-t" title="hb_segment_properties_t"><span class="type">hb_segment_properties_t</span></a> of the segment</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
 <td class="parameter_name"><p>user_features</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The list of user-selected features. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=num_user_features]</span></td>
 </tr>
 <tr>
+<td class="parameter_name"><p>num_user_features</p></td>
+<td class="parameter_description"><p>The number of user-selected features</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
 <td class="parameter_name"><p>shaper_list</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>List of shapers to try. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> zero-terminated=1]</span></td>
 </tr>
 </tbody>
@@ -227,7 +274,7 @@ hb_shape_plan_create_cached (<em class="parameter"><code><a class="link" href="h
 </div>
 <div class="refsect3">
 <a name="hb-shape-plan-create-cached.returns"></a><h4>Returns</h4>
-<p>. </p>
+<p>The shaping plan. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
@@ -243,6 +290,68 @@ hb_shape_plan_create2 (<em class="parameter"><code><a class="link" href="harfbuz
                        <em class="parameter"><code>const <span class="type">int</span> *coords</code></em>,
                        <em class="parameter"><code>unsigned <span class="type">int</span> num_coords</code></em>,
                        <em class="parameter"><code>const <span class="type">char</span> * const *shaper_list</code></em>);</pre>
+<p>The variable-font version of <a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-create" title="hb_shape_plan_create ()"><span class="type">hb_shape_plan_create</span></a>. 
+Constructs a shaping plan for a combination of <em class="parameter"><code>face</code></em>
+, <em class="parameter"><code>user_features</code></em>
+, <em class="parameter"><code>props</code></em>
+,
+and <em class="parameter"><code>shaper_list</code></em>
+, plus the variation-space coordinates <em class="parameter"><code>coords</code></em>
+.</p>
+<p><span class="annotation">[Xconstructor]</span></p>
+<div class="refsect3">
+<a name="hb-shape-plan-create2.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> to use</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>props</p></td>
+<td class="parameter_description"><p>The <a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-t" title="hb_segment_properties_t"><span class="type">hb_segment_properties_t</span></a> of the segment</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_features</p></td>
+<td class="parameter_description"><p>The list of user-selected features. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=num_user_features]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>num_user_features</p></td>
+<td class="parameter_description"><p>The number of user-selected features</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>coords</p></td>
+<td class="parameter_description"><p>The list of variation-space coordinates. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=num_coords]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>num_coords</p></td>
+<td class="parameter_description"><p>The number of variation-space coordinates</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>shaper_list</p></td>
+<td class="parameter_description"><p>List of shapers to try. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> zero-terminated=1]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-shape-plan-create2.returns"></a><h4>Returns</h4>
+<p>The shaping plan. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-4-0.html#api-index-1.4.0">1.4.0</a></p>
 </div>
 <hr>
 <div class="refsect2">
@@ -255,12 +364,77 @@ hb_shape_plan_create_cached2 (<em class="parameter"><code><a class="link" href="
                               <em class="parameter"><code>const <span class="type">int</span> *coords</code></em>,
                               <em class="parameter"><code>unsigned <span class="type">int</span> num_coords</code></em>,
                               <em class="parameter"><code>const <span class="type">char</span> * const *shaper_list</code></em>);</pre>
+<p>The variable-font version of <a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-create-cached" title="hb_shape_plan_create_cached ()"><span class="type">hb_shape_plan_create_cached</span></a>. 
+Creates a cached shaping plan suitable for reuse, for a combination
+of <em class="parameter"><code>face</code></em>
+, <em class="parameter"><code>user_features</code></em>
+, <em class="parameter"><code>props</code></em>
+, and <em class="parameter"><code>shaper_list</code></em>
+, plus the
+variation-space coordinates <em class="parameter"><code>coords</code></em>
+.</p>
+<div class="refsect3">
+<a name="hb-shape-plan-create-cached2.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> to use</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>props</p></td>
+<td class="parameter_description"><p>The <a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-t" title="hb_segment_properties_t"><span class="type">hb_segment_properties_t</span></a> of the segment</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_features</p></td>
+<td class="parameter_description"><p>The list of user-selected features. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=num_user_features]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>num_user_features</p></td>
+<td class="parameter_description"><p>The number of user-selected features</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>coords</p></td>
+<td class="parameter_description"><p>The list of variation-space coordinates. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=num_coords]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>num_coords</p></td>
+<td class="parameter_description"><p>The number of variation-space coordinates</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>shaper_list</p></td>
+<td class="parameter_description"><p>List of shapers to try. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> zero-terminated=1]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-shape-plan-create-cached2.returns"></a><h4>Returns</h4>
+<p>The shaping plan. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-4-0.html#api-index-1.4.0">1.4.0</a></p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="hb-shape-plan-destroy"></a><h3>hb_shape_plan_destroy ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_shape_plan_destroy (<em class="parameter"><code><a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t" title="hb_shape_plan_t"><span class="type">hb_shape_plan_t</span></a> *shape_plan</code></em>);</pre>
+<p>Decreases the reference count on the given shaping plan. When the
+reference count reaches zero, the shaping plan is destroyed,
+freeing all memory.</p>
 <p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
 <div class="refsect3">
 <a name="hb-shape-plan-destroy.parameters"></a><h4>Parameters</h4>
@@ -272,7 +446,7 @@ hb_shape_plan_destroy (<em class="parameter"><code><a class="link" href="harfbuz
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>shape_plan</p></td>
-<td class="parameter_description"><p>a shape plan.</p></td>
+<td class="parameter_description"><p>A shaping plan</p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
@@ -288,6 +462,10 @@ hb_shape_plan_execute (<em class="parameter"><code><a class="link" href="harfbuz
                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
                        <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-common.html#hb-feature-t" title="hb_feature_t"><span class="type">hb_feature_t</span></a> *features</code></em>,
                        <em class="parameter"><code>unsigned <span class="type">int</span> num_features</code></em>);</pre>
+<p>Executes the given shaping plan on the specified buffer, using
+the given <em class="parameter"><code>font</code></em>
+ and <em class="parameter"><code>features</code></em>
+.</p>
 <div class="refsect3">
 <a name="hb-shape-plan-execute.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -299,27 +477,36 @@ hb_shape_plan_execute (<em class="parameter"><code><a class="link" href="harfbuz
 <tbody>
 <tr>
 <td class="parameter_name"><p>shape_plan</p></td>
-<td class="parameter_description"><p>a shape plan.</p></td>
+<td class="parameter_description"><p>A shaping plan</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>font</p></td>
-<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_description"><p>The <a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> to use</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>buffer</p></td>
-<td class="parameter_description"><p>a buffer.</p></td>
+<td class="parameter_description"><p>The <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a> to work upon</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>features</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>Features to enable. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=num_features]</span></td>
 </tr>
+<tr>
+<td class="parameter_name"><p>num_features</p></td>
+<td class="parameter_description"><p>The number of features to enable</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
 </tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-shape-plan-execute.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> if success, <code class="literal">false</code> otherwise.</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
 </div>
 <hr>
@@ -327,9 +514,10 @@ hb_shape_plan_execute (<em class="parameter"><code><a class="link" href="harfbuz
 <a name="hb-shape-plan-get-empty"></a><h3>hb_shape_plan_get_empty ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t" title="hb_shape_plan_t"><span class="returnvalue">hb_shape_plan_t</span></a> *
 hb_shape_plan_get_empty (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>Fetches the singleton empty shaping plan.</p>
 <div class="refsect3">
 <a name="hb-shape-plan-get-empty.returns"></a><h4>Returns</h4>
-<p>. </p>
+<p>The empty shaping plan. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
@@ -339,6 +527,7 @@ hb_shape_plan_get_empty (<em class="parameter"><code><span class="type">void</sp
 <a name="hb-shape-plan-get-shaper"></a><h3>hb_shape_plan_get_shaper ()</h3>
 <pre class="programlisting">const <span class="returnvalue">char</span> *
 hb_shape_plan_get_shaper (<em class="parameter"><code><a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t" title="hb_shape_plan_t"><span class="type">hb_shape_plan_t</span></a> *shape_plan</code></em>);</pre>
+<p>Fetches the shaper from a given shaping plan.</p>
 <div class="refsect3">
 <a name="hb-shape-plan-get-shaper.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -349,14 +538,14 @@ hb_shape_plan_get_shaper (<em class="parameter"><code><a class="link" href="harf
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>shape_plan</p></td>
-<td class="parameter_description"><p>a shape plan.</p></td>
+<td class="parameter_description"><p>A shaping plan</p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
 </div>
 <div class="refsect3">
 <a name="hb-shape-plan-get-shaper.returns"></a><h4>Returns</h4>
-<p>. </p>
+<p>The shaper. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
@@ -367,6 +556,8 @@ hb_shape_plan_get_shaper (<em class="parameter"><code><a class="link" href="harf
 <pre class="programlisting"><span class="returnvalue">void</span> *
 hb_shape_plan_get_user_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t" title="hb_shape_plan_t"><span class="type">hb_shape_plan_t</span></a> *shape_plan</code></em>,
                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-user-data-key-t" title="hb_user_data_key_t"><span class="type">hb_user_data_key_t</span></a> *key</code></em>);</pre>
+<p>Fetches the user data associated with the specified key, 
+attached to the specified shaping plan.</p>
 <p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
 <div class="refsect3">
 <a name="hb-shape-plan-get-user-data.parameters"></a><h4>Parameters</h4>
@@ -376,16 +567,23 @@ hb_shape_plan_get_user_data (<em class="parameter"><code><a class="link" href="h
 <col class="parameters_description">
 <col width="200px" class="parameters_annotations">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
 <td class="parameter_name"><p>shape_plan</p></td>
-<td class="parameter_description"><p>a shape plan.</p></td>
+<td class="parameter_description"><p>A shaping plan</p></td>
 <td class="parameter_annotations"> </td>
-</tr></tbody>
+</tr>
+<tr>
+<td class="parameter_name"><p>key</p></td>
+<td class="parameter_description"><p>The user-data key to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
 </table></div>
 </div>
 <div class="refsect3">
 <a name="hb-shape-plan-get-user-data.returns"></a><h4>Returns</h4>
-<p>. </p>
+<p>A pointer to the user data. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
@@ -395,6 +593,7 @@ hb_shape_plan_get_user_data (<em class="parameter"><code><a class="link" href="h
 <a name="hb-shape-plan-reference"></a><h3>hb_shape_plan_reference ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t" title="hb_shape_plan_t"><span class="returnvalue">hb_shape_plan_t</span></a> *
 hb_shape_plan_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t" title="hb_shape_plan_t"><span class="type">hb_shape_plan_t</span></a> *shape_plan</code></em>);</pre>
+<p>Increases the reference count on the given shaping plan.</p>
 <p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
 <div class="refsect3">
 <a name="hb-shape-plan-reference.parameters"></a><h4>Parameters</h4>
@@ -406,14 +605,15 @@ hb_shape_plan_reference (<em class="parameter"><code><a class="link" href="harfb
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>shape_plan</p></td>
-<td class="parameter_description"><p>a shape plan.</p></td>
+<td class="parameter_description"><p>A shaping plan</p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
 </div>
 <div class="refsect3">
 <a name="hb-shape-plan-reference.returns"></a><h4>Returns</h4>
-<p>. </p>
+<p><em class="parameter"><code>shape_plan</code></em>
+. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
@@ -427,6 +627,7 @@ hb_shape_plan_set_user_data (<em class="parameter"><code><a class="link" href="h
                              <em class="parameter"><code><span class="type">void</span> *data</code></em>,
                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>,
                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="type">hb_bool_t</span></a> replace</code></em>);</pre>
+<p>Attaches a user-data key/data pair to the given shaping plan.</p>
 <p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
 <div class="refsect3">
 <a name="hb-shape-plan-set-user-data.parameters"></a><h4>Parameters</h4>
@@ -436,13 +637,40 @@ hb_shape_plan_set_user_data (<em class="parameter"><code><a class="link" href="h
 <col class="parameters_description">
 <col width="200px" class="parameters_annotations">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
 <td class="parameter_name"><p>shape_plan</p></td>
-<td class="parameter_description"><p>a shape plan.</p></td>
+<td class="parameter_description"><p>A shaping plan</p></td>
 <td class="parameter_annotations"> </td>
-</tr></tbody>
+</tr>
+<tr>
+<td class="parameter_name"><p>key</p></td>
+<td class="parameter_description"><p>The user-data key to set</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>data</p></td>
+<td class="parameter_description"><p>A pointer to the user data</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>destroy</p></td>
+<td class="parameter_description"><p>A callback to call when <em class="parameter"><code>data</code></em>
+is not needed anymore. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>replace</p></td>
+<td class="parameter_description"><p>Whether to replace an existing data with the same key</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-shape-plan-set-user-data.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> if success, <code class="literal">false</code> otherwise.</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-7.html#api-index-0.9.7">0.9.7</a></p>
 </div>
 </div>
@@ -452,10 +680,17 @@ hb_shape_plan_set_user_data (<em class="parameter"><code><a class="link" href="h
 <a name="hb-shape-plan-t"></a><h3>hb_shape_plan_t</h3>
 <pre class="programlisting">typedef struct hb_shape_plan_t hb_shape_plan_t;
 </pre>
+<p>Data type for holding a shaping plan. </p>
+<p>Shape plans contain information about how HarfBuzz will shape a
+particular text segment, based on the segment's properties and the
+capabilities in the font face in use.</p>
+<p>Shape plans can be queried about how shaping will perform, given a set
+of specific input parameters (script, language, direction, features,
+etc.).</p>
 </div>
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index 3e980ee..5ea14ea 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-shape: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch12.html" title="Core API">
+<link rel="up" href="core-api.html" title="Core API">
 <link rel="prev" href="harfbuzz-hb-shape-plan.html" title="hb-shape-plan">
 <link rel="next" href="harfbuzz-hb-unicode.html" title="hb-unicode">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -18,7 +18,7 @@
                   <a href="#harfbuzz-hb-shape.description" class="shortcut">Description</a></span>
 </td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><a accesskey="u" href="ch12.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="u" href="core-api.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
 <td><a accesskey="p" href="harfbuzz-hb-shape-plan.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
 <td><a accesskey="n" href="harfbuzz-hb-unicode.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
@@ -90,7 +90,7 @@ hb_shape (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.htm
  using <em class="parameter"><code>font</code></em>
  turning its Unicode characters content to
 positioned glyphs. If <em class="parameter"><code>features</code></em>
- is not <a href="/usr/share/gtk-doc/html/glib/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>, it will be used to control the
+ is not <code class="literal">NULL</code>, it will be used to control the
 features applied during shaping. If two <em class="parameter"><code>features</code></em>
  have the same tag but
 overlapping ranges the value of the feature with the higher index takes
@@ -117,8 +117,8 @@ precedence.</p>
 <tr>
 <td class="parameter_name"><p>features</p></td>
 <td class="parameter_description"><p>an array of user
-specified <a class="link" href="harfbuzz-hb-common.html#hb-feature-t" title="hb_feature_t"><span class="type">hb_feature_t</span></a> or <a href="/usr/share/gtk-doc/html/glib/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. </p></td>
-<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=num_features][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+specified <a class="link" href="harfbuzz-hb-common.html#hb-feature-t" title="hb_feature_t"><span class="type">hb_feature_t</span></a> or <code class="literal">NULL</code>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=num_features][<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>num_features</p></td>
@@ -141,7 +141,7 @@ hb_shape_full (<em class="parameter"><code><a class="link" href="harfbuzz-hb-fon
                <em class="parameter"><code>unsigned <span class="type">int</span> num_features</code></em>,
                <em class="parameter"><code>const <span class="type">char</span> * const *shaper_list</code></em>);</pre>
 <p>See <a class="link" href="harfbuzz-hb-shape.html#hb-shape" title="hb_shape ()"><code class="function">hb_shape()</code></a> for details. If <em class="parameter"><code>shaper_list</code></em>
- is not <a href="/usr/share/gtk-doc/html/glib/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>, the specified
+ is not <code class="literal">NULL</code>, the specified
 shapers will be used in the given order, otherwise the default shapers list
 will be used.</p>
 <div class="refsect3">
@@ -166,8 +166,8 @@ will be used.</p>
 <tr>
 <td class="parameter_name"><p>features</p></td>
 <td class="parameter_description"><p>an array of user
-specified <a class="link" href="harfbuzz-hb-common.html#hb-feature-t" title="hb_feature_t"><span class="type">hb_feature_t</span></a> or <a href="/usr/share/gtk-doc/html/glib/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. </p></td>
-<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=num_features][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+specified <a class="link" href="harfbuzz-hb-common.html#hb-feature-t" title="hb_feature_t"><span class="type">hb_feature_t</span></a> or <code class="literal">NULL</code>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=num_features][<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>num_features</p></td>
@@ -177,9 +177,9 @@ array</p></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>shaper_list</p></td>
-<td class="parameter_description"><p>a <a href="/usr/share/gtk-doc/html/glib/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>-terminated
-array of shapers to use or <a href="/usr/share/gtk-doc/html/glib/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. </p></td>
-<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> zero-terminated=1][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+<td class="parameter_description"><p>a <code class="literal">NULL</code>-terminated
+array of shapers to use or <code class="literal">NULL</code>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> zero-terminated=1][<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></td>
 </tr>
 </tbody>
 </table></div>
@@ -207,6 +207,6 @@ constant strings. </p>
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/html/harfbuzz-hb-style.html b/docs/html/harfbuzz-hb-style.html
new file mode 100644 (file)
index 0000000..fa33cdd
--- /dev/null
@@ -0,0 +1,190 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>hb-style: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="style-api.html" title="Style API">
+<link rel="prev" href="style-api.html" title="Style API">
+<link rel="next" href="subset-api.html" title="Subset API">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts">
+<a href="#" class="shortcut">Top</a><span id="nav_description">  <span class="dim">|</span> 
+                  <a href="#harfbuzz-hb-style.description" class="shortcut">Description</a></span>
+</td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="style-api.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="style-api.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="subset-api.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="harfbuzz-hb-style"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="harfbuzz-hb-style.top_of_page"></a>hb-style</span></h2>
+<p>hb-style — Font Styles</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="harfbuzz-hb-style.functions"></a><h2>Functions</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="functions_proto_type">
+<col class="functions_proto_name">
+</colgroup>
+<tbody><tr>
+<td class="function_type">
+<span class="returnvalue">float</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-style.html#hb-style-get-value" title="hb_style_get_value ()">hb_style_get_value</a> <span class="c_punctuation">()</span>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-style.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="other_proto_type">
+<col class="other_proto_name">
+</colgroup>
+<tbody><tr>
+<td class="datatype_keyword">enum</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-style.html#hb-style-tag-t" title="enum hb_style_tag_t">hb_style_tag_t</a></td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-style.includes"></a><h2>Includes</h2>
+<pre class="synopsis">#include &lt;hb.h&gt;
+</pre>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-style.description"></a><h2>Description</h2>
+<p>Functions for fetching style information from fonts.</p>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-style.functions_details"></a><h2>Functions</h2>
+<div class="refsect2">
+<a name="hb-style-get-value"></a><h3>hb_style_get_value ()</h3>
+<pre class="programlisting"><span class="returnvalue">float</span>
+hb_style_get_value (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> *font</code></em>,
+                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-style.html#hb-style-tag-t" title="enum hb_style_tag_t"><span class="type">hb_style_tag_t</span></a> style_tag</code></em>);</pre>
+<p>Searches variation axes of a <a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> object for a specific axis first,
+if not set, then tries to get default style values from different
+tables of the font.</p>
+<div class="refsect3">
+<a name="hb-style-get-value.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>a <a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="type">hb_font_t</span></a> object.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>style_tag</p></td>
+<td class="parameter_description"><p>a style tag.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-style-get-value.returns"></a><h4>Returns</h4>
+<p> Corresponding axis or default value to a style tag.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-3-0-0.html#api-index-3.0.0">3.0.0</a></p>
+</div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-style.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="hb-style-tag-t"></a><h3>enum hb_style_tag_t</h3>
+<p>Defined by <a class="ulink" href="https://docs.microsoft.com/en-us/typography/opentype/spec/dvaraxisreg" target="_top">OpenType Design-Variation Axis Tag Registry</a>.</p>
+<div class="refsect3">
+<a name="hb-style-tag-t.members"></a><h4>Members</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="300px" class="enum_members_name">
+<col class="enum_members_description">
+<col width="200px" class="enum_members_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="enum_member_name"><p><a name="HB-STYLE-TAG-ITALIC:CAPS"></a>HB_STYLE_TAG_ITALIC</p></td>
+<td class="enum_member_description">
+<p>Used to vary between non-italic and italic.
+A value of 0 can be interpreted as "Roman" (non-italic); a value of 1 can
+be interpreted as (fully) italic.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-STYLE-TAG-OPTICAL-SIZE:CAPS"></a>HB_STYLE_TAG_OPTICAL_SIZE</p></td>
+<td class="enum_member_description">
+<p>Used to vary design to suit different text sizes.
+Non-zero. Values can be interpreted as text size, in points.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-STYLE-TAG-SLANT-ANGLE:CAPS"></a>HB_STYLE_TAG_SLANT_ANGLE</p></td>
+<td class="enum_member_description">
+<p>Used to vary between upright and slanted text. Values
+must be greater than -90 and less than +90. Values can be interpreted as
+the angle, in counter-clockwise degrees, of oblique slant from whatever the
+designer considers to be upright for that font design.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-STYLE-TAG-SLANT-RATIO:CAPS"></a>HB_STYLE_TAG_SLANT_RATIO</p></td>
+<td class="enum_member_description">
+<p>same as <em class="parameter"><code>HB_STYLE_TAG_SLANT_ANGLE</code></em>
+ expression as ratio.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-STYLE-TAG-WIDTH:CAPS"></a>HB_STYLE_TAG_WIDTH</p></td>
+<td class="enum_member_description">
+<p>Used to vary width of text from narrower to wider.
+Non-zero. Values can be interpreted as a percentage of whatever the font
+designer considers “normal width” for that font design.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-STYLE-TAG-WEIGHT:CAPS"></a>HB_STYLE_TAG_WEIGHT</p></td>
+<td class="enum_member_description">
+<p>Used to vary stroke thicknesses or other design details
+to give variation from lighter to blacker. Values can be interpreted in direct
+comparison to values for usWeightClass in the OS/2 table,
+or the CSS font-weight property.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-3-0-0.html#api-index-3.0.0">3.0.0</a></p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/harfbuzz-hb-subset.html b/docs/html/harfbuzz-hb-subset.html
new file mode 100644 (file)
index 0000000..d8c0a4c
--- /dev/null
@@ -0,0 +1,707 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>hb-subset: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="subset-api.html" title="Subset API">
+<link rel="prev" href="subset-api.html" title="Subset API">
+<link rel="next" href="api-index-full.html" title="API Index">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts">
+<a href="#" class="shortcut">Top</a><span id="nav_description">  <span class="dim">|</span> 
+                  <a href="#harfbuzz-hb-subset.description" class="shortcut">Description</a></span>
+</td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="subset-api.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="subset-api.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-full.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="harfbuzz-hb-subset"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="harfbuzz-hb-subset.top_of_page"></a>hb-subset</span></h2>
+<p>hb-subset — Subsets font files.</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="harfbuzz-hb-subset.functions"></a><h2>Functions</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="functions_proto_type">
+<col class="functions_proto_name">
+</colgroup>
+<tbody>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-t" title="hb_subset_input_t"><span class="returnvalue">hb_subset_input_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-create-or-fail" title="hb_subset_input_create_or_fail ()">hb_subset_input_create_or_fail</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-t" title="hb_subset_input_t"><span class="returnvalue">hb_subset_input_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-reference" title="hb_subset_input_reference ()">hb_subset_input_reference</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-destroy" title="hb_subset_input_destroy ()">hb_subset_input_destroy</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-set-user-data" title="hb_subset_input_set_user_data ()">hb_subset_input_set_user_data</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-get-user-data" title="hb_subset_input_get_user_data ()">hb_subset_input_get_user_data</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-subset.html#hb-subset-flags-t" title="enum hb_subset_flags_t"><span class="returnvalue">hb_subset_flags_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-get-flags" title="hb_subset_input_get_flags ()">hb_subset_input_get_flags</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-set-flags" title="hb_subset_input_set_flags ()">hb_subset_input_set_flags</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="returnvalue">hb_set_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-unicode-set" title="hb_subset_input_unicode_set ()">hb_subset_input_unicode_set</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="returnvalue">hb_set_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-glyph-set" title="hb_subset_input_glyph_set ()">hb_subset_input_glyph_set</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="returnvalue">hb_set_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-set" title="hb_subset_input_set ()">hb_subset_input_set</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="returnvalue">hb_face_t</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-subset.html#hb-subset-or-fail" title="hb_subset_or_fail ()">hb_subset_or_fail</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-subset.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="other_proto_type">
+<col class="other_proto_name">
+</colgroup>
+<tbody>
+<tr>
+<td class="datatype_keyword">enum</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-subset.html#hb-subset-flags-t" title="enum hb_subset_flags_t">hb_subset_flags_t</a></td>
+</tr>
+<tr>
+<td class="typedef_keyword">typedef</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-t" title="hb_subset_input_t">hb_subset_input_t</a></td>
+</tr>
+<tr>
+<td class="datatype_keyword">enum</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-subset.html#hb-subset-sets-t" title="enum hb_subset_sets_t">hb_subset_sets_t</a></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-subset.includes"></a><h2>Includes</h2>
+<pre class="synopsis">#include &lt;hb-subset.h&gt;
+</pre>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-subset.description"></a><h2>Description</h2>
+<p>Subsetting reduces the codepoint coverage of font files and removes all data
+that is no longer needed. A subset input describes the desired subset. The input is
+provided along with a font to the subsetting operation. Output is a new font file
+containing only the data specified in the input.</p>
+<p>Currently most outline and bitmap tables are supported: glyf, CFF, CFF2, sbix,
+COLR, and CBDT/CBLC. This also includes fonts with variable outlines via OpenType
+variations. Notably EBDT/EBLC and SVG are not supported. Layout subsetting is supported
+only for OpenType Layout tables (GSUB, GPOS, GDEF). Notably subsetting of graphite or AAT tables
+is not yet supported.</p>
+<p>Fonts with graphite or AAT tables may still be subsetted but will likely need to use the
+retain glyph ids option and configure the subset to pass through the layout tables untouched.</p>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-subset.functions_details"></a><h2>Functions</h2>
+<div class="refsect2">
+<a name="hb-subset-input-create-or-fail"></a><h3>hb_subset_input_create_or_fail ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-t" title="hb_subset_input_t"><span class="returnvalue">hb_subset_input_t</span></a> *
+hb_subset_input_create_or_fail (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>Creates a new subset input object.</p>
+<div class="refsect3">
+<a name="hb-subset-input-create-or-fail.returns"></a><h4>Returns</h4>
+<p>New subset input, or <code class="literal">NULL</code> if failed. Destroy
+with <a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-destroy" title="hb_subset_input_destroy ()"><code class="function">hb_subset_input_destroy()</code></a>. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-8-0.html#api-index-1.8.0">1.8.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-subset-input-reference"></a><h3>hb_subset_input_reference ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-t" title="hb_subset_input_t"><span class="returnvalue">hb_subset_input_t</span></a> *
+hb_subset_input_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-t" title="hb_subset_input_t"><span class="type">hb_subset_input_t</span></a> *input</code></em>);</pre>
+<p>Increases the reference count on <em class="parameter"><code>input</code></em>
+.</p>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
+<div class="refsect3">
+<a name="hb-subset-input-reference.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>input</p></td>
+<td class="parameter_description"><p>a <a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-t" title="hb_subset_input_t"><span class="type">hb_subset_input_t</span></a> object.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-subset-input-reference.returns"></a><h4>Returns</h4>
+<p> <em class="parameter"><code>input</code></em>
+.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-8-0.html#api-index-1.8.0">1.8.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-subset-input-destroy"></a><h3>hb_subset_input_destroy ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_subset_input_destroy (<em class="parameter"><code><a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-t" title="hb_subset_input_t"><span class="type">hb_subset_input_t</span></a> *input</code></em>);</pre>
+<p>Decreases the reference count on <em class="parameter"><code>input</code></em>
+, and if it reaches zero, destroys
+<em class="parameter"><code>input</code></em>
+, freeing all memory.</p>
+<div class="refsect3">
+<a name="hb-subset-input-destroy.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>input</p></td>
+<td class="parameter_description"><p>a <a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-t" title="hb_subset_input_t"><span class="type">hb_subset_input_t</span></a> object.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-8-0.html#api-index-1.8.0">1.8.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-subset-input-set-user-data"></a><h3>hb_subset_input_set_user_data ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+hb_subset_input_set_user_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-t" title="hb_subset_input_t"><span class="type">hb_subset_input_t</span></a> *input</code></em>,
+                               <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-user-data-key-t" title="hb_user_data_key_t"><span class="type">hb_user_data_key_t</span></a> *key</code></em>,
+                               <em class="parameter"><code><span class="type">void</span> *data</code></em>,
+                               <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>,
+                               <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="type">hb_bool_t</span></a> replace</code></em>);</pre>
+<p>Attaches a user-data key/data pair to the given subset input object.</p>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
+<div class="refsect3">
+<a name="hb-subset-input-set-user-data.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>input</p></td>
+<td class="parameter_description"><p>a <a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-t" title="hb_subset_input_t"><span class="type">hb_subset_input_t</span></a> object.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>key</p></td>
+<td class="parameter_description"><p>The user-data key to set</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>data</p></td>
+<td class="parameter_description"><p>A pointer to the user data</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>destroy</p></td>
+<td class="parameter_description"><p>A callback to call when <em class="parameter"><code>data</code></em>
+is not needed anymore. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>replace</p></td>
+<td class="parameter_description"><p>Whether to replace an existing data with the same key</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-subset-input-set-user-data.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> if success, <code class="literal">false</code> otherwise</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-9-0.html#api-index-2.9.0">2.9.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-subset-input-get-user-data"></a><h3>hb_subset_input_get_user_data ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> *
+hb_subset_input_get_user_data (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-t" title="hb_subset_input_t"><span class="type">hb_subset_input_t</span></a> *input</code></em>,
+                               <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-user-data-key-t" title="hb_user_data_key_t"><span class="type">hb_user_data_key_t</span></a> *key</code></em>);</pre>
+<p>Fetches the user data associated with the specified key,
+attached to the specified subset input object.</p>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
+<div class="refsect3">
+<a name="hb-subset-input-get-user-data.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>input</p></td>
+<td class="parameter_description"><p>a <a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-t" title="hb_subset_input_t"><span class="type">hb_subset_input_t</span></a> object.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>key</p></td>
+<td class="parameter_description"><p>The user-data key to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-subset-input-get-user-data.returns"></a><h4>Returns</h4>
+<p>A pointer to the user data. </p>
+<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-9-0.html#api-index-2.9.0">2.9.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-subset-input-get-flags"></a><h3>hb_subset_input_get_flags ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-subset.html#hb-subset-flags-t" title="enum hb_subset_flags_t"><span class="returnvalue">hb_subset_flags_t</span></a>
+hb_subset_input_get_flags (<em class="parameter"><code><a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-t" title="hb_subset_input_t"><span class="type">hb_subset_input_t</span></a> *input</code></em>);</pre>
+<p>Gets all of the subsetting flags in the input object.</p>
+<div class="refsect3">
+<a name="hb-subset-input-get-flags.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>input</p></td>
+<td class="parameter_description"><p>a <a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-t" title="hb_subset_input_t"><span class="type">hb_subset_input_t</span></a> object.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-subset-input-get-flags.returns"></a><h4>Returns</h4>
+<p> the subsetting flags bit field.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-9-0.html#api-index-2.9.0">2.9.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-subset-input-set-flags"></a><h3>hb_subset_input_set_flags ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_subset_input_set_flags (<em class="parameter"><code><a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-t" title="hb_subset_input_t"><span class="type">hb_subset_input_t</span></a> *input</code></em>,
+                           <em class="parameter"><code><span class="type">unsigned </span> value</code></em>);</pre>
+<p>Sets all of the flags in the input object to the values specified by the bit
+field.</p>
+<div class="refsect3">
+<a name="hb-subset-input-set-flags.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>input</p></td>
+<td class="parameter_description"><p>a <a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-t" title="hb_subset_input_t"><span class="type">hb_subset_input_t</span></a> object.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>value</p></td>
+<td class="parameter_description"><p>bit field of flags</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-9-0.html#api-index-2.9.0">2.9.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-subset-input-unicode-set"></a><h3>hb_subset_input_unicode_set ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="returnvalue">hb_set_t</span></a> *
+hb_subset_input_unicode_set (<em class="parameter"><code><a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-t" title="hb_subset_input_t"><span class="type">hb_subset_input_t</span></a> *input</code></em>);</pre>
+<p>Gets the set of Unicode code points to retain, the caller should modify the
+set as needed.</p>
+<div class="refsect3">
+<a name="hb-subset-input-unicode-set.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>input</p></td>
+<td class="parameter_description"><p>a <a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-t" title="hb_subset_input_t"><span class="type">hb_subset_input_t</span></a> object.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-subset-input-unicode-set.returns"></a><h4>Returns</h4>
+<p>pointer to the <a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a> of Unicode code
+points. </p>
+<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-8-0.html#api-index-1.8.0">1.8.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-subset-input-glyph-set"></a><h3>hb_subset_input_glyph_set ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="returnvalue">hb_set_t</span></a> *
+hb_subset_input_glyph_set (<em class="parameter"><code><a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-t" title="hb_subset_input_t"><span class="type">hb_subset_input_t</span></a> *input</code></em>);</pre>
+<p>Gets the set of glyph IDs to retain, the caller should modify the set as
+needed.</p>
+<div class="refsect3">
+<a name="hb-subset-input-glyph-set.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>input</p></td>
+<td class="parameter_description"><p>a <a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-t" title="hb_subset_input_t"><span class="type">hb_subset_input_t</span></a> object.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-subset-input-glyph-set.returns"></a><h4>Returns</h4>
+<p>pointer to the <a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a> of glyph IDs. </p>
+<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-8-0.html#api-index-1.8.0">1.8.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-subset-input-set"></a><h3>hb_subset_input_set ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="returnvalue">hb_set_t</span></a> *
+hb_subset_input_set (<em class="parameter"><code><a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-t" title="hb_subset_input_t"><span class="type">hb_subset_input_t</span></a> *input</code></em>,
+                     <em class="parameter"><code><a class="link" href="harfbuzz-hb-subset.html#hb-subset-sets-t" title="enum hb_subset_sets_t"><span class="type">hb_subset_sets_t</span></a> set_type</code></em>);</pre>
+<p>Gets the set of the specified type.</p>
+<div class="refsect3">
+<a name="hb-subset-input-set.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>input</p></td>
+<td class="parameter_description"><p>a <a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-t" title="hb_subset_input_t"><span class="type">hb_subset_input_t</span></a> object.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>set_type</p></td>
+<td class="parameter_description"><p>a <a class="link" href="harfbuzz-hb-subset.html#hb-subset-sets-t" title="enum hb_subset_sets_t"><span class="type">hb_subset_sets_t</span></a> set type.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-subset-input-set.returns"></a><h4>Returns</h4>
+<p>pointer to the <a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a> of the specified type. </p>
+<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-9-1.html#api-index-2.9.1">2.9.1</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-subset-or-fail"></a><h3>hb_subset_or_fail ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="returnvalue">hb_face_t</span></a> *
+hb_subset_or_fail (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> *source</code></em>,
+                   <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-subset.html#hb-subset-input-t" title="hb_subset_input_t"><span class="type">hb_subset_input_t</span></a> *input</code></em>);</pre>
+<p>Subsets a font according to provided input. Returns nullptr
+if the subset operation fails.</p>
+<div class="refsect3">
+<a name="hb-subset-or-fail.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>source</p></td>
+<td class="parameter_description"><p>font face data to be subset.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>input</p></td>
+<td class="parameter_description"><p>input to use for the subsetting.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-9-0.html#api-index-2.9.0">2.9.0</a></p>
+</div>
+</div>
+<div class="refsect1">
+<a name="harfbuzz-hb-subset.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="hb-subset-flags-t"></a><h3>enum hb_subset_flags_t</h3>
+<p>List of boolean properties that can be configured on the subset input.</p>
+<div class="refsect3">
+<a name="hb-subset-flags-t.members"></a><h4>Members</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="300px" class="enum_members_name">
+<col class="enum_members_description">
+<col width="200px" class="enum_members_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SUBSET-FLAGS-DEFAULT:CAPS"></a>HB_SUBSET_FLAGS_DEFAULT</p></td>
+<td class="enum_member_description">
+<p>all flags at their default value of false.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SUBSET-FLAGS-NO-HINTING:CAPS"></a>HB_SUBSET_FLAGS_NO_HINTING</p></td>
+<td class="enum_member_description">
+<p>If set hinting instructions will be dropped in
+the produced subset. Otherwise hinting instructions will be retained.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SUBSET-FLAGS-RETAIN-GIDS:CAPS"></a>HB_SUBSET_FLAGS_RETAIN_GIDS</p></td>
+<td class="enum_member_description">
+<p>If set glyph indices will not be modified in
+the produced subset. If glyphs are dropped their indices will be retained
+as an empty glyph.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SUBSET-FLAGS-DESUBROUTINIZE:CAPS"></a>HB_SUBSET_FLAGS_DESUBROUTINIZE</p></td>
+<td class="enum_member_description">
+<p>If set and subsetting a CFF font the
+subsetter will attempt to remove subroutines from the CFF glyphs.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SUBSET-FLAGS-NAME-LEGACY:CAPS"></a>HB_SUBSET_FLAGS_NAME_LEGACY</p></td>
+<td class="enum_member_description">
+<p>If set non-unicode name records will be
+retained in the subset.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SUBSET-FLAGS-SET-OVERLAPS-FLAG:CAPS"></a>HB_SUBSET_FLAGS_SET_OVERLAPS_FLAG</p></td>
+<td class="enum_member_description">
+<p>If set the subsetter will set the
+OVERLAP_SIMPLE flag on each simple glyph.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SUBSET-FLAGS-PASSTHROUGH-UNRECOGNIZED:CAPS"></a>HB_SUBSET_FLAGS_PASSTHROUGH_UNRECOGNIZED</p></td>
+<td class="enum_member_description">
+<p>If set the subsetter will not
+drop unrecognized tables and instead pass them through untouched.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SUBSET-FLAGS-NOTDEF-OUTLINE:CAPS"></a>HB_SUBSET_FLAGS_NOTDEF_OUTLINE</p></td>
+<td class="enum_member_description">
+<p>If set the notdef glyph outline will be
+retained in the final subset.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SUBSET-FLAGS-GLYPH-NAMES:CAPS"></a>HB_SUBSET_FLAGS_GLYPH_NAMES</p></td>
+<td class="enum_member_description">
+<p>If set the PS glyph names will be retained
+in the final subset.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SUBSET-FLAGS-NO-PRUNE-UNICODE-RANGES:CAPS"></a>HB_SUBSET_FLAGS_NO_PRUNE_UNICODE_RANGES</p></td>
+<td class="enum_member_description">
+<p>If set then the unicode ranges in
+OS/2 will not be recalculated.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-9-0.html#api-index-2.9.0">2.9.0</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-subset-input-t"></a><h3>hb_subset_input_t</h3>
+<pre class="programlisting">typedef struct hb_subset_input_t hb_subset_input_t;
+</pre>
+<p>Things that change based on the input. Characters to keep, etc.</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-subset-sets-t"></a><h3>enum hb_subset_sets_t</h3>
+<p>List of sets that can be configured on the subset input.</p>
+<div class="refsect3">
+<a name="hb-subset-sets-t.members"></a><h4>Members</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="300px" class="enum_members_name">
+<col class="enum_members_description">
+<col width="200px" class="enum_members_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SUBSET-SETS-GLYPH-INDEX:CAPS"></a>HB_SUBSET_SETS_GLYPH_INDEX</p></td>
+<td class="enum_member_description">
+<p>the set of glyph indexes to retain in the subset.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SUBSET-SETS-UNICODE:CAPS"></a>HB_SUBSET_SETS_UNICODE</p></td>
+<td class="enum_member_description">
+<p>the set of unicode codepoints to retain in the subset.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SUBSET-SETS-NO-SUBSET-TABLE-TAG:CAPS"></a>HB_SUBSET_SETS_NO_SUBSET_TABLE_TAG</p></td>
+<td class="enum_member_description">
+<p>the set of table tags which specifies tables that should not be
+subsetted.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SUBSET-SETS-DROP-TABLE-TAG:CAPS"></a>HB_SUBSET_SETS_DROP_TABLE_TAG</p></td>
+<td class="enum_member_description">
+<p>the set of table tags which specifies tables which will be dropped
+in the subset.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SUBSET-SETS-NAME-ID:CAPS"></a>HB_SUBSET_SETS_NAME_ID</p></td>
+<td class="enum_member_description">
+<p>the set of name ids that will be retained.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SUBSET-SETS-NAME-LANG-ID:CAPS"></a>HB_SUBSET_SETS_NAME_LANG_ID</p></td>
+<td class="enum_member_description">
+<p>the set of name lang ids that will be retained.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-SUBSET-SETS-LAYOUT-FEATURE-TAG:CAPS"></a>HB_SUBSET_SETS_LAYOUT_FEATURE_TAG</p></td>
+<td class="enum_member_description">
+<p>the set of layout feature tags that will be retained
+in the subset.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-2-9-1.html#api-index-2.9.1">2.9.1</a></p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
index 9da568e..35276f3 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-unicode: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch12.html" title="Core API">
+<link rel="up" href="core-api.html" title="Core API">
 <link rel="prev" href="harfbuzz-hb-shape.html" title="hb-shape">
 <link rel="next" href="harfbuzz-hb-version.html" title="hb-version">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -18,7 +18,7 @@
                   <a href="#harfbuzz-hb-unicode.description" class="shortcut">Description</a></span>
 </td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><a accesskey="u" href="ch12.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="u" href="core-api.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
 <td><a accesskey="p" href="harfbuzz-hb-shape.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
 <td><a accesskey="n" href="harfbuzz-hb-version.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <div class="refsect1">
 <a name="harfbuzz-hb-unicode.description"></a><h2>Description</h2>
 <p>Unicode functions are used to access Unicode character properties.
-Client can pass its own Unicode functions to HarfBuzz, or access
-the built-in Unicode functions that come with HarfBuzz.</p>
-<p>With the Unicode functions, one can query variour Unicode character
-properties, such as General Category, Script, Combining Class, etc.</p>
+With these functions, client programs can query various properties from
+the Unicode Character Database for any code point, such as General
+Category (gc), Script (sc), Canonical Combining Class (ccc), etc.</p>
+<p>Client programs can optionally pass in their own Unicode functions
+that implement the same queries. The set of functions available is
+defined by the virtual methods in <a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t" title="hb_unicode_funcs_t"><span class="type">hb_unicode_funcs_t</span></a>.</p>
+<p>HarfBuzz provides built-in default functions for each method in
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t" title="hb_unicode_funcs_t"><span class="type">hb_unicode_funcs_t</span></a>.</p>
 </div>
 <div class="refsect1">
 <a name="harfbuzz-hb-unicode.functions_details"></a><h2>Functions</h2>
@@ -313,6 +317,36 @@ properties, such as General Category, Script, Combining Class, etc.</p>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-combining-class-t" title="enum hb_unicode_combining_class_t"><span class="returnvalue">hb_unicode_combining_class_t</span></a>
 hb_unicode_combining_class (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t" title="hb_unicode_funcs_t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>,
                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> unicode</code></em>);</pre>
+<p>Retrieves the Canonical Combining Class (ccc) property
+of code point <em class="parameter"><code>unicode</code></em>
+.</p>
+<div class="refsect3">
+<a name="hb-unicode-combining-class.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>ufuncs</p></td>
+<td class="parameter_description"><p>The Unicode-functions structure</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>unicode</p></td>
+<td class="parameter_description"><p>The code point to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-unicode-combining-class.returns"></a><h4>Returns</h4>
+<p> The <a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-combining-class-t" title="enum hb_unicode_combining_class_t"><span class="type">hb_unicode_combining_class_t</span></a> of <em class="parameter"><code>unicode</code></em>
+</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
 <hr>
@@ -322,6 +356,41 @@ hb_unicode_combining_class (<em class="parameter"><code><a class="link" href="ha
 <span class="c_punctuation">(</span>*hb_unicode_combining_class_func_t<span class="c_punctuation">)</span> (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t" title="hb_unicode_funcs_t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>,
                                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> unicode</code></em>,
                                       <em class="parameter"><code><span class="type">void</span> *user_data</code></em>);</pre>
+<p>A virtual method for the <a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t" title="hb_unicode_funcs_t"><span class="type">hb_unicode_funcs_t</span></a> structure.</p>
+<p>This method should retrieve the Canonical Combining Class (ccc)
+property for a specified Unicode code point.</p>
+<div class="refsect3">
+<a name="hb-unicode-combining-class-func-t.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>ufuncs</p></td>
+<td class="parameter_description"><p>A Unicode-functions structure</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>unicode</p></td>
+<td class="parameter_description"><p>The code point to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>User data pointer passed by the caller</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-unicode-combining-class-func-t.returns"></a><h4>Returns</h4>
+<p> The <a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-combining-class-t" title="enum hb_unicode_combining_class_t"><span class="type">hb_unicode_combining_class_t</span></a> of <em class="parameter"><code>unicode</code></em>
+</p>
+</div>
 </div>
 <hr>
 <div class="refsect2">
@@ -331,6 +400,11 @@ hb_unicode_compose (<em class="parameter"><code><a class="link" href="harfbuzz-h
                     <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> a</code></em>,
                     <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> b</code></em>,
                     <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *ab</code></em>);</pre>
+<p>Fetches the composition of a sequence of two Unicode
+code points.</p>
+<p>Calls the composition function of the specified
+Unicode-functions structure <em class="parameter"><code>ufuncs</code></em>
+.</p>
 <div class="refsect3">
 <a name="hb-unicode-compose.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -342,17 +416,35 @@ hb_unicode_compose (<em class="parameter"><code><a class="link" href="harfbuzz-h
 <tbody>
 <tr>
 <td class="parameter_name"><p>ufuncs</p></td>
-<td class="parameter_description"><p>Unicode functions.</p></td>
+<td class="parameter_description"><p>The Unicode-functions structure</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>a</p></td>
+<td class="parameter_description"><p>The first Unicode code point to compose</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>b</p></td>
+<td class="parameter_description"><p>The second Unicode code point to compose</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>ab</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The composition of <em class="parameter"><code>a</code></em>
+, <em class="parameter"><code>b</code></em>
+. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
 </tr>
 </tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-unicode-compose.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> if <em class="parameter"><code>a</code></em>
+and <em class="parameter"><code>b</code></em>
+composed, <code class="literal">false</code> otherwise</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
 <hr>
@@ -364,6 +456,55 @@ hb_unicode_compose (<em class="parameter"><code><a class="link" href="harfbuzz-h
                               <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> b</code></em>,
                               <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *ab</code></em>,
                               <em class="parameter"><code><span class="type">void</span> *user_data</code></em>);</pre>
+<p>A virtual method for the <a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t" title="hb_unicode_funcs_t"><span class="type">hb_unicode_funcs_t</span></a> structure.</p>
+<p>This method should compose a sequence of two input Unicode code
+points by canonical equivalence, returning the composed code
+point in a <a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> output parameter (if successful).
+The method must return an <a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="type">hb_bool_t</span></a> indicating the success
+of the composition.</p>
+<div class="refsect3">
+<a name="hb-unicode-compose-func-t.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>ufuncs</p></td>
+<td class="parameter_description"><p>A Unicode-functions structure</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>a</p></td>
+<td class="parameter_description"><p>The first code point to compose</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>b</p></td>
+<td class="parameter_description"><p>The second code point to compose</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>ab</p></td>
+<td class="parameter_description"><p>The composed code point. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>user data pointer passed by the caller</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-unicode-compose-func-t.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> is <em class="parameter"><code>a</code></em>
+,<em class="parameter"><code>b</code></em>
+composed, <code class="literal">false</code> otherwise</p>
+</div>
 </div>
 <hr>
 <div class="refsect2">
@@ -373,6 +514,10 @@ hb_unicode_decompose (<em class="parameter"><code><a class="link" href="harfbuzz
                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> ab</code></em>,
                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *a</code></em>,
                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *b</code></em>);</pre>
+<p>Fetches the decomposition of a Unicode code point. </p>
+<p>Calls the decomposition function of the specified
+Unicode-functions structure <em class="parameter"><code>ufuncs</code></em>
+.</p>
 <div class="refsect3">
 <a name="hb-unicode-decompose.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -384,22 +529,34 @@ hb_unicode_decompose (<em class="parameter"><code><a class="link" href="harfbuzz
 <tbody>
 <tr>
 <td class="parameter_name"><p>ufuncs</p></td>
-<td class="parameter_description"><p>Unicode functions.</p></td>
+<td class="parameter_description"><p>The Unicode-functions structure</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>ab</p></td>
+<td class="parameter_description"><p>Unicode code point to decompose</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>a</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The first code point of the decomposition of <em class="parameter"><code>ab</code></em>
+. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>b</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The second code point of the decomposition of <em class="parameter"><code>ab</code></em>
+. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
 </tr>
 </tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-unicode-decompose.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> if <em class="parameter"><code>ab</code></em>
+was decomposed, <code class="literal">false</code> otherwise</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
 <hr>
@@ -411,12 +568,60 @@ hb_unicode_decompose (<em class="parameter"><code><a class="link" href="harfbuzz
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *a</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *b</code></em>,
                                 <em class="parameter"><code><span class="type">void</span> *user_data</code></em>);</pre>
+<p>A virtual method for the <a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t" title="hb_unicode_funcs_t"><span class="type">hb_unicode_funcs_t</span></a> structure.</p>
+<p>This method should decompose an input Unicode code point,
+returning the two decomposed code points in <a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a>
+output parameters (if successful). The method must return an
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="type">hb_bool_t</span></a> indicating the success of the composition.</p>
+<div class="refsect3">
+<a name="hb-unicode-decompose-func-t.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>ufuncs</p></td>
+<td class="parameter_description"><p>A Unicode-functions structure</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>ab</p></td>
+<td class="parameter_description"><p>The code point to decompose</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>a</p></td>
+<td class="parameter_description"><p>The first decomposed code point. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>b</p></td>
+<td class="parameter_description"><p>The second decomposed code point. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>user data pointer passed by the caller</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-unicode-decompose-func-t.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> if <em class="parameter"><code>ab</code></em>
+decomposed, <code class="literal">false</code> otherwise</p>
+</div>
 </div>
 <hr>
 <div class="refsect2">
 <a name="hb-unicode-funcs-create"></a><h3>hb_unicode_funcs_create ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t" title="hb_unicode_funcs_t"><span class="returnvalue">hb_unicode_funcs_t</span></a> *
 hb_unicode_funcs_create (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t" title="hb_unicode_funcs_t"><span class="type">hb_unicode_funcs_t</span></a> *parent</code></em>);</pre>
+<p>Creates a new <a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t" title="hb_unicode_funcs_t"><span class="type">hb_unicode_funcs_t</span></a> structure of Unicode functions.</p>
 <p><span class="annotation">[Xconstructor]</span></p>
 <div class="refsect3">
 <a name="hb-unicode-funcs-create.parameters"></a><h4>Parameters</h4>
@@ -428,14 +633,14 @@ hb_unicode_funcs_create (<em class="parameter"><code><a class="link" href="harfb
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>parent</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>Parent Unicode-functions structure. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></td>
 </tr></tbody>
 </table></div>
 </div>
 <div class="refsect3">
 <a name="hb-unicode-funcs-create.returns"></a><h4>Returns</h4>
-<p>. </p>
+<p>The Unicode-functions structure. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
@@ -445,6 +650,9 @@ hb_unicode_funcs_create (<em class="parameter"><code><a class="link" href="harfb
 <a name="hb-unicode-funcs-destroy"></a><h3>hb_unicode_funcs_destroy ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_unicode_funcs_destroy (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t" title="hb_unicode_funcs_t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>);</pre>
+<p>Decreases the reference count on a Unicode-functions structure. When
+the reference count reaches zero, the Unicode-functions structure is
+destroyed, freeing all memory.</p>
 <p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
 <div class="refsect3">
 <a name="hb-unicode-funcs-destroy.parameters"></a><h4>Parameters</h4>
@@ -456,7 +664,7 @@ hb_unicode_funcs_destroy (<em class="parameter"><code><a class="link" href="harf
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>ufuncs</p></td>
-<td class="parameter_description"><p>Unicode functions.</p></td>
+<td class="parameter_description"><p>The Unicode-functions structure</p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
@@ -468,15 +676,24 @@ hb_unicode_funcs_destroy (<em class="parameter"><code><a class="link" href="harf
 <a name="hb-unicode-funcs-get-default"></a><h3>hb_unicode_funcs_get_default ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t" title="hb_unicode_funcs_t"><span class="returnvalue">hb_unicode_funcs_t</span></a> *
 hb_unicode_funcs_get_default (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>Fetches a pointer to the default Unicode-functions structure that is used
+when no functions are explicitly set on <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>.</p>
+<div class="refsect3">
+<a name="hb-unicode-funcs-get-default.returns"></a><h4>Returns</h4>
+<p>a pointer to the <a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t" title="hb_unicode_funcs_t"><span class="type">hb_unicode_funcs_t</span></a> Unicode-functions structure. </p>
+<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="hb-unicode-funcs-get-empty"></a><h3>hb_unicode_funcs_get_empty ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t" title="hb_unicode_funcs_t"><span class="returnvalue">hb_unicode_funcs_t</span></a> *
 hb_unicode_funcs_get_empty (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>Fetches the singleton empty Unicode-functions structure.</p>
 <div class="refsect3">
 <a name="hb-unicode-funcs-get-empty.returns"></a><h4>Returns</h4>
-<p>. </p>
+<p>The empty Unicode-functions structure. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
@@ -486,6 +703,9 @@ hb_unicode_funcs_get_empty (<em class="parameter"><code><span class="type">void<
 <a name="hb-unicode-funcs-get-parent"></a><h3>hb_unicode_funcs_get_parent ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t" title="hb_unicode_funcs_t"><span class="returnvalue">hb_unicode_funcs_t</span></a> *
 hb_unicode_funcs_get_parent (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t" title="hb_unicode_funcs_t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>);</pre>
+<p>Fetches the parent of the Unicode-functions structure
+<em class="parameter"><code>ufuncs</code></em>
+.</p>
 <div class="refsect3">
 <a name="hb-unicode-funcs-get-parent.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -496,11 +716,15 @@ hb_unicode_funcs_get_parent (<em class="parameter"><code><a class="link" href="h
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>ufuncs</p></td>
-<td class="parameter_description"><p>Unicode functions.</p></td>
+<td class="parameter_description"><p>The Unicode-functions structure</p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-unicode-funcs-get-parent.returns"></a><h4>Returns</h4>
+<p> The parent Unicode-functions structure</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
 <hr>
@@ -509,6 +733,8 @@ hb_unicode_funcs_get_parent (<em class="parameter"><code><a class="link" href="h
 <pre class="programlisting"><span class="returnvalue">void</span> *
 hb_unicode_funcs_get_user_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t" title="hb_unicode_funcs_t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-user-data-key-t" title="hb_user_data_key_t"><span class="type">hb_user_data_key_t</span></a> *key</code></em>);</pre>
+<p>Fetches the user-data associated with the specified key,
+attached to the specified Unicode-functions structure.</p>
 <p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
 <div class="refsect3">
 <a name="hb-unicode-funcs-get-user-data.parameters"></a><h4>Parameters</h4>
@@ -518,16 +744,23 @@ hb_unicode_funcs_get_user_data (<em class="parameter"><code><a class="link" href
 <col class="parameters_description">
 <col width="200px" class="parameters_annotations">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
 <td class="parameter_name"><p>ufuncs</p></td>
-<td class="parameter_description"><p>Unicode functions.</p></td>
+<td class="parameter_description"><p>The Unicode-functions structure</p></td>
 <td class="parameter_annotations"> </td>
-</tr></tbody>
+</tr>
+<tr>
+<td class="parameter_name"><p>key</p></td>
+<td class="parameter_description"><p>The user-data key to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
 </table></div>
 </div>
 <div class="refsect3">
 <a name="hb-unicode-funcs-get-user-data.returns"></a><h4>Returns</h4>
-<p>. </p>
+<p>A pointer to the user data. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
@@ -537,6 +770,8 @@ hb_unicode_funcs_get_user_data (<em class="parameter"><code><a class="link" href
 <a name="hb-unicode-funcs-is-immutable"></a><h3>hb_unicode_funcs_is_immutable ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 hb_unicode_funcs_is_immutable (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t" title="hb_unicode_funcs_t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>);</pre>
+<p>Tests whether the specified Unicode-functions structure
+is immutable.</p>
 <div class="refsect3">
 <a name="hb-unicode-funcs-is-immutable.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -547,11 +782,16 @@ hb_unicode_funcs_is_immutable (<em class="parameter"><code><a class="link" href=
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>ufuncs</p></td>
-<td class="parameter_description"><p>Unicode functions.</p></td>
+<td class="parameter_description"><p>The Unicode-functions structure</p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-unicode-funcs-is-immutable.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> if <em class="parameter"><code>ufuncs</code></em>
+is immutable, <code class="literal">false</code> otherwise</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
 <hr>
@@ -559,6 +799,8 @@ hb_unicode_funcs_is_immutable (<em class="parameter"><code><a class="link" href=
 <a name="hb-unicode-funcs-make-immutable"></a><h3>hb_unicode_funcs_make_immutable ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_unicode_funcs_make_immutable (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t" title="hb_unicode_funcs_t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>);</pre>
+<p>Makes the specified Unicode-functions structure
+immutable.</p>
 <div class="refsect3">
 <a name="hb-unicode-funcs-make-immutable.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -569,7 +811,7 @@ hb_unicode_funcs_make_immutable (<em class="parameter"><code><a class="link" hre
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>ufuncs</p></td>
-<td class="parameter_description"><p>Unicode functions.</p></td>
+<td class="parameter_description"><p>The Unicode-functions structure</p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
@@ -581,6 +823,7 @@ hb_unicode_funcs_make_immutable (<em class="parameter"><code><a class="link" hre
 <a name="hb-unicode-funcs-reference"></a><h3>hb_unicode_funcs_reference ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t" title="hb_unicode_funcs_t"><span class="returnvalue">hb_unicode_funcs_t</span></a> *
 hb_unicode_funcs_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t" title="hb_unicode_funcs_t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>);</pre>
+<p>Increases the reference count on a Unicode-functions structure.</p>
 <p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
 <div class="refsect3">
 <a name="hb-unicode-funcs-reference.parameters"></a><h4>Parameters</h4>
@@ -592,14 +835,14 @@ hb_unicode_funcs_reference (<em class="parameter"><code><a class="link" href="ha
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>ufuncs</p></td>
-<td class="parameter_description"><p>Unicode functions.</p></td>
+<td class="parameter_description"><p>The Unicode-functions structure</p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
 </div>
 <div class="refsect3">
 <a name="hb-unicode-funcs-reference.returns"></a><h4>Returns</h4>
-<p>. </p>
+<p>The Unicode-functions structure. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
@@ -613,6 +856,7 @@ hb_unicode_funcs_set_combining_class_func
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-combining-class-func-t" title="hb_unicode_combining_class_func_t ()"><span class="type">hb_unicode_combining_class_func_t</span></a> func</code></em>,
                                 <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<p>Sets the implementation function for <a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-combining-class-func-t" title="hb_unicode_combining_class_func_t ()"><span class="type">hb_unicode_combining_class_func_t</span></a>.</p>
 <div class="refsect3">
 <a name="hb-unicode-funcs-set-combining-class-func.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -624,14 +868,26 @@ hb_unicode_funcs_set_combining_class_func
 <tbody>
 <tr>
 <td class="parameter_name"><p>ufuncs</p></td>
-<td class="parameter_description"><p>a Unicode function structure</p></td>
+<td class="parameter_description"><p>A Unicode-functions structure</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>func</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The callback function to assign. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> user_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
 </tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>Data to pass to <em class="parameter"><code>func</code></em>
+</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>destroy</p></td>
+<td class="parameter_description"><p>The function to call when <em class="parameter"><code>user_data</code></em>
+is not needed anymore. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></td>
+</tr>
 </tbody>
 </table></div>
 </div>
@@ -645,6 +901,7 @@ hb_unicode_funcs_set_compose_func (<em class="parameter"><code><a class="link" h
                                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-compose-func-t" title="hb_unicode_compose_func_t ()"><span class="type">hb_unicode_compose_func_t</span></a> func</code></em>,
                                    <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<p>Sets the implementation function for <a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-compose-func-t" title="hb_unicode_compose_func_t ()"><span class="type">hb_unicode_compose_func_t</span></a>.</p>
 <div class="refsect3">
 <a name="hb-unicode-funcs-set-compose-func.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -656,14 +913,26 @@ hb_unicode_funcs_set_compose_func (<em class="parameter"><code><a class="link" h
 <tbody>
 <tr>
 <td class="parameter_name"><p>ufuncs</p></td>
-<td class="parameter_description"><p>a Unicode function structure</p></td>
+<td class="parameter_description"><p>A Unicode-functions structure</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>func</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The callback function to assign. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> user_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
 </tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>Data to pass to <em class="parameter"><code>func</code></em>
+</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>destroy</p></td>
+<td class="parameter_description"><p>The function to call when <em class="parameter"><code>user_data</code></em>
+is not needed anymore. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></td>
+</tr>
 </tbody>
 </table></div>
 </div>
@@ -677,6 +946,7 @@ hb_unicode_funcs_set_decompose_func (<em class="parameter"><code><a class="link"
                                      <em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-decompose-func-t" title="hb_unicode_decompose_func_t ()"><span class="type">hb_unicode_decompose_func_t</span></a> func</code></em>,
                                      <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                      <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<p>Sets the implementation function for <a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-decompose-func-t" title="hb_unicode_decompose_func_t ()"><span class="type">hb_unicode_decompose_func_t</span></a>.</p>
 <div class="refsect3">
 <a name="hb-unicode-funcs-set-decompose-func.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -688,14 +958,26 @@ hb_unicode_funcs_set_decompose_func (<em class="parameter"><code><a class="link"
 <tbody>
 <tr>
 <td class="parameter_name"><p>ufuncs</p></td>
-<td class="parameter_description"><p>a Unicode function structure</p></td>
+<td class="parameter_description"><p>A Unicode-functions structure</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>func</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The callback function to assign. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> user_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
 </tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>Data to pass to <em class="parameter"><code>func</code></em>
+</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>destroy</p></td>
+<td class="parameter_description"><p>The function to call when <em class="parameter"><code>user_data</code></em>
+is not needed anymore. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></td>
+</tr>
 </tbody>
 </table></div>
 </div>
@@ -710,6 +992,7 @@ hb_unicode_funcs_set_general_category_func
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-general-category-func-t" title="hb_unicode_general_category_func_t ()"><span class="type">hb_unicode_general_category_func_t</span></a> func</code></em>,
                                 <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<p>Sets the implementation function for <a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-general-category-func-t" title="hb_unicode_general_category_func_t ()"><span class="type">hb_unicode_general_category_func_t</span></a>.</p>
 <div class="refsect3">
 <a name="hb-unicode-funcs-set-general-category-func.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -721,14 +1004,26 @@ hb_unicode_funcs_set_general_category_func
 <tbody>
 <tr>
 <td class="parameter_name"><p>ufuncs</p></td>
-<td class="parameter_description"><p>a Unicode function structure</p></td>
+<td class="parameter_description"><p>A Unicode-functions structure</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>func</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The callback function to assign. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> user_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
 </tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>Data to pass to <em class="parameter"><code>func</code></em>
+</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>destroy</p></td>
+<td class="parameter_description"><p>The function to call when <em class="parameter"><code>user_data</code></em>
+is not needed anymore. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></td>
+</tr>
 </tbody>
 </table></div>
 </div>
@@ -742,6 +1037,7 @@ hb_unicode_funcs_set_mirroring_func (<em class="parameter"><code><a class="link"
                                      <em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-mirroring-func-t" title="hb_unicode_mirroring_func_t ()"><span class="type">hb_unicode_mirroring_func_t</span></a> func</code></em>,
                                      <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                      <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<p>Sets the implementation function for <a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-mirroring-func-t" title="hb_unicode_mirroring_func_t ()"><span class="type">hb_unicode_mirroring_func_t</span></a>.</p>
 <div class="refsect3">
 <a name="hb-unicode-funcs-set-mirroring-func.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -753,14 +1049,26 @@ hb_unicode_funcs_set_mirroring_func (<em class="parameter"><code><a class="link"
 <tbody>
 <tr>
 <td class="parameter_name"><p>ufuncs</p></td>
-<td class="parameter_description"><p>a Unicode function structure</p></td>
+<td class="parameter_description"><p>A Unicode-functions structure</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>func</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The callback function to assign. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> user_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
 </tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>Data to pass to <em class="parameter"><code>func</code></em>
+</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>destroy</p></td>
+<td class="parameter_description"><p>The function to call when <em class="parameter"><code>user_data</code></em>
+is not needed anymore. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></td>
+</tr>
 </tbody>
 </table></div>
 </div>
@@ -774,6 +1082,7 @@ hb_unicode_funcs_set_script_func (<em class="parameter"><code><a class="link" hr
                                   <em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-script-func-t" title="hb_unicode_script_func_t ()"><span class="type">hb_unicode_script_func_t</span></a> func</code></em>,
                                   <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                   <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
+<p>Sets the implementation function for <a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-script-func-t" title="hb_unicode_script_func_t ()"><span class="type">hb_unicode_script_func_t</span></a>.</p>
 <div class="refsect3">
 <a name="hb-unicode-funcs-set-script-func.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -785,14 +1094,26 @@ hb_unicode_funcs_set_script_func (<em class="parameter"><code><a class="link" hr
 <tbody>
 <tr>
 <td class="parameter_name"><p>ufuncs</p></td>
-<td class="parameter_description"><p>a Unicode function structure</p></td>
+<td class="parameter_description"><p>A Unicode-functions structure</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>func</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>The callback function to assign. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym> user_data][<acronym title="This parameter is a 'destroy_data', for callbacks."><span class="acronym">destroy</span></acronym> destroy][<acronym title="The callback is valid until the GDestroyNotify argument is called."><span class="acronym">scope notified</span></acronym>]</span></td>
 </tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>Data to pass to <em class="parameter"><code>func</code></em>
+</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>destroy</p></td>
+<td class="parameter_description"><p>The function to call when <em class="parameter"><code>user_data</code></em>
+is not needed anymore. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></td>
+</tr>
 </tbody>
 </table></div>
 </div>
@@ -807,6 +1128,7 @@ hb_unicode_funcs_set_user_data (<em class="parameter"><code><a class="link" href
                                 <em class="parameter"><code><span class="type">void</span> *data</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="type">hb_bool_t</span></a> replace</code></em>);</pre>
+<p>Attaches a user-data key/data pair to the specified Unicode-functions structure.</p>
 <p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
 <div class="refsect3">
 <a name="hb-unicode-funcs-set-user-data.parameters"></a><h4>Parameters</h4>
@@ -816,13 +1138,40 @@ hb_unicode_funcs_set_user_data (<em class="parameter"><code><a class="link" href
 <col class="parameters_description">
 <col width="200px" class="parameters_annotations">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
 <td class="parameter_name"><p>ufuncs</p></td>
-<td class="parameter_description"><p>Unicode functions.</p></td>
+<td class="parameter_description"><p>The Unicode-functions structure</p></td>
 <td class="parameter_annotations"> </td>
-</tr></tbody>
+</tr>
+<tr>
+<td class="parameter_name"><p>key</p></td>
+<td class="parameter_description"><p>The user-data key</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>data</p></td>
+<td class="parameter_description"><p>A pointer to the user data</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>destroy</p></td>
+<td class="parameter_description"><p>A callback to call when <em class="parameter"><code>data</code></em>
+is not needed anymore. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>replace</p></td>
+<td class="parameter_description"><p>Whether to replace an existing data with the same key</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
 </table></div>
 </div>
+<div class="refsect3">
+<a name="hb-unicode-funcs-set-user-data.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> if success, <code class="literal">false</code> otherwise</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
 <hr>
@@ -831,6 +1180,36 @@ hb_unicode_funcs_set_user_data (<em class="parameter"><code><a class="link" href
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-general-category-t" title="enum hb_unicode_general_category_t"><span class="returnvalue">hb_unicode_general_category_t</span></a>
 hb_unicode_general_category (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t" title="hb_unicode_funcs_t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>,
                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> unicode</code></em>);</pre>
+<p>Retrieves the General Category (gc) property
+of code point <em class="parameter"><code>unicode</code></em>
+.</p>
+<div class="refsect3">
+<a name="hb-unicode-general-category.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>ufuncs</p></td>
+<td class="parameter_description"><p>The Unicode-functions structure</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>unicode</p></td>
+<td class="parameter_description"><p>The code point to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-unicode-general-category.returns"></a><h4>Returns</h4>
+<p> The <a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-general-category-t" title="enum hb_unicode_general_category_t"><span class="type">hb_unicode_general_category_t</span></a> of <em class="parameter"><code>unicode</code></em>
+</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
 <hr>
@@ -840,6 +1219,41 @@ hb_unicode_general_category (<em class="parameter"><code><a class="link" href="h
 <span class="c_punctuation">(</span>*hb_unicode_general_category_func_t<span class="c_punctuation">)</span> (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t" title="hb_unicode_funcs_t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>,
                                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> unicode</code></em>,
                                        <em class="parameter"><code><span class="type">void</span> *user_data</code></em>);</pre>
+<p>A virtual method for the <a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t" title="hb_unicode_funcs_t"><span class="type">hb_unicode_funcs_t</span></a> structure.</p>
+<p>This method should retrieve the General Category property for
+a specified Unicode code point.</p>
+<div class="refsect3">
+<a name="hb-unicode-general-category-func-t.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>ufuncs</p></td>
+<td class="parameter_description"><p>A Unicode-functions structure</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>unicode</p></td>
+<td class="parameter_description"><p>The code point to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>User data pointer passed by the caller</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-unicode-general-category-func-t.returns"></a><h4>Returns</h4>
+<p> The <a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-general-category-t" title="enum hb_unicode_general_category_t"><span class="type">hb_unicode_general_category_t</span></a> of <em class="parameter"><code>unicode</code></em>
+</p>
+</div>
 </div>
 <hr>
 <div class="refsect2">
@@ -847,6 +1261,36 @@ hb_unicode_general_category (<em class="parameter"><code><a class="link" href="h
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="returnvalue">hb_codepoint_t</span></a>
 hb_unicode_mirroring (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t" title="hb_unicode_funcs_t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>,
                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> unicode</code></em>);</pre>
+<p>Retrieves the Bi-directional Mirroring Glyph code
+point defined for code point <em class="parameter"><code>unicode</code></em>
+.</p>
+<div class="refsect3">
+<a name="hb-unicode-mirroring.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>ufuncs</p></td>
+<td class="parameter_description"><p>The Unicode-functions structure</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>unicode</p></td>
+<td class="parameter_description"><p>The code point to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-unicode-mirroring.returns"></a><h4>Returns</h4>
+<p> The <a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> of the Mirroring Glyph for <em class="parameter"><code>unicode</code></em>
+</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
 <hr>
@@ -856,6 +1300,44 @@ hb_unicode_mirroring (<em class="parameter"><code><a class="link" href="harfbuzz
 <span class="c_punctuation">(</span>*hb_unicode_mirroring_func_t<span class="c_punctuation">)</span> (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t" title="hb_unicode_funcs_t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> unicode</code></em>,
                                 <em class="parameter"><code><span class="type">void</span> *user_data</code></em>);</pre>
+<p>A virtual method for the <a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t" title="hb_unicode_funcs_t"><span class="type">hb_unicode_funcs_t</span></a> structure.</p>
+<p>This method should retrieve the Bi-Directional Mirroring Glyph
+code point for a specified Unicode code point.</p>
+<div class="note">Note: If a code point does not have a specified
+Bi-Directional Mirroring Glyph defined, the method should
+return the original code point.</div>
+<div class="refsect3">
+<a name="hb-unicode-mirroring-func-t.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>ufuncs</p></td>
+<td class="parameter_description"><p>A Unicode-functions structure</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>unicode</p></td>
+<td class="parameter_description"><p>The code point to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>User data pointer passed by the caller</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-unicode-mirroring-func-t.returns"></a><h4>Returns</h4>
+<p> The <a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> of the Mirroring Glyph for <em class="parameter"><code>unicode</code></em>
+</p>
+</div>
 </div>
 <hr>
 <div class="refsect2">
@@ -863,6 +1345,36 @@ hb_unicode_mirroring (<em class="parameter"><code><a class="link" href="harfbuzz
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="returnvalue">hb_script_t</span></a>
 hb_unicode_script (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t" title="hb_unicode_funcs_t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>,
                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> unicode</code></em>);</pre>
+<p>Retrieves the <a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="type">hb_script_t</span></a> script to which code
+point <em class="parameter"><code>unicode</code></em>
+ belongs.</p>
+<div class="refsect3">
+<a name="hb-unicode-script.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>ufuncs</p></td>
+<td class="parameter_description"><p>The Unicode-functions structure</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>unicode</p></td>
+<td class="parameter_description"><p>The code point to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-unicode-script.returns"></a><h4>Returns</h4>
+<p> The <a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="type">hb_script_t</span></a> of <em class="parameter"><code>unicode</code></em>
+</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
 <hr>
@@ -872,6 +1384,41 @@ hb_unicode_script (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 <span class="c_punctuation">(</span>*hb_unicode_script_func_t<span class="c_punctuation">)</span> (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t" title="hb_unicode_funcs_t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>,
                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> unicode</code></em>,
                              <em class="parameter"><code><span class="type">void</span> *user_data</code></em>);</pre>
+<p>A virtual method for the <a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t" title="hb_unicode_funcs_t"><span class="type">hb_unicode_funcs_t</span></a> structure.</p>
+<p>This method should retrieve the Script property for a 
+specified Unicode code point.</p>
+<div class="refsect3">
+<a name="hb-unicode-script-func-t.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>ufuncs</p></td>
+<td class="parameter_description"><p>A Unicode-functions structure</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>unicode</p></td>
+<td class="parameter_description"><p>The code point to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>User data pointer passed by the caller</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-unicode-script-func-t.returns"></a><h4>Returns</h4>
+<p> The <a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="type">hb_script_t</span></a> of <em class="parameter"><code>unicode</code></em>
+</p>
+</div>
 </div>
 </div>
 <div class="refsect1">
@@ -880,11 +1427,17 @@ hb_unicode_script (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 <a name="HB-UNICODE-MAX:CAPS"></a><h3>HB_UNICODE_MAX</h3>
 <pre class="programlisting">#define HB_UNICODE_MAX 0x10FFFFu
 </pre>
+<p>Maximum valid Unicode code point.</p>
 <p class="since">Since: <a class="link" href="api-index-1-9-0.html#api-index-1.9.0">1.9.0</a></p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="hb-unicode-combining-class-t"></a><h3>enum hb_unicode_combining_class_t</h3>
+<p>Data type for the Canonical_Combining_Class (ccc) property
+from the Unicode Character Database.</p>
+<div class="note">Note: newer versions of Unicode may add new values.
+Client programs should be ready to handle any value in the 0..254 range
+being returned from <a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-combining-class" title="hb_unicode_combining_class ()"><code class="function">hb_unicode_combining_class()</code></a>.</div>
 <div class="refsect3">
 <a name="hb-unicode-combining-class-t.members"></a><h4>Members</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -896,288 +1449,402 @@ hb_unicode_script (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 <tbody>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-NOT-REORDERED:CAPS"></a>HB_UNICODE_COMBINING_CLASS_NOT_REORDERED</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>Spacing and enclosing marks; also many vowel and consonant signs, even if nonspacing</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-OVERLAY:CAPS"></a>HB_UNICODE_COMBINING_CLASS_OVERLAY</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>Marks which overlay a base letter or symbol</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-NUKTA:CAPS"></a>HB_UNICODE_COMBINING_CLASS_NUKTA</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>Diacritic nukta marks in Brahmi-derived scripts</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-KANA-VOICING:CAPS"></a>HB_UNICODE_COMBINING_CLASS_KANA_VOICING</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>Hiragana/Katakana voicing marks</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-VIRAMA:CAPS"></a>HB_UNICODE_COMBINING_CLASS_VIRAMA</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>Viramas</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC10:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC10</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Hebrew]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC11:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC11</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Hebrew]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC12:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC12</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Hebrew]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC13:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC13</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Hebrew]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC14:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC14</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Hebrew]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC15:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC15</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Hebrew]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC16:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC16</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Hebrew]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC17:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC17</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Hebrew]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC18:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC18</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Hebrew]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC19:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC19</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Hebrew]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC20:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC20</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Hebrew]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC21:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC21</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Hebrew]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC22:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC22</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Hebrew]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC23:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC23</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Hebrew]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC24:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC24</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Hebrew]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC25:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC25</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Hebrew]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC26:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC26</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Hebrew]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC27:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC27</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Arabic]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC28:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC28</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Arabic]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC29:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC29</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Arabic]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC30:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC30</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Arabic]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC31:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC31</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Arabic]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC32:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC32</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Arabic]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC33:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC33</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Arabic]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC34:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC34</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Arabic]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC35:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC35</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Arabic]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC36:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC36</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Syriac]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC84:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC84</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Telugu]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC91:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC91</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Telugu]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC103:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC103</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Thai]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC107:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC107</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Thai]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC118:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC118</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Lao]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC122:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC122</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Lao]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC129:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC129</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Tibetan]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC130:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC130</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Tibetan]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-CCC133:CAPS"></a>HB_UNICODE_COMBINING_CLASS_CCC133</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Tibetan]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-ATTACHED-BELOW-LEFT:CAPS"></a>HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW_LEFT</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>Marks attached at the bottom left</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-ATTACHED-BELOW:CAPS"></a>HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>Marks attached directly below</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-ATTACHED-ABOVE:CAPS"></a>HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>Marks attached directly above</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-ATTACHED-ABOVE-RIGHT:CAPS"></a>HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE_RIGHT</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>Marks attached at the top right</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-BELOW-LEFT:CAPS"></a>HB_UNICODE_COMBINING_CLASS_BELOW_LEFT</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>Distinct marks at the bottom left</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-BELOW:CAPS"></a>HB_UNICODE_COMBINING_CLASS_BELOW</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>Distinct marks directly below</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-BELOW-RIGHT:CAPS"></a>HB_UNICODE_COMBINING_CLASS_BELOW_RIGHT</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>Distinct marks at the bottom right</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-LEFT:CAPS"></a>HB_UNICODE_COMBINING_CLASS_LEFT</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>Distinct marks to the left</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-RIGHT:CAPS"></a>HB_UNICODE_COMBINING_CLASS_RIGHT</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>Distinct marks to the right</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-ABOVE-LEFT:CAPS"></a>HB_UNICODE_COMBINING_CLASS_ABOVE_LEFT</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>Distinct marks at the top left</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-ABOVE:CAPS"></a>HB_UNICODE_COMBINING_CLASS_ABOVE</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>Distinct marks directly above</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-ABOVE-RIGHT:CAPS"></a>HB_UNICODE_COMBINING_CLASS_ABOVE_RIGHT</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>Distinct marks at the top right</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-DOUBLE-BELOW:CAPS"></a>HB_UNICODE_COMBINING_CLASS_DOUBLE_BELOW</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>Distinct marks subtending two bases</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-DOUBLE-ABOVE:CAPS"></a>HB_UNICODE_COMBINING_CLASS_DOUBLE_ABOVE</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>Distinct marks extending above two bases</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-IOTA-SUBSCRIPT:CAPS"></a>HB_UNICODE_COMBINING_CLASS_IOTA_SUBSCRIPT</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>Greek iota subscript only</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-COMBINING-CLASS-INVALID:CAPS"></a>HB_UNICODE_COMBINING_CLASS_INVALID</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>Invalid combining class</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 </tbody>
 </table></div>
@@ -1188,10 +1855,19 @@ hb_unicode_script (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 <a name="hb-unicode-funcs-t"></a><h3>hb_unicode_funcs_t</h3>
 <pre class="programlisting">typedef struct hb_unicode_funcs_t hb_unicode_funcs_t;
 </pre>
+<p>Data type containing a set of virtual methods used for
+accessing various Unicode character properties.</p>
+<p>HarfBuzz provides a default function for each of the
+methods in <a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t" title="hb_unicode_funcs_t"><span class="type">hb_unicode_funcs_t</span></a>. Client programs can implement
+their own replacements for the individual Unicode functions, as
+needed, and replace the default by calling the setter for a
+method.</p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="hb-unicode-general-category-t"></a><h3>enum hb_unicode_general_category_t</h3>
+<p>Data type for the "General_Category" (gc) property from
+the Unicode Character Database.</p>
 <div class="refsect3">
 <a name="hb-unicode-general-category-t.members"></a><h4>Members</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -1203,153 +1879,213 @@ hb_unicode_script (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 <tbody>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-CONTROL:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_CONTROL</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Cc]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-FORMAT:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_FORMAT</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Cf]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-UNASSIGNED:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_UNASSIGNED</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Cn]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-PRIVATE-USE:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_PRIVATE_USE</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Co]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-SURROGATE:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_SURROGATE</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Cs]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-LOWERCASE-LETTER:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_LOWERCASE_LETTER</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Ll]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-MODIFIER-LETTER:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_MODIFIER_LETTER</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Lm]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-OTHER-LETTER:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_OTHER_LETTER</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Lo]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-TITLECASE-LETTER:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_TITLECASE_LETTER</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Lt]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-UPPERCASE-LETTER:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_UPPERCASE_LETTER</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Lu]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-SPACING-MARK:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_SPACING_MARK</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Mc]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-ENCLOSING-MARK:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Me]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-NON-SPACING-MARK:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Mn]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-DECIMAL-NUMBER:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_DECIMAL_NUMBER</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Nd]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-LETTER-NUMBER:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_LETTER_NUMBER</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Nl]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-OTHER-NUMBER:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_OTHER_NUMBER</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[No]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-CONNECT-PUNCTUATION:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_CONNECT_PUNCTUATION</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Pc]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-DASH-PUNCTUATION:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_DASH_PUNCTUATION</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Pd]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-CLOSE-PUNCTUATION:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_CLOSE_PUNCTUATION</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Pe]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-FINAL-PUNCTUATION:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_FINAL_PUNCTUATION</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Pf]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-INITIAL-PUNCTUATION:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_INITIAL_PUNCTUATION</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Pi]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-OTHER-PUNCTUATION:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_OTHER_PUNCTUATION</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Po]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-OPEN-PUNCTUATION:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_OPEN_PUNCTUATION</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Ps]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-CURRENCY-SYMBOL:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_CURRENCY_SYMBOL</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Sc]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-MODIFIER-SYMBOL:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_MODIFIER_SYMBOL</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Sk]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-MATH-SYMBOL:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_MATH_SYMBOL</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Sm]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-OTHER-SYMBOL:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_OTHER_SYMBOL</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[So]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-LINE-SEPARATOR:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_LINE_SEPARATOR</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Zl]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-PARAGRAPH-SEPARATOR:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_PARAGRAPH_SEPARATOR</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Zp]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-UNICODE-GENERAL-CATEGORY-SPACE-SEPARATOR:CAPS"></a>HB_UNICODE_GENERAL_CATEGORY_SPACE_SEPARATOR</p></td>
-<td> </td>
-<td> </td>
+<td class="enum_member_description">
+<p>[Zs]</p>
+</td>
+<td class="enum_member_annotations"> </td>
 </tr>
 </tbody>
 </table></div>
@@ -1358,6 +2094,6 @@ hb_unicode_script (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index 84eb4c3..3eb26dd 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-uniscribe: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch15.html" title="Integration API">
+<link rel="up" href="integration-api.html" title="Integration API">
 <link rel="prev" href="harfbuzz-hb-icu.html" title="hb-icu">
-<link rel="next" href="api-index-full.html" title="API Index">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<link rel="next" href="harfbuzz-hb-gdi.html" title="hb-gdi">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -18,9 +18,9 @@
                   <a href="#harfbuzz-hb-uniscribe.description" class="shortcut">Description</a></span>
 </td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><a accesskey="u" href="ch15.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="u" href="integration-api.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
 <td><a accesskey="p" href="harfbuzz-hb-icu.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="api-index-full.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+<td><a accesskey="n" href="harfbuzz-hb-gdi.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <div class="refentry">
 <a name="harfbuzz-hb-uniscribe"></a><div class="titlepage"></div>
@@ -125,6 +125,6 @@ specified <a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index ac4a8b1..faa4b58 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-version: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch12.html" title="Core API">
+<link rel="up" href="core-api.html" title="Core API">
 <link rel="prev" href="harfbuzz-hb-unicode.html" title="hb-unicode">
-<link rel="next" href="ch13.html" title="OpenType API">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<link rel="next" href="opentype-api.html" title="OpenType API">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -18,9 +18,9 @@
                   <a href="#harfbuzz-hb-version.description" class="shortcut">Description</a></span>
 </td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><a accesskey="u" href="ch12.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="u" href="core-api.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
 <td><a accesskey="p" href="harfbuzz-hb-unicode.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="ch13.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+<td><a accesskey="n" href="opentype-api.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <div class="refentry">
 <a name="harfbuzz-hb-version"></a><div class="titlepage"></div>
@@ -114,6 +114,35 @@ conditionally based on those versions, again, at compile- or run-time.</p>
 <div class="refsect2">
 <a name="HB-VERSION-ATLEAST:CAPS"></a><h3>HB_VERSION_ATLEAST()</h3>
 <pre class="programlisting">#define             HB_VERSION_ATLEAST(major,minor,micro)</pre>
+<p>Tests the library version at compile-time against a minimum value,
+as three integer components.</p>
+<div class="refsect3">
+<a name="HB-VERSION-ATLEAST.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>major</p></td>
+<td class="parameter_description"><p>the major component of the version number</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>minor</p></td>
+<td class="parameter_description"><p>the minor component of the version number</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>micro</p></td>
+<td class="parameter_description"><p>the micro component of the version number</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
 </div>
 <hr>
 <div class="refsect2">
@@ -159,6 +188,40 @@ hb_version (<em class="parameter"><code>unsigned <span class="type">int</span> *
 hb_version_atleast (<em class="parameter"><code>unsigned <span class="type">int</span> major</code></em>,
                     <em class="parameter"><code>unsigned <span class="type">int</span> minor</code></em>,
                     <em class="parameter"><code>unsigned <span class="type">int</span> micro</code></em>);</pre>
+<p>Tests the library version against a minimum value,
+as three integer components.</p>
+<div class="refsect3">
+<a name="hb-version-atleast.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>major</p></td>
+<td class="parameter_description"><p>Library major version component</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>minor</p></td>
+<td class="parameter_description"><p>Library minor version component</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>micro</p></td>
+<td class="parameter_description"><p>Library micro version component</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-version-atleast.returns"></a><h4>Returns</h4>
+<p> <code class="literal">true</code> if the library is equal to or greater than
+the test value, <code class="literal">false</code> otherwise</p>
+</div>
 <p class="since">Since: <a class="link" href="api-index-0-9-30.html#api-index-0.9.30">0.9.30</a></p>
 </div>
 <hr>
@@ -169,7 +232,7 @@ hb_version_string (<em class="parameter"><code><span class="type">void</span></c
 <p>Returns library version as a string with three components.</p>
 <div class="refsect3">
 <a name="hb-version-string.returns"></a><h4>Returns</h4>
-<p> library version string.</p>
+<p> Library version string</p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
@@ -178,30 +241,34 @@ hb_version_string (<em class="parameter"><code><span class="type">void</span></c
 <a name="harfbuzz-hb-version.other_details"></a><h2>Types and Values</h2>
 <div class="refsect2">
 <a name="HB-VERSION-MAJOR:CAPS"></a><h3>HB_VERSION_MAJOR</h3>
-<pre class="programlisting">#define HB_VERSION_MAJOR 2
+<pre class="programlisting">#define HB_VERSION_MAJOR 3
 </pre>
+<p>The major component of the library version available at compile-time.</p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="HB-VERSION-MICRO:CAPS"></a><h3>HB_VERSION_MICRO</h3>
-<pre class="programlisting">#define HB_VERSION_MICRO 7
+<pre class="programlisting">#define HB_VERSION_MICRO 0
 </pre>
+<p>The micro component of the library version available at compile-time.</p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="HB-VERSION-MINOR:CAPS"></a><h3>HB_VERSION_MINOR</h3>
-<pre class="programlisting">#define HB_VERSION_MINOR 6
+<pre class="programlisting">#define HB_VERSION_MINOR 4
 </pre>
+<p>The minor component of the library version available at compile-time.</p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="HB-VERSION-STRING:CAPS"></a><h3>HB_VERSION_STRING</h3>
-<pre class="programlisting">#define HB_VERSION_STRING "2.6.7"
+<pre class="programlisting">#define HB_VERSION_STRING "3.4.0"
 </pre>
+<p>A string literal containing the library version available at compile-time.</p>
 </div>
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index 333bbee..4427c2e 100644 (file)
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="utf-8" standalone="no"?>
 <book xmlns="http://www.devhelp.net/book" title="HarfBuzz Manual" link="index.html" author="" name="harfbuzz" version="2" language="c">
   <chapters>
-    <sub name="User's manual" link="pt01.html">
+    <sub name="User's manual" link="user-manual.html">
       <sub name="What is HarfBuzz?" link="what-is-harfbuzz.html">
         <sub name="What is text shaping?" link="what-is-harfbuzz.html#what-is-text-shaping"/>
         <sub name="Why do I need a shaping engine?" link="why-do-i-need-a-shaping-engine.html"/>
-        <sub name="What does HarfBuzz do?" link="ch01s03.html"/>
+        <sub name="What does HarfBuzz do?" link="what-does-harfbuzz-do.html"/>
         <sub name="What HarfBuzz doesn't do" link="what-harfbuzz-doesnt-do.html"/>
         <sub name="Why is it called HarfBuzz?" link="why-is-it-called-harfbuzz.html"/>
       </sub>
@@ -19,9 +19,9 @@
         </sub>
       </sub>
       <sub name="Getting started with HarfBuzz" link="getting-started.html">
-        <sub name="An overview of the HarfBuzz shaping API" link="getting-started.html#id-1.2.4.2"/>
-        <sub name="Terminology" link="ch03s02.html"/>
-        <sub name="A simple shaping example" link="ch03s03.html"/>
+        <sub name="An overview of the HarfBuzz shaping API" link="getting-started.html#an-overview-of-the-harfbuzz-shaping-api"/>
+        <sub name="Terminology" link="terminology.html"/>
+        <sub name="A simple shaping example" link="a-simple-shaping-example.html"/>
       </sub>
       <sub name="Shaping concepts" link="shaping-concepts.html">
         <sub name="Text shaping" link="shaping-concepts.html#text-shaping-concepts"/>
@@ -77,7 +77,6 @@
           <sub name="hb-subset" link="utilities.html#utilities-command-line-hbsubset"/>
         </sub>
         <sub name="Common data types and APIs" link="utilities-common-types-apis.html"/>
-        <sub name="UCDN" link="utilities-ucdn.html"/>
       </sub>
       <sub name="Platform Integration Guide" link="integration.html">
         <sub name="GNOME integration, GLib, and GObject" link="integration.html#integration-glib"/>
@@ -88,8 +87,8 @@
         <sub name="Python bindings" link="integration-python.html"/>
       </sub>
     </sub>
-    <sub name="Reference manual" link="pt02.html">
-      <sub name="Core API" link="ch12.html">
+    <sub name="Reference manual" link="reference-manual.html">
+      <sub name="Core API" link="core-api.html">
         <sub name="hb-blob" link="harfbuzz-hb-blob.html"/>
         <sub name="hb-buffer" link="harfbuzz-hb-buffer.html"/>
         <sub name="hb-common" link="harfbuzz-hb-common.html"/>
         <sub name="hb-unicode" link="harfbuzz-hb-unicode.html"/>
         <sub name="hb-version" link="harfbuzz-hb-version.html"/>
       </sub>
-      <sub name="OpenType API" link="ch13.html">
+      <sub name="OpenType API" link="opentype-api.html">
         <sub name="hb-ot-color" link="harfbuzz-hb-ot-color.html"/>
         <sub name="hb-ot-font" link="harfbuzz-hb-ot-font.html"/>
         <sub name="hb-ot-layout" link="harfbuzz-hb-ot-layout.html"/>
         <sub name="hb-ot-math" link="harfbuzz-hb-ot-math.html"/>
+        <sub name="hb-ot-meta" link="harfbuzz-hb-ot-meta.html"/>
+        <sub name="hb-ot-metrics" link="harfbuzz-hb-ot-metrics.html"/>
         <sub name="hb-ot-name" link="harfbuzz-hb-ot-name.html"/>
         <sub name="hb-ot-shape" link="harfbuzz-hb-ot-shape.html"/>
         <sub name="hb-ot-var" link="harfbuzz-hb-ot-var.html"/>
       </sub>
-      <sub name="Apple Advanced Typography API" link="ch14.html">
+      <sub name="Apple Advanced Typography API" link="apple-advanced-typography-api.html">
         <sub name="hb-aat-layout" link="harfbuzz-hb-aat-layout.html"/>
       </sub>
-      <sub name="Integration API" link="ch15.html">
+      <sub name="Integration API" link="integration-api.html">
         <sub name="hb-coretext" link="harfbuzz-hb-coretext.html"/>
         <sub name="hb-ft" link="harfbuzz-hb-ft.html"/>
         <sub name="hb-glib" link="harfbuzz-hb-glib.html"/>
-        <sub name="hb-gobject" link="harfbuzz-hb-gobject.html"/>
         <sub name="hb-graphite2" link="harfbuzz-hb-graphite2.html"/>
         <sub name="hb-icu" link="harfbuzz-hb-icu.html"/>
         <sub name="hb-uniscribe" link="harfbuzz-hb-uniscribe.html"/>
+        <sub name="hb-gdi" link="harfbuzz-hb-gdi.html"/>
+        <sub name="hb-directwrite" link="harfbuzz-hb-directwrite.html"/>
+      </sub>
+      <sub name="Style API" link="style-api.html">
+        <sub name="hb-style" link="harfbuzz-hb-style.html"/>
+      </sub>
+      <sub name="Subset API" link="subset-api.html">
+        <sub name="hb-subset" link="harfbuzz-hb-subset.html"/>
       </sub>
       <sub name="API Index" link="api-index-full.html"/>
       <sub name="Index of deprecated API" link="deprecated-api-index.html"/>
+      <sub name="Index of new symbols in 3.4.0" link="api-index-3-4-0.html"/>
+      <sub name="Index of new symbols in 3.3.0" link="api-index-3-3-0.html"/>
+      <sub name="Index of new symbols in 3.1.0" link="api-index-3-1-0.html"/>
+      <sub name="Index of new symbols in 3.0.0" link="api-index-3-0-0.html"/>
+      <sub name="Index of new symbols in 2.9.1" link="api-index-2-9-1.html"/>
+      <sub name="Index of new symbols in 2.9.0" link="api-index-2-9-0.html"/>
+      <sub name="Index of new symbols in 2.8.2" link="api-index-2-8-2.html"/>
+      <sub name="Index of new symbols in 2.7.3" link="api-index-2-7-3.html"/>
+      <sub name="Index of new symbols in 2.6.8" link="api-index-2-6-8.html"/>
+      <sub name="Index of new symbols in 2.6.5" link="api-index-2-6-5.html"/>
+      <sub name="Index of new symbols in 2.6.3" link="api-index-2-6-3.html"/>
       <sub name="Index of new symbols in 2.6.0" link="api-index-2-6-0.html"/>
       <sub name="Index of new symbols in 2.5.0" link="api-index-2-5-0.html"/>
       <sub name="Index of new symbols in 2.4.0" link="api-index-2-4-0.html"/>
       <sub name="Index of new symbols in 1.8.0" link="api-index-1-8-0.html"/>
       <sub name="Index of new symbols in 1.7.7" link="api-index-1-7-7.html"/>
       <sub name="Index of new symbols in 1.7.5" link="api-index-1-7-5.html"/>
+      <sub name="Index of new symbols in 1.7.2" link="api-index-1-7-2.html"/>
       <sub name="Index of new symbols in 1.6.0" link="api-index-1-6-0.html"/>
       <sub name="Index of new symbols in 1.5.0" link="api-index-1-5-0.html"/>
       <sub name="Index of new symbols in 1.4.3" link="api-index-1-4-3.html"/>
       <sub name="Index of new symbols in 1.4.2" link="api-index-1-4-2.html"/>
+      <sub name="Index of new symbols in 1.4.0" link="api-index-1-4-0.html"/>
       <sub name="Index of new symbols in 1.3.3" link="api-index-1-3-3.html"/>
       <sub name="Index of new symbols in 1.2.3" link="api-index-1-2-3.html"/>
       <sub name="Index of new symbols in 1.1.3" link="api-index-1-1-3.html"/>
       <sub name="Index of new symbols in 0.9.41" link="api-index-0-9-41.html"/>
       <sub name="Index of new symbols in 0.9.39" link="api-index-0-9-39.html"/>
       <sub name="Index of new symbols in 0.9.38" link="api-index-0-9-38.html"/>
+      <sub name="Index of new symbols in 0.9.33" link="api-index-0-9-33.html"/>
       <sub name="Index of new symbols in 0.9.31" link="api-index-0-9-31.html"/>
       <sub name="Index of new symbols in 0.9.30" link="api-index-0-9-30.html"/>
       <sub name="Index of new symbols in 0.9.28" link="api-index-0-9-28.html"/>
+      <sub name="Index of new symbols in 0.9.26" link="api-index-0-9-26.html"/>
       <sub name="Index of new symbols in 0.9.22" link="api-index-0-9-22.html"/>
+      <sub name="Index of new symbols in 0.9.21" link="api-index-0-9-21.html"/>
       <sub name="Index of new symbols in 0.9.20" link="api-index-0-9-20.html"/>
       <sub name="Index of new symbols in 0.9.11" link="api-index-0-9-11.html"/>
       <sub name="Index of new symbols in 0.9.10" link="api-index-0-9-10.html"/>
       <sub name="Index of new symbols in 0.9.7" link="api-index-0-9-7.html"/>
       <sub name="Index of new symbols in 0.9.5" link="api-index-0-9-5.html"/>
       <sub name="Index of new symbols in 0.9.2" link="api-index-0-9-2.html"/>
+      <sub name="Index of new symbols in 0.6.0" link="api-index-0-6-0.html"/>
       <sub name="Annotation Glossary" link="annotation-glossary.html"/>
     </sub>
   </chapters>
   <functions>
     <keyword type="function" name="hb_blob_create ()" link="harfbuzz-hb-blob.html#hb-blob-create" since="0.9.2"/>
+    <keyword type="function" name="hb_blob_create_or_fail ()" link="harfbuzz-hb-blob.html#hb-blob-create-or-fail" since="2.8.2"/>
     <keyword type="function" name="hb_blob_create_from_file ()" link="harfbuzz-hb-blob.html#hb-blob-create-from-file" since="1.7.7"/>
+    <keyword type="function" name="hb_blob_create_from_file_or_fail ()" link="harfbuzz-hb-blob.html#hb-blob-create-from-file-or-fail" since="2.8.2"/>
     <keyword type="function" name="hb_blob_create_sub_blob ()" link="harfbuzz-hb-blob.html#hb-blob-create-sub-blob" since="0.9.2"/>
     <keyword type="function" name="hb_blob_copy_writable_or_fail ()" link="harfbuzz-hb-blob.html#hb-blob-copy-writable-or-fail" since="1.8.0"/>
     <keyword type="function" name="hb_blob_destroy ()" link="harfbuzz-hb-blob.html#hb-blob-destroy" since="0.9.2"/>
     <keyword type="typedef" name="hb_blob_t" link="harfbuzz-hb-blob.html#hb-blob-t"/>
     <keyword type="enum" name="enum hb_memory_mode_t" link="harfbuzz-hb-blob.html#hb-memory-mode-t"/>
     <keyword type="function" name="hb_buffer_create ()" link="harfbuzz-hb-buffer.html#hb-buffer-create" since="0.9.2"/>
+    <keyword type="function" name="hb_buffer_create_similar ()" link="harfbuzz-hb-buffer.html#hb-buffer-create-similar" since="3.3.0"/>
     <keyword type="function" name="hb_buffer_reference ()" link="harfbuzz-hb-buffer.html#hb-buffer-reference" since="0.9.2"/>
     <keyword type="function" name="hb_buffer_get_empty ()" link="harfbuzz-hb-buffer.html#hb-buffer-get-empty" since="0.9.2"/>
     <keyword type="function" name="hb_buffer_destroy ()" link="harfbuzz-hb-buffer.html#hb-buffer-destroy" since="0.9.2"/>
     <keyword type="function" name="hb_buffer_get_user_data ()" link="harfbuzz-hb-buffer.html#hb-buffer-get-user-data" since="0.9.2"/>
     <keyword type="function" name="hb_buffer_get_glyph_infos ()" link="harfbuzz-hb-buffer.html#hb-buffer-get-glyph-infos" since="0.9.2"/>
     <keyword type="function" name="hb_buffer_get_glyph_positions ()" link="harfbuzz-hb-buffer.html#hb-buffer-get-glyph-positions" since="0.9.2"/>
+    <keyword type="function" name="hb_buffer_has_positions ()" link="harfbuzz-hb-buffer.html#hb-buffer-has-positions" since="2.7.3"/>
     <keyword type="function" name="hb_buffer_get_invisible_glyph ()" link="harfbuzz-hb-buffer.html#hb-buffer-get-invisible-glyph" since="2.0.0"/>
     <keyword type="function" name="hb_buffer_set_invisible_glyph ()" link="harfbuzz-hb-buffer.html#hb-buffer-set-invisible-glyph" since="2.0.0"/>
+    <keyword type="function" name="hb_buffer_get_not_found_glyph ()" link="harfbuzz-hb-buffer.html#hb-buffer-get-not-found-glyph" since="3.1.0"/>
+    <keyword type="function" name="hb_buffer_set_not_found_glyph ()" link="harfbuzz-hb-buffer.html#hb-buffer-set-not-found-glyph" since="3.1.0"/>
     <keyword type="function" name="hb_buffer_set_replacement_codepoint ()" link="harfbuzz-hb-buffer.html#hb-buffer-set-replacement-codepoint" since="0.9.31"/>
     <keyword type="function" name="hb_buffer_get_replacement_codepoint ()" link="harfbuzz-hb-buffer.html#hb-buffer-get-replacement-codepoint" since="0.9.31"/>
     <keyword type="function" name="hb_buffer_normalize_glyphs ()" link="harfbuzz-hb-buffer.html#hb-buffer-normalize-glyphs" since="0.9.2"/>
     <keyword type="function" name="hb_buffer_reverse ()" link="harfbuzz-hb-buffer.html#hb-buffer-reverse" since="0.9.2"/>
     <keyword type="function" name="hb_buffer_reverse_range ()" link="harfbuzz-hb-buffer.html#hb-buffer-reverse-range" since="0.9.41"/>
     <keyword type="function" name="hb_buffer_reverse_clusters ()" link="harfbuzz-hb-buffer.html#hb-buffer-reverse-clusters" since="0.9.2"/>
+    <keyword type="function" name="hb_buffer_serialize ()" link="harfbuzz-hb-buffer.html#hb-buffer-serialize" since="2.7.3"/>
     <keyword type="function" name="hb_buffer_serialize_glyphs ()" link="harfbuzz-hb-buffer.html#hb-buffer-serialize-glyphs" since="0.9.7"/>
     <keyword type="function" name="hb_buffer_deserialize_glyphs ()" link="harfbuzz-hb-buffer.html#hb-buffer-deserialize-glyphs" since="0.9.7"/>
+    <keyword type="function" name="hb_buffer_serialize_unicode ()" link="harfbuzz-hb-buffer.html#hb-buffer-serialize-unicode" since="2.7.3"/>
+    <keyword type="function" name="hb_buffer_deserialize_unicode ()" link="harfbuzz-hb-buffer.html#hb-buffer-deserialize-unicode" since="2.7.3"/>
     <keyword type="function" name="hb_buffer_serialize_format_from_string ()" link="harfbuzz-hb-buffer.html#hb-buffer-serialize-format-from-string" since="0.9.7"/>
     <keyword type="function" name="hb_buffer_serialize_format_to_string ()" link="harfbuzz-hb-buffer.html#hb-buffer-serialize-format-to-string" since="0.9.7"/>
     <keyword type="function" name="hb_buffer_serialize_list_formats ()" link="harfbuzz-hb-buffer.html#hb-buffer-serialize-list-formats" since="0.9.7"/>
     <keyword type="function" name="hb_segment_properties_equal ()" link="harfbuzz-hb-buffer.html#hb-segment-properties-equal" since="0.9.7"/>
     <keyword type="function" name="hb_segment_properties_hash ()" link="harfbuzz-hb-buffer.html#hb-segment-properties-hash" since="0.9.7"/>
+    <keyword type="function" name="hb_segment_properties_overlay ()" link="harfbuzz-hb-buffer.html#hb-segment-properties-overlay" since="3.3.0"/>
     <keyword type="function" name="hb_buffer_diff ()" link="harfbuzz-hb-buffer.html#hb-buffer-diff" since="1.5.0"/>
     <keyword type="function" name="hb_buffer_set_message_func ()" link="harfbuzz-hb-buffer.html#hb-buffer-set-message-func" since="1.1.3"/>
     <keyword type="function" name="hb_glyph_info_get_glyph_flags ()" link="harfbuzz-hb-buffer.html#hb-glyph-info-get-glyph-flags" since="1.5.0"/>
-    <keyword type="function" name="hb_buffer_message_func_t ()" link="harfbuzz-hb-buffer.html#hb-buffer-message-func-t"/>
+    <keyword type="function" name="hb_buffer_message_func_t ()" link="harfbuzz-hb-buffer.html#hb-buffer-message-func-t" since="1.1.3"/>
     <keyword type="macro" name="HB_SEGMENT_PROPERTIES_DEFAULT" link="harfbuzz-hb-buffer.html#HB-SEGMENT-PROPERTIES-DEFAULT:CAPS"/>
     <keyword type="macro" name="HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT" link="harfbuzz-hb-buffer.html#HB-BUFFER-REPLACEMENT-CODEPOINT-DEFAULT:CAPS" since="0.9.31"/>
     <keyword type="typedef" name="hb_buffer_t" link="harfbuzz-hb-buffer.html#hb-buffer-t"/>
+    <keyword type="struct" name="hb_glyph_info_t" link="harfbuzz-hb-buffer.html#hb-glyph-info-t"/>
     <keyword type="enum" name="enum hb_glyph_flags_t" link="harfbuzz-hb-buffer.html#hb-glyph-flags-t" since="1.5.0"/>
     <keyword type="struct" name="hb_glyph_position_t" link="harfbuzz-hb-buffer.html#hb-glyph-position-t"/>
     <keyword type="enum" name="enum hb_buffer_content_type_t" link="harfbuzz-hb-buffer.html#hb-buffer-content-type-t"/>
     <keyword type="struct" name="hb_segment_properties_t" link="harfbuzz-hb-buffer.html#hb-segment-properties-t"/>
     <keyword type="enum" name="enum hb_buffer_serialize_format_t" link="harfbuzz-hb-buffer.html#hb-buffer-serialize-format-t" since="0.9.2"/>
     <keyword type="enum" name="enum hb_buffer_serialize_flags_t" link="harfbuzz-hb-buffer.html#hb-buffer-serialize-flags-t" since="0.9.20"/>
-    <keyword type="enum" name="enum hb_buffer_diff_flags_t" link="harfbuzz-hb-buffer.html#hb-buffer-diff-flags-t"/>
+    <keyword type="enum" name="enum hb_buffer_diff_flags_t" link="harfbuzz-hb-buffer.html#hb-buffer-diff-flags-t" since="1.5.0"/>
     <keyword type="function" name="hb_tag_from_string ()" link="harfbuzz-hb-common.html#hb-tag-from-string" since="0.9.2"/>
     <keyword type="function" name="hb_tag_to_string ()" link="harfbuzz-hb-common.html#hb-tag-to-string" since="0.9.5"/>
     <keyword type="function" name="hb_direction_from_string ()" link="harfbuzz-hb-common.html#hb-direction-from-string" since="0.9.2"/>
     <keyword type="function" name="hb_variation_to_string ()" link="harfbuzz-hb-common.html#hb-variation-to-string" since="1.4.2"/>
     <keyword type="function" name="hb_destroy_func_t ()" link="harfbuzz-hb-common.html#hb-destroy-func-t"/>
     <keyword type="macro" name="HB_TAG()" link="harfbuzz-hb-common.html#HB-TAG:CAPS"/>
-    <keyword type="macro" name="HB_UNTAG()" link="harfbuzz-hb-common.html#HB-UNTAG:CAPS"/>
+    <keyword type="macro" name="HB_UNTAG()" link="harfbuzz-hb-common.html#HB-UNTAG:CAPS" since="0.6.0"/>
     <keyword type="macro" name="HB_DIRECTION_REVERSE()" link="harfbuzz-hb-common.html#HB-DIRECTION-REVERSE:CAPS"/>
     <keyword type="macro" name="HB_DIRECTION_IS_BACKWARD()" link="harfbuzz-hb-common.html#HB-DIRECTION-IS-BACKWARD:CAPS"/>
     <keyword type="macro" name="HB_DIRECTION_IS_FORWARD()" link="harfbuzz-hb-common.html#HB-DIRECTION-IS-FORWARD:CAPS"/>
     <keyword type="typedef" name="hb_tag_t" link="harfbuzz-hb-common.html#hb-tag-t"/>
     <keyword type="enum" name="enum hb_script_t" link="harfbuzz-hb-common.html#hb-script-t"/>
     <keyword type="struct" name="hb_user_data_key_t" link="harfbuzz-hb-common.html#hb-user-data-key-t"/>
-    <keyword type="union" name="hb_var_int_t" link="harfbuzz-hb-common.html#hb-var-int-t"/>
     <keyword type="macro" name="HB_TAG_NONE" link="harfbuzz-hb-common.html#HB-TAG-NONE:CAPS"/>
-    <keyword type="macro" name="HB_TAG_MAX" link="harfbuzz-hb-common.html#HB-TAG-MAX:CAPS"/>
-    <keyword type="macro" name="HB_TAG_MAX_SIGNED" link="harfbuzz-hb-common.html#HB-TAG-MAX-SIGNED:CAPS"/>
-    <keyword type="macro" name="HB_LANGUAGE_INVALID" link="harfbuzz-hb-common.html#HB-LANGUAGE-INVALID:CAPS"/>
+    <keyword type="macro" name="HB_TAG_MAX" link="harfbuzz-hb-common.html#HB-TAG-MAX:CAPS" since="0.9.26"/>
+    <keyword type="macro" name="HB_TAG_MAX_SIGNED" link="harfbuzz-hb-common.html#HB-TAG-MAX-SIGNED:CAPS" since="0.9.33"/>
+    <keyword type="macro" name="HB_LANGUAGE_INVALID" link="harfbuzz-hb-common.html#HB-LANGUAGE-INVALID:CAPS" since="0.6.0"/>
     <keyword type="macro" name="HB_FEATURE_GLOBAL_END" link="harfbuzz-hb-common.html#HB-FEATURE-GLOBAL-END:CAPS" since="2.0.0"/>
     <keyword type="macro" name="HB_FEATURE_GLOBAL_START" link="harfbuzz-hb-common.html#HB-FEATURE-GLOBAL-START:CAPS" since="2.0.0"/>
-    <keyword type="function" name="hb_font_get_glyph_func_t ()" link="harfbuzz-hb-deprecated.html#hb-font-get-glyph-func-t" deprecated=""/>
+    <keyword type="function" name="hb_font_get_glyph_func_t ()" link="harfbuzz-hb-deprecated.html#hb-font-get-glyph-func-t" deprecated="1.2.3"/>
     <keyword type="function" name="hb_ot_layout_table_find_script ()" link="harfbuzz-hb-deprecated.html#hb-ot-layout-table-find-script"/>
     <keyword type="function" name="hb_unicode_eastasian_width_func_t ()" link="harfbuzz-hb-deprecated.html#hb-unicode-eastasian-width-func-t" deprecated="2.0.0"/>
+    <keyword type="function" name="hb_unicode_eastasian_width ()" link="harfbuzz-hb-deprecated.html#hb-unicode-eastasian-width" deprecated="2.0.0" since="0.9.2"/>
+    <keyword type="function" name="hb_unicode_funcs_set_eastasian_width_func ()" link="harfbuzz-hb-deprecated.html#hb-unicode-funcs-set-eastasian-width-func" deprecated="2.0.0" since="0.9.2"/>
     <keyword type="function" name="hb_unicode_decompose_compatibility_func_t ()" link="harfbuzz-hb-deprecated.html#hb-unicode-decompose-compatibility-func-t" deprecated="2.0.0"/>
+    <keyword type="function" name="hb_unicode_decompose_compatibility ()" link="harfbuzz-hb-deprecated.html#hb-unicode-decompose-compatibility" deprecated="2.0.0" since="0.9.2"/>
+    <keyword type="function" name="hb_unicode_funcs_set_decompose_compatibility_func ()" link="harfbuzz-hb-deprecated.html#hb-unicode-funcs-set-decompose-compatibility-func" deprecated="2.0.0" since="0.9.2"/>
     <keyword type="function" name="hb_font_funcs_set_glyph_v_kerning_func ()" link="harfbuzz-hb-deprecated.html#hb-font-funcs-set-glyph-v-kerning-func" deprecated="2.0.0" since="0.9.2"/>
     <keyword type="function" name="hb_font_get_glyph_v_kerning ()" link="harfbuzz-hb-deprecated.html#hb-font-get-glyph-v-kerning" deprecated="2.0.0" since="0.9.2"/>
-    <keyword type="macro" name="HB_BUFFER_FLAGS_DEFAULT" link="harfbuzz-hb-deprecated.html#HB-BUFFER-FLAGS-DEFAULT:CAPS" deprecated=""/>
-    <keyword type="macro" name="HB_BUFFER_SERIALIZE_FLAGS_DEFAULT" link="harfbuzz-hb-deprecated.html#HB-BUFFER-SERIALIZE-FLAGS-DEFAULT:CAPS" deprecated=""/>
-    <keyword type="macro" name="HB_SCRIPT_CANADIAN_ABORIGINAL" link="harfbuzz-hb-deprecated.html#HB-SCRIPT-CANADIAN-ABORIGINAL:CAPS" deprecated=""/>
-    <keyword type="macro" name="HB_MATH_GLYPH_PART_FLAG_EXTENDER" link="harfbuzz-hb-deprecated.html#HB-MATH-GLYPH-PART-FLAG-EXTENDER:CAPS" deprecated=""/>
+    <keyword type="macro" name="HB_BUFFER_FLAGS_DEFAULT" link="harfbuzz-hb-deprecated.html#HB-BUFFER-FLAGS-DEFAULT:CAPS" deprecated="0.9.20"/>
+    <keyword type="macro" name="HB_BUFFER_SERIALIZE_FLAGS_DEFAULT" link="harfbuzz-hb-deprecated.html#HB-BUFFER-SERIALIZE-FLAGS-DEFAULT:CAPS" deprecated="0.9.20"/>
+    <keyword type="macro" name="HB_SCRIPT_CANADIAN_ABORIGINAL" link="harfbuzz-hb-deprecated.html#HB-SCRIPT-CANADIAN-ABORIGINAL:CAPS" deprecated="0.9.20"/>
+    <keyword type="macro" name="HB_MATH_GLYPH_PART_FLAG_EXTENDER" link="harfbuzz-hb-deprecated.html#HB-MATH-GLYPH-PART-FLAG-EXTENDER:CAPS" deprecated="2.5.1"/>
+    <keyword type="macro" name="HB_OT_MATH_SCRIPT" link="harfbuzz-hb-deprecated.html#HB-OT-MATH-SCRIPT:CAPS" deprecated="3.4.0" since="1.3.3"/>
     <keyword type="macro" name="HB_OT_VAR_NO_AXIS_INDEX" link="harfbuzz-hb-deprecated.html#HB-OT-VAR-NO-AXIS-INDEX:CAPS" deprecated="2.2.0" since="1.4.2"/>
+    <keyword type="struct" name="hb_ot_var_axis_t" link="harfbuzz-hb-deprecated.html#hb-ot-var-axis-t" deprecated="2.2.0" since="1.4.2"/>
     <keyword type="macro" name="HB_UNICODE_MAX_DECOMPOSITION_LEN" link="harfbuzz-hb-deprecated.html#HB-UNICODE-MAX-DECOMPOSITION-LEN:CAPS" deprecated="2.0.0"/>
     <keyword type="typedef" name="hb_font_get_glyph_v_kerning_func_t" link="harfbuzz-hb-deprecated.html#hb-font-get-glyph-v-kerning-func-t" deprecated=""/>
     <keyword type="function" name="hb_face_count ()" link="harfbuzz-hb-face.html#hb-face-count" since="1.7.7"/>
     <keyword type="function" name="hb_font_get_nominal_glyphs_func_t ()" link="harfbuzz-hb-font.html#hb-font-get-nominal-glyphs-func-t"/>
     <keyword type="function" name="hb_font_get_parent ()" link="harfbuzz-hb-font.html#hb-font-get-parent" since="0.9.2"/>
     <keyword type="function" name="hb_font_get_ppem ()" link="harfbuzz-hb-font.html#hb-font-get-ppem" since="0.9.2"/>
-    <keyword type="function" name="hb_font_get_ptem ()" link="harfbuzz-hb-font.html#hb-font-get-ptem" since="0.9.2"/>
+    <keyword type="function" name="hb_font_get_ptem ()" link="harfbuzz-hb-font.html#hb-font-get-ptem" since="1.6.0"/>
     <keyword type="function" name="hb_font_get_scale ()" link="harfbuzz-hb-font.html#hb-font-get-scale" since="0.9.2"/>
+    <keyword type="function" name="hb_font_get_synthetic_slant ()" link="harfbuzz-hb-font.html#hb-font-get-synthetic-slant" since="3.3.0"/>
     <keyword type="function" name="hb_font_get_user_data ()" link="harfbuzz-hb-font.html#hb-font-get-user-data" since="0.9.2"/>
     <keyword type="function" name="hb_font_get_variation_glyph ()" link="harfbuzz-hb-font.html#hb-font-get-variation-glyph" since="1.2.3"/>
     <keyword type="function" name="hb_font_get_variation_glyph_func_t ()" link="harfbuzz-hb-font.html#hb-font-get-variation-glyph-func-t"/>
-    <keyword type="function" name="hb_font_get_var_coords_design ()" link="harfbuzz-hb-font.html#hb-font-get-var-coords-design" since="EXPERIMENTAL"/>
+    <keyword type="function" name="hb_font_get_var_coords_design ()" link="harfbuzz-hb-font.html#hb-font-get-var-coords-design" since="3.3.0"/>
     <keyword type="function" name="hb_font_get_var_coords_normalized ()" link="harfbuzz-hb-font.html#hb-font-get-var-coords-normalized" since="1.4.2"/>
     <keyword type="function" name="hb_font_glyph_from_string ()" link="harfbuzz-hb-font.html#hb-font-glyph-from-string" since="0.9.2"/>
     <keyword type="function" name="hb_font_glyph_to_string ()" link="harfbuzz-hb-font.html#hb-font-glyph-to-string" since="0.9.2"/>
     <keyword type="function" name="hb_font_set_ppem ()" link="harfbuzz-hb-font.html#hb-font-set-ppem" since="0.9.2"/>
     <keyword type="function" name="hb_font_set_ptem ()" link="harfbuzz-hb-font.html#hb-font-set-ptem" since="1.6.0"/>
     <keyword type="function" name="hb_font_set_scale ()" link="harfbuzz-hb-font.html#hb-font-set-scale" since="0.9.2"/>
+    <keyword type="function" name="hb_font_set_synthetic_slant ()" link="harfbuzz-hb-font.html#hb-font-set-synthetic-slant" since="3.3.0"/>
     <keyword type="function" name="hb_font_set_user_data ()" link="harfbuzz-hb-font.html#hb-font-set-user-data" since="0.9.2"/>
     <keyword type="function" name="hb_font_set_variations ()" link="harfbuzz-hb-font.html#hb-font-set-variations" since="1.4.2"/>
     <keyword type="function" name="hb_font_set_var_coords_design ()" link="harfbuzz-hb-font.html#hb-font-set-var-coords-design" since="1.4.2"/>
     <keyword type="function" name="hb_font_set_var_coords_normalized ()" link="harfbuzz-hb-font.html#hb-font-set-var-coords-normalized" since="1.4.2"/>
     <keyword type="function" name="hb_font_set_var_named_instance ()" link="harfbuzz-hb-font.html#hb-font-set-var-named-instance" since="2.6.0"/>
     <keyword type="function" name="hb_font_subtract_glyph_origin_for_direction ()" link="harfbuzz-hb-font.html#hb-font-subtract-glyph-origin-for-direction" since="0.9.2"/>
-    <keyword type="function" name="hb_reference_table_func_t ()" link="harfbuzz-hb-font.html#hb-reference-table-func-t"/>
+    <keyword type="function" name="hb_reference_table_func_t ()" link="harfbuzz-hb-font.html#hb-reference-table-func-t" since="0.9.2"/>
     <keyword type="function" name="hb_font_funcs_set_font_h_extents_func ()" link="harfbuzz-hb-font.html#hb-font-funcs-set-font-h-extents-func" since="1.1.2"/>
     <keyword type="function" name="hb_font_funcs_set_font_v_extents_func ()" link="harfbuzz-hb-font.html#hb-font-funcs-set-font-v-extents-func" since="1.1.2"/>
     <keyword type="function" name="hb_font_get_extents_for_direction ()" link="harfbuzz-hb-font.html#hb-font-get-extents-for-direction" since="1.1.3"/>
     <keyword type="typedef" name="hb_font_t" link="harfbuzz-hb-font.html#hb-font-t"/>
     <keyword type="typedef" name="hb_font_get_font_h_extents_func_t" link="harfbuzz-hb-font.html#hb-font-get-font-h-extents-func-t"/>
     <keyword type="typedef" name="hb_font_get_font_v_extents_func_t" link="harfbuzz-hb-font.html#hb-font-get-font-v-extents-func-t"/>
+    <keyword type="struct" name="hb_font_extents_t" link="harfbuzz-hb-font.html#hb-font-extents-t"/>
+    <keyword type="struct" name="hb_glyph_extents_t" link="harfbuzz-hb-font.html#hb-glyph-extents-t"/>
     <keyword type="function" name="hb_map_allocation_successful ()" link="harfbuzz-hb-map.html#hb-map-allocation-successful" since="1.7.7"/>
     <keyword type="function" name="hb_map_clear ()" link="harfbuzz-hb-map.html#hb-map-clear" since="1.7.7"/>
     <keyword type="function" name="hb_map_create ()" link="harfbuzz-hb-map.html#hb-map-create" since="1.7.7"/>
     <keyword type="function" name="hb_map_reference ()" link="harfbuzz-hb-map.html#hb-map-reference" since="1.7.7"/>
     <keyword type="function" name="hb_map_set ()" link="harfbuzz-hb-map.html#hb-map-set" since="1.7.7"/>
     <keyword type="function" name="hb_map_set_user_data ()" link="harfbuzz-hb-map.html#hb-map-set-user-data" since="1.7.7"/>
-    <keyword type="macro" name="HB_MAP_VALUE_INVALID" link="harfbuzz-hb-map.html#HB-MAP-VALUE-INVALID:CAPS"/>
+    <keyword type="macro" name="HB_MAP_VALUE_INVALID" link="harfbuzz-hb-map.html#HB-MAP-VALUE-INVALID:CAPS" since="1.7.7"/>
     <keyword type="typedef" name="hb_map_t" link="harfbuzz-hb-map.html#hb-map-t"/>
     <keyword type="function" name="hb_set_add ()" link="harfbuzz-hb-set.html#hb-set-add" since="0.9.2"/>
     <keyword type="function" name="hb_set_add_range ()" link="harfbuzz-hb-set.html#hb-set-add-range" since="0.9.7"/>
     <keyword type="function" name="hb_set_allocation_successful ()" link="harfbuzz-hb-set.html#hb-set-allocation-successful" since="0.9.2"/>
+    <keyword type="function" name="hb_set_copy ()" link="harfbuzz-hb-set.html#hb-set-copy" since="2.8.2"/>
     <keyword type="function" name="hb_set_clear ()" link="harfbuzz-hb-set.html#hb-set-clear" since="0.9.2"/>
     <keyword type="function" name="hb_set_create ()" link="harfbuzz-hb-set.html#hb-set-create" since="0.9.2"/>
     <keyword type="function" name="hb_set_del ()" link="harfbuzz-hb-set.html#hb-set-del" since="0.9.2"/>
     <keyword type="function" name="hb_set_get_user_data ()" link="harfbuzz-hb-set.html#hb-set-get-user-data" since="0.9.2"/>
     <keyword type="function" name="hb_set_has ()" link="harfbuzz-hb-set.html#hb-set-has" since="0.9.2"/>
     <keyword type="function" name="hb_set_intersect ()" link="harfbuzz-hb-set.html#hb-set-intersect" since="0.9.2"/>
+    <keyword type="function" name="hb_set_invert ()" link="harfbuzz-hb-set.html#hb-set-invert" since="3.0.0"/>
     <keyword type="function" name="hb_set_is_empty ()" link="harfbuzz-hb-set.html#hb-set-is-empty" since="0.9.7"/>
     <keyword type="function" name="hb_set_is_equal ()" link="harfbuzz-hb-set.html#hb-set-is-equal" since="0.9.7"/>
     <keyword type="function" name="hb_set_is_subset ()" link="harfbuzz-hb-set.html#hb-set-is-subset" since="1.8.1"/>
     <keyword type="function" name="hb_set_subtract ()" link="harfbuzz-hb-set.html#hb-set-subtract" since="0.9.2"/>
     <keyword type="function" name="hb_set_symmetric_difference ()" link="harfbuzz-hb-set.html#hb-set-symmetric-difference" since="0.9.2"/>
     <keyword type="function" name="hb_set_union ()" link="harfbuzz-hb-set.html#hb-set-union" since="0.9.2"/>
-    <keyword type="macro" name="HB_SET_VALUE_INVALID" link="harfbuzz-hb-set.html#HB-SET-VALUE-INVALID:CAPS"/>
+    <keyword type="macro" name="HB_SET_VALUE_INVALID" link="harfbuzz-hb-set.html#HB-SET-VALUE-INVALID:CAPS" since="0.9.21"/>
     <keyword type="typedef" name="hb_set_t" link="harfbuzz-hb-set.html#hb-set-t"/>
     <keyword type="function" name="hb_shape_plan_create ()" link="harfbuzz-hb-shape-plan.html#hb-shape-plan-create" since="0.9.7"/>
     <keyword type="function" name="hb_shape_plan_create_cached ()" link="harfbuzz-hb-shape-plan.html#hb-shape-plan-create-cached" since="0.9.7"/>
-    <keyword type="function" name="hb_shape_plan_create2 ()" link="harfbuzz-hb-shape-plan.html#hb-shape-plan-create2"/>
-    <keyword type="function" name="hb_shape_plan_create_cached2 ()" link="harfbuzz-hb-shape-plan.html#hb-shape-plan-create-cached2"/>
+    <keyword type="function" name="hb_shape_plan_create2 ()" link="harfbuzz-hb-shape-plan.html#hb-shape-plan-create2" since="1.4.0"/>
+    <keyword type="function" name="hb_shape_plan_create_cached2 ()" link="harfbuzz-hb-shape-plan.html#hb-shape-plan-create-cached2" since="1.4.0"/>
     <keyword type="function" name="hb_shape_plan_destroy ()" link="harfbuzz-hb-shape-plan.html#hb-shape-plan-destroy" since="0.9.7"/>
     <keyword type="function" name="hb_shape_plan_execute ()" link="harfbuzz-hb-shape-plan.html#hb-shape-plan-execute" since="0.9.7"/>
     <keyword type="function" name="hb_shape_plan_get_empty ()" link="harfbuzz-hb-shape-plan.html#hb-shape-plan-get-empty" since="0.9.7"/>
     <keyword type="function" name="hb_unicode_decompose_func_t ()" link="harfbuzz-hb-unicode.html#hb-unicode-decompose-func-t"/>
     <keyword type="function" name="hb_unicode_funcs_create ()" link="harfbuzz-hb-unicode.html#hb-unicode-funcs-create" since="0.9.2"/>
     <keyword type="function" name="hb_unicode_funcs_destroy ()" link="harfbuzz-hb-unicode.html#hb-unicode-funcs-destroy" since="0.9.2"/>
-    <keyword type="function" name="hb_unicode_funcs_get_default ()" link="harfbuzz-hb-unicode.html#hb-unicode-funcs-get-default"/>
+    <keyword type="function" name="hb_unicode_funcs_get_default ()" link="harfbuzz-hb-unicode.html#hb-unicode-funcs-get-default" since="0.9.2"/>
     <keyword type="function" name="hb_unicode_funcs_get_empty ()" link="harfbuzz-hb-unicode.html#hb-unicode-funcs-get-empty" since="0.9.2"/>
     <keyword type="function" name="hb_unicode_funcs_get_parent ()" link="harfbuzz-hb-unicode.html#hb-unicode-funcs-get-parent" since="0.9.2"/>
     <keyword type="function" name="hb_unicode_funcs_get_user_data ()" link="harfbuzz-hb-unicode.html#hb-unicode-funcs-get-user-data" since="0.9.2"/>
     <keyword type="macro" name="HB_VERSION_MICRO" link="harfbuzz-hb-version.html#HB-VERSION-MICRO:CAPS"/>
     <keyword type="macro" name="HB_VERSION_MINOR" link="harfbuzz-hb-version.html#HB-VERSION-MINOR:CAPS"/>
     <keyword type="macro" name="HB_VERSION_STRING" link="harfbuzz-hb-version.html#HB-VERSION-STRING:CAPS"/>
-    <keyword type="macro" name="HB_COLOR()" link="harfbuzz-hb-ot-color.html#HB-COLOR:CAPS"/>
+    <keyword type="macro" name="HB_COLOR()" link="harfbuzz-hb-ot-color.html#HB-COLOR:CAPS" since="2.1.0"/>
     <keyword type="function" name="hb_color_get_alpha ()" link="harfbuzz-hb-ot-color.html#hb-color-get-alpha" since="2.1.0"/>
     <keyword type="function" name="hb_color_get_blue ()" link="harfbuzz-hb-ot-color.html#hb-color-get-blue" since="2.1.0"/>
     <keyword type="function" name="hb_color_get_green ()" link="harfbuzz-hb-ot-color.html#hb-color-get-green" since="2.1.0"/>
     <keyword type="function" name="hb_ot_color_palette_get_flags ()" link="harfbuzz-hb-ot-color.html#hb-ot-color-palette-get-flags" since="2.1.0"/>
     <keyword type="function" name="hb_ot_color_palette_get_name_id ()" link="harfbuzz-hb-ot-color.html#hb-ot-color-palette-get-name-id" since="2.1.0"/>
     <keyword type="typedef" name="hb_color_t" link="harfbuzz-hb-ot-color.html#hb-color-t" since="2.1.0"/>
+    <keyword type="struct" name="hb_ot_color_layer_t" link="harfbuzz-hb-ot-color.html#hb-ot-color-layer-t" since="2.1.0"/>
     <keyword type="enum" name="enum hb_ot_color_palette_flags_t" link="harfbuzz-hb-ot-color.html#hb-ot-color-palette-flags-t" since="2.1.0"/>
     <keyword type="function" name="hb_ot_font_set_funcs ()" link="harfbuzz-hb-ot-font.html#hb-ot-font-set-funcs" since="0.9.28"/>
     <keyword type="function" name="hb_ot_tag_to_language ()" link="harfbuzz-hb-ot-layout.html#hb-ot-tag-to-language" since="0.9.2"/>
     <keyword type="function" name="hb_ot_tag_to_script ()" link="harfbuzz-hb-ot-layout.html#hb-ot-tag-to-script"/>
     <keyword type="function" name="hb_ot_tags_from_script_and_language ()" link="harfbuzz-hb-ot-layout.html#hb-ot-tags-from-script-and-language" since="2.0.0"/>
     <keyword type="function" name="hb_ot_tags_to_script_and_language ()" link="harfbuzz-hb-ot-layout.html#hb-ot-tags-to-script-and-language" since="2.0.0"/>
-    <keyword type="function" name="hb_ot_layout_closure_lookups ()" link="harfbuzz-hb-ot-layout.html#hb-ot-layout-closure-lookups" since="EXPERIMENTAL"/>
-    <keyword type="function" name="hb_ot_layout_closure_features ()" link="harfbuzz-hb-ot-layout.html#hb-ot-layout-closure-features" since="EXPERIMENTAL"/>
     <keyword type="function" name="hb_ot_layout_collect_lookups ()" link="harfbuzz-hb-ot-layout.html#hb-ot-layout-collect-lookups" since="0.9.8"/>
     <keyword type="function" name="hb_ot_layout_collect_features ()" link="harfbuzz-hb-ot-layout.html#hb-ot-layout-collect-features" since="1.8.5"/>
     <keyword type="function" name="hb_ot_layout_feature_get_characters ()" link="harfbuzz-hb-ot-layout.html#hb-ot-layout-feature-get-characters" since="2.0.0"/>
     <keyword type="function" name="hb_ot_layout_get_glyphs_in_class ()" link="harfbuzz-hb-ot-layout.html#hb-ot-layout-get-glyphs-in-class" since="0.9.7"/>
     <keyword type="function" name="hb_ot_layout_get_ligature_carets ()" link="harfbuzz-hb-ot-layout.html#hb-ot-layout-get-ligature-carets"/>
     <keyword type="function" name="hb_ot_layout_get_size_params ()" link="harfbuzz-hb-ot-layout.html#hb-ot-layout-get-size-params" since="0.9.10"/>
-    <keyword type="function" name="hb_ot_layout_glyph_sequence_func_t ()" link="harfbuzz-hb-ot-layout.html#hb-ot-layout-glyph-sequence-func-t"/>
     <keyword type="function" name="hb_ot_layout_has_glyph_classes ()" link="harfbuzz-hb-ot-layout.html#hb-ot-layout-has-glyph-classes"/>
     <keyword type="function" name="hb_ot_layout_has_positioning ()" link="harfbuzz-hb-ot-layout.html#hb-ot-layout-has-positioning"/>
     <keyword type="function" name="hb_ot_layout_has_substitution ()" link="harfbuzz-hb-ot-layout.html#hb-ot-layout-has-substitution"/>
     <keyword type="function" name="hb_ot_layout_language_get_feature_tags ()" link="harfbuzz-hb-ot-layout.html#hb-ot-layout-language-get-feature-tags"/>
     <keyword type="function" name="hb_ot_layout_language_get_required_feature ()" link="harfbuzz-hb-ot-layout.html#hb-ot-layout-language-get-required-feature" since="0.9.30"/>
     <keyword type="function" name="hb_ot_layout_lookup_collect_glyphs ()" link="harfbuzz-hb-ot-layout.html#hb-ot-layout-lookup-collect-glyphs" since="0.9.7"/>
+    <keyword type="function" name="hb_ot_layout_lookup_get_glyph_alternates ()" link="harfbuzz-hb-ot-layout.html#hb-ot-layout-lookup-get-glyph-alternates" since="2.6.8"/>
     <keyword type="function" name="hb_ot_layout_lookup_substitute_closure ()" link="harfbuzz-hb-ot-layout.html#hb-ot-layout-lookup-substitute-closure" since="0.9.7"/>
     <keyword type="function" name="hb_ot_layout_lookups_substitute_closure ()" link="harfbuzz-hb-ot-layout.html#hb-ot-layout-lookups-substitute-closure" since="1.8.1"/>
     <keyword type="function" name="hb_ot_layout_lookup_would_substitute ()" link="harfbuzz-hb-ot-layout.html#hb-ot-layout-lookup-would-substitute" since="0.9.7"/>
     <keyword type="function" name="hb_ot_math_get_glyph_italics_correction ()" link="harfbuzz-hb-ot-math.html#hb-ot-math-get-glyph-italics-correction" since="1.3.3"/>
     <keyword type="function" name="hb_ot_math_get_glyph_top_accent_attachment ()" link="harfbuzz-hb-ot-math.html#hb-ot-math-get-glyph-top-accent-attachment" since="1.3.3"/>
     <keyword type="function" name="hb_ot_math_get_glyph_kerning ()" link="harfbuzz-hb-ot-math.html#hb-ot-math-get-glyph-kerning" since="1.3.3"/>
+    <keyword type="function" name="hb_ot_math_get_glyph_kernings ()" link="harfbuzz-hb-ot-math.html#hb-ot-math-get-glyph-kernings" since="3.4.0"/>
     <keyword type="function" name="hb_ot_math_is_glyph_extended_shape ()" link="harfbuzz-hb-ot-math.html#hb-ot-math-is-glyph-extended-shape" since="1.3.3"/>
     <keyword type="function" name="hb_ot_math_get_glyph_variants ()" link="harfbuzz-hb-ot-math.html#hb-ot-math-get-glyph-variants" since="1.3.3"/>
     <keyword type="function" name="hb_ot_math_get_min_connector_overlap ()" link="harfbuzz-hb-ot-math.html#hb-ot-math-get-min-connector-overlap" since="1.3.3"/>
     <keyword type="function" name="hb_ot_math_get_glyph_assembly ()" link="harfbuzz-hb-ot-math.html#hb-ot-math-get-glyph-assembly" since="1.3.3"/>
-    <keyword type="macro" name="HB_OT_TAG_MATH" link="harfbuzz-hb-ot-math.html#HB-OT-TAG-MATH:CAPS"/>
-    <keyword type="macro" name="HB_OT_MATH_SCRIPT" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-SCRIPT:CAPS"/>
+    <keyword type="macro" name="HB_OT_TAG_MATH" link="harfbuzz-hb-ot-math.html#HB-OT-TAG-MATH:CAPS" since="1.3.3"/>
+    <keyword type="macro" name="HB_OT_TAG_MATH_SCRIPT" link="harfbuzz-hb-ot-math.html#HB-OT-TAG-MATH-SCRIPT:CAPS" since="3.4.0"/>
     <keyword type="enum" name="enum hb_ot_math_constant_t" link="harfbuzz-hb-ot-math.html#hb-ot-math-constant-t" since="1.3.3"/>
     <keyword type="enum" name="enum hb_ot_math_kern_t" link="harfbuzz-hb-ot-math.html#hb-ot-math-kern-t" since="1.3.3"/>
+    <keyword type="struct" name="hb_ot_math_kern_entry_t" link="harfbuzz-hb-ot-math.html#hb-ot-math-kern-entry-t" since="3.4.0"/>
     <keyword type="struct" name="hb_ot_math_glyph_variant_t" link="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-variant-t" since="1.3.3"/>
     <keyword type="enum" name="enum hb_ot_math_glyph_part_flags_t" link="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-part-flags-t" since="1.3.3"/>
     <keyword type="struct" name="hb_ot_math_glyph_part_t" link="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-part-t" since="1.3.3"/>
+    <keyword type="function" name="hb_ot_meta_get_entry_tags ()" link="harfbuzz-hb-ot-meta.html#hb-ot-meta-get-entry-tags" since="2.6.0"/>
+    <keyword type="function" name="hb_ot_meta_reference_entry ()" link="harfbuzz-hb-ot-meta.html#hb-ot-meta-reference-entry" since="2.6.0"/>
+    <keyword type="enum" name="enum hb_ot_meta_tag_t" link="harfbuzz-hb-ot-meta.html#hb-ot-meta-tag-t" since="2.6.0"/>
+    <keyword type="function" name="hb_ot_metrics_get_position ()" link="harfbuzz-hb-ot-metrics.html#hb-ot-metrics-get-position" since="2.6.0"/>
+    <keyword type="function" name="hb_ot_metrics_get_variation ()" link="harfbuzz-hb-ot-metrics.html#hb-ot-metrics-get-variation" since="2.6.0"/>
+    <keyword type="function" name="hb_ot_metrics_get_x_variation ()" link="harfbuzz-hb-ot-metrics.html#hb-ot-metrics-get-x-variation" since="2.6.0"/>
+    <keyword type="function" name="hb_ot_metrics_get_y_variation ()" link="harfbuzz-hb-ot-metrics.html#hb-ot-metrics-get-y-variation" since="2.6.0"/>
+    <keyword type="enum" name="enum hb_ot_metrics_tag_t" link="harfbuzz-hb-ot-metrics.html#hb-ot-metrics-tag-t" since="2.6.0"/>
     <keyword type="function" name="hb_ot_name_list_names ()" link="harfbuzz-hb-ot-name.html#hb-ot-name-list-names" since="2.1.0"/>
     <keyword type="function" name="hb_ot_name_get_utf16 ()" link="harfbuzz-hb-ot-name.html#hb-ot-name-get-utf16" since="2.1.0"/>
     <keyword type="function" name="hb_ot_name_get_utf32 ()" link="harfbuzz-hb-ot-name.html#hb-ot-name-get-utf32" since="2.1.0"/>
     <keyword type="function" name="hb_ot_name_get_utf8 ()" link="harfbuzz-hb-ot-name.html#hb-ot-name-get-utf8" since="2.1.0"/>
     <keyword type="typedef" name="hb_ot_name_id_t" link="harfbuzz-hb-ot-name.html#hb-ot-name-id-t" since="2.0.0"/>
+    <keyword type="struct" name="hb_ot_name_entry_t" link="harfbuzz-hb-ot-name.html#hb-ot-name-entry-t" since="2.1.0"/>
     <keyword type="function" name="hb_ot_shape_glyphs_closure ()" link="harfbuzz-hb-ot-shape.html#hb-ot-shape-glyphs-closure" since="0.9.2"/>
     <keyword type="function" name="hb_ot_var_has_data ()" link="harfbuzz-hb-ot-var.html#hb-ot-var-has-data" since="1.4.2"/>
     <keyword type="function" name="hb_ot_var_find_axis_info ()" link="harfbuzz-hb-ot-var.html#hb-ot-var-find-axis-info" since="2.2.0"/>
     <keyword type="function" name="hb_ot_var_get_axis_count ()" link="harfbuzz-hb-ot-var.html#hb-ot-var-get-axis-count" since="1.4.2"/>
     <keyword type="function" name="hb_ot_var_get_axis_infos ()" link="harfbuzz-hb-ot-var.html#hb-ot-var-get-axis-infos" since="2.2.0"/>
-    <keyword type="function" name="hb_ot_var_get_named_instance_count ()" link="harfbuzz-hb-ot-var.html#hb-ot-var-get-named-instance-count"/>
-    <keyword type="function" name="hb_ot_var_named_instance_get_subfamily_name_id ()" link="harfbuzz-hb-ot-var.html#hb-ot-var-named-instance-get-subfamily-name-id"/>
-    <keyword type="function" name="hb_ot_var_named_instance_get_postscript_name_id ()" link="harfbuzz-hb-ot-var.html#hb-ot-var-named-instance-get-postscript-name-id"/>
-    <keyword type="function" name="hb_ot_var_named_instance_get_design_coords ()" link="harfbuzz-hb-ot-var.html#hb-ot-var-named-instance-get-design-coords"/>
+    <keyword type="function" name="hb_ot_var_get_named_instance_count ()" link="harfbuzz-hb-ot-var.html#hb-ot-var-get-named-instance-count" since="2.2.0"/>
+    <keyword type="function" name="hb_ot_var_named_instance_get_subfamily_name_id ()" link="harfbuzz-hb-ot-var.html#hb-ot-var-named-instance-get-subfamily-name-id" since="2.2.0"/>
+    <keyword type="function" name="hb_ot_var_named_instance_get_postscript_name_id ()" link="harfbuzz-hb-ot-var.html#hb-ot-var-named-instance-get-postscript-name-id" since="2.2.0"/>
+    <keyword type="function" name="hb_ot_var_named_instance_get_design_coords ()" link="harfbuzz-hb-ot-var.html#hb-ot-var-named-instance-get-design-coords" since="2.2.0"/>
     <keyword type="function" name="hb_ot_var_normalize_variations ()" link="harfbuzz-hb-ot-var.html#hb-ot-var-normalize-variations" since="1.4.2"/>
     <keyword type="function" name="hb_ot_var_normalize_coords ()" link="harfbuzz-hb-ot-var.html#hb-ot-var-normalize-coords" since="1.4.2"/>
     <keyword type="macro" name="HB_OT_TAG_VAR_AXIS_ITALIC" link="harfbuzz-hb-ot-var.html#HB-OT-TAG-VAR-AXIS-ITALIC:CAPS"/>
     <keyword type="macro" name="HB_OT_TAG_VAR_AXIS_WEIGHT" link="harfbuzz-hb-ot-var.html#HB-OT-TAG-VAR-AXIS-WEIGHT:CAPS"/>
     <keyword type="macro" name="HB_OT_TAG_VAR_AXIS_WIDTH" link="harfbuzz-hb-ot-var.html#HB-OT-TAG-VAR-AXIS-WIDTH:CAPS"/>
     <keyword type="enum" name="enum hb_ot_var_axis_flags_t" link="harfbuzz-hb-ot-var.html#hb-ot-var-axis-flags-t" since="2.2.0"/>
+    <keyword type="struct" name="hb_ot_var_axis_info_t" link="harfbuzz-hb-ot-var.html#hb-ot-var-axis-info-t" since="2.2.0"/>
     <keyword type="function" name="hb_aat_layout_feature_type_get_name_id ()" link="harfbuzz-hb-aat-layout.html#hb-aat-layout-feature-type-get-name-id" since="2.2.0"/>
-    <keyword type="function" name="hb_aat_layout_feature_type_get_selector_infos ()" link="harfbuzz-hb-aat-layout.html#hb-aat-layout-feature-type-get-selector-infos"/>
+    <keyword type="function" name="hb_aat_layout_feature_type_get_selector_infos ()" link="harfbuzz-hb-aat-layout.html#hb-aat-layout-feature-type-get-selector-infos" since="2.2.0"/>
     <keyword type="function" name="hb_aat_layout_get_feature_types ()" link="harfbuzz-hb-aat-layout.html#hb-aat-layout-get-feature-types" since="2.2.0"/>
-    <keyword type="function" name="hb_aat_layout_has_positioning ()" link="harfbuzz-hb-aat-layout.html#hb-aat-layout-has-positioning"/>
-    <keyword type="function" name="hb_aat_layout_has_substitution ()" link="harfbuzz-hb-aat-layout.html#hb-aat-layout-has-substitution"/>
-    <keyword type="function" name="hb_aat_layout_has_tracking ()" link="harfbuzz-hb-aat-layout.html#hb-aat-layout-has-tracking"/>
+    <keyword type="function" name="hb_aat_layout_has_positioning ()" link="harfbuzz-hb-aat-layout.html#hb-aat-layout-has-positioning" since="2.3.0"/>
+    <keyword type="function" name="hb_aat_layout_has_substitution ()" link="harfbuzz-hb-aat-layout.html#hb-aat-layout-has-substitution" since="2.3.0"/>
+    <keyword type="function" name="hb_aat_layout_has_tracking ()" link="harfbuzz-hb-aat-layout.html#hb-aat-layout-has-tracking" since="2.3.0"/>
     <keyword type="macro" name="HB_AAT_LAYOUT_NO_SELECTOR_INDEX" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-NO-SELECTOR-INDEX:CAPS"/>
     <keyword type="enum" name="enum hb_aat_layout_feature_type_t" link="harfbuzz-hb-aat-layout.html#hb-aat-layout-feature-type-t" since="2.2.0"/>
     <keyword type="enum" name="enum hb_aat_layout_feature_selector_t" link="harfbuzz-hb-aat-layout.html#hb-aat-layout-feature-selector-t" since="2.2.0"/>
+    <keyword type="struct" name="hb_aat_layout_feature_selector_info_t" link="harfbuzz-hb-aat-layout.html#hb-aat-layout-feature-selector-info-t"/>
     <keyword type="function" name="hb_coretext_face_create ()" link="harfbuzz-hb-coretext.html#hb-coretext-face-create" since="0.9.10"/>
     <keyword type="function" name="hb_coretext_font_create ()" link="harfbuzz-hb-coretext.html#hb-coretext-font-create" since="1.7.2"/>
     <keyword type="function" name="hb_coretext_face_get_cg_font ()" link="harfbuzz-hb-coretext.html#hb-coretext-face-get-cg-font" since="0.9.10"/>
-    <keyword type="function" name="hb_coretext_font_get_ct_font ()" link="harfbuzz-hb-coretext.html#hb-coretext-font-get-ct-font"/>
+    <keyword type="function" name="hb_coretext_font_get_ct_font ()" link="harfbuzz-hb-coretext.html#hb-coretext-font-get-ct-font" since="0.9.10"/>
     <keyword type="macro" name="HB_CORETEXT_TAG_KERX" link="harfbuzz-hb-coretext.html#HB-CORETEXT-TAG-KERX:CAPS"/>
     <keyword type="macro" name="HB_CORETEXT_TAG_MORT" link="harfbuzz-hb-coretext.html#HB-CORETEXT-TAG-MORT:CAPS"/>
     <keyword type="macro" name="HB_CORETEXT_TAG_MORX" link="harfbuzz-hb-coretext.html#HB-CORETEXT-TAG-MORX:CAPS"/>
     <keyword type="function" name="hb_ft_face_create_referenced ()" link="harfbuzz-hb-ft.html#hb-ft-face-create-referenced" since="0.9.38"/>
     <keyword type="function" name="hb_ft_font_create ()" link="harfbuzz-hb-ft.html#hb-ft-font-create" since="0.9.2"/>
     <keyword type="function" name="hb_ft_font_create_referenced ()" link="harfbuzz-hb-ft.html#hb-ft-font-create-referenced" since="0.9.38"/>
-    <keyword type="function" name="hb_ft_font_changed ()" link="harfbuzz-hb-ft.html#hb-ft-font-changed"/>
-    <keyword type="function" name="hb_ft_font_get_face ()" link="harfbuzz-hb-ft.html#hb-ft-font-get-face"/>
+    <keyword type="function" name="hb_ft_font_changed ()" link="harfbuzz-hb-ft.html#hb-ft-font-changed" since="1.0.5"/>
+    <keyword type="function" name="hb_ft_font_get_face ()" link="harfbuzz-hb-ft.html#hb-ft-font-get-face" since="0.9.2"/>
     <keyword type="function" name="hb_ft_font_lock_face ()" link="harfbuzz-hb-ft.html#hb-ft-font-lock-face" since="2.6.5"/>
     <keyword type="function" name="hb_ft_font_unlock_face ()" link="harfbuzz-hb-ft.html#hb-ft-font-unlock-face" since="2.6.5"/>
     <keyword type="function" name="hb_ft_font_set_load_flags ()" link="harfbuzz-hb-ft.html#hb-ft-font-set-load-flags" since="1.0.5"/>
     <keyword type="function" name="hb_icu_script_to_script ()" link="harfbuzz-hb-icu.html#hb-icu-script-to-script"/>
     <keyword type="function" name="hb_uniscribe_font_get_hfont ()" link="harfbuzz-hb-uniscribe.html#hb-uniscribe-font-get-hfont"/>
     <keyword type="function" name="hb_uniscribe_font_get_logfontw ()" link="harfbuzz-hb-uniscribe.html#hb-uniscribe-font-get-logfontw"/>
+    <keyword type="function" name="hb_gdi_face_create ()" link="harfbuzz-hb-gdi.html#hb-gdi-face-create" since="2.6.0"/>
+    <keyword type="function" name="hb_directwrite_face_create ()" link="harfbuzz-hb-directwrite.html#hb-directwrite-face-create" since="2.4.0"/>
+    <keyword type="function" name="hb_directwrite_face_get_font_face ()" link="harfbuzz-hb-directwrite.html#hb-directwrite-face-get-font-face" since="2.5.0"/>
+    <keyword type="function" name="hb_style_get_value ()" link="harfbuzz-hb-style.html#hb-style-get-value" since="3.0.0"/>
+    <keyword type="enum" name="enum hb_style_tag_t" link="harfbuzz-hb-style.html#hb-style-tag-t" since="3.0.0"/>
+    <keyword type="function" name="hb_subset_input_create_or_fail ()" link="harfbuzz-hb-subset.html#hb-subset-input-create-or-fail" since="1.8.0"/>
+    <keyword type="function" name="hb_subset_input_reference ()" link="harfbuzz-hb-subset.html#hb-subset-input-reference" since="1.8.0"/>
+    <keyword type="function" name="hb_subset_input_destroy ()" link="harfbuzz-hb-subset.html#hb-subset-input-destroy" since="1.8.0"/>
+    <keyword type="function" name="hb_subset_input_set_user_data ()" link="harfbuzz-hb-subset.html#hb-subset-input-set-user-data" since="2.9.0"/>
+    <keyword type="function" name="hb_subset_input_get_user_data ()" link="harfbuzz-hb-subset.html#hb-subset-input-get-user-data" since="2.9.0"/>
+    <keyword type="function" name="hb_subset_input_get_flags ()" link="harfbuzz-hb-subset.html#hb-subset-input-get-flags" since="2.9.0"/>
+    <keyword type="function" name="hb_subset_input_set_flags ()" link="harfbuzz-hb-subset.html#hb-subset-input-set-flags" since="2.9.0"/>
+    <keyword type="function" name="hb_subset_input_unicode_set ()" link="harfbuzz-hb-subset.html#hb-subset-input-unicode-set" since="1.8.0"/>
+    <keyword type="function" name="hb_subset_input_glyph_set ()" link="harfbuzz-hb-subset.html#hb-subset-input-glyph-set" since="1.8.0"/>
+    <keyword type="function" name="hb_subset_input_set ()" link="harfbuzz-hb-subset.html#hb-subset-input-set" since="2.9.1"/>
+    <keyword type="function" name="hb_subset_or_fail ()" link="harfbuzz-hb-subset.html#hb-subset-or-fail" since="2.9.0"/>
+    <keyword type="enum" name="enum hb_subset_flags_t" link="harfbuzz-hb-subset.html#hb-subset-flags-t" since="2.9.0"/>
+    <keyword type="typedef" name="hb_subset_input_t" link="harfbuzz-hb-subset.html#hb-subset-input-t"/>
+    <keyword type="enum" name="enum hb_subset_sets_t" link="harfbuzz-hb-subset.html#hb-subset-sets-t" since="2.9.1"/>
     <keyword type="constant" name="HB_MEMORY_MODE_DUPLICATE" link="harfbuzz-hb-blob.html#HB-MEMORY-MODE-DUPLICATE:CAPS"/>
     <keyword type="constant" name="HB_MEMORY_MODE_READONLY" link="harfbuzz-hb-blob.html#HB-MEMORY-MODE-READONLY:CAPS"/>
     <keyword type="constant" name="HB_MEMORY_MODE_WRITABLE" link="harfbuzz-hb-blob.html#HB-MEMORY-MODE-WRITABLE:CAPS"/>
     <keyword type="constant" name="HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE" link="harfbuzz-hb-blob.html#HB-MEMORY-MODE-READONLY-MAY-MAKE-WRITABLE:CAPS"/>
     <keyword type="constant" name="HB_GLYPH_FLAG_UNSAFE_TO_BREAK" link="harfbuzz-hb-buffer.html#HB-GLYPH-FLAG-UNSAFE-TO-BREAK:CAPS"/>
+    <keyword type="constant" name="HB_GLYPH_FLAG_UNSAFE_TO_CONCAT" link="harfbuzz-hb-buffer.html#HB-GLYPH-FLAG-UNSAFE-TO-CONCAT:CAPS"/>
     <keyword type="constant" name="HB_GLYPH_FLAG_DEFINED" link="harfbuzz-hb-buffer.html#HB-GLYPH-FLAG-DEFINED:CAPS"/>
     <keyword type="constant" name="HB_BUFFER_CONTENT_TYPE_INVALID" link="harfbuzz-hb-buffer.html#HB-BUFFER-CONTENT-TYPE-INVALID:CAPS"/>
     <keyword type="constant" name="HB_BUFFER_CONTENT_TYPE_UNICODE" link="harfbuzz-hb-buffer.html#HB-BUFFER-CONTENT-TYPE-UNICODE:CAPS"/>
     <keyword type="constant" name="HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES" link="harfbuzz-hb-buffer.html#HB-BUFFER-FLAG-PRESERVE-DEFAULT-IGNORABLES:CAPS"/>
     <keyword type="constant" name="HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES" link="harfbuzz-hb-buffer.html#HB-BUFFER-FLAG-REMOVE-DEFAULT-IGNORABLES:CAPS"/>
     <keyword type="constant" name="HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE" link="harfbuzz-hb-buffer.html#HB-BUFFER-FLAG-DO-NOT-INSERT-DOTTED-CIRCLE:CAPS"/>
+    <keyword type="constant" name="HB_BUFFER_FLAG_VERIFY" link="harfbuzz-hb-buffer.html#HB-BUFFER-FLAG-VERIFY:CAPS"/>
     <keyword type="constant" name="HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES" link="harfbuzz-hb-buffer.html#HB-BUFFER-CLUSTER-LEVEL-MONOTONE-GRAPHEMES:CAPS"/>
     <keyword type="constant" name="HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS" link="harfbuzz-hb-buffer.html#HB-BUFFER-CLUSTER-LEVEL-MONOTONE-CHARACTERS:CAPS"/>
     <keyword type="constant" name="HB_BUFFER_CLUSTER_LEVEL_CHARACTERS" link="harfbuzz-hb-buffer.html#HB-BUFFER-CLUSTER-LEVEL-CHARACTERS:CAPS"/>
     <keyword type="constant" name="HB_DIRECTION_RTL" link="harfbuzz-hb-common.html#HB-DIRECTION-RTL:CAPS"/>
     <keyword type="constant" name="HB_DIRECTION_TTB" link="harfbuzz-hb-common.html#HB-DIRECTION-TTB:CAPS"/>
     <keyword type="constant" name="HB_DIRECTION_BTT" link="harfbuzz-hb-common.html#HB-DIRECTION-BTT:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_COMMON" link="harfbuzz-hb-common.html#HB-SCRIPT-COMMON:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_INHERITED" link="harfbuzz-hb-common.html#HB-SCRIPT-INHERITED:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_UNKNOWN" link="harfbuzz-hb-common.html#HB-SCRIPT-UNKNOWN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_ARABIC" link="harfbuzz-hb-common.html#HB-SCRIPT-ARABIC:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_ARMENIAN" link="harfbuzz-hb-common.html#HB-SCRIPT-ARMENIAN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_BENGALI" link="harfbuzz-hb-common.html#HB-SCRIPT-BENGALI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_CYRILLIC" link="harfbuzz-hb-common.html#HB-SCRIPT-CYRILLIC:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_DEVANAGARI" link="harfbuzz-hb-common.html#HB-SCRIPT-DEVANAGARI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_GEORGIAN" link="harfbuzz-hb-common.html#HB-SCRIPT-GEORGIAN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_GREEK" link="harfbuzz-hb-common.html#HB-SCRIPT-GREEK:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_GUJARATI" link="harfbuzz-hb-common.html#HB-SCRIPT-GUJARATI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_GURMUKHI" link="harfbuzz-hb-common.html#HB-SCRIPT-GURMUKHI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_HANGUL" link="harfbuzz-hb-common.html#HB-SCRIPT-HANGUL:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_HAN" link="harfbuzz-hb-common.html#HB-SCRIPT-HAN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_HEBREW" link="harfbuzz-hb-common.html#HB-SCRIPT-HEBREW:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_HIRAGANA" link="harfbuzz-hb-common.html#HB-SCRIPT-HIRAGANA:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_KANNADA" link="harfbuzz-hb-common.html#HB-SCRIPT-KANNADA:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_KATAKANA" link="harfbuzz-hb-common.html#HB-SCRIPT-KATAKANA:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_LAO" link="harfbuzz-hb-common.html#HB-SCRIPT-LAO:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_LATIN" link="harfbuzz-hb-common.html#HB-SCRIPT-LATIN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_MALAYALAM" link="harfbuzz-hb-common.html#HB-SCRIPT-MALAYALAM:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_ORIYA" link="harfbuzz-hb-common.html#HB-SCRIPT-ORIYA:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_TAMIL" link="harfbuzz-hb-common.html#HB-SCRIPT-TAMIL:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_TELUGU" link="harfbuzz-hb-common.html#HB-SCRIPT-TELUGU:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_THAI" link="harfbuzz-hb-common.html#HB-SCRIPT-THAI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_TIBETAN" link="harfbuzz-hb-common.html#HB-SCRIPT-TIBETAN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_BOPOMOFO" link="harfbuzz-hb-common.html#HB-SCRIPT-BOPOMOFO:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_BRAILLE" link="harfbuzz-hb-common.html#HB-SCRIPT-BRAILLE:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_CANADIAN_SYLLABICS" link="harfbuzz-hb-common.html#HB-SCRIPT-CANADIAN-SYLLABICS:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_CHEROKEE" link="harfbuzz-hb-common.html#HB-SCRIPT-CHEROKEE:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_ETHIOPIC" link="harfbuzz-hb-common.html#HB-SCRIPT-ETHIOPIC:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_KHMER" link="harfbuzz-hb-common.html#HB-SCRIPT-KHMER:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_MONGOLIAN" link="harfbuzz-hb-common.html#HB-SCRIPT-MONGOLIAN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_MYANMAR" link="harfbuzz-hb-common.html#HB-SCRIPT-MYANMAR:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_OGHAM" link="harfbuzz-hb-common.html#HB-SCRIPT-OGHAM:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_RUNIC" link="harfbuzz-hb-common.html#HB-SCRIPT-RUNIC:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_SINHALA" link="harfbuzz-hb-common.html#HB-SCRIPT-SINHALA:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_SYRIAC" link="harfbuzz-hb-common.html#HB-SCRIPT-SYRIAC:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_THAANA" link="harfbuzz-hb-common.html#HB-SCRIPT-THAANA:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_YI" link="harfbuzz-hb-common.html#HB-SCRIPT-YI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_DESERET" link="harfbuzz-hb-common.html#HB-SCRIPT-DESERET:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_GOTHIC" link="harfbuzz-hb-common.html#HB-SCRIPT-GOTHIC:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_OLD_ITALIC" link="harfbuzz-hb-common.html#HB-SCRIPT-OLD-ITALIC:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_BUHID" link="harfbuzz-hb-common.html#HB-SCRIPT-BUHID:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_HANUNOO" link="harfbuzz-hb-common.html#HB-SCRIPT-HANUNOO:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_TAGALOG" link="harfbuzz-hb-common.html#HB-SCRIPT-TAGALOG:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_TAGBANWA" link="harfbuzz-hb-common.html#HB-SCRIPT-TAGBANWA:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_CYPRIOT" link="harfbuzz-hb-common.html#HB-SCRIPT-CYPRIOT:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_LIMBU" link="harfbuzz-hb-common.html#HB-SCRIPT-LIMBU:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_LINEAR_B" link="harfbuzz-hb-common.html#HB-SCRIPT-LINEAR-B:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_OSMANYA" link="harfbuzz-hb-common.html#HB-SCRIPT-OSMANYA:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_SHAVIAN" link="harfbuzz-hb-common.html#HB-SCRIPT-SHAVIAN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_TAI_LE" link="harfbuzz-hb-common.html#HB-SCRIPT-TAI-LE:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_UGARITIC" link="harfbuzz-hb-common.html#HB-SCRIPT-UGARITIC:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_BUGINESE" link="harfbuzz-hb-common.html#HB-SCRIPT-BUGINESE:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_COPTIC" link="harfbuzz-hb-common.html#HB-SCRIPT-COPTIC:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_GLAGOLITIC" link="harfbuzz-hb-common.html#HB-SCRIPT-GLAGOLITIC:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_KHAROSHTHI" link="harfbuzz-hb-common.html#HB-SCRIPT-KHAROSHTHI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_NEW_TAI_LUE" link="harfbuzz-hb-common.html#HB-SCRIPT-NEW-TAI-LUE:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_OLD_PERSIAN" link="harfbuzz-hb-common.html#HB-SCRIPT-OLD-PERSIAN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_SYLOTI_NAGRI" link="harfbuzz-hb-common.html#HB-SCRIPT-SYLOTI-NAGRI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_TIFINAGH" link="harfbuzz-hb-common.html#HB-SCRIPT-TIFINAGH:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_BALINESE" link="harfbuzz-hb-common.html#HB-SCRIPT-BALINESE:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_CUNEIFORM" link="harfbuzz-hb-common.html#HB-SCRIPT-CUNEIFORM:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_NKO" link="harfbuzz-hb-common.html#HB-SCRIPT-NKO:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_PHAGS_PA" link="harfbuzz-hb-common.html#HB-SCRIPT-PHAGS-PA:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_PHOENICIAN" link="harfbuzz-hb-common.html#HB-SCRIPT-PHOENICIAN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_CARIAN" link="harfbuzz-hb-common.html#HB-SCRIPT-CARIAN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_CHAM" link="harfbuzz-hb-common.html#HB-SCRIPT-CHAM:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_KAYAH_LI" link="harfbuzz-hb-common.html#HB-SCRIPT-KAYAH-LI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_LEPCHA" link="harfbuzz-hb-common.html#HB-SCRIPT-LEPCHA:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_LYCIAN" link="harfbuzz-hb-common.html#HB-SCRIPT-LYCIAN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_LYDIAN" link="harfbuzz-hb-common.html#HB-SCRIPT-LYDIAN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_OL_CHIKI" link="harfbuzz-hb-common.html#HB-SCRIPT-OL-CHIKI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_REJANG" link="harfbuzz-hb-common.html#HB-SCRIPT-REJANG:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_SAURASHTRA" link="harfbuzz-hb-common.html#HB-SCRIPT-SAURASHTRA:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_SUNDANESE" link="harfbuzz-hb-common.html#HB-SCRIPT-SUNDANESE:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_VAI" link="harfbuzz-hb-common.html#HB-SCRIPT-VAI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_AVESTAN" link="harfbuzz-hb-common.html#HB-SCRIPT-AVESTAN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_BAMUM" link="harfbuzz-hb-common.html#HB-SCRIPT-BAMUM:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_EGYPTIAN_HIEROGLYPHS" link="harfbuzz-hb-common.html#HB-SCRIPT-EGYPTIAN-HIEROGLYPHS:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_IMPERIAL_ARAMAIC" link="harfbuzz-hb-common.html#HB-SCRIPT-IMPERIAL-ARAMAIC:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_INSCRIPTIONAL_PAHLAVI" link="harfbuzz-hb-common.html#HB-SCRIPT-INSCRIPTIONAL-PAHLAVI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_INSCRIPTIONAL_PARTHIAN" link="harfbuzz-hb-common.html#HB-SCRIPT-INSCRIPTIONAL-PARTHIAN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_JAVANESE" link="harfbuzz-hb-common.html#HB-SCRIPT-JAVANESE:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_KAITHI" link="harfbuzz-hb-common.html#HB-SCRIPT-KAITHI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_LISU" link="harfbuzz-hb-common.html#HB-SCRIPT-LISU:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_MEETEI_MAYEK" link="harfbuzz-hb-common.html#HB-SCRIPT-MEETEI-MAYEK:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_OLD_SOUTH_ARABIAN" link="harfbuzz-hb-common.html#HB-SCRIPT-OLD-SOUTH-ARABIAN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_OLD_TURKIC" link="harfbuzz-hb-common.html#HB-SCRIPT-OLD-TURKIC:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_SAMARITAN" link="harfbuzz-hb-common.html#HB-SCRIPT-SAMARITAN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_TAI_THAM" link="harfbuzz-hb-common.html#HB-SCRIPT-TAI-THAM:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_TAI_VIET" link="harfbuzz-hb-common.html#HB-SCRIPT-TAI-VIET:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_BATAK" link="harfbuzz-hb-common.html#HB-SCRIPT-BATAK:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_BRAHMI" link="harfbuzz-hb-common.html#HB-SCRIPT-BRAHMI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_MANDAIC" link="harfbuzz-hb-common.html#HB-SCRIPT-MANDAIC:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_CHAKMA" link="harfbuzz-hb-common.html#HB-SCRIPT-CHAKMA:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_MEROITIC_CURSIVE" link="harfbuzz-hb-common.html#HB-SCRIPT-MEROITIC-CURSIVE:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_MEROITIC_HIEROGLYPHS" link="harfbuzz-hb-common.html#HB-SCRIPT-MEROITIC-HIEROGLYPHS:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_MIAO" link="harfbuzz-hb-common.html#HB-SCRIPT-MIAO:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_SHARADA" link="harfbuzz-hb-common.html#HB-SCRIPT-SHARADA:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_SORA_SOMPENG" link="harfbuzz-hb-common.html#HB-SCRIPT-SORA-SOMPENG:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_TAKRI" link="harfbuzz-hb-common.html#HB-SCRIPT-TAKRI:CAPS"/>
     <keyword type="constant" name="HB_SCRIPT_BASSA_VAH" link="harfbuzz-hb-common.html#HB-SCRIPT-BASSA-VAH:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_CAUCASIAN_ALBANIAN" link="harfbuzz-hb-common.html#HB-SCRIPT-CAUCASIAN-ALBANIAN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_DUPLOYAN" link="harfbuzz-hb-common.html#HB-SCRIPT-DUPLOYAN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_ELBASAN" link="harfbuzz-hb-common.html#HB-SCRIPT-ELBASAN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_GRANTHA" link="harfbuzz-hb-common.html#HB-SCRIPT-GRANTHA:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_KHOJKI" link="harfbuzz-hb-common.html#HB-SCRIPT-KHOJKI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_KHUDAWADI" link="harfbuzz-hb-common.html#HB-SCRIPT-KHUDAWADI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_LINEAR_A" link="harfbuzz-hb-common.html#HB-SCRIPT-LINEAR-A:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_MAHAJANI" link="harfbuzz-hb-common.html#HB-SCRIPT-MAHAJANI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_MANICHAEAN" link="harfbuzz-hb-common.html#HB-SCRIPT-MANICHAEAN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_MENDE_KIKAKUI" link="harfbuzz-hb-common.html#HB-SCRIPT-MENDE-KIKAKUI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_MODI" link="harfbuzz-hb-common.html#HB-SCRIPT-MODI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_MRO" link="harfbuzz-hb-common.html#HB-SCRIPT-MRO:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_NABATAEAN" link="harfbuzz-hb-common.html#HB-SCRIPT-NABATAEAN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_OLD_NORTH_ARABIAN" link="harfbuzz-hb-common.html#HB-SCRIPT-OLD-NORTH-ARABIAN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_OLD_PERMIC" link="harfbuzz-hb-common.html#HB-SCRIPT-OLD-PERMIC:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_PAHAWH_HMONG" link="harfbuzz-hb-common.html#HB-SCRIPT-PAHAWH-HMONG:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_PALMYRENE" link="harfbuzz-hb-common.html#HB-SCRIPT-PALMYRENE:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_PAU_CIN_HAU" link="harfbuzz-hb-common.html#HB-SCRIPT-PAU-CIN-HAU:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_PSALTER_PAHLAVI" link="harfbuzz-hb-common.html#HB-SCRIPT-PSALTER-PAHLAVI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_SIDDHAM" link="harfbuzz-hb-common.html#HB-SCRIPT-SIDDHAM:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_TIRHUTA" link="harfbuzz-hb-common.html#HB-SCRIPT-TIRHUTA:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_WARANG_CITI" link="harfbuzz-hb-common.html#HB-SCRIPT-WARANG-CITI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_AHOM" link="harfbuzz-hb-common.html#HB-SCRIPT-AHOM:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_ANATOLIAN_HIEROGLYPHS" link="harfbuzz-hb-common.html#HB-SCRIPT-ANATOLIAN-HIEROGLYPHS:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_HATRAN" link="harfbuzz-hb-common.html#HB-SCRIPT-HATRAN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_MULTANI" link="harfbuzz-hb-common.html#HB-SCRIPT-MULTANI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_OLD_HUNGARIAN" link="harfbuzz-hb-common.html#HB-SCRIPT-OLD-HUNGARIAN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_SIGNWRITING" link="harfbuzz-hb-common.html#HB-SCRIPT-SIGNWRITING:CAPS"/>
     <keyword type="constant" name="HB_SCRIPT_ADLAM" link="harfbuzz-hb-common.html#HB-SCRIPT-ADLAM:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_BHAIKSUKI" link="harfbuzz-hb-common.html#HB-SCRIPT-BHAIKSUKI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_MARCHEN" link="harfbuzz-hb-common.html#HB-SCRIPT-MARCHEN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_OSAGE" link="harfbuzz-hb-common.html#HB-SCRIPT-OSAGE:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_TANGUT" link="harfbuzz-hb-common.html#HB-SCRIPT-TANGUT:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_NEWA" link="harfbuzz-hb-common.html#HB-SCRIPT-NEWA:CAPS"/>
     <keyword type="constant" name="HB_SCRIPT_MASARAM_GONDI" link="harfbuzz-hb-common.html#HB-SCRIPT-MASARAM-GONDI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_NUSHU" link="harfbuzz-hb-common.html#HB-SCRIPT-NUSHU:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_SOYOMBO" link="harfbuzz-hb-common.html#HB-SCRIPT-SOYOMBO:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_ZANABAZAR_SQUARE" link="harfbuzz-hb-common.html#HB-SCRIPT-ZANABAZAR-SQUARE:CAPS"/>
     <keyword type="constant" name="HB_SCRIPT_DOGRA" link="harfbuzz-hb-common.html#HB-SCRIPT-DOGRA:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_GUNJALA_GONDI" link="harfbuzz-hb-common.html#HB-SCRIPT-GUNJALA-GONDI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_HANIFI_ROHINGYA" link="harfbuzz-hb-common.html#HB-SCRIPT-HANIFI-ROHINGYA:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_MAKASAR" link="harfbuzz-hb-common.html#HB-SCRIPT-MAKASAR:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_MEDEFAIDRIN" link="harfbuzz-hb-common.html#HB-SCRIPT-MEDEFAIDRIN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_OLD_SOGDIAN" link="harfbuzz-hb-common.html#HB-SCRIPT-OLD-SOGDIAN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_SOGDIAN" link="harfbuzz-hb-common.html#HB-SCRIPT-SOGDIAN:CAPS"/>
     <keyword type="constant" name="HB_SCRIPT_ELYMAIC" link="harfbuzz-hb-common.html#HB-SCRIPT-ELYMAIC:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_NANDINAGARI" link="harfbuzz-hb-common.html#HB-SCRIPT-NANDINAGARI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_NYIAKENG_PUACHUE_HMONG" link="harfbuzz-hb-common.html#HB-SCRIPT-NYIAKENG-PUACHUE-HMONG:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_WANCHO" link="harfbuzz-hb-common.html#HB-SCRIPT-WANCHO:CAPS"/>
     <keyword type="constant" name="HB_SCRIPT_CHORASMIAN" link="harfbuzz-hb-common.html#HB-SCRIPT-CHORASMIAN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_DIVES_AKURU" link="harfbuzz-hb-common.html#HB-SCRIPT-DIVES-AKURU:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_KHITAN_SMALL_SCRIPT" link="harfbuzz-hb-common.html#HB-SCRIPT-KHITAN-SMALL-SCRIPT:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_YEZIDI" link="harfbuzz-hb-common.html#HB-SCRIPT-YEZIDI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_CYPRO_MINOAN" link="harfbuzz-hb-common.html#HB-SCRIPT-CYPRO-MINOAN:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_OLD_UYGHUR" link="harfbuzz-hb-common.html#HB-SCRIPT-OLD-UYGHUR:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_TANGSA" link="harfbuzz-hb-common.html#HB-SCRIPT-TANGSA:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_TOTO" link="harfbuzz-hb-common.html#HB-SCRIPT-TOTO:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_VITHKUQI" link="harfbuzz-hb-common.html#HB-SCRIPT-VITHKUQI:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_MATH" link="harfbuzz-hb-common.html#HB-SCRIPT-MATH:CAPS"/>
     <keyword type="constant" name="HB_SCRIPT_INVALID" link="harfbuzz-hb-common.html#HB-SCRIPT-INVALID:CAPS"/>
-    <keyword type="constant" name="_HB_SCRIPT_MAX_VALUE" link="harfbuzz-hb-common.html#HB-SCRIPT-MAX-VALUE:CAPS"/>
-    <keyword type="constant" name="_HB_SCRIPT_MAX_VALUE_SIGNED" link="harfbuzz-hb-common.html#HB-SCRIPT-MAX-VALUE-SIGNED:CAPS"/>
     <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_NOT_REORDERED" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-NOT-REORDERED:CAPS"/>
     <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_OVERLAY" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-OVERLAY:CAPS"/>
     <keyword type="constant" name="HB_UNICODE_COMBINING_CLASS_NUKTA" link="harfbuzz-hb-unicode.html#HB-UNICODE-COMBINING-CLASS-NUKTA:CAPS"/>
     <keyword type="constant" name="HB_OT_LAYOUT_BASELINE_TAG_IDEO_EMBOX_BOTTOM_OR_LEFT" link="harfbuzz-hb-ot-layout.html#HB-OT-LAYOUT-BASELINE-TAG-IDEO-EMBOX-BOTTOM-OR-LEFT:CAPS"/>
     <keyword type="constant" name="HB_OT_LAYOUT_BASELINE_TAG_IDEO_EMBOX_TOP_OR_RIGHT" link="harfbuzz-hb-ot-layout.html#HB-OT-LAYOUT-BASELINE-TAG-IDEO-EMBOX-TOP-OR-RIGHT:CAPS"/>
     <keyword type="constant" name="HB_OT_LAYOUT_BASELINE_TAG_MATH" link="harfbuzz-hb-ot-layout.html#HB-OT-LAYOUT-BASELINE-TAG-MATH:CAPS"/>
-    <keyword type="constant" name="_HB_OT_LAYOUT_BASELINE_TAG_MAX_VALUE" link="harfbuzz-hb-ot-layout.html#HB-OT-LAYOUT-BASELINE-TAG-MAX-VALUE:CAPS"/>
     <keyword type="constant" name="HB_OT_LAYOUT_GLYPH_CLASS_UNCLASSIFIED" link="harfbuzz-hb-ot-layout.html#HB-OT-LAYOUT-GLYPH-CLASS-UNCLASSIFIED:CAPS"/>
     <keyword type="constant" name="HB_OT_LAYOUT_GLYPH_CLASS_BASE_GLYPH" link="harfbuzz-hb-ot-layout.html#HB-OT-LAYOUT-GLYPH-CLASS-BASE-GLYPH:CAPS"/>
     <keyword type="constant" name="HB_OT_LAYOUT_GLYPH_CLASS_LIGATURE" link="harfbuzz-hb-ot-layout.html#HB-OT-LAYOUT-GLYPH-CLASS-LIGATURE:CAPS"/>
     <keyword type="constant" name="HB_OT_MATH_KERN_BOTTOM_RIGHT" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-KERN-BOTTOM-RIGHT:CAPS"/>
     <keyword type="constant" name="HB_OT_MATH_KERN_BOTTOM_LEFT" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-KERN-BOTTOM-LEFT:CAPS"/>
     <keyword type="constant" name="HB_OT_MATH_GLYPH_PART_FLAG_EXTENDER" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-GLYPH-PART-FLAG-EXTENDER:CAPS"/>
+    <keyword type="constant" name="HB_OT_META_TAG_DESIGN_LANGUAGES" link="harfbuzz-hb-ot-meta.html#HB-OT-META-TAG-DESIGN-LANGUAGES:CAPS"/>
+    <keyword type="constant" name="HB_OT_META_TAG_SUPPORTED_LANGUAGES" link="harfbuzz-hb-ot-meta.html#HB-OT-META-TAG-SUPPORTED-LANGUAGES:CAPS"/>
+    <keyword type="constant" name="HB_OT_METRICS_TAG_HORIZONTAL_ASCENDER" link="harfbuzz-hb-ot-metrics.html#HB-OT-METRICS-TAG-HORIZONTAL-ASCENDER:CAPS"/>
+    <keyword type="constant" name="HB_OT_METRICS_TAG_HORIZONTAL_DESCENDER" link="harfbuzz-hb-ot-metrics.html#HB-OT-METRICS-TAG-HORIZONTAL-DESCENDER:CAPS"/>
+    <keyword type="constant" name="HB_OT_METRICS_TAG_HORIZONTAL_LINE_GAP" link="harfbuzz-hb-ot-metrics.html#HB-OT-METRICS-TAG-HORIZONTAL-LINE-GAP:CAPS"/>
+    <keyword type="constant" name="HB_OT_METRICS_TAG_HORIZONTAL_CLIPPING_ASCENT" link="harfbuzz-hb-ot-metrics.html#HB-OT-METRICS-TAG-HORIZONTAL-CLIPPING-ASCENT:CAPS"/>
+    <keyword type="constant" name="HB_OT_METRICS_TAG_HORIZONTAL_CLIPPING_DESCENT" link="harfbuzz-hb-ot-metrics.html#HB-OT-METRICS-TAG-HORIZONTAL-CLIPPING-DESCENT:CAPS"/>
+    <keyword type="constant" name="HB_OT_METRICS_TAG_VERTICAL_ASCENDER" link="harfbuzz-hb-ot-metrics.html#HB-OT-METRICS-TAG-VERTICAL-ASCENDER:CAPS"/>
+    <keyword type="constant" name="HB_OT_METRICS_TAG_VERTICAL_DESCENDER" link="harfbuzz-hb-ot-metrics.html#HB-OT-METRICS-TAG-VERTICAL-DESCENDER:CAPS"/>
+    <keyword type="constant" name="HB_OT_METRICS_TAG_VERTICAL_LINE_GAP" link="harfbuzz-hb-ot-metrics.html#HB-OT-METRICS-TAG-VERTICAL-LINE-GAP:CAPS"/>
+    <keyword type="constant" name="HB_OT_METRICS_TAG_HORIZONTAL_CARET_RISE" link="harfbuzz-hb-ot-metrics.html#HB-OT-METRICS-TAG-HORIZONTAL-CARET-RISE:CAPS"/>
+    <keyword type="constant" name="HB_OT_METRICS_TAG_HORIZONTAL_CARET_RUN" link="harfbuzz-hb-ot-metrics.html#HB-OT-METRICS-TAG-HORIZONTAL-CARET-RUN:CAPS"/>
+    <keyword type="constant" name="HB_OT_METRICS_TAG_HORIZONTAL_CARET_OFFSET" link="harfbuzz-hb-ot-metrics.html#HB-OT-METRICS-TAG-HORIZONTAL-CARET-OFFSET:CAPS"/>
+    <keyword type="constant" name="HB_OT_METRICS_TAG_VERTICAL_CARET_RISE" link="harfbuzz-hb-ot-metrics.html#HB-OT-METRICS-TAG-VERTICAL-CARET-RISE:CAPS"/>
+    <keyword type="constant" name="HB_OT_METRICS_TAG_VERTICAL_CARET_RUN" link="harfbuzz-hb-ot-metrics.html#HB-OT-METRICS-TAG-VERTICAL-CARET-RUN:CAPS"/>
+    <keyword type="constant" name="HB_OT_METRICS_TAG_VERTICAL_CARET_OFFSET" link="harfbuzz-hb-ot-metrics.html#HB-OT-METRICS-TAG-VERTICAL-CARET-OFFSET:CAPS"/>
+    <keyword type="constant" name="HB_OT_METRICS_TAG_X_HEIGHT" link="harfbuzz-hb-ot-metrics.html#HB-OT-METRICS-TAG-X-HEIGHT:CAPS"/>
+    <keyword type="constant" name="HB_OT_METRICS_TAG_CAP_HEIGHT" link="harfbuzz-hb-ot-metrics.html#HB-OT-METRICS-TAG-CAP-HEIGHT:CAPS"/>
+    <keyword type="constant" name="HB_OT_METRICS_TAG_SUBSCRIPT_EM_X_SIZE" link="harfbuzz-hb-ot-metrics.html#HB-OT-METRICS-TAG-SUBSCRIPT-EM-X-SIZE:CAPS"/>
+    <keyword type="constant" name="HB_OT_METRICS_TAG_SUBSCRIPT_EM_Y_SIZE" link="harfbuzz-hb-ot-metrics.html#HB-OT-METRICS-TAG-SUBSCRIPT-EM-Y-SIZE:CAPS"/>
+    <keyword type="constant" name="HB_OT_METRICS_TAG_SUBSCRIPT_EM_X_OFFSET" link="harfbuzz-hb-ot-metrics.html#HB-OT-METRICS-TAG-SUBSCRIPT-EM-X-OFFSET:CAPS"/>
+    <keyword type="constant" name="HB_OT_METRICS_TAG_SUBSCRIPT_EM_Y_OFFSET" link="harfbuzz-hb-ot-metrics.html#HB-OT-METRICS-TAG-SUBSCRIPT-EM-Y-OFFSET:CAPS"/>
+    <keyword type="constant" name="HB_OT_METRICS_TAG_SUPERSCRIPT_EM_X_SIZE" link="harfbuzz-hb-ot-metrics.html#HB-OT-METRICS-TAG-SUPERSCRIPT-EM-X-SIZE:CAPS"/>
+    <keyword type="constant" name="HB_OT_METRICS_TAG_SUPERSCRIPT_EM_Y_SIZE" link="harfbuzz-hb-ot-metrics.html#HB-OT-METRICS-TAG-SUPERSCRIPT-EM-Y-SIZE:CAPS"/>
+    <keyword type="constant" name="HB_OT_METRICS_TAG_SUPERSCRIPT_EM_X_OFFSET" link="harfbuzz-hb-ot-metrics.html#HB-OT-METRICS-TAG-SUPERSCRIPT-EM-X-OFFSET:CAPS"/>
+    <keyword type="constant" name="HB_OT_METRICS_TAG_SUPERSCRIPT_EM_Y_OFFSET" link="harfbuzz-hb-ot-metrics.html#HB-OT-METRICS-TAG-SUPERSCRIPT-EM-Y-OFFSET:CAPS"/>
+    <keyword type="constant" name="HB_OT_METRICS_TAG_STRIKEOUT_SIZE" link="harfbuzz-hb-ot-metrics.html#HB-OT-METRICS-TAG-STRIKEOUT-SIZE:CAPS"/>
+    <keyword type="constant" name="HB_OT_METRICS_TAG_STRIKEOUT_OFFSET" link="harfbuzz-hb-ot-metrics.html#HB-OT-METRICS-TAG-STRIKEOUT-OFFSET:CAPS"/>
+    <keyword type="constant" name="HB_OT_METRICS_TAG_UNDERLINE_SIZE" link="harfbuzz-hb-ot-metrics.html#HB-OT-METRICS-TAG-UNDERLINE-SIZE:CAPS"/>
+    <keyword type="constant" name="HB_OT_METRICS_TAG_UNDERLINE_OFFSET" link="harfbuzz-hb-ot-metrics.html#HB-OT-METRICS-TAG-UNDERLINE-OFFSET:CAPS"/>
     <keyword type="constant" name="HB_OT_VAR_AXIS_FLAG_HIDDEN" link="harfbuzz-hb-ot-var.html#HB-OT-VAR-AXIS-FLAG-HIDDEN:CAPS"/>
-    <keyword type="constant" name="_HB_OT_VAR_AXIS_FLAG_MAX_VALUE" link="harfbuzz-hb-ot-var.html#HB-OT-VAR-AXIS-FLAG-MAX-VALUE:CAPS"/>
     <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_TYPE_INVALID" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-INVALID:CAPS"/>
     <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_TYPE_ALL_TYPOGRAPHIC" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-ALL-TYPOGRAPHIC:CAPS"/>
     <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-LIGATURES:CAPS"/>
     <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_TYPE_UPPER_CASE" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-UPPER-CASE:CAPS"/>
     <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_TYPE_LANGUAGE_TAG_TYPE" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-LANGUAGE-TAG-TYPE:CAPS"/>
     <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_TYPE_CJK_ROMAN_SPACING_TYPE" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-CJK-ROMAN-SPACING-TYPE:CAPS"/>
-    <keyword type="constant" name="_HB_AAT_LAYOUT_FEATURE_TYPE_MAX_VALUE" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-TYPE-MAX-VALUE:CAPS"/>
     <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_INVALID" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-INVALID:CAPS"/>
     <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_ALL_TYPE_FEATURES_ON" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-ALL-TYPE-FEATURES-ON:CAPS"/>
     <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_ALL_TYPE_FEATURES_OFF" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-ALL-TYPE-FEATURES-OFF:CAPS"/>
     <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_CJK_ROMAN" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-PROPORTIONAL-CJK-ROMAN:CAPS"/>
     <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_CJK_ROMAN" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-DEFAULT-CJK-ROMAN:CAPS"/>
     <keyword type="constant" name="HB_AAT_LAYOUT_FEATURE_SELECTOR_FULL_WIDTH_CJK_ROMAN" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-FULL-WIDTH-CJK-ROMAN:CAPS"/>
-    <keyword type="constant" name="_HB_AAT_LAYOUT_FEATURE_SELECTOR_MAX_VALUE" link="harfbuzz-hb-aat-layout.html#HB-AAT-LAYOUT-FEATURE-SELECTOR-MAX-VALUE:CAPS"/>
+    <keyword type="constant" name="HB_STYLE_TAG_ITALIC" link="harfbuzz-hb-style.html#HB-STYLE-TAG-ITALIC:CAPS"/>
+    <keyword type="constant" name="HB_STYLE_TAG_OPTICAL_SIZE" link="harfbuzz-hb-style.html#HB-STYLE-TAG-OPTICAL-SIZE:CAPS"/>
+    <keyword type="constant" name="HB_STYLE_TAG_SLANT_ANGLE" link="harfbuzz-hb-style.html#HB-STYLE-TAG-SLANT-ANGLE:CAPS"/>
+    <keyword type="constant" name="HB_STYLE_TAG_SLANT_RATIO" link="harfbuzz-hb-style.html#HB-STYLE-TAG-SLANT-RATIO:CAPS"/>
+    <keyword type="constant" name="HB_STYLE_TAG_WIDTH" link="harfbuzz-hb-style.html#HB-STYLE-TAG-WIDTH:CAPS"/>
+    <keyword type="constant" name="HB_STYLE_TAG_WEIGHT" link="harfbuzz-hb-style.html#HB-STYLE-TAG-WEIGHT:CAPS"/>
+    <keyword type="constant" name="HB_SUBSET_FLAGS_DEFAULT" link="harfbuzz-hb-subset.html#HB-SUBSET-FLAGS-DEFAULT:CAPS"/>
+    <keyword type="constant" name="HB_SUBSET_FLAGS_NO_HINTING" link="harfbuzz-hb-subset.html#HB-SUBSET-FLAGS-NO-HINTING:CAPS"/>
+    <keyword type="constant" name="HB_SUBSET_FLAGS_RETAIN_GIDS" link="harfbuzz-hb-subset.html#HB-SUBSET-FLAGS-RETAIN-GIDS:CAPS"/>
+    <keyword type="constant" name="HB_SUBSET_FLAGS_DESUBROUTINIZE" link="harfbuzz-hb-subset.html#HB-SUBSET-FLAGS-DESUBROUTINIZE:CAPS"/>
+    <keyword type="constant" name="HB_SUBSET_FLAGS_NAME_LEGACY" link="harfbuzz-hb-subset.html#HB-SUBSET-FLAGS-NAME-LEGACY:CAPS"/>
+    <keyword type="constant" name="HB_SUBSET_FLAGS_SET_OVERLAPS_FLAG" link="harfbuzz-hb-subset.html#HB-SUBSET-FLAGS-SET-OVERLAPS-FLAG:CAPS"/>
+    <keyword type="constant" name="HB_SUBSET_FLAGS_PASSTHROUGH_UNRECOGNIZED" link="harfbuzz-hb-subset.html#HB-SUBSET-FLAGS-PASSTHROUGH-UNRECOGNIZED:CAPS"/>
+    <keyword type="constant" name="HB_SUBSET_FLAGS_NOTDEF_OUTLINE" link="harfbuzz-hb-subset.html#HB-SUBSET-FLAGS-NOTDEF-OUTLINE:CAPS"/>
+    <keyword type="constant" name="HB_SUBSET_FLAGS_GLYPH_NAMES" link="harfbuzz-hb-subset.html#HB-SUBSET-FLAGS-GLYPH-NAMES:CAPS"/>
+    <keyword type="constant" name="HB_SUBSET_FLAGS_NO_PRUNE_UNICODE_RANGES" link="harfbuzz-hb-subset.html#HB-SUBSET-FLAGS-NO-PRUNE-UNICODE-RANGES:CAPS"/>
+    <keyword type="constant" name="HB_SUBSET_SETS_GLYPH_INDEX" link="harfbuzz-hb-subset.html#HB-SUBSET-SETS-GLYPH-INDEX:CAPS"/>
+    <keyword type="constant" name="HB_SUBSET_SETS_UNICODE" link="harfbuzz-hb-subset.html#HB-SUBSET-SETS-UNICODE:CAPS"/>
+    <keyword type="constant" name="HB_SUBSET_SETS_NO_SUBSET_TABLE_TAG" link="harfbuzz-hb-subset.html#HB-SUBSET-SETS-NO-SUBSET-TABLE-TAG:CAPS"/>
+    <keyword type="constant" name="HB_SUBSET_SETS_DROP_TABLE_TAG" link="harfbuzz-hb-subset.html#HB-SUBSET-SETS-DROP-TABLE-TAG:CAPS"/>
+    <keyword type="constant" name="HB_SUBSET_SETS_NAME_ID" link="harfbuzz-hb-subset.html#HB-SUBSET-SETS-NAME-ID:CAPS"/>
+    <keyword type="constant" name="HB_SUBSET_SETS_NAME_LANG_ID" link="harfbuzz-hb-subset.html#HB-SUBSET-SETS-NAME-LANG-ID:CAPS"/>
+    <keyword type="constant" name="HB_SUBSET_SETS_LAYOUT_FEATURE_TAG" link="harfbuzz-hb-subset.html#HB-SUBSET-SETS-LAYOUT-FEATURE-TAG:CAPS"/>
+    <keyword type="member" name="hb-glyph-info-t.codepoint" link="harfbuzz-hb-buffer.html#hb-glyph-info-t.codepoint"/>
+    <keyword type="member" name="hb-glyph-info-t.cluster" link="harfbuzz-hb-buffer.html#hb-glyph-info-t.cluster"/>
     <keyword type="member" name="hb-glyph-position-t.x-advance" link="harfbuzz-hb-buffer.html#hb-glyph-position-t.x-advance"/>
     <keyword type="member" name="hb-glyph-position-t.y-advance" link="harfbuzz-hb-buffer.html#hb-glyph-position-t.y-advance"/>
     <keyword type="member" name="hb-glyph-position-t.x-offset" link="harfbuzz-hb-buffer.html#hb-glyph-position-t.x-offset"/>
     <keyword type="member" name="hb-feature-t.value" link="harfbuzz-hb-common.html#hb-feature-t.value"/>
     <keyword type="member" name="hb-feature-t.start" link="harfbuzz-hb-common.html#hb-feature-t.start"/>
     <keyword type="member" name="hb-feature-t.end" link="harfbuzz-hb-common.html#hb-feature-t.end"/>
+    <keyword type="member" name="hb-variation-t.tag" link="harfbuzz-hb-common.html#hb-variation-t.tag"/>
+    <keyword type="member" name="hb-variation-t.value" link="harfbuzz-hb-common.html#hb-variation-t.value"/>
+    <keyword type="member" name="hb-ot-var-axis-t.tag" link="harfbuzz-hb-deprecated.html#hb-ot-var-axis-t.tag"/>
+    <keyword type="member" name="hb-ot-var-axis-t.name-id" link="harfbuzz-hb-deprecated.html#hb-ot-var-axis-t.name-id"/>
+    <keyword type="member" name="hb-ot-var-axis-t.min-value" link="harfbuzz-hb-deprecated.html#hb-ot-var-axis-t.min-value"/>
+    <keyword type="member" name="hb-ot-var-axis-t.default-value" link="harfbuzz-hb-deprecated.html#hb-ot-var-axis-t.default-value"/>
+    <keyword type="member" name="hb-ot-var-axis-t.max-value" link="harfbuzz-hb-deprecated.html#hb-ot-var-axis-t.max-value"/>
+    <keyword type="member" name="hb-font-extents-t.ascender" link="harfbuzz-hb-font.html#hb-font-extents-t.ascender"/>
+    <keyword type="member" name="hb-font-extents-t.descender" link="harfbuzz-hb-font.html#hb-font-extents-t.descender"/>
+    <keyword type="member" name="hb-font-extents-t.line-gap" link="harfbuzz-hb-font.html#hb-font-extents-t.line-gap"/>
+    <keyword type="member" name="hb-glyph-extents-t.x-bearing" link="harfbuzz-hb-font.html#hb-glyph-extents-t.x-bearing"/>
+    <keyword type="member" name="hb-glyph-extents-t.y-bearing" link="harfbuzz-hb-font.html#hb-glyph-extents-t.y-bearing"/>
+    <keyword type="member" name="hb-glyph-extents-t.width" link="harfbuzz-hb-font.html#hb-glyph-extents-t.width"/>
+    <keyword type="member" name="hb-glyph-extents-t.height" link="harfbuzz-hb-font.html#hb-glyph-extents-t.height"/>
+    <keyword type="member" name="hb-ot-color-layer-t.glyph" link="harfbuzz-hb-ot-color.html#hb-ot-color-layer-t.glyph"/>
+    <keyword type="member" name="hb-ot-color-layer-t.color-index" link="harfbuzz-hb-ot-color.html#hb-ot-color-layer-t.color-index"/>
+    <keyword type="member" name="hb-ot-math-kern-entry-t.max-correction-height" link="harfbuzz-hb-ot-math.html#hb-ot-math-kern-entry-t.max-correction-height"/>
+    <keyword type="member" name="hb-ot-math-kern-entry-t.kern-value" link="harfbuzz-hb-ot-math.html#hb-ot-math-kern-entry-t.kern-value"/>
     <keyword type="member" name="hb-ot-math-glyph-variant-t.glyph" link="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-variant-t.glyph"/>
     <keyword type="member" name="hb-ot-math-glyph-variant-t.advance" link="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-variant-t.advance"/>
     <keyword type="member" name="hb-ot-math-glyph-part-t.glyph" link="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-part-t.glyph"/>
     <keyword type="member" name="hb-ot-math-glyph-part-t.end-connector-length" link="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-part-t.end-connector-length"/>
     <keyword type="member" name="hb-ot-math-glyph-part-t.full-advance" link="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-part-t.full-advance"/>
     <keyword type="member" name="hb-ot-math-glyph-part-t.flags" link="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-part-t.flags"/>
+    <keyword type="member" name="hb-ot-name-entry-t.name-id" link="harfbuzz-hb-ot-name.html#hb-ot-name-entry-t.name-id"/>
+    <keyword type="member" name="hb-ot-name-entry-t.language" link="harfbuzz-hb-ot-name.html#hb-ot-name-entry-t.language"/>
+    <keyword type="member" name="hb-ot-var-axis-info-t.axis-index" link="harfbuzz-hb-ot-var.html#hb-ot-var-axis-info-t.axis-index"/>
+    <keyword type="member" name="hb-ot-var-axis-info-t.tag" link="harfbuzz-hb-ot-var.html#hb-ot-var-axis-info-t.tag"/>
+    <keyword type="member" name="hb-ot-var-axis-info-t.name-id" link="harfbuzz-hb-ot-var.html#hb-ot-var-axis-info-t.name-id"/>
+    <keyword type="member" name="hb-ot-var-axis-info-t.flags" link="harfbuzz-hb-ot-var.html#hb-ot-var-axis-info-t.flags"/>
+    <keyword type="member" name="hb-ot-var-axis-info-t.min-value" link="harfbuzz-hb-ot-var.html#hb-ot-var-axis-info-t.min-value"/>
+    <keyword type="member" name="hb-ot-var-axis-info-t.default-value" link="harfbuzz-hb-ot-var.html#hb-ot-var-axis-info-t.default-value"/>
+    <keyword type="member" name="hb-ot-var-axis-info-t.max-value" link="harfbuzz-hb-ot-var.html#hb-ot-var-axis-info-t.max-value"/>
+    <keyword type="member" name="hb-aat-layout-feature-selector-info-t.name-id" link="harfbuzz-hb-aat-layout.html#hb-aat-layout-feature-selector-info-t.name-id"/>
+    <keyword type="member" name="hb-aat-layout-feature-selector-info-t.enable" link="harfbuzz-hb-aat-layout.html#hb-aat-layout-feature-selector-info-t.enable"/>
+    <keyword type="member" name="hb-aat-layout-feature-selector-info-t.disable" link="harfbuzz-hb-aat-layout.html#hb-aat-layout-feature-selector-info-t.disable"/>
   </functions>
 </book>
index 9346b33..b293af5 100644 (file)
Binary files a/docs/html/home.png and b/docs/html/home.png differ
index 2b2504b..c5a145e 100644 (file)
@@ -3,11 +3,11 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>HarfBuzz Manual: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
-<meta name="description" content="HarfBuzz  HarfBuzz is an OpenType text shaping engine. Using the HarfBuzz library allows programs to convert a sequence of Unicode input into properly formatted and positioned glyph output—for any writing system and language. The canonical source-code tree is available at github.com/harfbuzz/harfbuzz. See for release tarballs.">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<meta name="description" content="HarfBuzz  HarfBuzz is a text shaping library. Using the HarfBuzz library allows programs to convert a sequence of Unicode input into properly formatted and positioned glyph output—for any writing system and language. The canonical source-code tree is available at github.com/harfbuzz/harfbuzz. See for release tarballs.">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="next" href="pt01.html" title="Part I. User's manual">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<link rel="next" href="user-manual.html" title="Part I. User's manual">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -19,8 +19,7 @@
 <p class="title"><b>HarfBuzz</b></p>
 <div align="center"><img src="HarfBuzz.png" align="middle"></div>
 <p>
-        HarfBuzz is an <a class="ulink" href="http://www.microsoft.com/typography/otspec/" target="_top">OpenType</a>
-        text shaping engine. Using the HarfBuzz library allows
+        HarfBuzz is a text shaping library. Using the HarfBuzz library allows
        programs to convert a sequence of Unicode input into
        properly formatted and positioned glyph output—for any writing
        system and language.
 <hr>
 </div>
 <div class="toc"><dl class="toc">
-<dt><span class="part"><a href="pt01.html">I. User's manual</a></span></dt>
+<dt><span class="part"><a href="user-manual.html">I. User's manual</a></span></dt>
 <dd><dl>
 <dt><span class="chapter"><a href="what-is-harfbuzz.html">What is HarfBuzz?</a></span></dt>
 <dd><dl>
 <dt><span class="section"><a href="what-is-harfbuzz.html#what-is-text-shaping">What is text shaping?</a></span></dt>
 <dt><span class="section"><a href="why-do-i-need-a-shaping-engine.html">Why do I need a shaping engine?</a></span></dt>
-<dt><span class="section"><a href="ch01s03.html">What does HarfBuzz do?</a></span></dt>
+<dt><span class="section"><a href="what-does-harfbuzz-do.html">What does HarfBuzz do?</a></span></dt>
 <dt><span class="section"><a href="what-harfbuzz-doesnt-do.html">What HarfBuzz doesn't do</a></span></dt>
 <dt><span class="section"><a href="why-is-it-called-harfbuzz.html">Why is it called HarfBuzz?</a></span></dt>
 </dl></dd>
@@ -59,9 +58,9 @@
 </dl></dd>
 <dt><span class="chapter"><a href="getting-started.html">Getting started with HarfBuzz</a></span></dt>
 <dd><dl>
-<dt><span class="section"><a href="getting-started.html#id-1.2.4.2">An overview of the HarfBuzz shaping API</a></span></dt>
-<dt><span class="section"><a href="ch03s02.html">Terminology</a></span></dt>
-<dt><span class="section"><a href="ch03s03.html">A simple shaping example</a></span></dt>
+<dt><span class="section"><a href="getting-started.html#an-overview-of-the-harfbuzz-shaping-api">An overview of the HarfBuzz shaping API</a></span></dt>
+<dt><span class="section"><a href="terminology.html">Terminology</a></span></dt>
+<dt><span class="section"><a href="a-simple-shaping-example.html">A simple shaping example</a></span></dt>
 </dl></dd>
 <dt><span class="chapter"><a href="shaping-concepts.html">Shaping concepts</a></span></dt>
 <dd><dl>
 <dt><span class="section"><a href="utilities.html#utilities-command-line-hbsubset">hb-subset</a></span></dt>
 </dl></dd>
 <dt><span class="section"><a href="utilities-common-types-apis.html">Common data types and APIs</a></span></dt>
-<dt><span class="section"><a href="utilities-ucdn.html">UCDN</a></span></dt>
 </dl></dd>
 <dt><span class="chapter"><a href="integration.html">Platform Integration Guide</a></span></dt>
 <dd><dl>
 <dt><span class="section"><a href="integration-python.html">Python bindings</a></span></dt>
 </dl></dd>
 </dl></dd>
-<dt><span class="part"><a href="pt02.html">II. Reference manual</a></span></dt>
+<dt><span class="part"><a href="reference-manual.html">II. Reference manual</a></span></dt>
 <dd><dl>
-<dt><span class="chapter"><a href="ch12.html">Core API</a></span></dt>
+<dt><span class="chapter"><a href="core-api.html">Core API</a></span></dt>
 <dd><dl>
 <dt>
 <span class="refentrytitle"><a href="harfbuzz-hb-blob.html">hb-blob</a></span><span class="refpurpose"> — Binary data containers</span>
 <span class="refentrytitle"><a href="harfbuzz-hb-map.html">hb-map</a></span><span class="refpurpose"> — Object representing integer to integer mapping</span>
 </dt>
 <dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-set.html">hb-set</a></span><span class="refpurpose"> — Object representing a set of integers</span>
+<span class="refentrytitle"><a href="harfbuzz-hb-set.html">hb-set</a></span><span class="refpurpose"> — Objects representing a set of integers</span>
 </dt>
 <dt>
 <span class="refentrytitle"><a href="harfbuzz-hb-shape-plan.html">hb-shape-plan</a></span><span class="refpurpose"> — Object representing a shaping plan</span>
 <span class="refentrytitle"><a href="harfbuzz-hb-version.html">hb-version</a></span><span class="refpurpose"> — Information about the version of HarfBuzz in use</span>
 </dt>
 </dl></dd>
-<dt><span class="chapter"><a href="ch13.html">OpenType API</a></span></dt>
+<dt><span class="chapter"><a href="opentype-api.html">OpenType API</a></span></dt>
 <dd><dl>
 <dt>
 <span class="refentrytitle"><a href="harfbuzz-hb-ot-color.html">hb-ot-color</a></span><span class="refpurpose"> — OpenType Color Fonts</span>
 <span class="refentrytitle"><a href="harfbuzz-hb-ot-math.html">hb-ot-math</a></span><span class="refpurpose"> — OpenType Math information</span>
 </dt>
 <dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-ot-meta.html">hb-ot-meta</a></span><span class="refpurpose"> — OpenType Metadata</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-ot-metrics.html">hb-ot-metrics</a></span><span class="refpurpose"> — OpenType Metrics</span>
+</dt>
+<dt>
 <span class="refentrytitle"><a href="harfbuzz-hb-ot-name.html">hb-ot-name</a></span><span class="refpurpose"> — OpenType font name information</span>
 </dt>
 <dt>
 <span class="refentrytitle"><a href="harfbuzz-hb-ot-var.html">hb-ot-var</a></span><span class="refpurpose"> — OpenType Font Variations</span>
 </dt>
 </dl></dd>
-<dt><span class="chapter"><a href="ch14.html">Apple Advanced Typography API</a></span></dt>
+<dt><span class="chapter"><a href="apple-advanced-typography-api.html">Apple Advanced Typography API</a></span></dt>
 <dd><dl><dt>
 <span class="refentrytitle"><a href="harfbuzz-hb-aat-layout.html">hb-aat-layout</a></span><span class="refpurpose"> — Apple Advanced Typography Layout</span>
 </dt></dl></dd>
-<dt><span class="chapter"><a href="ch15.html">Integration API</a></span></dt>
+<dt><span class="chapter"><a href="integration-api.html">Integration API</a></span></dt>
 <dd><dl>
 <dt>
 <span class="refentrytitle"><a href="harfbuzz-hb-coretext.html">hb-coretext</a></span><span class="refpurpose"> — CoreText integration</span>
 <span class="refentrytitle"><a href="harfbuzz-hb-glib.html">hb-glib</a></span><span class="refpurpose"> — GLib integration</span>
 </dt>
 <dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-gobject.html">hb-gobject</a></span><span class="refpurpose"> — GObject integration support</span>
-</dt>
-<dt>
 <span class="refentrytitle"><a href="harfbuzz-hb-graphite2.html">hb-graphite2</a></span><span class="refpurpose"> — Graphite2 integration</span>
 </dt>
 <dt>
 <dt>
 <span class="refentrytitle"><a href="harfbuzz-hb-uniscribe.html">hb-uniscribe</a></span><span class="refpurpose"> — Windows integration</span>
 </dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-gdi.html">hb-gdi</a></span><span class="refpurpose"> — GDI integration</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-directwrite.html">hb-directwrite</a></span><span class="refpurpose"> — DirectWrite integration</span>
+</dt>
 </dl></dd>
+<dt><span class="chapter"><a href="style-api.html">Style API</a></span></dt>
+<dd><dl><dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-style.html">hb-style</a></span><span class="refpurpose"> — Font Styles</span>
+</dt></dl></dd>
+<dt><span class="chapter"><a href="subset-api.html">Subset API</a></span></dt>
+<dd><dl><dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-subset.html">hb-subset</a></span><span class="refpurpose"> — Subsets font files.</span>
+</dt></dl></dd>
 <dt><span class="index"><a href="api-index-full.html">API Index</a></span></dt>
+<dt><span class="index"><a href="deprecated-api-index.html">Index of deprecated API</a></span></dt>
+<dt><span class="index"><a href="api-index-3-4-0.html">Index of new symbols in 3.4.0</a></span></dt>
+<dt><span class="index"><a href="api-index-3-3-0.html">Index of new symbols in 3.3.0</a></span></dt>
+<dt><span class="index"><a href="api-index-3-1-0.html">Index of new symbols in 3.1.0</a></span></dt>
+<dt><span class="index"><a href="api-index-3-0-0.html">Index of new symbols in 3.0.0</a></span></dt>
+<dt><span class="index"><a href="api-index-2-9-1.html">Index of new symbols in 2.9.1</a></span></dt>
+<dt><span class="index"><a href="api-index-2-9-0.html">Index of new symbols in 2.9.0</a></span></dt>
+<dt><span class="index"><a href="api-index-2-8-2.html">Index of new symbols in 2.8.2</a></span></dt>
+<dt><span class="index"><a href="api-index-2-7-3.html">Index of new symbols in 2.7.3</a></span></dt>
+<dt><span class="index"><a href="api-index-2-6-8.html">Index of new symbols in 2.6.8</a></span></dt>
+<dt><span class="index"><a href="api-index-2-6-5.html">Index of new symbols in 2.6.5</a></span></dt>
+<dt><span class="index"><a href="api-index-2-6-3.html">Index of new symbols in 2.6.3</a></span></dt>
+<dt><span class="index"><a href="api-index-2-6-0.html">Index of new symbols in 2.6.0</a></span></dt>
+<dt><span class="index"><a href="api-index-2-5-0.html">Index of new symbols in 2.5.0</a></span></dt>
+<dt><span class="index"><a href="api-index-2-4-0.html">Index of new symbols in 2.4.0</a></span></dt>
+<dt><span class="index"><a href="api-index-2-3-0.html">Index of new symbols in 2.3.0</a></span></dt>
+<dt><span class="index"><a href="api-index-2-2-0.html">Index of new symbols in 2.2.0</a></span></dt>
+<dt><span class="index"><a href="api-index-2-1-0.html">Index of new symbols in 2.1.0</a></span></dt>
+<dt><span class="index"><a href="api-index-2-0-0.html">Index of new symbols in 2.0.0</a></span></dt>
+<dt><span class="index"><a href="api-index-1-9-0.html">Index of new symbols in 1.9.0</a></span></dt>
+<dt><span class="index"><a href="api-index-1-8-6.html">Index of new symbols in 1.8.6</a></span></dt>
+<dt><span class="index"><a href="api-index-1-8-5.html">Index of new symbols in 1.8.5</a></span></dt>
+<dt><span class="index"><a href="api-index-1-8-1.html">Index of new symbols in 1.8.1</a></span></dt>
+<dt><span class="index"><a href="api-index-1-8-0.html">Index of new symbols in 1.8.0</a></span></dt>
+<dt><span class="index"><a href="api-index-1-7-7.html">Index of new symbols in 1.7.7</a></span></dt>
+<dt><span class="index"><a href="api-index-1-7-5.html">Index of new symbols in 1.7.5</a></span></dt>
+<dt><span class="index"><a href="api-index-1-7-2.html">Index of new symbols in 1.7.2</a></span></dt>
+<dt><span class="index"><a href="api-index-1-6-0.html">Index of new symbols in 1.6.0</a></span></dt>
+<dt><span class="index"><a href="api-index-1-5-0.html">Index of new symbols in 1.5.0</a></span></dt>
+<dt><span class="index"><a href="api-index-1-4-3.html">Index of new symbols in 1.4.3</a></span></dt>
+<dt><span class="index"><a href="api-index-1-4-2.html">Index of new symbols in 1.4.2</a></span></dt>
+<dt><span class="index"><a href="api-index-1-4-0.html">Index of new symbols in 1.4.0</a></span></dt>
+<dt><span class="index"><a href="api-index-1-3-3.html">Index of new symbols in 1.3.3</a></span></dt>
+<dt><span class="index"><a href="api-index-1-2-3.html">Index of new symbols in 1.2.3</a></span></dt>
+<dt><span class="index"><a href="api-index-1-1-3.html">Index of new symbols in 1.1.3</a></span></dt>
+<dt><span class="index"><a href="api-index-1-1-2.html">Index of new symbols in 1.1.2</a></span></dt>
+<dt><span class="index"><a href="api-index-1-0-5.html">Index of new symbols in 1.0.5</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-42.html">Index of new symbols in 0.9.42</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-41.html">Index of new symbols in 0.9.41</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-39.html">Index of new symbols in 0.9.39</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-38.html">Index of new symbols in 0.9.38</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-33.html">Index of new symbols in 0.9.33</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-31.html">Index of new symbols in 0.9.31</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-30.html">Index of new symbols in 0.9.30</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-28.html">Index of new symbols in 0.9.28</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-26.html">Index of new symbols in 0.9.26</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-22.html">Index of new symbols in 0.9.22</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-21.html">Index of new symbols in 0.9.21</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-20.html">Index of new symbols in 0.9.20</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-11.html">Index of new symbols in 0.9.11</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-10.html">Index of new symbols in 0.9.10</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-8.html">Index of new symbols in 0.9.8</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-7.html">Index of new symbols in 0.9.7</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-5.html">Index of new symbols in 0.9.5</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-2.html">Index of new symbols in 0.9.2</a></span></dt>
+<dt><span class="index"><a href="api-index-0-6-0.html">Index of new symbols in 0.6.0</a></span></dt>
 <dt><span class="glossary"><a href="annotation-glossary.html">Annotation Glossary</a></span></dt>
 </dl></dd>
 </dl></div>
+<div class="note">
+<p>
+      The current HarfBuzz codebase is versioned 2.x.x and is stable
+      and under active maintenance. This is what is used in latest
+      versions of Firefox, GNOME, ChromeOS, Chrome, LibreOffice,
+      XeTeX, Android, and KDE, among other places.
+    </p>
+<p>
+      Prior to 2012, the original HarfBuzz codebase (which, these days, is
+      referred to as <span class="emphasis"><em>harfbuzz-old</em></span>) was derived from code
+      in <a class="ulink" href="http://freetype.org/" target="_top">FreeType</a>,
+      <a class="ulink" href="http://pango.org/" target="_top">Pango</a>, and
+      <a class="ulink" href="http://qt-project.org/" target="_top">Qt</a>.
+      It is <span class="emphasis"><em>not</em></span> actively developed or  maintained, and is
+      extremely buggy. All users of harfbuzz-old are encouraged to switch over
+      to the new HarfBuzz as soon as possible.
+    </p>
+<p>
+      To make this distinction clearer in discussions, the current HarfBuzz
+      codebase is sometimes referred to as <span class="emphasis"><em>harfbuzz-ng</em></span>.
+    </p>
+<p>
+      For reference purposes, the harfbuzz-old source tree is archived
+      <a class="ulink" href="http://cgit.freedesktop.org/harfbuzz.old/" target="_top">here</a>.
+      There are no release tarballs of harfbuzz-old whatsoever.
+    </p>
+</div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index 659fea6..6af6ca4 100644 (file)
@@ -3,19 +3,19 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Installing HarfBuzz: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="pt01.html" title="Part I. User's manual">
+<link rel="up" href="user-manual.html" title="Part I. User's manual">
 <link rel="prev" href="why-is-it-called-harfbuzz.html" title="Why is it called HarfBuzz?">
 <link rel="next" href="building.html" title="Building HarfBuzz">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
 <td width="100%" align="left" class="shortcuts"></td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><a accesskey="u" href="pt01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="u" href="user-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
 <td><a accesskey="p" href="why-is-it-called-harfbuzz.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
 <td><a accesskey="n" href="building.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <p>
       Tarball releases and Win32 binary bundles (which include the
       libharfbuzz DLL, hb-view.exe, hb-shape.exe, and all
-      dependencies) of HarfBuzz can be downloaded from <a class="ulink" href="https://github.com/harfbuzz/harfbuzz" target="_top">github.com/harfbuzz/harfbuzz/releases</a>.
+      dependencies) of HarfBuzz can be downloaded from <a class="ulink" href="https://github.com/harfbuzz/harfbuzz/releases" target="_top">github.com/harfbuzz/harfbuzz/releases</a>.
     </p>
 <p>
       Release notes are posted with each new release to provide an
       overview of the changes. The project <a class="ulink" href="https://github.com/harfbuzz/harfbuzz/issues" target="_top">tracks bug
       reports and other issues</a> on GitHub. Discussion and
-      questions are welcome on the <a class="ulink" href="http://freedesktop.org/mailman/listinfo/harfbuzz/" target="_top">HarfBuzz
-      mailing list</a>.
+      questions are welcome on <a class="ulink" href="https://github.com/harfbuzz/harfbuzz/discussions" target="_top">GitHub</a> as well.
     </p>
 <p>
       The API included in the <code class="filename">hb.h</code> file will not change in a
@@ -60,6 +59,6 @@
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/html/integration-api.html b/docs/html/integration-api.html
new file mode 100644 (file)
index 0000000..fdb7b45
--- /dev/null
@@ -0,0 +1,55 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Integration API: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="harfbuzz-hb-aat-layout.html" title="hb-aat-layout">
+<link rel="next" href="harfbuzz-hb-coretext.html" title="hb-coretext">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="harfbuzz-hb-aat-layout.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="harfbuzz-hb-coretext.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="chapter">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="integration-api"></a>Integration API</h2></div></div></div>
+<div class="toc"><dl class="toc">
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-coretext.html">hb-coretext</a></span><span class="refpurpose"> — CoreText integration</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-ft.html">hb-ft</a></span><span class="refpurpose"> — FreeType integration</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-glib.html">hb-glib</a></span><span class="refpurpose"> — GLib integration</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-graphite2.html">hb-graphite2</a></span><span class="refpurpose"> — Graphite2 integration</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-icu.html">hb-icu</a></span><span class="refpurpose"> — ICU integration</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-uniscribe.html">hb-uniscribe</a></span><span class="refpurpose"> — Windows integration</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-gdi.html">hb-gdi</a></span><span class="refpurpose"> — GDI integration</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-directwrite.html">hb-directwrite</a></span><span class="refpurpose"> — DirectWrite integration</span>
+</dt>
+</dl></div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
index e687b34..a084a7c 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Core Text integration: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="integration.html" title="Platform Integration Guide">
 <link rel="prev" href="integration-uniscribe.html" title="Uniscribe integration">
 <link rel="next" href="integration-icu.html" title="ICU integration">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -52,7 +52,7 @@
       is slightly lower-level than Core Text, provides
       <a class="ulink" href="https://developer.apple.com/documentation/coregraphics/cgfontref" target="_top"><span class="type">CGFontRef</span></a>, which enables access to typeface
       properties, but does not include size information. Core Text's
-      <a class="ulink" href="https://developer.apple.com/documentation/coretext/ctfont-q6r" target="_top"><span class="type">CTFontRef</span></a> is analagous to a HarfBuzz font object,
+      <a class="ulink" href="https://developer.apple.com/documentation/coretext/ctfont-q6r" target="_top"><span class="type">CTFontRef</span></a> is analogous to a HarfBuzz font object,
       with all of the properties required to render text at a specific
       size and configuration.
       Consequently, a HarfBuzz <span class="type">hb_font_t</span> font object can
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index 5b6659a..c1070e9 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>FreeType integration: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="integration.html" title="Platform Integration Guide">
 <link rel="prev" href="integration.html" title="Platform Integration Guide">
 <link rel="next" href="integration-uniscribe.html" title="Uniscribe integration">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index 7dff0b0..9292567 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>ICU integration: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="integration.html" title="Platform Integration Guide">
 <link rel="prev" href="integration-coretext.html" title="Core Text integration">
 <link rel="next" href="integration-python.html" title="Python bindings">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -76,6 +76,6 @@
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index 911890f..1d13d30 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Python bindings: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="integration.html" title="Platform Integration Guide">
 <link rel="prev" href="integration-icu.html" title="ICU integration">
-<link rel="next" href="pt02.html" title="Part II. Reference manual">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<link rel="next" href="reference-manual.html" title="Part II. Reference manual">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -17,7 +17,7 @@
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
 <td><a accesskey="u" href="integration.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
 <td><a accesskey="p" href="integration-icu.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="pt02.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+<td><a accesskey="n" href="reference-manual.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <div class="section">
 <div class="titlepage"><div><div><h2 class="title" style="clear: both">
@@ -56,6 +56,6 @@
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index c6b9ec6..e95014f 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Uniscribe integration: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="integration.html" title="Platform Integration Guide">
 <link rel="prev" href="integration-freetype.html" title="FreeType integration">
 <link rel="next" href="integration-coretext.html" title="Core Text integration">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -57,7 +57,7 @@
       <span class="structname">hb_glyph_position_t</span> structures. 
     </p>
 <p>
-      Your client program only needs to ensure that it coverts
+      Your client program only needs to ensure that it converts
       correctly between HarfBuzz's low-level data types (such as
       <span class="type">hb_position_t</span>) and Windows's corresponding types
       (such as <span class="type">GOFFSET</span> and <span class="type">ABC</span>). Be sure you
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index c3d3c63..8493b91 100644 (file)
@@ -3,20 +3,20 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Platform Integration Guide: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="pt01.html" title="Part I. User's manual">
-<link rel="prev" href="utilities-ucdn.html" title="UCDN">
+<link rel="up" href="user-manual.html" title="Part I. User's manual">
+<link rel="prev" href="utilities-common-types-apis.html" title="Common data types and APIs">
 <link rel="next" href="integration-freetype.html" title="FreeType integration">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
 <td width="100%" align="left" class="shortcuts"></td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><a accesskey="u" href="pt01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
-<td><a accesskey="p" href="utilities-ucdn.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="user-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="utilities-common-types-apis.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
 <td><a accesskey="n" href="integration-freetype.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <div class="chapter">
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index 3269393..903790a 100644 (file)
Binary files a/docs/html/left-insensitive.png and b/docs/html/left-insensitive.png differ
index 2abde03..21b31e3 100644 (file)
Binary files a/docs/html/left.png and b/docs/html/left.png differ
index 5914ec8..9589fad 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Level 2: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="clusters.html" title="Clusters">
 <link rel="prev" href="the-distinction-between-levels-0-and-1.html" title="The distinction between levels 0 and 1">
 <link rel="next" href="utilities.html" title="Utilities">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index f93a4a4..5c91a5f 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Blobs: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="object-model.html" title="The HarfBuzz object model">
 <link rel="prev" href="object-model-user-data.html" title="User data">
 <link rel="next" href="buffers-language-script-and-direction.html" title="Buffers, language, script and direction">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
       different.
     </p>
 <p>
-      Blobs are an abstraction desgined to negotiate lifecycle and
+      Blobs are an abstraction designed to negotiate lifecycle and
       permissions for raw pieces of data.  For example, when you load
       the raw font data into memory and want to pass it to HarfBuzz,
       you do so in a <code class="literal">hb_blob_t</code> wrapper.
     </p>
 <p>
-      This allows you to take advantage of HarffBuzz's
+      This allows you to take advantage of HarfBuzz's
       reference-counting and <code class="function">destroy</code>
-      callbacks. If you allocated the memory for the data using 
+      callbacks. If you allocated the memory for the data using
       <code class="function">malloc()</code>, you would create the blob using
     </p>
 <pre class="programlisting">
       allocated memory whenever the blob drops its last reference and
       is deconstructed.  Consequently, the user code can stop worrying
       about freeing memory and let the reference-counting machinery
-      take care of that. 
+      take care of that.
+    </p>
+<p>
+      Most of the time, blobs are read-only, facilitating their use in
+      immutable objects.
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index 342f890..1e60692 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Object lifecycle management: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="object-model.html" title="The HarfBuzz object model">
 <link rel="prev" href="object-model-object-types.html" title="Objects in HarfBuzz">
 <link rel="next" href="object-model-user-data.html" title="User data">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -36,7 +36,7 @@
       <code class="literal">1</code>. Client programs can increase the reference
       count on an object by calling its
       <code class="function">reference()</code> method. Whenever a client
-      program is finished with an object, it should call its 
+      program is finished with an object, it should call its
       corresponding <code class="function">destroy()</code> method. The destroy
       method will decrease the reference count on the object and,
       whenever the reference count reaches zero, it will also destroy
@@ -46,8 +46,8 @@
       All of HarfBuzz's object-lifecycle-management APIs are
       thread-safe (unless you compiled HarfBuzz from source with the
       <code class="literal">HB_NO_MT</code> configuration flag), even when the
-      object as a whole is not thread-safe. 
-      It is also permissible to <code class="function">reference()</code> or to 
+      object as a whole is not thread-safe.
+      It is also permissible to <code class="function">reference()</code> or to
       <code class="function">destroy()</code> the <code class="literal">NULL</code>
       value.
     </p>
@@ -65,7 +65,7 @@
       as immutable and <code class="function">is_immutable()</code> methods to
       test whether or not an object is immutable. Attempts to use
       setter functions on immutable objects will fail silently; see the API
-      Reference manual for specifics. 
+      Reference manual for specifics.
     </p>
 <p>
       Note also that there are no "make mutable" methods. If client
@@ -92,6 +92,6 @@
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index 5b53ff6..e69f9db 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Objects in HarfBuzz: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="object-model.html" title="The HarfBuzz object model">
 <link rel="prev" href="object-model.html" title="The HarfBuzz object model">
 <link rel="next" href="object-model-lifecycle.html" title="Object lifecycle management">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -40,7 +40,7 @@
       the <code class="literal">hb_buffer_t</code> object has
       <code class="function">hb_buffer_create()</code> as its constructor,
       <code class="function">hb_buffer_reference()</code> to reference, and
-      <code class="function">hb_buffer_destroy()</code> to dereference. 
+      <code class="function">hb_buffer_destroy()</code> to dereference.
     </p>
 <p>
       After construction, each object's properties are accessible only
       Reference manual.
     </p>
 <p>
+      Note that many object types can be marked as read-only or immutable,
+      facilitating their use in multi-threaded environments.
+    </p>
+<p>
       Key object types provided by HarfBuzz include:
     </p>
 <div class="itemizedlist"><ul class="itemizedlist compact" style="list-style-type: disc; ">
@@ -79,6 +83,6 @@
 </ul></div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index bee5d07..fbb717e 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>User data: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="object-model.html" title="The HarfBuzz object model">
 <link rel="prev" href="object-model-lifecycle.html" title="Object lifecycle management">
 <link rel="next" href="object-model-blobs.html" title="Blobs">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -27,7 +27,7 @@
       offer a "user data" mechanism that can be used to attach
       arbitrary data to the object.  User-data attachment can be
       useful for tying the lifecycles of various pieces of data
-      together, or for creating language bindings. 
+      together, or for creating language bindings.
     </p>
 <p>
       Each object type has a <code class="function">set_user_data()</code>
@@ -54,6 +54,6 @@
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index 4338e7d..469f93b 100644 (file)
@@ -3,19 +3,19 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>The HarfBuzz object model: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="pt01.html" title="Part I. User's manual">
+<link rel="up" href="user-manual.html" title="Part I. User's manual">
 <link rel="prev" href="aat-shaping.html" title="AAT shaping">
 <link rel="next" href="object-model-object-types.html" title="Objects in HarfBuzz">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
 <td width="100%" align="left" class="shortcuts"></td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><a accesskey="u" href="pt01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="u" href="user-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
 <td><a accesskey="p" href="aat-shaping.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
 <td><a accesskey="n" href="object-model-object-types.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
@@ -36,7 +36,7 @@
       HarfBuzz features two kinds of data types: non-opaque,
       pass-by-value types and opaque, heap-allocated types.  This kind
       of separation is common in C libraries that have to provide
-      API/ABI compatibility (almost) indefinitely. 
+      API/ABI compatibility (almost) indefinitely.
     </p>
 <p>
       <span class="emphasis"><em>Value types:</em></span> The non-opaque, pass-by-value
@@ -56,8 +56,8 @@
       possible future members.  As such, it’s important to provide
       <code class="function">equal()</code>, and <code class="function">hash()</code>
       methods for such structs, allowing users of the API do
-      effectively deal with the type without having to 
-      adapt their code to future changes. 
+      effectively deal with the type without having to
+      adapt their code to future changes.
     </p>
 <p>
       Important value types provided by HarfBuzz include the structs
@@ -68,6 +68,6 @@
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/html/opentype-api.html b/docs/html/opentype-api.html
new file mode 100644 (file)
index 0000000..32dbb5d
--- /dev/null
@@ -0,0 +1,58 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>OpenType API: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="harfbuzz-hb-version.html" title="hb-version">
+<link rel="next" href="harfbuzz-hb-ot-color.html" title="hb-ot-color">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="harfbuzz-hb-version.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="harfbuzz-hb-ot-color.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="chapter">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="opentype-api"></a>OpenType API</h2></div></div></div>
+<div class="toc"><dl class="toc">
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-ot-color.html">hb-ot-color</a></span><span class="refpurpose"> — OpenType Color Fonts</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-ot-font.html">hb-ot-font</a></span><span class="refpurpose"> — OpenType font implementation</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-ot-layout.html">hb-ot-layout</a></span><span class="refpurpose"> — OpenType Layout</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-ot-math.html">hb-ot-math</a></span><span class="refpurpose"> — OpenType Math information</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-ot-meta.html">hb-ot-meta</a></span><span class="refpurpose"> — OpenType Metadata</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-ot-metrics.html">hb-ot-metrics</a></span><span class="refpurpose"> — OpenType Metrics</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-ot-name.html">hb-ot-name</a></span><span class="refpurpose"> — OpenType font name information</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-ot-shape.html">hb-ot-shape</a></span><span class="refpurpose"> — OpenType shaping support</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-ot-var.html">hb-ot-var</a></span><span class="refpurpose"> — OpenType Font Variations</span>
+</dt>
+</dl></div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
index bddb4f5..8fd85a7 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>OpenType shaping models: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="shaping-concepts.html" title="Shaping concepts">
 <link rel="prev" href="text-runs.html" title="Text runs">
 <link rel="next" href="graphite-shaping.html" title="Graphite shaping">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -95,6 +95,6 @@
 </ul></div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/html/pt01.html b/docs/html/pt01.html
deleted file mode 100644 (file)
index 74097ff..0000000
+++ /dev/null
@@ -1,133 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Part I. User's manual: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
-<link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="index.html" title="HarfBuzz Manual">
-<link rel="prev" href="index.html" title="HarfBuzz Manual">
-<link rel="next" href="what-is-harfbuzz.html" title="What is HarfBuzz?">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
-<link rel="stylesheet" href="style.css" type="text/css">
-</head>
-<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
-<td width="100%" align="left" class="shortcuts"></td>
-<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><img src="up-insensitive.png" width="16" height="16" border="0"></td>
-<td><a accesskey="p" href="index.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="what-is-harfbuzz.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
-</tr></table>
-<div class="part">
-<div class="titlepage"><div><div><h1 class="title">
-<a name="id-1.2"></a>Part I. User's manual</h1></div></div></div>
-<div class="toc">
-<p><b>Table of Contents</b></p>
-<dl class="toc">
-<dt><span class="chapter"><a href="what-is-harfbuzz.html">What is HarfBuzz?</a></span></dt>
-<dd><dl>
-<dt><span class="section"><a href="what-is-harfbuzz.html#what-is-text-shaping">What is text shaping?</a></span></dt>
-<dt><span class="section"><a href="why-do-i-need-a-shaping-engine.html">Why do I need a shaping engine?</a></span></dt>
-<dt><span class="section"><a href="ch01s03.html">What does HarfBuzz do?</a></span></dt>
-<dt><span class="section"><a href="what-harfbuzz-doesnt-do.html">What HarfBuzz doesn't do</a></span></dt>
-<dt><span class="section"><a href="why-is-it-called-harfbuzz.html">Why is it called HarfBuzz?</a></span></dt>
-</dl></dd>
-<dt><span class="chapter"><a href="install-harfbuzz.html">Installing HarfBuzz</a></span></dt>
-<dd><dl>
-<dt><span class="section"><a href="install-harfbuzz.html#download">Downloading HarfBuzz</a></span></dt>
-<dt><span class="section"><a href="building.html">Building HarfBuzz</a></span></dt>
-<dd><dl>
-<dt><span class="section"><a href="building.html#building.linux">Building on Linux</a></span></dt>
-<dt><span class="section"><a href="building.html#building.windows">Building on Windows</a></span></dt>
-<dt><span class="section"><a href="building.html#building.macos">Building on macOS</a></span></dt>
-<dt><span class="section"><a href="building.html#configuration">Configuration options</a></span></dt>
-</dl></dd>
-</dl></dd>
-<dt><span class="chapter"><a href="getting-started.html">Getting started with HarfBuzz</a></span></dt>
-<dd><dl>
-<dt><span class="section"><a href="getting-started.html#id-1.2.4.2">An overview of the HarfBuzz shaping API</a></span></dt>
-<dt><span class="section"><a href="ch03s02.html">Terminology</a></span></dt>
-<dt><span class="section"><a href="ch03s03.html">A simple shaping example</a></span></dt>
-</dl></dd>
-<dt><span class="chapter"><a href="shaping-concepts.html">Shaping concepts</a></span></dt>
-<dd><dl>
-<dt><span class="section"><a href="shaping-concepts.html#text-shaping-concepts">Text shaping</a></span></dt>
-<dt><span class="section"><a href="complex-scripts.html">Complex scripts</a></span></dt>
-<dt><span class="section"><a href="shaping-operations.html">Shaping operations</a></span></dt>
-<dt><span class="section"><a href="unicode-character-categories.html">Unicode character categories</a></span></dt>
-<dt><span class="section"><a href="text-runs.html">Text runs</a></span></dt>
-<dt><span class="section"><a href="opentype-shaping-models.html">OpenType shaping models</a></span></dt>
-<dt><span class="section"><a href="graphite-shaping.html">Graphite shaping</a></span></dt>
-<dt><span class="section"><a href="aat-shaping.html">AAT shaping</a></span></dt>
-</dl></dd>
-<dt><span class="chapter"><a href="object-model.html">The HarfBuzz object model</a></span></dt>
-<dd><dl>
-<dt><span class="section"><a href="object-model.html#object-model-intro">An overview of data types in HarfBuzz</a></span></dt>
-<dt><span class="section"><a href="object-model-object-types.html">Objects in HarfBuzz</a></span></dt>
-<dt><span class="section"><a href="object-model-lifecycle.html">Object lifecycle management</a></span></dt>
-<dt><span class="section"><a href="object-model-user-data.html">User data</a></span></dt>
-<dt><span class="section"><a href="object-model-blobs.html">Blobs</a></span></dt>
-</dl></dd>
-<dt><span class="chapter"><a href="buffers-language-script-and-direction.html">Buffers, language, script and direction</a></span></dt>
-<dd><dl>
-<dt><span class="section"><a href="buffers-language-script-and-direction.html#creating-and-destroying-buffers">Creating and destroying buffers</a></span></dt>
-<dt><span class="section"><a href="adding-text-to-the-buffer.html">Adding text to the buffer</a></span></dt>
-<dt><span class="section"><a href="setting-buffer-properties.html">Setting buffer properties</a></span></dt>
-<dt><span class="section"><a href="customizing-unicode-functions.html">Customizing Unicode functions</a></span></dt>
-</dl></dd>
-<dt><span class="chapter"><a href="fonts-and-faces.html">Fonts, faces, and output</a></span></dt>
-<dd><dl>
-<dt><span class="section"><a href="fonts-and-faces.html#fonts-and-faces-objects">Font and face objects</a></span></dt>
-<dt><span class="section"><a href="fonts-and-faces-custom-functions.html">Customizing font functions</a></span></dt>
-<dt><span class="section"><a href="fonts-and-faces-native-opentype.html">Font objects and HarfBuzz's native OpenType implementation</a></span></dt>
-<dt><span class="section"><a href="fonts-and-faces-variable.html">Working with OpenType Variable Fonts</a></span></dt>
-</dl></dd>
-<dt><span class="chapter"><a href="shaping-and-shape-plans.html">Shaping and shape plans</a></span></dt>
-<dd><dl>
-<dt><span class="section"><a href="shaping-and-shape-plans.html#shaping-buffer-output">Shaping and buffer output</a></span></dt>
-<dt><span class="section"><a href="shaping-opentype-features.html">OpenType features</a></span></dt>
-<dt><span class="section"><a href="shaping-shaper-selection.html">Shaper selection</a></span></dt>
-<dt><span class="section"><a href="shaping-plans-and-caching.html">Plans and caching</a></span></dt>
-</dl></dd>
-<dt><span class="chapter"><a href="clusters.html">Clusters</a></span></dt>
-<dd><dl>
-<dt><span class="section"><a href="clusters.html#clusters-and-shaping">Clusters and shaping</a></span></dt>
-<dt><span class="section"><a href="working-with-harfbuzz-clusters.html">Working with HarfBuzz clusters</a></span></dt>
-<dt><span class="section"><a href="a-clustering-example-for-levels-0-and-1.html">A clustering example for levels 0 and 1</a></span></dt>
-<dt><span class="section"><a href="reordering-in-levels-0-and-1.html">Reordering in levels 0 and 1</a></span></dt>
-<dt><span class="section"><a href="the-distinction-between-levels-0-and-1.html">The distinction between levels 0 and 1</a></span></dt>
-<dt><span class="section"><a href="level-2.html">Level 2</a></span></dt>
-<dd><dl>
-<dt><span class="section"><a href="level-2.html#ligatures-with-combining-marks-in-level-2">Ligatures with combining marks in level 2</a></span></dt>
-<dt><span class="section"><a href="level-2.html#reordering-in-level-2">Reordering in level 2</a></span></dt>
-<dt><span class="section"><a href="level-2.html#other-considerations-in-level-2">Other considerations in level 2</a></span></dt>
-</dl></dd>
-</dl></dd>
-<dt><span class="chapter"><a href="utilities.html">Utilities</a></span></dt>
-<dd><dl>
-<dt><span class="section"><a href="utilities.html#utilities-command-line-tools">Command-line tools</a></span></dt>
-<dd><dl>
-<dt><span class="section"><a href="utilities.html#utilities-command-line-hbshape">hb-shape</a></span></dt>
-<dt><span class="section"><a href="utilities.html#utilities-command-line-hbview">hb-view</a></span></dt>
-<dt><span class="section"><a href="utilities.html#utilities-command-line-hbsubset">hb-subset</a></span></dt>
-</dl></dd>
-<dt><span class="section"><a href="utilities-common-types-apis.html">Common data types and APIs</a></span></dt>
-<dt><span class="section"><a href="utilities-ucdn.html">UCDN</a></span></dt>
-</dl></dd>
-<dt><span class="chapter"><a href="integration.html">Platform Integration Guide</a></span></dt>
-<dd><dl>
-<dt><span class="section"><a href="integration.html#integration-glib">GNOME integration, GLib, and GObject</a></span></dt>
-<dt><span class="section"><a href="integration-freetype.html">FreeType integration</a></span></dt>
-<dt><span class="section"><a href="integration-uniscribe.html">Uniscribe integration</a></span></dt>
-<dt><span class="section"><a href="integration-coretext.html">Core Text integration</a></span></dt>
-<dt><span class="section"><a href="integration-icu.html">ICU integration</a></span></dt>
-<dt><span class="section"><a href="integration-python.html">Python bindings</a></span></dt>
-</dl></dd>
-</dl>
-</div>
-</div>
-<div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
-</body>
-</html>
\ No newline at end of file
diff --git a/docs/html/pt02.html b/docs/html/pt02.html
deleted file mode 100644 (file)
index a3d753e..0000000
+++ /dev/null
@@ -1,161 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Part II. Reference manual: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
-<link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="index.html" title="HarfBuzz Manual">
-<link rel="prev" href="integration-python.html" title="Python bindings">
-<link rel="next" href="ch12.html" title="Core API">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
-<link rel="stylesheet" href="style.css" type="text/css">
-</head>
-<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
-<td width="100%" align="left" class="shortcuts"></td>
-<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><img src="up-insensitive.png" width="16" height="16" border="0"></td>
-<td><a accesskey="p" href="integration-python.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="ch12.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
-</tr></table>
-<div class="part">
-<div class="titlepage"><div>
-<div><h1 class="title">
-<a name="id-1.3"></a>Part II. Reference manual</h1></div>
-<div><p class="releaseinfo">
-        This document is for HarfBuzz 2.6.7
-.
-        
-      </p></div>
-</div></div>
-<div class="toc">
-<p><b>Table of Contents</b></p>
-<dl class="toc">
-<dt><span class="chapter"><a href="ch12.html">Core API</a></span></dt>
-<dd><dl>
-<dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-blob.html">hb-blob</a></span><span class="refpurpose"> — Binary data containers</span>
-</dt>
-<dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-buffer.html">hb-buffer</a></span><span class="refpurpose"> — Input and output buffers</span>
-</dt>
-<dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-common.html">hb-common</a></span><span class="refpurpose"> — Common data types</span>
-</dt>
-<dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-deprecated.html">hb-deprecated</a></span><span class="refpurpose"> — Deprecated API</span>
-</dt>
-<dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-face.html">hb-face</a></span><span class="refpurpose"> — Font face objects</span>
-</dt>
-<dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-font.html">hb-font</a></span><span class="refpurpose"> — Font objects</span>
-</dt>
-<dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-map.html">hb-map</a></span><span class="refpurpose"> — Object representing integer to integer mapping</span>
-</dt>
-<dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-set.html">hb-set</a></span><span class="refpurpose"> — Object representing a set of integers</span>
-</dt>
-<dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-shape-plan.html">hb-shape-plan</a></span><span class="refpurpose"> — Object representing a shaping plan</span>
-</dt>
-<dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-shape.html">hb-shape</a></span><span class="refpurpose"> — Conversion of text strings into positioned glyphs</span>
-</dt>
-<dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-unicode.html">hb-unicode</a></span><span class="refpurpose"> — Unicode character property access</span>
-</dt>
-<dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-version.html">hb-version</a></span><span class="refpurpose"> — Information about the version of HarfBuzz in use</span>
-</dt>
-</dl></dd>
-<dt><span class="chapter"><a href="ch13.html">OpenType API</a></span></dt>
-<dd><dl>
-<dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-ot-color.html">hb-ot-color</a></span><span class="refpurpose"> — OpenType Color Fonts</span>
-</dt>
-<dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-ot-font.html">hb-ot-font</a></span><span class="refpurpose"> — OpenType font implementation</span>
-</dt>
-<dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-ot-layout.html">hb-ot-layout</a></span><span class="refpurpose"> — OpenType Layout</span>
-</dt>
-<dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-ot-math.html">hb-ot-math</a></span><span class="refpurpose"> — OpenType Math information</span>
-</dt>
-<dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-ot-name.html">hb-ot-name</a></span><span class="refpurpose"> — OpenType font name information</span>
-</dt>
-<dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-ot-shape.html">hb-ot-shape</a></span><span class="refpurpose"> — OpenType shaping support</span>
-</dt>
-<dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-ot-var.html">hb-ot-var</a></span><span class="refpurpose"> — OpenType Font Variations</span>
-</dt>
-</dl></dd>
-<dt><span class="chapter"><a href="ch14.html">Apple Advanced Typography API</a></span></dt>
-<dd><dl><dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-aat-layout.html">hb-aat-layout</a></span><span class="refpurpose"> — Apple Advanced Typography Layout</span>
-</dt></dl></dd>
-<dt><span class="chapter"><a href="ch15.html">Integration API</a></span></dt>
-<dd><dl>
-<dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-coretext.html">hb-coretext</a></span><span class="refpurpose"> — CoreText integration</span>
-</dt>
-<dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-ft.html">hb-ft</a></span><span class="refpurpose"> — FreeType integration</span>
-</dt>
-<dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-glib.html">hb-glib</a></span><span class="refpurpose"> — GLib integration</span>
-</dt>
-<dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-gobject.html">hb-gobject</a></span><span class="refpurpose"> — GObject integration support</span>
-</dt>
-<dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-graphite2.html">hb-graphite2</a></span><span class="refpurpose"> — Graphite2 integration</span>
-</dt>
-<dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-icu.html">hb-icu</a></span><span class="refpurpose"> — ICU integration</span>
-</dt>
-<dt>
-<span class="refentrytitle"><a href="harfbuzz-hb-uniscribe.html">hb-uniscribe</a></span><span class="refpurpose"> — Windows integration</span>
-</dt>
-</dl></dd>
-<dt><span class="index"><a href="api-index-full.html">API Index</a></span></dt>
-<dt><span class="glossary"><a href="annotation-glossary.html">Annotation Glossary</a></span></dt>
-</dl>
-</div>
-<div class="note">
-<p>
-        The current HarfBuzz codebase is versioned 2.x.x and is stable
-       and under active maintenance. This is what is used in latest
-       versions of Firefox, GNOME, ChromeOS, Chrome, LibreOffice,
-       XeTeX, Android, and KDE, among other places. 
-      </p>
-<p>
-        Prior to 2012, the original HarfBuzz codebase (which, these
-       days, is referred to as <span class="emphasis"><em>harfbuzz-old</em></span>) was 
-        derived from code in <a class="ulink" href="http://freetype.org/" target="_top">FreeType</a>, <a class="ulink" href="http://pango.org/" target="_top">Pango</a>, and 
-        <a class="ulink" href="http://qt-project.org/" target="_top">Qt</a>.
-        It is <span class="emphasis"><em>not</em></span> actively developed or
-       maintained, and is extremely buggy. All users of harfbuzz-old
-       are encouraged to switch over to the new HarfBuzz as soon as possible.
-      </p>
-<p>
-       To make this distinction clearer in discussions, the current
-       HarfBuzz codebase is sometimes referred to as
-       <span class="emphasis"><em>harfbuzz-ng</em></span>.
-      </p>
-<p>
-       For reference purposes, the harfbuzz-old source tree is archived 
-        <a class="ulink" href="http://cgit.freedesktop.org/harfbuzz.old/" target="_top">here</a>. There
-       are no release tarballs of harfbuzz-old whatsoever.
-      </p>
-</div>
-</div>
-<div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
-</body>
-</html>
\ No newline at end of file
diff --git a/docs/html/reference-manual.html b/docs/html/reference-manual.html
new file mode 100644 (file)
index 0000000..e9f73da
--- /dev/null
@@ -0,0 +1,207 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Part II. Reference manual: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="index.html" title="HarfBuzz Manual">
+<link rel="prev" href="integration-python.html" title="Python bindings">
+<link rel="next" href="core-api.html" title="Core API">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><img src="up-insensitive.png" width="16" height="16" border="0"></td>
+<td><a accesskey="p" href="integration-python.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="core-api.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="part">
+<div class="titlepage"><div>
+<div><h1 class="title">
+<a name="reference-manual"></a>Part II. Reference manual</h1></div>
+<div><p class="releaseinfo">
+        This document is for HarfBuzz 3.4.0
+.
+        
+      </p></div>
+</div></div>
+<div class="toc">
+<p><b>Table of Contents</b></p>
+<dl class="toc">
+<dt><span class="chapter"><a href="core-api.html">Core API</a></span></dt>
+<dd><dl>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-blob.html">hb-blob</a></span><span class="refpurpose"> — Binary data containers</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-buffer.html">hb-buffer</a></span><span class="refpurpose"> — Input and output buffers</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-common.html">hb-common</a></span><span class="refpurpose"> — Common data types</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-deprecated.html">hb-deprecated</a></span><span class="refpurpose"> — Deprecated API</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-face.html">hb-face</a></span><span class="refpurpose"> — Font face objects</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-font.html">hb-font</a></span><span class="refpurpose"> — Font objects</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-map.html">hb-map</a></span><span class="refpurpose"> — Object representing integer to integer mapping</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-set.html">hb-set</a></span><span class="refpurpose"> — Objects representing a set of integers</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-shape-plan.html">hb-shape-plan</a></span><span class="refpurpose"> — Object representing a shaping plan</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-shape.html">hb-shape</a></span><span class="refpurpose"> — Conversion of text strings into positioned glyphs</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-unicode.html">hb-unicode</a></span><span class="refpurpose"> — Unicode character property access</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-version.html">hb-version</a></span><span class="refpurpose"> — Information about the version of HarfBuzz in use</span>
+</dt>
+</dl></dd>
+<dt><span class="chapter"><a href="opentype-api.html">OpenType API</a></span></dt>
+<dd><dl>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-ot-color.html">hb-ot-color</a></span><span class="refpurpose"> — OpenType Color Fonts</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-ot-font.html">hb-ot-font</a></span><span class="refpurpose"> — OpenType font implementation</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-ot-layout.html">hb-ot-layout</a></span><span class="refpurpose"> — OpenType Layout</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-ot-math.html">hb-ot-math</a></span><span class="refpurpose"> — OpenType Math information</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-ot-meta.html">hb-ot-meta</a></span><span class="refpurpose"> — OpenType Metadata</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-ot-metrics.html">hb-ot-metrics</a></span><span class="refpurpose"> — OpenType Metrics</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-ot-name.html">hb-ot-name</a></span><span class="refpurpose"> — OpenType font name information</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-ot-shape.html">hb-ot-shape</a></span><span class="refpurpose"> — OpenType shaping support</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-ot-var.html">hb-ot-var</a></span><span class="refpurpose"> — OpenType Font Variations</span>
+</dt>
+</dl></dd>
+<dt><span class="chapter"><a href="apple-advanced-typography-api.html">Apple Advanced Typography API</a></span></dt>
+<dd><dl><dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-aat-layout.html">hb-aat-layout</a></span><span class="refpurpose"> — Apple Advanced Typography Layout</span>
+</dt></dl></dd>
+<dt><span class="chapter"><a href="integration-api.html">Integration API</a></span></dt>
+<dd><dl>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-coretext.html">hb-coretext</a></span><span class="refpurpose"> — CoreText integration</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-ft.html">hb-ft</a></span><span class="refpurpose"> — FreeType integration</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-glib.html">hb-glib</a></span><span class="refpurpose"> — GLib integration</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-graphite2.html">hb-graphite2</a></span><span class="refpurpose"> — Graphite2 integration</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-icu.html">hb-icu</a></span><span class="refpurpose"> — ICU integration</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-uniscribe.html">hb-uniscribe</a></span><span class="refpurpose"> — Windows integration</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-gdi.html">hb-gdi</a></span><span class="refpurpose"> — GDI integration</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-directwrite.html">hb-directwrite</a></span><span class="refpurpose"> — DirectWrite integration</span>
+</dt>
+</dl></dd>
+<dt><span class="chapter"><a href="style-api.html">Style API</a></span></dt>
+<dd><dl><dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-style.html">hb-style</a></span><span class="refpurpose"> — Font Styles</span>
+</dt></dl></dd>
+<dt><span class="chapter"><a href="subset-api.html">Subset API</a></span></dt>
+<dd><dl><dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-subset.html">hb-subset</a></span><span class="refpurpose"> — Subsets font files.</span>
+</dt></dl></dd>
+<dt><span class="index"><a href="api-index-full.html">API Index</a></span></dt>
+<dt><span class="index"><a href="deprecated-api-index.html">Index of deprecated API</a></span></dt>
+<dt><span class="index"><a href="api-index-3-4-0.html">Index of new symbols in 3.4.0</a></span></dt>
+<dt><span class="index"><a href="api-index-3-3-0.html">Index of new symbols in 3.3.0</a></span></dt>
+<dt><span class="index"><a href="api-index-3-1-0.html">Index of new symbols in 3.1.0</a></span></dt>
+<dt><span class="index"><a href="api-index-3-0-0.html">Index of new symbols in 3.0.0</a></span></dt>
+<dt><span class="index"><a href="api-index-2-9-1.html">Index of new symbols in 2.9.1</a></span></dt>
+<dt><span class="index"><a href="api-index-2-9-0.html">Index of new symbols in 2.9.0</a></span></dt>
+<dt><span class="index"><a href="api-index-2-8-2.html">Index of new symbols in 2.8.2</a></span></dt>
+<dt><span class="index"><a href="api-index-2-7-3.html">Index of new symbols in 2.7.3</a></span></dt>
+<dt><span class="index"><a href="api-index-2-6-8.html">Index of new symbols in 2.6.8</a></span></dt>
+<dt><span class="index"><a href="api-index-2-6-5.html">Index of new symbols in 2.6.5</a></span></dt>
+<dt><span class="index"><a href="api-index-2-6-3.html">Index of new symbols in 2.6.3</a></span></dt>
+<dt><span class="index"><a href="api-index-2-6-0.html">Index of new symbols in 2.6.0</a></span></dt>
+<dt><span class="index"><a href="api-index-2-5-0.html">Index of new symbols in 2.5.0</a></span></dt>
+<dt><span class="index"><a href="api-index-2-4-0.html">Index of new symbols in 2.4.0</a></span></dt>
+<dt><span class="index"><a href="api-index-2-3-0.html">Index of new symbols in 2.3.0</a></span></dt>
+<dt><span class="index"><a href="api-index-2-2-0.html">Index of new symbols in 2.2.0</a></span></dt>
+<dt><span class="index"><a href="api-index-2-1-0.html">Index of new symbols in 2.1.0</a></span></dt>
+<dt><span class="index"><a href="api-index-2-0-0.html">Index of new symbols in 2.0.0</a></span></dt>
+<dt><span class="index"><a href="api-index-1-9-0.html">Index of new symbols in 1.9.0</a></span></dt>
+<dt><span class="index"><a href="api-index-1-8-6.html">Index of new symbols in 1.8.6</a></span></dt>
+<dt><span class="index"><a href="api-index-1-8-5.html">Index of new symbols in 1.8.5</a></span></dt>
+<dt><span class="index"><a href="api-index-1-8-1.html">Index of new symbols in 1.8.1</a></span></dt>
+<dt><span class="index"><a href="api-index-1-8-0.html">Index of new symbols in 1.8.0</a></span></dt>
+<dt><span class="index"><a href="api-index-1-7-7.html">Index of new symbols in 1.7.7</a></span></dt>
+<dt><span class="index"><a href="api-index-1-7-5.html">Index of new symbols in 1.7.5</a></span></dt>
+<dt><span class="index"><a href="api-index-1-7-2.html">Index of new symbols in 1.7.2</a></span></dt>
+<dt><span class="index"><a href="api-index-1-6-0.html">Index of new symbols in 1.6.0</a></span></dt>
+<dt><span class="index"><a href="api-index-1-5-0.html">Index of new symbols in 1.5.0</a></span></dt>
+<dt><span class="index"><a href="api-index-1-4-3.html">Index of new symbols in 1.4.3</a></span></dt>
+<dt><span class="index"><a href="api-index-1-4-2.html">Index of new symbols in 1.4.2</a></span></dt>
+<dt><span class="index"><a href="api-index-1-4-0.html">Index of new symbols in 1.4.0</a></span></dt>
+<dt><span class="index"><a href="api-index-1-3-3.html">Index of new symbols in 1.3.3</a></span></dt>
+<dt><span class="index"><a href="api-index-1-2-3.html">Index of new symbols in 1.2.3</a></span></dt>
+<dt><span class="index"><a href="api-index-1-1-3.html">Index of new symbols in 1.1.3</a></span></dt>
+<dt><span class="index"><a href="api-index-1-1-2.html">Index of new symbols in 1.1.2</a></span></dt>
+<dt><span class="index"><a href="api-index-1-0-5.html">Index of new symbols in 1.0.5</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-42.html">Index of new symbols in 0.9.42</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-41.html">Index of new symbols in 0.9.41</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-39.html">Index of new symbols in 0.9.39</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-38.html">Index of new symbols in 0.9.38</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-33.html">Index of new symbols in 0.9.33</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-31.html">Index of new symbols in 0.9.31</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-30.html">Index of new symbols in 0.9.30</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-28.html">Index of new symbols in 0.9.28</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-26.html">Index of new symbols in 0.9.26</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-22.html">Index of new symbols in 0.9.22</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-21.html">Index of new symbols in 0.9.21</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-20.html">Index of new symbols in 0.9.20</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-11.html">Index of new symbols in 0.9.11</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-10.html">Index of new symbols in 0.9.10</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-8.html">Index of new symbols in 0.9.8</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-7.html">Index of new symbols in 0.9.7</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-5.html">Index of new symbols in 0.9.5</a></span></dt>
+<dt><span class="index"><a href="api-index-0-9-2.html">Index of new symbols in 0.9.2</a></span></dt>
+<dt><span class="index"><a href="api-index-0-6-0.html">Index of new symbols in 0.6.0</a></span></dt>
+<dt><span class="glossary"><a href="annotation-glossary.html">Annotation Glossary</a></span></dt>
+</dl>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
index b1b2085..a051767 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Reordering in levels 0 and 1: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="clusters.html" title="Clusters">
 <link rel="prev" href="a-clustering-example-for-levels-0-and-1.html" title="A clustering example for levels 0 and 1">
 <link rel="next" href="the-distinction-between-levels-0-and-1.html" title="The distinction between levels 0 and 1">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -59,6 +59,6 @@
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index 4c95785..a3696bf 100644 (file)
Binary files a/docs/html/right-insensitive.png and b/docs/html/right-insensitive.png differ
index 76260ec..73d25da 100644 (file)
Binary files a/docs/html/right.png and b/docs/html/right.png differ
index 70bfa62..7ce728d 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Setting buffer properties: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="buffers-language-script-and-direction.html" title="Buffers, language, script and direction">
 <link rel="prev" href="adding-text-to-the-buffer.html" title="Adding text to the buffer">
 <link rel="next" href="customizing-unicode-functions.html" title="Customizing Unicode functions">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index 1139293..3e19db5 100644 (file)
@@ -3,19 +3,19 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Shaping and shape plans: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="pt01.html" title="Part I. User's manual">
+<link rel="up" href="user-manual.html" title="Part I. User's manual">
 <link rel="prev" href="fonts-and-faces-variable.html" title="Working with OpenType Variable Fonts">
 <link rel="next" href="shaping-opentype-features.html" title="OpenType features">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
 <td width="100%" align="left" class="shortcuts"></td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><a accesskey="u" href="pt01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="u" href="user-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
 <td><a accesskey="p" href="fonts-and-faces-variable.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
 <td><a accesskey="n" href="shaping-opentype-features.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <p>
       If a font has a GDEF table, then that is used for
       glyph classes; if not, HarfBuzz will fall back to Unicode
-      categorization by code point. If a font has an AAT "morx" table,
+      categorization by code point. If a font has an AAT <code class="literal">morx</code> table,
       then it is used for substitutions; if not, but there is a GSUB
       table, then the GSUB table is used. If the font has an AAT
-      "kerx" table, then it is used for positioning; if not, but
+      <code class="literal">kerx</code> table, then it is used for positioning; if not, but
       there is a GPOS table, then the GPOS table is used. If neither
-      table is found, but there is a "kern" table, then HarfBuzz will
-      use the "kern" table. If there is no "kerx", no GPOS, and no
-      "kern", HarfBuzz will fall back to positioning marks itself.
+      table is found, but there is a <code class="literal">kern</code> table, then HarfBuzz will
+      use the <code class="literal">kern</code> table. If there is no <code class="literal">kerx</code>, no GPOS, and no
+      <code class="literal">kern</code>, HarfBuzz will fall back to positioning marks itself.
     </p>
 <p>
       With a well-behaved OpenType font, you expect GDEF, GSUB, and
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index 3eefea3..6ce7bcc 100644 (file)
@@ -3,20 +3,20 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Shaping concepts: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="pt01.html" title="Part I. User's manual">
-<link rel="prev" href="ch03s03.html" title="A simple shaping example">
+<link rel="up" href="user-manual.html" title="Part I. User's manual">
+<link rel="prev" href="a-simple-shaping-example.html" title="A simple shaping example">
 <link rel="next" href="complex-scripts.html" title="Complex scripts">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
 <td width="100%" align="left" class="shortcuts"></td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><a accesskey="u" href="pt01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
-<td><a accesskey="p" href="ch03s03.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="user-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="a-simple-shaping-example.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
 <td><a accesskey="n" href="complex-scripts.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <div class="chapter">
@@ -64,6 +64,6 @@
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index 73d8fcb..e36d84a 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>OpenType features: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="shaping-and-shape-plans.html" title="Shaping and shape plans">
 <link rel="prev" href="shaping-and-shape-plans.html" title="Shaping and shape plans">
 <link rel="next" href="shaping-shaper-selection.html" title="Shaper selection">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
       also applies the <code class="literal">calt</code>,
       <code class="literal">clig</code>, <code class="literal">curs</code>,
       <code class="literal">dist</code>, <code class="literal">kern</code>,
-      <code class="literal">liga</code>, <code class="literal">rclt</code>,
-      and <code class="literal">frac</code> features.
+      <code class="literal">liga</code> and <code class="literal">rclt</code>, features.
     </p>
 <p>
+      Additionally, when HarfBuzz encounters a fraction slash
+      (<code class="literal">U+2044</code>), it looks backward and forward for decimal
+      digits (Unicode General Category = Nd), and enables features
+      <code class="literal">numr</code> on the sequence before the fraction slash,
+      <code class="literal">dnom</code> on the sequence after the fraction slash,
+      and <code class="literal">frac</code> on the whole sequence including the fraction
+      slash.
+    </p>
+<p>
+      Some script-specific shaping models
+      (see <a class="xref" href="opentype-shaping-models.html" title="OpenType shaping models">the section called “OpenType shaping models”</a>) disable some of the
+      features listed above:
+    </p>
+<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
+<li class="listitem"><p>
+          Hangul: <code class="literal">calt</code>
+       </p></li>
+<li class="listitem"><p>
+          Indic: <code class="literal">liga</code>
+       </p></li>
+<li class="listitem"><p>
+          Khmer: <code class="literal">liga</code>
+       </p></li>
+</ul></div>
+<p>
       If the text direction is vertical, HarfBuzz applies
       the <code class="literal">vert</code> feature by default.
     </p>
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index beaf467..b96df28 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Shaping operations: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="shaping-concepts.html" title="Shaping concepts">
 <link rel="prev" href="complex-scripts.html" title="Complex scripts">
 <link rel="next" href="unicode-character-categories.html" title="Unicode character categories">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -93,6 +93,6 @@
 </ul></div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index c477e39..5c490f8 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Plans and caching: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="shaping-and-shape-plans.html" title="Shaping and shape plans">
 <link rel="prev" href="shaping-shaper-selection.html" title="Shaper selection">
 <link rel="next" href="clusters.html" title="Clusters">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -80,6 +80,6 @@
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index 29e25d4..f7ec05b 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Shaper selection: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="shaping-and-shape-plans.html" title="Shaping and shape plans">
 <link rel="prev" href="shaping-opentype-features.html" title="OpenType features">
 <link rel="next" href="shaping-plans-and-caching.html" title="Plans and caching">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -60,6 +60,6 @@
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/html/style-api.html b/docs/html/style-api.html
new file mode 100644 (file)
index 0000000..952cf46
--- /dev/null
@@ -0,0 +1,32 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Style API: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="harfbuzz-hb-directwrite.html" title="hb-directwrite">
+<link rel="next" href="harfbuzz-hb-style.html" title="hb-style">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="harfbuzz-hb-directwrite.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="harfbuzz-hb-style.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="chapter">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="style-api"></a>Style API</h2></div></div></div>
+<div class="toc"><dl class="toc"><dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-style.html">hb-style</a></span><span class="refpurpose"> — Font Styles</span>
+</dt></dl></div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/subset-api.html b/docs/html/subset-api.html
new file mode 100644 (file)
index 0000000..466ccdb
--- /dev/null
@@ -0,0 +1,32 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Subset API: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="reference-manual.html" title="Part II. Reference manual">
+<link rel="prev" href="harfbuzz-hb-style.html" title="hb-style">
+<link rel="next" href="harfbuzz-hb-subset.html" title="hb-subset">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="reference-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="harfbuzz-hb-style.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="harfbuzz-hb-subset.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="chapter">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="subset-api"></a>Subset API</h2></div></div></div>
+<div class="toc"><dl class="toc"><dt>
+<span class="refentrytitle"><a href="harfbuzz-hb-subset.html">hb-subset</a></span><span class="refpurpose"> — Subsets font files.</span>
+</dt></dl></div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/terminology.html b/docs/html/terminology.html
new file mode 100644 (file)
index 0000000..f1c3dbe
--- /dev/null
@@ -0,0 +1,150 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Terminology: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="getting-started.html" title="Getting started with HarfBuzz">
+<link rel="prev" href="getting-started.html" title="Getting started with HarfBuzz">
+<link rel="next" href="a-simple-shaping-example.html" title="A simple shaping example">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="getting-started.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="getting-started.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="a-simple-shaping-example.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="terminology"></a>Terminology</h2></div></div></div>
+<p>
+      
+    </p>
+<div class="variablelist"><table border="0" class="variablelist">
+<colgroup>
+<col align="left" valign="top">
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><p><span class="term">script</span></p></td>
+<td>
+<p>
+             In text shaping, a <span class="emphasis"><em>script</em></span> is a
+             writing system: a set of symbols, rules, and conventions
+             that is used to represent a language or multiple
+             languages.
+           </p>
+<p>
+             In general computing lingo, the word "script" can also
+             be used to mean an executable program (usually one
+             written in a human-readable programming language). For
+             the sake of clarity, HarfBuzz documents will always use
+             more specific terminology when referring to this
+             meaning, such as "Python script" or "shell script." In
+             all other instances, "script" refers to a writing system.
+           </p>
+<p>
+             For developers using HarfBuzz, it is important to note
+             the distinction between a script and a language. Most
+             scripts are used to write a variety of different
+             languages, and many languages may be written in more
+             than one script.
+           </p>
+</td>
+</tr>
+<tr>
+<td><p><span class="term">shaper</span></p></td>
+<td><p>
+             In HarfBuzz, a <span class="emphasis"><em>shaper</em></span> is a
+             handler for a specific script-shaping model. HarfBuzz
+             implements separate shapers for Indic, Arabic, Thai and
+             Lao, Khmer, Myanmar, Tibetan, Hangul, Hebrew, the
+             Universal Shaping Engine (USE), and a default shaper for
+             non-complex scripts. 
+           </p></td>
+</tr>
+<tr>
+<td><p><span class="term">cluster</span></p></td>
+<td>
+<p>
+             In text shaping, a <span class="emphasis"><em>cluster</em></span> is a
+             sequence of codepoints that must be treated as an
+             indivisible unit. Clusters can include code-point
+             sequences that form a ligature or base-and-mark
+             sequences. Tracking and preserving clusters is important
+             when shaping operations might separate or reorder
+             code points.
+           </p>
+<p>
+             HarfBuzz provides three cluster
+             <span class="emphasis"><em>levels</em></span> that implement different
+             approaches to the problem of preserving clusters during
+             shaping operations.
+           </p>
+</td>
+</tr>
+<tr>
+<td><p><span class="term">grapheme</span></p></td>
+<td>
+<p>
+             In linguistics, a <span class="emphasis"><em>grapheme</em></span> is one
+             of the indivisible units that make up a writing system or
+             script. Often, graphemes are individual symbols (letters,
+             numbers, punctuation marks, logograms, etc.) but,
+             depending on the writing system, a particular grapheme
+             might correspond to a sequence of several Unicode code
+             points.
+           </p>
+<p>
+             In practice, HarfBuzz and other text-shaping engines
+             are not generally concerned with graphemes. However, it
+             is important for developers using HarfBuzz to recognize
+             that there is a difference between graphemes and shaping
+             clusters (see above). The two concepts may overlap
+             frequently, but there is no guarantee that they will be
+             identical.
+           </p>
+</td>
+</tr>
+<tr>
+<td><p><span class="term">syllable</span></p></td>
+<td>
+<p>
+             In linguistics, a <span class="emphasis"><em>syllable</em></span> is an 
+             a sequence of sounds that makes up a building block of a
+             particular language. Every language has its own set of
+             rules describing what constitutes a valid syllable.
+           </p>
+<p>
+             For text-shaping purposes, the various definitions of
+             "syllable" are important because script-specific shaping
+             operations may be applied at the syllable level. For
+             example, a reordering rule might specify that a vowel
+             mark be reordered to the beginning of the syllable.
+           </p>
+<p>
+             Syllables will consist of one or more Unicode code
+             points. The definition of a syllable for a particular
+             writing system might correspond to how HarfBuzz
+             identifies clusters (see above) for the same writing
+             system. However, it is important for developers using
+             HarfBuzz to recognize that there is a difference between
+             syllables and shaping clusters. The two concepts may
+             overlap frequently, but there is no guarantee that they
+             will be identical.
+           </p>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
index 086d47e..a6e4b2b 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Text runs: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="shaping-concepts.html" title="Shaping concepts">
 <link rel="prev" href="unicode-character-categories.html" title="Unicode character categories">
 <link rel="next" href="opentype-shaping-models.html" title="OpenType shaping models">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -42,6 +42,6 @@
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index 24abe64..e153966 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>The distinction between levels 0 and 1: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="clusters.html" title="Clusters">
 <link rel="prev" href="reordering-in-levels-0-and-1.html" title="Reordering in levels 0 and 1">
 <link rel="next" href="level-2.html" title="Level 2">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index 8e80757..8ecaf32 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Unicode character categories: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="shaping-concepts.html" title="Shaping concepts">
 <link rel="prev" href="shaping-operations.html" title="Shaping operations">
 <link rel="next" href="text-runs.html" title="Text runs">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -74,6 +74,6 @@
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index f404986..674be9c 100644 (file)
Binary files a/docs/html/up-insensitive.png and b/docs/html/up-insensitive.png differ
index 80b4b37..ae83f66 100644 (file)
Binary files a/docs/html/up.png and b/docs/html/up.png differ
diff --git a/docs/html/user-manual.html b/docs/html/user-manual.html
new file mode 100644 (file)
index 0000000..5420493
--- /dev/null
@@ -0,0 +1,132 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Part I. User's manual: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="index.html" title="HarfBuzz Manual">
+<link rel="prev" href="index.html" title="HarfBuzz Manual">
+<link rel="next" href="what-is-harfbuzz.html" title="What is HarfBuzz?">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><img src="up-insensitive.png" width="16" height="16" border="0"></td>
+<td><a accesskey="p" href="index.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="what-is-harfbuzz.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="part">
+<div class="titlepage"><div><div><h1 class="title">
+<a name="user-manual"></a>Part I. User's manual</h1></div></div></div>
+<div class="toc">
+<p><b>Table of Contents</b></p>
+<dl class="toc">
+<dt><span class="chapter"><a href="what-is-harfbuzz.html">What is HarfBuzz?</a></span></dt>
+<dd><dl>
+<dt><span class="section"><a href="what-is-harfbuzz.html#what-is-text-shaping">What is text shaping?</a></span></dt>
+<dt><span class="section"><a href="why-do-i-need-a-shaping-engine.html">Why do I need a shaping engine?</a></span></dt>
+<dt><span class="section"><a href="what-does-harfbuzz-do.html">What does HarfBuzz do?</a></span></dt>
+<dt><span class="section"><a href="what-harfbuzz-doesnt-do.html">What HarfBuzz doesn't do</a></span></dt>
+<dt><span class="section"><a href="why-is-it-called-harfbuzz.html">Why is it called HarfBuzz?</a></span></dt>
+</dl></dd>
+<dt><span class="chapter"><a href="install-harfbuzz.html">Installing HarfBuzz</a></span></dt>
+<dd><dl>
+<dt><span class="section"><a href="install-harfbuzz.html#download">Downloading HarfBuzz</a></span></dt>
+<dt><span class="section"><a href="building.html">Building HarfBuzz</a></span></dt>
+<dd><dl>
+<dt><span class="section"><a href="building.html#building.linux">Building on Linux</a></span></dt>
+<dt><span class="section"><a href="building.html#building.windows">Building on Windows</a></span></dt>
+<dt><span class="section"><a href="building.html#building.macos">Building on macOS</a></span></dt>
+<dt><span class="section"><a href="building.html#configuration">Configuration options</a></span></dt>
+</dl></dd>
+</dl></dd>
+<dt><span class="chapter"><a href="getting-started.html">Getting started with HarfBuzz</a></span></dt>
+<dd><dl>
+<dt><span class="section"><a href="getting-started.html#an-overview-of-the-harfbuzz-shaping-api">An overview of the HarfBuzz shaping API</a></span></dt>
+<dt><span class="section"><a href="terminology.html">Terminology</a></span></dt>
+<dt><span class="section"><a href="a-simple-shaping-example.html">A simple shaping example</a></span></dt>
+</dl></dd>
+<dt><span class="chapter"><a href="shaping-concepts.html">Shaping concepts</a></span></dt>
+<dd><dl>
+<dt><span class="section"><a href="shaping-concepts.html#text-shaping-concepts">Text shaping</a></span></dt>
+<dt><span class="section"><a href="complex-scripts.html">Complex scripts</a></span></dt>
+<dt><span class="section"><a href="shaping-operations.html">Shaping operations</a></span></dt>
+<dt><span class="section"><a href="unicode-character-categories.html">Unicode character categories</a></span></dt>
+<dt><span class="section"><a href="text-runs.html">Text runs</a></span></dt>
+<dt><span class="section"><a href="opentype-shaping-models.html">OpenType shaping models</a></span></dt>
+<dt><span class="section"><a href="graphite-shaping.html">Graphite shaping</a></span></dt>
+<dt><span class="section"><a href="aat-shaping.html">AAT shaping</a></span></dt>
+</dl></dd>
+<dt><span class="chapter"><a href="object-model.html">The HarfBuzz object model</a></span></dt>
+<dd><dl>
+<dt><span class="section"><a href="object-model.html#object-model-intro">An overview of data types in HarfBuzz</a></span></dt>
+<dt><span class="section"><a href="object-model-object-types.html">Objects in HarfBuzz</a></span></dt>
+<dt><span class="section"><a href="object-model-lifecycle.html">Object lifecycle management</a></span></dt>
+<dt><span class="section"><a href="object-model-user-data.html">User data</a></span></dt>
+<dt><span class="section"><a href="object-model-blobs.html">Blobs</a></span></dt>
+</dl></dd>
+<dt><span class="chapter"><a href="buffers-language-script-and-direction.html">Buffers, language, script and direction</a></span></dt>
+<dd><dl>
+<dt><span class="section"><a href="buffers-language-script-and-direction.html#creating-and-destroying-buffers">Creating and destroying buffers</a></span></dt>
+<dt><span class="section"><a href="adding-text-to-the-buffer.html">Adding text to the buffer</a></span></dt>
+<dt><span class="section"><a href="setting-buffer-properties.html">Setting buffer properties</a></span></dt>
+<dt><span class="section"><a href="customizing-unicode-functions.html">Customizing Unicode functions</a></span></dt>
+</dl></dd>
+<dt><span class="chapter"><a href="fonts-and-faces.html">Fonts, faces, and output</a></span></dt>
+<dd><dl>
+<dt><span class="section"><a href="fonts-and-faces.html#fonts-and-faces-objects">Font and face objects</a></span></dt>
+<dt><span class="section"><a href="fonts-and-faces-custom-functions.html">Customizing font functions</a></span></dt>
+<dt><span class="section"><a href="fonts-and-faces-native-opentype.html">Font objects and HarfBuzz's native OpenType implementation</a></span></dt>
+<dt><span class="section"><a href="fonts-and-faces-variable.html">Working with OpenType Variable Fonts</a></span></dt>
+</dl></dd>
+<dt><span class="chapter"><a href="shaping-and-shape-plans.html">Shaping and shape plans</a></span></dt>
+<dd><dl>
+<dt><span class="section"><a href="shaping-and-shape-plans.html#shaping-buffer-output">Shaping and buffer output</a></span></dt>
+<dt><span class="section"><a href="shaping-opentype-features.html">OpenType features</a></span></dt>
+<dt><span class="section"><a href="shaping-shaper-selection.html">Shaper selection</a></span></dt>
+<dt><span class="section"><a href="shaping-plans-and-caching.html">Plans and caching</a></span></dt>
+</dl></dd>
+<dt><span class="chapter"><a href="clusters.html">Clusters</a></span></dt>
+<dd><dl>
+<dt><span class="section"><a href="clusters.html#clusters-and-shaping">Clusters and shaping</a></span></dt>
+<dt><span class="section"><a href="working-with-harfbuzz-clusters.html">Working with HarfBuzz clusters</a></span></dt>
+<dt><span class="section"><a href="a-clustering-example-for-levels-0-and-1.html">A clustering example for levels 0 and 1</a></span></dt>
+<dt><span class="section"><a href="reordering-in-levels-0-and-1.html">Reordering in levels 0 and 1</a></span></dt>
+<dt><span class="section"><a href="the-distinction-between-levels-0-and-1.html">The distinction between levels 0 and 1</a></span></dt>
+<dt><span class="section"><a href="level-2.html">Level 2</a></span></dt>
+<dd><dl>
+<dt><span class="section"><a href="level-2.html#ligatures-with-combining-marks-in-level-2">Ligatures with combining marks in level 2</a></span></dt>
+<dt><span class="section"><a href="level-2.html#reordering-in-level-2">Reordering in level 2</a></span></dt>
+<dt><span class="section"><a href="level-2.html#other-considerations-in-level-2">Other considerations in level 2</a></span></dt>
+</dl></dd>
+</dl></dd>
+<dt><span class="chapter"><a href="utilities.html">Utilities</a></span></dt>
+<dd><dl>
+<dt><span class="section"><a href="utilities.html#utilities-command-line-tools">Command-line tools</a></span></dt>
+<dd><dl>
+<dt><span class="section"><a href="utilities.html#utilities-command-line-hbshape">hb-shape</a></span></dt>
+<dt><span class="section"><a href="utilities.html#utilities-command-line-hbview">hb-view</a></span></dt>
+<dt><span class="section"><a href="utilities.html#utilities-command-line-hbsubset">hb-subset</a></span></dt>
+</dl></dd>
+<dt><span class="section"><a href="utilities-common-types-apis.html">Common data types and APIs</a></span></dt>
+</dl></dd>
+<dt><span class="chapter"><a href="integration.html">Platform Integration Guide</a></span></dt>
+<dd><dl>
+<dt><span class="section"><a href="integration.html#integration-glib">GNOME integration, GLib, and GObject</a></span></dt>
+<dt><span class="section"><a href="integration-freetype.html">FreeType integration</a></span></dt>
+<dt><span class="section"><a href="integration-uniscribe.html">Uniscribe integration</a></span></dt>
+<dt><span class="section"><a href="integration-coretext.html">Core Text integration</a></span></dt>
+<dt><span class="section"><a href="integration-icu.html">ICU integration</a></span></dt>
+<dt><span class="section"><a href="integration-python.html">Python bindings</a></span></dt>
+</dl></dd>
+</dl>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
index 8ed6c3a..dbb216a 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Common data types and APIs: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="utilities.html" title="Utilities">
 <link rel="prev" href="utilities.html" title="Utilities">
-<link rel="next" href="utilities-ucdn.html" title="UCDN">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<link rel="next" href="integration.html" title="Platform Integration Guide">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -17,7 +17,7 @@
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
 <td><a accesskey="u" href="utilities.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
 <td><a accesskey="p" href="utilities.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="utilities-ucdn.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+<td><a accesskey="n" href="integration.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <div class="section">
 <div class="titlepage"><div><div><h2 class="title" style="clear: both">
@@ -79,6 +79,6 @@
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/html/utilities-ucdn.html b/docs/html/utilities-ucdn.html
deleted file mode 100644 (file)
index c5a4fc7..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>UCDN: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
-<link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="utilities.html" title="Utilities">
-<link rel="prev" href="utilities-common-types-apis.html" title="Common data types and APIs">
-<link rel="next" href="integration.html" title="Platform Integration Guide">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
-<link rel="stylesheet" href="style.css" type="text/css">
-</head>
-<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
-<td width="100%" align="left" class="shortcuts"></td>
-<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><a accesskey="u" href="utilities.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
-<td><a accesskey="p" href="utilities-common-types-apis.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="integration.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
-</tr></table>
-<div class="section">
-<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="utilities-ucdn"></a>UCDN</h2></div></div></div>
-<p>
-      HarfBuzz includes a copy of the <a class="ulink" href="https://github.com/grigorig/ucdn" target="_top">UCDN</a> (Unicode
-      Database and Normalization) library, which provides functions
-      for accessing basic Unicode character properties, performing
-      canonical composition, and performing both canonical and
-      compatibility decomposition.
-    </p>
-<p>
-      Currently, UCDN supports direct queries for several more character
-      properties than HarfBuzz's built-in set of Unicode functions
-      does, such as the BiDirectional Class, East Asian Width, Paired
-      Bracket and Resolved Linebreak properties. If you need to access
-      more properties than HarfBuzz's internal implementation
-      provides, using the built-in UCDN functions may be a useful solution.
-    </p>
-<p>
-      The built-in UCDN functions are compiled by default when
-      building HarfBuzz from source, but this can be disabled with a
-      compile-time switch.
-    </p>
-</div>
-<div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
-</body>
-</html>
\ No newline at end of file
index 6ca5467..210e71b 100644 (file)
@@ -3,19 +3,19 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Utilities: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="pt01.html" title="Part I. User's manual">
+<link rel="up" href="user-manual.html" title="Part I. User's manual">
 <link rel="prev" href="level-2.html" title="Level 2">
 <link rel="next" href="utilities-common-types-apis.html" title="Common data types and APIs">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
 <td width="100%" align="left" class="shortcuts"></td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><a accesskey="u" href="pt01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="u" href="user-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
 <td><a accesskey="p" href="level-2.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
 <td><a accesskey="n" href="utilities-common-types-apis.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <dt><span class="section"><a href="utilities.html#utilities-command-line-hbsubset">hb-subset</a></span></dt>
 </dl></dd>
 <dt><span class="section"><a href="utilities-common-types-apis.html">Common data types and APIs</a></span></dt>
-<dt><span class="section"><a href="utilities-ucdn.html">UCDN</a></span></dt>
 </dl></div>
 <p>
     HarfBuzz includes several auxiliary components in addition to the
     main APIs. These include a set of command-line tools, a set of
     lower-level APIs for common data types that may be of interest to
-    client programs, and an embedded library for working with
-    Unicode Character Database (UCD) data.
+    client programs.
   </p>
 <div class="section">
 <div class="titlepage"><div><div><h2 class="title" style="clear: both">
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/html/what-does-harfbuzz-do.html b/docs/html/what-does-harfbuzz-do.html
new file mode 100644 (file)
index 0000000..937bd35
--- /dev/null
@@ -0,0 +1,108 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>What does HarfBuzz do?: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="what-is-harfbuzz.html" title="What is HarfBuzz?">
+<link rel="prev" href="why-do-i-need-a-shaping-engine.html" title="Why do I need a shaping engine?">
+<link rel="next" href="what-harfbuzz-doesnt-do.html" title="What HarfBuzz doesn't do">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="what-is-harfbuzz.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="why-do-i-need-a-shaping-engine.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="what-harfbuzz-doesnt-do.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="what-does-harfbuzz-do"></a>What does HarfBuzz do?</h2></div></div></div>
+<p>
+      HarfBuzz provides text shaping through a cross-platform
+      C API that accepts sequences of Unicode codepoints as input. Currently,
+      the following OpenType shaping models are supported:
+    </p>
+<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
+<li class="listitem"><p>
+         Indic (covering Devanagari, Bengali, Gujarati,
+         Gurmukhi, Kannada, Malayalam, Oriya, Tamil, Telugu, and
+         Sinhala)
+       </p></li>
+<li class="listitem"><p>
+         Arabic (covering Arabic, N'Ko, Syriac, and Mongolian)
+       </p></li>
+<li class="listitem"><p>
+         Thai and Lao
+       </p></li>
+<li class="listitem"><p>
+         Khmer
+       </p></li>
+<li class="listitem"><p>
+         Myanmar
+       </p></li>
+<li class="listitem"><p>
+         Tibetan
+       </p></li>
+<li class="listitem"><p>
+         Hangul
+       </p></li>
+<li class="listitem"><p>
+         Hebrew
+       </p></li>
+<li class="listitem"><p>
+         The Universal Shaping Engine or <span class="emphasis"><em>USE</em></span>
+         (covering complex scripts not covered by the above shaping
+         models)
+       </p></li>
+<li class="listitem"><p>
+         A default shaping model for non-complex scripts
+         (covering Latin, Cyrillic, Greek, Armenian, Georgian, Tifinagh,
+         and many others)
+       </p></li>
+<li class="listitem"><p>
+         Emoji (including emoji modifier sequences, flag sequences,
+         and ZWJ sequences)
+       </p></li>
+</ul></div>
+<p>
+      In addition to OpenType shaping, HarfBuzz supports the latest
+      version of Graphite shaping (the "Graphite 2" model) and AAT
+      shaping.
+    </p>
+<p>
+      HarfBuzz can read and understand TrueType fonts (.ttf), TrueType
+      collections (.ttc), and OpenType fonts (.otf, including those
+      fonts that contain TrueType-style outlines and those that
+      contain PostScript CFF or CFF2 outlines).
+    </p>
+<p>
+      HarfBuzz is designed and tested to run on top of the FreeType
+      font renderer. It can run on Linux, Android, Windows, macOS, and
+      iOS systems.
+    </p>
+<p>
+      In addition to its core shaping functionality, HarfBuzz provides
+      functions for accessing other font features, including optional
+      GSUB and GPOS OpenType features, as well as
+      all color-font formats (<code class="literal">CBDT</code>,
+      <code class="literal">sbix</code>, <code class="literal">COLR/CPAL</code>, and
+      <code class="literal">SVG-OT</code>) and OpenType variable fonts. HarfBuzz
+      also includes a font-subsetting feature. HarfBuzz can perform
+      some low-level math-shaping operations, although it does not
+      currently perform full shaping for mathematical typesetting.
+    </p>
+<p>
+      A suite of command-line utilities is also provided in the
+      source-code tree, designed to help users test and debug
+      HarfBuzz's features on real-world fonts and input.
+    </p>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32</div>
+</body>
+</html>
\ No newline at end of file
index 566150a..7cdf615 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>What HarfBuzz doesn't do: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="what-is-harfbuzz.html" title="What is HarfBuzz?">
-<link rel="prev" href="ch01s03.html" title="What does HarfBuzz do?">
+<link rel="prev" href="what-does-harfbuzz-do.html" title="What does HarfBuzz do?">
 <link rel="next" href="why-is-it-called-harfbuzz.html" title="Why is it called HarfBuzz?">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -16,7 +16,7 @@
 <td width="100%" align="left" class="shortcuts"></td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
 <td><a accesskey="u" href="what-is-harfbuzz.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
-<td><a accesskey="p" href="ch01s03.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="p" href="what-does-harfbuzz-do.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
 <td><a accesskey="n" href="why-is-it-called-harfbuzz.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <div class="section">
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index 2bdb06c..bfc491a 100644 (file)
@@ -3,20 +3,20 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>What is HarfBuzz?: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="pt01.html" title="Part I. User's manual">
-<link rel="prev" href="pt01.html" title="Part I. User's manual">
+<link rel="up" href="user-manual.html" title="Part I. User's manual">
+<link rel="prev" href="user-manual.html" title="Part I. User's manual">
 <link rel="next" href="why-do-i-need-a-shaping-engine.html" title="Why do I need a shaping engine?">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
 <td width="100%" align="left" class="shortcuts"></td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><a accesskey="u" href="pt01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
-<td><a accesskey="p" href="pt01.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="user-manual.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="user-manual.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
 <td><a accesskey="n" href="why-do-i-need-a-shaping-engine.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <div class="chapter">
@@ -25,7 +25,7 @@
 <div class="toc"><dl class="toc">
 <dt><span class="section"><a href="what-is-harfbuzz.html#what-is-text-shaping">What is text shaping?</a></span></dt>
 <dt><span class="section"><a href="why-do-i-need-a-shaping-engine.html">Why do I need a shaping engine?</a></span></dt>
-<dt><span class="section"><a href="ch01s03.html">What does HarfBuzz do?</a></span></dt>
+<dt><span class="section"><a href="what-does-harfbuzz-do.html">What does HarfBuzz do?</a></span></dt>
 <dt><span class="section"><a href="what-harfbuzz-doesnt-do.html">What HarfBuzz doesn't do</a></span></dt>
 <dt><span class="section"><a href="why-is-it-called-harfbuzz.html">Why is it called HarfBuzz?</a></span></dt>
 </dl></div>
@@ -95,6 +95,6 @@
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index 11924af..82419b3 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Why do I need a shaping engine?: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="what-is-harfbuzz.html" title="What is HarfBuzz?">
 <link rel="prev" href="what-is-harfbuzz.html" title="What is HarfBuzz?">
-<link rel="next" href="ch01s03.html" title="What does HarfBuzz do?">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<link rel="next" href="what-does-harfbuzz-do.html" title="What does HarfBuzz do?">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -17,7 +17,7 @@
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
 <td><a accesskey="u" href="what-is-harfbuzz.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
 <td><a accesskey="p" href="what-is-harfbuzz.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="ch01s03.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+<td><a accesskey="n" href="what-does-harfbuzz-do.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <div class="section">
 <div class="titlepage"><div><div><h2 class="title" style="clear: both">
       </p></div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index 282772a..4a42630 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Why is it called HarfBuzz?: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="what-is-harfbuzz.html" title="What is HarfBuzz?">
 <link rel="prev" href="what-harfbuzz-doesnt-do.html" title="What HarfBuzz doesn't do">
 <link rel="next" href="install-harfbuzz.html" title="Installing HarfBuzz">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -33,6 +33,6 @@
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index 12f508f..7641d06 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Working with HarfBuzz clusters: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="clusters.html" title="Clusters">
 <link rel="prev" href="clusters.html" title="Clusters">
 <link rel="next" href="a-clustering-example-for-levels-0-and-1.html" title="A clustering example for levels 0 and 1">
-<meta name="generator" content="GTK-Doc V1.32.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.32 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 </ul></div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.32.1</div>
+<hr>Generated by GTK-Doc V1.32</div>
 </body>
 </html>
\ No newline at end of file
index 2fc8b81..9da1fd5 100644 (file)
@@ -3,7 +3,7 @@ if build_machine.system() == 'windows'
   subdir_done()
 endif
 
-if not find_program('gtkdoc-scan', required: get_option('gtk_doc')).found()
+if not find_program('gtkdoc-scan', required: get_option('docs')).found()
   message('Not building documentation as gtk-doc was not found')
   subdir_done()
 endif
@@ -40,23 +40,20 @@ html_images = [
   'HarfBuzz.svg',
 ]
 
-ignore_headers = []
-if have_gobject
-  ignore_headers += [
-    'hb-gobject.h',
-    'hb-gobject-enums.h',
-    'hb-gobject-enums-tmp.h',
-    'hb-gobject-structs.h',
-  ]
-endif
+ignore_headers = [
+  'hb-gobject.h',
+  'hb-gobject-enums.h',
+  'hb-gobject-enums-tmp.h',
+  'hb-gobject-structs.h',
+]
 
 gnome.gtkdoc('harfbuzz',
   main_sgml: 'harfbuzz-docs.xml',
-  src_dir: [meson.current_source_dir() / '..',
-            meson.current_build_dir() / '..',
+  src_dir: [meson.current_source_dir() / '..' / 'src',
+            meson.current_build_dir() / '..' / 'src',
            ],
   scan_args: ['--deprecated-guards=HB_DISABLE_DEPRECATED',
-              '--ignore-decorators=HB_EXTERN',
+              '--ignore-decorators=HB_EXTERN|HB_DEPRECATED',
              ],
   mkdb_args: ['--source-suffixes=h,cc',
               '--xml-mode',
@@ -65,5 +62,5 @@ gnome.gtkdoc('harfbuzz',
   content_files: content_files,
   html_assets: html_images,
   ignore_headers: ignore_headers,
-  dependencies: [libharfbuzz_dep, libharfbuzz_gobject_dep],
+  dependencies: [libharfbuzz_dep],
   install: true)
index d98c79b..0235d2d 100644 (file)
       determine which glyph to return.
     </para>
     <para>
-      The safest approach is to add all of the text available, then
-      use <parameter>item_offset</parameter> and
+      The safest approach is to add all of the text available (even
+      if your text contains a mix of scripts, directions, languages
+      and fonts), then use <parameter>item_offset</parameter> and
       <parameter>item_length</parameter> to indicate which characters you
-      want shaped, so that HarfBuzz has access to any context.
+      want shaped (which must all have the same script, direction,
+      language and font), so that HarfBuzz has access to any context.
     </para>
     <para>
       You can also add Unicode code points directly with
index 1258bec..abf5dc2 100644 (file)
       </listitem>
     </itemizedlist>
     <para>
-      You can fetch the font-functions configuration for a font object
-      by calling <function>hb_font_get_font_funcs()</function>:
+      You can create new font-functions by calling
+      <function>hb_font_funcs_create()</function>:
     </para>
     <programlisting language="C">
-      hb_font_funcs_t *ffunctions;
-      ffunctions = hb_font_get_font_funcs (font);
+      hb_font_funcs_t *ffunctions = hb_font_funcs_create ();
+      hb_font_set_funcs (font, ffunctions, font_data, destroy);
     </programlisting>
     <para>
-      The individual methods can each be replaced with their own setter
+      The individual methods can each be set with their own setter
       function, such as
-      <function>hb_font_funcs_set_nominal_glyph_func(*ffunctions,
-      func, *user_data, destroy)</function>. 
+      <function>hb_font_funcs_set_nominal_glyph_func(ffunctions,
+      func, user_data, destroy)</function>.
     </para>
     <para>
       Font-functions structures can be reused for multiple font
       programs from changing the configuration and introducing
       inconsistencies and errors downstream.
     </para>
+    <para>
+      To override only some functions while using the default implementation
+      for the others, you will need to create a sub-font. By default, the
+      sub-font uses the font functions of its parent except for the functions
+      that were explicitly set. The following code will override only the
+      <function>hb_font_get_nominal_glyph_func_t</function> for the sub-font:
+    </para>
+    <programlisting language="C">
+      hb_font_t *subfont = hb_font_create_sub_font (font)
+      hb_font_funcs_t *ffunctions = hb_font_funcs_create ();
+      hb_font_funcs_set_nominal_glyph_func (ffunctions, func, user_data, destroy);
+      hb_font_set_funcs (subfont, ffunctions, font_data, destroy);
+      hb_font_funcs_destroy (ffunctions);
+    </programlisting>
   </section>
 
   <section id="fonts-and-faces-native-opentype">
index 1f26df8..e7241a6 100644 (file)
@@ -6,7 +6,7 @@
 ]>
 <chapter id="getting-started">
   <title>Getting started with HarfBuzz</title>
-  <section>
+  <section id="an-overview-of-the-harfbuzz-shaping-api">
     <title>An overview of the HarfBuzz shaping API</title>
     <para>
       The core of the HarfBuzz shaping API is the function
@@ -51,7 +51,7 @@
 
     <para>
       Although the default <function>hb_shape()</function> function is
-      sufficient for most use cases, a variant is also provide that
+      sufficient for most use cases, a variant is also provided that
       lets you specify which of HarfBuzz's shapers to use on a buffer. 
     </para>
 
@@ -73,7 +73,7 @@
     </para>
   </section>
 
-  <section>
+  <section id="terminology">
     <title>Terminology</title>
     <para>
       
   </section>
 
 
-  <section>
+  <section id="a-simple-shaping-example">
     <title>A simple shaping example</title>
 
     <para>
     </orderedlist>
     <programlisting language="C">
       #include &lt;hb.h&gt;
+
       hb_buffer_t *buf;
       buf = hb_buffer_create();
       hb_buffer_add_utf8(buf, text, -1, 0, -1);
     <orderedlist numeration="arabic">
       <listitem override="3">
        <para>
-          Create a face and a font, using FreeType for now.
+          Create a face and a font from a font file.
        </para>
       </listitem>
     </orderedlist>
     <programlisting language="C">
-      #include &lt;hb-ft.h&gt;
-      FT_New_Face(ft_library, font_path, index, &amp;face);
-      FT_Set_Char_Size(face, 0, 1000, 0, 0);
-      hb_font_t *font = hb_ft_font_create(face);
+      hb_blob_t *blob = hb_blob_create_from_file(filename); /* or hb_blob_create_from_file_or_fail() */
+      hb_face_t *face = hb_face_create(blob, 0);
+      hb_font_t *font = hb_font_create(face);
     </programlisting>
     <orderedlist numeration="arabic">
       <listitem override="4">
       </listitem>
     </orderedlist>
     <programlisting language="C">
+      unsigned int glyph_count;
       hb_glyph_info_t *glyph_info    = hb_buffer_get_glyph_infos(buf, &amp;glyph_count);
       hb_glyph_position_t *glyph_pos = hb_buffer_get_glyph_positions(buf, &amp;glyph_count);
     </programlisting>
       </listitem>
     </orderedlist>
     <programlisting language="C">
-      for (i = 0; i &lt; glyph_count; ++i) {
-          glyphid = glyph_info[i].codepoint;
-          x_offset = glyph_pos[i].x_offset / 64.0;
-          y_offset = glyph_pos[i].y_offset / 64.0;
-          x_advance = glyph_pos[i].x_advance / 64.0;
-          y_advance = glyph_pos[i].y_advance / 64.0;
-          draw_glyph(glyphid, cursor_x + x_offset, cursor_y + y_offset);
+      hb_position_t cursor_x = 0;
+      hb_position_t cursor_y = 0;
+      for (unsigned int i = 0; i &lt; glyph_count; i++) {
+          hb_codepoint_t glyphid  = glyph_info[i].codepoint;
+          hb_position_t x_offset  = glyph_pos[i].x_offset;
+          hb_position_t y_offset  = glyph_pos[i].y_offset;
+          hb_position_t x_advance = glyph_pos[i].x_advance;
+          hb_position_t y_advance = glyph_pos[i].y_advance;
+       /* draw_glyph(glyphid, cursor_x + x_offset, cursor_y + y_offset); */
           cursor_x += x_advance;
           cursor_y += y_advance;
       }
     </orderedlist>
     <programlisting language="C">
       hb_buffer_destroy(buf);
-      hb_font_destroy(hb_ft_font);
+      hb_font_destroy(font);
+      hb_face_destroy(face);
+      hb_blob_destroy(blob);
     </programlisting>
     
     <para>
index 0ec3585..760b9c5 100644 (file)
       Tarball releases and Win32 binary bundles (which include the
       libharfbuzz DLL, hb-view.exe, hb-shape.exe, and all
       dependencies) of HarfBuzz can be downloaded from <ulink
-      url="https://github.com/harfbuzz/harfbuzz">github.com/harfbuzz/harfbuzz/releases</ulink>.
+      url="https://github.com/harfbuzz/harfbuzz/releases">github.com/harfbuzz/harfbuzz/releases</ulink>.
     </para>
     <para>
       Release notes are posted with each new release to provide an
       overview of the changes. The project <ulink url="https://github.com/harfbuzz/harfbuzz/issues">tracks bug
       reports and other issues</ulink> on GitHub. Discussion and
-      questions are welcome on the <ulink
-      url="http://freedesktop.org/mailman/listinfo/harfbuzz/">HarfBuzz
-      mailing list</ulink>.
+      questions are welcome on <ulink
+      url="https://github.com/harfbuzz/harfbuzz/discussions">GitHub</ulink> as well.
     </para>
     <para>
       The API included in the <filename
     </para>
     <para>
       For example, on an Ubuntu or Debian system, you would run:
-      <programlisting>
-       <command>sudo apt install</command> <package>gcc g++ libfreetype6-dev libglib2.0-dev libcairo2-dev</package>
-      </programlisting>
+      <programlisting><command>sudo apt install</command> <package>gcc g++ libfreetype6-dev libglib2.0-dev libcairo2-dev</package></programlisting>
       On Fedora, RHEL, CentOS, or other Red-Hat&ndash;based systems, you would run:
-      <programlisting>
-       <command>sudo yum install</command> <package>gcc gcc-c++ freetype-devel glib2-devel cairo-devel</package>
-      </programlisting>
+      <programlisting><command>sudo yum install</command> <package>gcc gcc-c++ freetype-devel glib2-devel cairo-devel</package></programlisting>
 
     </para>
     
@@ -71,8 +66,8 @@
     </para>
     <para>
       From a shell in the top-level directory of the extracted source
-      code, you can run <command>./configure</command> followed by
-      <command>make</command> as with any other standard package.
+      code, you can run <command>meson build</command> followed by
+      <command>meson compile -C build</command> as with any other standard package.
     </para>
     <para>
       This should leave you with a shared
       <emphasis>(2)(b)</emphasis> If you are building from the source in the HarfBuzz git
       repository, rather than installing from a downloaded tarball
       release, then you must install two more auxiliary tools before you 
-      can build for the first time: <package>pkg-config</package> and
-      <ulink url="http://www.complang.org/ragel/">ragel</ulink>.
+      can build for the first time: <package>pkg-config</package>.
     </para>
     <para>
       On Ubuntu or Debian, run:
-      <programlisting>
-       <command>sudo apt-get install</command> <package>autoconf automake libtool pkg-config ragel gtk-doc-tools</package>
-      </programlisting>
+      <programlisting><command>sudo apt-get install</command> <package>meson pkg-config gtk-doc-tools</package></programlisting>
       On Fedora, RHEL, CentOS, run:
-      <programlisting>
-       <command>sudo yum install</command> <package>autoconf automake libtool pkgconfig ragel gtk-doc</package>
-      </programlisting>
+      <programlisting><command>sudo yum install</command> <package>meson pkgconfig gtk-doc</package></programlisting>
       
     </para>
     <para>
-      With <package>pkg-config</package> and <package>ragel</package>
-      installed, you can now run <command>./autogen.sh</command>,
-      followed by <command>./configure</command> and
-      <command>make</command> to build HarfBuzz.
+      With <package>pkg-config</package> installed, you can now run
+      <command>meson build</command> then
+      <command>meson compile -C build</command> to build HarfBuzz.
     </para>
     </section>
 
       <title>Building on Windows</title>
 
       <para>
-       On Windows, consider using Microsoft's free <ulink
-       url="https://github.com/Microsoft/vcpkg">vcpkg</ulink> utility
-       to build HarfBuzz, its dependencies, and other open-source
-       libraries. 
-      </para>
-      <para>
-       If you need to build HarfBuzz from source, first put the
-       <package>ragel</package> binary on your
-       <literal>PATH</literal>, then follow the appveyor CI cmake
-       <ulink
-           url="https://github.com/harfbuzz/harfbuzz/blob/master/appveyor.yml">build
-       instructions</ulink>. 
+        <ulink url="https://mesonbuild.com/Getting-meson.html">Install meson</ulink>
+        and run (from the console) <command>meson build</command> (by default
+        bundled dependencies are not built, <command>--wrap-mode=default</command>
+        overrides this), then <command>meson compile -C build</command> to
+       build HarfBuzz.
       </para>
     </section>
 
        <emphasis>(1)</emphasis> You must first install the
        development packages for FreeType, Cairo, and GLib. If you are
        using MacPorts, you should run:
-      <programlisting>
-       <command>sudo port install</command> <package>freetype glib2 cairo</package>
-      </programlisting>
+      <programlisting><command>sudo port install</command> <package>freetype glib2 cairo</package></programlisting>
       </para>
       <para>
        If you are using Homebrew, you should run:
-       <programlisting>        
-         <command>brew install</command> <package>freetype glib cairo</package>
-       </programlisting>
+       <programlisting><command>brew install</command> <package>freetype glib cairo</package></programlisting>
       </para>
       <para>
        <emphasis>(2)</emphasis> The next step depends on whether you are building from the
        <emphasis>(2)(a)</emphasis> If you are installing HarfBuzz
        from a downloaded tarball release, extract the tarball and
        open a Terminal in the extracted source-code directory. Run:
-       <programlisting>
-         <command>./configure</command>
-       </programlisting>
+       <programlisting><command>meson build</command></programlisting>
        followed by:
-       <programlisting>        
-         <command>make</command>
-       </programlisting>
+       <programlisting><command>meson compile -C build</command></programlisting>
        to build HarfBuzz.
       </para>
       <para>
       </para>
       <para>If you are
        using MacPorts, you should run:
-      <programlisting>
-       <command>sudo port install</command> <package>autoconf automake libtool pkgconfig ragel gtk-doc</package> 
-      </programlisting>
+      <programlisting><command>sudo port install</command> <package>meson pkgconfig gtk-doc</package></programlisting>
       to install the build dependencies.
       </para>
       <para>If you are using Homebrew, you should run:
-       <programlisting>        
-         <command>brew install</command> <package>autoconf automake libtool pkgconfig ragel gtk-doc</package>
-       </programlisting>
+       <programlisting><command>brew install</command> <package>meson pkgconfig gtk-doc</package></programlisting>
        Finally, you can run:
-       <programlisting>
-         <command>./autogen.sh</command>
-       </programlisting>
+       <programlisting><command>meson build</command></programlisting>
       </para>
       <para>
        <emphasis>(3)</emphasis> You can now build HarfBuzz (on either
        a MacPorts or a Homebrew system) by running:
-       <programlisting>
-         <command>./configure</command>
-       </programlisting>
+       <programlisting><command>meson build</command></programlisting>
        followed by:
-       <programlisting>
-         <command>make</command>
-       </programlisting>
+       <programlisting><command>meson compile -C build</command></programlisting>
       </para>
       <para>
        This should leave you with a shared
       </para>
 
       <variablelist>
-       <?dbfo list-presentation="blocks"?> 
-       <varlistentry>
-         <term><command>--with-libstdc++</command></term>
-         <listitem>
-           <para>
-             Allow linking with libstdc++. <emphasis>(Default = no)</emphasis>
-           </para>
-           <para>
-             This option enables or disables linking HarfBuzz to the
-             system's libstdc++ library.
-           </para>
-         </listitem>
-       </varlistentry>
-       
+       <?dbfo list-presentation="blocks"?>     
        <varlistentry>
-         <term><command>--with-glib</command></term>
+         <term><command>-Dglib=enabled</command></term>
          <listitem>
            <para>
             Use <ulink url="https://developer.gnome.org/glib/">GLib</ulink>. <emphasis>(Default = auto)</emphasis>
        </varlistentry>
        
        <varlistentry>
-         <term><command>--with-gobject</command></term>
+         <term><command>-Dgobject=enabled</command></term>
          <listitem>
            <para>
              Use <ulink url="https://developer.gnome.org/gobject/stable/">GObject</ulink>. <emphasis>(Default = no)</emphasis>
        </varlistentry>
        
        <varlistentry>
-         <term><command>--with-cairo</command></term>
+         <term><command>-Dcairo=enabled</command></term>
          <listitem>
            <para>
              Use <ulink url="https://cairographics.org/">Cairo</ulink>. <emphasis>(Default = auto)</emphasis>
        </varlistentry>
        
        <varlistentry>
-         <term><command>--with-fontconfig</command></term>
-         <listitem>
-           <para>
-             Use <ulink url="https://www.freedesktop.org/wiki/Software/fontconfig/">Fontconfig</ulink>. <emphasis>(Default = auto)</emphasis>
-           </para>
-           <para>
-             This option enables or disables usage of the Fontconfig
-             library, which provides font-matching functions and
-             provides access to font properties. The default setting
-             is to check for the presence of Fontconfig and, if it is
-             found, build with Fontconfig support.
-           </para>
-           <para>
-             Note: Fontconfig is used only by the HarfBuzz
-             command-line utilities, and not by the HarfBuzz library.
-           </para>
-         </listitem>
-       </varlistentry>
-       
-       <varlistentry>
-         <term><command>--with-icu</command></term>
+         <term><command>-Dicu=enabled</command></term>
          <listitem>
            <para>
              Use the <ulink url="http://site.icu-project.org/home">ICU</ulink> library. <emphasis>(Default = auto)</emphasis>
        </varlistentry>
        
        <varlistentry>
-         <term><command>--with-graphite2</command></term>
+         <term><command>-Dgraphite=enabled</command></term>
          <listitem>
            <para>
              Use the <ulink url="http://graphite.sil.org/">Graphite2</ulink> library. <emphasis>(Default = no)</emphasis>
        </varlistentry>
        
        <varlistentry>
-         <term><command>--with-freetype</command></term>
+         <term><command>-Dfreetype=enabled</command></term>
          <listitem>
            <para>
              Use the <ulink url="https://www.freetype.org/">FreeType</ulink> library. <emphasis>(Default = auto)</emphasis>
        </varlistentry>
        
        <varlistentry>
-         <term><command>--with-uniscribe</command></term>
+         <term><command>-Dgdi=enabled</command></term>
          <listitem>
            <para>
              Use the <ulink
        </varlistentry>
        
        <varlistentry>
-         <term><command>--with-directwrite</command></term>
+         <term><command>-Ddirectwrite=enabled</command></term>
          <listitem>
            <para>
              Use the <ulink url="https://docs.microsoft.com/en-us/windows/desktop/directwrite/direct-write-portal">DirectWrite</ulink> library (experimental). <emphasis>(Default = no)</emphasis>
        </varlistentry>
        
        <varlistentry>
-         <term><command>--with-coretext</command></term>
+         <term><command>-Dcoretext=enabled</command></term>
          <listitem>
            <para>
              Use the <ulink url="https://developer.apple.com/documentation/coretext">CoreText</ulink> library. <emphasis>(Default = no)</emphasis>
        </varlistentry> 
 
        <varlistentry>
-         <term><command>--enable-gtk-doc</command></term>
+         <term><command>-Ddocs=enabled</command></term>
          <listitem>
            <para>
-             Use <ulink url="https://www.gtk.org/gtk-doc/">GTK-Doc</ulink>. <emphasis>(Default = no)</emphasis>
+             Use <ulink url="https://github.com/GNOME/gtk-doc">GTK-Doc</ulink>. <emphasis>(Default = no)</emphasis>
            </para>
            <para>
              This option enables the building of the documentation.
index 78c9a0e..5d31ec2 100644 (file)
       <structname>hb_glyph_position_t</structname> structures. 
     </para>
     <para>
-      Your client program only needs to ensure that it coverts
+      Your client program only needs to ensure that it converts
       correctly between HarfBuzz's low-level data types (such as
       <type>hb_position_t</type>) and Windows's corresponding types
       (such as <type>GOFFSET</type> and <type>ABC</type>). Be sure you
       is slightly lower-level than Core Text, provides
       <ulink url="https://developer.apple.com/documentation/coregraphics/cgfontref"><type>CGFontRef</type></ulink>, which enables access to typeface
       properties, but does not include size information. Core Text's
-      <ulink url="https://developer.apple.com/documentation/coretext/ctfont-q6r"><type>CTFontRef</type></ulink> is analagous to a HarfBuzz font object,
+      <ulink url="https://developer.apple.com/documentation/coretext/ctfont-q6r"><type>CTFontRef</type></ulink> is analogous to a HarfBuzz font object,
       with all of the properties required to render text at a specific
       size and configuration.
       Consequently, a HarfBuzz <type>hb_font_t</type> font object can
index 4f0fc92..3c71a36 100644 (file)
@@ -12,7 +12,7 @@
       HarfBuzz features two kinds of data types: non-opaque,
       pass-by-value types and opaque, heap-allocated types.  This kind
       of separation is common in C libraries that have to provide
-      API/ABI compatibility (almost) indefinitely. 
+      API/ABI compatibility (almost) indefinitely.
     </para>
     <para>
       <emphasis>Value types:</emphasis> The non-opaque, pass-by-value
@@ -32,8 +32,8 @@
       possible future members.  As such, it’s important to provide
       <function>equal()</function>, and <function>hash()</function>
       methods for such structs, allowing users of the API do
-      effectively deal with the type without having to 
-      adapt their code to future changes. 
+      effectively deal with the type without having to
+      adapt their code to future changes.
     </para>
     <para>
       Important value types provided by HarfBuzz include the structs
@@ -42,7 +42,7 @@
       OpenType properties.
     </para>
   </section>
-  
+
   <section id="object-model-object-types">
     <title>Objects in HarfBuzz</title>
     <para>
@@ -63,7 +63,7 @@
       the <literal>hb_buffer_t</literal> object has
       <function>hb_buffer_create()</function> as its constructor,
       <function>hb_buffer_reference()</function> to reference, and
-      <function>hb_buffer_destroy()</function> to dereference. 
+      <function>hb_buffer_destroy()</function> to dereference.
     </para>
     <para>
       After construction, each object's properties are accessible only
       Reference manual.
     </para>
     <para>
+      Note that many object types can be marked as read-only or immutable,
+      facilitating their use in multi-threaded environments.
+    </para>
+    <para>
       Key object types provided by HarfBuzz include:
     </para>
     <itemizedlist spacing="compact">
        </para>
       </listitem>
     </itemizedlist>
-       
+
   </section>
 
-  
-  
+
+
   <section id="object-model-lifecycle">
     <title>Object lifecycle management</title>
     <para>
       <literal>1</literal>. Client programs can increase the reference
       count on an object by calling its
       <function>reference()</function> method. Whenever a client
-      program is finished with an object, it should call its 
+      program is finished with an object, it should call its
       corresponding <function>destroy()</function> method. The destroy
       method will decrease the reference count on the object and,
       whenever the reference count reaches zero, it will also destroy
       All of HarfBuzz's object-lifecycle-management APIs are
       thread-safe (unless you compiled HarfBuzz from source with the
       <literal>HB_NO_MT</literal> configuration flag), even when the
-      object as a whole is not thread-safe. 
-      It is also permissible to <function>reference()</function> or to 
+      object as a whole is not thread-safe.
+      It is also permissible to <function>reference()</function> or to
       <function>destroy()</function> the <literal>NULL</literal>
       value.
     </para>
       as immutable and <function>is_immutable()</function> methods to
       test whether or not an object is immutable. Attempts to use
       setter functions on immutable objects will fail silently; see the API
-      Reference manual for specifics. 
+      Reference manual for specifics.
     </para>
     <para>
       Note also that there are no "make mutable" methods. If client
     </para>
   </section>
 
-  
+
   <section id="object-model-user-data">
     <title>User data</title>
     <para>
       offer a "user data" mechanism that can be used to attach
       arbitrary data to the object.  User-data attachment can be
       useful for tying the lifecycles of various pieces of data
-      together, or for creating language bindings. 
+      together, or for creating language bindings.
     </para>
     <para>
       Each object type has a <function>set_user_data()</function>
       existing <literal>user_data</literal>
       associated with the specified key.
     </para>
-  </section>  
+  </section>
+
+
 
-  
-  
   <section id="object-model-blobs">
     <title>Blobs</title>
     <para>
       different.
     </para>
     <para>
-      Blobs are an abstraction desgined to negotiate lifecycle and
+      Blobs are an abstraction designed to negotiate lifecycle and
       permissions for raw pieces of data.  For example, when you load
       the raw font data into memory and want to pass it to HarfBuzz,
       you do so in a <literal>hb_blob_t</literal> wrapper.
     </para>
     <para>
-      This allows you to take advantage of HarffBuzz's
+      This allows you to take advantage of HarfBuzz's
       reference-counting and <function>destroy</function>
-      callbacks. If you allocated the memory for the data using 
+      callbacks. If you allocated the memory for the data using
       <function>malloc()</function>, you would create the blob using
     </para>
     <programlisting language="C">
       allocated memory whenever the blob drops its last reference and
       is deconstructed.  Consequently, the user code can stop worrying
       about freeing memory and let the reference-counting machinery
-      take care of that. 
+      take care of that.
+    </para>
+    <para>
+      Most of the time, blobs are read-only, facilitating their use in
+      immutable objects.
     </para>
   </section>
-  
+
 </chapter>
index 881af2a..e9ea145 100644 (file)
     <para>
       If a font has a GDEF table, then that is used for
       glyph classes; if not, HarfBuzz will fall back to Unicode
-      categorization by code point. If a font has an AAT "morx" table,
+      categorization by code point. If a font has an AAT <literal>morx</literal> table,
       then it is used for substitutions; if not, but there is a GSUB
       table, then the GSUB table is used. If the font has an AAT
-      "kerx" table, then it is used for positioning; if not, but
+      <literal>kerx</literal> table, then it is used for positioning; if not, but
       there is a GPOS table, then the GPOS table is used. If neither
-      table is found, but there is a "kern" table, then HarfBuzz will
-      use the "kern" table. If there is no "kerx", no GPOS, and no
-      "kern", HarfBuzz will fall back to positioning marks itself.
+      table is found, but there is a <literal>kern</literal> table, then HarfBuzz will
+      use the <literal>kern</literal> table. If there is no <literal>kerx</literal>, no GPOS, and no
+      <literal>kern</literal>, HarfBuzz will fall back to positioning marks itself.
     </para>
     <para>
       With a well-behaved OpenType font, you expect GDEF, GSUB, and
       also applies the <literal>calt</literal>,
       <literal>clig</literal>, <literal>curs</literal>,
       <literal>dist</literal>, <literal>kern</literal>,
-      <literal>liga</literal>, <literal>rclt</literal>,
-      and <literal>frac</literal> features.
+      <literal>liga</literal> and <literal>rclt</literal>, features.
     </para>
     <para>
+      Additionally, when HarfBuzz encounters a fraction slash
+      (<literal>U+2044</literal>), it looks backward and forward for decimal
+      digits (Unicode General Category = Nd), and enables features
+      <literal>numr</literal> on the sequence before the fraction slash,
+      <literal>dnom</literal> on the sequence after the fraction slash,
+      and <literal>frac</literal> on the whole sequence including the fraction
+      slash.
+    </para>
+    <para>
+      Some script-specific shaping models
+      (see <xref linkend="opentype-shaping-models" />) disable some of the
+      features listed above:
+    </para>
+    <itemizedlist>
+      <listitem>
+        <para>
+          Hangul: <literal>calt</literal>
+       </para>
+      </listitem>
+      <listitem>
+        <para>
+          Indic: <literal>liga</literal>
+       </para>
+      </listitem>
+      <listitem>
+        <para>
+          Khmer: <literal>liga</literal>
+       </para>
+      </listitem>
+    </itemizedlist>
+    <para>
       If the text direction is vertical, HarfBuzz applies
       the <literal>vert</literal> feature by default.
     </para>
index 6e30c46..0208dbf 100644 (file)
@@ -10,8 +10,7 @@
     HarfBuzz includes several auxiliary components in addition to the
     main APIs. These include a set of command-line tools, a set of
     lower-level APIs for common data types that may be of interest to
-    client programs, and an embedded library for working with
-    Unicode Character Database (UCD) data.
+    client programs.
   </para>
   
   <section id="utilities-command-line-tools">
     </para>
   </section>
 
-  <section id="utilities-ucdn">
-    <title>UCDN</title>
-    <para>
-      HarfBuzz includes a copy of the <ulink
-      url="https://github.com/grigorig/ucdn">UCDN</ulink> (Unicode
-      Database and Normalization) library, which provides functions
-      for accessing basic Unicode character properties, performing
-      canonical composition, and performing both canonical and
-      compatibility decomposition.
-    </para>
-    <para>
-      Currently, UCDN supports direct queries for several more character
-      properties than HarfBuzz's built-in set of Unicode functions
-      does, such as the BiDirectional Class, East Asian Width, Paired
-      Bracket and Resolved Linebreak properties. If you need to access
-      more properties than HarfBuzz's internal implementation
-      provides, using the built-in UCDN functions may be a useful solution.
-    </para>
-    <para>
-      The built-in UCDN functions are compiled by default when
-      building HarfBuzz from source, but this can be disabled with a
-      compile-time switch.
-    </para>
-  </section>
-
 </chapter>
index 3513fb2..4534783 100644 (file)
   </section>
   
 
-  <section>
+  <section id="what-does-harfbuzz-do">
     <title>What does HarfBuzz do?</title>
     <para>
       HarfBuzz provides text shaping through a cross-platform
index e261122..1809198 100644 (file)
@@ -1 +1 @@
-2.6.7
+3.4.0
index 20d8b2e..8175c64 100755 (executable)
@@ -451,18 +451,7 @@ do
     trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
 
     # Copy the file name to the temp name.
-    (umask $cp_umask &&
-     { test -z "$stripcmd" || {
-        # Create $dsttmp read-write so that cp doesn't create it read-only,
-        # which would cause strip to fail.
-        if test -z "$doit"; then
-          : >"$dsttmp" # No need to fork-exec 'touch'.
-        else
-          $doit touch "$dsttmp"
-        fi
-       }
-     } &&
-     $doit_exec $cpprog "$src" "$dsttmp") &&
+    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
 
     # and set any options; do chmod last to preserve setuid bits.
     #
index 48cea9b..0cb7f90 100644 (file)
--- a/ltmain.sh
+++ b/ltmain.sh
@@ -1,12 +1,12 @@
 #! /bin/sh
 ## DO NOT EDIT - This file generated from ./build-aux/ltmain.in
-##               by inline-source v2018-07-24.06
+##               by inline-source v2014-01-03.01
 
-# libtool (GNU libtool) 2.4.6.42-b88ce-dirty
+# libtool (GNU libtool) 2.4.6
 # Provide generalized library-building support services.
 # Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
 
-# Copyright (C) 1996-2018 Free Software Foundation, Inc.
+# Copyright (C) 1996-2015 Free Software Foundation, Inc.
 # This is free software; see the source for copying conditions.  There is NO
 # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
@@ -31,8 +31,8 @@
 
 PROGRAM=libtool
 PACKAGE=libtool
-VERSION=2.4.6.42-b88ce-dirty
-package_revision=2.4.6.42
+VERSION="2.4.6 Debian-2.4.6-14"
+package_revision=2.4.6
 
 
 ## ------ ##
@@ -64,25 +64,34 @@ package_revision=2.4.6.42
 # libraries, which are installed to $pkgauxdir.
 
 # Set a version string for this script.
-scriptversion=2018-07-24.06; # UTC
+scriptversion=2015-01-20.17; # UTC
 
 # General shell script boiler plate, and helper functions.
 # Written by Gary V. Vaughan, 2004
 
-# This is free software.  There is NO warranty; not even for
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-#
-# Copyright (C) 2004-2018 Bootstrap Authors
-#
-# This file is dual licensed under the terms of the MIT license
-# <https://opensource.org/license/MIT>, and GPL version 3 or later
-# <http://www.gnu.org/licenses/gpl-2.0.html>.  You must apply one of
-# these licenses when using or redistributing this software or any of
-# the files within it.  See the URLs above, or the file `LICENSE`
-# included in the Bootstrap distribution for the full license texts.
+# Copyright (C) 2004-2015 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
-# Please report bugs or propose patches to:
-# <https://github.com/gnulib-modules/bootstrap/issues>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+
+# As a special exception to the GNU General Public License, if you distribute
+# this file as part of a program or library that is built using GNU Libtool,
+# you may include this file under the same distribution terms that you use
+# for the rest of that program.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNES FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Please report bugs or propose patches to gary@gnu.org.
 
 
 ## ------ ##
@@ -131,6 +140,9 @@ do
        fi"
 done
 
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
 # Make sure IFS has a sensible default
 sp=' '
 nl='
@@ -147,26 +159,6 @@ if test "${PATH_SEPARATOR+set}" != set; then
 fi
 
 
-# func_unset VAR
-# --------------
-# Portably unset VAR.
-# In some shells, an 'unset VAR' statement leaves a non-zero return
-# status if VAR is already unset, which might be problematic if the
-# statement is used at the end of a function (thus poisoning its return
-# value) or when 'set -e' is active (causing even a spurious abort of
-# the script in this case).
-func_unset ()
-{
-    { eval $1=; (eval unset $1) >/dev/null 2>&1 && eval unset $1 || : ; }
-}
-
-
-# Make sure CDPATH doesn't cause `cd` commands to output the target dir.
-func_unset CDPATH
-
-# Make sure ${,E,F}GREP behave sanely.
-func_unset GREP_OPTIONS
-
 
 ## ------------------------- ##
 ## Locate command utilities. ##
@@ -267,7 +259,7 @@ test -z "$SED" && {
     rm -f conftest.in conftest.tmp conftest.nl conftest.out
   }
 
-  func_path_progs "sed gsed" func_check_prog_sed "$PATH:/usr/xpg4/bin"
+  func_path_progs "sed gsed" func_check_prog_sed $PATH:/usr/xpg4/bin
   rm -f conftest.sed
   SED=$func_path_progs_result
 }
@@ -303,7 +295,7 @@ test -z "$GREP" && {
     rm -f conftest.in conftest.tmp conftest.nl conftest.out
   }
 
-  func_path_progs "grep ggrep" func_check_prog_grep "$PATH:/usr/xpg4/bin"
+  func_path_progs "grep ggrep" func_check_prog_grep $PATH:/usr/xpg4/bin
   GREP=$func_path_progs_result
 }
 
@@ -395,7 +387,7 @@ EXIT_SKIP=77          # $? = 77 is used to indicate a skipped test to automake.
 # putting '$debug_cmd' at the start of all your functions, you can get
 # bash to show function call trace with:
 #
-#    debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name
+#    debug_cmd='echo "${FUNCNAME[0]} $*" >&2' bash your-script-name
 debug_cmd=${debug_cmd-":"}
 exit_cmd=:
 
@@ -588,16 +580,16 @@ if test yes = "$_G_HAVE_PLUSEQ_OP"; then
   {
     $debug_cmd
 
-    func_quote_arg pretty "$2"
-    eval "$1+=\\ \$func_quote_arg_result"
+    func_quote_for_eval "$2"
+    eval "$1+=\\ \$func_quote_for_eval_result"
   }'
 else
   func_append_quoted ()
   {
     $debug_cmd
 
-    func_quote_arg pretty "$2"
-    eval "$1=\$$1\\ \$func_quote_arg_result"
+    func_quote_for_eval "$2"
+    eval "$1=\$$1\\ \$func_quote_for_eval_result"
   }
 fi
 
@@ -1099,199 +1091,85 @@ func_relative_path ()
 }
 
 
-# func_quote_portable EVAL ARG
-# ----------------------------
-# Internal function to portably implement func_quote_arg.  Note that we still
-# keep attention to performance here so we as much as possible try to avoid
-# calling sed binary (so far O(N) complexity as long as func_append is O(1)).
-func_quote_portable ()
+# func_quote_for_eval ARG...
+# --------------------------
+# Aesthetically quote ARGs to be evaled later.
+# This function returns two values:
+#   i) func_quote_for_eval_result
+#      double-quoted, suitable for a subsequent eval
+#  ii) func_quote_for_eval_unquoted_result
+#      has all characters that are still active within double
+#      quotes backslashified.
+func_quote_for_eval ()
 {
     $debug_cmd
 
-    func_quote_portable_result=$2
-
-    # one-time-loop (easy break)
-    while true
-    do
-      if $1; then
-        func_quote_portable_result=`$ECHO "$2" | $SED \
-          -e "$sed_double_quote_subst" -e "$sed_double_backslash"`
-        break
-      fi
-
-      # Quote for eval.
-      case $func_quote_portable_result in
+    func_quote_for_eval_unquoted_result=
+    func_quote_for_eval_result=
+    while test 0 -lt $#; do
+      case $1 in
         *[\\\`\"\$]*)
-          case $func_quote_portable_result in
-            *[\[\*\?]*)
-              func_quote_portable_result=`$ECHO "$func_quote_portable_result" \
-                  | $SED "$sed_quote_subst"`
-              break
-              ;;
-          esac
+         _G_unquoted_arg=`printf '%s\n' "$1" |$SED "$sed_quote_subst"` ;;
+        *)
+          _G_unquoted_arg=$1 ;;
+      esac
+      if test -n "$func_quote_for_eval_unquoted_result"; then
+       func_append func_quote_for_eval_unquoted_result " $_G_unquoted_arg"
+      else
+        func_append func_quote_for_eval_unquoted_result "$_G_unquoted_arg"
+      fi
 
-          func_quote_portable_old_IFS=$IFS
-          for _G_char in '\' '`' '"' '$'
-          do
-            # STATE($1) PREV($2) SEPARATOR($3)
-            set start "" ""
-            func_quote_portable_result=dummy"$_G_char$func_quote_portable_result$_G_char"dummy
-            IFS=$_G_char
-            for _G_part in $func_quote_portable_result
-            do
-              case $1 in
-              quote)
-                func_append func_quote_portable_result "$3$2"
-                set quote "$_G_part" "\\$_G_char"
-                ;;
-              start)
-                set first "" ""
-                func_quote_portable_result=
-                ;;
-              first)
-                set quote "$_G_part" ""
-                ;;
-              esac
-            done
-          done
-          IFS=$func_quote_portable_old_IFS
+      case $_G_unquoted_arg in
+        # Double-quote args containing shell metacharacters to delay
+        # word splitting, command substitution and variable expansion
+        # for a subsequent eval.
+        # Many Bourne shells cannot handle close brackets correctly
+        # in scan sets, so we specify it separately.
+        *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \  ]*|*]*|"")
+          _G_quoted_arg=\"$_G_unquoted_arg\"
           ;;
-        *) ;;
+        *)
+          _G_quoted_arg=$_G_unquoted_arg
+         ;;
       esac
-      break
-    done
 
-    func_quote_portable_unquoted_result=$func_quote_portable_result
-    case $func_quote_portable_result in
-      # double-quote args containing shell metacharacters to delay
-      # word splitting, command substitution and variable expansion
-      # for a subsequent eval.
-      # many bourne shells cannot handle close brackets correctly
-      # in scan sets, so we specify it separately.
-      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \    ]*|*]*|"")
-        func_quote_portable_result=\"$func_quote_portable_result\"
-        ;;
-    esac
+      if test -n "$func_quote_for_eval_result"; then
+       func_append func_quote_for_eval_result " $_G_quoted_arg"
+      else
+        func_append func_quote_for_eval_result "$_G_quoted_arg"
+      fi
+      shift
+    done
 }
 
 
-# func_quotefast_eval ARG
-# -----------------------
-# Quote one ARG (internal).  This is equivalent to 'func_quote_arg eval ARG',
-# but optimized for speed.  Result is stored in $func_quotefast_eval.
-if test xyes = `(x=; printf -v x %q yes; echo x"$x") 2>/dev/null`; then
-  printf -v _GL_test_printf_tilde %q '~'
-  if test '\~' = "$_GL_test_printf_tilde"; then
-    func_quotefast_eval ()
-    {
-      printf -v func_quotefast_eval_result %q "$1"
-    }
-  else
-    # Broken older Bash implementations.  Make those faster too if possible.
-    func_quotefast_eval ()
-    {
-      case $1 in
-        '~'*)
-          func_quote_portable false "$1"
-          func_quotefast_eval_result=$func_quote_portable_result
-          ;;
-        *)
-          printf -v func_quotefast_eval_result %q "$1"
-          ;;
-      esac
-    }
-  fi
-else
-  func_quotefast_eval ()
-  {
-    func_quote_portable false "$1"
-    func_quotefast_eval_result=$func_quote_portable_result
-  }
-fi
-
+# func_quote_for_expand ARG
+# -------------------------
+# Aesthetically quote ARG to be evaled later; same as above,
+# but do not quote variable references.
+func_quote_for_expand ()
+{
+    $debug_cmd
 
-# func_quote_arg MODEs ARG
-# ------------------------
-# Quote one ARG to be evaled later.  MODEs argument may contain zero or more
-# specifiers listed below separated by ',' character.  This function returns two
-# values:
-#   i) func_quote_arg_result
-#      double-quoted (when needed), suitable for a subsequent eval
-#  ii) func_quote_arg_unquoted_result
-#      has all characters that are still active within double
-#      quotes backslashified.  Available only if 'unquoted' is specified.
-#
-# Available modes:
-# ----------------
-# 'eval' (default)
-#       - escape shell special characters
-# 'expand'
-#       - the same as 'eval';  but do not quote variable references
-# 'pretty'
-#       - request aesthetic output, i.e. '"a b"' instead of 'a\ b'.  This might
-#         be used later in func_quote to get output like: 'echo "a b"' instead
-#         of 'echo a\ b'.  This is slower than default on some shells.
-# 'unquoted'
-#       - produce also $func_quote_arg_unquoted_result which does not contain
-#         wrapping double-quotes.
-#
-# Examples for 'func_quote_arg pretty,unquoted string':
-#
-#   string      | *_result              | *_unquoted_result
-#   ------------+-----------------------+-------------------
-#   "           | \"                    | \"
-#   a b         | "a b"                 | a b
-#   "a b"       | "\"a b\""             | \"a b\"
-#   *           | "*"                   | *
-#   z="${x-$y}" | "z=\"\${x-\$y}\""     | z=\"\${x-\$y}\"
-#
-# Examples for 'func_quote_arg pretty,unquoted,expand string':
-#
-#   string        |   *_result          |  *_unquoted_result
-#   --------------+---------------------+--------------------
-#   z="${x-$y}"   | "z=\"${x-$y}\""     | z=\"${x-$y}\"
-func_quote_arg ()
-{
-    _G_quote_expand=false
-    case ,$1, in
-      *,expand,*)
-        _G_quote_expand=:
-        ;;
+    case $1 in
+      *[\\\`\"]*)
+       _G_arg=`$ECHO "$1" | $SED \
+           -e "$sed_double_quote_subst" -e "$sed_double_backslash"` ;;
+      *)
+        _G_arg=$1 ;;
     esac
 
-    case ,$1, in
-      *,pretty,*|*,expand,*|*,unquoted,*)
-        func_quote_portable $_G_quote_expand "$2"
-        func_quote_arg_result=$func_quote_portable_result
-        func_quote_arg_unquoted_result=$func_quote_portable_unquoted_result
-        ;;
-      *)
-        # Faster quote-for-eval for some shells.
-        func_quotefast_eval "$2"
-        func_quote_arg_result=$func_quotefast_eval_result
+    case $_G_arg in
+      # Double-quote args containing shell metacharacters to delay
+      # word splitting and command substitution for a subsequent eval.
+      # Many Bourne shells cannot handle close brackets correctly
+      # in scan sets, so we specify it separately.
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \    ]*|*]*|"")
+        _G_arg=\"$_G_arg\"
         ;;
     esac
-}
 
-
-# func_quote MODEs ARGs...
-# ------------------------
-# Quote all ARGs to be evaled later and join them into single command.  See
-# func_quote_arg's description for more info.
-func_quote ()
-{
-    $debug_cmd
-    _G_func_quote_mode=$1 ; shift
-    func_quote_result=
-    while test 0 -lt $#; do
-      func_quote_arg "$_G_func_quote_mode" "$1"
-      if test -n "$func_quote_result"; then
-        func_append func_quote_result " $func_quote_arg_result"
-      else
-        func_append func_quote_result "$func_quote_arg_result"
-      fi
-      shift
-    done
+    func_quote_for_expand_result=$_G_arg
 }
 
 
@@ -1337,8 +1215,8 @@ func_show_eval ()
     _G_cmd=$1
     _G_fail_exp=${2-':'}
 
-    func_quote_arg pretty,expand "$_G_cmd"
-    eval "func_notquiet $func_quote_arg_result"
+    func_quote_for_expand "$_G_cmd"
+    eval "func_notquiet $func_quote_for_expand_result"
 
     $opt_dry_run || {
       eval "$_G_cmd"
@@ -1363,8 +1241,8 @@ func_show_eval_locale ()
     _G_fail_exp=${2-':'}
 
     $opt_quiet || {
-      func_quote_arg expand,pretty "$_G_cmd"
-      eval "func_echo $func_quote_arg_result"
+      func_quote_for_expand "$_G_cmd"
+      eval "func_echo $func_quote_for_expand_result"
     }
 
     $opt_dry_run || {
@@ -1491,26 +1369,30 @@ func_lt_ver ()
 # End:
 #! /bin/sh
 
+# Set a version string for this script.
+scriptversion=2015-10-07.11; # UTC
+
 # A portable, pluggable option parser for Bourne shell.
 # Written by Gary V. Vaughan, 2010
 
-# This is free software.  There is NO warranty; not even for
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-#
-# Copyright (C) 2010-2018 Bootstrap Authors
-#
-# This file is dual licensed under the terms of the MIT license
-# <https://opensource.org/license/MIT>, and GPL version 3 or later
-# <http://www.gnu.org/licenses/gpl-2.0.html>.  You must apply one of
-# these licenses when using or redistributing this software or any of
-# the files within it.  See the URLs above, or the file `LICENSE`
-# included in the Bootstrap distribution for the full license texts.
+# Copyright (C) 2010-2015 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
 
-# Please report bugs or propose patches to:
-# <https://github.com/gnulib-modules/bootstrap/issues>
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
 
-# Set a version string for this script.
-scriptversion=2018-07-24.06; # UTC
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# Please report bugs or propose patches to gary@gnu.org.
 
 
 ## ------ ##
@@ -1533,7 +1415,7 @@ scriptversion=2018-07-24.06; # UTC
 #
 # In order for the '--version' option to work, you will need to have a
 # suitably formatted comment like the one at the top of this file
-# starting with '# Written by ' and ending with '# Copyright'.
+# starting with '# Written by ' and ending with '# warranty; '.
 #
 # For '-h' and '--help' to work, you will also need a one line
 # description of your script's purpose in a comment directly above the
@@ -1545,7 +1427,7 @@ scriptversion=2018-07-24.06; # UTC
 # to display verbose messages only when your user has specified
 # '--verbose'.
 #
-# After sourcing this file, you can plug in processing for additional
+# After sourcing this file, you can plug processing for additional
 # options by amending the variables from the 'Configuration' section
 # below, and following the instructions in the 'Option parsing'
 # section further down.
@@ -1594,8 +1476,8 @@ fatal_help="Try '\$progname --help' for more information."
 ## ------------------------- ##
 
 # This section contains functions for adding, removing, and running hooks
-# in the main code.  A hook is just a list of function names that can be
-# run in order later on.
+# to the main code.  A hook is just a named list of of function, that can
+# be run in order later on.
 
 # func_hookable FUNC_NAME
 # -----------------------
@@ -1628,8 +1510,7 @@ func_add_hook ()
 
 # func_remove_hook FUNC_NAME HOOK_FUNC
 # ------------------------------------
-# Remove HOOK_FUNC from the list of hook functions to be called by
-# FUNC_NAME.
+# Remove HOOK_FUNC from the list of functions called by FUNC_NAME.
 func_remove_hook ()
 {
     $debug_cmd
@@ -1638,28 +1519,10 @@ func_remove_hook ()
 }
 
 
-# func_propagate_result FUNC_NAME_A FUNC_NAME_B
-# ---------------------------------------------
-# If the *_result variable of FUNC_NAME_A _is set_, assign its value to
-# *_result variable of FUNC_NAME_B.
-func_propagate_result ()
-{
-    $debug_cmd
-
-    func_propagate_result_result=:
-    if eval "test \"\${${1}_result+set}\" = set"
-    then
-      eval "${2}_result=\$${1}_result"
-    else
-      func_propagate_result_result=false
-    fi
-}
-
-
 # func_run_hooks FUNC_NAME [ARG]...
 # ---------------------------------
 # Run all hook functions registered to FUNC_NAME.
-# It's assumed that the list of hook functions contains nothing more
+# It is assumed that the list of hook functions contains nothing more
 # than a whitespace-delimited list of legal shell function names, and
 # no effort is wasted trying to catch shell meta-characters or preserve
 # whitespace.
@@ -1667,21 +1530,26 @@ func_run_hooks ()
 {
     $debug_cmd
 
+    _G_rc_run_hooks=false
+
     case " $hookable_fns " in
       *" $1 "*) ;;
-      *) func_fatal_error "'$1' does not support hook functions." ;;
+      *) func_fatal_error "'$1' does not support hook funcions.n" ;;
     esac
 
     eval _G_hook_fns=\$$1_hooks; shift
 
     for _G_hook in $_G_hook_fns; do
-      func_unset "${_G_hook}_result"
-      eval $_G_hook '${1+"$@"}'
-      func_propagate_result $_G_hook func_run_hooks
-      if $func_propagate_result_result; then
-        eval set dummy "$func_run_hooks_result"; shift
+      if eval $_G_hook '"$@"'; then
+        # store returned options list back into positional
+        # parameters for next 'cmd' execution.
+        eval _G_hook_result=\$${_G_hook}_result
+        eval set dummy "$_G_hook_result"; shift
+        _G_rc_run_hooks=:
       fi
     done
+
+    $_G_rc_run_hooks && func_run_hooks_result=$_G_hook_result
 }
 
 
@@ -1691,16 +1559,14 @@ func_run_hooks ()
 ## --------------- ##
 
 # In order to add your own option parsing hooks, you must accept the
-# full positional parameter list from your hook function.  You may remove
-# or edit any options that you action, and then pass back the remaining
-# unprocessed options in '<hooked_function_name>_result', escaped
-# suitably for 'eval'.
-#
-# The '<hooked_function_name>_result' variable is automatically unset
-# before your hook gets called; for best performance, only set the
-# *_result variable when necessary (i.e. don't call the 'func_quote'
-# function unnecessarily because it can be an expensive operation on some
-# machines).
+# full positional parameter list in your hook function, you may remove/edit
+# any options that you action, and then pass back the remaining unprocessed
+# options in '<hooked_function_name>_result', escaped suitably for
+# 'eval'.  In this case you also must return $EXIT_SUCCESS to let the
+# hook's caller know that it should pay attention to
+# '<hooked_function_name>_result'.  Returning $EXIT_FAILURE signalizes that
+# arguments are left untouched by the hook and therefore caller will ignore the
+# result variable.
 #
 # Like this:
 #
@@ -1712,8 +1578,11 @@ func_run_hooks ()
 #        usage_message=$usage_message'
 #      -s, --silent       don'\''t print informational messages
 #    '
-#        # No change in '$@' (ignored completely by this hook).  Leave
-#        # my_options_prep_result variable intact.
+#        # No change in '$@' (ignored completely by this hook).  There is
+#        # no need to do the equivalent (but slower) action:
+#        # func_quote_for_eval ${1+"$@"}
+#        # my_options_prep_result=$func_quote_for_eval_result
+#        false
 #    }
 #    func_add_hook func_options_prep my_options_prep
 #
@@ -1724,7 +1593,7 @@ func_run_hooks ()
 #
 #        args_changed=false
 #
-#        # Note that, for efficiency, we parse as many options as we can
+#        # Note that for efficiency, we parse as many options as we can
 #        # recognise in a loop before passing the remainder back to the
 #        # caller on the first unrecognised argument we encounter.
 #        while test $# -gt 0; do
@@ -1741,17 +1610,18 @@ func_run_hooks ()
 #                         args_changed=:
 #                         ;;
 #            *)           # Make sure the first unrecognised option "$_G_opt"
-#                         # is added back to "$@" in case we need it later,
-#                         # if $args_changed was set to 'true'.
+#                         # is added back to "$@", we could need that later
+#                         # if $args_changed is true.
 #                         set dummy "$_G_opt" ${1+"$@"}; shift; break ;;
 #          esac
 #        done
 #
-#        # Only call 'func_quote' here if we processed at least one argument.
 #        if $args_changed; then
-#          func_quote eval ${1+"$@"}
-#          my_silent_option_result=$func_quote_result
+#          func_quote_for_eval ${1+"$@"}
+#          my_silent_option_result=$func_quote_for_eval_result
 #        fi
+#
+#        $args_changed
 #    }
 #    func_add_hook func_parse_options my_silent_option
 #
@@ -1762,6 +1632,8 @@ func_run_hooks ()
 #
 #        $opt_silent && $opt_verbose && func_fatal_help "\
 #    '--silent' and '--verbose' options are mutually exclusive."
+#
+#        false
 #    }
 #    func_add_hook func_validate_options my_option_validation
 #
@@ -1777,8 +1649,13 @@ func_options_finish ()
 {
     $debug_cmd
 
-    func_run_hooks func_options ${1+"$@"}
-    func_propagate_result func_run_hooks func_options_finish
+    _G_func_options_finish_exit=false
+    if func_run_hooks func_options ${1+"$@"}; then
+      func_options_finish_result=$func_run_hooks_result
+      _G_func_options_finish_exit=:
+    fi
+
+    $_G_func_options_finish_exit
 }
 
 
@@ -1791,27 +1668,28 @@ func_options ()
 {
     $debug_cmd
 
-    _G_options_quoted=false
+    _G_rc_options=false
 
     for my_func in options_prep parse_options validate_options options_finish
     do
-      func_unset func_${my_func}_result
-      func_unset func_run_hooks_result
-      eval func_$my_func '${1+"$@"}'
-      func_propagate_result func_$my_func func_options
-      if $func_propagate_result_result; then
-        eval set dummy "$func_options_result"; shift
-        _G_options_quoted=:
+      if eval func_$my_func '${1+"$@"}'; then
+        eval _G_res_var='$'"func_${my_func}_result"
+        eval set dummy "$_G_res_var" ; shift
+        _G_rc_options=:
       fi
     done
 
-    $_G_options_quoted || {
-      # As we (func_options) are top-level options-parser function and
-      # nobody quoted "$@" for us yet, we need to do it explicitly for
-      # caller.
-      func_quote eval ${1+"$@"}
-      func_options_result=$func_quote_result
-    }
+    # Save modified positional parameters for caller.  As a top-level
+    # options-parser function we always need to set the 'func_options_result'
+    # variable (regardless the $_G_rc_options value).
+    if $_G_rc_options; then
+      func_options_result=$_G_res_var
+    else
+      func_quote_for_eval ${1+"$@"}
+      func_options_result=$func_quote_for_eval_result
+    fi
+
+    $_G_rc_options
 }
 
 
@@ -1821,7 +1699,8 @@ func_options ()
 # Note that when calling hook functions, we pass through the list of
 # positional parameters.  If a hook function modifies that list, and
 # needs to propagate that back to rest of this script, then the complete
-# modified list must be put in 'func_run_hooks_result' before returning.
+# modified list must be put in 'func_run_hooks_result' before
+# returning $EXIT_SUCCESS (otherwise $EXIT_FAILURE is returned).
 func_hookable func_options_prep
 func_options_prep ()
 {
@@ -1831,8 +1710,14 @@ func_options_prep ()
     opt_verbose=false
     opt_warning_types=
 
-    func_run_hooks func_options_prep ${1+"$@"}
-    func_propagate_result func_run_hooks func_options_prep
+    _G_rc_options_prep=false
+    if func_run_hooks func_options_prep ${1+"$@"}; then
+      _G_rc_options_prep=:
+      # save modified positional parameters for caller
+      func_options_prep_result=$func_run_hooks_result
+    fi
+
+    $_G_rc_options_prep
 }
 
 
@@ -1844,32 +1729,27 @@ func_parse_options ()
 {
     $debug_cmd
 
-    _G_parse_options_requote=false
+    func_parse_options_result=
+
+    _G_rc_parse_options=false
     # this just eases exit handling
     while test $# -gt 0; do
       # Defer to hook functions for initial option parsing, so they
       # get priority in the event of reusing an option name.
-      func_run_hooks func_parse_options ${1+"$@"}
-      func_propagate_result func_run_hooks func_parse_options
-      if $func_propagate_result_result; then
-        eval set dummy "$func_parse_options_result"; shift
-        # Even though we may have changed "$@", we passed the "$@" array
-        # down into the hook and it quoted it for us (because we are in
-        # this if-branch).  No need to quote it again.
-        _G_parse_options_requote=false
+      if func_run_hooks func_parse_options ${1+"$@"}; then
+        eval set dummy "$func_run_hooks_result"; shift
+        _G_rc_parse_options=:
       fi
 
       # Break out of the loop if we already parsed every option.
       test $# -gt 0 || break
 
-      # We expect that one of the options parsed in this function matches
-      # and thus we remove _G_opt from "$@" and need to re-quote.
       _G_match_parse_options=:
       _G_opt=$1
       shift
       case $_G_opt in
         --debug|-x)   debug_cmd='set -x'
-                      func_echo "enabling shell trace mode" >&2
+                      func_echo "enabling shell trace mode"
                       $debug_cmd
                       ;;
 
@@ -1880,7 +1760,7 @@ func_parse_options ()
 
         --warnings|--warning|-W)
                       if test $# = 0 && func_missing_arg $_G_opt; then
-                        _G_parse_options_requote=:
+                        _G_rc_parse_options=:
                         break
                       fi
                       case " $warning_categories $1" in
@@ -1935,7 +1815,7 @@ func_parse_options ()
                       shift
                       ;;
 
-        --)           _G_parse_options_requote=: ; break ;;
+        --)           _G_rc_parse_options=: ; break ;;
         -*)           func_fatal_help "unrecognised option: '$_G_opt'" ;;
         *)            set dummy "$_G_opt" ${1+"$@"}; shift
                       _G_match_parse_options=false
@@ -1943,16 +1823,17 @@ func_parse_options ()
                       ;;
       esac
 
-      if $_G_match_parse_options; then
-        _G_parse_options_requote=:
-      fi
+      $_G_match_parse_options && _G_rc_parse_options=:
     done
 
-    if $_G_parse_options_requote; then
+
+    if $_G_rc_parse_options; then
       # save modified positional parameters for caller
-      func_quote eval ${1+"$@"}
-      func_parse_options_result=$func_quote_result
+      func_quote_for_eval ${1+"$@"}
+      func_parse_options_result=$func_quote_for_eval_result
     fi
+
+    $_G_rc_parse_options
 }
 
 
@@ -1965,14 +1846,21 @@ func_validate_options ()
 {
     $debug_cmd
 
+    _G_rc_validate_options=false
+
     # Display all warnings if -W was not given.
     test -n "$opt_warning_types" || opt_warning_types=" $warning_categories"
 
-    func_run_hooks func_validate_options ${1+"$@"}
-    func_propagate_result func_run_hooks func_validate_options
+    if func_run_hooks func_validate_options ${1+"$@"}; then
+      # save modified positional parameters for caller
+      func_validate_options_result=$func_run_hooks_result
+      _G_rc_validate_options=:
+    fi
 
     # Bail if the options were screwed!
     $exit_cmd $EXIT_FAILURE
+
+    $_G_rc_validate_options
 }
 
 
@@ -2028,8 +1916,8 @@ func_missing_arg ()
 
 # func_split_equals STRING
 # ------------------------
-# Set func_split_equals_lhs and func_split_equals_rhs shell variables
-# after splitting STRING at the '=' sign.
+# Set func_split_equals_lhs and func_split_equals_rhs shell variables after
+# splitting STRING at the '=' sign.
 test -z "$_G_HAVE_XSI_OPS" \
     && (eval 'x=a/b/c;
       test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \
@@ -2044,9 +1932,8 @@ then
 
       func_split_equals_lhs=${1%%=*}
       func_split_equals_rhs=${1#*=}
-      if test "x$func_split_equals_lhs" = "x$1"; then
-        func_split_equals_rhs=
-      fi
+      test "x$func_split_equals_lhs" = "x$1" \
+        && func_split_equals_rhs=
   }'
 else
   # ...otherwise fall back to using expr, which is often a shell builtin.
@@ -2124,44 +2011,31 @@ func_usage_message ()
 # func_version
 # ------------
 # Echo version message to standard output and exit.
-# The version message is extracted from the calling file's header
-# comments, with leading '# ' stripped:
-#   1. First display the progname and version
-#   2. Followed by the header comment line matching  /^# Written by /
-#   3. Then a blank line followed by the first following line matching
-#      /^# Copyright /
-#   4. Immediately followed by any lines between the previous matches,
-#      except lines preceding the intervening completely blank line.
-# For example, see the header comments of this file.
 func_version ()
 {
     $debug_cmd
 
     printf '%s\n' "$progname $scriptversion"
     $SED -n '
-        /^# Written by /!b
-        s|^# ||; p; n
-
-        :fwd2blnk
-        /./ {
-          n
-          b fwd2blnk
+        /(C)/!b go
+        :more
+        /\./!{
+          N
+          s|\n# | |
+          b more
         }
-        p; n
-
-        :holdwrnt
-        s|^# ||
-        s|^# *$||
-        /^Copyright /!{
-          /./H
-          n
-          b holdwrnt
+        :go
+        /^# Written by /,/# warranty; / {
+          s|^# ||
+          s|^# *$||
+          s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2|
+          p
         }
-
-        s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2|
-        G
-        s|\(\n\)\n*|\1|g
-        p; q' < "$progpath"
+        /^# Written by / {
+          s|^# ||
+          p
+        }
+        /^warranty; /q' < "$progpath"
 
     exit $?
 }
@@ -2171,12 +2045,12 @@ func_version ()
 # mode: shell-script
 # sh-indentation: 2
 # eval: (add-hook 'before-save-hook 'time-stamp)
-# time-stamp-pattern: "30/scriptversion=%:y-%02m-%02d.%02H; # UTC"
+# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC"
 # time-stamp-time-zone: "UTC"
 # End:
 
 # Set a version string.
-scriptversion='(GNU libtool) 2.4.6.42-b88ce-dirty'
+scriptversion='(GNU libtool) 2.4.6'
 
 
 # func_echo ARG...
@@ -2267,7 +2141,7 @@ include the following information:
        compiler:       $LTCC
        compiler flags: $LTCFLAGS
        linker:         $LD (gnu? $with_gnu_ld)
-       version:        $progname (GNU libtool) 2.4.6.42-b88ce-dirty
+       version:        $progname $scriptversion Debian-2.4.6-14
        automake:       `($AUTOMAKE --version) 2>/dev/null |$SED 1q`
        autoconf:       `($AUTOCONF --version) 2>/dev/null |$SED 1q`
 
@@ -2323,7 +2197,7 @@ fi
 # a configuration failure hint, and exit.
 func_fatal_configuration ()
 {
-    func_fatal_error ${1+"$@"} \
+    func__fatal_error ${1+"$@"} \
       "See the $PACKAGE documentation for more information." \
       "Fatal configuration error."
 }
@@ -2501,9 +2375,11 @@ libtool_options_prep ()
 
     if $_G_rc_lt_options_prep; then
       # Pass back the list of options.
-      func_quote eval ${1+"$@"}
-      libtool_options_prep_result=$func_quote_result
+      func_quote_for_eval ${1+"$@"}
+      libtool_options_prep_result=$func_quote_for_eval_result
     fi
+
+    $_G_rc_lt_options_prep
 }
 func_add_hook func_options_prep libtool_options_prep
 
@@ -2606,9 +2482,11 @@ libtool_parse_options ()
 
     if $_G_rc_lt_parse_options; then
       # save modified positional parameters for caller
-      func_quote eval ${1+"$@"}
-      libtool_parse_options_result=$func_quote_result
+      func_quote_for_eval ${1+"$@"}
+      libtool_parse_options_result=$func_quote_for_eval_result
     fi
+
+    $_G_rc_lt_parse_options
 }
 func_add_hook func_parse_options libtool_parse_options
 
@@ -2665,8 +2543,8 @@ libtool_validate_options ()
     }
 
     # Pass back the unparsed argument list
-    func_quote eval ${1+"$@"}
-    libtool_validate_options_result=$func_quote_result
+    func_quote_for_eval ${1+"$@"}
+    libtool_validate_options_result=$func_quote_for_eval_result
 }
 func_add_hook func_validate_options libtool_validate_options
 
@@ -3632,8 +3510,8 @@ func_mode_compile ()
       esac
     done
 
-    func_quote_arg pretty "$libobj"
-    test "X$libobj" != "X$func_quote_arg_result" \
+    func_quote_for_eval "$libobj"
+    test "X$libobj" != "X$func_quote_for_eval_result" \
       && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"'   &()|`$[]' \
       && func_warning "libobj name '$libobj' may not contain shell special characters."
     func_dirname_and_basename "$obj" "/" ""
@@ -3706,8 +3584,8 @@ compiler."
 
     func_to_tool_file "$srcfile" func_convert_file_msys_to_w32
     srcfile=$func_to_tool_file_result
-    func_quote_arg pretty "$srcfile"
-    qsrcfile=$func_quote_arg_result
+    func_quote_for_eval "$srcfile"
+    qsrcfile=$func_quote_for_eval_result
 
     # Only build a PIC object if we are building libtool libraries.
     if test yes = "$build_libtool_libs"; then
@@ -4310,8 +4188,8 @@ func_mode_install ()
        case $nonopt in *shtool*) :;; *) false;; esac
     then
       # Aesthetically quote it.
-      func_quote_arg pretty "$nonopt"
-      install_prog="$func_quote_arg_result "
+      func_quote_for_eval "$nonopt"
+      install_prog="$func_quote_for_eval_result "
       arg=$1
       shift
     else
@@ -4321,8 +4199,8 @@ func_mode_install ()
 
     # The real first argument should be the name of the installation program.
     # Aesthetically quote it.
-    func_quote_arg pretty "$arg"
-    func_append install_prog "$func_quote_arg_result"
+    func_quote_for_eval "$arg"
+    func_append install_prog "$func_quote_for_eval_result"
     install_shared_prog=$install_prog
     case " $install_prog " in
       *[\\\ /]cp\ *) install_cp=: ;;
@@ -4379,12 +4257,12 @@ func_mode_install ()
       esac
 
       # Aesthetically quote the argument.
-      func_quote_arg pretty "$arg"
-      func_append install_prog " $func_quote_arg_result"
+      func_quote_for_eval "$arg"
+      func_append install_prog " $func_quote_for_eval_result"
       if test -n "$arg2"; then
-       func_quote_arg pretty "$arg2"
+       func_quote_for_eval "$arg2"
       fi
-      func_append install_shared_prog " $func_quote_arg_result"
+      func_append install_shared_prog " $func_quote_for_eval_result"
     done
 
     test -z "$install_prog" && \
@@ -4395,8 +4273,8 @@ func_mode_install ()
 
     if test -n "$install_override_mode" && $no_mode; then
       if $install_cp; then :; else
-       func_quote_arg pretty "$install_override_mode"
-       func_append install_shared_prog " -m $func_quote_arg_result"
+       func_quote_for_eval "$install_override_mode"
+       func_append install_shared_prog " -m $func_quote_for_eval_result"
       fi
     fi
 
@@ -4692,8 +4570,8 @@ func_mode_install ()
                relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'`
 
                $opt_quiet || {
-                 func_quote_arg expand,pretty "$relink_command"
-                 eval "func_echo $func_quote_arg_result"
+                 func_quote_for_expand "$relink_command"
+                 eval "func_echo $func_quote_for_expand_result"
                }
                if eval "$relink_command"; then :
                  else
@@ -5472,8 +5350,7 @@ else
   if test \"\$libtool_execute_magic\" != \"$magic\"; then
     file=\"\$0\""
 
-    func_quote_arg pretty "$ECHO"
-    qECHO=$func_quote_arg_result
+    qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"`
     $ECHO "\
 
 # A function that is used when there is no print builtin or printf.
@@ -5483,7 +5360,7 @@ func_fallback_echo ()
 \$1
 _LTECHO_EOF'
 }
-    ECHO=$qECHO
+    ECHO=\"$qECHO\"
   fi
 
 # Very basic option parsing. These options are (a) specific to
@@ -6826,9 +6703,9 @@ func_mode_link ()
     while test "$#" -gt 0; do
       arg=$1
       shift
-      func_quote_arg pretty,unquoted "$arg"
-      qarg=$func_quote_arg_unquoted_result
-      func_append libtool_args " $func_quote_arg_result"
+      func_quote_for_eval "$arg"
+      qarg=$func_quote_for_eval_unquoted_result
+      func_append libtool_args " $func_quote_for_eval_result"
 
       # If the previous option needs an argument, assign it.
       if test -n "$prev"; then
@@ -7426,9 +7303,9 @@ func_mode_link ()
        save_ifs=$IFS; IFS=,
        for flag in $args; do
          IFS=$save_ifs
-          func_quote_arg pretty "$flag"
-         func_append arg " $func_quote_arg_result"
-         func_append compiler_flags " $func_quote_arg_result"
+          func_quote_for_eval "$flag"
+         func_append arg " $func_quote_for_eval_result"
+         func_append compiler_flags " $func_quote_for_eval_result"
        done
        IFS=$save_ifs
        func_stripname ' ' '' "$arg"
@@ -7442,10 +7319,10 @@ func_mode_link ()
        save_ifs=$IFS; IFS=,
        for flag in $args; do
          IFS=$save_ifs
-          func_quote_arg pretty "$flag"
-         func_append arg " $wl$func_quote_arg_result"
-         func_append compiler_flags " $wl$func_quote_arg_result"
-         func_append linker_flags " $func_quote_arg_result"
+          func_quote_for_eval "$flag"
+         func_append arg " $wl$func_quote_for_eval_result"
+         func_append compiler_flags " $wl$func_quote_for_eval_result"
+         func_append linker_flags " $func_quote_for_eval_result"
        done
        IFS=$save_ifs
        func_stripname ' ' '' "$arg"
@@ -7469,8 +7346,8 @@ func_mode_link ()
 
       # -msg_* for osf cc
       -msg_*)
-       func_quote_arg pretty "$arg"
-       arg=$func_quote_arg_result
+       func_quote_for_eval "$arg"
+       arg=$func_quote_for_eval_result
        ;;
 
       # Flags to be passed through unchanged, with rationale:
@@ -7491,12 +7368,14 @@ func_mode_link ()
       # -stdlib=*            select c++ std lib with clang
       # -fsanitize=*         Clang/GCC memory and address sanitizer
       # -fuse-ld=*           Linker select flags for GCC
+      # -static-*            direct GCC to link specific libraries statically
+      # -fcilkplus           Cilk Plus language extension features for C/C++
       -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
       -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \
       -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*| \
-      -specs=*|-fsanitize=*|-fuse-ld=*)
-        func_quote_arg pretty "$arg"
-       arg=$func_quote_arg_result
+      -specs=*|-fsanitize=*|-fuse-ld=*|-static-*|-fcilkplus)
+        func_quote_for_eval "$arg"
+       arg=$func_quote_for_eval_result
         func_append compile_command " $arg"
         func_append finalize_command " $arg"
         func_append compiler_flags " $arg"
@@ -7517,15 +7396,15 @@ func_mode_link ()
          continue
         else
          # Otherwise treat like 'Some other compiler flag' below
-         func_quote_arg pretty "$arg"
-         arg=$func_quote_arg_result
+         func_quote_for_eval "$arg"
+         arg=$func_quote_for_eval_result
         fi
        ;;
 
       # Some other compiler flag.
       -* | +*)
-        func_quote_arg pretty "$arg"
-       arg=$func_quote_arg_result
+        func_quote_for_eval "$arg"
+       arg=$func_quote_for_eval_result
        ;;
 
       *.$objext)
@@ -7645,8 +7524,8 @@ func_mode_link ()
       *)
        # Unknown arguments in both finalize_command and compile_command need
        # to be aesthetically quoted because they are evaled later.
-       func_quote_arg pretty "$arg"
-       arg=$func_quote_arg_result
+       func_quote_for_eval "$arg"
+       arg=$func_quote_for_eval_result
        ;;
       esac # arg
 
@@ -7787,7 +7666,10 @@ func_mode_link ()
        case $pass in
        dlopen) libs=$dlfiles ;;
        dlpreopen) libs=$dlprefiles ;;
-       link) libs="$deplibs %DEPLIBS% $dependency_libs" ;;
+       link)
+         libs="$deplibs %DEPLIBS%"
+         test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs"
+         ;;
        esac
       fi
       if test lib,dlpreopen = "$linkmode,$pass"; then
@@ -8106,19 +7988,19 @@ func_mode_link ()
            # It is a libtool convenience library, so add in its objects.
            func_append convenience " $ladir/$objdir/$old_library"
            func_append old_convenience " $ladir/$objdir/$old_library"
+           tmp_libs=
+           for deplib in $dependency_libs; do
+             deplibs="$deplib $deplibs"
+             if $opt_preserve_dup_deps; then
+               case "$tmp_libs " in
+               *" $deplib "*) func_append specialdeplibs " $deplib" ;;
+               esac
+             fi
+             func_append tmp_libs " $deplib"
+           done
          elif test prog != "$linkmode" && test lib != "$linkmode"; then
            func_fatal_error "'$lib' is not a convenience library"
          fi
-         tmp_libs=
-         for deplib in $dependency_libs; do
-           deplibs="$deplib $deplibs"
-           if $opt_preserve_dup_deps; then
-             case "$tmp_libs " in
-             *" $deplib "*) func_append specialdeplibs " $deplib" ;;
-             esac
-           fi
-           func_append tmp_libs " $deplib"
-         done
          continue
        fi # $pass = conv
 
@@ -9042,6 +8924,9 @@ func_mode_link ()
            revision=$number_minor
            lt_irix_increment=no
            ;;
+         *)
+           func_fatal_configuration "$modename: unknown library version type '$version_type'"
+           ;;
          esac
          ;;
        no)
@@ -10152,8 +10037,8 @@ EOF
            for cmd in $concat_cmds; do
              IFS=$save_ifs
              $opt_quiet || {
-                 func_quote_arg expand,pretty "$cmd"
-                 eval "func_echo $func_quote_arg_result"
+                 func_quote_for_expand "$cmd"
+                 eval "func_echo $func_quote_for_expand_result"
              }
              $opt_dry_run || eval "$cmd" || {
                lt_exit=$?
@@ -10246,8 +10131,8 @@ EOF
          eval cmd=\"$cmd\"
          IFS=$save_ifs
          $opt_quiet || {
-           func_quote_arg expand,pretty "$cmd"
-           eval "func_echo $func_quote_arg_result"
+           func_quote_for_expand "$cmd"
+           eval "func_echo $func_quote_for_expand_result"
          }
          $opt_dry_run || eval "$cmd" || {
            lt_exit=$?
@@ -10721,13 +10606,12 @@ EOF
          elif eval var_value=\$$var; test -z "$var_value"; then
            relink_command="$var=; export $var; $relink_command"
          else
-           func_quote_arg pretty "$var_value"
-           relink_command="$var=$func_quote_arg_result; export $var; $relink_command"
+           func_quote_for_eval "$var_value"
+           relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
          fi
        done
-       func_quote eval cd "`pwd`"
-       func_quote_arg pretty,unquoted "($func_quote_result; $relink_command)"
-       relink_command=$func_quote_arg_unquoted_result
+       relink_command="(cd `pwd`; $relink_command)"
+       relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
       fi
 
       # Only actually do things if not in dry run mode.
@@ -10967,15 +10851,13 @@ EOF
        elif eval var_value=\$$var; test -z "$var_value"; then
          relink_command="$var=; export $var; $relink_command"
        else
-         func_quote_arg pretty,unquoted "$var_value"
-         relink_command="$var=$func_quote_arg_unquoted_result; export $var; $relink_command"
+         func_quote_for_eval "$var_value"
+         relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
        fi
       done
       # Quote the link command for shipping.
-      func_quote eval cd "`pwd`"
-      relink_command="($func_quote_result; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
-      func_quote_arg pretty,unquoted "$relink_command"
-      relink_command=$func_quote_arg_unquoted_result
+      relink_command="(cd `pwd`; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
+      relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
       if test yes = "$hardcode_automatic"; then
        relink_command=
       fi
index 2b73e38..a6d21ae 100644 (file)
@@ -1,6 +1,6 @@
 # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
 #
-#   Copyright (C) 1996-2001, 2003-2018 Free Software Foundation, Inc.
+#   Copyright (C) 1996-2001, 2003-2015 Free Software Foundation, Inc.
 #   Written by Gordon Matzigkeit, 1996
 #
 # This file is free software; the Free Software Foundation gives
@@ -219,8 +219,8 @@ esac
 ofile=libtool
 can_build_shared=yes
 
-# All known linkers require a '.a' archive for static linking (except MSVC and
-# ICC, which need '.lib').
+# All known linkers require a '.a' archive for static linking (except MSVC,
+# which needs '.lib').
 libext=a
 
 with_gnu_ld=$lt_cv_prog_gnu_ld
@@ -1041,8 +1041,8 @@ int forced_loaded() { return 2;}
 _LT_EOF
       echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD
       $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD
-      echo "$AR $AR_FLAGS libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD
-      $AR $AR_FLAGS libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD
+      echo "$AR cr libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD
+      $AR cr libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD
       echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD
       $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD
       cat > conftest.c << _LT_EOF
@@ -1492,22 +1492,9 @@ need_locks=$enable_libtool_lock
 m4_defun([_LT_PROG_AR],
 [AC_CHECK_TOOLS(AR, [ar], false)
 : ${AR=ar}
+: ${AR_FLAGS=cr}
 _LT_DECL([], [AR], [1], [The archiver])
-
-# Use ARFLAGS variable as AR's operation code to sync the variable naming with
-# Automake.  If both AR_FLAGS and ARFLAGS are specified, AR_FLAGS should have
-# higher priority because thats what people were doing historically (setting
-# ARFLAGS for automake and AR_FLAGS for libtool).  FIXME: Make the AR_FLAGS
-# variable obsoleted/removed.
-
-test ${AR_FLAGS+y} || AR_FLAGS=${ARFLAGS-cr}
-lt_ar_flags=$AR_FLAGS
-_LT_DECL([], [lt_ar_flags], [0], [Flags to create an archive (by configure)])
-
-# Make AR_FLAGS overridable by 'make ARFLAGS='.  Don't try to run-time override
-# by AR_FLAGS because that was never working and AR_FLAGS is about to die.
-_LT_DECL([], [AR_FLAGS], [\@S|@{ARFLAGS-"\@S|@lt_ar_flags"}],
-         [Flags to create an archive])
+_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive])
 
 AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file],
   [lt_cv_ar_at_file=no
@@ -2219,35 +2206,26 @@ m4_defun([_LT_CMD_STRIPLIB],
 striplib=
 old_striplib=
 AC_MSG_CHECKING([whether stripping libraries is possible])
-if test -z "$STRIP"; then
-  AC_MSG_RESULT([no])
+if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+  AC_MSG_RESULT([yes])
 else
-  if $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
-    old_striplib="$STRIP --strip-debug"
-    striplib="$STRIP --strip-unneeded"
-    AC_MSG_RESULT([yes])
-  else
-    case $host_os in
-    darwin*)
-      # FIXME - insert some real tests, host_os isn't really good enough
+# FIXME - insert some real tests, host_os isn't really good enough
+  case $host_os in
+  darwin*)
+    if test -n "$STRIP"; then
       striplib="$STRIP -x"
       old_striplib="$STRIP -S"
       AC_MSG_RESULT([yes])
-      ;;
-    freebsd*)
-      if $STRIP -V 2>&1 | $GREP "elftoolchain" >/dev/null; then
-        old_striplib="$STRIP --strip-debug"
-        striplib="$STRIP --strip-unneeded"
-        AC_MSG_RESULT([yes])
-      else
-        AC_MSG_RESULT([no])
-      fi
-      ;;
-    *)
+    else
       AC_MSG_RESULT([no])
-      ;;
-    esac
-  fi
+    fi
+    ;;
+  *)
+    AC_MSG_RESULT([no])
+    ;;
+  esac
 fi
 _LT_DECL([], [old_striplib], [1], [Commands to strip libraries])
 _LT_DECL([], [striplib], [1])
@@ -2586,8 +2564,8 @@ m4_if([$1], [],[
     dynamic_linker='Win32 ld.exe'
     ;;
 
-  *,cl* | *,icl*)
-    # Native MSVC or ICC
+  *,cl*)
+    # Native MSVC
     libname_spec='$name'
     soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
     library_names_spec='$libname.dll.lib'
@@ -2643,7 +2621,7 @@ m4_if([$1], [],[
     ;;
 
   *)
-    # Assume MSVC and ICC wrapper
+    # Assume MSVC wrapper
     library_names_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext $libname.lib'
     dynamic_linker='Win32 ld.exe'
     ;;
@@ -2908,6 +2886,18 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
   dynamic_linker='GNU/Linux ld.so'
   ;;
 
+netbsdelf*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='NetBSD ld.elf_so'
+  ;;
+
 netbsd*)
   version_type=sunos
   need_lib_prefix=no
@@ -3567,7 +3557,7 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
   lt_cv_deplibs_check_method=pass_all
   ;;
 
-netbsd*)
+netbsd* | netbsdelf*-gnu)
   if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
     lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
   else
@@ -4031,7 +4021,7 @@ for ac_symprfx in "" "_"; do
   if test "$lt_cv_nm_interface" = "MS dumpbin"; then
     # Fake it for dumpbin and say T for any non-static function,
     # D for any global variable and I for any imported variable.
-    # Also find C++ and __fastcall symbols from MSVC++ or ICC,
+    # Also find C++ and __fastcall symbols from MSVC++,
     # which start with @ or ?.
     lt_cv_sys_global_symbol_pipe="$AWK ['"\
 "     {last_section=section; section=\$ 3};"\
@@ -4073,7 +4063,8 @@ _LT_EOF
   if AC_TRY_EVAL(ac_compile); then
     # Now try to grab the symbols.
     nlist=conftest.nm
-    if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then
+    $ECHO "$as_me:$LINENO: $NM conftest.$ac_objext | $lt_cv_sys_global_symbol_pipe > $nlist" >&AS_MESSAGE_LOG_FD
+    if eval "$NM" conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist 2>&AS_MESSAGE_LOG_FD && test -s "$nlist"; then
       # Try sorting and uniquifying the output.
       if sort "$nlist" | uniq > "$nlist"T; then
        mv -f "$nlist"T "$nlist"
@@ -4445,7 +4436,7 @@ m4_if([$1], [CXX], [
            ;;
        esac
        ;;
-      netbsd*)
+      netbsd* | netbsdelf*-gnu)
        ;;
       *qnx* | *nto*)
         # QNX uses GNU C++, but need to define -shared option too, otherwise
@@ -4713,6 +4704,12 @@ m4_if([$1], [CXX], [
        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
        _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
         ;;
+      # flang / f18. f95 an alias for gfortran or flang on Debian
+      flang* | f18* | f95*)
+       _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+       _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+       _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+        ;;
       # icc used to be incompatible with GCC.
       # ICC 10 doesn't accept -KPIC any more.
       icc* | ifort*)
@@ -4940,7 +4937,7 @@ m4_if([$1], [CXX], [
     if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
       _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
     else
-      _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
+      _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
     fi
     ;;
   pw32*)
@@ -4948,7 +4945,7 @@ m4_if([$1], [CXX], [
     ;;
   cygwin* | mingw* | cegcc*)
     case $cc_basename in
-    cl* | icl*)
+    cl*)
       _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
       ;;
     *)
@@ -4957,6 +4954,9 @@ m4_if([$1], [CXX], [
       ;;
     esac
     ;;
+  linux* | k*bsd*-gnu | gnu*)
+    _LT_TAGVAR(link_all_deplibs, $1)=no
+    ;;
   *)
     _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
     ;;
@@ -5005,20 +5005,23 @@ dnl Note also adjust exclude_expsyms for C++ above.
 
   case $host_os in
   cygwin* | mingw* | pw32* | cegcc*)
-    # FIXME: the MSVC++ and ICC port hasn't been tested in a loooong time
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
     # When not using gcc, we currently assume that we are using
-    # Microsoft Visual C++ or Intel C++ Compiler.
+    # Microsoft Visual C++.
     if test yes != "$GCC"; then
       with_gnu_ld=no
     fi
     ;;
   interix*)
-    # we just hope/assume this is gcc and not c89 (= MSVC++ or ICC)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
     with_gnu_ld=yes
     ;;
   openbsd* | bitrig*)
     with_gnu_ld=no
     ;;
+  linux* | k*bsd*-gnu | gnu*)
+    _LT_TAGVAR(link_all_deplibs, $1)=no
+    ;;
   esac
 
   _LT_TAGVAR(ld_shlibs, $1)=yes
@@ -5177,7 +5180,6 @@ _LT_EOF
        emximp -o $lib $output_objdir/$libname.def'
       _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
       _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
-      _LT_TAGVAR(file_list_spec, $1)='@'
       ;;
 
     interix[[3-9]]*)
@@ -5274,7 +5276,7 @@ _LT_EOF
       fi
       ;;
 
-    netbsd*)
+    netbsd* | netbsdelf*-gnu)
       if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
        _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
        wlarc=
@@ -5395,7 +5397,7 @@ _LT_EOF
        if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
          _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
        else
-         _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
+         _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
        fi
        aix_use_runtimelinking=no
 
@@ -5578,12 +5580,12 @@ _LT_EOF
 
     cygwin* | mingw* | pw32* | cegcc*)
       # When not using gcc, we currently assume that we are using
-      # Microsoft Visual C++ or Intel C++ Compiler.
+      # Microsoft Visual C++.
       # hardcode_libdir_flag_spec is actually meaningless, as there is
       # no search path for DLLs.
       case $cc_basename in
-      cl* | icl*)
-       # Native MSVC or ICC
+      cl*)
+       # Native MSVC
        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
        _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
        _LT_TAGVAR(always_export_symbols, $1)=yes
@@ -5624,7 +5626,7 @@ _LT_EOF
           fi'
        ;;
       *)
-       # Assume MSVC and ICC wrapper
+       # Assume MSVC wrapper
        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
        _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
        # Tell ltmain to make .lib files, not .a files.
@@ -5795,6 +5797,7 @@ _LT_EOF
        if test yes = "$lt_cv_irix_exported_symbol"; then
           _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib'
        fi
+       _LT_TAGVAR(link_all_deplibs, $1)=no
       else
        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib'
@@ -5816,7 +5819,7 @@ _LT_EOF
       esac
       ;;
 
-    netbsd*)
+    netbsd* | netbsdelf*-gnu)
       if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
        _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
       else
@@ -5883,7 +5886,6 @@ _LT_EOF
        emximp -o $lib $output_objdir/$libname.def'
       _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
       _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
-      _LT_TAGVAR(file_list_spec, $1)='@'
       ;;
 
     osf3*)
@@ -6443,7 +6445,7 @@ if test yes != "$_lt_caught_CXX_error"; then
       # Commands to make compiler produce verbose output that lists
       # what "hidden" libraries, object files and flags are used when
       # linking a shared library.
-      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"'
 
     else
       GXX=no
@@ -6654,8 +6656,8 @@ if test yes != "$_lt_caught_CXX_error"; then
 
       cygwin* | mingw* | pw32* | cegcc*)
        case $GXX,$cc_basename in
-       ,cl* | no,cl* | ,icl* | no,icl*)
-         # Native MSVC or ICC
+       ,cl* | no,cl*)
+         # Native MSVC
          # hardcode_libdir_flag_spec is actually meaningless, as there is
          # no search path for DLLs.
          _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
@@ -6753,7 +6755,6 @@ if test yes != "$_lt_caught_CXX_error"; then
          emximp -o $lib $output_objdir/$libname.def'
        _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
        _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
-       _LT_TAGVAR(file_list_spec, $1)='@'
        ;;
 
       dgux*)
@@ -6819,7 +6820,7 @@ if test yes != "$_lt_caught_CXX_error"; then
             # explicitly linking system object files so we need to strip them
             # from the output so that they don't get included in the library
             # dependencies.
-            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP " \-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
             ;;
           *)
             if test yes = "$GXX"; then
@@ -6884,7 +6885,7 @@ if test yes != "$_lt_caught_CXX_error"; then
            # explicitly linking system object files so we need to strip them
            # from the output so that they don't get included in the library
            # dependencies.
-           output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+           output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP " \-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
            ;;
           *)
            if test yes = "$GXX"; then
@@ -7223,7 +7224,7 @@ if test yes != "$_lt_caught_CXX_error"; then
              # Commands to make compiler produce verbose output that lists
              # what "hidden" libraries, object files and flags are used when
              # linking a shared library.
-             output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+             output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"'
 
            else
              # FIXME: insert proper C++ library support
@@ -7307,7 +7308,7 @@ if test yes != "$_lt_caught_CXX_error"; then
                # Commands to make compiler produce verbose output that lists
                # what "hidden" libraries, object files and flags are used when
                # linking a shared library.
-               output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+               output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"'
              else
                # g++ 2.7 appears to require '-G' NOT '-shared' on this
                # platform.
@@ -7318,7 +7319,7 @@ if test yes != "$_lt_caught_CXX_error"; then
                # Commands to make compiler produce verbose output that lists
                # what "hidden" libraries, object files and flags are used when
                # linking a shared library.
-               output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+               output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"'
              fi
 
              _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $wl$libdir'
index 07421d9..94b0829 100644 (file)
@@ -1,6 +1,6 @@
 # Helper functions for option handling.                    -*- Autoconf -*-
 #
-#   Copyright (C) 2004-2005, 2007-2009, 2011-2018 Free Software
+#   Copyright (C) 2004-2005, 2007-2009, 2011-2015 Free Software
 #   Foundation, Inc.
 #   Written by Gary V. Vaughan, 2004
 #
index 3985c56..48bc934 100644 (file)
@@ -1,6 +1,6 @@
 # ltsugar.m4 -- libtool m4 base layer.                         -*-Autoconf-*-
 #
-# Copyright (C) 2004-2005, 2007-2008, 2011-2018 Free Software
+# Copyright (C) 2004-2005, 2007-2008, 2011-2015 Free Software
 # Foundation, Inc.
 # Written by Gary V. Vaughan, 2004
 #
index 7f9a3ad..fa04b52 100644 (file)
@@ -1,6 +1,6 @@
 # ltversion.m4 -- version numbers                      -*- Autoconf -*-
 #
-#   Copyright (C) 2004, 2011-2018 Free Software Foundation, Inc.
+#   Copyright (C) 2004, 2011-2015 Free Software Foundation, Inc.
 #   Written by Scott James Remnant, 2004
 #
 # This file is free software; the Free Software Foundation gives
@@ -9,15 +9,15 @@
 
 # @configure_input@
 
-# serial 4221 ltversion.m4
+# serial 4179 ltversion.m4
 # This file is part of GNU Libtool
 
-m4_define([LT_PACKAGE_VERSION], [2.4.6.42-b88ce-dirty])
-m4_define([LT_PACKAGE_REVISION], [2.4.6.42])
+m4_define([LT_PACKAGE_VERSION], [2.4.6])
+m4_define([LT_PACKAGE_REVISION], [2.4.6])
 
 AC_DEFUN([LTVERSION_VERSION],
-[macro_version='2.4.6.42-b88ce-dirty'
-macro_revision='2.4.6.42'
+[macro_version='2.4.6'
+macro_revision='2.4.6'
 _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
 _LT_DECL(, macro_revision, 0)
 ])
index 54ea1c4..c6b26f8 100644 (file)
@@ -1,6 +1,6 @@
 # lt~obsolete.m4 -- aclocal satisfying obsolete definitions.    -*-Autoconf-*-
 #
-#   Copyright (C) 2004-2005, 2007, 2009, 2011-2018 Free Software
+#   Copyright (C) 2004-2005, 2007, 2009, 2011-2015 Free Software
 #   Foundation, Inc.
 #   Written by Scott James Remnant, 2004.
 #
diff --git a/meson-cc-tests/intel-atomic-primitives-test.c b/meson-cc-tests/intel-atomic-primitives-test.c
deleted file mode 100644 (file)
index a5c8040..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-void memory_barrier (void) { __sync_synchronize (); }
-int atomic_add (int *i) { return __sync_fetch_and_add (i, 1); }
-int mutex_trylock (int *m) { return __sync_lock_test_and_set (m, 1); }
-void mutex_unlock (int *m) { __sync_lock_release (m); }
-
-int main(void) { return 0;}
diff --git a/meson-cc-tests/solaris-atomic-operations.c b/meson-cc-tests/solaris-atomic-operations.c
deleted file mode 100644 (file)
index fae0acd..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <atomic.h>
-/* This requires Solaris Studio 12.2 or newer: */
-#include <mbarrier.h>
-void memory_barrier (void) { __machine_rw_barrier (); }
-int atomic_add (volatile unsigned *i) { return atomic_add_int_nv (i, 1); }
-void *atomic_ptr_cmpxchg (volatile void **target, void *cmp, void *newval) { return atomic_cas_ptr (target, cmp, newval); }
-
-int main(void) { return 0; }
index 65d3192..3e64cba 100644 (file)
@@ -1,9 +1,12 @@
 project('harfbuzz', 'c', 'cpp',
-  meson_version: '>= 0.53.0',
-  default_options : ['cpp_std=c++11'],
-  version: '2.6.7')
-
-warning('Meson is not our main build system yet, don\'t use it for packaging HarfBuzz for *nix distros for now')
+  meson_version: '>= 0.55.0',
+  version: '3.4.0',
+  default_options: [
+    'cpp_rtti=false',       # Just to support msvc, we are passing -fno-exceptions also anyway
+    'cpp_std=c++11',
+    'wrap_mode=nofallback', # Use --wrap-mode=default to revert, https://github.com/harfbuzz/harfbuzz/pull/2548
+  ],
+)
 
 hb_version_arr = meson.project_version().split('.')
 hb_version_major = hb_version_arr[0].to_int()
@@ -12,17 +15,11 @@ hb_version_micro = hb_version_arr[2].to_int()
 
 # libtool versioning
 hb_version_int = hb_version_major*10000 + hb_version_minor*100 + hb_version_micro
-if hb_version_minor % 2 == 1
-  hb_libtool_revision = 0                # for unstable releases
-else
-  hb_libtool_revision = hb_version_micro # for stable releases
-endif
-hb_libtool_age = hb_version_int - hb_libtool_revision
-hb_libtool_current = hb_libtool_age
-hb_libtool_version_info = '@0@:@1@:@2@'.format(hb_libtool_current, hb_libtool_revision, hb_libtool_age)
+hb_libtool_version_info = '@0@:0:@0@'.format(hb_version_int)
 
 pkgmod = import('pkgconfig')
 cpp = meson.get_compiler('cpp')
+null_dep = dependency('', required: false)
 
 if cpp.get_id() == 'msvc'
   # Ignore several spurious warnings for things HarfBuzz does very commonly.
@@ -30,34 +27,47 @@ if cpp.get_id() == 'msvc'
   # If a warning is harmless but hard to fix, use '/woXXXX' so it's shown once
   # NOTE: Only add warnings here if you are sure they're spurious
   msvc_args = [
-      '/wd4018', # implicit signed/unsigned conversion
-      '/wd4146', # unary minus on unsigned (beware INT_MIN)
-      '/wd4244', # lossy type conversion (e.g. double -> int)
-      '/wd4305', # truncating type conversion (e.g. double -> float)
-      cpp.get_supported_arguments(['/utf-8']), # set the input encoding to utf-8
+    '/wd4018', # implicit signed/unsigned conversion
+    '/wd4146', # unary minus on unsigned (beware INT_MIN)
+    '/wd4244', # lossy type conversion (e.g. double -> int)
+    '/wd4305', # truncating type conversion (e.g. double -> float)
+    cpp.get_supported_arguments(['/utf-8']), # set the input encoding to utf-8
   ]
-  add_project_arguments(msvc_args, language : ['c', 'cpp'])
+  add_project_arguments(msvc_args, language: ['c', 'cpp'])
   # Disable SAFESEH with MSVC for libs that use external deps that are built with MinGW
   # noseh_link_args = ['/SAFESEH:NO']
+  # disable exception handling
+  add_project_arguments(['/EHs-', '/EHc-'], language: 'cpp')
 endif
 
+add_project_link_arguments(cpp.get_supported_link_arguments([
+  '-Bsymbolic-functions'
+]), language: 'c')
+
 add_project_arguments(cpp.get_supported_arguments([
-  '-fno-rtti',
   '-fno-exceptions',
+  '-fno-rtti',
   '-fno-threadsafe-statics',
-  '-fvisibility-inlines-hidden', # maybe shouldn't be applied for mingw
-]), language : 'cpp')
+  '-fvisibility-inlines-hidden',
+]), language: 'cpp')
 
 if host_machine.cpu_family() == 'arm' and cpp.alignment('struct { char c; }') != 1
   if cpp.has_argument('-mstructure-size-boundary=8')
-    add_project_arguments('-mstructure-size-boundary=8', language : 'cpp')
+    add_project_arguments('-mstructure-size-boundary=8', language: 'cpp')
   endif
 endif
 
+if host_machine.system() == 'windows'
+  add_project_arguments(cpp.get_supported_arguments([
+    '-Wa,-mbig-obj'
+  ]), language : 'cpp')
+endif
+
 check_headers = [
   ['unistd.h'],
   ['sys/mman.h'],
   ['stdbool.h'],
+  ['xlocale.h'],
 ]
 
 check_funcs = [
@@ -67,84 +77,93 @@ check_funcs = [
   ['getpagesize'],
   ['mmap'],
   ['isatty'],
-  ['roundf'],
+  ['uselocale'],
+  ['newlocale'],
 ]
 
-freetype_dep = dependency('freetype2', required: false)
+m_dep = cpp.find_library('m', required: false)
+
+freetype_dep = null_dep
+if not get_option('freetype').disabled()
+  freetype_dep = dependency('freetype2', required: false)
 
-if not freetype_dep.found() and cpp.get_id() == 'msvc'
-  if cpp.has_header('ft2build.h')
+  if (not freetype_dep.found() and
+      cpp.get_id() == 'msvc' and
+      cpp.has_header('ft2build.h'))
     freetype_dep = cpp.find_library('freetype', required: false)
   endif
-endif
 
-if not freetype_dep.found() and get_option('freetype').enabled()
-  freetype_dep = dependency('freetype2', fallback: ['freetype2', 'freetype_dep'])
-endif
-
-glib_dep = dependency('glib-2.0', required: get_option('glib'),
-                      fallback: ['glib', 'libglib_dep'])
-gobject_dep = dependency('gobject-2.0', required: get_option('gobject'),
-                         fallback: ['glib', 'libgobject_dep'])
-cairo_dep = dependency('cairo', required: false)
-fontconfig_dep = dependency('fontconfig', required: get_option('fontconfig'),
-                            fallback: ['fontconfig', 'fontconfig_dep'])
-graphite2_dep = dependency('graphite2', required: get_option('graphite'))
-icu_dep = dependency('icu-uc', required: false)
-m_dep = cpp.find_library('m', required: false)
-
-if not icu_dep.found() and get_option('icu').enabled()
-  icu_dep = dependency('icu-uc', required: cpp.get_id() != 'msvc')
+  if not freetype_dep.found()
+    # https://github.com/harfbuzz/harfbuzz/pull/2498
+    freetype_dep = dependency('freetype2', required: get_option('freetype'),
+                              default_options: ['harfbuzz=disabled'])
+  endif
 endif
 
-if not icu_dep.found() and cpp.get_id() == 'msvc'
-  if cpp.has_header('unicode/uchar.h') and \
-     cpp.has_header('unicode/unorm2.h') and \
-     cpp.has_header('unicode/ustring.h') and \
-     cpp.has_header('unicode/utf16.h') and \
-     cpp.has_header('unicode/uversion.h') and \
-     cpp.has_header('unicode/uscript.h')
+glib_dep = dependency('glib-2.0', required: get_option('glib'))
+gobject_dep = dependency('gobject-2.0', required: get_option('gobject'))
+graphite2_dep = dependency('graphite2', required: get_option('graphite2'))
+graphite_dep = dependency('graphite2', required: get_option('graphite'))
+
+icu_dep = null_dep
+if not get_option('icu').disabled()
+  icu_dep = dependency('icu-uc', required: false)
+
+  if (not icu_dep.found() and
+      cpp.get_id() == 'msvc' and
+      cpp.has_header('unicode/uchar.h') and
+      cpp.has_header('unicode/unorm2.h') and
+      cpp.has_header('unicode/ustring.h') and
+      cpp.has_header('unicode/utf16.h') and
+      cpp.has_header('unicode/uversion.h') and
+      cpp.has_header('unicode/uscript.h'))
     if get_option('buildtype') == 'debug'
-      icu_dep = cpp.find_library('icuucd', required: get_option('icu'))
+      icu_dep = cpp.find_library('icuucd', required: false)
     else
-      icu_dep = cpp.find_library('icuuc', required: get_option('icu'))
-    endif
-  else
-    if get_option('icu').enabled()
-      error('ICU headers and libraries must be present to build ICU support')
+      icu_dep = cpp.find_library('icuuc', required: false)
     endif
   endif
-endif
 
-if not cairo_dep.found() and cpp.get_id() == 'msvc'
-  if cpp.has_header('cairo.h')
-    cairo_dep = cpp.find_library('cairo')
+  if not icu_dep.found()
+    icu_dep = dependency('icu-uc', required: get_option('icu'))
   endif
 endif
 
-if not cairo_dep.found() and get_option('cairo').enabled()
-  cairo_dep = dependency('cairo', fallback: ['cairo', 'libcairo_dep'])
+if icu_dep.found() and icu_dep.type_name() == 'pkgconfig'
+  icu_defs = icu_dep.get_variable(pkgconfig: 'DEFS', default_value: '')
+  if icu_defs != ''
+    add_project_arguments(icu_defs, language: ['c', 'cpp'])
+  endif
 endif
 
-# Ensure that cairo-ft is fetched from the same library as cairo itself
-if cairo_dep.found()
-  if cairo_dep.type_name() == 'pkgconfig'
-    cairo_ft_dep = dependency('cairo-ft', required: get_option('cairo'))
-  else
-    if cpp.has_header('cairo-ft.h') and \
-       cpp.has_function('cairo_ft_font_face_create_for_ft_face', dependencies: cairo_dep)
+cairo_dep = null_dep
+cairo_ft_dep = null_dep
+if not get_option('cairo').disabled()
+  cairo_dep = dependency('cairo', required: false)
+  cairo_ft_dep = dependency('cairo-ft', required: false)
+
+  if (not cairo_dep.found() and
+      cpp.get_id() == 'msvc' and
+      cpp.has_header('cairo.h'))
+    cairo_dep = cpp.find_library('cairo', required: false)
+    if cairo_dep.found() and cpp.has_function('cairo_ft_font_face_create_for_ft_face',
+                                              prefix: '#include <cairo-ft.h>',
+                                              dependencies: cairo_dep)
       cairo_ft_dep = cairo_dep
-    else
-      # Not-found dependency
-      cairo_ft_dep = dependency('', required: false)
     endif
   endif
-else
-  # Not-found dependency
-  cairo_ft_dep = dependency('', required: false)
+
+  if not cairo_dep.found()
+    # Note that we don't have harfbuzz -> cairo -> freetype2 -> harfbuzz fallback
+    # dependency cycle here because we have configured freetype2 above with
+    # harfbuzz support disabled, so when cairo will lookup freetype2 dependency
+    # it will be forced to use that one.
+    cairo_dep = dependency('cairo', required: get_option('cairo'))
+    cairo_ft_dep = dependency('cairo-ft', required: get_option('cairo'))
+  endif
 endif
 
-deps = []
+chafa_dep = dependency('chafa', version: '>= 1.6.0', required: get_option('chafa'))
 
 conf = configuration_data()
 incconfig = include_directories('.')
@@ -157,33 +176,28 @@ warn_cflags = [
 
 cpp_args = cpp.get_supported_arguments(warn_cflags)
 
-if m_dep.found()
-  deps += [m_dep]
-endif
-
 if glib_dep.found()
   conf.set('HAVE_GLIB', 1)
-  deps += [glib_dep]
 endif
 
 if gobject_dep.found()
   conf.set('HAVE_GOBJECT', 1)
-  deps += [gobject_dep]
 endif
 
 if cairo_dep.found()
   conf.set('HAVE_CAIRO', 1)
-  deps += [cairo_dep]
 endif
 
 if cairo_ft_dep.found()
   conf.set('HAVE_CAIRO_FT', 1)
-  deps += [cairo_ft_dep]
 endif
 
-if graphite2_dep.found()
+if chafa_dep.found()
+  conf.set('HAVE_CHAFA', 1)
+endif
+
+if graphite2_dep.found() or graphite_dep.found()
   conf.set('HAVE_GRAPHITE2', 1)
-  deps += [graphite2_dep]
 endif
 
 if icu_dep.found()
@@ -200,7 +214,6 @@ endif
 
 if freetype_dep.found()
   conf.set('HAVE_FREETYPE', 1)
-  deps += [freetype_dep]
   check_freetype_funcs = [
     ['FT_Get_Var_Blend_Coordinates', {'deps': freetype_dep}],
     ['FT_Set_Var_Blend_Coordinates', {'deps': freetype_dep}],
@@ -217,49 +230,56 @@ if freetype_dep.found()
   endif
 endif
 
-if fontconfig_dep.found()
-  conf.set('HAVE_FONTCONFIG', 1)
-  deps += [fontconfig_dep]
-endif
-
-# GDI (uniscribe) (windows)
+gdi_uniscribe_deps = []
+# GDI (Uniscribe) (Windows)
 if host_machine.system() == 'windows' and not get_option('gdi').disabled()
-  # TODO: make nicer once we have https://github.com/mesonbuild/meson/issues/3940
-  if cpp.has_header('usp10.h') and cpp.has_header('windows.h')
-    foreach usplib : ['usp10', 'gdi32', 'rpcrt4']
-      deps += [cpp.find_library(usplib, required: true)]
-    endforeach
+  if (get_option('directwrite').enabled() and
+      not (cpp.has_header('usp10.h') and cpp.has_header('windows.h')))
+    error('GDI/Uniscribe was enabled explicitly, but required headers are missing.')
+  endif
+
+  gdi_deps_found = true
+  foreach usplib : ['usp10', 'gdi32', 'rpcrt4']
+    dep = cpp.find_library(usplib, required: get_option('gdi'))
+    gdi_deps_found = gdi_deps_found and dep.found()
+    gdi_uniscribe_deps += dep
+  endforeach
+
+  if gdi_deps_found
     conf.set('HAVE_UNISCRIBE', 1)
     conf.set('HAVE_GDI', 1)
-  elif get_option('gdi').enabled()
-    error('gdi was enabled explicitly, but some required headers are missing.')
   endif
 endif
 
-# DirectWrite (windows)
+# DirectWrite (Windows)
+directwrite_dep = null_dep
 if host_machine.system() == 'windows' and not get_option('directwrite').disabled()
-  if cpp.has_header('dwrite_1.h')
-    deps += [cpp.find_library('dwrite', required: true)]
-    conf.set('HAVE_DIRECTWRITE', 1)
-  elif get_option('directwrite').enabled()
+  if get_option('directwrite').enabled() and not cpp.has_header('dwrite_1.h')
     error('DirectWrite was enabled explicitly, but required header is missing.')
   endif
+
+  directwrite_dep = cpp.find_library('dwrite', required: get_option('directwrite'))
+
+  if directwrite_dep.found()
+    conf.set('HAVE_DIRECTWRITE', 1)
+  endif
 endif
 
-# CoreText (macOS) - FIXME: untested
+# CoreText (macOS)
+coretext_deps = []
 if host_machine.system() == 'darwin' and not get_option('coretext').disabled()
-  app_services_dep = dependency('appleframeworks', modules : ['ApplicationServices'], required: false)
+  app_services_dep = dependency('appleframeworks', modules: ['ApplicationServices'], required: false)
   if cpp.has_type('CTFontRef', prefix: '#include <ApplicationServices/ApplicationServices.h>', dependencies: app_services_dep)
-    deps += [app_services_dep]
+    coretext_deps += [app_services_dep]
     conf.set('HAVE_CORETEXT', 1)
   # On iOS CoreText and CoreGraphics are stand-alone frameworks
   # Check for a different symbol to avoid getting cached result
   else
-    coretext_dep = dependency('appleframeworks', modules : ['CoreText'], required: false)
-    coregraphics_dep = dependency('appleframeworks', modules : ['CoreGraphics'], required: false)
-    corefoundation_dep = dependency('appleframeworks', modules : ['CoreFoundation'], required: false)
+    coretext_dep = dependency('appleframeworks', modules: ['CoreText'], required: false)
+    coregraphics_dep = dependency('appleframeworks', modules: ['CoreGraphics'], required: false)
+    corefoundation_dep = dependency('appleframeworks', modules: ['CoreFoundation'], required: false)
     if cpp.has_type('CTRunRef', prefix: '#include <CoreText/CoreText.h>', dependencies: [coretext_dep, coregraphics_dep, corefoundation_dep])
-      deps += [coretext_dep, coregraphics_dep, corefoundation_dep]
+      coretext_deps += [coretext_dep, coregraphics_dep, corefoundation_dep]
       conf.set('HAVE_CORETEXT', 1)
     elif get_option('coretext').enabled()
       error('CoreText was enabled explicitly, but required headers or frameworks are missing.')
@@ -268,20 +288,15 @@ if host_machine.system() == 'darwin' and not get_option('coretext').disabled()
 endif
 
 # threads
+thread_dep = null_dep
 if host_machine.system() != 'windows'
   thread_dep = dependency('threads', required: false)
 
   if thread_dep.found()
     conf.set('HAVE_PTHREAD', 1)
-    deps += [thread_dep]
-  else
-    check_headers += ['sched.h']
-    check_funcs += ['sched_yield', {'link_with': 'rt'}]
   endif
 endif
 
-conf.set('HAVE_OT', 1)
-conf.set('HAVE_FALLBACK', 1)
 conf.set_quoted('PACKAGE_NAME', 'HarfBuzz')
 conf.set_quoted('PACKAGE_VERSION', meson.project_version())
 
@@ -293,6 +308,7 @@ foreach check : check_headers
   endif
 endforeach
 
+harfbuzz_extra_deps = []
 foreach check : check_funcs
   name = check[0]
   opts = check.get(1, {})
@@ -302,7 +318,6 @@ foreach check : check_funcs
   found = true
 
   # First try without linking
-
   found = cpp.has_function(name, dependencies: check_deps)
 
   if not found and link_withs.length() > 0
@@ -323,19 +338,11 @@ foreach check : check_funcs
   endif
 
   if found
-    deps += extra_deps
+    harfbuzz_extra_deps += extra_deps
     conf.set('HAVE_@0@'.format(name.to_upper()), 1)
   endif
 endforeach
 
-if cpp.links(files('meson-cc-tests/intel-atomic-primitives-test.c'), name: 'Intel atomics')
-  conf.set('HAVE_INTEL_ATOMIC_PRIMITIVES', 1)
-endif
-
-if cpp.links(files('meson-cc-tests/solaris-atomic-operations.c'), name: 'Solaris atomic ops')
-  conf.set('HAVE_SOLARIS_ATOMIC_OPS', 1)
-endif
-
 subdir('src')
 subdir('util')
 
@@ -343,35 +350,55 @@ if not get_option('tests').disabled()
   subdir('test')
 endif
 
-if not get_option('gtk_doc').disabled()
+if not get_option('benchmark').disabled()
+  subdir('perf')
+endif
+
+if not get_option('docs').disabled()
   subdir('docs')
 endif
 
 configure_file(output: 'config.h', configuration: conf)
 
-summary({'prefix': get_option('prefix'),
-         'bindir': get_option('bindir'),
-         'libdir': get_option('libdir'),
-         'includedir': get_option('includedir'),
-         'datadir': get_option('datadir'),
-        }, section: 'Directories')
-summary({'Builtin': true,
-         'Glib': conf.get('HAVE_GLIB', 0) == 1,
-         'ICU': conf.get('HAVE_ICU', 0) == 1,
-        }, bool_yn: true, section: 'Unicode callbacks (you want at least one)')
-summary({'FreeType': conf.get('HAVE_FREETYPE', 0) == 1,
-        }, bool_yn: true, section: 'Font callbacks (the more the merrier)')
-summary({'Cairo': conf.get('HAVE_CAIRO', 0) == 1,
-         'Fontconfig': conf.get('HAVE_FONTCONFIG', 0) == 1,
-        }, bool_yn: true, section: 'Tools used for command-line utilities')
-summary({'Graphite2': conf.get('HAVE_GRAPHITE2', 0) == 1,
-        }, bool_yn: true, section: 'Additional shapers (the more the merrier)')
-summary({'CoreText': conf.get('HAVE_CORETEXT', 0) == 1,
-         'DirectWrite': conf.get('HAVE_DIRECTWRITE', 0) == 1,
-         'GDI': conf.get('HAVE_GDI', 0) == 1,
-         'Uniscribe': conf.get('HAVE_UNISCRIBE', 0) == 1,
-        }, bool_yn: true, section: 'Platform shapers (not normally needed)')
-summary({'Documentation': conf.get('HAVE_GTK_DOC', 0) == 1,
-         'GObject bindings': conf.get('HAVE_GOBJECT', 0) == 1,
-         'Introspection': conf.get('HAVE_INTROSPECTION', 0) == 1,
-        }, bool_yn: true, section: 'Other features')
+build_summary = {
+  'Directories':
+    {'prefix': get_option('prefix'),
+     'bindir': get_option('bindir'),
+     'libdir': get_option('libdir'),
+     'includedir': get_option('includedir'),
+     'datadir': get_option('datadir'),
+    },
+  'Unicode callbacks (you want at least one)':
+    {'Builtin': true,
+     'Glib': conf.get('HAVE_GLIB', 0) == 1,
+     'ICU': conf.get('HAVE_ICU', 0) == 1,
+    },
+  'Font callbacks (the more the merrier)':
+    {'FreeType': conf.get('HAVE_FREETYPE', 0) == 1,
+    },
+  'Dependencies used for command-line utilities':
+    {'Cairo': conf.get('HAVE_CAIRO', 0) == 1,
+     'Chafa': conf.get('HAVE_CHAFA', 0) == 1,
+    },
+  'Additional shapers':
+    {'Graphite2': conf.get('HAVE_GRAPHITE2', 0) == 1,
+    },
+  'Platform shapers (not normally needed)':
+    {'CoreText': conf.get('HAVE_CORETEXT', 0) == 1,
+     'DirectWrite': conf.get('HAVE_DIRECTWRITE', 0) == 1,
+     'GDI/Uniscribe': (conf.get('HAVE_GDI', 0) == 1) and (conf.get('HAVE_UNISCRIBE', 0) == 1),
+    },
+  'Other features':
+    {'Documentation': conf.get('HAVE_GTK_DOC', 0) == 1,
+     'GObject bindings': conf.get('HAVE_GOBJECT', 0) == 1,
+     'Introspection': conf.get('HAVE_INTROSPECTION', 0) == 1,
+     'Experimental APIs': conf.get('HB_EXPERIMENTAL_API', 0) == 1,
+    },
+  'Testing':
+    {'Tests': get_option('tests').enabled(),
+     'Benchmark': get_option('benchmark').enabled(),
+    },
+}
+foreach section_title, section : build_summary
+  summary(section, bool_yn: true, section: section_title)
+endforeach
index cbd5c50..9ebba72 100644 (file)
@@ -1,15 +1,17 @@
 # HarfBuzz feature options
 option('glib', type: 'feature', value: 'auto',
   description: 'Enable GLib unicode functions')
-option('gobject', type: 'feature', value: 'disabled',
+option('gobject', type: 'feature', value: 'auto',
   description: 'Enable GObject bindings')
 option('cairo', type: 'feature', value: 'auto',
   description: 'Use Cairo graphics library')
-option('fontconfig', type: 'feature', value: 'auto',
-  description: 'Use fontconfig')
+option('chafa', type: 'feature', value: 'auto',
+  description: 'Use Chafa terminal graphics library')
 option('icu', type: 'feature', value: 'auto',
   description: 'Enable ICU library unicode functions')
 option('graphite', type: 'feature', value: 'disabled',
+  description: 'Deprecated use graphite2 option instead')
+option('graphite2', type: 'feature', value: 'disabled',
   description: 'Enable Graphite2 complementary shaper')
 option('freetype', type: 'feature', value: 'auto',
   description: 'Enable freetype interop helpers')
@@ -21,18 +23,20 @@ option('coretext', type: 'feature', value: 'disabled',
   description: 'Enable CoreText shaper backend on macOS')
 
 # Common feature options
-option('tests', type : 'feature', value : 'enabled', yield : true,
+option('tests', type: 'feature', value: 'enabled', yield: true,
   description: 'Enable or disable unit tests')
-option('introspection', type : 'feature', value : 'disabled', yield : true,
-  description : 'Generate gobject-introspection bindings (.gir/.typelib files)')
-option('gtk_doc',  type : 'feature', value : 'auto', yield : true,
-  description : 'Generate documentation with gtk-doc')
+option('introspection', type: 'feature', value: 'auto', yield: true,
+  description: 'Generate gobject-introspection bindings (.gir/.typelib files)')
+option('docs', type: 'feature', value: 'auto', yield: true,
+  description: 'Generate documentation with gtk-doc')
 
+option('benchmark', type: 'feature', value: 'disabled',
+  description: 'Enable benchmark tests')
 option('icu_builtin', type: 'boolean', value: false,
   description: 'Don\'t separate ICU support as harfbuzz-icu module')
-option('with_libstdcxx', type: 'boolean', value: false,
-  description: 'Allow linking with libstdc++')
 option('experimental_api', type: 'boolean', value: false,
   description: 'Enable experimental APIs')
-option('amalgam', type: 'boolean', value: false,
-  description : 'Enable amalgam builds')
+option('ragel_subproject', type: 'boolean', value: false,
+  description: 'Build Ragel subproject if no suitable version is found')
+option('fuzzer_ldflags', type: 'string',
+  description: 'Extra LDFLAGS used during linking of fuzzing binaries')
diff --git a/mingw-configure.sh b/mingw-configure.sh
new file mode 100755 (executable)
index 0000000..3281ce3
--- /dev/null
@@ -0,0 +1,28 @@
+#!/bin/sh
+
+case $1 in
+       i686 | x86_64) ;;
+       *) echo "Usage: $0 i686|x86_64" >&2; exit 1 ;;
+esac
+
+target=$1-w64-mingw32
+shift
+
+exec "$(dirname "$0")"/configure \
+       --build=`../config.guess` \
+       --host=$target \
+       --prefix=$HOME/.local/$target \
+       CC= \
+       CXX= \
+       CPP= \
+       LD= \
+       CFLAGS="-static-libgcc" \
+       CXXFLAGS="-static-libgcc -static-libstdc++" \
+       CPPFLAGS="-I$HOME/.local/$target/include" \
+       LDFLAGS=-L$HOME/.local/$target/lib \
+       PKG_CONFIG_LIBDIR=$HOME/.local/$target/lib/pkgconfig:/usr/$target/sys-root/mingw/lib/pkgconfig/ \
+       PKG_CONFIG_PATH=$HOME/.local/$target/share/pkgconfig:/usr/$target/sys-root/mingw/share/pkgconfig/ \
+       PATH=$HOME/.local/$target/bin:/usr/$target/sys-root/mingw/bin:/usr/$target/bin:$PATH \
+       --without-icu \
+       --with-uniscribe \
+       "$@"
diff --git a/missing b/missing
index 8d0eaad..625aeb1 100755 (executable)
--- a/missing
+++ b/missing
@@ -3,7 +3,7 @@
 
 scriptversion=2018-03-07.03; # UTC
 
-# Copyright (C) 1996-2020 Free Software Foundation, Inc.
+# Copyright (C) 1996-2018 Free Software Foundation, Inc.
 # Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
 
 # This program is free software; you can redistribute it and/or modify
diff --git a/perf/fonts/Amiri-Regular.ttf b/perf/fonts/Amiri-Regular.ttf
new file mode 100644 (file)
index 0000000..e328e06
Binary files /dev/null and b/perf/fonts/Amiri-Regular.ttf differ
diff --git a/perf/fonts/NotoNastaliqUrdu-Regular.ttf b/perf/fonts/NotoNastaliqUrdu-Regular.ttf
new file mode 100644 (file)
index 0000000..891f633
Binary files /dev/null and b/perf/fonts/NotoNastaliqUrdu-Regular.ttf differ
diff --git a/perf/fonts/NotoSansDevanagari-Regular.ttf b/perf/fonts/NotoSansDevanagari-Regular.ttf
new file mode 100644 (file)
index 0000000..a9884a5
Binary files /dev/null and b/perf/fonts/NotoSansDevanagari-Regular.ttf differ
diff --git a/perf/fonts/Roboto-Regular.ttf b/perf/fonts/Roboto-Regular.ttf
new file mode 100644 (file)
index 0000000..500b104
Binary files /dev/null and b/perf/fonts/Roboto-Regular.ttf differ
diff --git a/perf/meson.build b/perf/meson.build
new file mode 100644 (file)
index 0000000..e12744c
--- /dev/null
@@ -0,0 +1,21 @@
+google_benchmark = subproject('google-benchmark')
+google_benchmark_dep = google_benchmark.get_variable('google_benchmark_dep')
+
+ttf_parser_dep = null_dep
+if get_option('experimental_api') and add_languages('rust', required: false, native: true)
+  ttf_parser_dep = subproject('ttf-parser').get_variable('ttf_parser_dep')
+endif
+
+benchmark('perf', executable('perf', 'perf.cc',
+  dependencies: [
+    google_benchmark_dep, freetype_dep,
+
+    # the last two, thread and dl, aren't nice as ttf-parser isn't no_std yet
+    # https://github.com/RazrFalcon/ttf-parser/issues/29
+    ttf_parser_dep, thread_dep, cpp.find_library('dl'),
+  ],
+  cpp_args: ttf_parser_dep.found() ? ['-DHAVE_TTFPARSER'] : [],
+  include_directories: [incconfig, incsrc],
+  link_with: [libharfbuzz],
+  install: false,
+), workdir: meson.current_source_dir() / '..', timeout: 100)
diff --git a/perf/perf-draw.hh b/perf/perf-draw.hh
new file mode 100644 (file)
index 0000000..12581bc
--- /dev/null
@@ -0,0 +1,177 @@
+#include "benchmark/benchmark.h"
+
+#include "hb.h"
+#include "hb-ot.h"
+#include "hb-ft.h"
+#include FT_OUTLINE_H
+
+#ifdef HAVE_TTFPARSER
+#include "ttfparser.h"
+#endif
+
+#define HB_UNUSED __attribute__((unused))
+
+static void
+_hb_move_to (hb_position_t to_x HB_UNUSED, hb_position_t to_y HB_UNUSED, void *user_data HB_UNUSED) {}
+
+static void
+_hb_line_to (hb_position_t to_x HB_UNUSED, hb_position_t to_y HB_UNUSED, void *user_data HB_UNUSED) {}
+
+static void
+_hb_quadratic_to (hb_position_t control_x HB_UNUSED, hb_position_t control_y HB_UNUSED,
+                 hb_position_t to_x HB_UNUSED, hb_position_t to_y HB_UNUSED,
+                 void *user_data HB_UNUSED) {}
+
+static void
+_hb_cubic_to (hb_position_t control1_x HB_UNUSED, hb_position_t control1_y HB_UNUSED,
+             hb_position_t control2_x HB_UNUSED, hb_position_t control2_y HB_UNUSED,
+             hb_position_t to_x HB_UNUSED, hb_position_t to_y HB_UNUSED,
+             void *user_data HB_UNUSED) {}
+
+static void
+_hb_close_path (void *user_data HB_UNUSED) {}
+
+static void
+_ft_move_to (const FT_Vector* to HB_UNUSED, void* user HB_UNUSED) {}
+
+static void
+_ft_line_to (const FT_Vector* to HB_UNUSED, void* user HB_UNUSED) {}
+
+static void
+_ft_conic_to (const FT_Vector* control HB_UNUSED, const FT_Vector* to HB_UNUSED,
+             void* user HB_UNUSED) {}
+
+static void
+_ft_cubic_to (const FT_Vector* control1 HB_UNUSED, const FT_Vector* control2 HB_UNUSED,
+             const FT_Vector* to HB_UNUSED, void* user HB_UNUSED) {}
+
+#ifdef HAVE_TTFPARSER
+static void _tp_move_to (float x HB_UNUSED, float y HB_UNUSED, void *data HB_UNUSED) {}
+static void _tp_line_to (float x, float y, void *data) {}
+static void _tp_quad_to (float x1, float y1, float x, float y, void *data) {}
+static void _tp_curve_to (float x1, float y1, float x2, float y2, float x, float y, void *data) {}
+static void _tp_close_path (void *data) {}
+#endif
+
+static void draw (benchmark::State &state, const char *font_path, bool is_var, backend_t backend)
+{
+  hb_font_t *font;
+  unsigned num_glyphs;
+  {
+    hb_blob_t *blob = hb_blob_create_from_file_or_fail (font_path);
+    assert (blob);
+    hb_face_t *face = hb_face_create (blob, 0);
+    hb_blob_destroy (blob);
+    num_glyphs = hb_face_get_glyph_count (face);
+    font = hb_font_create (face);
+    hb_face_destroy (face);
+  }
+
+  if (backend == HARFBUZZ)
+  {
+    if (is_var)
+    {
+      hb_variation_t wght = {HB_TAG ('w','g','h','t'), 500};
+      hb_font_set_variations (font, &wght, 1);
+    }
+    hb_draw_funcs_t *draw_funcs = hb_draw_funcs_create ();
+    hb_draw_funcs_set_move_to_func (draw_funcs, _hb_move_to);
+    hb_draw_funcs_set_line_to_func (draw_funcs, _hb_line_to);
+    hb_draw_funcs_set_quadratic_to_func (draw_funcs, _hb_quadratic_to);
+    hb_draw_funcs_set_cubic_to_func (draw_funcs, _hb_cubic_to);
+    hb_draw_funcs_set_close_path_func (draw_funcs, _hb_close_path);
+
+    for (auto _ : state)
+      for (unsigned gid = 0; gid < num_glyphs; ++gid)
+       hb_font_draw_glyph (font, gid, draw_funcs, nullptr);
+
+    hb_draw_funcs_destroy (draw_funcs);
+  }
+  else if (backend == FREETYPE)
+  {
+    if (is_var)
+    {
+      hb_variation_t wght = {HB_TAG ('w','g','h','t'), 500};
+      hb_font_set_variations (font, &wght, 1);
+    }
+    hb_ft_font_set_funcs (font);
+    FT_Face ft_face = hb_ft_font_get_face (font);
+    hb_ft_font_set_load_flags (font, FT_LOAD_NO_HINTING | FT_LOAD_NO_SCALE);
+
+    FT_Outline_Funcs draw_funcs;
+    draw_funcs.move_to = (FT_Outline_MoveToFunc) _ft_move_to;
+    draw_funcs.line_to = (FT_Outline_LineToFunc) _ft_line_to;
+    draw_funcs.conic_to = (FT_Outline_ConicToFunc) _ft_conic_to;
+    draw_funcs.cubic_to = (FT_Outline_CubicToFunc) _ft_cubic_to;
+    draw_funcs.shift = 0;
+    draw_funcs.delta = 0;
+
+    for (auto _ : state)
+      for (unsigned gid = 0; gid < num_glyphs; ++gid)
+      {
+       FT_Load_Glyph (ft_face, gid, FT_LOAD_NO_HINTING | FT_LOAD_NO_SCALE);
+       FT_Outline_Decompose (&ft_face->glyph->outline, &draw_funcs, nullptr);
+      }
+  }
+  else if (backend == TTF_PARSER)
+  {
+#ifdef HAVE_TTFPARSER
+    ttfp_face *tp_font = (ttfp_face *) malloc (ttfp_face_size_of ());
+    hb_blob_t *blob = hb_face_reference_blob (hb_font_get_face (font));
+    assert (ttfp_face_init (hb_blob_get_data (blob, nullptr), hb_blob_get_length (blob), 0, tp_font));
+    if (is_var) ttfp_set_variation (tp_font, TTFP_TAG('w','g','h','t'), 500);
+
+    ttfp_outline_builder builder;
+    builder.move_to = _tp_move_to;
+    builder.line_to = _tp_line_to;
+    builder.quad_to = _tp_quad_to;
+    builder.curve_to = _tp_curve_to;
+    builder.close_path = _tp_close_path;
+
+    ttfp_rect bbox;
+    for (auto _ : state)
+      for (unsigned gid = 0; gid < num_glyphs; ++gid)
+       ttfp_outline_glyph (tp_font, builder, &builder, gid, &bbox);
+
+    hb_blob_destroy (blob);
+    free (tp_font);
+#endif
+  }
+  else abort ();
+
+  hb_font_destroy (font);
+}
+
+#define FONT_BASE_PATH "test/subset/data/fonts/"
+
+BENCHMARK_CAPTURE (draw, cff - ot - SourceSansPro, FONT_BASE_PATH "SourceSansPro-Regular.otf", false, HARFBUZZ);
+BENCHMARK_CAPTURE (draw, cff - ft - SourceSansPro, FONT_BASE_PATH "SourceSansPro-Regular.otf", false, FREETYPE);
+BENCHMARK_CAPTURE (draw, cff - tp - SourceSansPro, FONT_BASE_PATH "SourceSansPro-Regular.otf", false, TTF_PARSER);
+
+BENCHMARK_CAPTURE (draw, cff2 - ot - AdobeVFPrototype, FONT_BASE_PATH "AdobeVFPrototype.otf", false, HARFBUZZ);
+BENCHMARK_CAPTURE (draw, cff2 - ft - AdobeVFPrototype, FONT_BASE_PATH "AdobeVFPrototype.otf", false, FREETYPE);
+BENCHMARK_CAPTURE (draw, cff2 - tp - AdobeVFPrototype, FONT_BASE_PATH "AdobeVFPrototype.otf", false, TTF_PARSER);
+
+BENCHMARK_CAPTURE (draw, cff2/vf - ot - AdobeVFPrototype, FONT_BASE_PATH "AdobeVFPrototype.otf", true, HARFBUZZ);
+BENCHMARK_CAPTURE (draw, cff2/vf - ft - AdobeVFPrototype, FONT_BASE_PATH "AdobeVFPrototype.otf", true, FREETYPE);
+BENCHMARK_CAPTURE (draw, cff2/vf - tp - AdobeVFPrototype, FONT_BASE_PATH "AdobeVFPrototype.otf", true, TTF_PARSER);
+
+BENCHMARK_CAPTURE (draw, glyf - ot - SourceSerifVariable, FONT_BASE_PATH "SourceSerifVariable-Roman.ttf", false, HARFBUZZ);
+BENCHMARK_CAPTURE (draw, glyf - ft - SourceSerifVariable, FONT_BASE_PATH "SourceSerifVariable-Roman.ttf", false, FREETYPE);
+BENCHMARK_CAPTURE (draw, glyf - tp - SourceSerifVariable, FONT_BASE_PATH "SourceSerifVariable-Roman.ttf", false, TTF_PARSER);
+
+BENCHMARK_CAPTURE (draw, glyf/vf - ot - SourceSerifVariable, FONT_BASE_PATH "SourceSerifVariable-Roman.ttf", true, HARFBUZZ);
+BENCHMARK_CAPTURE (draw, glyf/vf - ft - SourceSerifVariable, FONT_BASE_PATH "SourceSerifVariable-Roman.ttf", true, FREETYPE);
+BENCHMARK_CAPTURE (draw, glyf/vf - tp - SourceSerifVariable, FONT_BASE_PATH "SourceSerifVariable-Roman.ttf", true, TTF_PARSER);
+
+BENCHMARK_CAPTURE (draw, glyf - ot - Comfortaa, FONT_BASE_PATH "Comfortaa-Regular-new.ttf", false, HARFBUZZ);
+BENCHMARK_CAPTURE (draw, glyf - ft - Comfortaa, FONT_BASE_PATH "Comfortaa-Regular-new.ttf", false, FREETYPE);
+BENCHMARK_CAPTURE (draw, glyf - tp - Comfortaa, FONT_BASE_PATH "Comfortaa-Regular-new.ttf", false, TTF_PARSER);
+
+BENCHMARK_CAPTURE (draw, glyf/vf - ot - Comfortaa, FONT_BASE_PATH "Comfortaa-Regular-new.ttf", true, HARFBUZZ);
+BENCHMARK_CAPTURE (draw, glyf/vf - ft - Comfortaa, FONT_BASE_PATH "Comfortaa-Regular-new.ttf", true, FREETYPE);
+BENCHMARK_CAPTURE (draw, glyf/vf - tp - Comfortaa, FONT_BASE_PATH "Comfortaa-Regular-new.ttf", true, TTF_PARSER);
+
+BENCHMARK_CAPTURE (draw, glyf - ot - Roboto, FONT_BASE_PATH "Roboto-Regular.ttf", false, HARFBUZZ);
+BENCHMARK_CAPTURE (draw, glyf - ft - Roboto, FONT_BASE_PATH "Roboto-Regular.ttf", false, FREETYPE);
+BENCHMARK_CAPTURE (draw, glyf - tp - Roboto, FONT_BASE_PATH "Roboto-Regular.ttf", false, TTF_PARSER);
diff --git a/perf/perf-extents.hh b/perf/perf-extents.hh
new file mode 100644 (file)
index 0000000..c7bc84c
--- /dev/null
@@ -0,0 +1,98 @@
+#include "benchmark/benchmark.h"
+
+#include "hb.h"
+#include "hb-ft.h"
+#include "hb-ot.h"
+
+#ifdef HAVE_TTFPARSER
+#include "ttfparser.h"
+#endif
+
+static void extents (benchmark::State &state, const char *font_path, bool is_var, backend_t backend)
+{
+  hb_font_t *font;
+  unsigned num_glyphs;
+  {
+    hb_blob_t *blob = hb_blob_create_from_file_or_fail (font_path);
+    assert (blob);
+    hb_face_t *face = hb_face_create (blob, 0);
+    hb_blob_destroy (blob);
+    num_glyphs = hb_face_get_glyph_count (face);
+    font = hb_font_create (face);
+    hb_face_destroy (face);
+  }
+
+  if (is_var)
+  {
+    hb_variation_t wght = {HB_TAG ('w','g','h','t'), 500};
+    hb_font_set_variations (font, &wght, 1);
+  }
+
+  if (backend == HARFBUZZ || backend == FREETYPE)
+  {
+    if (backend == FREETYPE)
+    {
+      hb_ft_font_set_funcs (font);
+      hb_ft_font_set_load_flags (font, FT_LOAD_NO_HINTING | FT_LOAD_NO_SCALE);
+    }
+
+    hb_glyph_extents_t extents;
+    for (auto _ : state)
+      for (unsigned gid = 0; gid < num_glyphs; ++gid)
+       hb_font_get_glyph_extents (font, gid, &extents);
+  }
+  else if (backend == TTF_PARSER)
+  {
+#ifdef HAVE_TTFPARSER
+    ttfp_face *tp_font = (ttfp_face *) malloc (ttfp_face_size_of ());
+    hb_blob_t *blob = hb_face_reference_blob (hb_font_get_face (font));
+    assert (ttfp_face_init (hb_blob_get_data (blob, nullptr), hb_blob_get_length (blob), 0, tp_font));
+    if (is_var) ttfp_set_variation (tp_font, TTFP_TAG('w','g','h','t'), 500);
+
+    ttfp_rect bbox;
+    for (auto _ : state)
+      for (unsigned gid = 0; gid < num_glyphs; ++gid)
+       ttfp_get_glyph_bbox(tp_font, gid, &bbox);
+
+    hb_blob_destroy (blob);
+    free (tp_font);
+#endif
+  }
+
+  hb_font_destroy (font);
+}
+
+#define FONT_BASE_PATH "test/subset/data/fonts/"
+
+BENCHMARK_CAPTURE (extents, cff - ot - SourceSansPro, FONT_BASE_PATH "SourceSansPro-Regular.otf", false, HARFBUZZ);
+BENCHMARK_CAPTURE (extents, cff - ft - SourceSansPro, FONT_BASE_PATH "SourceSansPro-Regular.otf", false, FREETYPE);
+BENCHMARK_CAPTURE (extents, cff - tp - SourceSansPro, FONT_BASE_PATH "SourceSansPro-Regular.otf", false, TTF_PARSER);
+
+BENCHMARK_CAPTURE (extents, cff2 - ot - AdobeVFPrototype, FONT_BASE_PATH "AdobeVFPrototype.otf", false, HARFBUZZ);
+BENCHMARK_CAPTURE (extents, cff2 - ft - AdobeVFPrototype, FONT_BASE_PATH "AdobeVFPrototype.otf", false, FREETYPE);
+BENCHMARK_CAPTURE (extents, cff2 - tp - AdobeVFPrototype, FONT_BASE_PATH "AdobeVFPrototype.otf", false, TTF_PARSER);
+
+BENCHMARK_CAPTURE (extents, cff2/vf - ot - AdobeVFPrototype, FONT_BASE_PATH "AdobeVFPrototype.otf", true, HARFBUZZ);
+BENCHMARK_CAPTURE (extents, cff2/vf - ft - AdobeVFPrototype, FONT_BASE_PATH "AdobeVFPrototype.otf", true, FREETYPE);
+BENCHMARK_CAPTURE (extents, cff2/vf - tp - AdobeVFPrototype, FONT_BASE_PATH "AdobeVFPrototype.otf", true, TTF_PARSER);
+
+BENCHMARK_CAPTURE (extents, glyf - ot - SourceSerifVariable, FONT_BASE_PATH "SourceSerifVariable-Roman.ttf", false, HARFBUZZ);
+BENCHMARK_CAPTURE (extents, glyf - ft - SourceSerifVariable, FONT_BASE_PATH "SourceSerifVariable-Roman.ttf", false, FREETYPE);
+BENCHMARK_CAPTURE (extents, glyf - tp - SourceSerifVariable, FONT_BASE_PATH "SourceSerifVariable-Roman.ttf", false, TTF_PARSER);
+
+BENCHMARK_CAPTURE (extents, glyf/vf - ot - SourceSerifVariable, FONT_BASE_PATH "SourceSerifVariable-Roman.ttf", true, HARFBUZZ);
+BENCHMARK_CAPTURE (extents, glyf/vf - ft - SourceSerifVariable, FONT_BASE_PATH "SourceSerifVariable-Roman.ttf", true, FREETYPE);
+BENCHMARK_CAPTURE (extents, glyf/vf - tp - SourceSerifVariable, FONT_BASE_PATH "SourceSerifVariable-Roman.ttf", true, TTF_PARSER);
+
+BENCHMARK_CAPTURE (extents, glyf - ot - Comfortaa, FONT_BASE_PATH "Comfortaa-Regular-new.ttf", false, HARFBUZZ);
+BENCHMARK_CAPTURE (extents, glyf - ft - Comfortaa, FONT_BASE_PATH "Comfortaa-Regular-new.ttf", false, FREETYPE);
+BENCHMARK_CAPTURE (extents, glyf - tp - Comfortaa, FONT_BASE_PATH "Comfortaa-Regular-new.ttf", false, TTF_PARSER);
+
+BENCHMARK_CAPTURE (extents, glyf/vf - ot - Comfortaa, FONT_BASE_PATH "Comfortaa-Regular-new.ttf", true, HARFBUZZ);
+BENCHMARK_CAPTURE (extents, glyf/vf - ft - Comfortaa, FONT_BASE_PATH "Comfortaa-Regular-new.ttf", true, FREETYPE);
+BENCHMARK_CAPTURE (extents, glyf/vf - tp - Comfortaa, FONT_BASE_PATH "Comfortaa-Regular-new.ttf", true, TTF_PARSER);
+
+BENCHMARK_CAPTURE (extents, glyf - ot - Roboto, FONT_BASE_PATH "Roboto-Regular.ttf", false, HARFBUZZ);
+BENCHMARK_CAPTURE (extents, glyf - ft - Roboto, FONT_BASE_PATH "Roboto-Regular.ttf", false, FREETYPE);
+BENCHMARK_CAPTURE (extents, glyf - tp - Roboto, FONT_BASE_PATH "Roboto-Regular.ttf", false, TTF_PARSER);
+
diff --git a/perf/perf-shaping.hh b/perf/perf-shaping.hh
new file mode 100644 (file)
index 0000000..85ee19b
--- /dev/null
@@ -0,0 +1,65 @@
+#include "benchmark/benchmark.h"
+
+#include "hb.h"
+
+static void shape (benchmark::State &state, const char *text_path,
+                  hb_direction_t direction, hb_script_t script,
+                  const char *font_path)
+{
+  hb_font_t *font;
+  {
+    hb_blob_t *blob = hb_blob_create_from_file_or_fail (font_path);
+    assert (blob);
+    hb_face_t *face = hb_face_create (blob, 0);
+    hb_blob_destroy (blob);
+    font = hb_font_create (face);
+    hb_face_destroy (face);
+  }
+
+  hb_blob_t *text_blob = hb_blob_create_from_file_or_fail (text_path);
+  assert (text_blob);
+  unsigned text_length;
+  const char *text = hb_blob_get_data (text_blob, &text_length);
+
+  hb_buffer_t *buf = hb_buffer_create ();
+  for (auto _ : state)
+  {
+    hb_buffer_add_utf8 (buf, text, text_length, 0, -1);
+    hb_buffer_set_direction (buf, direction);
+    hb_buffer_set_script (buf, script);
+    hb_shape (font, buf, nullptr, 0);
+    hb_buffer_clear_contents (buf);
+  }
+  hb_buffer_destroy (buf);
+
+  hb_blob_destroy (text_blob);
+  hb_font_destroy (font);
+}
+
+BENCHMARK_CAPTURE (shape, fa-thelittleprince.txt - Amiri,
+                  "perf/texts/fa-thelittleprince.txt",
+                  HB_DIRECTION_RTL, HB_SCRIPT_ARABIC,
+                  "perf/fonts/Amiri-Regular.ttf");
+BENCHMARK_CAPTURE (shape, fa-thelittleprince.txt - NotoNastaliqUrdu,
+                  "perf/texts/fa-thelittleprince.txt",
+                  HB_DIRECTION_RTL, HB_SCRIPT_ARABIC,
+                  "perf/fonts/NotoNastaliqUrdu-Regular.ttf");
+
+BENCHMARK_CAPTURE (shape, fa-monologue.txt - Amiri,
+                  "perf/texts/fa-monologue.txt",
+                  HB_DIRECTION_RTL, HB_SCRIPT_ARABIC,
+                  "perf/fonts/Amiri-Regular.ttf");
+BENCHMARK_CAPTURE (shape, fa-monologue.txt - NotoNastaliqUrdu,
+                  "perf/texts/fa-monologue.txt",
+                  HB_DIRECTION_RTL, HB_SCRIPT_ARABIC,
+                  "perf/fonts/NotoNastaliqUrdu-Regular.ttf");
+
+BENCHMARK_CAPTURE (shape, en-thelittleprince.txt - Roboto,
+                  "perf/texts/en-thelittleprince.txt",
+                  HB_DIRECTION_LTR, HB_SCRIPT_LATIN,
+                  "perf/fonts/Roboto-Regular.ttf");
+
+BENCHMARK_CAPTURE (shape, en-words.txt - Roboto,
+                  "perf/texts/en-words.txt",
+                  HB_DIRECTION_LTR, HB_SCRIPT_LATIN,
+                  "perf/fonts/Roboto-Regular.ttf");
diff --git a/perf/perf.cc b/perf/perf.cc
new file mode 100644 (file)
index 0000000..a364b91
--- /dev/null
@@ -0,0 +1,16 @@
+#include "benchmark/benchmark.h"
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "perf-shaping.hh"
+#ifdef HAVE_FREETYPE
+enum backend_t { HARFBUZZ, FREETYPE, TTF_PARSER };
+#include "perf-extents.hh"
+#ifdef HB_EXPERIMENTAL_API
+#include "perf-draw.hh"
+#endif
+#endif
+
+BENCHMARK_MAIN ();
diff --git a/perf/texts/en-thelittleprince.txt b/perf/texts/en-thelittleprince.txt
new file mode 100644 (file)
index 0000000..7bf4abc
--- /dev/null
@@ -0,0 +1,1893 @@
+Downloaded from https://archive.org/details/TheLittlePrince-English
+
+THE LITTLE PRINCE
+
+
+
+Antoine De Saint-Exupery
+
+
+
+
+Antoine de Saint-Exupery, who was a French author, journalist and pilot wrote
+The Little Prince in 1943, one year before his death.
+
+The Little Prince appears to be a simple children’s tale,
+some would say that it is actually a profound and deeply moving tale,
+written in riddles and laced with philosophy and poetic metaphor.
+
+
+
+
+Once when I was six years old I saw a magnificent picture in a book, called True Stories from
+Nature, about the primeval forest. It was a picture of a boa constrictor in the act of swallowing an
+animal. Here is a copy of the drawing.
+
+In the book it said: “Boa constrictors swallow their prey whole, without chewing it. After that they
+are not able to move, and they sleep through the six months that they need for digestion.” I
+pondered deeply, then, over the adventures of the jungle. And after some work with a coloured
+pencil I succeeded in making my first drawing. My Drawing Number One. It looked like this:
+
+
+
+
+I showed my masterpiece to the grown-ups, and asked them whether the drawing frightened them.
+But they answered: “Frighten? Why should any one be frightened by a hat?” My drawing was not
+a picture of a hat. It was a picture of a boa constrictor digesting an elephant. But since the grown-
+ups were not able to understand it, I made another drawing: I drew the inside of the boa
+constrictor, so that the grown-ups could see it clearly. They always need to have things explained.
+
+
+
+My Drawing Number Two looked like this:
+
+
+
+
+The grown-ups’ response, this time, was to advise me to lay aside my drawings of boa
+constrictors, whether from the inside or the outside, and devote myself instead to geography,
+history, arithmetic and grammar. That is why, at the age of six, I gave up what might have been a
+magnificent career as a painter. I had been disheartened by the failure of my Drawing Number
+One and my Drawing Number Two. Grown-ups never understand anything by themselves, and it is
+tiresome for children to be always and forever explaining things to them.
+
+So then I chose another profession, and learned to pilot air-planes. I have flown a little over all
+parts of the world; and it is true that geography has been very useful to me. At a glance I can
+distinguish China from Arizona. If one gets lost in the night, such knowledge is valuable. In the
+course of this life I have had a great many encounters with a great many people who have been
+concerned with matters of consequence. I have lived a great deal among grown-ups. I have seen
+them intimately, close at hand. And that hasn’t much improved my opinion of them.
+
+Whenever I met one of them who seemed to me at all clear-sighted, I tried the experiment of
+showing him my Drawing Number One, which I have always kept. I would try to find out, so, if this
+was a person of true understanding. But, whoever it was, he, or she, would always say: “That is a
+hat.” Then I would never talk to that person about boa constrictors, or primeval forests, or stars. I
+would bring myself down to his level. I would talk to him about bridge, and golf, and politics, and
+neckties. And the grown-up would be greatly pleased to have met such a sensible man.
+
+So I lived my life alone, without anyone that I could really talk to, until I had an accident with my
+plane in the Desert of Sahara, six years ago. Something was broken in my engine. And as I had
+with me neither a mechanic nor any passengers, I set myself to attempt the difficult repairs all
+alone. It was a question of life or death for me: I had scarcely enough drinking water to last a
+week.
+
+The first night, then, I went to sleep on the sand, a thousand miles from any human habitation. I
+was more isolated than a shipwrecked sailor on a raft in the middle of the ocean. Thus you can
+imagine my amazement, at sunrise, when I was awakened by an odd little voice.
+
+
+
+
+It said: “If you please, draw me a sheep!”
+
+“What!”
+
+“Draw me a sheep!”
+
+I jumped to my feet, completely thunderstruck. I blinked my eyes hard. I looked carefully all
+around me. And I saw a most extraordinary small person, who stood there examining me with
+great seriousness. Here you may see the best portrait that, later, I was able to make of him. But
+my drawing is certainly very much less charming than its model.
+
+That, however, is not my fault. The grown-ups discouraged me in my painter’s career when I was
+six years old, and I never learned to draw anything, except boas from the outside and boas from
+the inside.
+
+Now I stared at this sudden apparition with my eyes fairly starting out of my head in
+astonishment. Remember, I had crashed in the desert a thousand miles from any inhabited region.
+And yet my little man seemed neither to be straying uncertainly among the sands, nor to be
+fainting from fatigue or hunger or thirst or fear. Nothing about him gave any suggestion of a child
+lost in the middle of the desert, a thousand miles from any human habitation.
+
+When at last I was able to speak, I said to him: “But, what are you doing here?” And in answer he
+repeated, very slowly, as if he were speaking of a matter of great consequence:
+
+“If you please, draw me a sheep...”
+
+When a mystery is too overpowering, one dare not disobey. Absurd as it might seem to me, a
+thousand miles from any human habitation and in danger of death, I took out of my pocket a sheet
+of paper and my fountain pen. But then I remembered how my studies had been concentrated on
+geography, history, arithmetic, and grammar, and I told the little chap (a little crossly, too) that I
+did not know how to draw. He answered me: “That doesn’t matter. Draw me a sheep...”
+
+
+
+
+But I had never drawn a sheep. So I drew for him one of the two pictures I had drawn so often. It
+was that of the boa constrictor from the outside. And I was astounded to hear the little fellow
+greet it with, “No, no, no! I do not want an elephant inside a boa constrictor. A boa constrictor is a
+very dangerous creature, and an elephant is very cumbersome. Where I live, everything is very
+small. What I need is a sheep. Draw me a sheep.
+
+
+
+
+So then I made a drawing. He looked at it carefully, then he said: “No. This sheep is already very
+sickly. Make me another.” So I made another drawing. My friend smiled gently and indulgently.
+“You see yourself,” he said, “that this is not a sheep. This is a ram. It has horns.
+
+
+
+
+So then I did my drawing over once more. But it was rejected too, just like the others. “This one is
+too old. I want a sheep that will live a long time.
+
+By this time my patience was exhausted, because I was in a hurry to start taking my engine apart.
+So I tossed off this drawing. And I threw out an explanation with it.
+
+“This is only his box. The sheep you asked for is inside.”
+
+
+
+
+I was very surprised to see a light break over the face of my young judge:
+
+“That is exactly the way I wanted it! Do you think that this sheep will have to have a great deal of
+grass?”
+
+“Why?”
+
+“Because where I live everything is very small...”
+
+“There will surely be enough grass for him,” I said.
+
+“It is a very small sheep that I have given you.”
+
+He bent his head over the drawing: “Not so small that, Look! He has gone to sleep...”
+
+And that is how I made the acquaintance of the little prince.
+
+It took me a long time to learn where he came from. The little prince, who asked me so many
+questions, never seemed to hear the ones I asked him. It was from words dropped by chance that,
+little by little, everything was revealed to me.
+
+The first time he saw my air-plane, for instance (I shall not draw my air-plane; that would be much
+too complicated for me), he asked me: “What is that object?”
+
+“That is not an object. It flies. It is an air-plane. It is my air-plane.” And I was proud to have him
+learn that I could fly. He cried out, then: “What! You dropped down from the sky?”
+
+
+
+“Yes,” I answered, modestly.
+
+
+
+“Oh! That is funny!” And the little prince broke into a lovely peal of laughter, which irritated me
+very much. I like my misfortunes to be taken seriously.
+
+Then he added: “So you, too, come from the sky! Which is your planet?” At that moment I caught
+a gleam of light in the impenetrable mystery of his presence; and I demanded, abruptly: “Do you
+come from another planet?” But he did not reply. He tossed his head gently, without taking his
+eyes from my plane: “It is true that on that you can’t have come from very far away...” And he
+sank into a reverie, which lasted a long time. Then, taking my sheep out of his pocket, he buried
+himself in the contemplation of his treasure.
+
+You can imagine how my curiosity was aroused by this half-confidence about the “other planets.” I
+made a great effort, therefore, to find out more on this subject.
+
+“My little man, where do you come from? What is this ‘where I live,’ of which you speak? Where
+do you want to take your sheep?”
+
+After a reflective silence he answered: “The thing that is so good about the box you have given
+me is that at night he can use it as his house.”
+
+“That is so. And if you are good I will give you a string, too, so that you can tie him during the day,
+and a post to tie him to.”
+
+But the little prince seemed shocked by this offer: “Tie him! What a queer idea!”
+
+“But if you don’t tie him,” I said, “he will wander off somewhere, and get lost.”
+
+My friend broke into another peal of laughter: “But where do you think he would go?”
+“Anywhere. Straight ahead of him.”
+
+Then the little prince said, earnestly: “That doesn’t matter. Where I live, everything is so small!”
+And, with perhaps a hint of sadness, he added: “Straight ahead of him, nobody can go very far...”
+
+
+
+
+I had thus learned a second fact of great importance: this was that the planet the little prince
+came from was scarcely any larger than a house! But that did not really surprise me much. I knew
+very well that in addition to the great planets, such as the Earth, Jupiter, Mars, Venus, to which
+we have given names, there are also hundreds of others, some of which are so small that one has
+a hard time seeing them through the telescope.
+
+
+
+When an astronomer discovers one of these he does not give it a name, but only a number. He
+might call it, for example, “Asteroid 325.”
+
+
+
+
+I have serious reason to believe that the planet from which the little prince came is the asteroid
+known as B-612. This asteroid has only once been seen through the telescope. That was by a
+Turkish astronomer, in 1909.
+
+On making his discovery, the astronomer had presented it to the International Astronomical
+Congress, in a great demonstration. But he was in Turkish costume, and so nobody would believe
+what he said. Grown-ups are like that...
+
+Fortunately, however, for the reputation of Asteroid B-612, a Turkish dictator made a law that his
+subjects, under pain of death, should change to European costume. So in 1920 the astronomer
+gave his demonstration all over again, dressed with impressive style and elegance. And this time
+everybody accepted his report.
+
+If I have told you these details about the asteroid, and made a note of its number for you, it is on
+account of the grown-ups and their ways. When you tell them that you have made a new friend,
+they never ask you any questions about essential matters. They never say to you, “What does his
+voice sound like? What games does he love best? Does he collect butterflies?” Instead, they
+demand: “How old is he? How many brothers has he? How much does he weigh? How much
+money does his father make?”
+
+Only from these figures do they think they have learned anything about him.
+
+If you were to say to the grown-ups: “I saw a beautiful house made of rosy brick, with geraniums
+in the windows and doves on the roof,” they would not be able to get any idea of that house at all.
+
+You would have to say to them: “I saw a house that cost $ 20,000.” Then they would exclaim: “Oh,
+what a pretty house that is!” Just so, you might say to them: “The proof that the little prince
+existed is that he was charming, that he laughed, and that he was looking for a sheep. If anybody
+wants a sheep, that is a proof that he exists.” And what good would it do to tell them that? They
+would shrug their shoulders, and treat you like a child. But if you said to them: “The planet he
+came from is Asteroid B-612,” then they would be convinced, and leave you in peace from their
+questions. They are like that. One must not hold it against them. Children should always show
+great forbearance toward grown-up people. But certainly, for us who understand life, figures are a
+matter of indifference.
+
+I should have liked to begin this story in the fashion of the fairy-tales. I should have like to say:
+“Once upon a time there was a little prince who lived on a planet that was scarcely any bigger
+
+
+
+than himself, and who had need of a sheep...”
+
+
+
+To those who understand life, that would have given a much greater air of truth to my story. Fori
+do not want any one to read my book carelessly. I have suffered too much grief in setting down
+these memories. Six years have already passed since my friend went away from me, with his
+sheep. If I try to describe him here, it is to make sure that I shall not forget him. To forget a friend
+is sad. Not every one has had a friend. And if I forget him, I may become like the grown-ups who
+are no longer interested in anything but figures... It is for that purpose, again, that I have bought a
+box of paints and some pencils.
+
+It is hard to take up drawing again at my age, when I have never made any pictures except those
+of the boa constrictor from the outside and the boa constrictor from the inside, since I was six. I
+shall certainly try to make my portraits as true to life as possible. But I am not at all sure of
+success. One drawing goes along all right, and another has no resemblance to its subject. I make
+some errors, too, in the little prince’s height: in one place he is too tall and in another too short.
+And I feel some doubts about the colour of his costume. So I fumble along as best I can, now good,
+now bad, and I hope generally fair-to- middling. In certain more important details I shall make
+mistakes, also. But that is something that will not be my fault. My friend never explained anything
+to me. He thought, perhaps, that I was like himself. But I, alas, do not know how to see sheep
+through the walls of boxes. Perhaps I am a little like the grown-ups. I have had to grow old.
+
+As each day passed I would learn, in our talk, something about the little prince’s planet, his
+departure from it, his journey. The information would come very slowly, as it might chance to fall
+from his thoughts. It was in this way that I heard, on the third day, about the catastrophe of the
+baobabs.
+
+This time, once more, I had the sheep to thank for it. For the little prince asked me abruptly, as if
+seized by a grave doubt,
+
+“It is true, isn’t it, that sheep eat little bushes?”
+
+“Yes, that is true.”
+
+“Ah! I am glad!”
+
+I did not understand why it was so important that sheep should eat little bushes. But the little
+prince added: “Then it follows that they also eat baobabs?” I pointed out to the little prince that
+baobabs were not little bushes, but, on the contrary, trees as big as castles; and that even if he
+took a whole herd of elephants away with him, the herd would not eat up one single baobab.
+
+The idea of the herd of elephants made the little prince laugh. “We would have to put them one on
+top of the other,” he said. But he made a wise comment:
+
+“Before they grow so big, the baobabs start out by being little.”
+
+“That is strictly correct,” I said. “But why do you want the sheep to eat the little baobabs?”
+
+He answered me at once, “Oh, come, come!”, as if he were speaking of something that was self-
+evident. And I was obliged to make a great mental effort to solve this problem, without any
+assistance.
+
+Indeed, as I learned, there were on the planet where the little prince lived, as on all planets, good
+
+
+
+
+
+plants and bad plants. In consequence, there were good seeds from good plants, and bad seeds
+from bad plants. But seeds are invisible. They sleep deep in the heart of the earth’s darkness,
+until some one among them is seized with the desire to awaken. Then this little seed will stretch
+itself and begin, timidly at first, to push a charming little sprig inoffensively upward toward the
+sun. If it is only a sprout of radish or the sprig of a rose-bush, one would let it grow wherever it
+might wish. But when it is a bad plant, one must destroy it as soon as possible, the very first
+instant that one recognises it.
+
+Now there were some terrible seeds on the planet that was the home of the little prince; and these
+were the seeds of the baobab. The soil of that planet was infested with them. A baobab is
+something you will never, never be able to get rid of if you attend to it too late. It spreads over the
+entire planet. It bores clear through it with its roots. And if the planet is too small, and the
+baobabs are too many, they split it in pieces...
+
+“It is a question of discipline,” the little prince said to me later on.
+
+“When you’ve finished your own toilet in the morning, then it is time to attend to the toilet of your
+planet, just so, with the greatest care. You must see to it that you pull up regularly all the baobabs,
+at the very first moment when they can be distinguished from the rosebushes, which they
+resemble so closely in their earliest youth. It is very tedious work,” the little prince added, “but
+very easy.” And one day he said to me: “You ought to make a beautiful drawing, so that the
+children where you live can see exactly how all this is. That would be very useful to them if they
+were to travel some day.
+
+
+
+
+Sometimes,” he added, “there is no harm in putting off a piece of work until another day. But
+when it is a matter of baobabs, that always means a catastrophe.
+
+I knew a planet that was inhabited by a lazy man. He neglected three little bushes... So, as the
+little prince described it to me, I have made a drawing of that planet. I do not much like to take
+the tone of a moralist. But the danger of the baobabs is so little understood, and such considerable
+risks would be run by anyone who might get lost on an asteroid, that for once I am breaking
+through my reserve. “Children,” I say plainly, “watch out for the baobabs!” My friends, like
+myself, have been skirting this danger for a long time, without ever knowing it; and so it is for
+them that I have worked so hard over this drawing.
+
+The lesson which I pass on by this means is worth all the trouble it has cost me. Perhaps you will
+ask me, “Why are there no other drawing in this book as magnificent and impressive as this
+drawing of the baobabs?” The reply is simple. I have tried. But with the others I have not been
+successful. When I made the drawing of the baobabs I was carried beyond myself by the inspiring
+force of urgent necessity.
+
+Oh, little prince! Bit by bit I came to understand the secrets of your sad little life... For a long time
+you had found your only entertainment in the quiet pleasure of looking at the sunset.
+
+I learned that new detail on the morning of the fourth day, when you said to me:
+
+“I am very fond of sunsets. Come, let us go look at a sunset now.”
+
+“But we must wait,” I said.
+
+“Wait? For what?”
+
+“For the sunset. We must wait until it is time.”
+
+At first you seemed to be very much surprised. And then you laughed to yourself. You said to me:
+“I am always thinking that I am at home!”
+
+Just so. Everybody knows that when it is noon in the United States the sun is setting over France.
+If you could fly to France in one minute, you could go straight into the sunset, right from noon.
+Unfortunately, France is too far away for that. But on your tiny planet, my little prince, all you
+need do is move your chair a few steps. You can see the day end and the twilight falling whenever
+you like...
+
+“One day,” you said to me, “I saw the sunset forty-four times!”
+
+And a little later you added: “You know, one loves the sunset, when one is so sad...” “Were you so
+sad, then?” I asked, “on the day of the forty-four sunsets?”
+
+But the little prince made no reply.
+
+On the fifth day, again, as always, it was thanks to the sheep, the secret of the little prince’s life
+was revealed to me.
+
+Abruptly, without anything to lead up to it, and as if the question had been born of long and silent
+meditation on his problem, he demanded: “A sheep; if it eats little bushes, does it eat flowers,
+too?”
+
+
+
+
+“A sheep,” I answered, “eats anything it finds in its reach.”
+
+
+
+“Even flowers that have thorns?”
+
+“Yes, even flowers that have thorns.”
+
+“Then the thorns, what use are they?” I did not know.
+
+At that moment I was very busy trying to unscrew a bolt that had got stuck in my engine. I was
+very much worried, for it was becoming clear to me that the breakdown of my plane was
+extremely serious. And I had so little drinking water left that I had to fear for the worst.
+
+“The thorns, what use are they?”
+
+The little prince never let go of a question, once he had asked it. As for me, I was upset over that
+bolt. And I answered with the first thing that came into my head: “The thorns are of no use at all.
+Flowers have thorns just for spite!”
+
+“Oh!” There was a moment of complete silence.
+
+Then the little prince flashed back at me, with a kind of resentfulness: “I don’t believe you!
+Flowers are weak creatures. They are naive. They reassure themselves as best they can. They
+believe that their thorns are terrible weapons...”
+
+I did not answer. At that instant I was saying to myself: “If this bolt still won’t turn, I am going to
+knock it out with the hammer.”
+
+Again the little prince disturbed my thoughts. “And you actually believe that the flowers...”
+
+“Oh, no!” I cried. “No, no no! I don’t believe anything. I answered you with the first thing that
+came into my head. Don’t you see, I am very busy with matters of consequence!”
+
+He stared at me, thunderstruck. “Matters of consequence!”
+
+He looked at me there, with my hammer in my hand, my fingers black with engine grease, bending
+down over an object which seemed to him extremely ugly...
+
+“You talk just like the grown-ups!” That made me a little ashamed. But he went on, relentlessly:
+“You mix everything up together... You confuse everything...”
+
+He was really very angry. He tossed his golden curls in the breeze.
+
+“I know a planet where there is a certain red-faced gentleman. He has never smelled a flower. He
+has never looked at a star. He has never loved any one. He has never done anything in his life but
+add up figures. And all day he says over and over, just like you: ‘I am busy with matters of
+consequence!’ And that makes him swell up with pride.
+
+“But he is not a man, he is a mushroom!”
+
+
+
+“A what?”
+
+
+
+“A mushroom!” The little prince was now white with rage. “The flowers have been growing thorns
+for millions of years. For millions of years the sheep have been eating them just the same. And is
+it not a matter of consequence to try to understand why the flowers go to so much trouble to grow
+
+
+
+
+' '
+
+I \
+
+
+
+
+thorns, which are never of any use to them? Is the warfare between the sheep and the flowers not
+important? Is this not of more consequence than a fat red-faced gentleman’s sums? And if I know,
+I, myself, one flower which is unique in the world, which grows nowhere but on my planet, but
+which one little sheep can destroy in a single bite some morning, without even noticing what he is
+doing, Oh! You think that is not important! His face turned from white to red as he continued: “If
+some one loves a flower, of which just one single blossom grows in all the millions and millions of
+stars, it is enough to make him happy just to look at the stars.
+
+He can say to himself, ‘Somewhere, my flower is there...’ But if the sheep eats the flower, in one
+moment all his stars will be darkened... And you think that is not important!”
+
+He could not say anything more. His words were choked by sobbing. The night had fallen. I had
+let my tools drop from my hands. Of what moment now was my hammer, my bolt, or thirst, or
+death? On one star, one planet, my planet, the Earth, there was a little prince to be comforted. I
+took him in my arms, and rocked him. I said to him: “The flower that you love is not in danger. I
+will draw you a muzzle for your sheep. I will draw you a railing to put around your flower. I will...”
+
+I did not know what to say to him. I felt awkward and blundering. I did not know how I could reach
+him, where I could overtake him and go on hand in hand with him once more.
+
+It is such a secret place, the land of tears.
+
+I soon learned to know this flower better. On the little prince’s planet the flowers had always been
+very simple. They had only one ring of petals; they took up no room at all; they were a trouble to
+nobody. One morning they would appear in the grass, and by night they would have faded
+peacefully away. But one day, from a seed blown from no one knew where, a new flower had come
+up; and the little prince had watched very closely over this small sprout which was not like any
+other small sprouts on his planet.
+
+It might, you see, have been a new kind of baobab. The shrub soon stopped growing, and began to
+get ready to produce a flower. The little prince, who was present at the first appearance of a huge
+bud, felt at once that some sort of miraculous apparition must emerge from it. But the flower was
+not satisfied to complete the preparations for her beauty in the shelter of her green chamber. She
+
+
+
+chose her colours with the greatest care. She adjusted her petals one by one. She did not wish to
+go out into the world all rumpled, like the field poppies. It was only in the full radiance of her
+beauty that she wished to appear. Oh, yes! She was a coquettish creature! And her mysterious
+adornment lasted for days and days. Then one morning, exactly at sunrise, she suddenly showed
+herself. And, after working with all this painstaking precision, she yawned and said: “Ah! I am
+scarcely awake. I beg that you will excuse me. My petals are still all disarranged...” But the little
+prince could not restrain his admiration:
+
+“Oh! How beautiful you are!”
+
+“Am I not?” the flower responded, sweetly. “And I was born at the same moment as the sun...”
+
+The little prince could guess easily enough that she was not any too modest, but how moving, and
+exciting she was!
+
+“I think it is time for breakfast,” she added an instant later. “If you would have the kindness to
+think of my needs” And the little prince, completely abashed, went to look for a sprinkling can of
+fresh water.
+
+So, he tended the flower. So, too, she began very quickly to torment him with her vanity, which
+was, if the truth be known, a little difficult to deal with.
+
+One day, for instance, when she was speaking of her four thorns, she said to the little prince: “Let
+the tigers come with their claws!”
+
+“There are no tigers on my planet,” the little prince objected. “And, anyway, tigers do not eat
+weeds.”
+
+“I am not a weed,” the flower replied, sweetly. “Please excuse me...” “I am not at all afraid of
+tigers,” she went on, “but I have a horror of drafts. I suppose you wouldn’t screen for me?"
+
+“A horror of drafts, that is bad luck, for a plant,” remarked the little prince, and added to himself,
+“This flower is a very complex creature...”
+
+“At night I want you to put me under a glass globe. It is very cold where you live. In the place I
+came from...” But she interrupted herself at that point. She had come in the form of a seed. She
+could not have known anything of any other worlds.
+
+Embarrassed over having let herself be caught on the verge of such an untruth, she coughed two
+or three times, in order to put the little prince in the wrong.
+
+“The screen?”
+
+“I was just going to look for it when you spoke to me...”
+
+Then she forced her cough a little more so that he should suffer from remorse just the same. So
+the little prince, in spite of all the good will that was inseparable from his love, had soon come to
+doubt her. He had taken seriously words which were without importance, and it made him very
+unhappy.
+
+“I ought not to have listened to her,” he confided to me one day.
+
+“One never ought to listen to the flowers. One should simply look at them and breathe their
+
+
+
+
+fragrance. Mine perfumed all my planet. But I did not know how to take pleasure in all her grace.
+This tale of claws, which disturbed me so much, should only have filled my heart with tenderness
+and pity.”
+
+And he continued his confidences: “The fact is that I did not know how to understand anything! I
+ought to have judged by deeds and not by words. She cast her fragrance and her radiance over
+me. I ought never to have run away from her... I ought to have guessed all the affection that lay
+behind her poor little stratagems. Flowers are so inconsistent! But I was too young to know how to
+love her...”
+
+I believe that for his escape he took advantage of the migration of a flock of wild birds. On the
+morning of his departure he put his planet in perfect order. He carefully cleaned out his active
+volcanoes. He possessed two active volcanoes; and they were very convenient for heating his
+breakfast in the morning. He also had one volcano that was extinct. But, as he said, “One never
+knows!” So he cleaned out the extinct volcano, too. If they are well cleaned out, volcanoes burn
+slowly and steadily, without any eruptions. Volcanic eruptions are like fires in a chimney.
+
+On our earth we are obviously much too small to clean out our volcanoes. That is why they bring
+no end of trouble upon us. The little prince also pulled up, with a certain sense of dejection, the
+last little shoots of the baobabs. He believed that he would never want to return. But on this last
+morning all these familiar tasks seemed very precious to him. And when he watered the flower for
+the last time, and prepared to place her under the shelter of her glass globe, he realised that he
+was very close to tears. “Goodbye,” he said to the flower. But she made no answer. “Goodbye,”
+he said again. The flower coughed. But it was not because she had a cold.
+
+“I have been silly,” she said to him, at last. “I ask your forgiveness. Try to be happy...” He was
+surprised by this absence of reproaches. He stood there all bewildered, the glass globe held
+arrested in mid-air. He did not understand this quiet sweetness.
+
+“Of course I love you,” the flower said to him. “It is my fault that you have not known it all the
+while. That is of no importance. But you, you have been just as foolish as I. Try to be happy... let
+the glass globe be. I don’t want it any more.”
+
+“But the wind...” “My cold is not so bad as all that... the cool night air will do me good. I am a
+flower.”
+
+“But the animals...” “Well, I must endure the presence of two or three caterpillars if I wish to
+become acquainted with the butterflies. It seems that they are very beautiful. And if not the
+butterflies and the caterpillars who will call upon me? You will be far away... as for the large
+animals, I am not at all afraid of any of them. I have my claws.”
+
+And, naively, she showed her four thorns.
+
+Then she added: “Don’t linger like this. You have decided to go away. Now go!”
+
+For she did not want him to see her crying. She was such a proud flower...
+
+
+
+He found himself in the neighbourhood of the asteroids 325, 326, 327, 328, 329, and 330. He
+began, therefore, by visiting them, in order to add to his knowledge. The first of them was
+inhabited by a king. Clad in royal purple and ermine, he was seated upon a throne, which was at
+
+
+
+
+the same time both simple and majestic.
+
+
+
+“Ah! Here is a subject,” exclaimed the king, when he saw the little prince coming. And the little
+prince asked himself: “How could he recognise me when he had never seen me before?”
+
+He did not know how the world is simplified for kings. To them, all men are subjects. “Approach,
+so that I may see you better,” said the king, who felt consumingly proud of being at last a king
+over somebody.
+
+The little prince looked everywhere to find a place to sit down; but the entire planet was crammed
+and obstructed by the king’s magnificent ermine robe. So he remained standing upright, and, since
+he was tired, he yawned.
+
+“It is contrary to etiquette to yawn in the presence of a king,” the monarch said to him. “I forbid
+you to do so.”
+
+“I can’t help it. I can’t stop myself,” replied the little prince, thoroughly embarrassed.
+
+“I have come on a long journey, and I have had no sleep...”
+
+“Ah, then,” the king said. “I order you to yawn. It is years since I have seen anyone yawning.
+Yawns, to me, are objects of curiosity. Come, now! Yawn again! It is an order.”
+
+“That frightens me... I cannot, any more...” murmured the little prince, now completely abashed.
+
+“Hum! Hum!” replied the king. “Then I... I order you sometimes to yawn and sometimes to” He
+sputtered a little, and seemed vexed. For what the king fundamentally insisted upon was that his
+authority should be respected. He tolerated no disobedience. He was an absolute monarch. But,
+because he was a very good man, he made his orders reasonable.
+
+“If I ordered a general,” he would say, by way of example, “if I ordered a general to change
+himself into a sea bird, and if the general did not obey me, that would not be the fault of the
+general. It would be my fault.”
+
+“May I sit down?” came now a timid inquiry from the little prince. “I order you to do so,” the king
+answered him, and majestically gathered in a fold of his ermine mantle. But the little prince was
+wondering... The planet was tiny. Over what could this king really rule?
+
+“Sire,” he said to him, “I beg that you will excuse my asking you a question”
+
+“I order you to ask me a question,” the king hastened to assure him. “Sire, over what do you
+rule?” “Over everything,” said the king, with magnificent simplicity.
+
+“Over everything?” The king made a gesture, which took in his planet, the other planets, and all
+the stars. “Over all that?” asked the little prince. “Over all that,” the king answered. For his rule
+was not only absolute: it was also universal. “And the stars obey you?” “Certainly they do,” the
+king said. “They obey instantly. I do not permit insubordination.”
+
+Such power was a thing for the little prince to marvel at. If he had been master of such complete
+authority, he would have been able to watch the sunset, not forty-four times in one day, but
+seventy-two, or even a hundred, or even two hundred times, with out ever having to move his
+chair. And because he felt a bit sad as he remembered his little planet, which he had forsaken, he
+plucked up his courage to ask the king a favour:
+
+
+
+
+
+“I should like to see a sunset... do me that kindness... Order the sun to set...”
+
+“If I ordered a general to fly from one flower to another like a butterfly, or to write a tragic
+drama, or to change himself into a sea bird, and if the general did not carry out the order that he
+had received, which one of us would be in the wrong?” the king demanded. “The general, or
+myself?”
+
+“You,” said the little prince firmly.
+
+“Exactly. One much require from each one the duty which each one can perform,” the king went
+on. “Accepted authority rests first of all on reason. If you ordered your people to go and throw
+themselves into the sea, they would rise up in revolution. I have the right to require obedience
+because my orders are reasonable.”
+
+“Then my sunset?” the little prince reminded him: for he never forgot a question once he had
+asked it.
+
+“You shall have your sunset. I shall command it. But, according to my science of government, I
+shall wait until conditions are favourable.”
+
+“When will that be?” inquired the little prince. “Hum! Hum!” replied the king; and before saying
+anything else he consulted a bulky almanac. “Hum! Hum! That will be about... about... that will be
+this evening about twenty minutes to eight. And you will see how well I am obeyed.”
+
+The little prince yawned. He was regretting his lost sunset. And then, too, he was already
+beginning to be a little bored. “I have nothing more to do here,” he said to the king. “So I shall set
+out on my way again.” “Do not go,” said the king, who was very proud of having a subject. “Do
+not go. I will make you a Minister!” “Minister of what?” “Minster of...of Justice!” “But there is
+nobody here to judge!” “We do not know that,” the king said to him. “I have not yet made a
+complete tour of my kingdom. I am very old. There is no room here for a carriage. And it tires me
+to walk.” “Oh, but I have looked already!” said the little prince, turning around to give one more
+glance to the other side of the planet.
+
+On that side, as on this, there was nobody at all... “Then you shall judge yourself,” the king
+answered, “that is the most difficult thing of all. It is much more difficult to j udge oneself than to
+j udge others. If you succeed in j udging yourself rightly, then you are indeed a man of true
+wisdom.”
+
+
+
+“Yes,” said the little prince, “but I can judge myself anywhere. I do not need to live on this planet.
+“Hum! Hum!” said the king. “I have good reason to believe that somewhere on my planet there is
+an old rat. I hear him at night. You can judge this old rat. From time to time you will condemn him
+to death. Thus his life will depend on your j ustice. But you will pardon him on each occasion; for
+he must be treated thriftily. He is the only one we have.”
+
+“I,” replied the little prince, “do not like to condemn anyone to death. And now I think I will go on
+my way.” “No,” said the king. But the little prince, having now completed his preparations for
+departure, had no wish to grieve the old monarch. “If Your Majesty wishes to be promptly
+obeyed,” he said, “he should be able to give me a reasonable order. He should be able, for
+example, to order me to be gone by the end of one minute. It seems to me that conditions are
+favourable...” As the king made no answer, the little prince hesitated a moment.
+
+Then, with a sigh, he took his leave. “I made you my Ambassador,” the king called out, hastily.
+
+He had a magnificent air of authority.
+
+“The grown-ups are very strange,” the little prince said to himself, as he continued on his journey.
+The second planet was inhabited by a conceited man.
+
+
+
+
+
+
+
+
+
+
+“Ah! Ah! I am about to receive a visit from an admirer!” he exclaimed from afar, when he first
+saw the little prince coming. For, to conceited men, all other men are admirers.
+
+“Good morning,” said the little prince. “That is a queer hat you are wearing.”
+
+“It is a hat for salutes,” the conceited man replied. “It is to raise in salute when people acclaim
+me. Unfortunately, nobody at all ever passes this way.”
+
+“Yes?” said the little prince, who did not understand what the conceited man was talking about.
+
+“Clap your hands, one against the other,” the conceited man now directed him. The little prince
+clapped his hands. The conceited man raised his hat in a modest salute. “This is more entertaining
+than the visit to the king,” the little prince said to himself. And he began again to clap his hands,
+one against the other. The conceited man against raised his hat in salute. After five minutes of
+
+
+
+this exercise the little prince grew tired of the game’s monotony. “And what should one do to
+make the hat come down?” he asked. But the conceited man did not hear him. Conceited people
+never hear anything but praise.
+
+“Do you really admire me very much?” he demanded of the little prince. “What does that mean,
+‘admire’?”
+
+“To admire means that you regard me as the handsomest, the best-dressed, the richest, and the
+most intelligent man on this planet.” “But you are the only man on your planet!” “Do me this
+kindness. Admire me just the same.”
+
+“I admire you,” said the little prince, shrugging his shoulders slightly, “but what is there in that to
+interest you so much?”
+
+And the little prince went away. “The grown-ups are certainly very odd,” he said to himself, as he
+continued on his journey.
+
+The next planet was inhabited by a tippler.
+
+
+
+
+This was a very short visit, but it plunged the little prince into deep dejection. “What are you
+doing there?” he said to the tippler, whom he found settled down in silence before a collection of
+empty bottles and also a collection of full bottles.
+
+“I am drinking,” replied the tippler, with a lugubrious air.
+
+“Why are you drinking?” demanded the little prince.
+
+“So that I may forget,” replied the tippler. “Forget what?” inquired the little prince, who already
+was sorry for him.
+
+“Forget that I am ashamed,” the tippler confessed, hanging his head.
+
+“Ashamed of what?” insisted the little prince, who wanted to help him.
+
+“Ashamed of drinking!” The tippler brought his speech to an end, and shut himself up in an
+impregnable silence.
+
+And the little prince went away, puzzled. “The grown-ups are certainly very, very odd,” he said to
+himself, as he continued on his journey.
+
+The fourth planet belonged to a businessman.
+
+This man was so much occupied that he did not even raise his head at the little prince’s arrival.
+
+
+
+“Good morning,” the little prince said to him. “Your cigarette has gone out.”
+
+
+
+“Three and two make five. Five and seven make twelve. Twelve and three make fifteen. Good
+morning. Fifteen and seven make twenty-two. Twenty-two and six make twenty-eight. I haven’t
+time to light it again. Twenty-six and five make thirty-one. Phew ! Then that makes five-hundred-
+and-one-million, six-hundred-twenty-two-thousand, seven-hundred-thirty-one.”
+
+“Five hundred million what?” asked the little prince. “Eh? Are you still there? Five-hundred-and-
+one million, I can’t stop... I have so much to do! I am concerned with matters of consequence. I
+don’t amuse myself with balderdash. Two and five make seven...”
+
+“Five-hundred-and-one million what?” repeated the little prince, who never in his life had let go of
+a question once he had asked it.
+
+The businessman raised his head. “During the fifty-four years that I have inhabited this planet, I
+have been disturbed only three times. The first time was twenty-two years ago, when some giddy
+goose fell from goodness knows where. He made the most frightful noise that resounded all over
+the place, and I made four mistakes in my addition. The second time, eleven years ago, I was
+disturbed by an attack of rheumatism. I don’t get enough exercise. I have no time for loafing. The
+third time, well, this is it! I was saying, then, five -hundred-and-one millions”
+
+“Millions of what?” The businessman suddenly realised that there was no hope of being left in
+peace until he answered this question.
+
+“Millions of those little objects,” he said, “which one sometimes sees in the sky.” “Flies?” “Oh,
+no. Little glittering objects.” “Bees?” “Oh, no. Little golden objects that set lazy men to idle
+dreaming. As for me, I am concerned with matters of consequence. There is no time for idle
+dreaming in my life.” “Ah! You mean the stars?” “Yes, that’s it. The stars.” “And what do you do
+with five-hundred millions of stars?” “Five-hundred-and-one million, six-hundred-twenty-two
+thousand, seven-hundred-thirty-one. I am concerned with matters of consequence: I am
+accurate.”
+
+“And what do you do with these stars?” “What do I do with them?” “Yes.” “Nothing. I own them.”
+“You own the stars?” “Yes.” “But I have already seen a king who...” “Kings do not own, they
+reign over. It is a very different matter.”
+
+“And what good does it do you to own the stars?” “It does me the good of making me rich.”
+
+“And what good does it do you to be rich?”
+
+“It makes it possible for me to buy more stars, if any are ever discovered.”
+
+“This man,” the little prince said to himself, “reasons a little like my poor tippler...” Nevertheless,
+he still had some more questions. “How is it possible for one to own the stars?” “To whom do they
+belong?” the businessman retorted, peevishly. “I don’t know. To nobody.” “Then they belong to
+me, because I was the first person to think of it.” “Is that all that is necessary?” “Certainly.
+
+When you find a diamond that belongs to nobody, it is yours. When you discover an island that
+belongs to nobody, it is yours. When you get an idea before any one else, you take out a patent on
+it: it is yours. So with me: I own the stars, because nobody else before me ever thought of owning
+them.”
+
+“Yes, that is true,” said the little prince. “And what do you do with them?”
+
+
+
+
+“I administer them,” replied the businessman. “I count them and recount them. It is difficult. But I
+am a man who is naturally interested in matters of consequence.”
+
+The little prince was still not satisfied. “If I owned a silk scarf,” he said, “I could put it around my
+neck and take it away with me. If I owned a flower, I could pluck that flower and take it away with
+me. But you cannot pluck the stars from heaven...”
+
+“No. But I can put them in the bank.” “Whatever does that mean?” “That means that I write the
+number of my stars on a little paper. And then I put this paper in a drawer and lock it with a key.”
+
+“And that is all?”
+
+“That is enough,” said the businessman.
+
+“It is entertaining,” thought the little prince. “It is rather poetic. But it is of no great
+consequence.” On matters of consequence, the little prince had ideas, which were very different
+from those of the grown-ups.
+
+“I myself own a flower,” he continued his conversation with the businessman, “which I water
+every day. I own three volcanoes, which I clean out every week (for I also clean out the one that is
+extinct; one never knows). It is of some use to my volcanoes, and it is of some use to my flower,
+that I own them. But you are of no use to the stars...”
+
+The businessman opened his mouth, but he found nothing to say in answer. And the little prince
+went away. “The grown-ups are certainly altogether extraordinary,” he said simply, talking to
+himself as he continued on his journey.
+
+The fifth planet was very strange. It was the smallest of all. There was just enough room on it for
+a street lamp and a lamplighter.
+
+
+
+
+The little prince was not able to reach any explanation of the use of a street lamp and a
+lamplighter, somewhere in the heavens, on a planet, which had no people, and not one house.
+
+But he said to himself, nevertheless: “It may well be that this man is absurd. But he is not so
+absurd as the king, the conceited man, the businessman, and the tippler. For at least his work has
+
+
+
+some meaning. When he lights his street lamp, it is as if he brought one more star to life, or one
+flower. When he puts out his lamp, he sends the flower, or the star, to sleep. That is a beautiful
+occupation. And since it is beautiful, it is truly useful.”
+
+When he arrived on the planet he respectfully saluted the lamplighter.
+
+“Good morning. Why have you just put out your lamp?”
+
+“Those are the orders,” replied the lamplighter. “Good morning.”
+
+“What are the orders?”
+
+“The orders are that I put out my lamp. Good evening.” And he lighted his lamp again. “But why
+have you just lighted it again?”
+
+“Those are the orders,” replied the lamplighter.
+
+“I do not understand,” said the little prince.
+
+“There is nothing to understand,” said the lamplighter. “Orders are orders. Good morning.” And
+he put out his lamp.
+
+Then he mopped his forehead with a handkerchief decorated with red squares.
+
+“I follow a terrible profession. In the old days it was reasonable. I put the lamp out in the morning,
+and in the evening I lighted it again. I had the rest of the day for relaxation and the rest of the
+night for sleep.”
+
+“And the orders have been changed since that time?”
+
+“The orders have not been changed,” said the lamplighter. “That is the tragedy! From year to
+year the planet has turned more rapidly and the orders have not been changed!”
+
+“Then what?” asked the little prince.
+
+“Then the planet now makes a complete turn every minute, and I no longer have a single second
+for repose. Once every minute I have to light my lamp and put it out!”
+
+“That is very funny! A day lasts only one minute, here where you live!”
+
+“It is not funny at all!” said the lamplighter. “While we have been talking together a month has
+gone by.”
+
+“A month?”
+
+
+
+“Yes, a month. Thirty minutes. Thirty days. Good evening.” And he lighted his lamp again. As the
+little prince watched him, he felt that he loved this lamplighter who was so faithful to his orders.
+He remembered the sunsets, which he himself had gone to seek, in other days, merely by pulling
+up his chair; and he wanted to help his friend.
+
+“You know,” he said, “I can tell you a way you can rest whenever you want to...”
+
+“I always want to rest,” said the lamplighter. For it is possible for a man to be faithful and lazy at
+the same time.
+
+
+
+
+The little prince went on with his explanation: “Your planet is so small that three strides will take
+you all the way around it. To be always in the sunshine, you need only walk along rather slowly.
+When you want to rest, you will walk and the day will last as long as you like.”
+
+“That doesn’t do me much good,” said the lamplighter. “The one thing I love in life is to sleep.”
+
+“Then you’re unlucky,” said the little prince.
+
+“I am unlucky,” said the lamplighter. “Good morning.” And he put out his lamp.
+
+“That man,” said the little prince to himself, as he continued farther on his journey, “that man
+would be scorned by all the others: by the king, by the conceited man, by the tippler, by the
+businessman. Nevertheless he is the only one of them all who does not seem to me ridiculous.
+Perhaps that is because he is thinking of something else besides himself.”
+
+He breathed a sigh of regret, and said to himself, again: “That man is the only one of them all
+whom I could have made my friend. But his planet is indeed too small. There is no room on it for
+two people...” What the little prince did not dare confess was that he was sorry most of all to leave
+this planet, because it was blest every day with 1440 sunsets!
+
+The sixth planet was ten times larger than the last one. It was inhabited by an old gentleman who
+wrote voluminous books.
+
+
+
+
+“Oh, look! Here is an explorer!” he exclaimed to himself when he saw the little prince coming.
+
+The little prince sat down on the table and panted a little. He had already travelled so much and
+so far!
+
+“Where do you come from?” the old gentleman said to him.
+
+“What is that big book?” said the little prince. “What are you doing?”
+
+“I am a geographer,” the old gentleman said to him.
+
+“What is a geographer?” asked the little prince. “A geographer is a scholar who knows the
+location of all the seas, rivers, towns, mountains, and deserts.”
+
+“That is very interesting,” said the little prince. “Here at last is a man who has a real profession!”
+And he cast a look around him at the planet of the geographer.
+
+
+
+It was the most magnificent and stately planet that he had ever seen.
+
+“Your planet is very beautiful,” he said. “Has it any oceans?”
+
+“I couldn’t tell you,” said the geographer.
+
+“Ah!” The little prince was disappointed. “Has it any mountains?”
+
+“I couldn’t tell you,” said the geographer.
+
+“And towns, and rivers, and deserts?”
+
+“I couldn’t tell you that, either.”
+
+“But you are a geographer!”
+
+“Exactly,” the geographer said. “But I am not an explorer. I haven’t a single explorer on my
+planet. It is not the geographer who goes out to count the towns, the rivers, the mountains, the
+seas, the oceans, and the deserts. The geographer is much too important to go loafing about. He
+does not leave his desk. But he receives the explorers in his study. He asks them questions, and
+he notes down what they recall of their travels. And if the recollections of any one among them
+seem interesting to him, the geographer orders an inquiry into that explorer’s moral character.”
+
+“Why is that?”
+
+“Because an explorer who told lies would bring disaster on the books of the geographer. So would
+an explorer who drank too much.”
+
+“Why is that?” asked the little prince.
+
+“Because intoxicated men see double. Then the geographer would note down two mountains in a
+place where there was only one.”
+
+“I know some one,” said the little prince, “who would make a bad explorer.”
+
+“That is possible. Then, when the moral character of the explorer is shown to be good, an inquiry
+is ordered into his discovery.”
+
+“One goes to see it?”
+
+“No. That would be too complicated. But one requires the explorer to furnish proofs. For example,
+if the discovery in question is that of a large mountain, one requires that large stones be brought
+back from it.” The geographer was suddenly stirred to excitement. “But you come from far away!
+You are an explorer! You shall describe your planet to me!” And, having opened his big register,
+the geographer sharpened his pencil. The recitals of explorers are put down first in pencil. One
+waits until the explorer has furnished proofs, before putting them down in ink. “Well?” said the
+geographer expectantly.
+
+“Oh, where I live,” said the little prince, “it is not very interesting. It is all so small. I have three
+volcanoes. Two volcanoes are active and the other is extinct. But one never knows.”
+
+“One never knows,” said the geographer.
+
+
+
+“I have also a flower.”
+
+
+
+
+“We do not record flowers,” said the geographer.
+
+“Why is that? The flower is the most beautiful thing on my planet!”
+
+“We do not record them,” said the geographer, “because they are ephemeral.”
+
+“What does that mean ‘ephemeral’?”
+
+“Geographies,” said the geographer, “are the books which, of all books, are most concerned with
+matters of consequence. They never become old-fashioned. It is very rarely that a mountain
+changes its position. It is very rarely that an ocean empties itself of its waters. We write of eternal
+things.”
+
+“But extinct volcanoes may come to life again,” the little prince interrupted.
+
+“What does that mean ‘ephemeral’?”
+
+“Whether volcanoes are extinct or alive, it comes to the same thing for us,” said the geographer.
+“The thing that matters to us is the mountain. It does not change.”
+
+“But what does that mean ‘ephemeral’?” repeated the little prince, who never in his life had let go
+of a question, once he had asked it.
+
+“It means, ‘which is in danger of speedy disappearance.’ “
+
+“Is my flower in danger of speedy disappearance?”
+
+“Certainly it is.”
+
+“My flower is ephemeral,” the little prince said to himself, “and she has only four thorns to
+defend herself against the world. And I have left her on my planet, all alone!”
+
+That was his first moment of regret. But he took courage once more. “What place would you
+advise me to visit now?” he asked. “The planet Earth,” replied the geographer. “It has a good
+reputation.” And the little prince went away, thinking of his flower.
+
+
+
+
+So then the seventh planet was the Earth.
+
+The Earth is not just an ordinary planet!
+
+One can count, there 111 kings (not forgetting, to be sure, the Negro kings among them), 7000
+geographers, 900,000 businessmen, 7,500,000 tipplers, 311,000,000 conceited men, that is to say,
+about 2,000,000,000 grown-ups.
+
+To give you an idea of the size of the Earth, I will tell you that before the invention of electricity it
+was necessary to maintain, over the whole of the six continents, a veritable army of 462,511
+lamplighters for the street lamps. Seen from a slight distance, that would make a splendid
+spectacle.
+
+The movements of this army would be regulated like those of the ballet in the opera. First would
+come the turn of the lamplighters of New Zealand and Australia. Having set their lamps alight,
+these would go off to sleep. Next, the lamplighters of China and Siberia would enter for their steps
+in the dance, and then they too would be waved back into the wings. After that would come the
+turn of the lamplighters of Russia and the Indies; then those of Africa and Europe, then those of
+South America; then those of North America. And never would they make a mistake in the order
+of their entry upon the stage. It would be magnificent.
+
+Only the man who was in charge of the single lamp at the North Pole, and his colleague who was
+responsible for the single lamp at the South Pole, only these two would live free from toil and
+care: they would be busy twice a year.
+
+When one wishes to play the wit, he sometimes wanders a little from the truth.
+
+I have not been altogether honest in what I have told you about the lamplighters. And I realise
+that I run the risk of giving a false idea of our planet to those who do not know it.
+
+Men occupy a very small place upon the Earth. If the two billion inhabitants who people its
+surface were all to stand upright and somewhat crowded together, as they do for some big public
+assembly, they could easily be put into one public square twenty miles long and twenty miles wide.
+All humanity could be piled up on a small Pacific islet.
+
+The grown-ups, to be sure, will not believe you when you tell them that. They imagine that they fill
+a great deal of space. They fancy themselves as important as the baobabs. You should advise
+them, then, to make their own calculations. They adore figures, and that will please them. But do
+not waste your time on this extra task. It is unnecessary. You have, I know, confidence in me.
+
+When the little prince arrived on the Earth, he was very much surprised not to see any people. He
+was beginning to be afraid he had come to the wrong planet, when a coil of gold, the colour of the
+moonlight, flashed across the sand.
+
+“Good evening,” said the little prince courteously.
+
+“Good evening,” said the snake.
+
+“What planet is this on which I have come down?” asked the little prince.
+
+“This is the Earth; this is Africa,” the snake answered.
+
+“Ah! Then there are no people on the Earth?”
+
+
+
+
+“This is the desert. There are no people in the desert. The Earth is large,” said the snake.
+
+The little prince sat down on a stone, and raised his eyes toward the sky.
+
+“I wonder,” he said, “whether the stars are set alight in heaven so that one day each one of us
+may find his own again... Look at my planet. It is right there above us. But how far away it is!”
+
+“It is beautiful,” the snake said. “What has brought you here?”
+
+“I have been having some trouble with a flower,” said the little prince. “Ah!” said the snake. And
+they were both silent.
+
+“Where are the men?” the little prince at last took up the conversation again. “It is a little lonely
+in the desert...”
+
+“It is also lonely among men,” the snake said. The little prince gazed at him for a long time.
+
+“You are a funny animal,” he said at last. “You are no thicker than a finger...”
+
+“But I am more powerful than the finger of a king,” said the snake.
+
+The little prince smiled. “You are not very powerful. You haven’t even any feet. You cannot even
+travel...”
+
+“I can carry you farther than any ship could take you,” said the snake. He twined himself around
+the little prince’s ankle, like a golden bracelet.
+
+“Whomever I touch, I send back to the earth from whence he came,” the snake spoke again. “But
+you are innocent and true, and you come from a star...”
+
+The little prince made no reply. “You move me to pity, you are so weak on this Earth made of
+granite,” the snake said. “I can help you, some day, if you grow too homesick for your own planet.
+I can...”
+
+“Oh! I understand you very well,” said the little prince. “But why do you always speak in
+riddles?”
+
+“I solve them all,” said the snake. And they were both silent.
+
+The little prince crossed the desert and met with only one flower.
+
+It was a flower with three petals, a flower of no account at all.
+
+“Good morning,” said the little prince.
+
+“Good morning,” said the flower.
+
+“Where are the men?” the little prince asked, politely. The flower had once seen a caravan
+passing.
+
+“Men?” she echoed. “I think there are six or seven of them in existence. I saw them, several
+years ago. But one never knows where to find them. The wind blows them away. They have no
+roots, and that makes their life very difficult.”
+
+
+
+“Goodbye,” said the little prince.
+
+
+
+
+“Goodbye,” said the flower.
+
+
+
+After that, the little prince climbed a high mountain. The only mountains he had ever known were
+the three volcanoes, which came up to his knees. And he used the extinct volcano as a footstool.
+
+“From a mountain as high as this one,” he said to himself, “I shall be able to see the whole planet
+at one glance, and all the people...” But he saw nothing, save peaks of rock that were sharpened
+like needles.
+
+
+
+
+“Good morning,” he said courteously.
+
+“Good morning...Good morning...Good morning,” answered the echo.
+
+“Who are you?” said the little prince.
+
+“Who are you...Who are you...Who are you?” answered the echo.
+
+“Be my friends. I am all alone,” he said.
+
+“I am all alone...all alone. ..all alone,” answered the echo.
+
+“What a queer planet!” he thought. “It is altogether dry, and altogether pointed, and altogether
+harsh and forbidding. And the people have no imagination. They repeat whatever one says to
+them... On my planet I had a flower; she always was the first to speak...”
+
+But it happened that after walking for a long time through sand, and rocks, and snow, the little
+prince at last came upon a road. And all roads lead to the abodes of men.
+
+“Good morning,” he said. He was standing before a garden, all a-bloom with roses.
+
+“Good morning,” said the roses.
+
+The little prince gazed at them. They all looked like his flower.
+
+“Who are you?” he demanded, thunderstruck.
+
+“We are roses,” the roses said. And he was overcome with sadness. His flower had told him that
+she was the only one of her kind in all the universe. And here were five thousand of them, all
+alike, in one single garden!
+
+“She would be very much annoyed,” he said to himself, “if she should see that... she would cough
+
+
+
+most dreadfully, and she would pretend that she was dying, to avoid being laughed at. And I
+should be obliged to pretend that I was nursing her back to life, for if I did not do that, to humble
+myself also, she would really allow herself to die...”
+
+Then he went on with his reflections: “I thought that I was rich, with a flower that was unique in all
+the world; and all I had was a common rose. A common rose, and three volcanoes that come up to
+my knees — and one of them perhaps extinct forever... that doesn’t make me a very great
+prince...” And he lay down in the grass and cried.
+
+It was then that the fox appeared.
+
+“Good morning,” said the fox.
+
+“Good morning,” the little prince responded politely, although when he turned around he saw
+nothing.
+
+“I am right here,” the voice said, “under the apple tree.” “
+
+Who are you?” asked the little prince, and added, “You are very pretty to look at.”
+
+“I am a fox,” said the fox.
+
+“Come and play with me,” proposed the little prince.
+
+“I am so unhappy.” “I cannot play with you,” the fox said. “I am not tamed.”
+
+“Ah! Please excuse me,” said the little prince. But, after some thought, he added: “What does
+that mean, ‘tame’?”
+
+
+
+
+“You do not live here,” said the fox. “What is it that you are looking for?”
+
+“I am looking for men,” said the little prince. “What does that mean, ‘tame’?”
+
+“Men,” said the fox. “They have guns, and they hunt. It is very disturbing. They also raise
+chickens. These are their only interests. Are you looking for chickens?”
+
+“No,” said the little prince. “I am looking for friends. What does that mean, ‘tame’?”
+
+“It is an act too often neglected,” said the fox. It means to establish ties.”
+
+
+
+“‘To establish ties’?”
+
+
+
+“Just that,” said the fox. “To me, you are still nothing more than a little boy who is just like a
+hundred thousand other little boys. And I have no need of you. And you, on your part, have no
+need of me. To you, I am nothing more than a fox like a hundred thousand other foxes. But if you
+tame me, then we shall need each other. To me, you will be unique in all the world. To you, I shall
+be unique in all the world...”
+
+“I am beginning to understand,” said the little prince. “There is a flower... I think that she has
+tamed me...”
+
+“It is possible,” said the fox. “On the Earth one sees all sorts of things.”
+
+“Oh, but this is not on the Earth!” said the little prince. The fox seemed perplexed, and very
+curious.
+
+“On another planet?”
+
+“Yes.”
+
+“Are there hunters on this planet?”
+
+“No.”
+
+“Ah, that is interesting! Are there chickens?”
+
+“No.”
+
+“Nothing is perfect,” sighed the fox. But he came back to his idea. “My life is very monotonous,”
+the fox said. “I hunt chickens; men hunt me. All the chickens are just alike, and all the men are
+just alike. And, in consequence, I am a little bored. But if you tame me, it will be as if the sun
+came to shine on my life. I shall know the sound of a step that will be different from all the others.
+Other steps send me hurrying back underneath the ground. Yours will call me, like music, out of
+my burrow. And then look: you see the grain-fields down yonder? I do not eat bread. Wheat is of
+no use to me. The wheat fields have nothing to say to me. And that is sad. But you have hair that
+is the colour of gold. Think how wonderful that will be when you have tamed me! The grain, which
+is also golden, will bring me back the thought of you. And I shall love to listen to the wind in the
+wheat...” The fox gazed at the little prince, for a long time. “Please, tame me!” he said.
+
+“I want to, very much,” the little prince replied. “But I have not much time. I have friends to
+discover, and a great many things to understand.”
+
+“One only understands the things that one tames,” said the fox. “Men have no more time to
+understand anything. They buy things all ready-made at the shops. But there is no shop anywhere
+where one can buy friendship, and so men have no friends any more. If you want a friend, tame
+me...”
+
+“What must I do, to tame you?” asked the little prince.
+
+“You must be very patient,” replied the fox. “First you will sit down at a little distance from me,
+like that, in the grass. I shall look at you out of the corner of my eye, and you will say nothing.
+Words are the source of misunderstandings. But you will sit a little closer to me, every day...”
+
+
+
+
+The next day the little prince came back.
+
+
+
+“It would have been better to come back at the same hour,” said the fox. “If, for example, you
+come at four o’clock in the afternoon, then at three o’clock I shall begin to be happy. I shall feel
+happier and happier as the hour advances. At four o’clock, I shall already be worrying and
+jumping about. I shall show you how happy I am! But if you come at just any time, I shall never
+know at what hour my heart is to be ready to greet you... One must observe the proper rites...”
+
+“What is a rite?” asked the little prince.
+
+“Those also are actions too often neglected,” said the fox. “They are what make one day
+different from other days, one hour from other hours. There is a rite, for example, among my
+hunters. Every Thursday they dance with the village girls. So Thursday is a wonderful day for me!
+I can take a walk as far as the vineyards. But if the hunters danced at just any time, every day
+would be like every other day, and I should never have any vacation at all.”
+
+So the little prince tamed the fox. And when the hour of his departure drew near...
+
+“Ah,” said the fox, “I shall cry.”
+
+“It is your own fault,” said the little prince. “I never wished you any sort of harm; but you wanted
+me to tame you...”
+
+“Yes, that is so,” said the fox.
+
+“But now you are going to cry!” said the little prince.
+
+“Yes, that is so,” said the fox.
+
+“Then it has done you no good at all!”
+
+“It has done me good,” said the fox, “because of the colour of the wheat fields.” And then he
+added: “Go and look again at the roses. You will understand now that yours is unique in all the
+world. Then come back to say goodbye to me, and I will make you a present of a secret.”
+
+The little prince went away, to look again at the roses. “You are not at all like my rose,” he said.
+“As yet you are nothing. No one has tamed you, and you have tamed no one. You are like my fox
+when I first knew him. He was only a fox like a hundred thousand other foxes. But I have made
+him my friend, and now he is unique in all the world.” And the roses were very much embarrassed.
+“You are beautiful, but you are empty,” he went on. “One could not die for you. To be sure, an
+ordinary passer-by would think that my rose looked just like you, the rose that belongs to me. But
+in herself alone she is more important than all the hundreds of you other roses: because it is she
+that I have watered; because it is she that I have put under the glass globe; because it is she that
+I have sheltered behind the screen; because it is for her that I have killed the caterpillars (except
+the two or three that we saved to become butterflies); because it is she that I have listened to,
+when she grumbled, or boasted, or even sometimes when she said nothing. Because she is my
+rose.
+
+And he went back to meet the fox. “Goodbye,” he said.
+
+“Goodbye,” said the fox. “And now here is my secret, a very simple secret: It is only with the
+heart that one can see rightly; what is essential is invisible to the eye.”
+
+
+
+
+“What is essential is invisible to the eye,” the little prince repeated, so that he would be sure to
+remember.
+
+“It is the time you have wasted for your rose that makes your rose so important.”
+
+“It is the time I have wasted for my rose...” said the little prince, so that he would be sure to
+remember.
+
+“Men have forgotten this truth,” said the fox. “But you must not forget it. You become
+responsible, forever, for what you have tamed. You are responsible for your rose...”
+
+“I am responsible for my rose,” the little prince repeated, so that he would be sure to remember.
+
+“Good morning,” said the little prince.
+
+“Good morning,” said the railway switchman.
+
+“What do you do here?” the little prince asked.
+
+“I sort out travellers, in bundles of a thousand,” said the switchman. “I send off the trains that
+carry them; now to the right, now to the left.” And a brilliantly lighted express train shook the
+switchman’s cabin as it rushed by with a roar like thunder.
+
+“They are in a great hurry,” said the little prince. “What are they looking for?”
+
+“Not even the locomotive engineer knows that,” said the switchman. And a second brilliantly
+lighted express thundered by, in the opposite direction.
+
+“Are they coming back already?” demanded the little prince. “These are not the same ones,” said
+the switchman. “It is an exchange.”
+
+“Were they not satisfied where they were?” asked the little prince.
+
+“No one is ever satisfied where he is,” said the switchman. And they heard the roaring thunder of
+a third brilliantly lighted express.
+
+“Are they pursuing the first travellers?” demanded the little prince.
+
+“They are pursuing nothing at all,” said the switchman. “They are asleep in there, or if they are
+not asleep they are yawning. Only the children are flattening their noses against the
+windowpanes.”
+
+“Only the children know what they are looking for,” said the little prince.
+
+“They waste their time over a rag doll and it becomes very important to them; and if anybody
+takes it away from them, they cry...” “They are lucky,” the switchman said.
+
+“Good morning,” said the little prince.
+
+“Good morning,” said the merchant.
+
+This was a merchant who sold pills that had been invented to quench thirst. You need only swallow
+one pill a week, and you would feel no need of anything to drink.
+
+
+
+
+“Why are you selling those?” asked the little prince.
+
+
+
+“Because they save a tremendous amount of time,” said the merchant. “Computations have been
+made by experts. With these pills, you save fifty-three minutes in every week.”
+
+“And what do I do with those fifty-three minutes?”
+
+“Anything you like...”
+
+“As for me,” said the little prince to himself, “if I had fifty-three minutes to spend as I liked, I
+should walk at my leisure toward a spring of fresh water.”
+
+It was now the eighth day since I had had my accident in the desert, and I had listened to the story
+of the merchant as I was drinking the last drop of my water supply.
+
+“Ah,” I said to the little prince, “these memories of yours are very charming; but I have not yet
+succeeded in repairing my plane; I have nothing more to drink; and I, too, should be very happy if
+I could walk at my leisure toward a spring of fresh water!”
+
+“My friend the fox...” the little prince said to me.
+
+“My dear little man, this is no longer a matter that has anything to do with the fox!”
+
+“Why not?”
+
+“Because I am about to die of thirst...”
+
+He did not follow my reasoning, and he answered me: “It is a good thing to have had a friend,
+even if one is about to die. I, for instance, am very glad to have had a fox as a friend...”
+
+“He has no way of guessing the danger,” I said to myself. “He has never been either hungry or
+thirsty. A little sunshine is all he needs...”
+
+But he looked at me steadily, and replied to my thought: “I am thirsty, too. Let us look for a
+well...” I made a gesture of weariness. It is absurd to look for a well, at random, in the immensity
+of the desert. But nevertheless we started walking.
+
+When we had trudged along for several hours, in silence, the darkness fell, and the stars began to
+come out. Thirst had made me a little feverish, and I looked at them as if I were in a dream. The
+little prince’s last words came reeling back into my memory: “Then you are thirsty, too?” I
+demanded. But he did not reply to my question. He merely said to me: “Water may also be good
+for the heart...”
+
+I did not understand this answer, but I said nothing. I knew very well that it was impossible to
+cross-examine him. He was tired. He sat down. I sat down beside him. And, after a little silence,
+he spoke again: “The stars are beautiful, because of a flower that cannot be seen.”
+
+I replied, “Yes, that is so.” And, without saying anything more, I looked across the ridges of sand
+that were stretched out before us in the moonlight.
+
+“The desert is beautiful,” the little prince added.
+
+And that was true. I have always loved the desert. One sits down on a desert sand dune, sees
+
+
+
+
+
+nothing, hears nothing. Yet through the silence something throbs, and gleams...
+
+“What makes the desert beautiful,” said the little prince, “is that somewhere it hides a well...”
+
+I was astonished by a sudden understanding of that mysterious radiation of the sands. When I was
+a little boy I lived in an old house, and legend told us that a treasure was buried there. To be sure,
+no one had ever known how to find it; perhaps no one had ever even looked for it. But it cast an
+enchantment over that house. My home was hiding a secret in the depths of its heart... “Yes,” I
+said to the little prince. “The house, the stars, the desert — what gives them their beauty is
+something that is invisible!”
+
+“I am glad,” he said, “that you agree with my fox.” As the little prince dropped off to sleep, I took
+him in my arms and set out walking once more. I felt deeply moved, and stirred. It seemed to me
+that I was carrying a very fragile treasure. It seemed to me, even, that there was nothing more
+fragile on all Earth. In the moonlight I looked at his pale forehead, his closed eyes, his locks of
+hair that trembled in the wind, and I said to myself:
+
+“What I see here is nothing but a shell. What is most important is invisible...”
+
+As his lips opened slightly with the suspicious of a half-smile, I said to myself, again: “What
+moves me so deeply, about this little prince who is sleeping here, is his loyalty to a flower — the
+image of a rose that shines through his whole being like the flame of a lamp, even when he is
+asleep...”
+
+And I felt him to be more fragile still. I felt the need of protecting him, as if he himself were a
+flame that might be extinguished by a little puff of wind... And, as I walked on so, I found the well,
+at daybreak.
+
+“Men,” said the little prince, “set out on their way in express trains, but they do not know what
+they are looking for. Then they rush about, and get excited, and turn round and round...” And he
+added: “It is not worth the trouble...”
+
+
+
+The well that we had come to was not like the wells of the Sahara. The wells of the Sahara are
+mere holes dug in the sand. This one was like a well in a village. But there was no village here,
+and I thought I must be dreaming...
+
+“It is strange,” I said to the little prince. “Everything is ready for use: the pulley, the bucket, the
+rope...” He laughed, touched the rope, and set the pulley to working. And the pulley moaned, like
+an old weathervane, which the wind has long since forgotten.
+
+“Do you hear?” said the little prince. “We have wakened the well, and it is singing...”
+
+I did not want him to tire himself with the rope.
+
+“Leave it to me,” I said. “It is too heavy for you.” I hoisted the bucket slowly to the edge of the
+well and set it there, happy, tired as I was, over my achievement. The song of the pulley was still
+in my ears, and I could see the sunlight shimmer in the still trembling water.
+
+“I am thirsty for this water,” said the little prince. “Give me some of it to drink...”
+
+And I understood what he had been looking for. I raised the bucket to his lips. He drank, his eyes
+closed. It was as sweet as some special festival treat. This water was indeed a different thing from
+ordinary nourishment. Its sweetness was born of the walk under the stars, the song of the pulley,
+the effort of my arms. It was good for the heart, like a present. When I was a little boy, the lights
+of the Christmas tree, the music of the Midnight Mass, the tenderness of smiling faces, used to
+make up, so, the radiance of the gifts I received.
+
+“The men where you live,” said the little prince, “raise five thousand roses in the same garden
+and they do not find in it what they are looking for.”
+
+“They do not find it,” I replied.
+
+“And yet what they are looking for could be found in one single rose, or in a little water.”
+
+“Yes, that is true,” I said.
+
+And the little prince added: “But the eyes are blind. One must look with the heart...”
+
+I had drunk the water. I breathed easily. At sunrise the sand is the colour of honey. And that
+honey colour was making me happy, too. What brought me, then, this sense of grief?
+
+“You must keep your promise,” said the little prince, softly, as he sat down beside me once more.
+“What promise?” “You know, a muzzle for my sheep... I am responsible for this flower...”
+
+I took my rough drafts of drawings out of my pocket. The little prince looked them over, and
+laughed as he said:
+
+“Your baobabs, they look a little like cabbages.”
+
+“Oh!” I had been so proud of my baobabs! “Your fox, his ears look a little like horns; and they are
+too long.” And he laughed again.
+
+“You are not fair, little prince,” I said. “I don’t know how to draw anything except boa constrictors
+from the outside and boa constrictors from the inside.”
+
+
+
+
+
+“Oh, that will be all right,” he said, “children understand.”
+
+So then I made a pencil sketch of a muzzle. And as I gave it to him my heart was torn.
+
+“You have plans that I do not know about,” I said. But he did not answer me. He said to me,
+instead: “You know, my descent to the earth... Tomorrow will be its anniversary.” Then, after a
+silence, he went on: “I came down very near here.” And he flushed.
+
+And once again, without understanding why, I had a queer sense of sorrow. One question,
+however, occurred to me: “Then it was not by chance that on the morning when I first met you — a
+week ago — you were strolling along like that, all alone, a thousand miles from any inhabited
+region? You were on the your way back to the place where you landed?”
+
+The little prince flushed again. And I added, with some hesitancy: “Perhaps it was because of the
+anniversary?” The little prince flushed once more. He never answered questions, but when one
+flushes does that not mean “Yes”?
+
+“Ah,” I said to him, “I am a little frightened...”
+
+But he interrupted me. “Now you must work. You must return to your engine. I will be waiting for
+you here. Come back tomorrow evening...”
+
+But I was not reassured. I remembered the fox. One runs the risk of weeping a little, if one lets
+himself be tamed...
+
+Beside the well there was the ruin of an old stone wall. When I came back from my work, the next
+evening, I saw from some distance away my little prince sitting on top of a wall, with his feet
+dangling. And I heard him say: “Then you don’t remember. This is not the exact spot.” Another
+voice must have answered him, for he replied to it: “Yes, yes! It is the right day, but this is not the
+place.”
+
+I continued my walk toward the wall. At no time did I see or hear anyone. The little prince,
+however, replied once again: “...Exactly. You will see where my track begins, in the sand. You have
+nothing to do but wait for me there. I shall be there tonight.”
+
+
+
+I was only twenty metres from the wall, and I still saw nothing. After a silence the little prince
+spoke again: “You have good poison? You are sure that it will not make me suffer too long?” I
+stopped in my tracks, my heart torn asunder; but still I did not understand. “Now go away,” said
+the little prince. “I want to get down from the wall.”
+
+I dropped my eyes, then, to the foot of the wall... and I leaped into the air. There before me, facing
+the little prince, was one of those yellow snakes that take just thirty seconds to bring your life to
+an end. Even as I was digging into my pocked to get out my revolver I made a running step back.
+But, at the noise I made, the snake let himself flow easily across the sand like the dying spray of
+a fountain, and, in no apparent hurry, disappeared, with a light metallic sound, among the stones. I
+reached the wall just in time to catch my little man in my arms; his face was white as snow.
+
+“What does this mean?” I demanded. “Why are you talking with snakes?”
+
+I had loosened the golden muffler that he always wore. I had moistened his temples, and had
+given him some water to drink. And now I did not dare ask him any more questions. He looked at
+me very gravely, and put his arms around my neck. I felt his heart beating like the heart of a
+dying bird, shot with someone’s rifle...
+
+“I am glad that you have found what was the matter with your engine,” he said. “Now you can go
+back home”
+
+“How do you know about that?” I was just coming to tell him that my work had been successful,
+beyond anything that I had dared to hope.
+
+He made no answer to my question, but he added: “I, too, am going back home today...” Then,
+sadly, “It is much farther... it is much more difficult...” I realised clearly that something
+extraordinary was happening. I was holding him close in my arms as if he were a little child; and
+yet it seemed to me that he was rushing headlong toward an abyss from which I could do nothing
+to restrain him... His look was very serious, like some one lost far away.
+
+“I have your sheep. And I have the sheep’s box. And I have the muzzle...”
+
+And he gave me a sad smile. I waited a long time. I could see that he was reviving little by little.
+
+“Dear little man,” I said to him, “you are afraid...” He was afraid, there was no doubt about that.
+But he laughed lightly.
+
+“I shall be much more afraid this evening...”
+
+Once again I felt myself frozen by the sense of something irreparable. And I knew that I could not
+bear the thought of never hearing that laughter any more. For me, it was like a spring of fresh
+water in the desert.
+
+“Little man,” I said, “I want to hear you laugh again.” But he said to me: “Tonight, it will be a
+year... my star, then, can be found right above the place where I came to the Earth, a year ago...”
+
+“Little man,” I said, “tell me that it is only a bad dream, this affair of the snake, and the meeting-
+place, and the star...” But he did not answer my plea.
+
+He said to me, instead: “The thing that is important is the thing that is not seen...” “Yes, I
+know...”
+
+
+
+
+“It is just as it is with the flower. If you love a flower that lives on a star, it is sweet to look at the
+sky at night. All the stars are a-bloom with flowers...”
+
+“Yes, I know...”
+
+“It is just as it is with the water. Because of the pulley, and the rope, what you gave me to drink
+was like music. You remember, how good it was.”
+
+“Yes, I know...”
+
+“And at night you will look up at the stars. Where I live everything is so small that I cannot show
+you where my star is to be found. It is better, like that. My star will just be one of the stars, for
+you. And so you will love to watch all the stars in the heavens... they will all be your friends. And,
+besides, I am going to make you a present...” He laughed again.
+
+“Ah, little prince, dear little prince! I love to hear that laughter!”
+
+“That is my present. Just that. It will be as it was when we drank the water...”
+
+“What are you trying to say?”
+
+“All men have the stars,” he answered, “but they are not the same things for different people. For
+some, who are travellers, the stars are guides. For others they are no more than little lights in the
+sky. For others, who are scholars, they are problems. For my businessman they were wealth. But
+all these stars are silent. You, you alone, will have the stars as no one else has them”
+
+“What are you trying to say?”
+
+“In one of the stars I shall be living. In one of them I shall be laughing. And so it will be as if all
+the stars were laughing, when you look at the sky at night... you, only you, will have stars that can
+laugh!”
+
+And he laughed again. “And when your sorrow is comforted (time soothes all sorrows) you will be
+content that you have known me. You will always be my friend. You will want to laugh with me. And
+you will sometimes open your window, so, for that pleasure... and your friends will be properly
+astonished to see you laughing as you look up at the sky! Then you will say to them, ‘Yes, the
+stars always make me laugh!’ And they will think you are crazy. It will be a very shabby trick that
+I shall have played on you...”
+
+And he laughed again. “It will be as if, in place of the stars, I had given you a great number of
+little bells that knew how to laugh...”
+
+And he laughed again. Then he quickly became serious: “Tonight, you know... do not come,” said
+the little prince.
+
+“I shall not leave you,” I said.
+
+“I shall look as if I were suffering. I shall look a little as if I were dying. It is like that. Do not
+come to see that. It is not worth the trouble...”
+
+“I shall not leave you.”
+
+
+
+But he was worried. “I tell you, it is also because of the snake. He must not bite you. Snakes, they
+
+
+
+
+are malicious creatures. This one might bite you just for fun...”
+
+
+
+“I shall not leave you.”
+
+But a thought came to reassure him: “It is true that they have no more poison for a second bite.”
+
+That night I did not see him set out on his way. He got away from me without making a sound.
+When I succeeded in catching up with him he was walking along with a quick and resolute step. He
+said to me merely: “Ah! You are there...” And he took me by the hand. But he was still worrying.
+“It was wrong of you to come. You will suffer. I shall look as if I were dead; and that will not be
+true...”
+
+I said nothing.
+
+“You understand... it is too far. I cannot carry this body with me. It is too heavy.”
+
+I said nothing.
+
+“But it will be like an old abandoned shell. There is nothing sad about old shells...”
+
+I said nothing. He was a little discouraged. But he made one more effort: “You know, it will be
+very nice. I, too, shall look at the stars. All the stars will be wells with a rusty pulley. All the stars
+will pour out fresh water for me to drink...”
+
+I said nothing.
+
+“That will be so amusing! You will have five hundred million little bells, and I shall have five
+hundred million springs of fresh water...” And he too said nothing more, because he was crying...
+
+“Here it is. Let me go on by myself.” And he sat down, because he was afraid. Then he said,
+again: “You know, my flower... I am responsible for her. And she is so weak! She has four thorns,
+of no use at all, to protect herself against all the world...”
+
+I too sat down, because I was not able to stand up any longer. “There now, that is all...”
+
+He still hesitated a little; then he got up. He took one step. I could not move. There was nothing
+but a flash of yellow close to his ankle. He remained motionless for an instant. He did not cry out.
+He fell as gently as a tree falls. There was not even any sound, because of the sand.
+
+And now six years have already gone by... I have never yet told this story.
+
+The companions who met me on my return were well content to see me alive. I was sad, but I told
+them: “I am tired.” Now my sorrow is comforted a little. That is to say, not entirely. But I know
+that he did go back to his planet, because I did not find his body at daybreak. It was not such a
+heavy body... and at night I love to listen to the stars. It is like five hundred million little bells...
+But there is one extraordinary thing... when I drew the muzzle for the little prince, I forgot to add
+the leather strap to it. He will never have been able to fasten it on his sheep.
+
+So now I keep wondering: what is happening on his planet? Perhaps the sheep has eaten the
+flower... At one time I say to myself: “Surely not! The little prince shuts his flower under her glass
+globe every night, and he watches over his sheep very carefully...” Then I am happy. And there is
+sweetness in the laughter of all the stars.
+
+
+
+
+But at another time I say to myself: “At some moment or other one is absent-minded, and that is
+enough! On some one evening he forgot the glass globe, or the sheep got out, without making any
+noise, in the night...” And then the little bells are changed to tears... Here, then, is a great
+mystery.
+
+For you who also love the little prince, and for me, nothing in the universe can be the same if
+somewhere, we do not know where, a sheep that we never saw has eaten a rose... Look up at the
+sky. Ask yourselves: is it yes or no?
+
+Has the sheep eaten the flower? And you will see how everything changes... And no grown-up will
+ever understand that this is a matter of so much importance! This is, to me, the loveliest and
+saddest landscape in the world. It is the same as that on the preceding page, but I have drawn it
+again to impress it on your memory. It is here that the little prince appeared on Earth, and
+disappeared. Look at it carefully so that you will be sure to recognise it in case you travel some
+day to the African desert. And, if you should come upon this spot, please do not hurry on. Wait for
+a time, exactly under the star. Then, if a little man appears who laughs, who has golden hair and
+who refuses to answer questions, you will know who he is. If this should happen, please comfort
+me. Send me word that he has come back.
+
+
+
+END
diff --git a/perf/texts/en-words.txt b/perf/texts/en-words.txt
new file mode 100644 (file)
index 0000000..14200fa
--- /dev/null
@@ -0,0 +1,12391 @@
+a
+A
+aa
+AA
+aaa
+AAA
+aaae
+AAAu
+AAB
+AAC
+aacute
+Aacute
+Aacutesmall
+AAD
+aae
+AAE
+aaf
+AAF
+aalt
+aao
+aarch
+Aari
+aat
+AAT
+aatFeatureType
+AAu
+ab
+AB
+Abaza
+abb
+ABBREV
+abc
+ABC
+abcde
+abcdefghijklmnopqrstuvwxyz
+ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
+ABD
+ABE
+ABEu
+ABF
+ABFu
+abh
+ABI
+ability
+Abkhazian
+able
+Aboriginal
+ABORIGINAL
+abort
+about
+above
+Above
+ABOVE
+abq
+abs
+absolute
+absolutely
+absorb
+abstraction
+abstractions
+ABu
+abuse
+abv
+ABVF
+abvm
+abvs
+ABVS
+ABx
+ABxCD
+ABxD
+ac
+AC
+acb
+ACBu
+acc
+ACC
+accel
+Accelerate
+accelerator
+ACCELERATOR
+accels
+accent
+ACCENT
+accents
+accept
+acceptable
+accepted
+accepting
+accepts
+access
+Access
+accessed
+accessible
+accessing
+accessors
+accommodate
+Accommodate
+accompanying
+accomplish
+according
+According
+account
+accounting
+ACCu
+accumulate
+Accumulate
+accuracy
+accurate
+AccuT
+ACDu
+acf
+ach
+Achi
+achieve
+Acholi
+achung
+achVendID
+acircumflex
+Acircumflex
+Acircumflexsmall
+ack
+acm
+Acoli
+acom
+acq
+ACQ
+acquire
+ACQUIRE
+acr
+across
+act
+action
+Action
+ACTION
+actionable
+actionClass
+actionData
+actionLength
+actions
+Actions
+ActionSubrecord
+ActionSubrecordHeader
+actionType
+ActionType
+activated
+activates
+active
+acts
+actual
+Actual
+actualGlyphsCount
+actually
+ACu
+acute
+Acutesmall
+acw
+acx
+acy
+ad
+AD
+ada
+Adamawa
+Adangme
+Adap
+adapt
+Adapted
+Adaptors
+aData
+adb
+ADBu
+add
+Add
+addcnt
+added
+AddFontMemResourceEx
+addGlyph
+adding
+Adding
+addition
+Addition
+additional
+Additional
+additionalCount
+additions
+addr
+AddRef
+address
+addressof
+adds
+ADDu
+Adeni
+adequate
+adf
+adieresis
+Adieresis
+Adieresissmall
+Adilabad
+adjacent
+Adjacent
+adjust
+Adjust
+adjusted
+adjustment
+adjustments
+Adjusts
+ADL
+Adlam
+ADLAM
+adobe
+Adobe
+adopt
+Adopted
+adorned
+adp
+ADu
+adv
+advance
+Advance
+Advanced
+advanceMax
+advanceMeasurement
+advanceOffset
+advances
+ADVANCES
+Advancing
+advantage
+ADVISED
+advMap
+ady
+Adyghe
+ae
+AE
+aea
+aeaf
+aeb
+aec
+AEDu
+AEEu
+AEFu
+Aegean
+AEsmall
+AEu
+af
+AF
+afa
+afadd
+Afar
+AFAu
+afb
+AFBAu
+AFBu
+AFDKO
+AFEu
+AFF
+affect
+affected
+affecting
+affects
+affinity
+Afghanistan
+Africa
+Afrikaans
+after
+After
+AFTER
+afterGrowLimit
+afterShrinkLimit
+AFu
+AG
+again
+against
+Agaw
+Agfa
+agnostic
+agrave
+Agrave
+Agravesmall
+agree
+agreement
+ahead
+Aheri
+ahg
+Ahom
+AHOM
+aht
+Ahtena
+ai
+AI
+aii
+AIN
+aio
+Aiton
+aiw
+AIX
+ajp
+ak
+aka
+AKA
+Akan
+AKAT
+AKHN
+alaph
+ALAPH
+alas
+Alaska
+Alaskan
+Albania
+Albanian
+ALBANIAN
+Albay
+alef
+Alef
+ALEF
+Algeria
+Algerian
+algorithm
+Algorithm
+algorithmic
+algorithms
+Algorithms
+algs
+ALGS
+alias
+aliased
+aliases
+aliasing
+align
+aligned
+alignment
+alignof
+aligns
+alive
+all
+All
+ALL
+ALLAH
+AllDirections
+Allison
+alloc
+Alloc
+allocate
+Allocate
+ALLOCATE
+allocated
+allocates
+allocating
+allocation
+Allocation
+allocations
+Allocations
+allocator
+allow
+Allow
+allowed
+allowing
+allows
+almost
+aln
+alone
+along
+alpha
+Alpha
+alphabet
+Alphabet
+alphabetic
+Alphabetic
+alphabetical
+alphabetically
+Alphanumeric
+Alphanumerics
+already
+als
+Alsatian
+also
+Also
+alt
+ALT
+Altai
+alter
+alternate
+Alternate
+ALTERNATE
+alternates
+ALTERNATES
+alternateSet
+AlternateSet
+AlternateSubst
+AlternateSubstFormat
+alternative
+Alternatively
+ALTERNATIVES
+although
+Although
+alts
+always
+Always
+am
+AM
+ambiguity
+ambiguous
+Ambo
+Amend
+American
+Americanist
+amf
+Amharic
+among
+amongst
+amount
+Amoy
+amp
+ampersand
+ampersandsmall
+amw
+an
+An
+AN
+Ana
+analysis
+Analysis
+ANALYSIS
+analyze
+Analyze
+analyzer
+Analyzer
+analyzers
+Analyzes
+AnalyzeScript
+ANATOLIAN
+Ancash
+anchor
+Anchor
+anchorData
+anchored
+AnchorFormat
+AnchorMatrix
+anchorPoint
+anchors
+Ancient
+and
+And
+AND
+android
+Android
+ANDROID
+ang
+angle
+Angle
+ANGLE
+Anglo
+ankr
+ANKR
+ankrActionIndex
+ankrData
+annex
+annotate
+Annotated
+annotation
+ANNOTATION
+annotations
+another
+Another
+Ansi
+Antankarana
+Antillean
+any
+Any
+ANY
+anymore
+anything
+Anything
+anyway
+ap
+Apache
+apc
+apd
+Api
+API
+apis
+APIs
+apj
+apk
+apl
+apm
+APP
+Apparently
+appear
+appearance
+appearing
+append
+Append
+APPEND
+appended
+appending
+Appendix
+AppendixF
+Appends
+Appl
+APPL
+apple
+Apple
+APPLE
+AppleColorEmoji
+applicable
+Applicable
+APPLICABLE
+application
+applications
+Applications
+ApplicationServices
+applied
+applies
+apply
+Apply
+APPLY
+applying
+Applying
+approach
+approaches
+appropriate
+approxequal
+approximate
+appveyor
+April
+apt
+Apurímac
+apw
+AQ
+ar
+Arabia
+ARABIAN
+arabic
+Arabic
+ARABIC
+ArabicShaping
+Aragonese
+Arakanese
+Arakwal
+Aramaic
+ARAMAIC
+arb
+Arbëreshë
+arbitrarily
+arbitrary
+ARC
+Archaic
+architecturally
+archive
+archives
+are
+ARE
+area
+Area
+Arequipa
+arg
+ARG
+Argentina
+Argh
+args
+ARGS
+argStack
+argument
+arguments
+aring
+Aring
+Aringsmall
+ARISING
+arith
+arithmetic
+Ariza
+armcc
+Armenia
+Armenian
+ARMENIAN
+arn
+Aromanian
+around
+arounds
+Arpitan
+arq
+arr
+arranged
+array
+Array
+ARRAY
+ArrayOf
+ArrayOfM
+arrays
+arrayZ
+arrive
+Arrows
+ars
+Arsi
+articles
+Arvanitika
+ary
+arz
+as
+As
+AS
+Asat
+ascender
+ASCENDER
+ascenderOffset
+ascending
+ascent
+ASCENT
+ascii
+ASCII
+asciicircum
+asciitilde
+Asho
+Asian
+aSize
+asked
+Asking
+Asmall
+Asomtavruli
+aspect
+aspects
+aspx
+Assamese
+assembly
+assert
+ASSERT
+assertion
+ASSERTION
+assign
+Assign
+ASSIGN
+assignable
+assigned
+assigns
+assistance
+assisted
+associated
+associates
+associating
+Association
+assume
+Assume
+assumed
+Assumed
+assuming
+Assuming
+assumption
+Assumption
+Assyrian
+ast
+asterisk
+ASTERISK
+Asturian
+asuperior
+at
+At
+atexit
+ATEXIT
+aTextPosition
+ath
+Athapascan
+Athapaskan
+Atikamekw
+atilde
+Atilde
+Atildesmall
+atj
+Atlas
+atleast
+ATLEAST
+atomic
+Atomic
+ATOMIC
+Atomically
+atomics
+atsFont
+ATSFontGetFileReference
+ATSFontRef
+attach
+Attach
+ATTACH
+attached
+ATTACHED
+attaches
+attaching
+attachList
+AttachList
+attachment
+Attachment
+ATTACHMENT
+attachments
+attachPoint
+AttachPoint
+attempt
+attempted
+attempts
+Attempts
+attr
+ATTR
+attractive
+attrib
+attribute
+ATTRIBUTE
+attributed
+attributes
+Attributes
+attrs
+atv
+au
+Au
+AU
+audiences
+augmented
+Australia
+Austria
+Author
+AUTHOR
+authors
+auto
+AUTO
+autoconf
+autogen
+automake
+automatic
+Automatic
+automatically
+auxiliary
+Auxiliary
+auz
+av
+AV
+Avagraha
+AVAGRAHA
+avail
+Availability
+AvailabilityMacros
+available
+avar
+Avar
+AVAR
+Avaric
+AVESTAN
+avl
+avoid
+Avoid
+avoided
+avoiding
+avoids
+aw
+awa
+Awa
+Awadhi
+aware
+away
+awful
+ax
+Ax
+AxCD
+AxD
+axes
+axesZ
+axis
+Axis
+AXIS
+axisCount
+axisIndex
+axisNameID
+AxisRecord
+axisSize
+axisTag
+AxisValue
+axisValueCount
+AxisValueFormat
+AxisValueMap
+AxisValueRecord
+axisValues
+ay
+Ayacucho
+ayc
+ayh
+AYIN
+ayl
+Aymara
+ayn
+ayp
+ayr
+az
+azb
+Azerbaijan
+Azerbaijani
+Azeri
+azj
+b
+B
+ba
+BA
+Babalia
+Babine
+BABu
+Bacanese
+back
+backend
+backends
+background
+Background
+BACKGROUND
+backing
+backslash
+backtrack
+backtrackClassDef
+backtrackCount
+backtracking
+backward
+BACKWARD
+backwards
+Backwards
+bad
+Badaga
+badly
+BADLY
+bae
+BAEu
+BAFu
+Bagheli
+Baghelkhandi
+Bagirmi
+Bagri
+Baharna
+Bahrain
+bai
+bail
+Bakhtiari
+bal
+Balanta
+Balante
+Balinese
+BALINESE
+Balkan
+Balkar
+Balochi
+Balti
+Baltic
+Baluchi
+Bamanankan
+Bambara
+Bamileke
+BAMUM
+ban
+Banda
+Bandjalang
+Bangka
+Bangladesh
+Bangun
+Banjar
+Banna
+Baoulé
+bar
+Bara
+BARREE
+barrier
+Barrier
+bars
+Bas
+base
+Base
+BASE
+baseArray
+BaseArray
+BaseCoord
+BaseCoordFormat
+baseCoords
+baseCoverage
+BaseCoverage
+based
+Based
+BaseFontBlend
+baseFontName
+BaseFontName
+BaseGlyph
+BaseGlyphRecord
+baseGlyphsZ
+BaseLangSysRecord
+baseLangSysRecords
+BaseLangSysRecords
+baseLangSysTag
+baseline
+Baseline
+BASELINE
+baselines
+BaselineTableFormat
+baselinetags
+baselineTags
+bases
+baseScript
+BaseScript
+baseScriptList
+BaseScriptList
+BaseScriptRecord
+baseScriptRecords
+BaseScriptRecords
+baseScriptTag
+baseTagCount
+baseTagList
+BaseTagList
+baseValues
+BaseValues
+Bashkir
+basic
+Basic
+BASIC
+basically
+BASIS
+Basque
+BASSA
+Batak
+BATAK
+batch
+BAu
+Baulé
+Bavarian
+Bawm
+BB
+BBAu
+BBBu
+bbc
+bbee
+BBEu
+BBF
+BBu
+bbz
+bc
+BC
+bca
+BCA
+BCAu
+BCBu
+bcc
+BCCu
+bcd
+BCD
+BCDu
+BCEu
+bci
+bcl
+bcp
+BCP
+bcq
+bcr
+BCu
+bcursor
+bd
+BD
+bdadd
+bdfaab
+bdu
+BDu
+bdy
+be
+Be
+BE
+bea
+BEAM
+bearing
+bearings
+bearingX
+bearingY
+Beaver
+beb
+Bebele
+Bebil
+bec
+because
+Because
+become
+BECOME
+becomes
+bed
+Bedawi
+BEEH
+been
+BEEN
+BEEu
+before
+Before
+BEFORE
+beforeGrowLimit
+beforehand
+beforeShrinkLimit
+BeforeSub
+began
+begin
+BEGIN
+beginning
+Beginning
+BEH
+behave
+behaved
+behaving
+behavior
+behaviors
+behaviour
+Behdad
+BEHEH
+behind
+Bei
+being
+Being
+BEInt
+Belarus
+Belarusian
+Belarussian
+Belgium
+Belize
+belong
+belonging
+belongs
+below
+Below
+BELOW
+bem
+Bemba
+Bench
+bend
+benefits
+BENG
+Bengali
+BENGALI
+ber
+Berau
+Berber
+best
+Bet
+BET
+Beti
+bets
+Betsimisaraka
+better
+between
+BEu
+beyond
+bf
+BF
+bfaeafe
+BFAu
+bfb
+BFF
+bffc
+BFFu
+bfind
+BFIND
+bfq
+bft
+bfu
+BFu
+bfy
+bg
+bgc
+bgn
+bgp
+bgq
+bgr
+BGRAColor
+Bhaiksuki
+BHAIKSUKI
+Bhasha
+bhb
+bhi
+Bhilali
+Bhili
+bhk
+bho
+Bhojpuri
+bhr
+bi
+Bi
+bias
+biased
+biasedSubrs
+Bible
+Bicolano
+bidi
+bidirectional
+BiDirectional
+bidirectionality
+big
+Big
+BIG
+BigGlyphMetrics
+bik
+Bikol
+BILD
+Bilen
+Bilin
+billion
+bimap
+BIMAP
+bin
+binaries
+binary
+Binary
+BINARY
+bindings
+Bindu
+BINDU
+Bindus
+BinSearchArrayOf
+BinSearchHeader
+Bishnupriya
+Bislama
+bit
+Bit
+bitcount
+bitDepth
+bitfield
+bithacks
+Bithacks
+bitmap
+Bitmap
+BITMAP
+bitmaps
+BitmapSizeTable
+bits
+Bits
+BITS
+BitScanForward
+BitScanReverse
+bitset
+bitsize
+bitwise
+bjj
+bjn
+BJN
+bjq
+bjt
+bl
+BL
+bla
+black
+Black
+BLACK
+Blackfoot
+blackhole
+blacklist
+BLACKLIST
+blacklisted
+blacklisting
+Blas
+ble
+blend
+Blend
+BLEND
+blendcs
+blenddict
+blended
+blending
+BlendInterpEnv
+blends
+Blink
+blk
+bln
+blob
+BLOB
+blobs
+Blobs
+block
+Block
+BLOCK
+blocked
+Blocked
+blocks
+Blocks
+Bloom
+blow
+blown
+blue
+Blue
+BlueFuzz
+BlueScale
+BlueShift
+BlueValues
+blwf
+BLWF
+blwm
+blws
+BLWS
+bm
+bmg
+bmm
+bmp
+BMP
+bn
+bo
+Bodo
+body
+bok
+Bokmal
+Bokmål
+bold
+Bold
+BOLD
+bolder
+Bolivia
+Bolivian
+book
+Book
+bookbold
+bookkeeping
+bool
+BOOL
+Boolean
+Booleans
+BOOM
+Bopomofo
+BOPOMOFO
+Borana
+BORDERS
+Borgu
+Borrowed
+Bosnia
+Bosnian
+BOT
+both
+bother
+bottom
+Bottom
+BOTTOM
+bottomSide
+bound
+Bound
+boundaries
+boundary
+Boundary
+bounding
+bounds
+Bounds
+BOUNDS
+Bouyei
+box
+Box
+BOX
+boxed
+BOXED
+boxes
+bpy
+bqi
+br
+BR
+bra
+braceleft
+braceright
+braces
+Bracket
+BRACKET
+bracketleft
+bracketright
+Brahmi
+BRAHMI
+Brahui
+Braille
+BRAILLE
+Braj
+branches
+brand
+Brawer
+Brazil
+break
+BREAK
+breakfast
+breaking
+breakpoint
+BREAKPOINT
+breaks
+bretagne
+Breton
+breve
+Brevesmall
+brew
+brh
+brief
+broken
+Broken
+brokenbar
+Brunei
+Bruno
+bruteforce
+brx
+bs
+bsb
+bsearch
+bsk
+bsln
+BSLN
+Bsmall
+bsuperior
+bswap
+btb
+btj
+bto
+bts
+btt
+BTT
+bu
+Bu
+Bualkhaw
+Bubble
+bucket
+buf
+buff
+buffArray
+buffer
+Buffer
+BUFFER
+buffers
+Buffers
+BUFSIZ
+bug
+BUG
+buggy
+Buginese
+BUGINESE
+Bugis
+bugs
+bugzilla
+Buhi
+Buhid
+BUHID
+build
+builder
+Builder
+building
+Building
+builds
+built
+builtin
+BUILTIN
+builtins
+Bukit
+Bukusu
+Bulgaria
+Bulgarian
+bulk
+bullet
+Bulu
+bum
+Bumthangkha
+bundles
+burden
+Buriat
+Burmese
+Burushaski
+business
+but
+But
+BUT
+BV
+bve
+bvu
+bxk
+bxp
+bxr
+by
+By
+BY
+Byagowi
+Byelorussian
+byes
+byn
+byte
+Byte
+BYTE
+byteArray
+byteOffsetToIndex
+bytes
+Bytes
+BYTES
+bytesArray
+bytesX
+bytesZ
+byv
+Byzantine
+bzc
+c
+C
+ca
+Ca
+CA
+CABu
+caca
+cache
+Cache
+CACHE
+cacheable
+cached
+caches
+caching
+Caching
+cacute
+Cacute
+caf
+cairo
+Cairo
+cairographics
+Cajamarca
+Cajatambo
+Cajun
+cak
+calcOffSize
+CalcTableChecksum
+calculate
+Calculate
+calculated
+calculates
+calculation
+Calderón
+Calibry
+call
+Call
+callback
+Callback
+callbacks
+CALLBACKS
+called
+Called
+caller
+callers
+callgsubr
+calling
+calloc
+calls
+Calls
+callStack
+callsubr
+calt
+Cambodia
+Cameroon
+Campidanese
+can
+Can
+Canada
+Canadian
+CANADIAN
+Cañar
+CANCEL
+candidate
+candidates
+cannot
+Cannot
+canon
+canonical
+Canonical
+CANONICAL
+canonically
+cantarell
+Cantarell
+Cantillation
+CANTILLATION
+cap
+Cap
+CAP
+capabilities
+capable
+capital
+CAPS
+care
+careful
+carefully
+caret
+Caret
+CARET
+caretOffset
+carets
+caretSlopeDenominator
+caretSlopeNumerator
+caretSlopeRise
+caretSlopeRun
+CaretValue
+caretValueFormat
+CaretValueFormat
+caretValuePoint
+Carian
+CARIAN
+Caribbean
+caron
+Caronsmall
+Carpathian
+Carrier
+carry
+cas
+cascade
+cascading
+case
+CASE
+cases
+cast
+Cast
+casting
+casts
+Casts
+cat
+Cat
+CAT
+Catalan
+Catanduanes
+catch
+categories
+Categories
+CATEGORIES
+categorization
+categorize
+categorized
+categorizes
+category
+Category
+CATEGORY
+Cateories
+CAu
+CAUCASIAN
+cause
+caused
+causes
+causing
+cautious
+cb
+CB
+cbb
+CBCu
+cbdt
+CBDT
+CBEu
+CBFu
+cbk
+cbl
+cblc
+CBLC
+CBu
+cc
+Cc
+CC
+ccaron
+Ccaron
+CCAu
+CCBu
+ccc
+CCC
+ccccae
+cccf
+CCCu
+CCD
+CCDu
+ccedilla
+Ccedilla
+Ccedillasmall
+CCEu
+cChars
+ccmp
+cco
+ccq
+CCu
+cd
+CD
+CDATA
+cdd
+cdo
+CDu
+CDx
+CDxA
+CDxAB
+CDxBA
+ce
+CE
+ceb
+Cebuano
+CECu
+cedilla
+Cedillasmall
+CEDu
+CEEu
+ceil
+CEIL
+cent
+center
+Center
+centered
+CENTERED
+centinferior
+centoldstyle
+CentOS
+central
+Central
+centsuperior
+ceparams
+certain
+Certain
+CEu
+cf
+Cf
+CF
+cfar
+CFAR
+CFArrayAppendValue
+CFArrayCreate
+CFArrayCreateMutable
+CFArrayGetCount
+CFArrayGetValueAtIndex
+CFArrayRef
+CFAttributedStringCreateMutable
+CFAttributedStringRemoveAttribute
+CFAttributedStringReplaceString
+CFAttributedStringSetAttribute
+CFComparisonResult
+cfd
+CFData
+CFDataGetBytePtr
+CFDataGetLength
+CFDataRef
+CFDictionaryCreate
+CFDictionaryGetValue
+CFDictionaryRef
+CFDu
+CFEqual
+cff
+CFF
+cfff
+CFFIndex
+CFFIndexOf
+CFFTag
+CFFu
+CFIndex
+cfm
+CFMutableArrayRef
+CFMutableAttributedStringRef
+CFNumberCreate
+CFNumberRef
+CFRange
+CFRangeMake
+CFRelease
+CFRetain
+CFSTR
+CFStringCompare
+CFStringCreateWithCharactersNoCopy
+CFStringCreateWithCStringNoCopy
+CFStringGetCharacterAtIndex
+CFStringHasPrefix
+CFStringHasSuffix
+CFStringRef
+CFu
+CFURLCreateFromFSRef
+CFURLRef
+cg
+CGDataProviderCreateWithData
+CGDataProviderRef
+CGDataProviderRelease
+CGFloat
+CGFont
+CGFontCopyPostScriptName
+CGFontCopyTableForTag
+CGFontCreateWithDataProvider
+CGFontRef
+CGFontRelease
+CGFontRetain
+cgg
+CGGlyph
+cgi
+cgit
+CGJ
+cGlyphs
+CGPoint
+ch
+Chachapoyas
+Chadian
+Chaha
+chain
+Chain
+chainContext
+ChainContext
+ChainContextApplyLookupContext
+ChainContextClosureLookupContext
+ChainContextCollectGlyphsLookupContext
+ChainContextFormat
+ChainContextPos
+ChainContextSubst
+chainCount
+chaining
+Chaining
+ChainRule
+ChainRuleSet
+chains
+Chains
+ChainSubtable
+Chakma
+CHAKMA
+Chaldean
+Cham
+CHAM
+Chamorro
+chance
+chandas
+change
+Change
+changed
+changes
+Changes
+changing
+channel
+channels
+Chap
+chapter
+Chapter
+char
+Char
+CHAR
+character
+Character
+CHARACTER
+characterCode
+characterize
+characters
+Characters
+CHARACTERS
+characterVariants
+charmap
+Charmap
+charMirror
+CHARPROP
+chars
+charset
+Charset
+CHARSET
+CharsetID
+charsetInfo
+CharsetOffset
+charstreing
+charstring
+CharString
+charstrings
+charStrings
+CharStrings
+charStringsInfo
+charStringsOffset
+CharstringType
+charts
+chattawa
+CHATTAWA
+Chattisgarhi
+Chaungtha
+Chavacano
+cheaper
+Chechen
+check
+Check
+CHECK
+checked
+CHECKED
+checking
+Checking
+checks
+Checks
+checksum
+checkSum
+CheckSum
+checkSumAdjustment
+Cherokee
+CHEROKEE
+Chetco
+Chewa
+Cheyenne
+Chhattisgarhi
+Chichewa
+Chiga
+Chiki
+CHIKI
+Chilcotin
+child
+children
+Chile
+Chilean
+Chillus
+Chiltepec
+Chimborazo
+Chin
+China
+Chinantec
+Chinbon
+Chincha
+Chinese
+Chipewyan
+Chippewa
+Chiquián
+Chiricahua
+Chiripá
+Chittagonian
+chj
+chk
+CHL
+cho
+Choctaw
+choice
+choices
+choose
+Choose
+chooses
+choosing
+chop
+Chop
+chosen
+CHOSEONG
+chp
+chq
+chr
+chris
+Chris
+chromium
+Chromium
+Chuanqiandian
+Chukchi
+Chukot
+chunk
+ChunkLen
+chunks
+Church
+Chuukese
+Chuvash
+chy
+chz
+ci
+CI
+CID
+cidCount
+CIDCount
+CIDFontRevision
+CIDFontType
+CIDFontVersion
+CIN
+cInChars
+CIP
+circle
+CIRCLE
+circles
+circuit
+CIRCUIT
+circumflex
+Circumflexsmall
+circumstances
+circumvents
+citer
+CITI
+ciw
+cja
+CJCT
+CJK
+cjm
+cjy
+ck
+CK
+cka
+ckb
+ckt
+cl
+Clamp
+clang
+clarity
+Clasen
+class
+Class
+CLASS
+classArray
+classCount
+classDef
+ClassDef
+ClassDefFormat
+classes
+classFormat
+Classic
+Classical
+classifications
+classified
+classify
+classTable
+ClassTable
+ClassType
+ClassTypeNarrow
+ClassTypeWide
+classValue
+classValueArray
+clc
+cld
+cle
+clean
+Clean
+cleanest
+clear
+Clear
+cleared
+clearing
+clearly
+clears
+Clears
+ClearType
+ClearType™
+client
+Client
+clients
+Clients
+clig
+clipping
+CLIPPING
+clockwise
+close
+Close
+CLOSE
+CloseHandle
+closely
+closer
+closest
+CLOSEST
+closure
+Closure
+CLOSURE
+closures
+cluster
+Cluster
+CLUSTER
+clustering
+clusterMap
+clusters
+Clusters
+CLUSTERS
+clz
+clzl
+clzll
+CM
+CMAbv
+cmake
+cmap
+CMAP
+cmapsubtable
+CmapSubtable
+CmapSubtableFormat
+CmapSubtableLongGroup
+CmapSubtableLongSegmented
+CmapSubtableTrimmed
+cMaxGlyphs
+cMaxItems
+CMBlw
+cmn
+cmp
+cmpexch
+cmplexch
+cmpswap
+cmr
+cn
+Cn
+cnb
+cnh
+cnk
+cnl
+cnt
+cntrmask
+cnw
+co
+Co
+coa
+Cocos
+code
+Code
+CODE
+codebase
+coded
+codepath
+codepoint
+CODEPOINT
+codepoints
+codepont
+codes
+Codethink
+Coeng
+COENG
+coengs
+col
+Col
+collect
+Collect
+COLLECT
+collected
+collection
+Collection
+collections
+Collections
+collects
+Colombia
+colon
+COLON
+colonmonetary
+color
+Color
+COLOR
+colorIdx
+colorLabelsZ
+ColorRecord
+colorRecordIndicesZ
+colorRecordsZ
+colorRef
+colors
+colorType
+Colour
+colr
+COLR
+cols
+COLS
+columnCount
+columnIndexTable
+com
+Comaltepec
+combination
+combinations
+combine
+COMBINE
+combined
+combiner
+combiners
+combining
+Combining
+COMBINING
+come
+comes
+comfortably
+coming
+comma
+COMMA
+commainferior
+command
+Command
+commands
+commas
+commasuperior
+comment
+Commenting
+comments
+commit
+commitcomment
+commits
+common
+Common
+COMMON
+commonly
+Comorian
+comp
+compact
+Compact
+compar
+compare
+Compare
+compared
+compares
+comparing
+Comparing
+comparison
+compat
+compatibility
+Compatibility
+COMPATIBILITY
+compatible
+COMPATIBLE
+compensate
+compilable
+compile
+Compile
+compiled
+compiler
+Compiler
+compilers
+compiles
+COMPILES
+compiling
+complains
+complang
+Complement
+complete
+Complete
+completely
+complex
+Complex
+COMPLEX
+COMPLEXITY
+complicated
+component
+COMPONENT
+componentData
+ComponentGlyph
+components
+Components
+COMPONENTS
+ComponentsArray
+composable
+compose
+composed
+COMPOSED
+composePair
+composes
+Composes
+composing
+composite
+COMPOSITE
+CompositeGlyph
+CompositeGlyphChain
+composites
+composition
+Composition
+COMPOSITION
+COMPOUND
+compressed
+compressionMethod
+comprise
+comprising
+comps
+compute
+Compute
+Computes
+computing
+concepts
+Concepts
+conceptual
+Conceptually
+concern
+concerned
+Conchucos
+cond
+Cond
+condensed
+Condensed
+CONDENSED
+condition
+Condition
+conditional
+conditionalAddGlyphAction
+ConditionalAddGlyphAction
+conditionally
+ConditionFormat
+conditions
+Conditions
+ConditionSet
+config
+CONFIG
+configs
+configuration
+Configuration
+configurations
+configure
+configured
+conflicting
+confused
+confusing
+Congo
+conjunct
+connect
+CONNECT
+connected
+CONNECTED
+connecting
+connection
+CONNECTION
+connector
+CONNECTOR
+Cons
+CONS
+consecutive
+CONSEQUENTIAL
+Consequently
+consider
+Consider
+considerably
+consideration
+considerations
+considered
+consist
+consistent
+consists
+consonant
+Consonant
+CONSONANT
+consonants
+const
+CONST
+constant
+CONSTANT
+constants
+Constants
+constexpr
+constituent
+constitute
+constitutes
+constraints
+CONSTRAINTS
+construct
+constructed
+constructible
+construction
+constructor
+constructors
+Constructors
+constructs
+consult
+consumed
+contain
+contained
+container
+containers
+containing
+contains
+ContainsTextPosition
+contemporary
+content
+CONTENT
+contents
+context
+Context
+CONTEXT
+ContextApplyFuncs
+ContextApplyLookupContext
+ContextClosureFuncs
+ContextClosureLookupContext
+ContextCollectGlyphsFuncs
+ContextCollectGlyphsLookupContext
+ContextFormat
+ContextPos
+contexts
+ContextSubst
+contextual
+Contextual
+CONTEXTUAL
+ContextualSubtable
+contiguous
+continuation
+CONTINUATION
+continuations
+continue
+continues
+contour
+Contour
+contours
+contract
+CONTRACT
+contrary
+contrast
+contributing
+Contributor
+control
+Control
+CONTROL
+controlling
+controls
+convenience
+conveniences
+convenient
+conventions
+Conversely
+conversion
+Conversion
+Conversions
+convert
+Convert
+converted
+Converted
+converters
+convertible
+converting
+Converts
+convoluted
+coord
+coordinate
+Coordinate
+coordinates
+Coordinates
+COORDINATES
+coordinatesZ
+coordPoint
+coords
+coorinates
+cop
+copied
+Copied
+copies
+Copies
+Coptic
+COPTIC
+copy
+Copy
+COPY
+copyable
+copying
+copyright
+Copyright
+COPYRIGHT
+coq
+Coquille
+core
+CoreGraphics
+coretext
+CoreText
+CORETEXT
+corner
+CORNER
+corners
+Cornish
+Corongo
+correct
+correction
+correctionHeight
+correctly
+Correctly
+correctness
+correlate
+correspond
+corresponding
+corresponds
+corrupt
+Corsican
+cost
+Costa
+costs
+costy
+cotfRecords
+could
+Could
+count
+Count
+COUNT
+countChar
+counted
+counter
+counting
+Counting
+CountMask
+countries
+counts
+couple
+Courier
+course
+courtesy
+cover
+coverage
+Coverage
+COVERAGE
+coverageFormat
+CoverageFormat
+coverageZ
+covered
+COVERED
+covering
+covers
+cp
+CP
+cpa
+cpal
+CPAL
+CPALV
+cpe
+cpf
+cplusplus
+cpp
+cppreference
+CPR
+CPrf
+cpx
+cqd
+cqu
+cr
+CRAMPED
+cRanges
+crap
+Crap
+CRAP
+CrapHelper
+CrapOrNull
+CrapOrNullHelper
+CrapPool
+crash
+crashes
+crazy
+crbug
+create
+Create
+CREATE
+CreateCustomFontFileReference
+created
+CreateFile
+CREATEFILE
+CreateFileMapping
+CreateFileMappingFromApp
+CreateFileW
+CreateFontFace
+CreateFontIndirectW
+creates
+Creates
+CreateStreamFromKey
+CreateTextAnalyzer
+creating
+Creating
+creation
+creator
+Cree
+Creek
+Creole
+creoles
+Creoles
+crh
+Crimean
+Crioulo
+criteria
+CRITICAL
+crj
+crk
+crl
+crm
+Croatia
+Croatian
+cross
+Cross
+crossStream
+CrossStream
+crp
+crucial
+crx
+cs
+Cs
+CS
+csa
+csb
+csh
+Csmall
+cso
+csop
+CSOPSET
+CSR
+CSS
+CSType
+csw
+cswh
+csy
+ct
+ctc
+ctd
+cte
+CTFont
+CTFontCopyAttribute
+CTFontCopyGraphicsFont
+CTFontCopyName
+CTFontCopyPostScriptName
+CTFontCreateCopyWithAttributes
+CTFontCreateUIFontForLanguage
+ctfontcreatewithgraphicsfont
+CTFontCreateWithGraphicsFont
+CTFontDescriptorCreateWithAttributes
+CTFontDescriptorCreateWithNameAndSize
+CTFontDescriptorRef
+CTFontGetPlatformFont
+CTFontGetSize
+CTFontRef
+CTFontUIFontType
+ctg
+CTGetCoreTextVersion
+ctl
+CTLineGetGlyphRuns
+CTLineGetTrailingWhitespaceWidth
+CTLineRef
+ctlPoints
+ctor
+CTRunGetAttributes
+CTRunGetGlyphCount
+CTRunGetGlyphs
+CTRunGetGlyphsPtr
+CTRunGetPositions
+CTRunGetPositionsPtr
+CTRunGetStatus
+CTRunGetStringIndices
+CTRunGetStringIndicesPtr
+CTRunGetStringRange
+CTRunGetTypographicBounds
+CTRunRef
+CTRunStatus
+cts
+CTTypesetterCreateLine
+CTTypesetterCreateWithAttributedStringAndOptions
+CTTypesetterRef
+CTYPE
+ctz
+ctzl
+ctzll
+cu
+Cu
+cuc
+cuk
+cumulated
+Cumulative
+Cuneiform
+CUNEIFORM
+cur
+curEntry
+Curiously
+CURISVE
+CURLY
+curr
+curradv
+curradvx
+curradvy
+currAnchor
+currAnchorPoint
+currclus
+currControlPoint
+currency
+Currency
+CURRENCY
+current
+Current
+CurrentCategory
+currentIndex
+currentInsertBefore
+CurrentInsertBefore
+currentInsertCount
+CurrentInsertCount
+currentInsertIndex
+currentInsertList
+CurrentIsKashidaLike
+currently
+Currently
+currX
+currY
+curs
+cursive
+Cursive
+CURSIVE
+CursivePos
+CursivePosFormat
+cursor
+Cursor
+cursoring
+curve
+CURVE
+Cusco
+custom
+Custom
+customization
+customize
+customizing
+Customizing
+CustomRange
+cut
+CUT
+cutting
+cv
+cvn
+CVT
+cvXX
+cwd
+CWS
+cx
+cy
+CYGWIN
+Cypriot
+CYPRIOT
+Cyrillic
+CYRILLIC
+Czech
+czh
+czo
+czt
+d
+D
+da
+DA
+Daai
+DAD
+DAFu
+dagesh
+DAGESH
+dagger
+daggerdbl
+DAHAL
+Dai
+DAL
+DALATH
+DALET
+dam
+DAMAGE
+DAMAGES
+damma
+dammatan
+Dan
+dance
+dangerous
+Dangme
+Danish
+dao
+dap
+dar
+Dargwa
+Dari
+dark
+DARK
+Darkhat
+Darussalam
+Darwazi
+DASH
+data
+Data
+DATA
+dataArray
+dataArrayLen
+Database
+dataLen
+dataLength
+DataMap
+dataMaps
+dataOffset
+dataset
+dataSets
+dataSize
+dataSizeArray
+dataZ
+Date
+DAu
+David
+Daw
+dax
+day
+Dayi
+db
+DB
+DBAu
+DBBu
+DBCu
+DBEu
+DBF
+dbfo
+DBL
+DBu
+dc
+DC
+DCA
+DCAu
+DCBu
+DCFu
+dcroat
+DCu
+DCx
+DCxA
+DCxAB
+DCxBA
+dd
+DD
+DDA
+DDAHAL
+DDAL
+DDAu
+DDCu
+DDD
+DDDu
+dde
+DDEu
+ddf
+DDF
+DDFu
+DDu
+de
+DE
+deabc
+Dead
+DEAD
+deal
+deallocate
+Deallocate
+DEALLOCATE
+deallocation
+dealt
+DEAu
+Debian
+debug
+Debug
+DEBUG
+debugging
+Debugging
+dec
+decay
+decender
+decide
+Decide
+deciding
+DECIMAL
+decipoints
+decision
+decisions
+declaration
+declarations
+declare
+Declare
+DECLARE
+declared
+declaring
+decls
+DECLS
+declspec
+decltype
+declval
+decode
+DECODE
+decomp
+decompose
+Decompose
+DECOMPOSE
+decomposed
+DECOMPOSED
+decomposedglyphs
+decomposes
+decomposing
+decomposition
+DECOMPOSITION
+decompositionAction
+DecompositionAction
+decompositions
+decompressed
+deconstructed
+DECORATIVE
+DecorativeBorders
+decrease
+decreased
+decreases
+Decreases
+decreasing
+deduce
+deduced
+deduces
+deem
+deemed
+deep
+def
+DEF
+defaul
+default
+Default
+DEFAULT
+defaultBaseline
+defaultFlags
+defaultIndex
+DefaultJstfLangSys
+defaultLangSys
+DefaultLangSys
+defaultMinMax
+defaults
+defaultUVS
+DefaultUVS
+defaultValue
+defaultVertOriginY
+defaultWidthX
+define
+DEFINE
+defined
+Defined
+DEFINED
+defines
+Defines
+defining
+Defining
+definition
+Definition
+definitions
+Definitions
+DEFu
+Degexit
+degree
+DEGREE
+degrees
+Dehong
+DejaVu
+del
+delayed
+delete
+DELETE
+DeleteCriticalSection
+deleted
+DELETED
+DeleteObject
+deleting
+delimited
+DELIMITED
+delta
+Delta
+DELTA
+deltaFormat
+deltaGlyphID
+deltas
+DELTAS
+DeltaSetIndexMap
+DeltaValue
+deltaValueZ
+Democratic
+demonstrate
+den
+DENIED
+Denmark
+denom
+DENOM
+DENOMINATOR
+denote
+density
+depend
+dependant
+dependencies
+dependency
+dependent
+Dependent
+DEPENDENT
+depending
+depends
+deprecated
+Deprecated
+DEPRECATED
+depth
+deref
+dereference
+dereferenced
+dereferencing
+derived
+Derived
+DerivedCoreProperties
+desc
+descendent
+descender
+DESCENDER
+descending
+descent
+DESCENT
+describe
+described
+describes
+describing
+description
+Description
+DESCRIPTION
+descriptor
+descriptors
+Deseret
+DESERET
+deserialize
+DESERIALIZE
+design
+Design
+DESIGN
+designated
+designates
+designAxesOffset
+designAxisCount
+designAxisSize
+designed
+designer
+DESIGNER
+designSize
+desirable
+desired
+desktop
+dest
+destroy
+Destroy
+DESTROY
+destroyed
+destroying
+destroys
+Destroys
+destruct
+destructed
+destructible
+destruction
+desubroutinize
+detail
+detailed
+details
+detect
+detected
+determine
+Determine
+determined
+determines
+determining
+Determining
+DEu
+dev
+DEVA
+devanagari
+Devanagari
+DEVANAGARI
+devel
+develop
+developed
+developer
+developers
+developing
+development
+Deviate
+device
+Device
+DeviceHeader
+DeviceRecord
+devices
+deviceTable
+devnet
+df
+DF
+DFAu
+dfde
+DFDu
+dfe
+DFF
+DFFu
+dflt
+DFLT
+dfont
+DFont
+DFontTag
+DFu
+dgo
+dgr
+Dhangu
+dhd
+dhg
+Dhivehi
+Dhofari
+Dhundari
+Dhuwal
+Dhuwaya
+diacritic
+Diacritical
+diacritics
+DIACRITICS
+diagnostic
+DIAGNOSTIC
+DIAGONAL
+DIAMOND
+dib
+dict
+Dict
+DICT
+dictionary
+dicts
+dictsSize
+dictval
+DICTVAL
+did
+didn
+Didn
+didnt
+dieresis
+Dieresissmall
+diff
+DIFF
+differ
+difference
+differences
+different
+Different
+differentiate
+differently
+differing
+differs
+difficult
+difficulty
+digest
+DIGEST
+digests
+digit
+Digit
+DIGIT
+digital
+Digits
+dik
+dimensional
+dimensions
+Dimli
+din
+Dingbats
+DINGBATS
+Dinka
+dip
+DIPHTHONG
+diq
+dir
+DIR
+direct
+DIRECT
+direction
+Direction
+DIRECTION
+directional
+directionality
+directions
+directive
+directly
+directory
+directwrite
+DirectWrite
+DIRECTWRITE
+dirty
+disable
+Disable
+DISABLE
+disabled
+disableFlags
+disables
+disabling
+disallow
+disallows
+disambiguated
+Disc
+discard
+Discarding
+discards
+discern
+DISCLAIMS
+discover
+Discovered
+discretionary
+discussed
+Discussion
+dispatch
+Dispatch
+DISPATCH
+displacement
+display
+Display
+DISPLAY
+displaying
+dist
+distance
+Distance
+DISTANCE
+distances
+distinct
+distinction
+distinguish
+distinguishes
+distinguishing
+distribute
+distribution
+ditto
+div
+DIV
+Divehi
+divert
+divide
+DIVIDE
+divided
+divisible
+diw
+Djambarrpuyngu
+dje
+djr
+dks
+DLBAR
+dlig
+dll
+DLL
+dllexport
+dm
+dng
+dnj
+dnom
+do
+Do
+DO
+DOACHASHMEE
+doc
+Doc
+docbook
+DocBook
+docbookx
+docs
+DOCTYPE
+document
+Document
+documentation
+DOCUMENTATION
+documented
+documents
+Documents
+does
+Does
+doesn
+Doesn
+doesnt
+Dogra
+DOGRA
+Dogri
+Dogrib
+doi
+doing
+dollar
+dollarinferior
+dollaroldstyle
+dollarsuperior
+Domain
+dominant
+Dominican
+Domino
+don
+Don
+DON
+done
+Done
+DONE
+Dong
+dont
+DONT
+DontAdvance
+Dos
+DoS
+dot
+Dot
+DOT
+dotaccent
+Dotaccentsmall
+dotlessi
+dotsection
+dotted
+DOTTED
+dottedcircle
+DOTTEDCIRCLE
+Dotyali
+double
+DOUBLE
+down
+DOWN
+download
+downloaded
+Downloading
+downstream
+downward
+DPI
+DR
+dragons
+drain
+draw
+Draw
+drawing
+Drawing
+DRAWINGS
+drawn
+Drepper
+drh
+drive
+driver
+Driver
+drop
+Drop
+DROP
+dropped
+dropping
+drops
+drw
+ds
+dsb
+Dsmall
+dsohowto
+dst
+dsuperior
+dtd
+DTD
+dtor
+dty
+du
+Du
+dual
+Duano
+duct
+ductile
+ductileGlyphAction
+DuctileGlyphAction
+ductility
+due
+duj
+DUL
+dumb
+dumber
+Dumbest
+dummy
+Dummy
+Dungan
+dup
+dupe
+duplicate
+DUPLICATE
+duplicated
+Duplicated
+duplicates
+duplication
+DUPLOYAN
+dupped
+duration
+during
+During
+Dutch
+dv
+dw
+dwFeatures
+dwFileAttributes
+dwFileFlags
+DWORD
+dwrite
+DWrite
+DWRITE
+DWriteCreateFactory
+dwriteFactory
+DWriteFontFileLoader
+DWriteFontFileStream
+dwSecurityQosFlags
+dwSize
+dwu
+dwy
+dx
+Dx
+DxA
+DxAB
+DxBA
+dy
+DYEH
+dynamic
+dyu
+Dyula
+dz
+Dzongkha
+e
+E
+ea
+EA
+EAAu
+EABu
+each
+Each
+eachother
+EACu
+eacute
+Eacute
+Eacutesmall
+EADu
+eae
+EAEu
+EAFu
+eager
+earlier
+Earlier
+early
+EARLY
+easier
+East
+eastasian
+Eastern
+easy
+EAu
+eb
+EB
+EBAu
+EBBu
+EBCu
+ebdt
+EBDT
+EBDu
+EBEu
+EBFu
+Ebira
+eblc
+Ebrahim
+EBu
+ec
+EC
+ECAu
+ECBu
+ECCu
+ECD
+ecde
+ECDu
+ECE
+ECEu
+ecfb
+ECFu
+ecircumflex
+Ecircumflex
+Ecircumflexsmall
+ECu
+Ecuador
+ed
+ED
+eda
+EDAu
+EDBu
+EDCu
+EDDu
+EDEu
+EDFu
+edge
+edges
+edieresis
+Edieresis
+Edieresissmall
+edit
+edits
+EDITS
+Edo
+EDu
+ee
+EE
+EEAu
+EEBu
+EECu
+EEDu
+EEEEEELLLLLLLLuuuuuuuuGGGGGGGEEEEEEEE
+EEELLLGGGGEEEE
+EEEu
+EEFu
+EEu
+ef
+EF
+EFEu
+EFF
+effect
+effectively
+effects
+efficiency
+efficiently
+effort
+efi
+Efik
+EFu
+eg
+Eg
+egrave
+Egrave
+Egravesmall
+Egypt
+Egyptian
+EGYPTIAN
+eight
+EIGHT
+EIGHTEEN
+eightinferior
+eightoldstyle
+eightsuperior
+EINTR
+either
+Either
+EK
+ekk
+el
+El
+ELBASAN
+ELEM
+element
+ELEMENT
+elements
+Elements
+ELEVEN
+elidable
+ELIDABLE
+elidedFallbackNameID
+elie
+Elie
+elif
+ellipsis
+ELLIPSIS
+else
+Else
+elt
+ELT
+ELYMAIC
+em
+EM
+embed
+embedded
+EmbeddedPeakTuple
+embedding
+EMBEDDING
+emboldening
+EMBOX
+emdash
+emk
+emoji
+Emoji
+EMOJI
+emphasis
+empty
+Empty
+EMPTY
+ems
+en
+EN
+enable
+Enable
+enabled
+ENABLED
+enableFlags
+enables
+enabling
+enb
+enc
+Enclosed
+enclosing
+ENCLOSING
+encode
+ENCODE
+encoded
+Encoded
+encoder
+Encodes
+encoding
+Encoding
+ENCODING
+encodingID
+EncodingID
+encodingOffset
+EncodingOffset
+encodingrec
+EncodingRecIter
+encodingRecord
+EncodingRecord
+encodings
+encounter
+encountered
+end
+End
+END
+endash
+endchar
+endCharCode
+endcode
+endCode
+endConnectorLength
+endCoord
+endCount
+endcp
+ended
+endGlyphID
+endGlyphIndex
+endian
+Endian
+ENDIAN
+endif
+ending
+EndPtr
+endPtsOfContours
+ends
+endSize
+Enets
+enf
+enforce
+engine
+Engine
+engines
+English
+ENGRAVED
+enh
+ENHANCEMENTS
+enlarge
+Enlarge
+enough
+ensure
+Ensure
+ensures
+enter
+EnterCriticalSection
+entire
+entirely
+entirety
+ENTITY
+entries
+Entries
+entry
+Entry
+entryAnchor
+EntryAnchor
+EntryData
+EntryExit
+entryExitRecord
+EntryExitRecord
+entrySelector
+EntryT
+entryTable
+enum
+enumerate
+enumerated
+Enumerates
+enumeration
+enumerations
+enums
+env
+ENV
+environment
+eo
+eof
+EOT
+epsilon
+eq
+equal
+EQUAL
+equality
+equally
+equals
+Equatorial
+equivalent
+Eric
+err
+Err
+Erratic
+erratically
+erring
+errno
+ERRNO
+error
+Error
+ERROR
+errors
+errs
+Erzya
+es
+ESC
+escape
+escapes
+eScript
+Esfahbod
+esg
+esi
+esk
+Esmall
+esp
+especially
+Esperanto
+esque
+essence
+essentially
+Estero
+estimate
+estimated
+estimates
+Estonia
+Estonian
+Estrangela
+Estrangelo
+esu
+esuperior
+et
+etc
+eth
+Eth
+Ethiopia
+Ethiopic
+ETHIOPIC
+Ethsmall
+eto
+Eton
+eu
+Eu
+eval
+evaluate
+evaluating
+eve
+even
+Even
+EVEN
+Evenki
+event
+EVENT
+events
+eventual
+ever
+every
+Every
+everyone
+everything
+evidence
+evident
+evn
+Ewe
+ewo
+Ewondo
+exact
+exactly
+examine
+examines
+examining
+example
+examples
+exceed
+exceeds
+except
+Except
+exception
+exceptional
+exceptions
+excess
+excessive
+exch
+exchange
+exclam
+EXCLAMATION
+exclamdown
+exclamdownsmall
+exclamsmall
+excluded
+exclusion
+exclusive
+Exclusive
+exclusivity
+exe
+executable
+execute
+EXECUTE
+exhaust
+exist
+existence
+existent
+existing
+EXISTING
+exists
+exit
+exitAnchor
+ExitAnchor
+exp
+EXP
+expand
+expanded
+EXPANDED
+ExpansionFactor
+expect
+expected
+expects
+expensive
+experience
+experimental
+experimentally
+expert
+EXPERT
+ExpertCharset
+ExpertEncoding
+ExpertSubsetCharset
+explanation
+explicit
+EXPLICIT
+explicitLevel
+explicitly
+explore
+exponent
+EXPONENTS
+export
+EXPORT
+exported
+exports
+expose
+Expose
+exposed
+exposing
+Exposing
+expr
+EXPR
+express
+Express
+expressed
+expression
+expressions
+extend
+Extend
+extended
+Extended
+EXTENDED
+extendedShapeCoverage
+ExtendedTypes
+Extender
+EXTENDER
+ExtenderGlyph
+extenderGlyphs
+ExtenderGlyphs
+extensibility
+extension
+Extension
+extensionDisableGPOS
+extensionDisableGSUB
+extensionEnableGPOS
+extensionEnableGSUB
+ExtensionFormat
+extensionJstfMax
+extensionLookupType
+extensionOffset
+ExtensionOffset
+ExtensionPos
+extensions
+Extensions
+EXTENSIONS
+ExtensionSubst
+extensively
+extent
+Extent
+extents
+EXTENTS
+extern
+EXTERN
+external
+externally
+externs
+extlang
+extra
+Extra
+EXTRA
+extract
+extracted
+EXTRAS
+extreme
+extremely
+eye
+Eye
+eyelash
+eyo
+f
+F
+fa
+FA
+FAAu
+fabs
+FABu
+FAbv
+faca
+face
+Face
+FACE
+faceBlob
+Facebook
+faces
+FACESIZE
+facet
+faceType
+facilities
+facility
+fact
+factor
+FACTOR
+factors
+factory
+FACTORY
+factoryType
+FACu
+FADu
+FAEu
+FAFu
+fail
+Fail
+FAIL
+failed
+Failed
+FAILED
+failing
+FAILLING
+fails
+Fails
+failure
+FAILURE
+failures
+fairly
+Falam
+fall
+Fall
+fallback
+Fallback
+FALLBACK
+falling
+falls
+fallthrough
+FALLTHROUGH
+false
+FALSE
+family
+Family
+FAMILY
+FamilyBlues
+familyName
+FamilyName
+FamilyOtherBlues
+fan
+Fancy
+Fang
+Fanti
+faq
+far
+Faroe
+Faroese
+Farsi
+FARSI
+fashion
+fast
+faster
+fat
+fatha
+FATHA
+fathatan
+FAu
+faulty
+favor
+fb
+FB
+fba
+FBAu
+FBBu
+FBCu
+FBDu
+fbe
+FBFu
+fbl
+FBlw
+FBu
+fc
+FC
+FCAu
+fcc
+FCCu
+FCDu
+FCEu
+FCFu
+fclose
+fcntl
+FCu
+fd
+FD
+fda
+fdArray
+FDArray
+FDArrayInfo
+FDArrayOffset
+FDAu
+fdcount
+fdCount
+FDDu
+fde
+FDEFs
+FDEu
+FDF
+FDFu
+FDIndex
+fdmap
+fds
+fdsc
+FDSC
+fdselect
+fdSelect
+FDSelect
+FDSELECT
+FDSelectInfo
+FDSelectOffset
+FDu
+fe
+Fe
+FE
+feat
+FEAT
+FeatMinMaxRecord
+featMinMaxRecords
+FeatMinMaxRecords
+feats
+featUILableNameID
+featUITooltipTextNameID
+feature
+Feature
+FEATURE
+featureCount
+featureFlags
+featureIndex
+featureList
+FeatureList
+FeatureName
+featureNameCount
+featureParams
+FeatureParams
+FeatureParamsCharacterVariants
+FeatureParamsSize
+FeatureParamsStylisticSet
+featureRangeLengths
+features
+Features
+FEATURES
+featureSetting
+FeatureTableSubstitution
+FeatureTableSubstitutionRecord
+featureTableTag
+featureType
+featureval
+FeatureVariationRecord
+FeatureVariations
+featureVars
+featureZ
+FEAu
+Feb
+February
+FEBu
+FECu
+Fedora
+FEDu
+fee
+feed
+feel
+fees
+FEFF
+FEH
+fence
+feof
+ferror
+fetch
+Fetch
+fetched
+fetches
+Fetches
+fetching
+FetchNextRun
+FEu
+few
+fewer
+ff
+FF
+FFA
+FFAu
+ffbfea
+ffcdf
+FFCu
+FFEu
+FFF
+FFFD
+FFFF
+FFFFF
+FFFFFF
+FFFFFFF
+FFFFFFFFULL
+FFFFFu
+FFFFu
+FFFFULL
+FFFu
+ffi
+ffl
+ffm
+FFu
+FFULL
+ffuncs
+ffunctions
+fh
+fi
+fi
+fid
+field
+fields
+FIFTEEN
+figure
+FIGURE
+figuredash
+Fijian
+fil
+file
+File
+FILE
+filename
+fileOffset
+files
+fileSize
+fileType
+Filipino
+fill
+Fill
+filled
+FILLER
+filling
+Filling
+filter
+Filter
+filtered
+filtering
+filterMethod
+filterRangeMaxValue
+filterRangeMinValue
+filters
+FIN
+fina
+FINA
+final
+Final
+FINAL
+finalcode
+finalize
+finalizer
+Finalizer
+finally
+Finally
+finaLookup
+finaSubLookup
+find
+Find
+FINDFONT
+finding
+finds
+Finds
+fine
+fini
+finish
+Finish
+finished
+finite
+Finland
+Finnish
+Firefox
+first
+First
+FIRST
+firstAxis
+firstAxisSegmentMaps
+firstChain
+firstDeviceRecord
+firstGlyph
+firstGlyphIndex
+FirstGlyphs
+firstLayerIdx
+firstPairValueRecord
+firstParamUILabelNameID
+firstSubtable
+firstSubTable
+fit
+FITNESS
+fitting
+five
+FIVE
+fiveeighths
+fiveinferior
+fiveoldstyle
+fivesuperior
+fix
+Fix
+fixed
+Fixed
+FIXED
+fixedcs
+FixedType
+FixedVersion
+Fixes
+fixup
+Fixup
+fj
+fl
+flag
+Flag
+FLAG
+flags
+Flags
+FLAGS
+flat
+flatStr
+flatten
+Flatten
+FLATTENED
+flattener
+fLayoutRTL
+Flemish
+Fleurons
+FLEURONS
+flex
+flip
+flm
+float
+floating
+fLogicalOrder
+flooded
+floor
+florin
+flow
+Flowery
+FLT
+flush
+fly
+FM
+FMAbv
+FMBlw
+fMergeNeutralItems
+fmp
+FMPst
+fmt
+fNoGlyphIndex
+fo
+folded
+follow
+followed
+Followed
+following
+Following
+follows
+fon
+Fon
+fonipa
+fonnapa
+font
+Font
+FONT
+FontBBox
+fontconfig
+Fontconfig
+FontConfig
+FontDescriptor
+fontdict
+FontDict
+fontdicts
+fontDicts
+fontDictStr
+fontDirectionHint
+fontEmSize
+fontFace
+fontFile
+fontFileKey
+fontFileLoader
+fontFileReferenceKey
+fontFileReferenceKeySize
+fontFileStream
+FontInfo
+fontlab
+FontMatrix
+fontName
+FontName
+fontRevision
+fonts
+Fonts
+fontSzr
+fonttools
+fontTools
+FontTools
+foo
+fopen
+for
+For
+FOR
+forbid
+Force
+ForceBold
+forced
+foreach
+foreground
+Forest
+forget
+forgives
+fork
+Fork
+form
+Form
+FORM
+format
+Format
+FORMAT
+formatReserved
+formats
+Formats
+formatting
+formed
+former
+Former
+formerly
+forms
+Forms
+FORMS
+FORMULA
+forum
+forw
+forward
+FORWARD
+forwards
+found
+Found
+FOUND
+Foundation
+four
+Four
+FOUR
+fourinferior
+fouroldstyle
+foursuperior
+FOURTEEN
+fourth
+fOverrideDirection
+fp
+fprintf
+FPst
+fr
+frac
+FRACT
+fraction
+FRACTION
+fractional
+fractions
+FRACTIONS
+fragmentContext
+fragmentSize
+fragmentStart
+frame
+framework
+franc
+France
+frc
+fread
+Frédéric
+free
+Free
+FREE
+freed
+freedesktop
+Freedesktop
+freeing
+FreeLibrary
+freelocale
+freely
+freetype
+FreeType
+FREETYPE
+fref
+French
+frequent
+frequently
+fribidi
+friend
+Frisian
+Friulian
+from
+From
+FROM
+fromCoord
+FromGlyphs
+front
+frozen
+frp
+fRTL
+fscale
+Fsmall
+fsref
+FSRef
+fsSelection
+fstat
+fsType
+ft
+FT
+FTStringRange
+fu
+Fu
+fub
+fuc
+fue
+fuf
+fuh
+fui
+Fujian
+Fukien
+Fulah
+fulfilled
+Fulfulde
+full
+Full
+FULL
+fullAdvance
+fullName
+FullName
+fullset
+Fullwidth
+FULLWIDTH
+fully
+Fully
+fun
+func
+Func
+FUNC
+FUNCOBJ
+funcs
+Funcs
+FUNCS
+FUNCSIG
+function
+Function
+FUNCTION
+functionality
+functions
+Functions
+FuncType
+funcZ
+fundamental
+fundamentals
+FUnit
+FUnits
+fuq
+fur
+further
+Furthermore
+Futa
+future
+fuv
+Fuzhou
+fuzz
+fvar
+FVAR
+FVSes
+FWIDTH
+FWORD
+fy
+FYROM
+g
+G
+ga
+Ga
+gaa
+Gade
+Gaelic
+GAF
+gag
+Gagauz
+Gah
+Gahri
+Galice
+Galician
+Galla
+Gallurese
+gan
+Gan
+Ganda
+Ganja
+gap
+GAP
+gaps
+garbage
+Garhwali
+Garo
+Garret
+Garshuni
+gasp
+GASP
+GaspRange
+gaspRanges
+gather
+gaw
+gax
+gaz
+GB
+gbm
+GBoxedCopyFunc
+GBoxedFreeFunc
+gbreve
+Gbreve
+gbytes
+GBytes
+gc
+GC
+gcc
+GCC
+gce
+gchar
+gconstpointer
+gd
+gda
+gdef
+GDEF
+gdi
+GDI
+Ge
+Geez
+Gemination
+GEMINATION
+gen
+Gen
+GEN
+general
+General
+GENERAL
+generally
+Generally
+generate
+generated
+GenerateResults
+generates
+Generates
+Generating
+generic
+Generic
+GENERIC
+geok
+Geok
+Geometric
+Georgia
+Georgian
+GEORGIAN
+German
+germandbls
+Germany
+get
+Get
+GET
+GetCharVariantIndex
+getCombiningClass
+GetDC
+getenv
+GETENV
+GetFileSize
+GetFileSizeEx
+GetFontData
+GetGlyphPlacements
+getglyphs
+GetGlyphs
+getIntPropertyMaxValue
+getIntPropertyValue
+GetJustificationOpportunities
+getjustifiedglyphs
+GetJustifiedGlyphs
+GetLastWriteTime
+GetLocaleName
+GetModuleHandle
+getNFCInstance
+getNFDInstance
+GetNumberSubstitution
+getpagesize
+GETPAGESIZE
+GetParagraphReadingDirection
+GetProcAddress
+getRawDecomposition
+gets
+Gets
+getScript
+GetScriptProperties
+getShortName
+getter
+getters
+GetTextAtPosition
+GetTextBeforePosition
+getting
+Getting
+gez
+gfxShapedWord
+ggo
+GHAIN
+Gheg
+GHUNNA
+gid
+GID
+gidDDD
+gids
+gih
+Gikuyu
+gil
+Gilaki
+Gilbertese
+Gilyak
+GIMEL
+ginfo
+git
+Githabul
+github
+GitHub
+give
+Give
+given
+Given
+gives
+giving
+gju
+gkp
+gl
+Glagolitic
+GLAGOLITIC
+gld
+glib
+GLib
+GLIB
+glibc
+GLIBC
+glk
+global
+Global
+GLOBAL
+GlobalSubr
+globalsubrs
+globalSubrs
+globalSubrsInfo
+glue
+glyf
+GLYF
+glyid
+glyID
+glyph
+Glyph
+GLYPH
+glyphAdvances
+GlyphAnchors
+glyphArray
+glyphAssembly
+GlyphAssembly
+GlyphBitmapDataFormat
+glyphClassDef
+GlyphClasses
+glyphConstruction
+glyphCount
+glyphDataFormat
+glyphDataOffsets
+glyphFormat
+GlyphHeader
+glyphid
+glyphId
+glyphID
+GlyphID
+GLYPHID
+glyphIdArray
+glyphIdArrayLength
+GlyphIDs
+glyphIndex
+glyphIndices
+glyphMetrics
+glyphNameIndex
+glyphOffsets
+GLYPHPROP
+glyphProperties
+glyphs
+Glyphs
+GLYPHS
+glyphset
+GlyphVarData
+GM
+gmappedfile
+GMT
+gn
+gname
+gnn
+gno
+gnome
+gnu
+GNU
+GNUC
+gnw
+go
+goal
+GOAL
+goals
+Goan
+gobject
+GObject
+GOBJECT
+GOFFSET
+gog
+Gogo
+going
+gom
+gon
+Gondi
+GONDI
+gone
+good
+google
+Google
+Goronzy
+got
+Got
+Gothic
+GOTHIC
+goto
+gpos
+GPOS
+GPOSProxy
+gr
+grab
+graduated
+grained
+granted
+GRANTED
+Grantha
+GRANTHA
+granular
+granularly
+graph
+grapheme
+Grapheme
+GRAPHEME
+graphemes
+Graphemes
+GRAPHEMES
+graphic
+graphics
+Graphics
+graphicType
+graphite
+Graphite
+GRAPHITE
+grave
+Gravesmall
+greater
+greaterequal
+Greece
+Greek
+GREEK
+green
+Green
+Greenland
+Greenlandic
+greg
+grep
+grface
+Grid
+GRID
+Grigori
+grigorig
+group
+GROUP
+grouped
+Groupings
+grouprecord
+groups
+grow
+growFlags
+growing
+grows
+growth
+grt
+gru
+gsize
+Gsmall
+gsub
+GSUB
+gsubgpos
+GSUBGPOS
+GSUBProxy
+gsw
+gt
+gtk
+GTK
+gtype
+GType
+gu
+Guarani
+Guaraní
+guarantee
+guaranteed
+guarantees
+guards
+Guatemala
+guc
+GUEH
+guess
+guessing
+guf
+gug
+gui
+Guibei
+Guibian
+guillemotleft
+guillemotright
+guilsinglleft
+guilsinglright
+Guinea
+Guiyang
+Gujarati
+GUJARATI
+Gujari
+Guji
+GUJR
+guk
+Gulf
+Gumatj
+Gumuz
+gun
+GUnicodeScript
+GUnicodeType
+Gunjala
+GUNJALA
+Gupapuyngu
+Gurage
+Gurmukhi
+GURMUKHI
+GURU
+Gusii
+guz
+gv
+gvar
+GVAR
+gwi
+Gwich
+GX
+gxFontDescriptor
+gzip
+h
+H
+ha
+haa
+hack
+HACKMEM
+had
+Hadothi
+Hadrami
+hae
+HAFS
+HAH
+Haible
+HAIR
+Haitian
+Haji
+hak
+Hakha
+Hakka
+Halam
+halant
+Halant
+HALANT
+halants
+half
+Half
+HALF
+Halfwidth
+HALFWIDTH
+Halh
+HALN
+Hamer
+Hammer
+HAMZA
+HAMZAH
+Han
+HAN
+hand
+Hand
+handed
+handing
+handle
+Handle
+HANDLE
+handled
+handler
+handles
+handling
+hang
+hanging
+Hanging
+HANGING
+hangul
+Hangul
+HANGUL
+Hanifi
+HANIFI
+HANJA
+hans
+Hans
+hant
+Hant
+Hanunoo
+HANUNOO
+happen
+happened
+happening
+happens
+Happens
+happier
+happy
+har
+Harari
+Harauti
+hard
+harder
+hardest
+harfbuzz
+HarfBuzz
+HarffBuzz
+Haryanvi
+has
+Has
+HAS
+hash
+hashmap
+Hat
+hataf
+HATRAN
+HAU
+Hausa
+have
+Have
+HAVE
+having
+haw
+Hawaiian
+hAxis
+hay
+Haya
+haz
+Hazaragi
+hb
+HB
+HBASELINE
+HBFixed
+HBGlyphID16
+HBINT
+hbot
+hbotABCD
+hbsc
+hbshape
+hbsubset
+HBUCHAR
+HBUINT
+HBUSHORT
+hbview
+hdc
+HDC
+hdmx
+HDMX
+he
+HE
+hea
+head
+Head
+HEAD
+header
+Header
+HEADER
+headerfile
+headers
+Headers
+headerSize
+HeadlessArrayOf
+heap
+heavier
+heavily
+hebrew
+Hebrew
+HEBREW
+HEH
+height
+HEIGHT
+heightCount
+heights
+help
+helper
+Helper
+helpers
+helpful
+helps
+hence
+Hence
+here
+Here
+hereby
+Herero
+HEREUNDER
+Herzegovina
+HET
+heuristic
+Hexagram
+hflex
+hfont
+HFONT
+hh
+HH
+hhcurveto
+hhea
+HHEA
+hi
+hidden
+HIDDEN
+hide
+HIDE
+hiding
+HIEROGLYPHS
+high
+High
+HIGH
+higher
+highest
+Highland
+HIGHLEVEL
+highlight
+highlighting
+highly
+Hijazi
+hil
+Hiligaynon
+himalaya
+Himalaya
+Hindi
+Hindko
+hinstLib
+hint
+hinted
+hinting
+HINTING
+HintingDevice
+hintmask
+hints
+Hiragana
+HIRAGANA
+Hiri
+hiriq
+HIRIQ
+historical
+HISTORICAL
+history
+hit
+hji
+hk
+HK
+hlineto
+hlt
+hma
+hmc
+hmd
+hme
+hmetrics
+hmg
+hmh
+hmi
+hmj
+hml
+hmm
+hmn
+HMODULE
+Hmong
+HMONG
+hmoveto
+hmp
+hmq
+hms
+hmtx
+HMTX
+hmtxvmtx
+hmw
+hmy
+hmz
+HN
+hnd
+hne
+hnj
+hno
+ho
+Ho
+hoc
+hoi
+hoj
+HOJO
+Hokkien
+Hoklo
+holam
+HOLAM
+hold
+holder
+Holder
+HOLDER
+holding
+holds
+Holikachuk
+home
+Homebrew
+Honduras
+Hong
+Hongshuihe
+hood
+hook
+Hook
+hooks
+horiBearingX
+horiBearingY
+horiz
+HORIZ
+horizData
+horizGlyphCount
+horizGlyphCoverage
+horizontal
+Horizontal
+HORIZONTAL
+horizontally
+Horned
+Hosken
+Hosny
+hosted
+house
+House
+how
+however
+However
+HOWEVER
+HP
+hr
+HRESULT
+hrm
+hsb
+Hsmall
+hsn
+hstem
+hstemhm
+ht
+hTemplateFile
+html
+http
+https
+hu
+Huallaga
+Huamalíes
+Huánuco
+Huaylas
+Huaylla
+huge
+Huishui
+Huizhou
+huj
+human
+Humm
+Hungarian
+HUNGARIAN
+hungarumlaut
+Hungarumlautsmall
+Hungary
+hup
+Hupa
+hvar
+HVAR
+HVARTag
+HVARVVAR
+hvcurveto
+HVM
+hy
+hyphen
+HYPHEN
+hyphenation
+hypheninferior
+HYPHENS
+hyphensuperior
+hyw
+hz
+i
+I
+ia
+iacute
+Iacute
+Iacutesmall
+iba
+Iban
+ibb
+Ibibio
+IBMCPP
+ibmxl
+ibo
+ic
+Iceland
+Icelandic
+iCharPos
+iche
+icircumflex
+Icircumflex
+Icircumflexsmall
+icu
+ICU
+id
+ID
+ida
+Idakho
+idDelta
+idea
+ideal
+Ideally
+ideas
+IDEFs
+idempotent
+identical
+identically
+identification
+identified
+identifier
+identifiers
+identifies
+identify
+identifying
+identity
+IDEO
+Ideograms
+Ideographic
+IDEOGRAPHIC
+Ideographs
+IDEOGRAPHS
+idieresis
+Idieresis
+Idieresissmall
+Ido
+Idotaccent
+idRangeOffset
+ids
+IDs
+IDWriteFactory
+IDWriteFontFace
+IDWriteFontFile
+IDWriteFontFileLoader
+IDWriteFontFileStream
+IDWriteNumberSubstitution
+IDWriteTextAnalysisSink
+IDWriteTextAnalysisSource
+IDWriteTextAnalyzer
+idx
+ie
+Ie
+ietf
+IETF
+if
+If
+IF
+IFACEMETHOD
+IFACEMETHODIMP
+ifdef
+ifelse
+iff
+ifndef
+ig
+Igalia
+igb
+Igbo
+ignorable
+Ignorable
+IGNORABLE
+ignorables
+IGNORABLES
+ignore
+Ignore
+IGNORE
+IgnoreBaseGlyphs
+ignored
+Ignored
+IGNORED
+IgnoreFlags
+IgnoreLigatures
+IgnoreMarks
+ignoring
+igrave
+Igrave
+Igravesmall
+IHDR
+ii
+II
+iid
+IID
+ijc
+ijo
+Ijo
+ik
+ike
+ikt
+ill
+illegal
+ILLUMINATED
+illustrates
+ilo
+Ilokano
+Iloko
+image
+imageDataOffset
+imageFormat
+imageOffsetsZ
+images
+imagine
+Imbabura
+IMC
+immediately
+immutable
+IMPERIAL
+impl
+IMPL
+implement
+Implement
+IMPLEMENT
+implementation
+IMPLEMENTATION
+implementations
+Implementations
+implemented
+IMPLEMENTED
+implementing
+Implementing
+implementor
+implements
+Implements
+implicit
+IMPLICIT
+implied
+IMPLIED
+implies
+important
+Important
+impose
+impossible
+improve
+improved
+iMu
+in
+In
+IN
+inaccuracy
+Inari
+inc
+Inc
+inch
+INCIDENTAL
+Incidentally
+include
+Include
+included
+includes
+Includes
+including
+Including
+INCLUDING
+inclusion
+inclusive
+incoming
+incompatible
+incomplete
+inconsistencies
+incorporating
+incorrect
+incorrectly
+incorrectness
+increase
+Increase
+increased
+increases
+Increases
+increasing
+incrementally
+incurs
+IND
+indeed
+indefinitely
+indented
+independent
+Independent
+INDEPENDENT
+independently
+index
+Index
+INDEX
+IndexArray
+indexed
+Indexed
+indexes
+indexFormat
+indexing
+IndexMask
+IndexOf
+IndexSubtable
+IndexSubtableArray
+indexSubtableArrayOffset
+IndexSubtableFormat
+IndexSubtableHeader
+IndexSubtableRecord
+indexSubtablesZ
+indexTablesSize
+indexToLocFormat
+India
+indic
+Indic
+INDIC
+indicate
+indicated
+indicates
+Indicates
+indicating
+indication
+indices
+indicies
+IndicPositionalCategory
+IndicShapingInvalidCluster
+IndicSMatraCategory
+IndicSyllabicCategory
+IndicSyllableCategory
+INDIRECT
+indirection
+individual
+Individual
+individually
+indivisible
+Indonesia
+Indonesian
+inds
+industry
+IndV
+indx
+indy
+ineffective
+inefficient
+INEQUALITY
+inert
+INERT
+inf
+infer
+Infer
+INFERIORS
+inferred
+infinite
+infinitum
+infinity
+info
+INFO
+informaltable
+informatimago
+information
+Information
+infos
+infrequent
+ing
+Ingush
+inh
+INHERENT
+inherit
+Inherit
+INHERITED
+inherits
+inhibit
+init
+Init
+INIT
+initial
+Initial
+INITIAL
+Initialization
+initialize
+InitializeCriticalSection
+InitializeCriticalSectionEx
+initialized
+initializer
+INITIALIZER
+initializers
+initially
+Initially
+initialRandomSeed
+initiated
+initLookup
+initmediSubLookup
+initpos
+initSubLookup
+InitT
+ink
+inline
+inner
+innerIndex
+inout
+INOUT
+inplace
+input
+Input
+INPUT
+inputClassDef
+inputCount
+inputs
+inputX
+inputZ
+Inremental
+ins
+insane
+INSCRIPTIONAL
+insert
+Insert
+INSERT
+inserted
+insertion
+Insertion
+insertionAction
+insertions
+InsertionSubtable
+inserts
+inside
+Inside
+inspect
+inspecting
+inspects
+install
+Install
+installed
+installing
+Installing
+instance
+INSTANCE
+instanceCoords
+instanceCount
+InstanceRecord
+instances
+Instances
+instanceSize
+INSTANTIATE
+instantiated
+instead
+Instead
+instruct
+instruction
+instructionLength
+instructions
+Instructions
+INSTRUCTIONS
+INSUFFICIENT
+int
+Int
+INT
+integer
+Integer
+INTEGER
+integers
+integral
+integrate
+integrating
+integration
+Integration
+intel
+INTEL
+intended
+intentional
+intentionally
+Intentionally
+Inter
+interact
+InterCharacter
+interest
+interested
+interface
+interfaces
+interfering
+interim
+Interix
+interlaceMethod
+Interlingua
+Interlingue
+InterlockedCompareExchangePointer
+InterlockedExchange
+InterlockedExchangeAdd
+intermediate
+intermediateEndTuple
+IntermediateRegion
+intermediateStartTuple
+intermixed
+intern
+internal
+Internal
+INTERNAL
+internally
+Internally
+internals
+International
+INTERNATIONAL
+InternationalSymbols
+interp
+INTERP
+interpolate
+Interpolate
+interpolation
+interpret
+interpretation
+Interpretation
+interpreter
+interpreting
+INTERROBANG
+intersect
+intersections
+intersects
+INTERSECTS
+interviews
+intl
+into
+intOp
+intptr
+intrin
+intro
+introduced
+Introduced
+introducing
+Introduction
+ints
+IntType
+INTTYPE
+inttypes
+intuition
+Inuinnaqtun
+Inuktitut
+Inupiaq
+Inupiat
+Inupiatun
+invalid
+Invalid
+INVALID
+invert
+INVERTED
+inverts
+investigated
+investigation
+invisible
+Invisible
+INVISIBLE
+invocation
+invoke
+invoked
+invol
+involve
+involved
+involves
+io
+iOS
+iota
+IOTA
+ip
+IPA
+IPHONE
+Iran
+Iranian
+IranNastaliq
+Iraq
+Ireland
+Irish
+irrelevant
+is
+Is
+IS
+Isaac
+ISALNUM
+ISALPHA
+ISC
+isCombinedS
+isCombiningL
+isCombiningT
+isCombiningV
+isEmojiFont
+isFixedPitch
+ish
+isHangulTone
+isiXhosa
+isiZulu
+isL
+Islamic
+Islands
+Ismall
+isn
+iso
+ISO
+ISOAdobeCharset
+ISOL
+ISOLATE
+isolated
+ISOLATED
+Israel
+isRightToLeft
+ISSPACE
+issue
+issuecomment
+issues
+issuetracker
+isSupported
+isT
+Isukha
+isuperior
+isV
+it
+It
+ital
+Italian
+italic
+Italic
+ITALIC
+italicAngle
+ItalicAngle
+italics
+Italics
+italicsCorrection
+Italy
+item
+Item
+ITEM
+itemCount
+itemizedlist
+itemizer
+items
+Items
+ITEMS
+ItemSize
+iter
+Iter
+ITER
+iterable
+Iterable
+iterables
+iterate
+Iterate
+iterated
+iteration
+iterations
+iterator
+Iterator
+IteratorIn
+IteratorOut
+iterators
+iters
+its
+Its
+ITS
+itself
+iu
+IUnknown
+ivs
+iw
+Izon
+izzi
+j
+J
+ja
+jak
+Jakun
+jam
+Jamaica
+Jamaican
+Jambi
+jamo
+Jamo
+January
+Japan
+Japanese
+Jauja
+Javanese
+JAVANESE
+jax
+jbo
+jct
+JEEM
+JEH
+jg
+ji
+Jicarilla
+Jing
+Jinyu
+JIS
+JMO
+job
+join
+joiner
+Joiner
+JOINER
+joiners
+JOINERS
+joining
+Joining
+JOINING
+Jonathan
+Jordan
+jpg
+Jsmall
+json
+JSON
+jstf
+JSTF
+JstfLangSys
+JstfLangSysRecords
+JstfMax
+JstfModList
+JstfPriority
+JstfScript
+JstfScripts
+jt
+Jula
+JUNGSEONG
+Junín
+junk
+just
+Just
+JUST
+justClass
+JustClass
+justClassTable
+justification
+Justification
+JUSTIFICATION
+JustificationCategory
+justificationCharacter
+JustificationHeader
+justificationOpportunities
+justified
+justifiedGlyphAdvances
+justifiedGlyphOffsets
+justify
+JustifyGlyphAdvances
+JustWidthDeltaEntry
+jv
+jw
+jy
+k
+K
+ka
+kaa
+kab
+Kabardian
+Kabras
+Kabuverdianu
+Kabyle
+Kachchi
+Kachhi
+KAF
+Kaithi
+KAITHI
+Kalenjin
+Kalmyk
+Kalo
+Kalpak
+kam
+Kamba
+Kambaata
+kana
+KANA
+Kanaq
+Kanauji
+Kanbun
+Kangri
+Kangxi
+Kanji
+Kannada
+KANNADA
+Kanuri
+Kaqchikel
+kar
+Kara
+Karachay
+Karaim
+Karakalpak
+Karelian
+Karen
+kashida
+Kashida
+KashidaLike
+Kashmiri
+Kashubian
+Kaska
+kasra
+kasratan
+Katakana
+KATAKANA
+Katanga
+Kato
+kau
+Kaur
+Kayah
+KAYAH
+Kazakh
+Kazakhstan
+Kazim
+kb
+kbd
+kby
+kByte
+kca
+kCFAllocatorDefault
+kCFAllocatorNull
+kCFBooleanTrue
+kCFCompareEqualTo
+kCFNumberIntType
+kCFStringEncodingUTF
+kCFTypeArrayCallBacks
+kCFTypeDictionaryKeyCallBacks
+kCFTypeDictionaryValueCallBacks
+kCTFontAttributeName
+kCTFontCascadeListAttribute
+kCTFontEmphasizedSystemFontType
+kCTFontFeatureSelectorIdentifierKey
+kCTFontFeatureSettingsAttribute
+kCTFontFeatureTypeIdentifierKey
+kCTFontPostScriptNameKey
+kCTFontSystemFontType
+kCTFontUIFontEmphasizedSystem
+kCTFontUIFontSystem
+kCTFontURLAttribute
+kCTKernAttributeName
+kCTLanguageAttributeName
+kCTRunStatusNonMonotonic
+kCTRunStatusRightToLeft
+kCTTypesetterOptionForcedEmbeddingLevel
+kCTVersionNumber
+kCTVerticalFormsAttributeName
+kde
+kdr
+kdt
+kea
+Kebena
+Kedah
+keep
+Keep
+keeping
+KEHEH
+Keith
+Keiyo
+kek
+Kekchi
+Kentohe
+Kenya
+kept
+Kerinci
+kern
+KERN
+KernAAT
+KernAATSubTableHeader
+kernAction
+kernActionIndex
+KERNEL
+kernIndex
+kerning
+Kerning
+KERNING
+kerningv
+KernOT
+KernOTSubTableHeader
+KernPair
+kerns
+KernSubTable
+KernSubTableFormat
+KernSubTableHeader
+kernValue
+kernValueCount
+kernValueZ
+kerx
+KERX
+KerxSubTable
+KerxSubTableFormat
+KerxSubTableHeader
+KerxTable
+kerxTupleKern
+Kew
+kex
+key
+Key
+KEY
+keys
+kfa
+KFGQPC
+kfr
+kfx
+kfy
+kg
+kha
+KHAH
+Khakas
+Khakass
+Khaled
+Khamti
+Khanty
+Kharoshthi
+KHAROSHTHI
+Khasi
+Khayo
+khb
+Khengkha
+Khimi
+khk
+khmer
+Khmer
+KHMER
+KhmerUI
+Khojki
+KHOJKI
+Khorasani
+Khowar
+kht
+Khudawadi
+KHUDAWADI
+Khumi
+Khutsuri
+khw
+ki
+kick
+KIKAKUI
+Kikongo
+Kikuyu
+Kildin
+Killer
+KILLER
+Kimbundu
+kind
+kinda
+kinds
+Kingdom
+kinoho
+kINVALID
+Kinyarwanda
+Kiowa
+Kipsigis
+Kirghiz
+KIRGHIZ
+Kiribati
+Kirmanjki
+Kisa
+Kisi
+Kisii
+Kissi
+Kistane
+Kiswahili
+Kita
+Kituba
+kiu
+Kiwai
+kj
+kjd
+kjh
+kjp
+kjz
+kk
+kkz
+kl
+klass
+klasses
+kln
+km
+kMaxCallLimit
+kmb
+kmr
+kmw
+kmz
+kn
+knc
+KNDA
+kng
+knn
+know
+knowing
+Knowing
+knowledge
+known
+Known
+knows
+Knuth
+ko
+Ko
+Kodagu
+Kodava
+koi
+kok
+Kokni
+Kölsch
+Komi
+Komo
+Komso
+Kong
+Kongo
+Konkani
+Konso
+Konyanka
+Koongo
+Koorete
+Korea
+Korean
+Koryak
+kos
+Kosraean
+Kota
+koy
+Koyukon
+kpe
+Kpelle
+kpv
+kpy
+kqs
+kqy
+kr
+krc
+kri
+Krio
+krl
+krt
+kru
+Krymchak
+ks
+ksh
+kShort
+kSizeLimit
+Ksmall
+kss
+ksw
+ktb
+ktu
+ktw
+ku
+Kuanyama
+Kubu
+Kui
+Kukna
+Kullu
+Kulvi
+kum
+Kumaoni
+Kumyk
+Kumzari
+Kuna
+Kurdish
+Kurukh
+Kuskokwim
+Kutai
+kuu
+Kuwait
+Kuy
+kv
+kvb
+kvr
+kw
+KW
+kwy
+kxc
+kxd
+kxu
+ky
+Kyrgyz
+Kyrgyzstan
+kyu
+kZero
+l
+L
+la
+La
+Laari
+label
+LABEL
+labels
+lack
+lad
+Ladakhi
+Ladin
+Ladino
+Lahuli
+laid
+Lak
+Laki
+Lalana
+Lam
+LAM
+lamAlefLigaturesSubLookup
+Lambadi
+Lambani
+Lambayeque
+LAMED
+lamInitLigature
+lamLigatureSet
+Lampung
+lang
+langs
+langsys
+langSys
+LangSys
+LANGSYS
+LangSysRecords
+LangSysTag
+LangTag
+language
+Language
+LANGUAGE
+LanguageGroup
+languageID
+languages
+Languages
+LANGUAGES
+languagetags
+Lanka
+Lao
+LAO
+large
+Large
+LARGE
+larger
+largest
+Largest
+LArrayOf
+lash
+last
+Last
+LAST
+lastCode
+lastGlyphIndex
+LastResort
+lastWriteTime
+LATE
+later
+latest
+latg
+Latg
+Latgalian
+latin
+Latin
+LATIN
+latn
+latter
+Latvia
+Latvian
+Lauricocha
+Lawoi
+lay
+layer
+Layer
+layering
+LayerRecord
+layers
+layersZ
+layout
+Layout
+LAYOUT
+LayoutRTL
+lays
+Laz
+lazily
+lazy
+Lazy
+lb
+LBAR
+LBase
+LBASE
+lbe
+lbj
+lbl
+LC
+lcar
+LCAR
+lcarFormat
+lce
+lcf
+LCount
+LCOUNT
+ld
+ldi
+Le
+LE
+lead
+LEADER
+leading
+Leading
+LEADING
+leadingBearingX
+Lealao
+LEAN
+leans
+least
+leave
+Leave
+LeaveCriticalSection
+leaving
+Lebanon
+Leboa
+left
+Left
+LEFT
+leftC
+leftClass
+leftClassCount
+leftClassTable
+leftSide
+legacy
+Legacy
+LEGACY
+legally
+legit
+Lemberg
+len
+LEN
+LENG
+length
+Length
+LENGTH
+lengthed
+lengths
+lengthy
+lenient
+lenM
+lenP
+LENTICULAR
+LenType
+Leone
+Lepcha
+LEPCHA
+less
+lessequal
+let
+Let
+lets
+Lets
+letter
+Letter
+LETTER
+Letterlike
+letters
+Letters
+Levantine
+level
+Level
+LEVEL
+levels
+leverage
+lexicographic
+lez
+Lezghian
+Lezgi
+lf
+LF
+lfCharSet
+lfFaceName
+lfHeight
+lg
+lhs
+Lhs
+li
+Li
+LI
+LIABLE
+Lianshan
+libc
+libcairo
+Liberia
+libfreetype
+libglib
+libharfbuzz
+libkern
+Libon
+libraries
+Libraries
+library
+Library
+LibreOffice
+libs
+libstdc
+libtool
+Libya
+Libyan
+license
+LICENSE
+lidentity
+Liechtenstein
+lif
+life
+lifecycle
+lifecycles
+lig
+LIG
+liga
+ligAction
+LigActionFlags
+ligActionIndex
+LigActionLast
+LigActionOffset
+LigActionStore
+ligActionTable
+ligate
+ligated
+LIGATED
+ligating
+ligation
+ligature
+Ligature
+LIGATURE
+ligatureArray
+LigatureArray
+LigatureAttach
+ligatureCoverage
+LigatureCoverage
+ligatureData
+LigatureEntry
+LigatureEntryT
+LigatureGlyph
+ligatures
+Ligatures
+LIGATURES
+ligatureSet
+LigatureSet
+LigatureSetOffsets
+LigatureSetOffsetsArray
+LigatureSubst
+LigatureSubstFormat
+LigatureSubtable
+ligbase
+LIGBASE
+LigCaretClassEntry
+ligCaretList
+LigCaretList
+ligGlyph
+LigGlyph
+light
+Light
+LIGHT
+lighter
+lightweight
+ligs
+Ligurian
+lij
+like
+Like
+likely
+Likewise
+Lima
+Limbu
+LIMBU
+Limburgish
+limit
+Limit
+LIMIT
+limitation
+limited
+Limited
+LIMITED
+limiting
+limits
+lindex
+line
+LINE
+linear
+Linear
+LINEAR
+linearly
+Linebreak
+lineBreakpoints
+lineGap
+lines
+lineWidth
+Lingala
+lingo
+linguistic
+LINGUISTIC
+linguistically
+linguistics
+link
+linked
+linkedValue
+linking
+links
+linux
+Linux
+Lipan
+lis
+list
+List
+LIST
+listed
+listinfo
+listitem
+lists
+Lisu
+LISU
+literal
+Literary
+Lithuania
+Lithuanian
+little
+LITTLE
+Liujiang
+Liuqian
+liw
+ljmo
+LJMO
+ljp
+lkb
+lki
+lklug
+lko
+lks
+ll
+Ll
+lld
+LLLEEEEEEEGGGG
+LLONG
+LLVM
+lm
+Lm
+lmn
+lmo
+ln
+LNNOffsetTo
+lo
+Lo
+load
+Load
+LOAD
+loaded
+loader
+loaders
+loading
+LoadLibrary
+loc
+loca
+local
+locale
+Locale
+LOCALE
+localeName
+localized
+localsubr
+LocalSubr
+localsubrs
+localSubrs
+localSubrsInfos
+Locate
+located
+location
+Location
+locations
+lock
+lockable
+Lockable
+locl
+locName
+LOffsetArrayOf
+LOffsetLArrayOf
+LOffsetTo
+log
+LOG
+LOGFONT
+logfontw
+LOGFONTW
+logic
+logical
+Logical
+logicalnot
+LogicalOrder
+Logo
+logograms
+Logooli
+LOGOS
+Logudorese
+Lohar
+lohit
+Lohit
+Loja
+lojban
+Lojban
+lom
+Loma
+Lombard
+Lomwe
+Loncong
+lone
+Lonely
+long
+Long
+LONG
+LONGDATETIME
+longer
+longint
+longintdict
+LongMetric
+longMetricZ
+longword
+look
+Look
+lookahead
+lookaheadClassDef
+lookaheadCount
+lookaheadX
+looked
+looking
+Looking
+looks
+Looks
+lookup
+Lookup
+LOOKUP
+lookupCount
+lookupFlag
+LookupFlag
+LookupFlags
+LookupFormat
+lookupIndex
+lookupList
+LookupList
+lookupListIndex
+lookupOffset
+lookupOrderZ
+lookupRecord
+LookupRecord
+LookupRecords
+lookupRecordX
+lookups
+Lookups
+LOOKUPS
+LookupSegmentArray
+LookupSegmentSingle
+LookupSingle
+lookupTable
+lookupType
+LookupType
+lookupX
+loop
+Loop
+loops
+loose
+loosely
+Lortie
+lose
+LOSS
+lossless
+lost
+lot
+Lots
+low
+Low
+LOW
+lower
+Lower
+LOWER
+lowercase
+LOWERCASE
+lowercased
+lowerLimit
+lowest
+lowestRecPPEM
+Lowland
+LowPart
+lozenge
+lParameter
+lps
+lpSecurityAttributes
+LR
+lrc
+lri
+lrm
+lsb
+lsbMap
+lsearch
+lslash
+Lslash
+Lslashsmall
+lsm
+Lsmall
+lsuperior
+lt
+Lt
+ltag
+LTAG
+ltg
+lto
+ltr
+LTR
+lts
+lu
+Lu
+Lü
+lua
+Luba
+Lubu
+Lucian
+Lue
+LUE
+Lule
+Lulua
+luo
+Luo
+Luopohe
+Luri
+lus
+Lushai
+lux
+Luxembourg
+Luxembourgish
+luy
+Luyia
+luz
+lv
+LV
+lvalue
+lvalues
+lvs
+LVT
+lwg
+lwsync
+lx
+Lycian
+LYCIAN
+Lydian
+LYDIAN
+lzh
+lzz
+m
+M
+ma
+Maasina
+MAbv
+mac
+Mac
+MAC
+Macao
+Macedonia
+Macedonian
+machine
+MACHINE
+machinery
+MACHINERY
+machines
+Macintosh
+macos
+macOS
+MacPorts
+macro
+macrolanguage
+macroman
+MACROMAN
+macron
+Macronsmall
+macros
+Macros
+macStyle
+mad
+MADDA
+MADDAH
+made
+Madura
+Madurese
+mag
+Magahi
+magic
+magicNumber
+Mahafaly
+Mahajani
+MAHAJANI
+Mahjong
+mai
+MAI
+mailing
+mailman
+main
+Main
+MAIN
+mainly
+maintain
+maintained
+MAINTENANCE
+MAITAIKHU
+Maithili
+Majang
+major
+Major
+MAJOR
+mak
+Makasar
+MAKASAR
+make
+Make
+MAKE
+makeotf
+makeOTF
+MakeOTF
+makes
+Makes
+Makhuwa
+making
+Making
+Makonde
+MAKSURA
+Malagasy
+Malay
+Malayalam
+MALAYALAM
+Malaysia
+Maldives
+Maldivian
+Male
+Malinke
+malloc
+Malta
+Maltese
+Malvi
+mam
+Mam
+man
+Manado
+manage
+managed
+management
+manages
+Manchu
+Mandaic
+MANDAIC
+Mandar
+Mandarin
+Mandingo
+Mandinka
+Manga
+Manichaean
+MANICHAEAN
+manifest
+Manifest
+MANIFEST
+manifestData
+ManifestLookup
+Maninka
+Maninkakan
+Manipuri
+manner
+manpage
+Mansi
+manual
+Manual
+MANUAL
+manufacturer
+MANUFACTURER
+Manx
+many
+Many
+Maore
+Maori
+map
+Map
+MAP
+mapCount
+mapDataZ
+mapLen
+mapped
+mapper
+mapping
+Mapping
+mappings
+maps
+Maps
+Mapudungun
+MapViewOfFile
+MapViewOfFileFromApp
+Mara
+Marachi
+Marama
+Marathi
+MARBUTA
+March
+Marchen
+MARCHEN
+margins
+Margos
+Mari
+mark
+Mark
+MARK
+markAnchor
+markAnchorPoint
+markArray
+MarkArray
+markAttachClassDef
+MarkAttachmentType
+markBase
+MarkBase
+MarkBasePos
+MarkBasePosFormat
+MarkCategory
+markControlPoint
+markCoverage
+MarkCoverage
+marked
+markedInsertBefore
+MarkedInsertBefore
+markedInsertCount
+MarkedInsertCount
+markedInsertIndex
+markedInsertList
+MarkedIsKashidaLike
+markers
+markFilteringSet
+markFilteringSetX
+MarkFirst
+MarkGlyph
+MarkGlyphSets
+markGlyphSetsDef
+MarkGlyphSetsFormat
+markIndex
+marking
+MarkLast
+markLig
+MarkLig
+MarkLigPos
+MarkLigPosFormat
+markMark
+MarkMark
+MarkMarkPos
+MarkMarkPosFormat
+MarkRecord
+MarkRecords
+marks
+Marks
+MARKS
+Markweeta
+markX
+markY
+Marma
+Marshallese
+Martin
+Martín
+Marwari
+Masaram
+MASARAM
+Mashan
+Masikoro
+mask
+Mask
+MASK
+masks
+Masks
+master
+Master
+MASTERS
+match
+Match
+MATCH
+matched
+matcher
+matches
+matching
+material
+math
+Math
+MATH
+mathConstants
+MathConstants
+mathematical
+Mathematical
+MATHEMATICAL
+mathematics
+MathGlyphAssembly
+MathGlyphConstruction
+mathGlyphInfo
+MathGlyphInfo
+MathGlyphPartRecord
+mathGlyphVariantRecord
+MathGlyphVariantRecord
+MathGlyphVariantRecords
+mathItalicsCorrectionInfo
+MathItalicsCorrectionInfo
+mathKern
+MathKern
+mathKernCoverage
+mathKernInfo
+MathKernInfo
+MathKernInfoRecord
+mathKernInfoRecords
+MathKernInfoRecords
+MathSymbols
+mathTopAccentAttachment
+MathTopAccentAttachment
+MathValueRecord
+mathValueRecords
+MathValueRecords
+mathValueRecordsZ
+mathVariants
+MathVariants
+matra
+Matra
+MATRA
+matras
+Matras
+matrix
+Matrix
+matrixZ
+matter
+Matthias
+Mattole
+Matu
+max
+Max
+MAX
+maxBeforeBL
+maxComponentDepth
+maxComponentElements
+maxCompositeContours
+maxCompositePoints
+maxContours
+maxCoord
+MaxDebugDepth
+maxExtent
+maxFunctionDefs
+maxGlyphCount
+maximum
+Maximum
+maximumLimit
+maximums
+maxInstructionDefs
+maxMemType
+maxp
+MAXP
+maxPoints
+maxpV
+maxSizeOfInstructions
+maxStackElements
+maxStorage
+maxTwilightPoints
+maxVal
+maxValue
+maxWidth
+maxZones
+may
+May
+MAY
+Mayan
+maybe
+Maybe
+MAYBE
+Mayek
+MAYEK
+Mayo
+Mazanderani
+mb
+MB
+mbarrier
+Mbembe
+mBidiLevel
+MBlw
+mbo
+Mbo
+mbstowcs
+Mbundu
+Mbyá
+Mc
+mcm
+mct
+mCurrentRun
+md
+MD
+mdash
+mData
+mdf
+mdr
+mdy
+me
+Me
+mean
+MEAN
+meaning
+meaningfully
+meanings
+means
+Meanwhile
+measurable
+measure
+MEASURE
+measured
+measuring
+mechanical
+mechanism
+MED
+MEDEFAIDRIN
+medi
+MEDI
+medial
+Medial
+MEDIAL
+median
+medifinaLamAlefSubLookup
+mediLookup
+mediSubLookup
+Medium
+MEDIUM
+Medumba
+MEEM
+Meetei
+MEETEI
+Meh
+MEM
+memaccess
+member
+members
+Members
+memcmp
+memcpy
+memmove
+memoize
+memory
+Memory
+MEMORY
+MemoryBarrier
+memset
+men
+Mende
+MENDE
+Mengisa
+mentioned
+mentions
+menu
+meo
+mer
+MERCHANTABILITY
+merge
+Merge
+merged
+merger
+merges
+merging
+Merging
+MEROITIC
+Meru
+Merwari
+Mescalero
+Mesopotamian
+message
+MESSAGE
+messaging
+messed
+meta
+Meta
+META
+metadata
+Metadata
+metamorphosis
+Metamorphosis
+meteg
+method
+methods
+Methods
+metric
+METRIC
+metricDataFormat
+metrics
+Metrics
+METRICS
+Mewari
+Mewati
+Mexico
+mfa
+mfb
+mfe
+mFontFileStream
+mg
+mGlyphCount
+mGlyphStart
+mh
+MH
+mhr
+mhv
+mi
+Miao
+MIAO
+Michiharu
+micro
+MICRO
+microsoft
+Microsoft
+microsqoft
+MicroType
+mid
+middle
+Middle
+midnight
+might
+Might
+min
+Min
+MIN
+minAdvanceSB
+minAfterBL
+Minangkabau
+minConnectorOverlap
+minCoord
+mind
+mingw
+MinGW
+MINGW
+minHeight
+MINI
+minimal
+minimum
+Minimum
+minimumLimit
+minimums
+Minjangbal
+Minjungbal
+minLeadingBearing
+minlen
+minMax
+MinMax
+minMaxCoord
+minMemType
+Minnan
+minor
+MINOR
+minOriginSB
+minorVersion
+minstd
+minTrailingBearing
+minus
+MINUS
+minVal
+minValue
+minVersion
+Minz
+Mirandese
+Miraya
+mirror
+mirroring
+Mirroring
+misc
+Misc
+Miscellaneous
+MISMATCH
+mIsSideways
+missing
+MIT
+mix
+mixed
+mixin
+Mixin
+Mixing
+mixture
+Mizo
+mk
+mkmk
+mku
+mkw
+ml
+ML
+mLocaleName
+mlq
+MLYM
+mm
+MM
+mman
+MMAN
+mmap
+Mmap
+MMAP
+mmr
+mn
+Mn
+mnc
+mnemonics
+mni
+mnk
+mnp
+mns
+mnw
+mo
+mod
+MOD
+mode
+Mode
+MODE
+model
+models
+Modern
+modes
+Modi
+MODI
+modification
+Modification
+modifications
+MODIFICATIONS
+modified
+Modified
+MODIFIED
+modifiedClusterMap
+modifiedGlyphAdvances
+modifiedGlyphIndices
+modifiedGlyphOffsets
+modifier
+Modifier
+MODIFIER
+modifiers
+modify
+Modify
+modifying
+Modifying
+MODIFYING
+modulo
+moh
+Mohawk
+Moksha
+Moldavian
+Moldova
+Moldovan
+Moluccan
+Mon
+Monaco
+Mongolia
+mongolian
+Mongolian
+MONGOLIAN
+Mono
+monospaced
+MONOSPACED
+monotone
+MONOTONE
+monotonic
+monotonically
+monster
+Months
+Moose
+more
+More
+MORE
+MoreToolbox
+Morisyen
+Moroccan
+Morocco
+morphHeader
+mort
+MORT
+mortmorx
+morx
+MORX
+mos
+Mossi
+most
+Most
+mostly
+Motorola
+Motu
+move
+Move
+moved
+moves
+moveto
+moving
+Moving
+mozilla
+Mozilla
+mpe
+MPre
+mprotect
+MPROTECT
+MPst
+mqg
+mr
+MR
+mReadingDirection
+mrh
+mrj
+Mro
+MRO
+mRunHead
+ms
+MS
+msc
+MSC
+mScript
+msdn
+msg
+MSG
+msgidx
+msgstr
+msh
+msi
+mSize
+Msmall
+msuperior
+MSVC
+mt
+MT
+mText
+mTextLength
+mTextStart
+mtr
+mtx
+mu
+much
+mui
+MUJ
+mul
+MulFix
+Muller
+mult
+Multani
+MULTANI
+multi
+multiple
+Multiple
+MULTIPLE
+MultipleSubst
+MultipleSubstFormat
+multiplication
+multiplicative
+multiplied
+MULTIPLIED
+multiply
+MULTIPLY
+multiplying
+mults
+Mundari
+munmap
+mup
+muq
+mus
+Muscogee
+Musi
+Musical
+MUSICAL
+must
+Must
+MUST
+mutable
+mutex
+MUTEX
+mutually
+mvar
+MVAR
+mvb
+mve
+mvf
+MW
+Mwali
+mwk
+mwl
+mwr
+mww
+my
+MY
+myanmar
+Myanmar
+MYANMAR
+mym
+mymr
+myn
+myq
+myv
+mzn
+n
+N
+na
+NABATAEAN
+Nacional
+nag
+Naga
+Nagari
+Nagri
+NAGRI
+nags
+nah
+Nahuatl
+naive
+Najdi
+nalf
+nalfType
+name
+Name
+NAME
+named
+Named
+nameid
+nameID
+NameID
+nameids
+nameIndex
+NameIndex
+nameIndexOffset
+nameList
+namely
+Namely
+nameOffset
+NameRecord
+nameRecordZ
+names
+Names
+NAMES
+nameSIDs
+namespace
+Namespace
+NAMESPACE
+namesX
+namesZ
+nameTag
+Naming
+nan
+Nan
+Nanai
+Nandi
+Nandinagari
+NANDINAGARI
+nap
+Napo
+NARROW
+narrowing
+nasalization
+Naskapi
+native
+NativeFontResourceDWrite
+natural
+Nauru
+Nauruan
+navajo
+Navajo
+nb
+NC
+nClasses
+nCodes
+NCount
+NCOUNT
+nd
+Nd
+ndash
+Ndau
+ndc
+Ndebele
+NDEBUG
+Ndonga
+nds
+Ndzwani
+ne
+Neapolitan
+necessarily
+necessary
+need
+Need
+needed
+needing
+needs
+Needs
+neg
+NEG
+negation
+negative
+Negative
+NEGATIVE
+Negeri
+NEGLIGENCE
+negotiate
+neighboring
+neither
+nel
+Nenets
+Neo
+Nepal
+Nepali
+nesting
+NESTING
+net
+NetBSD
+Netherlands
+neuter
+neutrals
+never
+Never
+nevertheless
+new
+New
+NEW
+Newa
+NEWA
+Newari
+newBits
+newCount
+newer
+newlocale
+NEWLOCALE
+newly
+newRun
+newState
+next
+Next
+NEXT
+nextRun
+NFC
+NFD
+ng
+NG
+nga
+Ngawn
+Ngazidja
+Ngbaka
+ngl
+ngo
+NGOEH
+Ngoni
+nhd
+nibble
+Nibble
+nibbles
+Nicaragua
+nice
+Niger
+Nigeria
+Nigerian
+nikhahit
+Nikhahit
+NIKHAHIT
+nil
+NIL
+Nimadi
+nindex
+nine
+NINE
+nineinferior
+nineoldstyle
+ninesuperior
+NINETEEN
+niq
+Nirmala
+Nisi
+niu
+Niuean
+niv
+NJ
+Njua
+njz
+NKD
+nko
+NKo
+NKO
+Nkoo
+nl
+Nl
+NLCCHARACTERS
+nle
+nLeft
+nmemb
+nn
+NNOffsetTo
+no
+No
+NO
+nod
+node
+nodes
+noe
+noErr
+nog
+Nogai
+nominal
+NOMINAL
+nominalValue
+nominalWidthX
+non
+Non
+NON
+Nonaka
+NonAlphabetic
+nonbreakingspace
+noncontextual
+Noncontextual
+NoncontextualSubtable
+nonDefault
+nonDefaultUVS
+NonDefaultUVS
+none
+NONE
+nonexistent
+Nong
+nonliteral
+nonmarkingreturn
+nonmonotonic
+nonnull
+nonspacing
+NonStop
+nonzero
+NOON
+NOP
+noporpoise
+nor
+Nor
+NORESERVE
+Norfolk
+normal
+NORMAL
+normalization
+Normalization
+NORMALIZATION
+normalize
+NORMALIZE
+normalized
+normalizer
+normally
+Normally
+North
+NORTH
+Northeastern
+Northern
+Northwest
+Northwestern
+Norway
+Norwegian
+noStretchValue
+not
+Not
+NOT
+notable
+notably
+Notably
+Notation
+notdef
+NOTDEF
+NotDefault
+note
+Note
+NOTE
+noted
+notequal
+notes
+NOTES
+nothing
+Nothing
+notice
+Notice
+noticeably
+notification
+notified
+notifiers
+NOTIMPL
+noting
+notionally
+Noto
+NotoSerif
+nounihan
+nov
+novalidate
+NOVAR
+Novial
+now
+Now
+np
+npi
+nqo
+nr
+nRanges
+nSettings
+nSizes
+nsk
+NSLanguage
+Nsmall
+nso
+nSubrs
+nsuperior
+nSups
+ntilde
+Ntilde
+Ntildesmall
+nTracks
+Nüa
+Nuke
+NUKT
+nukta
+Nukta
+NUKTA
+nul
+NUL
+null
+Null
+NULL
+nullable
+NullHelper
+NullPool
+NullPriority
+nullptr
+num
+Num
+NUM
+numBaseGlyphs
+number
+Number
+NUMBER
+numberOfContours
+numberOfFaces
+numberOfIndexSubtables
+numberOfLongMetrics
+numbers
+Numbers
+NUMBERS
+numbersign
+numberSubstitution
+numBlends
+numColorRecords
+numColors
+numeral
+NUMERAL
+numerals
+Numerals
+numeration
+NUMERATOR
+numeric
+numerical
+Numerical
+numGlyphs
+numLayers
+numNamedParameters
+numOfHMetrics
+numPalettes
+numParameters
+numr
+numRecords
+numScriptCode
+numTables
+numValues
+NUN
+nUnits
+NUSHU
+Nuskhuri
+nv
+ny
+Nyala
+Nyamwezi
+Nyanja
+Nyankole
+nyd
+NYEH
+NYIAKENG
+Nyishi
+nym
+nyn
+Nynorsk
+Nyore
+nza
+o
+O
+oacute
+Oacute
+Oacutesmall
+oasis
+OASIS
+obj
+OBJ
+object
+Object
+OBJECT
+objects
+Objects
+objidx
+OBLIGATION
+oblique
+Oblique
+OBLIQUE
+obliqueing
+obscure
+Obsolete
+obsoleted
+ObsoleteTypes
+obtained
+obvious
+oc
+occasionally
+Occitan
+occupancy
+occupy
+occurrence
+occurrences
+occurring
+occurs
+ocircumflex
+Ocircumflex
+Ocircumflexsmall
+odd
+oddly
+Odia
+odieresis
+Odieresis
+Odieresissmall
+oe
+OE
+OEM
+OEsmall
+of
+Of
+OF
+off
+Off
+OFF
+offer
+offers
+offload
+offs
+OFFS
+offset
+Offset
+OFFSET
+OffsetArrayOf
+offsetArrayZ
+OffsetListOf
+offsetof
+offsets
+Offsets
+OffsetTable
+OffsetTables
+OffsetTo
+offsetToAxisValueOffsets
+offsetToIndex
+offsetToSubtable
+OffsetType
+offsetZ
+offSize
+ofs
+Ofs
+often
+Often
+og
+Ogham
+OGHAM
+ogonek
+Ogoneksmall
+ograve
+Ograve
+Ogravesmall
+Oh
+Oirat
+oj
+ojb
+ojc
+ojg
+Oji
+Ojibwa
+Ojibway
+Ojitlán
+ojs
+ojw
+ok
+Ok
+OK
+oki
+Okiek
+okm
+Ol
+OL
+old
+Old
+OLD
+older
+Older
+OLDER
+om
+Oman
+Omani
+Omega
+omitted
+on
+On
+ON
+once
+Once
+one
+One
+ONE
+OneByteIntFirst
+OneByteIntLast
+onedotenleader
+oneeighth
+onefitted
+onehalf
+oneinferior
+oneoldstyle
+onequarter
+ones
+onesuperior
+onethird
+only
+Only
+ONLY
+onto
+OOP
+op
+Op
+OP
+opaque
+Opaque
+opbd
+OPBD
+opbdFormat
+opcode
+OpCode
+opcodes
+opeator
+open
+Open
+OPEN
+OpenBSD
+opentype
+OpenType
+OPENTYPE
+OpenTypeFontFace
+OpenTypeFontFile
+OpenTypeTable
+operand
+operands
+operate
+operates
+operating
+operation
+operations
+Operations
+operator
+Operator
+OPERATOR
+operators
+Operators
+opportunities
+OPPORTUNITY
+opposite
+ops
+OPS
+opset
+OPSET
+opStart
+opstr
+OPSTR
+opsz
+opszr
+optical
+Optical
+OPTICAL
+OpticalBounds
+OpticalSize
+optimal
+optimally
+optimization
+optimizations
+optimize
+Optimize
+OPTIMIZE
+optimized
+opting
+option
+OPTION
+optional
+Optional
+OPTIONAL
+optionally
+options
+OPTIONS
+opts
+or
+Or
+OR
+oracle
+Orang
+orc
+order
+Order
+ORDER
+ordered
+orderedlist
+ordering
+ordfeminine
+ordinal
+ORDINALS
+ordmasculine
+org
+Organization
+oriented
+orig
+origin
+Origin
+original
+originally
+Originally
+originated
+origins
+origRun
+Oriya
+ORIYA
+Orma
+orn
+ORNAMENT
+ORNAMENTS
+Oromo
+ors
+orthogonal
+orthographic
+Orthographic
+orthographically
+ory
+ORYA
+os
+OS
+OSAGE
+OSAtomic
+OSAtomicAdd
+OSAtomicCompareAndSwap
+OSAtomicCompareAndSwapPtrBarrier
+oslash
+Oslash
+Oslashsmall
+Osmall
+Osmanya
+OSMANYA
+OSMemoryBarrier
+Ossetian
+OSStatus
+osuperior
+ot
+OT
+otf
+otFeatureTag
+OTFontFileVal
+OTHeader
+other
+Other
+OTHER
+OtherBlues
+others
+otherwise
+Otherwise
+OTHERWISE
+otilde
+Otilde
+Otildesmall
+otspec
+Ottawa
+OTTO
+otw
+Ouch
+OUCH
+ought
+our
+Our
+ourself
+ourselves
+out
+Out
+OUT
+outbuffer
+outcome
+outer
+Outer
+outerIndex
+outline
+Outline
+OUTLINE
+OUTLINED
+outlines
+OUTOFMEMORY
+outOfRange
+output
+Output
+OutputArray
+outside
+outward
+over
+OVERBAR
+overflow
+OVERFLOW
+Overflowed
+overflows
+Overflows
+overhead
+overlap
+OVERLAP
+OVERLAPPED
+overlapping
+OVERLAPPING
+OVERLAY
+overloaded
+overloading
+overridden
+override
+Override
+OVERRIDE
+overriden
+overrides
+Overrides
+overriding
+overstrike
+Overstruck
+OVERSTRUCK
+overview
+overwrite
+Owen
+own
+owned
+ownership
+Ozumacín
+p
+P
+pa
+Pa
+PA
+pABC
+Pacaraos
+pack
+package
+packages
+packed
+pad
+padauk
+Padauk
+padded
+padding
+PADMA
+pag
+page
+PAGE
+pages
+pagesize
+PAGESIZE
+Pahari
+PAHAWH
+Pahlavi
+PAHLAVI
+PaintType
+pair
+Pair
+Paired
+pairing
+PairPos
+PairPosFormat
+pairs
+Pairs
+pairSet
+PairSet
+PairValueRecord
+PairValueRecords
+pairwise
+Paite
+Pakistan
+Palantla
+Palauan
+Palaung
+Palestinian
+palette
+Palette
+PALETTE
+paletteFlagsZ
+paletteLabelsZ
+palettes
+Pali
+PALMYRENE
+Palpa
+pam
+Pampanga
+Pampangan
+Panama
+Panao
+Pangasinan
+pango
+Pango
+Panjabi
+panose
+Pao
+pap
+Papiamento
+Papiamentu
+para
+paragraph
+PARAGRAPH
+paragraphs
+Paraguay
+Paraguayan
+parallel
+param
+PARAM
+parameter
+parameters
+Parameters
+PARAMETERS
+params
+PARAMS
+paren
+parenleft
+parenleftinferior
+parenleftsuperior
+parenright
+parenrightinferior
+parenrightsuperior
+parent
+Parent
+parentheses
+PARENTHESIS
+parity
+parse
+parsed
+parser
+PARSER
+parses
+Parses
+parsing
+part
+Part
+PART
+partFlags
+PartFlags
+PARTHIAN
+partial
+Partial
+partialdiff
+PARTIALIZE
+partially
+PARTIALLY
+partically
+participate
+participates
+particular
+PARTICULAR
+particularly
+partRecords
+parts
+Parts
+PARTY
+Pascal
+Pasco
+Pashto
+pass
+Pass
+passed
+PASSED
+passes
+passing
+passthru
+past
+Pastaza
+paste
+PASTE
+patah
+path
+PATH
+Pattani
+pattern
+patterns
+Patterns
+pau
+PAU
+pause
+pauses
+pb
+pbt
+pbu
+Pc
+PC
+pcc
+pcd
+pce
+pcGlyphs
+pCharProps
+pchars
+pcItems
+pck
+pcTable
+pd
+Pd
+pdc
+pdefault
+pdf
+PDF
+pdfs
+pe
+Pe
+PE
+peak
+peakCoord
+peakTuple
+peculiarities
+peculiarity
+pedantic
+Pedi
+peek
+PEH
+PEHEH
+Pekal
+pel
+pend
+Pennsylvania
+people
+People
+per
+Per
+PER
+percent
+Percent
+PERCENT
+percentage
+percentScaleDown
+perfect
+perform
+Perform
+performAction
+PerformAction
+performance
+PERFORMANCE
+performed
+performing
+Performing
+performs
+Performs
+perhaps
+period
+PERIOD
+periodcentered
+periodinferior
+PERIODS
+periodsuperior
+peripheral
+Peripheral
+permanently
+PERMIC
+permissible
+permission
+Permission
+permissions
+permissive
+permitted
+permute
+Permyak
+perpendicular
+Persian
+PERSIAN
+persistent
+person
+perspective
+pertaining
+perthousand
+Peru
+pes
+PETITE
+Pf
+pg
+pga
+pglyph
+pGlyphProps
+pGoffset
+pgwide
+Phags
+PHAGS
+Phaistos
+Phake
+Phalaa
+phantom
+PHANTOM
+phantoms
+phase
+Phase
+phases
+Phases
+phi
+Philippines
+PHINTHU
+phk
+Phoenician
+PHOENICIAN
+PHONE
+Phonetic
+phrase
+PHRASE
+PHRU
+pi
+Pi
+PI
+piAdvance
+Picard
+PiCharacters
+pick
+picks
+pictographic
+Pictographic
+Pictures
+PICTURES
+Pidgin
+pidgins
+piece
+piecemeal
+pieces
+Piemontese
+pih
+pinfo
+pipes
+Pisin
+Pitcairn
+pItems
+pivot
+Pivot
+pivots
+pixel
+Pixel
+pixels
+pixelSize
+pj
+pk
+PK
+pkey
+pkg
+pkgconfig
+pko
+pl
+place
+Place
+placed
+placeholder
+Placeholder
+PLACEHOLDER
+placeholders
+placement
+PLACEMENT
+placements
+plain
+Plains
+plan
+Plan
+PLAN
+plane
+Plane
+planes
+planned
+planner
+planning
+plans
+Plans
+Plateau
+platform
+Platform
+platformID
+platforms
+ple
+please
+plen
+plevel
+pll
+plookups
+plp
+plt
+plus
+PLUS
+plusminus
+pms
+pnb
+png
+PNG
+PNGHeader
+po
+Po
+Pocomchi
+poh
+Pohnpeian
+point
+Point
+POINT
+pointed
+pointer
+Pointer
+pointers
+pointing
+points
+POINTS
+POISON
+Pökoot
+Poland
+Polish
+polyton
+polytonic
+Polytonic
+pon
+pool
+POOL
+pools
+poor
+pop
+popcount
+popcountl
+popcountll
+popped
+pops
+populate
+Populate
+population
+Poqomchi
+port
+Port
+portability
+portal
+Portugal
+Portuguese
+pos
+Pos
+POS
+positinoing
+position
+Position
+POSITION
+Positional
+positioned
+positioning
+Positioning
+positions
+POSITIONS
+positive
+Positive
+POSIX
+PosLookup
+PosLookupSubTable
+possibility
+POSSIBILITY
+possible
+Possible
+possibly
+post
+Post
+POST
+PosTable
+postcompensation
+PostcompensationActionChain
+posted
+postfix
+Postfixed
+POSTFIXED
+postponing
+postprocess
+postscript
+Postscript
+PostScript
+POSTSCRIPT
+postScriptNameIDX
+postV
+potential
+potentially
+potfRecords
+Pournader
+pOutGlyphProps
+pow
+power
+powers
+pp
+ppa
+ppc
+ppem
+PPEM
+ppemX
+ppemY
+PPI
+ppObject
+pPos
+pr
+practical
+practice
+pragma
+PRAGMA
+pragmas
+PRC
+pre
+Pre
+PRE
+precede
+precedence
+preceding
+Preceding
+PRECEDING
+precious
+precision
+precomposed
+Pred
+predef
+predefined
+Predicate
+predicates
+predictable
+pref
+PREF
+prefer
+Prefer
+preferable
+preference
+preferences
+preferred
+Preferred
+prefers
+prefix
+PREFIX
+prefixed
+Prefixed
+PREFIXED
+preloadAll
+prepare
+Prepare
+preparing
+preprocess
+preprocessor
+PREREQ
+pres
+PRES
+presence
+present
+PRESENT
+presentation
+Presentation
+preserve
+PRESERVE
+preserved
+preserving
+presForm
+presidential
+pressure
+PRETTY
+prev
+PREV
+prevent
+PREVENT
+prevented
+preventing
+prevents
+previous
+previously
+Previously
+Pri
+primarily
+primary
+prime
+primitives
+PRIMITIVES
+Principality
+print
+Print
+printed
+printer
+Printer
+printf
+PRINTF
+printing
+prints
+prior
+priorities
+prioritize
+priority
+Priority
+priv
+private
+Private
+PRIVATE
+PrivateDict
+privateDictInfo
+privateDictInfos
+privateDicts
+privateDictsOffset
+privateInfos
+PrivatePointNumbers
+privDictStr
+PRIVDICTVAL
+privInfo
+PRIVOPSET
+privSzr
+pro
+probable
+probably
+Probably
+Probing
+problem
+problems
+Procedure
+proceed
+proceeding
+process
+Process
+processed
+processes
+processing
+procs
+produce
+produced
+Produced
+produces
+product
+Profile
+PROFITS
+program
+programlisting
+programming
+programs
+Programs
+Proj
+project
+projection
+Projection
+promise
+promotion
+propagate
+Propagate
+proper
+properly
+properties
+PROPERTIES
+property
+PROPORTIONAL
+proportionally
+props
+PROPS
+PROT
+protected
+Protection
+prototypes
+provenc
+Provençal
+proves
+provide
+PROVIDE
+provided
+PROVIDED
+provider
+provides
+Provides
+Province
+proxy
+Proxy
+prs
+prune
+ps
+Ps
+PS
+psa
+Psalter
+PSALTER
+psc
+psControl
+pScriptTags
+pse
+pseudo
+Psmall
+psState
+pst
+pstf
+PSTF
+PString
+PSTS
+psva
+pt
+PT
+ptem
+pthread
+PTHREAD
+ptr
+PTR
+ptrdiff
+Pu
+pua
+PUA
+PUACHUE
+public
+Public
+PUBLIC
+publicly
+published
+Puerto
+Pulaar
+Pular
+pull
+Pull
+punctuation
+Punctuation
+PUNCTUATION
+Punjabi
+Puno
+pure
+Pure
+PURE
+purely
+purpose
+PURPOSE
+purposes
+push
+Push
+put
+Put
+puts
+pv
+pval
+pwcChars
+pwcInChars
+pwGlyphs
+pwLogClust
+pwo
+Pwo
+pwOutGlyphs
+px
+py
+Python
+q
+Q
+Qaai
+QAF
+qamats
+QAMATS
+Qatar
+Qiandong
+Qimant
+Qiubei
+QOF
+Qsmall
+qsort
+QSORT
+QType
+qu
+QUAD
+QuadPart
+qualifiers
+quantity
+QUARTER
+qub
+qubuts
+quc
+qud
+Quechua
+queried
+queries
+query
+querying
+QueryInterface
+question
+QUESTION
+questiondown
+questiondownsmall
+questions
+questionsmall
+quf
+qug
+quh
+Quichua
+quick
+quickly
+quicksort
+Quicksort
+Quiotepec
+quite
+quk
+qul
+quot
+quotation
+quotations
+quote
+quotedbl
+quotedblbase
+quotedblleft
+quotedblright
+quoteleft
+quoteright
+QUOTES
+quotesinglbase
+quotesingle
+Quotient
+Quoting
+qup
+qur
+qus
+qut
+quw
+qux
+quy
+quz
+qva
+qvc
+qve
+qvh
+qvi
+qvj
+qvl
+qvm
+qvn
+qvo
+qvp
+qvs
+qvw
+qvz
+qwa
+qwc
+qwh
+qws
+qxa
+qxc
+qxh
+qxl
+qxn
+qxo
+qxp
+qxr
+qxt
+qxu
+qxw
+r
+R
+ra
+Ra
+RA
+race
+races
+radical
+RADICAL
+radicalDegreeBottomRaisePercent
+Radicals
+rafe
+RAFE
+rag
+ragel
+Raise
+RAISE
+raises
+raj
+Rajasthani
+Rakhine
+ran
+rand
+random
+Random
+RANDOM
+randomize
+Randomly
+range
+Range
+RANGE
+rangeCount
+rangeEnd
+rangeGaspBehavior
+rangeMaxPPEM
+rangeMaxValue
+rangeMinValue
+rangeoffset
+rangeOffset
+rangeRecord
+RangeRecord
+ranges
+Ranges
+RANGES
+rangeShift
+RangeShift
+rangeStart
+Ranglong
+rar
+rare
+RARE
+Rarely
+Rarotongan
+rasterizer
+rate
+rather
+ratio
+raw
+rb
+rbb
+rbl
+RC
+rclt
+rcRangeChars
+RCU
+rcurveline
+RD
+RDONLY
+re
+Re
+reach
+reaches
+read
+Read
+READ
+readable
+reader
+ReadFileFragment
+READING
+readingDirection
+readjusting
+readonly
+READONLY
+ready
+real
+Real
+realistic
+reality
+realloc
+reallocate
+Reallocate
+reallocating
+really
+Really
+rearranged
+rearrangement
+Rearrangement
+REARRANGEMENT
+RearrangementSubtable
+reason
+reasons
+reassign
+reassigned
+reassignment
+reassignSIDs
+rebuild
+REBUS
+rec
+recalculated
+recategorize
+receive
+recent
+recently
+Recognition
+recognizable
+recognize
+recognized
+recognizes
+recom
+recommended
+recompose
+recomposed
+recomposing
+recomposition
+reconfiguration
+reconfigured
+reconfiguring
+record
+Record
+RECORD
+RecordArrayOf
+recording
+RecordList
+RecordListOf
+records
+Records
+Recover
+recovery
+recreate
+recurring
+recurse
+recursed
+Recursed
+recursing
+recursion
+recursive
+recursively
+Recursively
+red
+Red
+redefine
+redefined
+redirected
+redone
+Redu
+reduce
+redundant
+reenabling
+ref
+refcount
+refer
+reference
+Reference
+REFERENCE
+referenced
+referenceGlyph
+references
+referred
+referring
+refers
+REFIID
+refine
+refinements
+reflect
+reflecting
+reflects
+Reformed
+refs
+REGARD
+regardless
+Regex
+region
+Region
+regionCount
+regionIndices
+regions
+register
+Register
+REGISTER
+registered
+RegisterFontFileLoader
+registers
+registry
+Registry
+regular
+Regular
+REGULAR
+REH
+reinterpret
+rej
+Rejang
+REJANG
+reject
+Reject
+rejection
+rel
+REL
+related
+relation
+relationship
+relative
+relax
+relaxed
+RELAXED
+release
+Release
+RELEASE
+released
+releasedc
+ReleaseDC
+ReleaseFileFragment
+ReleaseFontTable
+releases
+relevant
+relicensed
+relies
+relocating
+rely
+Rely
+relying
+remain
+remainder
+remained
+remaining
+remains
+remap
+remapping
+remaps
+Remarks
+remember
+Remember
+remembered
+Removable
+removal
+remove
+Remove
+REMOVE
+removed
+RemoveFontMemResourceEx
+removing
+rename
+render
+rendered
+renderer
+rendering
+renders
+renum
+renumber
+Renumber
+renumbering
+renumbers
+reorder
+Reorder
+reordered
+REORDERED
+reordering
+Reordering
+reorders
+Reorders
+Repack
+repeat
+REPEAT
+repeated
+repeatedAddGlyphAction
+RepeatedAddGlyphAction
+repeating
+REPEATING
+reph
+Reph
+REPH
+repha
+Repha
+REPHA
+replace
+Replace
+replaced
+REPLACEME
+replacement
+REPLACEMENT
+replaces
+Replaces
+replacing
+replicate
+report
+Report
+reports
+Reports
+repositioned
+repositioning
+repository
+represent
+representation
+representations
+represented
+representing
+represents
+Represents
+reproduces
+Republic
+reqFeatureIndex
+request
+requested
+requests
+require
+Require
+required
+REQUIRED
+requirement
+requirements
+requires
+Requires
+requiring
+res
+resCountM
+research
+reserved
+Reserved
+RESERVED
+reservedESC
+ReservedESC
+reservedPad
+reset
+Reset
+Resets
+RESH
+reshaping
+reside
+resize
+resizing
+resolution
+resolutions
+resolve
+Resolved
+resolvedLevel
+resolver
+resolves
+resort
+Resort
+resource
+Resource
+ResourceForkHeader
+ResourceMap
+ResourceRecord
+resources
+resourcesZ
+ResourceTypeRecord
+respect
+respective
+respectively
+responsibilities
+responsibility
+responsible
+resreved
+rest
+RESTORE
+restrict
+restructuring
+result
+resulted
+resulting
+RESULTING
+results
+resume
+ret
+Ret
+RET
+retain
+Retain
+retained
+retains
+RETAINS
+retired
+retrieve
+retrieved
+retrieves
+Retrieves
+retry
+return
+Return
+RETURN
+returned
+Returned
+returning
+returns
+Returns
+reuse
+reused
+reusing
+reverse
+REVERSE
+reverseChainContextSingle
+ReverseChainSingle
+ReverseChainSingleSubst
+ReverseChainSingleSubstFormat
+reversed
+Reverses
+reversing
+revert
+revised
+rewind
+Rewind
+rewinding
+Rewinding
+Rewrite
+rfHeader
+RHA
+RHEL
+rhs
+Rhs
+ri
+ria
+Riang
+Rica
+Rico
+ridentity
+Rieger
+rif
+right
+Right
+RIGHT
+rightC
+rightClass
+rightClassCount
+rightClassTable
+rightSide
+RightToLeft
+Rinconada
+ring
+Ringsmall
+Ripuarian
+rise
+RISE
+RISH
+risking
+rit
+Ritarungo
+rki
+RKRF
+rkw
+rl
+rlig
+rligLookup
+rligMarksLookup
+rlinecurve
+rlineto
+rm
+RM
+rmc
+rmf
+rml
+rmn
+rmo
+rmoveto
+rmw
+rmy
+rmz
+rn
+rnl
+RNOON
+ro
+Ro
+RO
+road
+Robatic
+Roberts
+rock
+Rod
+Roderick
+Rohingya
+ROHINGYA
+role
+roll
+rom
+Roman
+ROMAN
+Romani
+Romania
+Romanian
+ROMANIZATION
+Romansh
+Romany
+room
+root
+rooted
+Roozbeh
+ros
+ROS
+rotate
+rotated
+Rotuman
+round
+ROUND
+ROUNDED
+roundf
+ROUNDF
+rounding
+rounds
+routine
+routines
+roux
+Roux
+row
+rowCount
+rowIndexTable
+rows
+rowWidth
+royalty
+RP
+rpc
+rphf
+RPHF
+rpRangeProperties
+RRA
+rrcurveto
+RREH
+RS
+rsb
+rsbMap
+Rsmall
+rsuperior
+Rsv
+rt
+rtl
+RTL
+rtlm
+rtm
+ru
+Ruanda
+RUBY
+Ruching
+rue
+rule
+Rule
+RULE
+rules
+Rules
+ruleSet
+RuleSet
+rulesets
+ruleSets
+Rumai
+run
+Run
+RUN
+Rundi
+runHead
+Runic
+RUNIC
+running
+runs
+runtime
+Runtime
+rup
+rupiah
+Russia
+Russian
+Rusyn
+rvalue
+rvalues
+Rvalues
+rw
+Rwanda
+rwr
+Ryan
+s
+S
+sa
+Saamia
+Sabah
+Sabaot
+Sad
+SAD
+Sadri
+safe
+safely
+safest
+sah
+Saharan
+said
+Saidi
+Saint
+Sakalava
+sake
+Sakha
+sakot
+SAKOT
+sal
+Salasaca
+salt
+Salvador
+sam
+Samaritan
+SAMARITAN
+Sambalpuri
+same
+Same
+SAME
+SAMEKH
+Sami
+Samoan
+Samogitian
+sample
+SAMPLE
+sampleTextNameId
+sampleTextNameID
+San
+Sanaani
+sandboxed
+sane
+Sango
+sanitization
+sanitizations
+sanitize
+Sanitize
+SANITIZE
+sanitized
+sanitizer
+sanitizing
+Sanitizing
+sanity
+Sankaran
+Sans
+Sanskrit
+Santa
+Santali
+Santiago
+santization
+SAR
+sara
+SARA
+Saraiki
+Sardinian
+Sarsi
+sas
+Sasak
+Sascha
+Sassarese
+sat
+Saterfriesisch
+Saterland
+Saudi
+Saurashtra
+SAURASHTRA
+save
+Save
+SAVE
+saved
+savedprops
+Saves
+saw
+Saxon
+say
+Sayisi
+says
+sb
+SBase
+SBASE
+SBitLineMetrics
+sbix
+SBIX
+SBIXGlyph
+SBIXStrike
+sbl
+SBL
+SBLHebrewUserManual
+sc
+Sc
+SC
+Scalable
+scalar
+Scalar
+scalars
+scale
+SCALE
+scaled
+SCALED
+scalef
+scaler
+scaling
+scan
+Scan
+sCapHeight
+scaron
+Scaron
+Scaronsmall
+scedilla
+Scedilla
+scenario
+scenarios
+SCHAR
+sched
+SCHED
+scheme
+Schouten
+science
+SCIENTIFIC
+sck
+scn
+sco
+sconsumed
+scope
+score
+Scots
+Scottish
+scount
+SCount
+SCOUNT
+scratch
+SCRATCH
+screen
+script
+Script
+SCRIPT
+scriptAnalysis
+scriptCode
+ScriptExtensions
+ScriptFreeCache
+ScriptItemize
+ScriptItemizeOpenType
+scriptList
+ScriptList
+ScriptPlace
+ScriptPlaceOpenType
+scriptProperties
+scripts
+Scripts
+SCRIPTS
+ScriptShape
+ScriptShapeOpenType
+ScriptTag
+scripttags
+scs
+scursor
+sd
+SD
+sDageshForms
+sdc
+sdh
+SDL
+sdn
+se
+seac
+search
+Search
+SEARCH
+searched
+searching
+searchRange
+Sebat
+sec
+second
+Second
+secondGlyph
+seconds
+sect
+section
+SECTION
+sections
+security
+sed
+see
+See
+seeing
+seek
+seem
+seems
+Seems
+seen
+SEEN
+seenCrossStream
+seequence
+sees
+seg
+segcount
+segCount
+segCountX
+segment
+Segment
+SEGMENT
+segmented
+segmenting
+SegmentMaps
+segments
+segol
+seh
+Seigo
+sek
+Sekani
+Sekota
+sel
+select
+Select
+selected
+selecting
+selection
+selections
+selectively
+SelectObject
+selector
+Selector
+SELECTOR
+selectors
+Selectors
+SELECTORs
+selectorToDisable
+selectorToEnable
+selects
+Seletar
+self
+Selkup
+semantic
+semantical
+SEMANTICS
+Sembilan
+semi
+SEMI
+Semibold
+semicolon
+SEMICOLON
+Sena
+send
+sending
+Senegal
+sense
+sensible
+sensitive
+SENSITIVE
+sensitivity
+sent
+sentence
+Senthang
+sentinel
+SENTINEL
+separate
+separated
+separately
+separation
+Separator
+SEPARATOR
+seq
+sequence
+Sequence
+sequenceIndex
+sequences
+SEQUENCES
+sequential
+sequentially
+Serbia
+Serbian
+Serer
+serial
+serialization
+serialize
+Serialize
+SERIALIZE
+serialized
+serializer
+SERIALIZER
+Serializes
+series
+Serif
+serve
+servers
+serves
+Sesotho
+set
+Set
+SET
+SetBidiLevel
+SetComponent
+SetCurrentRun
+SetLineBreakpoints
+setlocale
+SETLOCALE
+SetMark
+SetNumberSubstitution
+sets
+Sets
+SETS
+SetScriptAnalysis
+Setswana
+setter
+setters
+setting
+Setting
+SettingName
+settings
+settingTableZ
+setup
+Setup
+seven
+SEVEN
+seveneighths
+seveninferior
+sevenoldstyle
+sevensuperior
+SEVENTEEN
+several
+severely
+Severn
+sez
+sFamilyClass
+sfinae
+SFINAE
+sfm
+SFNSDisplay
+SFNSText
+sfnt
+Sfnt
+SFNT
+sfntVersion
+sg
+sga
+sgc
+sgi
+sgs
+sgw
+sh
+sha
+shadda
+Shadda
+SHADDA
+shaddaLigature
+shaddaLigatureSet
+shaddaLigaturesSubLookup
+Shadow
+SHADOW
+shall
+SHALL
+shallow
+Shan
+shape
+Shape
+SHAPE
+shaped
+shaper
+Shaper
+SHAPER
+shaperprefs
+shapers
+Shapers
+SHAPERS
+shapes
+Shapes
+SHAPES
+shaping
+Shaping
+SHAPING
+Sharada
+SHARADA
+share
+SHARE
+shared
+Shared
+SHARED
+SharedPointNumbers
+sharedTupleCount
+sharedTuples
+Shavian
+SHAVIAN
+SHEEN
+Sheeter
+Shekhawati
+shell
+SHELL
+sheva
+shi
+shift
+Shift
+SHIFT
+shifted
+Shifter
+SHIFTER
+shifting
+Shifting
+Shihhi
+shin
+SHIN
+ship
+shipped
+shn
+Shona
+short
+Short
+SHORT
+shortCount
+shortcut
+shortcuts
+shortest
+shortfall
+Shorthand
+SHORTHAND
+shortint
+shoudln
+should
+Should
+shouldn
+Shouldn
+show
+SHOW
+showing
+shows
+shrink
+Shrinkage
+shrinkageDisableGPOS
+shrinkageDisableGSUB
+shrinkageEnableGPOS
+shrinkageEnableGSUB
+shrinkageJstfMax
+shrinkFlags
+SHRT
+shu
+Shua
+shuffle
+Shurishkar
+shut
+Shut
+Shwe
+si
+Sibe
+SIBLING
+Sichuan
+Sicilian
+sid
+SID
+Sidamo
+Siddham
+SIDDHAM
+side
+sidebearing
+sides
+sidmap
+sids
+SIDs
+Sierra
+sign
+Sign
+signature
+signed
+Signed
+SIGNED
+signedness
+significance
+significant
+significantly
+signifying
+signs
+SIGNWRITING
+Sihuas
+Siksika
+sil
+SIL
+silently
+Silesian
+silf
+Silf
+SILF
+Silt
+Silte
+Simalungun
+similar
+Similar
+similarly
+Similarly
+SIMP
+simple
+Simple
+SIMPLE
+SimpleGlyph
+simpler
+simplest
+simplicity
+simplification
+simplified
+Simplified
+SIMPLIFIED
+simplifies
+Simplifies
+simplify
+simply
+SIMULATIONS
+sin
+SIN
+since
+Since
+Sindhi
+Singapore
+single
+Single
+SINGLE
+SinglePos
+SinglePosFormat
+SingleSubst
+SingleSubstFormat
+singleton
+singletons
+singular
+SINH
+sinhala
+Sinhala
+SINHALA
+Sinhalese
+sink
+Sink
+sinks
+Sinte
+SIOT
+Sit
+site
+sites
+situations
+six
+SIX
+sixinferior
+sixoldstyle
+sixsuperior
+sixteen
+SIXTEEN
+Siyin
+size
+Size
+SIZE
+sized
+SIZED
+sizeDeviceRecord
+sizeof
+sizes
+sizeTable
+sizeTables
+sizing
+sjd
+sjo
+sk
+Sk
+SKEWED
+skg
+skip
+Skip
+SKIP
+skippable
+skipped
+skipping
+Skipping
+skippy
+Skolt
+skr
+sl
+SL
+slant
+Slant
+SLANT
+slanted
+slash
+SLASH
+SLASHED
+Slave
+Slavey
+Slavonic
+slen
+slightly
+slim
+slnt
+slope
+slot
+slots
+Slovak
+Slovakia
+Slovenia
+Slovenian
+slower
+sm
+Sm
+SM
+sma
+SMAbv
+small
+Small
+SMALL
+smaller
+smallest
+Smallest
+SmallGlyphMetrics
+smart
+SMART
+SMBlw
+smj
+smn
+smoking
+sms
+SMVD
+sn
+snap
+snapshot
+sniff
+snk
+snprintf
+so
+So
+Sochiapam
+Sodo
+SOFT
+software
+Software
+SOFTWARE
+Soga
+Sogdian
+SOGDIAN
+Solaris
+SOLARIS
+solely
+solution
+Somali
+some
+Some
+Somebody
+somefunc
+somehow
+Somehow
+someone
+something
+sometime
+sometimes
+somewhat
+SOMPENG
+Songe
+Soninke
+soon
+sop
+SORA
+Sorbian
+sort
+Sort
+SORT
+sorted
+Sorted
+SORTED
+SortedArrayOf
+sortedness
+SortedUnsizedArrayOf
+sorting
+SORTING
+Sotho
+SOUND
+sounds
+source
+Source
+SOURCE
+sourceware
+South
+SOUTH
+Southeast
+Southeastern
+Southern
+Southwestern
+Soyombo
+SOYOMBO
+spac
+space
+Space
+SPACE
+spaced
+spaces
+Spaces
+spacing
+Spacing
+SPACING
+Spain
+Spanish
+spans
+speaking
+spec
+Spec
+special
+Special
+SPECIAL
+Specialization
+specializations
+Specializations
+Specialize
+specially
+Specials
+specific
+specifically
+SPECIFICALLY
+specification
+specifications
+specificed
+specifics
+specified
+specifies
+specify
+specifying
+specs
+speculative
+speed
+Speed
+speeds
+split
+Split
+SplitCurrentRun
+splitPoint
+splitPosition
+Spoon
+SPOT
+Spread
+spreadsheets
+Spring
+spv
+spy
+sq
+sqrt
+Square
+SQUARE
+SQUARED
+squeezing
+sr
+src
+Sri
+sro
+srr
+srs
+ss
+ssh
+Ssmall
+SSOT
+ssuperior
+ssxx
+ssXX
+st
+stable
+stack
+Stack
+STACK
+Stacker
+STACKER
+stacking
+stackoverflow
+stage
+stages
+STAGES
+stale
+standalone
+standard
+Standard
+StandardEncoding
+standardheaderfiles
+standards
+stands
+start
+Start
+START
+startCharCode
+startcode
+startCode
+startConnectorLength
+startCoord
+startCount
+started
+Started
+starter
+Starter
+startGlyph
+startGlyphID
+startGlyphIndex
+starting
+Starting
+StartOfText
+starts
+startSize
+startUnicodeValue
+stat
+STAT
+StatAxisRecord
+state
+State
+STATE
+stateArrayTable
+stateHeader
+statement
+states
+States
+STATES
+StateTable
+StateTableDriver
+stateTableOffset
+static
+Static
+STATIC
+status
+stay
+stays
+stch
+STCH
+std
+STD
+stdarg
+stddef
+stderr
+stdGlyph
+StdHW
+stdint
+stdio
+stdlib
+STDMETHODCALLTYPE
+STDMETHODIMP
+StdVW
+stem
+StemSnapH
+StemSnapV
+step
+STEP
+stepping
+steps
+sterling
+stHeader
+still
+Still
+stmt
+STMT
+stop
+Stop
+STOP
+stopped
+stops
+storage
+Storage
+store
+Store
+STORE
+stored
+Stored
+storing
+stq
+str
+STR
+straight
+Straight
+straightforward
+strategic
+strategy
+Strategy
+strbuf
+strchr
+strcmp
+strcpy
+strdup
+stream
+streams
+strerror
+stretch
+Stretch
+STRETCH
+stretchable
+stretched
+stretchGlyphAction
+StretchGlyphAction
+stretching
+Stribley
+Strict
+STRICT
+strictly
+stride
+strike
+strikeout
+STRIKEOUT
+strikes
+string
+String
+STRING
+stringIndex
+StringIndex
+stringIndexInfo
+stringOffset
+strings
+strlen
+strncmp
+strncpy
+stroke
+Strokes
+StrokeWidth
+strong
+strongly
+strstr
+strtod
+STRTOD
+strtol
+strtoul
+struct
+StructAfter
+StructAtOffset
+StructAtOffsetOrNull
+StructAtOffsetUnaligned
+structs
+STRUCTS
+structure
+Structure
+structures
+Studio
+stuff
+stupid
+stv
+style
+Style
+STYLE
+stylistic
+Stylistic
+STYLISTIC
+stylisticSet
+sTypoAscender
+sTypoDescender
+sTypoLineGap
+su
+sub
+SUB
+subarray
+subclass
+Subclass
+subclasses
+subdivided
+subdivision
+subfamily
+SUBFAMILY
+subfamilyID
+subfamilyNameID
+subFeatureFlags
+subfonts
+SubFormat
+subject
+subjoined
+Subjoined
+SUBJOINED
+subjoining
+sublookup
+SUBLOOKUP
+SubLookupOffsets
+SubLookupOffsetsArray
+submerged
+subpixel
+subr
+subrecord
+subroffset
+subroutine
+Subroutine
+subroutines
+subrs
+Subrs
+SUBRS
+subrsOffset
+subs
+subscript
+Subscript
+SUBSCRIPT
+subscripts
+Subscripts
+subsequence
+subsequences
+subsequent
+subset
+Subset
+SUBSET
+SubsetGlyph
+Subsets
+subsetted
+subsetter
+SUBSETTER
+subsetting
+subst
+SUBST
+substantially
+substGlyph
+substitued
+substitute
+Substitute
+SUBSTITUTE
+substituted
+SUBSTITUTED
+substitutes
+substituteX
+substitution
+Substitution
+SUBSTITUTION
+substitutions
+substitutionTables
+SubstLookup
+SubstLookupSubTable
+substr
+substring
+substThreshold
+subsystem
+subtable
+subTable
+Subtable
+SubTable
+subtableCount
+SubTableFlags
+subtableGlyphCoverageArray
+SubTableHeader
+subtables
+Subtables
+SubTables
+SUBTABLES
+SubtableType
+subtag
+SUBTAG
+subtags
+subtending
+subtract
+subtracting
+subtraction
+succeed
+succeeded
+SUCCEEDED
+Succeeding
+SUCCEEDING
+succeeds
+success
+successful
+successfully
+successive
+such
+SUCH
+sucks
+Sudanese
+sudo
+sufficient
+SUFFICIENT
+suggest
+suggested
+Suggested
+suggests
+suit
+suitable
+suite
+Suite
+suk
+Sukuma
+sukun
+SUKUN
+sum
+Sum
+summation
+Summer
+sun
+Sundanese
+SUNDANESE
+SUNPRO
+SUPER
+superimposing
+SUPERIORS
+superscript
+SUPERSCRIPT
+superscripts
+Superscripts
+supp
+suppData
+suppEncData
+SuppEncData
+SuppEncoding
+supplement
+Supplement
+Supplemental
+supplied
+supply
+supplying
+support
+Support
+SUPPORT
+supported
+Supported
+SUPPORTED
+supporting
+supports
+Supports
+supposed
+supposedly
+suppress
+supps
+suq
+sure
+Suri
+surprise
+surprises
+surrogate
+SURROGATE
+Surrogates
+surrounding
+survive
+survived
+survives
+sutable
+Sutu
+sv
+sva
+Svan
+svg
+SVG
+svgDoc
+svgDocEntries
+svgDocLength
+SVGDocumentIndexEntry
+SVR
+sw
+Swadaya
+Swahili
+Swampy
+swap
+Swap
+SWAP
+swaplp
+swapped
+swaps
+SWASH
+SWASHES
+Swati
+swb
+swc
+Sweden
+Swedish
+Sweep
+swh
+switch
+Switch
+switched
+switches
+Switzerland
+swv
+sxHeight
+sxu
+syc
+syl
+Sylheti
+Syllabary
+syllabic
+Syllabic
+SYLLABIC
+Syllabics
+SYLLABICS
+syllable
+Syllable
+SYLLABLE
+syllables
+Syllables
+Syloti
+SYLOTI
+SYM
+symbol
+Symbol
+SYMBOL
+symbolic
+symbols
+Symbols
+SYMBOLS
+symmetric
+sync
+synchronize
+syntatically
+syntax
+Syntax
+synthesize
+synthesizes
+synthesizing
+SyntheticBase
+syr
+Syrc
+syre
+Syre
+Syria
+syriac
+Syriac
+SYRIAC
+syrj
+Syrj
+syrn
+Syrn
+sys
+SYS
+sysconf
+SYSCONF
+system
+System
+SYSTEM
+systems
+sz
+szl
+t
+T
+ta
+Ta
+taa
+tab
+Tabasaran
+Tabassaran
+table
+Table
+TABLE
+tableCount
+tablelist
+TableRecord
+TableRecords
+tables
+Tables
+TABLES
+tableTag
+TableType
+Tachelhit
+Tachoni
+tag
+Tag
+TAG
+Tagalog
+TAGALOG
+Tagbanwa
+TAGBANWA
+tagFeature
+tagged
+Tagin
+Tagish
+tagLangSys
+tagRanges
+tags
+Tags
+TAGS
+tagScript
+TAH
+Tahaggart
+Tahitian
+Tahltan
+tahoma
+Tahoma
+tahomabd
+Tai
+TAI
+tail
+Tail
+tailored
+Taiwan
+Taiwanese
+Tajik
+Tajiki
+Tajikistan
+take
+Take
+taken
+takes
+taking
+Takri
+TAKRI
+TALL
+Tamahaq
+Tamajaq
+Tamajeq
+Tamashek
+Tamasheq
+Tamazight
+Tamil
+TAMIL
+TAML
+Tanacross
+Tanaina
+Tanana
+TANDEM
+Tandroy
+Tangshewi
+TANGUT
+Tanosy
+Tanzania
+taq
+tarball
+Tarball
+target
+TARGET
+TargetConditionals
+targs
+Tarifit
+tasks
+Tatar
+tator
+tau
+TAV
+Tawallammat
+Tawr
+Tày
+Tayart
+Taylor
+TB
+TBase
+TBASE
+tbl
+tbody
+TBR
+tcb
+tce
+TCHEH
+TCHEHEH
+TCodepoint
+TCount
+TCOUNT
+tcp
+tcy
+tcz
+tdd
+tdx
+te
+tec
+technetwork
+Technical
+technicalities
+Technically
+Tedim
+TEH
+TEHEH
+telecom
+tell
+tells
+TELU
+Telugu
+TELUGU
+tem
+Temne
+temp
+templ
+template
+Template
+templates
+temporarily
+temporary
+tempting
+Temuan
+TEN
+Tena
+Tenggarong
+Tepetotutla
+Tepinapa
+Terik
+term
+terminal
+Terminal
+terminate
+terminated
+terminates
+terminating
+termination
+Termination
+TerminationWordCount
+terminator
+terminology
+Terminology
+terms
+Tesaka
+test
+Test
+TEST
+tested
+testing
+Testing
+tests
+Tests
+tet
+TET
+Tetum
+text
+Text
+TEXT
+TextAnalysis
+textAnalyzer
+textLength
+textPosition
+textProperties
+TEXTRANGE
+textString
+textual
+tfn
+tg
+tgj
+tgroup
+tgx
+th
+TH
+tha
+Thaana
+THAANA
+Thado
+thai
+Thai
+THAI
+Thailand
+THAL
+Tham
+THAM
+than
+THAN
+THANTHAKHAT
+that
+That
+the
+The
+THE
+thead
+THEH
+their
+them
+themed
+themselves
+then
+Then
+theory
+thep
+there
+There
+therefore
+Therefore
+these
+These
+they
+They
+thickness
+THICKNESS
+THIN
+thing
+things
+Things
+thingy
+think
+third
+Third
+THIRD
+THIRTEEN
+this
+This
+THIS
+thiz
+THO
+thorn
+Thorn
+Thornsmall
+those
+though
+thread
+Thread
+threading
+threads
+threadsafe
+threadsafely
+three
+Three
+THREE
+threeeighths
+threeinferior
+threeoldstyle
+threequarters
+threequartersemdash
+threesuperior
+through
+throughout
+throw
+tht
+thus
+thv
+thz
+ti
+Tibetan
+TIBETAN
+Tidy
+tiff
+Tifinagh
+TIFINAGH
+tig
+tight
+Tigon
+Tigre
+Tigrinya
+tilde
+Tildesmall
+tile
+tiles
+Tiles
+time
+timeouts
+times
+Times
+timesbi
+timesi
+Timne
+tindex
+Tiny
+TINY
+Tirhuta
+TIRHUTA
+Tiriki
+title
+TITLECASE
+TITLING
+tiv
+Tiv
+tjmo
+TJMO
+tk
+tkg
+tl
+TL
+Tlacoatzintepec
+tlen
+tlist
+TLookup
+TLookupList
+TLR
+TM
+tmh
+tmp
+tmw
+tn
+tnf
+to
+To
+TO
+Toba
+Tobago
+TObject
+toCoord
+tod
+today
+Todo
+TODO
+toe
+together
+ToGlyphs
+toi
+tok
+Tok
+tol
+Tolowa
+TOLOWER
+Toma
+tombstone
+tombstones
+tone
+Tone
+TONE
+tones
+Tonga
+Tongan
+too
+took
+toolkit
+tools
+tooltip
+top
+Top
+TOP
+topAccentAttachment
+topAccentCoverage
+topdict
+topDict
+TopDict
+topDictIndex
+TopDictIndex
+topDictInfo
+topDictModSIDs
+topDictSize
+topDictStr
+toplevel
+topographical
+Topographical
+topologically
+topSide
+topSzr
+Torki
+TORTIOUS
+TORTOISE
+Tosk
+total
+Total
+totalDataSize
+totally
+touch
+TOUCH
+touches
+TOUPPER
+towards
+tpi
+tr
+TR
+trace
+Trace
+TRACE
+tracing
+track
+Track
+trackData
+TrackData
+tracking
+Tracking
+trackNameID
+tracks
+trackTable
+trackTableEntry
+TrackTableEntry
+TRAD
+trade
+trademark
+TRADEMARK
+trademarks
+Traditional
+TRADITIONAL
+trailed
+trailing
+trak
+TRAK
+trampoline
+trans
+TRANSCODING
+transcription
+transfer
+Transfer
+transform
+Transform
+transformation
+transformed
+transforming
+transient
+Transient
+transition
+transitioning
+transitive
+translatation
+translate
+translating
+translation
+TRANSLITERATION
+transparent
+traversal
+treat
+treated
+treatment
+treats
+tree
+trees
+TRI
+trick
+trickiest
+tricky
+Tricky
+tried
+tries
+Tries
+trigger
+triggered
+triggers
+trim
+trimmable
+trimmed
+Trimming
+Trinidad
+trivial
+Trivial
+trivially
+trouble
+troubleshooting
+tru
+true
+TRUE
+TrueTag
+TrueType
+TRUETYPE
+TrueTypeTag
+truly
+truncate
+truncated
+try
+Try
+TryGetFontTable
+trying
+Trying
+ts
+Ts
+TSA
+TSADI
+tsb
+tsere
+Tsetsaut
+Tshangla
+Tsimihety
+tsj
+Tsmall
+Tsonga
+Tsotso
+TSubTable
+tsuperior
+Tswana
+tt
+TTA
+ttb
+TTB
+ttc
+TTC
+ttcf
+ttcHeader
+TTCHeader
+TTCHeaderVersion
+ttcTag
+TTCTag
+TTEH
+TTEHEH
+ttf
+ttm
+ttq
+Tugen
+Tulu
+tum
+Tumari
+Tumbuka
+Tundra
+Tunisia
+Tunisian
+tuple
+Tuple
+tupleCount
+tupleIndex
+TupleIndexMask
+tuples
+tupleVarCount
+TupleVarCount
+TupleVarHeader
+tupleVarHeaders
+Tupple
+TuppleIndex
+Turkey
+Turkic
+TURKIC
+Turkish
+Turkmen
+Turkmenistan
+turn
+Turn
+Turner
+turning
+turns
+Turns
+Turoyo
+Tusi
+Tutchone
+Tututni
+tuu
+Tuvalu
+Tuvin
+Tuvinian
+tuy
+tvalue
+tvl
+tw
+tweaks
+TWELVE
+TWENTY
+Twi
+twice
+twilight
+two
+Two
+TWO
+TwoByteNegInt
+TwoBytePosInt
+twodotenleader
+twoinferior
+twooldstyle
+twosuperior
+twothirds
+tx
+txc
+txt
+txy
+ty
+tying
+Typ
+type
+Type
+TYPE
+typed
+typedef
+typedefs
+typeface
+typefaces
+typeList
+typename
+TypeName
+types
+Types
+TYPES
+typesetter
+typesetting
+typical
+typically
+typo
+TYPO
+typographic
+Typographic
+TYPOGRAPHIC
+typographical
+typography
+Typography
+typos
+tyv
+tyz
+tze
+tzm
+tzo
+Tzotzil
+u
+U
+uacute
+Uacute
+Uacutesmall
+UARRAY
+ub
+uBidiLevel
+ubl
+Ubuntu
+ubyte
+ubytes
+ucd
+UCD
+ucdn
+UCDN
+uchar
+UChar
+UCHAR
+ucircumflex
+Ucircumflex
+Ucircumflexsmall
+ucs
+udieresis
+Udieresis
+Udieresissmall
+udm
+Udmurt
+ue
+UE
+UEE
+UErrorCode
+ufuncs
+ufunctions
+UFWORD
+ug
+Ugaritic
+UGARITIC
+UGC
+Ugh
+ugly
+Ugly
+UGLY
+ugrave
+Ugrave
+Ugravesmall
+UHEADLESSARRAY
+UI
+UIDBase
+Uighur
+uiLabelNameId
+uiNameID
+uint
+UINT
+uintptr
+UIPC
+UISC
+uk
+Ukraine
+Ukrainian
+ULBAR
+ulCodePageRange
+ulink
+ULL
+ULLONG
+ULong
+ULONG
+Ulrich
+ultimately
+ULTRA
+ulUnicodeOS
+ulUnicodeRange
+umb
+Umbundu
+Umm
+un
+unassigned
+UNASSIGNED
+unbounded
+UNBOUNDED
+unchanged
+UNCLASSIFIED
+UnclassifiedGlyph
+unclear
+unconditionalAddGlyphAction
+UnconditionalAddGlyphAction
+unconditionally
+UNCONNECTED
+unconst
+und
+undef
+UNDEF
+undefined
+UNDEFINED
+under
+Under
+UNDERBAR
+underflow
+undergone
+underline
+Underline
+UNDERLINE
+underlinePosition
+UnderlinePosition
+underlineThickness
+UnderlineThickness
+underlining
+underlying
+underneath
+underscore
+UNDERSCORE
+understand
+understandable
+understood
+undertake
+Undetermined
+undo
+undocumented
+Undocumented
+unequal
+UNFITTED
+unforced
+unformed
+unfortunate
+unfortunately
+Unfortunately
+unhide
+uni
+unichar
+UniChar
+unicode
+Unicode
+UNICODE
+UnicodeData
+unicodes
+UNICODES
+unicodeValue
+UnicodeValueRange
+Unified
+uniform
+uninitialized
+union
+UNION
+Unión
+unions
+unique
+UNIQUE
+UniqueID
+uniscribe
+Uniscribe
+UNISCRIBE
+unistd
+UNISTD
+unit
+United
+units
+Units
+unitSize
+unitsPerEm
+uniUUUU
+Universal
+unix
+unknown
+Unknown
+UNKNOWN
+unless
+Unless
+unlike
+unlikely
+unlimited
+UnlimiteGap
+unloaded
+unlock
+Unmake
+unmap
+UnmapViewOfFile
+unmarked
+unnecessary
+unnormalize
+unoffset
+unorm
+UNormalizer
+unpack
+unpadded
+unpop
+unprocessed
+unr
+unrecognized
+unref
+unreferenced
+UnregisterFontFileLoader
+unsafe
+Unsafe
+UNSAFE
+UNSCALED
+unset
+unsigned
+Unsized
+UnsizedArrayOf
+UnsizedByteStr
+UnsizedOffsetArrayOf
+UnsizedOffsetListOf
+unsorted
+UNSUCCESSFUL
+unsupported
+UNSUPPORTED
+unsure
+UNTAG
+until
+untouched
+unused
+Unused
+UNUSED
+unusual
+unwanted
+unwise
+unzip
+uoffset
+up
+UP
+update
+updated
+UPDATES
+upem
+UPEM
+upon
+upper
+Upper
+UPPER
+uppercase
+UPPERCASE
+upperLimit
+upright
+UPROPS
+upward
+ur
+Urak
+Urdu
+urk
+url
+URL
+Uruguay
+us
+USABLE
+usage
+usBreakChar
+uscript
+USCRIPT
+UScriptCode
+usDefaultChar
+use
+Use
+USE
+used
+Used
+useful
+Useful
+useless
+UseMarkFilteringSet
+user
+User
+USER
+userfeatures
+users
+uses
+Uses
+usFirstCharIndex
+USHRT
+Usila
+using
+Using
+USING
+usLastCharIndex
+usLowerOpticalPointSize
+Usmall
+usMaxContext
+usp
+USP
+ustr
+ustring
+usually
+Usually
+usUpperOpticalPointSize
+usWeightClass
+usWidthClass
+usWinAscent
+usWinDescent
+utf
+UTF
+Uthmanic
+util
+utilities
+Utilities
+utility
+utilize
+UTS
+uu
+UU
+UUID
+UuidCreate
+uuidof
+UVCRDOypOtijlMDLNNyyLk
+uversion
+uvs
+UVS
+UVSMapping
+Uyghur
+uz
+Uzbek
+Uzbeki
+Uzbekistan
+uzn
+uzs
+v
+V
+va
+VA
+VAbv
+VAH
+Vai
+VAI
+Vakhi
+val
+Val
+VAL
+ValCount
+valFormat
+valid
+Valid
+VALID
+validate
+validated
+Validator
+validity
+Valle
+valuable
+value
+Value
+VALUE
+valueArrayZ
+valueCount
+valueFormat
+ValueFormat
+valueFormats
+valueIndex
+valueNameID
+ValueRecord
+valueRecordCount
+ValueRecords
+valueRecordSize
+values
+Values
+VALUES
+ValuesAreLong
+valueSize
+valuesZ
+valueTag
+ValueType
+var
+Var
+VAR
+vararg
+varation
+VarData
+varDataSize
+variable
+Variable
+variablelist
+variables
+variant
+Variant
+VARIANT
+variantGlyph
+variants
+Variants
+variation
+Variation
+VARIATION
+variationAxis
+VariationAxisRecord
+VariationDevice
+variations
+Variations
+VARIATIONS
+VariationSelectorRecord
+variationsTag
+VariationStore
+VariationValueRecord
+varidx
+varIdx
+varies
+variety
+varika
+variour
+various
+Various
+varlistentry
+varname
+varRecords
+VarRegionAxis
+VarRegionList
+vars
+varSelector
+VarSizedBinSearchArrayOf
+VarSizedBinSearchHeader
+varStore
+varStoreOffset
+vary
+vattu
+vatu
+Vatu
+VATU
+VAV
+vAxis
+VBAR
+VBase
+VBASE
+VBlw
+VCount
+VCOUNT
+vcpkg
+VD
+ve
+VE
+vec
+vector
+Vector
+VECTOR
+vectorization
+vectorized
+vedic
+Vedic
+VEH
+ven
+Venda
+VENDOR
+Venetian
+Venezuela
+VER
+Verb
+verbatim
+verify
+versa
+version
+Version
+VERSION
+versions
+versionZ
+vert
+VERT
+vertAdvance
+vertBearingX
+vertBearingY
+vertData
+vertGlyphCount
+vertGlyphCoverage
+vertical
+Vertical
+VERTICAL
+vertically
+VertOriginMetric
+vertOriginY
+vertYOrigins
+very
+vfprintf
+vhcurveto
+vhea
+vi
+VI
+via
+vice
+Viet
+VIET
+Vietnam
+Vietnamese
+view
+vindex
+vINVALID
+violation
+virama
+Virama
+VIRAMA
+viramas
+virtual
+Virtualizing
+vis
+Visarga
+VISARGA
+VISATTR
+visibility
+VISIBILITY
+visible
+visibly
+visit
+visited
+visitLangSys
+visitScript
+vista
+Vista
+visual
+Visual
+VISUAL
+vjmo
+VJMO
+vkk
+vkt
+Vlaams
+Vlax
+vlineto
+vls
+VM
+VMAbv
+VMBlw
+vmoveto
+VMPre
+VMPst
+vmtx
+vmw
+vo
+Vo
+VOICED
+VOICING
+void
+Void
+VOID
+VOL
+Volapük
+volatile
+volt
+vorg
+VORG
+vorgMap
+Võro
+vowel
+Vowel
+VOWEL
+vowels
+Vowels
+vp
+VPre
+VPst
+VRBAR
+vrinda
+vro
+Vs
+VS
+vsindex
+vsindexcs
+vsindexdict
+Vsmall
+vsnprintf
+vstem
+vstemhm
+vstore
+vstoreOffset
+vtable
+vv
+vvar
+VVAR
+VVARTag
+vvcurveto
+w
+W
+wa
+Wa
+Wagdi
+Wailaki
+walk
+Walk
+walks
+Wall
+Walloon
+Wanca
+WANCHO
+Wang
+Wanga
+want
+wanted
+wants
+war
+WARANG
+Waray
+warn
+warning
+Warning
+WARNING
+warnings
+Warnings
+WARRANTIES
+was
+Was
+WASLA
+wasn
+waste
+Watch
+watchout
+Watchout
+WAVY
+WAW
+way
+ways
+Wayuu
+wbm
+wbr
+Wbuiltin
+Wc
+Wcast
+WCE
+wchar
+WCHAR
+Wclass
+Wconversion
+wdcTable
+Wdelete
+Wdeprecated
+Wdisabled
+Wdouble
+wdRecord
+wdth
+we
+We
+WE
+weak
+weight
+Weight
+WEIGHT
+weights
+weird
+welcome
+well
+Welsh
+Wembedded
+went
+were
+Werner
+West
+Western
+Weverything
+Wextra
+Wformat
+wght
+what
+What
+WHAT
+whatever
+Whatever
+whatsoever
+WHATSOEVER
+when
+When
+whenever
+Whenever
+where
+whereas
+Whereas
+WheresData
+WheresFace
+wherever
+whether
+Whether
+WHETHER
+which
+Which
+while
+While
+white
+WHITE
+Whitelist
+whitespace
+Whitespace
+who
+whole
+whose
+why
+Why
+wide
+widely
+width
+Width
+WIDTH
+WidthDeltaCluster
+WidthDeltaPair
+widthMax
+widths
+widthsZ
+Wignored
+wiki
+wikipedia
+wild
+will
+Will
+willing
+willis
+wilson
+Wilson
+Wimplicit
+win
+Win
+WIN
+WINAPI
+windows
+Windows
+Winit
+Winjected
+WINNT
+Winter
+Wipe
+wish
+wishes
+with
+With
+WITH
+within
+Within
+without
+Without
+WJ
+wlc
+wle
+wlk
+Wlogical
+Wmaybe
+Wmissing
+Wnested
+wni
+wo
+Wolane
+Wold
+Wolof
+won
+Woods
+word
+Word
+WORD
+wording
+wordOffsetToIndex
+words
+WORDS
+work
+Work
+worked
+working
+Working
+works
+Works
+world
+worry
+worrying
+worth
+would
+Would
+WOULD
+wouldbn
+wouldn
+Wow
+Wpacked
+Wpointer
+Wpragmas
+wrap
+wrapper
+wrappers
+wrapping
+Wredundant
+Wreorder
+writable
+Writable
+WRITABLE
+write
+Write
+WRITE
+writer
+writing
+written
+Written
+wrong
+wrote
+wry
+Ws
+wsg
+Wshadow
+Wsign
+Wsmall
+Wstrict
+Wstring
+Wswitch
+Wtautological
+wtm
+Wtype
+Wu
+Wundef
+Wunknown
+Wunneeded
+Wunsafe
+Wunused
+wuu
+Wvla
+ww
+Wwrite
+WWS
+www
+x
+X
+xa
+xA
+xaa
+xAA
+xAAF
+xAB
+xabc
+xABC
+xABFFu
+xAC
+xAdvance
+xAdvDevice
+xAFF
+xal
+XALLOCATE
+Xamtanga
+xan
+xAu
+xAvgCharWidth
+xb
+xB
+xBA
+xBB
+xBFF
+xBytes
+xc
+xC
+xCD
+xCFF
+Xconstructor
+xCoordinate
+xCULL
+xD
+xDBFFu
+xDC
+xDE
+xDeviceTable
+xDFDFDFDF
+xDFDFDFDFu
+xDFF
+xDFFF
+xDFFFu
+xDFu
+xe
+xE
+xEFF
+xEFu
+xF
+xFAFF
+xFB
+xFBA
+xFBAAu
+xFBABu
+xFBACu
+xFBADu
+xFBAEu
+xFBAFu
+xFBB
+xFBD
+xFBDAu
+xFBDBu
+xFBDCu
+xFBDDu
+xFBDEu
+xFBDFu
+xFBE
+xFBFCu
+xFBFDu
+xFBFEu
+xFBFFu
+xFDFF
+xfe
+xFE
+xFEA
+xFEAAu
+xFEABu
+xFEACu
+xFEADu
+xFEAEu
+xFEAFu
+xFEB
+xFEBAu
+xFEBBu
+xFEBCu
+xFEBDu
+xFEBEu
+xFEBFu
+xFEC
+xFECAu
+xFECBu
+xFECCu
+xFECDu
+xFECEu
+xFECFu
+xFED
+xFEDAu
+xFEDBu
+xFEDCu
+xFEDDu
+xFEDEu
+xFEDFu
+xFEE
+xFEEAu
+xFEEBu
+xFEECu
+xFEEDu
+xFEEEu
+xFEEFu
+xFEF
+xFEFAu
+xFEFBu
+xFEFCu
+xFEFF
+xFEFFu
+xff
+xFF
+xFFEF
+xFFF
+xFFFC
+xFFFD
+xFFFDu
+xFFFE
+xFFFF
+xFFFFD
+xFFFFF
+xFFFFFF
+xFFFFFFFF
+xFFFFFFFFFFFFFull
+xFFFFFFFFu
+xFFFFu
+xFFu
+xFu
+Xgroup
+xh
+Xhb
+Xhosa
+xi
+Xian
+Xiang
+Xiangxi
+Xibe
+XInclude
+xjb
+xkf
+xlocale
+XLOCALE
+xMax
+xMin
+xml
+XML
+xmlns
+xmm
+xmv
+xmw
+xnr
+xOffset
+xog
+xor
+XP
+xpe
+xPlacement
+xPlaDevice
+xscale
+xsl
+Xsmall
+xst
+Xuan
+XUID
+xwo
+xx
+XXX
+XY
+y
+Y
+Ya
+yacute
+Yacute
+Yacutesmall
+yAdvance
+yAdvDevice
+Yakut
+Yanahuanca
+Yang
+Yangbye
+yao
+Yao
+yap
+Yapese
+Yarowilca
+Yauyos
+Yay
+yb
+ybd
+yBytes
+yCoordinate
+ydd
+yDeviceTable
+ydieresis
+Ydieresis
+Ydieresissmall
+YEH
+Yemen
+yen
+yes
+Yes
+YES
+yet
+Ygroup
+yi
+Yi
+YI
+Yiddish
+YIDDISH
+yield
+YIELD
+yields
+yih
+Yijing
+YING
+yMax
+yMin
+yml
+yo
+YO
+YOD
+yOffset
+Yongbei
+Yongnan
+Yoruba
+yos
+Yos
+Yosemite
+you
+You
+Youjiang
+your
+yourinputtext
+yourself
+yPlacement
+yPlaDevice
+yrk
+yscale
+Ysmall
+yStrikeoutPosition
+yStrikeoutSize
+ySubscriptXOffset
+ySubscriptXSize
+ySubscriptYOffset
+ySubscriptYSize
+ySuperscriptXOffset
+ySuperscriptXSize
+ySuperscriptYOffset
+ySuperscriptYSize
+YU
+yue
+Yue
+Yugoslav
+yum
+Yupik
+z
+Z
+za
+ZAH
+ZAIN
+Zambia
+Zamboanga
+Zanabazar
+ZANABAZAR
+Zande
+Zarma
+zawgyi
+Zawgyi
+ZAWGYI
+ZAYIN
+Zazaki
+zcaron
+Zcaron
+Zcaronsmall
+zch
+zdj
+zea
+Zealand
+Zealandic
+Zeeuws
+zeh
+zero
+Zero
+ZERO
+zeroed
+zeroinferior
+zeroing
+zeroint
+zerooldstyle
+zeros
+zerosuperior
+zgb
+zgh
+zgm
+zgn
+zh
+zhd
+zhe
+zhn
+Zhong
+Zhuang
+Zimbabwe
+zip
+zipped
+zk
+Zl
+zlj
+zlm
+zln
+zlq
+zmi
+zne
+zo
+zom
+zone
+Zotung
+Zou
+Zp
+zqe
+Zs
+zsm
+Zsmall
+zu
+Zulu
+zum
+Zuojiang
+zwj
+ZWJ
+zwnj
+ZWNJ
+zyb
+zyg
+zyj
+zyn
+Zyrian
+zza
+zzj
diff --git a/perf/texts/fa-monologue.txt b/perf/texts/fa-monologue.txt
new file mode 100644 (file)
index 0000000..c41257c
--- /dev/null
@@ -0,0 +1 @@
+من اسمم کاظمه. ما توی یه کوچه بن بست خونه داریم. کوچه‌مون خاکیه. اونوقت خیلی پایئن تر از خونه ما - زیاد پایین نه - اینور می‌پیچی یه نونواس. از اونجا صاف می‌ریم اینجا. یه خیابونه اینجا. اونوقت خیلی پایین‌ترش یه حمومه. بعداً یه بقالی هم دم خونمونه. یه خرده انور خرابه، یه قصابیه. قصابه با بابام رفیقه. پشت خونمون یه دباغیه. اینقده بچه گوسفند توشه! خونه‌مون ساس داره. ساس کوچیک و سیاس. هر جا بزنه جاش باد می‌کنه. وقتی داره از دیوار اتاق می‌ره بالا، نمی‌تونه خودشو نگه داره، می‌افته رو تن ما، می‌گیره خونمونو می‌مکه. یه دفعه همه اثاث مثاثامونو ریختیم بیرون، یه عالمه دوا خریدیم زدیم همه جا: به رختخوابا،‌ زیر زیلو، سوراخ سنبه‌ها. ولی ساسها بیشتر شدن، کمتر نشدن. بابام توی حموم کار می‌کنه. دوتا برادر داریم، یه خواهر: من و مصطفی و زهرا کوچولو. بابا وقتی داره شب می‌شه برمی‌گرده خونه. همیشه استخوناش درد می‌کنه. سر هیچی به هیچی می‌گیره می‌زنه‌مون، بازهم طلبکاره. مثلاً وسط سال، صبح ساعت شیش می‌آد می‌گه، «پاشو برو سیگار بفروش، پول دربیار لباس بخر!» من هم می‌گم: «لباس می‌خوام چی‌ کار؟» اون هم می‌گیره با کمربند حالمونو جا می‌آره. باز خوبه سه ماه تعطیلی خودمون می‌ریم کار می‌کنیم. یه کارخونه هست. می‌ریم اونجا قابلمه درست می‌کنیم، کاسه درست می‌کنیم، عصر که شونصد تا کاسه درست کردیم، دستگارو تمیز می‌کنیم برمی‌گردیم خونه. پارسال هفته‌ای پنجاه تومن مزد می‌دادن. امسال دیگه خدا می‌دونه. با همه این حرفا، بمیریم بهتره آقا! هر روز هر روز کتک.  بابام دیشب بیخودی مصطفی رو گرفت زد. گرفت زدش گفت: «چرا وقتی می‌ری دست به آب، سر پا می‌شاشی؟ بشی بشاش!» مصطفی‌مون هیچی حالیش نمی‌شه. قد زهرامون بوده که از بالا پشت بوم افتاده، رگ کله‌اش تکون خرده. حالا سیزده سالشه. نه چارده،‌ چارده سالشه. داداش بزرگ‌ مونه. الان مدرسه عقب افتاده‌ها درس می‌خونه. آب، بابا، بار میخونه یاد بگیره، بیاد جلو. دو سه کلمه بلده حرف بزنه ولی چیزه... نمیتونه قشنگ حرف بزنه. بابام می‌خواد از مدرسه ورش داره، بذاره یه جا که کار یاد بگیره. بابا زهرا را از همه بیشتر می‌خواد. اون هم هر کاری دلش بخواد می‌کنه. هرچی می‌گیم گوش نمی‌کنه، می‌ره تو جوب محل کثافت‌کاری می‌کنه. اون روزی حواسم نبود، رفت یه مشت دیگ مونده سر کوچه بود ورداشت خورد. شب دلش درد گرفت نزدیک بود بمیره. اونوقت بابام اومد گرفت منو با شیلنگ کشت. آقا مگه شهر هرته؟ خر کتک می‌خوره. دیگه چرا ما رو می‌زنن؟ برن به خر بزنن! آخه من که نمی‌تونم همه‌ش مواظب زهرا باشم. راستی یه صاحب حیاط داریم، خیلی بد اخلاقه آقا! اسمش عباس آقاس. صبح می‌ره ظهر می‌آد. سپور شهرداریه. بیست و چار ساعت می‌آد بند میکنه به ما، میگه: «آب زیاد مصرف نکنین، چاه پر میشه.» زهرامون که گاهی گریه می‌کنه، دادش بلند می‌شه می‌گه: «صدای این تخم‌سگو خفه کنین!» اونوقت که مادرمون زنده بود، یه دفعه می‌خواست از دست عباس آقا نفت بریزه سرش، خودشو آتیش بزنه. عباس آقا اصلاً رحم حالیش نمی‌شه؛ پسر سیزده ساله‌شو گرفته از خونه انداخته بیرون. اون هم رفته توی کوچه‌ پس ‌کوچه‌‌ها ول شده. حالا خدا می‌دونه کجاس، چه کار می‌کنه،‌ از کجا می‌آره می‌خوره. بچه‌ها می‌گن: «شب‌ها می‌ره توی پارک‌ها پیش سگها می‌خوابه.» که رفته دهات خونهٔ باباش، می‌گه دیگه نمی‌آم تهران. آقا، ما هم دلمون می‌خواد میرفتیم دهمون با گوسفندها بازی می‌کردیم؛ با بابا بزرگ‌مون می‌رفتیم دشت بز می‌چروندیم،‌ بادوم پاک می‌کردیم، انگور می‌چیدیم. دهمون ولی خیلی دوره آخه! زن عباس آقا حق داره، آقا! محله‌مون خیلی بده. هر روز اونجا دعواس، دعوا، چاقو کشی. توی خرابه هم پر معتاده، بگی دوهزار تا هم بیشتر. می‌رن اونجا قمار می‌کنن، شیره می‌کشن، آمپول می‌زنن تو رگشون. ماهم از ترس معتادها جرأت نمی‌کنیم از خونه بریم کوچه، یه ذره بازی کنیم. از کمیته‌م نمی‌ترسن، میگیرن بچه‌های مردمو می‌دزدن، میبرن توی کوره‌ها،‌ توی دلاشون چیز قایم می‌کنن؛ هروئین قایم میکنن. یه امیر ریزه هست تریاکیه، اون روزی اومد خرم کنه، گفت: «بیا سوار ماشین بشیم، بریم یه جائی.» من هم از ترسم خر نشدم. یه چیز خنده دار بگم بخندی، آقا: اینورمون یه همسایه داریم، اسمش ربابه. انوقت توپ،‌ لنگه کفش، تنکه، هرچی بیفته خونشون،‌ شوهرش ور می‌داره می‌اندازه توی آب انبارشون. هروقت هم کوچه شلوغ بشه، شوهر رباب می‌آد بیرون می‌گه: «واق، عو!» اون هم مث مصطفی‌ ما لقوه‌ایه‌؛ دستش می‌لزره، همه جاش می‌لرزه. اون روز اومد دم دکون، رفت اونور جوب نشت. این یکی همسایه‌مون رفت یه کتاب دربارهٔ خدا و فرشته‌ها آورد براش خوند. رباب خانم خودش خونه یه اعیونه کار می‌کنه؛ چیزاشونو می‌شوره، باغ‌شونو آب می‌ده؛ کلفتی می‌کنه. بعد همه‌ش می‌آد پز اربابشو می‌ده. الان دیگه همه اهل محل می‌دونن باغ خونهٔ ارباب رباب خانوم اندازه پارک شهره. استخرش از مال پارک شهر هم گنده‌تره. هروقت هم که ارباب می‌خواد‌ آبتنی کنه،‌ اول یه قطره دوای مخصوص هست، می‌ریزه توی استخر که آب‌شو می‌کنه مث اشک چشم. بعد می‌ره زیر دوش، با عطر و گلاب خودشو می‌شوره. بعد می‌پره توی استخر، می‌گیره شوخی شوخی آب می‌پاشه به رباب خانوم. زن اربابش هم خارجیه. مال همون کشوریه که شیش ماه شبه، شیش ماه روز. رباب یه چاخان‌هایی می‌کنه که کلهٔ آدم سوت می‌کشه! می‌گه ارباب یه سگ پشمالو داره،‌ اسمش مونیکاس. قسم می‌خوره می‌گه مونیکا غذاشو با کارد و چنگال می‌خوره. اللَه اکبر به این دروغ. یه پیرزنه هم هست سر کوچمونه. با خودش تنهایی زندگی می‌کنه. اسمش ننه غلامه. هشتاد نود سالشه ولی خجالت نمی‌کشه،‌ از امریکا خوشش می‌آد. همه ازش می‌ترسن؛ هر وفت بیاد بیرون، فحش می‌ده، جیغ و ویغ می‌زنه. مثلا من اذیتش کردم، می‌آد سر فحش‌رو می‌کشه به تو. وقتی بچه‌ها بخوان لج‌شو در‌بیارن، می‌گن: «مرگ بر امریکا!» اونوقت اون هم حرصش می‌گیره، هزار تا فحش بی‌ناموسی و خوار و مادر می‌کشه به جون همه. ننه غلام دیونه‌س. بعضی وقتا هم با‌ آدم خوبه. یه روز من و زهرا رو گرفت به زور برد خونه‌ش، کله پاچه داد، گفت «بخورین!» ما هم خوردیم. ته کاسه یه لقمه موند که روش یه عالمه مو بود. گفت: «اگه نخورین با همین چاقو سرتونو می‌برم.» ما هم از ترس جونمون خوردیم. ننه غلام وقتی سر حاله، چیز می‌آره می‌ده آدم. مثلا یکی زخمه،‌ دوا می‌آره بهش می‌ده. مثلا کسی چیزی نداره، چیز می‌آره بهش می‌ده، وسط کوچه‌مون یه خونه‌س که دخترهاش خرابن، آقا. اونوقت شیره‌ای‌ها و چاقوکش‌ها می‌رن خونه‌شون، کار بد می‌کنن. بعضی وقتا هم دختر‌هاش لباس سرخ و زرد تن می‌کنن و کفش پاشنه بلند تق‌تقی می‌پوشن، می‌رن واسه بالاشهری‌ها قر می‌دن. یه دفعه هم داشتم می‌رفتم پیش بچه‌ها «لیس پس لیس» بازی کنم که دختر کوچیکه‌ش امیر ریزه رو صدا کرد و بهش گفت: «تو چقدر پاهات لاغره!» بعد امیر ریزه هم نامردی نکرد. گفت:«خودت چرا لمبه‌هات چاقه؟» بعد دوتایی کرکر خندیدن. خودم با همین دو تا چشمام دیدم، آقا! اونوقت ما هم که می‌بینیم محله‌مون پر از بی‌تربیتی‌یه، زدیم با هفت‌تا از بچه محلامون قهر کردیم. با اون هفت‌تا هم بمیرم آشتی نمی‌کنم، آقا. با یکی‌شون یه ساله قهریم، اسمش محمده. یه روز سر کوچه‌مون عروسی بود، ما هم داشتیم بازی می‌کردیم. من دراومدم به محمد گفتم: «محمد امشب چه خبره؟ آبجی‌ت می‌ره حجله؟» ناراحت شد، گفت: «باهات قهرم.» من هم گفتم: «چه بهتر! می‌رم درسامو می‌خونم.» به خدا ما چه می‌دونستیم، به خیالمون عروسی آبجیشه، آقا! فقط با دو نفر دوستیم: مهدی ملخ و حسن گامبو. مهدی از بس مردنیه، همه ملخ صداش می‌کنن. باباش قوری بست می‌زنه. وسط بازی یهو پیداش می‌شه، می‌آد می‌گه: «اگه منو بازی ندین، بازی‌تونو بهم می‌زنم.» اونوقت تا که دس بهش می‌خوره، جیغش می‌ره هوا، میگه: «گه خوردم، گه خوردم.» اونوقت می‌ره از حرصش با میخ یه شکل‌هایی می‌کشه روی دیوار، می‌گه: «این عکس کاظمه.» فسقلی فوتش کنی، قل می‌خوره، ها. آقا، ما دوچرخه خیلی دوست داریم، بعضی وقتا می‌ریم یه تومن می‌دیم چرخ کرایه می‌کنیم. حسن گامبو زورش می‌آد، با سنگ می‌زنه، می‌گه: «منو باید سوار کنی.» من هم می‌بینم داره دلش می‌شکنه، می‌گم: «بیا تو هم سوار شو!» داداش حسن گامبو پنج ماهه رفته لب مرز با خارجیا بجنگه. حسن می‌گه: «رفته امریکا رو نابود کنه، برگرده.» بابای حسن آهنکاره؛ یعنی قالب می‌سازه، پشقاب می‌سازه، همه‌چی می‌سازه. نه که حسن خیکیه، بچه‌ها صداش می‌کنن: «حسن گامبو، سرت تو شامپو!» می‌خواییم با این دو نفر هم قهر کنیم بره. هی می‌آن در خونمون داد می‌زنن: «کاظم، بیا بازی، بیا بازی!» بازی چیه، آقا؟ بده بچه بازی کنه. رفوزه بشیم چه کار؟ دلم می‌خواد دکتر، مهندس، بازنشست، نیرو هوایی، هرچی شد بشیم، بریم پی کارمون بره. ولی تو خونه ما نمی‌شه درس خوند. تا می‌آم بشینم، باید پاشم برم نون بخرم، جارو کنم، خشتک زهرامونو بشورم. پارسال که رفوزه شدم، همه‌ش نیم نمره می‌خواستم قبول بشم. مدرسه‌مونم خیلی هردمبیه، آقا! بچه‌هاش دزدن، می‌آن دفترامونو می‌دزدن. سر کلاس یکی گچ پرت می‌کنه، یکی رو نیمکت ضرب می‌گیره، یکی پا می‌شه می‌رقصه. ما هم که می‌بینیم خر تو خره، حوصله‌مون سر می‌ره، از مدرسه جیم می‌شیم، می‌ریم فروشگاه بزرگ. اونجا پله‌برقی داره. می‌ریم می‌ایستیم خودمونو می‌زینم به اون راه. الکی نگاه می‌کنیم به جنس منس‌ها؛ یعنی مثلا ما هم اومدیم چیز بخریم. بعد می‌ریم سوار پله‌برقی می‌شیم، می‌ریم سواری می‌خوریم، عشق می‌کنیم. آقا، اجازه؟ سه تا دایی هم دارم، آقا! یکی‌شون دایی ضامن، یکی‌شونم دایی مرتضی. اونی که وضعش خوبه اسمش دایی رضوانه. یه وانت داره با یه اتوشویی. تا پامونو می‌ذاریم در دکونش، نامرد یه لگد می‌زنه در اونجامون، می‌گه: «بزن به چاک! باز اومدی از دخل کف ببری» به خدا تهمت می‌زنه، آقا! آقا، به خدا هیچکی به اندازه ما از دزدی بدش نمی‌آد. آقا، دایی مرتضی‌مون اولها کارگر بلورسازی بود، ولی وقتی من هنوز تو دل مادرم بودم، افتاد زندان. یه شب هفت نفر ریختن سرش، اون هم چاقو کشید، زد یکی‌شونو کشت. بعد دادگاه هم اومد بیخودی تقصیر رو گذاشت گردن دایی ما. قبل انقلاب از زندان اومد بیرون، رفت معتاد شد. حالا هم همیشه با زنش دعوا مرافعه داره. گاهی می‌ذاره از خونه‌ش می‌ره، می‌ره می‌ره پیداش نمی‌شه. بعد که برمی‌گرده، الکی به زنش می‌گه، رفته بودم بیمارستان ترک کنم. دایی مرتضی یه بچه کوچولو داره، هروقت می‌آد خونمون، می‌خواد از پله‌هامون بره بالا، بیاد پایین. ما هم می‌ریم دنبالش که نیفته سرش بشکنه. می‌ریم بغلش می‌کنیم. اونوقت می‌ترسه، سفت آدمو می‌گیره. دایی ضامن‌مون توی دولت آباد نفتیه، بعضی روزها که می‌ره نفت پخش کنه منو هم با خودش می‌بره. اون تا می‌ره نفت بده به خونه‌ها، بچه‌ها می‌گیرن مسخره‌م می‌کنن، می‌گن: «ای عرب پا نفتی، کی اومدی، کی رفتی؟» سنگ می‌زنن تو کله‌ام. من هم که زورم نمی‌رسه، گریه‌م می‌گیره. یه روز رفتیم در یه خونه نفت بدیم، اونوقت یه پسره بود - لال بود - دنبالمون کرد تا سر کوچه‌شون. فحش مادر داد، گفت: «دیگه در خونه ما نیا!» لال بود، آقا! نمی‌دونیم چی می‌گفت... آقا، هر وقت از مادرمون حرف می‌زنیم، بغض می‌آد گلومونو می‌گیره، ول‌مون نمی‌کنه... مادرمون سر بچه مرد، آقا! شب درد بچه گرفتش. رفتیم نبات خانومو آوردیم. نبات خانوم مامای محله‌س، شله، یه چشمش هم چپه. صبح که بچه اومد دنیا، مادرمون گذاشت از دنیا رفت. بچه‌ هم پشت سرش مرد، آقا!... مادرمون اون وقت که زنده بود، توی کارخونهٔ استارلایت کار می‌کرد. جوراب شلواری می‌بافت. وقتی شکمش اومد بالا، از اونجا بیرونش کردن. مادرمون اینقده سختی کشیده که خدا بگه، بس! همیشه مریض بود، بعضی وقتا هم غش می‌کرد. پاهاش قد یه متکا باد کرده بود، آقا!... آقا، باور کن، آقا... وقتی مادرمون مرد ما صد برابر الان بغض کردیم. من و زهرا و مصطفی شب تا صبح خوابمون نبرد. بابام اون شب هزار تا سیگار کشید،‌ ولی صبحش مادرمون مرد. وقتی رفتیم خاکش کنیم، ننه غلام نمی‌خواست بذاره ما بریم تماشا، می‌گفت، ما بچه‌ایم، گناه داریم. ولی من دزدکی توی مرده‌شور خونه هم رفتم. بوی بدی می‌ده مرده‌شور خونه، بوی گربهٔ مرده. آدم می‌خواد دل و روده‌شو بالا بیاره. وقتی مادرمونو اوردن گذاشتن توی سالن مرده‌شور خونه، هفت تا مرده زودتر مرده بودن. مادرمون نفر هشتم بود. مرده‌ها منتظر بودن دوش خالی بشه، سر نوبت برن تو، غسل کنن. جنازه یه دختر مدرسه هم بود. نمی‌دونی فک و فامیل دختره چی‌کار می‌کردن؛ یکی سرشو می‌زد به دیوار، یکی کفش‌شو دراورده بود می‌زد تو سر خودش. مادرمونو که اوردن بذارن توی قبر، سروکله‌ٔ مصطفی هم پیداش شد. مادرمون با مصطفی خوب بود. خدا بیامرز که رفت توی قبر، نمی‌دونم از کجا یه مگس اومد نشست روی کفنش. تا مصطفی کیش‌اش کرد، مگسه گذاشت در رفت. بعد شروع کردن با بیل خاک ریختن روی سر مادرمون. رباب خانم با ناخن صورتشو می‌کند. بابام داشت توی دل خودش گریه می‌کرد. اگه مصطفی نمی‌زد زیر گریه و توی خاک و خل غلت نمی‌خورد، من هم گریه نمی‌کردم... مادرمونو که خاک کردیم، دم قبرستان حلوای نذری پخش می‌کردن. واسه اینکه بوی گربهٔ مرده از دماغم بره، یه قاشق حلوا گذاشتم دهنم. ولی صاحب عذا که روشو برگردوند، تفش کردم. آقا، هیچی نمی‌تونستیم بخوریم. آقا، ما دلمون خیلی تنگه، هیشکی نیست ما را زفت کنه. دل‌مون می‌خواد از این دنیا می‌رفتیم. آقا، باورتون نمی‌شه، توی محله ما ملت تند تند می‌میرن، آقا! زهرامون یه همبازی داره، همقد خودشه. اسمش الهامه، پنج سالشه. ده بیست روز پیش باباش از داربست افتاد زمین عکس برگردون شد، مرد. دیروز الهام اومده بود خونه‌مون، یه عکس از باباش هم اورده بود، می‌گفت، هر شب خواب باباشو می‌بینه که اون دنیا آتیش درست کرده، می‌خواد بیاد  بگیره اونو کباب کنه بخوره. یه حرفهایی می‌زد که مو به تن آدم سیخ می‌شد. اونوقت شب که خوابم برد، خوابیدم، خواب دیدم عزرائیل و شمر با آتیش اومدن بالای سرم، هی می‌چرخن و چه‌چه می‌خندن. عزرائیل نصفه‌س، آقا! یعنی پا نداره. من هم اومدم از دست‌شون در برم که دیدم یه خرگوشه داره با مامانش قایم موشک بازی می‌کنه. رفتم بگم، من هم بازی که گذاشتن در رفتن. من هم دنبالشون کردم. خسته که شدم دیدم سوار یه قایقم، یه سگ هم داشتم. داشتم با سگ بازی می‌کردم که یهو امیر ریزه پشت پا انداخت، افتادم توی آب. من هم رفتم سوار دوچرخه شدم، زدم به چاک. سگ هم از توی قایق پرید، اومد دنبالم. بعدش دیدم یه هلی‌کوپتر بالای سرمه، می‌خواد باید بستنی لیوانی‌مو قاپ بزنه. من هم با سنگ زدم شیشه‌شو شکوندم. اون هم ترسید در رفت، توی کوچه دباغ‌ها غیب شد. بعدش دیدم عباس آقا گرگ شده، می‌خواد بیاد زهرامونو بگیره لقمه‌ٔ چپش کنه. از ترسم دویدم توی پارک و رفتم سوار تاب شدم. اینقده تاب بازی کردم تا حسابی سرم گیج رفت. اومدم از تاب بپرم پایین، دیدیم زیر پام یه چاهه، یه چاه به این گندگی. داشتم ول می‌شدم ته چاه که از خواب پریدم. نشستم گریه کردم. اونوقت بابام بیدار شد، پرسید: «باز چی شده؟ شاشیدی؟» گفتم: «می‌ترسم.» گفت: «بگیر بخواب بابا تو هم دلت خوشه!» من هم لحافو که کشیدم روی سرم، همه‌ش خدا خدا می‌کردم ایم دفعه که خوابم برد، شانسم بگه، بزنه خواب خوشبختی ببینم، دلم خوش بشه. ولی اگه ما شانس داشتیم، آقا، اسم‌مونو می‌ذاشتن شانسعلی.
diff --git a/perf/texts/fa-thelittleprince.txt b/perf/texts/fa-thelittleprince.txt
new file mode 100644 (file)
index 0000000..3c56869
--- /dev/null
@@ -0,0 +1,923 @@
+شازده کوچولو
+اثر آنتوان دو سن‌تگزوپه‌ری
+برگردان احمد شاملو
+
+
+اهدانام‌چه
+به لئون ورث Leon Werth
+از بچه‌ها عذر می‌خواهم که این کتاب را به یکی از بزرگ‌ترها هدیه کرده‌ام. برای این کار یک دلیل حسابی دارم: این «بزرگ‌تر» به‌ترین دوست من تو همه دنیا است. یک دلیل دیگرم هم آن که این «بزرگ‌تر» همه چیز را می‌تواند بفهمد حتا کتاب‌هایی را که برای بچه‌ها نوشته باشند. عذر سومم این است که این «بزرگ‌تر» تو فرانسه زندگی می‌کند و آن‌جا گشنگی و تشنگی می‌کشد و سخت محتاج دلجویی است. اگر همه‌ی این عذرها کافی نباشد اجازه می‌خواهم این کتاب را تقدیم آن بچه‌ای کنم که این آدم‌بزرگ یک روزی بوده. آخر هر آدم بزرگی هم روزی روزگاری بچه‌ای بوده (گیرم کم‌تر کسی از آن‌ها این را به یاد می‌آورد). پس من هم اهدانام‌چه‌ام را به این شکل تصحیح می‌کنم:
+
+به لئون ورث
+موقعی که پسربچه بود
+آنتوان دو سن‌تگزوپه‌ری
+
+من هم برگردان فارسی این شعر بزرگ را به دو بچه‌ی دوست‌داشتنی دیگر تقدیم می‌کنم: دکتر جهانگیر کازرونی و دکتر محمدجواد گلبن
+
+احمد شاملو
+
+یک بار شش سالم که بود تو کتابی به اسم قصه‌های واقعی -که درباره‌ی جنگل بِکر نوشته شده بود- تصویر محشری دیدم از یک مار بوآ که داشت حیوانی را می‌بلعید. آن تصویر یک چنین چیزی بود:
+
+یک مار بوآ که دارد حیوانی را می‌بلعد
+تو کتاب آمده بود که: «مارهای بوآ شکارشان را همین جور درسته قورت می‌دهند. بی این که بجوندش. بعد دیگر نمی‌توانند از جا بجنبند و تمام شش ماهی را که هضمش طول می‌کشد می‌گیرند می‌خوابند».
+
+این را که خواندم، راجع به چیزهایی که تو جنگل اتفاق می‌افتد کلی فکر کردم و دست آخر توانستم با یک مداد رنگی اولین نقاشیم را از کار درآرم. یعنی نقاشی شماره‌ی یکم را که این جوری بود:
+
+نقاشی شماره‌ی یکم — مار شبیه به کلاه
+شاهکارم را نشان بزرگ‌تر ها دادم و پرسیدم از دیدنش ترس‌تان بر می‌دارد؟
+جوابم دادند: -چرا کلاه باید آدم را بترساند؟
+
+نقاشی من کلاه نبود، یک مار بوآ بود که داشت یک فیل را هضم می‌کرد. آن وقت برای فهم بزرگ‌ترها برداشتم توی شکم بوآ را کشیدم. آخر همیشه باید به آن‌ها توضیحات داد. نقاشی دومم این جوری بود:
+
+نقاشی دوم — مار و فیل درونش
+بزرگ‌ترها بم گفتند کشیدن مار بوآی باز یا بسته را بگذارم کنار و عوضش حواسم را بیش‌تر جمع جغرافی و تاریخ و حساب و دستور زبان کنم. و این جوری شد که تو شش سالگی دور کار ظریف نقاشی را قلم گرفتم. از این که نقاشی شماره‌ی یک و نقاشی شماره‌ی دو ام یخ‌شان نگرفت دلسرد شده بودم. بزرگ‌ترها اگر به خودشان باشد هیچ وقت نمی‌توانند از چیزی سر درآرند. برای بچه‌ها هم خسته کننده است که همین جور مدام هر چیزی را به آن‌ها توضیح بدهند.
+
+ناچار شدم برای خودم کار دیگری پیدا کنم و این بود که رفتم خلبانی یاد گرفتم. بگویی نگویی تا حالا به همه جای دنیا پرواز کرده ام و راستی راستی جغرافی خیلی بم خدمت کرده. می‌توانم به یک نظر چین و آریزونا را از هم تمیز بدهم. اگر آدم تو دل شب سرگردان شده باشد جغرافی خیلی به دادش می‌رسد.
+
+از این راه است که من تو زندگیم با گروه گروه آدم‌های حسابی برخورد داشته‌ام. پیش خیلی از بزرگ‌ترها زندگی کرده‌ام و آن‌ها را از خیلی نزدیک دیده‌ام گیرم این موضوع باعث نشده در باره‌ی آن‌ها عقیده‌ی بهتری پیدا کنم.
+
+هر وقت یکی‌شان را گیر آورده‌ام که یک خرده روشن بین به نظرم آمده با نقاشی شماره‌ی یکم که هنوز هم دارمش محکش زده‌ام ببینم راستی راستی چیزی بارش هست یا نه. اما او هم طبق معمول در جوابم در آمده که: «این یک کلاه است». آن وقت دیگر من هم نه از مارهای بوآ باش اختلاط کرده‌ام نه از جنگل‌های بکر دست نخورده نه از ستاره‌ها. خودم را تا حد او آورده‌ام پایین و باش از بریج و گلف و سیاست و انواع کرات حرف زده‌ام. او هم از این که با یک چنین شخص معقولی آشنایی به هم رسانده سخت خوش‌وقت شده.
+
+این جوری بود که روزگارم تو تنهایی می‌گذشت بی این که راستی راستی یکی را داشته باشم که باش دو کلمه حرف بزنم، تااین که زد و شش سال پیش در کویر صحرا حادثه‌یی برایم اتفاق افتاد؛ یک چیز موتور هواپیمایم شکسته بود و چون نه تعمیرکاری همراهم بود نه مسافری یکه و تنها دست به کار شدم تا از پس چنان تعمیر مشکلی برآیم. مساله‌ی مرگ و زندگی بود. آبی که داشتم زورکی هشت روز را کفاف می‌داد.
+
+شب اول را هزار میل دورتر از هر آبادی مسکونی رو ماسه‌ها به روز آوردم پرت افتاده‌تر از هر کشتی شکسته‌یی که وسط اقیانوس به تخته پاره‌یی چسبیده باشد. پس لابد می‌توانید حدس بزنید چه جور هاج و واج ماندم وقتی کله‌ی آفتاب به شنیدن صدای ظریف عجیبی که گفت: «بی زحمت یک برّه برام بکش!» از خواب پریدم.
+-ها؟
+-یک برّه برام بکش...
+
+چنان از جا جستم که انگار صاعقه بم زده. خوب که چشم‌هام را مالیدم و نگاه کردم آدم کوچولوی بسیار عجیبی را دیدم که با وقار تمام تو نخ من بود. این به‌ترین شکلی است که بعد ها توانستم از او در آرم، گیرم البته آن‌چه من کشیده‌ام کجا و خود او کجا! تقصیر من چیست؟ بزرگ‌تر ها تو شش سالگی از نقاشی دل‌سردم کردند و جز بوآی باز و بسته یاد نگرفتم چیزی بکشم.
+
+با چشم‌هایی که از تعجب گرد شده بود به این حضور ناگهانی خیره شدم. یادتان نرود که من از نزدیک‌ترین آبادی مسکونی هزار میل فاصله داشتم و این آدمی‌زاد کوچولوی من هم اصلا به نظر نمی‌آمد که راه گم کرده باشد یا از خستگی دم مرگ باشد یا از گشنگی دم مرگ باشد یا از تشنگی دم مرگ باشد یا از وحشت دم مرگ باشد. هیچ چیزش به بچه‌یی نمی‌بُرد که هزار میل دور از هر آبادی مسکونی تو دل صحرا گم شده باشد.
+
+این بهترین شکلی است که بعدها از او در آوردم.
+وقتی بالاخره صدام در آمد، گفتم:
+-آخه... تو این جا چه می‌کنی؟
+و آن وقت او خیلی آرام، مثل یک چیز خیلی جدی، دوباره در آمد که:
+-بی زحمت واسه‌ی من یک برّه بکش.
+آدم وقتی تحت تاثیر شدید رازی قرار گرفت جرات نافرمانی نمی‌کند. گرچه تو آن نقطه‌ی هزار میل دورتر از هر آبادی مسکونی و با قرار داشتن در معرض خطر مرگ این نکته در نظرم بی معنی جلوه کرد باز کاغذ و خودنویسی از جیبم در آوردم اما تازه یادم آمد که آن‌چه من یاد گرفته‌ام بیش‌تر جغرافیا و تاریخ و حساب و دستور زبان است، و با کج خلقی مختصری به آن موجود کوچولو گفتم نقاشی بلد نیستم.
+بم جواب داد: -عیب ندارد، یک بَرّه برام بکش.
+
+از آن‌جایی که هیچ وقت تو عمرم بَرّه نکشیده بودم یکی از آن دو تا نقاشی‌ای را که بلد بودم برایش کشیدم. آن بوآی بسته را. ولی چه یکه‌ای خوردم وقتی آن موجود کوچولو در آمد که: -نه! نه! فیلِ تو شکم یک بوآ نمی‌خواهم. بوآ خیلی خطرناک است فیل جا تنگ کن. خانه‌ی من خیلی کوچولوست، من یک بره لازم دارم. برام یک بره بکش.بره‌ی مریض
+-خب، کشیدم.
+با دقت نگاهش کرد و گفت:
+-نه! این که همین حالاش هم حسابی مریض است. یکی دیگر بکش.قوچ
+-کشیدم.
+لبخند با نمکی زد و در نهایت گذشت گفت:
+-خودت که می‌بینی... این بره نیست، قوچ است. شاخ دارد نه...بره‌ی پیر
+باز نقاشی را عوض کردم.
+آن را هم مثل قبلی ها رد کرد:
+-این یکی خیلی پیر است... من یک بره می‌خواهم که مدت ها عمر کند...
+
+باری چون عجله داشتم که موتورم را پیاده کنم رو بی حوصلگی جعبه‌ای کشیدم که دیواره‌اش سه تا سوراخ داشت، و از دهنم پرید که:جعبه
+-این یک جعبه است. بره‌ای که می‌خواهی این تو است.
+
+و چه قدر تعجب کردم از این که دیدم داور کوچولوی من قیافه‌اش از هم باز شد و گفت:
+-آها... این درست همان چیزی است که می‌خواستم! فکر می‌کنی این بره خیلی علف بخواهد؟
+-چطور مگر؟
+-آخر جای من خیلی تنگ است...
+-هر چه باشد حتماً بسش است. بره‌یی که بت داده‌ام خیلی کوچولوست.
+-آن قدرهاهم کوچولو نیست... اِه! گرفته خوابیده...
+
+و این جوری بود که من با شهریار کوچولو آشنا شدم.
+
+خیلی طول کشید تا توانستم بفهمم از کجا آمده. شهریار کوچولو که مدام مرا سوال پیچ می‌کرد خودش انگار هیچ وقت سوال‌های مرا نمی‌شنید. فقط چیزهایی که جسته گریخته از دهنش می‌پرید کم کم همه چیز را به من آشکار کرد. مثلا اول بار که هواپیمای مرا دید (راستی من هواپیما نقاشی نمی‌کنم، سختم است.) ازم پرسید:
+-این چیز چیه؟
+-این «چیز» نیست: این پرواز می‌کند. هواپیماست. هواپیمای من است.
+
+و از این که به‌اش می‌فهماندم من کسی‌ام که پرواز می‌کنم به خود می‌بالیدم.
+حیرت زده گفت: -چی؟ تو از آسمان افتاده‌ای؟
+با فروتنی گفتم: -آره.
+گفت: -اوه، این دیگر خیلی عجیب است!
+و چنان قهقهه‌ی ملوسی سر داد که مرا حسابی از جا در برد. راستش من دلم می‌خواهد دیگران گرفتاری‌هایم را جدی بگیرند.
+خنده‌هایش را که کرد گفت: -خب، پس تو هم از آسمان می‌آیی! اهل کدام سیاره‌ای؟...
+
+بفهمی نفهمی نور مبهمی به معمای حضورش تابید. یکهو پرسیدم:
+-پس تو از یک سیاره‌ی دیگر آمده‌ای؟
+آرام سرش را تکان داد بی این که چشم از هواپیما بردارد.
+
+اما جوابم را نداد، تو نخ هواپیما رفته بود و آرام آرام سر تکان می‌داد.
+گفت: -هر چه باشد با این نباید از جای خیلی دوری آمده باشی...
+
+مدت درازی تو خیال فرو رفت، بعد بره‌اش را از جیب در آورد و محو تماشای آن گنج گرانبها شد.تصویری از شهریار کوچولو بر روی زمین
+فکر می‌کنید از این نیمچه اعتراف «سیاره‌ی دیگر»ِ او چه هیجانی به من دست داد؟ زیر پاش نشستم که حرف بیشتری از زبانش بکشم:
+-تو از کجا می‌آیی آقا کوچولوی من؟ خانه‌ات کجاست؟ بره‌ی مرا می‌خواهی کجا ببری؟
+مدتی در سکوت به فکر فرورفت و بعد در جوابم گفت:
+-حسن جعبه‌ای که بم داده‌ای این است که شب‌ها می‌تواند خانه‌اش بشود.
+-معلوم است... اما اگر بچه‌ی خوبی باشی یک ریسمان هم بِت می‌دهم که روزها ببندیش. یک ریسمان با یک میخ طویله...
+انگار از پیش‌نهادم جا خورد، چون که گفت:
+-ببندمش؟ چه فکر ها!
+-آخر اگر نبندیش راه می‌افتد می‌رود گم می‌شود.
+
+دوست کوچولوی من دوباره غش غش خنده را سر داد:
+-مگر کجا می‌تواند برود؟
+-خدا می‌داند. راستِ شکمش را می‌گیرد و می‌رود...
+-بگذار برود...اوه، خانه‌ی من آن‌قدر کوچک است!
+و شاید با یک خرده اندوه در آمد که:
+-یک‌راست هم که بگیرد برود جای دوری نمی‌رود...
+
+به این ترتیب از یک موضوع خیلی مهم دیگر هم سر در آوردم: این که سیاره‌ی او کمی از یک خانه‌ی معمولی بزرگ‌تر بود.این نکته آن‌قدرها به حیرتم نینداخت. می‌دانستم گذشته از سیاره‌های بزرگی مثل زمین و کیوان و تیر و ناهید که هرکدام برای خودشان اسمی دارند، صدها سیاره‌ی دیگر هم هست که بعضی‌شان از بس کوچکند با دوربین نجومی هم به هزار زحمت دیده می‌شوند و هرگاه اخترشناسی یکی‌شان را کشف کند به جای اسم شماره‌ای به‌اش می‌دهد. مثلا اسمش را می‌گذارد «اخترک ۳۲۵۱».
+
+دلایل قاطعی دارم که ثابت می‌کند شهریار کوچولو از اخترک ب۶۱۲ آمده‌بود.
+
+شهریار کوچولو بر اخترکِ ب۶۱۲
+این اخترک را فقط یک بار به سال ۱۹۰۹ یک اخترشناس ترک توانسته بود ببیند اخترشناسِ ترک در حالِ دیدنِ اخترکِ ب۶۱۲که تو یک کنگره‌ی بین‌المللی نجوم هم با کشفش هیاهوی زیادی به راه انداخت اما واسه خاطر لباسی که تنش بود هیچ کس حرفش را باور نکرد. اخترشناسِ ترک در کنگره‌ی بین‌المللیِ نجوم، با لباس قدیمیآدم بزرگ‌ها این جوری‌اند!
+
+بختِ اخترک ب۶۱۲ زد و، ترک مستبدی ملتش را به ضرب دگنک وادار به پوشیدن لباس اروپایی‌ها کرد. اخترشناس به سال ۱۹۲۰ دوباره، و این بار با سر و وضع آراسته برای کشفش ارائه‌ی دلیل کرد و این بار همه جانب او را گرفتند.اخترشناسِ ترک در کنگره‌ی بین‌المللیِ نجوم، با لباس جدید
+به خاطر آدم بزرگ‌هاست که من این جزئیات را در باب اخترکِ ب۶۱۲ برای‌تان نقل می‌کنم یا شماره‌اش را می‌گویم چون که آن‌ها عاشق عدد و رقم‌اند. وقتی با آن‌ها از یک دوست تازه‌تان حرف بزنید هیچ وقت ازتان درباره‌ی چیزهای اساسی‌اش سوال نمی‌کنند که هیج وقت نمی‌پرسند «آهنگ صداش چه‌طور است؟ چه بازی‌هایی را بیشتر دوست دارد؟ پروانه جمع می‌کند یا نه؟» -می‌پرسند: «چند سالش است؟ چند تا برادر دارد؟ وزنش چه‌قدر است؟ پدرش چه‌قدر حقوق می‌گیرد؟» و تازه بعد از این سوال‌ها است که خیال می‌کنند طرف را شناخته‌اند.
+
+اگر به آدم بزرگ‌ها بگویید یک خانه‌ی قشنگ دیدم از آجر قرمز که جلو پنجره‌هاش غرقِ شمعدانی و بامش پر از کبوتر بود محال است بتوانند مجسمش کنند. باید حتماً به‌شان گفت یک خانه‌ی صد میلیون تومنی دیدم تا صداشان بلند بشود که: -وای چه قشنگ!
+
+یا مثلا اگر به‌شان بگویید «دلیل وجودِ شهریارِ کوچولو این که تودل‌برو بود و می‌خندید و دلش یک بره می‌خواست و بره خواستن، خودش بهترین دلیل وجود داشتن هر کسی است» شانه بالا می‌اندازند و باتان مثل بچ‌ه‌ها رفتار می‌کنند! اما اگر به‌شان بگویید «سیاره‌ای که ازش آمده‌بود اخترک ب۶۱۲ است» بی‌معطلی قبول می‌کنند و دیگر هزار جور چیز ازتان نمی‌پرسند. این جوری‌اند دیگر. نباید ازشان دل‌خور شد. بچه‌ها باید نسبت به آدم بزرگ‌ها گذشت داشته باشند.
+
+اما البته ماها که مفهوم حقیقی زندگی را درک می‌کنیم می‌خندیم به ریش هرچه عدد و رقم است! چیزی که من دلم می‌خواست این بود که این ماجرا را مثل قصه‌ی پریا نقل کنم. دلم می‌خواست بگویم: «یکی بود یکی نبود. روزی روزگاری یه شهریار کوچولو بود که تو اخترکی زندگی می‌کرد همه‌اش یه خورده از خودش بزرگ‌تر و واسه خودش پیِ دوستِ هم‌زبونی می‌گشت...»، آن هایی که مفهوم حقیقی زندگی را درک کرده‌اند واقعیت قضیه را با این لحن بیشتر حس می‌کنند. آخر من دوست ندارم کسی کتابم را سرسری بخواند. خدا می‌داند با نقل این خاطرات چه بار غمی روی دلم می‌نشیند. شش سالی می‌شود که دوستم با بَرّه‌اش رفته. این که این جا می‌کوشم او را وصف کنم برای آن است که از خاطرم نرود. فراموش کردن یک دوست خیلی غم‌انگیز است. همه کس که دوستی ندارد. من هم می‌توانم مثل آدم بزرگ‌ها بشوم که فقط اعداد و ارقام چشم‌شان را می‌گیرد. و باز به همین دلیل است که رفته‌ام یک جعبه رنگ و چند تا مداد خریده‌ام. تو سن و سال من واسه کسی که جز کشیدنِ یک بوآی باز یا یک بوآی بسته هیچ کار دیگری نکرده -و تازه آن هم در شش سالگی- دوباره به نقاشی رو کردن از آن حرف‌هاست! البته تا آن‌جا که بتوانم سعی می‌کنم چیزهایی که می‌کشم تا حد ممکن شبیه باشد. گیرم به موفقیت خودم اطمینان چندانی ندارم. یکیش شبیه از آب در می‌آید یکیش نه. سرِ قدّ و قواره‌اش هم حرف است. یک جا زیادی بلند درش آورده‌ام یک جا زیادی کوتاه. از رنگ لباسش هم مطمئن نیستم. خب، رو حدس و گمان پیش رفته‌ام؛ کاچی به زِ هیچی. و دست آخر گفته باشم که تو بعضِ جزئیات مهم‌ترش هم دچار اشتباه شده‌ام. اما در این مورد دیگر باید ببخشید: دوستم زیر بار هیچ جور شرح و توصیفی نمی‌رفت. شاید مرا هم مثل خودش می‌پنداشت. اما از بختِ بد، دیدن بره‌ها از پشتِ جعبه از من بر نمی‌آید. نکند من هم یک خرده به آدم بزرگ‌ها رفته‌ام؟ «باید پیر شده باشم».
+
+هر روزی که می‌گذشت از اخترک و از فکرِ عزیمت و از سفر و این حرف‌ها چیزهای تازه‌ای دست‌گیرم می‌شد که همه‌اش معلولِ بازتاب‌هایِ اتفاقی بود. و از همین راه بود که روز سوم از ماجرایِ تلخِ بائوباب ها سردرآوردم.
+
+این بار هم بَرّه باعثش شد، چون شهریار کوچولو که انگار سخت دودل مانده‌بود ناگهان ازم پرسید:
+-بَرّه‌ها بته‌ها را هم می‌خورند دیگر، مگر نه؟
+-آره. همین جور است.
+-آخ! چه خوشحال شدم!
+
+نتوانستم بفهمم این موضوع که بَرّه‌ها بوته‌ها را هم می‌خورند اهمیتش کجاست اما شهریار کوچولو درآمد که:
+-پس لابد بائوباب ها را هم می‌خورند دیگر؟
+
+یک گله فیل که در اخترکِ ب۶۱۲ روی هم چیده شده‌اندمن برایش توضیح دادم که بائوباب بُتّه نیست. درخت است و از ساختمان یک معبد هم گنده‌تر، و اگر یک گَلّه فیل هم با خودش ببرد حتا یک درخت بائوباب را هم نمی‌توانند بخورند.
+از فکر یک گَلّه فیل به خنده افتاد و گفت: -باید چیدشان روی هم.
+اما با فرزانگی تمام متذکر شد که: -بائوباب هم از بُتِّگی شروع می‌کند به بزرگ شدن.
+-درست است. اما نگفتی چرا دلت می‌خواهد بره‌هایت نهال‌های بائوباب را بخورند؟
+گفت: -دِ! معلوم است!
+
+و این را چنان گفت که انگار موضوع از آفتاب هم روشن‌تر است؛ منتها من برای این که به تنهایی از این راز سر در آرم ناچار شدم حسابی کَلّه را به کار بیندازم.
+
+راستش این که تو اخترکِ شهریار کوچولو هم مثل سیارات دیگر هم گیاهِ خوب به هم می‌رسید هم گیاهِ بد. یعنی هم تخمِ خوب گیاه‌های خوب به هم می‌رسید، هم تخمِ بدِ گیاه‌هایِ بد. اما تخم گیاه‌ها نامریی‌اند. آن‌ها تو حرمِ تاریک خاک به خواب می‌روند تا یکی‌شان هوس بیدار شدن به سرش بزند. آن وقت کش و قوسی می‌آید و اول با کم رویی شاخکِ باریکِ خوشگل و بی‌آزاری به طرف خورشید می‌دواند. اگر این شاخک شاخکِ تربچه‌ای گلِ سرخی چیزی باشد می‌شود گذاشت برای خودش رشد کند اما اگر گیاهِ بدی باشد آدم باید به مجردی که دستش را خواند ریشه‌کنش کند.
+
+باری، تو سیاره‌ی شهریار کوچولو گیاه تخمه‌های وحشتناکی به هم می‌رسید. یعنی تخم درختِ بائوباب که خاکِ سیاره حسابی ازشان لطمه خورده بود. بائوباب هم اگر دیر به‌اش برسند دیگر هیچ جور نمی‌شود حریفش شد: تمام سیاره را می‌گیرد و با ریشه‌هایش سوراخ سوراخش می‌کند و اگر سیاره خیلی کوچولو باشد و بائوباب‌ها خیلی زیاد باشند پاک از هم متلاشیش می‌کنند.
+
+شهریار کوچولو در حال نظافت ِ اخترکششهریار کوچولو بعدها یک روز به من گفت: «این، یک امر انضباطی است. صبح به صبح بعد از نظافتِ خود باید با دفت تمام به نظافتِ اخترک پرداخت. آدم باید خودش را مجبور کند که به مجردِ تشخیص دادن بائوباب‌ها از بته‌های گلِ سرخ که تا کوچولواَند عین هم‌اَند با دقت ریشه‌کن‌شان بکند. کار کسل‌کننده‌ای هست اما هیچ مشکل نیست.»
+
+یک روز هم بم توصیه کرد سعی کنم هر جور شده یک نقاشی حسابی از کار درآرم که بتواند قضیه را به بچه‌های سیاره‌ی من هم حالی کند. گفت اگر یک روز بروند سفر ممکن است به دردشان بخورد. پاره‌ای وقت‌ها پشت گوش انداختن کار ایرادی ندارد اما اگر پای بائوباب در میان باشد گاوِ آدم می‌زاید. اخترکی را سراغ دارم که یک تنبل‌باشی ساکنش بود و برای کندن سه تا نهال بائوباب امروز و فردا کرد...».
+
+آن وقت من با استفاده از چیزهایی که گفت شکل آن اخترک را کشیدم.
+
+اخترکِ تنبل‌باشی با سه درختِ بائوباب
+هیچ دوست ندارم اندرزگویی کنم. اما خطر بائوباب‌ها آن‌قدر کم شناخته شده و سر راهِ کسی که تو چنان اخترکی سرگیدان بشود آن قدر خطر به کمین نشسته که این مرتبه را از رویه‌ی همیشگی خودم دست بر می‌دارم و می‌گویم: «بچه‌ها! هوای بائوباب‌ها را داشته باشید!»
+
+اگر من سرِ این نقاشی این همه به خودم فشار آورده‌ام فقط برای آن بوده که دوستانم را متوجه خطری کنم که از مدت‌ها پیش بیخ گوش‌شان بوده و مثلِ خودِ من ازش غافل بوده‌اند. درسی که با این نقاشی داده‌ام به زحمتش می‌ارزد. حالا ممکن است شما از خودتان بپرسید: «پس چرا هیچ کدام از بقیه‌ی نقاشی‌های این کتاب هیبتِ تصویرِ بائوباب‌ها را ندارد؟» -خب، جوابش خیلی ساده است: من زور خودم را زده‌ام اما نتوانسته‌ام از کار درشان بیاورم. اما عکس بائوباب‌ها را که می‌کشیدم احساس می‌کردم قضیه خیلی فوریت دارد و به این دلیل شور بَرَم داشته بود.
+
+آخ، شهریار کوچولو! این جوری بود که من کَم کَمَک از زندگیِ محدود و دل‌گیر تو سر درآوردم. تا مدت‌ها تنها سرگرمیِ تو تماشای زیباییِ غروب آفتاب بوده. به این نکته‌ی تازه صبح روز چهارم بود که پی بردم؛ یعنی وقتی که به من گفتی:
+-غروب آفتاب را خیلی دوست دارم. برویم فرورفتن آفتاب را تماشا کنیم...شهریار کوچولو در اخترکش مشغولِ تماشای غروبِ آفتاب
+-هوم، حالاها باید صبر کنی...
+-واسه چی صبر کنم؟
+-صبر کنی که آفتاب غروب کند.
+
+اول سخت حیرت کردی بعد از خودت خنده‌ات گرفت و برگشتی به من گفتی:
+-همه‌اش خیال می‌کنم تو اخترکِ خودمم!
+-راستش موقعی که تو آمریکا ظهر باشد همه می‌دانند تو فرانسه تازه آفتاب دارد غروب می‌کند. کافی است آدم بتواند در یک دقیقه خودش را برساند به فرانسه تا بتواند غروب آفتاب را تماشا کند. متاسفانه فرانسه کجا این‌جا کجا! اما رو اخترک تو که به آن کوچکی است همین‌قدر که چند قدمی صندلیت را جلو بکشی می‌توانی هرقدر دلت خواست غروب تماشا کنی.
+-یک روز چهل و سه بار غروب آفتاب را تماشا کردم!
+و کمی بعد گفت:
+-خودت که می‌دانی... وقتی آدم خیلی دلش گرفته باشد از تماشای غروب لذت می‌برد.
+-پس خدا می‌داند آن روز چهل و سه غروبه چه‌قدر دلت گرفته بوده.
+
+اما مسافر کوچولو جوابم را نداد.
+
+روز پنجم باز سرِ گوسفند از یک راز دیگر زندگی شهریار کوچولو سر در آوردم. مثل چیزی که مدت‌ه‌ا تو دلش به‌اش فکر کرده باشد یک‌هو بی مقدمه از من پرسید:
+-گوسفندی که بُتّه ها را بخورد گل ها را هم می‌خورد؟
+-گوسفند هرچه گیرش بیاید می‌خورد.
+-حتا گل‌هایی را هم که خار دارند؟
+-آره، حتا گل‌هایی را هم که خار دارند.
+-پس خارها فایده‌شان چیست؟
+
+من چه می‌دانستم؟ یکی از آن: سخت گرفتار باز کردن یک مهره‌ی سفتِ موتور بودم. از این که یواش یواش بو می‌بردم خرابیِ کار به آن سادگی‌ها هم که خیال می‌کردم نیست برج زهرمار شده‌بودم و ذخیره‌ی آبم هم که داشت ته می‌کشید بیش‌تر به وحشتم می‌انداخت.
+-پس خارها فایده‌شان چسیت؟
+
+شهریار کوچولو وقتی سوالی را می‌کشید وسط دیگر به این مفتی‌ها دست بر نمی‌داشت. مهره پاک کلافه‌ام کرده بود. همین جور سرسری پراندم که:
+-خارها به درد هیچ کوفتی نمی‌خورند. آن‌ها فقط نشانه‌ی بدجنسی گل‌ها هستند.
+-دِ!
+و پس از لحظه‌یی سکوت با یک جور کینه درآمد که:
+-حرفت را باور نمی‌کنم! گل‌ها ضعیفند. بی شیله‌پیله‌اند. سعی می‌کنند یک جوری تهِ دل خودشان را قرص کنند. این است که خیال می‌کنند با آن خارها چیزِ ترسناکِ وحشت‌آوری می‌شوند...
+
+لام تا کام به‌اش جواب ندادم. در آن لحظه داشتم تو دلم می‌گفتم: «اگر این مهره‌ی لعنتی همین جور بخواهد لج کند با یک ضربه‌ی چکش حسابش را می‌رسم.» اما شهریار کوچولو دوباره افکارم را به هم ریخت:
+-تو فکر می‌کنی گل‌ها...
+من باز همان جور بی‌توجه گفتم:
+-ای داد بیداد! ای داد بیداد! نه، من هیچ کوفتی فکر نمی‌کنم! آخر من گرفتار هزار مساله‌ی مهم‌تر از آنم!
+هاج و واج نگاهم کرد و گفت:
+-مساله‌ی مهم!
+
+مرا می‌دید که چکش به دست با دست و بالِ سیاه روی چیزی که خیلی هم به نظرش زشت می‌آمد خم شده‌ام.
+-مثل آدم بزرگ‌ها حرف می‌زنی!
+از شنیدنِ این حرف خجل شدم اما او همین جور بی‌رحمانه می‌گفت:
+-تو همه چیز را به هم می‌ریزی... همه چیز را قاتی می‌کنی!
+حسابی از کوره در رفته‌بود.
+
+موهای طلایی طلائیش تو باد می‌جنبید.
+-اخترکی را سراغ دارم که یک آقا سرخ روئه توش زندگی می‌کند. او هیچ وقت یک گل را بو نکرده، هیچ وقت یک ستاره‌را تماشا نکرده هیچ وقت کسی را دوست نداشته هیچ وقت جز جمع زدن عددها کاری نکرده. او هم مثل تو صبح تا شب کارش همین است که بگوید: «من یک آدم مهمم! یک آدم مهمم!» این را بگوید و از غرور به خودش باد کند. اما خیال کرده: او آدم نیست، یک قارچ است!
+-یک چی؟
+-یک قارچ!گلِ سرخ
+حالا دیگر رنگش از فرط خشم مثل گچ سفید شده‌بود:
+-کرورها سال است که گل‌ها خار می‌سازند و با وجود این کرورها سال است که برّه‌ها گل‌ها را می‌خورند. آن وقت هیچ مهم نیست آدم بداند پس چرا گل‌ها واسه ساختنِ خارهایی که هیچ وقتِ خدا به هیچ دردی نمی‌خورند این قدر به خودشان زحمت می‌دهند؟ جنگ میان برّه‌ها و گل‌ها هیچ مهم نیست؟ این موضوع از آن جمع زدن‌های آقا سرخ‌روئه‌یِ شکم‌گنده مهم‌تر و جدی‌تر نیست؟ اگر من گلی را بشناسم که تو همه‌ی دنیا تک است و جز رو اخترک خودم هیچ جای دیگر پیدا نمیشه و ممکن است یک روز صبح یک برّه کوچولو، مفت و مسلم، بی این که بفهمد چه‌کار دارد می‌کند به یک ضرب پاک از میان ببردش چی؟ یعنی این هم هیچ اهمیتی ندارد؟ اگر کسی گلی را دوست داشته باشد که تو کرورها و کرورها ستاره فقط یک دانه ازش هست واسه احساس وشبختی همین قدر بس است که نگاهی به آن همه ستاره بیندازد و با خودش بگوید: «گل من یک جایی میان آن ستاره‌هاست»، اما اگر برّه گل را بخورد برایش مثل این است که یکهو تمام آن ستاره‌ها پِتّی کنند و خاموش بشوند. یعنی این هم هیچ اهمیتی ندارد؟
+دیگر نتوانست چیزی بگوید و ناگهان هِق هِق کنان زد زیر گریه.
+
+حالا دیگر شب شده‌بود. اسباب و ابزارم را کنار انداخته‌بودم. دیگر چکش و مهره و تشنگی و مرگ به نظرم مضحک می‌آمد. رو ستاره‌ای، رو سیاره‌ای، رو سیاره‌ی من، زمین، شهریارِ کوچولویی بود که احتیاج به دلداری داشت! به آغوشش گرفتم مثل گهواره تابش دادم به‌اش گفتم: «گلی که تو دوست داری تو خطر نیست. خودم واسه گوسفندت یک پوزه‌بند می‌کشم... خودم واسه گفت یک تجیر می‌کشم... خودم...» بیش از این نمی‌دانستم چه بگویم. خودم را سخت چُلمَن و بی دست و پا حس می‌کردم. نمی‌دانستم چه‌طور باید خودم را به‌اش برسانم یا به‌اش بپیوندم...p چه دیار اسرارآمیزی است دیار اشک!
+
+راه شناختن آن گل را خیلی زود پیدا کردم:
+تو اخترکِ شهریار کوچولو همیشه یک مشت گل‌های خیلی ساده در می‌آمده. گل‌هایی با یک ردیف گلبرگ که جای چندانی نمی‌گرفته، دست و پاگیرِ کسی نمی‌شده. صبحی سر و کله‌شان میان علف‌ها پیدا می‌شده شب از میان می‌رفته‌اند. اما این یکی یک روز از دانه‌ای جوانه زده بود که خدا می‌دانست از کجا آمده رود و شهریار کوچولو با جان و دل از این شاخکِ نازکی که به هیچ کدام از شاخک‌های دیگر نمی‌رفت مواظبت کرده‌بود. بعید بنود که این هم نوعِ تازه‌ای از بائوباب باشد اما بته خیلی زود از رشد بازماند و دست‌به‌کارِ آوردن گل شد. شهریار کوچولو که موقعِ نیش زدن آن غنچه‌ی بزرگ حاضر و ناظر بود به دلش افتاد که باید چیز معجزه‌آسایی از آن بیرون بیاید. اما گل تو پناهِ خوابگاهِ سبزش سر فرصت دست اندکار خودآرایی بود تا هرچه زیباتر جلوه‌کند. رنگ‌هایش را با وسواس تمام انتخاب می‌کرد سر صبر لباس می‌پوشید و گلبرگ‌ها را یکی یکی به خودش می‌بست. دلش نمی‌خواست مثل شقایق‌ها با جامه‌ی مچاله و پر چروک بیرون بیاید.
+
+شهریار کوچولو و گلِ سرخنمی‌خواست جز در اوج درخشندگی زیبائیش رو نشان بدهد!...
+
+هوه، بله عشوه‌گری تمام عیار بود! آرایشِ پر راز و رمزش روزها و روزها طول کشید تا آن که سرانجام یک روز صبح درست با بر آمدن آفتاب نقاب از چهره برداشت و با این که با آن همه دقت و ظرافت روی آرایش و پیرایش خودش کار کرده بود خمیازه‌کشان گفت:
+-اوه، تازه همین حالا از خواب پا شده‌ام... عذر می‌خواهم که موهام این جور آشفته‌است...
+
+شهریار کوچولو نتوانست جلو خودش را بگیرد و از ستایش او خودداری کند:
+-وای چه‌قدر زیبائید!
+گل به نرمی گفت:
+-چرا که نه؟ من و آفتاب تو یک لحظه به دنیا آمدیم...
+شهریار کوچولو شستش خبردار شد که طرف آن‌قدرها هم اهل شکسته‌نفسی نیست اما راستی که چه‌قدر هیجان انگیز بود!
+-به نظرم وقت خوردن ناشتایی است. بی زحمت برایم فکری بکنید.
+و شهریار کوچولوی مشوش و در هم یک آبپاش آب خنک آورده به گل داده‌بود.شهریار کوچولو در حالِ تماشای گلِ سرخ
+با این حساب، هنوزهیچی نشده با آن خودپسندیش که بفهمی‌نفهمی از ضعفش آب می‌خورد دل او را شکسته بود. مثلا یک روز که داشت راجع به چهارتا خارش حرف می‌زد یک‌هو در آمده بود که:ببر و گلِ سرخ
+-نکند ببرها با آن چنگال‌های تیزشان بیایند سراغم!
+شهریار کوچولو ازش ایراد گرفته‌بود که:
+-تو اخترک من ببر به هم نمی‌رسد. تازه ببرها که علف‌خوار نیستند.
+گل به گلایه جواب داده بود:
+-من که علف نیستم.
+و شهریار کوچولو گفته بود:
+-عذر می‌خواهم...
+-من از ببرها هیچ ترسی ندارم اما از جریان هوا وحشت می‌کنم. تو دستگاه‌تان تجیر به هم نمی‌رسد؟شهریار کوچولو در حالِ پوشاندنِ گلِ سرخ
+شهریار کوچولو تو دلش گفت: «وحشت از جریان هوا... این که واسه یک گیاه تعریفی ندارد... چه مرموز است این گل!»
+-شب مرا بگذارید زیر یک سرپوش. این جا هواش خیلی سرد است. چه جای بدی افتادم! جایی که پیش از این بودم...شهریار کوچولو در حالِ گذاشتنِ سرپوش روی گلِ سرخ
+اما حرفش را خورده بود. آخر، آمدنا هنوز به شکل دانه بود. امکان نداشت توانسته‌باشد دنیاهای دیگری را بشناسد. شرم‌سار از این که گذاشته بود سر به هم بافتن دروغی به این آشکاری مچش گیربیفتد دو سه بار سرفه کرده بود تا اهمالِ شهریار کوچولو را به‌اش یادآور شود:
+-تجیر کو پس؟
+-داشتم می‌رفتم اما شما داشتید صحبت می‌کردید!
+و با وجود این زورکی بنا کرده‌بود به سرفه کردن تا او احساس پشیمانی کند.
+
+به این ترتیب شهریار کوچولو با همه‌ی حسن نیّتی که از عشقش آب می‌خورد همان اول کار به او بد گمان شده‌بود. حرف‌های بی سر و تهش را جدی گرفته‌بود و سخت احساس شوربختی می‌کرد.
+
+یک روز دردِدل کنان به من گفت: -حقش بود به حرف‌هاش گوش نمی‌دادم. هیچ وقت نباید به حرف گل‌ها گوش داد. گل را فقط باید بوئید و تماشا کرد. گلِ من تمامِ اخترکم را معطر می‌کرد گیرم من بلد نبودم چه‌جوری از آن لذت ببرم. قضیه‌ی چنگال‌های ببر که آن جور دَمَغم کرده‌بود می‌بایست دلم را نرم کرده باشد...»
+
+یک روز دیگر هم به من گفت: «آن روزها نتوانستم چیزی بفهمم. من بایست روی کرد و کارِ او در باره‌اش قضاوت می‌کردم نه روی گفتارش... عطرآگینم می‌کرد. دلم را روشن می‌کرد. نمی‌بایست ازش بگریزم. می‌بایست به مهر و محبتی که پشتِ آن کلک‌های معصومانه‌اش پنهان بود پی می‌بردم. گل‌ها پُرَند از این جور تضادها. اما خب دیگر، من خام‌تر از آن بودم که راهِ دوست داشتنش را بدانم!».
+
+گمان کنم شهریار کوچولو برای فرارش از مهاجرت پرنده‌های وحشی استفاده کرد.
+
+گمان کنم شهریار کوچولو برای فرارش از مهاجرت پرنده‌های وحشی استفاده کرد.
+صبح روز حرکت، اخترکش را آن جور که باید مرتب کرد، آتش‌فشان‌های فعالش را با دقت پاک و دوده‌گیری کرد: شهریار کوچولو در حالِ پاک کردنِ آتش‌فشان.دو تا آتش‌فشان فعال داشت که برای گرم کردن ناشتایی خیلی خوب بود. یک آتش‌فشان خاموش هم داشت. منتها به قول خودش «آدم کف دستش را که بو نکرده!» این بود که آتش‌فشان خاموش را هم پاک کرد. آتش‌فشان که پاک باشد مرتب و یک هوا می‌سوزد و یک‌هو گُر نمی‌زند. آتش‌فشان هم عین‌هو بخاری یک‌هو اَلُو می‌زند. البته ما رو سیاره‌مان زمین کوچک‌تر از آن هستیم که آتش‌فشان‌هامان را پاک و دوده‌گیری کنیم و برای همین است که گاهی آن جور اسباب زحمت‌مان می‌شوند.
+
+شهریار کوچولو با دل‌ِگرفته آخرین نهال‌های بائوباب را هم ریشه‌کن کرد. فکر می‌کرد دیگر هیچ وقت نباید برگردد. اما آن روز صبح گرچه از این کارهای معمولیِ هر روزه کُلّی لذت برد موقعی که آخرین آب را پای گل داد و خواست بگذاردش زیرِ سرپوش چیزی نمانده‌بود که اشکش سرازیر شود.
+به گل گفت: -خدا نگهدار!
+اما او جوابش را نداد.
+دوباره گفت: -خدا نگهدار!
+گل سرفه‌کرد، گیرم این سرفه اثر چائیدن نبود. بالاخره به زبان آمد و گفت:
+-من سبک مغز بودم. ازت عذر می‌خواهم. سعی کن خوشبخت باشی.
+از این که به سرکوفت و سرزنش‌های همیشگی برنخورد حیرت کرد و سرپوش به دست هاج‌وواج ماند. از این محبتِ آرام سر در نمی‌آورد.
+گل به‌اش گفت: -خب دیگر، دوستت دارم. اگر تو روحت هم از این موضوع خبردار نشد تقصیر من است. باشد، زیاد مهم نیست. اما تو هم مثل من بی‌عقل بودی... سعی کن خوشبخت بشوی... این سرپوش را هم بگذار کنار، دیگر به دردم نمی‌خورد.
+-آخر، باد...
+-آن قدرهاهم سَرمائو نیستم... هوای خنک شب برای سلامتیم خوب است. خدانکرده گُلم آخر.
+-آخر حیوانات...
+-اگر خواسته‌باشم با شب‌پره‌ها آشنا بشوم جز این که دو سه تا کرمِ حشره را تحمل کنم چاره‌ای ندارم. شب‌پره باید خیلی قشنگ باشد. جز آن کی به دیدنم می‌آید؟ تو که می‌روی به آن دور دورها. از بابتِ درنده‌ها هم هیچ کَکَم نمی‌گزد: «من هم برای خودم چنگ و پنجه‌ای دارم».
+و با سادگی تمام چهارتا خارش را نشان داد. بعد گفت:
+-دست‌دست نکن دیگر! این کارت خلق آدم را تنگ می‌کند. حالا که تصمیم گرفته‌ای بروی برو!
+
+و این را گفت، چون که نمی‌خواست شهریار کوچولو گریه‌اش را ببیند. گلی بود تا این حد خودپسند...
+
+۱۰
+خودش را در منطقه‌ی اخترک‌های ۳۲۵، ۳۲۶، ۳۲۷، ۳۲۸، ۳۲۹ و ۳۳۰ دید. این بود که هم برای سرگرمی و هم برای چیزیادگرفتن بنا کرد یکی‌یکی‌شان را سیاحت کردن.
+
+اخترکِ اول مسکن پادشاهی بود که با شنلی از مخمل ارغوانی قاقم بر اورنگی بسیار ساده و در عین حال پرشکوه نشسته بود و همین که چشمش به شهریار کوچولو افتاد داد زد:
+-خب، این هم رعیت!
+شهریار کوچولو از خودش پرسید: -او که تا حالا هیچ وقت مرا ندیده چه جوری می‌تواند بشناسدم؟
+دیگر اینش را نخوانده‌بود که دنیابرای پادشاهان به نحو عجیبی ساده شده و تمام مردم فقط یک مشت رعیت به حساب می‌آیند.
+
+پادشاه در سیاره‌اش
+پادشاه که می‌دید بالاخره شاهِ کسی شده و از این بابت کبکش خروس می‌خواند گفت: -بیا جلو بهتر ببینیمت. شهریار کوچولو با چشم پیِ جایی گشت که بنشیند اما شنلِ قاقمِ حضرتِ پادشاهی تمام اخترک را دربرگرفته‌بود. ناچار همان طور سر پا ماند و چون سخت خسته بود به دهن‌دره افتاد.
+شاه به‌اش گفت: -خمیازه کشیدن در حضرتِ سلطان از نزاکت به دور است. این کار را برایت قدغن می‌کنم. شهریار کوچولو که سخت خجل شده‌بود در آمد که:
+-نمی‌توانم جلوِ خودم را بگیرم. راه درازی طی‌کرده‌ام و هیچ هم نخوابیده‌ام...
+پادشاه گفت: -خب خب، پس بِت امر می‌کنم خمیازه بکشی. سال‌هاست خمیازه‌کشیدن کسی را ندیده‌ام برایم تازگی دارد. یاالله باز هم خمیازه بکش. این یک امر است.
+شهریار کوچولو گفت: -آخر این جوری من دست و پایم را گم می‌کنم... دیگر نمی‌توانم.
+شاه گفت: -هوم! هوم! خب، پس من به‌ات امر می‌کنم که گاهی خمیازه بکشی گاهی نه.
+تند و نامفهوم حرف می‌زد و انگار خلقش حسابی تنگ بود.
+
+پادشاه فقط دربند این بود که مطیع فرمانش باشند. در مورد نافرمانی‌ها هم هیچ نرمشی از خودش نشان نمی‌داد. یک پادشاهِ تمام عیار بود گیرم چون زیادی خوب بود اوامری که صادر می‌کرد اوامری بود منطقی. مثلا خیلی راحت در آمد که: «اگر من به یکی از سردارانم امر کنم تبدیل به یکی از این مرغ‌های دریایی بشود و یارو اطاعت نکند تقسیر او نیست که، تقصیر خودم است».
+شهریار کوچولو در نهایت ادب پرسید: -اجازه می‌فرمایید بنشینم؟
+پادشاه که در نهایتِ شکوه و جلال چینی از شنل قاقمش را جمع می‌کرد گفت: -به‌ات امر می‌کنیم بنشینی.
+
+منتها شهریار کوچولو مانده‌بود حیران: آخر آن اخترک کوچک‌تر از آن بود که تصورش را بشود کرد. واقعا این پادشاه به چی سلطنت می‌کرد؟ گفت: -قربان عفو می‌فرمایید که ازتان سوال می‌کنم...
+پادشاه با عجله گفت: -به‌ات امر می‌کنیم از ما سوال کنی.
+-شما قربان به چی سلطنت می‌فرمایید؟
+پادشاه خیلی ساده گفت: -به همه چی.
+-به همه‌چی؟
+پادشاه با حرکتی قاطع به اخترک خودش و اخترک‌های دیگر و باقی ستاره‌ها اشاره کرد.
+شهریار کوچولو پرسید: -یعنی به همه‌ی این ها؟
+شاه جواب داد: -به همه‌ی این ها.
+آخر او فقط یک پادشاه معمولی نبود که، یک پادشاهِ جهانی بود.
+-آن وقت ستاره‌ها هم سربه‌فرمان‌تانند؟
+پادشاه گفت: -البته که هستند. همه‌شان بی‌درنگ هر فرمانی را اطاعت می‌کنند. ما نافرمانی را مطلقا تحمل نمی‌کنیم.
+
+یک چنین قدرتی شهریار کوچولو را به شدت متعجب کرد. اگر خودش چنین قدرتی می‌داشت بی این که حتا صندلیش را یک ذره تکان بدهد روزی چهل و چهار بار که هیچ روزی هفتاد بار و حتا صدبار و دویست‌بار غروب آفتاب را تماشا می‌کرد! و چون بفهمی نفهمی از یادآوریِ اخترکش که به امان خدا ول‌کرده‌بود غصه‌اش شد جراتی به خودش داد که از پادشاه درخواست محبتی بکند:
+-دلم می‌خواست یک غروب آفتاب تماشا کنم... در حقم التفات بفرمایید امر کنید خورشید غروب کند.
+-اگر ما به یک سردار امر کنیم مثل شب‌پره از این گل به آن گل بپرد یا قصه‌ی سوزناکی بنویسد یا به شکل مرغ دریایی در آید و او امریه را اجرا نکند کدام یکی‌مان مقصریم، ما یا او؟
+شهریار کوچولو نه گذاشت، نه برداشت، گفت: -شما.
+پادشاه گفت: -حرف ندارد. باید از هر کسی چیزی را توقع داشت که ازش ساخته باشد. قدرت باید پیش از هر چیز به عقل متکی باشد. اگر تو به ملتت فرمان بدهی که بروند خودشان را بیندازند تو دریا انقلاب می‌کنند. حق داریم توقع اطاعت داشته باشیم چون اوامرمان عاقلانه است.
+شهریار کوچولو که هیچ وقت چیزی را که پرسیده بود فراموش نمی‌کرد گفت: -غروب آفتاب من چی؟
+-تو هم به غروب آفتابت می‌رسی. امریه‌اش را صادر می‌کنیم. منتها با شَمِّ حکمرانی‌مان منتظریم زمینه‌اش فراهم بشود.
+شهریار کوچولو پرسید: -کِی فراهم می‌شود؟
+پادشاه بعد از آن که تقویم کَت و کلفتی را نگاه کرد جواب داد:
+-هوم! هوم! حدودِ... حدودِ... غروب. حدودِ ساعت هفت و چهل دقیقه... و آن وقت تو با چشم‌های خودت می‌بینی که چه‌طور فرمان ما اجرا می‌شود!
+
+شهریار کوچولو خمیازه کشید. از این که تماشای آفتاب غروب از کیسه‌اش رفته‌بود تاسف می‌خورد. از آن گذشته دلش هم کمی گرفته‌بود. این بود که به پادشاه گفت:
+-من دیگر این‌جا کاری ندارم. می‌خواهم بروم.
+شاه که دلش برای داشتن یک رعیت غنج می‌زد گفت:
+-نرو! نرو! وزیرت می‌کنیم.
+-وزیرِ چی؟
+-وزیرِ دادگستری!
+-آخر این جا کسی نیست که محاکمه بشود.
+پادشاه گفت: -معلوم نیست. ما که هنوز گشتی دور قلمرومان نزده‌ایم. خیلی پیر شده‌ایم، برای کالسکه جا نداریم. پیاده‌روی هم خسته‌مان می‌کند.
+شهریار کوچولو که خم شده‌بود تا نگاهی هم به آن طرف اخترک بیندازد گفت: -بَه! من نگاه کرده‌ام، آن طرف هم دیارالبشری نیست.
+پادشاه به‌اش جواب داد: -خب، پس خودت را محاکمه کن. این کار مشکل‌تر هم هست. محاکمه کردن خود از محاکمه‌کردن دیگران خیلی مشکل تر است. اگر توانستی در مورد خودت قضاوت درستی بکنی معلوم می‌شود یک فرزانه‌ی تمام عیاری.
+شهریار کوچولو گفت: -من هر جا باشم می‌توانم خودم را محاکمه کنم، چه احتیاجی است این جا بمانم؟ پادشاه گفت: -هوم! هوم! فکر می‌کنیم یک جایی تو اخترک ما یک موش پیر هست. صدایش را شب ها می‌شنویم. می‌توانی او را به محاکمه بکشی و گاه‌گاهی هم به اعدام محکومش کنی. در این صورت زندگی او به عدالت تو بستگی پیدا می‌کند. گیرم تو هر دفعه عفوش می‌کنی تا همیشه زیر چاق داشته باشیش. آخر یکی بیش‌تر نیست که.
+شهریار کوچولو جواب داد: -من از حکم اعدام خوشم نمی‌آید. فکر می‌کنم دیگر باید بروم.
+پادشاه گفت: -نه!
+
+اما شهریار کوچولو که آماده‌ی حرکت شده بود و ضمنا هم هیچ دلش نمی‌خواست اسباب ناراحتی سلطان پیر بشود گفت:
+-اگر اعلی‌حضرت مایلند اوامرشان دقیقا اجرا بشود می‌توانند فرمان خردمندانه‌ای در مورد بنده صادر بفرمایند. مثلا می‌توانند به بنده امر کنند ظرف یک دقیقه راه بیفتم. تصور می‌کنم زمینه‌اش هم آماده باشد...
+چون پادشاه جوابی نداد شهریار کوچولو اول دو دل ماند اما بعد آهی کشید و به راه افتاد.
+آن‌وقت پادشاه با شتاب فریاد زد: -سفیر خودمان فرمودیمت!
+حالت بسیار شکوهمندی داشت.
+
+شهریار کوچولو همان طور که می‌رفت تو دلش می‌گفت: -این آدم بزرگ‌ها راستی راستی چه‌قدر عجیبند!
+
+۱۱
+اخترک دوم مسکن آدم خود پسندی بود.
+خود پسند چشمش که به شهریار کوچولو افتاد از همان دور داد زد: -به‌به! این هم یک ستایشگر که دارد می‌آید مرا ببیند!
+
+خودپسند در سیاره‌اش
+آخر برای خودپسندها دیگران فقط یک مشت ستایش‌گرند.
+شهریار کوچولو گفت: -سلام! چه کلاه عجیب غریبی سرتان گذاشته‌اید!
+خود پسند جواب داد: -مال اظهار تشکر است. منظورم موقعی است که هلهله‌ی ستایشگرهایم بلند می‌شود. گیرم متاسفانه تنابنده‌ای گذارش به این طرف‌ها نمی‌افتد.
+شهریار کوچولو که چیزی حالیش نشده بود گفت:
+-چی؟
+خودپسند گفت: -دست‌هایت را بزن به هم دیگر.
+شهریار کوچولو دست زد و خودپسند کلاهش را برداشت و متواضعانه از او تشکر کرد.
+شهریار کوچولو با خودش گفت: «دیدنِ این تفریحش خیلی بیش‌تر از دیدنِ پادشاه‌است». و دوباره بنا کرد دست‌زدن و خودپسند با برداشتن کلاه بنا کرد تشکر کردن.
+
+پس از پنج دقیقه‌ای شهریار کوچولو که از این بازی یک‌نواخت خسته شده بود پرسید: -چه کار باید کرد که کلاه از سرت بیفتد؟
+اما خودپسند حرفش را نشنید. آخر آن‌ها جز ستایش خودشان چیزی را نمی‌شنوند.
+از شهریار کوچولو پرسید: -تو راستی راستی به من با چشم ستایش و تحسین نگاه می‌کنی؟
+-ستایش و تحسین یعنی چه؟
+-یعنی قبول این که من خوش‌قیافه‌ترین و خوش‌پوش‌ترین و ثروت‌مندترین و باهوش‌ترین مرد این اخترکم.
+-آخر روی این اخترک که فقط خودتی و کلاهت.
+-با وجود این ستایشم کن. این لطف را در حق من بکن.
+شهریار کوچولو نیم‌چه شانه‌ای بالا انداخت و گفت: -خب، ستایشت کردم. اما آخر واقعا چیِ این برایت جالب است؟
+
+شهریار کوچولو به راه افتاد و همان طور که می‌رفت تو دلش می‌گفت: -این آدم بزرگ‌ها راستی راستی چه‌قدر عجیبند!
+
+۱۲
+تو اخترک بعدی می‌خواره‌ای می‌نشست. دیدار کوتاه بود اما شهریار کوچولو را به غم بزرگی فرو برد.
+
+می‌خواره در سیاره‌اش
+
+به می‌خواره که صُم‌بُکم پشت یک مشت بطری خالی و یک مشت بطری پر نشسته بود گفت: -چه کار داری می‌کنی؟
+می‌خواره با لحن غم‌زده‌ای جواب داد: -مِی می‌زنم.
+شهریار کوچولو پرسید: -مِی می‌زنی که چی؟
+می‌خواره جواب داد: -که فراموش کنم.
+شهریار کوچولو که حالا دیگر دلش برای او می‌سوخت پرسید: -چی را فراموش کنی؟
+می‌خواره همان طور که سرش را می‌انداخت پایین گفت: -سر شکستگیم را.
+شهریار کوچولو که دلش می‌خواست دردی از او دوا کند پرسید: -سرشکستگی از چی؟
+می‌خواره جواب داد: -سرشکستگیِ می‌خواره بودنم را.
+این را گفت و قال را کند و به کلی خاموش شد. و شهریار کوچولو مات و مبهوت راهش را گرفت و رفت و همان جور که می‌رفت تو دلش می‌گفت: -این آدم بزرگ‌ها راستی‌راستی چه‌قدر عجیبند!
+
+۱۳
+اخترک چهارم اخترک مرد تجارت‌پیشه بود. این بابا چنان مشغول و گرفتار بود که با ورود شهریار کوچولو حتا سرش را هم بلند نکرد.
+
+مردِ تجارت‌پیشه در سیاره‌اش
+شهریار کوچولو گفت: -سلام. آتش‌سیگارتان خاموش شده.
+-سه و دو می‌کند پنج. پنج و هفت دوازده و سه پانزده. سلام. پانزده و هفت بیست و دو. بیست و دو و شش بیست و هشت. وقت ندارم روشنش کنم. بیست و شش و پنج سی و یک. اوف! پس جمعش می‌کند پانصدویک میلیون و ششصد و بیست و دو هزار هفتصد و سی و یک.
+-پانصد میلیون چی؟
+-ها؟ هنوز این جایی تو؟ پانصد و یک میلیون چیز. چه می‌دانم، آن قدر کار سرم ریخته که!... من یک مرد جدی هستم و با حرف‌های هشت‌من‌نه‌شاهی سر و کار ندارم!... دو و پنج هفت...
+شهریار کوچولو که وقتی چیزی می‌پرسید دیگر تا جوابش را نمی‌گرفت دست بردار نبود دوباره پرسید:
+-پانصد و یک میلیون چی؟
+تاجر پیشه سرش را بلند کرد:
+-تو این پنجاه و چهار سالی که ساکن این اخترکم همه‌اش سه بار گرفتار مودماغ شده‌ام. اولیش بیست و دو سال پیش یک سوسک بود که خدا می‌داند از کدام جهنم پیدایش شد. صدای وحشت‌ناکی از خودش در می‌آورد که باعث شد تو یک جمع چهار جا اشتباه کنم. دفعه‌ی دوم یازده سال پیش بود که استخوان درد بی‌چاره‌ام کرد. من ورزش نمی‌کنم. وقت یللی‌تللی هم ندارم. آدمی هستم جدی... این هم بار سومش!... کجا بودم؟ پانصد و یک میلیون و...
+-این همه میلیون چی؟
+تاجرپیشه فهمید که نباید امید خلاصی داشته باشد. گفت: -میلیون‌ها از این چیزهای کوچولویی که پاره‌ای وقت‌ها تو هوا دیده می‌شود.
+-مگس؟
+-نه بابا. این چیزهای کوچولوی براق.
+-زنبور عسل؟
+-نه بابا! همین چیزهای کوچولوی طلایی که وِلِنگارها را به عالم هپروت می‌برد. گیرم من شخصا آدمی هستم جدی که وقتم را صرف خیال‌بافی نمی‌کنم.
+-آها، ستاره؟
+-خودش است: ستاره.
+-خب پانصد میلیون ستاره به چه دردت می‌خورد؟
+-پانصد و یک میلیون و ششصد و بیست و دو هزار و هفتصد و سی و یکی. من جدیّم و دقیق.
+-خب، به چه دردت می‌خورند؟
+-به چه دردم می‌خورند؟
+-ها.
+-هیچی تصاحب‌شان می‌کنم.
+-ستاره‌ها را؟
+-آره خب.
+-آخر من به یک پادشاهی برخوردم که...
+-پادشاه‌ها تصاحب نمی‌کنند بل‌که به‌اش «سلطنت» می‌کنند. این دو تا با هم خیلی فرق دارد.
+-خب، حالا تو آن‌ها را تصاحب می‌کنی که چی بشود؟
+-که دارا بشوم.
+-خب دارا شدن به چه کارت می‌خورد؟
+-به این کار که، اگر کسی ستاره‌ای پیدا کرد من ازش بخرم.
+شهریار کوچولو با خودش گفت: «این بابا هم منطقش یک خرده به منطق آن دائم‌الخمره می‌بَرَد.» با وجود این باز ازش پرسید:
+-چه جوری می‌شود یک ستاره را صاحب شد؟
+تاجرپیشه بی درنگ با اَخم و تَخم پرسید: -این ستاره‌ها مال کی‌اند؟
+-چه می‌دانم؟ مال هیچ کس.
+-پس مال منند، چون من اول به این فکر افتادم.
+-همین کافی است؟
+-البته که کافی است. اگر تو یک جواهر پیدا کنی که مال هیچ کس نباشد می‌شود مال تو. اگر جزیره‌ای کشف کنی که مال هیچ کس نباشد می‌شود مال تو. اگر فکری به کله‌ات بزند که تا آن موقع به سر کسی نزده به اسم خودت ثبتش می‌کنی و می‌شود مال تو. من هم ستاره‌ها را برای این صاحب شده‌ام که پیش از من هیچ کس به فکر نیفتاده بود آن‌ها را مالک بشود.
+شهریار کوچولو گفت: -این ها همه‌اش درست. منتها چه کارشان می‌کنی؟
+تاجر پیشه گفت: -اداره‌شان می‌کنم، همین جور می‌شمارم‌شان و می‌شمارم‌شان. البته کار مشکلی است ولی خب دیگر، من آدمی هستم بسیار جدی.
+شهریار کوچولو که هنوز این حرف تو کَتَش نرفته‌بود گفت:
+-اگر من یک شال گردن ابریشمی داشته باشم می‌توانم بپیچم دور گردنم با خودم ببرمش. اگر یک گل داشته باشم می‌توانم بچینم با خودم ببرمش. اما تو که نمی‌توانی ستاره‌ها را بچینی!
+-نه. اما می‌توانم بگذارم‌شان تو بانک.
+-اینی که گفتی یعنی چه؟
+-یعنی این که تعداد ستاره‌هایم را رو یک تکه کاغذ می‌نویسم می‌گذارم تو کشو درش را قفل می‌کنم.
+-همه‌اش همین؟
+-آره همین کافی است.
+
+شهریار کوچولو فکر کرد «جالب است. یک خرده هم شاعرانه است. اما کاری نیست که آن قدرها جدیش بشود گرفت». آخر تعبیر او از چیزهای جدی با تعبیر آدم‌های بزرگ فرق می‌کرد.
+باز گفت: -من یک گل دارم که هر روز آبش می‌دهم. سه تا هم آتش‌فشان دارم که هفته‌ای یک بار پاک و دوده‌گیری‌شان می‌کنم. آخر آتش‌فشان خاموشه را هم پاک می‌کنم. آدم کفِ دستش را که بو نکرده! رو این حساب، هم برای آتش‌فشان‌ها و هم برای گل این که من صاحب‌شان باشم فایده دارد. تو چه فایده‌ای به حال ستاره‌ها داری؟
+
+تاجرپیشه دهن باز کرد که جوابی بدهد اما چیزی پیدا نکرد. و شهریار کوچولو راهش را گرفت و رفت و همان جور که می‌رفت تو دلش می‌گفت: -این آدم بزرگ‌ها راستی راستی چه‌قدر عجیبند!
+
+۱۴
+اخترکِ پنجم چیز غریبی بود. از همه‌ی اخترک‌های دیگر کوچک‌تر بود، یعنی فقط به اندازه‌ی یک فانوس پایه‌دار و یک فانوس‌بان جا داشت.
+
+فانوس‌بان در حالِ روشن کردنِ فانوس در سیاره‌اش
+شهریار کوچولو از این راز سر در نیاورد که یک جا میان آسمان خدا تو اخترکی که نه خانه‌ای روش هست نه آدمی، حکمت وجودی یک فانوس و یک فانوس‌بان چه می‌تواند باشد. با وجود این تو دلش گفت:
+-خیلی احتمال دارد که این بابا عقلش پاره‌سنگ ببرد. اما به هر حال از پادشاه و خودپسند و تاجرپیشه و مسته کم عقل‌تر نیست. دست کم کاری که می‌کند یک معنایی دارد. فانوسش را که روشن می‌کند عین‌هو مثل این است که یک ستاره‌ی دیگر یا یک گل به دنیا می‌آورد و خاموشش که می‌کند پنداری گل یا ستاره‌ای را می‌خواباند. سرگرمی زیبایی است و چیزی که زیبا باشد بی گفت‌وگو مفید هم هست.
+
+وقتی رو اخترک پایین آمد با ادب فراوان به فانوس‌بان سلام کرد:
+-سلام. واسه چی فانوس را خاموش کردی؟
+-دستور است. صبح به خیر!
+-دستور چیه؟
+-این است که فانوسم را خاموش کنم. شب خوش!
+و دوباره فانوس را روشن کرد.
+-پس چرا روشنش کردی باز؟
+فانوس‌بان جواب داد: -خب دستور است دیگر.
+شهریار کوچولو گفت: -اصلا سر در نمیارم.
+فانوس‌بان گفت: -چیز سر در آوردنی‌یی توش نیست که. دستور دستور است. روز بخیر!
+و باز فانوس را خاموش کرد.
+بعد با دستمال شطرنجی قرمزی عرق پیشانیش را خشکاند و گفت:
+-کار جان‌فرسایی دارم. پیش‌تر ها معقول بود: صبح خاموشش می‌کردم و شب که می‌شد روشنش می‌کردم. باقی روز را فرصت داشتم که استراحت کنم و باقی شب را هم می‌توانستم بگیرم بخوابم...
+-بعدش دستور عوض شد؟
+فانوس‌بان گفت: -دستور عوض نشد و بدبختی من هم از همین جاست: سیاره سال به سال گردشش تندتر و تندتر شده اما دستور همان جور به قوت خودش باقی مانده است.
+-خب؟
+-حالا که سیاره دقیقه‌ای یک بار دور خودش می‌گردد دیگر من یک ثانیه هم فرصت استراحت ندارم: دقیقه‌ای یک بار فانوس را روشن می‌کنم یک بار خاموش.
+-چه عجیب است! تو اخترک تو شبانه روز همه‌اش یک دقیقه طول می‌کشد!
+فانوس‌بان گفت: -هیچ هم عجیب نیست. الان یک ماه تمام است که ما داریم با هم اختلاط می‌کنیم.
+-یک ماه؟
+-آره. سی دقیقه. سی روز! شب خوش!
+و دوباره فانوس را روشن کرد.
+
+شهریار کوچولو به فانوس‌بان نگاه کرد و حس کرد این مرد را که تا این حد به دستور وفادار است دوست می‌دارد. یادِ آفتاب‌غروب‌هایی افتاد که آن وقت‌ها خودش با جابه‌جا کردن صندلیش دنبال می‌کرد. برای این که دستی زیر بال دوستش کرده باشد گفت:
+-می‌دانی؟ یک راهی بلدم که می‌توانی هر وقت دلت بخواهد استراحت کنی.
+فانوس‌بان گفت: -آرزوش را دارم.
+آخر آدم می‌تواند هم به دستور وفادار بماند هم تنبلی کند.
+شهریار کوچولو دنبال حرفش را گرفت و گفت:
+-تو، اخترکت آن‌قدر کوچولوست که با سه تا شلنگ برداشتن می‌توانی یک بار دور بزنیش. اگر آن اندازه که لازم است یواش راه بروی می‌توانی کاری کنی که مدام تو آفتاب بمانی. پس هر وقت خواستی استراحت کنی شروع می‌کنی به راه‌رفتن... به این ترتیب روز هرقدر که بخواهی برایت کِش می‌آید.
+فانوس‌بان گفت: -این کار گرهی از بدبختی من وا نمی‌کند. تنها چیزی که تو زندگی آرزویش را دارم یک چرت خواب است.
+شهریار کوچولو گفت: -این یکی را دیگر باید بگذاری در کوزه.
+فانوس‌بان گفت: -آره. باید بگذارمش در کوزه... صبح بخیر!
+و فانوس را خاموش کرد.
+
+شهریار کوچولو میان راه با خودش گفت: گرچه آن‌های دیگر، یعنی خودپسنده و تاجره اگر این را می‌دیدند دستش می‌انداختند و تحقیرش می‌کردند، هر چه نباشد کار این یکی به نظر من کم‌تر از کار آن‌ها بی‌معنی و مضحک است. شاید به خاطر این که دست کم این یکی به چیزی جز خودش مشغول است.
+
+از حسرت آهی کشید و همان طور با خودش گفت:
+-این تنها کسی بود که من می‌توانستم باش دوست بشوم. گیرم اخترکش راستی راستی خیلی کوچولو است و دو نفر روش جا نمی‌گیرند.
+
+چیزی که جرات اعترافش را نداشت حسرت او بود به این اخترک کوچولویی که، بخصوص، به هزار و چهارصد و چهل بار غروب آفتاب در هر بیست و چهار ساعت برکت پیدا کرده بود.
+
+۱۵
+اخترک ششم اخترکی بود ده بار فراخ‌تر، و آقاپیره‌ای توش بود که کتاب‌های کَت‌وکلفت می‌نوشت.
+
+جغرافی‌دان در سیاره‌اش
+همین که چشمش به شهریار کوچولو افتاد با خودش گفت:
+-خب، این هم یک کاشف!
+شهریار کوچولو لب میز نشست و نفس نفس زد. نه این که راه زیادی طی کرده بود؟
+آقا پیره به‌اش گفت: -از کجا می‌آیی؟
+شهریار کوچولو گفت: -این کتاب به این کلفتی چی است؟ شما این‌جا چه‌کار می‌کنید؟
+آقا پیره گفت: -من جغرافی‌دانم.
+-جغرافی‌دان چه باشد؟
+-جغرافی‌دان به دانشمندی می‌گویند که جای دریاها و رودخانه‌ها و شهرها و کوه‌ها و بیابان‌ها را می‌داند.
+شهریار کوچولو گفت: -محشر است. یک کار درست و حسابی است.
+و به اخترک جغرافی‌دان، این سو و آن‌سو نگاهی انداخت. تا آن وقت اخترکی به این عظمت ندیده‌بود.
+-اخترک‌تان خیلی قشنگ است. اقیانوس هم دارد؟
+جغرافی‌دان گفت: -از کجا بدانم؟
+شهریار کوچولو گفت: -عجب! (بد جوری جا خورده بود) کوه چه‌طور؟
+جغرافی‌دان گفت: -از کجا بدانم؟
+-شهر، رودخانه، بیابان؟
+جغرافی‌دان گفت: از این‌ها هم خبری ندارم.
+-آخر شما جغرافی‌دانید؟
+جغرافی‌دان گفت: -درست است ولی کاشف که نیستم. من حتا یک نفر کاشف هم ندارم. کار جغرافی‌دان نیست که دوره‌بیفتد برود شهرها و رودخانه‌ها و کوه‌ها و دریاها و اقیانوس‌ها و بیابان‌ها را بشمرد. مقام جغرافی‌دان برتر از آن است که دوره بیفتد و ول‌بگردد. اصلا از اتاق کارش پا بیرون نمی‌گذارد بلکه کاشف‌ها را آن تو می‌پذیرد ازشان سوالات می‌کند و از خاطرات‌شان یادداشت بر می‌دارد و اگر خاطرات یکی از آن‌ها به نظرش جالب آمد دستور می‌دهد روی خُلقیات آن کاشف تحقیقاتی صورت بگیرد.
+-برای چه؟
+-برای این که اگر کاشفی گنده‌گو باشد کار کتاب‌های جغرافیا را به فاجعه می‌کشاند. هکذا کاشفی که اهل پیاله باشد.
+-آن دیگر چرا؟
+b-چون آدم‌های دائم‌الخمر همه چیز را دوتا می‌بینند. آن وقت جغرافی‌دان برمی‌دارد جایی که یک کوه
+بیشتر نیست می‌نویسد دو کوه.
+شهریار کوچولو گفت: -پس من یک بابایی را می‌شناسم که کاشف هجوی از آب در می‌آید.
+-بعید نیست. بنابراین، بعد از آن که کاملا ثابت شد پالان کاشف کج نیست تحقیقاتی هم روی کشفی که کرده انجام می‌گیرد.
+-یعنی می‌روند می‌بینند؟
+-نه، این کار گرفتاریش زیاد است. از خود کاشف می‌خواهند دلیل بیاورد. مثلا اگر پای کشف یک کوه بزرگ در میان بود ازش می‌خواهند سنگ‌های گنده‌ای از آن کوه رو کند.
+جغرافی‌دان ناگهان به هیجان در آمد و گفت: -راستی تو داری از راه دوری می‌آیی! تو کاشفی! باید چند و چون اخترکت را برای من بگویی.
+و با این حرف دفتر و دستکش را باز کرد و مدادش را تراشید. معمولا خاطرات کاشف‌ها را اول بامداد یادداشت می‌کنند و دست نگه می‌دارند تا دلیل اقامه کند، آن وقت با جوهر می‌نویسند.
+گفت: -خب؟
+شهریار کوچولو گفت: -اخترک من چیز چندان جالبی ندارد. آخر خیلی کوچک است. سه تا آتش‌فشان دارم که دوتاش فعال است یکیش خاموش. اما، خب دیگر، آدم کف دستش را که بو نکرده.
+جغرافی‌دان هم گفت: -آدم چه می‌داند چه پیش می‌آید.
+-یک گل هم دارم.
+-نه، نه، ما دیگر گل ها را یادداشت نمی‌کنیم.
+-چرا؟ گل که زیباتر است.
+-برای این که گل‌ها فانی‌اند.
+-فانی یعنی چی؟
+جغرافی‌دان گفت: -کتاب‌های جغرافیا از کتاب‌های دیگر گران‌بهاترست و هیچ وقت هم از اعتبار نمی‌افتد. بسیار به ندرت ممکن است یک کوه جا عوض کند. بسیار به ندرت ممکن است آب یک اقیانوس خالی شود. ما فقط چیزهای پایدار را می‌نویسیم.
+شهریار کوچولو تو حرف او دوید و گفت: -اما آتش‌فشان‌های خاموش می‌توانند از نو بیدار بشوند. فانی را نگفتید یعنی چه؟
+جغرافی‌دان گفت: -آتش‌فشان چه روشن باشد چه خاموش برای ما فرقی نمی‌کند. آن‌چه به حساب می‌آید خود کوه است که تغییر پیدا نمی‌کند.
+شهریار کوچولو که تو تمام عمرش وقتی چیزی از کسی می‌پرسید دیگر دست بردار نبود دوباره سوال کرد: -فانی یعنی چه؟
+-یعنی چیزی که در آینده تهدید به نابودی شود.
+-گل من هم در آینده نابود می‌شود؟
+-البته که می‌شود.
+شهریار کوچولو در دل گفت: «گل من فانی است و جلو دنیا برای دفاع از خودش جز چهارتا خار هیچی ندارد، و آن وقت مرا بگو که او را توی اخترکم تک و تنها رها کرده‌ام!»
+این اولین باری بود که دچار پریشانی و اندوه می‌شد اما توانست به خودش مسلط بشود. پرسید: -شما به من دیدن کجا را توصیه می‌کنید؟
+جغرافی‌دان به‌اش جواب داد: -سیاره‌ی زمین. شهرت خوبی دارد...
+
+و شهریار کوچولو هم چنان که به گلش فکر می‌کرد به راه افتاد.
+
+۱۶
+لاجرم، زمین، سیاره‌ی هفتم شد.
+
+زمین، فلان و بهمان سیاره نیست. رو پهنه‌ی زمین یک‌صد و یازده پادشاه (البته بامحاسبه‌ی پادشاهان سیاه‌پوست)، هفت هزار جغرافی‌دان، نه‌صد هزار تاجرپیشه، پانزده کرور می‌خواره و شش‌صد و بیست و دو کرور خودپسند و به عبارت دیگر حدود دو میلیارد آدم بزرگ زندگی می‌کند. برای آن‌که از حجم زمین مقیاسی به دست‌تان بدهم بگذارید به‌تان بگویم که پیش از اختراع برق مجبور بودند در مجموع شش قاره‌ی زمین وسایل زندگیِ لشکری جانانه شامل یکصد و شصت و دو هزار و پانصد و یازده نفر فانوس‌بان را تامین کنند.
+
+روشن شدن فانوس‌ها از دور خیلی باشکوه بود. حرکات این لشکر مثل حرکات یک باله‌ی تو اپرا مرتب و منظم بود. اول از همه نوبت فانوس‌بان‌های زلاندنو و استرالیا بود. این‌ها که فانوس‌هاشان را روشن می‌کردند، می‌رفتند می‌گرفتند می‌خوابیدند آن وقت نوبت فانوس‌بان‌های چین و سیبری می‌رسید که به رقص درآیند. بعد، این‌ها با تردستی تمام به پشت صحنه می‌خزیدند و جا را برای فانوس‌بان‌های ترکیه و هفت پَرکَنِه‌ی هند خالی می کردند. بعد نوبت به فانوس‌بان‌های آمریکای‌جنوبی می‌شد. و آخر سر هم نوبت فانوس‌بان‌های افریقا و اروپا می‌رسد و بعد نوبت فانوس‌بان‌های آمریکای شمالی بود. و هیچ وقتِ خدا هم هیچ‌کدام این‌ها در ترتیب ورودشان به صحنه دچار اشتباه نمی‌شدند. چه شکوهی داشت! میان این جمع عظیم فقط نگه‌بانِ تنها فانوسِ قطب شمال و همکارش نگه‌بانِ تنها فانوسِ قطب جنوب بودند که عمری به بطالت و بی‌هودگی می‌گذراندند: آخر آن‌ها سالی به سالی همه‌اش دو بار کار می‌کردند.
+
+۱۷
+آدمی که اهل اظهار لحیه باشد بفهمی نفهمی می‌افتد به چاخان کردن. من هم تو تعریف قضیه‌ی فانوس‌بان‌ها برای شما آن‌قدرهاروراست نبودم. می‌ترسم به آن‌هایی که زمین ما را نمی‌سناسند تصور نادرستی داده باشم. انسان‌ها رو پهنه‌ی زمین جای خیلی کمی را اشغال می‌کنند. اگر همه‌ی دو میلیارد نفری که رو کره‌ی زمین زندگی می‌کنند بلند بشوند و مثل موقعی که به تظاهرات می‌روند یک خورده جمع و جور بایستند راحت و بی‌درپسر تو میدانی به مساحت بیست میل در بیست میل جا می‌گیرند. همه‌ی جامعه‌ی بشری را می‌شود یک‌جا روی کوچک‌ترین جزیره‌ی اقیانوس آرام کُپه کرد.
+
+البته گفت‌وگو ندارد که آدم بزرگ‌ها حرف‌تان را باور نمی‌کنند. آخر تصور آن‌ها این است که کلی جا اشغال کرده‌اند، نه این‌که مثل بائوباب‌ها خودشان را خیلی مهم می‌بینند؟ بنابراین به‌شان پیش‌نهاد می‌کنید که بنشینند حساب کنند. آن‌ها هم که عاشق اعداد و ارقامند، پس این پیش‌نهاد حسابی کیفورشان می‌کند. اما شما را به خدا بی‌خودی وقت خودتان را سر این جریمه‌ی مدرسه به هدر ندهید. این کار دو قاز هم نمی‌ارزد. به من که اطمینان دارید. شهریار کوچولو پاش که به زمین رسید از این که دیارالبشری دیده نمی‌شد سخت هاج و واج ماند.
+
+شهریار کوچولو وسطِ کویر
+تازه داشت از این فکر که شاید سیاره را عوضی گرفته ترسش بر می‌داشت که چنبره‌ی مهتابی رنگی رو ماسه‌ها جابه‌جا شد.شهریار کوچولو و مار
+شهریار کوچولو همین‌جوری سلام کرد.
+مار گفت: -سلام.
+شهریار کوچولو پرسید: -رو چه سیاره‌ای پایین آمده‌ام؟
+مار جواب داد: -رو زمین تو قاره‌ی آفریقا.
+-عجب! پس رو زمین انسان به هم نمی‌رسد؟
+مار گفت: -این‌جا کویر است. تو کویر کسی زندگی نمی‌کند. زمین بسیار وسیع است.
+شهریار کوچولو رو سنگی نشست و به آسمان نگاه کرد. گفت: -به خودم می‌گویم ستاره‌ها واسه این روشنند که هرکسی بتواند یک روز مال خودش را پیدا کند!... اخترک مرا نگاه! درست بالا سرمان است... اما چه‌قدر دور است!
+مار گفت: -قشنگ است. این‌جا آمده‌ای چه کار؟
+شهریار کوچولو گفت: -با یک گل بگومگویم شده.
+مار گفت: -عجب!
+و هر دوشان خاموش ماندند.
+دست آخر شهریار کوچولو درآمد که: -آدم‌ها کجاند؟ آدم تو کویر یک خرده احساس تنهایی می‌کند.
+مار گفت: -پیش آدم‌ها هم احساس تنهایی می‌کنی.
+شهریار کوچولو مدت درازی تو نخ او رفت و آخر سر به‌اش گفت: -تو چه جانور بامزه‌ای هستی! مثل یک انگشت، باریکی.
+مار گفت: -عوضش از انگشت هر پادشاهی مقتدرترم.
+شهریار کوچولو لب‌خندی زد و گفت: -نه چندان... پا هم که نداری. حتا راه هم نمی‌تونی بری...
+-من می‌تونم تو را به چنان جای دوری ببرم که با هیچ کشتی‌یی هم نتونی بری.
+مار این را گفت و دور قوزک پای شهریار کوچولو پیچید. عین یک خلخال طلا. و باز درآمد که: -هر کسی را لمس کنم به خاکی که ازش درآمده بر می‌گردانم اما تو پاکی و از یک سیّاره‌ی دیگر آمده‌ای...
+شهریار کوچولو جوابی بش نداد.
+-تو رو این زمین خارایی آن‌قدر ضعیفی که به حالت رحمم می‌آید. روزی‌روزگاری اگر دلت خیلی هوای اخترکت را کرد بیا من کمکت کنم... من می‌توانم...
+شهریار کوچولو گفت: -آره تا تهش را خواندم. اما راستی تو چرا همه‌ی حرف‌هایت را به صورت معما درمی‌آری؟
+
+مار گفت: -حلّال همه‌ی معماهام من.
+و هر دوشان خاموش شدند.
+
+۱۸
+شهریار کوچولو کویر را از پاشنه درکرد و جز یک گل به هیچی برنخورد: یک گل سه گل‌برگه. یک گلِ ناچیز.
+
+یک گُل وسطِ کویر
+
+شهریار کوچولو گفت: -سلام.
+گل گفت: -سلام.
+شهریار کوچولو با ادب پرسید: -آدم‌ها کجاند؟
+گل روزی روزگاری عبور کاروانی را دیده‌بود. این بود که گفت: -آدم‌ها؟ گمان کنم ازشان شش هفت تایی باشد. سال‌ها پیش دیدم‌شان. منتها خدا می‌داند کجا می‌شود پیداشان کرد. باد این‌ور و آن‌ور می‌بَرَدشان؛ نه این که ریشه ندارند؟ بی‌ریشگی هم حسابی اسباب دردسرشان شده.
+شهریار کوچولو گفت: -خداحافظ.
+گل گفت: -خداحافظ.
+
+۱۹
+از کوه بلندی بالا رفت.
+
+شهریار کوچولو بر قله‌ی کوهِ بلند
+تنها کوه‌هایی که به عمرش دیده بود سه تا آتش‌فشان‌های اخترک خودش بود که تا سر زانویش می‌رسید و از آن یکی که خاموش بود جای چارپایه استفاده می‌کرد. این بود که با خودش گفت: «از سر یک کوه به این بلندی می‌توانم به یک نظر همه‌ی سیاره و همه‌ی آدم‌ها را ببینم...» اما جز نوکِ تیزِ صخره‌های نوک‌تیز چیزی ندید.
+همین جوری گفت: -سلام.
+طنین به‌اش جواب داد: -سلام... سلام... سلام...
+شهریار کوچولو گفت: -کی هستید شما؟
+طنین به‌اش جواب داد: -کی هستید شما... کی هستید شما... کی هستید شما...
+گفت: -با من دوست بشوید. من تک و تنهام.
+طنین به‌اش جواب داد: -من تک و تنهام... من تک و تنهام... من تک و تنهام...
+آن‌وقت با خودش فکر کرد: «چه سیاره‌ی عجیبی! خشک‌ِخشک و تیزِتیز و شورِشور. این آدم‌هاش که یک ذره قوه‌ی تخیل ندارند و هر چه را بشنوند عینا تکرار می‌کنند... تو اخترک خودم گلی داشتم که همیشه اول او حرف می‌زد...»
+
+۲۰
+اما سرانجام، بعد از مدت‌ها راه رفتن از میان ریگ‌ها و صخره‌ها و برف‌ها به جاده‌ای برخورد. و هر جاده‌ای یک‌راست می‌رود سراغ آدم‌ها.
+گفت: -سلام.
+و مخاطبش گلستان پرگلی بود.
+
+شهریار کوچولو در گلستانِ پرگل
+
+گل‌ها گفتند: -سلام.
+شهریار کوچولو رفت تو بحرشان. همه‌شان عین گل خودش بودند. حیرت‌زده ازشان پرسید: -شماها کی هستید؟
+گفتند: -ما گل سرخیم.
+
+آهی کشید و سخت احساس شوربختی کرد. گلش به او گفته بود که از نوع او تو تمام عالم فقط همان یکی هست و حالا پنج‌هزارتا گل، همه مثل هم، فقط تو یک گلستان! فکر کرد: «اگر گل من این را می‌دید بدجور از رو می‌رفت. پشت سر هم بنا می‌کرد سرفه‌کردن و، برای این‌که از هُوشدن نجات پیدا کند خودش را به مردن می‌زد و من هم مجبور می‌شدم وانمود کنم به پرستاریش، وگرنه برای سرشکسته کردنِ من هم شده بود راستی راستی می‌مرد...» و باز تو دلش گفت: «مرا باش که فقط بایک دانه گل خودم را دولت‌مندِ عالم خیال می‌کردم در صورتی‌که آن‌چه دارم فقط یک گل معمولی است. با آن گل و آن سه تا آتش‌فشان که تا سرِ زانومَند و شاید هم یکی‌شان تا ابد خاموش بماند شهریارِ چندان پُرشوکتی به حساب نمی‌آیم.»
+
+شهریار کوچولو در حالِ احساسِ شوربختی
+رو سبزه‌ها دراز شد و حالا گریه نکن کی گریه‌کن.
+
+۲۱
+آن وقت بود که سر و کله‌ی روباه پیدا شد.
+
+شهریار کوچولو و روباه
+
+روباه گفت: -سلام.
+شهریار کوچولو برگشت اما کسی را ندید. با وجود این با ادب تمام گفت: -سلام.
+صداگفت: -من این‌جام، زیر درخت سیب...
+شهریار کوچولو گفت: -کی هستی تو؟ عجب خوشگلی!
+روباه گفت: -یک روباهم من.
+شهریار کوچولو گفت: -بیا با من بازی کن. نمی‌دانی چه قدر دلم گرفته...
+روباه گفت: -نمی‌توانم بات بازی کنم. هنوز اهلیم نکرده‌اند آخر.
+شهریار کوچولو آهی کشید و گفت: -معذرت می‌خواهم.
+اما فکری کرد و پرسید: -اهلی کردن یعنی چه؟
+روباه گفت: -تو اهل این‌جا نیستی. پی چی می‌گردی؟
+شهریار کوچولو گفت: -پی آدم‌ها می‌گردم. نگفتی اهلی کردن یعنی چه؟
+روباه گفت: -آدم‌ها تفنگ دارند و شکار می‌کنند. اینش اسباب دلخوری است! اما مرغ و ماکیان هم پرورش می‌دهند و خیرشان فقط همین است. تو پی مرغ می‌کردی؟
+شهریار کوچولو گفت: -نَه، پیِ دوست می‌گردم. اهلی کردن یعنی چی؟
+روباه گفت: -یک چیزی است که پاک فراموش شده. معنیش ایجاد علاقه کردن است.
+-ایجاد علاقه کردن؟
+روباه گفت: -معلوم است. تو الان واسه من یک پسر بچه‌ای مثل صد هزار پسر بچه‌ی دیگر. نه من هیچ احتیاجی به تو دارم نه تو هیچ احتیاجی به من. من هم واسه تو یک روباهم مثل صد هزار روباه دیگر. اما اگر منو اهلی کردی هر دوتامان به هم احتیاج پیدا می‌کنیم. تو واسه من میان همه‌ی عالم موجود یگانه‌ای می‌شوی من واسه تو.
+شهریار کوچولو گفت: -کم‌کم دارد دستگیرم می‌شود. یک گلی هست که گمانم مرا اهلی کرده باشد.
+روباه گفت: -بعید نیست. رو این کره‌ی زمین هزار جور چیز می‌شود دید.
+شهریار کوچولو گفت: -اوه نه! آن رو کره‌ی زمین نیست.
+روباه که انگار حسابی حیرت کرده بود گفت: -رو یک سیاره‌ی دیگر است؟
+-آره.
+شکارچی-تو آن سیاره شکارچی هم هست؟
+-نه.
+-محشر است! مرغ و ماکیان چه‌طور؟
+-نه.
+روباه آه‌کشان گفت: -همیشه‌ی خدا یک پای بساط لنگ است!
+اما پی حرفش را گرفت و گفت: -زندگی یک‌نواختی دارم. من مرغ‌ها را شکار می‌کنم آدم‌ها مرا. همه‌ی مرغ‌ها عین همند همه‌ی آدم‌ها هم عین همند. این وضع یک خرده خلقم را تنگ می‌کند. اما اگر تو منو اهلی کنی انگار که زندگیم را چراغان کرده باشی. آن وقت صدای پایی را می‌شناسم که باهر صدای پای دیگر فرق می‌کند: صدای پای دیگران مرا وادار می‌کند تو هفت تا سوراخ قایم بشوم اما صدای پای تو مثل نغمه‌ای مرا از سوراخم می‌کشد بیرون. تازه، نگاه کن آن‌جا آن گندم‌زار را می‌بینی؟ برای من که نان بخور نیستم گندم چیز بی‌فایده‌ای است. پس گندم‌زار هم مرا به یاد چیزی نمی‌اندازد. اسباب تاسف است. اما تو موهات رنگ طلا است. پس وقتی اهلیم کردی محشر می‌شود! گندم که طلایی رنگ است مرا به یاد تو می‌اندازد و صدای باد را هم که تو گندم‌زار می‌پیچد دوست خواهم داشت...
+خاموش شد و مدت درازی شهریار کوچولو را نگاه کرد. آن وقت گفت: -اگر دلت می‌خواهد منو اهلی کن!
+شهریار کوچولو جواب داد: -دلم که خیلی می‌خواهد، اما وقتِ چندانی ندارم. باید بروم دوستانی پیدا کنم و از کلی چیزها سر در آرم.
+روباه گفت: -آدم فقط از چیزهایی که اهلی کند می‌تواند سر در آرد. انسان‌ها دیگر برای سر در آوردن از چیزها وقت ندارند. همه چیز را همین جور حاضر آماده از دکان‌ها می‌خرند. اما چون دکانی نیست که دوست معامله کند آدم‌ها مانده‌اند بی‌دوست... تو اگر دوست می‌خواهی خب منو اهلی کن!
+شهریار کوچولو پرسید: -راهش چیست؟
+روباه جواب داد: -باید خیلی خیلی حوصله کنی. اولش یک خرده دورتر از من می‌گیری این جوری میان علف‌ها می‌نشینی. من زیر چشمی نگاهت می‌کنم و تو لام‌تاکام هیچی نمی‌گویی، چون تقصیر همه‌ی سؤِتفاهم‌ها زیر سر زبان است. عوضش می‌توانی هر روز یک خرده نزدیک‌تر بنشینی.
+
+روباه در حالِ انتظارفردای آن روز دوباره شهریار کوچولو آمد.
+روباه گفت: -کاش سر همان ساعت دیروز آمده بودی. اگر مثلا سر ساعت چهار بعد از ظهر بیایی من از ساعت سه تو دلم قند آب می‌شود و هر چه ساعت جلوتر برود بیش‌تر احساس شادی و خوشبختی می‌کنم. ساعت چهار که شد دلم بنا می‌کند شور زدن و نگران شدن. آن وقت است که قدرِ خوشبختی را می‌فهمم! اما اگر تو وقت و بی وقت بیایی من از کجا بدانم چه ساعتی باید دلم را برای دیدارت آماده کنم؟... هر چیزی برای خودش قاعده‌ای دارد.
+شهریار کوچولو گفت: -قاعده یعنی چه؟
+روباه گفت: -این هم از آن چیزهایی است که پاک از خاطرها رفته. این همان چیزی است که باعث می‌شود فلان روز با باقی روزها و فلان ساعت با باقی ساعت‌ها فرق کند. مثلا شکارچی‌های ما میان خودشان رسمی دارند و آن این است که پنج‌شنبه‌ها را با دخترهای ده می‌روند رقص. پس پنج‌شنبه‌ها بَرّه‌کشانِ من است: برای خودم گردش‌کنان می‌روم تا دم مُوِستان. حالا اگر شکارچی‌ها وقت و بی وقت می‌رقصیدند همه‌ی روزها شبیه هم می‌شد و منِ بیچاره دیگر فرصت و فراغتی نداشتم.
+
+به این ترتیب شهریار کوچولو روباه را اهلی کرد.
+لحظه‌ی جدایی که نزدیک شد روباه گفت: -آخ! نمی‌توانم جلو اشکم را بگیرم.
+شهریار کوچولو گفت: -تقصیر خودت است. من که بدت را نمی‌خواستم، خودت خواستی اهلیت کنم.
+روباه گفت: -همین طور است.
+شهریار کوچولو گفت: -آخر اشکت دارد سرازیر می‌شود!
+روباه گفت: -همین طور است.
+-پس این ماجرا فایده‌ای به حال تو نداشته.
+روباه گفت: -چرا، واسه خاطرِ رنگ گندم.
+بعد گفت: -برو یک بار دیگر گل‌ها را ببین تا بفهمی که گلِ خودت تو عالم تک است. برگشتنا با هم وداع می‌کنیم و من به عنوان هدیه رازی را به‌ات می‌گویم.
+شهریار کوچولو بار دیگر به تماشای گل‌ها رفت و به آن‌ها گفت: -شما سرِ سوزنی به گل من نمی‌مانید و هنوز هیچی نیستید. نه کسی شما را اهلی کرده نه شما کسی را. درست همان جوری هستید که روباه من بود: روباهی بود مثل صدهزار روباه دیگر. او را دوست خودم کردم و حالا تو همه‌ی عالم تک است.
+گل‌ها حسابی از رو رفتند.
+شهریار کوچولو دوباره درآمد که: -خوشگلید اما خالی هستید. برای‌تان نمی‌شود مُرد. گفت‌وگو ندارد که گلِ مرا هم فلان ره‌گذر می‌بیند مثل شما. اما او به تنهایی از همه‌ی شما سر است چون فقط اوست که آبش داده‌ام، چون فقط اوست که زیر حبابش گذاشته‌ام، چون فقط اوست که با تجیر برایش حفاظ درست کرده‌ام، چون فقط اوست که حشراتش را کشته‌ام (جز دو سه‌تایی که می‌بایست شب‌پره بشوند)، چون فقط اوست که پای گِلِه‌گزاری‌ها یا خودنمایی‌ها و حتا گاهی پای بُغ کردن و هیچی نگفتن‌هاش نشسته‌ام، چون او گلِ من است.
+و برگشت پیش روباه.
+گفت: -خدانگه‌دار!
+روباه گفت: -خدانگه‌دار!... و اما رازی که گفتم خیلی ساده است:
+جز با دل هیچی را چنان که باید نمی‌شود دید. نهاد و گوهر را چشمِ سَر نمی‌بیند.
+شهریار کوچولو برای آن که یادش بماند تکرار کرد: -نهاد و گوهر را چشمِ سَر نمی‌بیند.
+-ارزش گل تو به قدرِ عمری است که به پاش صرف کرده‌ای.
+شهریار کوچولو برای آن که یادش بماند تکرار کرد: -به قدر عمری است که به پاش صرف کرده‌ام.
+روباه گفت: -انسان‌ها این حقیقت را فراموش کرده‌اند اما تو نباید فراموشش کنی. تو تا زنده‌ای نسبت به چیزی که اهلی کرده‌ای مسئولی. تو مسئول گُلِتی...
+
+شهریار کوچولو برای آن که یادش بماند تکرار کرد: -من مسئول گُلمَم.
+
+۲۲
+شهریار کوچولو گفت: -سلام.
+سوزن‌بان گفت: -سلام.
+شهریار کوچولو گفت: -تو چه کار می‌کنی این‌جا؟
+سوزن‌بان گفت: -مسافرها را به دسته‌های هزارتایی تقسیم می‌کنم و قطارهایی را که می‌بَرَدشان گاهی به سمت راست می‌فرستم گاهی به سمت چپ. و همان دم سریع‌السیری با چراغ‌های روشن و غرّشی رعدوار اتاقک سوزن‌بانی را به لرزه انداخت.
+-عجب عجله‌ای دارند! پیِ چی می‌روند؟
+سوزن‌بان گفت: -از خودِ آتش‌کارِ لکوموتیف هم بپرسی نمی‌داند!
+سریع‌السیر دیگری با چراغ‌های روشن غرّید و در جهت مخالف گذشت .
+شهریار کوچولو پرسید: -برگشتند که؟
+سوزن‌بان گفت: -این‌ها اولی‌ها نیستند. آن‌ها رفتند این‌ها برمی‌گردند.
+-جایی را که بودند خوش نداشتند؟
+سوزن‌بان گفت: -آدمی‌زاد هیچ وقت جایی را که هست خوش ندارد.
+و رعدِ سریع‌السیرِ نورانیِ ثالثی غرّید.
+شهریار کوچولو پرسید: -این‌ها دارند مسافرهای اولی را دنبال می‌کنند؟
+سوزن‌بان گفت: -این‌ها هیچ چیزی را دنبال نمی‌کنند. آن تو یا خواب‌شان می‌بَرَد یا دهن‌دره می‌کنند. فقط بچه‌هاند که دماغ‌شان را فشار می‌دهند به شیشه‌ها.
+شهریار کوچولو گفت: -فقط بچه‌هاند که می‌دانند پیِ چی می‌گردند. بچه‌هاند که کُلّی وقت صرف یک عروسک پارچه‌ای می‌کنند و عروسک برای‌شان آن قدر اهمیت به هم می‌رساند که اگر یکی آن را ازشان کِش برود می‌زنند زیر گریه...
+سوزن‌بان گفت: -بخت، یارِ بچه‌هاست.
+
+۲۳
+شهریار کوچولو گفت: -سلام!
+پیله‌ور گفت: -سلام.
+این بابا فروشنده‌ی حَب‌های ضد تشنگی بود. خریدار هفته‌ای یک حب می‌انداخت بالا و دیگر تشنگی بی تشنگی.
+شهریار کوچولو پرسید: -این‌ها را می‌فروشی که چی؟
+پیله‌ور گفت: -باعث صرفه‌جویی کُلّی وقت است. کارشناس‌های خبره نشسته‌اند دقیقا حساب کرده‌اند که با خوردن این حب‌ها هفته‌ای پنجاه و سه دقیقه وقت صرفه‌جویی می‌شود.
+-خب، آن وقت آن پنجاه و سه دقیقه را چه کار می‌کنند؟
+ـ هر چی دل‌شان خواست...
+
+چشمه
+شهریار کوچولو تو دلش گفت: «من اگر پنجاه و سه دقیقه وقتِ زیادی داشته باشم خوش‌خوشک به طرفِ یک چشمه می‌روم...»
+
+۲۴
+هشتمین روزِ خرابی هواپیمام تو کویر بود که، در حال نوشیدنِ آخرین چک‌ّه‌ی ذخیره‌ی آبم به قضیه‌ی پیله‌وره گوش داده بودم. به شهریار کوچولو گفتم:
+-خاطرات تو راستی راستی زیباند اما من هنوز از پسِ تعمیر هواپیما برنیامده‌ام، یک چکه آب هم ندارم. و راستی که من هم اگر می‌توانستم خوش‌خوشک به طرف چشمه‌ای بروم سعادتی احساس می‌کردم که نگو!
+درآمد که: -دوستم روباه...
+گفتم: -آقا کوچولو، دورِ روباه را قلم بگیر!
+-واسه چی؟
+-واسه این که تشنگی کارمان را می سازد. واسه این!
+از استدلال من چیزی حالیش نشد و در جوابم گفت:
+-حتا اگر آدم دَمِ مرگ باشد هم داشتن یک دوست عالی است. من که از داشتن یک دوستِ روباه خیلی خوشحالم...
+به خودم گفتم نمی‌تواند میزان خطر را تخمین بزند: آخر او هیچ وقت نه تشنه‌اش می‌شود نه گشنه‌اش. یه ذره آفتاب بسش است...
+اما او به من نگاه کرد و در جواب فکرم گفت: -من هم تشنه‌م است... بگردیم یک چاه پیدا کنیم...
+از سرِ خستگی حرکتی کردم: -این جوری تو کویرِ برهوت رو هوا پیِ چاه گشتن احمقانه است.
+و با وجود این به راه افتادیم.
+
+پس از ساعت‌ها که در سکوت راه رفتیم شب شد و ستاره‌ها یکی یکی درآمدند. من که از زور تشنگی تب کرده بودم انگار آن‌ها را خواب می‌دیدم. حرف‌های شهریار کوچولو تو ذهنم می‌رقصید.
+ازش پرسیدم: -پس تو هم تشنه‌ات هست، ها؟
+اما او به سوآلِ من جواب نداد فقط در نهایت سادگی گفت: -آب ممکن است برای دلِ من هم خوب باشد...
+از حرفش چیزی دستگیرم نشد اما ساکت ماندم. می‌دانستم از او نباید حرف کشید.
+خسته شده بود. گرفت نشست. من هم کنارش نشستم. پس از مدتی سکوت گفت:
+-قشنگیِ ستاره‌ها واسه خاطرِ گلی است که ما نمی‌بینیمش...
+گفتم: -همین طور است
+و بدون حرف در مهتاب غرق تماشای چین و شکن‌های شن شدم.
+باز گفت: -کویر زیباست.
+
+و حق با او بود. من همیشه عاشق کویر بوده‌ام. آدم بالای توده‌ای شن لغزان می‌نشیند، هیچی نمی‌بیند و هیچی نمی‌شنود اما با وجود این چیزی توی سکوت برق‌برق می‌زند.
+شهریار کوچولو گفت: -چیزی که کویر را زیبا می‌کند این است که یک جایی یک چاه قایم کرده...
+از این‌که ناگهان به راز آن درخشش اسرارآمیزِ شن پی بردم حیرت‌زده شدم. بچگی‌هام تو خانه‌ی کهنه‌سازی می‌نشستیم که معروف بود تو آن گنجی چال کرده‌اند. البته نگفته پیداست که هیچ وقت کسی آن را پیدا نکرد و شاید حتا اصلا کسی دنبالش نگشت اما فکرش همه‌ی اهل خانه را تردماغ می‌کرد: «خانه‌ی ما تهِ دلش رازی پنهان کرده بود...»
+گفتم: -آره. چه خانه باشد چه ستاره، چه کویر، چیزی که اسباب زیبایی‌اش می‌شود نامریی است!
+گفت: -خوشحالم که با روباه من توافق داری.
+
+چون خوابش برده بود بغلش کردم و راه افتادم. دست و دلم می‌لرزید.انگار چیز شکستنیِ بسیار گران‌بهایی را روی دست می‌بردم. حتا به نظرم می‌آمد که تو تمام عالم چیزی شکستنی‌تر از آن هم به نظر نمی‌رسد. تو روشنی مهتاب به آن پیشانی رنگ‌پریده و آن چشم‌های بسته و آن طُرّه‌های مو که باد می‌جنباند نگاه کردم و تو دلم گفتم: «آن چه می‌بینم صورت ظاهری بیش‌تر نیست. مهم‌ترش را با چشم نمی‌شود دید...»
+باز، چون دهان نیمه‌بازش طرح کم‌رنگِ نیمه‌لبخندی را داشت به خود گفتم: «چیزی که تو شهریار کوچولوی خوابیده مرا به این شدت متاثر می‌کند وفاداری اوست به یک گل: او تصویرِ گل سرخی است که مثل شعله‌ی چراغی حتا در خوابِ ناز هم که هست تو وجودش می‌درخشد...» و آن وقت او را باز هم شکننده‌تر دیدم. حس کردم باید خیلی مواظبش باشم: به شعله‌ی چراغی می‌مانست که یک وزش باد هم می‌توانست خاموشش کند.
+و همان طور در حال راه رفتن بود که دمدمه‌ی سحر چاه را پیداکردم.
+
+۲۵
+شهریار کوچولو درآمد که: -آدم‌ها!... می‌چپند تو قطارهای تندرو اما نمی‌دانند دنبال چی می‌گردند. این است که بنامی‌کنند دور خودشان چرخک‌زدن.
+و بعد گفت: -این هم کار نشد...
+چاهی که به‌اش رسیده‌بودیم اصلا به چاه‌های کویری نمی‌مانست. چاه کویری یک چاله‌ی ساده است وسط شن‌ها. این یکی به چاه‌های واحه‌ای می‌مانست اما آن دوروبر واحه‌ای نبود و من فکر کردم دارم خواب می‌بینم.
+گفتم: -عجیب است! قرقره و سطل و تناب، همه‌چیز روبه‌راه است.
+خندید تناب را گرفت و قرقره را به کار انداخت
+
+شهریار کوچولو در حالِ کشیدنِ آب از چاه
+و قرقره مثل بادنمای کهنه‌ای که تا مدت‌ها پس از خوابیدنِ باد می‌نالد به ناله‌درآمد.
+گفت: -می‌شنوی؟ ما داریم این چاه را از خواب بیدار می‌کنیم و او دارد برای‌مان آواز می‌خواند...
+دلم نمی‌خواست او تلاش و تقلا کند. بش گفتم: -بدهش به من. برای تو زیادی سنگین است.
+سطل را آرام تا طوقه‌ی چاه آوردم بالا و آن‌جا کاملا در تعادل نگهش داشتم. از حاصل کار شاد بودم. خسته و شاد. آواز قرقره را همان‌طور تو گوشم داشتم و تو آب که هنوز می‌لرزید لرزش خورشید را می‌دیدم.
+گفت: -بده من، که تشنه‌ی این آبم.
+ومن تازه توانستم بفهمم پی چه چیز می‌گشته!
+
+سطل را تا لب‌هایش بالا بردم. با چشم‌های بسته نوشید. آبی بود به شیرینیِ عیدی. این آب به کُلّی چیزی بود سوایِ هرگونه خوردنی. زاییده‌ی راه رفتنِ زیر ستاره‌ها و سرود قرقره و تقلای بازوهای من بود. مثل یک چشم روشنی برای دل خوب بود. پسر بچه که بودم هم، چراغ درخت عید و موسیقیِ نماز نیمه‌شب عید کریسمس و لطف لب‌خنده‌ها عیدیی را که بم می‌دادند درست به همین شکل آن همه جلا و جلوه می‌بخشید.
+گفت: -مردم سیاره‌ی تو ور می‌دارند پنج هزار تا گل را تو یک گلستان می‌کارند، و آن یک دانه‌ای را که پِیَش می‌گردند آن وسط پیدا نمی‌کنند...
+گفتم: -پیدایش نمی‌کنند.
+-با وجود این، چیزی که پیَش می‌گردند ممکن است فقط تو یک گل یا تو یک جرعه آب پیدا بشود...
+جواب دادم: -گفت‌وگو ندارد.
+باز گفت: -گیرم چشمِ سَر کور است، باید با چشم دل پی‌اش گشت.
+من هم سیراب شده بودم. راحت نفس می‌کشیدم. وقتی آفتاب درمی‌آید شن به رنگ عسل است. من هم از این رنگ عسلی لذت می‌بردم. چرا می‌بایست در زحمت باشم...
+شهریار کوچولو که باز گرفته بود کنار من نشسته بود با لطف بم گفت: -هِی! قولت قول باشد ها!
+-کدام قول؟
+-یادت است؟ یک پوزه‌بند برای بَرّه‌ام... آخر من مسئول گلمَم!
+طرح‌های اولیه‌ام را از جیب درآوردم. نگاه‌شان کرد و خندان‌خندان گفت: -بائوباب‌هات یک خرده شبیه کلم شده.
+ای وای! مرا بگو که آن‌قدر به بائوباب‌هام می‌نازیدم.
+-روباهت... گوش‌هاش بیش‌تر به شاخ می‌ماند... زیادی درازند!
+و باز زد زیر خنده.
+-آقا کوچولو داری بی‌انصافی می‌کنی. من جز بوآهای بسته و بوآهای باز چیزی بلد نبودم بکشم که.
+گفت: -خب، مهم نیست. عوضش بچه‌ها سرشان تو حساب است.
+با مداد یک پوزه‌بند کشیدم دادم دستش و با دلِ فشرده گفتم:
+-تو خیالاتی به سر داری که من ازشان بی‌خبرم...
+اما جواب مرا نداد. بم گفت: -می‌دانی؟ فردا سالِ به زمین آمدنِ من است.
+بعد پس از لحظه‌ای سکوت دوباره گفت: -همین نزدیکی‌ها پایین آمدم.
+و سرخ شد.
+
+و من از نو بی این که بدانم چرا غم عجیبی احساس کردم. با وجود این سوآلی به ذهنم رسید: -پس هشت روز پیش، آن روز صبح که تو تک و تنها هزار میل دورتر از هر آبادی وسطِ کویر به من برخوردی اتفاقی نبود: داشتی برمی‌گشتی به همان جایی که پایین‌آمدی...
+دوباره سرخ شد
+و من با دودلی به دنبال حرفم گفتم:
+-شاید به مناسبت همین سال‌گرد؟...
+باز سرخ شد. او هیچ وقت به سوآل‌هایی که ازش می‌شد جواب نمی‌داد اما وقتی کسی سرخ می‌شود معنیش این است که «بله»، مگر نه؟
+به‌اش گفتم: -آخر، من ترسم برداشته...
+اما او حرفم را برید:
+-دیگر تو باید بروی به کارت برسی. باید بروی سراغ موتورت. من همین‌جا منتظرت می‌مانم. فردا عصر برگرد...
+
+منتها من خاطر جمع نبودم. به یاد روباه افتادم: اگر آدم گذاشت اهلیش کنند بفهمی‌نفهمی خودش را به این خطر انداخته که کارش به گریه‌کردن بکشد.
+
+۲۶
+کنار چاه دیوارِ سنگی مخروبه‌ای بود. فردا عصر که از سرِ کار برگشتم از دور دیدم که آن بالا نشسته پاها را آویزان کرده،
+
+شهریار کوچولو نشسته بر دیوارِ سنگی و مار در پایینِ آن
+و شنیدم که می‌گوید:
+-پس یادت نمی‌آید؟ درست این نقطه نبود ها!
+لابد صدای دیگری به‌اش جوابی داد، چون شهریار کوچولو در رَدِّ حرفش گفت:
+-چرا چرا! روزش که درست همین امروز است گیرم محلش این جا نیست...
+راهم را به طرف دیوار ادامه دادم. هنوز نه کسی به چشم خورده بود نه صدای کسی را شنیده بودم اما شهریار کوچولو باز در جواب درآمد که:
+-... آره، معلوم است. خودت می‌توانی ببینی رَدِّ پاهایم روی شن از کجا شروع می‌شود.
+همان جا منتظرم باش، تاریک که شد می‌آیم.
+بیست متری دیوار بودم و هنوز چیزی نمی‌دیدم. پس از مختصر مکثی دوباره گفت:
+-زهرت خوب هست؟ مطمئنی درد و زجرم را کِش نمی‌دهد؟
+با دل فشرده از راه ماندم اما هنوز از موضوع سر در نیاورده بودم.
+گفت: -خب، حالا دیگر برو. دِ برو. می‌خواهم بیایم پایین!
+
+آن وقت من نگاهم را به پایین به پای دیوار انداختم و از جا جستم! یکی از آن مارهای زردی که تو سی ثانیه کَلَکِ آدم را می‌کنند، به طرف شهریار کوچولو قد راست کرده بود. من همان طور که به دنبال تپانچه دست به جیبم می‌بردم پا گذاشتم به دو، اما ماره از سر و صدای من مثل فواره‌ای که بنشیند آرام روی شن جاری شد و بی آن که چندان عجله‌ای از خودش نشان دهد باصدای خفیف فلزی لای سنگ‌ها خزید.
+من درست به موقع به دیوار رسیدم و طفلکی شهریار کوچولو را که رنگش مثل برف پریده بود تو هوا بغل کردم.
+-این دیگر چه حکایتی است! حالا دیگر با مارها حرف می‌زنی؟
+شال زردش را که مدام به گردن داشت باز کردم به شقیقه‌هایش آب زدم و جرعه‌ای به‌اش نوشاندم. اما حالا دیگر اصلا جرات نمی کردم ازش چیزی بپرسم. با وقار به من نگاه کرد و دستش را دور گردنم انداخت. حس کردم قلبش مثل قلب پرنده‌ای می‌زند که تیر خورده‌است و دارد می‌میرد.
+گفت: -از این که کم و کسرِ لوازم ماشینت را پیدا کردی خوش‌حالم. حالا می‌توانی برگردی خانه‌ات...
+-تو از کجا فهمیدی؟
+درست همان دم لب‌واکرده‌بودم بش خبر بدهم که علی‌رغم همه‌ی نومیدی‌ها تو کارم موفق شده‌ام!
+به سوآل‌های من هیچ جوابی نداد اما گفت: -آخر من هم امروز بر می‌گردم خانه‌ام...
+و بعد غم‌زده درآمد که: -گیرم راه من خیلی دورتر است... خیلی سخت‌تر است...
+
+حس می‌کردم اتفاق فوق‌العاده‌ای دارد می‌افتد. گرفتمش تو بغلم. عین یک بچه‌ی کوچولو. با وجود این به نظرم می‌آمد که او دارد به گردابی فرو می‌رود و برای نگه داشتنش از من کاری ساخته نیست... نگاه متینش به دوردست‌های دور راه کشیده بود.
+گفت: بَرِّه‌ات را دارم. جعبه‌هه را هم واسه بره‌هه دارم. پوزه‌بنده را هم دارم.
+و با دلِ گرفته لبخندی زد.
+مدت درازی صبر کردم. حس کردم کم‌کمَک تنش دوباره دارد گرم می‌شود.
+-عزیز کوچولوی من، وحشت کردی...
+-امشب وحشت خیلی بیش‌تری چشم به‌راهم است.
+
+دوباره از احساسِ واقعه‌ای جبران ناپذیر یخ زدم. این فکر که دیگر هیچ وقت غش‌غش خنده‌ی او را نخواهم شنید برایم سخت تحمل‌ناپذیر بود. خنده‌ی او برای من به چشمه‌ای در دلِ کویر می‌مانست.
+-کوچولوئَکِ من، دلم می‌خواهد باز هم غش‌غشِ خنده‌ات را بشنوم.
+اما به‌ام گفت: -امشب درست می‌شود یک سال و اخترَکَم درست بالای همان نقطه‌ای می‌رسد که پارسال به زمین آمدم.
+-کوچولوئک، این قضیه‌ی مار و میعاد و ستاره یک خواب آشفته بیش‌تر نیست. مگر نه؟
+به سوال من جوابی نداد اما گفت: -چیزی که مهم است با چشمِ سَر دیده نمی‌شود.
+-مسلم است.
+-در مورد گل هم همین‌طور است: اگر گلی را دوست داشته باشی که تو یک ستاره‌ی دیگر است، شب تماشای آسمان چه لطفی پیدا می‌کند: همه‌ی ستاره‌ها غرق گل می‌شوند!
+-مسلم است...
+-در مورد آب هم همین‌طور است. آبی که تو به من دادی به خاطر قرقره و ریسمان درست به یک موسیقی می‌مانست... یادت که هست... چه خوب بود.
+-مسلم است...
+-شب‌به‌شب ستاره‌ها را نگاه می‌کنی. اخترک من کوچولوتر از آن است که بتوانم جایش را نشانت بدهم. اما چه بهتر! آن هم برای تو می‌شود یکی از ستاره‌ها؛ و آن وقت تو دوست داری همه‌ی ستاره‌ها را تماشا کنی... همه‌شان می‌شوند دوست‌های تو... راستی می‌خواهم هدیه‌ای بت بدهم...
+و غش غش خندید.
+-آخ، کوچولوئک، کوچولوئک! من عاشقِ شنیدنِ این خنده‌ام!
+-هدیه‌ی من هم درست همین است... درست مثل مورد آب.
+-چی می‌خواهی بگویی؟
+-همه‌ی مردم ستاره دارند اما همه‌ی ستاره‌ها یک‌جور نیست: واسه آن‌هایی که به سفر می‌روند حکم راهنما را دارند واسه بعضی دیگر فقط یک مشت روشناییِ سوسوزن‌اند. برای بعضی که اهل دانشند هر ستاره یک معما است واسه آن بابای تاجر طلا بود. اما این ستاره‌ها همه‌شان زبان به کام کشیده و خاموشند. فقط تو یکی ستاره‌هایی خواهی داشت که تنابنده‌ای مِثلش را ندارد.
+-چی می‌خواهی بگویی؟
+-نه این که من تو یکی از ستاره‌هام؟ نه این که من تو یکی از آن‌ها می‌خندم؟... خب، پس هر شب که به آسمان نگاه می‌کنی برایت مثل این خواهد بود که همه‌ی ستاره‌ها می‌خندند. پس تو ستاره‌هایی خواهی داشت که بلدند بخندند!
+و باز خندید.
+-و خاطرت که تسلا پیدا کرد (خب بالاخره آدمی‌زاد یک جوری تسلا پیدا می‌کند دیگر) از آشنایی با من خوش‌حال می‌شوی. دوست همیشگی من باقی می‌مانی و دلت می‌خواهد با من بخندی و پاره‌ای وقت‌هام واسه تفریح پنجره‌ی اتاقت را وا می‌کنی... دوستانت از این‌که می‌بینند تو به آسمان نگاه می‌کنی و می‌خندی حسابی تعجب می‌کنند آن وقت تو به‌شان می‌گویی: «آره، ستاره‌ها همیشه مرا خنده می‌اندازند!» و آن‌وقت آن‌ها یقین‌شان می‌شود که تو پاک عقلت را از دست داده‌ای. جان! می‌بینی چه کَلَکی به‌ات زده‌ام...
+و باز زد زیر خنده.
+-به آن می‌ماند که عوضِ ستاره یک مشت زنگوله بت داده باشم که بلدند بخندند...
+دوباره خندید و بعد حالتی جدی به خودش گرفت:
+-نه، من تنهات نمی‌گذارم.
+
+شهریار کوچولو تنها
+
+-ظاهر آدمی را پیدا می‌کنم که دارد درد می‌کشد... یک خرده هم مثل آدمی می‌شوم که دارد جان می‌کند. رو هم رفته این جوری‌ها است. نیا که این را نبینی. چه زحمتی است بی‌خود؟
+-تنهات نمی‌گذارم.
+اندوه‌زده بود.
+-این را بیش‌تر از بابت ماره می‌گویم که، نکند یک‌هو تو را هم بگزد. مارها خیلی خبیثند. حتا واسه خنده هم ممکن است آدم را نیش بزنند.
+-تنهات نمی‌گذارم.
+منتها یک چیز باعث خاطر جمعیش شد:
+-گر چه، بار دوم که بخواهند بگزند دیگر زهر ندارند.
+شب متوجه راه افتادنش نشدم. بی سر و صدا گریخت.
+وقتی خودم را به‌اش رساندم با قیافه‌ی مصمم و قدم‌های محکم پیش می‌رفت. همین قدر گفت: -اِ! این‌جایی؟
+و دستم را گرفت.
+اما باز بی‌قرار شد وگفت: -اشتباه کردی آمدی. رنج می‌بری. گرچه حقیقت این نیست، اما ظاهرِ یک مرده را پیدا می‌کنم.
+من ساکت ماندم.
+-خودت درک می‌کنی. راه خیلی دور است. نمی‌توانم این جسم را با خودم ببرم. خیلی سنگین است.
+من ساکت ماندم.
+-گیرم عینِ پوستِ کهنه‌ای می‌شود که دورش انداخته باشند؛ پوست کهنه که غصه ندارد، ها؟
+من ساکت ماندم.
+کمی دل‌سرد شد اما باز هم سعی کرد:
+-خیلی با مزه می‌شود، نه؟ من هم به ستاره‌ها نگاه می‌کنم. هم‌شان به صورت چاه‌هایی در می‌آیند با قرقره‌های زنگ زده. همه‌ی ستاره‌ها بم آب می‌دهند بخورم...
+من ساکت ماندم.
+-خیلی با مزه می‌شود. نه؟ تو صاحب هزار کرور زنگوله می‌شوی من صاحب هزار کرور فواره...
+او هم ساکت شد، چرا که داشت گریه می‌کرد...
+-خب، همین جاست. بگذار چند قدم خودم تنهایی بروم.
+و گرفت نشست، چرا که می‌ترسید.
+
+شهریار کوچولو نشسته
+
+می‌دانی؟... گلم را می‌گویم... آخر من مسئولشم. تازه چه قدر هم لطیف است و چه قدر هم ساده و بی‌شیله‌پیله. برای آن که جلو همه‌ی عالم از خودش دفاع کند همه‌اش چی دارد مگر؟ چهارتا خار پِرپِرَک!
+
+من هم گرفتم نشستم. دیگر نمی‌توانستم سر پا بند بشوم.
+گفت: -همین... همه‌اش همین و بس...
+باز هم کمی دودلی نشان داد اما بالاخره پا شد و قدمی به جلو رفت. من قادر به حرکت نبودم.
+
+کنار قوزکِ پایش جرقه‌ی زردی جست و... فقط همین! یک دم بی‌حرکت ماند. فریادی نزد. مثل درختی که بیفتد آرام‌آرام به زمین افتاد که به وجود شن از آن هم صدایی بلند نشد.
+
+شهریار کوچولو در حالی که آرام‌آرام به زمین می‌افتد
+۲۷
+شش سال گذشته است و من هنوز بابت این قضیه جایی لب‌ترنکرده‌ام. دوستانم از این که مرا دوباره زنده می‌دیدند سخت شاد شدند. من غم‌زده بودم اما به آن‌ها می‌گفتم اثر خستگی است.
+حالا کمی تسلای خاطر پیدا کرده‌ام. یعنی نه کاملا... اما این را خوب می‌دانم که او به اخترکش برگشته. چون آفتاب که زد پیکرش را پیدا نکردم. پیکری هم نبود که چندان وزنی داشته باشد... و شب‌ها دوست دارم به ستاره‌ها گوش بدهم. عین هزار زنگوله‌اند.
+اما موضوع خیلی مهمی که هست، من پاک یادم رفت به پوزه‌بندی که برای شهریار کوچولو کشیدم تسمه‌ی چرمی اضافه کنم و او ممکن نیست بتواند آن را به پوزه‌ی بَرّه ببندد. این است که از خودم می‌پرسم: «یعنی تو اخترکش چه اتفاقی افتاده؟ نکند بره‌هه گل را چریده باشد؟...»
+گاه به خودم می‌گویم: «حتما نه، شهریار کوچولو هر شب گلش را زیر حباب شیشه‌ای می‌گذارد و هوای بره‌اش را هم دارد...» آن وقت است که خیالم راحت می‌شود و ستاره‌ها همه به شیرینی می‌خندند.
+گاه به خودم می‌گویم: «همین کافی است که آدم یک بار حواسش نباشد... آمدیم و یک شب حباب یادش رفت یا بَرّه شب نصف‌شبی بی‌سروصدا از جعبه زد بیرون...» آن وقت است که زنگوله‌ها همه تبدیل به اشک می‌شوند!...
+
+یک راز خیلی خیلی بزرگ این جا هست: برای شما هم که او را دوست دارید، مثل من هیچ چیزِ عالم مهم‌تر از دانستن این نیست که تو فلان نقطه‌ای که نمی‌دانیم، فلان بره‌ای که نمی‌شماسیم گل سرخی را چریده یا نچریده...
+
+خب. آسمان را نگاه کنید و بپرسید: «بَرّه گل را چریده یا نچریده؟» و آن وقت با چشم‌های خودتان تفاوتش را ببینید...
+
+و محال است آدم بزرگ‌ها روح‌شان خبردار بشود که این موضوع چه قدر مهم است!
+
+بدونِ شهریار کوچولو
+در نظر من این زیباترین و حزن‌انگیزترین منظره‌ی عالم است. این همان منظره‌ی دو صفحه پیش است گیرم آن را دوباره کشیده‌ام که به‌تر نشان‌تان بدهم: «ظهور شهریار کوچولو بر زمین در این جا بود؛ و بعد در همین جا هم بود که ناپدید شد».
+
+آن قدر به دقت این منظره را نگاه کنید که مطمئن بشوید اگر روزی تو آفریقا گذرتان به کویر صحرا افتاد حتما آن را خواهید شناخت. و اگر پاداد و گذارتان به آن جا افتاد به التماس ازتان می‌خواهم که عجله به خرج ندهید و درست زیر ستاره چند لحظه‌ای توقف کنید. آن وقت اگر بچه‌ای به طرف‌تان آمد، اگر خندید، اگر موهایش طلایی بود، اگر وقتی ازش سوالی کردید جوابی نداد، لابد حدس می‌زنید که کیست. در آن صورت لطف کنید و نگذارید من این جور افسرده خاطر بمانم:
+بی درنگ بردارید به من بنویسید که او برگشته.
+
index 633e993..99168c6 100644 (file)
@@ -98,7 +98,12 @@ BUILT_SOURCES += \
        hb-version.h
 
 $(srcdir)/hb-version.h: hb-version.h.in $(top_srcdir)/configure.ac
-       $(AM_V_GEN) $(srcdir)/gen-hb-version.py $(HB_VERSION) hb-version.h.in hb-version.h
+       $(AM_V_GEN) $(SED) \
+               -e 's/[@]HB_VERSION_MAJOR@/$(HB_VERSION_MAJOR)/' \
+               -e 's/[@]HB_VERSION_MINOR@/$(HB_VERSION_MINOR)/' \
+               -e 's/[@]HB_VERSION_MICRO@/$(HB_VERSION_MICRO)/' \
+               -e 's/[@]HB_VERSION@/$(HB_VERSION)/' \
+               "$<" > "$@" || ($(RM) "$@"; false)
 
 # Put the library together
 
@@ -230,7 +235,8 @@ DEF_FILES += harfbuzz-gobject.def
 endif
 check: $(DEF_FILES) # For check-symbols.sh
 CLEANFILES += $(DEF_FILES)
-harfbuzz.def: $(HBHEADERS) $(HBNODISTHEADERS)
+harfbuzz.def: $(top_builddir)/config.status
+harfbuzz.def: $(HBHEADERS)
        $(AM_V_GEN) $(srcdir)/gen-def.py "$@" $^
 harfbuzz-subset.def: $(HB_SUBSET_headers)
        $(AM_V_GEN) $(srcdir)/gen-def.py "$@" $^
@@ -243,6 +249,7 @@ harfbuzz-deprecated-symbols.txt: $(srcdir)/hb-deprecated.h
 
 
 GENERATORS = \
+       gen-arabic-joining-list.py \
        gen-arabic-table.py \
        gen-def.py \
        gen-emoji-table.py \
@@ -277,8 +284,7 @@ $(srcdir)/%.hh: $(srcdir)/%.rl
 
 harfbuzz.cc: Makefile.sources
        $(AM_V_GEN) \
-       $(srcdir)/gen-harfbuzzcc.py \
-               $(srcdir)/harfbuzz.cc \
+       for f in \
                $(HB_BASE_sources) \
                $(HB_GLIB_sources) \
                $(HB_FT_sources) \
@@ -286,7 +292,10 @@ harfbuzz.cc: Makefile.sources
                $(HB_UNISCRIBE_sources) \
                $(HB_GDI_sources) \
                $(HB_DIRECTWRITE_sources) \
-               $(HB_CORETEXT_sources)
+               $(HB_CORETEXT_sources) \
+               ; do echo '#include "'$$f'"'; done | \
+       grep '[.]cc"' > $(srcdir)/harfbuzz.cc \
+       || ($(RM) $(srcdir)/harfbuzz.cc; false)
 BUILT_SOURCES += harfbuzz.cc
 
 noinst_PROGRAMS = \
@@ -333,26 +342,22 @@ test_gsub_would_substitute_SOURCES = test-gsub-would-substitute.cc
 test_gsub_would_substitute_CPPFLAGS = $(HBCFLAGS) $(FREETYPE_CFLAGS)
 test_gsub_would_substitute_LDADD = libharfbuzz.la $(HBLIBS) $(FREETYPE_LIBS)
 
-check_PROGRAMS += \
-       dump-indic-data \
-       dump-khmer-data \
-       dump-myanmar-data \
-       dump-use-data \
+COMPILED_TESTS = \
+       test-algs \
+       test-array \
+       test-bimap \
+       test-iter \
+       test-machinery \
+       test-map \
+       test-number \
+       test-ot-tag \
+       test-priority-queue \
+       test-set \
+       test-serialize \
+       test-unicode-ranges \
+       test-vector \
+       test-repacker \
        $(NULL)
-dump_indic_data_SOURCES = dump-indic-data.cc hb-ot-shape-complex-indic-table.cc
-dump_indic_data_CPPFLAGS = $(HBCFLAGS)
-dump_indic_data_LDADD = libharfbuzz.la $(HBLIBS)
-dump_khmer_data_SOURCES = dump-khmer-data.cc hb-ot-shape-complex-indic-table.cc
-dump_khmer_data_CPPFLAGS = $(HBCFLAGS)
-dump_khmer_data_LDADD = libharfbuzz.la $(HBLIBS)
-dump_myanmar_data_SOURCES = dump-myanmar-data.cc hb-ot-shape-complex-indic-table.cc
-dump_myanmar_data_CPPFLAGS = $(HBCFLAGS)
-dump_myanmar_data_LDADD = libharfbuzz.la $(HBLIBS)
-dump_use_data_SOURCES = dump-use-data.cc hb-ot-shape-complex-use-table.cc
-dump_use_data_CPPFLAGS = $(HBCFLAGS)
-dump_use_data_LDADD = libharfbuzz.la $(HBLIBS)
-
-COMPILED_TESTS = test-algs test-array test-iter test-meta test-number test-ot-tag test-unicode-ranges test-bimap
 COMPILED_TESTS_CPPFLAGS = $(HBCFLAGS) -DMAIN -UNDEBUG
 COMPILED_TESTS_LDADD = libharfbuzz.la $(HBLIBS)
 check_PROGRAMS += $(COMPILED_TESTS)
@@ -366,13 +371,21 @@ test_array_SOURCES = test-array.cc
 test_array_CPPFLAGS = $(HBCFLAGS)
 test_array_LDADD = libharfbuzz.la $(HBLIBS)
 
+test_bimap_SOURCES = test-bimap.cc hb-static.cc
+test_bimap_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS)
+test_bimap_LDADD = $(COMPILED_TESTS_LDADD)
+
 test_iter_SOURCES = test-iter.cc hb-static.cc
 test_iter_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS)
 test_iter_LDADD = $(COMPILED_TESTS_LDADD)
 
-test_meta_SOURCES = test-meta.cc hb-static.cc
-test_meta_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS)
-test_meta_LDADD = $(COMPILED_TESTS_LDADD)
+test_machinery_SOURCES = test-machinery.cc hb-static.cc
+test_machinery_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS)
+test_machinery_LDADD = $(COMPILED_TESTS_LDADD)
+
+test_map_SOURCES = test-map.cc hb-static.cc
+test_map_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS)
+test_map_LDADD = $(COMPILED_TESTS_LDADD)
 
 test_number_SOURCES = test-number.cc hb-number.cc
 test_number_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS)
@@ -382,13 +395,29 @@ test_ot_tag_SOURCES = hb-ot-tag.cc
 test_ot_tag_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS)
 test_ot_tag_LDADD = $(COMPILED_TESTS_LDADD)
 
+test_priority_queue_SOURCES = test-priority-queue.cc hb-static.cc
+test_priority_queue_CPPFLAGS = $(HBCFLAGS)
+test_priority_queue_LDADD = libharfbuzz.la $(HBLIBS)
+
+test_repacker_SOURCES = test-repacker.cc hb-static.cc
+test_repacker_CPPFLAGS = $(HBCFLAGS)
+test_repacker_LDADD = libharfbuzz.la libharfbuzz-subset.la $(HBLIBS)
+
+test_set_SOURCES = test-set.cc hb-static.cc
+test_set_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS)
+test_set_LDADD = $(COMPILED_TESTS_LDADD)
+
+test_serialize_SOURCES = test-serialize.cc hb-static.cc
+test_serialize_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS)
+test_serialize_LDADD = $(COMPILED_TESTS_LDADD)
+
 test_unicode_ranges_SOURCES = test-unicode-ranges.cc
 test_unicode_ranges_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS)
 test_unicode_ranges_LDADD = $(COMPILED_TESTS_LDADD)
 
-test_bimap_SOURCES = test-bimap.cc hb-static.cc
-test_bimap_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS)
-test_bimap_LDADD = $(COMPILED_TESTS_LDADD)
+test_vector_SOURCES = test-vector.cc hb-static.cc
+test_vector_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS)
+test_vector_LDADD = $(COMPILED_TESTS_LDADD)
 
 dist_check_SCRIPTS = \
        check-c-linkage-decls.py \
@@ -412,6 +441,10 @@ TESTS_ENVIRONMENT = \
        MAKE="$(MAKE) $(AM_MAKEFLAGS)" \
        HBSOURCES="$(HBSOURCES)" \
        HBHEADERS="$(HBHEADERS)" \
+       LDD="$(LDD)" \
+       NM="$(NM)" \
+       OBJDUMP="$(OBJDUMP)" \
+       OTOOL="$(OTOOL)" \
        $(NULL)
 
 if HAVE_INTROSPECTION
@@ -436,14 +469,7 @@ HarfBuzz_0_0_gir_INCLUDES = GObject-2.0
 HarfBuzz_0_0_gir_CFLAGS = \
        $(INCLUDES) \
        $(HBCFLAGS) \
-       -DHB_H \
-       -DHB_H_IN \
-       -DHB_OT_H \
-       -DHB_OT_H_IN \
-       -DHB_AAT_H \
-       -DHB_AAT_H_IN \
-       -DHB_GOBJECT_H \
-       -DHB_GOBJECT_H_IN \
+       -DHB_NO_SINGLE_HEADER_ERROR \
        -DHAVE_GOBJECT \
        -DHB_EXTERN= \
        $(NULL)
index 0399213..86a0c79 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.16.2 from Makefile.am.
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2020 Free Software Foundation, Inc.
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -96,9 +96,7 @@ POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
 TESTS = $(am__EXEEXT_2) $(am__EXEEXT_4)
-check_PROGRAMS = dump-indic-data$(EXEEXT) dump-khmer-data$(EXEEXT) \
-       dump-myanmar-data$(EXEEXT) dump-use-data$(EXEEXT) \
-       $(am__EXEEXT_1) $(am__EXEEXT_2)
+check_PROGRAMS = $(am__EXEEXT_2)
 @HAVE_PTHREAD_TRUE@am__append_1 = $(PTHREAD_CFLAGS)
 @HAVE_PTHREAD_TRUE@am__append_2 = $(PTHREAD_LIBS)
 @HAVE_GLIB_TRUE@am__append_3 = $(GLIB_CFLAGS)
@@ -188,9 +186,11 @@ am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(libdir)" \
        "$(DESTDIR)$(pkgincludedir)" "$(DESTDIR)$(pkgincludedir)"
 am__EXEEXT_1 =
 am__EXEEXT_2 = test-algs$(EXEEXT) test-array$(EXEEXT) \
-       test-iter$(EXEEXT) test-meta$(EXEEXT) test-number$(EXEEXT) \
-       test-ot-tag$(EXEEXT) test-unicode-ranges$(EXEEXT) \
-       test-bimap$(EXEEXT)
+       test-bimap$(EXEEXT) test-iter$(EXEEXT) test-machinery$(EXEEXT) \
+       test-map$(EXEEXT) test-number$(EXEEXT) test-ot-tag$(EXEEXT) \
+       test-priority-queue$(EXEEXT) test-set$(EXEEXT) \
+       test-serialize$(EXEEXT) test-unicode-ranges$(EXEEXT) \
+       test-vector$(EXEEXT) test-repacker$(EXEEXT) $(am__EXEEXT_1)
 PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS)
 am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
 am__vpath_adj = case $$p in \
@@ -283,44 +283,46 @@ am__DEPENDENCIES_12 = $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_3) \
        $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_10) \
        $(am__DEPENDENCIES_11)
 libharfbuzz_la_DEPENDENCIES = $(am__DEPENDENCIES_12)
-am__libharfbuzz_la_SOURCES_DIST = hb-aat-fdsc-table.hh \
-       hb-aat-layout-ankr-table.hh hb-aat-layout-bsln-table.hh \
-       hb-aat-layout-common.hh hb-aat-layout-feat-table.hh \
-       hb-aat-layout-just-table.hh hb-aat-layout-kerx-table.hh \
-       hb-aat-layout-lcar-table.hh hb-aat-layout-morx-table.hh \
+am__libharfbuzz_la_SOURCES_DIST = hb-aat-layout-ankr-table.hh \
+       hb-aat-layout-bsln-table.hh hb-aat-layout-common.hh \
+       hb-aat-layout-feat-table.hh hb-aat-layout-just-table.hh \
+       hb-aat-layout-kerx-table.hh hb-aat-layout-morx-table.hh \
        hb-aat-layout-opbd-table.hh hb-aat-layout-trak-table.hh \
        hb-aat-layout.cc hb-aat-layout.hh hb-aat-ltag-table.hh \
        hb-aat-map.cc hb-aat-map.hh hb-algs.hh hb-array.hh \
-       hb-atomic.hh hb-blob.cc hb-blob.hh hb-buffer-serialize.cc \
-       hb-buffer.cc hb-buffer.hh hb-cache.hh hb-cff-interp-common.hh \
+       hb-atomic.hh hb-bimap.hh hb-bit-page.hh hb-bit-set.hh \
+       hb-bit-set-invertible.hh hb-blob.cc hb-blob.hh \
+       hb-buffer-serialize.cc hb-buffer-verify.cc hb-buffer.cc \
+       hb-buffer.hh hb-cache.hh hb-cff-interp-common.hh \
        hb-cff-interp-cs-common.hh hb-cff-interp-dict-common.hh \
        hb-cff1-interp-cs.hh hb-cff2-interp-cs.hh hb-common.cc \
        hb-config.hh hb-debug.hh hb-dispatch.hh hb-draw.cc hb-draw.hh \
        hb-face.cc hb-face.hh hb-fallback-shape.cc hb-font.cc \
        hb-font.hh hb-iter.hh hb-kern.hh hb-machinery.hh hb-map.cc \
-       hb-map.hh hb-bimap.hh hb-meta.hh hb-mutex.hh hb-null.hh \
-       hb-number.cc hb-number.hh hb-object.hh hb-open-file.hh \
-       hb-open-type.hh hb-ot-cff-common.hh hb-ot-cff1-table.cc \
-       hb-ot-cff1-table.hh hb-ot-cff1-std-str.hh hb-ot-cff2-table.cc \
-       hb-ot-cff2-table.hh hb-ot-cmap-table.hh \
+       hb-map.hh hb-meta.hh hb-ms-feature-ranges.hh hb-mutex.hh \
+       hb-null.hh hb-number.cc hb-number.hh hb-object.hh \
+       hb-open-file.hh hb-open-type.hh hb-ot-cff-common.hh \
+       hb-ot-cff1-std-str.hh hb-ot-cff1-table.cc hb-ot-cff1-table.hh \
+       hb-ot-cff2-table.cc hb-ot-cff2-table.hh hb-ot-cmap-table.hh \
        hb-ot-color-cbdt-table.hh hb-ot-color-colr-table.hh \
        hb-ot-color-cpal-table.hh hb-ot-color-sbix-table.hh \
-       hb-ot-color-svg-table.hh hb-ot-color.cc hb-ot-face.cc \
-       hb-ot-face.hh hb-ot-face-table-list.hh hb-ot-font.cc \
-       hb-ot-gasp-table.hh hb-ot-glyf-table.hh hb-ot-hdmx-table.hh \
-       hb-ot-head-table.hh hb-ot-hhea-table.hh hb-ot-hmtx-table.hh \
-       hb-ot-kern-table.hh hb-ot-layout-base-table.hh \
-       hb-ot-layout-common.hh hb-ot-layout-gdef-table.hh \
-       hb-ot-layout-gpos-table.hh hb-ot-layout-gsub-table.hh \
-       hb-ot-layout-gsubgpos.hh hb-ot-layout-jstf-table.hh \
-       hb-ot-layout.cc hb-ot-layout.hh hb-ot-map.cc hb-ot-map.hh \
-       hb-ot-math-table.hh hb-ot-math.cc hb-ot-maxp-table.hh \
-       hb-ot-meta-table.hh hb-ot-meta.cc hb-ot-metrics.cc \
-       hb-ot-metrics.hh hb-ot-name-language-static.hh \
-       hb-ot-name-language.hh hb-ot-name-table.hh hb-ot-name.cc \
-       hb-ot-os2-table.hh hb-ot-os2-unicode-ranges.hh \
-       hb-ot-post-macroman.hh hb-ot-post-table.hh \
-       hb-ot-shape-complex-arabic-fallback.hh \
+       hb-ot-color-svg-table.hh hb-ot-color.cc \
+       hb-ot-face-table-list.hh hb-ot-face.cc hb-ot-face.hh \
+       hb-ot-font.cc hb-ot-gasp-table.hh hb-ot-glyf-table.hh \
+       hb-ot-hdmx-table.hh hb-ot-head-table.hh hb-ot-hhea-table.hh \
+       hb-ot-hmtx-table.hh hb-ot-kern-table.hh \
+       hb-ot-layout-base-table.hh hb-ot-layout-common.hh \
+       hb-ot-layout-gdef-table.hh hb-ot-layout-gpos-table.hh \
+       hb-ot-layout-gsub-table.hh hb-ot-layout-gsubgpos.hh \
+       hb-ot-layout-jstf-table.hh hb-ot-layout.cc hb-ot-layout.hh \
+       hb-ot-map.cc hb-ot-map.hh hb-ot-math-table.hh hb-ot-math.cc \
+       hb-ot-maxp-table.hh hb-ot-meta-table.hh hb-ot-meta.cc \
+       hb-ot-metrics.cc hb-ot-metrics.hh \
+       hb-ot-name-language-static.hh hb-ot-name-language.hh \
+       hb-ot-name-table.hh hb-ot-name.cc hb-ot-os2-table.hh \
+       hb-ot-os2-unicode-ranges.hh hb-ot-post-macroman.hh \
+       hb-ot-post-table.hh hb-ot-shape-complex-arabic-fallback.hh \
+       hb-ot-shape-complex-arabic-joining-list.hh \
        hb-ot-shape-complex-arabic-table.hh \
        hb-ot-shape-complex-arabic-win1256.hh \
        hb-ot-shape-complex-arabic.cc hb-ot-shape-complex-arabic.hh \
@@ -330,23 +332,25 @@ am__libharfbuzz_la_SOURCES_DIST = hb-aat-fdsc-table.hh \
        hb-ot-shape-complex-indic.cc hb-ot-shape-complex-indic.hh \
        hb-ot-shape-complex-khmer.cc hb-ot-shape-complex-khmer.hh \
        hb-ot-shape-complex-myanmar.cc hb-ot-shape-complex-myanmar.hh \
-       hb-ot-shape-complex-thai.cc hb-ot-shape-complex-use-table.cc \
-       hb-ot-shape-complex-use.cc hb-ot-shape-complex-use.hh \
+       hb-ot-shape-complex-syllabic.cc \
+       hb-ot-shape-complex-syllabic.hh hb-ot-shape-complex-thai.cc \
+       hb-ot-shape-complex-use-table.hh hb-ot-shape-complex-use.cc \
        hb-ot-shape-complex-vowel-constraints.cc \
        hb-ot-shape-complex-vowel-constraints.hh \
        hb-ot-shape-complex.hh hb-ot-shape-fallback.cc \
        hb-ot-shape-fallback.hh hb-ot-shape-normalize.cc \
        hb-ot-shape-normalize.hh hb-ot-shape.cc hb-ot-shape.hh \
        hb-ot-stat-table.hh hb-ot-tag-table.hh hb-ot-tag.cc \
-       hb-ot-var-avar-table.hh hb-ot-var-fvar-table.hh \
-       hb-ot-var-gvar-table.hh hb-ot-var-hvar-table.hh \
-       hb-ot-var-mvar-table.hh hb-ot-var.cc hb-ot-vorg-table.hh \
-       hb-pool.hh hb-sanitize.hh hb-serialize.hh hb-set-digest.hh \
-       hb-set.cc hb-set.hh hb-shape-plan.cc hb-shape-plan.hh \
-       hb-shape.cc hb-shaper-impl.hh hb-shaper-list.hh hb-shaper.cc \
-       hb-shaper.hh hb-static.cc hb-string-array.hh hb-ucd-table.hh \
-       hb-ucd.cc hb-unicode-emoji-table.hh hb-unicode.cc \
-       hb-unicode.hh hb-utf.hh hb-vector.hh hb.hh \
+       hb-ot-var-avar-table.hh hb-ot-var-common.hh \
+       hb-ot-var-fvar-table.hh hb-ot-var-gvar-table.hh \
+       hb-ot-var-hvar-table.hh hb-ot-var-mvar-table.hh hb-ot-var.cc \
+       hb-ot-vorg-table.hh hb-pool.hh hb-sanitize.hh hb-serialize.hh \
+       hb-set-digest.hh hb-set.cc hb-set.hh hb-shape-plan.cc \
+       hb-shape-plan.hh hb-shape.cc hb-shaper-impl.hh \
+       hb-shaper-list.hh hb-shaper.cc hb-shaper.hh hb-static.cc \
+       hb-string-array.hh hb-style.cc hb-ucd-table.hh hb-ucd.cc \
+       hb-unicode-emoji-table.hh hb-unicode.cc hb-unicode.hh \
+       hb-utf.hh hb-vector.hh hb-priority-queue.hh hb.hh \
        hb-buffer-deserialize-json.hh hb-buffer-deserialize-text.hh \
        hb-number-parser.hh hb-ot-shape-complex-indic-machine.hh \
        hb-ot-shape-complex-khmer-machine.hh \
@@ -358,17 +362,18 @@ am__libharfbuzz_la_SOURCES_DIST = hb-aat-fdsc-table.hh \
        hb-font.h hb-map.h hb-ot-color.h hb-ot-deprecated.h \
        hb-ot-font.h hb-ot-layout.h hb-ot-math.h hb-ot-meta.h \
        hb-ot-metrics.h hb-ot-name.h hb-ot-shape.h hb-ot-var.h hb-ot.h \
-       hb-set.h hb-shape-plan.h hb-shape.h hb-unicode.h hb-version.h \
-       hb.h hb-glib.h hb-ft.h hb-graphite2.h hb-uniscribe.h \
-       hb-directwrite.h hb-gdi.h hb-coretext.h hb-icu.h
+       hb-set.h hb-shape-plan.h hb-shape.h hb-style.h hb-unicode.h \
+       hb-version.h hb.h hb-glib.h hb-ft.h hb-graphite2.h \
+       hb-uniscribe.h hb-directwrite.h hb-gdi.h hb-coretext.h \
+       hb-icu.h
 am__objects_7 = libharfbuzz_la-hb-aat-layout.lo \
        libharfbuzz_la-hb-aat-map.lo libharfbuzz_la-hb-blob.lo \
        libharfbuzz_la-hb-buffer-serialize.lo \
-       libharfbuzz_la-hb-buffer.lo libharfbuzz_la-hb-common.lo \
-       libharfbuzz_la-hb-draw.lo libharfbuzz_la-hb-face.lo \
-       libharfbuzz_la-hb-fallback-shape.lo libharfbuzz_la-hb-font.lo \
-       libharfbuzz_la-hb-map.lo libharfbuzz_la-hb-number.lo \
-       libharfbuzz_la-hb-ot-cff1-table.lo \
+       libharfbuzz_la-hb-buffer-verify.lo libharfbuzz_la-hb-buffer.lo \
+       libharfbuzz_la-hb-common.lo libharfbuzz_la-hb-draw.lo \
+       libharfbuzz_la-hb-face.lo libharfbuzz_la-hb-fallback-shape.lo \
+       libharfbuzz_la-hb-font.lo libharfbuzz_la-hb-map.lo \
+       libharfbuzz_la-hb-number.lo libharfbuzz_la-hb-ot-cff1-table.lo \
        libharfbuzz_la-hb-ot-cff2-table.lo \
        libharfbuzz_la-hb-ot-color.lo libharfbuzz_la-hb-ot-face.lo \
        libharfbuzz_la-hb-ot-font.lo libharfbuzz_la-hb-ot-layout.lo \
@@ -383,8 +388,8 @@ am__objects_7 = libharfbuzz_la-hb-aat-layout.lo \
        libharfbuzz_la-hb-ot-shape-complex-indic.lo \
        libharfbuzz_la-hb-ot-shape-complex-khmer.lo \
        libharfbuzz_la-hb-ot-shape-complex-myanmar.lo \
+       libharfbuzz_la-hb-ot-shape-complex-syllabic.lo \
        libharfbuzz_la-hb-ot-shape-complex-thai.lo \
-       libharfbuzz_la-hb-ot-shape-complex-use-table.lo \
        libharfbuzz_la-hb-ot-shape-complex-use.lo \
        libharfbuzz_la-hb-ot-shape-complex-vowel-constraints.lo \
        libharfbuzz_la-hb-ot-shape-fallback.lo \
@@ -393,8 +398,8 @@ am__objects_7 = libharfbuzz_la-hb-aat-layout.lo \
        libharfbuzz_la-hb-ot-var.lo libharfbuzz_la-hb-set.lo \
        libharfbuzz_la-hb-shape-plan.lo libharfbuzz_la-hb-shape.lo \
        libharfbuzz_la-hb-shaper.lo libharfbuzz_la-hb-static.lo \
-       libharfbuzz_la-hb-ucd.lo libharfbuzz_la-hb-unicode.lo \
-       $(am__objects_5)
+       libharfbuzz_la-hb-style.lo libharfbuzz_la-hb-ucd.lo \
+       libharfbuzz_la-hb-unicode.lo $(am__objects_5)
 am__objects_8 = $(am__objects_5)
 am__objects_9 = libharfbuzz_la-hb-glib.lo
 @HAVE_GLIB_TRUE@am__objects_10 = $(am__objects_9)
@@ -431,25 +436,6 @@ am__objects_34 = $(am__objects_8) $(am__objects_26) $(am__objects_27) \
        $(am__objects_31) $(am__objects_32) $(am__objects_33)
 am_libharfbuzz_la_OBJECTS = $(am__objects_25) $(am__objects_34)
 libharfbuzz_la_OBJECTS = $(am_libharfbuzz_la_OBJECTS)
-am_dump_indic_data_OBJECTS =  \
-       dump_indic_data-dump-indic-data.$(OBJEXT) \
-       dump_indic_data-hb-ot-shape-complex-indic-table.$(OBJEXT)
-dump_indic_data_OBJECTS = $(am_dump_indic_data_OBJECTS)
-dump_indic_data_DEPENDENCIES = libharfbuzz.la $(am__DEPENDENCIES_12)
-am_dump_khmer_data_OBJECTS =  \
-       dump_khmer_data-dump-khmer-data.$(OBJEXT) \
-       dump_khmer_data-hb-ot-shape-complex-indic-table.$(OBJEXT)
-dump_khmer_data_OBJECTS = $(am_dump_khmer_data_OBJECTS)
-dump_khmer_data_DEPENDENCIES = libharfbuzz.la $(am__DEPENDENCIES_12)
-am_dump_myanmar_data_OBJECTS =  \
-       dump_myanmar_data-dump-myanmar-data.$(OBJEXT) \
-       dump_myanmar_data-hb-ot-shape-complex-indic-table.$(OBJEXT)
-dump_myanmar_data_OBJECTS = $(am_dump_myanmar_data_OBJECTS)
-dump_myanmar_data_DEPENDENCIES = libharfbuzz.la $(am__DEPENDENCIES_12)
-am_dump_use_data_OBJECTS = dump_use_data-dump-use-data.$(OBJEXT) \
-       dump_use_data-hb-ot-shape-complex-use-table.$(OBJEXT)
-dump_use_data_OBJECTS = $(am_dump_use_data_OBJECTS)
-dump_use_data_DEPENDENCIES = libharfbuzz.la $(am__DEPENDENCIES_12)
 am_main_OBJECTS = main-main.$(OBJEXT)
 main_OBJECTS = $(am_main_OBJECTS)
 main_DEPENDENCIES = libharfbuzz.la $(am__DEPENDENCIES_12)
@@ -488,10 +474,14 @@ am_test_iter_OBJECTS = test_iter-test-iter.$(OBJEXT) \
        test_iter-hb-static.$(OBJEXT)
 test_iter_OBJECTS = $(am_test_iter_OBJECTS)
 test_iter_DEPENDENCIES = $(am__DEPENDENCIES_13)
-am_test_meta_OBJECTS = test_meta-test-meta.$(OBJEXT) \
-       test_meta-hb-static.$(OBJEXT)
-test_meta_OBJECTS = $(am_test_meta_OBJECTS)
-test_meta_DEPENDENCIES = $(am__DEPENDENCIES_13)
+am_test_machinery_OBJECTS = test_machinery-test-machinery.$(OBJEXT) \
+       test_machinery-hb-static.$(OBJEXT)
+test_machinery_OBJECTS = $(am_test_machinery_OBJECTS)
+test_machinery_DEPENDENCIES = $(am__DEPENDENCIES_13)
+am_test_map_OBJECTS = test_map-test-map.$(OBJEXT) \
+       test_map-hb-static.$(OBJEXT)
+test_map_OBJECTS = $(am_test_map_OBJECTS)
+test_map_DEPENDENCIES = $(am__DEPENDENCIES_13)
 am_test_number_OBJECTS = test_number-test-number.$(OBJEXT) \
        test_number-hb-number.$(OBJEXT)
 test_number_OBJECTS = $(am_test_number_OBJECTS)
@@ -509,10 +499,33 @@ test_ot_name_DEPENDENCIES = libharfbuzz.la $(am__DEPENDENCIES_12)
 am_test_ot_tag_OBJECTS = test_ot_tag-hb-ot-tag.$(OBJEXT)
 test_ot_tag_OBJECTS = $(am_test_ot_tag_OBJECTS)
 test_ot_tag_DEPENDENCIES = $(am__DEPENDENCIES_13)
+am_test_priority_queue_OBJECTS =  \
+       test_priority_queue-test-priority-queue.$(OBJEXT) \
+       test_priority_queue-hb-static.$(OBJEXT)
+test_priority_queue_OBJECTS = $(am_test_priority_queue_OBJECTS)
+test_priority_queue_DEPENDENCIES = libharfbuzz.la \
+       $(am__DEPENDENCIES_12)
+am_test_repacker_OBJECTS = test_repacker-test-repacker.$(OBJEXT) \
+       test_repacker-hb-static.$(OBJEXT)
+test_repacker_OBJECTS = $(am_test_repacker_OBJECTS)
+test_repacker_DEPENDENCIES = libharfbuzz.la libharfbuzz-subset.la \
+       $(am__DEPENDENCIES_12)
+am_test_serialize_OBJECTS = test_serialize-test-serialize.$(OBJEXT) \
+       test_serialize-hb-static.$(OBJEXT)
+test_serialize_OBJECTS = $(am_test_serialize_OBJECTS)
+test_serialize_DEPENDENCIES = $(am__DEPENDENCIES_13)
+am_test_set_OBJECTS = test_set-test-set.$(OBJEXT) \
+       test_set-hb-static.$(OBJEXT)
+test_set_OBJECTS = $(am_test_set_OBJECTS)
+test_set_DEPENDENCIES = $(am__DEPENDENCIES_13)
 am_test_unicode_ranges_OBJECTS =  \
        test_unicode_ranges-test-unicode-ranges.$(OBJEXT)
 test_unicode_ranges_OBJECTS = $(am_test_unicode_ranges_OBJECTS)
 test_unicode_ranges_DEPENDENCIES = $(am__DEPENDENCIES_13)
+am_test_vector_OBJECTS = test_vector-test-vector.$(OBJEXT) \
+       test_vector-hb-static.$(OBJEXT)
+test_vector_OBJECTS = $(am_test_vector_OBJECTS)
+test_vector_DEPENDENCIES = $(am__DEPENDENCIES_13)
 am__dist_check_SCRIPTS_DIST = check-c-linkage-decls.py \
        check-externs.py check-header-guards.py check-includes.py \
        check-static-inits.py check-symbols.py check-libstdc++.py
@@ -531,14 +544,7 @@ am__v_at_1 =
 DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
 depcomp = $(SHELL) $(top_srcdir)/depcomp
 am__maybe_remake_depfiles = depfiles
-am__depfiles_remade = ./$(DEPDIR)/dump_indic_data-dump-indic-data.Po \
-       ./$(DEPDIR)/dump_indic_data-hb-ot-shape-complex-indic-table.Po \
-       ./$(DEPDIR)/dump_khmer_data-dump-khmer-data.Po \
-       ./$(DEPDIR)/dump_khmer_data-hb-ot-shape-complex-indic-table.Po \
-       ./$(DEPDIR)/dump_myanmar_data-dump-myanmar-data.Po \
-       ./$(DEPDIR)/dump_myanmar_data-hb-ot-shape-complex-indic-table.Po \
-       ./$(DEPDIR)/dump_use_data-dump-use-data.Po \
-       ./$(DEPDIR)/dump_use_data-hb-ot-shape-complex-use-table.Po \
+am__depfiles_remade =  \
        ./$(DEPDIR)/libharfbuzz_gobject_la-hb-gobject-enums.Plo \
        ./$(DEPDIR)/libharfbuzz_gobject_la-hb-gobject-structs.Plo \
        ./$(DEPDIR)/libharfbuzz_icu_la-hb-icu.Plo \
@@ -546,6 +552,7 @@ am__depfiles_remade = ./$(DEPDIR)/dump_indic_data-dump-indic-data.Po \
        ./$(DEPDIR)/libharfbuzz_la-hb-aat-map.Plo \
        ./$(DEPDIR)/libharfbuzz_la-hb-blob.Plo \
        ./$(DEPDIR)/libharfbuzz_la-hb-buffer-serialize.Plo \
+       ./$(DEPDIR)/libharfbuzz_la-hb-buffer-verify.Plo \
        ./$(DEPDIR)/libharfbuzz_la-hb-buffer.Plo \
        ./$(DEPDIR)/libharfbuzz_la-hb-common.Plo \
        ./$(DEPDIR)/libharfbuzz_la-hb-coretext.Plo \
@@ -580,8 +587,8 @@ am__depfiles_remade = ./$(DEPDIR)/dump_indic_data-dump-indic-data.Po \
        ./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-indic.Plo \
        ./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-khmer.Plo \
        ./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-myanmar.Plo \
+       ./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-syllabic.Plo \
        ./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-thai.Plo \
-       ./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-use-table.Plo \
        ./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-use.Plo \
        ./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-vowel-constraints.Plo \
        ./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-fallback.Plo \
@@ -594,6 +601,7 @@ am__depfiles_remade = ./$(DEPDIR)/dump_indic_data-dump-indic-data.Po \
        ./$(DEPDIR)/libharfbuzz_la-hb-shape.Plo \
        ./$(DEPDIR)/libharfbuzz_la-hb-shaper.Plo \
        ./$(DEPDIR)/libharfbuzz_la-hb-static.Plo \
+       ./$(DEPDIR)/libharfbuzz_la-hb-style.Plo \
        ./$(DEPDIR)/libharfbuzz_la-hb-ucd.Plo \
        ./$(DEPDIR)/libharfbuzz_la-hb-unicode.Plo \
        ./$(DEPDIR)/libharfbuzz_la-hb-uniscribe.Plo \
@@ -618,15 +626,27 @@ am__depfiles_remade = ./$(DEPDIR)/dump_indic_data-dump-indic-data.Po \
        ./$(DEPDIR)/test_gsub_would_substitute-test-gsub-would-substitute.Po \
        ./$(DEPDIR)/test_iter-hb-static.Po \
        ./$(DEPDIR)/test_iter-test-iter.Po \
-       ./$(DEPDIR)/test_meta-hb-static.Po \
-       ./$(DEPDIR)/test_meta-test-meta.Po \
+       ./$(DEPDIR)/test_machinery-hb-static.Po \
+       ./$(DEPDIR)/test_machinery-test-machinery.Po \
+       ./$(DEPDIR)/test_map-hb-static.Po \
+       ./$(DEPDIR)/test_map-test-map.Po \
        ./$(DEPDIR)/test_number-hb-number.Po \
        ./$(DEPDIR)/test_number-test-number.Po \
        ./$(DEPDIR)/test_ot_glyphname-test-ot-glyphname.Po \
        ./$(DEPDIR)/test_ot_meta-test-ot-meta.Po \
        ./$(DEPDIR)/test_ot_name-test-ot-name.Po \
        ./$(DEPDIR)/test_ot_tag-hb-ot-tag.Po \
-       ./$(DEPDIR)/test_unicode_ranges-test-unicode-ranges.Po
+       ./$(DEPDIR)/test_priority_queue-hb-static.Po \
+       ./$(DEPDIR)/test_priority_queue-test-priority-queue.Po \
+       ./$(DEPDIR)/test_repacker-hb-static.Po \
+       ./$(DEPDIR)/test_repacker-test-repacker.Po \
+       ./$(DEPDIR)/test_serialize-hb-static.Po \
+       ./$(DEPDIR)/test_serialize-test-serialize.Po \
+       ./$(DEPDIR)/test_set-hb-static.Po \
+       ./$(DEPDIR)/test_set-test-set.Po \
+       ./$(DEPDIR)/test_unicode_ranges-test-unicode-ranges.Po \
+       ./$(DEPDIR)/test_vector-hb-static.Po \
+       ./$(DEPDIR)/test_vector-test-vector.Po
 am__mv = mv -f
 CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
        $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
@@ -667,31 +687,33 @@ am__v_CCLD_1 =
 SOURCES = $(libharfbuzz_gobject_la_SOURCES) \
        $(nodist_libharfbuzz_gobject_la_SOURCES) \
        $(libharfbuzz_icu_la_SOURCES) $(libharfbuzz_subset_la_SOURCES) \
-       $(libharfbuzz_la_SOURCES) $(dump_indic_data_SOURCES) \
-       $(dump_khmer_data_SOURCES) $(dump_myanmar_data_SOURCES) \
-       $(dump_use_data_SOURCES) $(main_SOURCES) $(test_SOURCES) \
+       $(libharfbuzz_la_SOURCES) $(main_SOURCES) $(test_SOURCES) \
        $(test_algs_SOURCES) $(test_array_SOURCES) \
        $(test_bimap_SOURCES) $(test_buffer_serialize_SOURCES) \
        $(test_gpos_size_params_SOURCES) \
        $(test_gsub_would_substitute_SOURCES) $(test_iter_SOURCES) \
-       $(test_meta_SOURCES) $(test_number_SOURCES) \
-       $(test_ot_glyphname_SOURCES) $(test_ot_meta_SOURCES) \
-       $(test_ot_name_SOURCES) $(test_ot_tag_SOURCES) \
-       $(test_unicode_ranges_SOURCES)
+       $(test_machinery_SOURCES) $(test_map_SOURCES) \
+       $(test_number_SOURCES) $(test_ot_glyphname_SOURCES) \
+       $(test_ot_meta_SOURCES) $(test_ot_name_SOURCES) \
+       $(test_ot_tag_SOURCES) $(test_priority_queue_SOURCES) \
+       $(test_repacker_SOURCES) $(test_serialize_SOURCES) \
+       $(test_set_SOURCES) $(test_unicode_ranges_SOURCES) \
+       $(test_vector_SOURCES)
 DIST_SOURCES = $(am__libharfbuzz_gobject_la_SOURCES_DIST) \
        $(am__libharfbuzz_icu_la_SOURCES_DIST) \
        $(libharfbuzz_subset_la_SOURCES) \
-       $(am__libharfbuzz_la_SOURCES_DIST) $(dump_indic_data_SOURCES) \
-       $(dump_khmer_data_SOURCES) $(dump_myanmar_data_SOURCES) \
-       $(dump_use_data_SOURCES) $(main_SOURCES) $(test_SOURCES) \
-       $(test_algs_SOURCES) $(test_array_SOURCES) \
+       $(am__libharfbuzz_la_SOURCES_DIST) $(main_SOURCES) \
+       $(test_SOURCES) $(test_algs_SOURCES) $(test_array_SOURCES) \
        $(test_bimap_SOURCES) $(test_buffer_serialize_SOURCES) \
        $(test_gpos_size_params_SOURCES) \
        $(test_gsub_would_substitute_SOURCES) $(test_iter_SOURCES) \
-       $(test_meta_SOURCES) $(test_number_SOURCES) \
-       $(test_ot_glyphname_SOURCES) $(test_ot_meta_SOURCES) \
-       $(test_ot_name_SOURCES) $(test_ot_tag_SOURCES) \
-       $(test_unicode_ranges_SOURCES)
+       $(test_machinery_SOURCES) $(test_map_SOURCES) \
+       $(test_number_SOURCES) $(test_ot_glyphname_SOURCES) \
+       $(test_ot_meta_SOURCES) $(test_ot_name_SOURCES) \
+       $(test_ot_tag_SOURCES) $(test_priority_queue_SOURCES) \
+       $(test_repacker_SOURCES) $(test_serialize_SOURCES) \
+       $(test_set_SOURCES) $(test_unicode_ranges_SOURCES) \
+       $(test_vector_SOURCES)
 RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
        ctags-recursive dvi-recursive html-recursive info-recursive \
        install-data-recursive install-dvi-recursive \
@@ -711,10 +733,10 @@ am__pkginclude_HEADERS_DIST = hb-aat-layout.h hb-aat.h hb-blob.h \
        hb-font.h hb-map.h hb-ot-color.h hb-ot-deprecated.h \
        hb-ot-font.h hb-ot-layout.h hb-ot-math.h hb-ot-meta.h \
        hb-ot-metrics.h hb-ot-name.h hb-ot-shape.h hb-ot-var.h hb-ot.h \
-       hb-set.h hb-shape-plan.h hb-shape.h hb-unicode.h hb-version.h \
-       hb.h hb-glib.h hb-ft.h hb-graphite2.h hb-uniscribe.h \
-       hb-directwrite.h hb-gdi.h hb-coretext.h hb-icu.h hb-subset.h \
-       hb-gobject.h hb-gobject-structs.h
+       hb-set.h hb-shape-plan.h hb-shape.h hb-style.h hb-unicode.h \
+       hb-version.h hb.h hb-glib.h hb-ft.h hb-graphite2.h \
+       hb-uniscribe.h hb-directwrite.h hb-gdi.h hb-coretext.h \
+       hb-icu.h hb-subset.h hb-gobject.h hb-gobject-structs.h
 HEADERS = $(nodist_pkginclude_HEADERS) $(pkginclude_HEADERS)
 RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive        \
   distclean-recursive maintainer-clean-recursive
@@ -968,6 +990,8 @@ CAIRO_LIBS = @CAIRO_LIBS@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
+CHAFA_CFLAGS = @CHAFA_CFLAGS@
+CHAFA_LIBS = @CHAFA_LIBS@
 CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
 CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
 CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
@@ -996,8 +1020,6 @@ ECHO_T = @ECHO_T@
 EGREP = @EGREP@
 EXEEXT = @EXEEXT@
 FGREP = @FGREP@
-FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@
-FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
 FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
 FREETYPE_DEPS = @FREETYPE_DEPS@
 FREETYPE_LIBS = @FREETYPE_LIBS@
@@ -1030,7 +1052,6 @@ HB_VERSION_MICRO = @HB_VERSION_MICRO@
 HB_VERSION_MINOR = @HB_VERSION_MINOR@
 HTML_DIR = @HTML_DIR@
 ICU_CFLAGS = @ICU_CFLAGS@
-ICU_CONFIG = @ICU_CONFIG@
 ICU_LIBS = @ICU_LIBS@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
@@ -1136,6 +1157,7 @@ pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -1161,14 +1183,12 @@ DISTCHECK_CONFIGURE_FLAGS = --enable-introspection
 lib_LTLIBRARIES = libharfbuzz.la libharfbuzz-subset.la \
        $(am__append_38) $(am__append_41)
 HB_BASE_sources = \
-       hb-aat-fdsc-table.hh \
        hb-aat-layout-ankr-table.hh \
        hb-aat-layout-bsln-table.hh \
        hb-aat-layout-common.hh \
        hb-aat-layout-feat-table.hh \
        hb-aat-layout-just-table.hh \
        hb-aat-layout-kerx-table.hh \
-       hb-aat-layout-lcar-table.hh \
        hb-aat-layout-morx-table.hh \
        hb-aat-layout-opbd-table.hh \
        hb-aat-layout-trak-table.hh \
@@ -1180,9 +1200,14 @@ HB_BASE_sources = \
        hb-algs.hh \
        hb-array.hh \
        hb-atomic.hh \
+       hb-bimap.hh \
+       hb-bit-page.hh \
+       hb-bit-set.hh \
+       hb-bit-set-invertible.hh \
        hb-blob.cc \
        hb-blob.hh \
        hb-buffer-serialize.cc \
+       hb-buffer-verify.cc \
        hb-buffer.cc \
        hb-buffer.hh \
        hb-cache.hh \
@@ -1207,8 +1232,8 @@ HB_BASE_sources = \
        hb-machinery.hh \
        hb-map.cc \
        hb-map.hh \
-       hb-bimap.hh \
        hb-meta.hh \
+       hb-ms-feature-ranges.hh \
        hb-mutex.hh \
        hb-null.hh \
        hb-number.cc \
@@ -1217,9 +1242,9 @@ HB_BASE_sources = \
        hb-open-file.hh \
        hb-open-type.hh \
        hb-ot-cff-common.hh \
+       hb-ot-cff1-std-str.hh \
        hb-ot-cff1-table.cc \
        hb-ot-cff1-table.hh \
-       hb-ot-cff1-std-str.hh \
        hb-ot-cff2-table.cc \
        hb-ot-cff2-table.hh \
        hb-ot-cmap-table.hh \
@@ -1229,9 +1254,9 @@ HB_BASE_sources = \
        hb-ot-color-sbix-table.hh \
        hb-ot-color-svg-table.hh \
        hb-ot-color.cc \
+       hb-ot-face-table-list.hh \
        hb-ot-face.cc \
        hb-ot-face.hh \
-       hb-ot-face-table-list.hh \
        hb-ot-font.cc \
        hb-ot-gasp-table.hh \
        hb-ot-glyf-table.hh \
@@ -1267,6 +1292,7 @@ HB_BASE_sources = \
        hb-ot-post-macroman.hh \
        hb-ot-post-table.hh \
        hb-ot-shape-complex-arabic-fallback.hh \
+       hb-ot-shape-complex-arabic-joining-list.hh \
        hb-ot-shape-complex-arabic-table.hh \
        hb-ot-shape-complex-arabic-win1256.hh \
        hb-ot-shape-complex-arabic.cc \
@@ -1281,10 +1307,11 @@ HB_BASE_sources = \
        hb-ot-shape-complex-khmer.hh \
        hb-ot-shape-complex-myanmar.cc \
        hb-ot-shape-complex-myanmar.hh \
+       hb-ot-shape-complex-syllabic.cc \
+       hb-ot-shape-complex-syllabic.hh \
        hb-ot-shape-complex-thai.cc \
-       hb-ot-shape-complex-use-table.cc \
+       hb-ot-shape-complex-use-table.hh \
        hb-ot-shape-complex-use.cc \
-       hb-ot-shape-complex-use.hh \
        hb-ot-shape-complex-vowel-constraints.cc \
        hb-ot-shape-complex-vowel-constraints.hh \
        hb-ot-shape-complex.hh \
@@ -1298,6 +1325,7 @@ HB_BASE_sources = \
        hb-ot-tag-table.hh \
        hb-ot-tag.cc \
        hb-ot-var-avar-table.hh \
+       hb-ot-var-common.hh \
        hb-ot-var-fvar-table.hh \
        hb-ot-var-gvar-table.hh \
        hb-ot-var-hvar-table.hh \
@@ -1319,6 +1347,7 @@ HB_BASE_sources = \
        hb-shaper.hh \
        hb-static.cc \
        hb-string-array.hh \
+       hb-style.cc \
        hb-ucd-table.hh \
        hb-ucd.cc \
        hb-unicode-emoji-table.hh \
@@ -1326,6 +1355,7 @@ HB_BASE_sources = \
        hb-unicode.hh \
        hb-utf.hh \
        hb-vector.hh \
+       hb-priority-queue.hh \
        hb.hh \
        $(NULL)
 
@@ -1374,6 +1404,7 @@ HB_BASE_headers = \
        hb-set.h \
        hb-shape-plan.h \
        hb-shape.h \
+       hb-style.h \
        hb-unicode.h \
        hb-version.h \
        hb.h \
@@ -1408,6 +1439,8 @@ HB_SUBSET_sources = \
        hb-number.hh \
        hb-ot-cff1-table.cc \
        hb-ot-cff2-table.cc \
+       hb-ot-color-colrv1-closure.hh \
+       hb-ot-post-table-v2subset.hh \
        hb-static.cc \
        hb-subset-cff-common.cc \
        hb-subset-cff-common.hh \
@@ -1419,10 +1452,9 @@ HB_SUBSET_sources = \
        hb-subset-input.hh \
        hb-subset-plan.cc \
        hb-subset-plan.hh \
-       hb-subset-plan.hh \
        hb-subset.cc \
        hb-subset.hh \
-       hb-subset.hh \
+       hb-repacker.hh \
        $(NULL)
 
 HB_SUBSET_headers = \
@@ -1503,6 +1535,7 @@ EXTRA_libharfbuzz_subset_la_DEPENDENCIES = $(harfbuzz_subset_def_dependency)
 DEF_FILES = harfbuzz.def harfbuzz-subset.def harfbuzz-icu.def \
        harfbuzz-deprecated-symbols.txt $(am__append_47)
 GENERATORS = \
+       gen-arabic-joining-list.py \
        gen-arabic-table.py \
        gen-def.py \
        gen-emoji-table.py \
@@ -1545,19 +1578,23 @@ test_gpos_size_params_LDADD = libharfbuzz.la $(HBLIBS)
 test_gsub_would_substitute_SOURCES = test-gsub-would-substitute.cc
 test_gsub_would_substitute_CPPFLAGS = $(HBCFLAGS) $(FREETYPE_CFLAGS)
 test_gsub_would_substitute_LDADD = libharfbuzz.la $(HBLIBS) $(FREETYPE_LIBS)
-dump_indic_data_SOURCES = dump-indic-data.cc hb-ot-shape-complex-indic-table.cc
-dump_indic_data_CPPFLAGS = $(HBCFLAGS)
-dump_indic_data_LDADD = libharfbuzz.la $(HBLIBS)
-dump_khmer_data_SOURCES = dump-khmer-data.cc hb-ot-shape-complex-indic-table.cc
-dump_khmer_data_CPPFLAGS = $(HBCFLAGS)
-dump_khmer_data_LDADD = libharfbuzz.la $(HBLIBS)
-dump_myanmar_data_SOURCES = dump-myanmar-data.cc hb-ot-shape-complex-indic-table.cc
-dump_myanmar_data_CPPFLAGS = $(HBCFLAGS)
-dump_myanmar_data_LDADD = libharfbuzz.la $(HBLIBS)
-dump_use_data_SOURCES = dump-use-data.cc hb-ot-shape-complex-use-table.cc
-dump_use_data_CPPFLAGS = $(HBCFLAGS)
-dump_use_data_LDADD = libharfbuzz.la $(HBLIBS)
-COMPILED_TESTS = test-algs test-array test-iter test-meta test-number test-ot-tag test-unicode-ranges test-bimap
+COMPILED_TESTS = \
+       test-algs \
+       test-array \
+       test-bimap \
+       test-iter \
+       test-machinery \
+       test-map \
+       test-number \
+       test-ot-tag \
+       test-priority-queue \
+       test-set \
+       test-serialize \
+       test-unicode-ranges \
+       test-vector \
+       test-repacker \
+       $(NULL)
+
 COMPILED_TESTS_CPPFLAGS = $(HBCFLAGS) -DMAIN -UNDEBUG
 COMPILED_TESTS_LDADD = libharfbuzz.la $(HBLIBS)
 test_algs_SOURCES = test-algs.cc hb-static.cc
@@ -1566,24 +1603,42 @@ test_algs_LDADD = $(COMPILED_TESTS_LDADD)
 test_array_SOURCES = test-array.cc
 test_array_CPPFLAGS = $(HBCFLAGS)
 test_array_LDADD = libharfbuzz.la $(HBLIBS)
+test_bimap_SOURCES = test-bimap.cc hb-static.cc
+test_bimap_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS)
+test_bimap_LDADD = $(COMPILED_TESTS_LDADD)
 test_iter_SOURCES = test-iter.cc hb-static.cc
 test_iter_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS)
 test_iter_LDADD = $(COMPILED_TESTS_LDADD)
-test_meta_SOURCES = test-meta.cc hb-static.cc
-test_meta_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS)
-test_meta_LDADD = $(COMPILED_TESTS_LDADD)
+test_machinery_SOURCES = test-machinery.cc hb-static.cc
+test_machinery_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS)
+test_machinery_LDADD = $(COMPILED_TESTS_LDADD)
+test_map_SOURCES = test-map.cc hb-static.cc
+test_map_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS)
+test_map_LDADD = $(COMPILED_TESTS_LDADD)
 test_number_SOURCES = test-number.cc hb-number.cc
 test_number_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS)
 test_number_LDADD = $(COMPILED_TESTS_LDADD)
 test_ot_tag_SOURCES = hb-ot-tag.cc
 test_ot_tag_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS)
 test_ot_tag_LDADD = $(COMPILED_TESTS_LDADD)
+test_priority_queue_SOURCES = test-priority-queue.cc hb-static.cc
+test_priority_queue_CPPFLAGS = $(HBCFLAGS)
+test_priority_queue_LDADD = libharfbuzz.la $(HBLIBS)
+test_repacker_SOURCES = test-repacker.cc hb-static.cc
+test_repacker_CPPFLAGS = $(HBCFLAGS)
+test_repacker_LDADD = libharfbuzz.la libharfbuzz-subset.la $(HBLIBS)
+test_set_SOURCES = test-set.cc hb-static.cc
+test_set_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS)
+test_set_LDADD = $(COMPILED_TESTS_LDADD)
+test_serialize_SOURCES = test-serialize.cc hb-static.cc
+test_serialize_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS)
+test_serialize_LDADD = $(COMPILED_TESTS_LDADD)
 test_unicode_ranges_SOURCES = test-unicode-ranges.cc
 test_unicode_ranges_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS)
 test_unicode_ranges_LDADD = $(COMPILED_TESTS_LDADD)
-test_bimap_SOURCES = test-bimap.cc hb-static.cc
-test_bimap_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS)
-test_bimap_LDADD = $(COMPILED_TESTS_LDADD)
+test_vector_SOURCES = test-vector.cc hb-static.cc
+test_vector_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS)
+test_vector_LDADD = $(COMPILED_TESTS_LDADD)
 dist_check_SCRIPTS = check-c-linkage-decls.py check-externs.py \
        check-header-guards.py check-includes.py check-static-inits.py \
        check-symbols.py $(NULL) $(am__append_48)
@@ -1593,6 +1648,10 @@ TESTS_ENVIRONMENT = \
        MAKE="$(MAKE) $(AM_MAKEFLAGS)" \
        HBSOURCES="$(HBSOURCES)" \
        HBHEADERS="$(HBHEADERS)" \
+       LDD="$(LDD)" \
+       NM="$(NM)" \
+       OBJDUMP="$(OBJDUMP)" \
+       OTOOL="$(OTOOL)" \
        $(NULL)
 
 @HAVE_INTROSPECTION_TRUE@INTROSPECTION_GIRS = HarfBuzz-0.0.gir # What does the 0 mean anyway?!
@@ -1613,14 +1672,7 @@ TESTS_ENVIRONMENT = \
 @HAVE_INTROSPECTION_TRUE@HarfBuzz_0_0_gir_CFLAGS = \
 @HAVE_INTROSPECTION_TRUE@      $(INCLUDES) \
 @HAVE_INTROSPECTION_TRUE@      $(HBCFLAGS) \
-@HAVE_INTROSPECTION_TRUE@      -DHB_H \
-@HAVE_INTROSPECTION_TRUE@      -DHB_H_IN \
-@HAVE_INTROSPECTION_TRUE@      -DHB_OT_H \
-@HAVE_INTROSPECTION_TRUE@      -DHB_OT_H_IN \
-@HAVE_INTROSPECTION_TRUE@      -DHB_AAT_H \
-@HAVE_INTROSPECTION_TRUE@      -DHB_AAT_H_IN \
-@HAVE_INTROSPECTION_TRUE@      -DHB_GOBJECT_H \
-@HAVE_INTROSPECTION_TRUE@      -DHB_GOBJECT_H_IN \
+@HAVE_INTROSPECTION_TRUE@      -DHB_NO_SINGLE_HEADER_ERROR \
 @HAVE_INTROSPECTION_TRUE@      -DHAVE_GOBJECT \
 @HAVE_INTROSPECTION_TRUE@      -DHB_EXTERN= \
 @HAVE_INTROSPECTION_TRUE@      $(NULL)
@@ -1809,22 +1861,6 @@ libharfbuzz-subset.la: $(libharfbuzz_subset_la_OBJECTS) $(libharfbuzz_subset_la_
 libharfbuzz.la: $(libharfbuzz_la_OBJECTS) $(libharfbuzz_la_DEPENDENCIES) $(EXTRA_libharfbuzz_la_DEPENDENCIES) 
        $(AM_V_GEN)$(libharfbuzz_la_LINK) -rpath $(libdir) $(libharfbuzz_la_OBJECTS) $(libharfbuzz_la_LIBADD) $(LIBS)
 
-dump-indic-data$(EXEEXT): $(dump_indic_data_OBJECTS) $(dump_indic_data_DEPENDENCIES) $(EXTRA_dump_indic_data_DEPENDENCIES) 
-       @rm -f dump-indic-data$(EXEEXT)
-       $(AM_V_CXXLD)$(CXXLINK) $(dump_indic_data_OBJECTS) $(dump_indic_data_LDADD) $(LIBS)
-
-dump-khmer-data$(EXEEXT): $(dump_khmer_data_OBJECTS) $(dump_khmer_data_DEPENDENCIES) $(EXTRA_dump_khmer_data_DEPENDENCIES) 
-       @rm -f dump-khmer-data$(EXEEXT)
-       $(AM_V_CXXLD)$(CXXLINK) $(dump_khmer_data_OBJECTS) $(dump_khmer_data_LDADD) $(LIBS)
-
-dump-myanmar-data$(EXEEXT): $(dump_myanmar_data_OBJECTS) $(dump_myanmar_data_DEPENDENCIES) $(EXTRA_dump_myanmar_data_DEPENDENCIES) 
-       @rm -f dump-myanmar-data$(EXEEXT)
-       $(AM_V_CXXLD)$(CXXLINK) $(dump_myanmar_data_OBJECTS) $(dump_myanmar_data_LDADD) $(LIBS)
-
-dump-use-data$(EXEEXT): $(dump_use_data_OBJECTS) $(dump_use_data_DEPENDENCIES) $(EXTRA_dump_use_data_DEPENDENCIES) 
-       @rm -f dump-use-data$(EXEEXT)
-       $(AM_V_CXXLD)$(CXXLINK) $(dump_use_data_OBJECTS) $(dump_use_data_LDADD) $(LIBS)
-
 main$(EXEEXT): $(main_OBJECTS) $(main_DEPENDENCIES) $(EXTRA_main_DEPENDENCIES) 
        @rm -f main$(EXEEXT)
        $(AM_V_CXXLD)$(CXXLINK) $(main_OBJECTS) $(main_LDADD) $(LIBS)
@@ -1861,9 +1897,13 @@ test-iter$(EXEEXT): $(test_iter_OBJECTS) $(test_iter_DEPENDENCIES) $(EXTRA_test_
        @rm -f test-iter$(EXEEXT)
        $(AM_V_CXXLD)$(CXXLINK) $(test_iter_OBJECTS) $(test_iter_LDADD) $(LIBS)
 
-test-meta$(EXEEXT): $(test_meta_OBJECTS) $(test_meta_DEPENDENCIES) $(EXTRA_test_meta_DEPENDENCIES) 
-       @rm -f test-meta$(EXEEXT)
-       $(AM_V_CXXLD)$(CXXLINK) $(test_meta_OBJECTS) $(test_meta_LDADD) $(LIBS)
+test-machinery$(EXEEXT): $(test_machinery_OBJECTS) $(test_machinery_DEPENDENCIES) $(EXTRA_test_machinery_DEPENDENCIES) 
+       @rm -f test-machinery$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(test_machinery_OBJECTS) $(test_machinery_LDADD) $(LIBS)
+
+test-map$(EXEEXT): $(test_map_OBJECTS) $(test_map_DEPENDENCIES) $(EXTRA_test_map_DEPENDENCIES) 
+       @rm -f test-map$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(test_map_OBJECTS) $(test_map_LDADD) $(LIBS)
 
 test-number$(EXEEXT): $(test_number_OBJECTS) $(test_number_DEPENDENCIES) $(EXTRA_test_number_DEPENDENCIES) 
        @rm -f test-number$(EXEEXT)
@@ -1885,24 +1925,36 @@ test-ot-tag$(EXEEXT): $(test_ot_tag_OBJECTS) $(test_ot_tag_DEPENDENCIES) $(EXTRA
        @rm -f test-ot-tag$(EXEEXT)
        $(AM_V_CXXLD)$(CXXLINK) $(test_ot_tag_OBJECTS) $(test_ot_tag_LDADD) $(LIBS)
 
+test-priority-queue$(EXEEXT): $(test_priority_queue_OBJECTS) $(test_priority_queue_DEPENDENCIES) $(EXTRA_test_priority_queue_DEPENDENCIES) 
+       @rm -f test-priority-queue$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(test_priority_queue_OBJECTS) $(test_priority_queue_LDADD) $(LIBS)
+
+test-repacker$(EXEEXT): $(test_repacker_OBJECTS) $(test_repacker_DEPENDENCIES) $(EXTRA_test_repacker_DEPENDENCIES) 
+       @rm -f test-repacker$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(test_repacker_OBJECTS) $(test_repacker_LDADD) $(LIBS)
+
+test-serialize$(EXEEXT): $(test_serialize_OBJECTS) $(test_serialize_DEPENDENCIES) $(EXTRA_test_serialize_DEPENDENCIES) 
+       @rm -f test-serialize$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(test_serialize_OBJECTS) $(test_serialize_LDADD) $(LIBS)
+
+test-set$(EXEEXT): $(test_set_OBJECTS) $(test_set_DEPENDENCIES) $(EXTRA_test_set_DEPENDENCIES) 
+       @rm -f test-set$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(test_set_OBJECTS) $(test_set_LDADD) $(LIBS)
+
 test-unicode-ranges$(EXEEXT): $(test_unicode_ranges_OBJECTS) $(test_unicode_ranges_DEPENDENCIES) $(EXTRA_test_unicode_ranges_DEPENDENCIES) 
        @rm -f test-unicode-ranges$(EXEEXT)
        $(AM_V_CXXLD)$(CXXLINK) $(test_unicode_ranges_OBJECTS) $(test_unicode_ranges_LDADD) $(LIBS)
 
+test-vector$(EXEEXT): $(test_vector_OBJECTS) $(test_vector_DEPENDENCIES) $(EXTRA_test_vector_DEPENDENCIES) 
+       @rm -f test-vector$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(test_vector_OBJECTS) $(test_vector_LDADD) $(LIBS)
+
 mostlyclean-compile:
        -rm -f *.$(OBJEXT)
 
 distclean-compile:
        -rm -f *.tab.c
 
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dump_indic_data-dump-indic-data.Po@am__quote@ # am--include-marker
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dump_indic_data-hb-ot-shape-complex-indic-table.Po@am__quote@ # am--include-marker
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dump_khmer_data-dump-khmer-data.Po@am__quote@ # am--include-marker
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dump_khmer_data-hb-ot-shape-complex-indic-table.Po@am__quote@ # am--include-marker
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dump_myanmar_data-dump-myanmar-data.Po@am__quote@ # am--include-marker
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dump_myanmar_data-hb-ot-shape-complex-indic-table.Po@am__quote@ # am--include-marker
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dump_use_data-dump-use-data.Po@am__quote@ # am--include-marker
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dump_use_data-hb-ot-shape-complex-use-table.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_gobject_la-hb-gobject-enums.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_gobject_la-hb-gobject-structs.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_icu_la-hb-icu.Plo@am__quote@ # am--include-marker
@@ -1910,6 +1962,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-aat-map.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-blob.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-buffer-serialize.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-buffer-verify.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-buffer.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-common.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-coretext.Plo@am__quote@ # am--include-marker
@@ -1944,8 +1997,8 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-indic.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-khmer.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-myanmar.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-syllabic.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-thai.Plo@am__quote@ # am--include-marker
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-use-table.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-use.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-vowel-constraints.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-fallback.Plo@am__quote@ # am--include-marker
@@ -1958,6 +2011,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-shape.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-shaper.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-static.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-style.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ucd.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-unicode.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-uniscribe.Plo@am__quote@ # am--include-marker
@@ -1983,15 +2037,27 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_gsub_would_substitute-test-gsub-would-substitute.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_iter-hb-static.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_iter-test-iter.Po@am__quote@ # am--include-marker
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_meta-hb-static.Po@am__quote@ # am--include-marker
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_meta-test-meta.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_machinery-hb-static.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_machinery-test-machinery.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_map-hb-static.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_map-test-map.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_number-hb-number.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_number-test-number.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_ot_glyphname-test-ot-glyphname.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_ot_meta-test-ot-meta.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_ot_name-test-ot-name.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_ot_tag-hb-ot-tag.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_priority_queue-hb-static.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_priority_queue-test-priority-queue.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_repacker-hb-static.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_repacker-test-repacker.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_serialize-hb-static.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_serialize-test-serialize.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_set-hb-static.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_set-test-set.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_unicode_ranges-test-unicode-ranges.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_vector-hb-static.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_vector-test-vector.Po@am__quote@ # am--include-marker
 
 $(am__depfiles_remade):
        @$(MKDIR_P) $(@D)
@@ -2139,6 +2205,13 @@ libharfbuzz_la-hb-buffer-serialize.lo: hb-buffer-serialize.cc
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-buffer-serialize.lo `test -f 'hb-buffer-serialize.cc' || echo '$(srcdir)/'`hb-buffer-serialize.cc
 
+libharfbuzz_la-hb-buffer-verify.lo: hb-buffer-verify.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-buffer-verify.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-buffer-verify.Tpo -c -o libharfbuzz_la-hb-buffer-verify.lo `test -f 'hb-buffer-verify.cc' || echo '$(srcdir)/'`hb-buffer-verify.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-buffer-verify.Tpo $(DEPDIR)/libharfbuzz_la-hb-buffer-verify.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='hb-buffer-verify.cc' object='libharfbuzz_la-hb-buffer-verify.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-buffer-verify.lo `test -f 'hb-buffer-verify.cc' || echo '$(srcdir)/'`hb-buffer-verify.cc
+
 libharfbuzz_la-hb-buffer.lo: hb-buffer.cc
 @am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-buffer.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-buffer.Tpo -c -o libharfbuzz_la-hb-buffer.lo `test -f 'hb-buffer.cc' || echo '$(srcdir)/'`hb-buffer.cc
 @am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-buffer.Tpo $(DEPDIR)/libharfbuzz_la-hb-buffer.Plo
@@ -2328,6 +2401,13 @@ libharfbuzz_la-hb-ot-shape-complex-myanmar.lo: hb-ot-shape-complex-myanmar.cc
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-shape-complex-myanmar.lo `test -f 'hb-ot-shape-complex-myanmar.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-myanmar.cc
 
+libharfbuzz_la-hb-ot-shape-complex-syllabic.lo: hb-ot-shape-complex-syllabic.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-shape-complex-syllabic.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-syllabic.Tpo -c -o libharfbuzz_la-hb-ot-shape-complex-syllabic.lo `test -f 'hb-ot-shape-complex-syllabic.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-syllabic.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-syllabic.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-syllabic.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='hb-ot-shape-complex-syllabic.cc' object='libharfbuzz_la-hb-ot-shape-complex-syllabic.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-shape-complex-syllabic.lo `test -f 'hb-ot-shape-complex-syllabic.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-syllabic.cc
+
 libharfbuzz_la-hb-ot-shape-complex-thai.lo: hb-ot-shape-complex-thai.cc
 @am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-shape-complex-thai.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-thai.Tpo -c -o libharfbuzz_la-hb-ot-shape-complex-thai.lo `test -f 'hb-ot-shape-complex-thai.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-thai.cc
 @am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-thai.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-thai.Plo
@@ -2335,13 +2415,6 @@ libharfbuzz_la-hb-ot-shape-complex-thai.lo: hb-ot-shape-complex-thai.cc
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-shape-complex-thai.lo `test -f 'hb-ot-shape-complex-thai.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-thai.cc
 
-libharfbuzz_la-hb-ot-shape-complex-use-table.lo: hb-ot-shape-complex-use-table.cc
-@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-shape-complex-use-table.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-use-table.Tpo -c -o libharfbuzz_la-hb-ot-shape-complex-use-table.lo `test -f 'hb-ot-shape-complex-use-table.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-use-table.cc
-@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-use-table.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-use-table.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='hb-ot-shape-complex-use-table.cc' object='libharfbuzz_la-hb-ot-shape-complex-use-table.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-shape-complex-use-table.lo `test -f 'hb-ot-shape-complex-use-table.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-use-table.cc
-
 libharfbuzz_la-hb-ot-shape-complex-use.lo: hb-ot-shape-complex-use.cc
 @am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-shape-complex-use.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-use.Tpo -c -o libharfbuzz_la-hb-ot-shape-complex-use.lo `test -f 'hb-ot-shape-complex-use.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-use.cc
 @am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-use.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-use.Plo
@@ -2426,6 +2499,13 @@ libharfbuzz_la-hb-static.lo: hb-static.cc
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-static.lo `test -f 'hb-static.cc' || echo '$(srcdir)/'`hb-static.cc
 
+libharfbuzz_la-hb-style.lo: hb-style.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-style.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-style.Tpo -c -o libharfbuzz_la-hb-style.lo `test -f 'hb-style.cc' || echo '$(srcdir)/'`hb-style.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-style.Tpo $(DEPDIR)/libharfbuzz_la-hb-style.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='hb-style.cc' object='libharfbuzz_la-hb-style.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-style.lo `test -f 'hb-style.cc' || echo '$(srcdir)/'`hb-style.cc
+
 libharfbuzz_la-hb-ucd.lo: hb-ucd.cc
 @am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ucd.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ucd.Tpo -c -o libharfbuzz_la-hb-ucd.lo `test -f 'hb-ucd.cc' || echo '$(srcdir)/'`hb-ucd.cc
 @am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ucd.Tpo $(DEPDIR)/libharfbuzz_la-hb-ucd.Plo
@@ -2496,118 +2576,6 @@ libharfbuzz_la-hb-icu.lo: hb-icu.cc
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-icu.lo `test -f 'hb-icu.cc' || echo '$(srcdir)/'`hb-icu.cc
 
-dump_indic_data-dump-indic-data.o: dump-indic-data.cc
-@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_indic_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dump_indic_data-dump-indic-data.o -MD -MP -MF $(DEPDIR)/dump_indic_data-dump-indic-data.Tpo -c -o dump_indic_data-dump-indic-data.o `test -f 'dump-indic-data.cc' || echo '$(srcdir)/'`dump-indic-data.cc
-@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/dump_indic_data-dump-indic-data.Tpo $(DEPDIR)/dump_indic_data-dump-indic-data.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='dump-indic-data.cc' object='dump_indic_data-dump-indic-data.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_indic_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dump_indic_data-dump-indic-data.o `test -f 'dump-indic-data.cc' || echo '$(srcdir)/'`dump-indic-data.cc
-
-dump_indic_data-dump-indic-data.obj: dump-indic-data.cc
-@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_indic_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dump_indic_data-dump-indic-data.obj -MD -MP -MF $(DEPDIR)/dump_indic_data-dump-indic-data.Tpo -c -o dump_indic_data-dump-indic-data.obj `if test -f 'dump-indic-data.cc'; then $(CYGPATH_W) 'dump-indic-data.cc'; else $(CYGPATH_W) '$(srcdir)/dump-indic-data.cc'; fi`
-@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/dump_indic_data-dump-indic-data.Tpo $(DEPDIR)/dump_indic_data-dump-indic-data.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='dump-indic-data.cc' object='dump_indic_data-dump-indic-data.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_indic_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dump_indic_data-dump-indic-data.obj `if test -f 'dump-indic-data.cc'; then $(CYGPATH_W) 'dump-indic-data.cc'; else $(CYGPATH_W) '$(srcdir)/dump-indic-data.cc'; fi`
-
-dump_indic_data-hb-ot-shape-complex-indic-table.o: hb-ot-shape-complex-indic-table.cc
-@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_indic_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dump_indic_data-hb-ot-shape-complex-indic-table.o -MD -MP -MF $(DEPDIR)/dump_indic_data-hb-ot-shape-complex-indic-table.Tpo -c -o dump_indic_data-hb-ot-shape-complex-indic-table.o `test -f 'hb-ot-shape-complex-indic-table.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-indic-table.cc
-@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/dump_indic_data-hb-ot-shape-complex-indic-table.Tpo $(DEPDIR)/dump_indic_data-hb-ot-shape-complex-indic-table.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='hb-ot-shape-complex-indic-table.cc' object='dump_indic_data-hb-ot-shape-complex-indic-table.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_indic_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dump_indic_data-hb-ot-shape-complex-indic-table.o `test -f 'hb-ot-shape-complex-indic-table.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-indic-table.cc
-
-dump_indic_data-hb-ot-shape-complex-indic-table.obj: hb-ot-shape-complex-indic-table.cc
-@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_indic_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dump_indic_data-hb-ot-shape-complex-indic-table.obj -MD -MP -MF $(DEPDIR)/dump_indic_data-hb-ot-shape-complex-indic-table.Tpo -c -o dump_indic_data-hb-ot-shape-complex-indic-table.obj `if test -f 'hb-ot-shape-complex-indic-table.cc'; then $(CYGPATH_W) 'hb-ot-shape-complex-indic-table.cc'; else $(CYGPATH_W) '$(srcdir)/hb-ot-shape-complex-indic-table.cc'; fi`
-@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/dump_indic_data-hb-ot-shape-complex-indic-table.Tpo $(DEPDIR)/dump_indic_data-hb-ot-shape-complex-indic-table.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='hb-ot-shape-complex-indic-table.cc' object='dump_indic_data-hb-ot-shape-complex-indic-table.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_indic_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dump_indic_data-hb-ot-shape-complex-indic-table.obj `if test -f 'hb-ot-shape-complex-indic-table.cc'; then $(CYGPATH_W) 'hb-ot-shape-complex-indic-table.cc'; else $(CYGPATH_W) '$(srcdir)/hb-ot-shape-complex-indic-table.cc'; fi`
-
-dump_khmer_data-dump-khmer-data.o: dump-khmer-data.cc
-@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_khmer_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dump_khmer_data-dump-khmer-data.o -MD -MP -MF $(DEPDIR)/dump_khmer_data-dump-khmer-data.Tpo -c -o dump_khmer_data-dump-khmer-data.o `test -f 'dump-khmer-data.cc' || echo '$(srcdir)/'`dump-khmer-data.cc
-@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/dump_khmer_data-dump-khmer-data.Tpo $(DEPDIR)/dump_khmer_data-dump-khmer-data.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='dump-khmer-data.cc' object='dump_khmer_data-dump-khmer-data.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_khmer_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dump_khmer_data-dump-khmer-data.o `test -f 'dump-khmer-data.cc' || echo '$(srcdir)/'`dump-khmer-data.cc
-
-dump_khmer_data-dump-khmer-data.obj: dump-khmer-data.cc
-@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_khmer_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dump_khmer_data-dump-khmer-data.obj -MD -MP -MF $(DEPDIR)/dump_khmer_data-dump-khmer-data.Tpo -c -o dump_khmer_data-dump-khmer-data.obj `if test -f 'dump-khmer-data.cc'; then $(CYGPATH_W) 'dump-khmer-data.cc'; else $(CYGPATH_W) '$(srcdir)/dump-khmer-data.cc'; fi`
-@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/dump_khmer_data-dump-khmer-data.Tpo $(DEPDIR)/dump_khmer_data-dump-khmer-data.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='dump-khmer-data.cc' object='dump_khmer_data-dump-khmer-data.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_khmer_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dump_khmer_data-dump-khmer-data.obj `if test -f 'dump-khmer-data.cc'; then $(CYGPATH_W) 'dump-khmer-data.cc'; else $(CYGPATH_W) '$(srcdir)/dump-khmer-data.cc'; fi`
-
-dump_khmer_data-hb-ot-shape-complex-indic-table.o: hb-ot-shape-complex-indic-table.cc
-@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_khmer_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dump_khmer_data-hb-ot-shape-complex-indic-table.o -MD -MP -MF $(DEPDIR)/dump_khmer_data-hb-ot-shape-complex-indic-table.Tpo -c -o dump_khmer_data-hb-ot-shape-complex-indic-table.o `test -f 'hb-ot-shape-complex-indic-table.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-indic-table.cc
-@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/dump_khmer_data-hb-ot-shape-complex-indic-table.Tpo $(DEPDIR)/dump_khmer_data-hb-ot-shape-complex-indic-table.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='hb-ot-shape-complex-indic-table.cc' object='dump_khmer_data-hb-ot-shape-complex-indic-table.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_khmer_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dump_khmer_data-hb-ot-shape-complex-indic-table.o `test -f 'hb-ot-shape-complex-indic-table.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-indic-table.cc
-
-dump_khmer_data-hb-ot-shape-complex-indic-table.obj: hb-ot-shape-complex-indic-table.cc
-@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_khmer_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dump_khmer_data-hb-ot-shape-complex-indic-table.obj -MD -MP -MF $(DEPDIR)/dump_khmer_data-hb-ot-shape-complex-indic-table.Tpo -c -o dump_khmer_data-hb-ot-shape-complex-indic-table.obj `if test -f 'hb-ot-shape-complex-indic-table.cc'; then $(CYGPATH_W) 'hb-ot-shape-complex-indic-table.cc'; else $(CYGPATH_W) '$(srcdir)/hb-ot-shape-complex-indic-table.cc'; fi`
-@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/dump_khmer_data-hb-ot-shape-complex-indic-table.Tpo $(DEPDIR)/dump_khmer_data-hb-ot-shape-complex-indic-table.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='hb-ot-shape-complex-indic-table.cc' object='dump_khmer_data-hb-ot-shape-complex-indic-table.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_khmer_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dump_khmer_data-hb-ot-shape-complex-indic-table.obj `if test -f 'hb-ot-shape-complex-indic-table.cc'; then $(CYGPATH_W) 'hb-ot-shape-complex-indic-table.cc'; else $(CYGPATH_W) '$(srcdir)/hb-ot-shape-complex-indic-table.cc'; fi`
-
-dump_myanmar_data-dump-myanmar-data.o: dump-myanmar-data.cc
-@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_myanmar_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dump_myanmar_data-dump-myanmar-data.o -MD -MP -MF $(DEPDIR)/dump_myanmar_data-dump-myanmar-data.Tpo -c -o dump_myanmar_data-dump-myanmar-data.o `test -f 'dump-myanmar-data.cc' || echo '$(srcdir)/'`dump-myanmar-data.cc
-@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/dump_myanmar_data-dump-myanmar-data.Tpo $(DEPDIR)/dump_myanmar_data-dump-myanmar-data.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='dump-myanmar-data.cc' object='dump_myanmar_data-dump-myanmar-data.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_myanmar_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dump_myanmar_data-dump-myanmar-data.o `test -f 'dump-myanmar-data.cc' || echo '$(srcdir)/'`dump-myanmar-data.cc
-
-dump_myanmar_data-dump-myanmar-data.obj: dump-myanmar-data.cc
-@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_myanmar_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dump_myanmar_data-dump-myanmar-data.obj -MD -MP -MF $(DEPDIR)/dump_myanmar_data-dump-myanmar-data.Tpo -c -o dump_myanmar_data-dump-myanmar-data.obj `if test -f 'dump-myanmar-data.cc'; then $(CYGPATH_W) 'dump-myanmar-data.cc'; else $(CYGPATH_W) '$(srcdir)/dump-myanmar-data.cc'; fi`
-@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/dump_myanmar_data-dump-myanmar-data.Tpo $(DEPDIR)/dump_myanmar_data-dump-myanmar-data.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='dump-myanmar-data.cc' object='dump_myanmar_data-dump-myanmar-data.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_myanmar_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dump_myanmar_data-dump-myanmar-data.obj `if test -f 'dump-myanmar-data.cc'; then $(CYGPATH_W) 'dump-myanmar-data.cc'; else $(CYGPATH_W) '$(srcdir)/dump-myanmar-data.cc'; fi`
-
-dump_myanmar_data-hb-ot-shape-complex-indic-table.o: hb-ot-shape-complex-indic-table.cc
-@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_myanmar_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dump_myanmar_data-hb-ot-shape-complex-indic-table.o -MD -MP -MF $(DEPDIR)/dump_myanmar_data-hb-ot-shape-complex-indic-table.Tpo -c -o dump_myanmar_data-hb-ot-shape-complex-indic-table.o `test -f 'hb-ot-shape-complex-indic-table.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-indic-table.cc
-@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/dump_myanmar_data-hb-ot-shape-complex-indic-table.Tpo $(DEPDIR)/dump_myanmar_data-hb-ot-shape-complex-indic-table.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='hb-ot-shape-complex-indic-table.cc' object='dump_myanmar_data-hb-ot-shape-complex-indic-table.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_myanmar_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dump_myanmar_data-hb-ot-shape-complex-indic-table.o `test -f 'hb-ot-shape-complex-indic-table.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-indic-table.cc
-
-dump_myanmar_data-hb-ot-shape-complex-indic-table.obj: hb-ot-shape-complex-indic-table.cc
-@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_myanmar_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dump_myanmar_data-hb-ot-shape-complex-indic-table.obj -MD -MP -MF $(DEPDIR)/dump_myanmar_data-hb-ot-shape-complex-indic-table.Tpo -c -o dump_myanmar_data-hb-ot-shape-complex-indic-table.obj `if test -f 'hb-ot-shape-complex-indic-table.cc'; then $(CYGPATH_W) 'hb-ot-shape-complex-indic-table.cc'; else $(CYGPATH_W) '$(srcdir)/hb-ot-shape-complex-indic-table.cc'; fi`
-@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/dump_myanmar_data-hb-ot-shape-complex-indic-table.Tpo $(DEPDIR)/dump_myanmar_data-hb-ot-shape-complex-indic-table.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='hb-ot-shape-complex-indic-table.cc' object='dump_myanmar_data-hb-ot-shape-complex-indic-table.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_myanmar_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dump_myanmar_data-hb-ot-shape-complex-indic-table.obj `if test -f 'hb-ot-shape-complex-indic-table.cc'; then $(CYGPATH_W) 'hb-ot-shape-complex-indic-table.cc'; else $(CYGPATH_W) '$(srcdir)/hb-ot-shape-complex-indic-table.cc'; fi`
-
-dump_use_data-dump-use-data.o: dump-use-data.cc
-@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_use_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dump_use_data-dump-use-data.o -MD -MP -MF $(DEPDIR)/dump_use_data-dump-use-data.Tpo -c -o dump_use_data-dump-use-data.o `test -f 'dump-use-data.cc' || echo '$(srcdir)/'`dump-use-data.cc
-@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/dump_use_data-dump-use-data.Tpo $(DEPDIR)/dump_use_data-dump-use-data.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='dump-use-data.cc' object='dump_use_data-dump-use-data.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_use_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dump_use_data-dump-use-data.o `test -f 'dump-use-data.cc' || echo '$(srcdir)/'`dump-use-data.cc
-
-dump_use_data-dump-use-data.obj: dump-use-data.cc
-@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_use_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dump_use_data-dump-use-data.obj -MD -MP -MF $(DEPDIR)/dump_use_data-dump-use-data.Tpo -c -o dump_use_data-dump-use-data.obj `if test -f 'dump-use-data.cc'; then $(CYGPATH_W) 'dump-use-data.cc'; else $(CYGPATH_W) '$(srcdir)/dump-use-data.cc'; fi`
-@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/dump_use_data-dump-use-data.Tpo $(DEPDIR)/dump_use_data-dump-use-data.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='dump-use-data.cc' object='dump_use_data-dump-use-data.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_use_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dump_use_data-dump-use-data.obj `if test -f 'dump-use-data.cc'; then $(CYGPATH_W) 'dump-use-data.cc'; else $(CYGPATH_W) '$(srcdir)/dump-use-data.cc'; fi`
-
-dump_use_data-hb-ot-shape-complex-use-table.o: hb-ot-shape-complex-use-table.cc
-@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_use_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dump_use_data-hb-ot-shape-complex-use-table.o -MD -MP -MF $(DEPDIR)/dump_use_data-hb-ot-shape-complex-use-table.Tpo -c -o dump_use_data-hb-ot-shape-complex-use-table.o `test -f 'hb-ot-shape-complex-use-table.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-use-table.cc
-@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/dump_use_data-hb-ot-shape-complex-use-table.Tpo $(DEPDIR)/dump_use_data-hb-ot-shape-complex-use-table.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='hb-ot-shape-complex-use-table.cc' object='dump_use_data-hb-ot-shape-complex-use-table.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_use_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dump_use_data-hb-ot-shape-complex-use-table.o `test -f 'hb-ot-shape-complex-use-table.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-use-table.cc
-
-dump_use_data-hb-ot-shape-complex-use-table.obj: hb-ot-shape-complex-use-table.cc
-@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_use_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dump_use_data-hb-ot-shape-complex-use-table.obj -MD -MP -MF $(DEPDIR)/dump_use_data-hb-ot-shape-complex-use-table.Tpo -c -o dump_use_data-hb-ot-shape-complex-use-table.obj `if test -f 'hb-ot-shape-complex-use-table.cc'; then $(CYGPATH_W) 'hb-ot-shape-complex-use-table.cc'; else $(CYGPATH_W) '$(srcdir)/hb-ot-shape-complex-use-table.cc'; fi`
-@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/dump_use_data-hb-ot-shape-complex-use-table.Tpo $(DEPDIR)/dump_use_data-hb-ot-shape-complex-use-table.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='hb-ot-shape-complex-use-table.cc' object='dump_use_data-hb-ot-shape-complex-use-table.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_use_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dump_use_data-hb-ot-shape-complex-use-table.obj `if test -f 'hb-ot-shape-complex-use-table.cc'; then $(CYGPATH_W) 'hb-ot-shape-complex-use-table.cc'; else $(CYGPATH_W) '$(srcdir)/hb-ot-shape-complex-use-table.cc'; fi`
-
 main-main.o: main.cc
 @am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(main_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT main-main.o -MD -MP -MF $(DEPDIR)/main-main.Tpo -c -o main-main.o `test -f 'main.cc' || echo '$(srcdir)/'`main.cc
 @am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/main-main.Tpo $(DEPDIR)/main-main.Po
@@ -2776,33 +2744,61 @@ test_iter-hb-static.obj: hb-static.cc
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_iter_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_iter-hb-static.obj `if test -f 'hb-static.cc'; then $(CYGPATH_W) 'hb-static.cc'; else $(CYGPATH_W) '$(srcdir)/hb-static.cc'; fi`
 
-test_meta-test-meta.o: test-meta.cc
-@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_meta_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_meta-test-meta.o -MD -MP -MF $(DEPDIR)/test_meta-test-meta.Tpo -c -o test_meta-test-meta.o `test -f 'test-meta.cc' || echo '$(srcdir)/'`test-meta.cc
-@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/test_meta-test-meta.Tpo $(DEPDIR)/test_meta-test-meta.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='test-meta.cc' object='test_meta-test-meta.o' libtool=no @AMDEPBACKSLASH@
+test_machinery-test-machinery.o: test-machinery.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_machinery_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_machinery-test-machinery.o -MD -MP -MF $(DEPDIR)/test_machinery-test-machinery.Tpo -c -o test_machinery-test-machinery.o `test -f 'test-machinery.cc' || echo '$(srcdir)/'`test-machinery.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/test_machinery-test-machinery.Tpo $(DEPDIR)/test_machinery-test-machinery.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='test-machinery.cc' object='test_machinery-test-machinery.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_machinery_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_machinery-test-machinery.o `test -f 'test-machinery.cc' || echo '$(srcdir)/'`test-machinery.cc
+
+test_machinery-test-machinery.obj: test-machinery.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_machinery_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_machinery-test-machinery.obj -MD -MP -MF $(DEPDIR)/test_machinery-test-machinery.Tpo -c -o test_machinery-test-machinery.obj `if test -f 'test-machinery.cc'; then $(CYGPATH_W) 'test-machinery.cc'; else $(CYGPATH_W) '$(srcdir)/test-machinery.cc'; fi`
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/test_machinery-test-machinery.Tpo $(DEPDIR)/test_machinery-test-machinery.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='test-machinery.cc' object='test_machinery-test-machinery.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_machinery_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_machinery-test-machinery.obj `if test -f 'test-machinery.cc'; then $(CYGPATH_W) 'test-machinery.cc'; else $(CYGPATH_W) '$(srcdir)/test-machinery.cc'; fi`
+
+test_machinery-hb-static.o: hb-static.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_machinery_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_machinery-hb-static.o -MD -MP -MF $(DEPDIR)/test_machinery-hb-static.Tpo -c -o test_machinery-hb-static.o `test -f 'hb-static.cc' || echo '$(srcdir)/'`hb-static.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/test_machinery-hb-static.Tpo $(DEPDIR)/test_machinery-hb-static.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='hb-static.cc' object='test_machinery-hb-static.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_meta_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_meta-test-meta.o `test -f 'test-meta.cc' || echo '$(srcdir)/'`test-meta.cc
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_machinery_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_machinery-hb-static.o `test -f 'hb-static.cc' || echo '$(srcdir)/'`hb-static.cc
 
-test_meta-test-meta.obj: test-meta.cc
-@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_meta_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_meta-test-meta.obj -MD -MP -MF $(DEPDIR)/test_meta-test-meta.Tpo -c -o test_meta-test-meta.obj `if test -f 'test-meta.cc'; then $(CYGPATH_W) 'test-meta.cc'; else $(CYGPATH_W) '$(srcdir)/test-meta.cc'; fi`
-@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/test_meta-test-meta.Tpo $(DEPDIR)/test_meta-test-meta.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='test-meta.cc' object='test_meta-test-meta.obj' libtool=no @AMDEPBACKSLASH@
+test_machinery-hb-static.obj: hb-static.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_machinery_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_machinery-hb-static.obj -MD -MP -MF $(DEPDIR)/test_machinery-hb-static.Tpo -c -o test_machinery-hb-static.obj `if test -f 'hb-static.cc'; then $(CYGPATH_W) 'hb-static.cc'; else $(CYGPATH_W) '$(srcdir)/hb-static.cc'; fi`
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/test_machinery-hb-static.Tpo $(DEPDIR)/test_machinery-hb-static.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='hb-static.cc' object='test_machinery-hb-static.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_meta_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_meta-test-meta.obj `if test -f 'test-meta.cc'; then $(CYGPATH_W) 'test-meta.cc'; else $(CYGPATH_W) '$(srcdir)/test-meta.cc'; fi`
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_machinery_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_machinery-hb-static.obj `if test -f 'hb-static.cc'; then $(CYGPATH_W) 'hb-static.cc'; else $(CYGPATH_W) '$(srcdir)/hb-static.cc'; fi`
 
-test_meta-hb-static.o: hb-static.cc
-@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_meta_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_meta-hb-static.o -MD -MP -MF $(DEPDIR)/test_meta-hb-static.Tpo -c -o test_meta-hb-static.o `test -f 'hb-static.cc' || echo '$(srcdir)/'`hb-static.cc
-@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/test_meta-hb-static.Tpo $(DEPDIR)/test_meta-hb-static.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='hb-static.cc' object='test_meta-hb-static.o' libtool=no @AMDEPBACKSLASH@
+test_map-test-map.o: test-map.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_map_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_map-test-map.o -MD -MP -MF $(DEPDIR)/test_map-test-map.Tpo -c -o test_map-test-map.o `test -f 'test-map.cc' || echo '$(srcdir)/'`test-map.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/test_map-test-map.Tpo $(DEPDIR)/test_map-test-map.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='test-map.cc' object='test_map-test-map.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_meta_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_meta-hb-static.o `test -f 'hb-static.cc' || echo '$(srcdir)/'`hb-static.cc
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_map_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_map-test-map.o `test -f 'test-map.cc' || echo '$(srcdir)/'`test-map.cc
 
-test_meta-hb-static.obj: hb-static.cc
-@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_meta_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_meta-hb-static.obj -MD -MP -MF $(DEPDIR)/test_meta-hb-static.Tpo -c -o test_meta-hb-static.obj `if test -f 'hb-static.cc'; then $(CYGPATH_W) 'hb-static.cc'; else $(CYGPATH_W) '$(srcdir)/hb-static.cc'; fi`
-@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/test_meta-hb-static.Tpo $(DEPDIR)/test_meta-hb-static.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='hb-static.cc' object='test_meta-hb-static.obj' libtool=no @AMDEPBACKSLASH@
+test_map-test-map.obj: test-map.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_map_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_map-test-map.obj -MD -MP -MF $(DEPDIR)/test_map-test-map.Tpo -c -o test_map-test-map.obj `if test -f 'test-map.cc'; then $(CYGPATH_W) 'test-map.cc'; else $(CYGPATH_W) '$(srcdir)/test-map.cc'; fi`
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/test_map-test-map.Tpo $(DEPDIR)/test_map-test-map.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='test-map.cc' object='test_map-test-map.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_meta_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_meta-hb-static.obj `if test -f 'hb-static.cc'; then $(CYGPATH_W) 'hb-static.cc'; else $(CYGPATH_W) '$(srcdir)/hb-static.cc'; fi`
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_map_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_map-test-map.obj `if test -f 'test-map.cc'; then $(CYGPATH_W) 'test-map.cc'; else $(CYGPATH_W) '$(srcdir)/test-map.cc'; fi`
+
+test_map-hb-static.o: hb-static.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_map_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_map-hb-static.o -MD -MP -MF $(DEPDIR)/test_map-hb-static.Tpo -c -o test_map-hb-static.o `test -f 'hb-static.cc' || echo '$(srcdir)/'`hb-static.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/test_map-hb-static.Tpo $(DEPDIR)/test_map-hb-static.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='hb-static.cc' object='test_map-hb-static.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_map_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_map-hb-static.o `test -f 'hb-static.cc' || echo '$(srcdir)/'`hb-static.cc
+
+test_map-hb-static.obj: hb-static.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_map_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_map-hb-static.obj -MD -MP -MF $(DEPDIR)/test_map-hb-static.Tpo -c -o test_map-hb-static.obj `if test -f 'hb-static.cc'; then $(CYGPATH_W) 'hb-static.cc'; else $(CYGPATH_W) '$(srcdir)/hb-static.cc'; fi`
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/test_map-hb-static.Tpo $(DEPDIR)/test_map-hb-static.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='hb-static.cc' object='test_map-hb-static.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_map_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_map-hb-static.obj `if test -f 'hb-static.cc'; then $(CYGPATH_W) 'hb-static.cc'; else $(CYGPATH_W) '$(srcdir)/hb-static.cc'; fi`
 
 test_number-test-number.o: test-number.cc
 @am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_number_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_number-test-number.o -MD -MP -MF $(DEPDIR)/test_number-test-number.Tpo -c -o test_number-test-number.o `test -f 'test-number.cc' || echo '$(srcdir)/'`test-number.cc
@@ -2888,6 +2884,118 @@ test_ot_tag-hb-ot-tag.obj: hb-ot-tag.cc
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_ot_tag_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_ot_tag-hb-ot-tag.obj `if test -f 'hb-ot-tag.cc'; then $(CYGPATH_W) 'hb-ot-tag.cc'; else $(CYGPATH_W) '$(srcdir)/hb-ot-tag.cc'; fi`
 
+test_priority_queue-test-priority-queue.o: test-priority-queue.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_priority_queue_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_priority_queue-test-priority-queue.o -MD -MP -MF $(DEPDIR)/test_priority_queue-test-priority-queue.Tpo -c -o test_priority_queue-test-priority-queue.o `test -f 'test-priority-queue.cc' || echo '$(srcdir)/'`test-priority-queue.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/test_priority_queue-test-priority-queue.Tpo $(DEPDIR)/test_priority_queue-test-priority-queue.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='test-priority-queue.cc' object='test_priority_queue-test-priority-queue.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_priority_queue_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_priority_queue-test-priority-queue.o `test -f 'test-priority-queue.cc' || echo '$(srcdir)/'`test-priority-queue.cc
+
+test_priority_queue-test-priority-queue.obj: test-priority-queue.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_priority_queue_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_priority_queue-test-priority-queue.obj -MD -MP -MF $(DEPDIR)/test_priority_queue-test-priority-queue.Tpo -c -o test_priority_queue-test-priority-queue.obj `if test -f 'test-priority-queue.cc'; then $(CYGPATH_W) 'test-priority-queue.cc'; else $(CYGPATH_W) '$(srcdir)/test-priority-queue.cc'; fi`
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/test_priority_queue-test-priority-queue.Tpo $(DEPDIR)/test_priority_queue-test-priority-queue.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='test-priority-queue.cc' object='test_priority_queue-test-priority-queue.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_priority_queue_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_priority_queue-test-priority-queue.obj `if test -f 'test-priority-queue.cc'; then $(CYGPATH_W) 'test-priority-queue.cc'; else $(CYGPATH_W) '$(srcdir)/test-priority-queue.cc'; fi`
+
+test_priority_queue-hb-static.o: hb-static.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_priority_queue_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_priority_queue-hb-static.o -MD -MP -MF $(DEPDIR)/test_priority_queue-hb-static.Tpo -c -o test_priority_queue-hb-static.o `test -f 'hb-static.cc' || echo '$(srcdir)/'`hb-static.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/test_priority_queue-hb-static.Tpo $(DEPDIR)/test_priority_queue-hb-static.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='hb-static.cc' object='test_priority_queue-hb-static.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_priority_queue_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_priority_queue-hb-static.o `test -f 'hb-static.cc' || echo '$(srcdir)/'`hb-static.cc
+
+test_priority_queue-hb-static.obj: hb-static.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_priority_queue_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_priority_queue-hb-static.obj -MD -MP -MF $(DEPDIR)/test_priority_queue-hb-static.Tpo -c -o test_priority_queue-hb-static.obj `if test -f 'hb-static.cc'; then $(CYGPATH_W) 'hb-static.cc'; else $(CYGPATH_W) '$(srcdir)/hb-static.cc'; fi`
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/test_priority_queue-hb-static.Tpo $(DEPDIR)/test_priority_queue-hb-static.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='hb-static.cc' object='test_priority_queue-hb-static.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_priority_queue_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_priority_queue-hb-static.obj `if test -f 'hb-static.cc'; then $(CYGPATH_W) 'hb-static.cc'; else $(CYGPATH_W) '$(srcdir)/hb-static.cc'; fi`
+
+test_repacker-test-repacker.o: test-repacker.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_repacker_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_repacker-test-repacker.o -MD -MP -MF $(DEPDIR)/test_repacker-test-repacker.Tpo -c -o test_repacker-test-repacker.o `test -f 'test-repacker.cc' || echo '$(srcdir)/'`test-repacker.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/test_repacker-test-repacker.Tpo $(DEPDIR)/test_repacker-test-repacker.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='test-repacker.cc' object='test_repacker-test-repacker.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_repacker_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_repacker-test-repacker.o `test -f 'test-repacker.cc' || echo '$(srcdir)/'`test-repacker.cc
+
+test_repacker-test-repacker.obj: test-repacker.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_repacker_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_repacker-test-repacker.obj -MD -MP -MF $(DEPDIR)/test_repacker-test-repacker.Tpo -c -o test_repacker-test-repacker.obj `if test -f 'test-repacker.cc'; then $(CYGPATH_W) 'test-repacker.cc'; else $(CYGPATH_W) '$(srcdir)/test-repacker.cc'; fi`
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/test_repacker-test-repacker.Tpo $(DEPDIR)/test_repacker-test-repacker.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='test-repacker.cc' object='test_repacker-test-repacker.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_repacker_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_repacker-test-repacker.obj `if test -f 'test-repacker.cc'; then $(CYGPATH_W) 'test-repacker.cc'; else $(CYGPATH_W) '$(srcdir)/test-repacker.cc'; fi`
+
+test_repacker-hb-static.o: hb-static.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_repacker_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_repacker-hb-static.o -MD -MP -MF $(DEPDIR)/test_repacker-hb-static.Tpo -c -o test_repacker-hb-static.o `test -f 'hb-static.cc' || echo '$(srcdir)/'`hb-static.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/test_repacker-hb-static.Tpo $(DEPDIR)/test_repacker-hb-static.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='hb-static.cc' object='test_repacker-hb-static.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_repacker_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_repacker-hb-static.o `test -f 'hb-static.cc' || echo '$(srcdir)/'`hb-static.cc
+
+test_repacker-hb-static.obj: hb-static.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_repacker_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_repacker-hb-static.obj -MD -MP -MF $(DEPDIR)/test_repacker-hb-static.Tpo -c -o test_repacker-hb-static.obj `if test -f 'hb-static.cc'; then $(CYGPATH_W) 'hb-static.cc'; else $(CYGPATH_W) '$(srcdir)/hb-static.cc'; fi`
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/test_repacker-hb-static.Tpo $(DEPDIR)/test_repacker-hb-static.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='hb-static.cc' object='test_repacker-hb-static.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_repacker_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_repacker-hb-static.obj `if test -f 'hb-static.cc'; then $(CYGPATH_W) 'hb-static.cc'; else $(CYGPATH_W) '$(srcdir)/hb-static.cc'; fi`
+
+test_serialize-test-serialize.o: test-serialize.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_serialize_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_serialize-test-serialize.o -MD -MP -MF $(DEPDIR)/test_serialize-test-serialize.Tpo -c -o test_serialize-test-serialize.o `test -f 'test-serialize.cc' || echo '$(srcdir)/'`test-serialize.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/test_serialize-test-serialize.Tpo $(DEPDIR)/test_serialize-test-serialize.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='test-serialize.cc' object='test_serialize-test-serialize.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_serialize_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_serialize-test-serialize.o `test -f 'test-serialize.cc' || echo '$(srcdir)/'`test-serialize.cc
+
+test_serialize-test-serialize.obj: test-serialize.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_serialize_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_serialize-test-serialize.obj -MD -MP -MF $(DEPDIR)/test_serialize-test-serialize.Tpo -c -o test_serialize-test-serialize.obj `if test -f 'test-serialize.cc'; then $(CYGPATH_W) 'test-serialize.cc'; else $(CYGPATH_W) '$(srcdir)/test-serialize.cc'; fi`
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/test_serialize-test-serialize.Tpo $(DEPDIR)/test_serialize-test-serialize.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='test-serialize.cc' object='test_serialize-test-serialize.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_serialize_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_serialize-test-serialize.obj `if test -f 'test-serialize.cc'; then $(CYGPATH_W) 'test-serialize.cc'; else $(CYGPATH_W) '$(srcdir)/test-serialize.cc'; fi`
+
+test_serialize-hb-static.o: hb-static.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_serialize_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_serialize-hb-static.o -MD -MP -MF $(DEPDIR)/test_serialize-hb-static.Tpo -c -o test_serialize-hb-static.o `test -f 'hb-static.cc' || echo '$(srcdir)/'`hb-static.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/test_serialize-hb-static.Tpo $(DEPDIR)/test_serialize-hb-static.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='hb-static.cc' object='test_serialize-hb-static.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_serialize_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_serialize-hb-static.o `test -f 'hb-static.cc' || echo '$(srcdir)/'`hb-static.cc
+
+test_serialize-hb-static.obj: hb-static.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_serialize_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_serialize-hb-static.obj -MD -MP -MF $(DEPDIR)/test_serialize-hb-static.Tpo -c -o test_serialize-hb-static.obj `if test -f 'hb-static.cc'; then $(CYGPATH_W) 'hb-static.cc'; else $(CYGPATH_W) '$(srcdir)/hb-static.cc'; fi`
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/test_serialize-hb-static.Tpo $(DEPDIR)/test_serialize-hb-static.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='hb-static.cc' object='test_serialize-hb-static.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_serialize_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_serialize-hb-static.obj `if test -f 'hb-static.cc'; then $(CYGPATH_W) 'hb-static.cc'; else $(CYGPATH_W) '$(srcdir)/hb-static.cc'; fi`
+
+test_set-test-set.o: test-set.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_set_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_set-test-set.o -MD -MP -MF $(DEPDIR)/test_set-test-set.Tpo -c -o test_set-test-set.o `test -f 'test-set.cc' || echo '$(srcdir)/'`test-set.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/test_set-test-set.Tpo $(DEPDIR)/test_set-test-set.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='test-set.cc' object='test_set-test-set.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_set_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_set-test-set.o `test -f 'test-set.cc' || echo '$(srcdir)/'`test-set.cc
+
+test_set-test-set.obj: test-set.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_set_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_set-test-set.obj -MD -MP -MF $(DEPDIR)/test_set-test-set.Tpo -c -o test_set-test-set.obj `if test -f 'test-set.cc'; then $(CYGPATH_W) 'test-set.cc'; else $(CYGPATH_W) '$(srcdir)/test-set.cc'; fi`
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/test_set-test-set.Tpo $(DEPDIR)/test_set-test-set.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='test-set.cc' object='test_set-test-set.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_set_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_set-test-set.obj `if test -f 'test-set.cc'; then $(CYGPATH_W) 'test-set.cc'; else $(CYGPATH_W) '$(srcdir)/test-set.cc'; fi`
+
+test_set-hb-static.o: hb-static.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_set_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_set-hb-static.o -MD -MP -MF $(DEPDIR)/test_set-hb-static.Tpo -c -o test_set-hb-static.o `test -f 'hb-static.cc' || echo '$(srcdir)/'`hb-static.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/test_set-hb-static.Tpo $(DEPDIR)/test_set-hb-static.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='hb-static.cc' object='test_set-hb-static.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_set_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_set-hb-static.o `test -f 'hb-static.cc' || echo '$(srcdir)/'`hb-static.cc
+
+test_set-hb-static.obj: hb-static.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_set_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_set-hb-static.obj -MD -MP -MF $(DEPDIR)/test_set-hb-static.Tpo -c -o test_set-hb-static.obj `if test -f 'hb-static.cc'; then $(CYGPATH_W) 'hb-static.cc'; else $(CYGPATH_W) '$(srcdir)/hb-static.cc'; fi`
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/test_set-hb-static.Tpo $(DEPDIR)/test_set-hb-static.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='hb-static.cc' object='test_set-hb-static.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_set_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_set-hb-static.obj `if test -f 'hb-static.cc'; then $(CYGPATH_W) 'hb-static.cc'; else $(CYGPATH_W) '$(srcdir)/hb-static.cc'; fi`
+
 test_unicode_ranges-test-unicode-ranges.o: test-unicode-ranges.cc
 @am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_unicode_ranges_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_unicode_ranges-test-unicode-ranges.o -MD -MP -MF $(DEPDIR)/test_unicode_ranges-test-unicode-ranges.Tpo -c -o test_unicode_ranges-test-unicode-ranges.o `test -f 'test-unicode-ranges.cc' || echo '$(srcdir)/'`test-unicode-ranges.cc
 @am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/test_unicode_ranges-test-unicode-ranges.Tpo $(DEPDIR)/test_unicode_ranges-test-unicode-ranges.Po
@@ -2902,6 +3010,34 @@ test_unicode_ranges-test-unicode-ranges.obj: test-unicode-ranges.cc
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_unicode_ranges_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_unicode_ranges-test-unicode-ranges.obj `if test -f 'test-unicode-ranges.cc'; then $(CYGPATH_W) 'test-unicode-ranges.cc'; else $(CYGPATH_W) '$(srcdir)/test-unicode-ranges.cc'; fi`
 
+test_vector-test-vector.o: test-vector.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_vector_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_vector-test-vector.o -MD -MP -MF $(DEPDIR)/test_vector-test-vector.Tpo -c -o test_vector-test-vector.o `test -f 'test-vector.cc' || echo '$(srcdir)/'`test-vector.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/test_vector-test-vector.Tpo $(DEPDIR)/test_vector-test-vector.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='test-vector.cc' object='test_vector-test-vector.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_vector_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_vector-test-vector.o `test -f 'test-vector.cc' || echo '$(srcdir)/'`test-vector.cc
+
+test_vector-test-vector.obj: test-vector.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_vector_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_vector-test-vector.obj -MD -MP -MF $(DEPDIR)/test_vector-test-vector.Tpo -c -o test_vector-test-vector.obj `if test -f 'test-vector.cc'; then $(CYGPATH_W) 'test-vector.cc'; else $(CYGPATH_W) '$(srcdir)/test-vector.cc'; fi`
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/test_vector-test-vector.Tpo $(DEPDIR)/test_vector-test-vector.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='test-vector.cc' object='test_vector-test-vector.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_vector_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_vector-test-vector.obj `if test -f 'test-vector.cc'; then $(CYGPATH_W) 'test-vector.cc'; else $(CYGPATH_W) '$(srcdir)/test-vector.cc'; fi`
+
+test_vector-hb-static.o: hb-static.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_vector_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_vector-hb-static.o -MD -MP -MF $(DEPDIR)/test_vector-hb-static.Tpo -c -o test_vector-hb-static.o `test -f 'hb-static.cc' || echo '$(srcdir)/'`hb-static.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/test_vector-hb-static.Tpo $(DEPDIR)/test_vector-hb-static.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='hb-static.cc' object='test_vector-hb-static.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_vector_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_vector-hb-static.o `test -f 'hb-static.cc' || echo '$(srcdir)/'`hb-static.cc
+
+test_vector-hb-static.obj: hb-static.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_vector_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_vector-hb-static.obj -MD -MP -MF $(DEPDIR)/test_vector-hb-static.Tpo -c -o test_vector-hb-static.obj `if test -f 'hb-static.cc'; then $(CYGPATH_W) 'hb-static.cc'; else $(CYGPATH_W) '$(srcdir)/hb-static.cc'; fi`
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/test_vector-hb-static.Tpo $(DEPDIR)/test_vector-hb-static.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='hb-static.cc' object='test_vector-hb-static.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_vector_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_vector-hb-static.obj `if test -f 'hb-static.cc'; then $(CYGPATH_W) 'hb-static.cc'; else $(CYGPATH_W) '$(srcdir)/hb-static.cc'; fi`
+
 mostlyclean-libtool:
        -rm -f *.lo
 
@@ -3288,6 +3424,13 @@ test-array.log: test-array$(EXEEXT)
        --log-file $$b.log --trs-file $$b.trs \
        $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
        "$$tst" $(AM_TESTS_FD_REDIRECT)
+test-bimap.log: test-bimap$(EXEEXT)
+       @p='test-bimap$(EXEEXT)'; \
+       b='test-bimap'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
 test-iter.log: test-iter$(EXEEXT)
        @p='test-iter$(EXEEXT)'; \
        b='test-iter'; \
@@ -3295,9 +3438,16 @@ test-iter.log: test-iter$(EXEEXT)
        --log-file $$b.log --trs-file $$b.trs \
        $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
        "$$tst" $(AM_TESTS_FD_REDIRECT)
-test-meta.log: test-meta$(EXEEXT)
-       @p='test-meta$(EXEEXT)'; \
-       b='test-meta'; \
+test-machinery.log: test-machinery$(EXEEXT)
+       @p='test-machinery$(EXEEXT)'; \
+       b='test-machinery'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+test-map.log: test-map$(EXEEXT)
+       @p='test-map$(EXEEXT)'; \
+       b='test-map'; \
        $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
        --log-file $$b.log --trs-file $$b.trs \
        $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
@@ -3316,6 +3466,27 @@ test-ot-tag.log: test-ot-tag$(EXEEXT)
        --log-file $$b.log --trs-file $$b.trs \
        $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
        "$$tst" $(AM_TESTS_FD_REDIRECT)
+test-priority-queue.log: test-priority-queue$(EXEEXT)
+       @p='test-priority-queue$(EXEEXT)'; \
+       b='test-priority-queue'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+test-set.log: test-set$(EXEEXT)
+       @p='test-set$(EXEEXT)'; \
+       b='test-set'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+test-serialize.log: test-serialize$(EXEEXT)
+       @p='test-serialize$(EXEEXT)'; \
+       b='test-serialize'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
 test-unicode-ranges.log: test-unicode-ranges$(EXEEXT)
        @p='test-unicode-ranges$(EXEEXT)'; \
        b='test-unicode-ranges'; \
@@ -3323,9 +3494,16 @@ test-unicode-ranges.log: test-unicode-ranges$(EXEEXT)
        --log-file $$b.log --trs-file $$b.trs \
        $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
        "$$tst" $(AM_TESTS_FD_REDIRECT)
-test-bimap.log: test-bimap$(EXEEXT)
-       @p='test-bimap$(EXEEXT)'; \
-       b='test-bimap'; \
+test-vector.log: test-vector$(EXEEXT)
+       @p='test-vector$(EXEEXT)'; \
+       b='test-vector'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+test-repacker.log: test-repacker$(EXEEXT)
+       @p='test-repacker$(EXEEXT)'; \
+       b='test-repacker'; \
        $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
        --log-file $$b.log --trs-file $$b.trs \
        $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
@@ -3511,21 +3689,14 @@ clean-am: clean-binPROGRAMS clean-checkPROGRAMS clean-generic \
        mostlyclean-am
 
 distclean: distclean-recursive
-               -rm -f ./$(DEPDIR)/dump_indic_data-dump-indic-data.Po
-       -rm -f ./$(DEPDIR)/dump_indic_data-hb-ot-shape-complex-indic-table.Po
-       -rm -f ./$(DEPDIR)/dump_khmer_data-dump-khmer-data.Po
-       -rm -f ./$(DEPDIR)/dump_khmer_data-hb-ot-shape-complex-indic-table.Po
-       -rm -f ./$(DEPDIR)/dump_myanmar_data-dump-myanmar-data.Po
-       -rm -f ./$(DEPDIR)/dump_myanmar_data-hb-ot-shape-complex-indic-table.Po
-       -rm -f ./$(DEPDIR)/dump_use_data-dump-use-data.Po
-       -rm -f ./$(DEPDIR)/dump_use_data-hb-ot-shape-complex-use-table.Po
-       -rm -f ./$(DEPDIR)/libharfbuzz_gobject_la-hb-gobject-enums.Plo
+               -rm -f ./$(DEPDIR)/libharfbuzz_gobject_la-hb-gobject-enums.Plo
        -rm -f ./$(DEPDIR)/libharfbuzz_gobject_la-hb-gobject-structs.Plo
        -rm -f ./$(DEPDIR)/libharfbuzz_icu_la-hb-icu.Plo
        -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-aat-layout.Plo
        -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-aat-map.Plo
        -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-blob.Plo
        -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-buffer-serialize.Plo
+       -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-buffer-verify.Plo
        -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-buffer.Plo
        -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-common.Plo
        -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-coretext.Plo
@@ -3560,8 +3731,8 @@ distclean: distclean-recursive
        -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-indic.Plo
        -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-khmer.Plo
        -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-myanmar.Plo
+       -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-syllabic.Plo
        -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-thai.Plo
-       -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-use-table.Plo
        -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-use.Plo
        -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-vowel-constraints.Plo
        -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-fallback.Plo
@@ -3574,6 +3745,7 @@ distclean: distclean-recursive
        -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-shape.Plo
        -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-shaper.Plo
        -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-static.Plo
+       -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-style.Plo
        -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-ucd.Plo
        -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-unicode.Plo
        -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-uniscribe.Plo
@@ -3599,15 +3771,27 @@ distclean: distclean-recursive
        -rm -f ./$(DEPDIR)/test_gsub_would_substitute-test-gsub-would-substitute.Po
        -rm -f ./$(DEPDIR)/test_iter-hb-static.Po
        -rm -f ./$(DEPDIR)/test_iter-test-iter.Po
-       -rm -f ./$(DEPDIR)/test_meta-hb-static.Po
-       -rm -f ./$(DEPDIR)/test_meta-test-meta.Po
+       -rm -f ./$(DEPDIR)/test_machinery-hb-static.Po
+       -rm -f ./$(DEPDIR)/test_machinery-test-machinery.Po
+       -rm -f ./$(DEPDIR)/test_map-hb-static.Po
+       -rm -f ./$(DEPDIR)/test_map-test-map.Po
        -rm -f ./$(DEPDIR)/test_number-hb-number.Po
        -rm -f ./$(DEPDIR)/test_number-test-number.Po
        -rm -f ./$(DEPDIR)/test_ot_glyphname-test-ot-glyphname.Po
        -rm -f ./$(DEPDIR)/test_ot_meta-test-ot-meta.Po
        -rm -f ./$(DEPDIR)/test_ot_name-test-ot-name.Po
        -rm -f ./$(DEPDIR)/test_ot_tag-hb-ot-tag.Po
+       -rm -f ./$(DEPDIR)/test_priority_queue-hb-static.Po
+       -rm -f ./$(DEPDIR)/test_priority_queue-test-priority-queue.Po
+       -rm -f ./$(DEPDIR)/test_repacker-hb-static.Po
+       -rm -f ./$(DEPDIR)/test_repacker-test-repacker.Po
+       -rm -f ./$(DEPDIR)/test_serialize-hb-static.Po
+       -rm -f ./$(DEPDIR)/test_serialize-test-serialize.Po
+       -rm -f ./$(DEPDIR)/test_set-hb-static.Po
+       -rm -f ./$(DEPDIR)/test_set-test-set.Po
        -rm -f ./$(DEPDIR)/test_unicode_ranges-test-unicode-ranges.Po
+       -rm -f ./$(DEPDIR)/test_vector-hb-static.Po
+       -rm -f ./$(DEPDIR)/test_vector-test-vector.Po
        -rm -f Makefile
 distclean-am: clean-am distclean-compile distclean-generic \
        distclean-tags
@@ -3655,21 +3839,14 @@ install-ps-am:
 installcheck-am: installcheck-binPROGRAMS
 
 maintainer-clean: maintainer-clean-recursive
-               -rm -f ./$(DEPDIR)/dump_indic_data-dump-indic-data.Po
-       -rm -f ./$(DEPDIR)/dump_indic_data-hb-ot-shape-complex-indic-table.Po
-       -rm -f ./$(DEPDIR)/dump_khmer_data-dump-khmer-data.Po
-       -rm -f ./$(DEPDIR)/dump_khmer_data-hb-ot-shape-complex-indic-table.Po
-       -rm -f ./$(DEPDIR)/dump_myanmar_data-dump-myanmar-data.Po
-       -rm -f ./$(DEPDIR)/dump_myanmar_data-hb-ot-shape-complex-indic-table.Po
-       -rm -f ./$(DEPDIR)/dump_use_data-dump-use-data.Po
-       -rm -f ./$(DEPDIR)/dump_use_data-hb-ot-shape-complex-use-table.Po
-       -rm -f ./$(DEPDIR)/libharfbuzz_gobject_la-hb-gobject-enums.Plo
+               -rm -f ./$(DEPDIR)/libharfbuzz_gobject_la-hb-gobject-enums.Plo
        -rm -f ./$(DEPDIR)/libharfbuzz_gobject_la-hb-gobject-structs.Plo
        -rm -f ./$(DEPDIR)/libharfbuzz_icu_la-hb-icu.Plo
        -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-aat-layout.Plo
        -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-aat-map.Plo
        -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-blob.Plo
        -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-buffer-serialize.Plo
+       -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-buffer-verify.Plo
        -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-buffer.Plo
        -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-common.Plo
        -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-coretext.Plo
@@ -3704,8 +3881,8 @@ maintainer-clean: maintainer-clean-recursive
        -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-indic.Plo
        -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-khmer.Plo
        -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-myanmar.Plo
+       -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-syllabic.Plo
        -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-thai.Plo
-       -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-use-table.Plo
        -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-use.Plo
        -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-vowel-constraints.Plo
        -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-fallback.Plo
@@ -3718,6 +3895,7 @@ maintainer-clean: maintainer-clean-recursive
        -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-shape.Plo
        -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-shaper.Plo
        -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-static.Plo
+       -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-style.Plo
        -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-ucd.Plo
        -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-unicode.Plo
        -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-uniscribe.Plo
@@ -3743,15 +3921,27 @@ maintainer-clean: maintainer-clean-recursive
        -rm -f ./$(DEPDIR)/test_gsub_would_substitute-test-gsub-would-substitute.Po
        -rm -f ./$(DEPDIR)/test_iter-hb-static.Po
        -rm -f ./$(DEPDIR)/test_iter-test-iter.Po
-       -rm -f ./$(DEPDIR)/test_meta-hb-static.Po
-       -rm -f ./$(DEPDIR)/test_meta-test-meta.Po
+       -rm -f ./$(DEPDIR)/test_machinery-hb-static.Po
+       -rm -f ./$(DEPDIR)/test_machinery-test-machinery.Po
+       -rm -f ./$(DEPDIR)/test_map-hb-static.Po
+       -rm -f ./$(DEPDIR)/test_map-test-map.Po
        -rm -f ./$(DEPDIR)/test_number-hb-number.Po
        -rm -f ./$(DEPDIR)/test_number-test-number.Po
        -rm -f ./$(DEPDIR)/test_ot_glyphname-test-ot-glyphname.Po
        -rm -f ./$(DEPDIR)/test_ot_meta-test-ot-meta.Po
        -rm -f ./$(DEPDIR)/test_ot_name-test-ot-name.Po
        -rm -f ./$(DEPDIR)/test_ot_tag-hb-ot-tag.Po
+       -rm -f ./$(DEPDIR)/test_priority_queue-hb-static.Po
+       -rm -f ./$(DEPDIR)/test_priority_queue-test-priority-queue.Po
+       -rm -f ./$(DEPDIR)/test_repacker-hb-static.Po
+       -rm -f ./$(DEPDIR)/test_repacker-test-repacker.Po
+       -rm -f ./$(DEPDIR)/test_serialize-hb-static.Po
+       -rm -f ./$(DEPDIR)/test_serialize-test-serialize.Po
+       -rm -f ./$(DEPDIR)/test_set-hb-static.Po
+       -rm -f ./$(DEPDIR)/test_set-test-set.Po
        -rm -f ./$(DEPDIR)/test_unicode_ranges-test-unicode-ranges.Po
+       -rm -f ./$(DEPDIR)/test_vector-hb-static.Po
+       -rm -f ./$(DEPDIR)/test_vector-test-vector.Po
        -rm -f Makefile
 maintainer-clean-am: distclean-am maintainer-clean-generic
 
@@ -3812,7 +4002,12 @@ tinyz:
        $(MAKE) $(AM_MAKEFLAGS) CPPFLAGS="-Oz -DHB_TINY $(CPPFLAGS)" libs
 
 $(srcdir)/hb-version.h: hb-version.h.in $(top_srcdir)/configure.ac
-       $(AM_V_GEN) $(srcdir)/gen-hb-version.py $(HB_VERSION) hb-version.h.in hb-version.h
+       $(AM_V_GEN) $(SED) \
+               -e 's/[@]HB_VERSION_MAJOR@/$(HB_VERSION_MAJOR)/' \
+               -e 's/[@]HB_VERSION_MINOR@/$(HB_VERSION_MINOR)/' \
+               -e 's/[@]HB_VERSION_MICRO@/$(HB_VERSION_MICRO)/' \
+               -e 's/[@]HB_VERSION@/$(HB_VERSION)/' \
+               "$<" > "$@" || ($(RM) "$@"; false)
 
 @CODE_COVERAGE_RULES@
 @HAVE_GOBJECT_TRUE@hb-gobject-enums.%: hb-gobject-enums.%.tmpl $(HBHEADERS)
@@ -3834,7 +4029,8 @@ $(srcdir)/hb-version.h: hb-version.h.in $(top_srcdir)/configure.ac
        "$<" > "$@" \
        || ($(RM) "$@"; false)
 check: $(DEF_FILES) # For check-symbols.sh
-harfbuzz.def: $(HBHEADERS) $(HBNODISTHEADERS)
+harfbuzz.def: $(top_builddir)/config.status
+harfbuzz.def: $(HBHEADERS)
        $(AM_V_GEN) $(srcdir)/gen-def.py "$@" $^
 harfbuzz-subset.def: $(HB_SUBSET_headers)
        $(AM_V_GEN) $(srcdir)/gen-def.py "$@" $^
@@ -3856,8 +4052,7 @@ $(srcdir)/%.hh: $(srcdir)/%.rl
 
 harfbuzz.cc: Makefile.sources
        $(AM_V_GEN) \
-       $(srcdir)/gen-harfbuzzcc.py \
-               $(srcdir)/harfbuzz.cc \
+       for f in \
                $(HB_BASE_sources) \
                $(HB_GLIB_sources) \
                $(HB_FT_sources) \
@@ -3865,7 +4060,10 @@ harfbuzz.cc: Makefile.sources
                $(HB_UNISCRIBE_sources) \
                $(HB_GDI_sources) \
                $(HB_DIRECTWRITE_sources) \
-               $(HB_CORETEXT_sources)
+               $(HB_CORETEXT_sources) \
+               ; do echo '#include "'$$f'"'; done | \
+       grep '[.]cc"' > $(srcdir)/harfbuzz.cc \
+       || ($(RM) $(srcdir)/harfbuzz.cc; false)
 
 @HAVE_INTROSPECTION_TRUE@-include $(INTROSPECTION_MAKEFILE)
 
index 81b5cde..ce65014 100644 (file)
@@ -1,14 +1,12 @@
 # Base and default-included sources and headers
 
 HB_BASE_sources = \
-       hb-aat-fdsc-table.hh \
        hb-aat-layout-ankr-table.hh \
        hb-aat-layout-bsln-table.hh \
        hb-aat-layout-common.hh \
        hb-aat-layout-feat-table.hh \
        hb-aat-layout-just-table.hh \
        hb-aat-layout-kerx-table.hh \
-       hb-aat-layout-lcar-table.hh \
        hb-aat-layout-morx-table.hh \
        hb-aat-layout-opbd-table.hh \
        hb-aat-layout-trak-table.hh \
@@ -20,9 +18,14 @@ HB_BASE_sources = \
        hb-algs.hh \
        hb-array.hh \
        hb-atomic.hh \
+       hb-bimap.hh \
+       hb-bit-page.hh \
+       hb-bit-set.hh \
+       hb-bit-set-invertible.hh \
        hb-blob.cc \
        hb-blob.hh \
        hb-buffer-serialize.cc \
+       hb-buffer-verify.cc \
        hb-buffer.cc \
        hb-buffer.hh \
        hb-cache.hh \
@@ -47,8 +50,8 @@ HB_BASE_sources = \
        hb-machinery.hh \
        hb-map.cc \
        hb-map.hh \
-       hb-bimap.hh \
        hb-meta.hh \
+       hb-ms-feature-ranges.hh \
        hb-mutex.hh \
        hb-null.hh \
        hb-number.cc \
@@ -57,9 +60,9 @@ HB_BASE_sources = \
        hb-open-file.hh \
        hb-open-type.hh \
        hb-ot-cff-common.hh \
+       hb-ot-cff1-std-str.hh \
        hb-ot-cff1-table.cc \
        hb-ot-cff1-table.hh \
-       hb-ot-cff1-std-str.hh \
        hb-ot-cff2-table.cc \
        hb-ot-cff2-table.hh \
        hb-ot-cmap-table.hh \
@@ -69,9 +72,9 @@ HB_BASE_sources = \
        hb-ot-color-sbix-table.hh \
        hb-ot-color-svg-table.hh \
        hb-ot-color.cc \
+       hb-ot-face-table-list.hh \
        hb-ot-face.cc \
        hb-ot-face.hh \
-       hb-ot-face-table-list.hh \
        hb-ot-font.cc \
        hb-ot-gasp-table.hh \
        hb-ot-glyf-table.hh \
@@ -107,6 +110,7 @@ HB_BASE_sources = \
        hb-ot-post-macroman.hh \
        hb-ot-post-table.hh \
        hb-ot-shape-complex-arabic-fallback.hh \
+       hb-ot-shape-complex-arabic-joining-list.hh \
        hb-ot-shape-complex-arabic-table.hh \
        hb-ot-shape-complex-arabic-win1256.hh \
        hb-ot-shape-complex-arabic.cc \
@@ -121,10 +125,11 @@ HB_BASE_sources = \
        hb-ot-shape-complex-khmer.hh \
        hb-ot-shape-complex-myanmar.cc \
        hb-ot-shape-complex-myanmar.hh \
+       hb-ot-shape-complex-syllabic.cc \
+       hb-ot-shape-complex-syllabic.hh \
        hb-ot-shape-complex-thai.cc \
-       hb-ot-shape-complex-use-table.cc \
+       hb-ot-shape-complex-use-table.hh \
        hb-ot-shape-complex-use.cc \
-       hb-ot-shape-complex-use.hh \
        hb-ot-shape-complex-vowel-constraints.cc \
        hb-ot-shape-complex-vowel-constraints.hh \
        hb-ot-shape-complex.hh \
@@ -138,6 +143,7 @@ HB_BASE_sources = \
        hb-ot-tag-table.hh \
        hb-ot-tag.cc \
        hb-ot-var-avar-table.hh \
+       hb-ot-var-common.hh \
        hb-ot-var-fvar-table.hh \
        hb-ot-var-gvar-table.hh \
        hb-ot-var-hvar-table.hh \
@@ -159,6 +165,7 @@ HB_BASE_sources = \
        hb-shaper.hh \
        hb-static.cc \
        hb-string-array.hh \
+       hb-style.cc \
        hb-ucd-table.hh \
        hb-ucd.cc \
        hb-unicode-emoji-table.hh \
@@ -166,6 +173,7 @@ HB_BASE_sources = \
        hb-unicode.hh \
        hb-utf.hh \
        hb-vector.hh \
+       hb-priority-queue.hh \
        hb.hh \
        $(NULL)
 
@@ -213,6 +221,7 @@ HB_BASE_headers = \
        hb-set.h \
        hb-shape-plan.h \
        hb-shape.h \
+       hb-style.h \
        hb-unicode.h \
        hb-version.h \
        hb.h \
@@ -253,6 +262,8 @@ HB_SUBSET_sources = \
        hb-number.hh \
        hb-ot-cff1-table.cc \
        hb-ot-cff2-table.cc \
+       hb-ot-color-colrv1-closure.hh \
+       hb-ot-post-table-v2subset.hh \
        hb-static.cc \
        hb-subset-cff-common.cc \
        hb-subset-cff-common.hh \
@@ -264,10 +275,9 @@ HB_SUBSET_sources = \
        hb-subset-input.hh \
        hb-subset-plan.cc \
        hb-subset-plan.hh \
-       hb-subset-plan.hh \
        hb-subset.cc \
        hb-subset.hh \
-       hb-subset.hh \
+       hb-repacker.hh \
        $(NULL)
 
 HB_SUBSET_headers = \
index 41b9d02..b7532a7 100755 (executable)
@@ -2,11 +2,11 @@
 
 import sys, os
 
-os.chdir (os.environ.get ('srcdir', os.path.dirname (__file__)))
+os.chdir (os.getenv ('srcdir', os.path.dirname (__file__)))
 
-HBHEADERS = os.environ.get ('HBHEADERS', '').split () or \
+HBHEADERS = [os.path.basename (x) for x in os.getenv ('HBHEADERS', '').split ()] or \
        [x for x in os.listdir ('.') if x.startswith ('hb') and x.endswith ('.h')]
-HBSOURCES = os.environ.get ('HBSOURCES', '').split () or \
+HBSOURCES = [os.path.basename (x) for x in os.getenv ('HBSOURCES', '').split ()] or \
        [x for x in os.listdir ('.') if x.startswith ('hb') and x.endswith (('.cc', '.hh'))]
 
 stat = 0
index 13aedf8..a64d2e5 100755 (executable)
@@ -2,9 +2,9 @@
 
 import sys, os, re
 
-os.chdir (os.environ.get ('srcdir', os.path.dirname (__file__)))
+os.chdir (os.getenv ('srcdir', os.path.dirname (__file__)))
 
-HBHEADERS = os.environ.get ('HBHEADERS', '').split () or \
+HBHEADERS = [os.path.basename (x) for x in os.getenv ('HBHEADERS', '').split ()] or \
        [x for x in os.listdir ('.') if x.startswith ('hb') and x.endswith ('.h')]
 
 stat = 0
index e6c9077..0ad42cd 100755 (executable)
@@ -2,11 +2,11 @@
 
 import sys, os, re
 
-os.chdir (os.environ.get ('srcdir', os.path.dirname (__file__)))
+os.chdir (os.getenv ('srcdir', os.path.dirname (__file__)))
 
-HBHEADERS = os.environ.get ('HBHEADERS', '').split () or \
+HBHEADERS = [os.path.basename (x) for x in os.getenv ('HBHEADERS', '').split ()] or \
        [x for x in os.listdir ('.') if x.startswith ('hb') and x.endswith ('.h')]
-HBSOURCES = os.environ.get ('HBSOURCES', '').split () or \
+HBSOURCES = [os.path.basename (x) for x in os.getenv ('HBSOURCES', '').split ()] or \
        [x for x in os.listdir ('.') if x.startswith ('hb') and x.endswith (('.cc', '.hh'))]
 
 stat = 0
index b278b3e..88eaa2e 100755 (executable)
@@ -2,11 +2,11 @@
 
 import sys, os, re
 
-os.chdir (os.environ.get ('srcdir', os.path.dirname (__file__)))
+os.chdir (os.getenv ('srcdir', os.path.dirname (__file__)))
 
-HBHEADERS = os.environ.get ('HBHEADERS', '').split () or \
+HBHEADERS = [os.path.basename (x) for x in os.getenv ('HBHEADERS', '').split ()] or \
        [x for x in os.listdir ('.') if x.startswith ('hb') and x.endswith ('.h')]
-HBSOURCES = os.environ.get ('HBSOURCES', '').split () or \
+HBSOURCES = [os.path.basename (x) for x in os.getenv ('HBSOURCES', '').split ()] or \
        [x for x in os.listdir ('.') if x.startswith ('hb') and x.endswith (('.cc', '.hh'))]
 
 stat = 0
index 142785c..85b7265 100755 (executable)
@@ -2,17 +2,15 @@
 
 import sys, os, shutil, subprocess
 
-os.chdir (os.environ.get ('srcdir', os.path.dirname (__file__)))
+os.chdir (os.getenv ('srcdir', os.path.dirname (__file__)))
 
-libs = os.environ.get ('libs', '.libs')
+libs = os.getenv ('libs', '.libs')
 
-ldd = shutil.which ('ldd')
-if ldd:
-       ldd = [ldd]
-else:
-       ldd = shutil.which ('otool')
-       if ldd:
-               ldd = [ldd, '-L'] # otool -L
+ldd = os.getenv ('LDD', shutil.which ('ldd'))
+if not ldd:
+       otool = os.getenv ('OTOOL', shutil.which ('otool'))
+       if otool:
+               ldd = otool + ' -L'
        else:
                print ('check-libstdc++.py: \'ldd\' not found; skipping test')
                sys.exit (77)
@@ -27,7 +25,7 @@ for soname in ['harfbuzz', 'harfbuzz-subset', 'harfbuzz-gobject']:
                if not os.path.exists (so): continue
 
                print ('Checking that we are not linking to libstdc++ or libc++ in %s' % so)
-               ldd_result = subprocess.check_output (ldd + [so])
+               ldd_result = subprocess.check_output (ldd.split() + [so])
                if (b'libstdc++' in ldd_result) or (b'libc++' in ldd_result):
                        print ('Ouch, %s is linked to libstdc++ or libc++' % so)
                        stat = 1
index 9e43b81..edd5874 100755 (executable)
@@ -2,10 +2,10 @@
 
 import sys, os, shutil, subprocess, glob, re
 
-builddir = os.environ.get ('builddir', os.path.dirname (__file__))
-libs = os.environ.get ('libs', '.libs')
+builddir = os.getenv ('builddir', os.path.dirname (__file__))
+libs = os.getenv ('libs', '.libs')
 
-objdump = shutil.which ('objdump')
+objdump = os.getenv ('OBJDUMP', shutil.which ('objdump'))
 if not objdump:
        print ('check-static-inits.py: \'ldd\' not found; skipping test')
        sys.exit (77)
@@ -14,15 +14,26 @@ if sys.version_info < (3, 5):
        print ('check-static-inits.py: needs python 3.5 for recursive support in glob')
        sys.exit (77)
 
-OBJS = glob.glob (os.path.join (builddir, libs, '**', '*.o'), recursive=True)
+OBJS = glob.glob (os.path.join (builddir, libs, '**', 'hb*.o'), recursive=True)
 if not OBJS:
        print ('check-static-inits.py: object files not found; skipping test')
        sys.exit (77)
 
 stat = 0
+tested = 0
 
 for obj in OBJS:
-       result = subprocess.check_output ([objdump, '-t', obj]).decode ('utf-8')
+       result = subprocess.run(objdump.split () + ['-t', obj], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+
+       if result.returncode:
+               if result.stderr.find (b'not recognized') != -1:
+                       # https://github.com/harfbuzz/harfbuzz/issues/3019
+                       print ('objdump %s returned "not recognized", skipping' % obj)
+                       continue
+               print ('objdump %s returned error:\n%s' % (obj, result.stderr.decode ('utf-8')))
+               stat = 2
+
+       result = result.stdout.decode ('utf-8')
 
        # Checking that no object file has static initializers
        for l in re.findall (r'^.*\.[cd]tors.*$', result, re.MULTILINE):
@@ -35,4 +46,6 @@ for obj in OBJS:
                print ('Ouch, %s has lazy static C++ constructors/destructors or other such stuff' % obj)
                stat = 1
 
-sys.exit (stat)
+       tested += 1
+
+sys.exit (stat if tested else 77)
index 92f44cd..385959b 100755 (executable)
@@ -4,14 +4,15 @@ import sys, os, shutil, subprocess, re, difflib
 
 os.environ['LC_ALL'] = 'C' # otherwise 'nm' prints in wrong order
 
-builddir = os.environ.get ('builddir', os.path.dirname (__file__))
-libs = os.environ.get ('libs', '.libs')
+builddir = os.getenv ('builddir', os.path.dirname (__file__))
+libs = os.getenv ('libs', '.libs')
 
 IGNORED_SYMBOLS = '|'.join(['_fini', '_init', '_fdata', '_ftext', '_fbss',
        '__bss_start', '__bss_start__', '__bss_end__', '_edata', '_end', '_bss_end__',
-       '__end__', '__gcov_.*', 'llvm_.*', 'flush_fn_list', 'writeout_fn_list'])
+       '__end__', '__gcov_.*', 'llvm_.*', 'flush_fn_list', 'writeout_fn_list', 'mangle_path',
+       'lprofDirMode', 'reset_fn_list'])
 
-nm = shutil.which ('nm')
+nm = os.getenv ('NM', shutil.which ('nm'))
 if not nm:
        print ('check-symbols.py: \'nm\' not found; skipping test')
        sys.exit (77)
@@ -30,8 +31,8 @@ for soname in ['harfbuzz', 'harfbuzz-subset', 'harfbuzz-icu', 'harfbuzz-gobject'
                symprefix = '_' if suffix == 'dylib' else ''
 
                EXPORTED_SYMBOLS = [s.split ()[2]
-                                                       for s in re.findall (r'^.+ [BCDGIRST] .+$', subprocess.check_output ([nm, so]).decode ('utf-8'), re.MULTILINE)
-                                                       if not re.match (r'.* %s(%s)\b' % (symprefix, IGNORED_SYMBOLS), s)]
+                                   for s in re.findall (r'^.+ [BCDGIRST] .+$', subprocess.check_output (nm.split() + [so]).decode ('utf-8'), re.MULTILINE)
+                                   if not re.match (r'.* %s(%s)\b' % (symprefix, IGNORED_SYMBOLS), s)]
 
                # run again c++flit also if is available
                if cxxflit:
@@ -67,7 +68,7 @@ for soname in ['harfbuzz', 'harfbuzz-subset', 'harfbuzz-icu', 'harfbuzz-gobject'
                        tested = True
 
 if not tested:
-       print ('check-symbols.sh: no shared libraries found; skipping test')
+       print ('check-symbols.py: no shared libraries found; skipping test')
        sys.exit (77)
 
 sys.exit (stat)
diff --git a/src/dump-indic-data.cc b/src/dump-indic-data.cc
deleted file mode 100644 (file)
index 8ddc9d5..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * 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
- */
-
-#include "hb-ot-shape-complex-indic.hh"
-
-int
-main ()
-{
-  for (hb_codepoint_t u = 0; u <= 0x10FFFF; u++)
-  {
-    hb_glyph_info_t info;
-    info.codepoint = u;
-    set_indic_properties (info);
-    if (info.indic_category() != INDIC_SYLLABIC_CATEGORY_OTHER ||
-       info.indic_position() != INDIC_MATRA_CATEGORY_NOT_APPLICABLE)
-      printf("U+%04X   %u      %u\n", u,
-            info.indic_category(),
-            info.indic_position());
-  }
-}
diff --git a/src/dump-khmer-data.cc b/src/dump-khmer-data.cc
deleted file mode 100644 (file)
index cffbb92..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * 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
- */
-
-#include "hb-ot-shape-complex-khmer.hh"
-
-int
-main ()
-{
-  for (hb_codepoint_t u = 0; u <= 0x10FFFF; u++)
-  {
-    hb_glyph_info_t info;
-    info.codepoint = u;
-    set_khmer_properties (info);
-    if (info.khmer_category() != INDIC_SYLLABIC_CATEGORY_OTHER)
-      printf("U+%04X   %u\n", u,
-            info.khmer_category());
-  }
-}
diff --git a/src/dump-myanmar-data.cc b/src/dump-myanmar-data.cc
deleted file mode 100644 (file)
index c1a303f..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * 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
- */
-
-#include "hb-ot-shape-complex-myanmar.hh"
-
-int
-main ()
-{
-  for (hb_codepoint_t u = 0; u <= 0x10FFFF; u++)
-  {
-    hb_glyph_info_t info;
-    info.codepoint = u;
-    set_myanmar_properties (info);
-    if (info.myanmar_category() != INDIC_SYLLABIC_CATEGORY_OTHER ||
-       info.myanmar_position() != INDIC_MATRA_CATEGORY_NOT_APPLICABLE)
-      printf("U+%04X   %u      %u\n", u,
-            info.myanmar_category(),
-            info.myanmar_position());
-  }
-}
diff --git a/src/dump-use-data.cc b/src/dump-use-data.cc
deleted file mode 100644 (file)
index d639426..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * 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
- */
-
-#include "hb-ot-shape-complex-use.hh"
-
-int
-main ()
-{
-  for (hb_codepoint_t u = 0; u <= 0x10FFFF; u++)
-  {
-    unsigned int category = hb_use_get_category (u);
-    if (category != USE_O)
-      printf("U+%04X   %u\n", u, category);
-  }
-}
diff --git a/src/gen-arabic-joining-list.py b/src/gen-arabic-joining-list.py
new file mode 100755 (executable)
index 0000000..8162a4a
--- /dev/null
@@ -0,0 +1,106 @@
+#!/usr/bin/env python3
+
+"""usage: ./gen-arabic-joining-table.py ArabicShaping.txt Scripts.txt
+
+Input files:
+* https://unicode.org/Public/UCD/latest/ucd/ArabicShaping.txt
+* https://unicode.org/Public/UCD/latest/ucd/Scripts.txt
+"""
+
+import os.path, sys
+
+if len (sys.argv) != 3:
+       sys.exit (__doc__)
+
+files = [open (x, encoding='utf-8') for x in sys.argv[1:]]
+
+headers = [[f.readline (), f.readline ()] for f in files]
+while files[0].readline ().find ('##################') < 0:
+       pass
+
+def read (f):
+       mapping = {}
+       for line in f:
+
+               j = line.find ('#')
+               if j >= 0:
+                       line = line[:j]
+
+               fields = [x.strip () for x in line.split (';')]
+               if len (fields) == 1:
+                       continue
+
+               uu = fields[0].split ('..')
+               start = int (uu[0], 16)
+               if len (uu) == 1:
+                       end = start
+               else:
+                       end = int (uu[1], 16)
+
+               t = fields[1]
+
+               for u in range (start, end + 1):
+                       mapping[u] = t
+
+       return mapping
+
+def read_joining_uu (f):
+       values = set ()
+       for line in f:
+
+               if line[0] == '#':
+                       continue
+
+               fields = [x.strip () for x in line.split (';')]
+               if len (fields) == 1:
+                       continue
+               if fields[2] in {'T', 'U'}:
+                       continue
+
+               values.add (int (fields[0], 16))
+
+       return sorted (values)
+
+def print_has_arabic_joining (scripts, joining_uu):
+
+       print ("static bool")
+       print ("has_arabic_joining (hb_script_t script)")
+       print ("{")
+       print ("  /* List of scripts that have data in arabic-table. */")
+       print ("  switch ((int) script)")
+       print ("  {")
+
+       for script in sorted ({scripts[u] for u in joining_uu if scripts[u] not in {'Common', 'Inherited'}}):
+               print ("    case HB_SCRIPT_{}:".format (script.upper ()))
+
+       print ("      return true;")
+       print ()
+       print ("    default:")
+       print ("      return false;")
+       print ("  }")
+       print ("}")
+       print ()
+
+print ("/* == Start of generated function == */")
+print ("/*")
+print (" * The following function is generated by running:")
+print (" *")
+print (" *   ./gen-arabic-joining-list.py ArabicShaping.txt Scripts.txt")
+print (" *")
+print (" * on files with these headers:")
+print (" *")
+for h in headers:
+       for l in h:
+               print (" * %s" % (l.strip ()))
+print (" */")
+print ()
+print ("#ifndef HB_OT_SHAPE_COMPLEX_ARABIC_JOINING_LIST_HH")
+print ("#define HB_OT_SHAPE_COMPLEX_ARABIC_JOINING_LIST_HH")
+print ()
+
+print_has_arabic_joining (read (files[1]), read_joining_uu (files[0]))
+
+print ()
+print ("#endif /* HB_OT_SHAPE_COMPLEX_ARABIC_JOINING_LIST_HH */")
+print ()
+print ("/* == End of generated function == */")
index 50501ce..621d5b6 100755 (executable)
@@ -181,7 +181,6 @@ def print_shaping_table(f):
                        if items not in ligatures:
                                ligatures[items] = {}
                        ligatures[items][shape] = c
-                       pass
                else:
                        # Save shape
                        if items[0] not in names:
index b6b8b20..b46d346 100755 (executable)
@@ -35,14 +35,11 @@ hb_draw_funcs_set_close_path_func
 hb_draw_funcs_set_cubic_to_func
 hb_draw_funcs_set_line_to_func
 hb_draw_funcs_set_move_to_func
-hb_draw_funcs_set_quadratic_to_func
-hb_font_get_var_coords_design
-hb_ot_layout_closure_lookups
-hb_ot_layout_closure_features""".splitlines ()
+hb_draw_funcs_set_quadratic_to_func""".splitlines ()
        symbols = [x for x in symbols if x not in experimental_symbols]
 symbols = "\n".join (symbols)
 
-result = symbols if os.environ.get('PLAIN_LIST', '') else """EXPORTS
+result = symbols if os.getenv ('PLAIN_LIST', '') else """EXPORTS
 %s
 LIBRARY lib%s-0.dll""" % (symbols, output_file.replace ('src/', '').replace ('.def', ''))
 
index 5b78bd3..0ee8fec 100755 (executable)
@@ -1,17 +1,17 @@
 #!/usr/bin/env python3
 
-"""usage: ./gen-emoji-table.py emoji-data.txt
+"""usage: ./gen-emoji-table.py emoji-data.txt emoji-test.txt
 
 Input file:
 * https://www.unicode.org/Public/UCD/latest/ucd/emoji/emoji-data.txt
+* https://www.unicode.org/Public/emoji/latest/emoji-test.txt
 """
 
 import sys
-import os.path
 from collections import OrderedDict
 import packTab
 
-if len (sys.argv) != 2:
+if len (sys.argv) != 3:
        sys.exit (__doc__)
 
 f = open(sys.argv[1])
@@ -62,7 +62,7 @@ for typ, s in ranges.items():
 
        arr = dict()
        for start,end in s:
-               for i in range(start,end):
+               for i in range(start, end + 1):
                        arr[i] = 1
 
        sol = packTab.pack_table(arr, 0, compression=3)
@@ -75,3 +75,24 @@ print ()
 print ("#endif /* HB_UNICODE_EMOJI_TABLE_HH */")
 print ()
 print ("/* == End of generated table == */")
+
+
+# Generate test file.
+sequences = []
+with open(sys.argv[2]) as f:
+    for line in f.readlines():
+        if "#" in line:
+            line = line[:line.index("#")]
+        if ";" in line:
+            line = line[:line.index(";")]
+        line = line.strip()
+        line = line.split(" ")
+        if len(line) < 2:
+            continue
+        sequences.append(line)
+
+with open("../test/shaping/data/in-house/tests/emoji-clusters.tests", "w") as f:
+    for sequence in sequences:
+        f.write("../fonts/AdobeBlank2.ttf:--no-glyph-names --no-positions --font-funcs=ot")
+        f.write(":" + ",".join(sequence))
+        f.write(":[" + "|".join("1=0" for c in sequence) + "]\n")
index a156c5d..b25bcc7 100755 (executable)
@@ -1,18 +1,18 @@
 #!/usr/bin/env python3
 
-"usage: gen-harfbuzzcc.py harfbuzz.cc hb-blob.cc hb-buffer.cc ..."
+"This tool is intended to be used from meson"
 
-import os, re, sys
-
-os.chdir (os.path.dirname (__file__))
+import os, sys, shutil
 
 if len (sys.argv) < 3:
        sys.exit (__doc__)
 
-output_file = sys.argv[1]
-source_paths = sys.argv[2:]
+OUTPUT = sys.argv[1]
+CURRENT_SOURCE_DIR = sys.argv[2]
+sources = sys.argv[3:]
+
+with open (OUTPUT, "wb") as f:
+       f.write ("".join ('#include "{}"\n'.format (os.path.basename (x)) for x in sources if x.endswith (".cc")).encode ())
 
-with open (output_file, "wb") as f:
-       f.write ("".join ('#include "{}"\n'.format (x)
-                                         for x in source_paths
-                                         if x.endswith (".cc")).encode ())
+# copy it also to src/
+shutil.copyfile (OUTPUT, os.path.join (CURRENT_SOURCE_DIR, os.path.basename (OUTPUT)))
index f21e5de..4fac0a0 100755 (executable)
@@ -1,31 +1,36 @@
 #!/usr/bin/env python3
 
-"usage: gen-hb-version.py 1.0.0 hb-version.h.in hb-version.h"
+"This tool is intended to be used from meson"
 
-import os, re, sys
-
-os.chdir (os.path.dirname (__file__))
+import os, sys, shutil, re
 
 if len (sys.argv) < 4:
        sys.exit(__doc__)
 
 version = sys.argv[1]
 major, minor, micro = version.split (".")
-input = sys.argv[2]
-output = sys.argv[3]
-
-with open (input, "r", encoding='utf-8') as input_file:
-       generated = (input_file.read ()
-               .replace ("@HB_VERSION_MAJOR@", major)
-               .replace ("@HB_VERSION_MINOR@", minor)
-               .replace ("@HB_VERSION_MICRO@", micro)
-               .replace ("@HB_VERSION@", version)
-               .encode ())
-
-       with open (output, "rb") as current_file:
-               current = current_file.read()
-
-       # write only if is changed
-       if generated != current:
-               with open (output, "wb") as output_file:
-                       output_file.write (generated)
+
+OUTPUT = sys.argv[2]
+INPUT = sys.argv[3]
+CURRENT_SOURCE_DIR = os.path.dirname(INPUT)
+
+try:
+       with open (OUTPUT, "r", encoding='utf-8') as old_output:
+               for line in old_output:
+                       old_version = re.match (r"#define HB_VERSION_STRING \"(\d.\d.\d)\"", line)
+                       if old_version and old_version[1] == version:
+                               sys.exit ()
+except IOError:
+       pass
+
+with open (INPUT, "r", encoding='utf-8') as template:
+       with open (OUTPUT, "wb") as output:
+               output.write (template.read ()
+                       .replace ("@HB_VERSION_MAJOR@", major)
+                       .replace ("@HB_VERSION_MINOR@", minor)
+                       .replace ("@HB_VERSION_MICRO@", micro)
+                       .replace ("@HB_VERSION@", version)
+                       .encode ())
+
+# copy it also to src/
+shutil.copyfile (OUTPUT, os.path.join (CURRENT_SOURCE_DIR, os.path.basename (OUTPUT)))
index 1746aab..367e55e 100755 (executable)
@@ -41,8 +41,8 @@ files = [open (x, encoding='utf-8') for x in sys.argv[1:]]
 
 headers = [[f.readline () for i in range (2)] for f in files]
 
-data = [{} for f in files]
-values = [{} for f in files]
+data = [{} for _ in files]
+values = [{} for _ in files]
 for i, f in enumerate (files):
        for line in f:
 
@@ -82,7 +82,6 @@ for i,d in enumerate (data):
 combined = {k:v for k,v in combined.items() if k in ALLOWED_SINGLES or v[2] in ALLOWED_BLOCKS}
 data = combined
 del combined
-num = len (data)
 
 # Move the outliers NO-BREAK SPACE and DOTTED CIRCLE out
 singles = {}
@@ -201,7 +200,7 @@ num = 0
 offset = 0
 starts = []
 ends = []
-print ("static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {")
+print ("static const uint16_t indic_table[] = {")
 for u in uu:
        if u <= last:
                continue
@@ -216,7 +215,6 @@ for u in uu:
        if start != last + 1:
                if start - last <= 1+16*3:
                        print_block (None, last+1, start-1, data)
-                       last = start-1
                else:
                        if last >= 0:
                                ends.append (last + 1)
@@ -236,7 +234,7 @@ occupancy = used * 100. / total
 page_bits = 12
 print ("}; /* Table items: %d; occupancy: %d%% */" % (offset, occupancy))
 print ()
-print ("INDIC_TABLE_ELEMENT_TYPE")
+print ("uint16_t")
 print ("hb_indic_get_categories (hb_codepoint_t u)")
 print ("{")
 print ("  switch (u >> %d)" % page_bits)
index 21aa1b9..b1a34d4 100755 (executable)
@@ -1,7 +1,7 @@
 #!/usr/bin/env python3
 
 """Generates the code for a sorted unicode range array as used in hb-ot-os2-unicode-ranges.hh
-Input is a tab seperated list of unicode ranges from the otspec
+Input is a tab separated list of unicode ranges from the otspec
 (https://docs.microsoft.com/en-us/typography/opentype/spec/os2#ur).
 """
 
index 5833714..8bbb375 100755 (executable)
@@ -1,40 +1,25 @@
 #!/usr/bin/env python3
 
-import os, re, sys, subprocess, shutil, tempfile
+"This tool is intended to be used from meson"
 
-os.chdir (os.path.dirname (__file__))
-
-if len (sys.argv) < 2:
-       ragel_sources = [x for x in os.listdir ('.') if x.endswith ('.rl')]
-else:
-       ragel_sources = sys.argv[2:]
-
-ragel = shutil.which ('ragel')
+import os, os.path, sys, subprocess, shutil
 
+ragel = sys.argv[1]
 if not ragel:
-       print ('You have to install ragel if you are going to develop HarfBuzz itself')
-       exit (1)
-
-if not len (ragel_sources):
-       exit (77)
-
-tempdir = tempfile.mkdtemp ()
-
-for rl in ragel_sources:
-       hh = rl.replace ('.rl', '.hh')
-       shutil.copy (rl, tempdir)
-       # writing to stdout has some complication on Windows
-       subprocess.Popen ([ragel, '-e', '-F1', '-o', hh, rl], cwd=tempdir).wait ()
+       sys.exit ('You have to install ragel if you are going to develop HarfBuzz itself')
 
-       generated_path = os.path.join (tempdir, hh)
-       with open (generated_path, "rb") as temp_file:
-               generated = temp_file.read()
+if len (sys.argv) < 4:
+       sys.exit (__doc__)
 
-       with open (hh, "rb") as current_file:
-               current = current_file.read()
+OUTPUT = sys.argv[2]
+CURRENT_SOURCE_DIR = sys.argv[3]
+INPUT = sys.argv[4]
 
-       # overwrite only if is changed
-       if generated != current:
-               shutil.copyfile (generated_path, hh)
+outdir = os.path.dirname (OUTPUT)
+shutil.copy (INPUT, outdir)
+rl = os.path.basename (INPUT)
+hh = rl.replace ('.rl', '.hh')
+subprocess.Popen (ragel.split() + ['-e', '-F1', '-o', hh, rl], cwd=outdir).wait ()
 
-shutil.rmtree (tempdir)
+# copy it also to src/
+shutil.copyfile (os.path.join (outdir, hh), os.path.join (CURRENT_SOURCE_DIR, hh))
index 401f4ca..f8fb05f 100755 (executable)
@@ -25,10 +25,8 @@ Input files:
 """
 
 import collections
+import html
 from html.parser import HTMLParser
-def write (s):
-       sys.stdout.flush ()
-       sys.stdout.buffer.write (s.encode ('utf-8'))
 import itertools
 import re
 import sys
@@ -37,16 +35,18 @@ import unicodedata
 if len (sys.argv) != 3:
        sys.exit (__doc__)
 
-from html import unescape
-def html_unescape (parser, entity):
-       return unescape (entity)
-
 def expect (condition, message=None):
        if not condition:
                if message is None:
                        raise AssertionError
                raise AssertionError (message)
 
+def write (s):
+       sys.stdout.flush ()
+       sys.stdout.buffer.write (s.encode ('utf-8'))
+
+DEFAULT_LANGUAGE_SYSTEM = ''
+
 # from https://www-01.sil.org/iso639-3/iso-639-3.tab
 ISO_639_3_TO_1 = {
        'aar': 'aa',
@@ -329,6 +329,10 @@ class OpenTypeRegistryParser (HTMLParser):
                from_bcp_47 (DefaultDict[str, AbstractSet[str]]): ``to_bcp_47``
                        inverted. Its values start as unsorted sets;
                        ``sort_languages`` converts them to sorted lists.
+               from_bcp_47_uninherited (Optional[Dict[str, AbstractSet[str]]]):
+                       A copy of ``from_bcp_47``. It starts as ``None`` and is
+                       populated at the beginning of the first call to
+                       ``inherit_from_macrolanguages``.
 
        """
        def __init__ (self):
@@ -338,13 +342,18 @@ class OpenTypeRegistryParser (HTMLParser):
                self.ranks = collections.defaultdict (int)
                self.to_bcp_47 = collections.defaultdict (set)
                self.from_bcp_47 = collections.defaultdict (set)
+               self.from_bcp_47_uninherited = None
                # Whether the parser is in a <td> element
                self._td = False
+               # Whether the parser is after a <br> element within the current <tr> element
+               self._br = False
                # The text of the <td> elements of the current <tr> element.
                self._current_tr = []
 
        def handle_starttag (self, tag, attrs):
-               if tag == 'meta':
+               if tag == 'br':
+                       self._br = True
+               elif tag == 'meta':
                        for attr, value in attrs:
                                if attr == 'name' and value == 'updated_at':
                                        self.header = self.get_starttag_text ()
@@ -353,6 +362,7 @@ class OpenTypeRegistryParser (HTMLParser):
                        self._td = True
                        self._current_tr.append ('')
                elif tag == 'tr':
+                       self._br = False
                        self._current_tr = []
 
        def handle_endtag (self, tag):
@@ -377,14 +387,14 @@ class OpenTypeRegistryParser (HTMLParser):
                        self.ranks[tag] = rank
 
        def handle_data (self, data):
-               if self._td:
+               if self._td and not self._br:
                        self._current_tr[-1] += data
 
        def handle_charref (self, name):
-               self.handle_data (html_unescape (self, '&#%s;' % name))
+               self.handle_data (html.unescape ('&#%s;' % name))
 
        def handle_entityref (self, name):
-               self.handle_data (html_unescape (self, '&%s;' % name))
+               self.handle_data (html.unescape ('&%s;' % name))
 
        def parse (self, filename):
                """Parse the OpenType language system tag registry.
@@ -457,33 +467,51 @@ class OpenTypeRegistryParser (HTMLParser):
                explicit mapping, so it inherits from sq (Albanian) the mapping
                to SQI.
 
+               However, if an OpenType tag maps to a BCP 47 macrolanguage and
+               some but not all of its individual languages, the mapping is not
+               inherited from the macrolanguage to the missing individual
+               languages. For example, INUK (Nunavik Inuktitut) is mapped to
+               ike (Eastern Canadian Inuktitut) and iu (Inuktitut) but not to
+               ikt (Inuinnaqtun, which is an individual language of iu), so
+               this method does not add a mapping from ikt to INUK.
+
                If a BCP 47 tag for a macrolanguage has no OpenType mapping but
-               all of its individual languages do and they all map to the same
-               tags, the mapping is copied to the macrolanguage.
+               some of its individual languages do, their mappings are copied
+               to the macrolanguage.
                """
                global bcp_47
-               original_ot_from_bcp_47 = dict (self.from_bcp_47)
+               first_time = self.from_bcp_47_uninherited is None
+               if first_time:
+                       self.from_bcp_47_uninherited = dict (self.from_bcp_47)
                for macrolanguage, languages in dict (bcp_47.macrolanguages).items ():
-                       ot_macrolanguages = set (original_ot_from_bcp_47.get (macrolanguage, set ()))
+                       ot_macrolanguages = {
+                               ot_macrolanguage for ot_macrolanguage in self.from_bcp_47_uninherited.get (macrolanguage, set ())
+                       }
+                       blocked_ot_macrolanguages = set ()
+                       if 'retired code' not in bcp_47.scopes.get (macrolanguage, ''):
+                               for ot_macrolanguage in ot_macrolanguages:
+                                       round_trip_macrolanguages = {
+                                               l for l in self.to_bcp_47[ot_macrolanguage]
+                                               if 'retired code' not in bcp_47.scopes.get (l, '')
+                                       }
+                                       round_trip_languages = {
+                                               l for l in languages
+                                               if 'retired code' not in bcp_47.scopes.get (l, '')
+                                       }
+                                       intersection = round_trip_macrolanguages & round_trip_languages
+                                       if intersection and intersection != round_trip_languages:
+                                               blocked_ot_macrolanguages.add (ot_macrolanguage)
                        if ot_macrolanguages:
                                for ot_macrolanguage in ot_macrolanguages:
-                                       for language in languages:
-                                               # Remove the following condition if e.g. nn should map to NYN,NOR
-                                               # instead of just NYN.
-                                               if language not in original_ot_from_bcp_47:
+                                       if ot_macrolanguage not in blocked_ot_macrolanguages:
+                                               for language in languages:
                                                        self.add_language (language, ot_macrolanguage)
-                                                       self.ranks[ot_macrolanguage] += 1
-                       else:
+                                                       if not blocked_ot_macrolanguages:
+                                                               self.ranks[ot_macrolanguage] += 1
+                       elif first_time:
                                for language in languages:
-                                       if language in original_ot_from_bcp_47:
-                                               if ot_macrolanguages:
-                                                       ml = original_ot_from_bcp_47[language]
-                                                       if ml:
-                                                               ot_macrolanguages &= ml
-                                                       else:
-                                                               pass
-                                               else:
-                                                       ot_macrolanguages |= original_ot_from_bcp_47[language]
+                                       if language in self.from_bcp_47_uninherited:
+                                               ot_macrolanguages |= self.from_bcp_47_uninherited[language]
                                        else:
                                                ot_macrolanguages.clear ()
                                        if not ot_macrolanguages:
@@ -556,7 +584,7 @@ class BCP47Parser (object):
                                                self.grandfathered.add (subtag.lower ())
                                elif line.startswith ('Description: '):
                                        description = line.split (' ', 1)[1].replace (' (individual language)', '')
-                                       description = re.sub (' (\((individual |macro)language\)|languages)$', '',
+                                       description = re.sub (' (\(family\)|\((individual |macro)language\)|languages)$', '',
                                                        description)
                                        if subtag in self.names:
                                                self.names[subtag] += '\n' + description
@@ -568,7 +596,7 @@ class BCP47Parser (object):
                                                if scope == 'macrolanguage':
                                                        scope = ' [macrolanguage]'
                                                elif scope == 'collection':
-                                                       scope = ' [family]'
+                                                       scope = ' [collection]'
                                                else:
                                                        continue
                                                self.scopes[subtag] = scope
@@ -591,7 +619,9 @@ class BCP47Parser (object):
                                        elif not has_preferred_value and line.startswith ('Macrolanguage: '):
                                                self._add_macrolanguage (line.split (' ')[1], subtag)
                                elif subtag_type == 'variant':
-                                       if line.startswith ('Prefix: '):
+                                       if line.startswith ('Deprecated: '):
+                                               self.scopes[subtag] = ' (retired code)' + self.scopes.get (subtag, '')
+                                       elif line.startswith ('Prefix: '):
                                                self.prefixes[subtag].add (line.split (' ')[1])
                                elif line.startswith ('File-Date: '):
                                        self.header = line
@@ -622,6 +652,17 @@ class BCP47Parser (object):
                                for macrolanguage in macrolanguages:
                                        self._add_macrolanguage (biggest_macrolanguage, macrolanguage)
 
+       def _get_name_piece (self, subtag):
+               """Return the first name of a subtag plus its scope suffix.
+
+               Args:
+                       subtag (str): A BCP 47 subtag.
+
+               Returns:
+                       The name form of ``subtag``.
+               """
+               return self.names[subtag].split ('\n')[0] + self.scopes.get (subtag, '')
+
        def get_name (self, lt):
                """Return the names of the subtags in a language tag.
 
@@ -631,13 +672,13 @@ class BCP47Parser (object):
                Returns:
                        The name form of ``lt``.
                """
-               name = self.names[lt.language].split ('\n')[0]
+               name = self._get_name_piece (lt.language)
                if lt.script:
-                       name += '; ' + self.names[lt.script.title ()].split ('\n')[0]
+                       name += '; ' + self._get_name_piece (lt.script.title ())
                if lt.region:
-                       name += '; ' + self.names[lt.region.upper ()].split ('\n')[0]
+                       name += '; ' + self._get_name_piece (lt.region.upper ())
                if lt.variant:
-                       name += '; ' + self.names[lt.variant].split ('\n')[0]
+                       name += '; ' + self._get_name_piece (lt.variant)
                return name
 
 bcp_47 = BCP47Parser ()
@@ -673,22 +714,18 @@ ot.add_language ('und-fonnapa', 'APPH')
 ot.remove_language_ot ('IRT')
 ot.add_language ('ga-Latg', 'IRT')
 
+ot.add_language ('hy-arevmda', 'HYE')
+
 ot.remove_language_ot ('KGE')
 ot.add_language ('und-Geok', 'KGE')
 
-ot.add_language ('guk', 'GUK')
-ot.names['GUK'] = 'Gumuz (SIL fonts)'
-ot.ranks['GUK'] = ot.ranks['GMZ'] + 1
-
 bcp_47.macrolanguages['id'] = {'in'}
 
 bcp_47.macrolanguages['ijo'] = {'ijc'}
 
 ot.add_language ('kht', 'KHN')
 ot.names['KHN'] = ot.names['KHT'] + ' (Microsoft fonts)'
-ot.names['KHT'] = ot.names['KHT'] + ' (OpenType spec and SIL fonts)'
-ot.ranks['KHN'] = ot.ranks['KHT']
-ot.ranks['KHT'] += 1
+ot.ranks['KHN'] = ot.ranks['KHT'] + 1
 
 ot.ranks['LCR'] = ot.ranks['MCR'] + 1
 
@@ -698,14 +735,18 @@ ot.ranks['MLR'] += 1
 bcp_47.names['mhv'] = 'Arakanese'
 bcp_47.scopes['mhv'] = ' (retired code)'
 
+ot.add_language ('mnw-TH', 'MONT')
+
 ot.add_language ('no', 'NOR')
 
 ot.add_language ('oc-provenc', 'PRO')
 
+ot.remove_language_ot ('QUZ')
 ot.add_language ('qu', 'QUZ')
 ot.add_language ('qub', 'QWH')
 ot.add_language ('qud', 'QVI')
 ot.add_language ('qug', 'QVI')
+ot.add_language ('qul', 'QUH')
 ot.add_language ('qup', 'QVI')
 ot.add_language ('qur', 'QWH')
 ot.add_language ('qus', 'QUH')
@@ -733,13 +774,8 @@ ot.add_language ('qxr', 'QVI')
 ot.add_language ('qxt', 'QWH')
 ot.add_language ('qxw', 'QWH')
 
-bcp_47.macrolanguages['ro'].remove ('mo')
 bcp_47.macrolanguages['ro-MD'].add ('mo')
 
-ot.add_language ('sgw', 'SGW')
-ot.names['SGW'] = ot.names['CHG'] + ' (SIL fonts)'
-ot.ranks['SGW'] = ot.ranks['CHG'] + 1
-
 ot.remove_language_ot ('SYRE')
 ot.remove_language_ot ('SYRJ')
 ot.remove_language_ot ('SYRN')
@@ -756,14 +792,17 @@ ot.add_language ('xwo', 'TOD')
 ot.remove_language_ot ('ZHH')
 ot.remove_language_ot ('ZHP')
 ot.remove_language_ot ('ZHT')
+ot.remove_language_ot ('ZHTM')
 bcp_47.macrolanguages['zh'].remove ('lzh')
 bcp_47.macrolanguages['zh'].remove ('yue')
 ot.add_language ('zh-Hant-MO', 'ZHH')
+ot.add_language ('zh-Hant-MO', 'ZHTM')
 ot.add_language ('zh-Hant-HK', 'ZHH')
 ot.add_language ('zh-Hans', 'ZHS')
 ot.add_language ('zh-Hant', 'ZHT')
 ot.add_language ('zh-HK', 'ZHH')
 ot.add_language ('zh-MO', 'ZHH')
+ot.add_language ('zh-MO', 'ZHTM')
 ot.add_language ('zh-TW', 'ZHT')
 ot.add_language ('lzh', 'ZHT')
 ot.add_language ('lzh-Hans', 'ZHS')
@@ -795,6 +834,7 @@ def rank_delta (bcp_47, ot):
 disambiguation = {
        'ALT': 'alt',
        'ARK': 'rki',
+       'ATH': 'ath',
        'BHI': 'bhb',
        'BLN': 'bjt',
        'BTI': 'beb',
@@ -806,6 +846,7 @@ disambiguation = {
        'ECR': 'crj',
        'HAL': 'cfm',
        'HND': 'hnd',
+       'HYE': 'hyw',
        'KIS': 'kqs',
        'KUI': 'uki',
        'LRC': 'bqi',
@@ -818,15 +859,24 @@ disambiguation = {
        'QVI': 'qvi',
        'QWH': 'qwh',
        'SIG': 'stv',
-       'TNE': 'yrk',
+       'SRB': 'sr',
+       'SXT': 'xnj',
        'ZHH': 'zh-HK',
        'ZHS': 'zh-Hans',
        'ZHT': 'zh-Hant',
+       'ZHTM': 'zh-MO',
 }
 
 ot.inherit_from_macrolanguages ()
 bcp_47.remove_extra_macrolanguages ()
 ot.inherit_from_macrolanguages ()
+ot.names[DEFAULT_LANGUAGE_SYSTEM] = '*/'
+ot.ranks[DEFAULT_LANGUAGE_SYSTEM] = max (ot.ranks.values ()) + 1
+for tricky_ot_tag in filter (lambda tag: re.match ('[A-Z]{3}$', tag), ot.names):
+       possible_bcp_47_tag = tricky_ot_tag.lower ()
+       if possible_bcp_47_tag in bcp_47.names and not ot.from_bcp_47[possible_bcp_47_tag]:
+               ot.add_language (possible_bcp_47_tag, DEFAULT_LANGUAGE_SYSTEM)
+               bcp_47.macrolanguages[possible_bcp_47_tag] = set ()
 ot.sort_languages ()
 
 print ('/* == Start of generated table == */')
@@ -855,6 +905,8 @@ def hb_tag (tag):
        Returns:
                A snippet of C++ representing ``tag``.
        """
+       if tag == DEFAULT_LANGUAGE_SYSTEM:
+               return 'HB_TAG_NONE\t       '
        return "HB_TAG('%s','%s','%s','%s')" % tuple (('%-4s' % tag)[:4])
 
 def get_variant_set (name):
@@ -903,14 +955,18 @@ for language, tags in sorted (ot.from_bcp_47.items ()):
                print ('\t/* ', end='')
                bcp_47_name = bcp_47.names.get (language, '')
                bcp_47_name_candidates = bcp_47_name.split ('\n')
-               intersection = language_name_intersection (bcp_47_name, ot.names[tag])
+               ot_name = ot.names[tag]
                scope = bcp_47.scopes.get (language, '')
-               if not intersection:
-                       write ('%s%s -> %s' % (bcp_47_name_candidates[0], scope, ot.names[tag]))
+               if tag == DEFAULT_LANGUAGE_SYSTEM:
+                       write (f'{bcp_47_name_candidates[0]}{scope} != {ot.names[language.upper ()]}')
                else:
-                       name = get_matching_language_name (intersection, bcp_47_name_candidates)
-                       bcp_47.names[language] = name
-                       write ('%s%s' % (name if len (name) > len (ot.names[tag]) else ot.names[tag], scope))
+                       intersection = language_name_intersection (bcp_47_name, ot_name)
+                       if not intersection:
+                               write ('%s%s -> %s' % (bcp_47_name_candidates[0], scope, ot_name))
+                       else:
+                               name = get_matching_language_name (intersection, bcp_47_name_candidates)
+                               bcp_47.names[language] = name
+                               write ('%s%s' % (name if len (name) > len (ot_name) else ot_name, scope))
                print (' */')
 
 print ('};')
@@ -957,6 +1013,8 @@ for initial, items in sorted (complex_tags.items ()):
        if initial != 'und':
                continue
        for lt, tags in items:
+               if not tags:
+                       continue
                if lt.variant in bcp_47.prefixes:
                        expect (next (iter (bcp_47.prefixes[lt.variant])) == lt.language,
                                        '%s is not a valid prefix of %s' % (lt.language, lt.variant))
@@ -991,23 +1049,27 @@ for initial, items in sorted (complex_tags.items ()):
                continue
        print ("  case '%s':" % initial)
        for lt, tags in items:
+               if not tags:
+                       continue
                print ('    if (', end='')
+               script = lt.script
+               region = lt.region
                if lt.grandfathered:
                        print ('0 == strcmp (&lang_str[1], "%s")' % lt.language[1:], end='')
                else:
                        string_literal = lt.language[1:] + '-'
-                       if lt.script:
-                               string_literal += lt.script
-                               lt.script = None
-                               if lt.region:
-                                       string_literal += '-' + lt.region
-                                       lt.region = None
+                       if script:
+                               string_literal += script
+                               script = None
+                               if region:
+                                       string_literal += '-' + region
+                                       region = None
                        if string_literal[-1] == '-':
                                print ('0 == strncmp (&lang_str[1], "%s", %i)' % (string_literal, len (string_literal)), end='')
                        else:
                                print ('lang_matches (&lang_str[1], "%s")' % string_literal, end='')
-               print_subtag_matches (lt.script, True)
-               print_subtag_matches (lt.region, True)
+               print_subtag_matches (script, True)
+               print_subtag_matches (region, True)
                print_subtag_matches (lt.variant, True)
                print (')')
                print ('    {')
@@ -1074,17 +1136,28 @@ def verify_disambiguation_dict ():
        global disambiguation
        global ot
        for ot_tag, bcp_47_tags in ot.to_bcp_47.items ():
-               primary_tags = list (t for t in bcp_47_tags if t not in bcp_47.grandfathered and ot.from_bcp_47.get (t)[0] == ot_tag)
+               if ot_tag == DEFAULT_LANGUAGE_SYSTEM:
+                       primary_tags = []
+               else:
+                       primary_tags = list (t for t in bcp_47_tags if t not in bcp_47.grandfathered and ot.from_bcp_47.get (t)[0] == ot_tag)
                if len (primary_tags) == 1:
                        expect (ot_tag not in disambiguation, 'unnecessary disambiguation for OT tag: %s' % ot_tag)
                        if '-' in primary_tags[0]:
                                disambiguation[ot_tag] = primary_tags[0]
+                       else:
+                               first_tag = sorted (t for t in bcp_47_tags if t not in bcp_47.grandfathered and ot_tag in ot.from_bcp_47.get (t))[0]
+                               if primary_tags[0] != first_tag:
+                                       disambiguation[ot_tag] = primary_tags[0]
                elif len (primary_tags) == 0:
                        expect (ot_tag not in disambiguation, 'There is no possible valid disambiguation for %s' % ot_tag)
                else:
-                       macrolanguages = list (t for t in primary_tags if bcp_47.scopes.get (t) == ' [macrolanguage]')
+                       original_languages = [t for t in primary_tags if t in ot.from_bcp_47_uninherited and 'retired code' not in bcp_47.scopes.get (t, '')]
+                       if len (original_languages) == 1:
+                               macrolanguages = original_languages
+                       else:
+                               macrolanguages = [t for t in primary_tags if bcp_47.scopes.get (t) == ' [macrolanguage]']
                        if len (macrolanguages) != 1:
-                               macrolanguages = list (t for t in primary_tags if bcp_47.scopes.get (t) == ' [family]')
+                               macrolanguages = list (t for t in primary_tags if bcp_47.scopes.get (t) == ' [collection]')
                        if len (macrolanguages) != 1:
                                macrolanguages = list (t for t in primary_tags if 'retired code' not in bcp_47.scopes.get (t, ''))
                        if len (macrolanguages) != 1:
@@ -1093,8 +1166,8 @@ def verify_disambiguation_dict ():
                                                '%s is not a valid disambiguation for %s' % (disambiguation[ot_tag], ot_tag))
                        elif ot_tag not in disambiguation:
                                disambiguation[ot_tag] = macrolanguages[0]
-                       different_primary_tags = sorted (t for t in primary_tags if not same_tag (t, ot.from_bcp_47.get (t)))
-                       if different_primary_tags and disambiguation[ot_tag] == different_primary_tags[0] and '-' not in disambiguation[ot_tag]:
+                       different_bcp_47_tags = sorted (t for t in bcp_47_tags if not same_tag (t, ot.from_bcp_47.get (t)))
+                       if different_bcp_47_tags and disambiguation[ot_tag] == different_bcp_47_tags[0] and '-' not in disambiguation[ot_tag]:
                                del disambiguation[ot_tag]
        for ot_tag in disambiguation.keys ():
                expect (ot_tag in ot.to_bcp_47, 'unknown OT tag: %s' % ot_tag)
index 402de33..35fba2d 100755 (executable)
@@ -6,7 +6,7 @@ Input file:
 * https://unicode.org/Public/UCD/latest/ucdxml/ucd.nounihan.grouped.zip
 """
 
-import os.path, sys, re
+import sys, re
 import logging
 logging.basicConfig(format='%(levelname)s: %(message)s', level=logging.INFO)
 
index 19ad263..34540ca 100755 (executable)
@@ -1,29 +1,46 @@
 #!/usr/bin/env python3
 # flake8: noqa: F821
 
-"""usage: ./gen-use-table.py IndicSyllabicCategory.txt IndicPositionalCategory.txt UnicodeData.txt Blocks.txt
+"""usage: ./gen-use-table.py IndicSyllabicCategory.txt IndicPositionalCategory.txt ArabicShaping.txt DerivedCoreProperties.txt UnicodeData.txt Blocks.txt Scripts.txt IndicSyllabicCategory-Additional.txt IndicPositionalCategory-Additional.txt
 
-Input file:
+Input files:
 * https://unicode.org/Public/UCD/latest/ucd/IndicSyllabicCategory.txt
 * https://unicode.org/Public/UCD/latest/ucd/IndicPositionalCategory.txt
+* https://unicode.org/Public/UCD/latest/ucd/ArabicShaping.txt
+* https://unicode.org/Public/UCD/latest/ucd/DerivedCoreProperties.txt
 * https://unicode.org/Public/UCD/latest/ucd/UnicodeData.txt
 * https://unicode.org/Public/UCD/latest/ucd/Blocks.txt
+* https://unicode.org/Public/UCD/latest/ucd/Scripts.txt
+* ms-use/IndicSyllabicCategory-Additional.txt
+* ms-use/IndicPositionalCategory-Additional.txt
 """
 
 import sys
 
-if len (sys.argv) != 5:
+if len (sys.argv) != 10:
        sys.exit (__doc__)
 
-BLACKLISTED_BLOCKS = ["Thai", "Lao"]
+DISABLED_SCRIPTS = {
+       'Arabic',
+       'Lao',
+       'Samaritan',
+       'Syriac',
+       'Thai',
+}
 
 files = [open (x, encoding='utf-8') for x in sys.argv[1:]]
 
-headers = [[f.readline () for i in range (2)] for j,f in enumerate(files) if j != 2]
+headers = [[f.readline () for i in range (2)] for j,f in enumerate(files) if j != 4]
+for j in range(7, 9):
+       for line in files[j]:
+               line = line.rstrip()
+               if not line:
+                       break
+               headers[j - 1].append(line)
 headers.append (["UnicodeData.txt does not have a header."])
 
-data = [{} for f in files]
-values = [{} for f in files]
+data = [{} for _ in files]
+values = [{} for _ in files]
 for i, f in enumerate (files):
        for line in f:
 
@@ -42,16 +59,26 @@ for i, f in enumerate (files):
                else:
                        end = int (uu[1], 16)
 
-               t = fields[1 if i != 2 else 2]
+               t = fields[1 if i not in [2, 4] else 2]
+
+               if i == 2:
+                       t = 'jt_' + t
+               elif i == 3 and t != 'Default_Ignorable_Code_Point':
+                       continue
+               elif i == 7 and t == 'Consonant_Final_Modifier':
+                       # TODO: https://github.com/MicrosoftDocs/typography-issues/issues/336
+                       t = 'Syllable_Modifier'
+               elif i == 8 and t == 'NA':
+                       t = 'Not_Applicable'
 
+               i0 = i if i < 7 else i - 7
                for u in range (start, end + 1):
-                       data[i][u] = t
-               values[i][t] = values[i].get (t, 0) + end - start + 1
+                       data[i0][u] = t
+               values[i0][t] = values[i0].get (t, 0) + end - start + 1
 
-defaults = ('Other', 'Not_Applicable', 'Cn', 'No_Block')
+defaults = ('Other', 'Not_Applicable', 'jt_X', '', 'Cn', 'No_Block', 'Unknown')
 
 # TODO Characters that are not in Unicode Indic files, but used in USE
-data[0][0x034F] = defaults[0]
 data[0][0x1B61] = defaults[0]
 data[0][0x1B63] = defaults[0]
 data[0][0x1B64] = defaults[0]
@@ -72,8 +99,6 @@ data[0][0x11C44] = 'Consonant_Placeholder'
 data[0][0x11C45] = 'Consonant_Placeholder'
 # TODO https://github.com/harfbuzz/harfbuzz/pull/1399
 data[0][0x111C8] = 'Consonant_Placeholder'
-for u in range (0xFE00, 0xFE0F + 1):
-       data[0][u] = defaults[0]
 
 # Merge data into one dict:
 for i,v in enumerate (defaults):
@@ -81,15 +106,14 @@ for i,v in enumerate (defaults):
 combined = {}
 for i,d in enumerate (data):
        for u,v in d.items ():
-               if i >= 2 and not u in combined:
-                       continue
                if not u in combined:
+                       if i >= 4:
+                               continue
                        combined[u] = list (defaults)
                combined[u][i] = v
-combined = {k:v for k,v in combined.items() if v[3] not in BLACKLISTED_BLOCKS}
+combined = {k: v for k, v in combined.items() if v[6] not in DISABLED_SCRIPTS}
 data = combined
 del combined
-num = len (data)
 
 
 property_names = [
@@ -134,6 +158,10 @@ property_names = [
        'Number_Joiner',
        'Number',
        'Brahmi_Joining_Number',
+       'Hieroglyph',
+       'Hieroglyph_Joiner',
+       'Hieroglyph_Segment_Begin',
+       'Hieroglyph_Segment_End',
        # Indic_Positional_Category
        'Not_Applicable',
        'Right',
@@ -151,6 +179,14 @@ property_names = [
        'Bottom_And_Right',
        'Top_And_Bottom_And_Right',
        'Overstruck',
+       # Joining_Type
+       'jt_C',
+       'jt_D',
+       'jt_L',
+       'jt_R',
+       'jt_T',
+       'jt_U',
+       'jt_X',
 ]
 
 class PropertyValue(object):
@@ -175,96 +211,85 @@ for name in property_names:
 globals().update(property_values)
 
 
-def is_BASE(U, UISC, UGC):
+def is_BASE(U, UISC, UDI, UGC, AJT):
        return (UISC in [Number, Consonant, Consonant_Head_Letter,
-                       #SPEC-DRAFT Consonant_Placeholder,
                        Tone_Letter,
-                       Vowel_Independent #SPEC-DRAFT
+                       Vowel_Independent,
                        ] or
+               # TODO: https://github.com/MicrosoftDocs/typography-issues/issues/484
+               AJT in [jt_C, jt_D, jt_L, jt_R] and UISC != Joiner or
                (UGC == Lo and UISC in [Avagraha, Bindu, Consonant_Final, Consonant_Medial,
                                        Consonant_Subjoined, Vowel, Vowel_Dependent]))
-def is_BASE_IND(U, UISC, UGC):
-       #SPEC-DRAFT return (UISC in [Consonant_Dead, Modifying_Letter] or UGC == Po)
-       return (UISC in [Consonant_Dead, Modifying_Letter] or
-               (UGC == Po and not U in [0x104B, 0x104E, 0x1B5B, 0x1B5C, 0x1B5F, 0x2022, 0x111C8, 0x11A3F, 0x11A45, 0x11C44, 0x11C45]) or
-               False # SPEC-DRAFT-OUTDATED! U == 0x002D
-               )
-def is_BASE_NUM(U, UISC, UGC):
+def is_BASE_NUM(U, UISC, UDI, UGC, AJT):
        return UISC == Brahmi_Joining_Number
-def is_BASE_OTHER(U, UISC, UGC):
-       if UISC == Consonant_Placeholder: return True #SPEC-DRAFT
-       #SPEC-DRAFT return U in [0x00A0, 0x00D7, 0x2015, 0x2022, 0x25CC, 0x25FB, 0x25FC, 0x25FD, 0x25FE]
+def is_BASE_OTHER(U, UISC, UDI, UGC, AJT):
+       if UISC == Consonant_Placeholder: return True
        return U in [0x2015, 0x2022, 0x25FB, 0x25FC, 0x25FD, 0x25FE]
-def is_CGJ(U, UISC, UGC):
-       return U == 0x034F
-def is_CONS_FINAL(U, UISC, UGC):
+def is_CGJ(U, UISC, UDI, UGC, AJT):
+       # Also includes VARIATION_SELECTOR, WJ, and ZWJ
+       return U == 0x200D or UDI and UGC in [Mc, Me, Mn]
+def is_CONS_FINAL(U, UISC, UDI, UGC, AJT):
        return ((UISC == Consonant_Final and UGC != Lo) or
                UISC == Consonant_Succeeding_Repha)
-def is_CONS_FINAL_MOD(U, UISC, UGC):
-       #SPEC-DRAFT return  UISC in [Consonant_Final_Modifier, Syllable_Modifier]
-       return  UISC == Syllable_Modifier
-def is_CONS_MED(U, UISC, UGC):
+def is_CONS_FINAL_MOD(U, UISC, UDI, UGC, AJT):
+       return UISC == Syllable_Modifier
+def is_CONS_MED(U, UISC, UDI, UGC, AJT):
        # Consonant_Initial_Postfixed is new in Unicode 11; not in the spec.
        return (UISC == Consonant_Medial and UGC != Lo or
                UISC == Consonant_Initial_Postfixed)
-def is_CONS_MOD(U, UISC, UGC):
-       return UISC in [Nukta, Gemination_Mark, Consonant_Killer]
-def is_CONS_SUB(U, UISC, UGC):
-       #SPEC-DRAFT return UISC == Consonant_Subjoined
+def is_CONS_MOD(U, UISC, UDI, UGC, AJT):
+       return (UISC in [Nukta, Gemination_Mark, Consonant_Killer] and
+               not is_SYM_MOD(U, UISC, UDI, UGC, AJT))
+def is_CONS_SUB(U, UISC, UDI, UGC, AJT):
        return UISC == Consonant_Subjoined and UGC != Lo
-def is_CONS_WITH_STACKER(U, UISC, UGC):
+def is_CONS_WITH_STACKER(U, UISC, UDI, UGC, AJT):
        return UISC == Consonant_With_Stacker
-def is_HALANT(U, UISC, UGC):
+def is_HALANT(U, UISC, UDI, UGC, AJT):
        return (UISC in [Virama, Invisible_Stacker]
-               and not is_HALANT_OR_VOWEL_MODIFIER(U, UISC, UGC)
-               and not is_SAKOT(U, UISC, UGC))
-def is_HALANT_OR_VOWEL_MODIFIER(U, UISC, UGC):
-       # https://github.com/harfbuzz/harfbuzz/issues/1102
+               and not is_HALANT_OR_VOWEL_MODIFIER(U, UISC, UDI, UGC, AJT)
+               and not is_SAKOT(U, UISC, UDI, UGC, AJT))
+def is_HALANT_OR_VOWEL_MODIFIER(U, UISC, UDI, UGC, AJT):
+       # Split off of HALANT
        # https://github.com/harfbuzz/harfbuzz/issues/1379
-       return U in [0x11046, 0x1134D]
-def is_HALANT_NUM(U, UISC, UGC):
+       return U == 0x1134D
+def is_HALANT_NUM(U, UISC, UDI, UGC, AJT):
        return UISC == Number_Joiner
-def is_ZWNJ(U, UISC, UGC):
+def is_HIEROGLYPH(U, UISC, UDI, UGC, AJT):
+       return UISC == Hieroglyph
+def is_HIEROGLYPH_JOINER(U, UISC, UDI, UGC, AJT):
+       return UISC == Hieroglyph_Joiner
+def is_HIEROGLYPH_SEGMENT_BEGIN(U, UISC, UDI, UGC, AJT):
+       return UISC == Hieroglyph_Segment_Begin
+def is_HIEROGLYPH_SEGMENT_END(U, UISC, UDI, UGC, AJT):
+       return UISC == Hieroglyph_Segment_End
+def is_ZWNJ(U, UISC, UDI, UGC, AJT):
        return UISC == Non_Joiner
-def is_ZWJ(U, UISC, UGC):
-       return UISC == Joiner
-def is_Word_Joiner(U, UISC, UGC):
-       return U == 0x2060
-def is_OTHER(U, UISC, UGC):
-       #SPEC-OUTDATED return UGC == Zs # or any other SCRIPT_COMMON characters
-       return (UISC == Other
-               and not is_SYM(U, UISC, UGC)
-               and not is_SYM_MOD(U, UISC, UGC)
-               and not is_CGJ(U, UISC, UGC)
-               and not is_Word_Joiner(U, UISC, UGC)
-               and not is_VARIATION_SELECTOR(U, UISC, UGC)
+def is_OTHER(U, UISC, UDI, UGC, AJT):
+       # Also includes BASE_IND, Rsv, and SYM
+       return ((UGC in [Cn, Po] or UISC in [Consonant_Dead, Joiner, Modifying_Letter, Other])
+               and not is_BASE(U, UISC, UDI, UGC, AJT)
+               and not is_BASE_OTHER(U, UISC, UDI, UGC, AJT)
+               and not is_CGJ(U, UISC, UDI, UGC, AJT)
+               and not is_SYM_MOD(U, UISC, UDI, UGC, AJT)
        )
-def is_Reserved(U, UISC, UGC):
-       return UGC == 'Cn'
-def is_REPHA(U, UISC, UGC):
+def is_REPHA(U, UISC, UDI, UGC, AJT):
        return UISC in [Consonant_Preceding_Repha, Consonant_Prefixed]
-def is_SAKOT(U, UISC, UGC):
+def is_SAKOT(U, UISC, UDI, UGC, AJT):
+       # Split off of HALANT
        return U == 0x1A60
-def is_SYM(U, UISC, UGC):
-       if U == 0x25CC: return False #SPEC-DRAFT
-       #SPEC-DRAFT return UGC in [So, Sc] or UISC == Symbol_Letter
-       return UGC in [So, Sc] and U not in [0x1B62, 0x1B68]
-def is_SYM_MOD(U, UISC, UGC):
+def is_SYM_MOD(U, UISC, UDI, UGC, AJT):
        return U in [0x1B6B, 0x1B6C, 0x1B6D, 0x1B6E, 0x1B6F, 0x1B70, 0x1B71, 0x1B72, 0x1B73]
-def is_VARIATION_SELECTOR(U, UISC, UGC):
-       return 0xFE00 <= U <= 0xFE0F
-def is_VOWEL(U, UISC, UGC):
+def is_VOWEL(U, UISC, UDI, UGC, AJT):
        # https://github.com/harfbuzz/harfbuzz/issues/376
        return (UISC == Pure_Killer or
                (UGC != Lo and UISC in [Vowel, Vowel_Dependent] and U not in [0xAA29]))
-def is_VOWEL_MOD(U, UISC, UGC):
+def is_VOWEL_MOD(U, UISC, UDI, UGC, AJT):
        # https://github.com/harfbuzz/harfbuzz/issues/376
        return (UISC in [Tone_Mark, Cantillation_Mark, Register_Shifter, Visarga] or
                (UGC != Lo and (UISC == Bindu or U in [0xAA29])))
 
 use_mapping = {
        'B':    is_BASE,
-       'IND':  is_BASE_IND,
        'N':    is_BASE_NUM,
        'GB':   is_BASE_OTHER,
        'CGJ':  is_CGJ,
@@ -277,16 +302,15 @@ use_mapping = {
        'H':    is_HALANT,
        'HVM':  is_HALANT_OR_VOWEL_MODIFIER,
        'HN':   is_HALANT_NUM,
+       'G':    is_HIEROGLYPH,
+       'J':    is_HIEROGLYPH_JOINER,
+       'SB':   is_HIEROGLYPH_SEGMENT_BEGIN,
+       'SE':   is_HIEROGLYPH_SEGMENT_END,
        'ZWNJ': is_ZWNJ,
-       'ZWJ':  is_ZWJ,
-       'WJ':   is_Word_Joiner,
        'O':    is_OTHER,
-       'Rsv':  is_Reserved,
        'R':    is_REPHA,
-       'S':    is_SYM,
        'Sk':   is_SAKOT,
        'SM':   is_SYM_MOD,
-       'VS':   is_VARIATION_SELECTOR,
        'V':    is_VOWEL,
        'VM':   is_VOWEL_MOD,
 }
@@ -305,13 +329,13 @@ use_positions = {
        },
        'CM': {
                'Abv': [Top],
-               'Blw': [Bottom],
+               'Blw': [Bottom, Overstruck],
        },
        'V': {
                'Abv': [Top, Top_And_Bottom, Top_And_Bottom_And_Right, Top_And_Right],
                'Blw': [Bottom, Overstruck, Bottom_And_Right],
-               'Pst': [Right, Top_And_Left, Top_And_Left_And_Right, Left_And_Right],
-               'Pre': [Left],
+               'Pst': [Right],
+               'Pre': [Left, Top_And_Left, Top_And_Left_And_Right, Left_And_Right],
        },
        'VM': {
                'Abv': [Top],
@@ -331,13 +355,14 @@ use_positions = {
                'Blw': [Bottom],
                'Pst': [Not_Applicable],
        },
+       'R': None,
        'SUB': None,
 }
 
 def map_to_use(data):
        out = {}
        items = use_mapping.items()
-       for U,(UISC,UIPC,UGC,UBlock) in data.items():
+       for U, (UISC, UIPC, AJT, UDI, UGC, UBlock, _) in data.items():
 
                # Resolve Indic_Syllabic_Category
 
@@ -347,20 +372,6 @@ def map_to_use(data):
                # Tibetan:
                # TODO: These don't have UISC assigned in Unicode 13.0.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
-               # https://github.com/harfbuzz/harfbuzz/issues/1012
-               if UBlock == 'Tibetan' and is_VOWEL (U, UISC, UGC):
-                       if UIPC == Top:
-                               UIPC = Bottom
-
-               # TODO: https://github.com/harfbuzz/harfbuzz/pull/982
-               # also  https://github.com/harfbuzz/harfbuzz/issues/1012
-               if UBlock == 'Chakma' and is_VOWEL (U, UISC, UGC):
-                       if UIPC == Top:
-                               UIPC = Bottom
-                       elif UIPC == Bottom:
-                               UIPC = Top
 
                # TODO: https://github.com/harfbuzz/harfbuzz/pull/627
                if 0x1BF2 <= U <= 0x1BF3: UISC = Nukta; UIPC = Bottom
@@ -369,11 +380,11 @@ def map_to_use(data):
                # the nasalization marks, maybe only for U+1CE9..U+1CF1.
                if U == 0x1CED: UISC = Tone_Mark
 
-               # TODO: https://github.com/harfbuzz/harfbuzz/issues/1105
-               if U == 0x11134: UISC = Gemination_Mark
+               # TODO: https://github.com/microsoft/font-tools/issues/1
+               if U == 0xA982: UISC = Consonant_Succeeding_Repha
 
-               values = [k for k,v in items if v(U,UISC,UGC)]
-               assert len(values) == 1, "%s %s %s %s" % (hex(U), UISC, UGC, values)
+               values = [k for k,v in items if v(U, UISC, UDI, UGC, AJT)]
+               assert len(values) == 1, "%s %s %s %s %s %s" % (hex(U), UISC, UDI, UGC, AJT, values)
                USE = values[0]
 
                # Resolve Indic_Positional_Category
@@ -381,9 +392,6 @@ def map_to_use(data):
                # TODO: These should die, but have UIPC in Unicode 13.0.0
                if U in [0x953, 0x954]: UIPC = Not_Applicable
 
-               # TODO: https://github.com/harfbuzz/harfbuzz/pull/2012
-               if U == 0x1C29: UIPC = Left
-
                # TODO: These are not in USE's override list that we have, nor are they in Unicode 13.0.0
                if 0xA926 <= U <= 0xA92A: UIPC = Top
                # TODO: https://github.com/harfbuzz/harfbuzz/pull/1037
@@ -391,14 +399,18 @@ def map_to_use(data):
                if U in [0x11302, 0x11303, 0x114C1]: UIPC = Top
                if 0x1CF8 <= U <= 0x1CF9: UIPC = Top
 
-               assert (UIPC in [Not_Applicable, Visual_Order_Left] or
-                       USE == 'R' or
-                       USE in use_positions), "%s %s %s %s %s" % (hex(U), UIPC, USE, UISC, UGC)
+               # TODO: https://github.com/harfbuzz/harfbuzz/pull/982
+               # also  https://github.com/harfbuzz/harfbuzz/issues/1012
+               if 0x1112A <= U <= 0x1112B: UIPC = Top
+               if 0x11131 <= U <= 0x11132: UIPC = Top
+
+               assert (UIPC in [Not_Applicable, Visual_Order_Left] or U == 0x0F7F or
+                       USE in use_positions), "%s %s %s %s %s %s %s" % (hex(U), UIPC, USE, UISC, UDI, UGC, AJT)
 
                pos_mapping = use_positions.get(USE, None)
                if pos_mapping:
                        values = [k for k,v in pos_mapping.items() if v and UIPC in v]
-                       assert len(values) == 1, "%s %s %s %s %s %s" % (hex(U), UIPC, USE, UISC, UGC, values)
+                       assert len(values) == 1, "%s %s %s %s %s %s %s %s" % (hex(U), UIPC, USE, UISC, UDI, UGC, AJT, values)
                        USE = USE + values[0]
 
                out[U] = (USE, UBlock)
@@ -411,7 +423,7 @@ print ("/* == Start of generated table == */")
 print ("/*")
 print (" * The following table is generated by running:")
 print (" *")
-print (" *   ./gen-use-table.py IndicSyllabicCategory.txt IndicPositionalCategory.txt UnicodeData.txt Blocks.txt")
+print (" *   {} IndicSyllabicCategory.txt IndicPositionalCategory.txt ArabicShaping.txt DerivedCoreProperties.txt UnicodeData.txt Blocks.txt Scripts.txt IndicSyllabicCategory-Additional.txt IndicPositionalCategory-Additional.txt".format (sys.argv[0]))
 print (" *")
 print (" * on files with these headers:")
 print (" *")
@@ -420,11 +432,12 @@ for h in headers:
                print (" * %s" % (l.strip()))
 print (" */")
 print ()
-print ('#include "hb.hh"')
+print ("#ifndef HB_OT_SHAPE_COMPLEX_USE_TABLE_HH")
+print ("#define HB_OT_SHAPE_COMPLEX_USE_TABLE_HH")
 print ()
-print ('#ifndef HB_NO_OT_SHAPE')
+print ('#include "hb.hh"')
 print ()
-print ('#include "hb-ot-shape-complex-use.hh"')
+print ('#include "hb-ot-shape-complex-use-machine.hh"')
 print ()
 
 total = 0
@@ -466,18 +479,20 @@ print ('#pragma GCC diagnostic push')
 print ('#pragma GCC diagnostic ignored "-Wunused-macros"')
 for k,v in sorted(use_mapping.items()):
        if k in use_positions and use_positions[k]: continue
-       print ("#define %s      USE_%s  /* %s */" % (k, k, v.__name__[3:]))
+       print ("#define %s      USE(%s) /* %s */" % (k, k, v.__name__[3:]))
 for k,v in sorted(use_positions.items()):
        if not v: continue
        for suf in v.keys():
                tag = k + suf
-               print ("#define %s      USE_%s" % (tag, tag))
+               print ("#define %s      USE(%s)" % (tag, tag))
 print ('#pragma GCC diagnostic pop')
 print ("")
-print ("static const USE_TABLE_ELEMENT_TYPE use_table[] = {")
+print ("static const uint8_t use_table[] = {")
 for u in uu:
        if u <= last:
                continue
+       if data[u][0] == 'O':
+               continue
        block = data[u][1]
 
        start = u//8*8
@@ -489,7 +504,6 @@ for u in uu:
        if start != last + 1:
                if start - last <= 1+16*3:
                        print_block (None, last+1, start-1, data)
-                       last = start-1
                else:
                        if last >= 0:
                                ends.append (last + 1)
@@ -509,7 +523,7 @@ occupancy = used * 100. / total
 page_bits = 12
 print ("}; /* Table items: %d; occupancy: %d%% */" % (offset, occupancy))
 print ()
-print ("USE_TABLE_ELEMENT_TYPE")
+print ("static inline uint8_t")
 print ("hb_use_get_category (hb_codepoint_t u)")
 print ("{")
 print ("  switch (u >> %d)" % page_bits)
@@ -526,7 +540,7 @@ for p in sorted(pages):
 print ("    default:")
 print ("      break;")
 print ("  }")
-print ("  return USE_O;")
+print ("  return USE(O);")
 print ("}")
 print ()
 for k in sorted(use_mapping.keys()):
@@ -539,7 +553,7 @@ for k,v in sorted(use_positions.items()):
                print ("#undef %s" % tag)
 print ()
 print ()
-print ('#endif')
+print ("#endif /* HB_OT_SHAPE_COMPLEX_USE_TABLE_HH */")
 print ("/* == End of generated table == */")
 
 # Maintain at least 50% occupancy in the table */
index 7f23dc8..42afd28 100755 (executable)
@@ -14,11 +14,9 @@ Input file:
 """
 
 import collections
-from html.parser import HTMLParser
 def write (s):
        sys.stdout.flush ()
        sys.stdout.buffer.write (s.encode ('utf-8'))
-import itertools
 import sys
 
 if len (sys.argv) != 3:
@@ -103,7 +101,7 @@ class ConstraintSet (object):
                                                self._indent (depth + 2), cp, index + i, ')' if i == len (self._c) - 1 else ' &&'))
                                s.append ('{}{{\n'.format (indent))
                                for i in range (index):
-                                       s.append ('{}buffer->next_glyph ();\n'.format (self._indent (depth + 1)))
+                                       s.append ('{}(void) buffer->next_glyph ();\n'.format (self._indent (depth + 1)))
                                s.append ('{}matched = true;\n'.format (self._indent (depth + 1)))
                                s.append ('{}}}\n'.format (indent))
                else:
@@ -173,15 +171,15 @@ print ()
 print ('static void')
 print ('_output_dotted_circle (hb_buffer_t *buffer)')
 print ('{')
-print ('  hb_glyph_info_t &dottedcircle = buffer->output_glyph (0x25CCu);')
-print ('  _hb_glyph_info_reset_continuation (&dottedcircle);')
+print ('  (void) buffer->output_glyph (0x25CCu);')
+print ('  _hb_glyph_info_reset_continuation (&buffer->prev());')
 print ('}')
 print ()
 print ('static void')
 print ('_output_with_dotted_circle (hb_buffer_t *buffer)')
 print ('{')
 print ('  _output_dotted_circle (buffer);')
-print ('  buffer->next_glyph ();')
+print ('  (void) buffer->next_glyph ();')
 print ('}')
 print ()
 
@@ -202,7 +200,6 @@ print ('   * collected from the USE script development spec.')
 print ('   *')
 print ('   * https://github.com/harfbuzz/harfbuzz/issues/1019')
 print ('   */')
-print ('  bool processed = false;')
 print ('  buffer->clear_output ();')
 print ('  unsigned int count = buffer->len;')
 print ('  switch ((unsigned) buffer->props.script)')
@@ -214,22 +211,16 @@ for script, constraints in sorted (constraints.items (), key=lambda s_c: script_
        print ('      {')
        print ('\tbool matched = false;')
        write (str (constraints))
-       print ('\tbuffer->next_glyph ();')
+       print ('\t(void) buffer->next_glyph ();')
        print ('\tif (matched) _output_with_dotted_circle (buffer);')
        print ('      }')
-       print ('      processed = true;')
        print ('      break;')
        print ()
 
 print ('    default:')
 print ('      break;')
 print ('  }')
-print ('  if (processed)')
-print ('  {')
-print ('    if (buffer->idx < count)')
-print ('      buffer->next_glyph ();')
-print ('    buffer->swap_buffers ();')
-print ('  }')
+print ('  buffer->sync ();')
 print ('}')
 
 print ()
index 6a07a9e..b6a5957 100644 (file)
@@ -2,6 +2,7 @@
 #include "hb-aat-map.cc"
 #include "hb-blob.cc"
 #include "hb-buffer-serialize.cc"
+#include "hb-buffer-verify.cc"
 #include "hb-buffer.cc"
 #include "hb-common.cc"
 #include "hb-draw.cc"
@@ -29,8 +30,8 @@
 #include "hb-ot-shape-complex-indic.cc"
 #include "hb-ot-shape-complex-khmer.cc"
 #include "hb-ot-shape-complex-myanmar.cc"
+#include "hb-ot-shape-complex-syllabic.cc"
 #include "hb-ot-shape-complex-thai.cc"
-#include "hb-ot-shape-complex-use-table.cc"
 #include "hb-ot-shape-complex-use.cc"
 #include "hb-ot-shape-complex-vowel-constraints.cc"
 #include "hb-ot-shape-fallback.cc"
@@ -43,6 +44,7 @@
 #include "hb-shape.cc"
 #include "hb-shaper.cc"
 #include "hb-static.cc"
+#include "hb-style.cc"
 #include "hb-ucd.cc"
 #include "hb-unicode.cc"
 #include "hb-glib.cc"
diff --git a/src/hb-aat-fdsc-table.hh b/src/hb-aat-fdsc-table.hh
deleted file mode 100644 (file)
index 4bc97b7..0000000
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Copyright © 2018  Ebrahim Byagowi
- *
- *  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.
- */
-
-#ifndef HB_AAT_FDSC_TABLE_HH
-#define HB_AAT_FDSC_TABLE_HH
-
-#include "hb-aat-layout-common.hh"
-#include "hb-open-type.hh"
-
-/*
- * fdsc -- Font descriptors
- * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6fdsc.html
- */
-#define HB_AAT_TAG_fdsc HB_TAG('f','d','s','c')
-
-
-namespace AAT {
-
-
-struct FontDescriptor
-{
-  bool has_data () const { return tag; }
-
-  int cmp (hb_tag_t a) const { return tag.cmp (a); }
-
-  float get_value () const { return u.value.to_float (); }
-
-  enum non_alphabetic_value_t {
-    Alphabetic         = 0,
-    Dingbats           = 1,
-    PiCharacters       = 2,
-    Fleurons           = 3,
-    DecorativeBorders  = 4,
-    InternationalSymbols= 5,
-    MathSymbols                = 6
-  };
-
-  bool sanitize (hb_sanitize_context_t *c) const
-  {
-    TRACE_SANITIZE (this);
-    return_trace (c->check_struct (this));
-  }
-
-  protected:
-  Tag          tag;            /* The 4-byte table tag name. */
-  union {
-  HBFixed      value;          /* The value for the descriptor tag. */
-  HBUINT32     nalfType;       /* If the tag is `nalf`, see non_alphabetic_value_t */
-  } u;
-  public:
-  DEFINE_SIZE_STATIC (8);
-};
-
-struct fdsc
-{
-  static constexpr hb_tag_t tableTag = HB_AAT_TAG_fdsc;
-
-  enum {
-    Weight      = HB_TAG ('w','g','h','t'),
-                               /* Percent weight relative to regular weight.
-                                * (defaul value: 1.0) */
-    Width       = HB_TAG ('w','d','t','h'),
-                               /* Percent width relative to regular width.
-                                * (default value: 1.0) */
-    Slant       = HB_TAG ('s','l','n','t'),
-                               /* Angle of slant in degrees, where positive
-                                * is clockwise from straight up.
-                                * (default value: 0.0) */
-    OpticalSize  = HB_TAG ('o','p','s','z'),
-                               /* Point size the font was designed for.
-                                * (default value: 12.0) */
-    NonAlphabetic= HB_TAG ('n','a','l','f')
-                               /* These values are treated as integers,
-                                * not fixed32s. 0 means alphabetic, and greater
-                                * integers mean the font is non-alphabetic (e.g. symbols).
-                                * (default value: 0) */
-  };
-
-  const FontDescriptor &get_descriptor (hb_tag_t style) const
-  { return descriptors.lsearch (style); }
-
-  bool sanitize (hb_sanitize_context_t *c) const
-  {
-    TRACE_SANITIZE (this);
-    return_trace (c->check_struct (this) &&
-                 descriptors.sanitize (c));
-  }
-
-  protected:
-  HBFixed      version;        /* Version number of the font descriptors
-                                * table (0x00010000 for the current version). */
-  LArrayOf<FontDescriptor>
-               descriptors;    /* List of tagged-coordinate pairs style descriptors
-                                * that will be included to characterize this font.
-                                * Each descriptor consists of a <tag, value> pair.
-                                * These pairs are located in the gxFontDescriptor
-                                * array that follows. */
-  public:
-  DEFINE_SIZE_ARRAY (8, descriptors);
-};
-
-} /* namespace AAT */
-
-
-#endif /* HB_AAT_FDSC_TABLE_HH */
index f2785a6..63fac84 100644 (file)
@@ -54,7 +54,7 @@ struct Anchor
   DEFINE_SIZE_STATIC (4);
 };
 
-typedef LArrayOf<Anchor> GlyphAnchors;
+typedef Array32Of<Anchor> GlyphAnchors;
 
 struct ankr
 {
@@ -64,7 +64,7 @@ struct ankr
                            unsigned int i,
                            unsigned int num_glyphs) const
   {
-    const NNOffsetTo<GlyphAnchors> *offset = (this+lookupTable).get_value (glyph_id, num_glyphs);
+    const NNOffset16To<GlyphAnchors> *offset = (this+lookupTable).get_value (glyph_id, num_glyphs);
     if (!offset)
       return Null (Anchor);
     const GlyphAnchors &anchors = &(this+anchorData) + *offset;
@@ -83,9 +83,9 @@ struct ankr
   protected:
   HBUINT16     version;        /* Version number (set to zero) */
   HBUINT16     flags;          /* Flags (currently unused; set to zero) */
-  LOffsetTo<Lookup<NNOffsetTo<GlyphAnchors>>>
+  Offset32To<Lookup<NNOffset16To<GlyphAnchors>>>
                lookupTable;    /* Offset to the table's lookup table */
-  LNNOffsetTo<HBUINT8>
+  NNOffset32To<HBUINT8>
                anchorData;     /* Offset to the glyph data table */
 
   public:
index 15ef2da..b52844e 100644 (file)
@@ -82,7 +82,7 @@ struct BaselineTableFormat2Part
   }
 
   protected:
-  HBGlyphID    stdGlyph;       /* The specific glyph index number in this
+  HBGlyphID16  stdGlyph;       /* The specific glyph index number in this
                                 * font that is used to set the baseline values.
                                 * This is the standard glyph.
                                 * This glyph must contain a set of control points
@@ -101,11 +101,11 @@ struct BaselineTableFormat3Part
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
-    return_trace (c->check_struct (this) && lookupTable.sanitize (c));
+    return_trace (likely (c->check_struct (this) && lookupTable.sanitize (c)));
   }
 
   protected:
-  HBGlyphID    stdGlyph;       /* ditto */
+  HBGlyphID16  stdGlyph;       /* ditto */
   HBUINT16     ctlPoints[32];  /* ditto */
   Lookup<HBUINT16>
                lookupTable;    /* Lookup table that maps glyphs to their
index f186917..1db0f1d 100644 (file)
@@ -30,6 +30,9 @@
 #include "hb-aat-layout.hh"
 #include "hb-open-type.hh"
 
+namespace OT {
+struct GDEF;
+};
 
 namespace AAT {
 
@@ -93,8 +96,8 @@ struct LookupSegmentSingle
     return_trace (c->check_struct (this) && value.sanitize (c, base));
   }
 
-  HBGlyphID    last;           /* Last GlyphID in this segment */
-  HBGlyphID    first;          /* First GlyphID in this segment */
+  HBGlyphID16  last;           /* Last GlyphID in this segment */
+  HBGlyphID16  first;          /* First GlyphID in this segment */
   T            value;          /* The lookup value (only one) */
   public:
   DEFINE_SIZE_STATIC (4 + T::static_size);
@@ -159,12 +162,12 @@ struct LookupSegmentArray
     TRACE_SANITIZE (this);
     return_trace (c->check_struct (this) &&
                  first <= last &&
-                 valuesZ.sanitize (c, base, last - first + 1, hb_forward<Ts> (ds)...));
+                 valuesZ.sanitize (c, base, last - first + 1, std::forward<Ts> (ds)...));
   }
 
-  HBGlyphID    last;           /* Last GlyphID in this segment */
-  HBGlyphID    first;          /* First GlyphID in this segment */
-  NNOffsetTo<UnsizedArrayOf<T>>
+  HBGlyphID16  last;           /* Last GlyphID in this segment */
+  HBGlyphID16  first;          /* First GlyphID in this segment */
+  NNOffset16To<UnsizedArrayOf<T>>
                valuesZ;        /* A 16-bit offset from the start of
                                 * the table to the data. */
   public:
@@ -222,7 +225,7 @@ struct LookupSingle
     return_trace (c->check_struct (this) && value.sanitize (c, base));
   }
 
-  HBGlyphID    glyph;          /* Last GlyphID */
+  HBGlyphID16  glyph;          /* Last GlyphID */
   T            value;          /* The lookup value (only one) */
   public:
   DEFINE_SIZE_STATIC (2 + T::static_size);
@@ -284,7 +287,7 @@ struct LookupFormat8
 
   protected:
   HBUINT16     format;         /* Format identifier--format = 8 */
-  HBGlyphID    firstGlyph;     /* First glyph index included in the trimmed array. */
+  HBGlyphID16  firstGlyph;     /* First glyph index included in the trimmed array. */
   HBUINT16     glyphCount;     /* Total number of glyphs (equivalent to the last
                                 * glyph minus the value of firstGlyph plus 1). */
   UnsizedArrayOf<T>
@@ -326,7 +329,7 @@ struct LookupFormat10
   protected:
   HBUINT16     format;         /* Format identifier--format = 8 */
   HBUINT16     valueSize;      /* Byte size of each value. */
-  HBGlyphID    firstGlyph;     /* First glyph index included in the trimmed array. */
+  HBGlyphID16  firstGlyph;     /* First glyph index included in the trimmed array. */
   HBUINT16     glyphCount;     /* Total number of glyphs (equivalent to the last
                                 * glyph minus the value of firstGlyph plus 1). */
   UnsizedArrayOf<HBUINT8>
@@ -510,7 +513,7 @@ struct StateTable
   const Entry<Extra> &get_entry (int state, unsigned int klass) const
   {
     if (unlikely (klass >= nClasses))
-      klass = StateTable<Types, Entry<Extra>>::CLASS_OUT_OF_BOUNDS;
+      klass = StateTable::CLASS_OUT_OF_BOUNDS;
 
     const HBUSHORT *states = (this+stateArrayTable).arrayZ;
     const Entry<Extra> *entries = (this+entryTable).arrayZ;
@@ -576,7 +579,7 @@ struct StateTable
          if (unlikely (stop > states))
            return_trace (false);
          for (const HBUSHORT *p = states; stop < p; p--)
-           num_entries = hb_max (num_entries, *(p - 1) + 1);
+           num_entries = hb_max (num_entries, *(p - 1) + 1u);
          state_neg = min_state;
        }
       }
@@ -597,7 +600,7 @@ struct StateTable
          if (unlikely (stop < states))
            return_trace (false);
          for (const HBUSHORT *p = &states[state_pos * num_classes]; p < stop; p++)
-           num_entries = hb_max (num_entries, *p + 1);
+           num_entries = hb_max (num_entries, *p + 1u);
          state_pos = max_state + 1;
        }
       }
@@ -658,8 +661,8 @@ struct ClassTable
     return_trace (c->check_struct (this) && classArray.sanitize (c));
   }
   protected:
-  HBGlyphID            firstGlyph;     /* First glyph index included in the trimmed array. */
-  ArrayOf<HBUCHAR>     classArray;     /* The class codes (indexed by glyph index minus
+  HBGlyphID16          firstGlyph;     /* First glyph index included in the trimmed array. */
+  Array16Of<HBUCHAR>   classArray;     /* The class codes (indexed by glyph index minus
                                         * firstGlyph). */
   public:
   DEFINE_SIZE_ARRAY (4, classArray);
@@ -678,7 +681,8 @@ struct ObsoleteTypes
                                     const void *base,
                                     const T *array)
   {
-    return (offset - ((const char *) array - (const char *) base)) / T::static_size;
+    /* https://github.com/harfbuzz/harfbuzz/issues/2816 */
+    return (offset - unsigned ((const char *) array - (const char *) base)) / T::static_size;
   }
   template <typename T>
   static unsigned int byteOffsetToIndex (unsigned int offset,
@@ -729,7 +733,10 @@ struct ExtendedTypes
 template <typename Types, typename EntryData>
 struct StateTableDriver
 {
-  StateTableDriver (const StateTable<Types, EntryData> &machine_,
+  using StateTableT = StateTable<Types, EntryData>;
+  using EntryT = Entry<EntryData>;
+
+  StateTableDriver (const StateTableT &machine_,
                    hb_buffer_t *buffer_,
                    hb_face_t *face_) :
              machine (machine_),
@@ -742,59 +749,101 @@ struct StateTableDriver
     if (!c->in_place)
       buffer->clear_output ();
 
-    int state = StateTable<Types, EntryData>::STATE_START_OF_TEXT;
+    int state = StateTableT::STATE_START_OF_TEXT;
     for (buffer->idx = 0; buffer->successful;)
     {
       unsigned int klass = buffer->idx < buffer->len ?
                           machine.get_class (buffer->info[buffer->idx].codepoint, num_glyphs) :
-                          (unsigned) StateTable<Types, EntryData>::CLASS_END_OF_TEXT;
+                          (unsigned) StateTableT::CLASS_END_OF_TEXT;
       DEBUG_MSG (APPLY, nullptr, "c%u at %u", klass, buffer->idx);
-      const Entry<EntryData> &entry = machine.get_entry (state, klass);
+      const EntryT &entry = machine.get_entry (state, klass);
+      const int next_state = machine.new_state (entry.newState);
 
-      /* Unsafe-to-break before this if not in state 0, as things might
-       * go differently if we start from state 0 here.
+      /* Conditions under which it's guaranteed safe-to-break before current glyph:
        *
-       * Ugh.  The indexing here is ugly... */
-      if (state && buffer->backtrack_len () && buffer->idx < buffer->len)
-      {
-       /* If there's no action and we're just epsilon-transitioning to state 0,
-        * safe to break. */
-       if (c->is_actionable (this, entry) ||
-           !(entry.newState == StateTable<Types, EntryData>::STATE_START_OF_TEXT &&
-             entry.flags == context_t::DontAdvance))
-         buffer->unsafe_to_break_from_outbuffer (buffer->backtrack_len () - 1, buffer->idx + 1);
-      }
-
-      /* Unsafe-to-break if end-of-text would kick in here. */
-      if (buffer->idx + 2 <= buffer->len)
-      {
-       const Entry<EntryData> &end_entry = machine.get_entry (state, StateTable<Types, EntryData>::CLASS_END_OF_TEXT);
-       if (c->is_actionable (this, end_entry))
-         buffer->unsafe_to_break (buffer->idx, buffer->idx + 2);
-      }
+       * 1. There was no action in this transition; and
+       *
+       * 2. If we break before current glyph, the results will be the same. That
+       *    is guaranteed if:
+       *
+       *    2a. We were already in start-of-text state; or
+       *
+       *    2b. We are epsilon-transitioning to start-of-text state; or
+       *
+       *    2c. Starting from start-of-text state seeing current glyph:
+       *
+       *        2c'. There won't be any actions; and
+       *
+       *        2c". We would end up in the same state that we were going to end up
+       *             in now, including whether epsilon-transitioning.
+       *
+       *    and
+       *
+       * 3. If we break before current glyph, there won't be any end-of-text action
+       *    after previous glyph.
+       *
+       * This triples the transitions we need to look up, but is worth returning
+       * granular unsafe-to-break results. See eg.:
+       *
+       *   https://github.com/harfbuzz/harfbuzz/issues/2860
+       */
+      const EntryT *wouldbe_entry;
+      bool safe_to_break =
+       /* 1. */
+       !c->is_actionable (this, entry)
+      &&
+       /* 2. */
+       (
+         /* 2a. */
+         state == StateTableT::STATE_START_OF_TEXT
+       ||
+         /* 2b. */
+         (
+           (entry.flags & context_t::DontAdvance) &&
+           next_state == StateTableT::STATE_START_OF_TEXT
+         )
+       ||
+         /* 2c. */
+         (
+           wouldbe_entry = &machine.get_entry (StateTableT::STATE_START_OF_TEXT, klass)
+         ,
+           /* 2c'. */
+           !c->is_actionable (this, *wouldbe_entry)
+         &&
+           /* 2c". */
+           (
+             next_state == machine.new_state (wouldbe_entry->newState)
+           &&
+             (entry.flags & context_t::DontAdvance) == (wouldbe_entry->flags & context_t::DontAdvance)
+           )
+         )
+       )
+      &&
+       /* 3. */
+       !c->is_actionable (this, machine.get_entry (state, StateTableT::CLASS_END_OF_TEXT))
+      ;
+
+      if (!safe_to_break && buffer->backtrack_len () && buffer->idx < buffer->len)
+       buffer->unsafe_to_break_from_outbuffer (buffer->backtrack_len () - 1, buffer->idx + 1);
 
       c->transition (this, entry);
 
-      state = machine.new_state (entry.newState);
+      state = next_state;
       DEBUG_MSG (APPLY, nullptr, "s%d", state);
 
-      if (buffer->idx == buffer->len)
+      if (buffer->idx == buffer->len || unlikely (!buffer->successful))
        break;
 
       if (!(entry.flags & context_t::DontAdvance) || buffer->max_ops-- <= 0)
-       buffer->next_glyph ();
+       (void) buffer->next_glyph ();
     }
 
     if (!c->in_place)
-    {
-      for (; buffer->successful && buffer->idx < buffer->len;)
-       buffer->next_glyph ();
-      buffer->swap_buffers ();
-    }
+      buffer->sync ();
   }
 
   public:
-  const StateTable<Types, EntryData> &machine;
+  const StateTableT &machine;
   hb_buffer_t *buffer;
   unsigned int num_glyphs;
 };
@@ -817,10 +866,10 @@ struct hb_aat_apply_context_t :
   hb_buffer_t *buffer;
   hb_sanitize_context_t sanitizer;
   const ankr *ankr_table;
+  const OT::GDEF *gdef_table;
 
   /* Unused. For debug tracing only. */
   unsigned int lookup_index;
-  unsigned int debug_depth;
 
   HB_INTERNAL hb_aat_apply_context_t (const hb_ot_shape_plan_t *plan_,
                                      hb_font_t *font_,
index 359e859..573f0cf 100644 (file)
@@ -144,7 +144,7 @@ struct FeatureName
   protected:
   HBUINT16     feature;        /* Feature type. */
   HBUINT16     nSettings;      /* The number of records in the setting name array. */
-  LNNOffsetTo<UnsizedArrayOf<SettingName>>
+  NNOffset32To<UnsizedArrayOf<SettingName>>
                settingTableZ;  /* Offset in bytes from the beginning of this table to
                                 * this feature's setting name array. The actual type of
                                 * record this offset refers to will depend on the
index 49506e9..0bf9bd2 100644 (file)
@@ -79,7 +79,7 @@ struct DecompositionAction
                                 * to decompose before more frequent ones. The ligatures
                                 * on the line of text will decompose in increasing
                                 * value of this field. */
-  ArrayOf<HBUINT16>
+  Array16Of<HBUINT16>
                decomposedglyphs;
                                /* Number of 16-bit glyph indexes that follow;
                                 * the ligature will be decomposed into these glyphs.
@@ -100,7 +100,7 @@ struct UnconditionalAddGlyphAction
   protected:
   ActionSubrecordHeader
                header;
-  HBGlyphID    addGlyph;       /* Glyph that should be added if the distance factor
+  HBGlyphID16  addGlyph;       /* Glyph that should be added if the distance factor
                                 * is growing. */
 
   public:
@@ -121,11 +121,11 @@ struct ConditionalAddGlyphAction
   HBFixed      substThreshold; /* Distance growth factor (in ems) at which
                                 * this glyph is replaced and the growth factor
                                 * recalculated. */
-  HBGlyphID    addGlyph;       /* Glyph to be added as kashida. If this value is
+  HBGlyphID16  addGlyph;       /* Glyph to be added as kashida. If this value is
                                 * 0xFFFF, no extra glyph will be added. Note that
                                 * generally when a glyph is added, justification
                                 * will need to be redone. */
-  HBGlyphID    substGlyph;     /* Glyph to be substituted for this glyph if the
+  HBGlyphID16  substGlyph;     /* Glyph to be substituted for this glyph if the
                                 * growth factor equals or exceeds the value of
                                 * substThreshold. */
   public:
@@ -146,7 +146,7 @@ struct DuctileGlyphAction
   HBUINT32     variationAxis;  /* The 4-byte tag identifying the ductile axis.
                                 * This would normally be 0x64756374 ('duct'),
                                 * but you may use any axis the font contains. */
-  HBFixed      minimumLimit;   /* The lowest value for the ductility axis tha
+  HBFixed      minimumLimit;   /* The lowest value for the ductility axis that
                                 * still yields an acceptable appearance. Normally
                                 * this will be 1.0. */
   HBFixed      noStretchValue; /* This is the default value that corresponds to
@@ -170,7 +170,7 @@ struct RepeatedAddGlyphAction
   ActionSubrecordHeader
                header;
   HBUINT16     flags;          /* Currently unused; set to 0. */
-  HBGlyphID    glyph;          /* Glyph that should be added if the distance factor
+  HBGlyphID16  glyph;          /* Glyph that should be added if the distance factor
                                 * is growing. */
   public:
   DEFINE_SIZE_STATIC (10);
@@ -310,7 +310,7 @@ struct WidthDeltaPair
   DEFINE_SIZE_STATIC (24);
 };
 
-typedef OT::LArrayOf<WidthDeltaPair> WidthDeltaCluster;
+typedef OT::Array32Of<WidthDeltaPair> WidthDeltaCluster;
 
 struct JustificationCategory
 {
@@ -358,20 +358,20 @@ struct JustificationHeader
   }
 
   protected:
-  OffsetTo<JustificationCategory>
+  Offset16To<JustificationCategory>
                justClassTable; /* Offset to the justification category state table. */
-  OffsetTo<WidthDeltaCluster>
+  Offset16To<WidthDeltaCluster>
                wdcTable;       /* Offset from start of justification table to start
                                 * of the subtable containing the width delta factors
                                 * for the glyphs in your font.
                                 *
                                 * The width delta clusters table. */
-  OffsetTo<PostcompensationActionChain>
+  Offset16To<PostcompensationActionChain>
                pcTable;        /* Offset from start of justification table to start
                                 * of postcompensation subtable (set to zero if none).
                                 *
                                 * The postcompensation subtable, if present in the font. */
-  Lookup<OffsetTo<WidthDeltaCluster>>
+  Lookup<Offset16To<WidthDeltaCluster>>
                lookupTable;    /* Lookup table associating glyphs with width delta
                                 * clusters. See the description of Width Delta Clusters
                                 * table for details on how to interpret the lookup values. */
@@ -398,13 +398,13 @@ struct just
   FixedVersion<>version;       /* Version of the justification table
                                 * (0x00010000u for version 1.0). */
   HBUINT16     format;         /* Format of the justification table (set to 0). */
-  OffsetTo<JustificationHeader>
+  Offset16To<JustificationHeader>
                horizData;      /* Byte offset from the start of the justification table
                                 * to the header for tables that contain justification
                                 * information for horizontal text.
                                 * If you are not including this information,
                                 * store 0. */
-  OffsetTo<JustificationHeader>
+  Offset16To<JustificationHeader>
                vertData;       /* ditto, vertical */
 
   public:
index 6ad32b3..0354b47 100644 (file)
@@ -82,8 +82,8 @@ struct KernPair
   }
 
   protected:
-  HBGlyphID    left;
-  HBGlyphID    right;
+  HBGlyphID16  left;
+  HBGlyphID16  right;
   FWORD                value;
   public:
   DEFINE_SIZE_STATIC (6);
@@ -229,9 +229,7 @@ struct KerxSubTableFormat1
 
     bool is_actionable (StateTableDriver<Types, EntryData> *driver HB_UNUSED,
                        const Entry<EntryData> &entry)
-    {
-      return Format1EntryT::performAction (entry);
-    }
+    { return Format1EntryT::performAction (entry); }
     void transition (StateTableDriver<Types, EntryData> *driver,
                     const Entry<EntryData> &entry)
     {
@@ -484,7 +482,7 @@ struct KerxSubTableFormat4
     };
 
     driver_context_t (const KerxSubTableFormat4 *table,
-                            hb_aat_apply_context_t *c_) :
+                     hb_aat_apply_context_t *c_) :
        c (c_),
        action_type ((table->flags & ActionType) >> 30),
        ankrData ((HBUINT16 *) ((const char *) &table->machine + (table->flags & Offset))),
@@ -493,9 +491,7 @@ struct KerxSubTableFormat4
 
     bool is_actionable (StateTableDriver<Types, EntryData> *driver HB_UNUSED,
                        const Entry<EntryData> &entry)
-    {
-      return entry.data.ankrActionIndex != 0xFFFF;
-    }
+    { return entry.data.ankrActionIndex != 0xFFFF; }
     void transition (StateTableDriver<Types, EntryData> *driver,
                     const Entry<EntryData> &entry)
     {
@@ -508,11 +504,13 @@ struct KerxSubTableFormat4
        {
          case 0: /* Control Point Actions.*/
          {
-           /* indexed into glyph outline. */
-           const HBUINT16 *data = &ankrData[entry.data.ankrActionIndex];
+           /* Indexed into glyph outline. */
+           /* Each action (record in ankrData) contains two 16-bit fields, so we must
+              double the ankrActionIndex to get the correct offset here. */
+           const HBUINT16 *data = &ankrData[entry.data.ankrActionIndex * 2];
            if (!c->sanitizer.check_array (data, 2)) return;
-           HB_UNUSED unsigned int markControlPoint = *data++;
-           HB_UNUSED unsigned int currControlPoint = *data++;
+           unsigned int markControlPoint = *data++;
+           unsigned int currControlPoint = *data++;
            hb_position_t markX = 0;
            hb_position_t markY = 0;
            hb_position_t currX = 0;
@@ -534,8 +532,10 @@ struct KerxSubTableFormat4
 
          case 1: /* Anchor Point Actions. */
          {
-          /* Indexed into 'ankr' table. */
-           const HBUINT16 *data = &ankrData[entry.data.ankrActionIndex];
+           /* Indexed into 'ankr' table. */
+           /* Each action (record in ankrData) contains two 16-bit fields, so we must
+              double the ankrActionIndex to get the correct offset here. */
+           const HBUINT16 *data = &ankrData[entry.data.ankrActionIndex * 2];
            if (!c->sanitizer.check_array (data, 2)) return;
            unsigned int markAnchorPoint = *data++;
            unsigned int currAnchorPoint = *data++;
@@ -553,7 +553,9 @@ struct KerxSubTableFormat4
 
          case 2: /* Control Point Coordinate Actions. */
          {
-           const FWORD *data = (const FWORD *) &ankrData[entry.data.ankrActionIndex];
+           /* Each action contains four 16-bit fields, so we multiply the ankrActionIndex
+              by 4 to get the correct offset for the given action. */
+           const FWORD *data = (const FWORD *) &ankrData[entry.data.ankrActionIndex * 4];
            if (!c->sanitizer.check_array (data, 4)) return;
            int markX = *data++;
            int markY = *data++;
@@ -624,7 +626,7 @@ struct KerxSubTableFormat6
   bool is_long () const { return flags & ValuesAreLong; }
 
   int get_kerning (hb_codepoint_t left, hb_codepoint_t right,
-                         hb_aat_apply_context_t *c) const
+                  hb_aat_apply_context_t *c) const
   {
     unsigned int num_glyphs = c->sanitizer.get_num_glyphs ();
     if (is_long ())
@@ -708,18 +710,18 @@ struct KerxSubTableFormat6
   {
     struct Long
     {
-      LNNOffsetTo<Lookup<HBUINT32>>            rowIndexTable;
-      LNNOffsetTo<Lookup<HBUINT32>>            columnIndexTable;
-      LNNOffsetTo<UnsizedArrayOf<FWORD32>>     array;
+      NNOffset32To<Lookup<HBUINT32>>           rowIndexTable;
+      NNOffset32To<Lookup<HBUINT32>>           columnIndexTable;
+      NNOffset32To<UnsizedArrayOf<FWORD32>>    array;
     } l;
     struct Short
     {
-      LNNOffsetTo<Lookup<HBUINT16>>            rowIndexTable;
-      LNNOffsetTo<Lookup<HBUINT16>>            columnIndexTable;
-      LNNOffsetTo<UnsizedArrayOf<FWORD>>       array;
+      NNOffset32To<Lookup<HBUINT16>>           rowIndexTable;
+      NNOffset32To<Lookup<HBUINT16>>           columnIndexTable;
+      NNOffset32To<UnsizedArrayOf<FWORD>>      array;
     } s;
   } u;
-  LNNOffsetTo<UnsizedArrayOf<FWORD>>   vector;
+  NNOffset32To<UnsizedArrayOf<FWORD>>  vector;
   public:
   DEFINE_SIZE_STATIC (KernSubTableHeader::static_size + 24);
 };
@@ -773,11 +775,11 @@ struct KerxSubTable
     unsigned int subtable_type = get_type ();
     TRACE_DISPATCH (this, subtable_type);
     switch (subtable_type) {
-    case 0:    return_trace (c->dispatch (u.format0, hb_forward<Ts> (ds)...));
-    case 1:    return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...));
-    case 2:    return_trace (c->dispatch (u.format2, hb_forward<Ts> (ds)...));
-    case 4:    return_trace (c->dispatch (u.format4, hb_forward<Ts> (ds)...));
-    case 6:    return_trace (c->dispatch (u.format6, hb_forward<Ts> (ds)...));
+    case 0:    return_trace (c->dispatch (u.format0, std::forward<Ts> (ds)...));
+    case 1:    return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...));
+    case 2:    return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...));
+    case 4:    return_trace (c->dispatch (u.format4, std::forward<Ts> (ds)...));
+    case 6:    return_trace (c->dispatch (u.format6, std::forward<Ts> (ds)...));
     default:   return_trace (c->default_return_value ());
     }
   }
@@ -887,7 +889,7 @@ struct KerxTable
       reverse = bool (st->u.header.coverage & st->u.header.Backwards) !=
                HB_DIRECTION_IS_BACKWARD (c->buffer->props.direction);
 
-      if (!c->buffer->message (c->font, "start %c%c%c%c subtable %d", HB_UNTAG (thiz()->tableTag), c->lookup_index))
+      if (!c->buffer->message (c->font, "start subtable %d", c->lookup_index))
        goto skip;
 
       if (!seenCrossStream &&
@@ -919,7 +921,7 @@ struct KerxTable
       if (reverse)
        c->buffer->reverse ();
 
-      (void) c->buffer->message (c->font, "end %c%c%c%c subtable %d", HB_UNTAG (thiz()->tableTag), c->lookup_index);
+      (void) c->buffer->message (c->font, "end subtable %d", c->lookup_index);
 
     skip:
       st = &StructAfter<SubTable> (*st);
diff --git a/src/hb-aat-layout-lcar-table.hh b/src/hb-aat-layout-lcar-table.hh
deleted file mode 100644 (file)
index 90cfd92..0000000
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * Copyright © 2018  Ebrahim Byagowi
- *
- *  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.
- */
-#ifndef HB_AAT_LAYOUT_LCAR_TABLE_HH
-#define HB_AAT_LAYOUT_LCAR_TABLE_HH
-
-#include "hb-open-type.hh"
-#include "hb-aat-layout-common.hh"
-
-/*
- * lcar -- Ligature caret
- * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6lcar.html
- */
-#define HB_AAT_TAG_lcar HB_TAG('l','c','a','r')
-
-
-namespace AAT {
-
-typedef ArrayOf<HBINT16> LigCaretClassEntry;
-
-struct lcarFormat0
-{
-  unsigned int get_lig_carets (hb_font_t      *font,
-                              hb_direction_t  direction,
-                              hb_codepoint_t  glyph,
-                              unsigned int    start_offset,
-                              unsigned int   *caret_count /* IN/OUT */,
-                              hb_position_t  *caret_array /* OUT */,
-                              const void     *base) const
-  {
-    const OffsetTo<LigCaretClassEntry>* entry_offset = lookupTable.get_value (glyph,
-                                                                             font->face->get_num_glyphs ());
-    const LigCaretClassEntry& array = entry_offset ? base+*entry_offset : Null (LigCaretClassEntry);
-    if (caret_count)
-    {
-      hb_array_t<const HBINT16> arr = array.sub_array (start_offset, caret_count);
-      for (unsigned int i = 0; i < arr.length; ++i)
-       caret_array[i] = font->em_scale_dir (arr[i], direction);
-    }
-    return array.len;
-  }
-
-  bool sanitize (hb_sanitize_context_t *c, const void *base) const
-  {
-    TRACE_SANITIZE (this);
-    return_trace (likely (c->check_struct (this) && lookupTable.sanitize (c, base)));
-  }
-
-  protected:
-  Lookup<OffsetTo<LigCaretClassEntry>>
-               lookupTable;    /* data Lookup table associating glyphs */
-  public:
-  DEFINE_SIZE_MIN (2);
-};
-
-struct lcarFormat1
-{
-  unsigned int get_lig_carets (hb_font_t      *font,
-                              hb_direction_t  direction,
-                              hb_codepoint_t  glyph,
-                              unsigned int    start_offset,
-                              unsigned int   *caret_count /* IN/OUT */,
-                              hb_position_t  *caret_array /* OUT */,
-                              const void     *base) const
-  {
-    const OffsetTo<LigCaretClassEntry>* entry_offset = lookupTable.get_value (glyph,
-                                                                             font->face->get_num_glyphs ());
-    const LigCaretClassEntry& array = entry_offset ? base+*entry_offset : Null (LigCaretClassEntry);
-    if (caret_count)
-    {
-      hb_array_t<const HBINT16> arr = array.sub_array (start_offset, caret_count);
-      for (unsigned int i = 0; i < arr.length; ++i)
-      {
-       hb_position_t x = 0, y = 0;
-       font->get_glyph_contour_point_for_origin (glyph, arr[i], direction, &x, &y);
-       caret_array[i] = HB_DIRECTION_IS_HORIZONTAL (direction) ? x : y;
-      }
-    }
-    return array.len;
-  }
-
-  bool sanitize (hb_sanitize_context_t *c, const void *base) const
-  {
-    TRACE_SANITIZE (this);
-    return_trace (likely (c->check_struct (this) && lookupTable.sanitize (c, base)));
-  }
-
-  protected:
-  Lookup<OffsetTo<LigCaretClassEntry>>
-               lookupTable;    /* data Lookup table associating glyphs */
-  public:
-  DEFINE_SIZE_MIN (2);
-};
-
-struct lcar
-{
-  static constexpr hb_tag_t tableTag = HB_AAT_TAG_lcar;
-
-  bool has_data () const { return version.major; }
-
-  unsigned int get_lig_carets (hb_font_t      *font,
-                              hb_direction_t  direction,
-                              hb_codepoint_t  glyph,
-                              unsigned int    start_offset,
-                              unsigned int   *caret_count /* IN/OUT */,
-                              hb_position_t  *caret_array /* OUT */) const
-  {
-    if (!has_data ())
-    {
-      if (caret_count)
-        *caret_count = 0;
-      return 0;
-    }
-
-    switch (format)
-    {
-    case 0: return u.format0.get_lig_carets (font, direction, glyph, start_offset,
-                                            caret_count, caret_array, this);
-    case 1: return u.format1.get_lig_carets (font, direction, glyph, start_offset,
-                                            caret_count, caret_array, this);
-    default:if (caret_count) *caret_count = 0; return 0;
-    }
-  }
-
-  bool sanitize (hb_sanitize_context_t *c) const
-  {
-    TRACE_SANITIZE (this);
-    if (unlikely (!c->check_struct (this) || version.major != 1))
-      return_trace (false);
-
-    switch (format) {
-    case 0: return_trace (u.format0.sanitize (c, this));
-    case 1: return_trace (u.format1.sanitize (c, this));
-    default:return_trace (true);
-    }
-  }
-
-  protected:
-  FixedVersion<>version;       /* Version number of the ligature caret table */
-  HBUINT16     format;         /* Format of the ligature caret table. */
-  union {
-  lcarFormat0  format0;
-  lcarFormat0  format1;
-  } u;
-  public:
-  DEFINE_SIZE_MIN (8);
-};
-
-} /* namespace AAT */
-
-#endif /* HB_AAT_LAYOUT_LCAR_TABLE_HH */
index 9d04c71..2f99510 100644 (file)
@@ -30,6 +30,7 @@
 #include "hb-open-type.hh"
 #include "hb-aat-layout-common.hh"
 #include "hb-ot-layout-common.hh"
+#include "hb-ot-layout-gdef-table.hh"
 #include "hb-aat-map.hh"
 
 /*
@@ -215,7 +216,9 @@ struct ContextualSubtable
                             hb_aat_apply_context_t *c_) :
        ret (false),
        c (c_),
+       gdef (*c->gdef_table),
        mark_set (false),
+       has_glyph_classes (gdef.has_glyph_classes ()),
        mark (0),
        table (table_),
        subs (table+table->substitutionTables) {}
@@ -240,21 +243,21 @@ struct ContextualSubtable
       if (buffer->idx == buffer->len && !mark_set)
        return;
 
-      const HBGlyphID *replacement;
+      const HBGlyphID16 *replacement;
 
       replacement = nullptr;
       if (Types::extended)
       {
        if (entry.data.markIndex != 0xFFFF)
        {
-         const Lookup<HBGlyphID> &lookup = subs[entry.data.markIndex];
+         const Lookup<HBGlyphID16> &lookup = subs[entry.data.markIndex];
          replacement = lookup.get_value (buffer->info[mark].codepoint, driver->num_glyphs);
        }
       }
       else
       {
        unsigned int offset = entry.data.markIndex + buffer->info[mark].codepoint;
-       const UnsizedArrayOf<HBGlyphID> &subs_old = (const UnsizedArrayOf<HBGlyphID> &) subs;
+       const UnsizedArrayOf<HBGlyphID16> &subs_old = (const UnsizedArrayOf<HBGlyphID16> &) subs;
        replacement = &subs_old[Types::wordOffsetToIndex (offset, table, subs_old.arrayZ)];
        if (!replacement->sanitize (&c->sanitizer) || !*replacement)
          replacement = nullptr;
@@ -263,6 +266,9 @@ struct ContextualSubtable
       {
        buffer->unsafe_to_break (mark, hb_min (buffer->idx + 1, buffer->len));
        buffer->info[mark].codepoint = *replacement;
+       if (has_glyph_classes)
+         _hb_glyph_info_set_glyph_props (&buffer->info[mark],
+                                         gdef.get_glyph_props (*replacement));
        ret = true;
       }
 
@@ -272,14 +278,14 @@ struct ContextualSubtable
       {
        if (entry.data.currentIndex != 0xFFFF)
        {
-         const Lookup<HBGlyphID> &lookup = subs[entry.data.currentIndex];
+         const Lookup<HBGlyphID16> &lookup = subs[entry.data.currentIndex];
          replacement = lookup.get_value (buffer->info[idx].codepoint, driver->num_glyphs);
        }
       }
       else
       {
        unsigned int offset = entry.data.currentIndex + buffer->info[idx].codepoint;
-       const UnsizedArrayOf<HBGlyphID> &subs_old = (const UnsizedArrayOf<HBGlyphID> &) subs;
+       const UnsizedArrayOf<HBGlyphID16> &subs_old = (const UnsizedArrayOf<HBGlyphID16> &) subs;
        replacement = &subs_old[Types::wordOffsetToIndex (offset, table, subs_old.arrayZ)];
        if (!replacement->sanitize (&c->sanitizer) || !*replacement)
          replacement = nullptr;
@@ -287,6 +293,9 @@ struct ContextualSubtable
       if (replacement)
       {
        buffer->info[idx].codepoint = *replacement;
+       if (has_glyph_classes)
+         _hb_glyph_info_set_glyph_props (&buffer->info[idx],
+                                         gdef.get_glyph_props (*replacement));
        ret = true;
       }
 
@@ -301,10 +310,12 @@ struct ContextualSubtable
     bool ret;
     private:
     hb_aat_apply_context_t *c;
+    const OT::GDEF &gdef;
     bool mark_set;
+    bool has_glyph_classes;
     unsigned int mark;
     const ContextualSubtable *table;
-    const UnsizedOffsetListOf<Lookup<HBGlyphID>, HBUINT, false> &subs;
+    const UnsizedListOfOffset16To<Lookup<HBGlyphID16>, HBUINT, false> &subs;
   };
 
   bool apply (hb_aat_apply_context_t *c) const
@@ -337,9 +348,9 @@ struct ContextualSubtable
       const EntryData &data = entries[i].data;
 
       if (data.markIndex != 0xFFFF)
-       num_lookups = hb_max (num_lookups, 1 + data.markIndex);
+       num_lookups = hb_max (num_lookups, 1u + data.markIndex);
       if (data.currentIndex != 0xFFFF)
-       num_lookups = hb_max (num_lookups, 1 + data.currentIndex);
+       num_lookups = hb_max (num_lookups, 1u + data.currentIndex);
     }
 
     return_trace (substitutionTables.sanitize (c, this, num_lookups));
@@ -348,7 +359,7 @@ struct ContextualSubtable
   protected:
   StateTable<Types, EntryData>
                machine;
-  NNOffsetTo<UnsizedOffsetListOf<Lookup<HBGlyphID>, HBUINT, false>, HBUINT>
+  NNOffsetTo<UnsizedListOfOffset16To<Lookup<HBGlyphID16>, HBUINT, false>, HBUINT>
                substitutionTables;
   public:
   DEFINE_SIZE_STATIC (20);
@@ -499,7 +510,7 @@ struct LigatureSubtable
          }
 
          DEBUG_MSG (APPLY, nullptr, "Moving to stack position %u", cursor - 1);
-         buffer->move_to (match_positions[--cursor % ARRAY_LENGTH (match_positions)]);
+         if (unlikely (!buffer->move_to (match_positions[--cursor % ARRAY_LENGTH (match_positions)]))) return;
 
          if (unlikely (!actionData->sanitize (&c->sanitizer))) break;
          action = *actionData;
@@ -520,30 +531,30 @@ struct LigatureSubtable
          if (action & (LigActionStore | LigActionLast))
          {
            ligature_idx = Types::offsetToIndex (ligature_idx, table, ligature.arrayZ);
-           const HBGlyphID &ligatureData = ligature[ligature_idx];
+           const HBGlyphID16 &ligatureData = ligature[ligature_idx];
            if (unlikely (!ligatureData.sanitize (&c->sanitizer))) break;
            hb_codepoint_t lig = ligatureData;
 
            DEBUG_MSG (APPLY, nullptr, "Produced ligature %u", lig);
-           buffer->replace_glyph (lig);
+           if (unlikely (!buffer->replace_glyph (lig))) return;
 
            unsigned int lig_end = match_positions[(match_length - 1u) % ARRAY_LENGTH (match_positions)] + 1u;
            /* Now go and delete all subsequent components. */
            while (match_length - 1u > cursor)
            {
              DEBUG_MSG (APPLY, nullptr, "Skipping ligature component");
-             buffer->move_to (match_positions[--match_length % ARRAY_LENGTH (match_positions)]);
-             buffer->replace_glyph (DELETED_GLYPH);
+             if (unlikely (!buffer->move_to (match_positions[--match_length % ARRAY_LENGTH (match_positions)]))) return;
+             if (unlikely (!buffer->replace_glyph (DELETED_GLYPH))) return;
            }
 
-           buffer->move_to (lig_end);
+           if (unlikely (!buffer->move_to (lig_end))) return;
            buffer->merge_out_clusters (match_positions[cursor % ARRAY_LENGTH (match_positions)], buffer->out_len);
          }
 
          actionData++;
        }
        while (!(action & LigActionLast));
-       buffer->move_to (end);
+       if (unlikely (!buffer->move_to (end))) return;
       }
     }
 
@@ -554,7 +565,7 @@ struct LigatureSubtable
     const LigatureSubtable *table;
     const UnsizedArrayOf<HBUINT32> &ligAction;
     const UnsizedArrayOf<HBUINT16> &component;
-    const UnsizedArrayOf<HBGlyphID> &ligature;
+    const UnsizedArrayOf<HBGlyphID16> &ligature;
     unsigned int match_length;
     unsigned int match_positions[HB_MAX_CONTEXT_LENGTH];
   };
@@ -586,7 +597,7 @@ struct LigatureSubtable
                ligAction;      /* Offset to the ligature action table. */
   NNOffsetTo<UnsizedArrayOf<HBUINT16>, HBUINT>
                component;      /* Offset to the component table. */
-  NNOffsetTo<UnsizedArrayOf<HBGlyphID>, HBUINT>
+  NNOffsetTo<UnsizedArrayOf<HBGlyphID16>, HBUINT>
                ligature;       /* Offset to the actual ligature lists. */
   public:
   DEFINE_SIZE_STATIC (28);
@@ -599,6 +610,9 @@ struct NoncontextualSubtable
   {
     TRACE_APPLY (this);
 
+    const OT::GDEF &gdef (*c->gdef_table);
+    bool has_glyph_classes = gdef.has_glyph_classes ();
+
     bool ret = false;
     unsigned int num_glyphs = c->face->get_num_glyphs ();
 
@@ -606,10 +620,13 @@ struct NoncontextualSubtable
     unsigned int count = c->buffer->len;
     for (unsigned int i = 0; i < count; i++)
     {
-      const HBGlyphID *replacement = substitute.get_value (info[i].codepoint, num_glyphs);
+      const HBGlyphID16 *replacement = substitute.get_value (info[i].codepoint, num_glyphs);
       if (replacement)
       {
        info[i].codepoint = *replacement;
+       if (has_glyph_classes)
+         _hb_glyph_info_set_glyph_props (&info[i],
+                                         gdef.get_glyph_props (*replacement));
        ret = true;
       }
     }
@@ -624,7 +641,7 @@ struct NoncontextualSubtable
   }
 
   protected:
-  Lookup<HBGlyphID>    substitute;
+  Lookup<HBGlyphID16>  substitute;
   public:
   DEFINE_SIZE_MIN (2);
 };
@@ -725,24 +742,24 @@ struct InsertionSubtable
       if (entry.data.markedInsertIndex != 0xFFFF)
       {
        unsigned int count = (flags & MarkedInsertCount);
+       if (unlikely ((buffer->max_ops -= count) <= 0)) return;
        unsigned int start = entry.data.markedInsertIndex;
-       const HBGlyphID *glyphs = &insertionAction[start];
+       const HBGlyphID16 *glyphs = &insertionAction[start];
        if (unlikely (!c->sanitizer.check_array (glyphs, count))) count = 0;
 
        bool before = flags & MarkedInsertBefore;
 
        unsigned int end = buffer->out_len;
-       buffer->move_to (mark);
+       if (unlikely (!buffer->move_to (mark))) return;
 
        if (buffer->idx < buffer->len && !before)
-         buffer->copy_glyph ();
+         if (unlikely (!buffer->copy_glyph ())) return;
        /* TODO We ignore KashidaLike setting. */
-       for (unsigned int i = 0; i < count; i++)
-         buffer->output_glyph (glyphs[i]);
+       if (unlikely (!buffer->replace_glyphs (0, count, glyphs))) return;
        if (buffer->idx < buffer->len && !before)
          buffer->skip_glyph ();
 
-       buffer->move_to (end + count);
+       if (unlikely (!buffer->move_to (end + count))) return;
 
        buffer->unsafe_to_break_from_outbuffer (mark, hb_min (buffer->idx + 1, buffer->len));
       }
@@ -753,8 +770,9 @@ struct InsertionSubtable
       if (entry.data.currentInsertIndex != 0xFFFF)
       {
        unsigned int count = (flags & CurrentInsertCount) >> 5;
+       if (unlikely ((buffer->max_ops -= count) <= 0)) return;
        unsigned int start = entry.data.currentInsertIndex;
-       const HBGlyphID *glyphs = &insertionAction[start];
+       const HBGlyphID16 *glyphs = &insertionAction[start];
        if (unlikely (!c->sanitizer.check_array (glyphs, count))) count = 0;
 
        bool before = flags & CurrentInsertBefore;
@@ -762,10 +780,9 @@ struct InsertionSubtable
        unsigned int end = buffer->out_len;
 
        if (buffer->idx < buffer->len && !before)
-         buffer->copy_glyph ();
+         if (unlikely (!buffer->copy_glyph ())) return;
        /* TODO We ignore KashidaLike setting. */
-       for (unsigned int i = 0; i < count; i++)
-         buffer->output_glyph (glyphs[i]);
+       if (unlikely (!buffer->replace_glyphs (0, count, glyphs))) return;
        if (buffer->idx < buffer->len && !before)
          buffer->skip_glyph ();
 
@@ -784,7 +801,7 @@ struct InsertionSubtable
         *
         * https://github.com/harfbuzz/harfbuzz/issues/1224#issuecomment-427691417
         */
-       buffer->move_to ((flags & DontAdvance) ? end : end + count);
+       if (unlikely (!buffer->move_to ((flags & DontAdvance) ? end : end + count))) return;
       }
     }
 
@@ -793,7 +810,7 @@ struct InsertionSubtable
     private:
     hb_aat_apply_context_t *c;
     unsigned int mark;
-    const UnsizedArrayOf<HBGlyphID> &insertionAction;
+    const UnsizedArrayOf<HBGlyphID16> &insertionAction;
   };
 
   bool apply (hb_aat_apply_context_t *c) const
@@ -819,7 +836,7 @@ struct InsertionSubtable
   protected:
   StateTable<Types, EntryData>
                machine;
-  NNOffsetTo<UnsizedArrayOf<HBGlyphID>, HBUINT>
+  NNOffsetTo<UnsizedArrayOf<HBGlyphID16>, HBUINT>
                insertionAction;        /* Byte offset from stateHeader to the start of
                                         * the insertion glyph table. */
   public:
@@ -889,11 +906,11 @@ struct ChainSubtable
     unsigned int subtable_type = get_type ();
     TRACE_DISPATCH (this, subtable_type);
     switch (subtable_type) {
-    case Rearrangement:                return_trace (c->dispatch (u.rearrangement, hb_forward<Ts> (ds)...));
-    case Contextual:           return_trace (c->dispatch (u.contextual, hb_forward<Ts> (ds)...));
-    case Ligature:             return_trace (c->dispatch (u.ligature, hb_forward<Ts> (ds)...));
-    case Noncontextual:                return_trace (c->dispatch (u.noncontextual, hb_forward<Ts> (ds)...));
-    case Insertion:            return_trace (c->dispatch (u.insertion, hb_forward<Ts> (ds)...));
+    case Rearrangement:                return_trace (c->dispatch (u.rearrangement, std::forward<Ts> (ds)...));
+    case Contextual:           return_trace (c->dispatch (u.contextual, std::forward<Ts> (ds)...));
+    case Ligature:             return_trace (c->dispatch (u.ligature, std::forward<Ts> (ds)...));
+    case Noncontextual:                return_trace (c->dispatch (u.noncontextual, std::forward<Ts> (ds)...));
+    case Insertion:            return_trace (c->dispatch (u.insertion, std::forward<Ts> (ds)...));
     default:                   return_trace (c->default_return_value ());
     }
   }
@@ -969,7 +986,7 @@ struct Chain
   }
 
   void apply (hb_aat_apply_context_t *c,
-                    hb_mask_t flags) const
+             hb_mask_t flags) const
   {
     const ChainSubtable<Types> *subtable = &StructAfter<ChainSubtable<Types>> (featureZ.as_array (featureCount));
     unsigned int count = subtableCount;
@@ -1017,18 +1034,18 @@ struct Chain
                bool (subtable->get_coverage () & ChainSubtable<Types>::Backwards) !=
                HB_DIRECTION_IS_BACKWARD (c->buffer->props.direction);
 
-      if (!c->buffer->message (c->font, "start chain subtable %d", c->lookup_index))
+      if (!c->buffer->message (c->font, "start chainsubtable %d", c->lookup_index))
        goto skip;
 
       if (reverse)
-       c->buffer->reverse ();
+       _hb_ot_layout_reverse_graphemes (c->buffer);
 
       subtable->apply (c);
 
       if (reverse)
-       c->buffer->reverse ();
+       _hb_ot_layout_reverse_graphemes (c->buffer);
 
-      (void) c->buffer->message (c->font, "end chain subtable %d", c->lookup_index);
+      (void) c->buffer->message (c->font, "end chainsubtable %d", c->lookup_index);
 
       if (unlikely (!c->buffer->successful)) return;
 
index 8c04a64..b1a1512 100644 (file)
@@ -58,7 +58,7 @@ struct opbdFormat0
   bool get_bounds (hb_font_t *font, hb_codepoint_t glyph_id,
                   hb_glyph_extents_t *extents, const void *base) const
   {
-    const OffsetTo<OpticalBounds> *bounds_offset = lookupTable.get_value (glyph_id, font->face->get_num_glyphs ());
+    const Offset16To<OpticalBounds> *bounds_offset = lookupTable.get_value (glyph_id, font->face->get_num_glyphs ());
     if (!bounds_offset) return false;
     const OpticalBounds &bounds = base+*bounds_offset;
 
@@ -79,7 +79,7 @@ struct opbdFormat0
   }
 
   protected:
-  Lookup<OffsetTo<OpticalBounds>>
+  Lookup<Offset16To<OpticalBounds>>
                lookupTable;    /* Lookup table associating glyphs with the four
                                 * int16 values for the left-side, top-side,
                                 * right-side, and bottom-side optical bounds. */
@@ -92,7 +92,7 @@ struct opbdFormat1
   bool get_bounds (hb_font_t *font, hb_codepoint_t glyph_id,
                   hb_glyph_extents_t *extents, const void *base) const
   {
-    const OffsetTo<OpticalBounds> *bounds_offset = lookupTable.get_value (glyph_id, font->face->get_num_glyphs ());
+    const Offset16To<OpticalBounds> *bounds_offset = lookupTable.get_value (glyph_id, font->face->get_num_glyphs ());
     if (!bounds_offset) return false;
     const OpticalBounds &bounds = base+*bounds_offset;
 
@@ -116,7 +116,7 @@ struct opbdFormat1
   }
 
   protected:
-  Lookup<OffsetTo<OpticalBounds>>
+  Lookup<Offset16To<OpticalBounds>>
                lookupTable;    /* Lookup table associating glyphs with the four
                                 * int16 values for the left-side, top-side,
                                 * right-side, and bottom-side optical bounds. */
index baa1c72..68bcb23 100644 (file)
@@ -66,7 +66,7 @@ struct TrackTableEntry
   NameID       trackNameID;    /* The 'name' table index for this track.
                                 * (a short word or phrase like "loose"
                                 * or "very tight") */
-  NNOffsetTo<UnsizedArrayOf<FWORD>>
+  NNOffset16To<UnsizedArrayOf<FWORD>>
                valuesZ;        /* Offset from start of tracking table to
                                 * per-size tracking values for this track. */
 
@@ -141,7 +141,7 @@ struct TrackData
   protected:
   HBUINT16     nTracks;        /* Number of separate tracks included in this table. */
   HBUINT16     nSizes;         /* Number of point sizes included in this table. */
-  LNNOffsetTo<UnsizedArrayOf<HBFixed>>
+  NNOffset32To<UnsizedArrayOf<HBFixed>>
                sizeTable;      /* Offset from start of the tracking table to
                                 * Array[nSizes] of size values.. */
   UnsizedArrayOf<TrackTableEntry>
@@ -212,10 +212,10 @@ struct trak
   FixedVersion<>version;       /* Version of the tracking table
                                 * (0x00010000u for version 1.0). */
   HBUINT16     format;         /* Format of the tracking table (set to 0). */
-  OffsetTo<TrackData>
+  Offset16To<TrackData>
                horizData;      /* Offset from start of tracking table to TrackData
                                 * for horizontal text (or 0 if none). */
-  OffsetTo<TrackData>
+  Offset16To<TrackData>
                vertData;       /* Offset from start of tracking table to TrackData
                                 * for vertical text (or 0 if none). */
   HBUINT16     reserved;       /* Reserved. Set to 0. */
index 49c908f..e2d4de2 100644 (file)
@@ -28,7 +28,6 @@
 #include "hb.hh"
 
 #include "hb-aat-layout.hh"
-#include "hb-aat-fdsc-table.hh" // Just so we compile it; unused otherwise.
 #include "hb-aat-layout-ankr-table.hh"
 #include "hb-aat-layout-bsln-table.hh" // Just so we compile it; unused otherwise.
 #include "hb-aat-layout-feat-table.hh"
@@ -56,8 +55,8 @@ AAT::hb_aat_apply_context_t::hb_aat_apply_context_t (const hb_ot_shape_plan_t *p
                                                       buffer (buffer_),
                                                       sanitizer (),
                                                       ankr_table (&Null (AAT::ankr)),
-                                                      lookup_index (0),
-                                                      debug_depth (0)
+                                                      gdef_table (face->table.GDEF->table),
+                                                      lookup_index (0)
 {
   sanitizer.init (blob);
   sanitizer.set_num_glyphs (face->get_num_glyphs ());
@@ -81,13 +80,18 @@ AAT::hb_aat_apply_context_t::set_ankr_table (const AAT::ankr *ankr_table_)
  * @short_description: Apple Advanced Typography Layout
  * @include: hb-aat.h
  *
- * Functions for querying OpenType Layout features in the font face.
+ * Functions for querying AAT Layout features in the font face.
+ *
+ * HarfBuzz supports all of the AAT tables used to implement shaping. Other
+ * AAT tables and their associated features are not supported.
  **/
 
 
 #if !defined(HB_NO_AAT) || defined(HAVE_CORETEXT)
 
-/* Table data courtesy of Apple.  Converted from mnemonics to integers
+/* Mapping from OpenType feature tags to AAT feature names and selectors.
+ *
+ * Table data courtesy of Apple.  Converted from mnemonics to integers
  * when moving to this file. */
 static const hb_aat_feature_mapping_t feature_mappings[] =
 {
@@ -169,6 +173,17 @@ static const hb_aat_feature_mapping_t feature_mappings[] =
   {HB_TAG ('z','e','r','o'), HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS,      HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASHED_ZERO_ON,                HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASHED_ZERO_OFF},
 };
 
+/**
+ * hb_aat_layout_find_feature_mapping:
+ * @tag: The requested #hb_tag_t feature tag
+ *
+ * Fetches the AAT feature-and-selector combination that corresponds
+ * to a given OpenType feature tag.
+ *
+ * Return value: the AAT features and selectors corresponding to the
+ * OpenType feature tag queried
+ *
+ **/
 const hb_aat_feature_mapping_t *
 hb_aat_layout_find_feature_mapping (hb_tag_t tag)
 {
@@ -204,11 +219,17 @@ hb_aat_layout_compile_map (const hb_aat_map_builder_t *mapper,
 }
 
 
-/*
+/**
  * hb_aat_layout_has_substitution:
- * @face:
+ * @face: #hb_face_t to work upon
+ *
+ * Tests whether the specified face includes any substitutions in the
+ * `morx` or `mort` tables.
+ *
+ * <note>Note: does not examine the `GSUB` table.</note>
+ *
+ * Return value: %true if data found, %false otherwise
  *
- * Returns:
  * Since: 2.3.0
  */
 hb_bool_t
@@ -228,7 +249,9 @@ hb_aat_layout_substitute (const hb_ot_shape_plan_t *plan,
   if (morx.has_data ())
   {
     AAT::hb_aat_apply_context_t c (plan, font, buffer, morx_blob);
+    if (!buffer->message (font, "start table morx")) return;
     morx.apply (&c);
+    (void) buffer->message (font, "end table morx");
     return;
   }
 
@@ -237,7 +260,9 @@ hb_aat_layout_substitute (const hb_ot_shape_plan_t *plan,
   if (mort.has_data ())
   {
     AAT::hb_aat_apply_context_t c (plan, font, buffer, mort_blob);
+    if (!buffer->message (font, "start table mort")) return;
     mort.apply (&c);
+    (void) buffer->message (font, "end table mort");
     return;
   }
 }
@@ -265,11 +290,17 @@ hb_aat_layout_remove_deleted_glyphs (hb_buffer_t *buffer)
   hb_ot_layout_delete_glyphs_inplace (buffer, is_deleted_glyph);
 }
 
-/*
+/**
  * hb_aat_layout_has_positioning:
- * @face:
+ * @face: #hb_face_t to work upon
+ *
+ * Tests whether the specified face includes any positioning information
+ * in the `kerx` table.
+ *
+ * <note>Note: does not examine the `GPOS` table.</note>
+ *
+ * Return value: %true if data found, %false otherwise
  *
- * Returns:
  * Since: 2.3.0
  */
 hb_bool_t
@@ -287,16 +318,22 @@ hb_aat_layout_position (const hb_ot_shape_plan_t *plan,
   const AAT::kerx& kerx = *kerx_blob->as<AAT::kerx> ();
 
   AAT::hb_aat_apply_context_t c (plan, font, buffer, kerx_blob);
+  if (!buffer->message (font, "start table kerx")) return;
   c.set_ankr_table (font->face->table.ankr.get ());
   kerx.apply (&c);
+  (void) buffer->message (font, "end table kerx");
 }
 
 
-/*
+/**
  * hb_aat_layout_has_tracking:
- * @face:
+ * @face:: #hb_face_t to work upon
+ *
+ * Tests whether the specified face includes any tracking information
+ * in the `trak` table.
+ *
+ * Return value: %true if data found, %false otherwise
  *
- * Returns:
  * Since: 2.3.0
  */
 hb_bool_t
@@ -318,10 +355,13 @@ hb_aat_layout_track (const hb_ot_shape_plan_t *plan,
 
 /**
  * hb_aat_layout_get_feature_types:
- * @face: a face object
- * @start_offset: iteration's start offset
- * @feature_count:(inout) (allow-none): buffer size as input, filled size as output
- * @features: (out caller-allocates) (array length=feature_count): features buffer
+ * @face: #hb_face_t to work upon
+ * @start_offset: offset of the first feature type to retrieve
+ * @feature_count: (inout) (optional): Input = the maximum number of feature types to return;
+ *                 Output = the actual number of feature types returned (may be zero)
+ * @features: (out caller-allocates) (array length=feature_count): Array of feature types found
+ *
+ * Fetches a list of the AAT feature types included in the specified face.
  *
  * Return value: Number of all available feature types.
  *
@@ -338,10 +378,12 @@ hb_aat_layout_get_feature_types (hb_face_t                    *face,
 
 /**
  * hb_aat_layout_feature_type_get_name_id:
- * @face: a face object
- * @feature_type: feature id
+ * @face: #hb_face_t to work upon
+ * @feature_type: The #hb_aat_layout_feature_type_t of the requested feature type
+ *
+ * Fetches the name identifier of the specified feature type in the face's `name` table.
  *
- * Return value: Name ID index
+ * Return value: Name identifier of the requested feature type
  *
  * Since: 2.2.0
  */
@@ -353,19 +395,23 @@ hb_aat_layout_feature_type_get_name_id (hb_face_t                    *face,
 }
 
 /**
- * hb_aat_layout_feature_type_get_selectors:
- * @face:    a face object
- * @feature_type: feature id
- * @start_offset:    iteration's start offset
- * @selector_count: (inout) (allow-none): buffer size as input, filled size as output
- * @selectors: (out caller-allocates) (array length=selector_count): settings buffer
- * @default_index: (out) (allow-none): index of default selector if any
+ * hb_aat_layout_feature_type_get_selector_infos:
+ * @face: #hb_face_t to work upon
+ * @feature_type: The #hb_aat_layout_feature_type_t of the requested feature type
+ * @start_offset: offset of the first feature type to retrieve
+ * @selector_count: (inout) (optional): Input = the maximum number of selectors to return;
+ *                  Output = the actual number of selectors returned (may be zero)
+ * @selectors: (out caller-allocates) (array length=selector_count) (optional):
+ *             A buffer pointer. The selectors available for the feature type queries.
+ * @default_index: (out) (optional): The index of the feature's default selector, if any
+ *
+ * Fetches a list of the selectors available for the specified feature in the given face.
  *
  * If upon return, @default_index is set to #HB_AAT_LAYOUT_NO_SELECTOR_INDEX, then
  * the feature type is non-exclusive.  Otherwise, @default_index is the index of
  * the selector that is selected by default.
  *
- * Return value: Number of all available feature selectors.
+ * Return value: Number of all available feature selectors
  *
  * Since: 2.2.0
  */
index b617e8b..9af2740 100644 (file)
@@ -22,7 +22,7 @@
  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  */
 
-#ifndef HB_AAT_H_IN
+#if !defined(HB_AAT_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb-aat.h> instead."
 #endif
 
@@ -37,7 +37,48 @@ HB_BEGIN_DECLS
 
 /**
  * hb_aat_layout_feature_type_t:
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_INVALID: Initial, unset feature type
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_ALL_TYPOGRAPHIC: [All Typographic Features](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type0)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES: [Ligatures](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type1)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_CURISVE_CONNECTION: [Cursive Connection](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type2)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_LETTER_CASE: [Letter Case](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type3)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_SUBSTITUTION: [Vertical Substitution](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type4)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_LINGUISTIC_REARRANGEMENT: [Linguistic Rearrangement](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type5)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_SPACING: [Number Spacing](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type6)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_SMART_SWASH_TYPE: [Smart Swash](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type8)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_DIACRITICS_TYPE: [Diacritics](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type9)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_POSITION: [Vertical Position](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type10)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_FRACTIONS: [Fractions](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type11)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_OVERLAPPING_CHARACTERS_TYPE: [Overlapping Characters](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type13)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS: [Typographic Extras](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type14)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS: [Mathematical Extras](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type15)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_ORNAMENT_SETS_TYPE: [Ornament Sets](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type16)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_ALTERNATIVES: [Character Alternatives](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type17)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_DESIGN_COMPLEXITY_TYPE: [Design Complexity](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type18)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_STYLE_OPTIONS: [Style Options](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type19)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE: [Character Shape](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type20)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_CASE: [Number Case](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type21)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING: [Text Spacing](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type22)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_TRANSLITERATION: [Transliteration](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type23)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_ANNOTATION_TYPE: [Annotation](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type24)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_KANA_SPACING_TYPE: [Kana Spacing](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type25)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_SPACING_TYPE: [Ideographic Spacing](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type26)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_UNICODE_DECOMPOSITION_TYPE: [Unicode Decomposition](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type27)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_RUBY_KANA: [Ruby Kana](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type28)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_CJK_SYMBOL_ALTERNATIVES_TYPE: [CJK Symbol Alternatives](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type29)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_ALTERNATIVES_TYPE: [Ideographic Alternatives](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type30)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_CJK_VERTICAL_ROMAN_PLACEMENT_TYPE: [CJK Vertical Roman Placement](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type31)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_ITALIC_CJK_ROMAN: [Italic CJK Roman](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type32)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_CASE_SENSITIVE_LAYOUT: [Case Sensitive Layout](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type33)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_ALTERNATE_KANA: [Alternate Kana](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type34)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES: [Stylistic Alternatives](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type35)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_CONTEXTUAL_ALTERNATIVES: [Contextual Alternatives](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type36)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_LOWER_CASE: [Lower Case](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type37)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_UPPER_CASE: [Upper Case](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type38)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_LANGUAGE_TAG_TYPE: [Language Tag](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type39)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_CJK_ROMAN_SPACING_TYPE: [CJK Roman Spacing](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type103)
  *
+ * The possible feature types defined for AAT shaping, from Apple [Font Feature Registry](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html).
  *
  * Since: 2.2.0
  */
@@ -85,12 +126,265 @@ typedef enum
   HB_AAT_LAYOUT_FEATURE_TYPE_LANGUAGE_TAG_TYPE                 = 39,
   HB_AAT_LAYOUT_FEATURE_TYPE_CJK_ROMAN_SPACING_TYPE            = 103,
 
+  /*< private >*/
   _HB_AAT_LAYOUT_FEATURE_TYPE_MAX_VALUE = HB_TAG_MAX_SIGNED /*< skip >*/
 } hb_aat_layout_feature_type_t;
 
 /**
  * hb_aat_layout_feature_selector_t:
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_INVALID: Initial, unset feature selector
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_ALL_TYPE_FEATURES_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_ALL_TYPOGRAPHIC
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_ALL_TYPE_FEATURES_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_ALL_TYPOGRAPHIC
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_REQUIRED_LIGATURES_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_REQUIRED_LIGATURES_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_COMMON_LIGATURES_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_COMMON_LIGATURES_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_RARE_LIGATURES_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_RARE_LIGATURES_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_LOGOS_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_LOGOS_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_REBUS_PICTURES_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_REBUS_PICTURES_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_DIPHTHONG_LIGATURES_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_DIPHTHONG_LIGATURES_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_SQUARED_LIGATURES_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_SQUARED_LIGATURES_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_ABBREV_SQUARED_LIGATURES_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_ABBREV_SQUARED_LIGATURES_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_SYMBOL_LIGATURES_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_SYMBOL_LIGATURES_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_LIGATURES_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_LIGATURES_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_HISTORICAL_LIGATURES_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_HISTORICAL_LIGATURES_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_UNCONNECTED: for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_PARTIALLY_CONNECTED: for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_CURSIVE: for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_AND_LOWER_CASE: Deprecated
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_ALL_CAPS: Deprecated
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_ALL_LOWER_CASE: Deprecated
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_SMALL_CAPS: Deprecated
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_INITIAL_CAPS: Deprecated
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_INITIAL_CAPS_AND_SMALL_CAPS: Deprecated
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_SUBSTITUTE_VERTICAL_FORMS_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_SUBSTITUTION
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_SUBSTITUTE_VERTICAL_FORMS_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_SUBSTITUTION
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_LINGUISTIC_REARRANGEMENT_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_LINGUISTIC_REARRANGEMENT
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_LINGUISTIC_REARRANGEMENT_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_LINGUISTIC_REARRANGEMENT
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_MONOSPACED_NUMBERS: for #HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_SPACING
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_NUMBERS: for #HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_SPACING
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_THIRD_WIDTH_NUMBERS: for #HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_SPACING
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_QUARTER_WIDTH_NUMBERS: for #HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_SPACING
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_WORD_INITIAL_SWASHES_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_SMART_SWASH_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_WORD_INITIAL_SWASHES_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_SMART_SWASH_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_WORD_FINAL_SWASHES_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_SMART_SWASH_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_WORD_FINAL_SWASHES_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_SMART_SWASH_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_LINE_INITIAL_SWASHES_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_SMART_SWASH_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_LINE_INITIAL_SWASHES_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_SMART_SWASH_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_LINE_FINAL_SWASHES_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_SMART_SWASH_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_LINE_FINAL_SWASHES_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_SMART_SWASH_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_NON_FINAL_SWASHES_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_SMART_SWASH_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_NON_FINAL_SWASHES_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_SMART_SWASH_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_SHOW_DIACRITICS: for #HB_AAT_LAYOUT_FEATURE_TYPE_DIACRITICS_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_HIDE_DIACRITICS: for #HB_AAT_LAYOUT_FEATURE_TYPE_DIACRITICS_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_DECOMPOSE_DIACRITICS: for #HB_AAT_LAYOUT_FEATURE_TYPE_DIACRITICS_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_NORMAL_POSITION: for #HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_POSITION
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_SUPERIORS: for #HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_POSITION
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_INFERIORS: for #HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_POSITION
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_ORDINALS: for #HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_POSITION
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_SCIENTIFIC_INFERIORS: for #HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_POSITION
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_FRACTIONS: for #HB_AAT_LAYOUT_FEATURE_TYPE_FRACTIONS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_VERTICAL_FRACTIONS: for #HB_AAT_LAYOUT_FEATURE_TYPE_FRACTIONS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_DIAGONAL_FRACTIONS: for #HB_AAT_LAYOUT_FEATURE_TYPE_FRACTIONS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_PREVENT_OVERLAP_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_OVERLAPPING_CHARACTERS_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_PREVENT_OVERLAP_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_OVERLAPPING_CHARACTERS_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHENS_TO_EM_DASH_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHENS_TO_EM_DASH_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHEN_TO_EN_DASH_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHEN_TO_EN_DASH_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASHED_ZERO_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASHED_ZERO_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_FORM_INTERROBANG_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_FORM_INTERROBANG_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_SMART_QUOTES_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_SMART_QUOTES_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_PERIODS_TO_ELLIPSIS_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_PERIODS_TO_ELLIPSIS_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHEN_TO_MINUS_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHEN_TO_MINUS_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_ASTERISK_TO_MULTIPLY_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_ASTERISK_TO_MULTIPLY_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASH_TO_DIVIDE_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASH_TO_DIVIDE_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_INEQUALITY_LIGATURES_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_INEQUALITY_LIGATURES_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_EXPONENTS_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_EXPONENTS_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_MATHEMATICAL_GREEK_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_MATHEMATICAL_GREEK_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_ORNAMENTS: for #HB_AAT_LAYOUT_FEATURE_TYPE_ORNAMENT_SETS_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_DINGBATS: for #HB_AAT_LAYOUT_FEATURE_TYPE_ORNAMENT_SETS_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_PI_CHARACTERS: for #HB_AAT_LAYOUT_FEATURE_TYPE_ORNAMENT_SETS_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_FLEURONS: for #HB_AAT_LAYOUT_FEATURE_TYPE_ORNAMENT_SETS_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_DECORATIVE_BORDERS: for #HB_AAT_LAYOUT_FEATURE_TYPE_ORNAMENT_SETS_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_INTERNATIONAL_SYMBOLS: for #HB_AAT_LAYOUT_FEATURE_TYPE_ORNAMENT_SETS_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_MATH_SYMBOLS: for #HB_AAT_LAYOUT_FEATURE_TYPE_ORNAMENT_SETS_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_ALTERNATES: for #HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL1: for #HB_AAT_LAYOUT_FEATURE_TYPE_DESIGN_COMPLEXITY_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL2: for #HB_AAT_LAYOUT_FEATURE_TYPE_DESIGN_COMPLEXITY_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL3: for #HB_AAT_LAYOUT_FEATURE_TYPE_DESIGN_COMPLEXITY_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL4: for #HB_AAT_LAYOUT_FEATURE_TYPE_DESIGN_COMPLEXITY_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL5: for #HB_AAT_LAYOUT_FEATURE_TYPE_DESIGN_COMPLEXITY_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_STYLE_OPTIONS: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLE_OPTIONS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_DISPLAY_TEXT: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLE_OPTIONS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_ENGRAVED_TEXT: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLE_OPTIONS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_ILLUMINATED_CAPS: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLE_OPTIONS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_TITLING_CAPS: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLE_OPTIONS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_TALL_CAPS: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLE_OPTIONS
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_CHARACTERS: for #HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_SIMPLIFIED_CHARACTERS: for #HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS1978_CHARACTERS: for #HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS1983_CHARACTERS: for #HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS1990_CHARACTERS: for #HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_ONE: for #HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_TWO: for #HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_THREE: for #HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_FOUR: for #HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_FIVE: for #HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_EXPERT_CHARACTERS: for #HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS2004_CHARACTERS: for #HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_HOJO_CHARACTERS: for #HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_NLCCHARACTERS: for #HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_NAMES_CHARACTERS: for #HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_NUMBERS: for #HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_CASE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_CASE_NUMBERS: for #HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_CASE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_TEXT: for #HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_MONOSPACED_TEXT: for #HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_HALF_WIDTH_TEXT: for #HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_THIRD_WIDTH_TEXT: for #HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_QUARTER_WIDTH_TEXT: for #HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_ALT_PROPORTIONAL_TEXT: for #HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_ALT_HALF_WIDTH_TEXT: for #HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_TRANSLITERATION: for #HB_AAT_LAYOUT_FEATURE_TYPE_TRANSLITERATION
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_HANJA_TO_HANGUL: for #HB_AAT_LAYOUT_FEATURE_TYPE_TRANSLITERATION
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_HIRAGANA_TO_KATAKANA: for #HB_AAT_LAYOUT_FEATURE_TYPE_TRANSLITERATION
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_KATAKANA_TO_HIRAGANA: for #HB_AAT_LAYOUT_FEATURE_TYPE_TRANSLITERATION
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_KANA_TO_ROMANIZATION: for #HB_AAT_LAYOUT_FEATURE_TYPE_TRANSLITERATION
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_ROMANIZATION_TO_HIRAGANA: for #HB_AAT_LAYOUT_FEATURE_TYPE_TRANSLITERATION
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_ROMANIZATION_TO_KATAKANA: for #HB_AAT_LAYOUT_FEATURE_TYPE_TRANSLITERATION
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_HANJA_TO_HANGUL_ALT_ONE: for #HB_AAT_LAYOUT_FEATURE_TYPE_TRANSLITERATION
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_HANJA_TO_HANGUL_ALT_TWO: for #HB_AAT_LAYOUT_FEATURE_TYPE_TRANSLITERATION
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_HANJA_TO_HANGUL_ALT_THREE: for #HB_AAT_LAYOUT_FEATURE_TYPE_TRANSLITERATION
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_ANNOTATION: for #HB_AAT_LAYOUT_FEATURE_TYPE_ANNOTATION_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_BOX_ANNOTATION: for #HB_AAT_LAYOUT_FEATURE_TYPE_ANNOTATION_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_ROUNDED_BOX_ANNOTATION: for #HB_AAT_LAYOUT_FEATURE_TYPE_ANNOTATION_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_CIRCLE_ANNOTATION: for #HB_AAT_LAYOUT_FEATURE_TYPE_ANNOTATION_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_INVERTED_CIRCLE_ANNOTATION: for #HB_AAT_LAYOUT_FEATURE_TYPE_ANNOTATION_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_PARENTHESIS_ANNOTATION: for #HB_AAT_LAYOUT_FEATURE_TYPE_ANNOTATION_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_PERIOD_ANNOTATION: for #HB_AAT_LAYOUT_FEATURE_TYPE_ANNOTATION_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_ROMAN_NUMERAL_ANNOTATION: for #HB_AAT_LAYOUT_FEATURE_TYPE_ANNOTATION_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_DIAMOND_ANNOTATION: for #HB_AAT_LAYOUT_FEATURE_TYPE_ANNOTATION_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_INVERTED_BOX_ANNOTATION: for #HB_AAT_LAYOUT_FEATURE_TYPE_ANNOTATION_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_INVERTED_ROUNDED_BOX_ANNOTATION: for #HB_AAT_LAYOUT_FEATURE_TYPE_ANNOTATION_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_FULL_WIDTH_KANA: for #HB_AAT_LAYOUT_FEATURE_TYPE_KANA_SPACING_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_KANA: for #HB_AAT_LAYOUT_FEATURE_TYPE_KANA_SPACING_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_FULL_WIDTH_IDEOGRAPHS: for #HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_SPACING_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_IDEOGRAPHS: for #HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_SPACING_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_HALF_WIDTH_IDEOGRAPHS: for #HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_SPACING_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_CANONICAL_COMPOSITION_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_UNICODE_DECOMPOSITION_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_CANONICAL_COMPOSITION_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_UNICODE_DECOMPOSITION_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_COMPATIBILITY_COMPOSITION_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_UNICODE_DECOMPOSITION_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_COMPATIBILITY_COMPOSITION_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_UNICODE_DECOMPOSITION_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_TRANSCODING_COMPOSITION_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_UNICODE_DECOMPOSITION_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_TRANSCODING_COMPOSITION_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_UNICODE_DECOMPOSITION_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_RUBY_KANA: Deprecated; use #HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA_OFF instead
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA: Deprecated; use #HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA_ON instead
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_RUBY_KANA
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_RUBY_KANA
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_CJK_SYMBOL_ALTERNATIVES: for #HB_AAT_LAYOUT_FEATURE_TYPE_CJK_SYMBOL_ALTERNATIVES_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_ONE: for #HB_AAT_LAYOUT_FEATURE_TYPE_CJK_SYMBOL_ALTERNATIVES_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_TWO: for #HB_AAT_LAYOUT_FEATURE_TYPE_CJK_SYMBOL_ALTERNATIVES_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_THREE: for #HB_AAT_LAYOUT_FEATURE_TYPE_CJK_SYMBOL_ALTERNATIVES_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_FOUR: for #HB_AAT_LAYOUT_FEATURE_TYPE_CJK_SYMBOL_ALTERNATIVES_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_FIVE: for #HB_AAT_LAYOUT_FEATURE_TYPE_CJK_SYMBOL_ALTERNATIVES_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_IDEOGRAPHIC_ALTERNATIVES: for #HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_ALTERNATIVES_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_ONE: for #HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_ALTERNATIVES_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_TWO: for #HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_ALTERNATIVES_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_THREE: for #HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_ALTERNATIVES_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_FOUR: for #HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_ALTERNATIVES_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_FIVE: for #HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_ALTERNATIVES_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_VERTICAL_ROMAN_CENTERED: for #HB_AAT_LAYOUT_FEATURE_TYPE_CJK_VERTICAL_ROMAN_PLACEMENT_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_VERTICAL_ROMAN_HBASELINE: for #HB_AAT_LAYOUT_FEATURE_TYPE_CJK_VERTICAL_ROMAN_PLACEMENT_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_CJK_ITALIC_ROMAN: Deprecated; use #HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN_OFF instead
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN: Deprecated; use #HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN_ON instead
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_ITALIC_CJK_ROMAN
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_ITALIC_CJK_ROMAN
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_LAYOUT_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_CASE_SENSITIVE_LAYOUT
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_LAYOUT_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_CASE_SENSITIVE_LAYOUT
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_SPACING_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_CASE_SENSITIVE_LAYOUT
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_SPACING_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_CASE_SENSITIVE_LAYOUT
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_HORIZ_KANA_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_ALTERNATE_KANA
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_HORIZ_KANA_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_ALTERNATE_KANA
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_VERT_KANA_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_ALTERNATE_KANA
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_VERT_KANA_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_ALTERNATE_KANA
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_STYLISTIC_ALTERNATES: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ONE_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ONE_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWO_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWO_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THREE_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THREE_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOUR_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOUR_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIVE_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIVE_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIX_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIX_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVEN_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVEN_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHT_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHT_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINE_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINE_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TEN_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TEN_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ELEVEN_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ELEVEN_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWELVE_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWELVE_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THIRTEEN_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THIRTEEN_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOURTEEN_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOURTEEN_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIFTEEN_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIFTEEN_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIXTEEN_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIXTEEN_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVENTEEN_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVENTEEN_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHTEEN_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHTEEN_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINETEEN_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINETEEN_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWENTY_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWENTY_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_ALTERNATES_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_CONTEXTUAL_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_ALTERNATES_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_CONTEXTUAL_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_SWASH_ALTERNATES_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_CONTEXTUAL_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_SWASH_ALTERNATES_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_CONTEXTUAL_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_SWASH_ALTERNATES_ON: for #HB_AAT_LAYOUT_FEATURE_TYPE_CONTEXTUAL_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_SWASH_ALTERNATES_OFF: for #HB_AAT_LAYOUT_FEATURE_TYPE_CONTEXTUAL_ALTERNATIVES
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_LOWER_CASE: for #HB_AAT_LAYOUT_FEATURE_TYPE_LOWER_CASE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_SMALL_CAPS: for #HB_AAT_LAYOUT_FEATURE_TYPE_LOWER_CASE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_PETITE_CAPS: for #HB_AAT_LAYOUT_FEATURE_TYPE_LOWER_CASE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_UPPER_CASE: for #HB_AAT_LAYOUT_FEATURE_TYPE_UPPER_CASE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_CASE_SMALL_CAPS: for #HB_AAT_LAYOUT_FEATURE_TYPE_UPPER_CASE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_CASE_PETITE_CAPS: for #HB_AAT_LAYOUT_FEATURE_TYPE_UPPER_CASE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_HALF_WIDTH_CJK_ROMAN: for #HB_AAT_LAYOUT_FEATURE_TYPE_CJK_ROMAN_SPACING_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_CJK_ROMAN: for #HB_AAT_LAYOUT_FEATURE_TYPE_CJK_ROMAN_SPACING_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_CJK_ROMAN: for #HB_AAT_LAYOUT_FEATURE_TYPE_CJK_ROMAN_SPACING_TYPE
+ * @HB_AAT_LAYOUT_FEATURE_SELECTOR_FULL_WIDTH_CJK_ROMAN: for #HB_AAT_LAYOUT_FEATURE_TYPE_CJK_ROMAN_SPACING_TYPE
  *
+ * The selectors defined for specifying AAT feature settings.
  *
  * Since: 2.2.0
  */
@@ -424,6 +718,7 @@ typedef enum
   HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_CJK_ROMAN             = 2,
   HB_AAT_LAYOUT_FEATURE_SELECTOR_FULL_WIDTH_CJK_ROMAN          = 3,
 
+  /*< private >*/
   _HB_AAT_LAYOUT_FEATURE_SELECTOR_MAX_VALUE = HB_TAG_MAX_SIGNED /*< skip >*/
 } hb_aat_layout_feature_selector_t;
 
@@ -437,8 +732,15 @@ HB_EXTERN hb_ot_name_id_t
 hb_aat_layout_feature_type_get_name_id (hb_face_t                    *face,
                                        hb_aat_layout_feature_type_t  feature_type);
 
-typedef struct hb_aat_layout_feature_selector_info_t
-{
+/**
+ * hb_aat_layout_feature_selector_info_t:
+ * @name_id: The selector's name identifier
+ * @enable: The value to turn the selector on
+ * @disable: The value to turn the selector off
+ *
+ * Structure representing a setting for an #hb_aat_layout_feature_type_t.
+ */
+typedef struct hb_aat_layout_feature_selector_info_t {
   hb_ot_name_id_t                      name_id;
   hb_aat_layout_feature_selector_t     enable;
   hb_aat_layout_feature_selector_t     disable;
@@ -446,6 +748,13 @@ typedef struct hb_aat_layout_feature_selector_info_t
   unsigned int                         reserved;
 } hb_aat_layout_feature_selector_info_t;
 
+/**
+ * HB_AAT_LAYOUT_NO_SELECTOR_INDEX
+ *
+ * Used when getting or setting AAT feature selectors. Indicates that
+ * there is no selector index corresponding to the selector of interest.
+ *
+ */
 #define HB_AAT_LAYOUT_NO_SELECTOR_INDEX                0xFFFFu
 
 HB_EXTERN unsigned int
index 711f9aa..6d771e1 100644 (file)
@@ -50,7 +50,7 @@ struct FTStringRange
   }
 
   protected:
-  NNOffsetTo<UnsizedArrayOf<HBUINT8>>
+  NNOffset16To<UnsizedArrayOf<HBUINT8>>
                tag;            /* Offset from the start of the table to
                                 * the beginning of the string */
   HBUINT16     length;         /* String length (in bytes) */
@@ -80,7 +80,7 @@ struct ltag
   protected:
   HBUINT32     version;        /* Table version; currently 1 */
   HBUINT32     flags;          /* Table flags; currently none defined */
-  LArrayOf<FTStringRange>
+  Array32Of<FTStringRange>
                tagRanges;      /* Range for each tag's string */
   public:
   DEFINE_SIZE_ARRAY (12, tagRanges);
index 30b5812..550b8a4 100644 (file)
 #include "hb-null.hh"
 #include "hb-number.hh"
 
+#include <algorithm>
+#include <initializer_list>
+#include <functional>
+#include <new>
+
+/*
+ * Flags
+ */
+
+/* Enable bitwise ops on enums marked as flags_t */
+/* To my surprise, looks like the function resolver is happy to silently cast
+ * one enum to another...  So this doesn't provide the type-checking that I
+ * originally had in mind... :(.
+ *
+ * For MSVC warnings, see: https://github.com/harfbuzz/harfbuzz/pull/163
+ */
+#ifdef _MSC_VER
+# pragma warning(disable:4200)
+# pragma warning(disable:4800)
+#endif
+#define HB_MARK_AS_FLAG_T(T) \
+       extern "C++" { \
+         static inline constexpr T operator | (T l, T r) { return T ((unsigned) l | (unsigned) r); } \
+         static inline constexpr T operator & (T l, T r) { return T ((unsigned) l & (unsigned) r); } \
+         static inline constexpr T operator ^ (T l, T r) { return T ((unsigned) l ^ (unsigned) r); } \
+         static inline constexpr T operator ~ (T r) { return T (~(unsigned int) r); } \
+         static inline T& operator |= (T &l, T r) { l = l | r; return l; } \
+         static inline T& operator &= (T& l, T r) { l = l & r; return l; } \
+         static inline T& operator ^= (T& l, T r) { l = l ^ r; return l; } \
+       } \
+       static_assert (true, "")
+
+/* Useful for set-operations on small enums.
+ * For example, for testing "x ∈ {x1, x2, x3}" use:
+ * (FLAG_UNSAFE(x) & (FLAG(x1) | FLAG(x2) | FLAG(x3)))
+ */
+#define FLAG(x) (static_assert_expr ((unsigned)(x) < 32) + (((uint32_t) 1U) << (unsigned)(x)))
+#define FLAG_UNSAFE(x) ((unsigned)(x) < 32 ? (((uint32_t) 1U) << (unsigned)(x)) : 0)
+#define FLAG_RANGE(x,y) (static_assert_expr ((x) < (y)) + FLAG(y+1) - FLAG(x))
+#define FLAG64(x) (static_assert_expr ((unsigned)(x) < 64) + (((uint64_t) 1ULL) << (unsigned)(x)))
+#define FLAG64_UNSAFE(x) ((unsigned)(x) < 64 ? (((uint64_t) 1ULL) << (unsigned)(x)) : 0)
+
+
+/*
+ * Big-endian integers.
+ */
+
+/* Endian swap, used in Windows related backends */
+static inline constexpr uint16_t hb_uint16_swap (uint16_t v)
+{ return (v >> 8) | (v << 8); }
+static inline constexpr uint32_t hb_uint32_swap (uint32_t v)
+{ return (hb_uint16_swap (v) << 16) | hb_uint16_swap (v >> 16); }
+
+template <typename Type, int Bytes = sizeof (Type)>
+struct BEInt;
+template <typename Type>
+struct BEInt<Type, 1>
+{
+  public:
+  BEInt () = default;
+  constexpr BEInt (Type V) : v {uint8_t (V)} {}
+  constexpr operator Type () const { return v; }
+  private: uint8_t v;
+};
+template <typename Type>
+struct BEInt<Type, 2>
+{
+  public:
+  BEInt () = default;
+  constexpr BEInt (Type V) : v {uint8_t ((V >>  8) & 0xFF),
+                               uint8_t ((V      ) & 0xFF)} {}
+
+  struct __attribute__((packed)) packed_uint16_t { uint16_t v; };
+  constexpr operator Type () const
+  {
+#if ((defined(__GNUC__) && __GNUC__ >= 5) || defined(__clang__)) && \
+    defined(__BYTE_ORDER) && \
+    (__BYTE_ORDER == __LITTLE_ENDIAN || __BYTE_ORDER == __BIG_ENDIAN)
+    /* Spoon-feed the compiler a big-endian integer with alignment 1.
+     * https://github.com/harfbuzz/harfbuzz/pull/1398 */
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+    return __builtin_bswap16 (((packed_uint16_t *) this)->v);
+#else /* __BYTE_ORDER == __BIG_ENDIAN */
+    return ((packed_uint16_t *) this)->v;
+#endif
+#else
+    return (v[0] <<  8)
+        + (v[1]      );
+#endif
+  }
+  private: uint8_t v[2];
+};
+template <typename Type>
+struct BEInt<Type, 3>
+{
+  static_assert (!std::is_signed<Type>::value, "");
+  public:
+  BEInt () = default;
+  constexpr BEInt (Type V) : v {uint8_t ((V >> 16) & 0xFF),
+                               uint8_t ((V >>  8) & 0xFF),
+                               uint8_t ((V      ) & 0xFF)} {}
+
+  constexpr operator Type () const { return (v[0] << 16)
+                                         + (v[1] <<  8)
+                                         + (v[2]      ); }
+  private: uint8_t v[3];
+};
+template <typename Type>
+struct BEInt<Type, 4>
+{
+  public:
+  BEInt () = default;
+  constexpr BEInt (Type V) : v {uint8_t ((V >> 24) & 0xFF),
+                               uint8_t ((V >> 16) & 0xFF),
+                               uint8_t ((V >>  8) & 0xFF),
+                               uint8_t ((V      ) & 0xFF)} {}
+  constexpr operator Type () const { return (v[0] << 24)
+                                         + (v[1] << 16)
+                                         + (v[2] <<  8)
+                                         + (v[3]      ); }
+  private: uint8_t v[4];
+};
+
+/* Floats. */
+
+/* We want our rounding towards +infinity. */
+static inline float
+_hb_roundf (float x) { return floorf (x + .5f); }
+#define roundf(x) _hb_roundf(x)
+
 
 /* Encodes three unsigned integers in one 64-bit number.  If the inputs have more than 21 bits,
  * values will be truncated / overlap, and might not decode exactly. */
 #define HB_CODEPOINT_DECODE3_11_7_14_2(v) ((hb_codepoint_t) (((v) >> 14) & 0x007Fu) | 0x0300)
 #define HB_CODEPOINT_DECODE3_11_7_14_3(v) ((hb_codepoint_t) (v) & 0x3FFFu)
 
+
 struct
 {
   /* Note.  This is dangerous in that if it's passed an rvalue, it returns rvalue-reference. */
   template <typename T> constexpr auto
-  operator () (T&& v) const HB_AUTO_RETURN ( hb_forward<T> (v) )
+  operator () (T&& v) const HB_AUTO_RETURN ( std::forward<T> (v) )
 }
 HB_FUNCOBJ (hb_identity);
 struct
@@ -76,19 +207,36 @@ HB_FUNCOBJ (hb_ridentity);
 struct
 {
   template <typename T> constexpr bool
-  operator () (T&& v) const { return bool (hb_forward<T> (v)); }
+  operator () (T&& v) const { return bool (std::forward<T> (v)); }
 }
 HB_FUNCOBJ (hb_bool);
 
+template <typename T>
+static inline
+T hb_coerce (const T v) { return v; }
+template <typename T, typename V,
+         hb_enable_if (!hb_is_same (hb_decay<T>, hb_decay<V>) && std::is_pointer<V>::value)>
+static inline
+T hb_coerce (const V v) { return *v; }
+
 struct
 {
   private:
 
   template <typename T> constexpr auto
-  impl (const T& v, hb_priority<1>) const HB_RETURN (uint32_t, hb_deref (v).hash ())
+  impl (const T& v, hb_priority<2>) const HB_RETURN (uint32_t, hb_deref (v).hash ())
+
+/* Sadly, we must give further hints to VS2015 to build the following template item */
+#if !defined (_MSC_VER) || defined (__clang__) || (_MSC_VER >= 1910)
+  template <typename T> constexpr auto
+  impl (const T& v, hb_priority<1>) const HB_RETURN (uint32_t, std::hash<hb_decay<decltype (hb_deref (v))>>{} (hb_deref (v)))
+#else
+  template <typename T> constexpr auto
+  impl (const T& v, hb_priority<1>) const HB_RETURN (uint32_t, std::hash<hb_decay<decltype (hb_deref (v).hash ())>>{} (hb_deref (v)))
+#endif
 
   template <typename T,
-           hb_enable_if (hb_is_integral (T))> constexpr auto
+           hb_enable_if (std::is_integral<T>::value)> constexpr auto
   impl (const T& v, hb_priority<0>) const HB_AUTO_RETURN
   (
     /* Knuth's multiplicative method: */
@@ -110,26 +258,26 @@ struct
   /* Pointer-to-member-function. */
   template <typename Appl, typename T, typename ...Ts> auto
   impl (Appl&& a, hb_priority<2>, T &&v, Ts&&... ds) const HB_AUTO_RETURN
-  ((hb_deref (hb_forward<T> (v)).*hb_forward<Appl> (a)) (hb_forward<Ts> (ds)...))
+  ((hb_deref (std::forward<T> (v)).*std::forward<Appl> (a)) (std::forward<Ts> (ds)...))
 
   /* Pointer-to-member. */
   template <typename Appl, typename T> auto
   impl (Appl&& a, hb_priority<1>, T &&v) const HB_AUTO_RETURN
-  ((hb_deref (hb_forward<T> (v))).*hb_forward<Appl> (a))
+  ((hb_deref (std::forward<T> (v))).*std::forward<Appl> (a))
 
   /* Operator(). */
   template <typename Appl, typename ...Ts> auto
   impl (Appl&& a, hb_priority<0>, Ts&&... ds) const HB_AUTO_RETURN
-  (hb_deref (hb_forward<Appl> (a)) (hb_forward<Ts> (ds)...))
+  (hb_deref (std::forward<Appl> (a)) (std::forward<Ts> (ds)...))
 
   public:
 
   template <typename Appl, typename ...Ts> auto
   operator () (Appl&& a, Ts&&... ds) const HB_AUTO_RETURN
   (
-    impl (hb_forward<Appl> (a),
+    impl (std::forward<Appl> (a),
          hb_prioritize,
-         hb_forward<Ts> (ds)...)
+         std::forward<Ts> (ds)...)
   )
 }
 HB_FUNCOBJ (hb_invoke);
@@ -148,9 +296,9 @@ struct hb_partial_t
                                                   hb_declval (V),
                                                   hb_declval (Ts)...))
   {
-    return hb_invoke (hb_forward<Appl> (a),
-                     hb_forward<V> (v),
-                     hb_forward<Ts> (ds)...);
+    return hb_invoke (std::forward<Appl> (a),
+                     std::forward<V> (v),
+                     std::forward<Ts> (ds)...);
   }
   template <typename T0, typename ...Ts,
            unsigned P = Pos,
@@ -160,10 +308,10 @@ struct hb_partial_t
                                                            hb_declval (V),
                                                            hb_declval (Ts)...))
   {
-    return hb_invoke (hb_forward<Appl> (a),
-                     hb_forward<T0> (d0),
-                     hb_forward<V> (v),
-                     hb_forward<Ts> (ds)...);
+    return hb_invoke (std::forward<Appl> (a),
+                     std::forward<T0> (d0),
+                     std::forward<V> (v),
+                     std::forward<Ts> (ds)...);
   }
 
   private:
@@ -197,14 +345,14 @@ auto hb_partial (Appl&& a, V&& v) HB_AUTO_RETURN
 #define HB_PARTIALIZE(Pos) \
   template <typename _T> \
   decltype(auto) operator () (_T&& _v) const \
-  { return hb_partial<Pos> (this, hb_forward<_T> (_v)); } \
+  { return hb_partial<Pos> (this, std::forward<_T> (_v)); } \
   static_assert (true, "")
 #else
 /* https://github.com/harfbuzz/harfbuzz/issues/1724 */
 #define HB_PARTIALIZE(Pos) \
   template <typename _T> \
   auto operator () (_T&& _v) const HB_AUTO_RETURN \
-  (hb_partial<Pos> (+this, hb_forward<_T> (_v))) \
+  (hb_partial<Pos> (+this, std::forward<_T> (_v))) \
   static_assert (true, "")
 #endif
 
@@ -215,21 +363,23 @@ struct
 
   template <typename Pred, typename Val> auto
   impl (Pred&& p, Val &&v, hb_priority<1>) const HB_AUTO_RETURN
-  (hb_deref (hb_forward<Pred> (p)).has (hb_forward<Val> (v)))
+  (
+    hb_deref (std::forward<Pred> (p)).has (std::forward<Val> (v))
+  )
 
   template <typename Pred, typename Val> auto
   impl (Pred&& p, Val &&v, hb_priority<0>) const HB_AUTO_RETURN
   (
-    hb_invoke (hb_forward<Pred> (p),
-              hb_forward<Val> (v))
+    hb_invoke (std::forward<Pred> (p),
+              std::forward<Val> (v))
   )
 
   public:
 
   template <typename Pred, typename Val> auto
   operator () (Pred&& p, Val &&v) const HB_RETURN (bool,
-    impl (hb_forward<Pred> (p),
-         hb_forward<Val> (v),
+    impl (std::forward<Pred> (p),
+         std::forward<Val> (v),
          hb_prioritize)
   )
 }
@@ -242,22 +392,22 @@ struct
   template <typename Pred, typename Val> auto
   impl (Pred&& p, Val &&v, hb_priority<1>) const HB_AUTO_RETURN
   (
-    hb_has (hb_forward<Pred> (p),
-           hb_forward<Val> (v))
+    hb_has (std::forward<Pred> (p),
+           std::forward<Val> (v))
   )
 
   template <typename Pred, typename Val> auto
   impl (Pred&& p, Val &&v, hb_priority<0>) const HB_AUTO_RETURN
   (
-    hb_forward<Pred> (p) == hb_forward<Val> (v)
+    std::forward<Pred> (p) == std::forward<Val> (v)
   )
 
   public:
 
   template <typename Pred, typename Val> auto
   operator () (Pred&& p, Val &&v) const HB_RETURN (bool,
-    impl (hb_forward<Pred> (p),
-         hb_forward<Val> (v),
+    impl (std::forward<Pred> (p),
+         std::forward<Val> (v),
          hb_prioritize)
   )
 }
@@ -269,19 +419,21 @@ struct
 
   template <typename Proj, typename Val> auto
   impl (Proj&& f, Val &&v, hb_priority<2>) const HB_AUTO_RETURN
-  (hb_deref (hb_forward<Proj> (f)).get (hb_forward<Val> (v)))
+  (
+    hb_deref (std::forward<Proj> (f)).get (std::forward<Val> (v))
+  )
 
   template <typename Proj, typename Val> auto
   impl (Proj&& f, Val &&v, hb_priority<1>) const HB_AUTO_RETURN
   (
-    hb_invoke (hb_forward<Proj> (f),
-              hb_forward<Val> (v))
+    hb_invoke (std::forward<Proj> (f),
+              std::forward<Val> (v))
   )
 
   template <typename Proj, typename Val> auto
   impl (Proj&& f, Val &&v, hb_priority<0>) const HB_AUTO_RETURN
   (
-    hb_forward<Proj> (f)[hb_forward<Val> (v)]
+    std::forward<Proj> (f)[std::forward<Val> (v)]
   )
 
   public:
@@ -289,13 +441,53 @@ struct
   template <typename Proj, typename Val> auto
   operator () (Proj&& f, Val &&v) const HB_AUTO_RETURN
   (
-    impl (hb_forward<Proj> (f),
-         hb_forward<Val> (v),
+    impl (std::forward<Proj> (f),
+         std::forward<Val> (v),
          hb_prioritize)
   )
 }
 HB_FUNCOBJ (hb_get);
 
+struct
+{
+  private:
+
+  template <typename T1, typename T2> auto
+  impl (T1&& v1, T2 &&v2, hb_priority<3>) const HB_AUTO_RETURN
+  (
+    std::forward<T2> (v2).cmp (std::forward<T1> (v1)) == 0
+  )
+
+  template <typename T1, typename T2> auto
+  impl (T1&& v1, T2 &&v2, hb_priority<2>) const HB_AUTO_RETURN
+  (
+    std::forward<T1> (v1).cmp (std::forward<T2> (v2)) == 0
+  )
+
+  template <typename T1, typename T2> auto
+  impl (T1&& v1, T2 &&v2, hb_priority<1>) const HB_AUTO_RETURN
+  (
+    std::forward<T1> (v1) == std::forward<T2> (v2)
+  )
+
+  template <typename T1, typename T2> auto
+  impl (T1&& v1, T2 &&v2, hb_priority<0>) const HB_AUTO_RETURN
+  (
+    std::forward<T2> (v2) == std::forward<T1> (v1)
+  )
+
+  public:
+
+  template <typename T1, typename T2> auto
+  operator () (T1&& v1, T2 &&v2) const HB_AUTO_RETURN
+  (
+    impl (std::forward<T1> (v1),
+         std::forward<T2> (v2),
+         hb_prioritize)
+  )
+}
+HB_FUNCOBJ (hb_equal);
+
 
 template <typename T1, typename T2>
 struct hb_pair_t
@@ -304,6 +496,10 @@ struct hb_pair_t
   typedef T2 second_t;
   typedef hb_pair_t<T1, T2> pair_t;
 
+  template <typename U1 = T1, typename U2 = T2,
+           hb_enable_if (std::is_default_constructible<U1>::value &&
+                         std::is_default_constructible<U2>::value)>
+  hb_pair_t () : first (), second () {}
   hb_pair_t (T1 a, T2 b) : first (a), second (b) {}
 
   template <typename Q1, typename Q2,
@@ -350,24 +546,34 @@ struct
 {
   template <typename T, typename T2> constexpr auto
   operator () (T&& a, T2&& b) const HB_AUTO_RETURN
-  (hb_forward<T> (a) <= hb_forward<T2> (b) ? hb_forward<T> (a) : hb_forward<T2> (b))
+  (a <= b ? std::forward<T> (a) : std::forward<T2> (b))
 }
 HB_FUNCOBJ (hb_min);
 struct
 {
   template <typename T, typename T2> constexpr auto
   operator () (T&& a, T2&& b) const HB_AUTO_RETURN
-  (hb_forward<T> (a) >= hb_forward<T2> (b) ? hb_forward<T> (a) : hb_forward<T2> (b))
+  (a >= b ? std::forward<T> (a) : std::forward<T2> (b))
 }
 HB_FUNCOBJ (hb_max);
 struct
 {
   template <typename T, typename T2, typename T3> constexpr auto
   operator () (T&& x, T2&& min, T3&& max) const HB_AUTO_RETURN
-  (hb_min (hb_max (hb_forward<T> (x), hb_forward<T2> (min)), hb_forward<T3> (max)))
+  (hb_min (hb_max (std::forward<T> (x), std::forward<T2> (min)), std::forward<T3> (max)))
 }
 HB_FUNCOBJ (hb_clamp);
 
+struct
+{
+  template <typename T> void
+  operator () (T& a, T& b) const
+  {
+    using std::swap; // allow ADL
+    swap (a, b);
+  }
+}
+HB_FUNCOBJ (hb_swap);
 
 /*
  * Bithacks.
@@ -375,7 +581,7 @@ HB_FUNCOBJ (hb_clamp);
 
 /* Return the number of 1 bits in v. */
 template <typename T>
-static inline HB_CONST_FUNC unsigned int
+static inline unsigned int
 hb_popcount (T v)
 {
 #if (defined(__GNUC__) && (__GNUC__ >= 4)) || defined(__clang__)
@@ -416,7 +622,7 @@ hb_popcount (T v)
 
 /* Returns the number of bits needed to store number */
 template <typename T>
-static inline HB_CONST_FUNC unsigned int
+static inline unsigned int
 hb_bit_storage (T v)
 {
   if (unlikely (!v)) return 0;
@@ -490,7 +696,7 @@ hb_bit_storage (T v)
 
 /* Returns the number of zero bits in the least significant side of v */
 template <typename T>
-static inline HB_CONST_FUNC unsigned int
+static inline unsigned int
 hb_ctz (T v)
 {
   if (unlikely (!v)) return 8 * sizeof (T);
@@ -595,6 +801,14 @@ static inline unsigned int ARRAY_LENGTH (const Type (&)[n]) { return n; }
 #define ARRAY_LENGTH_CONST(__array) ((signed int) (sizeof (__array) / sizeof (__array[0])))
 
 
+static inline void *
+hb_memcpy (void *__restrict dst, const void *__restrict src, size_t len)
+{
+  /* It's illegal to pass 0 as size to memcpy. */
+  if (unlikely (!len)) return dst;
+  return memcpy (dst, src, len);
+}
+
 static inline int
 hb_memcmp (const void *a, const void *b, unsigned int len)
 {
@@ -622,7 +836,7 @@ hb_ceil_to_4 (unsigned int v)
 template <typename T> static inline bool
 hb_in_range (T u, T lo, T hi)
 {
-  static_assert (!hb_is_signed<T>::value, "");
+  static_assert (!std::is_signed<T>::value, "");
 
   /* The casts below are important as if T is smaller than int,
    * the subtract results will become a signed int! */
@@ -684,7 +898,7 @@ hb_bsearch_impl (unsigned *pos, /* Out */
 #pragma GCC diagnostic ignored "-Wcast-align"
     V* p = (V*) (((const char *) base) + (mid * stride));
 #pragma GCC diagnostic pop
-    int c = compar ((const void *) hb_addressof (key), (const void *) p, ds...);
+    int c = compar ((const void *) std::addressof (key), (const void *) p, ds...);
     if (c < 0)
       max = mid - 1;
     else if (c > 0)
@@ -986,38 +1200,48 @@ hb_codepoint_parse (const char *s, unsigned int len, int base, hb_codepoint_t *o
 
 /* Operators. */
 
-struct hb_bitwise_and
+struct
 { HB_PARTIALIZE(2);
-  static constexpr bool passthru_left = false;
-  static constexpr bool passthru_right = false;
   template <typename T> constexpr auto
   operator () (const T &a, const T &b) const HB_AUTO_RETURN (a & b)
 }
 HB_FUNCOBJ (hb_bitwise_and);
-struct hb_bitwise_or
+struct
 { HB_PARTIALIZE(2);
-  static constexpr bool passthru_left = true;
-  static constexpr bool passthru_right = true;
   template <typename T> constexpr auto
   operator () (const T &a, const T &b) const HB_AUTO_RETURN (a | b)
 }
 HB_FUNCOBJ (hb_bitwise_or);
-struct hb_bitwise_xor
+struct
 { HB_PARTIALIZE(2);
-  static constexpr bool passthru_left = true;
-  static constexpr bool passthru_right = true;
   template <typename T> constexpr auto
   operator () (const T &a, const T &b) const HB_AUTO_RETURN (a ^ b)
 }
 HB_FUNCOBJ (hb_bitwise_xor);
-struct hb_bitwise_sub
+struct
+{ HB_PARTIALIZE(2);
+  template <typename T> constexpr auto
+  operator () (const T &a, const T &b) const HB_AUTO_RETURN (~a & b)
+}
+HB_FUNCOBJ (hb_bitwise_lt);
+struct
 { HB_PARTIALIZE(2);
-  static constexpr bool passthru_left = true;
-  static constexpr bool passthru_right = false;
   template <typename T> constexpr auto
   operator () (const T &a, const T &b) const HB_AUTO_RETURN (a & ~b)
 }
-HB_FUNCOBJ (hb_bitwise_sub);
+HB_FUNCOBJ (hb_bitwise_gt); // aka sub
+struct
+{ HB_PARTIALIZE(2);
+  template <typename T> constexpr auto
+  operator () (const T &a, const T &b) const HB_AUTO_RETURN (~a | b)
+}
+HB_FUNCOBJ (hb_bitwise_le);
+struct
+{ HB_PARTIALIZE(2);
+  template <typename T> constexpr auto
+  operator () (const T &a, const T &b) const HB_AUTO_RETURN (a | ~b)
+}
+HB_FUNCOBJ (hb_bitwise_ge);
 struct
 {
   template <typename T> constexpr auto
@@ -1040,6 +1264,12 @@ HB_FUNCOBJ (hb_sub);
 struct
 { HB_PARTIALIZE(2);
   template <typename T, typename T2> constexpr auto
+  operator () (const T &a, const T2 &b) const HB_AUTO_RETURN (b - a)
+}
+HB_FUNCOBJ (hb_rsub);
+struct
+{ HB_PARTIALIZE(2);
+  template <typename T, typename T2> constexpr auto
   operator () (const T &a, const T2 &b) const HB_AUTO_RETURN (a * b)
 }
 HB_FUNCOBJ (hb_mul);
index 172d9c1..1d1476d 100644 (file)
 template <typename Type>
 struct hb_sorted_array_t;
 
+enum hb_not_found_t
+{
+  HB_NOT_FOUND_DONT_STORE,
+  HB_NOT_FOUND_STORE,
+  HB_NOT_FOUND_STORE_CLOSEST,
+};
+
+
 template <typename Type>
 struct hb_array_t : hb_iter_with_fallback_t<hb_array_t<Type>, Type&>
 {
   /*
    * Constructors.
    */
-  hb_array_t () : arrayZ (nullptr), length (0), backwards_length (0) {}
-  hb_array_t (Type *array_, unsigned int length_) : arrayZ (array_), length (length_), backwards_length (0) {}
+  hb_array_t () = default;
+  hb_array_t (const hb_array_t&) = default;
+  ~hb_array_t () = default;
+  hb_array_t& operator= (const hb_array_t&) = default;
+  hb_array_t& operator= (hb_array_t&&) = default;
+
+  constexpr hb_array_t (std::nullptr_t) : hb_array_t () {}
+  constexpr hb_array_t (Type *array_, unsigned int length_) : arrayZ (array_), length (length_) {}
   template <unsigned int length_>
-  hb_array_t (Type (&array_)[length_]) : arrayZ (array_), length (length_), backwards_length (0) {}
+  constexpr hb_array_t (Type (&array_)[length_]) : hb_array_t (array_, length_) {}
 
   template <typename U,
            hb_enable_if (hb_is_cr_convertible(U, Type))>
-  hb_array_t (const hb_array_t<U> &o) :
+  constexpr hb_array_t (const hb_array_t<U> &o) :
     hb_iter_with_fallback_t<hb_array_t, Type&> (),
     arrayZ (o.arrayZ), length (o.length), backwards_length (o.backwards_length) {}
   template <typename U,
@@ -129,20 +143,45 @@ struct hb_array_t : hb_iter_with_fallback_t<hb_array_t<Type>, Type&>
   template <typename T>
   Type *lsearch (const T &x, Type *not_found = nullptr)
   {
-    unsigned int count = length;
-    for (unsigned int i = 0; i < count; i++)
-      if (!this->arrayZ[i].cmp (x))
-       return &this->arrayZ[i];
-    return not_found;
+    unsigned i;
+    return lfind (x, &i) ? &this->arrayZ[i] : not_found;
   }
   template <typename T>
   const Type *lsearch (const T &x, const Type *not_found = nullptr) const
   {
-    unsigned int count = length;
-    for (unsigned int i = 0; i < count; i++)
-      if (!this->arrayZ[i].cmp (x))
-       return &this->arrayZ[i];
-    return not_found;
+    unsigned i;
+    return lfind (x, &i) ? &this->arrayZ[i] : not_found;
+  }
+  template <typename T>
+  bool lfind (const T &x, unsigned *pos = nullptr,
+             hb_not_found_t not_found = HB_NOT_FOUND_DONT_STORE,
+             unsigned int to_store = (unsigned int) -1) const
+  {
+    for (unsigned i = 0; i < length; ++i)
+      if (hb_equal (x, this->arrayZ[i]))
+      {
+       if (pos)
+         *pos = i;
+       return true;
+      }
+
+    if (pos)
+    {
+      switch (not_found)
+      {
+       case HB_NOT_FOUND_DONT_STORE:
+         break;
+
+       case HB_NOT_FOUND_STORE:
+         *pos = to_store;
+         break;
+
+       case HB_NOT_FOUND_STORE_CLOSEST:
+         *pos = length;
+         break;
+      }
+    }
+    return false;
   }
 
   hb_sorted_array_t<Type> qsort (int (*cmp_)(const void*, const void*))
@@ -212,7 +251,7 @@ struct hb_array_t : hb_iter_with_fallback_t<hb_array_t<Type>, Type&>
            unsigned P = sizeof (Type),
            hb_enable_if (P == 1)>
   const T *as () const
-  { return length < hb_null_size (T) ? &Null (T) : reinterpret_cast<const T *> (arrayZ); }
+  { return length < hb_min_size (T) ? &Null (T) : reinterpret_cast<const T *> (arrayZ); }
 
   template <typename T,
            unsigned P = sizeof (Type),
@@ -224,9 +263,9 @@ struct hb_array_t : hb_iter_with_fallback_t<hb_array_t<Type>, Type&>
        && (unsigned int) (arrayZ + length - (const char *) p) >= size;
   }
 
-  /* Only call if you allocated the underlying array using malloc() or similar. */
-  void free ()
-  { ::free ((void *) arrayZ); arrayZ = nullptr; length = 0; }
+  /* Only call if you allocated the underlying array using hb_malloc() or similar. */
+  void fini ()
+  { hb_free ((void *) arrayZ); arrayZ = nullptr; length = 0; }
 
   template <typename hb_serialize_context_t>
   hb_array_t copy (hb_serialize_context_t *c) const
@@ -248,9 +287,9 @@ struct hb_array_t : hb_iter_with_fallback_t<hb_array_t<Type>, Type&>
    */
 
   public:
-  Type *arrayZ;
-  unsigned int length;
-  unsigned int backwards_length;
+  Type *arrayZ = nullptr;
+  unsigned int length = 0;
+  unsigned int backwards_length = 0;
 };
 template <typename T> inline hb_array_t<T>
 hb_array (T *array, unsigned int length)
@@ -259,13 +298,6 @@ template <typename T, unsigned int length_> inline hb_array_t<T>
 hb_array (T (&array_)[length_])
 { return hb_array_t<T> (array_); }
 
-enum hb_bfind_not_found_t
-{
-  HB_BFIND_NOT_FOUND_DONT_STORE,
-  HB_BFIND_NOT_FOUND_STORE,
-  HB_BFIND_NOT_FOUND_STORE_CLOSEST,
-};
-
 template <typename Type>
 struct hb_sorted_array_t :
        hb_iter_t<hb_sorted_array_t<Type>, Type&>,
@@ -276,14 +308,20 @@ struct hb_sorted_array_t :
   static constexpr bool is_random_access_iterator = true;
   static constexpr bool is_sorted_iterator = true;
 
-  hb_sorted_array_t () : hb_array_t<Type> () {}
-  hb_sorted_array_t (Type *array_, unsigned int length_) : hb_array_t<Type> (array_, length_) {}
+  hb_sorted_array_t () = default;
+  hb_sorted_array_t (const hb_sorted_array_t&) = default;
+  ~hb_sorted_array_t () = default;
+  hb_sorted_array_t& operator= (const hb_sorted_array_t&) = default;
+  hb_sorted_array_t& operator= (hb_sorted_array_t&&) = default;
+
+  constexpr hb_sorted_array_t (std::nullptr_t) : hb_sorted_array_t () {}
+  constexpr hb_sorted_array_t (Type *array_, unsigned int length_) : hb_array_t<Type> (array_, length_) {}
   template <unsigned int length_>
-  hb_sorted_array_t (Type (&array_)[length_]) : hb_array_t<Type> (array_) {}
+  constexpr hb_sorted_array_t (Type (&array_)[length_]) : hb_array_t<Type> (array_) {}
 
   template <typename U,
            hb_enable_if (hb_is_cr_convertible(U, Type))>
-  hb_sorted_array_t (const hb_array_t<U> &o) :
+  constexpr hb_sorted_array_t (const hb_array_t<U> &o) :
     hb_iter_t<hb_sorted_array_t, Type&> (),
     hb_array_t<Type> (o) {}
   template <typename U,
@@ -316,7 +354,7 @@ struct hb_sorted_array_t :
   }
   template <typename T>
   bool bfind (const T &x, unsigned int *i = nullptr,
-             hb_bfind_not_found_t not_found = HB_BFIND_NOT_FOUND_DONT_STORE,
+             hb_not_found_t not_found = HB_NOT_FOUND_DONT_STORE,
              unsigned int to_store = (unsigned int) -1) const
   {
     unsigned pos;
@@ -332,14 +370,14 @@ struct hb_sorted_array_t :
     {
       switch (not_found)
       {
-       case HB_BFIND_NOT_FOUND_DONT_STORE:
+       case HB_NOT_FOUND_DONT_STORE:
          break;
 
-       case HB_BFIND_NOT_FOUND_STORE:
+       case HB_NOT_FOUND_STORE:
          *i = to_store;
          break;
 
-       case HB_BFIND_NOT_FOUND_STORE_CLOSEST:
+       case HB_NOT_FOUND_STORE_CLOSEST:
          *i = pos;
          break;
       }
@@ -374,7 +412,7 @@ bool hb_array_t<T>::operator == (const hb_array_t<T> &o) const
   return true;
 }
 
-/* TODO Specialize opeator== for hb_bytes_t and hb_ubytes_t. */
+/* TODO Specialize operator== for hb_bytes_t and hb_ubytes_t. */
 
 template <>
 inline uint32_t hb_array_t<const char>::hash () const {
index b3fb296..e640d1b 100644 (file)
@@ -52,7 +52,7 @@
 
 #elif !defined(HB_NO_MT) && defined(__ATOMIC_ACQUIRE)
 
-/* C++11-style GCC primitives. */
+/* C++11-style GCC primitives. We prefer these as they don't require linking to libstdc++ / libc++. */
 
 #define _hb_memory_barrier()                   __sync_synchronize ()
 
@@ -73,7 +73,8 @@ _hb_atomic_ptr_impl_cmplexch (const void **P, const void *O_, const void *N)
 }
 #define hb_atomic_ptr_impl_cmpexch(P,O,N)      _hb_atomic_ptr_impl_cmplexch ((const void **) (P), (O), (N))
 
-#elif !defined(HB_NO_MT) && __cplusplus >= 201103L
+
+#elif !defined(HB_NO_MT)
 
 /* C++11 atomics. */
 
@@ -101,131 +102,12 @@ _hb_atomic_ptr_impl_cmplexch (const void **P, const void *O_, const void *N)
 #define hb_atomic_ptr_impl_cmpexch(P,O,N)      _hb_atomic_ptr_impl_cmplexch ((const void **) (P), (O), (N))
 
 
-#elif !defined(HB_NO_MT) && defined(_WIN32)
-
-#include <windows.h>
-
-static inline void _hb_memory_barrier ()
-{
-#if !defined(MemoryBarrier) && !defined(__MINGW32_VERSION)
-  /* MinGW has a convoluted history of supporting MemoryBarrier. */
-  LONG dummy = 0;
-  InterlockedExchange (&dummy, 1);
-#else
-  MemoryBarrier ();
-#endif
-}
-#define _hb_memory_barrier()                   _hb_memory_barrier ()
-
-#define hb_atomic_int_impl_add(AI, V)          InterlockedExchangeAdd ((LONG *) (AI), (V))
-static_assert ((sizeof (LONG) == sizeof (int)), "");
-
-#define hb_atomic_ptr_impl_cmpexch(P,O,N)      (InterlockedCompareExchangePointer ((P), (N), (O)) == (O))
-
-
-#elif !defined(HB_NO_MT) && defined(HAVE_INTEL_ATOMIC_PRIMITIVES)
-
-#define _hb_memory_barrier()                   __sync_synchronize ()
-
-#define hb_atomic_int_impl_add(AI, V)          __sync_fetch_and_add ((AI), (V))
-
-#define hb_atomic_ptr_impl_cmpexch(P,O,N)      __sync_bool_compare_and_swap ((P), (O), (N))
-
-
-#elif !defined(HB_NO_MT) && defined(HAVE_SOLARIS_ATOMIC_OPS)
-
-#include <atomic.h>
-#include <mbarrier.h>
-
-#define _hb_memory_r_barrier()                 __machine_r_barrier ()
-#define _hb_memory_w_barrier()                 __machine_w_barrier ()
-#define _hb_memory_barrier()                   __machine_rw_barrier ()
-
-static inline int _hb_fetch_and_add (int *AI, int V)
-{
-  _hb_memory_w_barrier ();
-  int result = atomic_add_int_nv ((uint_t *) AI, V) - V;
-  _hb_memory_r_barrier ();
-  return result;
-}
-static inline bool _hb_compare_and_swap_ptr (void **P, void *O, void *N)
-{
-  _hb_memory_w_barrier ();
-  bool result = atomic_cas_ptr (P, O, N) == O;
-  _hb_memory_r_barrier ();
-  return result;
-}
-
-#define hb_atomic_int_impl_add(AI, V)           _hb_fetch_and_add ((AI), (V))
-
-#define hb_atomic_ptr_impl_cmpexch(P,O,N)       _hb_compare_and_swap_ptr ((P), (O), (N))
-
-
-#elif !defined(HB_NO_MT) && defined(__APPLE__)
-
-#include <libkern/OSAtomic.h>
-#ifdef __MAC_OS_X_MIN_REQUIRED
-#include <AvailabilityMacros.h>
-#elif defined(__IPHONE_OS_MIN_REQUIRED)
-#include <Availability.h>
-#endif
-
-#define _hb_memory_barrier()                   OSMemoryBarrier ()
-
-#define hb_atomic_int_impl_add(AI, V)          (OSAtomicAdd32Barrier ((V), (AI)) - (V))
-
-#if (MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_4 || __IPHONE_VERSION_MIN_REQUIRED >= 20100)
-#define hb_atomic_ptr_impl_cmpexch(P,O,N)      OSAtomicCompareAndSwapPtrBarrier ((O), (N), (P))
-#else
-#if __ppc64__ || __x86_64__ || __aarch64__
-#define hb_atomic_ptr_impl_cmpexch(P,O,N)      OSAtomicCompareAndSwap64Barrier ((int64_t) (O), (int64_t) (N), (int64_t*) (P))
-#else
-#define hb_atomic_ptr_impl_cmpexch(P,O,N)      OSAtomicCompareAndSwap32Barrier ((int32_t) (O), (int32_t) (N), (int32_t*) (P))
-#endif
-#endif
-
-
-#elif !defined(HB_NO_MT) && defined(_AIX) && (defined(__IBMCPP__) || defined(__ibmxl__))
-
-#include <builtins.h>
-
-#define _hb_memory_barrier()                   __lwsync ()
-
-static inline int _hb_fetch_and_add (int *AI, int V)
-{
-  _hb_memory_barrier ();
-  int result = __fetch_and_add (AI, V);
-  _hb_memory_barrier ();
-  return result;
-}
-static inline bool _hb_compare_and_swaplp (long *P, long O, long N)
-{
-  _hb_memory_barrier ();
-  bool result = __compare_and_swaplp (P, &O, N);
-  _hb_memory_barrier ();
-  return result;
-}
-
-#define hb_atomic_int_impl_add(AI, V)           _hb_fetch_and_add ((AI), (V))
-
-#define hb_atomic_ptr_impl_cmpexch(P,O,N)       _hb_compare_and_swaplp ((long *) (P), (long) (O), (long) (N))
-static_assert ((sizeof (long) == sizeof (void *)), "");
-
-
-#elif defined(HB_NO_MT)
+#else /* defined(HB_NO_MT) */
 
 #define hb_atomic_int_impl_add(AI, V)          ((*(AI) += (V)) - (V))
-
 #define _hb_memory_barrier()                   do {} while (0)
-
 #define hb_atomic_ptr_impl_cmpexch(P,O,N)      (* (void **) (P) == (void *) (O) ? (* (void **) (P) = (void *) (N), true) : false)
 
-
-#else
-
-#error "Could not find any system to define atomic_int macros."
-#error "Check hb-atomic.hh for possible resolutions."
-
 #endif
 
 
@@ -259,9 +141,11 @@ inline void *hb_atomic_ptr_impl_get (void ** const P)      { void *v = *P; _hb_memory
 #endif
 
 
-#define HB_ATOMIC_INT_INIT(V)          {V}
 struct hb_atomic_int_t
 {
+  hb_atomic_int_t () = default;
+  constexpr hb_atomic_int_t (int v) : v (v) {}
+
   void set_relaxed (int v_) { hb_atomic_int_impl_set_relaxed (&v, v_); }
   void set (int v_) { hb_atomic_int_impl_set (&v, v_); }
   int get_relaxed () const { return hb_atomic_int_impl_get_relaxed (&v); }
@@ -269,16 +153,17 @@ struct hb_atomic_int_t
   int inc () { return hb_atomic_int_impl_add (&v,  1); }
   int dec () { return hb_atomic_int_impl_add (&v, -1); }
 
-  int v;
+  int v = 0;
 };
 
-
-#define HB_ATOMIC_PTR_INIT(V)          {V}
 template <typename P>
 struct hb_atomic_ptr_t
 {
   typedef hb_remove_pointer<P> T;
 
+  hb_atomic_ptr_t () = default;
+  constexpr hb_atomic_ptr_t (T* v) : v (v) {}
+
   void init (T* v_ = nullptr) { set_relaxed (v_); }
   void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); }
   T *get_relaxed () const { return (T *) hb_atomic_ptr_impl_get_relaxed (&v); }
@@ -288,7 +173,7 @@ struct hb_atomic_ptr_t
   T * operator -> () const                    { return get (); }
   template <typename C> operator C * () const { return get (); }
 
-  T *v;
+  T *v = nullptr;
 };
 
 
index e9f3a6a..a9e1278 100644 (file)
 /* Bi-directional map */
 struct hb_bimap_t
 {
-  hb_bimap_t () { init (); }
-  ~hb_bimap_t () { fini (); }
-
-  void init ()
-  {
-    forw_map.init ();
-    back_map.init ();
-  }
-
-  void fini ()
-  {
-    forw_map.fini ();
-    back_map.fini ();
-  }
-
   void reset ()
   {
     forw_map.reset ();
@@ -58,10 +43,15 @@ struct hb_bimap_t
 
   void set (hb_codepoint_t lhs, hb_codepoint_t rhs)
   {
+    if (in_error ()) return;
     if (unlikely (lhs == HB_MAP_VALUE_INVALID)) return;
     if (unlikely (rhs == HB_MAP_VALUE_INVALID)) { del (lhs); return; }
+
     forw_map.set (lhs, rhs);
+    if (in_error ()) return;
+
     back_map.set (rhs, lhs);
+    if (in_error ()) forw_map.del (lhs);
   }
 
   hb_codepoint_t get (hb_codepoint_t lhs) const { return forw_map.get (lhs); }
@@ -94,14 +84,6 @@ struct hb_bimap_t
 /* Inremental bimap: only lhs is given, rhs is incrementally assigned */
 struct hb_inc_bimap_t : hb_bimap_t
 {
-  hb_inc_bimap_t () { init (); }
-
-  void init ()
-  {
-    hb_bimap_t::init ();
-    next_value = 0;
-  }
-
   /* Add a mapping from lhs to rhs with a unique value if lhs is unknown.
    * Return the rhs value as the result.
    */
@@ -160,7 +142,7 @@ struct hb_inc_bimap_t : hb_bimap_t
   }
 
   protected:
-  unsigned int next_value;
+  unsigned int next_value = 0;
 };
 
 #endif /* HB_BIMAP_HH */
diff --git a/src/hb-bit-page.hh b/src/hb-bit-page.hh
new file mode 100644 (file)
index 0000000..263be3d
--- /dev/null
@@ -0,0 +1,203 @@
+/*
+ * Copyright © 2012,2017  Google, Inc.
+ * Copyright © 2021 Behdad Esfahbod
+ *
+ *  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_BIT_PAGE_HH
+#define HB_BIT_PAGE_HH
+
+#include "hb.hh"
+
+struct hb_bit_page_t
+{
+  void init0 () { v.clear (); }
+  void init1 () { v.clear (0xFF); }
+
+  constexpr unsigned len () const
+  { return ARRAY_LENGTH_CONST (v); }
+
+  bool is_empty () const
+  {
+    for (unsigned int i = 0; i < len (); i++)
+      if (v[i])
+       return false;
+    return true;
+  }
+
+  void add (hb_codepoint_t g) { elt (g) |= mask (g); }
+  void del (hb_codepoint_t g) { elt (g) &= ~mask (g); }
+  void set (hb_codepoint_t g, bool v) { if (v) add (g); else del (g); }
+  bool get (hb_codepoint_t g) const { return elt (g) & mask (g); }
+
+  void add_range (hb_codepoint_t a, hb_codepoint_t b)
+  {
+    elt_t *la = &elt (a);
+    elt_t *lb = &elt (b);
+    if (la == lb)
+      *la |= (mask (b) << 1) - mask(a);
+    else
+    {
+      *la |= ~(mask (a) - 1);
+      la++;
+
+      memset (la, 0xff, (char *) lb - (char *) la);
+
+      *lb |= ((mask (b) << 1) - 1);
+    }
+  }
+  void del_range (hb_codepoint_t a, hb_codepoint_t b)
+  {
+    elt_t *la = &elt (a);
+    elt_t *lb = &elt (b);
+    if (la == lb)
+      *la &= ~((mask (b) << 1) - mask(a));
+    else
+    {
+      *la &= mask (a) - 1;
+      la++;
+
+      memset (la, 0, (char *) lb - (char *) la);
+
+      *lb &= ~((mask (b) << 1) - 1);
+    }
+  }
+  void set_range (hb_codepoint_t a, hb_codepoint_t b, bool v)
+  { if (v) add_range (a, b); else del_range (a, b); }
+
+  bool is_equal (const hb_bit_page_t &other) const
+  {
+    return 0 == hb_memcmp (&v, &other.v, sizeof (v));
+  }
+  bool is_subset (const hb_bit_page_t &larger_page) const
+  {
+    for (unsigned i = 0; i < len (); i++)
+      if (~larger_page.v[i] & v[i])
+       return false;
+    return true;
+  }
+
+  unsigned int get_population () const
+  {
+    unsigned int pop = 0;
+    for (unsigned int i = 0; i < len (); i++)
+      pop += hb_popcount (v[i]);
+    return pop;
+  }
+
+  bool next (hb_codepoint_t *codepoint) const
+  {
+    unsigned int m = (*codepoint + 1) & MASK;
+    if (!m)
+    {
+      *codepoint = INVALID;
+      return false;
+    }
+    unsigned int i = m / ELT_BITS;
+    unsigned int j = m & ELT_MASK;
+
+    const elt_t vv = v[i] & ~((elt_t (1) << j) - 1);
+    for (const elt_t *p = &vv; i < len (); p = &v[++i])
+      if (*p)
+      {
+       *codepoint = i * ELT_BITS + elt_get_min (*p);
+       return true;
+      }
+
+    *codepoint = INVALID;
+    return false;
+  }
+  bool previous (hb_codepoint_t *codepoint) const
+  {
+    unsigned int m = (*codepoint - 1) & MASK;
+    if (m == MASK)
+    {
+      *codepoint = INVALID;
+      return false;
+    }
+    unsigned int i = m / ELT_BITS;
+    unsigned int j = m & ELT_MASK;
+
+    /* Fancy mask to avoid shifting by elt_t bitsize, which is undefined. */
+    const elt_t mask = j < 8 * sizeof (elt_t) - 1 ?
+                      ((elt_t (1) << (j + 1)) - 1) :
+                      (elt_t) -1;
+    const elt_t vv = v[i] & mask;
+    const elt_t *p = &vv;
+    while (true)
+    {
+      if (*p)
+      {
+       *codepoint = i * ELT_BITS + elt_get_max (*p);
+       return true;
+      }
+      if ((int) i <= 0) break;
+      p = &v[--i];
+    }
+
+    *codepoint = INVALID;
+    return false;
+  }
+  hb_codepoint_t get_min () const
+  {
+    for (unsigned int i = 0; i < len (); i++)
+      if (v[i])
+       return i * ELT_BITS + elt_get_min (v[i]);
+    return INVALID;
+  }
+  hb_codepoint_t get_max () const
+  {
+    for (int i = len () - 1; i >= 0; i--)
+      if (v[i])
+       return i * ELT_BITS + elt_get_max (v[i]);
+    return 0;
+  }
+
+  static constexpr hb_codepoint_t INVALID = HB_SET_VALUE_INVALID;
+
+  typedef unsigned long long elt_t;
+  static constexpr unsigned PAGE_BITS = 512;
+  static_assert ((PAGE_BITS & ((PAGE_BITS) - 1)) == 0, "");
+
+  static unsigned int elt_get_min (const elt_t &elt) { return hb_ctz (elt); }
+  static unsigned int elt_get_max (const elt_t &elt) { return hb_bit_storage (elt) - 1; }
+
+  typedef hb_vector_size_t<elt_t, PAGE_BITS / 8> vector_t;
+
+  static constexpr unsigned ELT_BITS = sizeof (elt_t) * 8;
+  static constexpr unsigned ELT_MASK = ELT_BITS - 1;
+  static constexpr unsigned BITS = sizeof (vector_t) * 8;
+  static constexpr unsigned MASK = BITS - 1;
+  static_assert ((unsigned) PAGE_BITS == (unsigned) BITS, "");
+
+  elt_t &elt (hb_codepoint_t g) { return v[(g & MASK) / ELT_BITS]; }
+  const elt_t& elt (hb_codepoint_t g) const { return v[(g & MASK) / ELT_BITS]; }
+  static constexpr elt_t mask (hb_codepoint_t g) { return elt_t (1) << (g & ELT_MASK); }
+
+  vector_t v;
+};
+static_assert (hb_bit_page_t::PAGE_BITS == sizeof (hb_bit_page_t) * 8, "");
+
+
+#endif /* HB_BIT_PAGE_HH */
diff --git a/src/hb-bit-set-invertible.hh b/src/hb-bit-set-invertible.hh
new file mode 100644 (file)
index 0000000..0832b0f
--- /dev/null
@@ -0,0 +1,364 @@
+/*
+ * Copyright © 2012,2017  Google, Inc.
+ * Copyright © 2021 Behdad Esfahbod
+ *
+ *  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_BIT_SET_INVERTIBLE_HH
+#define HB_BIT_SET_INVERTIBLE_HH
+
+#include "hb.hh"
+#include "hb-bit-set.hh"
+
+
+struct hb_bit_set_invertible_t
+{
+  hb_bit_set_t s;
+  bool inverted = false;
+
+  hb_bit_set_invertible_t () = default;
+  hb_bit_set_invertible_t (hb_bit_set_invertible_t& o) = default;
+  hb_bit_set_invertible_t (hb_bit_set_invertible_t&& o) = default;
+  hb_bit_set_invertible_t& operator= (const hb_bit_set_invertible_t& o) = default;
+  hb_bit_set_invertible_t& operator= (hb_bit_set_invertible_t&& o) = default;
+  friend void swap (hb_bit_set_invertible_t &a, hb_bit_set_invertible_t &b)
+  {
+    if (likely (!a.s.successful || !b.s.successful))
+      return;
+    hb_swap (a.inverted, b.inverted);
+    hb_swap (a.s, b.s);
+  }
+
+  void init () { s.init (); inverted = false; }
+  void fini () { s.fini (); }
+  void err () { s.err (); }
+  bool in_error () const { return s.in_error (); }
+  explicit operator bool () const { return !is_empty (); }
+
+  void reset ()
+  {
+    s.reset ();
+    inverted = false;
+  }
+  void clear ()
+  {
+    s.clear ();
+    if (likely (s.successful))
+      inverted = false;
+  }
+  void invert ()
+  {
+    if (likely (s.successful))
+      inverted = !inverted;
+  }
+
+  bool is_empty () const
+  {
+    hb_codepoint_t v = INVALID;
+    next (&v);
+    return v == INVALID;
+  }
+  hb_codepoint_t get_min () const
+  {
+    hb_codepoint_t v = INVALID;
+    next (&v);
+    return v;
+  }
+  hb_codepoint_t get_max () const
+  {
+    hb_codepoint_t v = INVALID;
+    previous (&v);
+    return v;
+  }
+  unsigned int get_population () const
+  { return inverted ? INVALID - s.get_population () : s.get_population (); }
+
+
+  void add (hb_codepoint_t g) { unlikely (inverted) ? s.del (g) : s.add (g); }
+  bool add_range (hb_codepoint_t a, hb_codepoint_t b)
+  { return unlikely (inverted) ? (s.del_range (a, b), true) : s.add_range (a, b); }
+
+  template <typename T>
+  void add_array (const T *array, unsigned int count, unsigned int stride=sizeof(T))
+  { inverted ? s.del_array (array, count, stride) : s.add_array (array, count, stride); }
+  template <typename T>
+  void add_array (const hb_array_t<const T>& arr) { add_array (&arr, arr.len ()); }
+
+  /* Might return false if array looks unsorted.
+   * Used for faster rejection of corrupt data. */
+  template <typename T>
+  bool add_sorted_array (const T *array, unsigned int count, unsigned int stride=sizeof(T))
+  { return inverted ? s.del_sorted_array (array, count, stride) : s.add_sorted_array (array, count, stride); }
+  template <typename T>
+  bool add_sorted_array (const hb_sorted_array_t<const T>& arr) { return add_sorted_array (&arr, arr.len ()); }
+
+  void del (hb_codepoint_t g) { unlikely (inverted) ? s.add (g) : s.del (g); }
+  void del_range (hb_codepoint_t a, hb_codepoint_t b)
+  { unlikely (inverted) ? (void) s.add_range (a, b) : s.del_range (a, b); }
+
+  bool get (hb_codepoint_t g) const { return s.get (g) ^ inverted; }
+
+  /* Has interface. */
+  static constexpr bool SENTINEL = false;
+  typedef bool value_t;
+  value_t operator [] (hb_codepoint_t k) const { return get (k); }
+  bool has (hb_codepoint_t k) const { return (*this)[k] != SENTINEL; }
+  /* Predicate. */
+  bool operator () (hb_codepoint_t k) const { return has (k); }
+
+  /* Sink interface. */
+  hb_bit_set_invertible_t& operator << (hb_codepoint_t v)
+  { add (v); return *this; }
+  hb_bit_set_invertible_t& operator << (const hb_pair_t<hb_codepoint_t, hb_codepoint_t>& range)
+  { add_range (range.first, range.second); return *this; }
+
+  bool intersects (hb_codepoint_t first, hb_codepoint_t last) const
+  {
+    hb_codepoint_t c = first - 1;
+    return next (&c) && c <= last;
+  }
+
+  void set (const hb_bit_set_invertible_t &other)
+  {
+    s.set (other.s);
+    if (likely (s.successful))
+      inverted = other.inverted;
+  }
+
+  bool is_equal (const hb_bit_set_invertible_t &other) const
+  {
+    if (likely (inverted == other.inverted))
+      return s.is_equal (other.s);
+    else
+    {
+      /* TODO Add iter_ranges() and use here. */
+      auto it1 = iter ();
+      auto it2 = other.iter ();
+      return hb_all (+ hb_zip (it1, it2)
+                    | hb_map ([](hb_pair_t<hb_codepoint_t, hb_codepoint_t> _) { return _.first == _.second; }));
+    }
+  }
+
+  bool is_subset (const hb_bit_set_invertible_t &larger_set) const
+  {
+    if (unlikely (inverted != larger_set.inverted))
+      return hb_all (hb_iter (s) | hb_map (larger_set.s));
+    else
+      return unlikely (inverted) ? larger_set.s.is_subset (s) : s.is_subset (larger_set.s);
+  }
+
+  protected:
+  template <typename Op>
+  void process (const Op& op, const hb_bit_set_invertible_t &other)
+  { s.process (op, other.s); }
+  public:
+  void union_ (const hb_bit_set_invertible_t &other)
+  {
+    if (likely (inverted == other.inverted))
+    {
+      if (unlikely (inverted))
+       process (hb_bitwise_and, other);
+      else
+       process (hb_bitwise_or, other); /* Main branch. */
+    }
+    else
+    {
+      if (unlikely (inverted))
+       process (hb_bitwise_gt, other);
+      else
+       process (hb_bitwise_lt, other);
+    }
+    if (likely (s.successful))
+      inverted = inverted || other.inverted;
+  }
+  void intersect (const hb_bit_set_invertible_t &other)
+  {
+    if (likely (inverted == other.inverted))
+    {
+      if (unlikely (inverted))
+       process (hb_bitwise_or, other);
+      else
+       process (hb_bitwise_and, other); /* Main branch. */
+    }
+    else
+    {
+      if (unlikely (inverted))
+       process (hb_bitwise_lt, other);
+      else
+       process (hb_bitwise_gt, other);
+    }
+    if (likely (s.successful))
+      inverted = inverted && other.inverted;
+  }
+  void subtract (const hb_bit_set_invertible_t &other)
+  {
+    if (likely (inverted == other.inverted))
+    {
+      if (unlikely (inverted))
+       process (hb_bitwise_lt, other);
+      else
+       process (hb_bitwise_gt, other); /* Main branch. */
+    }
+    else
+    {
+      if (unlikely (inverted))
+       process (hb_bitwise_or, other);
+      else
+       process (hb_bitwise_and, other);
+    }
+    if (likely (s.successful))
+      inverted = inverted && !other.inverted;
+  }
+  void symmetric_difference (const hb_bit_set_invertible_t &other)
+  {
+    process (hb_bitwise_xor, other);
+    if (likely (s.successful))
+      inverted = inverted ^ other.inverted;
+  }
+
+  bool next (hb_codepoint_t *codepoint) const
+  {
+    if (likely (!inverted))
+      return s.next (codepoint);
+
+    auto old = *codepoint;
+    if (unlikely (old + 1 == INVALID))
+    {
+      *codepoint = INVALID;
+      return false;
+    }
+
+    auto v = old;
+    s.next (&v);
+    if (old + 1 < v)
+    {
+      *codepoint = old + 1;
+      return true;
+    }
+
+    v = old;
+    s.next_range (&old, &v);
+
+    *codepoint = v + 1;
+    return *codepoint != INVALID;
+  }
+  bool previous (hb_codepoint_t *codepoint) const
+  {
+    if (likely (!inverted))
+      return s.previous (codepoint);
+
+    auto old = *codepoint;
+    if (unlikely (old - 1 == INVALID))
+    {
+      *codepoint = INVALID;
+      return false;
+    }
+
+    auto v = old;
+    s.previous (&v);
+
+    if (old - 1 > v || v == INVALID)
+    {
+      *codepoint = old - 1;
+      return true;
+    }
+
+    v = old;
+    s.previous_range (&v, &old);
+
+    *codepoint = v - 1;
+    return *codepoint != INVALID;
+  }
+  bool next_range (hb_codepoint_t *first, hb_codepoint_t *last) const
+  {
+    if (likely (!inverted))
+      return s.next_range (first, last);
+
+    if (!next (last))
+    {
+      *last = *first = INVALID;
+      return false;
+    }
+
+    *first = *last;
+    s.next (last);
+    --*last;
+    return true;
+  }
+  bool previous_range (hb_codepoint_t *first, hb_codepoint_t *last) const
+  {
+    if (likely (!inverted))
+      return s.previous_range (first, last);
+
+    if (!previous (first))
+    {
+      *last = *first = INVALID;
+      return false;
+    }
+
+    *last = *first;
+    s.previous (first);
+    ++*first;
+    return true;
+  }
+
+  static constexpr hb_codepoint_t INVALID = hb_bit_set_t::INVALID;
+
+  /*
+   * Iterator implementation.
+   */
+  struct iter_t : hb_iter_with_fallback_t<iter_t, hb_codepoint_t>
+  {
+    static constexpr bool is_sorted_iterator = true;
+    iter_t (const hb_bit_set_invertible_t &s_ = Null (hb_bit_set_invertible_t),
+           bool init = true) : s (&s_), v (INVALID), l(0)
+    {
+      if (init)
+      {
+       l = s->get_population () + 1;
+       __next__ ();
+      }
+    }
+
+    typedef hb_codepoint_t __item_t__;
+    hb_codepoint_t __item__ () const { return v; }
+    bool __more__ () const { return v != INVALID; }
+    void __next__ () { s->next (&v); if (l) l--; }
+    void __prev__ () { s->previous (&v); }
+    unsigned __len__ () const { return l; }
+    iter_t end () const { return iter_t (*s, false); }
+    bool operator != (const iter_t& o) const
+    { return s != o.s || v != o.v; }
+
+    protected:
+    const hb_bit_set_invertible_t *s;
+    hb_codepoint_t v;
+    unsigned l;
+  };
+  iter_t iter () const { return iter_t (*this); }
+  operator iter_t () const { return iter (); }
+};
+
+
+#endif /* HB_BIT_SET_INVERTIBLE_HH */
diff --git a/src/hb-bit-set.hh b/src/hb-bit-set.hh
new file mode 100644 (file)
index 0000000..a471ee4
--- /dev/null
@@ -0,0 +1,817 @@
+/*
+ * Copyright © 2012,2017  Google, Inc.
+ * Copyright © 2021 Behdad Esfahbod
+ *
+ *  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_BIT_SET_HH
+#define HB_BIT_SET_HH
+
+#include "hb.hh"
+#include "hb-bit-page.hh"
+#include "hb-machinery.hh"
+
+
+struct hb_bit_set_t
+{
+  hb_bit_set_t () = default;
+  ~hb_bit_set_t () = default;
+
+  hb_bit_set_t (const hb_bit_set_t& other) : hb_bit_set_t () { set (other); }
+  hb_bit_set_t ( hb_bit_set_t&& other) : hb_bit_set_t () { hb_swap (*this, other); }
+  hb_bit_set_t& operator= (const hb_bit_set_t& other) { set (other); return *this; }
+  hb_bit_set_t& operator= (hb_bit_set_t&& other) { hb_swap (*this, other); return *this; }
+  friend void swap (hb_bit_set_t &a, hb_bit_set_t &b)
+  {
+    if (likely (!a.successful || !b.successful))
+      return;
+    hb_swap (a.population, b.population);
+    hb_swap (a.last_page_lookup, b.last_page_lookup);
+    hb_swap (a.page_map, b.page_map);
+    hb_swap (a.pages, b.pages);
+  }
+
+  void init ()
+  {
+    successful = true;
+    population = 0;
+    last_page_lookup = 0;
+    page_map.init ();
+    pages.init ();
+  }
+  void fini ()
+  {
+    page_map.fini ();
+    pages.fini ();
+  }
+
+  using page_t = hb_bit_page_t;
+  struct page_map_t
+  {
+    int cmp (const page_map_t &o) const { return cmp (o.major); }
+    int cmp (uint32_t o_major) const { return (int) o_major - (int) major; }
+
+    uint32_t major;
+    uint32_t index;
+  };
+
+  bool successful = true; /* Allocations successful */
+  mutable unsigned int population = 0;
+  mutable unsigned int last_page_lookup = 0;
+  hb_sorted_vector_t<page_map_t> page_map;
+  hb_vector_t<page_t> pages;
+
+  void err () { if (successful) successful = false; } /* TODO Remove */
+  bool in_error () const { return !successful; }
+
+  bool resize (unsigned int count)
+  {
+    if (unlikely (!successful)) return false;
+    if (unlikely (!pages.resize (count) || !page_map.resize (count)))
+    {
+      pages.resize (page_map.length);
+      successful = false;
+      return false;
+    }
+    return true;
+  }
+
+  void reset ()
+  {
+    successful = true;
+    clear ();
+  }
+
+  void clear ()
+  {
+    resize (0);
+    if (likely (successful))
+      population = 0;
+  }
+  bool is_empty () const
+  {
+    unsigned int count = pages.length;
+    for (unsigned int i = 0; i < count; i++)
+      if (!pages[i].is_empty ())
+       return false;
+    return true;
+  }
+  explicit operator bool () const { return !is_empty (); }
+
+  private:
+  void dirty () { population = UINT_MAX; }
+  public:
+
+  void add (hb_codepoint_t g)
+  {
+    if (unlikely (!successful)) return;
+    if (unlikely (g == INVALID)) return;
+    dirty ();
+    page_t *page = page_for (g, true); if (unlikely (!page)) return;
+    page->add (g);
+  }
+  bool add_range (hb_codepoint_t a, hb_codepoint_t b)
+  {
+    if (unlikely (!successful)) return true; /* https://github.com/harfbuzz/harfbuzz/issues/657 */
+    if (unlikely (a > b || a == INVALID || b == INVALID)) return false;
+    dirty ();
+    unsigned int ma = get_major (a);
+    unsigned int mb = get_major (b);
+    if (ma == mb)
+    {
+      page_t *page = page_for (a, true); if (unlikely (!page)) return false;
+      page->add_range (a, b);
+    }
+    else
+    {
+      page_t *page = page_for (a, true); if (unlikely (!page)) return false;
+      page->add_range (a, major_start (ma + 1) - 1);
+
+      for (unsigned int m = ma + 1; m < mb; m++)
+      {
+       page = page_for (major_start (m), true); if (unlikely (!page)) return false;
+       page->init1 ();
+      }
+
+      page = page_for (b, true); if (unlikely (!page)) return false;
+      page->add_range (major_start (mb), b);
+    }
+    return true;
+  }
+
+  template <typename T>
+  void set_array (bool v, const T *array, unsigned int count, unsigned int stride=sizeof(T))
+  {
+    if (unlikely (!successful)) return;
+    if (!count) return;
+    dirty ();
+    hb_codepoint_t g = *array;
+    while (count)
+    {
+      unsigned int m = get_major (g);
+      page_t *page = page_for (g, v); if (unlikely (v && !page)) return;
+      unsigned int start = major_start (m);
+      unsigned int end = major_start (m + 1);
+      do
+      {
+        if (v || page) /* The v check is to optimize out the page check if v is true. */
+         page->set (g, v);
+
+       array = &StructAtOffsetUnaligned<T> (array, stride);
+       count--;
+      }
+      while (count && (g = *array, start <= g && g < end));
+    }
+  }
+
+  template <typename T>
+  void add_array (const T *array, unsigned int count, unsigned int stride=sizeof(T))
+  { set_array (true, array, count, stride); }
+  template <typename T>
+  void add_array (const hb_array_t<const T>& arr) { add_array (&arr, arr.len ()); }
+
+  template <typename T>
+  void del_array (const T *array, unsigned int count, unsigned int stride=sizeof(T))
+  { set_array (false, array, count, stride); }
+  template <typename T>
+  void del_array (const hb_array_t<const T>& arr) { del_array (&arr, arr.len ()); }
+
+  /* Might return false if array looks unsorted.
+   * Used for faster rejection of corrupt data. */
+  template <typename T>
+  bool set_sorted_array (bool v, const T *array, unsigned int count, unsigned int stride=sizeof(T))
+  {
+    if (unlikely (!successful)) return true; /* https://github.com/harfbuzz/harfbuzz/issues/657 */
+    if (!count) return true;
+    dirty ();
+    hb_codepoint_t g = *array;
+    hb_codepoint_t last_g = g;
+    while (count)
+    {
+      unsigned int m = get_major (g);
+      page_t *page = page_for (g, v); if (unlikely (v && !page)) return false;
+      unsigned int end = major_start (m + 1);
+      do
+      {
+       /* If we try harder we can change the following comparison to <=;
+        * Not sure if it's worth it. */
+       if (g < last_g) return false;
+       last_g = g;
+
+        if (v || page) /* The v check is to optimize out the page check if v is true. */
+         page->add (g);
+
+       array = (const T *) ((const char *) array + stride);
+       count--;
+      }
+      while (count && (g = *array, g < end));
+    }
+    return true;
+  }
+
+  template <typename T>
+  bool add_sorted_array (const T *array, unsigned int count, unsigned int stride=sizeof(T))
+  { return set_sorted_array (true, array, count, stride); }
+  template <typename T>
+  bool add_sorted_array (const hb_sorted_array_t<const T>& arr) { return add_sorted_array (&arr, arr.len ()); }
+
+  template <typename T>
+  bool del_sorted_array (const T *array, unsigned int count, unsigned int stride=sizeof(T))
+  { return set_sorted_array (false, array, count, stride); }
+  template <typename T>
+  bool del_sorted_array (const hb_sorted_array_t<const T>& arr) { return del_sorted_array (&arr, arr.len ()); }
+
+  void del (hb_codepoint_t g)
+  {
+    if (unlikely (!successful)) return;
+    page_t *page = page_for (g);
+    if (!page)
+      return;
+    dirty ();
+    page->del (g);
+  }
+
+  private:
+  void del_pages (int ds, int de)
+  {
+    if (ds <= de)
+    {
+      // Pre-allocate the workspace that compact() will need so we can bail on allocation failure
+      // before attempting to rewrite the page map.
+      hb_vector_t<unsigned> compact_workspace;
+      if (unlikely (!allocate_compact_workspace (compact_workspace))) return;
+
+      unsigned int write_index = 0;
+      for (unsigned int i = 0; i < page_map.length; i++)
+      {
+       int m = (int) page_map[i].major;
+       if (m < ds || de < m)
+         page_map[write_index++] = page_map[i];
+      }
+      compact (compact_workspace, write_index);
+      resize (write_index);
+    }
+  }
+
+
+  public:
+  void del_range (hb_codepoint_t a, hb_codepoint_t b)
+  {
+    if (unlikely (!successful)) return;
+    if (unlikely (a > b || a == INVALID)) return;
+    dirty ();
+    unsigned int ma = get_major (a);
+    unsigned int mb = get_major (b);
+    /* Delete pages from ds through de if ds <= de. */
+    int ds = (a == major_start (ma))? (int) ma: (int) (ma + 1);
+    int de = (b + 1 == major_start (mb + 1))? (int) mb: ((int) mb - 1);
+    if (ds > de || (int) ma < ds)
+    {
+      page_t *page = page_for (a);
+      if (page)
+      {
+       if (ma == mb)
+         page->del_range (a, b);
+       else
+         page->del_range (a, major_start (ma + 1) - 1);
+      }
+    }
+    if (de < (int) mb && ma != mb)
+    {
+      page_t *page = page_for (b);
+      if (page)
+       page->del_range (major_start (mb), b);
+    }
+    del_pages (ds, de);
+  }
+
+  bool get (hb_codepoint_t g) const
+  {
+    const page_t *page = page_for (g);
+    if (!page)
+      return false;
+    return page->get (g);
+  }
+
+  /* Has interface. */
+  static constexpr bool SENTINEL = false;
+  typedef bool value_t;
+  value_t operator [] (hb_codepoint_t k) const { return get (k); }
+  bool has (hb_codepoint_t k) const { return (*this)[k] != SENTINEL; }
+  /* Predicate. */
+  bool operator () (hb_codepoint_t k) const { return has (k); }
+
+  /* Sink interface. */
+  hb_bit_set_t& operator << (hb_codepoint_t v)
+  { add (v); return *this; }
+  hb_bit_set_t& operator << (const hb_pair_t<hb_codepoint_t, hb_codepoint_t>& range)
+  { add_range (range.first, range.second); return *this; }
+
+  bool intersects (hb_codepoint_t first, hb_codepoint_t last) const
+  {
+    hb_codepoint_t c = first - 1;
+    return next (&c) && c <= last;
+  }
+  void set (const hb_bit_set_t &other)
+  {
+    if (unlikely (!successful)) return;
+    unsigned int count = other.pages.length;
+    if (unlikely (!resize (count)))
+      return;
+    population = other.population;
+
+    /* TODO switch to vector operator =. */
+    hb_memcpy ((void *) pages, (const void *) other.pages, count * pages.item_size);
+    hb_memcpy ((void *) page_map, (const void *) other.page_map, count * page_map.item_size);
+  }
+
+  bool is_equal (const hb_bit_set_t &other) const
+  {
+    if (has_population () && other.has_population () &&
+       get_population () != other.get_population ())
+      return false;
+
+    unsigned int na = pages.length;
+    unsigned int nb = other.pages.length;
+
+    unsigned int a = 0, b = 0;
+    for (; a < na && b < nb; )
+    {
+      if (page_at (a).is_empty ()) { a++; continue; }
+      if (other.page_at (b).is_empty ()) { b++; continue; }
+      if (page_map[a].major != other.page_map[b].major ||
+         !page_at (a).is_equal (other.page_at (b)))
+       return false;
+      a++;
+      b++;
+    }
+    for (; a < na; a++)
+      if (!page_at (a).is_empty ()) { return false; }
+    for (; b < nb; b++)
+      if (!other.page_at (b).is_empty ()) { return false; }
+
+    return true;
+  }
+
+  bool is_subset (const hb_bit_set_t &larger_set) const
+  {
+    if (has_population () && larger_set.has_population () &&
+       get_population () != larger_set.get_population ())
+      return false;
+
+    uint32_t spi = 0;
+    for (uint32_t lpi = 0; spi < page_map.length && lpi < larger_set.page_map.length; lpi++)
+    {
+      uint32_t spm = page_map[spi].major;
+      uint32_t lpm = larger_set.page_map[lpi].major;
+      auto sp = page_at (spi);
+      auto lp = larger_set.page_at (lpi);
+
+      if (spm < lpm && !sp.is_empty ())
+        return false;
+
+      if (lpm < spm)
+        continue;
+
+      if (!sp.is_subset (lp))
+        return false;
+
+      spi++;
+    }
+
+    while (spi < page_map.length)
+      if (!page_at (spi++).is_empty ())
+        return false;
+
+    return true;
+  }
+
+  private:
+  bool allocate_compact_workspace (hb_vector_t<unsigned>& workspace)
+  {
+    if (unlikely (!workspace.resize (pages.length)))
+    {
+      successful = false;
+      return false;
+    }
+
+    return true;
+  }
+
+  /*
+   * workspace should be a pre-sized vector allocated to hold at exactly pages.length
+   * elements.
+   */
+  void compact (hb_vector_t<unsigned>& workspace,
+                unsigned int length)
+  {
+    assert(workspace.length == pages.length);
+    hb_vector_t<unsigned>& old_index_to_page_map_index = workspace;
+
+    hb_fill (old_index_to_page_map_index.writer(), 0xFFFFFFFF);
+    for (unsigned i = 0; i < length; i++)
+      old_index_to_page_map_index[page_map[i].index] =  i;
+
+    compact_pages (old_index_to_page_map_index);
+  }
+  void compact_pages (const hb_vector_t<unsigned>& old_index_to_page_map_index)
+  {
+    unsigned int write_index = 0;
+    for (unsigned int i = 0; i < pages.length; i++)
+    {
+      if (old_index_to_page_map_index[i] == 0xFFFFFFFF) continue;
+
+      if (write_index < i)
+       pages[write_index] = pages[i];
+
+      page_map[old_index_to_page_map_index[i]].index = write_index;
+      write_index++;
+    }
+  }
+  public:
+
+  template <typename Op>
+  void process (const Op& op, const hb_bit_set_t &other)
+  {
+    const bool passthru_left = op (1, 0);
+    const bool passthru_right = op (0, 1);
+
+    if (unlikely (!successful)) return;
+
+    dirty ();
+
+    unsigned int na = pages.length;
+    unsigned int nb = other.pages.length;
+    unsigned int next_page = na;
+
+    unsigned int count = 0, newCount = 0;
+    unsigned int a = 0, b = 0;
+    unsigned int write_index = 0;
+
+    // Pre-allocate the workspace that compact() will need so we can bail on allocation failure
+    // before attempting to rewrite the page map.
+    hb_vector_t<unsigned> compact_workspace;
+    if (!passthru_left && unlikely (!allocate_compact_workspace (compact_workspace))) return;
+
+    for (; a < na && b < nb; )
+    {
+      if (page_map[a].major == other.page_map[b].major)
+      {
+       if (!passthru_left)
+       {
+         // Move page_map entries that we're keeping from the left side set
+         // to the front of the page_map vector. This isn't necessary if
+         // passthru_left is set since no left side pages will be removed
+         // in that case.
+         if (write_index < a)
+           page_map[write_index] = page_map[a];
+         write_index++;
+       }
+
+       count++;
+       a++;
+       b++;
+      }
+      else if (page_map[a].major < other.page_map[b].major)
+      {
+       if (passthru_left)
+         count++;
+       a++;
+      }
+      else
+      {
+       if (passthru_right)
+         count++;
+       b++;
+      }
+    }
+    if (passthru_left)
+      count += na - a;
+    if (passthru_right)
+      count += nb - b;
+
+    if (!passthru_left)
+    {
+      na  = write_index;
+      next_page = write_index;
+      compact (compact_workspace, write_index);
+    }
+
+    if (unlikely (!resize (count)))
+      return;
+
+    newCount = count;
+
+    /* Process in-place backward. */
+    a = na;
+    b = nb;
+    for (; a && b; )
+    {
+      if (page_map[a - 1].major == other.page_map[b - 1].major)
+      {
+       a--;
+       b--;
+       count--;
+       page_map[count] = page_map[a];
+       page_at (count).v = op (page_at (a).v, other.page_at (b).v);
+      }
+      else if (page_map[a - 1].major > other.page_map[b - 1].major)
+      {
+       a--;
+       if (passthru_left)
+       {
+         count--;
+         page_map[count] = page_map[a];
+       }
+      }
+      else
+      {
+       b--;
+       if (passthru_right)
+       {
+         count--;
+         page_map[count].major = other.page_map[b].major;
+         page_map[count].index = next_page++;
+         page_at (count).v = other.page_at (b).v;
+       }
+      }
+    }
+    if (passthru_left)
+      while (a)
+      {
+       a--;
+       count--;
+       page_map[count] = page_map [a];
+      }
+    if (passthru_right)
+      while (b)
+      {
+       b--;
+       count--;
+       page_map[count].major = other.page_map[b].major;
+       page_map[count].index = next_page++;
+       page_at (count).v = other.page_at (b).v;
+      }
+    assert (!count);
+    resize (newCount);
+  }
+
+  void union_ (const hb_bit_set_t &other) { process (hb_bitwise_or, other); }
+  void intersect (const hb_bit_set_t &other) { process (hb_bitwise_and, other); }
+  void subtract (const hb_bit_set_t &other) { process (hb_bitwise_gt, other); }
+  void symmetric_difference (const hb_bit_set_t &other) { process (hb_bitwise_xor, other); }
+
+  bool next (hb_codepoint_t *codepoint) const
+  {
+    // TODO: this should be merged with prev() as both implementations
+    //       are very similar.
+    if (unlikely (*codepoint == INVALID)) {
+      *codepoint = get_min ();
+      return *codepoint != INVALID;
+    }
+
+    const auto* page_map_array = page_map.arrayZ;
+    unsigned int major = get_major (*codepoint);
+    unsigned int i = last_page_lookup;
+
+    if (unlikely (i >= page_map.length || page_map_array[i].major != major))
+    {
+      page_map.bfind (major, &i, HB_NOT_FOUND_STORE_CLOSEST);
+      if (i >= page_map.length) {
+        *codepoint = INVALID;
+        return false;
+      }
+    }
+
+    const auto* pages_array = pages.arrayZ;
+    const page_map_t &current = page_map_array[i];
+    if (likely (current.major == major))
+    {
+      if (pages_array[current.index].next (codepoint))
+      {
+        *codepoint += current.major * page_t::PAGE_BITS;
+        last_page_lookup = i;
+        return true;
+      }
+      i++;
+    }
+
+    for (; i < page_map.length; i++)
+    {
+      const page_map_t &current = page_map.arrayZ[i];
+      hb_codepoint_t m = pages_array[current.index].get_min ();
+      if (m != INVALID)
+      {
+       *codepoint = current.major * page_t::PAGE_BITS + m;
+        last_page_lookup = i;
+       return true;
+      }
+    }
+    last_page_lookup = 0;
+    *codepoint = INVALID;
+    return false;
+  }
+  bool previous (hb_codepoint_t *codepoint) const
+  {
+    if (unlikely (*codepoint == INVALID)) {
+      *codepoint = get_max ();
+      return *codepoint != INVALID;
+    }
+
+    page_map_t map = {get_major (*codepoint), 0};
+    unsigned int i;
+    page_map.bfind (map, &i, HB_NOT_FOUND_STORE_CLOSEST);
+    if (i < page_map.length && page_map[i].major == map.major)
+    {
+      if (pages[page_map[i].index].previous (codepoint))
+      {
+       *codepoint += page_map[i].major * page_t::PAGE_BITS;
+       return true;
+      }
+    }
+    i--;
+    for (; (int) i >= 0; i--)
+    {
+      hb_codepoint_t m = pages[page_map[i].index].get_max ();
+      if (m != INVALID)
+      {
+       *codepoint = page_map[i].major * page_t::PAGE_BITS + m;
+       return true;
+      }
+    }
+    *codepoint = INVALID;
+    return false;
+  }
+  bool next_range (hb_codepoint_t *first, hb_codepoint_t *last) const
+  {
+    hb_codepoint_t i;
+
+    i = *last;
+    if (!next (&i))
+    {
+      *last = *first = INVALID;
+      return false;
+    }
+
+    /* TODO Speed up. */
+    *last = *first = i;
+    while (next (&i) && i == *last + 1)
+      (*last)++;
+
+    return true;
+  }
+  bool previous_range (hb_codepoint_t *first, hb_codepoint_t *last) const
+  {
+    hb_codepoint_t i;
+
+    i = *first;
+    if (!previous (&i))
+    {
+      *last = *first = INVALID;
+      return false;
+    }
+
+    /* TODO Speed up. */
+    *last = *first = i;
+    while (previous (&i) && i == *first - 1)
+      (*first)--;
+
+    return true;
+  }
+
+  bool has_population () const { return population != UINT_MAX; }
+  unsigned int get_population () const
+  {
+    if (has_population ())
+      return population;
+
+    unsigned int pop = 0;
+    unsigned int count = pages.length;
+    for (unsigned int i = 0; i < count; i++)
+      pop += pages[i].get_population ();
+
+    population = pop;
+    return pop;
+  }
+  hb_codepoint_t get_min () const
+  {
+    unsigned count = pages.length;
+    for (unsigned i = 0; i < count; i++)
+    {
+      const auto& map = page_map[i];
+      const auto& page = pages[map.index];
+
+      if (!page.is_empty ())
+       return map.major * page_t::PAGE_BITS + page.get_min ();
+    }
+    return INVALID;
+  }
+  hb_codepoint_t get_max () const
+  {
+    unsigned count = pages.length;
+    for (signed i = count - 1; i >= 0; i--)
+    {
+      const auto& map = page_map[(unsigned) i];
+      const auto& page = pages[map.index];
+
+      if (!page.is_empty ())
+       return map.major * page_t::PAGE_BITS + page.get_max ();
+    }
+    return INVALID;
+  }
+
+  static constexpr hb_codepoint_t INVALID = page_t::INVALID;
+
+  /*
+   * Iterator implementation.
+   */
+  struct iter_t : hb_iter_with_fallback_t<iter_t, hb_codepoint_t>
+  {
+    static constexpr bool is_sorted_iterator = true;
+    iter_t (const hb_bit_set_t &s_ = Null (hb_bit_set_t),
+           bool init = true) : s (&s_), v (INVALID), l(0)
+    {
+      if (init)
+      {
+       l = s->get_population () + 1;
+       __next__ ();
+      }
+    }
+
+    typedef hb_codepoint_t __item_t__;
+    hb_codepoint_t __item__ () const { return v; }
+    bool __more__ () const { return v != INVALID; }
+    void __next__ () { s->next (&v); if (l) l--; }
+    void __prev__ () { s->previous (&v); }
+    unsigned __len__ () const { return l; }
+    iter_t end () const { return iter_t (*s, false); }
+    bool operator != (const iter_t& o) const
+    { return s != o.s || v != o.v; }
+
+    protected:
+    const hb_bit_set_t *s;
+    hb_codepoint_t v;
+    unsigned l;
+  };
+  iter_t iter () const { return iter_t (*this); }
+  operator iter_t () const { return iter (); }
+
+  protected:
+
+  page_t *page_for (hb_codepoint_t g, bool insert = false)
+  {
+    page_map_t map = {get_major (g), pages.length};
+    unsigned int i;
+    if (!page_map.bfind (map, &i, HB_NOT_FOUND_STORE_CLOSEST))
+    {
+      if (!insert)
+        return nullptr;
+
+      if (unlikely (!resize (pages.length + 1)))
+       return nullptr;
+
+      pages[map.index].init0 ();
+      memmove (page_map + i + 1,
+              page_map + i,
+              (page_map.length - 1 - i) * page_map.item_size);
+      page_map[i] = map;
+    }
+    return &pages[page_map[i].index];
+  }
+  const page_t *page_for (hb_codepoint_t g) const
+  {
+    page_map_t key = {get_major (g)};
+    const page_map_t *found = page_map.bsearch (key);
+    if (found)
+      return &pages[found->index];
+    return nullptr;
+  }
+  page_t &page_at (unsigned int i) { return pages[page_map[i].index]; }
+  const page_t &page_at (unsigned int i) const { return pages[page_map[i].index]; }
+  unsigned int get_major (hb_codepoint_t g) const { return g / page_t::PAGE_BITS; }
+  hb_codepoint_t major_start (unsigned int major) const { return major * page_t::PAGE_BITS; }
+};
+
+
+#endif /* HB_BIT_SET_HH */
index 3ca31c5..f120002 100644 (file)
@@ -35,9 +35,6 @@
 #include <sys/mman.h>
 #endif /* HAVE_SYS_MMAN_H */
 
-#include <stdio.h>
-#include <stdlib.h>
-
 
 /**
  * SECTION: hb-blob
@@ -58,7 +55,7 @@
  * @length: Length of @data in bytes.
  * @mode: Memory mode for @data.
  * @user_data: Data parameter to pass to @destroy.
- * @destroy: Callback to call when @data is not needed anymore.
+ * @destroy: (nullable): Callback to call when @data is not needed anymore.
  *
  * Creates a new "blob" object wrapping @data.  The @mode parameter is used
  * to negotiate ownership and lifecycle of @data.
@@ -75,14 +72,52 @@ hb_blob_create (const char        *data,
                void              *user_data,
                hb_destroy_func_t  destroy)
 {
+  if (!length)
+  {
+    if (destroy)
+      destroy (user_data);
+    return hb_blob_get_empty ();
+  }
+
+  hb_blob_t *blob = hb_blob_create_or_fail (data, length, mode,
+                                           user_data, destroy);
+  return likely (blob) ? blob : hb_blob_get_empty ();
+}
+
+/**
+ * hb_blob_create_or_fail: (skip)
+ * @data: Pointer to blob data.
+ * @length: Length of @data in bytes.
+ * @mode: Memory mode for @data.
+ * @user_data: Data parameter to pass to @destroy.
+ * @destroy: (nullable): Callback to call when @data is not needed anymore.
+ *
+ * Creates a new "blob" object wrapping @data.  The @mode parameter is used
+ * to negotiate ownership and lifecycle of @data.
+ *
+ * Note that this function returns a freshly-allocated empty blob even if @length
+ * is zero. This is in contrast to hb_blob_create(), which returns the singleton
+ * empty blob (as returned by hb_blob_get_empty()) if @length is zero.
+ *
+ * Return value: New blob, or %NULL if failed.  Destroy with hb_blob_destroy().
+ *
+ * Since: 2.8.2
+ **/
+hb_blob_t *
+hb_blob_create_or_fail (const char        *data,
+                       unsigned int       length,
+                       hb_memory_mode_t   mode,
+                       void              *user_data,
+                       hb_destroy_func_t  destroy)
+{
   hb_blob_t *blob;
 
-  if (!length ||
-      length >= 1u << 31 ||
-      !(blob = hb_object_create<hb_blob_t> ())) {
+  if (length >= 1u << 31 ||
+      !(blob = hb_object_create<hb_blob_t> ()))
+  {
     if (destroy)
       destroy (user_data);
-    return hb_blob_get_empty ();
+    return nullptr;
   }
 
   blob->data = data;
@@ -94,9 +129,10 @@ hb_blob_create (const char        *data,
 
   if (blob->mode == HB_MEMORY_MODE_DUPLICATE) {
     blob->mode = HB_MEMORY_MODE_READONLY;
-    if (!blob->try_make_writable ()) {
+    if (!blob->try_make_writable ())
+    {
       hb_blob_destroy (blob);
-      return hb_blob_get_empty ();
+      return nullptr;
     }
   }
 
@@ -116,7 +152,7 @@ _hb_blob_destroy (void *data)
  * @length: Length of sub-blob.
  *
  * Returns a blob that represents a range of bytes in @parent.  The new
- * blob is always created with %HB_MEMORY_MODE_READONLY, meaning that it
+ * blob is always created with #HB_MEMORY_MODE_READONLY, meaning that it
  * will never modify data in the parent blob.  The parent data is not
  * expected to be modified, and will result in undefined behavior if it
  * is.
@@ -156,7 +192,7 @@ hb_blob_create_sub_blob (hb_blob_t    *parent,
  *
  * Makes a writable copy of @blob.
  *
- * Return value: New blob, or nullptr if allocation failed.
+ * Return value: The new blob, or nullptr if allocation failed
  *
  * Since: 1.8.0
  **/
@@ -182,7 +218,7 @@ hb_blob_copy_writable_or_fail (hb_blob_t *blob)
  *
  * See TODO:link object types for more information.
  *
- * Return value: (transfer full): the empty blob.
+ * Return value: (transfer full): The empty blob.
  *
  * Since: 0.9.2
  **/
@@ -229,18 +265,20 @@ hb_blob_destroy (hb_blob_t *blob)
 
   blob->fini_shallow ();
 
-  free (blob);
+  hb_free (blob);
 }
 
 /**
  * hb_blob_set_user_data: (skip)
- * @blob: a blob.
- * @key: key for data to set.
- * @data: data to set.
- * @destroy: callback to call when @data is not needed anymore.
- * @replace: whether to replace an existing data with the same key.
+ * @blob: An #hb_blob_t
+ * @key: The user-data key to set
+ * @data: A pointer to the user data to set
+ * @destroy: (nullable): A callback to call when @data is not needed anymore
+ * @replace: Whether to replace an existing data with the same key
+ *
+ * Attaches a user-data key/data pair to the specified blob.
  *
- * Return value:
+ * Return value: %true if success, %false otherwise
  *
  * Since: 0.9.2
  **/
@@ -256,12 +294,13 @@ hb_blob_set_user_data (hb_blob_t          *blob,
 
 /**
  * hb_blob_get_user_data: (skip)
- * @blob: a blob.
- * @key: key for data to get.
- *
+ * @blob: a blob
+ * @key: The user-data key to query
  *
+ * Fetches the user data associated with the specified key,
+ * attached to the specified font-functions structure.
  *
- * Return value: (transfer none):
+ * Return value: (transfer none): A pointer to the user data
  *
  * Since: 0.9.2
  **/
@@ -275,9 +314,9 @@ hb_blob_get_user_data (hb_blob_t          *blob,
 
 /**
  * hb_blob_make_immutable:
- * @blob: a blob.
- *
+ * @blob: a blob
  *
+ * Makes a blob immutable.
  *
  * Since: 0.9.2
  **/
@@ -294,9 +333,9 @@ hb_blob_make_immutable (hb_blob_t *blob)
  * hb_blob_is_immutable:
  * @blob: a blob.
  *
+ * Tests whether a blob is immutable.
  *
- *
- * Return value: TODO
+ * Return value: %true if @blob is immutable, %false otherwise
  *
  * Since: 0.9.2
  **/
@@ -311,9 +350,9 @@ hb_blob_is_immutable (hb_blob_t *blob)
  * hb_blob_get_length:
  * @blob: a blob.
  *
+ * Fetches the length of a blob's data.
  *
- *
- * Return value: the length of blob data in bytes.
+ * Return value: the length of @blob data in bytes.
  *
  * Since: 0.9.2
  **/
@@ -326,11 +365,11 @@ hb_blob_get_length (hb_blob_t *blob)
 /**
  * hb_blob_get_data:
  * @blob: a blob.
- * @length: (out):
- *
+ * @length: (out): The length in bytes of the data retrieved
  *
+ * Fetches the data from a blob.
  *
- * Returns: (transfer none) (array length=length):
+ * Returns: (transfer none) (array length=length): the byte data of @blob.
  *
  * Since: 0.9.2
  **/
@@ -362,16 +401,14 @@ hb_blob_get_data (hb_blob_t *blob, unsigned int *length)
 char *
 hb_blob_get_data_writable (hb_blob_t *blob, unsigned int *length)
 {
-  if (!blob->try_make_writable ()) {
-    if (length)
-      *length = 0;
-
+  if (hb_object_is_immutable (blob) ||
+     !blob->try_make_writable ())
+  {
+    if (length) *length = 0;
     return nullptr;
   }
 
-  if (length)
-    *length = blob->length;
-
+  if (length) *length = blob->length;
   return const_cast<char *> (blob->data);
 }
 
@@ -437,8 +474,8 @@ hb_blob_t::try_make_writable_inplace ()
 bool
 hb_blob_t::try_make_writable ()
 {
-  if (hb_object_is_immutable (this))
-    return false;
+  if (unlikely (!length))
+    mode = HB_MEMORY_MODE_WRITABLE;
 
   if (this->mode == HB_MEMORY_MODE_WRITABLE)
     return true;
@@ -454,7 +491,7 @@ hb_blob_t::try_make_writable ()
 
   char *new_data;
 
-  new_data = (char *) malloc (this->length);
+  new_data = (char *) hb_malloc (this->length);
   if (unlikely (!new_data))
     return false;
 
@@ -465,7 +502,7 @@ hb_blob_t::try_make_writable ()
   this->mode = HB_MEMORY_MODE_WRITABLE;
   this->data = new_data;
   this->user_data = new_data;
-  this->destroy = free;
+  this->destroy = hb_free;
 
   return true;
 }
@@ -519,7 +556,7 @@ _hb_mapped_file_destroy (void *file_)
   assert (0); // If we don't have mmap we shouldn't reach here
 #endif
 
-  free (file);
+  hb_free (file);
 }
 #endif
 
@@ -530,7 +567,7 @@ _open_resource_fork (const char *file_name, hb_mapped_file_t *file)
   size_t name_len = strlen (file_name);
   size_t len = name_len + sizeof (_PATH_RSRCFORKSPEC);
 
-  char *rsrc_name = (char *) malloc (len);
+  char *rsrc_name = (char *) hb_malloc (len);
   if (unlikely (!rsrc_name)) return -1;
 
   strncpy (rsrc_name, file_name, name_len);
@@ -538,7 +575,7 @@ _open_resource_fork (const char *file_name, hb_mapped_file_t *file)
           sizeof (_PATH_RSRCFORKSPEC) - 1);
 
   int fd = open (rsrc_name, O_RDONLY | O_BINARY, 0);
-  free (rsrc_name);
+  hb_free (rsrc_name);
 
   if (fd != -1)
   {
@@ -558,19 +595,42 @@ _open_resource_fork (const char *file_name, hb_mapped_file_t *file)
 
 /**
  * hb_blob_create_from_file:
- * @file_name: font filename.
+ * @file_name: A font filename
  *
- * Returns: A hb_blob_t pointer with the content of the file
+ * Creates a new blob containing the data from the
+ * specified binary font file.
+ *
+ * Returns: An #hb_blob_t pointer with the content of the file,
+ * or hb_blob_get_empty() if failed.
  *
  * Since: 1.7.7
  **/
 hb_blob_t *
 hb_blob_create_from_file (const char *file_name)
 {
+  hb_blob_t *blob = hb_blob_create_from_file_or_fail (file_name);
+  return likely (blob) ? blob : hb_blob_get_empty ();
+}
+
+/**
+ * hb_blob_create_from_file_or_fail:
+ * @file_name: A font filename
+ *
+ * Creates a new blob containing the data from the
+ * specified binary font file.
+ *
+ * Returns: An #hb_blob_t pointer with the content of the file,
+ * or %NULL if failed.
+ *
+ * Since: 2.8.2
+ **/
+hb_blob_t *
+hb_blob_create_from_file_or_fail (const char *file_name)
+{
   /* Adopted from glib's gmappedfile.c with Matthias Clasen and
      Allison Lortie permission but changed a lot to suit our need. */
 #if defined(HAVE_MMAP) && !defined(HB_NO_MMAP)
-  hb_mapped_file_t *file = (hb_mapped_file_t *) calloc (1, sizeof (hb_mapped_file_t));
+  hb_mapped_file_t *file = (hb_mapped_file_t *) hb_calloc (1, sizeof (hb_mapped_file_t));
   if (unlikely (!file)) return hb_blob_get_empty ();
 
   int fd = open (file_name, O_RDONLY | O_BINARY, 0);
@@ -600,25 +660,25 @@ hb_blob_create_from_file (const char *file_name)
 
   close (fd);
 
-  return hb_blob_create (file->contents, file->length,
-                        HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE, (void *) file,
-                        (hb_destroy_func_t) _hb_mapped_file_destroy);
+  return hb_blob_create_or_fail (file->contents, file->length,
+                                HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE, (void *) file,
+                                (hb_destroy_func_t) _hb_mapped_file_destroy);
 
 fail:
   close (fd);
 fail_without_close:
-  free (file);
+  hb_free (file);
 
 #elif defined(_WIN32) && !defined(HB_NO_MMAP)
-  hb_mapped_file_t *file = (hb_mapped_file_t *) calloc (1, sizeof (hb_mapped_file_t));
+  hb_mapped_file_t *file = (hb_mapped_file_t *) hb_calloc (1, sizeof (hb_mapped_file_t));
   if (unlikely (!file)) return hb_blob_get_empty ();
 
   HANDLE fd;
   unsigned int size = strlen (file_name) + 1;
-  wchar_t * wchar_file_name = (wchar_t *) malloc (sizeof (wchar_t) * size);
+  wchar_t * wchar_file_name = (wchar_t *) hb_malloc (sizeof (wchar_t) * size);
   if (unlikely (!wchar_file_name)) goto fail_without_close;
   mbstowcs (wchar_file_name, file_name, size);
-#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY==WINAPI_FAMILY_PC_APP || WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP)
+#if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
   {
     CREATEFILE2_EXTENDED_PARAMETERS ceparams = { 0 };
     ceparams.dwSize = sizeof(CREATEFILE2_EXTENDED_PARAMETERS);
@@ -635,11 +695,11 @@ fail_without_close:
                    OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,
                    nullptr);
 #endif
-  free (wchar_file_name);
+  hb_free (wchar_file_name);
 
   if (unlikely (fd == INVALID_HANDLE_VALUE)) goto fail_without_close;
 
-#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY==WINAPI_FAMILY_PC_APP || WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP)
+#if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
   {
     LARGE_INTEGER length;
     GetFileSizeEx (fd, &length);
@@ -652,7 +712,7 @@ fail_without_close:
 #endif
   if (unlikely (!file->mapping)) goto fail;
 
-#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY==WINAPI_FAMILY_PC_APP || WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP)
+#if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
   file->contents = (char *) MapViewOfFileFromApp (file->mapping, FILE_MAP_READ, 0, 0);
 #else
   file->contents = (char *) MapViewOfFile (file->mapping, FILE_MAP_READ, 0, 0, 0);
@@ -660,22 +720,22 @@ fail_without_close:
   if (unlikely (!file->contents)) goto fail;
 
   CloseHandle (fd);
-  return hb_blob_create (file->contents, file->length,
-                        HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE, (void *) file,
-                        (hb_destroy_func_t) _hb_mapped_file_destroy);
+  return hb_blob_create_or_fail (file->contents, file->length,
+                                HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE, (void *) file,
+                                (hb_destroy_func_t) _hb_mapped_file_destroy);
 
 fail:
   CloseHandle (fd);
 fail_without_close:
-  free (file);
+  hb_free (file);
 
 #endif
 
   /* The following tries to read a file without knowing its size beforehand
      It's used as a fallback for systems without mmap or to read from pipes */
   unsigned long len = 0, allocated = BUFSIZ * 16;
-  char *data = (char *) malloc (allocated);
-  if (unlikely (!data)) return hb_blob_get_empty ();
+  char *data = (char *) hb_malloc (allocated);
+  if (unlikely (!data)) return nullptr;
 
   FILE *fp = fopen (file_name, "rb");
   if (unlikely (!fp)) goto fread_fail_without_close;
@@ -688,7 +748,7 @@ fail_without_close:
       /* Don't allocate and go more than ~536MB, our mmap reader still
         can cover files like that but lets limit our fallback reader */
       if (unlikely (allocated > (2 << 28))) goto fread_fail;
-      char *new_data = (char *) realloc (data, allocated);
+      char *new_data = (char *) hb_realloc (data, allocated);
       if (unlikely (!new_data)) goto fread_fail;
       data = new_data;
     }
@@ -705,13 +765,13 @@ fail_without_close:
   }
        fclose (fp);
 
-  return hb_blob_create (data, len, HB_MEMORY_MODE_WRITABLE, data,
-                        (hb_destroy_func_t) free);
+  return hb_blob_create_or_fail (data, len, HB_MEMORY_MODE_WRITABLE, data,
+                                (hb_destroy_func_t) hb_free);
 
 fread_fail:
   fclose (fp);
 fread_fail_without_close:
-  free (data);
-  return hb_blob_get_empty ();
+  hb_free (data);
+  return nullptr;
 }
 #endif /* !HB_NO_OPEN */
index f80e9af..203f9e1 100644 (file)
@@ -24,7 +24,7 @@
  * Red Hat Author(s): Behdad Esfahbod
  */
 
-#ifndef HB_H_IN
+#if !defined(HB_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb.h> instead."
 #endif
 
 HB_BEGIN_DECLS
 
 
-/*
- * Note re various memory-modes:
+/**
+ * hb_memory_mode_t:
+ * @HB_MEMORY_MODE_DUPLICATE: HarfBuzz immediately makes a copy of the data.
+ * @HB_MEMORY_MODE_READONLY: HarfBuzz client will never modify the data,
+ *     and HarfBuzz will never modify the data.
+ * @HB_MEMORY_MODE_WRITABLE: HarfBuzz client made a copy of the data solely
+ *     for HarfBuzz, so HarfBuzz may modify the data.
+ * @HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE: See above
+ *
+ * Data type holding the memory modes available to
+ * client programs.
+ *
+ * Regarding these various memory-modes:
  *
  * - In no case shall the HarfBuzz client modify memory
  *   that is passed to HarfBuzz in a blob.  If there is
- *   any such possibility, MODE_DUPLICATE should be used
+ *   any such possibility, @HB_MEMORY_MODE_DUPLICATE should be used
  *   such that HarfBuzz makes a copy immediately,
  *
- * - Use MODE_READONLY otherwise, unless you really really
+ * - Use @HB_MEMORY_MODE_READONLY otherwise, unless you really really
  *   really know what you are doing,
  *
- * - MODE_WRITABLE is appropriate if you really made a
+ * - @HB_MEMORY_MODE_WRITABLE is appropriate if you really made a
  *   copy of data solely for the purpose of passing to
  *   HarfBuzz and doing that just once (no reuse!),
  *
- * - If the font is mmap()ed, it's ok to use
- *   READONLY_MAY_MAKE_WRITABLE, however, using that mode
- *   correctly is very tricky.  Use MODE_READONLY instead.
- */
+ * - If the font is mmap()ed, it's okay to use
+ *   @HB_MEMORY_READONLY_MAY_MAKE_WRITABLE, however, using that mode
+ *   correctly is very tricky.  Use @HB_MEMORY_MODE_READONLY instead.
+ **/
 typedef enum {
   HB_MEMORY_MODE_DUPLICATE,
   HB_MEMORY_MODE_READONLY,
@@ -62,6 +73,14 @@ typedef enum {
   HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE
 } hb_memory_mode_t;
 
+/**
+ * hb_blob_t:
+ *
+ * Data type for blobs. A blob wraps a chunk of binary
+ * data and facilitates its lifecycle management between
+ * a client program and HarfBuzz.
+ *
+ **/
 typedef struct hb_blob_t hb_blob_t;
 
 HB_EXTERN hb_blob_t *
@@ -72,8 +91,18 @@ hb_blob_create (const char        *data,
                hb_destroy_func_t  destroy);
 
 HB_EXTERN hb_blob_t *
+hb_blob_create_or_fail (const char        *data,
+                       unsigned int       length,
+                       hb_memory_mode_t   mode,
+                       void              *user_data,
+                       hb_destroy_func_t  destroy);
+
+HB_EXTERN hb_blob_t *
 hb_blob_create_from_file (const char *file_name);
 
+HB_EXTERN hb_blob_t *
+hb_blob_create_from_file_or_fail (const char *file_name);
+
 /* Always creates with MEMORY_MODE_READONLY.
  * Even if the parent blob is writable, we don't
  * want the user of the sub-blob to be able to
index d85bd82..a3683a6 100644 (file)
@@ -88,8 +88,9 @@ struct hb_blob_ptr_t
   const T * get () const { return b->as<T> (); }
   hb_blob_t * get_blob () const { return b.get_raw (); }
   unsigned int get_length () const { return b.get ()->length; }
-  void destroy () { hb_blob_destroy (b.get ()); b = nullptr; }
+  void destroy () { hb_blob_destroy (b.get_raw ()); b = nullptr; }
 
+  private:
   hb_nonnull_ptr_t<hb_blob_t> b;
 };
 
index 1f9e2e9..e80cfea 100644 (file)
 
 #line 36 "hb-buffer-deserialize-json.hh"
 static const unsigned char _deserialize_json_trans_keys[] = {
-       0u, 0u, 9u, 123u, 9u, 34u, 97u, 103u, 120u, 121u, 34u, 34u, 9u, 58u, 9u, 57u, 
+       0u, 0u, 9u, 123u, 9u, 34u, 97u, 117u, 120u, 121u, 34u, 34u, 9u, 58u, 9u, 57u, 
        48u, 57u, 9u, 125u, 9u, 125u, 9u, 125u, 34u, 34u, 9u, 58u, 9u, 57u, 48u, 57u, 
        9u, 125u, 9u, 125u, 108u, 108u, 34u, 34u, 9u, 58u, 9u, 57u, 9u, 125u, 9u, 125u, 
        120u, 121u, 34u, 34u, 9u, 58u, 9u, 57u, 48u, 57u, 9u, 125u, 9u, 125u, 34u, 34u, 
        9u, 58u, 9u, 57u, 48u, 57u, 9u, 125u, 9u, 125u, 34u, 34u, 9u, 58u, 9u, 57u, 
-       65u, 122u, 34u, 122u, 9u, 125u, 9u, 125u, 9u, 93u, 9u, 123u, 0u, 0u, 0
+       34u, 92u, 9u, 125u, 34u, 92u, 9u, 125u, 9u, 125u, 34u, 34u, 9u, 58u, 9u, 57u, 
+       9u, 125u, 9u, 93u, 9u, 123u, 0u, 0u, 0
 };
 
 static const char _deserialize_json_key_spans[] = {
-       0, 115, 26, 7, 2, 1, 50, 49, 
+       0, 115, 26, 21, 2, 1, 50, 49, 
        10, 117, 117, 117, 1, 50, 49, 10, 
        117, 117, 1, 1, 50, 49, 117, 117, 
        2, 1, 50, 49, 10, 117, 117, 1, 
        50, 49, 10, 117, 117, 1, 50, 49, 
-       58, 89, 117, 117, 85, 115, 0
+       59, 117, 59, 117, 117, 1, 50, 49, 
+       117, 85, 115, 0
 };
 
 static const short _deserialize_json_index_offsets[] = {
-       0, 0, 116, 143, 151, 154, 156, 207, 
-       257, 268, 386, 504, 622, 624, 675, 725, 
-       736, 854, 972, 974, 976, 1027, 1077, 1195, 
-       1313, 1316, 1318, 1369, 1419, 1430, 1548, 1666, 
-       1668, 1719, 1769, 1780, 1898, 2016, 2018, 2069, 
-       2119, 2178, 2268, 2386, 2504, 2590, 2706
+       0, 0, 116, 143, 165, 168, 170, 221, 
+       271, 282, 400, 518, 636, 638, 689, 739, 
+       750, 868, 986, 988, 990, 1041, 1091, 1209, 
+       1327, 1330, 1332, 1383, 1433, 1444, 1562, 1680, 
+       1682, 1733, 1783, 1794, 1912, 2030, 2032, 2083, 
+       2133, 2193, 2311, 2371, 2489, 2607, 2609, 2660, 
+       2710, 2828, 2914, 3030
 };
 
 static const char _deserialize_json_indicies[] = {
@@ -80,28 +83,27 @@ static const char _deserialize_json_indicies[] = {
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 3, 1, 4, 1, 
        5, 1, 6, 7, 1, 1, 8, 1, 
-       9, 10, 1, 11, 1, 11, 11, 11, 
-       11, 11, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 11, 1, 1, 1, 
+       1, 1, 1, 1, 9, 1, 10, 11, 
+       1, 12, 1, 12, 12, 12, 12, 12, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 12, 1, 
-       12, 12, 12, 12, 12, 1, 1, 1, 
+       1, 1, 12, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 12, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 13, 1, 1, 14, 
-       15, 15, 15, 15, 15, 15, 15, 15, 
-       15, 1, 16, 17, 17, 17, 17, 17, 
-       17, 17, 17, 17, 1, 18, 18, 18, 
-       18, 18, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 13, 1, 13, 13, 
+       13, 13, 13, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 18, 1, 1, 1, 
+       1, 1, 1, 1, 1, 13, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       19, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 14, 1, 1, 15, 16, 16, 
+       16, 16, 16, 16, 16, 16, 16, 1, 
+       17, 18, 18, 18, 18, 18, 18, 18, 
+       18, 18, 1, 19, 19, 19, 19, 19, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 19, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 20, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
@@ -109,13 +111,14 @@ static const char _deserialize_json_indicies[] = {
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 20, 1, 21, 21, 21, 21, 21, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 21, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 3, 1, 
+       1, 1, 1, 1, 1, 1, 1, 21, 
+       1, 22, 22, 22, 22, 22, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
+       22, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 3, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
@@ -123,42 +126,60 @@ static const char _deserialize_json_indicies[] = {
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 22, 
-       1, 18, 18, 18, 18, 18, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       18, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 19, 1, 1, 1, 
-       17, 17, 17, 17, 17, 17, 17, 17, 
-       17, 17, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 23, 1, 19, 
+       19, 19, 19, 19, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 19, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 20, 1, 1, 1, 18, 18, 
+       18, 18, 18, 18, 18, 18, 18, 18, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 20, 1, 23, 
-       1, 23, 23, 23, 23, 23, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       23, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 21, 1, 24, 1, 24, 
+       24, 24, 24, 24, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 24, 1, 24, 24, 24, 24, 
-       24, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 24, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 24, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       25, 1, 1, 26, 27, 27, 27, 27, 
-       27, 27, 27, 27, 27, 1, 28, 29, 
-       29, 29, 29, 29, 29, 29, 29, 29, 
-       1, 30, 30, 30, 30, 30, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
+       25, 1, 25, 25, 25, 25, 25, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 25, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 26, 1, 
+       1, 27, 28, 28, 28, 28, 28, 28, 
+       28, 28, 28, 1, 29, 30, 30, 30, 
+       30, 30, 30, 30, 30, 30, 1, 31, 
+       31, 31, 31, 31, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 31, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 32, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 33, 1, 31, 31, 31, 
+       31, 31, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       30, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 31, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
+       32, 1, 1, 1, 30, 30, 30, 30, 
+       30, 30, 30, 30, 30, 30, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
@@ -166,41 +187,41 @@ static const char _deserialize_json_indicies[] = {
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 33, 1, 34, 1, 35, 1, 35, 
+       35, 35, 35, 35, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 32, 1, 30, 
-       30, 30, 30, 30, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 35, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 30, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 31, 1, 1, 1, 29, 29, 
-       29, 29, 29, 29, 29, 29, 29, 29, 
        1, 1, 1, 1, 1, 1, 1, 1, 
+       36, 1, 36, 36, 36, 36, 36, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 36, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 37, 38, 38, 38, 38, 38, 38, 
+       38, 38, 38, 1, 39, 39, 39, 39, 
+       39, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 39, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 40, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 32, 1, 33, 1, 34, 
-       1, 34, 34, 34, 34, 34, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       34, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 35, 1, 35, 35, 35, 35, 
-       35, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 35, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 36, 37, 37, 37, 37, 
-       37, 37, 37, 37, 37, 1, 38, 38, 
-       38, 38, 38, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 38, 1, 1, 
+       41, 1, 39, 39, 39, 39, 39, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 39, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 40, 1, 1, 
+       1, 42, 42, 42, 42, 42, 42, 42, 
+       42, 42, 42, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
@@ -208,188 +229,209 @@ static const char _deserialize_json_indicies[] = {
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 41, 1, 
+       43, 44, 1, 45, 1, 45, 45, 45, 
+       45, 45, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 45, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 40, 1, 38, 38, 38, 38, 
-       38, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 38, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 39, 
-       1, 1, 1, 41, 41, 41, 41, 41, 
-       41, 41, 41, 41, 41, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 46, 1, 
+       46, 46, 46, 46, 46, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 46, 
        1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 47, 1, 1, 48, 
+       49, 49, 49, 49, 49, 49, 49, 49, 
+       49, 1, 50, 51, 51, 51, 51, 51, 
+       51, 51, 51, 51, 1, 52, 52, 52, 
+       52, 52, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 52, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
+       53, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       40, 1, 42, 43, 1, 44, 1, 44, 
-       44, 44, 44, 44, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 44, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       45, 1, 45, 45, 45, 45, 45, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 54, 1, 52, 52, 52, 52, 52, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 45, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 46, 1, 
-       1, 47, 48, 48, 48, 48, 48, 48, 
-       48, 48, 48, 1, 49, 50, 50, 50, 
-       50, 50, 50, 50, 50, 50, 1, 51, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 52, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 53, 1, 
+       1, 1, 51, 51, 51, 51, 51, 51, 
        51, 51, 51, 51, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 51, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 52, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 54, 
+       1, 55, 1, 55, 55, 55, 55, 55, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 55, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 53, 1, 51, 51, 51
-       51, 51, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 56, 1, 56, 56
+       56, 56, 56, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 51, 1, 1, 1, 
+       1, 1, 1, 1, 1, 56, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       52, 1, 1, 1, 50, 50, 50, 50, 
-       50, 50, 50, 50, 50, 50, 1, 1, 
+       1, 1, 57, 1, 1, 58, 59, 59, 
+       59, 59, 59, 59, 59, 59, 59, 1, 
+       60, 61, 61, 61, 61, 61, 61, 61, 
+       61, 61, 1, 62, 62, 62, 62, 62, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 62, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 63, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 53, 1, 54, 1, 54, 54, 54, 
-       54, 54, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 54, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 55, 1
-       55, 55, 55, 55, 55, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 64
+       1, 62, 62, 62, 62, 62, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 55, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 56, 1, 1, 57, 
-       58, 58, 58, 58, 58, 58, 58, 58, 
-       58, 1, 59, 60, 60, 60, 60, 60, 
-       60, 60, 60, 60, 1, 61, 61, 61, 
+       62, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 63, 1, 1, 1, 
+       61, 61, 61, 61, 61, 61, 61, 61, 
        61, 61, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 61, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       62, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 64, 1, 65, 
+       1, 65, 65, 65, 65, 65, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
+       65, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 63, 1, 61, 61, 61, 61, 61, 
+       1, 1, 66, 1, 66, 66, 66, 66, 
+       66, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 66, 1, 67, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 61, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 62, 1, 
-       1, 1, 60, 60, 60, 60, 60, 60, 
-       60, 60, 60, 60, 1, 1, 1, 1, 
+       1, 1, 1, 68, 69, 69, 69, 69, 
+       69, 69, 69, 69, 69, 1, 71, 70, 
+       70, 70, 70, 70, 70, 70, 70, 70, 
+       70, 70, 70, 70, 70, 70, 70, 70, 
+       70, 70, 70, 70, 70, 70, 70, 70, 
+       70, 70, 70, 70, 70, 70, 70, 70, 
+       70, 70, 70, 70, 70, 70, 70, 70, 
+       70, 70, 70, 70, 70, 70, 70, 70, 
+       70, 70, 70, 70, 70, 70, 70, 70, 
+       72, 70, 73, 73, 73, 73, 73, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 73, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 74, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 63, 
-       1, 64, 1, 64, 64, 64, 64, 64, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 64, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 65, 1, 65, 65
-       65, 65, 65, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 75, 1
+       70, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 65, 1, 66, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 67, 68, 68, 
-       68, 68, 68, 68, 68, 68, 68, 1, 
-       69, 69, 69, 69, 69, 69, 69, 69, 
-       69, 69, 69, 69, 69, 69, 69, 69, 
-       69, 69, 69, 69, 69, 69, 69, 69, 
-       69, 69, 1, 1, 1, 1, 1, 1, 
-       69, 69, 69, 69, 69, 69, 69, 69, 
-       69, 69, 69, 69, 69, 69, 69, 69, 
-       69, 69, 69, 69, 69, 69, 69, 69, 
-       69, 69, 1, 70, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 71, 71, 
-       1, 71, 71, 71, 71, 71, 71, 71, 
-       71, 71, 71, 1, 1, 1, 1, 1, 
-       1, 1, 71, 71, 71, 71, 71, 71, 
-       71, 71, 71, 71, 71, 71, 71, 71, 
-       71, 71, 71, 71, 71, 71, 71, 71, 
-       71, 71, 71, 71, 1, 1, 1, 1, 
-       71, 1, 71, 71, 71, 71, 71, 71, 
-       71, 71, 71, 71, 71, 71, 71, 71, 
-       71, 71, 71, 71, 71, 71, 71, 71, 
-       71, 71, 71, 71, 1, 72, 72, 72, 
-       72, 72, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 72, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       73, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 70, 1, 76, 76, 76, 76, 
+       76, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 76, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 77, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 74, 1, 72, 72, 72, 72, 72, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 72, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 73, 1, 
-       1, 1, 75, 75, 75, 75, 75, 75, 
-       75, 75, 75, 75, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
+       78, 1, 76, 76, 76, 76, 76, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 76, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 77, 1, 1, 
+       1, 79, 79, 79, 79, 79, 79, 79, 
+       79, 79, 79, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 74, 
-       1, 76, 76, 76, 76, 76, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       76, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 77, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 78, 1, 
+       80, 1, 80, 80, 80, 80, 80, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 80, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 81, 1, 81, 81, 81, 
+       81, 81, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 81, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 82, 83, 83, 83, 
+       83, 83, 83, 83, 83, 83, 1, 76, 
+       76, 76, 76, 76, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 76, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 77, 1, 1, 1, 84, 84, 
+       84, 84, 84, 84, 84, 84, 84, 84, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 78, 1, 85, 85, 85, 
+       85, 85, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 85, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       86, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 78, 1, 0, 
-       0, 0, 0, 0, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 0, 1
+       1, 87, 1, 0, 0, 0, 0, 0
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 0, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
@@ -399,47 +441,51 @@ static const char _deserialize_json_indicies[] = {
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 2, 1, 1, 0
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 2, 1, 1, 
+       0
 };
 
 static const char _deserialize_json_trans_targs[] = {
        1, 0, 2, 2, 3, 4, 18, 24, 
-       37, 5, 12, 6, 7, 8, 9, 11, 
-       9, 11, 10, 2, 44, 10, 44, 13, 
-       14, 15, 16, 17, 16, 17, 10, 2, 
-       44, 19, 20, 21, 22, 23, 10, 2, 
-       44, 23, 25, 31, 26, 27, 28, 29, 
-       30, 29, 30, 10, 2, 44, 32, 33, 
-       34, 35, 36, 35, 36, 10, 2, 44, 
-       38, 39, 40, 42, 43, 41, 10, 41, 
-       10, 2, 44, 43, 44, 45, 46
+       37, 45, 5, 12, 6, 7, 8, 9, 
+       11, 9, 11, 10, 2, 49, 10, 49, 
+       13, 14, 15, 16, 17, 16, 17, 10, 
+       2, 49, 19, 20, 21, 22, 23, 10, 
+       2, 49, 23, 25, 31, 26, 27, 28, 
+       29, 30, 29, 30, 10, 2, 49, 32, 
+       33, 34, 35, 36, 35, 36, 10, 2, 
+       49, 38, 39, 40, 43, 44, 40, 41, 
+       42, 10, 2, 49, 10, 2, 49, 44, 
+       46, 47, 43, 48, 48, 49, 50, 51
 };
 
 static const char _deserialize_json_trans_actions[] = {
        0, 0, 1, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0, 2, 2, 2, 
-       0, 0, 3, 3, 4, 0, 5, 0, 
-       0, 2, 2, 2, 0, 0, 6, 6, 
-       7, 0, 0, 0, 2, 2, 8, 8, 
-       9, 0, 0, 0, 0, 0, 2, 2, 
-       2, 0, 0, 10, 10, 11, 0, 0, 
-       2, 2, 2, 0, 0, 12, 12, 13, 
-       0, 0, 0, 2, 2, 2, 14, 0, 
-       15, 15, 16, 0, 0, 0, 0
+       0, 0, 0, 0, 0, 0, 2, 2, 
+       2, 0, 0, 3, 3, 4, 0, 5, 
+       0, 0, 2, 2, 2, 0, 0, 6, 
+       6, 7, 0, 0, 0, 2, 2, 8, 
+       8, 9, 0, 0, 0, 0, 0, 2, 
+       2, 2, 0, 0, 10, 10, 11, 0, 
+       0, 2, 2, 2, 0, 0, 12, 12, 
+       13, 0, 0, 2, 14, 14, 0, 15, 
+       0, 16, 16, 17, 18, 18, 19, 15, 
+       0, 0, 20, 20, 21, 0, 0, 0
 };
 
 static const int deserialize_json_start = 1;
-static const int deserialize_json_first_final = 44;
+static const int deserialize_json_first_final = 49;
 static const int deserialize_json_error = 0;
 
 static const int deserialize_json_en_main = 1;
 
 
-#line 97 "hb-buffer-deserialize-json.rl"
+#line 108 "hb-buffer-deserialize-json.rl"
 
 
 static hb_bool_t
-_hb_buffer_deserialize_glyphs_json (hb_buffer_t *buffer,
+_hb_buffer_deserialize_json (hb_buffer_t *buffer,
                                    const char *buf,
                                    unsigned int buf_len,
                                    const char **end_ptr,
@@ -462,12 +508,12 @@ _hb_buffer_deserialize_glyphs_json (hb_buffer_t *buffer,
   hb_glyph_info_t info = {0};
   hb_glyph_position_t pos = {0};
   
-#line 466 "hb-buffer-deserialize-json.hh"
+#line 512 "hb-buffer-deserialize-json.hh"
        {
        cs = deserialize_json_start;
        }
 
-#line 471 "hb-buffer-deserialize-json.hh"
+#line 517 "hb-buffer-deserialize-json.hh"
        {
        int _slen;
        int _trans;
@@ -515,41 +561,84 @@ _resume:
        tok = p;
 }
        break;
-       case 14:
+       case 15:
 #line 55 "hb-buffer-deserialize-json.rl"
+       { if (unlikely (!buffer->ensure_glyphs ())) return false; }
+       break;
+       case 21:
+#line 56 "hb-buffer-deserialize-json.rl"
+       { if (unlikely (!buffer->ensure_unicode ())) return false; }
+       break;
+       case 16:
+#line 58 "hb-buffer-deserialize-json.rl"
        {
+       /* TODO Unescape \" and \\ if found. */
        if (!hb_font_glyph_from_string (font,
                                        tok, p - tok,
                                        &info.codepoint))
          return false;
 }
        break;
-       case 15:
-#line 62 "hb-buffer-deserialize-json.rl"
+       case 18:
+#line 66 "hb-buffer-deserialize-json.rl"
        { if (!parse_uint (tok, p, &info.codepoint)) return false; }
        break;
        case 8:
-#line 63 "hb-buffer-deserialize-json.rl"
+#line 67 "hb-buffer-deserialize-json.rl"
        { if (!parse_uint (tok, p, &info.cluster )) return false; }
        break;
        case 10:
-#line 64 "hb-buffer-deserialize-json.rl"
+#line 68 "hb-buffer-deserialize-json.rl"
        { if (!parse_int  (tok, p, &pos.x_offset )) return false; }
        break;
        case 12:
-#line 65 "hb-buffer-deserialize-json.rl"
+#line 69 "hb-buffer-deserialize-json.rl"
        { if (!parse_int  (tok, p, &pos.y_offset )) return false; }
        break;
        case 3:
-#line 66 "hb-buffer-deserialize-json.rl"
+#line 70 "hb-buffer-deserialize-json.rl"
        { if (!parse_int  (tok, p, &pos.x_advance)) return false; }
        break;
        case 6:
-#line 67 "hb-buffer-deserialize-json.rl"
+#line 71 "hb-buffer-deserialize-json.rl"
        { if (!parse_int  (tok, p, &pos.y_advance)) return false; }
        break;
-       case 16:
-#line 62 "hb-buffer-deserialize-json.rl"
+       case 14:
+#line 51 "hb-buffer-deserialize-json.rl"
+       {
+       tok = p;
+}
+#line 55 "hb-buffer-deserialize-json.rl"
+       { if (unlikely (!buffer->ensure_glyphs ())) return false; }
+       break;
+       case 20:
+#line 51 "hb-buffer-deserialize-json.rl"
+       {
+       tok = p;
+}
+#line 56 "hb-buffer-deserialize-json.rl"
+       { if (unlikely (!buffer->ensure_unicode ())) return false; }
+       break;
+       case 17:
+#line 58 "hb-buffer-deserialize-json.rl"
+       {
+       /* TODO Unescape \" and \\ if found. */
+       if (!hb_font_glyph_from_string (font,
+                                       tok, p - tok,
+                                       &info.codepoint))
+         return false;
+}
+#line 43 "hb-buffer-deserialize-json.rl"
+       {
+       buffer->add_info (info);
+       if (unlikely (!buffer->successful))
+         return false;
+       buffer->pos[buffer->len - 1] = pos;
+       *end_ptr = p;
+}
+       break;
+       case 19:
+#line 66 "hb-buffer-deserialize-json.rl"
        { if (!parse_uint (tok, p, &info.codepoint)) return false; }
 #line 43 "hb-buffer-deserialize-json.rl"
        {
@@ -561,7 +650,7 @@ _resume:
 }
        break;
        case 9:
-#line 63 "hb-buffer-deserialize-json.rl"
+#line 67 "hb-buffer-deserialize-json.rl"
        { if (!parse_uint (tok, p, &info.cluster )) return false; }
 #line 43 "hb-buffer-deserialize-json.rl"
        {
@@ -573,7 +662,7 @@ _resume:
 }
        break;
        case 11:
-#line 64 "hb-buffer-deserialize-json.rl"
+#line 68 "hb-buffer-deserialize-json.rl"
        { if (!parse_int  (tok, p, &pos.x_offset )) return false; }
 #line 43 "hb-buffer-deserialize-json.rl"
        {
@@ -585,7 +674,7 @@ _resume:
 }
        break;
        case 13:
-#line 65 "hb-buffer-deserialize-json.rl"
+#line 69 "hb-buffer-deserialize-json.rl"
        { if (!parse_int  (tok, p, &pos.y_offset )) return false; }
 #line 43 "hb-buffer-deserialize-json.rl"
        {
@@ -597,7 +686,7 @@ _resume:
 }
        break;
        case 4:
-#line 66 "hb-buffer-deserialize-json.rl"
+#line 70 "hb-buffer-deserialize-json.rl"
        { if (!parse_int  (tok, p, &pos.x_advance)) return false; }
 #line 43 "hb-buffer-deserialize-json.rl"
        {
@@ -609,7 +698,7 @@ _resume:
 }
        break;
        case 7:
-#line 67 "hb-buffer-deserialize-json.rl"
+#line 71 "hb-buffer-deserialize-json.rl"
        { if (!parse_int  (tok, p, &pos.y_advance)) return false; }
 #line 43 "hb-buffer-deserialize-json.rl"
        {
@@ -620,7 +709,7 @@ _resume:
        *end_ptr = p;
 }
        break;
-#line 624 "hb-buffer-deserialize-json.hh"
+#line 713 "hb-buffer-deserialize-json.hh"
        }
 
 _again:
@@ -632,7 +721,7 @@ _again:
        _out: {}
        }
 
-#line 125 "hb-buffer-deserialize-json.rl"
+#line 136 "hb-buffer-deserialize-json.rl"
 
 
   *end_ptr = p;
index f3abb02..382423f 100644 (file)
@@ -52,14 +52,18 @@ action tok {
        tok = p;
 }
 
-action parse_glyph {
+action ensure_glyphs { if (unlikely (!buffer->ensure_glyphs ())) return false; }
+action ensure_unicode { if (unlikely (!buffer->ensure_unicode ())) return false; }
+
+action parse_glyph_name {
+       /* TODO Unescape \" and \\ if found. */
        if (!hb_font_glyph_from_string (font,
                                        tok, p - tok,
                                        &info.codepoint))
          return false;
 }
 
-action parse_gid       { if (!parse_uint (tok, p, &info.codepoint)) return false; }
+action parse_codepoint { if (!parse_uint (tok, p, &info.codepoint)) return false; }
 action parse_cluster   { if (!parse_uint (tok, p, &info.cluster )) return false; }
 action parse_x_offset  { if (!parse_int  (tok, p, &pos.x_offset )) return false; }
 action parse_y_offset  { if (!parse_int  (tok, p, &pos.y_offset )) return false; }
@@ -72,20 +76,27 @@ num = '-'? unum;
 comma = space* ',' space*;
 colon = space* ':' space*;
 
-glyph_id = unum;
-glyph_name = alpha (alnum|'_'|'.'|'-')*;
+codepoint = unum;
+glyph_name = '"' ([^\\"] | '\\' [\\"])* '"';
 
-glyph_string   = '"' (glyph_name >tok %parse_glyph) '"';
-glyph_number = (glyph_id >tok %parse_gid);
+parse_glyph_name   = (glyph_name >tok %parse_glyph_name);
+parse_codepoint = (codepoint >tok %parse_codepoint);
 
-glyph  = "\"g\""  colon (glyph_string | glyph_number);
+glyph  = "\"g\""  colon (parse_glyph_name | parse_codepoint);
+unicode        = "\"u\""  colon parse_codepoint;
 cluster        = "\"cl\"" colon (unum >tok %parse_cluster);
 xoffset        = "\"dx\"" colon (num >tok %parse_x_offset);
 yoffset        = "\"dy\"" colon (num >tok %parse_y_offset);
 xadvance= "\"ax\"" colon (num >tok %parse_x_advance);
 yadvance= "\"ay\"" colon (num >tok %parse_y_advance);
 
-element = glyph | cluster | xoffset | yoffset | xadvance | yadvance;
+element = glyph @ensure_glyphs
+       | unicode @ensure_unicode
+       | cluster
+       | xoffset
+       | yoffset
+       | xadvance
+       | yadvance;
 item   =
        ( '{' space* element (comma element)* space* '}')
        >clear_item
@@ -97,7 +108,7 @@ main := space* item (comma item)* space* (','|']')?;
 }%%
 
 static hb_bool_t
-_hb_buffer_deserialize_glyphs_json (hb_buffer_t *buffer,
+_hb_buffer_deserialize_json (hb_buffer_t *buffer,
                                    const char *buf,
                                    unsigned int buf_len,
                                    const char **end_ptr,
index 67f0a12..b599e96 100644 (file)
 
 #line 36 "hb-buffer-deserialize-text.hh"
 static const unsigned char _deserialize_text_trans_keys[] = {
-       0u, 0u, 9u, 122u, 45u, 57u, 48u, 57u, 45u, 57u, 48u, 57u, 48u, 57u, 45u, 57u, 
-       48u, 57u, 44u, 44u, 45u, 57u, 48u, 57u, 44u, 57u, 9u, 124u, 9u, 124u, 0u, 0u, 
-       9u, 122u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 
-       9u, 124u, 9u, 124u, 9u, 124u, 0
+       0u, 0u, 9u, 91u, 85u, 85u, 43u, 43u, 48u, 102u, 9u, 85u, 48u, 57u, 45u, 57u, 
+       48u, 57u, 48u, 57u, 45u, 57u, 48u, 57u, 44u, 44u, 45u, 57u, 48u, 57u, 44u, 57u, 
+       43u, 124u, 45u, 57u, 48u, 57u, 9u, 124u, 9u, 124u, 0u, 0u, 9u, 85u, 9u, 124u, 
+       9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 
+       9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 0
 };
 
 static const char _deserialize_text_key_spans[] = {
-       0, 114, 13, 10, 13, 10, 10, 13, 
-       10, 1, 13, 10, 14, 116, 116, 0, 
-       114, 116, 116, 116, 116, 116, 116, 116, 
-       116, 116, 116
+       0, 83, 1, 1, 55, 77, 10, 13, 
+       10, 10, 13, 10, 1, 13, 10, 14, 
+       82, 13, 10, 116, 116, 0, 77, 116, 
+       116, 116, 116, 116, 116, 116, 116, 116, 
+       116, 116, 116, 116, 116
 };
 
 static const short _deserialize_text_index_offsets[] = {
-       0, 0, 115, 129, 140, 154, 165, 176, 
-       190, 201, 203, 217, 228, 243, 360, 477, 
-       478, 593, 710, 827, 944, 1061, 1178, 1295, 
-       1412, 1529, 1646
+       0, 0, 84, 86, 88, 144, 222, 233, 
+       247, 258, 269, 283, 294, 296, 310, 321, 
+       336, 419, 433, 444, 561, 678, 679, 757, 
+       874, 991, 1108, 1225, 1342, 1459, 1576, 1693, 
+       1810, 1927, 2044, 2161, 2278
 };
 
 static const char _deserialize_text_indicies[] = {
@@ -60,263 +63,349 @@ static const char _deserialize_text_indicies[] = {
        1, 1, 1, 1, 1, 1, 1, 1, 
        0, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       2, 3, 3, 3, 3, 3, 3, 3, 
-       3, 3, 1, 1, 1, 1, 1, 1, 
-       1, 4, 4, 4, 4, 4, 4, 4, 
-       4, 4, 4, 4, 4, 4, 4, 4, 
-       4, 4, 4, 4, 4, 4, 4, 4, 
-       4, 4, 4, 1, 1, 1, 1, 1, 
-       1, 4, 4, 4, 4, 4, 4, 4, 
-       4, 4, 4, 4, 4, 4, 4, 4, 
-       4, 4, 4, 4, 4, 4, 4, 4, 
-       4, 4, 4, 1, 5, 1, 1, 6, 
-       7, 7, 7, 7, 7, 7, 7, 7, 
-       7, 1, 8, 9, 9, 9, 9, 9, 
-       9, 9, 9, 9, 1, 10, 1, 1, 
-       11, 12, 12, 12, 12, 12, 12, 12, 
-       12, 12, 1, 13, 14, 14, 14, 14, 
-       14, 14, 14, 14, 14, 1, 15, 16, 
-       16, 16, 16, 16, 16, 16, 16, 16, 
-       1, 17, 1, 1, 18, 19, 19, 19, 
-       19, 19, 19, 19, 19, 19, 1, 20, 
-       21, 21, 21, 21, 21, 21, 21, 21, 
-       21, 1, 22, 1, 23, 1, 1, 24, 
-       25, 25, 25, 25, 25, 25, 25, 25, 
-       25, 1, 26, 27, 27, 27, 27, 27, 
-       27, 27, 27, 27, 1, 22, 1, 1, 
-       1, 21, 21, 21, 21, 21, 21, 21, 
-       21, 21, 21, 1, 28, 28, 28, 28, 
-       28, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 28, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 29, 1, 
+       1, 1, 1, 1, 2, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       30, 1, 1, 31, 1, 1, 1, 1, 
+       1, 1, 1, 3, 1, 4, 1, 5, 
+       1, 6, 6, 6, 6, 6, 6, 6, 
+       6, 6, 6, 1, 1, 1, 1, 1, 
+       1, 1, 6, 6, 6, 6, 6, 6, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       32, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 6, 6, 6, 6, 6, 6, 
+       1, 7, 7, 7, 7, 7, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 33, 
-       1, 34, 34, 34, 34, 34, 1, 1, 
+       7, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       34, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 4, 1, 8, 
+       9, 9, 9, 9, 9, 9, 9, 9, 
+       9, 1, 10, 1, 1, 11, 12, 12, 
+       12, 12, 12, 12, 12, 12, 12, 1, 
+       13, 14, 14, 14, 14, 14, 14, 14, 
+       14, 14, 1, 15, 16, 16, 16, 16, 
+       16, 16, 16, 16, 16, 1, 17, 1, 
+       1, 18, 19, 19, 19, 19, 19, 19, 
+       19, 19, 19, 1, 20, 21, 21, 21, 
+       21, 21, 21, 21, 21, 21, 1, 22, 
+       1, 23, 1, 1, 24, 25, 25, 25, 
+       25, 25, 25, 25, 25, 25, 1, 26, 
+       27, 27, 27, 27, 27, 27, 27, 27, 
+       27, 1, 22, 1, 1, 1, 21, 21, 
+       21, 21, 21, 21, 21, 21, 21, 21, 
+       1, 28, 28, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 28, 1, 1, 28, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 35, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 28, 28, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 36, 1, 1, 0, 
-       0, 0, 0, 0, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 0, 1, 
+       1, 1, 28, 1, 29, 1, 1, 30, 
+       31, 31, 31, 31, 31, 31, 31, 31, 
+       31, 1, 32, 33, 33, 33, 33, 33, 
+       33, 33, 33, 33, 1, 34, 34, 34, 
+       34, 34, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 2, 3, 
-       3, 3, 3, 3, 3, 3, 3, 3, 
-       1, 1, 1, 1, 1, 1, 1, 4, 
-       4, 4, 4, 4, 4, 4, 4, 4, 
-       4, 4, 4, 4, 4, 4, 4, 4, 
-       4, 4, 4, 4, 4, 4, 4, 4, 
-       4, 1, 1, 1, 1, 1, 1, 4, 
-       4, 4, 4, 4, 4, 4, 4, 4, 
-       4, 4, 4, 4, 4, 4, 4, 4, 
-       4, 4, 4, 4, 4, 4, 4, 4, 
-       4, 1, 28, 28, 28, 28, 28, 1, 
+       1, 1, 1, 1, 34, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 35, 35, 35, 35, 
+       35, 35, 35, 35, 35, 35, 1, 1, 
+       1, 36, 37, 1, 1, 35, 35, 35, 
+       35, 35, 35, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 28, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 29, 1, 1, 1, 
-       1, 37, 37, 37, 37, 37, 37, 37, 
-       37, 37, 37, 1, 1, 1, 30, 1, 
-       1, 31, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 35, 35, 35, 
+       35, 35, 35, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 32, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
+       38, 1, 39, 39, 39, 39, 39, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 33, 1, 38, 
-       38, 38, 38, 38, 1, 1, 1, 1, 
+       1, 39, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 38, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 39, 1, 1, 1, 1, 1
+       1, 1, 1, 1, 1, 1, 1, 40
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 40, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 41, 1, 1, 
+       7, 7, 7, 7, 7, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 7, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 4, 1, 42, 42, 
+       42, 42, 42, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 42, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 43, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 41, 1, 42, 42, 42, 42, 
-       42, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 42, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 44, 1, 42, 42, 42, 42, 42, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 42, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 45, 45, 45, 45, 45, 45, 
+       45, 45, 45, 45, 1, 1, 1, 1, 
        43, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 44, 
-       1, 42, 42, 42, 42, 42, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       42, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       14, 14, 14, 14, 14, 14, 14, 14, 
-       14, 14, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 44, 1, 
+       47, 47, 47, 47, 47, 46, 46, 46, 
+       46, 46, 46, 46, 46, 46, 46, 46, 
+       46, 46, 46, 46, 46, 46, 46, 47, 
+       46, 46, 46, 46, 46, 46, 46, 46, 
+       46, 46, 48, 1, 46, 46, 46, 46, 
+       46, 46, 46, 46, 46, 46, 46, 46, 
+       46, 46, 46, 46, 49, 46, 46, 50, 
+       46, 46, 46, 46, 46, 46, 46, 46, 
+       46, 46, 46, 46, 46, 46, 46, 46, 
+       46, 46, 46, 46, 46, 46, 46, 46, 
+       46, 46, 46, 51, 52, 46, 46, 46, 
+       46, 46, 46, 46, 46, 46, 46, 46, 
+       46, 46, 46, 46, 46, 46, 46, 46, 
+       46, 46, 46, 46, 46, 46, 46, 46, 
+       46, 46, 46, 53, 46, 54, 54, 54, 
+       54, 54, 28, 28, 28, 28, 28, 28, 
+       28, 28, 28, 28, 28, 28, 28, 28, 
+       28, 28, 28, 28, 54, 28, 28, 28, 
+       28, 28, 28, 28, 28, 28, 28, 55, 
+       1, 28, 28, 28, 28, 28, 28, 28, 
+       28, 28, 28, 28, 28, 28, 28, 28, 
+       28, 56, 28, 28, 57, 28, 28, 28, 
+       28, 28, 28, 28, 28, 28, 28, 28, 
+       28, 28, 28, 28, 28, 28, 28, 28, 
+       28, 28, 28, 28, 28, 28, 28, 28, 
+       58, 59, 28, 28, 28, 28, 28, 28, 
+       28, 28, 28, 28, 28, 28, 28, 28, 
+       28, 28, 28, 28, 28, 28, 28, 28, 
+       28, 28, 28, 28, 28, 28, 28, 28, 
+       60, 28, 61, 61, 61, 61, 61, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 61, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 62, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 63, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 64, 1, 65, 
+       65, 65, 65, 65, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 65, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 40, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 66, 1, 67, 67, 67, 67, 
+       67, 46, 46, 46, 46, 46, 46, 46, 
+       46, 46, 46, 46, 46, 46, 46, 46, 
+       46, 46, 46, 67, 46, 46, 46, 46, 
+       46, 46, 46, 46, 46, 46, 48, 1, 
+       46, 46, 46, 46, 46, 46, 46, 46, 
+       46, 46, 46, 46, 46, 46, 46, 46, 
+       49, 46, 46, 50, 46, 46, 46, 46, 
+       46, 46, 46, 46, 46, 46, 46, 46, 
+       46, 46, 46, 46, 46, 46, 46, 46, 
+       46, 46, 46, 46, 46, 46, 46, 51, 
+       52, 46, 46, 46, 46, 46, 46, 46, 
+       46, 46, 46, 46, 46, 46, 46, 46, 
+       46, 46, 46, 46, 46, 46, 46, 46, 
+       46, 46, 46, 46, 46, 46, 46, 53, 
+       46, 68, 68, 68, 68, 68, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       68, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 69, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       70, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 43, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 44, 1, 38, 38, 
-       38, 38, 38, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 71, 1, 72, 72, 
+       72, 72, 72, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 72, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
+       73, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 38, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 39, 1, 1, 1, 9, 9, 9, 
-       9, 9, 9, 9, 9, 9, 9, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 74, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 40, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 75, 1, 72, 72, 72, 72, 72, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 41, 1, 45, 45, 45, 45, 45, 
+       1, 1, 72, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 73, 1, 1, 
+       1, 1, 27, 27, 27, 27, 27, 27, 
+       27, 27, 27, 27, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 45, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 46, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 74, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 47, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 48, 
+       1, 1, 1, 1, 1, 1, 75, 1, 
+       68, 68, 68, 68, 68, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 1, 1, 68, 
        1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 69, 1, 1, 1, 1, 76, 
+       76, 76, 76, 76, 76, 76, 76, 76, 
+       76, 1, 1, 1, 1, 1, 1, 70, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 49, 1, 
-       50, 50, 50, 50, 50, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 50, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 51, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 43, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 71, 1, 77, 77, 77, 
+       77, 77, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 1, 77, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 52, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 53, 1, 50, 50, 50, 
-       50, 50, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 50, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 51, 
-       1, 1, 1, 1, 27, 27, 27, 27, 
-       27, 27, 27, 27, 27, 27, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 78, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 52, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
+       79, 1, 77, 77, 77, 77, 77, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       53, 1, 45, 45, 45, 45, 45, 1, 
+       1, 77, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 33, 33, 33, 33, 33, 33, 33, 
+       33, 33, 33, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 45, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 46, 1, 1, 1, 
-       1, 54, 54, 54, 54, 54, 54, 54, 
-       54, 54, 54, 1, 1, 1, 1, 1, 
-       1, 47, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 48, 1, 
+       1, 1, 1, 1, 1, 1, 78, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 49, 1, 28
-       28, 28, 28, 28, 1, 1, 1, 1, 
+       1, 1, 1, 1, 1, 79, 1, 61
+       61, 61, 61, 61, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 28, 1, 
+       1, 1, 1, 1, 1, 1, 61, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 29, 1, 55, 55, 1, 55, 55
-       55, 55, 55, 55, 55, 55, 55, 55
-       1, 1, 1, 30, 1, 1, 31, 55
-       55, 55, 55, 55, 55, 55, 55, 55
-       55, 55, 55, 55, 55, 55, 55, 55
-       55, 55, 55, 55, 55, 55, 55, 55
-       55, 1, 1, 32, 1, 55, 1, 55
-       55, 55, 55, 55, 55, 55, 55, 55
-       55, 55, 55, 55, 55, 55, 55, 55
-       55, 55, 55, 55, 55, 55, 55, 55
-       55, 1, 33, 1, 0
+       1, 1, 62, 1, 1, 1, 14, 14
+       14, 14, 14, 14, 14, 14, 14, 14
+       1, 1, 1, 1, 1, 1, 1, 1
+       1, 1, 1, 1, 1, 1, 1, 1
+       1, 1, 1, 1, 1, 1, 1, 1
+       1, 1, 1, 1, 1, 1, 1, 1
+       1, 1, 1, 63, 1, 1, 1, 1
+       1, 1, 1, 1, 1, 1, 1, 1
+       1, 1, 1, 1, 1, 1, 1, 1
+       1, 1, 1, 1, 1, 1, 1, 1
+       1, 1, 64, 1, 0
 };
 
 static const char _deserialize_text_trans_targs[] = {
-       1, 0, 13, 17, 26, 3, 18, 21, 
-       18, 21, 5, 19, 20, 19, 20, 22, 
-       25, 8, 9, 12, 9, 12, 10, 11, 
-       23, 24, 23, 24, 14, 2, 6, 7, 
-       15, 16, 14, 15, 16, 17, 14, 4, 
-       15, 16, 14, 15, 16, 14, 2, 7, 
-       15, 16, 14, 2, 15, 16, 25, 26
+       1, 0, 2, 25, 3, 4, 19, 5, 
+       23, 24, 8, 27, 36, 27, 36, 30, 
+       33, 11, 12, 15, 12, 15, 13, 14, 
+       31, 32, 31, 32, 26, 18, 34, 35, 
+       34, 35, 20, 19, 6, 21, 22, 20, 
+       21, 22, 20, 21, 22, 24, 26, 26, 
+       7, 9, 10, 16, 21, 29, 26, 7, 
+       9, 10, 16, 21, 29, 28, 17, 21, 
+       29, 28, 29, 29, 28, 7, 10, 29, 
+       28, 7, 21, 29, 33, 28, 21, 29
 };
 
 static const char _deserialize_text_trans_actions[] = {
-       0, 0, 1, 1, 1, 2, 2, 2, 
-       0, 0, 2, 2, 2, 0, 0, 2, 
-       2, 2, 2, 2, 0, 0, 3, 2, 
-       2, 2, 0, 0, 4, 5, 5, 5, 
-       4, 4, 0, 0, 0, 0, 6, 7, 
-       6, 6, 8, 8, 8, 9, 10, 10, 
-       9, 9, 11, 12, 11, 11, 0, 0
+       0, 0, 0, 0, 1, 0, 2, 0, 
+       2, 2, 3, 4, 4, 5, 5, 4, 
+       4, 3, 3, 3, 0, 0, 6, 3, 
+       4, 4, 5, 5, 5, 3, 4, 4, 
+       5, 5, 7, 8, 9, 7, 7, 0, 
+       0, 0, 10, 10, 10, 8, 12, 13, 
+       14, 14, 14, 15, 11, 11, 17, 18, 
+       18, 18, 0, 16, 16, 19, 20, 19, 
+       19, 0, 0, 13, 10, 21, 21, 10, 
+       22, 23, 22, 22, 5, 24, 24, 24
 };
 
 static const char _deserialize_text_eof_actions[] = {
        0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0, 4, 0, 0, 
-       0, 4, 6, 8, 8, 6, 9, 11, 
-       11, 9, 4
+       0, 0, 0, 0, 0, 0, 0, 0, 
+       0, 0, 0, 7, 0, 0, 0, 10, 
+       10, 11, 16, 19, 0, 11, 10, 22, 
+       22, 10, 24, 24, 19
 };
 
 static const int deserialize_text_start = 1;
-static const int deserialize_text_first_final = 13;
+static const int deserialize_text_first_final = 19;
 static const int deserialize_text_error = 0;
 
 static const int deserialize_text_en_main = 1;
 
 
-#line 91 "hb-buffer-deserialize-text.rl"
+#line 114 "hb-buffer-deserialize-text.rl"
 
 
 static hb_bool_t
-_hb_buffer_deserialize_glyphs_text (hb_buffer_t *buffer,
+_hb_buffer_deserialize_text (hb_buffer_t *buffer,
                                    const char *buf,
                                    unsigned int buf_len,
                                    const char **end_ptr,
@@ -329,22 +418,18 @@ _hb_buffer_deserialize_glyphs_text (hb_buffer_t *buffer,
 
   while (p < pe && ISSPACE (*p))
     p++;
-  if (p < pe && *p == (buffer->len ? '|' : '['))
-  {
-    *end_ptr = ++p;
-  }
 
   const char *eof = pe, *tok = nullptr;
   int cs;
   hb_glyph_info_t info = {0};
   hb_glyph_position_t pos = {0};
   
-#line 343 "hb-buffer-deserialize-text.hh"
+#line 428 "hb-buffer-deserialize-text.hh"
        {
        cs = deserialize_text_start;
        }
 
-#line 348 "hb-buffer-deserialize-text.hh"
+#line 433 "hb-buffer-deserialize-text.hh"
        {
        int _slen;
        int _trans;
@@ -369,7 +454,14 @@ _resume:
                goto _again;
 
        switch ( _deserialize_text_trans_actions[_trans] ) {
-       case 2:
+       case 1:
+#line 38 "hb-buffer-deserialize-text.rl"
+       {
+       memset (&info, 0, sizeof (info));
+       memset (&pos , 0, sizeof (pos ));
+}
+       break;
+       case 3:
 #line 51 "hb-buffer-deserialize-text.rl"
        {
        tok = p;
@@ -377,30 +469,43 @@ _resume:
        break;
        case 5:
 #line 55 "hb-buffer-deserialize-text.rl"
+       { if (unlikely (!buffer->ensure_glyphs ())) return false; }
+       break;
+       case 8:
+#line 56 "hb-buffer-deserialize-text.rl"
+       { if (unlikely (!buffer->ensure_unicode ())) return false; }
+       break;
+       case 18:
+#line 58 "hb-buffer-deserialize-text.rl"
        {
+       /* TODO Unescape delimeters. */
        if (!hb_font_glyph_from_string (font,
                                        tok, p - tok,
                                        &info.codepoint))
          return false;
 }
        break;
-       case 10:
-#line 62 "hb-buffer-deserialize-text.rl"
+       case 9:
+#line 66 "hb-buffer-deserialize-text.rl"
+       {if (!parse_hex (tok, p, &info.codepoint )) return false; }
+       break;
+       case 21:
+#line 68 "hb-buffer-deserialize-text.rl"
        { if (!parse_uint (tok, p, &info.cluster )) return false; }
        break;
-       case 3:
-#line 63 "hb-buffer-deserialize-text.rl"
+       case 6:
+#line 69 "hb-buffer-deserialize-text.rl"
        { if (!parse_int  (tok, p, &pos.x_offset )) return false; }
        break;
-       case 12:
-#line 64 "hb-buffer-deserialize-text.rl"
+       case 23:
+#line 70 "hb-buffer-deserialize-text.rl"
        { if (!parse_int  (tok, p, &pos.y_offset )) return false; }
        break;
-       case 7:
-#line 65 "hb-buffer-deserialize-text.rl"
+       case 20:
+#line 71 "hb-buffer-deserialize-text.rl"
        { if (!parse_int  (tok, p, &pos.x_advance)) return false; }
        break;
-       case 1:
+       case 15:
 #line 38 "hb-buffer-deserialize-text.rl"
        {
        memset (&info, 0, sizeof (info));
@@ -412,8 +517,25 @@ _resume:
 }
        break;
        case 4:
+#line 51 "hb-buffer-deserialize-text.rl"
+       {
+       tok = p;
+}
 #line 55 "hb-buffer-deserialize-text.rl"
+       { if (unlikely (!buffer->ensure_glyphs ())) return false; }
+       break;
+       case 2:
+#line 51 "hb-buffer-deserialize-text.rl"
        {
+       tok = p;
+}
+#line 56 "hb-buffer-deserialize-text.rl"
+       { if (unlikely (!buffer->ensure_unicode ())) return false; }
+       break;
+       case 16:
+#line 58 "hb-buffer-deserialize-text.rl"
+       {
+       /* TODO Unescape delimeters. */
        if (!hb_font_glyph_from_string (font,
                                        tok, p - tok,
                                        &info.codepoint))
@@ -428,8 +550,20 @@ _resume:
        *end_ptr = p;
 }
        break;
-       case 9:
-#line 62 "hb-buffer-deserialize-text.rl"
+       case 7:
+#line 66 "hb-buffer-deserialize-text.rl"
+       {if (!parse_hex (tok, p, &info.codepoint )) return false; }
+#line 43 "hb-buffer-deserialize-text.rl"
+       {
+       buffer->add_info (info);
+       if (unlikely (!buffer->successful))
+         return false;
+       buffer->pos[buffer->len - 1] = pos;
+       *end_ptr = p;
+}
+       break;
+       case 10:
+#line 68 "hb-buffer-deserialize-text.rl"
        { if (!parse_uint (tok, p, &info.cluster )) return false; }
 #line 43 "hb-buffer-deserialize-text.rl"
        {
@@ -440,8 +574,8 @@ _resume:
        *end_ptr = p;
 }
        break;
-       case 11:
-#line 64 "hb-buffer-deserialize-text.rl"
+       case 22:
+#line 70 "hb-buffer-deserialize-text.rl"
        { if (!parse_int  (tok, p, &pos.y_offset )) return false; }
 #line 43 "hb-buffer-deserialize-text.rl"
        {
@@ -452,8 +586,8 @@ _resume:
        *end_ptr = p;
 }
        break;
-       case 6:
-#line 65 "hb-buffer-deserialize-text.rl"
+       case 19:
+#line 71 "hb-buffer-deserialize-text.rl"
        { if (!parse_int  (tok, p, &pos.x_advance)) return false; }
 #line 43 "hb-buffer-deserialize-text.rl"
        {
@@ -464,8 +598,8 @@ _resume:
        *end_ptr = p;
 }
        break;
-       case 8:
-#line 66 "hb-buffer-deserialize-text.rl"
+       case 24:
+#line 72 "hb-buffer-deserialize-text.rl"
        { if (!parse_int  (tok, p, &pos.y_advance)) return false; }
 #line 43 "hb-buffer-deserialize-text.rl"
        {
@@ -476,7 +610,115 @@ _resume:
        *end_ptr = p;
 }
        break;
-#line 480 "hb-buffer-deserialize-text.hh"
+       case 12:
+#line 38 "hb-buffer-deserialize-text.rl"
+       {
+       memset (&info, 0, sizeof (info));
+       memset (&pos , 0, sizeof (pos ));
+}
+#line 51 "hb-buffer-deserialize-text.rl"
+       {
+       tok = p;
+}
+#line 55 "hb-buffer-deserialize-text.rl"
+       { if (unlikely (!buffer->ensure_glyphs ())) return false; }
+       break;
+       case 14:
+#line 38 "hb-buffer-deserialize-text.rl"
+       {
+       memset (&info, 0, sizeof (info));
+       memset (&pos , 0, sizeof (pos ));
+}
+#line 51 "hb-buffer-deserialize-text.rl"
+       {
+       tok = p;
+}
+#line 58 "hb-buffer-deserialize-text.rl"
+       {
+       /* TODO Unescape delimeters. */
+       if (!hb_font_glyph_from_string (font,
+                                       tok, p - tok,
+                                       &info.codepoint))
+         return false;
+}
+       break;
+       case 17:
+#line 58 "hb-buffer-deserialize-text.rl"
+       {
+       /* TODO Unescape delimeters. */
+       if (!hb_font_glyph_from_string (font,
+                                       tok, p - tok,
+                                       &info.codepoint))
+         return false;
+}
+#line 55 "hb-buffer-deserialize-text.rl"
+       { if (unlikely (!buffer->ensure_glyphs ())) return false; }
+#line 43 "hb-buffer-deserialize-text.rl"
+       {
+       buffer->add_info (info);
+       if (unlikely (!buffer->successful))
+         return false;
+       buffer->pos[buffer->len - 1] = pos;
+       *end_ptr = p;
+}
+       break;
+       case 11:
+#line 38 "hb-buffer-deserialize-text.rl"
+       {
+       memset (&info, 0, sizeof (info));
+       memset (&pos , 0, sizeof (pos ));
+}
+#line 51 "hb-buffer-deserialize-text.rl"
+       {
+       tok = p;
+}
+#line 58 "hb-buffer-deserialize-text.rl"
+       {
+       /* TODO Unescape delimeters. */
+       if (!hb_font_glyph_from_string (font,
+                                       tok, p - tok,
+                                       &info.codepoint))
+         return false;
+}
+#line 43 "hb-buffer-deserialize-text.rl"
+       {
+       buffer->add_info (info);
+       if (unlikely (!buffer->successful))
+         return false;
+       buffer->pos[buffer->len - 1] = pos;
+       *end_ptr = p;
+}
+       break;
+       case 13:
+#line 38 "hb-buffer-deserialize-text.rl"
+       {
+       memset (&info, 0, sizeof (info));
+       memset (&pos , 0, sizeof (pos ));
+}
+#line 51 "hb-buffer-deserialize-text.rl"
+       {
+       tok = p;
+}
+#line 58 "hb-buffer-deserialize-text.rl"
+       {
+       /* TODO Unescape delimeters. */
+       if (!hb_font_glyph_from_string (font,
+                                       tok, p - tok,
+                                       &info.codepoint))
+         return false;
+}
+#line 55 "hb-buffer-deserialize-text.rl"
+       { if (unlikely (!buffer->ensure_glyphs ())) return false; }
+#line 43 "hb-buffer-deserialize-text.rl"
+       {
+       buffer->add_info (info);
+       if (unlikely (!buffer->successful))
+         return false;
+       buffer->pos[buffer->len - 1] = pos;
+       *end_ptr = p;
+}
+       break;
+#line 722 "hb-buffer-deserialize-text.hh"
        }
 
 _again:
@@ -488,9 +730,10 @@ _again:
        if ( p == eof )
        {
        switch ( _deserialize_text_eof_actions[cs] ) {
-       case 4:
-#line 55 "hb-buffer-deserialize-text.rl"
+       case 16:
+#line 58 "hb-buffer-deserialize-text.rl"
        {
+       /* TODO Unescape delimeters. */
        if (!hb_font_glyph_from_string (font,
                                        tok, p - tok,
                                        &info.codepoint))
@@ -505,8 +748,20 @@ _again:
        *end_ptr = p;
 }
        break;
-       case 9:
-#line 62 "hb-buffer-deserialize-text.rl"
+       case 7:
+#line 66 "hb-buffer-deserialize-text.rl"
+       {if (!parse_hex (tok, p, &info.codepoint )) return false; }
+#line 43 "hb-buffer-deserialize-text.rl"
+       {
+       buffer->add_info (info);
+       if (unlikely (!buffer->successful))
+         return false;
+       buffer->pos[buffer->len - 1] = pos;
+       *end_ptr = p;
+}
+       break;
+       case 10:
+#line 68 "hb-buffer-deserialize-text.rl"
        { if (!parse_uint (tok, p, &info.cluster )) return false; }
 #line 43 "hb-buffer-deserialize-text.rl"
        {
@@ -517,8 +772,8 @@ _again:
        *end_ptr = p;
 }
        break;
-       case 11:
-#line 64 "hb-buffer-deserialize-text.rl"
+       case 22:
+#line 70 "hb-buffer-deserialize-text.rl"
        { if (!parse_int  (tok, p, &pos.y_offset )) return false; }
 #line 43 "hb-buffer-deserialize-text.rl"
        {
@@ -529,8 +784,8 @@ _again:
        *end_ptr = p;
 }
        break;
-       case 6:
-#line 65 "hb-buffer-deserialize-text.rl"
+       case 19:
+#line 71 "hb-buffer-deserialize-text.rl"
        { if (!parse_int  (tok, p, &pos.x_advance)) return false; }
 #line 43 "hb-buffer-deserialize-text.rl"
        {
@@ -541,8 +796,8 @@ _again:
        *end_ptr = p;
 }
        break;
-       case 8:
-#line 66 "hb-buffer-deserialize-text.rl"
+       case 24:
+#line 72 "hb-buffer-deserialize-text.rl"
        { if (!parse_int  (tok, p, &pos.y_advance)) return false; }
 #line 43 "hb-buffer-deserialize-text.rl"
        {
@@ -553,14 +808,41 @@ _again:
        *end_ptr = p;
 }
        break;
-#line 557 "hb-buffer-deserialize-text.hh"
+       case 11:
+#line 38 "hb-buffer-deserialize-text.rl"
+       {
+       memset (&info, 0, sizeof (info));
+       memset (&pos , 0, sizeof (pos ));
+}
+#line 51 "hb-buffer-deserialize-text.rl"
+       {
+       tok = p;
+}
+#line 58 "hb-buffer-deserialize-text.rl"
+       {
+       /* TODO Unescape delimeters. */
+       if (!hb_font_glyph_from_string (font,
+                                       tok, p - tok,
+                                       &info.codepoint))
+         return false;
+}
+#line 43 "hb-buffer-deserialize-text.rl"
+       {
+       buffer->add_info (info);
+       if (unlikely (!buffer->successful))
+         return false;
+       buffer->pos[buffer->len - 1] = pos;
+       *end_ptr = p;
+}
+       break;
+#line 839 "hb-buffer-deserialize-text.hh"
        }
        }
 
        _out: {}
        }
 
-#line 119 "hb-buffer-deserialize-text.rl"
+#line 138 "hb-buffer-deserialize-text.rl"
 
 
   *end_ptr = p;
index 6268a6c..a217028 100644 (file)
@@ -52,30 +52,37 @@ action tok {
        tok = p;
 }
 
+action ensure_glyphs { if (unlikely (!buffer->ensure_glyphs ())) return false; }
+action ensure_unicode { if (unlikely (!buffer->ensure_unicode ())) return false; }
+
 action parse_glyph {
+       /* TODO Unescape delimeters. */
        if (!hb_font_glyph_from_string (font,
                                        tok, p - tok,
                                        &info.codepoint))
          return false;
 }
 
+action parse_hexdigits  {if (!parse_hex (tok, p, &info.codepoint )) return false; }
+
 action parse_cluster   { if (!parse_uint (tok, p, &info.cluster )) return false; }
 action parse_x_offset  { if (!parse_int  (tok, p, &pos.x_offset )) return false; }
 action parse_y_offset  { if (!parse_int  (tok, p, &pos.y_offset )) return false; }
 action parse_x_advance { if (!parse_int  (tok, p, &pos.x_advance)) return false; }
 action parse_y_advance { if (!parse_int  (tok, p, &pos.y_advance)) return false; }
 
-unum   = '0' | [1-9] digit*;
+unum  = '0' | [1-9] digit*;
 num    = '-'? unum;
 
 glyph_id = unum;
-glyph_name = alpha (alnum|'_'|'.'|'-')*;
+glyph_name = ([^\\\]=@+,|] | '\\' [\\\]=@+,|]) *;
 
 glyph  = (glyph_id | glyph_name) >tok %parse_glyph;
 cluster        = '=' (unum >tok %parse_cluster);
 offsets        = '@' (num >tok %parse_x_offset)   ',' (num >tok %parse_y_offset );
 advances= '+' (num >tok %parse_x_advance) (',' (num >tok %parse_y_advance))?;
-item   =
+
+glyph_item     =
        (
                glyph
                cluster?
@@ -83,15 +90,31 @@ item        =
                advances?
        )
        >clear_item
+       @ensure_glyphs
+       %add_item
+       ;
+
+unicode = 'U' '+' xdigit+ >tok %parse_hexdigits;
+
+unicode_item   =
+       (
+               unicode
+               cluster?
+       )
+       >clear_item
+       @ensure_unicode
        %add_item
        ;
 
-main := space* item (space* '|' space* item)* space* ('|'|']')?;
+glyphs = glyph_item (space* '|' space* glyph_item)* space* ('|'|']')?;
+unicodes = unicode_item (space* '|' space* unicode_item)* space* ('|'|'>')?;
+
+main := space* ( ('[' glyphs) | ('<' unicodes) );
 
 }%%
 
 static hb_bool_t
-_hb_buffer_deserialize_glyphs_text (hb_buffer_t *buffer,
+_hb_buffer_deserialize_text (hb_buffer_t *buffer,
                                    const char *buf,
                                    unsigned int buf_len,
                                    const char **end_ptr,
@@ -104,10 +127,6 @@ _hb_buffer_deserialize_glyphs_text (hb_buffer_t *buffer,
 
   while (p < pe && ISSPACE (*p))
     p++;
-  if (p < pe && *p == (buffer->len ? '|' : '['))
-  {
-    *end_ptr = ++p;
-  }
 
   const char *eof = pe, *tok = nullptr;
   int cs;
index e64eb0e..6539b89 100644 (file)
@@ -91,26 +91,26 @@ hb_buffer_serialize_format_to_string (hb_buffer_serialize_format_t format)
 {
   switch ((unsigned) format)
   {
-    case HB_BUFFER_SERIALIZE_FORMAT_TEXT:      return serialize_formats[0];
-    case HB_BUFFER_SERIALIZE_FORMAT_JSON:      return serialize_formats[1];
+    case HB_BUFFER_SERIALIZE_FORMAT_TEXT: return serialize_formats[0];
+    case HB_BUFFER_SERIALIZE_FORMAT_JSON: return serialize_formats[1];
     default:
-    case HB_BUFFER_SERIALIZE_FORMAT_INVALID:   return nullptr;
+    case HB_BUFFER_SERIALIZE_FORMAT_INVALID:  return nullptr;
   }
 }
 
 static unsigned int
 _hb_buffer_serialize_glyphs_json (hb_buffer_t *buffer,
-                                 unsigned int start,
-                                 unsigned int end,
-                                 char *buf,
-                                 unsigned int buf_size,
-                                 unsigned int *buf_consumed,
-                                 hb_font_t *font,
-                                 hb_buffer_serialize_flags_t flags)
+                                  unsigned int start,
+                                  unsigned int end,
+                                  char *buf,
+                                  unsigned int buf_size,
+                                  unsigned int *buf_consumed,
+                                  hb_font_t *font,
+                                  hb_buffer_serialize_flags_t flags)
 {
   hb_glyph_info_t *info = hb_buffer_get_glyph_infos (buffer, nullptr);
   hb_glyph_position_t *pos = (flags & HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS) ?
-                            nullptr : hb_buffer_get_glyph_positions (buffer, nullptr);
+                             nullptr : hb_buffer_get_glyph_positions (buffer, nullptr);
 
   *buf_consumed = 0;
   hb_position_t x = 0, y = 0;
@@ -125,6 +125,8 @@ _hb_buffer_serialize_glyphs_json (hb_buffer_t *buffer,
 
     if (i)
       *p++ = ',';
+    else
+      *p++ = '[';
 
     *p++ = '{';
 
@@ -134,8 +136,9 @@ _hb_buffer_serialize_glyphs_json (hb_buffer_t *buffer,
       char g[128];
       hb_font_glyph_to_string (font, info[i].codepoint, g, sizeof (g));
       *p++ = '"';
-      for (char *q = g; *q; q++) {
-       if (*q == '"')
+      for (char *q = g; *q; q++)
+      {
+       if (unlikely (*q == '"' || *q == '\\'))
          *p++ = '\\';
        *p++ = *q;
       }
@@ -151,16 +154,16 @@ _hb_buffer_serialize_glyphs_json (hb_buffer_t *buffer,
     if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS))
     {
       p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"dx\":%d,\"dy\":%d",
-                            x+pos[i].x_offset, y+pos[i].y_offset));
+                  x+pos[i].x_offset, y+pos[i].y_offset));
       if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES))
-       p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"ax\":%d,\"ay\":%d",
-                              pos[i].x_advance, pos[i].y_advance));
+        p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"ax\":%d,\"ay\":%d",
+                    pos[i].x_advance, pos[i].y_advance));
     }
 
     if (flags & HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS)
     {
       if (info[i].mask & HB_GLYPH_FLAG_DEFINED)
-       p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"fl\":%u", info[i].mask & HB_GLYPH_FLAG_DEFINED));
+        p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"fl\":%u", info[i].mask & HB_GLYPH_FLAG_DEFINED));
     }
 
     if (flags & HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS)
@@ -168,12 +171,14 @@ _hb_buffer_serialize_glyphs_json (hb_buffer_t *buffer,
       hb_glyph_extents_t extents;
       hb_font_get_glyph_extents(font, info[i].codepoint, &extents);
       p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"xb\":%d,\"yb\":%d",
-               extents.x_bearing, extents.y_bearing));
+                                extents.x_bearing, extents.y_bearing));
       p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"w\":%d,\"h\":%d",
-               extents.width, extents.height));
+                                extents.width, extents.height));
     }
 
     *p++ = '}';
+    if (i == end-1)
+      *p++ = ']';
 
     unsigned int l = p - b;
     if (buf_size > l)
@@ -197,18 +202,71 @@ _hb_buffer_serialize_glyphs_json (hb_buffer_t *buffer,
 }
 
 static unsigned int
+_hb_buffer_serialize_unicode_json (hb_buffer_t *buffer,
+          unsigned int start,
+          unsigned int end,
+          char *buf,
+          unsigned int buf_size,
+          unsigned int *buf_consumed,
+          hb_buffer_serialize_flags_t flags)
+{
+  hb_glyph_info_t *info = hb_buffer_get_glyph_infos (buffer, nullptr);
+
+  *buf_consumed = 0;
+  for (unsigned int i = start; i < end; i++)
+  {
+    char b[1024];
+    char *p = b;
+
+    if (i)
+      *p++ = ',';
+    else
+      *p++ = '[';
+
+    *p++ = '{';
+
+    APPEND ("\"u\":");
+
+    p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "%u", info[i].codepoint));
+
+    if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS)) {
+      p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"cl\":%u", info[i].cluster));
+    }
+
+    *p++ = '}';
+
+    if (i == end-1)
+      *p++ = ']';
+
+    unsigned int l = p - b;
+    if (buf_size > l)
+    {
+      memcpy (buf, b, l);
+      buf += l;
+      buf_size -= l;
+      *buf_consumed += l;
+      *buf = '\0';
+    } else
+      return i - start;
+
+  }
+
+  return end - start;
+}
+
+static unsigned int
 _hb_buffer_serialize_glyphs_text (hb_buffer_t *buffer,
-                                 unsigned int start,
-                                 unsigned int end,
-                                 char *buf,
-                                 unsigned int buf_size,
-                                 unsigned int *buf_consumed,
-                                 hb_font_t *font,
-                                 hb_buffer_serialize_flags_t flags)
+                                  unsigned int start,
+                                  unsigned int end,
+                                  char *buf,
+                                  unsigned int buf_size,
+                                  unsigned int *buf_consumed,
+                                  hb_font_t *font,
+                                  hb_buffer_serialize_flags_t flags)
 {
   hb_glyph_info_t *info = hb_buffer_get_glyph_infos (buffer, nullptr);
   hb_glyph_position_t *pos = (flags & HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS) ?
-                            nullptr : hb_buffer_get_glyph_positions (buffer, nullptr);
+           nullptr : hb_buffer_get_glyph_positions (buffer, nullptr);
 
   *buf_consumed = 0;
   hb_position_t x = 0, y = 0;
@@ -221,9 +279,12 @@ _hb_buffer_serialize_glyphs_text (hb_buffer_t *buffer,
 
     if (i)
       *p++ = '|';
+    else
+      *p++ = '[';
 
     if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES))
     {
+      /* TODO Escape delimiters we use. */
       hb_font_glyph_to_string (font, info[i].codepoint, p, 128);
       p += strlen (p);
     }
@@ -237,21 +298,21 @@ _hb_buffer_serialize_glyphs_text (hb_buffer_t *buffer,
     if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS))
     {
       if (x+pos[i].x_offset || y+pos[i].y_offset)
-       p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "@%d,%d", x+pos[i].x_offset, y+pos[i].y_offset));
+        p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "@%d,%d", x+pos[i].x_offset, y+pos[i].y_offset));
 
       if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES))
       {
-       *p++ = '+';
-       p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "%d", pos[i].x_advance));
-       if (pos[i].y_advance)
-         p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",%d", pos[i].y_advance));
+        *p++ = '+';
+        p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "%d", pos[i].x_advance));
+        if (pos[i].y_advance)
+          p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",%d", pos[i].y_advance));
       }
     }
 
     if (flags & HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS)
     {
       if (info[i].mask & HB_GLYPH_FLAG_DEFINED)
-       p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "#%X", info[i].mask &HB_GLYPH_FLAG_DEFINED));
+        p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "#%X", info[i].mask &HB_GLYPH_FLAG_DEFINED));
     }
 
     if (flags & HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS)
@@ -261,6 +322,10 @@ _hb_buffer_serialize_glyphs_text (hb_buffer_t *buffer,
       p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "<%d,%d,%d,%d>", extents.x_bearing, extents.y_bearing, extents.width, extents.height));
     }
 
+    if (i == end-1) {
+      *p++ = ']';
+    }
+
     unsigned int l = p - b;
     if (buf_size > l)
     {
@@ -282,6 +347,51 @@ _hb_buffer_serialize_glyphs_text (hb_buffer_t *buffer,
   return end - start;
 }
 
+
+static unsigned int
+_hb_buffer_serialize_unicode_text (hb_buffer_t *buffer,
+                                   unsigned int start,
+                                   unsigned int end,
+                                   char *buf,
+                                   unsigned int buf_size,
+                                   unsigned int *buf_consumed,
+                                   hb_buffer_serialize_flags_t flags)
+{
+  hb_glyph_info_t *info = hb_buffer_get_glyph_infos (buffer, nullptr);
+  *buf_consumed = 0;
+  for (unsigned int i = start; i < end; i++)
+  {
+    char b[1024];
+    char *p = b;
+
+    if (i)
+      *p++ = '|';
+    else
+      *p++ = '<';
+
+    p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "U+%04X", info[i].codepoint));
+
+    if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS)) {
+      p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "=%u", info[i].cluster));
+    }
+
+    if (i == end-1)
+      *p++ = '>';
+
+    unsigned int l = p - b;
+    if (buf_size > l)
+    {
+      memcpy (buf, b, l);
+      buf += l;
+      buf_size -= l;
+      *buf_consumed += l;
+      *buf = '\0';
+    } else
+      return i - start;
+  }
+  return end - start;
+}
+
 /**
  * hb_buffer_serialize_glyphs:
  * @buffer: an #hb_buffer_t buffer.
@@ -290,8 +400,8 @@ _hb_buffer_serialize_glyphs_text (hb_buffer_t *buffer,
  * @buf: (out) (array length=buf_size) (element-type uint8_t): output string to
  *       write serialized buffer into.
  * @buf_size: the size of @buf.
- * @buf_consumed: (out) (allow-none): if not %NULL, will be set to the number of byes written into @buf.
- * @font: (allow-none): the #hb_font_t used to shape this buffer, needed to
+ * @buf_consumed: (out) (optional): if not %NULL, will be set to the number of byes written into @buf.
+ * @font: (nullable): the #hb_font_t used to shape this buffer, needed to
  *        read glyph names and extents. If %NULL, and empty font will be used.
  * @format: the #hb_buffer_serialize_format_t to use for formatting the output.
  * @flags: the #hb_buffer_serialize_flags_t that control what glyph properties
@@ -308,6 +418,7 @@ _hb_buffer_serialize_glyphs_text (hb_buffer_t *buffer,
  * ```
  * [uni0651=0@518,0+0|uni0628=0+1897]
  * ```
+ *
  * - The serialized glyphs are delimited with `[` and `]`.
  * - Glyphs are separated with `|`
  * - Each glyph starts with glyph name, or glyph index if
@@ -316,12 +427,28 @@ _hb_buffer_serialize_glyphs_text (hb_buffer_t *buffer,
  *   - If #HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS is not set, the #hb_glyph_position_t in the format:
  *     - If both #hb_glyph_position_t.x_offset and #hb_glyph_position_t.y_offset are not 0, `@x_offset,y_offset`. Then,
  *     - `+x_advance`, then `,y_advance` if #hb_glyph_position_t.y_advance is not 0. Then,
- *   - If #HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS is set, the
- *     #hb_glyph_extents_t in the format
- *     `&lt;x_bearing,y_bearing,width,height&gt;`
+ *   - If #HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS is set, the #hb_glyph_extents_t in the format `<x_bearing,y_bearing,width,height>`
  *
  * ## json
- * TODO.
+ * A machine-readable, structured format.
+ * The serialized glyphs will look something like:
+ *
+ * ```
+ * [{"g":"uni0651","cl":0,"dx":518,"dy":0,"ax":0,"ay":0},
+ * {"g":"uni0628","cl":0,"dx":0,"dy":0,"ax":1897,"ay":0}]
+ * ```
+ *
+ * Each glyph is a JSON object, with the following properties:
+ * - `g`: the glyph name or glyph index if
+ *   #HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES flag is set.
+ * - `cl`: #hb_glyph_info_t.cluster if
+ *   #HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS is not set.
+ * - `dx`,`dy`,`ax`,`ay`: #hb_glyph_position_t.x_offset, #hb_glyph_position_t.y_offset,
+ *    #hb_glyph_position_t.x_advance and #hb_glyph_position_t.y_advance
+ *    respectively, if #HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS is not set.
+ * - `xb`,`yb`,`w`,`h`: #hb_glyph_extents_t.x_bearing, #hb_glyph_extents_t.y_bearing,
+ *    #hb_glyph_extents_t.width and #hb_glyph_extents_t.height respectively if
+ *    #HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS is set.
  *
  * Return value:
  * The number of serialized items.
@@ -330,16 +457,17 @@ _hb_buffer_serialize_glyphs_text (hb_buffer_t *buffer,
  **/
 unsigned int
 hb_buffer_serialize_glyphs (hb_buffer_t *buffer,
-                           unsigned int start,
-                           unsigned int end,
-                           char *buf,
-                           unsigned int buf_size,
-                           unsigned int *buf_consumed,
-                           hb_font_t *font,
-                           hb_buffer_serialize_format_t format,
-                           hb_buffer_serialize_flags_t flags)
+                            unsigned int start,
+                            unsigned int end,
+                            char *buf,
+                            unsigned int buf_size,
+                            unsigned int *buf_consumed,
+                            hb_font_t *font,
+                            hb_buffer_serialize_format_t format,
+                            hb_buffer_serialize_flags_t flags)
 {
-  assert (start <= end && end <= buffer->len);
+  end = hb_clamp (end, start, buffer->len);
+  start = hb_min (start, end);
 
   unsigned int sconsumed;
   if (!buf_consumed)
@@ -348,8 +476,7 @@ hb_buffer_serialize_glyphs (hb_buffer_t *buffer,
   if (buf_size)
     *buf = '\0';
 
-  assert ((!buffer->len && buffer->content_type == HB_BUFFER_CONTENT_TYPE_INVALID) ||
-         buffer->content_type == HB_BUFFER_CONTENT_TYPE_GLYPHS);
+  buffer->assert_glyphs ();
 
   if (!buffer->have_positions)
     flags |= HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS;
@@ -364,13 +491,106 @@ hb_buffer_serialize_glyphs (hb_buffer_t *buffer,
   {
     case HB_BUFFER_SERIALIZE_FORMAT_TEXT:
       return _hb_buffer_serialize_glyphs_text (buffer, start, end,
-                                              buf, buf_size, buf_consumed,
-                                              font, flags);
+                 buf, buf_size, buf_consumed,
+                 font, flags);
 
     case HB_BUFFER_SERIALIZE_FORMAT_JSON:
       return _hb_buffer_serialize_glyphs_json (buffer, start, end,
-                                              buf, buf_size, buf_consumed,
-                                              font, flags);
+                 buf, buf_size, buf_consumed,
+                 font, flags);
+
+    default:
+    case HB_BUFFER_SERIALIZE_FORMAT_INVALID:
+      return 0;
+
+  }
+}
+
+/**
+ * hb_buffer_serialize_unicode:
+ * @buffer: an #hb_buffer_t buffer.
+ * @start: the first item in @buffer to serialize.
+ * @end: the last item in @buffer to serialize.
+ * @buf: (out) (array length=buf_size) (element-type uint8_t): output string to
+ *       write serialized buffer into.
+ * @buf_size: the size of @buf.
+ * @buf_consumed: (out) (optional): if not %NULL, will be set to the number of byes written into @buf.
+ * @format: the #hb_buffer_serialize_format_t to use for formatting the output.
+ * @flags: the #hb_buffer_serialize_flags_t that control what glyph properties
+ *         to serialize.
+ *
+ * Serializes @buffer into a textual representation of its content,
+ * when the buffer contains Unicode codepoints (i.e., before shaping). This is
+ * useful for showing the contents of the buffer, for example during debugging.
+ * There are currently two supported serialization formats:
+ *
+ * ## text
+ * A human-readable, plain text format.
+ * The serialized codepoints will look something like:
+ *
+ * ```
+ *  <U+0651=0|U+0628=1>
+ * ```
+ *
+ * - Glyphs are separated with `|`
+ * - Unicode codepoints are expressed as zero-padded four (or more)
+ *   digit hexadecimal numbers preceded by `U+`
+ * - If #HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS is not set, the cluster
+ *   will be indicated with a `=` then #hb_glyph_info_t.cluster.
+ *
+ * ## json
+ * A machine-readable, structured format.
+ * The serialized codepoints will be a list of objects with the following
+ * properties:
+ * - `u`: the Unicode codepoint as a decimal integer
+ * - `cl`: #hb_glyph_info_t.cluster if
+ *   #HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS is not set.
+ *
+ * For example:
+ *
+ * ```
+ * [{u:1617,cl:0},{u:1576,cl:1}]
+ * ```
+ *
+ * Return value:
+ * The number of serialized items.
+ *
+ * Since: 2.7.3
+ **/
+unsigned int
+hb_buffer_serialize_unicode (hb_buffer_t *buffer,
+                             unsigned int start,
+                             unsigned int end,
+                             char *buf,
+                             unsigned int buf_size,
+                             unsigned int *buf_consumed,
+                             hb_buffer_serialize_format_t format,
+                             hb_buffer_serialize_flags_t flags)
+{
+  end = hb_clamp (end, start, buffer->len);
+  start = hb_min (start, end);
+
+  unsigned int sconsumed;
+  if (!buf_consumed)
+    buf_consumed = &sconsumed;
+  *buf_consumed = 0;
+  if (buf_size)
+    *buf = '\0';
+
+  buffer->assert_unicode ();
+
+  if (unlikely (start == end))
+    return 0;
+
+  switch (format)
+  {
+    case HB_BUFFER_SERIALIZE_FORMAT_TEXT:
+      return _hb_buffer_serialize_unicode_text (buffer, start, end,
+                                                buf, buf_size, buf_consumed, flags);
+
+    case HB_BUFFER_SERIALIZE_FORMAT_JSON:
+      return _hb_buffer_serialize_unicode_json (buffer, start, end,
+                                                buf, buf_size, buf_consumed, flags);
 
     default:
     case HB_BUFFER_SERIALIZE_FORMAT_INVALID:
@@ -379,6 +599,91 @@ hb_buffer_serialize_glyphs (hb_buffer_t *buffer,
   }
 }
 
+static unsigned int
+_hb_buffer_serialize_invalid (hb_buffer_t *buffer,
+                              unsigned int start,
+                              unsigned int end,
+                              char *buf,
+                              unsigned int buf_size,
+                              unsigned int *buf_consumed,
+                              hb_buffer_serialize_format_t format,
+                              hb_buffer_serialize_flags_t flags)
+{
+  assert (!buffer->len);
+
+  unsigned int sconsumed;
+  if (!buf_consumed)
+    buf_consumed = &sconsumed;
+  if (buf_size < 3)
+    return 0;
+  if (format == HB_BUFFER_SERIALIZE_FORMAT_JSON) {
+    *buf++ = '[';
+    *buf++ = ']';
+    *buf = '\0';
+  } else if (format == HB_BUFFER_SERIALIZE_FORMAT_TEXT) {
+    *buf++ = '!';
+    *buf++ = '!';
+    *buf = '\0';
+  }
+  *buf_consumed = 2;
+  return 0;
+}
+
+/**
+ * hb_buffer_serialize:
+ * @buffer: an #hb_buffer_t buffer.
+ * @start: the first item in @buffer to serialize.
+ * @end: the last item in @buffer to serialize.
+ * @buf: (out) (array length=buf_size) (element-type uint8_t): output string to
+ *       write serialized buffer into.
+ * @buf_size: the size of @buf.
+ * @buf_consumed: (out) (optional): if not %NULL, will be set to the number of byes written into @buf.
+ * @font: (nullable): the #hb_font_t used to shape this buffer, needed to
+ *        read glyph names and extents. If %NULL, and empty font will be used.
+ * @format: the #hb_buffer_serialize_format_t to use for formatting the output.
+ * @flags: the #hb_buffer_serialize_flags_t that control what glyph properties
+ *         to serialize.
+ *
+ * Serializes @buffer into a textual representation of its content, whether
+ * Unicode codepoints or glyph identifiers and positioning information. This is
+ * useful for showing the contents of the buffer, for example during debugging.
+ * See the documentation of hb_buffer_serialize_unicode() and
+ * hb_buffer_serialize_glyphs() for a description of the output format.
+ *
+ * Return value:
+ * The number of serialized items.
+ *
+ * Since: 2.7.3
+ **/
+unsigned int
+hb_buffer_serialize (hb_buffer_t *buffer,
+                     unsigned int start,
+                     unsigned int end,
+                     char *buf,
+                     unsigned int buf_size,
+                     unsigned int *buf_consumed,
+                     hb_font_t *font,
+                     hb_buffer_serialize_format_t format,
+                     hb_buffer_serialize_flags_t flags)
+{
+  switch (buffer->content_type)
+  {
+
+    case HB_BUFFER_CONTENT_TYPE_GLYPHS:
+      return hb_buffer_serialize_glyphs (buffer, start, end, buf, buf_size,
+                                        buf_consumed, font, format, flags);
+
+    case HB_BUFFER_CONTENT_TYPE_UNICODE:
+      return hb_buffer_serialize_unicode (buffer, start, end, buf, buf_size,
+                                         buf_consumed, format, flags);
+
+    case HB_BUFFER_CONTENT_TYPE_INVALID:
+    default:
+      return _hb_buffer_serialize_invalid (buffer, start, end, buf, buf_size,
+                                          buf_consumed, format, flags);
+  }
+}
+
 static bool
 parse_int (const char *pp, const char *end, int32_t *pv)
 {
@@ -403,39 +708,59 @@ parse_uint (const char *pp, const char *end, uint32_t *pv)
   return true;
 }
 
+static bool
+parse_hex (const char *pp, const char *end, uint32_t *pv)
+{
+  unsigned int v;
+  const char *p = pp;
+  if (unlikely (!hb_parse_uint (&p, end, &v, true/* whole buffer */, 16)))
+    return false;
+
+  *pv = v;
+  return true;
+}
+
 #include "hb-buffer-deserialize-json.hh"
 #include "hb-buffer-deserialize-text.hh"
 
 /**
  * hb_buffer_deserialize_glyphs:
  * @buffer: an #hb_buffer_t buffer.
- * @buf: (array length=buf_len):
- * @buf_len:
- * @end_ptr: (out):
- * @font:
- * @format:
+ * @buf: (array length=buf_len): string to deserialize
+ * @buf_len: the size of @buf, or -1 if it is %NULL-terminated
+ * @end_ptr: (out) (optional): output pointer to the character after last
+ *                               consumed one.
+ * @font: (nullable): font for getting glyph IDs
+ * @format: the #hb_buffer_serialize_format_t of the input @buf
  *
+ * Deserializes glyphs @buffer from textual representation in the format
+ * produced by hb_buffer_serialize_glyphs().
  *
- *
- * Return value:
+ * Return value: %true if @buf is not fully consumed, %false otherwise.
  *
  * Since: 0.9.7
  **/
 hb_bool_t
 hb_buffer_deserialize_glyphs (hb_buffer_t *buffer,
-                             const char *buf,
-                             int buf_len, /* -1 means nul-terminated */
-                             const char **end_ptr, /* May be NULL */
-                             hb_font_t *font, /* May be NULL */
-                             hb_buffer_serialize_format_t format)
+                              const char *buf,
+                              int buf_len, /* -1 means nul-terminated */
+                              const char **end_ptr, /* May be NULL */
+                              hb_font_t *font, /* May be NULL */
+                              hb_buffer_serialize_format_t format)
 {
   const char *end;
   if (!end_ptr)
     end_ptr = &end;
   *end_ptr = buf;
 
-  assert ((!buffer->len && buffer->content_type == HB_BUFFER_CONTENT_TYPE_INVALID) ||
-         buffer->content_type == HB_BUFFER_CONTENT_TYPE_GLYPHS);
+  buffer->assert_glyphs ();
+
+  if (unlikely (hb_object_is_immutable (buffer)))
+  {
+    if (end_ptr)
+      *end_ptr = buf;
+    return false;
+  }
 
   if (buf_len == -1)
     buf_len = strlen (buf);
@@ -454,14 +779,84 @@ hb_buffer_deserialize_glyphs (hb_buffer_t *buffer,
   switch (format)
   {
     case HB_BUFFER_SERIALIZE_FORMAT_TEXT:
-      return _hb_buffer_deserialize_glyphs_text (buffer,
-                                                buf, buf_len, end_ptr,
-                                                font);
+      return _hb_buffer_deserialize_text (buffer,
+                                          buf, buf_len, end_ptr,
+                                          font);
+
+    case HB_BUFFER_SERIALIZE_FORMAT_JSON:
+      return _hb_buffer_deserialize_json (buffer,
+                                          buf, buf_len, end_ptr,
+                                          font);
+
+    default:
+    case HB_BUFFER_SERIALIZE_FORMAT_INVALID:
+      return false;
+
+  }
+}
+
+
+/**
+ * hb_buffer_deserialize_unicode:
+ * @buffer: an #hb_buffer_t buffer.
+ * @buf: (array length=buf_len): string to deserialize
+ * @buf_len: the size of @buf, or -1 if it is %NULL-terminated
+ * @end_ptr: (out) (optional): output pointer to the character after last
+ *                               consumed one.
+ * @format: the #hb_buffer_serialize_format_t of the input @buf
+ *
+ * Deserializes Unicode @buffer from textual representation in the format
+ * produced by hb_buffer_serialize_unicode().
+ *
+ * Return value: %true if @buf is not fully consumed, %false otherwise.
+ *
+ * Since: 2.7.3
+ **/
+hb_bool_t
+hb_buffer_deserialize_unicode (hb_buffer_t *buffer,
+                               const char *buf,
+                               int buf_len, /* -1 means nul-terminated */
+                               const char **end_ptr, /* May be NULL */
+                               hb_buffer_serialize_format_t format)
+{
+  const char *end;
+  if (!end_ptr)
+    end_ptr = &end;
+  *end_ptr = buf;
+
+  buffer->assert_unicode ();
+
+  if (unlikely (hb_object_is_immutable (buffer)))
+  {
+    if (end_ptr)
+      *end_ptr = buf;
+    return false;
+  }
+
+  if (buf_len == -1)
+    buf_len = strlen (buf);
+
+  if (!buf_len)
+  {
+    *end_ptr = buf;
+    return false;
+  }
+
+  hb_buffer_set_content_type (buffer, HB_BUFFER_CONTENT_TYPE_UNICODE);
+
+  hb_font_t* font = hb_font_get_empty ();
+
+  switch (format)
+  {
+    case HB_BUFFER_SERIALIZE_FORMAT_TEXT:
+      return _hb_buffer_deserialize_text (buffer,
+                                          buf, buf_len, end_ptr,
+                                          font);
 
     case HB_BUFFER_SERIALIZE_FORMAT_JSON:
-      return _hb_buffer_deserialize_glyphs_json (buffer,
-                                                buf, buf_len, end_ptr,
-                                                font);
+      return _hb_buffer_deserialize_json (buffer,
+                                          buf, buf_len, end_ptr,
+                                          font);
 
     default:
     case HB_BUFFER_SERIALIZE_FORMAT_INVALID:
diff --git a/src/hb-buffer-verify.cc b/src/hb-buffer-verify.cc
new file mode 100644 (file)
index 0000000..c977294
--- /dev/null
@@ -0,0 +1,421 @@
+/*
+ * Copyright © 2022  Behdad Esfahbod
+ *
+ *  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
+ */
+
+#include "hb.hh"
+
+#ifndef HB_NO_BUFFER_VERIFY
+
+#include "hb-buffer.hh"
+
+
+#define BUFFER_VERIFY_ERROR "buffer verify error: "
+static inline void
+buffer_verify_error (hb_buffer_t *buffer,
+                    hb_font_t *font,
+                    const char *fmt,
+                    ...) HB_PRINTF_FUNC(3, 4);
+
+static inline void
+buffer_verify_error (hb_buffer_t *buffer,
+                    hb_font_t *font,
+                    const char *fmt,
+                    ...)
+{
+  va_list ap;
+  va_start (ap, fmt);
+  if (buffer->messaging ())
+  {
+    buffer->message_impl (font, fmt, ap);
+  }
+  else
+  {
+    fprintf (stderr, "harfbuzz ");
+    vfprintf (stderr, fmt, ap);
+    fprintf (stderr, "\n");
+  }
+  va_end (ap);
+}
+
+static bool
+buffer_verify_monotone (hb_buffer_t *buffer,
+                       hb_font_t   *font)
+{
+  /* Check that clusters are monotone. */
+  if (buffer->cluster_level == HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES ||
+      buffer->cluster_level == HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS)
+  {
+    bool is_forward = HB_DIRECTION_IS_FORWARD (hb_buffer_get_direction (buffer));
+
+    unsigned int num_glyphs;
+    hb_glyph_info_t *info = hb_buffer_get_glyph_infos (buffer, &num_glyphs);
+
+    for (unsigned int i = 1; i < num_glyphs; i++)
+      if (info[i-1].cluster != info[i].cluster &&
+         (info[i-1].cluster < info[i].cluster) != is_forward)
+      {
+       buffer_verify_error (buffer, font, BUFFER_VERIFY_ERROR "clusters are not monotone.");
+       return false;
+      }
+  }
+
+  return true;
+}
+
+static bool
+buffer_verify_unsafe_to_break (hb_buffer_t  *buffer,
+                              hb_buffer_t  *text_buffer,
+                              hb_font_t          *font,
+                              const hb_feature_t *features,
+                              unsigned int        num_features,
+                              const char * const *shapers)
+{
+  if (buffer->cluster_level != HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES &&
+      buffer->cluster_level != HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS)
+  {
+    /* Cannot perform this check without monotone clusters. */
+    return true;
+  }
+
+  /* Check that breaking up shaping at safe-to-break is indeed safe. */
+
+  hb_buffer_t *fragment = hb_buffer_create_similar (buffer);
+  hb_buffer_set_flags (fragment, hb_buffer_get_flags (fragment) & ~HB_BUFFER_FLAG_VERIFY);
+  hb_buffer_t *reconstruction = hb_buffer_create_similar (buffer);
+  hb_buffer_set_flags (reconstruction, hb_buffer_get_flags (reconstruction) & ~HB_BUFFER_FLAG_VERIFY);
+
+  unsigned int num_glyphs;
+  hb_glyph_info_t *info = hb_buffer_get_glyph_infos (buffer, &num_glyphs);
+
+  unsigned int num_chars;
+  hb_glyph_info_t *text = hb_buffer_get_glyph_infos (text_buffer, &num_chars);
+
+  /* Chop text and shape fragments. */
+  bool forward = HB_DIRECTION_IS_FORWARD (hb_buffer_get_direction (buffer));
+  unsigned int start = 0;
+  unsigned int text_start = forward ? 0 : num_chars;
+  unsigned int text_end = text_start;
+  for (unsigned int end = 1; end < num_glyphs + 1; end++)
+  {
+    if (end < num_glyphs &&
+       (info[end].cluster == info[end-1].cluster ||
+        info[end-(forward?0:1)].mask & HB_GLYPH_FLAG_UNSAFE_TO_BREAK))
+       continue;
+
+    /* Shape segment corresponding to glyphs start..end. */
+    if (end == num_glyphs)
+    {
+      if (forward)
+       text_end = num_chars;
+      else
+       text_start = 0;
+    }
+    else
+    {
+      if (forward)
+      {
+       unsigned int cluster = info[end].cluster;
+       while (text_end < num_chars && text[text_end].cluster < cluster)
+         text_end++;
+      }
+      else
+      {
+       unsigned int cluster = info[end - 1].cluster;
+       while (text_start && text[text_start - 1].cluster >= cluster)
+         text_start--;
+      }
+    }
+    assert (text_start < text_end);
+
+    if (0)
+      printf("start %d end %d text start %d end %d\n", start, end, text_start, text_end);
+
+    hb_buffer_clear_contents (fragment);
+
+    hb_buffer_flags_t flags = hb_buffer_get_flags (fragment);
+    if (0 < text_start)
+      flags = (hb_buffer_flags_t) (flags & ~HB_BUFFER_FLAG_BOT);
+    if (text_end < num_chars)
+      flags = (hb_buffer_flags_t) (flags & ~HB_BUFFER_FLAG_EOT);
+    hb_buffer_set_flags (fragment, flags);
+
+    hb_buffer_append (fragment, text_buffer, text_start, text_end);
+    if (!hb_shape_full (font, fragment, features, num_features, shapers))
+    {
+      buffer_verify_error (buffer, font, BUFFER_VERIFY_ERROR "shaping failed while shaping fragment.");
+      hb_buffer_destroy (reconstruction);
+      hb_buffer_destroy (fragment);
+      return false;
+    }
+    hb_buffer_append (reconstruction, fragment, 0, -1);
+
+    start = end;
+    if (forward)
+      text_start = text_end;
+    else
+      text_end = text_start;
+  }
+
+  bool ret = true;
+  hb_buffer_diff_flags_t diff = hb_buffer_diff (reconstruction, buffer, (hb_codepoint_t) -1, 0);
+  if (diff)
+  {
+    buffer_verify_error (buffer, font, BUFFER_VERIFY_ERROR "unsafe-to-break test failed.");
+    ret = false;
+
+    /* Return the reconstructed result instead so it can be inspected. */
+    hb_buffer_set_length (buffer, 0);
+    hb_buffer_append (buffer, reconstruction, 0, -1);
+  }
+
+  hb_buffer_destroy (reconstruction);
+  hb_buffer_destroy (fragment);
+
+  return ret;
+}
+
+static bool
+buffer_verify_unsafe_to_concat (hb_buffer_t        *buffer,
+                               hb_buffer_t        *text_buffer,
+                               hb_font_t          *font,
+                               const hb_feature_t *features,
+                               unsigned int        num_features,
+                               const char * const *shapers)
+{
+  if (buffer->cluster_level != HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES &&
+      buffer->cluster_level != HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS)
+  {
+    /* Cannot perform this check without monotone clusters. */
+    return true;
+  }
+
+  /* Check that shuffling up text before shaping at safe-to-concat points
+   * is indeed safe. */
+
+  /* This is what we do:
+   *
+   * 1. We shape text once. Then segment the text at all the safe-to-concat
+   *    points;
+   *
+   * 2. Then we create two buffers, one containing all the even segments and
+   *    one all the odd segments.
+   *
+   * 3. Because all these segments were safe-to-concat at both ends, we
+   *    expect that concatenating them and shaping should NOT change the
+   *    shaping results of each segment.  As such, we expect that after
+   *    shaping the two buffers, we still get cluster boundaries at the
+   *    segment boundaries, and that those all are safe-to-concat points.
+   *    Moreover, that there are NOT any safe-to-concat points within the
+   *    segments.
+   *
+   * 4. Finally, we reconstruct the shaping results of the original text by
+   *    simply interleaving the shaping results of the segments from the two
+   *    buffers, and assert that the total shaping results is the same as
+   *    the one from original buffer in step 1.
+   */
+
+  hb_buffer_t *fragments[2] {hb_buffer_create_similar (buffer),
+                            hb_buffer_create_similar (buffer)};
+  hb_buffer_set_flags (fragments[0], hb_buffer_get_flags (fragments[0]) & ~HB_BUFFER_FLAG_VERIFY);
+  hb_buffer_set_flags (fragments[1], hb_buffer_get_flags (fragments[1]) & ~HB_BUFFER_FLAG_VERIFY);
+  hb_buffer_t *reconstruction = hb_buffer_create_similar (buffer);
+  hb_buffer_set_flags (reconstruction, hb_buffer_get_flags (reconstruction) & ~HB_BUFFER_FLAG_VERIFY);
+  hb_segment_properties_t props;
+  hb_buffer_get_segment_properties (buffer, &props);
+  hb_buffer_set_segment_properties (fragments[0], &props);
+  hb_buffer_set_segment_properties (fragments[1], &props);
+  hb_buffer_set_segment_properties (reconstruction, &props);
+
+  unsigned num_glyphs;
+  hb_glyph_info_t *info = hb_buffer_get_glyph_infos (buffer, &num_glyphs);
+
+  unsigned num_chars;
+  hb_glyph_info_t *text = hb_buffer_get_glyph_infos (text_buffer, &num_chars);
+
+  bool forward = HB_DIRECTION_IS_FORWARD (hb_buffer_get_direction (buffer));
+
+  if (!forward)
+    hb_buffer_reverse (buffer);
+
+  /*
+   * Split text into segments and collect into to fragment streams.
+   */
+  {
+    unsigned fragment_idx = 0;
+    unsigned start = 0;
+    unsigned text_start = 0;
+    unsigned text_end = 0;
+    for (unsigned end = 1; end < num_glyphs + 1; end++)
+    {
+      if (end < num_glyphs &&
+         (info[end].cluster == info[end-1].cluster ||
+          info[end].mask & HB_GLYPH_FLAG_UNSAFE_TO_CONCAT))
+         continue;
+
+      /* Accumulate segment corresponding to glyphs start..end. */
+      if (end == num_glyphs)
+       text_end = num_chars;
+      else
+      {
+       unsigned cluster = info[end].cluster;
+       while (text_end < num_chars && text[text_end].cluster < cluster)
+         text_end++;
+      }
+      assert (text_start < text_end);
+
+      if (0)
+       printf("start %d end %d text start %d end %d\n", start, end, text_start, text_end);
+
+#if 0
+      hb_buffer_flags_t flags = hb_buffer_get_flags (fragment);
+      if (0 < text_start)
+       flags = (hb_buffer_flags_t) (flags & ~HB_BUFFER_FLAG_BOT);
+      if (text_end < num_chars)
+       flags = (hb_buffer_flags_t) (flags & ~HB_BUFFER_FLAG_EOT);
+      hb_buffer_set_flags (fragment, flags);
+#endif
+
+      hb_buffer_append (fragments[fragment_idx], text_buffer, text_start, text_end);
+
+      start = end;
+      text_start = text_end;
+      fragment_idx = 1 - fragment_idx;
+    }
+  }
+
+  bool ret = true;
+  hb_buffer_diff_flags_t diff;
+
+  /*
+   * Shape the two fragment streams.
+   */
+  if (!hb_shape_full (font, fragments[0], features, num_features, shapers))
+  {
+    buffer_verify_error (buffer, font, BUFFER_VERIFY_ERROR "shaping failed while shaping fragment.");
+    ret = false;
+    goto out;
+  }
+  if (!hb_shape_full (font, fragments[1], features, num_features, shapers))
+  {
+    buffer_verify_error (buffer, font, BUFFER_VERIFY_ERROR "shaping failed while shaping fragment.");
+    ret = false;
+    goto out;
+  }
+
+  if (!forward)
+  {
+    hb_buffer_reverse (fragments[0]);
+    hb_buffer_reverse (fragments[1]);
+  }
+
+  /*
+   * Reconstruct results.
+   */
+  {
+    unsigned fragment_idx = 0;
+    unsigned fragment_start[2] {0, 0};
+    unsigned fragment_num_glyphs[2];
+    hb_glyph_info_t *fragment_info[2];
+    for (unsigned i = 0; i < 2; i++)
+      fragment_info[i] = hb_buffer_get_glyph_infos (fragments[i], &fragment_num_glyphs[i]);
+    while (fragment_start[0] < fragment_num_glyphs[0] ||
+          fragment_start[1] < fragment_num_glyphs[1])
+    {
+      unsigned fragment_end = fragment_start[fragment_idx] + 1;
+      while (fragment_end < fragment_num_glyphs[fragment_idx] &&
+            (fragment_info[fragment_idx][fragment_end].cluster == fragment_info[fragment_idx][fragment_end - 1].cluster ||
+             fragment_info[fragment_idx][fragment_end].mask & HB_GLYPH_FLAG_UNSAFE_TO_CONCAT))
+       fragment_end++;
+
+      hb_buffer_append (reconstruction, fragments[fragment_idx], fragment_start[fragment_idx], fragment_end);
+
+      fragment_start[fragment_idx] = fragment_end;
+      fragment_idx = 1 - fragment_idx;
+    }
+  }
+
+  if (!forward)
+  {
+    hb_buffer_reverse (buffer);
+    hb_buffer_reverse (reconstruction);
+  }
+
+  /*
+   * Diff results.
+   */
+  diff = hb_buffer_diff (reconstruction, buffer, (hb_codepoint_t) -1, 0);
+  if (diff)
+  {
+    buffer_verify_error (buffer, font, BUFFER_VERIFY_ERROR "unsafe-to-concat test failed.");
+    ret = false;
+
+    /* Return the reconstructed result instead so it can be inspected. */
+    hb_buffer_set_length (buffer, 0);
+    hb_buffer_append (buffer, reconstruction, 0, -1);
+  }
+
+
+out:
+  hb_buffer_destroy (reconstruction);
+  hb_buffer_destroy (fragments[0]);
+  hb_buffer_destroy (fragments[1]);
+
+  return ret;
+}
+
+bool
+hb_buffer_t::verify (hb_buffer_t        *text_buffer,
+                    hb_font_t          *font,
+                    const hb_feature_t *features,
+                    unsigned int        num_features,
+                    const char * const *shapers)
+{
+  bool ret = true;
+  if (!buffer_verify_monotone (this, font))
+    ret = false;
+  if (!buffer_verify_unsafe_to_break (this, text_buffer, font, features, num_features, shapers))
+    ret = false;
+  if (!buffer_verify_unsafe_to_concat (this, text_buffer, font, features, num_features, shapers))
+    ret = false;
+  if (!ret)
+  {
+    unsigned len = text_buffer->len;
+    hb_vector_t<char> bytes;
+    if (likely (bytes.resize (len * 10 + 16)))
+    {
+      hb_buffer_serialize_unicode (text_buffer,
+                                  0, len,
+                                  bytes.arrayZ, bytes.length,
+                                  &len,
+                                  HB_BUFFER_SERIALIZE_FORMAT_TEXT,
+                                  HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS);
+      buffer_verify_error (this, font, BUFFER_VERIFY_ERROR "text was: %s.", bytes.arrayZ);
+    }
+  }
+  return ret;
+}
+
+
+#endif
index d443edf..d36fcfd 100644 (file)
@@ -37,8 +37,9 @@
  * @short_description: Input and output buffers
  * @include: hb.h
  *
- * Buffers serve dual role in HarfBuzz; they hold the input characters that are
- * passed to hb_shape(), and after shaping they hold the output glyphs.
+ * Buffers serve a dual role in HarfBuzz; before shaping, they hold
+ * the input characters that are passed to hb_shape(), and after
+ * shaping they hold the output glyphs.
  **/
 
 
@@ -50,7 +51,7 @@
  * Checks the equality of two #hb_segment_properties_t's.
  *
  * Return value:
- * %true if all properties of @a equal those of @b, false otherwise.
+ * %true if all properties of @a equal those of @b, %false otherwise.
  *
  * Since: 0.9.7
  **/
@@ -85,7 +86,46 @@ hb_segment_properties_hash (const hb_segment_properties_t *p)
         (intptr_t) (p->language);
 }
 
+/**
+ * hb_segment_properties_overlay:
+ * @p: #hb_segment_properties_t to fill in.
+ * @src: #hb_segment_properties_t to fill in from.
+ *
+ * Fills in missing fields of @p from @src in a considered manner.
+ *
+ * First, if @p does not have direction set, direction is copied from @src.
+ *
+ * Next, if @p and @src have the same direction (which can be unset), if @p
+ * does not have script set, script is copied from @src.
+ *
+ * Finally, if @p and @src have the same direction and script (which either
+ * can be unset), if @p does not have language set, language is copied from
+ * @src.
+ *
+ * Since: 3.3.0
+ **/
+void
+hb_segment_properties_overlay (hb_segment_properties_t *p,
+                              const hb_segment_properties_t *src)
+{
+  if (unlikely (!p || !src))
+    return;
 
+  if (!p->direction)
+    p->direction = src->direction;
+
+  if (p->direction != src->direction)
+    return;
+
+  if (!p->script)
+    p->script = src->script;
+
+  if (p->script != src->script)
+    return;
+
+  if (!p->language)
+    p->language = src->language;
+}
 
 /* Here is how the buffer works internally:
  *
@@ -95,14 +135,15 @@ hb_segment_properties_hash (const hb_segment_properties_t *p)
  * As an optimization, both info and out_info may point to the
  * same piece of memory, which is owned by info.  This remains the
  * case as long as out_len doesn't exceed i at any time.
- * In that case, swap_buffers() is no-op and the glyph operations operate
- * mostly in-place.
+ * In that case, sync() is mostly no-op and the glyph operations
+ * operate mostly in-place.
  *
  * As soon as out_info gets longer than info, out_info is moved over
- * to an alternate buffer (which we reuse the pos buffer for!), and its
+ * to an alternate buffer (which we reuse the pos buffer for), and its
  * current contents (out_len entries) are copied to the new place.
- * This should all remain transparent to the user.  swap_buffers() then
- * switches info and out_info.
+ *
+ * This should all remain transparent to the user.  sync() then
+ * switches info over to out_info and does housekeeping.
  */
 
 
@@ -135,8 +176,8 @@ hb_buffer_t::enlarge (unsigned int size)
   if (unlikely (hb_unsigned_mul_overflows (new_allocated, sizeof (info[0]))))
     goto done;
 
-  new_pos = (hb_glyph_position_t *) realloc (pos, new_allocated * sizeof (pos[0]));
-  new_info = (hb_glyph_info_t *) realloc (info, new_allocated * sizeof (info[0]));
+  new_pos = (hb_glyph_position_t *) hb_realloc (pos, new_allocated * sizeof (pos[0]));
+  new_info = (hb_glyph_info_t *) hb_realloc (info, new_allocated * sizeof (info[0]));
 
 done:
   if (unlikely (!new_pos || !new_info))
@@ -215,16 +256,27 @@ hb_buffer_t::get_scratch_buffer (unsigned int *size)
 /* HarfBuzz-Internal API */
 
 void
-hb_buffer_t::reset ()
+hb_buffer_t::similar (const hb_buffer_t &src)
 {
-  if (unlikely (hb_object_is_immutable (this)))
-    return;
+  hb_unicode_funcs_destroy (unicode);
+  unicode = hb_unicode_funcs_reference (src.unicode);
+  flags = src.flags;
+  cluster_level = src.cluster_level;
+  replacement = src.invisible;
+  invisible = src.invisible;
+  not_found = src.not_found;
+}
 
+void
+hb_buffer_t::reset ()
+{
   hb_unicode_funcs_destroy (unicode);
   unicode = hb_unicode_funcs_reference (hb_unicode_funcs_get_default ());
   flags = HB_BUFFER_FLAG_DEFAULT;
+  cluster_level = HB_BUFFER_CLUSTER_LEVEL_DEFAULT;
   replacement = HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT;
   invisible = 0;
+  not_found = 0;
 
   clear ();
 }
@@ -232,14 +284,10 @@ hb_buffer_t::reset ()
 void
 hb_buffer_t::clear ()
 {
-  if (unlikely (hb_object_is_immutable (this)))
-    return;
-
+  content_type = HB_BUFFER_CONTENT_TYPE_INVALID;
   hb_segment_properties_t default_props = HB_SEGMENT_PROPERTIES_DEFAULT;
   props = default_props;
-  scratch_flags = HB_BUFFER_SCRATCH_FLAG_DEFAULT;
 
-  content_type = HB_BUFFER_CONTENT_TYPE_INVALID;
   successful = true;
   have_output = false;
   have_positions = false;
@@ -247,17 +295,45 @@ hb_buffer_t::clear ()
   idx = 0;
   len = 0;
   out_len = 0;
-  out_info = info;
 
-  serial = 0;
+  out_info = info;
 
   memset (context, 0, sizeof context);
   memset (context_len, 0, sizeof context_len);
 
   deallocate_var_all ();
+  serial = 0;
+  scratch_flags = HB_BUFFER_SCRATCH_FLAG_DEFAULT;
 }
 
 void
+hb_buffer_t::enter ()
+{
+  deallocate_var_all ();
+  serial = 0;
+  scratch_flags = HB_BUFFER_SCRATCH_FLAG_DEFAULT;
+  if (likely (!hb_unsigned_mul_overflows (len, HB_BUFFER_MAX_LEN_FACTOR)))
+  {
+    max_len = hb_max (len * HB_BUFFER_MAX_LEN_FACTOR,
+                     (unsigned) HB_BUFFER_MAX_LEN_MIN);
+  }
+  if (likely (!hb_unsigned_mul_overflows (len, HB_BUFFER_MAX_OPS_FACTOR)))
+  {
+    max_ops = hb_max (len * HB_BUFFER_MAX_OPS_FACTOR,
+                     (unsigned) HB_BUFFER_MAX_OPS_MIN);
+  }
+}
+void
+hb_buffer_t::leave ()
+{
+  max_len = HB_BUFFER_MAX_LEN_DEFAULT;
+  max_ops = HB_BUFFER_MAX_OPS_DEFAULT;
+  deallocate_var_all ();
+  serial = 0;
+}
+
+
+void
 hb_buffer_t::add (hb_codepoint_t  codepoint,
                  unsigned int    cluster)
 {
@@ -287,27 +363,12 @@ hb_buffer_t::add_info (const hb_glyph_info_t &glyph_info)
 
 
 void
-hb_buffer_t::remove_output ()
-{
-  if (unlikely (hb_object_is_immutable (this)))
-    return;
-
-  have_output = false;
-  have_positions = false;
-
-  out_len = 0;
-  out_info = info;
-}
-
-void
 hb_buffer_t::clear_output ()
 {
-  if (unlikely (hb_object_is_immutable (this)))
-    return;
-
   have_output = true;
   have_positions = false;
 
+  idx = 0;
   out_len = 0;
   out_info = info;
 }
@@ -315,9 +376,6 @@ hb_buffer_t::clear_output ()
 void
 hb_buffer_t::clear_positions ()
 {
-  if (unlikely (hb_object_is_immutable (this)))
-    return;
-
   have_output = false;
   have_positions = true;
 
@@ -328,55 +386,28 @@ hb_buffer_t::clear_positions ()
 }
 
 void
-hb_buffer_t::swap_buffers ()
+hb_buffer_t::sync ()
 {
-  if (unlikely (!successful)) return;
-
   assert (have_output);
-  have_output = false;
+
+  assert (idx <= len);
+
+  if (unlikely (!successful || !next_glyphs (len - idx)))
+    goto reset;
 
   if (out_info != info)
   {
-    hb_glyph_info_t *tmp_string;
-    tmp_string = info;
+    pos = (hb_glyph_position_t *) info;
     info = out_info;
-    out_info = tmp_string;
-    pos = (hb_glyph_position_t *) out_info;
   }
-
-  unsigned int tmp;
-  tmp = len;
   len = out_len;
-  out_len = tmp;
 
+reset:
+  have_output = false;
+  out_len = 0;
   idx = 0;
 }
 
-
-void
-hb_buffer_t::replace_glyphs (unsigned int num_in,
-                            unsigned int num_out,
-                            const uint32_t *glyph_data)
-{
-  if (unlikely (!make_room_for (num_in, num_out))) return;
-
-  assert (idx + num_in <= len);
-
-  merge_clusters (idx, idx + num_in);
-
-  hb_glyph_info_t orig_info = info[idx];
-  hb_glyph_info_t *pinfo = &out_info[out_len];
-  for (unsigned int i = 0; i < num_out; i++)
-  {
-    *pinfo = orig_info;
-    pinfo->codepoint = glyph_data[i];
-    pinfo++;
-  }
-
-  idx  += num_in;
-  out_len += num_out;
-}
-
 bool
 hb_buffer_t::move_to (unsigned int i)
 {
@@ -408,12 +439,11 @@ hb_buffer_t::move_to (unsigned int i)
     /* This will blow in our face if memory allocation fails later
      * in this same lookup...
      *
-     * We used to shift with extra 32 items, instead of the 0 below.
+     * We used to shift with extra 32 items.
      * But that would leave empty slots in the buffer in case of allocation
-     * failures.  Setting to zero for now to avoid other problems (see
-     * comments in shift_forward().  This can cause O(N^2) behavior more
-     * severely than adding 32 empty slots can... */
-    if (unlikely (idx < count && !shift_forward (count + 0))) return false;
+     * failures.  See comments in shift_forward().  This can cause O(N^2)
+     * behavior more severely than adding 32 empty slots can... */
+    if (unlikely (idx < count && !shift_forward (count - idx))) return false;
 
     assert (idx >= count);
 
@@ -445,52 +475,6 @@ hb_buffer_t::set_masks (hb_mask_t    value,
 }
 
 void
-hb_buffer_t::reverse_range (unsigned int start,
-                           unsigned int end)
-{
-  if (end - start < 2)
-    return;
-
-  hb_array_t<hb_glyph_info_t> (info, len).reverse (start, end);
-
-  if (have_positions) {
-    hb_array_t<hb_glyph_position_t> (pos, len).reverse (start, end);
-  }
-}
-
-void
-hb_buffer_t::reverse ()
-{
-  if (unlikely (!len))
-    return;
-
-  reverse_range (0, len);
-}
-
-void
-hb_buffer_t::reverse_clusters ()
-{
-  unsigned int i, start, count, last_cluster;
-
-  if (unlikely (!len))
-    return;
-
-  reverse ();
-
-  count = len;
-  start = 0;
-  last_cluster = info[0].cluster;
-  for (i = 1; i < count; i++) {
-    if (last_cluster != info[i].cluster) {
-      reverse_range (start, i);
-      start = i;
-      last_cluster = info[i].cluster;
-    }
-  }
-  reverse_range (start, i);
-}
-
-void
 hb_buffer_t::merge_clusters_impl (unsigned int start,
                                  unsigned int end)
 {
@@ -589,36 +573,9 @@ done:
 }
 
 void
-hb_buffer_t::unsafe_to_break_impl (unsigned int start, unsigned int end)
-{
-  unsigned int cluster = UINT_MAX;
-  cluster = _unsafe_to_break_find_min_cluster (info, start, end, cluster);
-  _unsafe_to_break_set_mask (info, start, end, cluster);
-}
-void
-hb_buffer_t::unsafe_to_break_from_outbuffer (unsigned int start, unsigned int end)
-{
-  if (!have_output)
-  {
-    unsafe_to_break_impl (start, end);
-    return;
-  }
-
-  assert (start <= out_len);
-  assert (idx <= end);
-
-  unsigned int cluster = UINT_MAX;
-  cluster = _unsafe_to_break_find_min_cluster (out_info, start, out_len, cluster);
-  cluster = _unsafe_to_break_find_min_cluster (info, idx, end, cluster);
-  _unsafe_to_break_set_mask (out_info, start, out_len, cluster);
-  _unsafe_to_break_set_mask (info, idx, end, cluster);
-}
-
-void
 hb_buffer_t::guess_segment_properties ()
 {
-  assert (content_type == HB_BUFFER_CONTENT_TYPE_UNICODE ||
-         (!len && content_type == HB_BUFFER_CONTENT_TYPE_INVALID));
+  assert_unicode ();
 
   /* If script is set to INVALID, guess from buffer contents */
   if (props.script == HB_SCRIPT_INVALID) {
@@ -659,14 +616,14 @@ DEFINE_NULL_INSTANCE (hb_buffer_t) =
   HB_BUFFER_CLUSTER_LEVEL_DEFAULT,
   HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT,
   0, /* invisible */
-  HB_BUFFER_SCRATCH_FLAG_DEFAULT,
-  HB_BUFFER_MAX_LEN_DEFAULT,
-  HB_BUFFER_MAX_OPS_DEFAULT,
+  0, /* not_found */
+
 
   HB_BUFFER_CONTENT_TYPE_INVALID,
   HB_SEGMENT_PROPERTIES_DEFAULT,
+
   false, /* successful */
-  true, /* have_output */
+  false, /* have_output */
   true  /* have_positions */
 
   /* Zero is good enough for everything else. */
@@ -704,11 +661,51 @@ hb_buffer_create ()
 }
 
 /**
- * hb_buffer_get_empty:
- *
+ * hb_buffer_create_similar:
+ * @src: An #hb_buffer_t
  *
+ * Creates a new #hb_buffer_t, similar to hb_buffer_create(). The only
+ * difference is that the buffer is configured similarly to @src.
  *
  * Return value: (transfer full):
+ * A newly allocated #hb_buffer_t, similar to hb_buffer_create().
+ *
+ * Since: 3.3.0
+ **/
+hb_buffer_t *
+hb_buffer_create_similar (const hb_buffer_t *src)
+{
+  hb_buffer_t *buffer = hb_buffer_create ();
+
+  buffer->similar (*src);
+
+  return buffer;
+}
+
+/**
+ * hb_buffer_reset:
+ * @buffer: An #hb_buffer_t
+ *
+ * Resets the buffer to its initial status, as if it was just newly created
+ * with hb_buffer_create().
+ *
+ * Since: 0.9.2
+ **/
+void
+hb_buffer_reset (hb_buffer_t *buffer)
+{
+  if (unlikely (hb_object_is_immutable (buffer)))
+    return;
+
+  buffer->reset ();
+}
+
+/**
+ * hb_buffer_get_empty:
+ *
+ * Fetches an empty #hb_buffer_t.
+ *
+ * Return value: (transfer full): The empty buffer
  *
  * Since: 0.9.2
  **/
@@ -720,7 +717,7 @@ hb_buffer_get_empty ()
 
 /**
  * hb_buffer_reference: (skip)
- * @buffer: an #hb_buffer_t.
+ * @buffer: An #hb_buffer_t
  *
  * Increases the reference count on @buffer by one. This prevents @buffer from
  * being destroyed until a matching call to hb_buffer_destroy() is made.
@@ -738,7 +735,7 @@ hb_buffer_reference (hb_buffer_t *buffer)
 
 /**
  * hb_buffer_destroy: (skip)
- * @buffer: an #hb_buffer_t.
+ * @buffer: An #hb_buffer_t
  *
  * Deallocate the @buffer.
  * Decreases the reference count on @buffer by one. If the result is zero, then
@@ -753,27 +750,27 @@ hb_buffer_destroy (hb_buffer_t *buffer)
 
   hb_unicode_funcs_destroy (buffer->unicode);
 
-  free (buffer->info);
-  free (buffer->pos);
+  hb_free (buffer->info);
+  hb_free (buffer->pos);
 #ifndef HB_NO_BUFFER_MESSAGE
   if (buffer->message_destroy)
     buffer->message_destroy (buffer->message_data);
 #endif
 
-  free (buffer);
+  hb_free (buffer);
 }
 
 /**
  * hb_buffer_set_user_data: (skip)
- * @buffer: an #hb_buffer_t.
- * @key:
- * @data:
- * @destroy:
- * @replace:
- *
+ * @buffer: An #hb_buffer_t
+ * @key: The user-data key
+ * @data: A pointer to the user data
+ * @destroy: (nullable): A callback to call when @data is not needed anymore
+ * @replace: Whether to replace an existing data with the same key
  *
+ * Attaches a user-data key/data pair to the specified buffer. 
  *
- * Return value:
+ * Return value: %true if success, %false otherwise
  *
  * Since: 0.9.2
  **/
@@ -789,12 +786,13 @@ hb_buffer_set_user_data (hb_buffer_t        *buffer,
 
 /**
  * hb_buffer_get_user_data: (skip)
- * @buffer: an #hb_buffer_t.
- * @key:
+ * @buffer: An #hb_buffer_t
+ * @key: The user-data key to query
  *
+ * Fetches the user data associated with the specified key,
+ * attached to the specified buffer.
  *
- *
- * Return value:
+ * Return value: (transfer none): A pointer to the user data
  *
  * Since: 0.9.2
  **/
@@ -808,11 +806,11 @@ hb_buffer_get_user_data (hb_buffer_t        *buffer,
 
 /**
  * hb_buffer_set_content_type:
- * @buffer: an #hb_buffer_t.
- * @content_type: the type of buffer contents to set
+ * @buffer: An #hb_buffer_t
+ * @content_type: The type of buffer contents to set
  *
- * Sets the type of @buffer contents, buffers are either empty, contain
- * characters (before shaping) or glyphs (the result of shaping).
+ * Sets the type of @buffer contents. Buffers are either empty, contain
+ * characters (before shaping), or contain glyphs (the result of shaping).
  *
  * Since: 0.9.5
  **/
@@ -825,12 +823,13 @@ hb_buffer_set_content_type (hb_buffer_t              *buffer,
 
 /**
  * hb_buffer_get_content_type:
- * @buffer: an #hb_buffer_t.
+ * @buffer: An #hb_buffer_t
  *
- * see hb_buffer_set_content_type().
+ * Fetches the type of @buffer contents. Buffers are either empty, contain
+ * characters (before shaping), or contain glyphs (the result of shaping).
  *
  * Return value:
- * The type of @buffer contents.
+ * The type of @buffer contents
  *
  * Since: 0.9.5
  **/
@@ -843,10 +842,11 @@ hb_buffer_get_content_type (hb_buffer_t *buffer)
 
 /**
  * hb_buffer_set_unicode_funcs:
- * @buffer: an #hb_buffer_t.
- * @unicode_funcs:
- *
+ * @buffer: An #hb_buffer_t
+ * @unicode_funcs: The Unicode-functions structure
  *
+ * Sets the Unicode-functions structure of a buffer to
+ * @unicode_funcs.
  *
  * Since: 0.9.2
  **/
@@ -867,11 +867,11 @@ hb_buffer_set_unicode_funcs (hb_buffer_t        *buffer,
 
 /**
  * hb_buffer_get_unicode_funcs:
- * @buffer: an #hb_buffer_t.
+ * @buffer: An #hb_buffer_t
  *
+ * Fetches the Unicode-functions structure of a buffer.
  *
- *
- * Return value:
+ * Return value: The Unicode-functions structure
  *
  * Since: 0.9.2
  **/
@@ -883,7 +883,7 @@ hb_buffer_get_unicode_funcs (hb_buffer_t        *buffer)
 
 /**
  * hb_buffer_set_direction:
- * @buffer: an #hb_buffer_t.
+ * @buffer: An #hb_buffer_t
  * @direction: the #hb_direction_t of the @buffer
  *
  * Set the text flow direction of the buffer. No shaping can happen without
@@ -909,7 +909,7 @@ hb_buffer_set_direction (hb_buffer_t    *buffer,
 
 /**
  * hb_buffer_get_direction:
- * @buffer: an #hb_buffer_t.
+ * @buffer: An #hb_buffer_t
  *
  * See hb_buffer_set_direction()
  *
@@ -926,8 +926,8 @@ hb_buffer_get_direction (hb_buffer_t    *buffer)
 
 /**
  * hb_buffer_set_script:
- * @buffer: an #hb_buffer_t.
- * @script: an #hb_script_t to set.
+ * @buffer: An #hb_buffer_t
+ * @script: An #hb_script_t to set.
  *
  * Sets the script of @buffer to @script.
  *
@@ -953,12 +953,12 @@ hb_buffer_set_script (hb_buffer_t *buffer,
 
 /**
  * hb_buffer_get_script:
- * @buffer: an #hb_buffer_t.
+ * @buffer: An #hb_buffer_t
  *
- * See hb_buffer_set_script().
+ * Fetches the script of @buffer.
  *
  * Return value:
- * The #hb_script_t of the @buffer.
+ * The #hb_script_t of the @buffer
  *
  * Since: 0.9.2
  **/
@@ -970,8 +970,8 @@ hb_buffer_get_script (hb_buffer_t *buffer)
 
 /**
  * hb_buffer_set_language:
- * @buffer: an #hb_buffer_t.
- * @language: an hb_language_t to set.
+ * @buffer: An #hb_buffer_t
+ * @language: An hb_language_t to set
  *
  * Sets the language of @buffer to @language.
  *
@@ -997,7 +997,7 @@ hb_buffer_set_language (hb_buffer_t   *buffer,
 
 /**
  * hb_buffer_get_language:
- * @buffer: an #hb_buffer_t.
+ * @buffer: An #hb_buffer_t
  *
  * See hb_buffer_set_language().
  *
@@ -1014,8 +1014,8 @@ hb_buffer_get_language (hb_buffer_t *buffer)
 
 /**
  * hb_buffer_set_segment_properties:
- * @buffer: an #hb_buffer_t.
- * @props: an #hb_segment_properties_t to use.
+ * @buffer: An #hb_buffer_t
+ * @props: An #hb_segment_properties_t to use
  *
  * Sets the segment properties of the buffer, a shortcut for calling
  * hb_buffer_set_direction(), hb_buffer_set_script() and
@@ -1035,8 +1035,8 @@ hb_buffer_set_segment_properties (hb_buffer_t *buffer,
 
 /**
  * hb_buffer_get_segment_properties:
- * @buffer: an #hb_buffer_t.
- * @props: (out): the output #hb_segment_properties_t.
+ * @buffer: An #hb_buffer_t
+ * @props: (out): The output #hb_segment_properties_t
  *
  * Sets @props to the #hb_segment_properties_t of @buffer.
  *
@@ -1052,8 +1052,8 @@ hb_buffer_get_segment_properties (hb_buffer_t *buffer,
 
 /**
  * hb_buffer_set_flags:
- * @buffer: an #hb_buffer_t.
- * @flags: the buffer flags to set.
+ * @buffer: An #hb_buffer_t
+ * @flags: The buffer flags to set
  *
  * Sets @buffer flags to @flags. See #hb_buffer_flags_t.
  *
@@ -1071,12 +1071,12 @@ hb_buffer_set_flags (hb_buffer_t       *buffer,
 
 /**
  * hb_buffer_get_flags:
- * @buffer: an #hb_buffer_t.
+ * @buffer: An #hb_buffer_t
  *
- * See hb_buffer_set_flags().
+ * Fetches the #hb_buffer_flags_t of @buffer.
  *
  * Return value:
- * The @buffer flags.
+ * The @buffer flags
  *
  * Since: 0.9.7
  **/
@@ -1088,16 +1088,18 @@ hb_buffer_get_flags (hb_buffer_t *buffer)
 
 /**
  * hb_buffer_set_cluster_level:
- * @buffer: an #hb_buffer_t.
- * @cluster_level:
- *
+ * @buffer: An #hb_buffer_t
+ * @cluster_level: The cluster level to set on the buffer
  *
+ * Sets the cluster level of a buffer. The #hb_buffer_cluster_level_t
+ * dictates one aspect of how HarfBuzz will treat non-base characters 
+ * during shaping.
  *
  * Since: 0.9.42
  **/
 void
-hb_buffer_set_cluster_level (hb_buffer_t       *buffer,
-                    hb_buffer_cluster_level_t  cluster_level)
+hb_buffer_set_cluster_level (hb_buffer_t               *buffer,
+                            hb_buffer_cluster_level_t  cluster_level)
 {
   if (unlikely (hb_object_is_immutable (buffer)))
     return;
@@ -1107,11 +1109,13 @@ hb_buffer_set_cluster_level (hb_buffer_t       *buffer,
 
 /**
  * hb_buffer_get_cluster_level:
- * @buffer: an #hb_buffer_t.
+ * @buffer: An #hb_buffer_t
  *
+ * Fetches the cluster level of a buffer. The #hb_buffer_cluster_level_t
+ * dictates one aspect of how HarfBuzz will treat non-base characters 
+ * during shaping.
  *
- *
- * Return value:
+ * Return value: The cluster level of @buffer
  *
  * Since: 0.9.42
  **/
@@ -1124,13 +1128,13 @@ hb_buffer_get_cluster_level (hb_buffer_t *buffer)
 
 /**
  * hb_buffer_set_replacement_codepoint:
- * @buffer: an #hb_buffer_t.
+ * @buffer: An #hb_buffer_t
  * @replacement: the replacement #hb_codepoint_t
  *
  * Sets the #hb_codepoint_t that replaces invalid entries for a given encoding
  * when adding text to @buffer.
  *
- * Default is %HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT.
+ * Default is #HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT.
  *
  * Since: 0.9.31
  **/
@@ -1146,12 +1150,13 @@ hb_buffer_set_replacement_codepoint (hb_buffer_t    *buffer,
 
 /**
  * hb_buffer_get_replacement_codepoint:
- * @buffer: an #hb_buffer_t.
+ * @buffer: An #hb_buffer_t
  *
- * See hb_buffer_set_replacement_codepoint().
+ * Fetches the #hb_codepoint_t that replaces invalid entries for a given encoding
+ * when adding text to @buffer.
  *
  * Return value:
- * The @buffer replacement #hb_codepoint_t.
+ * The @buffer replacement #hb_codepoint_t
  *
  * Since: 0.9.31
  **/
@@ -1164,7 +1169,7 @@ hb_buffer_get_replacement_codepoint (hb_buffer_t    *buffer)
 
 /**
  * hb_buffer_set_invisible_glyph:
- * @buffer: an #hb_buffer_t.
+ * @buffer: An #hb_buffer_t
  * @invisible: the invisible #hb_codepoint_t
  *
  * Sets the #hb_codepoint_t that replaces invisible characters in
@@ -1186,12 +1191,12 @@ hb_buffer_set_invisible_glyph (hb_buffer_t    *buffer,
 
 /**
  * hb_buffer_get_invisible_glyph:
- * @buffer: an #hb_buffer_t.
+ * @buffer: An #hb_buffer_t
  *
  * See hb_buffer_set_invisible_glyph().
  *
  * Return value:
- * The @buffer invisible #hb_codepoint_t.
+ * The @buffer invisible #hb_codepoint_t
  *
  * Since: 2.0.0
  **/
@@ -1201,25 +1206,50 @@ hb_buffer_get_invisible_glyph (hb_buffer_t    *buffer)
   return buffer->invisible;
 }
 
-
 /**
- * hb_buffer_reset:
- * @buffer: an #hb_buffer_t.
+ * hb_buffer_set_not_found_glyph:
+ * @buffer: An #hb_buffer_t
+ * @not_found: the not-found #hb_codepoint_t
  *
- * Resets the buffer to its initial status, as if it was just newly created
- * with hb_buffer_create().
+ * Sets the #hb_codepoint_t that replaces characters not found in
+ * the font during shaping.
  *
- * Since: 0.9.2
+ * The not-found glyph defaults to zero, sometimes knows as the
+ * ".notdef" glyph.  This API allows for differentiating the two.
+ *
+ * Since: 3.1.0
  **/
 void
-hb_buffer_reset (hb_buffer_t *buffer)
+hb_buffer_set_not_found_glyph (hb_buffer_t    *buffer,
+                              hb_codepoint_t  not_found)
 {
-  buffer->reset ();
+  if (unlikely (hb_object_is_immutable (buffer)))
+    return;
+
+  buffer->not_found = not_found;
+}
+
+/**
+ * hb_buffer_get_not_found_glyph:
+ * @buffer: An #hb_buffer_t
+ *
+ * See hb_buffer_set_not_found_glyph().
+ *
+ * Return value:
+ * The @buffer not-found #hb_codepoint_t
+ *
+ * Since: 3.1.0
+ **/
+hb_codepoint_t
+hb_buffer_get_not_found_glyph (hb_buffer_t    *buffer)
+{
+  return buffer->not_found;
 }
 
+
 /**
  * hb_buffer_clear_contents:
- * @buffer: an #hb_buffer_t.
+ * @buffer: An #hb_buffer_t
  *
  * Similar to hb_buffer_reset(), but does not clear the Unicode functions and
  * the replacement code point.
@@ -1229,18 +1259,21 @@ hb_buffer_reset (hb_buffer_t *buffer)
 void
 hb_buffer_clear_contents (hb_buffer_t *buffer)
 {
+  if (unlikely (hb_object_is_immutable (buffer)))
+    return;
+
   buffer->clear ();
 }
 
 /**
  * hb_buffer_pre_allocate:
- * @buffer: an #hb_buffer_t.
- * @size: number of items to pre allocate.
+ * @buffer: An #hb_buffer_t
+ * @size: Number of items to pre allocate.
  *
  * Pre allocates memory for @buffer to fit at least @size number of items.
  *
  * Return value:
- * %true if @buffer memory allocation succeeded, %false otherwise.
+ * %true if @buffer memory allocation succeeded, %false otherwise
  *
  * Since: 0.9.2
  **/
@@ -1252,7 +1285,7 @@ hb_buffer_pre_allocate (hb_buffer_t *buffer, unsigned int size)
 
 /**
  * hb_buffer_allocation_successful:
- * @buffer: an #hb_buffer_t.
+ * @buffer: An #hb_buffer_t
  *
  * Check if allocating memory for the buffer succeeded.
  *
@@ -1269,9 +1302,9 @@ hb_buffer_allocation_successful (hb_buffer_t  *buffer)
 
 /**
  * hb_buffer_add:
- * @buffer: an #hb_buffer_t.
- * @codepoint: a Unicode code point.
- * @cluster: the cluster value of @codepoint.
+ * @buffer: An #hb_buffer_t
+ * @codepoint: A Unicode code point.
+ * @cluster: The cluster value of @codepoint.
  *
  * Appends a character with the Unicode value of @codepoint to @buffer, and
  * gives it the initial cluster value of @cluster. Clusters can be any thing
@@ -1295,8 +1328,8 @@ hb_buffer_add (hb_buffer_t    *buffer,
 
 /**
  * hb_buffer_set_length:
- * @buffer: an #hb_buffer_t.
- * @length: the new length of @buffer.
+ * @buffer: An #hb_buffer_t
+ * @length: The new length of @buffer
  *
  * Similar to hb_buffer_pre_allocate(), but clears any new items added at the
  * end.
@@ -1313,7 +1346,7 @@ hb_buffer_set_length (hb_buffer_t  *buffer,
   if (unlikely (hb_object_is_immutable (buffer)))
     return length == 0;
 
-  if (!buffer->ensure (length))
+  if (unlikely (!buffer->ensure (length)))
     return false;
 
   /* Wipe the new space */
@@ -1337,7 +1370,7 @@ hb_buffer_set_length (hb_buffer_t  *buffer,
 
 /**
  * hb_buffer_get_length:
- * @buffer: an #hb_buffer_t.
+ * @buffer: An #hb_buffer_t
  *
  * Returns the number of items in the buffer.
  *
@@ -1355,8 +1388,8 @@ hb_buffer_get_length (hb_buffer_t *buffer)
 
 /**
  * hb_buffer_get_glyph_infos:
- * @buffer: an #hb_buffer_t.
- * @length: (out): output array length.
+ * @buffer: An #hb_buffer_t
+ * @length: (out): The output-array length.
  *
  * Returns @buffer glyph information array.  Returned pointer
  * is valid as long as @buffer contents are not modified.
@@ -1379,12 +1412,17 @@ hb_buffer_get_glyph_infos (hb_buffer_t  *buffer,
 
 /**
  * hb_buffer_get_glyph_positions:
- * @buffer: an #hb_buffer_t.
- * @length: (out): output length.
+ * @buffer: An #hb_buffer_t
+ * @length: (out): The output length
  *
  * Returns @buffer glyph position array.  Returned pointer
  * is valid as long as @buffer contents are not modified.
  *
+ * If buffer did not have positions before, the positions will be
+ * initialized to zeros, unless this function is called from
+ * within a buffer message callback (see hb_buffer_set_message_func()),
+ * in which case %NULL is returned.
+ *
  * Return value: (transfer none) (array length=length):
  * The @buffer glyph position array.
  * The value valid as long as buffer has not been modified.
@@ -1395,23 +1433,47 @@ hb_glyph_position_t *
 hb_buffer_get_glyph_positions (hb_buffer_t  *buffer,
                               unsigned int *length)
 {
-  if (!buffer->have_positions)
-    buffer->clear_positions ();
-
   if (length)
     *length = buffer->len;
 
+  if (!buffer->have_positions)
+  {
+    if (unlikely (buffer->message_depth))
+      return nullptr;
+
+    buffer->clear_positions ();
+  }
+
   return (hb_glyph_position_t *) buffer->pos;
 }
 
 /**
+ * hb_buffer_has_positions:
+ * @buffer: an #hb_buffer_t.
+ *
+ * Returns whether @buffer has glyph position data.
+ * A buffer gains position data when hb_buffer_get_glyph_positions() is called on it,
+ * and cleared of position data when hb_buffer_clear_contents() is called.
+ *
+ * Return value:
+ * %true if the @buffer has position array, %false otherwise.
+ *
+ * Since: 2.7.3
+ **/
+HB_EXTERN hb_bool_t
+hb_buffer_has_positions (hb_buffer_t  *buffer)
+{
+  return buffer->have_positions;
+}
+
+/**
  * hb_glyph_info_get_glyph_flags:
- * @info: a #hb_glyph_info_t.
+ * @info: a #hb_glyph_info_t
  *
  * Returns glyph flags encoded within a #hb_glyph_info_t.
  *
  * Return value:
- * The #hb_glyph_flags_t encoded within @info.
+ * The #hb_glyph_flags_t encoded within @info
  *
  * Since: 1.5.0
  **/
@@ -1423,7 +1485,7 @@ hb_glyph_flags_t
 
 /**
  * hb_buffer_reverse:
- * @buffer: an #hb_buffer_t.
+ * @buffer: An #hb_buffer_t
  *
  * Reverses buffer contents.
  *
@@ -1437,11 +1499,11 @@ hb_buffer_reverse (hb_buffer_t *buffer)
 
 /**
  * hb_buffer_reverse_range:
- * @buffer: an #hb_buffer_t.
- * @start: start index.
- * @end: end index.
+ * @buffer: An #hb_buffer_t
+ * @start: start index
+ * @end: end index
  *
- * Reverses buffer contents between start to end.
+ * Reverses buffer contents between @start and @end.
  *
  * Since: 0.9.41
  **/
@@ -1454,7 +1516,7 @@ hb_buffer_reverse_range (hb_buffer_t *buffer,
 
 /**
  * hb_buffer_reverse_clusters:
- * @buffer: an #hb_buffer_t.
+ * @buffer: An #hb_buffer_t
  *
  * Reverses buffer clusters.  That is, the buffer contents are
  * reversed, then each cluster (consecutive items having the
@@ -1470,24 +1532,24 @@ hb_buffer_reverse_clusters (hb_buffer_t *buffer)
 
 /**
  * hb_buffer_guess_segment_properties:
- * @buffer: an #hb_buffer_t.
+ * @buffer: An #hb_buffer_t
  *
  * Sets unset buffer segment properties based on buffer Unicode
  * contents.  If buffer is not empty, it must have content type
- * %HB_BUFFER_CONTENT_TYPE_UNICODE.
+ * #HB_BUFFER_CONTENT_TYPE_UNICODE.
  *
- * If buffer script is not set (ie. is %HB_SCRIPT_INVALID), it
+ * If buffer script is not set (ie. is #HB_SCRIPT_INVALID), it
  * will be set to the Unicode script of the first character in
- * the buffer that has a script other than %HB_SCRIPT_COMMON,
- * %HB_SCRIPT_INHERITED, and %HB_SCRIPT_UNKNOWN.
+ * the buffer that has a script other than #HB_SCRIPT_COMMON,
+ * #HB_SCRIPT_INHERITED, and #HB_SCRIPT_UNKNOWN.
  *
- * Next, if buffer direction is not set (ie. is %HB_DIRECTION_INVALID),
+ * Next, if buffer direction is not set (ie. is #HB_DIRECTION_INVALID),
  * it will be set to the natural horizontal direction of the
  * buffer script as returned by hb_script_get_horizontal_direction().
- * If hb_script_get_horizontal_direction() returns %HB_DIRECTION_INVALID,
- * then %HB_DIRECTION_LTR is used.
+ * If hb_script_get_horizontal_direction() returns #HB_DIRECTION_INVALID,
+ * then #HB_DIRECTION_LTR is used.
  *
- * Finally, if buffer language is not set (ie. is %HB_LANGUAGE_INVALID),
+ * Finally, if buffer language is not set (ie. is #HB_LANGUAGE_INVALID),
  * it will be set to the process's default language as returned by
  * hb_language_get_default().  This may change in the future by
  * taking buffer script into consideration when choosing a language.
@@ -1513,8 +1575,7 @@ hb_buffer_add_utf (hb_buffer_t  *buffer,
   typedef typename utf_t::codepoint_t T;
   const hb_codepoint_t replacement = buffer->replacement;
 
-  assert (buffer->content_type == HB_BUFFER_CONTENT_TYPE_UNICODE ||
-         (!buffer->len && buffer->content_type == HB_BUFFER_CONTENT_TYPE_INVALID));
+  buffer->assert_unicode ();
 
   if (unlikely (hb_object_is_immutable (buffer)))
     return;
@@ -1525,7 +1586,10 @@ hb_buffer_add_utf (hb_buffer_t  *buffer,
   if (item_length == -1)
     item_length = text_length - item_offset;
 
-  buffer->ensure (buffer->len + item_length * sizeof (T) / 4);
+  if (unlikely (item_length < 0 ||
+               item_length > INT_MAX / 8 ||
+               !buffer->ensure (buffer->len + item_length * sizeof (T) / 4)))
+    return;
 
   /* If buffer is empty and pre-context provided, install it.
    * This check is written this way, to make sure people can
@@ -1573,12 +1637,12 @@ hb_buffer_add_utf (hb_buffer_t  *buffer,
 
 /**
  * hb_buffer_add_utf8:
- * @buffer: an #hb_buffer_t.
- * @text: (array length=text_length) (element-type uint8_t): an array of UTF-8
+ * @buffer: An #hb_buffer_t
+ * @text: (array length=text_length) (element-type uint8_t): An array of UTF-8
  *               characters to append.
- * @text_length: the length of the @text, or -1 if it is %NULL terminated.
- * @item_offset: the offset of the first character to add to the @buffer.
- * @item_length: the number of characters to add to the @buffer, or -1 for the
+ * @text_length: The length of the @text, or -1 if it is %NULL terminated.
+ * @item_offset: The offset of the first character to add to the @buffer.
+ * @item_length: The number of characters to add to the @buffer, or -1 for the
  *               end of @text (assuming it is %NULL terminated).
  *
  * See hb_buffer_add_codepoints().
@@ -1600,12 +1664,12 @@ hb_buffer_add_utf8 (hb_buffer_t  *buffer,
 
 /**
  * hb_buffer_add_utf16:
- * @buffer: an #hb_buffer_t.
- * @text: (array length=text_length): an array of UTF-16 characters to append.
- * @text_length: the length of the @text, or -1 if it is %NULL terminated.
- * @item_offset: the offset of the first character to add to the @buffer.
- * @item_length: the number of characters to add to the @buffer, or -1 for the
- *               end of @text (assuming it is %NULL terminated).
+ * @buffer: An #hb_buffer_t
+ * @text: (array length=text_length): An array of UTF-16 characters to append
+ * @text_length: The length of the @text, or -1 if it is %NULL terminated
+ * @item_offset: The offset of the first character to add to the @buffer
+ * @item_length: The number of characters to add to the @buffer, or -1 for the
+ *               end of @text (assuming it is %NULL terminated)
  *
  * See hb_buffer_add_codepoints().
  *
@@ -1626,12 +1690,12 @@ hb_buffer_add_utf16 (hb_buffer_t    *buffer,
 
 /**
  * hb_buffer_add_utf32:
- * @buffer: an #hb_buffer_t.
- * @text: (array length=text_length): an array of UTF-32 characters to append.
- * @text_length: the length of the @text, or -1 if it is %NULL terminated.
- * @item_offset: the offset of the first character to add to the @buffer.
- * @item_length: the number of characters to add to the @buffer, or -1 for the
- *               end of @text (assuming it is %NULL terminated).
+ * @buffer: An #hb_buffer_t
+ * @text: (array length=text_length): An array of UTF-32 characters to append
+ * @text_length: The length of the @text, or -1 if it is %NULL terminated
+ * @item_offset: The offset of the first character to add to the @buffer
+ * @item_length: The number of characters to add to the @buffer, or -1 for the
+ *               end of @text (assuming it is %NULL terminated)
  *
  * See hb_buffer_add_codepoints().
  *
@@ -1652,13 +1716,13 @@ hb_buffer_add_utf32 (hb_buffer_t    *buffer,
 
 /**
  * hb_buffer_add_latin1:
- * @buffer: an #hb_buffer_t.
+ * @buffer: An #hb_buffer_t
  * @text: (array length=text_length) (element-type uint8_t): an array of UTF-8
- *               characters to append.
- * @text_length: the length of the @text, or -1 if it is %NULL terminated.
- * @item_offset: the offset of the first character to add to the @buffer.
+ *               characters to append
+ * @text_length: the length of the @text, or -1 if it is %NULL terminated
+ * @item_offset: the offset of the first character to add to the @buffer
  * @item_length: the number of characters to add to the @buffer, or -1 for the
- *               end of @text (assuming it is %NULL terminated).
+ *               end of @text (assuming it is %NULL terminated)
  *
  * Similar to hb_buffer_add_codepoints(), but allows only access to first 256
  * Unicode code points that can fit in 8-bit strings.
@@ -1714,8 +1778,8 @@ hb_buffer_add_codepoints (hb_buffer_t          *buffer,
 
 /**
  * hb_buffer_append:
- * @buffer: an #hb_buffer_t.
- * @source: source #hb_buffer_t.
+ * @buffer: An #hb_buffer_t
+ * @source: source #hb_buffer_t
  * @start: start index into source buffer to copy.  Use 0 to copy from start of buffer.
  * @end: end index into source buffer to copy.  Use @HB_FEATURE_GLOBAL_END to copy to end of buffer.
  *
@@ -1725,7 +1789,7 @@ hb_buffer_add_codepoints (hb_buffer_t          *buffer,
  **/
 HB_EXTERN void
 hb_buffer_append (hb_buffer_t *buffer,
-                 hb_buffer_t *source,
+                 const hb_buffer_t *source,
                  unsigned int start,
                  unsigned int end)
 {
@@ -1742,11 +1806,6 @@ hb_buffer_append (hb_buffer_t *buffer,
   if (start == end)
     return;
 
-  if (!buffer->len)
-    buffer->content_type = source->content_type;
-  if (!buffer->have_positions && source->have_positions)
-    buffer->clear_positions ();
-
   if (buffer->len + (end - start) < buffer->len) /* Overflows. */
   {
     buffer->successful = false;
@@ -1758,9 +1817,38 @@ hb_buffer_append (hb_buffer_t *buffer,
   if (unlikely (!buffer->successful))
     return;
 
+  if (!orig_len)
+    buffer->content_type = source->content_type;
+  if (!buffer->have_positions && source->have_positions)
+    buffer->clear_positions ();
+
+  hb_segment_properties_overlay (&buffer->props, &source->props);
+
   memcpy (buffer->info + orig_len, source->info + start, (end - start) * sizeof (buffer->info[0]));
   if (buffer->have_positions)
     memcpy (buffer->pos + orig_len, source->pos + start, (end - start) * sizeof (buffer->pos[0]));
+
+  if (source->content_type == HB_BUFFER_CONTENT_TYPE_UNICODE)
+  {
+    /* See similar logic in add_utf. */
+
+    /* pre-context */
+    if (!orig_len && start + source->context_len[0] > 0)
+    {
+      buffer->clear_context (0);
+      while (start > 0 && buffer->context_len[0] < buffer->CONTEXT_LENGTH)
+       buffer->context[0][buffer->context_len[0]++] = source->info[--start].codepoint;
+      for (auto i = 0u; i < source->context_len[0] && buffer->context_len[0] < buffer->CONTEXT_LENGTH; i++)
+       buffer->context[0][buffer->context_len[0]++] = source->context[0][i];
+    }
+
+    /* post-context */
+    buffer->clear_context (1);
+    while (end < source->len && buffer->context_len[1] < buffer->CONTEXT_LENGTH)
+      buffer->context[1][buffer->context_len[1]++] = source->info[end++].codepoint;
+    for (auto i = 0u; i < source->context_len[1] && buffer->context_len[1] < buffer->CONTEXT_LENGTH; i++)
+      buffer->context[1][buffer->context_len[1]++] = source->context[1][i];
+  }
 }
 
 
@@ -1821,7 +1909,7 @@ normalize_glyphs_cluster (hb_buffer_t *buffer,
 
 /**
  * hb_buffer_normalize_glyphs:
- * @buffer: an #hb_buffer_t.
+ * @buffer: An #hb_buffer_t
  *
  * Reorders a glyph buffer to have canonical in-cluster glyph order / position.
  * The resulting clusters should behave identical to pre-reordering clusters.
@@ -1834,8 +1922,8 @@ void
 hb_buffer_normalize_glyphs (hb_buffer_t *buffer)
 {
   assert (buffer->have_positions);
-  assert (buffer->content_type == HB_BUFFER_CONTENT_TYPE_GLYPHS ||
-         (!buffer->len && buffer->content_type == HB_BUFFER_CONTENT_TYPE_INVALID));
+
+  buffer->assert_glyphs ();
 
   bool backward = HB_DIRECTION_IS_BACKWARD (buffer->props.direction);
 
@@ -1876,8 +1964,8 @@ hb_buffer_t::sort (unsigned int start, unsigned int end, int(*compar)(const hb_g
  * @dottedcircle_glyph: glyph id of U+25CC DOTTED CIRCLE, or (hb_codepont_t) -1.
  * @position_fuzz: allowed absolute difference in position values.
  *
- * If dottedcircle_glyph is (hb_codepoint_t) -1 then %HB_BUFFER_DIFF_FLAG_DOTTED_CIRCLE_PRESENT
- * and %HB_BUFFER_DIFF_FLAG_NOTDEF_PRESENT are never returned.  This should be used by most
+ * If dottedcircle_glyph is (hb_codepoint_t) -1 then #HB_BUFFER_DIFF_FLAG_DOTTED_CIRCLE_PRESENT
+ * and #HB_BUFFER_DIFF_FLAG_NOTDEF_PRESENT are never returned.  This should be used by most
  * callers if just comparing two buffers is needed.
  *
  * Since: 1.5.0
@@ -1967,12 +2055,12 @@ hb_buffer_diff (hb_buffer_t *buffer,
 #ifndef HB_NO_BUFFER_MESSAGE
 /**
  * hb_buffer_set_message_func:
- * @buffer: an #hb_buffer_t.
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
- *
+ * @buffer: An #hb_buffer_t
+ * @func: (closure user_data) (destroy destroy) (scope notified): Callback function
+ * @user_data: (nullable): Data to pass to @func
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
  *
+ * Sets the implementation function for #hb_buffer_message_func_t.
  *
  * Since: 1.1.3
  **/
index 2f581f3..ee72dfa 100644 (file)
@@ -27,7 +27,7 @@
  * Google Author(s): Behdad Esfahbod
  */
 
-#ifndef HB_H_IN
+#if !defined(HB_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb.h> instead."
 #endif
 
@@ -59,8 +59,7 @@ HB_BEGIN_DECLS
  * The #hb_glyph_info_t is the structure that holds information about the
  * glyphs and their relation to input text.
  */
-typedef struct hb_glyph_info_t
-{
+typedef struct hb_glyph_info_t {
   hb_codepoint_t codepoint;
   /*< private >*/
   hb_mask_t      mask;
@@ -77,26 +76,79 @@ typedef struct hb_glyph_info_t
  * @HB_GLYPH_FLAG_UNSAFE_TO_BREAK: Indicates that if input text is broken at the
  *                                beginning of the cluster this glyph is part of,
  *                                then both sides need to be re-shaped, as the
- *                                result might be different.  On the flip side,
- *                                it means that when this flag is not present,
- *                                then it's safe to break the glyph-run at the
- *                                beginning of this cluster, and the two sides
- *                                represent the exact same result one would get
- *                                if breaking input text at the beginning of
- *                                this cluster and shaping the two sides
- *                                separately.  This can be used to optimize
- *                                paragraph layout, by avoiding re-shaping
- *                                of each line after line-breaking, or limiting
- *                                the reshaping to a small piece around the
- *                                breaking point only.
+ *                                result might be different.
+ *                                On the flip side, it means that when this
+ *                                flag is not present, then it is safe to break
+ *                                the glyph-run at the beginning of this
+ *                                cluster, and the two sides will represent the
+ *                                exact same result one would get if breaking
+ *                                input text at the beginning of this cluster
+ *                                and shaping the two sides separately.
+ *                                This can be used to optimize paragraph
+ *                                layout, by avoiding re-shaping of each line
+ *                                after line-breaking.
+ * @HB_GLYPH_FLAG_UNSAFE_TO_CONCAT: Indicates that if input text is changed on one
+ *                                side of the beginning of the cluster this glyph
+ *                                is part of, then the shaping results for the
+ *                                other side might change.
+ *                                Note that the absence of this flag will NOT by
+ *                                itself mean that it IS safe to concat text.
+ *                                Only two pieces of text both of which clear of
+ *                                this flag can be concatenated safely.
+ *                                This can be used to optimize paragraph
+ *                                layout, by avoiding re-shaping of each line
+ *                                after line-breaking, by limiting the
+ *                                reshaping to a small piece around the
+ *                                breaking positin only, even if the breaking
+ *                                position carries the
+ *                                #HB_GLYPH_FLAG_UNSAFE_TO_BREAK or when
+ *                                hyphenation or other text transformation
+ *                                happens at line-break position, in the following
+ *                                way:
+ *                                1. Iterate back from the line-break position
+ *                                until the first cluster start position that is
+ *                                NOT unsafe-to-concat, 2. shape the segment from
+ *                                there till the end of line, 3. check whether the
+ *                                resulting glyph-run also is clear of the
+ *                                unsafe-to-concat at its start-of-text position;
+ *                                if it is, just splice it into place and the line
+ *                                is shaped; If not, move on to a position further
+ *                                back that is clear of unsafe-to-concat and retry
+ *                                from there, and repeat.
+ *                                At the start of next line a similar algorithm can
+ *                                be implemented. That is: 1. Iterate forward from
+ *                                the line-break position untill the first cluster
+ *                                start position that is NOT unsafe-to-concat, 2.
+ *                                shape the segment from beginning of the line to
+ *                                that position, 3. check whether the resulting
+ *                                glyph-run also is clear of the unsafe-to-concat
+ *                                at its end-of-text position; if it is, just splice
+ *                                it into place and the beginning is shaped; If not,
+ *                                move on to a position further forward that is clear
+ *                                of unsafe-to-concat and retry up to there, and repeat.
+ *                                A slight complication will arise in the
+ *                                implementation of the algorithm above,
+ *                                because while our buffer API has a way to
+ *                                return flags for position corresponding to
+ *                                start-of-text, there is currently no position
+ *                                corresponding to end-of-text.  This limitation
+ *                                can be alleviated by shaping more text than needed
+ *                                and looking for unsafe-to-concat flag within text
+ *                                clusters.
+ *                                The #HB_GLYPH_FLAG_UNSAFE_TO_BREAK flag will
+ *                                always imply this flag.
+ *                                Since: 3.3.0
  * @HB_GLYPH_FLAG_DEFINED: All the currently defined flags.
  *
+ * Flags for #hb_glyph_info_t.
+ *
  * Since: 1.5.0
  */
 typedef enum { /*< flags >*/
   HB_GLYPH_FLAG_UNSAFE_TO_BREAK                = 0x00000001,
+  HB_GLYPH_FLAG_UNSAFE_TO_CONCAT       = 0x00000002,
 
-  HB_GLYPH_FLAG_DEFINED                        = 0x00000001 /* OR of all defined flags */
+  HB_GLYPH_FLAG_DEFINED                        = 0x00000003 /* OR of all defined flags */
 } hb_glyph_flags_t;
 
 HB_EXTERN hb_glyph_flags_t
@@ -151,6 +203,11 @@ typedef struct hb_segment_properties_t {
   void           *reserved2;
 } hb_segment_properties_t;
 
+/**
+ * HB_SEGMENT_PROPERTIES_DEFAULT:
+ *
+ * The default #hb_segment_properties_t of of freshly created #hb_buffer_t.
+ */
 #define HB_SEGMENT_PROPERTIES_DEFAULT {HB_DIRECTION_INVALID, \
                                       HB_SCRIPT_INVALID, \
                                       HB_LANGUAGE_INVALID, \
@@ -164,6 +221,9 @@ hb_segment_properties_equal (const hb_segment_properties_t *a,
 HB_EXTERN unsigned int
 hb_segment_properties_hash (const hb_segment_properties_t *p);
 
+HB_EXTERN void
+hb_segment_properties_overlay (hb_segment_properties_t *p,
+                              const hb_segment_properties_t *src);
 
 
 /**
@@ -179,6 +239,13 @@ HB_EXTERN hb_buffer_t *
 hb_buffer_create (void);
 
 HB_EXTERN hb_buffer_t *
+hb_buffer_create_similar (const hb_buffer_t *src);
+
+HB_EXTERN void
+hb_buffer_reset (hb_buffer_t *buffer);
+
+
+HB_EXTERN hb_buffer_t *
 hb_buffer_get_empty (void);
 
 HB_EXTERN hb_buffer_t *
@@ -204,6 +271,8 @@ hb_buffer_get_user_data (hb_buffer_t        *buffer,
  * @HB_BUFFER_CONTENT_TYPE_INVALID: Initial value for new buffer.
  * @HB_BUFFER_CONTENT_TYPE_UNICODE: The buffer contains input characters (before shaping).
  * @HB_BUFFER_CONTENT_TYPE_GLYPHS: The buffer contains output glyphs (after shaping).
+ *
+ * The type of #hb_buffer_t contents.
  */
 typedef enum {
   HB_BUFFER_CONTENT_TYPE_INVALID = 0,
@@ -287,7 +356,17 @@ hb_buffer_guess_segment_properties (hb_buffer_t *buffer);
  * @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
+ *                      character sequences (such at <0905 093E>). Since: 2.4.0
+ * @HB_BUFFER_FLAG_VERIFY:
+ *                      flag indicating that the hb_shape() call and its variants
+ *                      should perform various verification processes on the results
+ *                      of the shaping operation on the buffer.  If the verification
+ *                      fails, then either a buffer message is sent, if a message
+ *                      handler is installed on the buffer, or a message is written
+ *                      to standard error.  In either case, the shaping result might
+ *                      be modified to show the failed output. Since: 3.4.0
+ *
+ * Flags for #hb_buffer_t.
  *
  * Since: 0.9.20
  */
@@ -297,7 +376,8 @@ typedef enum { /*< flags >*/
   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_DO_NOT_INSERT_DOTTED_CIRCLE   = 0x00000010u
+  HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE   = 0x00000010u,
+  HB_BUFFER_FLAG_VERIFY                                = 0x00000020u
 } hb_buffer_flags_t;
 
 HB_EXTERN void
@@ -315,6 +395,23 @@ hb_buffer_get_flags (hb_buffer_t *buffer);
  * @HB_BUFFER_CLUSTER_LEVEL_CHARACTERS: Don't group cluster values.
  * @HB_BUFFER_CLUSTER_LEVEL_DEFAULT: Default cluster level,
  *   equal to @HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES.
+ * 
+ * Data type for holding HarfBuzz's clustering behavior options. The cluster level
+ * dictates one aspect of how HarfBuzz will treat non-base characters 
+ * during shaping.
+ *
+ * In @HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES, non-base
+ * characters are merged into the cluster of the base character that precedes them.
+ *
+ * In @HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS, non-base characters are initially
+ * assigned their own cluster values, which are not merged into preceding base
+ * clusters. This allows HarfBuzz to perform additional operations like reorder
+ * sequences of adjacent marks.
+ *
+ * @HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES is the default, because it maintains
+ * backward compatibility with older versions of HarfBuzz. New client programs that
+ * do not need to maintain such backward compatibility are recommended to use
+ * @HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS instead of the default.
  *
  * Since: 0.9.42
  */
@@ -356,9 +453,17 @@ hb_buffer_set_invisible_glyph (hb_buffer_t    *buffer,
 HB_EXTERN hb_codepoint_t
 hb_buffer_get_invisible_glyph (hb_buffer_t    *buffer);
 
-
 HB_EXTERN void
-hb_buffer_reset (hb_buffer_t *buffer);
+hb_buffer_set_not_found_glyph (hb_buffer_t    *buffer,
+                              hb_codepoint_t  not_found);
+
+HB_EXTERN hb_codepoint_t
+hb_buffer_get_not_found_glyph (hb_buffer_t    *buffer);
+
+
+/*
+ * Content API.
+ */
 
 HB_EXTERN void
 hb_buffer_clear_contents (hb_buffer_t *buffer);
@@ -426,7 +531,7 @@ hb_buffer_add_codepoints (hb_buffer_t          *buffer,
 
 HB_EXTERN void
 hb_buffer_append (hb_buffer_t *buffer,
-                 hb_buffer_t *source,
+                 const hb_buffer_t *source,
                  unsigned int start,
                  unsigned int end);
 
@@ -447,6 +552,9 @@ HB_EXTERN hb_glyph_position_t *
 hb_buffer_get_glyph_positions (hb_buffer_t  *buffer,
                               unsigned int *length);
 
+HB_EXTERN hb_bool_t
+hb_buffer_has_positions (hb_buffer_t  *buffer);
+
 
 HB_EXTERN void
 hb_buffer_normalize_glyphs (hb_buffer_t *buffer);
@@ -518,6 +626,27 @@ hb_buffer_serialize_glyphs (hb_buffer_t *buffer,
                            hb_buffer_serialize_format_t format,
                            hb_buffer_serialize_flags_t flags);
 
+HB_EXTERN unsigned int
+hb_buffer_serialize_unicode (hb_buffer_t *buffer,
+                            unsigned int start,
+                            unsigned int end,
+                            char *buf,
+                            unsigned int buf_size,
+                            unsigned int *buf_consumed,
+                            hb_buffer_serialize_format_t format,
+                            hb_buffer_serialize_flags_t flags);
+
+HB_EXTERN unsigned int
+hb_buffer_serialize (hb_buffer_t *buffer,
+                    unsigned int start,
+                    unsigned int end,
+                    char *buf,
+                    unsigned int buf_size,
+                    unsigned int *buf_consumed,
+                    hb_font_t *font,
+                    hb_buffer_serialize_format_t format,
+                    hb_buffer_serialize_flags_t flags);
+
 HB_EXTERN hb_bool_t
 hb_buffer_deserialize_glyphs (hb_buffer_t *buffer,
                              const char *buf,
@@ -526,11 +655,48 @@ hb_buffer_deserialize_glyphs (hb_buffer_t *buffer,
                              hb_font_t *font,
                              hb_buffer_serialize_format_t format);
 
+HB_EXTERN hb_bool_t
+hb_buffer_deserialize_unicode (hb_buffer_t *buffer,
+                              const char *buf,
+                              int buf_len,
+                              const char **end_ptr,
+                              hb_buffer_serialize_format_t format);
+
+
 
 /*
  * Compare buffers
  */
 
+/**
+ * hb_buffer_diff_flags_t:
+ * @HB_BUFFER_DIFF_FLAG_EQUAL: equal buffers.
+ * @HB_BUFFER_DIFF_FLAG_CONTENT_TYPE_MISMATCH: buffers with different
+ *     #hb_buffer_content_type_t.
+ * @HB_BUFFER_DIFF_FLAG_LENGTH_MISMATCH: buffers with differing length.
+ * @HB_BUFFER_DIFF_FLAG_NOTDEF_PRESENT: `.notdef` glyph is present in the
+ *     reference buffer.
+ * @HB_BUFFER_DIFF_FLAG_DOTTED_CIRCLE_PRESENT: dotted circle glyph is present
+ *     in the reference buffer.
+ * @HB_BUFFER_DIFF_FLAG_CODEPOINT_MISMATCH: difference in #hb_glyph_info_t.codepoint
+ * @HB_BUFFER_DIFF_FLAG_CLUSTER_MISMATCH: difference in #hb_glyph_info_t.cluster
+ * @HB_BUFFER_DIFF_FLAG_GLYPH_FLAGS_MISMATCH: difference in #hb_glyph_flags_t.
+ * @HB_BUFFER_DIFF_FLAG_POSITION_MISMATCH: difference in #hb_glyph_position_t.
+ *
+ * Flags from comparing two #hb_buffer_t's.
+ *
+ * Buffer with different #hb_buffer_content_type_t cannot be meaningfully
+ * compared in any further detail.
+ *
+ * For buffers with differing length, the per-glyph comparison is not
+ * attempted, though we do still scan reference buffer for dotted circle and
+ * `.notdef` glyphs.
+ *
+ * If the buffers have the same length, we compare them glyph-by-glyph and
+ * report which aspect(s) of the glyph info/position are different.
+ *
+ * Since: 1.5.0
+ */
 typedef enum { /*< flags >*/
   HB_BUFFER_DIFF_FLAG_EQUAL                    = 0x0000,
 
@@ -570,6 +736,23 @@ hb_buffer_diff (hb_buffer_t *buffer,
  * Debugging.
  */
 
+/**
+ * hb_buffer_message_func_t:
+ * @buffer: An #hb_buffer_t to work upon
+ * @font: The #hb_font_t the @buffer is shaped with
+ * @message: %NULL-terminated message passed to the function
+ * @user_data: User data pointer passed by the caller
+ *
+ * A callback method for #hb_buffer_t. The method gets called with the
+ * #hb_buffer_t it was set on, the #hb_font_t the buffer is shaped with and a
+ * message describing what step of the shaping process will be performed.
+ * Returning %false from this method will skip this shaping step and move to
+ * the next one.
+ *
+ * Return value: %true to perform the shaping step, %false to skip it.
+ *
+ * Since: 1.1.3
+ */
 typedef hb_bool_t      (*hb_buffer_message_func_t)     (hb_buffer_t *buffer,
                                                         hb_font_t   *font,
                                                         const char  *message,
index dce89fa..cc20f3a 100644 (file)
 
 
 #ifndef HB_BUFFER_MAX_LEN_FACTOR
-#define HB_BUFFER_MAX_LEN_FACTOR 32
+#define HB_BUFFER_MAX_LEN_FACTOR 64
 #endif
 #ifndef HB_BUFFER_MAX_LEN_MIN
-#define HB_BUFFER_MAX_LEN_MIN 8192
+#define HB_BUFFER_MAX_LEN_MIN 16384
 #endif
 #ifndef HB_BUFFER_MAX_LEN_DEFAULT
 #define HB_BUFFER_MAX_LEN_DEFAULT 0x3FFFFFFF /* Shaping more than a billion chars? Let us know! */
 #endif
 
 #ifndef HB_BUFFER_MAX_OPS_FACTOR
-#define HB_BUFFER_MAX_OPS_FACTOR 64
+#define HB_BUFFER_MAX_OPS_FACTOR 1024
 #endif
 #ifndef HB_BUFFER_MAX_OPS_MIN
-#define HB_BUFFER_MAX_OPS_MIN 1024
+#define HB_BUFFER_MAX_OPS_MIN 16384
 #endif
 #ifndef HB_BUFFER_MAX_OPS_DEFAULT
 #define HB_BUFFER_MAX_OPS_DEFAULT 0x1FFFFFFF /* Shaping more than a billion operations? Let us know! */
@@ -67,8 +67,8 @@ enum hb_buffer_scratch_flags_t {
   HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES                = 0x00000002u,
   HB_BUFFER_SCRATCH_FLAG_HAS_SPACE_FALLBACK            = 0x00000004u,
   HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT           = 0x00000008u,
-  HB_BUFFER_SCRATCH_FLAG_HAS_UNSAFE_TO_BREAK           = 0x00000010u,
-  HB_BUFFER_SCRATCH_FLAG_HAS_CGJ                       = 0x00000020u,
+  HB_BUFFER_SCRATCH_FLAG_HAS_CGJ                       = 0x00000010u,
+  HB_BUFFER_SCRATCH_FLAG_HAS_GLYPH_FLAGS               = 0x00000020u,
 
   /* Reserved for complex shapers' internal use. */
   HB_BUFFER_SCRATCH_FLAG_COMPLEX0                      = 0x01000000u,
@@ -87,17 +87,21 @@ struct hb_buffer_t
 {
   hb_object_header_t header;
 
-  /* Information about how the text in the buffer should be treated */
+  /*
+   * Information about how the text in the buffer should be treated.
+   */
+
   hb_unicode_funcs_t *unicode; /* Unicode functions */
   hb_buffer_flags_t flags; /* BOT / EOT / etc. */
   hb_buffer_cluster_level_t cluster_level;
   hb_codepoint_t replacement; /* U+FFFD or something else. */
   hb_codepoint_t invisible; /* 0 or something else. */
-  hb_buffer_scratch_flags_t scratch_flags; /* Have space-fallback, etc. */
-  unsigned int max_len; /* Maximum allowed len. */
-  int max_ops; /* Maximum allowed operations. */
+  hb_codepoint_t not_found; /* 0 or something else. */
+
+  /*
+   * Buffer contents
+   */
 
-  /* Buffer contents */
   hb_buffer_content_type_t content_type;
   hb_segment_properties_t props; /* Script, language, direction */
 
@@ -107,15 +111,13 @@ struct hb_buffer_t
 
   unsigned int idx; /* Cursor into ->info and ->pos arrays */
   unsigned int len; /* Length of ->info and ->pos arrays */
-  unsigned int out_len; /* Length of ->out array if have_output */
+  unsigned int out_len; /* Length of ->out_info array if have_output */
 
   unsigned int allocated; /* Length of allocated arrays */
   hb_glyph_info_t     *info;
   hb_glyph_info_t     *out_info;
   hb_glyph_position_t *pos;
 
-  unsigned int serial;
-
   /* Text before / after the main buffer contents.
    * Always in Unicode, and ordered outward.
    * Index 0 is for "pre-context", 1 for "post-context". */
@@ -123,23 +125,39 @@ struct hb_buffer_t
   hb_codepoint_t context[2][CONTEXT_LENGTH];
   unsigned int context_len[2];
 
-  /* Debugging API */
+
+  /*
+   * Managed by enter / leave
+   */
+
+#ifndef HB_NDEBUG
+  uint8_t allocated_var_bits;
+#endif
+  uint8_t serial;
+  hb_buffer_scratch_flags_t scratch_flags; /* Have space-fallback, etc. */
+  unsigned int max_len; /* Maximum allowed len. */
+  int max_ops; /* Maximum allowed operations. */
+  /* The bits here reflect current allocations of the bytes in glyph_info_t's var1 and var2. */
+
+
+  /*
+   * Messaging callback
+   */
+
 #ifndef HB_NO_BUFFER_MESSAGE
   hb_buffer_message_func_t message_func;
   void *message_data;
   hb_destroy_func_t message_destroy;
+  unsigned message_depth; /* How deeply are we inside a message callback? */
+#else
+  static constexpr unsigned message_depth = 0u;
 #endif
 
-  /* Internal debugging. */
-  /* The bits here reflect current allocations of the bytes in glyph_info_t's var1 and var2. */
-#ifndef HB_NDEBUG
-  uint8_t allocated_var_bits;
-#endif
 
 
   /* Methods */
 
-  bool in_error () const { return !successful; }
+  HB_NODISCARD bool in_error () const { return !successful; }
 
   void allocate_var (unsigned int start, unsigned int count)
   {
@@ -186,110 +204,174 @@ struct hb_buffer_t
   hb_glyph_info_t &prev ()      { return out_info[out_len ? out_len - 1 : 0]; }
   hb_glyph_info_t prev () const { return out_info[out_len ? out_len - 1 : 0]; }
 
-  bool has_separate_output () const { return info != out_info; }
-
-
+  HB_INTERNAL void similar (const hb_buffer_t &src);
   HB_INTERNAL void reset ();
   HB_INTERNAL void clear ();
 
-  unsigned int backtrack_len () const { return have_output? out_len : idx; }
+  /* Called around shape() */
+  HB_INTERNAL void enter ();
+  HB_INTERNAL void leave ();
+
+#ifndef HB_NO_BUFFER_VERIFY
+  HB_INTERNAL
+#endif
+  bool verify (hb_buffer_t        *text_buffer,
+              hb_font_t          *font,
+              const hb_feature_t *features,
+              unsigned int        num_features,
+              const char * const *shapers)
+#ifndef HB_NO_BUFFER_VERIFY
+  ;
+#else
+  { return true; }
+#endif
+
+  unsigned int backtrack_len () const { return have_output ? out_len : idx; }
   unsigned int lookahead_len () const { return len - idx; }
-  unsigned int next_serial () { return serial++; }
+  uint8_t next_serial () { return ++serial ? serial : ++serial; }
 
   HB_INTERNAL void add (hb_codepoint_t  codepoint,
                        unsigned int    cluster);
   HB_INTERNAL void add_info (const hb_glyph_info_t &glyph_info);
 
-  HB_INTERNAL void reverse_range (unsigned int start, unsigned int end);
-  HB_INTERNAL void reverse ();
-  HB_INTERNAL void reverse_clusters ();
-  HB_INTERNAL void guess_segment_properties ();
+  void reverse_range (unsigned start, unsigned end)
+  {
+    hb_array_t<hb_glyph_info_t> (info, len).reverse (start, end);
+    if (have_positions)
+      hb_array_t<hb_glyph_position_t> (pos, len).reverse (start, end);
+  }
+  void reverse () { reverse_range (0, len); }
 
-  HB_INTERNAL void swap_buffers ();
-  HB_INTERNAL void remove_output ();
-  HB_INTERNAL void clear_output ();
-  HB_INTERNAL void clear_positions ();
+  template <typename FuncType>
+  void reverse_groups (const FuncType& group,
+                      bool merge_clusters = false)
+  {
+    if (unlikely (!len))
+      return;
 
-  HB_INTERNAL void replace_glyphs (unsigned int num_in,
-                                  unsigned int num_out,
-                                  const hb_codepoint_t *glyph_data);
+    unsigned start = 0;
+    unsigned i;
+    for (i = 1; i < len; i++)
+    {
+      if (!group (info[i - 1], info[i]))
+      {
+       if (merge_clusters)
+         this->merge_clusters (start, i);
+       reverse_range (start, i);
+       start = i;
+      }
+    }
+    if (merge_clusters)
+      this->merge_clusters (start, i);
+    reverse_range (start, i);
+
+    reverse ();
+  }
 
-  void replace_glyph (hb_codepoint_t glyph_index)
+  template <typename FuncType>
+  unsigned group_end (unsigned start, const FuncType& group) const
   {
-    if (unlikely (out_info != info || out_len != idx)) {
-      if (unlikely (!make_room_for (1, 1))) return;
-      out_info[out_len] = info[idx];
-    }
-    out_info[out_len].codepoint = glyph_index;
+    while (++start < len && group (info[start - 1], info[start]))
+      ;
 
-    idx++;
-    out_len++;
+    return start;
   }
-  /* Makes a copy of the glyph at idx to output and replace glyph_index */
-  hb_glyph_info_t & output_glyph (hb_codepoint_t glyph_index)
+
+  static bool _cluster_group_func (const hb_glyph_info_t& a,
+                                  const hb_glyph_info_t& b)
+  { return a.cluster == b.cluster; }
+
+  void reverse_clusters () { reverse_groups (_cluster_group_func); }
+
+  HB_INTERNAL void guess_segment_properties ();
+
+  HB_INTERNAL void sync ();
+  HB_INTERNAL void clear_output ();
+  HB_INTERNAL void clear_positions ();
+
+  template <typename T>
+  HB_NODISCARD bool replace_glyphs (unsigned int num_in,
+                                   unsigned int num_out,
+                                   const T *glyph_data)
   {
-    if (unlikely (!make_room_for (0, 1))) return Crap (hb_glyph_info_t);
+    if (unlikely (!make_room_for (num_in, num_out))) return false;
 
-    if (unlikely (idx == len && !out_len))
-      return Crap (hb_glyph_info_t);
+    assert (idx + num_in <= len);
 
-    out_info[out_len] = idx < len ? info[idx] : out_info[out_len - 1];
-    out_info[out_len].codepoint = glyph_index;
+    merge_clusters (idx, idx + num_in);
 
-    out_len++;
+    hb_glyph_info_t &orig_info = idx < len ? cur() : prev();
 
-    return out_info[out_len - 1];
+    hb_glyph_info_t *pinfo = &out_info[out_len];
+    for (unsigned int i = 0; i < num_out; i++)
+    {
+      *pinfo = orig_info;
+      pinfo->codepoint = glyph_data[i];
+      pinfo++;
+    }
+
+    idx  += num_in;
+    out_len += num_out;
+    return true;
   }
-  void output_info (const hb_glyph_info_t &glyph_info)
+
+  HB_NODISCARD bool replace_glyph (hb_codepoint_t glyph_index)
+  { return replace_glyphs (1, 1, &glyph_index); }
+
+  /* Makes a copy of the glyph at idx to output and replace glyph_index */
+  HB_NODISCARD bool output_glyph (hb_codepoint_t glyph_index)
+  { return replace_glyphs (0, 1, &glyph_index); }
+
+  HB_NODISCARD bool output_info (const hb_glyph_info_t &glyph_info)
   {
-    if (unlikely (!make_room_for (0, 1))) return;
+    if (unlikely (!make_room_for (0, 1))) return false;
 
     out_info[out_len] = glyph_info;
 
     out_len++;
+    return true;
   }
   /* Copies glyph at idx to output but doesn't advance idx */
-  void copy_glyph ()
+  HB_NODISCARD bool copy_glyph ()
   {
-    if (unlikely (!make_room_for (0, 1))) return;
-
-    out_info[out_len] = info[idx];
-
-    out_len++;
+    /* Extra copy because cur()'s return can be freed within
+     * output_info() call if buffer reallocates. */
+    return output_info (hb_glyph_info_t (cur()));
   }
+
   /* Copies glyph at idx to output and advance idx.
    * If there's no output, just advance idx. */
-  void
-  next_glyph ()
+  HB_NODISCARD bool next_glyph ()
   {
     if (have_output)
     {
       if (out_info != info || out_len != idx)
       {
-       if (unlikely (!make_room_for (1, 1))) return;
+       if (unlikely (!make_room_for (1, 1))) return false;
        out_info[out_len] = info[idx];
       }
       out_len++;
     }
 
     idx++;
+    return true;
   }
   /* Copies n glyphs at idx to output and advance idx.
    * If there's no output, just advance idx. */
-  void
-  next_glyphs (unsigned int n)
+  HB_NODISCARD bool next_glyphs (unsigned int n)
   {
     if (have_output)
     {
       if (out_info != info || out_len != idx)
       {
-       if (unlikely (!make_room_for (n, n))) return;
+       if (unlikely (!make_room_for (n, n))) return false;
        memmove (out_info + out_len, info + idx, n * sizeof (out_info[0]));
       }
       out_len += n;
     }
 
     idx += n;
+    return true;
   }
   /* Advance idx without copying to output. */
   void skip_glyph () { idx++; }
@@ -317,30 +399,131 @@ struct hb_buffer_t
   /* Merge clusters for deleting current glyph, and skip it. */
   HB_INTERNAL void delete_glyph ();
 
-  void unsafe_to_break (unsigned int start,
-                              unsigned int end)
+
+  /* Adds glyph flags in mask to infos with clusters between start and end.
+   * The start index will be from out-buffer if from_out_buffer is true.
+   * If interior is true, then the cluster having the minimum value is skipped. */
+  void _set_glyph_flags (hb_mask_t mask,
+                        unsigned start = 0,
+                        unsigned end = (unsigned) -1,
+                        bool interior = false,
+                        bool from_out_buffer = false)
   {
-    if (end - start < 2)
+    end = hb_min (end, len);
+
+    if (interior && !from_out_buffer && end - start < 2)
       return;
-    unsafe_to_break_impl (start, end);
+
+    scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GLYPH_FLAGS;
+
+    if (!from_out_buffer || !have_output)
+    {
+      if (!interior)
+      {
+       for (unsigned i = start; i < end; i++)
+         info[i].mask |= mask;
+      }
+      else
+      {
+       unsigned cluster = _infos_find_min_cluster (info, start, end);
+       _infos_set_glyph_flags (info, start, end, cluster, mask);
+      }
+    }
+    else
+    {
+      assert (start <= out_len);
+      assert (idx <= end);
+
+      if (!interior)
+      {
+       for (unsigned i = start; i < out_len; i++)
+         out_info[i].mask |= mask;
+       for (unsigned i = idx; i < end; i++)
+         info[i].mask |= mask;
+      }
+      else
+      {
+       unsigned cluster = _infos_find_min_cluster (info, idx, end);
+       cluster = _infos_find_min_cluster (out_info, start, out_len, cluster);
+
+       _infos_set_glyph_flags (out_info, start, out_len, cluster, mask);
+       _infos_set_glyph_flags (info, idx, end, cluster, mask);
+      }
+    }
+  }
+
+  void unsafe_to_break (unsigned int start = 0, unsigned int end = -1)
+  {
+    _set_glyph_flags (HB_GLYPH_FLAG_UNSAFE_TO_BREAK | HB_GLYPH_FLAG_UNSAFE_TO_CONCAT,
+                     start, end,
+                     true);
+  }
+  void unsafe_to_concat (unsigned int start = 0, unsigned int end = -1)
+  {
+    _set_glyph_flags (HB_GLYPH_FLAG_UNSAFE_TO_CONCAT,
+                     start, end,
+                     true);
+  }
+  void unsafe_to_break_from_outbuffer (unsigned int start = 0, unsigned int end = -1)
+  {
+    _set_glyph_flags (HB_GLYPH_FLAG_UNSAFE_TO_BREAK | HB_GLYPH_FLAG_UNSAFE_TO_CONCAT,
+                     start, end,
+                     true, true);
+  }
+  void unsafe_to_concat_from_outbuffer (unsigned int start = 0, unsigned int end = -1)
+  {
+    _set_glyph_flags (HB_GLYPH_FLAG_UNSAFE_TO_CONCAT,
+                     start, end,
+                     false, true);
   }
-  HB_INTERNAL void unsafe_to_break_impl (unsigned int start, unsigned int end);
-  HB_INTERNAL void unsafe_to_break_from_outbuffer (unsigned int start, unsigned int end);
 
 
   /* Internal methods */
-  HB_INTERNAL bool move_to (unsigned int i); /* i is output-buffer index. */
+  HB_NODISCARD HB_INTERNAL bool move_to (unsigned int i); /* i is output-buffer index. */
 
-  HB_INTERNAL bool enlarge (unsigned int size);
+  HB_NODISCARD HB_INTERNAL bool enlarge (unsigned int size);
 
-  bool ensure (unsigned int size)
+  HB_NODISCARD bool ensure (unsigned int size)
   { return likely (!size || size < allocated) ? true : enlarge (size); }
 
-  bool ensure_inplace (unsigned int size)
+  HB_NODISCARD bool ensure_inplace (unsigned int size)
   { return likely (!size || size < allocated); }
 
-  HB_INTERNAL bool make_room_for (unsigned int num_in, unsigned int num_out);
-  HB_INTERNAL bool shift_forward (unsigned int count);
+  void assert_glyphs ()
+  {
+    assert ((content_type == HB_BUFFER_CONTENT_TYPE_GLYPHS) ||
+           (!len && (content_type == HB_BUFFER_CONTENT_TYPE_INVALID)));
+  }
+  void assert_unicode ()
+  {
+    assert ((content_type == HB_BUFFER_CONTENT_TYPE_UNICODE) ||
+           (!len && (content_type == HB_BUFFER_CONTENT_TYPE_INVALID)));
+  }
+  HB_NODISCARD bool ensure_glyphs ()
+  {
+    if (unlikely (content_type != HB_BUFFER_CONTENT_TYPE_GLYPHS))
+    {
+      if (content_type != HB_BUFFER_CONTENT_TYPE_INVALID)
+       return false;
+      assert (len == 0);
+      content_type = HB_BUFFER_CONTENT_TYPE_GLYPHS;
+    }
+    return true;
+  }
+  HB_NODISCARD bool ensure_unicode ()
+  {
+    if (unlikely (content_type != HB_BUFFER_CONTENT_TYPE_UNICODE))
+    {
+      if (content_type != HB_BUFFER_CONTENT_TYPE_INVALID)
+       return false;
+      assert (len == 0);
+      content_type = HB_BUFFER_CONTENT_TYPE_UNICODE;
+    }
+    return true;
+  }
+
+  HB_NODISCARD HB_INTERNAL bool make_room_for (unsigned int num_in, unsigned int num_out);
+  HB_NODISCARD HB_INTERNAL bool shift_forward (unsigned int count);
 
   typedef long scratch_buffer_t;
   HB_INTERNAL scratch_buffer_t *get_scratch_buffer (unsigned int *size);
@@ -364,10 +547,16 @@ struct hb_buffer_t
 #else
     if (!messaging ())
       return true;
+
+    message_depth++;
+
     va_list ap;
     va_start (ap, fmt);
     bool ret = message_impl (font, fmt, ap);
     va_end (ap);
+
+    message_depth--;
+
     return ret;
 #endif
   }
@@ -377,67 +566,50 @@ struct hb_buffer_t
   set_cluster (hb_glyph_info_t &inf, unsigned int cluster, unsigned int mask = 0)
   {
     if (inf.cluster != cluster)
-    {
-      if (mask & HB_GLYPH_FLAG_UNSAFE_TO_BREAK)
-       inf.mask |= HB_GLYPH_FLAG_UNSAFE_TO_BREAK;
-      else
-       inf.mask &= ~HB_GLYPH_FLAG_UNSAFE_TO_BREAK;
-    }
+      inf.mask = (inf.mask & ~HB_GLYPH_FLAG_DEFINED) | (mask & HB_GLYPH_FLAG_DEFINED);
     inf.cluster = cluster;
   }
-
-  unsigned int
-  _unsafe_to_break_find_min_cluster (const hb_glyph_info_t *infos,
-                                    unsigned int start, unsigned int end,
-                                    unsigned int cluster) const
-  {
-    for (unsigned int i = start; i < end; i++)
-      cluster = hb_min (cluster, infos[i].cluster);
-    return cluster;
-  }
   void
-  _unsafe_to_break_set_mask (hb_glyph_info_t *infos,
-                            unsigned int start, unsigned int end,
-                            unsigned int cluster)
+  _infos_set_glyph_flags (hb_glyph_info_t *infos,
+                         unsigned int start, unsigned int end,
+                         unsigned int cluster,
+                         hb_mask_t mask)
   {
     for (unsigned int i = start; i < end; i++)
       if (cluster != infos[i].cluster)
       {
-       scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_UNSAFE_TO_BREAK;
-       infos[i].mask |= HB_GLYPH_FLAG_UNSAFE_TO_BREAK;
+       scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GLYPH_FLAGS;
+       infos[i].mask |= mask;
       }
   }
+  static unsigned
+  _infos_find_min_cluster (const hb_glyph_info_t *infos,
+                          unsigned start, unsigned end,
+                          unsigned cluster = UINT_MAX)
+  {
+    for (unsigned int i = start; i < end; i++)
+      cluster = hb_min (cluster, infos[i].cluster);
+    return cluster;
+  }
 
-  void unsafe_to_break_all () { unsafe_to_break_impl (0, len); }
-  void safe_to_break_all ()
+  void clear_glyph_flags (hb_mask_t mask = 0)
   {
     for (unsigned int i = 0; i < len; i++)
-      info[i].mask &= ~HB_GLYPH_FLAG_UNSAFE_TO_BREAK;
+      info[i].mask = (info[i].mask & ~HB_GLYPH_FLAG_DEFINED) | (mask & HB_GLYPH_FLAG_DEFINED);
   }
 };
 DECLARE_NULL_INSTANCE (hb_buffer_t);
 
 
-/* Loop over clusters. Duplicated in foreach_syllable(). */
-#define foreach_cluster(buffer, start, end) \
+#define foreach_group(buffer, start, end, group_func) \
   for (unsigned int \
        _count = buffer->len, \
-       start = 0, end = _count ? _next_cluster (buffer, 0) : 0; \
+       start = 0, end = _count ? buffer->group_end (0, group_func) : 0; \
        start < _count; \
-       start = end, end = _next_cluster (buffer, start))
+       start = end, end = buffer->group_end (start, group_func))
 
-static inline unsigned int
-_next_cluster (hb_buffer_t *buffer, unsigned int start)
-{
-  hb_glyph_info_t *info = buffer->info;
-  unsigned int count = buffer->len;
-
-  unsigned int cluster = info[start].cluster;
-  while (++start < count && cluster == info[start].cluster)
-    ;
-
-  return start;
-}
+#define foreach_cluster(buffer, start, end) \
+       foreach_group (buffer, start, end, hb_buffer_t::_cluster_group_func)
 
 
 #define HB_BUFFER_XALLOCATE_VAR(b, func, var) \
index bf26d96..e617b75 100644 (file)
@@ -30,7 +30,7 @@
 #include "hb.hh"
 
 
-/* Implements a lock-free cache for int->int functions. */
+/* Implements a lockfree cache for int->int functions. */
 
 template <unsigned int key_bits, unsigned int value_bits, unsigned int cache_bits>
 struct hb_cache_t
index 91a9b7d..641de0e 100644 (file)
@@ -217,9 +217,6 @@ inline unsigned int OpCode_Size (op_code_t op) { return Is_OpCode_ESC (op) ? 2:
 
 struct number_t
 {
-  void init () { set_real (0.0); }
-  void fini () {}
-
   void set_int (int v)       { value = v; }
   int to_int () const        { return value; }
 
@@ -245,7 +242,7 @@ struct number_t
   }
 
   protected:
-  double value;
+  double value = 0.;
 };
 
 /* byte string */
@@ -263,7 +260,7 @@ struct UnsizedByteStr : UnsizedArrayOf <HBUINT8>
 
     T *ip = c->allocate_size<T> (T::static_size);
     if (unlikely (!ip)) return_trace (false);
-    return_trace (c->check_assign (*ip, value));
+    return_trace (c->check_assign (*ip, value, HB_SERIALIZE_ERROR_INT_OVERFLOW));
   }
 
   template <typename V>
@@ -380,10 +377,8 @@ struct cff_stack_t
     count = 0;
     elements.init ();
     elements.resize (kSizeLimit);
-    for (unsigned int i = 0; i < elements.length; i++)
-      elements[i].init ();
   }
-  void fini () { elements.fini_deep (); }
+  void fini () { elements.fini (); }
 
   ELEM& operator [] (unsigned int i)
   {
@@ -523,9 +518,6 @@ struct arg_stack_t : cff_stack_t<ARG, 513>
 /* an operator prefixed by its operands in a byte string */
 struct op_str_t
 {
-  void init () {}
-  void fini () {}
-
   op_code_t  op;
   byte_str_t str;
 };
@@ -553,7 +545,7 @@ struct parsed_values_t
     opStart = 0;
     values.init ();
   }
-  void fini () { values.fini_deep (); }
+  void fini () { values.fini (); }
 
   void add_op (op_code_t op, const byte_str_ref_t& str_ref = byte_str_ref_t ())
   {
index 52d778f..ef29936 100644 (file)
@@ -94,12 +94,6 @@ struct biased_subrs_t
 
 struct point_t
 {
-  void init ()
-  {
-    x.init ();
-    y.init ();
-  }
-
   void set_int (int _x, int _y)
   {
     x.set_int (_x);
@@ -128,7 +122,7 @@ struct cs_interp_env_t : interp_env_t<ARG>
     hstem_count = 0;
     vstem_count = 0;
     hintmask_size = 0;
-    pt.init ();
+    pt.set_int (0, 0);
     callStack.init ();
     globalSubrs.init (globalSubrs_);
     localSubrs.init (localSubrs_);
@@ -841,7 +835,6 @@ struct path_procs_t
     if (likely (env.argStack.get_count () == 11))
     {
       point_t d;
-      d.init ();
       for (unsigned int i = 0; i < 10; i += 2)
        d.move (env.eval_arg (i), env.eval_arg (i+1));
 
index 8d9bb26..7661837 100644 (file)
@@ -35,24 +35,12 @@ using namespace OT;
 
 struct blend_arg_t : number_t
 {
-  void init ()
-  {
-    number_t::init ();
-    deltas.init ();
-  }
-
-  void fini ()
-  {
-    number_t::fini ();
-    deltas.fini_deep ();
-  }
-
   void set_int (int v) { reset_blends (); number_t::set_int (v); }
   void set_fixed (int32_t v) { reset_blends (); number_t::set_fixed (v); }
   void set_real (double v) { reset_blends (); number_t::set_real (v); }
 
   void set_blends (unsigned int numValues_, unsigned int valueIndex_,
-                         unsigned int numBlends, hb_array_t<const blend_arg_t> blends_)
+                  unsigned int numBlends, hb_array_t<const blend_arg_t> blends_)
   {
     numValues = numValues_;
     valueIndex = valueIndex_;
@@ -133,9 +121,11 @@ struct cff2_cs_interp_env_t : cs_interp_env_t<blend_arg_t, CFF2Subrs>
       region_count = varStore->varStore.get_region_index_count (get_ivs ());
       if (do_blend)
       {
-       scalars.resize (region_count);
-       varStore->varStore.get_scalars (get_ivs (), coords, num_coords,
-                                       &scalars[0], region_count);
+       if (unlikely (!scalars.resize (region_count)))
+         set_error ();
+       else
+         varStore->varStore.get_region_scalars (get_ivs (), coords, num_coords,
+                                                &scalars[0], region_count);
       }
       seen_blend = true;
     }
@@ -200,7 +190,7 @@ struct cff2_cs_opset_t : cs_opset_t<blend_arg_t, OPSET, cff2_cs_interp_env_t, PA
     switch (op) {
       case OpCode_callsubr:
       case OpCode_callgsubr:
-       /* a subroutine number shoudln't be a blended value */
+       /* a subroutine number shouldn't be a blended value */
        if (unlikely (env.argStack.peek ().blending ()))
        {
          env.set_error ();
index 5acfa78..41229b9 100644 (file)
 #include "hb.hh"
 #include "hb-machinery.hh"
 
+#if !defined(HB_NO_SETLOCALE) && (!defined(HAVE_NEWLOCALE) || !defined(HAVE_USELOCALE))
+#define HB_NO_SETLOCALE 1
+#endif
+
+#ifndef HB_NO_SETLOCALE
+
 #include <locale.h>
+#ifdef HAVE_XLOCALE_H
+#include <xlocale.h> // Needed on BSD/OS X for uselocale
+#endif
+
+#ifdef WIN32
+#define hb_locale_t _locale_t
+#else
+#define hb_locale_t locale_t
+#endif
+#define hb_setlocale setlocale
+#define hb_uselocale uselocale
+
+#else
+
+#define hb_locale_t void *
+#define hb_setlocale(Category, Locale) "C"
+#define hb_uselocale(Locale) ((hb_locale_t) 0)
 
-#ifdef HB_NO_SETLOCALE
-#define setlocale(Category, Locale) "C"
 #endif
 
 /**
@@ -86,12 +107,15 @@ _hb_options_init ()
 
 /**
  * hb_tag_from_string:
- * @str: (array length=len) (element-type uint8_t):
- * @len:
+ * @str: (array length=len) (element-type uint8_t): String to convert
+ * @len: Length of @str, or -1 if it is %NULL-terminated
  *
+ * Converts a string into an #hb_tag_t. Valid tags
+ * are four characters. Shorter input strings will be
+ * padded with spaces. Longer input strings will be
+ * truncated.
  *
- *
- * Return value:
+ * Return value: The #hb_tag_t corresponding to @str
  *
  * Since: 0.9.2
  **/
@@ -116,10 +140,11 @@ hb_tag_from_string (const char *str, int len)
 
 /**
  * hb_tag_to_string:
- * @tag:
- * @buf: (out caller-allocates) (array fixed-size=4) (element-type uint8_t):
- *
+ * @tag: #hb_tag_t to convert
+ * @buf: (out caller-allocates) (array fixed-size=4) (element-type uint8_t): Converted string
  *
+ * Converts an #hb_tag_t to a string and returns it in @buf.
+ * Strings will be four characters long.
  *
  * Since: 0.9.5
  **/
@@ -144,12 +169,17 @@ const char direction_strings[][4] = {
 
 /**
  * hb_direction_from_string:
- * @str: (array length=len) (element-type uint8_t):
- * @len:
+ * @str: (array length=len) (element-type uint8_t): String to convert
+ * @len: Length of @str, or -1 if it is %NULL-terminated
  *
+ * Converts a string to an #hb_direction_t.
  *
+ * Matching is loose and applies only to the first letter. For
+ * examples, "LTR" and "left-to-right" will both return #HB_DIRECTION_LTR.
  *
- * Return value:
+ * Unmatched strings will return #HB_DIRECTION_INVALID.
+ *
+ * Return value: The #hb_direction_t matching @str
  *
  * Since: 0.9.2
  **/
@@ -172,11 +202,11 @@ hb_direction_from_string (const char *str, int len)
 
 /**
  * hb_direction_to_string:
- * @direction:
- *
+ * @direction: The #hb_direction_t to convert
  *
+ * Converts an #hb_direction_t to a string.
  *
- * Return value: (transfer none):
+ * Return value: (transfer none): The string corresponding to @direction
  *
  * Since: 0.9.2
  **/
@@ -248,13 +278,11 @@ struct hb_language_item_t {
   bool operator == (const char *s) const
   { return lang_equal (lang, s); }
 
-  hb_language_item_t & operator = (const char *s) {
-    /* If a custom allocated is used calling strdup() pairs
-    badly with a call to the custom free() in fini() below.
-    Therefore don't call strdup(), implement its behavior.
-    */
+  hb_language_item_t & operator = (const char *s)
+  {
+    /* We can't call strdup(), because we allow custom allocators. */
     size_t len = strlen(s) + 1;
-    lang = (hb_language_t) malloc(len);
+    lang = (hb_language_t) hb_malloc(len);
     if (likely (lang))
     {
       memcpy((unsigned char *) lang, s, len);
@@ -265,16 +293,15 @@ struct hb_language_item_t {
     return *this;
   }
 
-  void fini () { free ((void *) lang); }
+  void fini () { hb_free ((void *) lang); }
 };
 
 
-/* Thread-safe lock-free language list */
+/* Thread-safe lockfree language list */
 
 static hb_atomic_ptr_t <hb_language_item_t> langs;
 
-#if HB_USE_ATEXIT
-static void
+static inline void
 free_langs ()
 {
 retry:
@@ -285,11 +312,10 @@ retry:
   while (first_lang) {
     hb_language_item_t *next = first_lang->next;
     first_lang->fini ();
-    free (first_lang);
+    hb_free (first_lang);
     first_lang = next;
   }
 }
-#endif
 
 static hb_language_item_t *
 lang_find_or_insert (const char *key)
@@ -302,28 +328,26 @@ retry:
       return lang;
 
   /* Not found; allocate one. */
-  hb_language_item_t *lang = (hb_language_item_t *) calloc (1, sizeof (hb_language_item_t));
+  hb_language_item_t *lang = (hb_language_item_t *) hb_calloc (1, sizeof (hb_language_item_t));
   if (unlikely (!lang))
     return nullptr;
   lang->next = first_lang;
   *lang = key;
   if (unlikely (!lang->lang))
   {
-    free (lang);
+    hb_free (lang);
     return nullptr;
   }
 
   if (unlikely (!langs.cmpexch (first_lang, lang)))
   {
     lang->fini ();
-    free (lang);
+    hb_free (lang);
     goto retry;
   }
 
-#if HB_USE_ATEXIT
   if (!first_lang)
-    atexit (free_langs); /* First person registers atexit() callback. */
-#endif
+    hb_atexit (free_langs); /* First person registers atexit() callback. */
 
   return lang;
 }
@@ -367,9 +391,9 @@ hb_language_from_string (const char *str, int len)
 
 /**
  * hb_language_to_string:
- * @language: an #hb_language_t to convert.
+ * @language: The #hb_language_t to convert
  *
- * See hb_language_from_string().
+ * Converts an #hb_language_t to a string.
  *
  * Return value: (transfer none):
  * A %NULL-terminated string representing the @language. Must not be freed by
@@ -388,16 +412,17 @@ hb_language_to_string (hb_language_t language)
 /**
  * hb_language_get_default:
  *
- * Get default language from current locale.
+ * Fetch the default language from current locale.
  *
- * Note that the first time this function is called, it calls
+ * <note>Note that the first time this function is called, it calls
  * "setlocale (LC_CTYPE, nullptr)" to fetch current locale.  The underlying
  * setlocale function is, in many implementations, NOT threadsafe.  To avoid
  * problems, call this function once before multiple threads can call it.
  * This function is only used from hb_buffer_guess_segment_properties() by
- * HarfBuzz itself.
+ * HarfBuzz itself.</note>
  *
- * Return value: (transfer none):
+ * Return value: (transfer none): The default language of the locale as
+ * an #hb_language_t
  *
  * Since: 0.9.2
  **/
@@ -409,7 +434,7 @@ hb_language_get_default ()
   hb_language_t language = default_language;
   if (unlikely (language == HB_LANGUAGE_INVALID))
   {
-    language = hb_language_from_string (setlocale (LC_CTYPE, nullptr), -1);
+    language = hb_language_from_string (hb_setlocale (LC_CTYPE, nullptr), -1);
     (void) default_language.cmpexch (HB_LANGUAGE_INVALID, language);
   }
 
@@ -448,7 +473,12 @@ hb_script_from_iso15924_tag (hb_tag_t tag)
     case HB_TAG('Q','a','a','c'): return HB_SCRIPT_COPTIC;
 
     /* Script variants from https://unicode.org/iso15924/ */
+    case HB_TAG('A','r','a','n'): return HB_SCRIPT_ARABIC;
     case HB_TAG('C','y','r','s'): return HB_SCRIPT_CYRILLIC;
+    case HB_TAG('G','e','o','k'): return HB_SCRIPT_GEORGIAN;
+    case HB_TAG('H','a','n','s'): return HB_SCRIPT_HAN;
+    case HB_TAG('H','a','n','t'): return HB_SCRIPT_HAN;
+    case HB_TAG('J','a','m','o'): return HB_SCRIPT_HANGUL;
     case HB_TAG('L','a','t','f'): return HB_SCRIPT_LATIN;
     case HB_TAG('L','a','t','g'): return HB_SCRIPT_LATIN;
     case HB_TAG('S','y','r','e'): return HB_SCRIPT_SYRIAC;
@@ -489,7 +519,7 @@ hb_script_from_string (const char *str, int len)
  * hb_script_to_iso15924_tag:
  * @script: an #hb_script_t to convert.
  *
- * See hb_script_from_iso15924_tag().
+ * Converts an #hb_script_t to a corresponding ISO 15924 script tag.
  *
  * Return value:
  * An #hb_tag_t representing an ISO 15924 script tag.
@@ -504,11 +534,16 @@ hb_script_to_iso15924_tag (hb_script_t script)
 
 /**
  * hb_script_get_horizontal_direction:
- * @script:
+ * @script: The #hb_script_t to query
  *
+ * Fetches the #hb_direction_t of a script when it is
+ * set horizontally. All right-to-left scripts will return
+ * #HB_DIRECTION_RTL. All left-to-right scripts will return
+ * #HB_DIRECTION_LTR.  Scripts that can be written either
+ * horizontally or vertically will return #HB_DIRECTION_INVALID.
+ * Unknown scripts will return #HB_DIRECTION_LTR.
  *
- *
- * Return value:
+ * Return value: The horizontal #hb_direction_t of @script
  *
  * Since: 0.9.2
  **/
@@ -581,6 +616,9 @@ hb_script_get_horizontal_direction (hb_script_t script)
     case HB_SCRIPT_CHORASMIAN:
     case HB_SCRIPT_YEZIDI:
 
+    /* Unicode-14.0 additions */
+    case HB_SCRIPT_OLD_UYGHUR:
+
       return HB_DIRECTION_RTL;
 
 
@@ -613,9 +651,9 @@ hb_script_get_horizontal_direction (hb_script_t script)
 
 /**
  * hb_version:
- * @major: (out): Library major version component.
- * @minor: (out): Library minor version component.
- * @micro: (out): Library micro version component.
+ * @major: (out): Library major version component
+ * @minor: (out): Library minor version component
+ * @micro: (out): Library micro version component
  *
  * Returns library version as three integer components.
  *
@@ -636,7 +674,7 @@ hb_version (unsigned int *major,
  *
  * Returns library version as a string with three components.
  *
- * Return value: library version string.
+ * Return value: Library version string
  *
  * Since: 0.9.2
  **/
@@ -648,13 +686,15 @@ hb_version_string ()
 
 /**
  * hb_version_atleast:
- * @major:
- * @minor:
- * @micro:
+ * @major: Library major version component
+ * @minor: Library minor version component
+ * @micro: Library micro version component
  *
+ * Tests the library version against a minimum value,
+ * as three integer components.
  *
- *
- * Return value:
+ * Return value: %true if the library is equal to or greater than
+ * the test value, %false otherwise
  *
  * Since: 0.9.30
  **/
@@ -883,7 +923,7 @@ parse_one_feature (const char **pp, const char *end, hb_feature_t *feature)
  * </informaltable>
  *
  * Return value:
- * %true if @str is successfully parsed, %false otherwise.
+ * %true if @str is successfully parsed, %false otherwise
  *
  * Since: 0.9.5
  **/
@@ -981,6 +1021,21 @@ parse_one_variation (const char **pp, const char *end, hb_variation_t *variation
 
 /**
  * hb_variation_from_string:
+ * @str: (array length=len) (element-type uint8_t): a string to parse
+ * @len: length of @str, or -1 if string is %NULL terminated
+ * @variation: (out): the #hb_variation_t to initialize with the parsed values
+ *
+ * Parses a string into a #hb_variation_t.
+ *
+ * The format for specifying variation settings follows. All valid CSS
+ * font-variation-settings values other than 'normal' and 'inherited' are also
+ * accepted, though, not documented below.
+ *
+ * The format is a tag, optionally followed by an equals sign, followed by a
+ * number. For example `wght=500`, or `slnt=-7.5`.
+ *
+ * Return value:
+ * %true if @str is successfully parsed, %false otherwise
  *
  * Since: 1.4.2
  */
@@ -1005,8 +1060,56 @@ hb_variation_from_string (const char *str, int len,
   return false;
 }
 
+#ifndef HB_NO_SETLOCALE
+
+static inline void free_static_C_locale ();
+
+static struct hb_C_locale_lazy_loader_t : hb_lazy_loader_t<hb_remove_pointer<hb_locale_t>,
+                                                          hb_C_locale_lazy_loader_t>
+{
+  static hb_locale_t create ()
+  {
+    hb_locale_t l = newlocale (LC_ALL_MASK, "C", NULL);
+    if (!l)
+      return l;
+
+    hb_atexit (free_static_C_locale);
+
+    return l;
+  }
+  static void destroy (hb_locale_t l)
+  {
+    freelocale (l);
+  }
+  static hb_locale_t get_null ()
+  {
+    return (hb_locale_t) 0;
+  }
+} static_C_locale;
+
+static inline
+void free_static_C_locale ()
+{
+  static_C_locale.free_instance ();
+}
+
+static hb_locale_t
+get_C_locale ()
+{
+  return static_C_locale.get_unconst ();
+}
+
+#endif
+
 /**
  * hb_variation_to_string:
+ * @variation: an #hb_variation_t to convert
+ * @buf: (array length=size) (out): output string
+ * @size: the allocated size of @buf
+ *
+ * Converts an #hb_variation_t into a %NULL-terminated string in the format
+ * understood by hb_variation_from_string(). The client in responsible for
+ * allocating big enough size for @buf, 128 bytes is more than enough.
  *
  * Since: 1.4.2
  */
@@ -1023,7 +1126,11 @@ hb_variation_to_string (hb_variation_t *variation,
   while (len && s[len - 1] == ' ')
     len--;
   s[len++] = '=';
+
+  hb_locale_t oldlocale HB_UNUSED;
+  oldlocale = hb_uselocale (get_C_locale ());
   len += hb_max (0, snprintf (s + len, ARRAY_LENGTH (s) - len, "%g", (double) variation->value));
+  (void) hb_uselocale (oldlocale);
 
   assert (len < ARRAY_LENGTH (s));
   len = hb_min (len, size - 1);
@@ -1033,9 +1140,11 @@ hb_variation_to_string (hb_variation_t *variation,
 
 /**
  * hb_color_get_alpha:
- * color: a #hb_color_t we are interested in its channels.
+ * @color: an #hb_color_t we are interested in its channels.
+ *
+ * Fetches the alpha channel of the given @color.
  *
- * Return value: Alpha channel value of the given color
+ * Return value: Alpha channel value
  *
  * Since: 2.1.0
  */
@@ -1047,9 +1156,11 @@ uint8_t
 
 /**
  * hb_color_get_red:
- * color: a #hb_color_t we are interested in its channels.
+ * @color: an #hb_color_t we are interested in its channels.
  *
- * Return value: Red channel value of the given color
+ * Fetches the red channel of the given @color.
+ *
+ * Return value: Red channel value
  *
  * Since: 2.1.0
  */
@@ -1061,9 +1172,11 @@ uint8_t
 
 /**
  * hb_color_get_green:
- * color: a #hb_color_t we are interested in its channels.
+ * @color: an #hb_color_t we are interested in its channels.
+ *
+ * Fetches the green channel of the given @color.
  *
- * Return value: Green channel value of the given color
+ * Return value: Green channel value
  *
  * Since: 2.1.0
  */
@@ -1075,9 +1188,11 @@ uint8_t
 
 /**
  * hb_color_get_blue:
- * color: a #hb_color_t we are interested in its channels.
+ * @color: an #hb_color_t we are interested in its channels.
+ *
+ * Fetches the blue channel of the given @color.
  *
- * Return value: Blue channel value of the given color
+ * Return value: Blue channel value
  *
  * Since: 2.1.0
  */
index a97a5f5..0f0cfe9 100644 (file)
@@ -26,7 +26,7 @@
  * Google Author(s): Behdad Esfahbod
  */
 
-#ifndef HB_H_IN
+#if !defined(HB_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb.h> instead."
 #endif
 
@@ -88,11 +88,37 @@ typedef unsigned __int64 uint64_t;
 
 HB_BEGIN_DECLS
 
-
+/**
+ * hb_bool_t:
+ * 
+ * Data type for booleans.
+ *
+ **/
 typedef int hb_bool_t;
 
+/**
+ * hb_codepoint_t:
+ * 
+ * Data type for holding Unicode codepoints. Also
+ * used to hold glyph IDs.
+ *
+ **/
 typedef uint32_t hb_codepoint_t;
+/**
+ * hb_position_t:
+ * 
+ * Data type for holding a single coordinate value.
+ * Contour points and other multi-dimensional data are
+ * stored as tuples of #hb_position_t's.
+ *
+ **/
 typedef int32_t hb_position_t;
+/**
+ * hb_mask_t:
+ * 
+ * Data type for bitmasks.
+ *
+ **/
 typedef uint32_t hb_mask_t;
 
 typedef union _hb_var_int_t {
@@ -107,13 +133,63 @@ typedef union _hb_var_int_t {
 
 /* hb_tag_t */
 
+/**
+ * hb_tag_t:
+ *
+ * Data type for tag identifiers. Tags are four
+ * byte integers, each byte representing a character.
+ *
+ * Tags are used to identify tables, design-variation axes,
+ * scripts, languages, font features, and baselines with
+ * human-readable names.
+ *
+ **/
 typedef uint32_t hb_tag_t;
 
+/**
+ * HB_TAG:
+ * @c1: 1st character of the tag
+ * @c2: 2nd character of the tag
+ * @c3: 3rd character of the tag
+ * @c4: 4th character of the tag
+ *
+ * Constructs an #hb_tag_t from four character literals.
+ *
+ **/
 #define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
+
+/**
+ * HB_UNTAG:
+ * @tag: an #hb_tag_t
+ *
+ * Extracts four character literals from an #hb_tag_t.
+ *
+ * Since: 0.6.0
+ *
+ **/
 #define HB_UNTAG(tag)   (uint8_t)(((tag)>>24)&0xFF), (uint8_t)(((tag)>>16)&0xFF), (uint8_t)(((tag)>>8)&0xFF), (uint8_t)((tag)&0xFF)
 
+/**
+ * HB_TAG_NONE:
+ *
+ * Unset #hb_tag_t.
+ */
 #define HB_TAG_NONE HB_TAG(0,0,0,0)
+/**
+ * HB_TAG_MAX:
+ *
+ * Maximum possible unsigned #hb_tag_t.
+ *
+ * Since: 0.9.26
+ */
 #define HB_TAG_MAX HB_TAG(0xff,0xff,0xff,0xff)
+/**
+ * HB_TAG_MAX_SIGNED:
+ *
+ * Maximum possible signed #hb_tag_t.
+ *
+ * Since: 0.9.33
+ */
 #define HB_TAG_MAX_SIGNED HB_TAG(0x7f,0xff,0xff,0xff)
 
 /* len=-1 means str is NUL-terminated. */
@@ -132,6 +208,13 @@ hb_tag_to_string (hb_tag_t tag, char *buf);
  * @HB_DIRECTION_RTL: Text is set horizontally from right to left.
  * @HB_DIRECTION_TTB: Text is set vertically from top to bottom.
  * @HB_DIRECTION_BTT: Text is set vertically from bottom to top.
+ *
+ * The direction of a text segment or buffer.
+ * 
+ * A segment can also be tested for horizontal or vertical
+ * orientation (irrespective of specific direction) with 
+ * HB_DIRECTION_IS_HORIZONTAL() or HB_DIRECTION_IS_VERTICAL().
+ *
  */
 typedef enum {
   HB_DIRECTION_INVALID = 0,
@@ -148,17 +231,71 @@ hb_direction_from_string (const char *str, int len);
 HB_EXTERN const char *
 hb_direction_to_string (hb_direction_t direction);
 
+/**
+ * HB_DIRECTION_IS_VALID:
+ * @dir: #hb_direction_t to test
+ *
+ * Tests whether a text direction is valid.
+ *
+ **/
 #define HB_DIRECTION_IS_VALID(dir)     ((((unsigned int) (dir)) & ~3U) == 4)
 /* Direction must be valid for the following */
+/**
+ * HB_DIRECTION_IS_HORIZONTAL:
+ * @dir: #hb_direction_t to test
+ *
+ * Tests whether a text direction is horizontal. Requires
+ * that the direction be valid.
+ *
+ **/
 #define HB_DIRECTION_IS_HORIZONTAL(dir)        ((((unsigned int) (dir)) & ~1U) == 4)
+/**
+ * HB_DIRECTION_IS_VERTICAL:
+ * @dir: #hb_direction_t to test
+ *
+ * Tests whether a text direction is vertical. Requires
+ * that the direction be valid.
+ *
+ **/
 #define HB_DIRECTION_IS_VERTICAL(dir)  ((((unsigned int) (dir)) & ~1U) == 6)
+/**
+ * HB_DIRECTION_IS_FORWARD:
+ * @dir: #hb_direction_t to test
+ *
+ * Tests whether a text direction moves forward (from left to right, or from
+ * top to bottom). Requires that the direction be valid.
+ *
+ **/
 #define HB_DIRECTION_IS_FORWARD(dir)   ((((unsigned int) (dir)) & ~2U) == 4)
+/**
+ * HB_DIRECTION_IS_BACKWARD:
+ * @dir: #hb_direction_t to test
+ *
+ * Tests whether a text direction moves backward (from right to left, or from
+ * bottom to top). Requires that the direction be valid.
+ *
+ **/
 #define HB_DIRECTION_IS_BACKWARD(dir)  ((((unsigned int) (dir)) & ~2U) == 5)
+/**
+ * HB_DIRECTION_REVERSE:
+ * @dir: #hb_direction_t to reverse
+ *
+ * Reverses a text direction. Requires that the direction
+ * be valid.
+ *
+ **/
 #define HB_DIRECTION_REVERSE(dir)      ((hb_direction_t) (((unsigned int) (dir)) ^ 1))
 
 
 /* hb_language_t */
 
+/**
+ * hb_language_t:
+ *
+ * Data type for languages. Each #hb_language_t corresponds to a BCP 47
+ * language tag.
+ *
+ */
 typedef const struct hb_language_impl_t *hb_language_t;
 
 HB_EXTERN hb_language_t
@@ -167,216 +304,409 @@ hb_language_from_string (const char *str, int len);
 HB_EXTERN const char *
 hb_language_to_string (hb_language_t language);
 
+/**
+ * HB_LANGUAGE_INVALID:
+ *
+ * An unset #hb_language_t.
+ *
+ * Since: 0.6.0
+ */
 #define HB_LANGUAGE_INVALID ((hb_language_t) 0)
 
 HB_EXTERN hb_language_t
 hb_language_get_default (void);
 
 
-/* hb_script_t */
+/**
+ * hb_script_t:
+ * @HB_SCRIPT_COMMON: `Zyyy`
+ * @HB_SCRIPT_INHERITED: `Zinh`
+ * @HB_SCRIPT_UNKNOWN: `Zzzz`
+ * @HB_SCRIPT_ARABIC: `Arab`
+ * @HB_SCRIPT_ARMENIAN: `Armn`
+ * @HB_SCRIPT_BENGALI: `Beng`
+ * @HB_SCRIPT_CYRILLIC: `Cyrl`
+ * @HB_SCRIPT_DEVANAGARI: `Deva`
+ * @HB_SCRIPT_GEORGIAN: `Geor`
+ * @HB_SCRIPT_GREEK: `Grek`
+ * @HB_SCRIPT_GUJARATI: `Gujr`
+ * @HB_SCRIPT_GURMUKHI: `Guru`
+ * @HB_SCRIPT_HANGUL: `Hang`
+ * @HB_SCRIPT_HAN: `Hani`
+ * @HB_SCRIPT_HEBREW: `Hebr`
+ * @HB_SCRIPT_HIRAGANA: `Hira`
+ * @HB_SCRIPT_KANNADA: `Knda`
+ * @HB_SCRIPT_KATAKANA: `Kana`
+ * @HB_SCRIPT_LAO: `Laoo`
+ * @HB_SCRIPT_LATIN: `Latn`
+ * @HB_SCRIPT_MALAYALAM: `Mlym`
+ * @HB_SCRIPT_ORIYA: `Orya`
+ * @HB_SCRIPT_TAMIL: `Taml`
+ * @HB_SCRIPT_TELUGU: `Telu`
+ * @HB_SCRIPT_THAI: `Thai`
+ * @HB_SCRIPT_TIBETAN: `Tibt`
+ * @HB_SCRIPT_BOPOMOFO: `Bopo`
+ * @HB_SCRIPT_BRAILLE: `Brai`
+ * @HB_SCRIPT_CANADIAN_SYLLABICS: `Cans`
+ * @HB_SCRIPT_CHEROKEE: `Cher`
+ * @HB_SCRIPT_ETHIOPIC: `Ethi`
+ * @HB_SCRIPT_KHMER: `Khmr`
+ * @HB_SCRIPT_MONGOLIAN: `Mong`
+ * @HB_SCRIPT_MYANMAR: `Mymr`
+ * @HB_SCRIPT_OGHAM: `Ogam`
+ * @HB_SCRIPT_RUNIC: `Runr`
+ * @HB_SCRIPT_SINHALA: `Sinh`
+ * @HB_SCRIPT_SYRIAC: `Syrc`
+ * @HB_SCRIPT_THAANA: `Thaa`
+ * @HB_SCRIPT_YI: `Yiii`
+ * @HB_SCRIPT_DESERET: `Dsrt`
+ * @HB_SCRIPT_GOTHIC: `Goth`
+ * @HB_SCRIPT_OLD_ITALIC: `Ital`
+ * @HB_SCRIPT_BUHID: `Buhd`
+ * @HB_SCRIPT_HANUNOO: `Hano`
+ * @HB_SCRIPT_TAGALOG: `Tglg`
+ * @HB_SCRIPT_TAGBANWA: `Tagb`
+ * @HB_SCRIPT_CYPRIOT: `Cprt`
+ * @HB_SCRIPT_LIMBU: `Limb`
+ * @HB_SCRIPT_LINEAR_B: `Linb`
+ * @HB_SCRIPT_OSMANYA: `Osma`
+ * @HB_SCRIPT_SHAVIAN: `Shaw`
+ * @HB_SCRIPT_TAI_LE: `Tale`
+ * @HB_SCRIPT_UGARITIC: `Ugar`
+ * @HB_SCRIPT_BUGINESE: `Bugi`
+ * @HB_SCRIPT_COPTIC: `Copt`
+ * @HB_SCRIPT_GLAGOLITIC: `Glag`
+ * @HB_SCRIPT_KHAROSHTHI: `Khar`
+ * @HB_SCRIPT_NEW_TAI_LUE: `Talu`
+ * @HB_SCRIPT_OLD_PERSIAN: `Xpeo`
+ * @HB_SCRIPT_SYLOTI_NAGRI: `Sylo`
+ * @HB_SCRIPT_TIFINAGH: `Tfng`
+ * @HB_SCRIPT_BALINESE: `Bali`
+ * @HB_SCRIPT_CUNEIFORM: `Xsux`
+ * @HB_SCRIPT_NKO: `Nkoo`
+ * @HB_SCRIPT_PHAGS_PA: `Phag`
+ * @HB_SCRIPT_PHOENICIAN: `Phnx`
+ * @HB_SCRIPT_CARIAN: `Cari`
+ * @HB_SCRIPT_CHAM: `Cham`
+ * @HB_SCRIPT_KAYAH_LI: `Kali`
+ * @HB_SCRIPT_LEPCHA: `Lepc`
+ * @HB_SCRIPT_LYCIAN: `Lyci`
+ * @HB_SCRIPT_LYDIAN: `Lydi`
+ * @HB_SCRIPT_OL_CHIKI: `Olck`
+ * @HB_SCRIPT_REJANG: `Rjng`
+ * @HB_SCRIPT_SAURASHTRA: `Saur`
+ * @HB_SCRIPT_SUNDANESE: `Sund`
+ * @HB_SCRIPT_VAI: `Vaii`
+ * @HB_SCRIPT_AVESTAN: `Avst`
+ * @HB_SCRIPT_BAMUM: `Bamu`
+ * @HB_SCRIPT_EGYPTIAN_HIEROGLYPHS: `Egyp`
+ * @HB_SCRIPT_IMPERIAL_ARAMAIC: `Armi`
+ * @HB_SCRIPT_INSCRIPTIONAL_PAHLAVI: `Phli`
+ * @HB_SCRIPT_INSCRIPTIONAL_PARTHIAN: `Prti`
+ * @HB_SCRIPT_JAVANESE: `Java`
+ * @HB_SCRIPT_KAITHI: `Kthi`
+ * @HB_SCRIPT_LISU: `Lisu`
+ * @HB_SCRIPT_MEETEI_MAYEK: `Mtei`
+ * @HB_SCRIPT_OLD_SOUTH_ARABIAN: `Sarb`
+ * @HB_SCRIPT_OLD_TURKIC: `Orkh`
+ * @HB_SCRIPT_SAMARITAN: `Samr`
+ * @HB_SCRIPT_TAI_THAM: `Lana`
+ * @HB_SCRIPT_TAI_VIET: `Tavt`
+ * @HB_SCRIPT_BATAK: `Batk`
+ * @HB_SCRIPT_BRAHMI: `Brah`
+ * @HB_SCRIPT_MANDAIC: `Mand`
+ * @HB_SCRIPT_CHAKMA: `Cakm`
+ * @HB_SCRIPT_MEROITIC_CURSIVE: `Merc`
+ * @HB_SCRIPT_MEROITIC_HIEROGLYPHS: `Mero`
+ * @HB_SCRIPT_MIAO: `Plrd`
+ * @HB_SCRIPT_SHARADA: `Shrd`
+ * @HB_SCRIPT_SORA_SOMPENG: `Sora`
+ * @HB_SCRIPT_TAKRI: `Takr`
+ * @HB_SCRIPT_BASSA_VAH: `Bass`, Since: 0.9.30
+ * @HB_SCRIPT_CAUCASIAN_ALBANIAN: `Aghb`, Since: 0.9.30
+ * @HB_SCRIPT_DUPLOYAN: `Dupl`, Since: 0.9.30
+ * @HB_SCRIPT_ELBASAN: `Elba`, Since: 0.9.30
+ * @HB_SCRIPT_GRANTHA: `Gran`, Since: 0.9.30
+ * @HB_SCRIPT_KHOJKI: `Khoj`, Since: 0.9.30
+ * @HB_SCRIPT_KHUDAWADI: `Sind`, Since: 0.9.30
+ * @HB_SCRIPT_LINEAR_A: `Lina`, Since: 0.9.30
+ * @HB_SCRIPT_MAHAJANI: `Mahj`, Since: 0.9.30
+ * @HB_SCRIPT_MANICHAEAN: `Mani`, Since: 0.9.30
+ * @HB_SCRIPT_MENDE_KIKAKUI: `Mend`, Since: 0.9.30
+ * @HB_SCRIPT_MODI: `Modi`, Since: 0.9.30
+ * @HB_SCRIPT_MRO: `Mroo`, Since: 0.9.30
+ * @HB_SCRIPT_NABATAEAN: `Nbat`, Since: 0.9.30
+ * @HB_SCRIPT_OLD_NORTH_ARABIAN: `Narb`, Since: 0.9.30
+ * @HB_SCRIPT_OLD_PERMIC: `Perm`, Since: 0.9.30
+ * @HB_SCRIPT_PAHAWH_HMONG: `Hmng`, Since: 0.9.30
+ * @HB_SCRIPT_PALMYRENE: `Palm`, Since: 0.9.30
+ * @HB_SCRIPT_PAU_CIN_HAU: `Pauc`, Since: 0.9.30
+ * @HB_SCRIPT_PSALTER_PAHLAVI: `Phlp`, Since: 0.9.30
+ * @HB_SCRIPT_SIDDHAM: `Sidd`, Since: 0.9.30
+ * @HB_SCRIPT_TIRHUTA: `Tirh`, Since: 0.9.30
+ * @HB_SCRIPT_WARANG_CITI: `Wara`, Since: 0.9.30
+ * @HB_SCRIPT_AHOM: `Ahom`, Since: 0.9.30
+ * @HB_SCRIPT_ANATOLIAN_HIEROGLYPHS: `Hluw`, Since: 0.9.30
+ * @HB_SCRIPT_HATRAN: `Hatr`, Since: 0.9.30
+ * @HB_SCRIPT_MULTANI: `Mult`, Since: 0.9.30
+ * @HB_SCRIPT_OLD_HUNGARIAN: `Hung`, Since: 0.9.30
+ * @HB_SCRIPT_SIGNWRITING: `Sgnw`, Since: 0.9.30
+ * @HB_SCRIPT_ADLAM: `Adlm`, Since: 1.3.0
+ * @HB_SCRIPT_BHAIKSUKI: `Bhks`, Since: 1.3.0
+ * @HB_SCRIPT_MARCHEN: `Marc`, Since: 1.3.0
+ * @HB_SCRIPT_OSAGE: `Osge`, Since: 1.3.0
+ * @HB_SCRIPT_TANGUT: `Tang`, Since: 1.3.0
+ * @HB_SCRIPT_NEWA: `Newa`, Since: 1.3.0
+ * @HB_SCRIPT_MASARAM_GONDI: `Gonm`, Since: 1.6.0
+ * @HB_SCRIPT_NUSHU: `Nshu`, Since: 1.6.0
+ * @HB_SCRIPT_SOYOMBO: `Soyo`, Since: 1.6.0
+ * @HB_SCRIPT_ZANABAZAR_SQUARE: `Zanb`, Since: 1.6.0
+ * @HB_SCRIPT_DOGRA: `Dogr`, Since: 1.8.0
+ * @HB_SCRIPT_GUNJALA_GONDI: `Gong`, Since: 1.8.0
+ * @HB_SCRIPT_HANIFI_ROHINGYA: `Rohg`, Since: 1.8.0
+ * @HB_SCRIPT_MAKASAR: `Maka`, Since: 1.8.0
+ * @HB_SCRIPT_MEDEFAIDRIN: `Medf`, Since: 1.8.0
+ * @HB_SCRIPT_OLD_SOGDIAN: `Sogo`, Since: 1.8.0
+ * @HB_SCRIPT_SOGDIAN: `Sogd`, Since: 1.8.0
+ * @HB_SCRIPT_ELYMAIC: `Elym`, Since: 2.4.0
+ * @HB_SCRIPT_NANDINAGARI: `Nand`, Since: 2.4.0
+ * @HB_SCRIPT_NYIAKENG_PUACHUE_HMONG: `Hmnp`, Since: 2.4.0
+ * @HB_SCRIPT_WANCHO: `Wcho`, Since: 2.4.0
+ * @HB_SCRIPT_CHORASMIAN: `Chrs`, Since: 2.6.7
+ * @HB_SCRIPT_DIVES_AKURU: `Diak`, Since: 2.6.7
+ * @HB_SCRIPT_KHITAN_SMALL_SCRIPT: `Kits`, Since: 2.6.7
+ * @HB_SCRIPT_YEZIDI: `Yezi`, Since: 2.6.7
+ * @HB_SCRIPT_CYPRO_MINOAN: `Cpmn`, Since: 3.0.0
+ * @HB_SCRIPT_OLD_UYGHUR: `Ougr`, Since: 3.0.0
+ * @HB_SCRIPT_TANGSA: `Tnsa`, Since: 3.0.0
+ * @HB_SCRIPT_TOTO: `Toto`, Since: 3.0.0
+ * @HB_SCRIPT_VITHKUQI: `Vith`, Since: 3.0.0
+ * @HB_SCRIPT_MATH: `Zmth`, Since: 3.4.0
+ * @HB_SCRIPT_INVALID: No script set
+ *
+ * Data type for scripts. Each #hb_script_t's value is an #hb_tag_t corresponding
+ * to the four-letter values defined by [ISO 15924](https://unicode.org/iso15924/).
+ *
+ * See also the Script (sc) property of the Unicode Character Database.
+ *
+ **/
 
-/* https://unicode.org/iso15924/ */
 /* https://docs.google.com/spreadsheets/d/1Y90M0Ie3MUJ6UVCRDOypOtijlMDLNNyyLk36T6iMu0o */
-/* Unicode Character Database property: Script (sc) */
 typedef enum
 {
-  /*1.1*/ HB_SCRIPT_COMMON                     = HB_TAG ('Z','y','y','y'),
-  /*1.1*/ HB_SCRIPT_INHERITED                  = HB_TAG ('Z','i','n','h'),
-  /*5.0*/ HB_SCRIPT_UNKNOWN                    = HB_TAG ('Z','z','z','z'),
-
-  /*1.1*/ HB_SCRIPT_ARABIC                     = HB_TAG ('A','r','a','b'),
-  /*1.1*/ HB_SCRIPT_ARMENIAN                   = HB_TAG ('A','r','m','n'),
-  /*1.1*/ HB_SCRIPT_BENGALI                    = HB_TAG ('B','e','n','g'),
-  /*1.1*/ HB_SCRIPT_CYRILLIC                   = HB_TAG ('C','y','r','l'),
-  /*1.1*/ HB_SCRIPT_DEVANAGARI                 = HB_TAG ('D','e','v','a'),
-  /*1.1*/ HB_SCRIPT_GEORGIAN                   = HB_TAG ('G','e','o','r'),
-  /*1.1*/ HB_SCRIPT_GREEK                      = HB_TAG ('G','r','e','k'),
-  /*1.1*/ HB_SCRIPT_GUJARATI                   = HB_TAG ('G','u','j','r'),
-  /*1.1*/ HB_SCRIPT_GURMUKHI                   = HB_TAG ('G','u','r','u'),
-  /*1.1*/ HB_SCRIPT_HANGUL                     = HB_TAG ('H','a','n','g'),
-  /*1.1*/ HB_SCRIPT_HAN                                = HB_TAG ('H','a','n','i'),
-  /*1.1*/ HB_SCRIPT_HEBREW                     = HB_TAG ('H','e','b','r'),
-  /*1.1*/ HB_SCRIPT_HIRAGANA                   = HB_TAG ('H','i','r','a'),
-  /*1.1*/ HB_SCRIPT_KANNADA                    = HB_TAG ('K','n','d','a'),
-  /*1.1*/ HB_SCRIPT_KATAKANA                   = HB_TAG ('K','a','n','a'),
-  /*1.1*/ HB_SCRIPT_LAO                                = HB_TAG ('L','a','o','o'),
-  /*1.1*/ HB_SCRIPT_LATIN                      = HB_TAG ('L','a','t','n'),
-  /*1.1*/ HB_SCRIPT_MALAYALAM                  = HB_TAG ('M','l','y','m'),
-  /*1.1*/ HB_SCRIPT_ORIYA                      = HB_TAG ('O','r','y','a'),
-  /*1.1*/ HB_SCRIPT_TAMIL                      = HB_TAG ('T','a','m','l'),
-  /*1.1*/ HB_SCRIPT_TELUGU                     = HB_TAG ('T','e','l','u'),
-  /*1.1*/ HB_SCRIPT_THAI                       = HB_TAG ('T','h','a','i'),
-
-  /*2.0*/ HB_SCRIPT_TIBETAN                    = HB_TAG ('T','i','b','t'),
-
-  /*3.0*/ HB_SCRIPT_BOPOMOFO                   = HB_TAG ('B','o','p','o'),
-  /*3.0*/ HB_SCRIPT_BRAILLE                    = HB_TAG ('B','r','a','i'),
-  /*3.0*/ HB_SCRIPT_CANADIAN_SYLLABICS         = HB_TAG ('C','a','n','s'),
-  /*3.0*/ HB_SCRIPT_CHEROKEE                   = HB_TAG ('C','h','e','r'),
-  /*3.0*/ HB_SCRIPT_ETHIOPIC                   = HB_TAG ('E','t','h','i'),
-  /*3.0*/ HB_SCRIPT_KHMER                      = HB_TAG ('K','h','m','r'),
-  /*3.0*/ HB_SCRIPT_MONGOLIAN                  = HB_TAG ('M','o','n','g'),
-  /*3.0*/ HB_SCRIPT_MYANMAR                    = HB_TAG ('M','y','m','r'),
-  /*3.0*/ HB_SCRIPT_OGHAM                      = HB_TAG ('O','g','a','m'),
-  /*3.0*/ HB_SCRIPT_RUNIC                      = HB_TAG ('R','u','n','r'),
-  /*3.0*/ HB_SCRIPT_SINHALA                    = HB_TAG ('S','i','n','h'),
-  /*3.0*/ HB_SCRIPT_SYRIAC                     = HB_TAG ('S','y','r','c'),
-  /*3.0*/ HB_SCRIPT_THAANA                     = HB_TAG ('T','h','a','a'),
-  /*3.0*/ HB_SCRIPT_YI                         = HB_TAG ('Y','i','i','i'),
-
-  /*3.1*/ HB_SCRIPT_DESERET                    = HB_TAG ('D','s','r','t'),
-  /*3.1*/ HB_SCRIPT_GOTHIC                     = HB_TAG ('G','o','t','h'),
-  /*3.1*/ HB_SCRIPT_OLD_ITALIC                 = HB_TAG ('I','t','a','l'),
-
-  /*3.2*/ HB_SCRIPT_BUHID                      = HB_TAG ('B','u','h','d'),
-  /*3.2*/ HB_SCRIPT_HANUNOO                    = HB_TAG ('H','a','n','o'),
-  /*3.2*/ HB_SCRIPT_TAGALOG                    = HB_TAG ('T','g','l','g'),
-  /*3.2*/ HB_SCRIPT_TAGBANWA                   = HB_TAG ('T','a','g','b'),
-
-  /*4.0*/ HB_SCRIPT_CYPRIOT                    = HB_TAG ('C','p','r','t'),
-  /*4.0*/ HB_SCRIPT_LIMBU                      = HB_TAG ('L','i','m','b'),
-  /*4.0*/ HB_SCRIPT_LINEAR_B                   = HB_TAG ('L','i','n','b'),
-  /*4.0*/ HB_SCRIPT_OSMANYA                    = HB_TAG ('O','s','m','a'),
-  /*4.0*/ HB_SCRIPT_SHAVIAN                    = HB_TAG ('S','h','a','w'),
-  /*4.0*/ HB_SCRIPT_TAI_LE                     = HB_TAG ('T','a','l','e'),
-  /*4.0*/ HB_SCRIPT_UGARITIC                   = HB_TAG ('U','g','a','r'),
-
-  /*4.1*/ HB_SCRIPT_BUGINESE                   = HB_TAG ('B','u','g','i'),
-  /*4.1*/ HB_SCRIPT_COPTIC                     = HB_TAG ('C','o','p','t'),
-  /*4.1*/ HB_SCRIPT_GLAGOLITIC                 = HB_TAG ('G','l','a','g'),
-  /*4.1*/ HB_SCRIPT_KHAROSHTHI                 = HB_TAG ('K','h','a','r'),
-  /*4.1*/ HB_SCRIPT_NEW_TAI_LUE                        = HB_TAG ('T','a','l','u'),
-  /*4.1*/ HB_SCRIPT_OLD_PERSIAN                        = HB_TAG ('X','p','e','o'),
-  /*4.1*/ HB_SCRIPT_SYLOTI_NAGRI               = HB_TAG ('S','y','l','o'),
-  /*4.1*/ HB_SCRIPT_TIFINAGH                   = HB_TAG ('T','f','n','g'),
-
-  /*5.0*/ HB_SCRIPT_BALINESE                   = HB_TAG ('B','a','l','i'),
-  /*5.0*/ HB_SCRIPT_CUNEIFORM                  = HB_TAG ('X','s','u','x'),
-  /*5.0*/ HB_SCRIPT_NKO                                = HB_TAG ('N','k','o','o'),
-  /*5.0*/ HB_SCRIPT_PHAGS_PA                   = HB_TAG ('P','h','a','g'),
-  /*5.0*/ HB_SCRIPT_PHOENICIAN                 = HB_TAG ('P','h','n','x'),
-
-  /*5.1*/ HB_SCRIPT_CARIAN                     = HB_TAG ('C','a','r','i'),
-  /*5.1*/ HB_SCRIPT_CHAM                       = HB_TAG ('C','h','a','m'),
-  /*5.1*/ HB_SCRIPT_KAYAH_LI                   = HB_TAG ('K','a','l','i'),
-  /*5.1*/ HB_SCRIPT_LEPCHA                     = HB_TAG ('L','e','p','c'),
-  /*5.1*/ HB_SCRIPT_LYCIAN                     = HB_TAG ('L','y','c','i'),
-  /*5.1*/ HB_SCRIPT_LYDIAN                     = HB_TAG ('L','y','d','i'),
-  /*5.1*/ HB_SCRIPT_OL_CHIKI                   = HB_TAG ('O','l','c','k'),
-  /*5.1*/ HB_SCRIPT_REJANG                     = HB_TAG ('R','j','n','g'),
-  /*5.1*/ HB_SCRIPT_SAURASHTRA                 = HB_TAG ('S','a','u','r'),
-  /*5.1*/ HB_SCRIPT_SUNDANESE                  = HB_TAG ('S','u','n','d'),
-  /*5.1*/ HB_SCRIPT_VAI                                = HB_TAG ('V','a','i','i'),
-
-  /*5.2*/ HB_SCRIPT_AVESTAN                    = HB_TAG ('A','v','s','t'),
-  /*5.2*/ HB_SCRIPT_BAMUM                      = HB_TAG ('B','a','m','u'),
-  /*5.2*/ HB_SCRIPT_EGYPTIAN_HIEROGLYPHS       = HB_TAG ('E','g','y','p'),
-  /*5.2*/ HB_SCRIPT_IMPERIAL_ARAMAIC           = HB_TAG ('A','r','m','i'),
-  /*5.2*/ HB_SCRIPT_INSCRIPTIONAL_PAHLAVI      = HB_TAG ('P','h','l','i'),
-  /*5.2*/ HB_SCRIPT_INSCRIPTIONAL_PARTHIAN     = HB_TAG ('P','r','t','i'),
-  /*5.2*/ HB_SCRIPT_JAVANESE                   = HB_TAG ('J','a','v','a'),
-  /*5.2*/ HB_SCRIPT_KAITHI                     = HB_TAG ('K','t','h','i'),
-  /*5.2*/ HB_SCRIPT_LISU                       = HB_TAG ('L','i','s','u'),
-  /*5.2*/ HB_SCRIPT_MEETEI_MAYEK               = HB_TAG ('M','t','e','i'),
-  /*5.2*/ HB_SCRIPT_OLD_SOUTH_ARABIAN          = HB_TAG ('S','a','r','b'),
-  /*5.2*/ HB_SCRIPT_OLD_TURKIC                 = HB_TAG ('O','r','k','h'),
-  /*5.2*/ HB_SCRIPT_SAMARITAN                  = HB_TAG ('S','a','m','r'),
-  /*5.2*/ HB_SCRIPT_TAI_THAM                   = HB_TAG ('L','a','n','a'),
-  /*5.2*/ HB_SCRIPT_TAI_VIET                   = HB_TAG ('T','a','v','t'),
-
-  /*6.0*/ HB_SCRIPT_BATAK                      = HB_TAG ('B','a','t','k'),
-  /*6.0*/ HB_SCRIPT_BRAHMI                     = HB_TAG ('B','r','a','h'),
-  /*6.0*/ HB_SCRIPT_MANDAIC                    = HB_TAG ('M','a','n','d'),
-
-  /*6.1*/ HB_SCRIPT_CHAKMA                     = HB_TAG ('C','a','k','m'),
-  /*6.1*/ HB_SCRIPT_MEROITIC_CURSIVE           = HB_TAG ('M','e','r','c'),
-  /*6.1*/ HB_SCRIPT_MEROITIC_HIEROGLYPHS       = HB_TAG ('M','e','r','o'),
-  /*6.1*/ HB_SCRIPT_MIAO                       = HB_TAG ('P','l','r','d'),
-  /*6.1*/ HB_SCRIPT_SHARADA                    = HB_TAG ('S','h','r','d'),
-  /*6.1*/ HB_SCRIPT_SORA_SOMPENG               = HB_TAG ('S','o','r','a'),
-  /*6.1*/ HB_SCRIPT_TAKRI                      = HB_TAG ('T','a','k','r'),
+  HB_SCRIPT_COMMON                     = HB_TAG ('Z','y','y','y'), /*1.1*/
+  HB_SCRIPT_INHERITED                  = HB_TAG ('Z','i','n','h'), /*1.1*/
+  HB_SCRIPT_UNKNOWN                    = HB_TAG ('Z','z','z','z'), /*5.0*/
+
+  HB_SCRIPT_ARABIC                     = HB_TAG ('A','r','a','b'), /*1.1*/
+  HB_SCRIPT_ARMENIAN                   = HB_TAG ('A','r','m','n'), /*1.1*/
+  HB_SCRIPT_BENGALI                    = HB_TAG ('B','e','n','g'), /*1.1*/
+  HB_SCRIPT_CYRILLIC                   = HB_TAG ('C','y','r','l'), /*1.1*/
+  HB_SCRIPT_DEVANAGARI                 = HB_TAG ('D','e','v','a'), /*1.1*/
+  HB_SCRIPT_GEORGIAN                   = HB_TAG ('G','e','o','r'), /*1.1*/
+  HB_SCRIPT_GREEK                      = HB_TAG ('G','r','e','k'), /*1.1*/
+  HB_SCRIPT_GUJARATI                   = HB_TAG ('G','u','j','r'), /*1.1*/
+  HB_SCRIPT_GURMUKHI                   = HB_TAG ('G','u','r','u'), /*1.1*/
+  HB_SCRIPT_HANGUL                     = HB_TAG ('H','a','n','g'), /*1.1*/
+  HB_SCRIPT_HAN                                = HB_TAG ('H','a','n','i'), /*1.1*/
+  HB_SCRIPT_HEBREW                     = HB_TAG ('H','e','b','r'), /*1.1*/
+  HB_SCRIPT_HIRAGANA                   = HB_TAG ('H','i','r','a'), /*1.1*/
+  HB_SCRIPT_KANNADA                    = HB_TAG ('K','n','d','a'), /*1.1*/
+  HB_SCRIPT_KATAKANA                   = HB_TAG ('K','a','n','a'), /*1.1*/
+  HB_SCRIPT_LAO                                = HB_TAG ('L','a','o','o'), /*1.1*/
+  HB_SCRIPT_LATIN                      = HB_TAG ('L','a','t','n'), /*1.1*/
+  HB_SCRIPT_MALAYALAM                  = HB_TAG ('M','l','y','m'), /*1.1*/
+  HB_SCRIPT_ORIYA                      = HB_TAG ('O','r','y','a'), /*1.1*/
+  HB_SCRIPT_TAMIL                      = HB_TAG ('T','a','m','l'), /*1.1*/
+  HB_SCRIPT_TELUGU                     = HB_TAG ('T','e','l','u'), /*1.1*/
+  HB_SCRIPT_THAI                       = HB_TAG ('T','h','a','i'), /*1.1*/
+
+  HB_SCRIPT_TIBETAN                    = HB_TAG ('T','i','b','t'), /*2.0*/
+
+  HB_SCRIPT_BOPOMOFO                   = HB_TAG ('B','o','p','o'), /*3.0*/
+  HB_SCRIPT_BRAILLE                    = HB_TAG ('B','r','a','i'), /*3.0*/
+  HB_SCRIPT_CANADIAN_SYLLABICS         = HB_TAG ('C','a','n','s'), /*3.0*/
+  HB_SCRIPT_CHEROKEE                   = HB_TAG ('C','h','e','r'), /*3.0*/
+  HB_SCRIPT_ETHIOPIC                   = HB_TAG ('E','t','h','i'), /*3.0*/
+  HB_SCRIPT_KHMER                      = HB_TAG ('K','h','m','r'), /*3.0*/
+  HB_SCRIPT_MONGOLIAN                  = HB_TAG ('M','o','n','g'), /*3.0*/
+  HB_SCRIPT_MYANMAR                    = HB_TAG ('M','y','m','r'), /*3.0*/
+  HB_SCRIPT_OGHAM                      = HB_TAG ('O','g','a','m'), /*3.0*/
+  HB_SCRIPT_RUNIC                      = HB_TAG ('R','u','n','r'), /*3.0*/
+  HB_SCRIPT_SINHALA                    = HB_TAG ('S','i','n','h'), /*3.0*/
+  HB_SCRIPT_SYRIAC                     = HB_TAG ('S','y','r','c'), /*3.0*/
+  HB_SCRIPT_THAANA                     = HB_TAG ('T','h','a','a'), /*3.0*/
+  HB_SCRIPT_YI                         = HB_TAG ('Y','i','i','i'), /*3.0*/
+
+  HB_SCRIPT_DESERET                    = HB_TAG ('D','s','r','t'), /*3.1*/
+  HB_SCRIPT_GOTHIC                     = HB_TAG ('G','o','t','h'), /*3.1*/
+  HB_SCRIPT_OLD_ITALIC                 = HB_TAG ('I','t','a','l'), /*3.1*/
+
+  HB_SCRIPT_BUHID                      = HB_TAG ('B','u','h','d'), /*3.2*/
+  HB_SCRIPT_HANUNOO                    = HB_TAG ('H','a','n','o'), /*3.2*/
+  HB_SCRIPT_TAGALOG                    = HB_TAG ('T','g','l','g'), /*3.2*/
+  HB_SCRIPT_TAGBANWA                   = HB_TAG ('T','a','g','b'), /*3.2*/
+
+  HB_SCRIPT_CYPRIOT                    = HB_TAG ('C','p','r','t'), /*4.0*/
+  HB_SCRIPT_LIMBU                      = HB_TAG ('L','i','m','b'), /*4.0*/
+  HB_SCRIPT_LINEAR_B                   = HB_TAG ('L','i','n','b'), /*4.0*/
+  HB_SCRIPT_OSMANYA                    = HB_TAG ('O','s','m','a'), /*4.0*/
+  HB_SCRIPT_SHAVIAN                    = HB_TAG ('S','h','a','w'), /*4.0*/
+  HB_SCRIPT_TAI_LE                     = HB_TAG ('T','a','l','e'), /*4.0*/
+  HB_SCRIPT_UGARITIC                   = HB_TAG ('U','g','a','r'), /*4.0*/
+
+  HB_SCRIPT_BUGINESE                   = HB_TAG ('B','u','g','i'), /*4.1*/
+  HB_SCRIPT_COPTIC                     = HB_TAG ('C','o','p','t'), /*4.1*/
+  HB_SCRIPT_GLAGOLITIC                 = HB_TAG ('G','l','a','g'), /*4.1*/
+  HB_SCRIPT_KHAROSHTHI                 = HB_TAG ('K','h','a','r'), /*4.1*/
+  HB_SCRIPT_NEW_TAI_LUE                        = HB_TAG ('T','a','l','u'), /*4.1*/
+  HB_SCRIPT_OLD_PERSIAN                        = HB_TAG ('X','p','e','o'), /*4.1*/
+  HB_SCRIPT_SYLOTI_NAGRI               = HB_TAG ('S','y','l','o'), /*4.1*/
+  HB_SCRIPT_TIFINAGH                   = HB_TAG ('T','f','n','g'), /*4.1*/
+
+  HB_SCRIPT_BALINESE                   = HB_TAG ('B','a','l','i'), /*5.0*/
+  HB_SCRIPT_CUNEIFORM                  = HB_TAG ('X','s','u','x'), /*5.0*/
+  HB_SCRIPT_NKO                                = HB_TAG ('N','k','o','o'), /*5.0*/
+  HB_SCRIPT_PHAGS_PA                   = HB_TAG ('P','h','a','g'), /*5.0*/
+  HB_SCRIPT_PHOENICIAN                 = HB_TAG ('P','h','n','x'), /*5.0*/
+
+  HB_SCRIPT_CARIAN                     = HB_TAG ('C','a','r','i'), /*5.1*/
+  HB_SCRIPT_CHAM                       = HB_TAG ('C','h','a','m'), /*5.1*/
+  HB_SCRIPT_KAYAH_LI                   = HB_TAG ('K','a','l','i'), /*5.1*/
+  HB_SCRIPT_LEPCHA                     = HB_TAG ('L','e','p','c'), /*5.1*/
+  HB_SCRIPT_LYCIAN                     = HB_TAG ('L','y','c','i'), /*5.1*/
+  HB_SCRIPT_LYDIAN                     = HB_TAG ('L','y','d','i'), /*5.1*/
+  HB_SCRIPT_OL_CHIKI                   = HB_TAG ('O','l','c','k'), /*5.1*/
+  HB_SCRIPT_REJANG                     = HB_TAG ('R','j','n','g'), /*5.1*/
+  HB_SCRIPT_SAURASHTRA                 = HB_TAG ('S','a','u','r'), /*5.1*/
+  HB_SCRIPT_SUNDANESE                  = HB_TAG ('S','u','n','d'), /*5.1*/
+  HB_SCRIPT_VAI                                = HB_TAG ('V','a','i','i'), /*5.1*/
+
+  HB_SCRIPT_AVESTAN                    = HB_TAG ('A','v','s','t'), /*5.2*/
+  HB_SCRIPT_BAMUM                      = HB_TAG ('B','a','m','u'), /*5.2*/
+  HB_SCRIPT_EGYPTIAN_HIEROGLYPHS       = HB_TAG ('E','g','y','p'), /*5.2*/
+  HB_SCRIPT_IMPERIAL_ARAMAIC           = HB_TAG ('A','r','m','i'), /*5.2*/
+  HB_SCRIPT_INSCRIPTIONAL_PAHLAVI      = HB_TAG ('P','h','l','i'), /*5.2*/
+  HB_SCRIPT_INSCRIPTIONAL_PARTHIAN     = HB_TAG ('P','r','t','i'), /*5.2*/
+  HB_SCRIPT_JAVANESE                   = HB_TAG ('J','a','v','a'), /*5.2*/
+  HB_SCRIPT_KAITHI                     = HB_TAG ('K','t','h','i'), /*5.2*/
+  HB_SCRIPT_LISU                       = HB_TAG ('L','i','s','u'), /*5.2*/
+  HB_SCRIPT_MEETEI_MAYEK               = HB_TAG ('M','t','e','i'), /*5.2*/
+  HB_SCRIPT_OLD_SOUTH_ARABIAN          = HB_TAG ('S','a','r','b'), /*5.2*/
+  HB_SCRIPT_OLD_TURKIC                 = HB_TAG ('O','r','k','h'), /*5.2*/
+  HB_SCRIPT_SAMARITAN                  = HB_TAG ('S','a','m','r'), /*5.2*/
+  HB_SCRIPT_TAI_THAM                   = HB_TAG ('L','a','n','a'), /*5.2*/
+  HB_SCRIPT_TAI_VIET                   = HB_TAG ('T','a','v','t'), /*5.2*/
+
+  HB_SCRIPT_BATAK                      = HB_TAG ('B','a','t','k'), /*6.0*/
+  HB_SCRIPT_BRAHMI                     = HB_TAG ('B','r','a','h'), /*6.0*/
+  HB_SCRIPT_MANDAIC                    = HB_TAG ('M','a','n','d'), /*6.0*/
+
+  HB_SCRIPT_CHAKMA                     = HB_TAG ('C','a','k','m'), /*6.1*/
+  HB_SCRIPT_MEROITIC_CURSIVE           = HB_TAG ('M','e','r','c'), /*6.1*/
+  HB_SCRIPT_MEROITIC_HIEROGLYPHS       = HB_TAG ('M','e','r','o'), /*6.1*/
+  HB_SCRIPT_MIAO                       = HB_TAG ('P','l','r','d'), /*6.1*/
+  HB_SCRIPT_SHARADA                    = HB_TAG ('S','h','r','d'), /*6.1*/
+  HB_SCRIPT_SORA_SOMPENG               = HB_TAG ('S','o','r','a'), /*6.1*/
+  HB_SCRIPT_TAKRI                      = HB_TAG ('T','a','k','r'), /*6.1*/
 
   /*
    * Since: 0.9.30
    */
-  /*7.0*/ HB_SCRIPT_BASSA_VAH                  = HB_TAG ('B','a','s','s'),
-  /*7.0*/ HB_SCRIPT_CAUCASIAN_ALBANIAN         = HB_TAG ('A','g','h','b'),
-  /*7.0*/ HB_SCRIPT_DUPLOYAN                   = HB_TAG ('D','u','p','l'),
-  /*7.0*/ HB_SCRIPT_ELBASAN                    = HB_TAG ('E','l','b','a'),
-  /*7.0*/ HB_SCRIPT_GRANTHA                    = HB_TAG ('G','r','a','n'),
-  /*7.0*/ HB_SCRIPT_KHOJKI                     = HB_TAG ('K','h','o','j'),
-  /*7.0*/ HB_SCRIPT_KHUDAWADI                  = HB_TAG ('S','i','n','d'),
-  /*7.0*/ HB_SCRIPT_LINEAR_A                   = HB_TAG ('L','i','n','a'),
-  /*7.0*/ HB_SCRIPT_MAHAJANI                   = HB_TAG ('M','a','h','j'),
-  /*7.0*/ HB_SCRIPT_MANICHAEAN                 = HB_TAG ('M','a','n','i'),
-  /*7.0*/ HB_SCRIPT_MENDE_KIKAKUI              = HB_TAG ('M','e','n','d'),
-  /*7.0*/ HB_SCRIPT_MODI                       = HB_TAG ('M','o','d','i'),
-  /*7.0*/ HB_SCRIPT_MRO                                = HB_TAG ('M','r','o','o'),
-  /*7.0*/ HB_SCRIPT_NABATAEAN                  = HB_TAG ('N','b','a','t'),
-  /*7.0*/ HB_SCRIPT_OLD_NORTH_ARABIAN          = HB_TAG ('N','a','r','b'),
-  /*7.0*/ HB_SCRIPT_OLD_PERMIC                 = HB_TAG ('P','e','r','m'),
-  /*7.0*/ HB_SCRIPT_PAHAWH_HMONG               = HB_TAG ('H','m','n','g'),
-  /*7.0*/ HB_SCRIPT_PALMYRENE                  = HB_TAG ('P','a','l','m'),
-  /*7.0*/ HB_SCRIPT_PAU_CIN_HAU                        = HB_TAG ('P','a','u','c'),
-  /*7.0*/ HB_SCRIPT_PSALTER_PAHLAVI            = HB_TAG ('P','h','l','p'),
-  /*7.0*/ HB_SCRIPT_SIDDHAM                    = HB_TAG ('S','i','d','d'),
-  /*7.0*/ HB_SCRIPT_TIRHUTA                    = HB_TAG ('T','i','r','h'),
-  /*7.0*/ HB_SCRIPT_WARANG_CITI                        = HB_TAG ('W','a','r','a'),
-
-  /*8.0*/ HB_SCRIPT_AHOM                       = HB_TAG ('A','h','o','m'),
-  /*8.0*/ HB_SCRIPT_ANATOLIAN_HIEROGLYPHS      = HB_TAG ('H','l','u','w'),
-  /*8.0*/ HB_SCRIPT_HATRAN                     = HB_TAG ('H','a','t','r'),
-  /*8.0*/ HB_SCRIPT_MULTANI                    = HB_TAG ('M','u','l','t'),
-  /*8.0*/ HB_SCRIPT_OLD_HUNGARIAN              = HB_TAG ('H','u','n','g'),
-  /*8.0*/ HB_SCRIPT_SIGNWRITING                        = HB_TAG ('S','g','n','w'),
+  HB_SCRIPT_BASSA_VAH                  = HB_TAG ('B','a','s','s'), /*7.0*/
+  HB_SCRIPT_CAUCASIAN_ALBANIAN         = HB_TAG ('A','g','h','b'), /*7.0*/
+  HB_SCRIPT_DUPLOYAN                   = HB_TAG ('D','u','p','l'), /*7.0*/
+  HB_SCRIPT_ELBASAN                    = HB_TAG ('E','l','b','a'), /*7.0*/
+  HB_SCRIPT_GRANTHA                    = HB_TAG ('G','r','a','n'), /*7.0*/
+  HB_SCRIPT_KHOJKI                     = HB_TAG ('K','h','o','j'), /*7.0*/
+  HB_SCRIPT_KHUDAWADI                  = HB_TAG ('S','i','n','d'), /*7.0*/
+  HB_SCRIPT_LINEAR_A                   = HB_TAG ('L','i','n','a'), /*7.0*/
+  HB_SCRIPT_MAHAJANI                   = HB_TAG ('M','a','h','j'), /*7.0*/
+  HB_SCRIPT_MANICHAEAN                 = HB_TAG ('M','a','n','i'), /*7.0*/
+  HB_SCRIPT_MENDE_KIKAKUI              = HB_TAG ('M','e','n','d'), /*7.0*/
+  HB_SCRIPT_MODI                       = HB_TAG ('M','o','d','i'), /*7.0*/
+  HB_SCRIPT_MRO                                = HB_TAG ('M','r','o','o'), /*7.0*/
+  HB_SCRIPT_NABATAEAN                  = HB_TAG ('N','b','a','t'), /*7.0*/
+  HB_SCRIPT_OLD_NORTH_ARABIAN          = HB_TAG ('N','a','r','b'), /*7.0*/
+  HB_SCRIPT_OLD_PERMIC                 = HB_TAG ('P','e','r','m'), /*7.0*/
+  HB_SCRIPT_PAHAWH_HMONG               = HB_TAG ('H','m','n','g'), /*7.0*/
+  HB_SCRIPT_PALMYRENE                  = HB_TAG ('P','a','l','m'), /*7.0*/
+  HB_SCRIPT_PAU_CIN_HAU                        = HB_TAG ('P','a','u','c'), /*7.0*/
+  HB_SCRIPT_PSALTER_PAHLAVI            = HB_TAG ('P','h','l','p'), /*7.0*/
+  HB_SCRIPT_SIDDHAM                    = HB_TAG ('S','i','d','d'), /*7.0*/
+  HB_SCRIPT_TIRHUTA                    = HB_TAG ('T','i','r','h'), /*7.0*/
+  HB_SCRIPT_WARANG_CITI                        = HB_TAG ('W','a','r','a'), /*7.0*/
+
+  HB_SCRIPT_AHOM                       = HB_TAG ('A','h','o','m'), /*8.0*/
+  HB_SCRIPT_ANATOLIAN_HIEROGLYPHS      = HB_TAG ('H','l','u','w'), /*8.0*/
+  HB_SCRIPT_HATRAN                     = HB_TAG ('H','a','t','r'), /*8.0*/
+  HB_SCRIPT_MULTANI                    = HB_TAG ('M','u','l','t'), /*8.0*/
+  HB_SCRIPT_OLD_HUNGARIAN              = HB_TAG ('H','u','n','g'), /*8.0*/
+  HB_SCRIPT_SIGNWRITING                        = HB_TAG ('S','g','n','w'), /*8.0*/
 
   /*
    * Since 1.3.0
    */
-  /*9.0*/ HB_SCRIPT_ADLAM                      = HB_TAG ('A','d','l','m'),
-  /*9.0*/ HB_SCRIPT_BHAIKSUKI                  = HB_TAG ('B','h','k','s'),
-  /*9.0*/ HB_SCRIPT_MARCHEN                    = HB_TAG ('M','a','r','c'),
-  /*9.0*/ HB_SCRIPT_OSAGE                      = HB_TAG ('O','s','g','e'),
-  /*9.0*/ HB_SCRIPT_TANGUT                     = HB_TAG ('T','a','n','g'),
-  /*9.0*/ HB_SCRIPT_NEWA                       = HB_TAG ('N','e','w','a'),
+  HB_SCRIPT_ADLAM                      = HB_TAG ('A','d','l','m'), /*9.0*/
+  HB_SCRIPT_BHAIKSUKI                  = HB_TAG ('B','h','k','s'), /*9.0*/
+  HB_SCRIPT_MARCHEN                    = HB_TAG ('M','a','r','c'), /*9.0*/
+  HB_SCRIPT_OSAGE                      = HB_TAG ('O','s','g','e'), /*9.0*/
+  HB_SCRIPT_TANGUT                     = HB_TAG ('T','a','n','g'), /*9.0*/
+  HB_SCRIPT_NEWA                       = HB_TAG ('N','e','w','a'), /*9.0*/
 
   /*
    * Since 1.6.0
    */
-  /*10.0*/HB_SCRIPT_MASARAM_GONDI              = HB_TAG ('G','o','n','m'),
-  /*10.0*/HB_SCRIPT_NUSHU                      = HB_TAG ('N','s','h','u'),
-  /*10.0*/HB_SCRIPT_SOYOMBO                    = HB_TAG ('S','o','y','o'),
-  /*10.0*/HB_SCRIPT_ZANABAZAR_SQUARE           = HB_TAG ('Z','a','n','b'),
+  HB_SCRIPT_MASARAM_GONDI              = HB_TAG ('G','o','n','m'), /*10.0*/
+  HB_SCRIPT_NUSHU                      = HB_TAG ('N','s','h','u'), /*10.0*/
+  HB_SCRIPT_SOYOMBO                    = HB_TAG ('S','o','y','o'), /*10.0*/
+  HB_SCRIPT_ZANABAZAR_SQUARE           = HB_TAG ('Z','a','n','b'), /*10.0*/
 
   /*
    * Since 1.8.0
    */
-  /*11.0*/HB_SCRIPT_DOGRA                      = HB_TAG ('D','o','g','r'),
-  /*11.0*/HB_SCRIPT_GUNJALA_GONDI              = HB_TAG ('G','o','n','g'),
-  /*11.0*/HB_SCRIPT_HANIFI_ROHINGYA            = HB_TAG ('R','o','h','g'),
-  /*11.0*/HB_SCRIPT_MAKASAR                    = HB_TAG ('M','a','k','a'),
-  /*11.0*/HB_SCRIPT_MEDEFAIDRIN                        = HB_TAG ('M','e','d','f'),
-  /*11.0*/HB_SCRIPT_OLD_SOGDIAN                        = HB_TAG ('S','o','g','o'),
-  /*11.0*/HB_SCRIPT_SOGDIAN                    = HB_TAG ('S','o','g','d'),
+  HB_SCRIPT_DOGRA                      = HB_TAG ('D','o','g','r'), /*11.0*/
+  HB_SCRIPT_GUNJALA_GONDI              = HB_TAG ('G','o','n','g'), /*11.0*/
+  HB_SCRIPT_HANIFI_ROHINGYA            = HB_TAG ('R','o','h','g'), /*11.0*/
+  HB_SCRIPT_MAKASAR                    = HB_TAG ('M','a','k','a'), /*11.0*/
+  HB_SCRIPT_MEDEFAIDRIN                        = HB_TAG ('M','e','d','f'), /*11.0*/
+  HB_SCRIPT_OLD_SOGDIAN                        = HB_TAG ('S','o','g','o'), /*11.0*/
+  HB_SCRIPT_SOGDIAN                    = HB_TAG ('S','o','g','d'), /*11.0*/
 
   /*
    * Since 2.4.0
    */
-  /*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'),
+  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'), /*12.0*/
 
   /*
    * Since 2.6.7
    */
-  /*13.0*/HB_SCRIPT_CHORASMIAN                 = HB_TAG ('C','h','r','s'),
-  /*13.0*/HB_SCRIPT_DIVES_AKURU                        = HB_TAG ('D','i','a','k'),
-  /*13.0*/HB_SCRIPT_KHITAN_SMALL_SCRIPT                = HB_TAG ('K','i','t','s'),
-  /*13.0*/HB_SCRIPT_YEZIDI                     = HB_TAG ('Y','e','z','i'),
+  HB_SCRIPT_CHORASMIAN                 = HB_TAG ('C','h','r','s'), /*13.0*/
+  HB_SCRIPT_DIVES_AKURU                        = HB_TAG ('D','i','a','k'), /*13.0*/
+  HB_SCRIPT_KHITAN_SMALL_SCRIPT                = HB_TAG ('K','i','t','s'), /*13.0*/
+  HB_SCRIPT_YEZIDI                     = HB_TAG ('Y','e','z','i'), /*13.0*/
+
+  /*
+   * Since 3.0.0
+   */
+  HB_SCRIPT_CYPRO_MINOAN               = HB_TAG ('C','p','m','n'), /*14.0*/
+  HB_SCRIPT_OLD_UYGHUR                 = HB_TAG ('O','u','g','r'), /*14.0*/
+  HB_SCRIPT_TANGSA                     = HB_TAG ('T','n','s','a'), /*14.0*/
+  HB_SCRIPT_TOTO                       = HB_TAG ('T','o','t','o'), /*14.0*/
+  HB_SCRIPT_VITHKUQI                   = HB_TAG ('V','i','t','h'), /*14.0*/
+
+  /*
+   * Since 3.4.0
+   */
+  HB_SCRIPT_MATH                       = HB_TAG ('Z','m','t','h'),
 
   /* No script set. */
-  HB_SCRIPT_INVALID                            = HB_TAG_NONE,
+  HB_SCRIPT_INVALID                    = HB_TAG_NONE,
+
+  /*< private >*/
 
   /* Dummy values to ensure any hb_tag_t value can be passed/stored as hb_script_t
    * without risking undefined behavior.  We have two, for historical reasons.
@@ -410,24 +740,44 @@ hb_script_get_horizontal_direction (hb_script_t script);
 
 /* User data */
 
+/**
+ * hb_user_data_key_t:
+ *
+ * Data structure for holding user-data keys.
+ *
+ **/
 typedef struct hb_user_data_key_t {
   /*< private >*/
   char unused;
 } hb_user_data_key_t;
 
+/**
+ * hb_destroy_func_t:
+ * @user_data: the data to be destroyed
+ *
+ * A virtual method for destroy user-data callbacks.
+ *
+ */
 typedef void (*hb_destroy_func_t) (void *user_data);
 
 
 /* Font features and variations. */
 
 /**
- * HB_FEATURE_GLOBAL_START
+ * HB_FEATURE_GLOBAL_START:
+ *
+ * Special setting for #hb_feature_t.start to apply the feature from the start
+ * of the buffer.
  *
  * Since: 2.0.0
  */
 #define HB_FEATURE_GLOBAL_START        0
+
 /**
- * HB_FEATURE_GLOBAL_END
+ * HB_FEATURE_GLOBAL_END:
+ *
+ * Special setting for #hb_feature_t.end to apply the feature from to the end
+ * of the buffer.
  *
  * Since: 2.0.0
  */
@@ -435,17 +785,17 @@ typedef void (*hb_destroy_func_t) (void *user_data);
 
 /**
  * hb_feature_t:
- * @tag: a feature tag
- * @value: 0 disables the feature, non-zero (usually 1) enables the feature.
- * For features implemented as lookup type 3 (like 'salt') the @value is a one
- * based index into the alternates.
+ * @tag: The #hb_tag_t tag of the feature
+ * @value: The value of the feature. 0 disables the feature, non-zero (usually
+ * 1) enables the feature.  For features implemented as lookup type 3 (like
+ * 'salt') the @value is a one based index into the alternates.
  * @start: the cluster to start applying this feature setting (inclusive).
  * @end: the cluster to end applying this feature setting (exclusive).
  *
  * The #hb_feature_t is the structure that holds information about requested
  * feature application. The feature will be applied with the given value to all
  * glyphs which are in clusters between @start (inclusive) and @end (exclusive).
- * Setting start to @HB_FEATURE_GLOBAL_START and end to @HB_FEATURE_GLOBAL_END
+ * Setting start to #HB_FEATURE_GLOBAL_START and end to #HB_FEATURE_GLOBAL_END
  * specifies that the feature always applies to the entire buffer.
  */
 typedef struct hb_feature_t {
@@ -465,7 +815,13 @@ hb_feature_to_string (hb_feature_t *feature,
 
 /**
  * hb_variation_t:
+ * @tag: The #hb_tag_t tag of the variation-axis name
+ * @value: The value of the variation axis
  *
+ * Data type for holding variation data. Registered OpenType
+ * variation-axis tags are listed in
+ * [OpenType Axis Tag Registry](https://docs.microsoft.com/en-us/typography/opentype/spec/dvaraxisreg).
+ * 
  * Since: 1.4.2
  */
 typedef struct hb_variation_t {
@@ -484,12 +840,24 @@ hb_variation_to_string (hb_variation_t *variation,
 /**
  * hb_color_t:
  *
- * Data type for holding color values.
+ * Data type for holding color values. Colors are eight bits per
+ * channel RGB plus alpha transparency.
  *
  * Since: 2.1.0
  */
 typedef uint32_t hb_color_t;
 
+/**
+ * HB_COLOR:
+ * @b: blue channel value
+ * @g: green channel value
+ * @r: red channel value
+ * @a: alpha channel value
+ *
+ * Constructs an #hb_color_t from four integers.
+ *
+ * Since: 2.1.0
+ */
 #define HB_COLOR(b,g,r,a) ((hb_color_t) HB_TAG ((b),(g),(r),(a)))
 
 HB_EXTERN uint8_t
index 07659fa..5141ad8 100644 (file)
@@ -55,6 +55,7 @@
 #define HB_NO_ATEXIT
 #define HB_NO_BUFFER_MESSAGE
 #define HB_NO_BUFFER_SERIALIZE
+#define HB_NO_BUFFER_VERIFY
 #define HB_NO_BITMAP
 #define HB_NO_CFF
 #define HB_NO_COLOR
@@ -76,7 +77,7 @@
 #define HB_NO_SETLOCALE
 #define HB_NO_OT_FONT_GLYPH_NAMES
 #define HB_NO_OT_SHAPE_FRACTIONS
-#define HB_NO_STAT
+#define HB_NO_STYLE
 #define HB_NO_SUBSET_LAYOUT
 #define HB_NO_VAR
 #endif
 #define HB_NO_LEGACY
 #endif
 
+#if defined(HAVE_CONFIG_OVERRIDE_H) || defined(HB_CONFIG_OVERRIDE_H)
+#ifndef HB_CONFIG_OVERRIDE_H
+#define HB_CONFIG_OVERRIDE_H "config-override.h"
+#endif
+#include HB_CONFIG_OVERRIDE_H
+#endif
 
 /* Closure of options. */
 
 #define HB_NO_CMAP_LEGACY_SUBTABLES
 #define HB_NO_FALLBACK_SHAPE
 #define HB_NO_OT_KERN
-#define HB_NO_OT_LAYOUT_BLACKLIST
+#define HB_NO_OT_LAYOUT_BLOCKLIST
 #define HB_NO_OT_SHAPE_FALLBACK
 #endif
 
 #endif
 #endif
 
-#ifdef HAVE_CONFIG_OVERRIDE_H
-#include "config-override.h"
-#endif
-
 
 #endif /* HB_CONFIG_HH */
index 76e00fd..5f38306 100644 (file)
@@ -34,7 +34,6 @@
 
 #include "hb-coretext.h"
 #include "hb-aat-layout.hh"
-#include <math.h>
 
 
 /**
@@ -190,7 +189,10 @@ create_ct_font (CGFontRef cg_font, CGFloat font_size)
    * reconfiguring the cascade list causes CoreText crashes. For details, see
    * crbug.com/549610 */
   // 0x00070000 stands for "kCTVersionNumber10_10", see CoreText.h
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
   if (&CTGetCoreTextVersion != nullptr && CTGetCoreTextVersion() < 0x00070000) {
+#pragma GCC diagnostic pop
     CFStringRef fontName = CTFontCopyPostScriptName (ct_font);
     bool isEmojiFont = CFStringCompare (fontName, CFSTR("AppleColorEmoji"), 0) == kCFCompareEqualTo;
     CFRelease (fontName);
@@ -330,6 +332,44 @@ _hb_coretext_shaper_font_data_create (hb_font_t *font)
     return nullptr;
   }
 
+  if (font->coords)
+  {
+    CFMutableDictionaryRef variations =
+      CFDictionaryCreateMutable (kCFAllocatorDefault,
+                                font->num_coords,
+                                &kCFTypeDictionaryKeyCallBacks,
+                                &kCFTypeDictionaryValueCallBacks);
+
+    for (unsigned i = 0; i < font->num_coords; i++)
+    {
+      if (font->coords[i] == 0.) continue;
+
+      hb_ot_var_axis_info_t info;
+      unsigned int c = 1;
+      hb_ot_var_get_axis_infos (font->face, i, &c, &info);
+      CFDictionarySetValue (variations,
+       CFNumberCreate (kCFAllocatorDefault, kCFNumberIntType, &info.tag),
+       CFNumberCreate (kCFAllocatorDefault, kCFNumberFloatType, &font->design_coords[i])
+      );
+    }
+
+    CFDictionaryRef attributes =
+      CFDictionaryCreate (kCFAllocatorDefault,
+                         (const void **) &kCTFontVariationAttribute,
+                         (const void **) &variations,
+                         1,
+                         &kCFTypeDictionaryKeyCallBacks,
+                         &kCFTypeDictionaryValueCallBacks);
+
+    CTFontDescriptorRef varDesc = CTFontDescriptorCreateWithAttributes (attributes);
+    CTFontRef new_ct_font = CTFontCreateCopyWithAttributes (ct_font, 0, nullptr, varDesc);
+
+    CFRelease (ct_font);
+    CFRelease (attributes);
+    CFRelease (variations);
+    ct_font = new_ct_font;
+  }
+
   return (hb_coretext_font_data_t *) ct_font;
 }
 
@@ -346,7 +386,7 @@ retry:
   const hb_coretext_font_data_t *data = font->data.coretext;
   if (unlikely (!data)) return nullptr;
 
-  if (fabs (CTFontGetSize ((CTFontRef) data) - (CGFloat) font->ptem) > .5)
+  if (fabs (CTFontGetSize ((CTFontRef) data) - (CGFloat) font->ptem) > (CGFloat) .5)
   {
     /* XXX-MT-bug
      * Note that evaluating condition above can be dangerous if another thread
@@ -402,7 +442,7 @@ hb_coretext_font_create (CTFontRef ct_font)
 }
 
 /**
- * hb_coretext_face_get_ct_font:
+ * hb_coretext_font_get_ct_font:
  * @font: #hb_font_t to work upon
  *
  * Fetches the CTFontRef associated with the specified
@@ -441,8 +481,8 @@ struct active_feature_t {
           a->rec.setting < b->rec.setting ? -1 : a->rec.setting > b->rec.setting ? 1 :
           0;
   }
-  bool operator== (const active_feature_t *f) {
-    return cmp (this, f) == 0;
+  bool operator== (const active_feature_t& f) const {
+    return cmp (this, &f) == 0;
   }
 };
 
@@ -514,7 +554,7 @@ _hb_coretext_shape (hb_shape_plan_t    *shape_plan,
     {
       active_feature_t feature;
 
-#if MAC_OS_X_VERSION_MIN_REQUIRED < 1010
+#if MAC_OS_X_VERSION_MIN_REQUIRED < 101000
       const hb_aat_feature_mapping_t * mapping = hb_aat_layout_find_feature_mapping (features[i].tag);
       if (!mapping)
        continue;
@@ -573,7 +613,7 @@ _hb_coretext_shape (hb_shape_plan_t    *shape_plan,
          /* active_features.qsort (); */
          for (unsigned int j = 0; j < active_features.length; j++)
          {
-#if MAC_OS_X_VERSION_MIN_REQUIRED < 1010
+#if MAC_OS_X_VERSION_MIN_REQUIRED < 101000
            CFStringRef keys[] = {
              kCTFontFeatureTypeIdentifierKey,
              kCTFontFeatureSelectorIdentifierKey
@@ -637,7 +677,7 @@ _hb_coretext_shape (hb_shape_plan_t    *shape_plan,
       {
        active_features.push (event->feature);
       } else {
-       active_feature_t *feature = active_features.find (&event->feature);
+       active_feature_t *feature = active_features.lsearch (event->feature);
        if (feature)
          active_features.remove (feature - active_features.arrayZ);
       }
@@ -858,7 +898,7 @@ resize_and_retry:
 
     buffer->len = 0;
     uint32_t status_and = ~0, status_or = 0;
-    double advances_so_far = 0;
+    CGFloat advances_so_far = 0;
     /* For right-to-left runs, CoreText returns the glyphs positioned such that
      * any trailing whitespace is to the left of (0,0).  Adjust coordinate system
      * to fix for that.  Test with any RTL string with trailing spaces.
@@ -880,10 +920,10 @@ resize_and_retry:
       status_or  |= run_status;
       status_and &= run_status;
       DEBUG_MSG (CORETEXT, run, "CTRunStatus: %x", run_status);
-      double run_advance = CTRunGetTypographicBounds (run, range_all, nullptr, nullptr, nullptr);
+      CGFloat run_advance = CTRunGetTypographicBounds (run, range_all, nullptr, nullptr, nullptr);
       if (HB_DIRECTION_IS_VERTICAL (buffer->props.direction))
          run_advance = -run_advance;
-      DEBUG_MSG (CORETEXT, run, "Run advance: %g", run_advance);
+      DEBUG_MSG (CORETEXT, run, "Run advance: %g", (double) run_advance);
 
       /* CoreText does automatic font fallback (AKA "cascading") for  characters
        * not supported by the requested font, and provides no way to turn it off,
@@ -1059,32 +1099,32 @@ resize_and_retry:
        hb_glyph_info_t *info = run_info;
        if (HB_DIRECTION_IS_HORIZONTAL (buffer->props.direction))
        {
-         hb_position_t x_offset = (positions[0].x - advances_so_far) * x_mult;
+         hb_position_t x_offset = round ((positions[0].x - advances_so_far) * x_mult);
          for (unsigned int j = 0; j < num_glyphs; j++)
          {
-           double advance;
+           CGFloat advance;
            if (likely (j + 1 < num_glyphs))
              advance = positions[j + 1].x - positions[j].x;
            else /* last glyph */
              advance = run_advance - (positions[j].x - positions[0].x);
-           info->mask = advance * x_mult;
+           info->mask = round (advance * x_mult);
            info->var1.i32 = x_offset;
-           info->var2.i32 = positions[j].y * y_mult;
+           info->var2.i32 = round (positions[j].y * y_mult);
            info++;
          }
        }
        else
        {
-         hb_position_t y_offset = (positions[0].y - advances_so_far) * y_mult;
+         hb_position_t y_offset = round ((positions[0].y - advances_so_far) * y_mult);
          for (unsigned int j = 0; j < num_glyphs; j++)
          {
-           double advance;
+           CGFloat advance;
            if (likely (j + 1 < num_glyphs))
              advance = positions[j + 1].y - positions[j].y;
            else /* last glyph */
              advance = run_advance - (positions[j].y - positions[0].y);
-           info->mask = advance * y_mult;
-           info->var1.i32 = positions[j].x * x_mult;
+           info->mask = round (advance * y_mult);
+           info->var1.i32 = round (positions[j].x * x_mult);
            info->var2.i32 = y_offset;
            info++;
          }
@@ -1173,7 +1213,8 @@ resize_and_retry:
     }
   }
 
-  buffer->unsafe_to_break_all ();
+  buffer->clear_glyph_flags ();
+  buffer->unsafe_to_break ();
 
 #undef FAIL
 
index 5c13e5d..3ac7440 100644 (file)
@@ -302,16 +302,16 @@ struct hb_auto_trace_t
   {
     if (unlikely (returned)) {
       fprintf (stderr, "OUCH, double calls to return_trace().  This is a bug, please report.\n");
-      return hb_forward<T> (v);
+      return std::forward<T> (v);
     }
 
     _hb_debug_msg<max_level> (what, obj, func, true, plevel ? *plevel : 1, -1,
                              "return %s (line %d)",
-                             hb_printer_t<decltype (v)>().print (v), line);
+                             hb_printer_t<hb_decay<decltype (v)>>().print (v), line);
     if (plevel) --*plevel;
     plevel = nullptr;
     returned = true;
-    return hb_forward<T> (v);
+    return std::forward<T> (v);
   }
 
   private:
@@ -333,7 +333,7 @@ struct hb_auto_trace_t<0, ret_t>
   template <typename T>
   T ret (T&& v,
         const char *func HB_UNUSED = nullptr,
-        unsigned int line HB_UNUSED = 0) { return hb_forward<T> (v); }
+        unsigned int line HB_UNUSED = 0) { return std::forward<T> (v); }
 };
 
 /* For disabled tracing; optimize out everything.
@@ -343,7 +343,7 @@ struct hb_no_trace_t {
   template <typename T>
   T ret (T&& v,
         const char *func HB_UNUSED = nullptr,
-        unsigned int line HB_UNUSED = 0) { return hb_forward<T> (v); }
+        unsigned int line HB_UNUSED = 0) { return std::forward<T> (v); }
 };
 
 #define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
@@ -373,10 +373,6 @@ struct hb_no_trace_t {
 #define HB_DEBUG_FT (HB_DEBUG+0)
 #endif
 
-#ifndef HB_DEBUG_GET_COVERAGE
-#define HB_DEBUG_GET_COVERAGE (HB_DEBUG+0)
-#endif
-
 #ifndef HB_DEBUG_OBJECT
 #define HB_DEBUG_OBJECT (HB_DEBUG+0)
 #endif
@@ -442,6 +438,10 @@ struct hb_no_trace_t {
 #define TRACE_SUBSET(this) hb_no_trace_t<bool> trace
 #endif
 
+#ifndef HB_DEBUG_SUBSET_REPACK
+#define HB_DEBUG_SUBSET_REPACK (HB_DEBUG+0)
+#endif
+
 #ifndef HB_DEBUG_DISPATCH
 #define HB_DEBUG_DISPATCH ( \
        HB_DEBUG_APPLY + \
index 43f89a4..a130d77 100644 (file)
@@ -24,7 +24,7 @@
  * Google Author(s): Behdad Esfahbod
  */
 
-#ifndef HB_H_IN
+#if !defined(HB_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb.h> instead."
 #endif
 
@@ -53,11 +53,50 @@ HB_BEGIN_DECLS
 #ifndef HB_DISABLE_DEPRECATED
 
 
+/**
+ * HB_SCRIPT_CANADIAN_ABORIGINAL:
+ *
+ * Use #HB_SCRIPT_CANADIAN_SYLLABICS instead:
+ *
+ * Deprecated: 0.9.20
+ */
 #define HB_SCRIPT_CANADIAN_ABORIGINAL          HB_SCRIPT_CANADIAN_SYLLABICS
 
+/**
+ * HB_BUFFER_FLAGS_DEFAULT:
+ *
+ * Use #HB_BUFFER_FLAG_DEFAULT instead.
+ *
+ * Deprecated: 0.9.20
+ */
 #define HB_BUFFER_FLAGS_DEFAULT                        HB_BUFFER_FLAG_DEFAULT
+/**
+ * HB_BUFFER_SERIALIZE_FLAGS_DEFAULT:
+ *
+ * Use #HB_BUFFER_SERIALIZE_FLAG_DEFAULT instead.
+ *
+ * Deprecated: 0.9.20
+ */
 #define HB_BUFFER_SERIALIZE_FLAGS_DEFAULT      HB_BUFFER_SERIALIZE_FLAG_DEFAULT
 
+/**
+ * hb_font_get_glyph_func_t:
+ * @font: #hb_font_t to work upon
+ * @font_data: @font user data pointer
+ * @unicode: The Unicode code point to query
+ * @variation_selector: The  variation-selector code point to query
+ * @glyph: (out): The glyph ID retrieved
+ * @user_data: User data pointer passed by the caller
+ *
+ * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
+ *
+ * This method should retrieve the glyph ID for a specified Unicode code point
+ * font, with an optional variation selector.
+ *
+ * Return value: %true if data found, %false otherwise
+ * Deprecated: 1.2.3
+ *
+ **/
 typedef hb_bool_t (*hb_font_get_glyph_func_t) (hb_font_t *font, void *font_data,
                                               hb_codepoint_t unicode, hb_codepoint_t variation_selector,
                                               hb_codepoint_t *glyph,
@@ -68,11 +107,13 @@ hb_font_funcs_set_glyph_func (hb_font_funcs_t *ffuncs,
                              hb_font_get_glyph_func_t func,
                              void *user_data, hb_destroy_func_t destroy);
 
-HB_EXTERN HB_DEPRECATED void
-hb_set_invert (hb_set_t *set);
-
 /**
  * hb_unicode_eastasian_width_func_t:
+ * @ufuncs: A Unicode-functions structure
+ * @unicode: The code point to query
+ * @user_data: User data pointer passed by the caller
+ *
+ * A virtual method for the #hb_unicode_funcs_t structure.
  *
  * Deprecated: 2.0.0
  */
@@ -82,12 +123,12 @@ typedef unsigned int                       (*hb_unicode_eastasian_width_func_t)    (hb_unicode_funcs_t
 
 /**
  * hb_unicode_funcs_set_eastasian_width_func:
- * @ufuncs: a Unicode function structure
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
+ * @ufuncs: a Unicode-function structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
+ * @user_data: Data to pass to @func
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
  *
- * 
+ * Sets the implementation function for #hb_unicode_eastasian_width_func_t.
  *
  * Since: 0.9.2
  * Deprecated: 2.0.0
@@ -99,6 +140,10 @@ hb_unicode_funcs_set_eastasian_width_func (hb_unicode_funcs_t *ufuncs,
 
 /**
  * hb_unicode_eastasian_width:
+ * @ufuncs: a Unicode-function structure
+ * @unicode: The code point to query
+ *
+ * Don't use. Not used by HarfBuzz.
  *
  * Since: 0.9.2
  * Deprecated: 2.0.0
@@ -112,7 +157,7 @@ hb_unicode_eastasian_width (hb_unicode_funcs_t *ufuncs,
  * hb_unicode_decompose_compatibility_func_t:
  * @ufuncs: a Unicode function structure
  * @u: codepoint to decompose
- * @decomposed: address of codepoint array (of length %HB_UNICODE_MAX_DECOMPOSITION_LEN) to write decomposition into
+ * @decomposed: address of codepoint array (of length #HB_UNICODE_MAX_DECOMPOSITION_LEN) to write decomposition into
  * @user_data: user data pointer as passed to hb_unicode_funcs_set_decompose_compatibility_func()
  *
  * Fully decompose @u to its Unicode compatibility decomposition. The codepoints of the decomposition will be written to @decomposed.
@@ -120,7 +165,7 @@ hb_unicode_eastasian_width (hb_unicode_funcs_t *ufuncs,
  *
  * If @u has no compatibility decomposition, zero should be returned.
  *
- * The Unicode standard guarantees that a buffer of length %HB_UNICODE_MAX_DECOMPOSITION_LEN codepoints will always be sufficient for any
+ * The Unicode standard guarantees that a buffer of length #HB_UNICODE_MAX_DECOMPOSITION_LEN codepoints will always be sufficient for any
  * compatibility decomposition plus an terminating value of 0.  Consequently, @decompose must be allocated by the caller to be at least this length.  Implementations
  * of this function type must ensure that they do not write past the provided array.
  *
@@ -144,10 +189,12 @@ typedef unsigned int                      (*hb_unicode_decompose_compatibility_func_t)    (hb_unicode_
 
 /**
  * hb_unicode_funcs_set_decompose_compatibility_func:
- * @ufuncs: a Unicode function structure
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
+ * @ufuncs: A Unicode-functions structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
+ * @user_data: Data to pass to @func
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
+ *
+ * Sets the implementation function for #hb_unicode_decompose_compatibility_func_t.
  *
  * 
  *
@@ -165,16 +212,25 @@ hb_unicode_decompose_compatibility (hb_unicode_funcs_t *ufuncs,
                                    hb_codepoint_t     *decomposed);
 
 
+/**
+ * hb_font_get_glyph_v_kerning_func_t:
+ *
+ * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
+ *
+ * This method should retrieve the kerning-adjustment value for a glyph-pair in
+ * the specified font, for vertical text segments.
+ *
+ **/
 typedef hb_font_get_glyph_kerning_func_t hb_font_get_glyph_v_kerning_func_t;
 
 /**
  * hb_font_funcs_set_glyph_v_kerning_func:
- * @ffuncs: font functions.
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
+ * @ffuncs: A font-function structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
+ * @user_data: Data to pass to @func
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
  *
- * 
+ * Sets the implementation function for #hb_font_get_glyph_v_kerning_func_t.
  *
  * Since: 0.9.2
  * Deprecated: 2.0.0
index f2fce07..f177ff3 100644 (file)
 
 #include "hb-directwrite.h"
 
+#include "hb-ms-feature-ranges.hh"
 
-/* Declare object creator for dynamic support of DWRITE */
-typedef HRESULT (* WINAPI t_DWriteCreateFactory)(
-  DWRITE_FACTORY_TYPE factoryType,
-  REFIID              iid,
-  IUnknown            **factory
-);
-
-/*
- * hb-directwrite uses new/delete syntatically but as we let users
- * to override malloc/free, we will redefine new/delete so users
- * won't need to do that by their own.
- */
-void* operator new (size_t size)        { return malloc (size); }
-void* operator new [] (size_t size)     { return malloc (size); }
-void operator delete (void* pointer)    { free (pointer); }
-void operator delete [] (void* pointer) { free (pointer); }
-
+/**
+ * SECTION:hb-directwrite
+ * @title: hb-directwrite
+ * @short_description: DirectWrite integration
+ * @include: hb-directwrite.h
+ *
+ * Functions for using HarfBuzz with DirectWrite fonts.
+ **/
 
 /*
  * DirectWrite font stream helpers
@@ -145,7 +137,6 @@ public:
 
 struct hb_directwrite_face_data_t
 {
-  HMODULE dwrite_dll;
   IDWriteFactory *dwriteFactory;
   IDWriteFontFile *fontFile;
   DWriteFontFileStream *fontFileStream;
@@ -167,33 +158,12 @@ _hb_directwrite_shaper_face_data_create (hb_face_t *face)
     return nullptr; \
   } HB_STMT_END
 
-  data->dwrite_dll = LoadLibrary (TEXT ("DWRITE"));
-  if (unlikely (!data->dwrite_dll))
-    FAIL ("Cannot find DWrite.DLL");
-
-  t_DWriteCreateFactory p_DWriteCreateFactory;
-
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wcast-function-type"
-#endif
-
-  p_DWriteCreateFactory = (t_DWriteCreateFactory)
-                         GetProcAddress (data->dwrite_dll, "DWriteCreateFactory");
-
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-
-  if (unlikely (!p_DWriteCreateFactory))
-    FAIL ("Cannot find DWriteCreateFactory().");
-
   HRESULT hr;
 
   // TODO: factory and fontFileLoader should be cached separately
   IDWriteFactory* dwriteFactory;
-  hr = p_DWriteCreateFactory (DWRITE_FACTORY_TYPE_SHARED, __uuidof (IDWriteFactory),
-                             (IUnknown**) &dwriteFactory);
+  hr = DWriteCreateFactory (DWRITE_FACTORY_TYPE_SHARED, __uuidof (IDWriteFactory),
+                           (IUnknown**) &dwriteFactory);
 
   if (unlikely (hr != S_OK))
     FAIL ("Failed to run DWriteCreateFactory().");
@@ -257,8 +227,6 @@ _hb_directwrite_shaper_face_data_destroy (hb_directwrite_face_data_t *data)
     delete data->fontFileStream;
   if (data->faceBlob)
     hb_blob_destroy (data->faceBlob);
-  if (data->dwrite_dll)
-    FreeLibrary (data->dwrite_dll);
   if (data)
     delete data;
 }
@@ -543,13 +511,12 @@ protected:
  * shaper
  */
 
-static hb_bool_t
-_hb_directwrite_shape_full (hb_shape_plan_t    *shape_plan,
-                           hb_font_t          *font,
-                           hb_buffer_t        *buffer,
-                           const hb_feature_t *features,
-                           unsigned int        num_features,
-                           float               lineWidth)
+hb_bool_t
+_hb_directwrite_shape (hb_shape_plan_t    *shape_plan,
+                      hb_font_t          *font,
+                      hb_buffer_t        *buffer,
+                      const hb_feature_t *features,
+                      unsigned int        num_features)
 {
   hb_face_t *face = font->face;
   const hb_directwrite_face_data_t *face_data = face->data.directwrite;
@@ -602,8 +569,6 @@ _hb_directwrite_shape_full (hb_shape_plan_t    *shape_plan,
       log_clusters[chars_len++] = cluster; /* Surrogates. */
   }
 
-  // TODO: Handle TEST_DISABLE_OPTIONAL_LIGATURES
-
   DWRITE_READING_DIRECTION readingDirection;
   readingDirection = buffer->props.direction ?
                     DWRITE_READING_DIRECTION_RIGHT_TO_LEFT :
@@ -614,7 +579,7 @@ _hb_directwrite_shape_full (hb_shape_plan_t    *shape_plan,
   * but we never attempt to shape a word longer than 64K characters
   * in a single gfxShapedWord, so we cannot exceed that limit.
   */
-  uint32_t textLength = buffer->len;
+  uint32_t textLength = chars_len;
 
   TextAnalysis analysis (textString, textLength, nullptr, readingDirection);
   TextAnalysis::Run *runHead;
@@ -639,38 +604,54 @@ _hb_directwrite_shape_full (hb_shape_plan_t    *shape_plan,
     mbstowcs ((wchar_t*) localeName,
              hb_language_to_string (buffer->props.language), 20);
 
-  // TODO: it does work but doesn't care about ranges
-  DWRITE_TYPOGRAPHIC_FEATURES typographic_features;
-  typographic_features.featureCount = num_features;
+  /*
+   * Set up features.
+   */
+  static_assert ((sizeof (DWRITE_TYPOGRAPHIC_FEATURES) == sizeof (hb_ms_features_t)), "");
+  static_assert ((sizeof (DWRITE_FONT_FEATURE) == sizeof (hb_ms_feature_t)), "");
+  hb_vector_t<hb_ms_features_t *> range_features;
+  hb_vector_t<uint32_t> range_char_counts;
   if (num_features)
   {
-    typographic_features.features = new DWRITE_FONT_FEATURE[num_features];
-    for (unsigned int i = 0; i < num_features; ++i)
-    {
-      typographic_features.features[i].nameTag = (DWRITE_FONT_FEATURE_TAG)
-                                                hb_uint32_swap (features[i].tag);
-      typographic_features.features[i].parameter = features[i].value;
-    }
+    hb_vector_t<hb_ms_feature_t> feature_records;
+    hb_vector_t<hb_ms_range_record_t> range_records;
+    if (hb_ms_setup_features (features, num_features, feature_records, range_records))
+      hb_ms_make_feature_ranges (feature_records,
+                                range_records,
+                                0,
+                                chars_len,
+                                log_clusters,
+                                range_features,
+                                range_char_counts);
   }
-  const DWRITE_TYPOGRAPHIC_FEATURES* dwFeatures;
-  dwFeatures = (const DWRITE_TYPOGRAPHIC_FEATURES*) &typographic_features;
-  const uint32_t featureRangeLengths[] = { textLength };
-  //
 
   uint16_t* clusterMap;
   clusterMap = new uint16_t[textLength];
   DWRITE_SHAPING_TEXT_PROPERTIES* textProperties;
   textProperties = new DWRITE_SHAPING_TEXT_PROPERTIES[textLength];
+
 retry_getglyphs:
   uint16_t* glyphIndices = new uint16_t[maxGlyphCount];
   DWRITE_SHAPING_GLYPH_PROPERTIES* glyphProperties;
   glyphProperties = new DWRITE_SHAPING_GLYPH_PROPERTIES[maxGlyphCount];
 
-  hr = analyzer->GetGlyphs (textString, textLength, fontFace, false,
-                           isRightToLeft, &runHead->mScript, localeName,
-                           nullptr, &dwFeatures, featureRangeLengths, 1,
-                           maxGlyphCount, clusterMap, textProperties,
-                           glyphIndices, glyphProperties, &glyphCount);
+  hr = analyzer->GetGlyphs (textString,
+                           chars_len,
+                           fontFace,
+                           false,
+                           isRightToLeft,
+                           &runHead->mScript,
+                           localeName,
+                           nullptr,
+                           (const DWRITE_TYPOGRAPHIC_FEATURES**) range_features.arrayZ,
+                           range_char_counts.arrayZ,
+                           range_features.length,
+                           maxGlyphCount,
+                           clusterMap,
+                           textProperties,
+                           glyphIndices,
+                           glyphProperties,
+                           &glyphCount);
 
   if (unlikely (hr == HRESULT_FROM_WIN32 (ERROR_INSUFFICIENT_BUFFER)))
   {
@@ -706,101 +687,28 @@ retry_getglyphs:
   double x_mult = (double) font->x_scale / fontEmSize;
   double y_mult = (double) font->y_scale / fontEmSize;
 
-  hr = analyzer->GetGlyphPlacements (textString, clusterMap, textProperties,
-                                    textLength, glyphIndices, glyphProperties,
-                                    glyphCount, fontFace, fontEmSize,
-                                    false, isRightToLeft, &runHead->mScript, localeName,
-                                    &dwFeatures, featureRangeLengths, 1,
-                                    glyphAdvances, glyphOffsets);
+  hr = analyzer->GetGlyphPlacements (textString,
+                                    clusterMap,
+                                    textProperties,
+                                    chars_len,
+                                    glyphIndices,
+                                    glyphProperties,
+                                    glyphCount,
+                                    fontFace,
+                                    fontEmSize,
+                                    false,
+                                    isRightToLeft,
+                                    &runHead->mScript,
+                                    localeName,
+                                    (const DWRITE_TYPOGRAPHIC_FEATURES**) range_features.arrayZ,
+                                    range_char_counts.arrayZ,
+                                    range_features.length,
+                                    glyphAdvances,
+                                    glyphOffsets);
 
   if (FAILED (hr))
     FAIL ("Analyzer failed to get glyph placements.");
 
-  IDWriteTextAnalyzer1* analyzer1;
-  analyzer->QueryInterface (&analyzer1);
-
-  if (analyzer1 && lineWidth)
-  {
-    DWRITE_JUSTIFICATION_OPPORTUNITY* justificationOpportunities =
-      new DWRITE_JUSTIFICATION_OPPORTUNITY[maxGlyphCount];
-    hr = analyzer1->GetJustificationOpportunities (fontFace, fontEmSize, runHead->mScript,
-                                                  textLength, glyphCount, textString,
-                                                  clusterMap, glyphProperties,
-                                                  justificationOpportunities);
-
-    if (FAILED (hr))
-      FAIL ("Analyzer failed to get justification opportunities.");
-
-    float* justifiedGlyphAdvances = new float[maxGlyphCount];
-    DWRITE_GLYPH_OFFSET* justifiedGlyphOffsets = new DWRITE_GLYPH_OFFSET[glyphCount];
-    hr = analyzer1->JustifyGlyphAdvances (lineWidth, glyphCount, justificationOpportunities,
-                                         glyphAdvances, glyphOffsets, justifiedGlyphAdvances,
-                                         justifiedGlyphOffsets);
-
-    if (FAILED (hr)) FAIL ("Analyzer failed to get justify glyph advances.");
-
-    DWRITE_SCRIPT_PROPERTIES scriptProperties;
-    hr = analyzer1->GetScriptProperties (runHead->mScript, &scriptProperties);
-    if (FAILED (hr)) FAIL ("Analyzer failed to get script properties.");
-    uint32_t justificationCharacter = scriptProperties.justificationCharacter;
-
-    // if a script justificationCharacter is not space, it can have GetJustifiedGlyphs
-    if (justificationCharacter != 32)
-    {
-      uint16_t* modifiedClusterMap = new uint16_t[textLength];
-    retry_getjustifiedglyphs:
-      uint16_t* modifiedGlyphIndices = new uint16_t[maxGlyphCount];
-      float* modifiedGlyphAdvances = new float[maxGlyphCount];
-      DWRITE_GLYPH_OFFSET* modifiedGlyphOffsets = new DWRITE_GLYPH_OFFSET[maxGlyphCount];
-      uint32_t actualGlyphsCount;
-      hr = analyzer1->GetJustifiedGlyphs (fontFace, fontEmSize, runHead->mScript,
-                                         textLength, glyphCount, maxGlyphCount,
-                                         clusterMap, glyphIndices, glyphAdvances,
-                                         justifiedGlyphAdvances, justifiedGlyphOffsets,
-                                         glyphProperties, &actualGlyphsCount,
-                                         modifiedClusterMap, modifiedGlyphIndices,
-                                         modifiedGlyphAdvances, modifiedGlyphOffsets);
-
-      if (hr == HRESULT_FROM_WIN32 (ERROR_INSUFFICIENT_BUFFER))
-      {
-       maxGlyphCount = actualGlyphsCount;
-       delete [] modifiedGlyphIndices;
-       delete [] modifiedGlyphAdvances;
-       delete [] modifiedGlyphOffsets;
-
-       maxGlyphCount = actualGlyphsCount;
-
-       goto retry_getjustifiedglyphs;
-      }
-      if (FAILED (hr))
-       FAIL ("Analyzer failed to get justified glyphs.");
-
-      delete [] clusterMap;
-      delete [] glyphIndices;
-      delete [] glyphAdvances;
-      delete [] glyphOffsets;
-
-      glyphCount = actualGlyphsCount;
-      clusterMap = modifiedClusterMap;
-      glyphIndices = modifiedGlyphIndices;
-      glyphAdvances = modifiedGlyphAdvances;
-      glyphOffsets = modifiedGlyphOffsets;
-
-      delete [] justifiedGlyphAdvances;
-      delete [] justifiedGlyphOffsets;
-    }
-    else
-    {
-      delete [] glyphAdvances;
-      delete [] glyphOffsets;
-
-      glyphAdvances = justifiedGlyphAdvances;
-      glyphOffsets = justifiedGlyphOffsets;
-    }
-
-    delete [] justificationOpportunities;
-  }
-
   /* Ok, we've got everything we need, now compose output buffer,
    * very, *very*, carefully! */
 
@@ -854,6 +762,9 @@ retry_getglyphs:
 
   if (isRightToLeft) hb_buffer_reverse (buffer);
 
+  buffer->clear_glyph_flags ();
+  buffer->unsafe_to_break ();
+
   delete [] clusterMap;
   delete [] glyphIndices;
   delete [] textProperties;
@@ -861,43 +772,10 @@ retry_getglyphs:
   delete [] glyphAdvances;
   delete [] glyphOffsets;
 
-  if (num_features)
-    delete [] typographic_features.features;
-
   /* Wow, done! */
   return true;
 }
 
-hb_bool_t
-_hb_directwrite_shape (hb_shape_plan_t    *shape_plan,
-                      hb_font_t          *font,
-                      hb_buffer_t        *buffer,
-                      const hb_feature_t *features,
-                      unsigned int        num_features)
-{
-  return _hb_directwrite_shape_full (shape_plan, font, buffer,
-                                    features, num_features, 0);
-}
-
-HB_UNUSED static bool
-_hb_directwrite_shape_experimental_width (hb_font_t          *font,
-                                         hb_buffer_t        *buffer,
-                                         const hb_feature_t *features,
-                                         unsigned int        num_features,
-                                         float               width)
-{
-  static const char *shapers = "directwrite";
-  hb_shape_plan_t *shape_plan;
-  shape_plan = hb_shape_plan_create_cached (font->face, &buffer->props,
-                                           features, num_features, &shapers);
-  hb_bool_t res = _hb_directwrite_shape_full (shape_plan, font, buffer,
-                                             features, num_features, width);
-
-  buffer->unsafe_to_break_all ();
-
-  return res;
-}
-
 struct _hb_directwrite_font_table_context {
   IDWriteFontFace *face;
   void *table_context;
@@ -908,7 +786,7 @@ _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;
+  hb_free (context);
 }
 
 static hb_blob_t *
@@ -929,7 +807,7 @@ _hb_directwrite_reference_table (hb_face_t *face HB_UNUSED, hb_tag_t tag, void *
     return nullptr;
   }
 
-  _hb_directwrite_font_table_context *context = new _hb_directwrite_font_table_context;
+  _hb_directwrite_font_table_context *context = (_hb_directwrite_font_table_context *) hb_malloc (sizeof (_hb_directwrite_font_table_context));
   context->face = dw_face;
   context->table_context = table_context;
 
@@ -948,6 +826,8 @@ _hb_directwrite_font_release (void *data)
  * hb_directwrite_face_create:
  * @font_face: a DirectWrite IDWriteFontFace object.
  *
+ * Constructs a new face object from the specified DirectWrite IDWriteFontFace.
+ *
  * Return value: #hb_face_t object corresponding to the given input
  *
  * Since: 2.4.0
@@ -965,6 +845,8 @@ hb_directwrite_face_create (IDWriteFontFace *font_face)
 * hb_directwrite_face_get_font_face:
 * @face: a #hb_face_t object
 *
+* Gets the DirectWrite IDWriteFontFace associated with @face.
+*
 * Return value: DirectWrite IDWriteFontFace object corresponding to the given input
 *
 * Since: 2.5.0
index 1ce3fac..37ca681 100644 (file)
@@ -35,7 +35,7 @@
  * Dispatch
  */
 
-template <typename Context, typename Return, unsigned int MaxDebugDepth>
+template <typename Context, typename Return=hb_empty_t, unsigned int MaxDebugDepth=0>
 struct hb_dispatch_context_t
 {
   private:
@@ -43,15 +43,17 @@ struct hb_dispatch_context_t
   const Context* thiz () const { return static_cast<const Context *> (this); }
        Context* thiz ()       { return static_cast<      Context *> (this); }
   public:
+  const char *get_name () { return "UNKNOWN"; }
   static constexpr unsigned max_debug_depth = MaxDebugDepth;
   typedef Return return_t;
   template <typename T, typename F>
   bool may_dispatch (const T *obj HB_UNUSED, const F *format HB_UNUSED) { return true; }
   template <typename T, typename ...Ts>
   return_t dispatch (const T &obj, Ts&&... ds)
-  { return obj.dispatch (thiz (), hb_forward<Ts> (ds)...); }
+  { return obj.dispatch (thiz (), std::forward<Ts> (ds)...); }
   static return_t no_dispatch_return_value () { return Context::default_return_value (); }
   static bool stop_sublookup_iteration (const return_t r HB_UNUSED) { return false; }
+  unsigned debug_depth = 0;
 };
 
 
index 1a5f9c8..c0af6ce 100644 (file)
@@ -191,7 +191,7 @@ hb_draw_funcs_destroy (hb_draw_funcs_t *funcs)
 {
   if (!hb_object_destroy (funcs)) return;
 
-  free (funcs);
+  hb_free (funcs);
 }
 
 /**
index 98eccf4..f82cc34 100644 (file)
@@ -22,7 +22,7 @@
  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  */
 
-#ifndef HB_H_IN
+#if !defined(HB_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb.h> instead."
 #endif
 
@@ -50,7 +50,7 @@ typedef void (*hb_draw_close_path_func_t) (void *user_data);
  *
  * Glyph draw callbacks.
  *
- * _move_to, _line_to and _cubic_to calls are nessecary to be defined but we
+ * _move_to, _line_to and _cubic_to calls are necessary to be defined but we
  * translate _quadratic_to calls to _cubic_to if the callback isn't defined.
  *
  * Since: EXPERIMENTAL
index e4d8a3f..5365598 100644 (file)
@@ -33,6 +33,7 @@
 #include "hb-open-file.hh"
 #include "hb-ot-face.hh"
 #include "hb-ot-cmap-table.hh"
+#include "hb-map.hh"
 
 
 /**
  * @short_description: Font face objects
  * @include: hb.h
  *
- * Font face is objects represent a single face in a font family.
- * More exactly, a font face represents a single face in a binary font file.
+ * A font face is an object that represents a single face from within a
+ * font family.
+ *
+ * More precisely, a font face represents a single face in a binary font file.
  * Font faces are typically built from a binary blob and a face index.
  * Font faces are used to create fonts.
  **/
@@ -52,7 +55,7 @@
  * hb_face_count:
  * @blob: a blob.
  *
- * Get number of faces in a blob.
+ * Fetches the number of faces in a blob.
  *
  * Return value: Number of faces in @blob
  *
@@ -87,8 +90,8 @@ DEFINE_NULL_INSTANCE (hb_face_t) =
   nullptr, /* destroy */
 
   0,    /* index */
-  HB_ATOMIC_INT_INIT (1000), /* upem */
-  HB_ATOMIC_INT_INIT (0),    /* num_glyphs */
+  1000, /* upem */
+  0,    /* num_glyphs */
 
   /* Zero for the rest is fine. */
 };
@@ -96,13 +99,19 @@ DEFINE_NULL_INSTANCE (hb_face_t) =
 
 /**
  * hb_face_create_for_tables:
- * @reference_table_func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
+ * @reference_table_func: (closure user_data) (destroy destroy) (scope notified): Table-referencing function
+ * @user_data: A pointer to the user data
+ * @destroy: (nullable): A callback to call when @data is not needed anymore
  *
+ * Variant of hb_face_create(), built for those cases where it is more
+ * convenient to provide data for individual tables instead of the whole font
+ * data. With the caveat that hb_face_get_table_tags() does not currently work
+ * with faces created this way.
  *
+ * Creates a new face object from the specified @user_data and @reference_table_func,
+ * with the @destroy callback.
  *
- * Return value: (transfer full)
+ * Return value: (transfer full): The new face object
  *
  * Since: 0.9.2
  **/
@@ -134,7 +143,7 @@ hb_face_create_for_tables (hb_reference_table_func_t  reference_table_func,
 
 typedef struct hb_face_for_data_closure_t {
   hb_blob_t *blob;
-  unsigned int  index;
+  uint16_t  index;
 } hb_face_for_data_closure_t;
 
 static hb_face_for_data_closure_t *
@@ -142,12 +151,12 @@ _hb_face_for_data_closure_create (hb_blob_t *blob, unsigned int index)
 {
   hb_face_for_data_closure_t *closure;
 
-  closure = (hb_face_for_data_closure_t *) calloc (1, sizeof (hb_face_for_data_closure_t));
+  closure = (hb_face_for_data_closure_t *) hb_calloc (1, sizeof (hb_face_for_data_closure_t));
   if (unlikely (!closure))
     return nullptr;
 
   closure->blob = blob;
-  closure->index = index;
+  closure->index = (uint16_t) (index & 0xFFFFu);
 
   return closure;
 }
@@ -158,7 +167,7 @@ _hb_face_for_data_closure_destroy (void *data)
   hb_face_for_data_closure_t *closure = (hb_face_for_data_closure_t *) data;
 
   hb_blob_destroy (closure->blob);
-  free (closure);
+  hb_free (closure);
 }
 
 static hb_blob_t *
@@ -182,12 +191,25 @@ _hb_face_for_data_reference_table (hb_face_t *face HB_UNUSED, hb_tag_t tag, void
 
 /**
  * hb_face_create: (Xconstructor)
- * @blob:
- * @index:
+ * @blob: #hb_blob_t to work upon
+ * @index: The index of the face within @blob
+ *
+ * Constructs a new face object from the specified blob and
+ * a face index into that blob.
+ *
+ * The face index is used for blobs of file formats such as TTC and
+ * and DFont that can contain more than one face.  Face indices within
+ * such collections are zero-based.
  *
+ * <note>Note: If the blob font format is not a collection, @index
+ * is ignored.  Otherwise, only the lower 16-bits of @index are used.
+ * The unmodified @index can be accessed via hb_face_get_index().</note>
  *
+ * <note>Note: The high 16-bits of @index, if non-zero, are used by
+ * hb_font_create() to load named-instances in variable fonts.  See
+ * hb_font_create() for details.</note>
  *
- * Return value: (transfer full):
+ * Return value: (transfer full): The new face object
  *
  * Since: 0.9.2
  **/
@@ -200,10 +222,15 @@ hb_face_create (hb_blob_t    *blob,
   if (unlikely (!blob))
     blob = hb_blob_get_empty ();
 
-  hb_face_for_data_closure_t *closure = _hb_face_for_data_closure_create (hb_sanitize_context_t ().sanitize_blob<OT::OpenTypeFontFile> (hb_blob_reference (blob)), index);
+  blob = hb_sanitize_context_t ().sanitize_blob<OT::OpenTypeFontFile> (hb_blob_reference (blob));
+
+  hb_face_for_data_closure_t *closure = _hb_face_for_data_closure_create (blob, index);
 
   if (unlikely (!closure))
+  {
+    hb_blob_destroy (blob);
     return hb_face_get_empty ();
+  }
 
   face = hb_face_create_for_tables (_hb_face_for_data_reference_table,
                                    closure,
@@ -217,9 +244,9 @@ hb_face_create (hb_blob_t    *blob,
 /**
  * hb_face_get_empty:
  *
+ * Fetches the singleton empty face object.
  *
- *
- * Return value: (transfer full)
+ * Return value: (transfer full): The empty face object
  *
  * Since: 0.9.2
  **/
@@ -232,11 +259,11 @@ hb_face_get_empty ()
 
 /**
  * hb_face_reference: (skip)
- * @face: a face.
- *
+ * @face: A face object
  *
+ * Increases the reference count on a face object.
  *
- * Return value:
+ * Return value: The @face object
  *
  * Since: 0.9.2
  **/
@@ -248,9 +275,11 @@ hb_face_reference (hb_face_t *face)
 
 /**
  * hb_face_destroy: (skip)
- * @face: a face.
- *
+ * @face: A face object
  *
+ * Decreases the reference count on a face object. When the
+ * reference count reaches zero, the face is destroyed,
+ * freeing all memory.
  *
  * Since: 0.9.2
  **/
@@ -263,7 +292,7 @@ hb_face_destroy (hb_face_t *face)
   {
     hb_face_t::plan_node_t *next = node->next;
     hb_shape_plan_destroy (node->shape_plan);
-    free (node);
+    hb_free (node);
     node = next;
   }
 
@@ -273,20 +302,20 @@ hb_face_destroy (hb_face_t *face)
   if (face->destroy)
     face->destroy (face->user_data);
 
-  free (face);
+  hb_free (face);
 }
 
 /**
  * hb_face_set_user_data: (skip)
- * @face: a face.
- * @key:
- * @data:
- * @destroy:
- * @replace:
- *
+ * @face: A face object
+ * @key: The user-data key to set
+ * @data: A pointer to the user data
+ * @destroy: (nullable): A callback to call when @data is not needed anymore
+ * @replace: Whether to replace an existing data with the same key
  *
+ * Attaches a user-data key/data pair to the given face object.
  *
- * Return value:
+ * Return value: %true if success, %false otherwise
  *
  * Since: 0.9.2
  **/
@@ -302,12 +331,13 @@ hb_face_set_user_data (hb_face_t          *face,
 
 /**
  * hb_face_get_user_data: (skip)
- * @face: a face.
- * @key:
+ * @face: A face object
+ * @key: The user-data key to query
  *
+ * Fetches the user data associated with the specified key,
+ * attached to the specified face object.
  *
- *
- * Return value: (transfer none):
+ * Return value: (transfer none): A pointer to the user data
  *
  * Since: 0.9.2
  **/
@@ -320,9 +350,9 @@ hb_face_get_user_data (const hb_face_t    *face,
 
 /**
  * hb_face_make_immutable:
- * @face: a face.
- *
+ * @face: A face object
  *
+ * Makes the given face object immutable.
  *
  * Since: 0.9.2
  **/
@@ -337,11 +367,11 @@ hb_face_make_immutable (hb_face_t *face)
 
 /**
  * hb_face_is_immutable:
- * @face: a face.
- *
+ * @face: A face object
  *
+ * Tests whether the given face object is immutable.
  *
- * Return value:
+ * Return value: %true is @face is immutable, %false otherwise
  *
  * Since: 0.9.2
  **/
@@ -354,12 +384,13 @@ hb_face_is_immutable (const hb_face_t *face)
 
 /**
  * hb_face_reference_table:
- * @face: a face.
- * @tag:
+ * @face: A face object
+ * @tag: The #hb_tag_t of the table to query
  *
+ * Fetches a reference to the specified table within
+ * the specified face.
  *
- *
- * Return value: (transfer full):
+ * Return value: (transfer full): A pointer to the @tag table within @face
  *
  * Since: 0.9.2
  **/
@@ -375,11 +406,13 @@ hb_face_reference_table (const hb_face_t *face,
 
 /**
  * hb_face_reference_blob:
- * @face: a face.
- *
+ * @face: A face object
  *
+ * Fetches a pointer to the binary blob that contains the
+ * specified face. Returns an empty blob if referencing face data is not
+ * possible.
  *
- * Return value: (transfer full):
+ * Return value: (transfer full): A pointer to the blob for @face
  *
  * Since: 0.9.2
  **/
@@ -391,10 +424,14 @@ hb_face_reference_blob (hb_face_t *face)
 
 /**
  * hb_face_set_index:
- * @face: a face.
- * @index:
+ * @face: A face object
+ * @index: The index to assign
  *
+ * Assigns the specified face-index to @face. Fails if the
+ * face is immutable.
  *
+ * <note>Note: changing the index has no effect on the face itself
+ * This only changes the value returned by hb_face_get_index().</note>
  *
  * Since: 0.9.2
  **/
@@ -410,11 +447,13 @@ hb_face_set_index (hb_face_t    *face,
 
 /**
  * hb_face_get_index:
- * @face: a face.
+ * @face: A face object
  *
+ * Fetches the face-index corresponding to the given face.
  *
+ * <note>Note: face indices within a collection are zero-based.</note>
  *
- * Return value:
+ * Return value: The index of @face.
  *
  * Since: 0.9.2
  **/
@@ -426,10 +465,10 @@ hb_face_get_index (const hb_face_t *face)
 
 /**
  * hb_face_set_upem:
- * @face: a face.
- * @upem:
- *
+ * @face: A face object
+ * @upem: The units-per-em value to assign
  *
+ * Sets the units-per-em (upem) for a face object to the specified value.
  *
  * Since: 0.9.2
  **/
@@ -445,11 +484,11 @@ hb_face_set_upem (hb_face_t    *face,
 
 /**
  * hb_face_get_upem:
- * @face: a face.
- *
+ * @face: A face object
  *
+ * Fetches the units-per-em (upem) value of the specified face object.
  *
- * Return value:
+ * Return value: The upem value of @face
  *
  * Since: 0.9.2
  **/
@@ -461,10 +500,10 @@ hb_face_get_upem (const hb_face_t *face)
 
 /**
  * hb_face_set_glyph_count:
- * @face: a face.
- * @glyph_count:
- *
+ * @face: A face object
+ * @glyph_count: The glyph-count value to assign
  *
+ * Sets the glyph count for a face object to the specified value.
  *
  * Since: 0.9.7
  **/
@@ -480,11 +519,11 @@ hb_face_set_glyph_count (hb_face_t    *face,
 
 /**
  * hb_face_get_glyph_count:
- * @face: a face.
+ * @face: A face object
  *
+ * Fetches the glyph-count value of the specified face object.
  *
- *
- * Return value:
+ * Return value: The glyph-count value of @face
  *
  * Since: 0.9.7
  **/
@@ -496,14 +535,16 @@ hb_face_get_glyph_count (const hb_face_t *face)
 
 /**
  * hb_face_get_table_tags:
- * @face: a face.
- * @start_offset: index of first tag to return.
- * @table_count: input length of @table_tags array, output number of items written.
- * @table_tags: array to write tags into.
+ * @face: A face object
+ * @start_offset: The index of first table tag to retrieve
+ * @table_count: (inout): Input = the maximum number of table tags to return;
+ *                Output = the actual number of table tags returned (may be zero)
+ * @table_tags: (out) (array length=table_count): The array of table tags found
  *
- * Retrieves table tags for a face, if possible.
+ * Fetches a list of all table tags for a face, if possible. The list returned will
+ * begin at the offset provided
  *
- * Return value: total number of tables, or 0 if not possible to list.
+ * Return value: Total number of tables, or zero if it is not possible to list
  *
  * Since: 1.6.0
  **/
@@ -537,8 +578,11 @@ hb_face_get_table_tags (const hb_face_t *face,
 #ifndef HB_NO_FACE_COLLECT_UNICODES
 /**
  * hb_face_collect_unicodes:
- * @face: font face.
- * @out: set to add Unicode characters covered by @face to.
+ * @face: A face object
+ * @out: The set to add Unicode characters to
+ *
+ * Collects all of the Unicode characters covered by @face and adds
+ * them to the #hb_set_t set @out.
  *
  * Since: 1.9.0
  */
@@ -550,10 +594,11 @@ hb_face_collect_unicodes (hb_face_t *face,
 }
 /**
  * hb_face_collect_variation_selectors:
- * @face: font face.
- * @out: set to add Variation Selector characters covered by @face to.
- *
+ * @face: A face object
+ * @out: The set to add Variation Selector characters to
  *
+ * Collects all Unicode "Variation Selector" characters covered by @face and adds
+ * them to the #hb_set_t set @out.
  *
  * Since: 1.9.0
  */
@@ -565,10 +610,12 @@ hb_face_collect_variation_selectors (hb_face_t *face,
 }
 /**
  * hb_face_collect_variation_unicodes:
- * @face: font face.
- * @out: set to add Unicode characters for @variation_selector covered by @face to.
- *
+ * @face: A face object
+ * @variation_selector: The Variation Selector to query
+ * @out: The set to add Unicode characters to
  *
+ * Collects all Unicode characters for @variation_selector covered by @face and adds
+ * them to the #hb_set_t set @out.
  *
  * Since: 1.9.0
  */
@@ -588,26 +635,26 @@ hb_face_collect_variation_unicodes (hb_face_t *face,
 
 struct hb_face_builder_data_t
 {
-  struct table_entry_t
-  {
-    int cmp (hb_tag_t t) const
-    {
-      if (t < tag) return -1;
-      if (t > tag) return -1;
-      return 0;
-    }
-
-    hb_tag_t   tag;
-    hb_blob_t *blob;
-  };
-
-  hb_vector_t<table_entry_t> tables;
+  hb_hashmap_t<hb_tag_t, hb_blob_t *> tables;
 };
 
+static int compare_entries (const void* pa, const void* pb)
+{
+  const auto& a = * (const hb_pair_t<hb_tag_t, hb_blob_t*> *) pa;
+  const auto& b = * (const hb_pair_t<hb_tag_t, hb_blob_t*> *) pb;
+
+  /* Order by blob size first (smallest to largest) and then table tag */
+
+  if (a.second->length != b.second->length)
+    return a.second->length < b.second->length ? -1 : +1;
+
+  return a.first < b.first ? -1 : a.first == b.first ? 0 : +1;
+}
+
 static hb_face_builder_data_t *
 _hb_face_builder_data_create ()
 {
-  hb_face_builder_data_t *data = (hb_face_builder_data_t *) calloc (1, sizeof (hb_face_builder_data_t));
+  hb_face_builder_data_t *data = (hb_face_builder_data_t *) hb_calloc (1, sizeof (hb_face_builder_data_t));
   if (unlikely (!data))
     return nullptr;
 
@@ -621,25 +668,25 @@ _hb_face_builder_data_destroy (void *user_data)
 {
   hb_face_builder_data_t *data = (hb_face_builder_data_t *) user_data;
 
-  for (unsigned int i = 0; i < data->tables.length; i++)
-    hb_blob_destroy (data->tables[i].blob);
+  for (hb_blob_t* b : data->tables.values())
+    hb_blob_destroy (b);
 
   data->tables.fini ();
 
-  free (data);
+  hb_free (data);
 }
 
 static hb_blob_t *
 _hb_face_builder_data_reference_blob (hb_face_builder_data_t *data)
 {
 
-  unsigned int table_count = data->tables.length;
+  unsigned int table_count = data->tables.get_population ();
   unsigned int face_length = table_count * 16 + 12;
 
-  for (unsigned int i = 0; i < table_count; i++)
-    face_length += hb_ceil_to_4 (hb_blob_get_length (data->tables[i].blob));
+  for (hb_blob_t* b : data->tables.values())
+    face_length += hb_ceil_to_4 (hb_blob_get_length (b));
 
-  char *buf = (char *) malloc (face_length);
+  char *buf = (char *) hb_malloc (face_length);
   if (unlikely (!buf))
     return nullptr;
 
@@ -647,20 +694,31 @@ _hb_face_builder_data_reference_blob (hb_face_builder_data_t *data)
   c.propagate_error (data->tables);
   OT::OpenTypeFontFile *f = c.start_serialize<OT::OpenTypeFontFile> ();
 
-  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.has (HB_TAG ('C','F','F',' '))
+                 || data->tables.has (HB_TAG ('C','F','F','2')));
   hb_tag_t sfnt_tag = is_cff ? OT::OpenTypeFontFile::CFFTag : OT::OpenTypeFontFile::TrueTypeTag;
 
-  bool ret = f->serialize_single (&c, sfnt_tag, data->tables.as_array ());
+  // Sort the tags so that produced face is deterministic.
+  hb_vector_t<hb_pair_t <hb_tag_t, hb_blob_t*>> sorted_entries;
+  data->tables.iter () | hb_sink (sorted_entries);
+  if (unlikely (sorted_entries.in_error ()))
+  {
+    hb_free (buf);
+    return nullptr;
+  }
+
+  sorted_entries.qsort (compare_entries);
+  bool ret = f->serialize_single (&c, sfnt_tag, + sorted_entries.iter());
 
   c.end_serialize ();
 
   if (unlikely (!ret))
   {
-    free (buf);
+    hb_free (buf);
     return nullptr;
   }
 
-  return hb_blob_create (buf, face_length, HB_MEMORY_MODE_WRITABLE, buf, free);
+  return hb_blob_create (buf, face_length, HB_MEMORY_MODE_WRITABLE, buf, hb_free);
 }
 
 static hb_blob_t *
@@ -671,11 +729,7 @@ _hb_face_builder_reference_table (hb_face_t *face HB_UNUSED, hb_tag_t tag, void
   if (!tag)
     return _hb_face_builder_data_reference_blob (data);
 
-  hb_face_builder_data_t::table_entry_t *entry = data->tables.lsearch (tag);
-  if (entry)
-    return hb_blob_reference (entry->blob);
-
-  return nullptr;
+  return hb_blob_reference (data->tables[tag]);
 }
 
 
@@ -703,6 +757,9 @@ hb_face_builder_create ()
 
 /**
  * hb_face_builder_add_table:
+ * @face: A face object created with hb_face_builder_create()
+ * @tag: The #hb_tag_t of the table to add
+ * @blob: The blob containing the table data to add
  *
  * Add table for @tag with data provided by @blob to the face.  @face must
  * be created using hb_face_builder_create().
@@ -712,14 +769,21 @@ hb_face_builder_create ()
 hb_bool_t
 hb_face_builder_add_table (hb_face_t *face, hb_tag_t tag, hb_blob_t *blob)
 {
+  if (tag == HB_MAP_VALUE_INVALID)
+    return false;
+
   if (unlikely (face->destroy != (hb_destroy_func_t) _hb_face_builder_data_destroy))
     return false;
 
   hb_face_builder_data_t *data = (hb_face_builder_data_t *) face->user_data;
-  hb_face_builder_data_t::table_entry_t *entry = data->tables.push ();
 
-  entry->tag = tag;
-  entry->blob = hb_blob_reference (blob);
+  hb_blob_t* previous = data->tables.get (tag);
+  if (!data->tables.set (tag, hb_blob_reference (blob)))
+  {
+    hb_blob_destroy (blob);
+    return false;
+  }
 
+  hb_blob_destroy (previous);
   return true;
 }
index e8ff090..6ef2f8b 100644 (file)
@@ -24,7 +24,7 @@
  * Red Hat Author(s): Behdad Esfahbod
  */
 
-#ifndef HB_H_IN
+#if !defined(HB_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb.h> instead."
 #endif
 
@@ -46,12 +46,31 @@ hb_face_count (hb_blob_t *blob);
  * hb_face_t
  */
 
+/**
+ * hb_face_t:
+ *
+ * Data type for holding font faces.
+ *
+ **/
 typedef struct hb_face_t hb_face_t;
 
 HB_EXTERN hb_face_t *
 hb_face_create (hb_blob_t    *blob,
                unsigned int  index);
 
+/**
+ * hb_reference_table_func_t:
+ * @face: an #hb_face_t to reference table for
+ * @tag: the tag of the table to reference
+ * @user_data: User data pointer passed by the caller
+ *
+ * Callback function for hb_face_create_for_tables().
+ *
+ * Return value: (transfer full): A pointer to the @tag table within @face
+ *
+ * Since: 0.9.2
+ */
+
 typedef hb_blob_t * (*hb_reference_table_func_t)  (hb_face_t *face, hb_tag_t tag, void *user_data);
 
 /* calls destroy() when not needing user_data anymore */
index f1b472c..765f272 100644 (file)
@@ -81,7 +81,7 @@ struct hb_face_t
     return blob;
   }
 
-  HB_PURE_FUNC unsigned int get_upem () const
+  unsigned int get_upem () const
   {
     unsigned int ret = upem.get_relaxed ();
     if (unlikely (!ret))
index c5b7c2c..f8524ec 100644 (file)
@@ -117,7 +117,7 @@ _hb_fallback_shape (hb_shape_plan_t    *shape_plan HB_UNUSED,
   if (HB_DIRECTION_IS_BACKWARD (direction))
     hb_buffer_reverse (buffer);
 
-  buffer->safe_to_break_all ();
+  buffer->clear_glyph_flags ();
 
   return true;
 }
index 2795948..350fcac 100644 (file)
  * @short_description: Font objects
  * @include: hb.h
  *
- * Font objects represent a font face at a certain size and other
- * parameters (pixels per EM, points per EM, variation settings.)
- * Fonts are created from font faces, and are used as input to
- * hb_shape() among other things.
+ * Functions for working with font objects.
+ *
+ * A font object represents a font face at a specific size and with
+ * certain other parameters (pixels-per-em, points-per-em, variation
+ * settings) specified. Font objects are created from font face
+ * objects, and are used as input to hb_shape(), among other things.
+ *
+ * Client programs can optionally pass in their own functions that
+ * implement the basic, lower-level queries of font objects. This set
+ * of font functions is defined by the virtual methods in
+ * #hb_font_funcs_t.
+ *
+ * HarfBuzz provides a built-in set of lightweight default
+ * functions for each method in #hb_font_funcs_t.
  **/
 
 
  */
 
 static hb_bool_t
-hb_font_get_font_h_extents_nil (hb_font_t *font HB_UNUSED,
-                               void *font_data HB_UNUSED,
+hb_font_get_font_h_extents_nil (hb_font_t         *font HB_UNUSED,
+                               void              *font_data HB_UNUSED,
                                hb_font_extents_t *extents,
-                               void *user_data HB_UNUSED)
+                               void              *user_data HB_UNUSED)
 {
   memset (extents, 0, sizeof (*extents));
   return false;
 }
+
 static hb_bool_t
-hb_font_get_font_h_extents_default (hb_font_t *font,
-                                   void *font_data HB_UNUSED,
+hb_font_get_font_h_extents_default (hb_font_t         *font,
+                                   void              *font_data HB_UNUSED,
                                    hb_font_extents_t *extents,
-                                   void *user_data HB_UNUSED)
+                                   void              *user_data HB_UNUSED)
 {
   hb_bool_t ret = font->parent->get_font_h_extents (extents);
   if (ret) {
@@ -79,19 +90,20 @@ hb_font_get_font_h_extents_default (hb_font_t *font,
 }
 
 static hb_bool_t
-hb_font_get_font_v_extents_nil (hb_font_t *font HB_UNUSED,
-                               void *font_data HB_UNUSED,
+hb_font_get_font_v_extents_nil (hb_font_t         *font HB_UNUSED,
+                               void              *font_data HB_UNUSED,
                                hb_font_extents_t *extents,
-                               void *user_data HB_UNUSED)
+                               void              *user_data HB_UNUSED)
 {
   memset (extents, 0, sizeof (*extents));
   return false;
 }
+
 static hb_bool_t
-hb_font_get_font_v_extents_default (hb_font_t *font,
-                                   void *font_data HB_UNUSED,
+hb_font_get_font_v_extents_default (hb_font_t         *font,
+                                   void              *font_data HB_UNUSED,
                                    hb_font_extents_t *extents,
-                                   void *user_data HB_UNUSED)
+                                   void              *user_data HB_UNUSED)
 {
   hb_bool_t ret = font->parent->get_font_v_extents (extents);
   if (ret) {
@@ -103,21 +115,22 @@ hb_font_get_font_v_extents_default (hb_font_t *font,
 }
 
 static hb_bool_t
-hb_font_get_nominal_glyph_nil (hb_font_t *font HB_UNUSED,
-                              void *font_data HB_UNUSED,
-                              hb_codepoint_t unicode HB_UNUSED,
+hb_font_get_nominal_glyph_nil (hb_font_t      *font HB_UNUSED,
+                              void           *font_data HB_UNUSED,
+                              hb_codepoint_t  unicode HB_UNUSED,
                               hb_codepoint_t *glyph,
-                              void *user_data HB_UNUSED)
+                              void           *user_data HB_UNUSED)
 {
   *glyph = 0;
   return false;
 }
+
 static hb_bool_t
-hb_font_get_nominal_glyph_default (hb_font_t *font,
-                                  void *font_data HB_UNUSED,
-                                  hb_codepoint_t unicode,
+hb_font_get_nominal_glyph_default (hb_font_t      *font,
+                                  void           *font_data HB_UNUSED,
+                                  hb_codepoint_t  unicode,
                                   hb_codepoint_t *glyph,
-                                  void *user_data HB_UNUSED)
+                                  void           *user_data HB_UNUSED)
 {
   if (font->has_nominal_glyphs_func_set ())
   {
@@ -127,15 +140,16 @@ hb_font_get_nominal_glyph_default (hb_font_t *font,
 }
 
 #define hb_font_get_nominal_glyphs_nil hb_font_get_nominal_glyphs_default
+
 static unsigned int
-hb_font_get_nominal_glyphs_default (hb_font_t *font,
-                                   void *font_data HB_UNUSED,
-                                   unsigned int count,
+hb_font_get_nominal_glyphs_default (hb_font_t            *font,
+                                   void                 *font_data HB_UNUSED,
+                                   unsigned int          count,
                                    const hb_codepoint_t *first_unicode,
-                                   unsigned int unicode_stride,
-                                   hb_codepoint_t *first_glyph,
-                                   unsigned int glyph_stride,
-                                   void *user_data HB_UNUSED)
+                                   unsigned int          unicode_stride,
+                                   hb_codepoint_t       *first_glyph,
+                                   unsigned int          glyph_stride,
+                                   void                 *user_data HB_UNUSED)
 {
   if (font->has_nominal_glyph_func_set ())
   {
@@ -156,41 +170,43 @@ hb_font_get_nominal_glyphs_default (hb_font_t *font,
 }
 
 static hb_bool_t
-hb_font_get_variation_glyph_nil (hb_font_t *font HB_UNUSED,
-                                void *font_data HB_UNUSED,
-                                hb_codepoint_t unicode HB_UNUSED,
-                                hb_codepoint_t variation_selector HB_UNUSED,
+hb_font_get_variation_glyph_nil (hb_font_t      *font HB_UNUSED,
+                                void           *font_data HB_UNUSED,
+                                hb_codepoint_t  unicode HB_UNUSED,
+                                hb_codepoint_t  variation_selector HB_UNUSED,
                                 hb_codepoint_t *glyph,
-                                void *user_data HB_UNUSED)
+                                void           *user_data HB_UNUSED)
 {
   *glyph = 0;
   return false;
 }
+
 static hb_bool_t
-hb_font_get_variation_glyph_default (hb_font_t *font,
-                                    void *font_data HB_UNUSED,
-                                    hb_codepoint_t unicode,
-                                    hb_codepoint_t variation_selector,
+hb_font_get_variation_glyph_default (hb_font_t      *font,
+                                    void           *font_data HB_UNUSED,
+                                    hb_codepoint_t  unicode,
+                                    hb_codepoint_t  variation_selector,
                                     hb_codepoint_t *glyph,
-                                    void *user_data HB_UNUSED)
+                                    void           *user_data HB_UNUSED)
 {
   return font->parent->get_variation_glyph (unicode, variation_selector, glyph);
 }
 
 
 static hb_position_t
-hb_font_get_glyph_h_advance_nil (hb_font_t *font,
-                                void *font_data HB_UNUSED,
-                                hb_codepoint_t glyph HB_UNUSED,
-                                void *user_data HB_UNUSED)
+hb_font_get_glyph_h_advance_nil (hb_font_t      *font,
+                                void           *font_data HB_UNUSED,
+                                hb_codepoint_t  glyph HB_UNUSED,
+                                void           *user_data HB_UNUSED)
 {
   return font->x_scale;
 }
+
 static hb_position_t
-hb_font_get_glyph_h_advance_default (hb_font_t *font,
-                                    void *font_data HB_UNUSED,
-                                    hb_codepoint_t glyph,
-                                    void *user_data HB_UNUSED)
+hb_font_get_glyph_h_advance_default (hb_font_t      *font,
+                                    void           *font_data HB_UNUSED,
+                                    hb_codepoint_t  glyph,
+                                    void           *user_data HB_UNUSED)
 {
   if (font->has_glyph_h_advances_func_set ())
   {
@@ -202,19 +218,20 @@ hb_font_get_glyph_h_advance_default (hb_font_t *font,
 }
 
 static hb_position_t
-hb_font_get_glyph_v_advance_nil (hb_font_t *font,
-                                void *font_data HB_UNUSED,
-                                hb_codepoint_t glyph HB_UNUSED,
-                                void *user_data HB_UNUSED)
+hb_font_get_glyph_v_advance_nil (hb_font_t      *font,
+                                void           *font_data HB_UNUSED,
+                                hb_codepoint_t  glyph HB_UNUSED,
+                                void           *user_data HB_UNUSED)
 {
   /* TODO use font_extents.ascender+descender */
   return font->y_scale;
 }
+
 static hb_position_t
-hb_font_get_glyph_v_advance_default (hb_font_t *font,
-                                    void *font_data HB_UNUSED,
-                                    hb_codepoint_t glyph,
-                                    void *user_data HB_UNUSED)
+hb_font_get_glyph_v_advance_default (hb_font_t      *font,
+                                    void           *font_data HB_UNUSED,
+                                    hb_codepoint_t  glyph,
+                                    void           *user_data HB_UNUSED)
 {
   if (font->has_glyph_v_advances_func_set ())
   {
@@ -226,15 +243,16 @@ hb_font_get_glyph_v_advance_default (hb_font_t *font,
 }
 
 #define hb_font_get_glyph_h_advances_nil hb_font_get_glyph_h_advances_default
+
 static void
-hb_font_get_glyph_h_advances_default (hb_font_t* font,
-                                     void* font_data HB_UNUSED,
-                                     unsigned int count,
+hb_font_get_glyph_h_advances_default (hb_font_t*            font,
+                                     void*                 font_data HB_UNUSED,
+                                     unsigned int          count,
                                      const hb_codepoint_t *first_glyph,
-                                     unsigned int glyph_stride,
-                                     hb_position_t *first_advance,
-                                     unsigned int advance_stride,
-                                     void *user_data HB_UNUSED)
+                                     unsigned int          glyph_stride,
+                                     hb_position_t        *first_advance,
+                                     unsigned int          advance_stride,
+                                     void                 *user_data HB_UNUSED)
 {
   if (font->has_glyph_h_advance_func_set ())
   {
@@ -259,14 +277,14 @@ hb_font_get_glyph_h_advances_default (hb_font_t* font,
 
 #define hb_font_get_glyph_v_advances_nil hb_font_get_glyph_v_advances_default
 static void
-hb_font_get_glyph_v_advances_default (hb_font_t* font,
-                                     void* font_data HB_UNUSED,
-                                     unsigned int count,
+hb_font_get_glyph_v_advances_default (hb_font_t*            font,
+                                     void*                 font_data HB_UNUSED,
+                                     unsigned int          count,
                                      const hb_codepoint_t *first_glyph,
-                                     unsigned int glyph_stride,
-                                     hb_position_t *first_advance,
-                                     unsigned int advance_stride,
-                                     void *user_data HB_UNUSED)
+                                     unsigned int          glyph_stride,
+                                     hb_position_t        *first_advance,
+                                     unsigned int          advance_stride,
+                                     void                 *user_data HB_UNUSED)
 {
   if (font->has_glyph_v_advance_func_set ())
   {
@@ -290,23 +308,24 @@ hb_font_get_glyph_v_advances_default (hb_font_t* font,
 }
 
 static hb_bool_t
-hb_font_get_glyph_h_origin_nil (hb_font_t *font HB_UNUSED,
-                               void *font_data HB_UNUSED,
-                               hb_codepoint_t glyph HB_UNUSED,
-                               hb_position_t *x,
-                               hb_position_t *y,
-                               void *user_data HB_UNUSED)
+hb_font_get_glyph_h_origin_nil (hb_font_t      *font HB_UNUSED,
+                               void           *font_data HB_UNUSED,
+                               hb_codepoint_t  glyph HB_UNUSED,
+                               hb_position_t  *x,
+                               hb_position_t  *y,
+                               void           *user_data HB_UNUSED)
 {
   *x = *y = 0;
   return true;
 }
+
 static hb_bool_t
-hb_font_get_glyph_h_origin_default (hb_font_t *font,
-                                   void *font_data HB_UNUSED,
-                                   hb_codepoint_t glyph,
-                                   hb_position_t *x,
-                                   hb_position_t *y,
-                                   void *user_data HB_UNUSED)
+hb_font_get_glyph_h_origin_default (hb_font_t      *font,
+                                   void           *font_data HB_UNUSED,
+                                   hb_codepoint_t  glyph,
+                                   hb_position_t  *x,
+                                   hb_position_t  *y,
+                                   void           *user_data HB_UNUSED)
 {
   hb_bool_t ret = font->parent->get_glyph_h_origin (glyph, x, y);
   if (ret)
@@ -315,23 +334,24 @@ hb_font_get_glyph_h_origin_default (hb_font_t *font,
 }
 
 static hb_bool_t
-hb_font_get_glyph_v_origin_nil (hb_font_t *font HB_UNUSED,
-                               void *font_data HB_UNUSED,
-                               hb_codepoint_t glyph HB_UNUSED,
-                               hb_position_t *x,
-                               hb_position_t *y,
-                               void *user_data HB_UNUSED)
+hb_font_get_glyph_v_origin_nil (hb_font_t      *font HB_UNUSED,
+                               void           *font_data HB_UNUSED,
+                               hb_codepoint_t  glyph HB_UNUSED,
+                               hb_position_t  *x,
+                               hb_position_t  *y,
+                               void           *user_data HB_UNUSED)
 {
   *x = *y = 0;
   return false;
 }
+
 static hb_bool_t
-hb_font_get_glyph_v_origin_default (hb_font_t *font,
-                                   void *font_data HB_UNUSED,
-                                   hb_codepoint_t glyph,
-                                   hb_position_t *x,
-                                   hb_position_t *y,
-                                   void *user_data HB_UNUSED)
+hb_font_get_glyph_v_origin_default (hb_font_t      *font,
+                                   void           *font_data HB_UNUSED,
+                                   hb_codepoint_t  glyph,
+                                   hb_position_t  *x,
+                                   hb_position_t  *y,
+                                   void           *user_data HB_UNUSED)
 {
   hb_bool_t ret = font->parent->get_glyph_v_origin (glyph, x, y);
   if (ret)
@@ -340,61 +360,64 @@ hb_font_get_glyph_v_origin_default (hb_font_t *font,
 }
 
 static hb_position_t
-hb_font_get_glyph_h_kerning_nil (hb_font_t *font HB_UNUSED,
-                                void *font_data HB_UNUSED,
-                                hb_codepoint_t left_glyph HB_UNUSED,
-                                hb_codepoint_t right_glyph HB_UNUSED,
-                                void *user_data HB_UNUSED)
+hb_font_get_glyph_h_kerning_nil (hb_font_t      *font HB_UNUSED,
+                                void           *font_data HB_UNUSED,
+                                hb_codepoint_t  left_glyph HB_UNUSED,
+                                hb_codepoint_t  right_glyph HB_UNUSED,
+                                void           *user_data HB_UNUSED)
 {
   return 0;
 }
+
 static hb_position_t
-hb_font_get_glyph_h_kerning_default (hb_font_t *font,
-                                    void *font_data HB_UNUSED,
-                                    hb_codepoint_t left_glyph,
-                                    hb_codepoint_t right_glyph,
-                                    void *user_data HB_UNUSED)
+hb_font_get_glyph_h_kerning_default (hb_font_t      *font,
+                                    void           *font_data HB_UNUSED,
+                                    hb_codepoint_t  left_glyph,
+                                    hb_codepoint_t  right_glyph,
+                                    void           *user_data HB_UNUSED)
 {
   return font->parent_scale_x_distance (font->parent->get_glyph_h_kerning (left_glyph, right_glyph));
 }
 
 #ifndef HB_DISABLE_DEPRECATED
 static hb_position_t
-hb_font_get_glyph_v_kerning_nil (hb_font_t *font HB_UNUSED,
-                                void *font_data HB_UNUSED,
-                                hb_codepoint_t top_glyph HB_UNUSED,
-                                hb_codepoint_t bottom_glyph HB_UNUSED,
-                                void *user_data HB_UNUSED)
+hb_font_get_glyph_v_kerning_nil (hb_font_t      *font HB_UNUSED,
+                                void           *font_data HB_UNUSED,
+                                hb_codepoint_t  top_glyph HB_UNUSED,
+                                hb_codepoint_t  bottom_glyph HB_UNUSED,
+                                void           *user_data HB_UNUSED)
 {
   return 0;
 }
+
 static hb_position_t
-hb_font_get_glyph_v_kerning_default (hb_font_t *font,
-                                    void *font_data HB_UNUSED,
-                                    hb_codepoint_t top_glyph,
-                                    hb_codepoint_t bottom_glyph,
-                                    void *user_data HB_UNUSED)
+hb_font_get_glyph_v_kerning_default (hb_font_t      *font,
+                                    void           *font_data HB_UNUSED,
+                                    hb_codepoint_t  top_glyph,
+                                    hb_codepoint_t  bottom_glyph,
+                                    void           *user_data HB_UNUSED)
 {
   return font->parent_scale_y_distance (font->parent->get_glyph_v_kerning (top_glyph, bottom_glyph));
 }
 #endif
 
 static hb_bool_t
-hb_font_get_glyph_extents_nil (hb_font_t *font HB_UNUSED,
-                              void *font_data HB_UNUSED,
-                              hb_codepoint_t glyph HB_UNUSED,
+hb_font_get_glyph_extents_nil (hb_font_t          *font HB_UNUSED,
+                              void               *font_data HB_UNUSED,
+                              hb_codepoint_t      glyph HB_UNUSED,
                               hb_glyph_extents_t *extents,
-                              void *user_data HB_UNUSED)
+                              void               *user_data HB_UNUSED)
 {
   memset (extents, 0, sizeof (*extents));
   return false;
 }
+
 static hb_bool_t
-hb_font_get_glyph_extents_default (hb_font_t *font,
-                                  void *font_data HB_UNUSED,
-                                  hb_codepoint_t glyph,
+hb_font_get_glyph_extents_default (hb_font_t          *font,
+                                  void               *font_data HB_UNUSED,
+                                  hb_codepoint_t      glyph,
                                   hb_glyph_extents_t *extents,
-                                  void *user_data HB_UNUSED)
+                                  void               *user_data HB_UNUSED)
 {
   hb_bool_t ret = font->parent->get_glyph_extents (glyph, extents);
   if (ret) {
@@ -405,25 +428,26 @@ hb_font_get_glyph_extents_default (hb_font_t *font,
 }
 
 static hb_bool_t
-hb_font_get_glyph_contour_point_nil (hb_font_t *font HB_UNUSED,
-                                    void *font_data HB_UNUSED,
-                                    hb_codepoint_t glyph HB_UNUSED,
-                                    unsigned int point_index HB_UNUSED,
-                                    hb_position_t *x,
-                                    hb_position_t *y,
-                                    void *user_data HB_UNUSED)
+hb_font_get_glyph_contour_point_nil (hb_font_t      *font HB_UNUSED,
+                                    void           *font_data HB_UNUSED,
+                                    hb_codepoint_t  glyph HB_UNUSED,
+                                    unsigned int    point_index HB_UNUSED,
+                                    hb_position_t  *x,
+                                    hb_position_t  *y,
+                                    void           *user_data HB_UNUSED)
 {
   *x = *y = 0;
   return false;
 }
+
 static hb_bool_t
-hb_font_get_glyph_contour_point_default (hb_font_t *font,
-                                        void *font_data HB_UNUSED,
-                                        hb_codepoint_t glyph,
-                                        unsigned int point_index,
-                                        hb_position_t *x,
-                                        hb_position_t *y,
-                                        void *user_data HB_UNUSED)
+hb_font_get_glyph_contour_point_default (hb_font_t      *font,
+                                        void           *font_data HB_UNUSED,
+                                        hb_codepoint_t  glyph,
+                                        unsigned int    point_index,
+                                        hb_position_t  *x,
+                                        hb_position_t  *y,
+                                        void           *user_data HB_UNUSED)
 {
   hb_bool_t ret = font->parent->get_glyph_contour_point (glyph, point_index, x, y);
   if (ret)
@@ -432,42 +456,47 @@ hb_font_get_glyph_contour_point_default (hb_font_t *font,
 }
 
 static hb_bool_t
-hb_font_get_glyph_name_nil (hb_font_t *font HB_UNUSED,
-                           void *font_data HB_UNUSED,
-                           hb_codepoint_t glyph HB_UNUSED,
-                           char *name, unsigned int size,
-                           void *user_data HB_UNUSED)
+hb_font_get_glyph_name_nil (hb_font_t      *font HB_UNUSED,
+                           void           *font_data HB_UNUSED,
+                           hb_codepoint_t  glyph HB_UNUSED,
+                           char           *name,
+                           unsigned int    size,
+                           void           *user_data HB_UNUSED)
 {
   if (size) *name = '\0';
   return false;
 }
+
 static hb_bool_t
-hb_font_get_glyph_name_default (hb_font_t *font,
-                               void *font_data HB_UNUSED,
-                               hb_codepoint_t glyph,
-                               char *name, unsigned int size,
-                               void *user_data HB_UNUSED)
+hb_font_get_glyph_name_default (hb_font_t      *font,
+                               void           *font_data HB_UNUSED,
+                               hb_codepoint_t  glyph,
+                               char           *name,
+                               unsigned int    size,
+                               void           *user_data HB_UNUSED)
 {
   return font->parent->get_glyph_name (glyph, name, size);
 }
 
 static hb_bool_t
-hb_font_get_glyph_from_name_nil (hb_font_t *font HB_UNUSED,
-                                void *font_data HB_UNUSED,
-                                const char *name HB_UNUSED,
-                                int len HB_UNUSED, /* -1 means nul-terminated */
+hb_font_get_glyph_from_name_nil (hb_font_t      *font HB_UNUSED,
+                                void           *font_data HB_UNUSED,
+                                const char     *name HB_UNUSED,
+                                int             len HB_UNUSED, /* -1 means nul-terminated */
                                 hb_codepoint_t *glyph,
-                                void *user_data HB_UNUSED)
+                                void           *user_data HB_UNUSED)
 {
   *glyph = 0;
   return false;
 }
+
 static hb_bool_t
-hb_font_get_glyph_from_name_default (hb_font_t *font,
-                                    void *font_data HB_UNUSED,
-                                    const char *name, int len, /* -1 means nul-terminated */
+hb_font_get_glyph_from_name_default (hb_font_t      *font,
+                                    void           *font_data HB_UNUSED,
+                                    const char     *name,
+                                    int             len, /* -1 means nul-terminated */
                                     hb_codepoint_t *glyph,
-                                    void *user_data HB_UNUSED)
+                                    void           *user_data HB_UNUSED)
 {
   return font->parent->get_glyph_from_name (name, len, glyph);
 }
@@ -521,9 +550,9 @@ static const hb_font_funcs_t _hb_font_funcs_default = {
 /**
  * hb_font_funcs_create: (Xconstructor)
  *
+ * Creates a new #hb_font_funcs_t structure of font functions.
  *
- *
- * Return value: (transfer full):
+ * Return value: (transfer full): The font-functions structure
  *
  * Since: 0.9.2
  **/
@@ -543,9 +572,9 @@ hb_font_funcs_create ()
 /**
  * hb_font_funcs_get_empty:
  *
+ * Fetches an empty font-functions structure.
  *
- *
- * Return value: (transfer full):
+ * Return value: (transfer full): The font-functions structure
  *
  * Since: 0.9.2
  **/
@@ -557,11 +586,11 @@ hb_font_funcs_get_empty ()
 
 /**
  * hb_font_funcs_reference: (skip)
- * @ffuncs: font functions.
- *
+ * @ffuncs: The font-functions structure
  *
+ * Increases the reference count on a font-functions structure.
  *
- * Return value:
+ * Return value: The font-functions structure
  *
  * Since: 0.9.2
  **/
@@ -573,9 +602,11 @@ hb_font_funcs_reference (hb_font_funcs_t *ffuncs)
 
 /**
  * hb_font_funcs_destroy: (skip)
- * @ffuncs: font functions.
- *
+ * @ffuncs: The font-functions structure
  *
+ * Decreases the reference count on a font-functions structure. When
+ * the reference count reaches zero, the font-functions structure is
+ * destroyed, freeing all memory.
  *
  * Since: 0.9.2
  **/
@@ -589,20 +620,20 @@ hb_font_funcs_destroy (hb_font_funcs_t *ffuncs)
   HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
 #undef HB_FONT_FUNC_IMPLEMENT
 
-  free (ffuncs);
+  hb_free (ffuncs);
 }
 
 /**
  * hb_font_funcs_set_user_data: (skip)
- * @ffuncs: font functions.
- * @key:
- * @data:
- * @destroy:
- * @replace:
- *
+ * @ffuncs: The font-functions structure
+ * @key: The user-data key to set
+ * @data: A pointer to the user data set
+ * @destroy: (nullable): A callback to call when @data is not needed anymore
+ * @replace: Whether to replace an existing data with the same key
  *
+ * Attaches a user-data key/data pair to the specified font-functions structure.
  *
- * Return value:
+ * Return value: %true if success, %false otherwise
  *
  * Since: 0.9.2
  **/
@@ -610,7 +641,7 @@ hb_bool_t
 hb_font_funcs_set_user_data (hb_font_funcs_t    *ffuncs,
                             hb_user_data_key_t *key,
                             void *              data,
-                            hb_destroy_func_t   destroy,
+                            hb_destroy_func_t   destroy /* May be NULL. */,
                             hb_bool_t           replace)
 {
   return hb_object_set_user_data (ffuncs, key, data, destroy, replace);
@@ -618,12 +649,13 @@ hb_font_funcs_set_user_data (hb_font_funcs_t    *ffuncs,
 
 /**
  * hb_font_funcs_get_user_data: (skip)
- * @ffuncs: font functions.
- * @key:
+ * @ffuncs: The font-functions structure
+ * @key: The user-data key to query
  *
+ * Fetches the user data associated with the specified key,
+ * attached to the specified font-functions structure.
  *
- *
- * Return value: (transfer none):
+ * Return value: (transfer none): A pointer to the user data
  *
  * Since: 0.9.2
  **/
@@ -637,9 +669,9 @@ hb_font_funcs_get_user_data (hb_font_funcs_t    *ffuncs,
 
 /**
  * hb_font_funcs_make_immutable:
- * @ffuncs: font functions.
- *
+ * @ffuncs: The font-functions structure
  *
+ * Makes a font-functions structure immutable.
  *
  * Since: 0.9.2
  **/
@@ -654,11 +686,11 @@ hb_font_funcs_make_immutable (hb_font_funcs_t *ffuncs)
 
 /**
  * hb_font_funcs_is_immutable:
- * @ffuncs: font functions.
- *
+ * @ffuncs: The font-functions structure
  *
+ * Tests whether a font-functions structure is immutable.
  *
- * Return value:
+ * Return value: %true if @ffuncs is immutable, %false otherwise
  *
  * Since: 0.9.2
  **/
@@ -718,17 +750,18 @@ hb_font_t::has_func (unsigned int i)
 
 /**
  * hb_font_get_h_extents:
- * @font: a font.
- * @extents: (out):
- *
+ * @font: #hb_font_t to work upon
+ * @extents: (out): The font extents retrieved
  *
+ * Fetches the extents for a specified font, for horizontal
+ * text segments.
  *
- * Return value:
+ * Return value: %true if data found, %false otherwise
  *
  * Since: 1.1.3
  **/
 hb_bool_t
-hb_font_get_h_extents (hb_font_t *font,
+hb_font_get_h_extents (hb_font_t         *font,
                       hb_font_extents_t *extents)
 {
   return font->get_font_h_extents (extents);
@@ -736,17 +769,18 @@ hb_font_get_h_extents (hb_font_t *font,
 
 /**
  * hb_font_get_v_extents:
- * @font: a font.
- * @extents: (out):
- *
+ * @font: #hb_font_t to work upon
+ * @extents: (out): The font extents retrieved
  *
+ * Fetches the extents for a specified font, for vertical
+ * text segments.
  *
- * Return value:
+ * Return value: %true if data found, %false otherwise
  *
  * Since: 1.1.3
  **/
 hb_bool_t
-hb_font_get_v_extents (hb_font_t *font,
+hb_font_get_v_extents (hb_font_t         *font,
                       hb_font_extents_t *extents)
 {
   return font->get_font_v_extents (extents);
@@ -754,20 +788,25 @@ hb_font_get_v_extents (hb_font_t *font,
 
 /**
  * hb_font_get_glyph:
- * @font: a font.
- * @unicode:
- * @variation_selector:
- * @glyph: (out):
+ * @font: #hb_font_t to work upon
+ * @unicode: The Unicode code point to query
+ * @variation_selector: A variation-selector code point
+ * @glyph: (out): The glyph ID retrieved
  *
+ * Fetches the glyph ID for a Unicode code point in the specified
+ * font, with an optional variation selector.
  *
+ * If @variation_selector is 0, calls hb_font_get_nominal_glyph();
+ * otherwise calls hb_font_get_variation_glyph().
  *
- * Return value:
+ * Return value: %true if data found, %false otherwise
  *
  * Since: 0.9.2
  **/
 hb_bool_t
-hb_font_get_glyph (hb_font_t *font,
-                  hb_codepoint_t unicode, hb_codepoint_t variation_selector,
+hb_font_get_glyph (hb_font_t      *font,
+                  hb_codepoint_t  unicode,
+                  hb_codepoint_t  variation_selector,
                   hb_codepoint_t *glyph)
 {
   if (unlikely (variation_selector))
@@ -777,19 +816,24 @@ hb_font_get_glyph (hb_font_t *font,
 
 /**
  * hb_font_get_nominal_glyph:
- * @font: a font.
- * @unicode:
- * @glyph: (out):
+ * @font: #hb_font_t to work upon
+ * @unicode: The Unicode code point to query
+ * @glyph: (out): The glyph ID retrieved
  *
+ * Fetches the nominal glyph ID for a Unicode code point in the
+ * specified font.
  *
+ * This version of the function should not be used to fetch glyph IDs
+ * for code points modified by variation selectors. For variation-selector
+ * support, user hb_font_get_variation_glyph() or use hb_font_get_glyph().
  *
- * Return value:
+ * Return value: %true if data found, %false otherwise
  *
  * Since: 1.2.3
  **/
 hb_bool_t
-hb_font_get_nominal_glyph (hb_font_t *font,
-                          hb_codepoint_t unicode,
+hb_font_get_nominal_glyph (hb_font_t      *font,
+                          hb_codepoint_t  unicode,
                           hb_codepoint_t *glyph)
 {
   return font->get_nominal_glyph (unicode, glyph);
@@ -797,11 +841,17 @@ hb_font_get_nominal_glyph (hb_font_t *font,
 
 /**
  * hb_font_get_nominal_glyphs:
- * @font: a font.
+ * @font: #hb_font_t to work upon
+ * @count: number of code points to query
+ * @first_unicode: The first Unicode code point to query
+ * @unicode_stride: The stride between successive code points
+ * @first_glyph: (out): The first glyph ID retrieved
+ * @glyph_stride: The stride between successive glyph IDs
  *
+ * Fetches the nominal glyph IDs for a sequence of Unicode code points. Glyph
+ * IDs must be returned in a #hb_codepoint_t output parameter.
  *
- *
- * Return value:
+ * Return value: the number of code points processed
  *
  * Since: 2.6.3
  **/
@@ -820,20 +870,23 @@ hb_font_get_nominal_glyphs (hb_font_t *font,
 
 /**
  * hb_font_get_variation_glyph:
- * @font: a font.
- * @unicode:
- * @variation_selector:
- * @glyph: (out):
+ * @font: #hb_font_t to work upon
+ * @unicode: The Unicode code point to query
+ * @variation_selector: The  variation-selector code point to query
+ * @glyph: (out): The glyph ID retrieved
  *
+ * Fetches the glyph ID for a Unicode code point when followed by
+ * by the specified variation-selector code point, in the specified
+ * font.
  *
- *
- * Return value:
+ * Return value: %true if data found, %false otherwise
  *
  * Since: 1.2.3
  **/
 hb_bool_t
-hb_font_get_variation_glyph (hb_font_t *font,
-                            hb_codepoint_t unicode, hb_codepoint_t variation_selector,
+hb_font_get_variation_glyph (hb_font_t      *font,
+                            hb_codepoint_t  unicode,
+                            hb_codepoint_t  variation_selector,
                             hb_codepoint_t *glyph)
 {
   return font->get_variation_glyph (unicode, variation_selector, glyph);
@@ -841,134 +894,157 @@ hb_font_get_variation_glyph (hb_font_t *font,
 
 /**
  * hb_font_get_glyph_h_advance:
- * @font: a font.
- * @glyph:
+ * @font: #hb_font_t to work upon
+ * @glyph: The glyph ID to query
  *
+ * Fetches the advance for a glyph ID in the specified font,
+ * for horizontal text segments.
  *
- *
- * Return value:
+ * Return value: The advance of @glyph within @font
  *
  * Since: 0.9.2
  **/
 hb_position_t
-hb_font_get_glyph_h_advance (hb_font_t *font,
-                            hb_codepoint_t glyph)
+hb_font_get_glyph_h_advance (hb_font_t      *font,
+                            hb_codepoint_t  glyph)
 {
   return font->get_glyph_h_advance (glyph);
 }
 
 /**
  * hb_font_get_glyph_v_advance:
- * @font: a font.
- * @glyph:
- *
+ * @font: #hb_font_t to work upon
+ * @glyph: The glyph ID to query
  *
+ * Fetches the advance for a glyph ID in the specified font,
+ * for vertical text segments.
  *
- * Return value:
+ * Return value: The advance of @glyph within @font
  *
  * Since: 0.9.2
  **/
 hb_position_t
-hb_font_get_glyph_v_advance (hb_font_t *font,
-                            hb_codepoint_t glyph)
+hb_font_get_glyph_v_advance (hb_font_t      *font,
+                            hb_codepoint_t  glyph)
 {
   return font->get_glyph_v_advance (glyph);
 }
 
 /**
  * hb_font_get_glyph_h_advances:
- * @font: a font.
- *
+ * @font: #hb_font_t to work upon
+ * @count: The number of glyph IDs in the sequence queried
+ * @first_glyph: The first glyph ID to query
+ * @glyph_stride: The stride between successive glyph IDs
+ * @first_advance: (out): The first advance retrieved
+ * @advance_stride: The stride between successive advances
  *
+ * Fetches the advances for a sequence of glyph IDs in the specified
+ * font, for horizontal text segments.
  *
  * Since: 1.8.6
  **/
 void
-hb_font_get_glyph_h_advances (hb_font_t* font,
-                             unsigned int count,
+hb_font_get_glyph_h_advances (hb_font_t*            font,
+                             unsigned int          count,
                              const hb_codepoint_t *first_glyph,
-                             unsigned glyph_stride,
-                             hb_position_t *first_advance,
-                             unsigned advance_stride)
+                             unsigned              glyph_stride,
+                             hb_position_t        *first_advance,
+                             unsigned              advance_stride)
 {
   font->get_glyph_h_advances (count, first_glyph, glyph_stride, first_advance, advance_stride);
 }
 /**
  * hb_font_get_glyph_v_advances:
- * @font: a font.
- *
+ * @font: #hb_font_t to work upon
+ * @count: The number of glyph IDs in the sequence queried
+ * @first_glyph: The first glyph ID to query
+ * @glyph_stride: The stride between successive glyph IDs
+ * @first_advance: (out): The first advance retrieved
+ * @advance_stride: (out): The stride between successive advances
  *
+ * Fetches the advances for a sequence of glyph IDs in the specified
+ * font, for vertical text segments.
  *
  * Since: 1.8.6
  **/
 void
-hb_font_get_glyph_v_advances (hb_font_t* font,
-                             unsigned int count,
+hb_font_get_glyph_v_advances (hb_font_t*            font,
+                             unsigned int          count,
                              const hb_codepoint_t *first_glyph,
-                             unsigned glyph_stride,
-                             hb_position_t *first_advance,
-                             unsigned advance_stride)
+                             unsigned              glyph_stride,
+                             hb_position_t        *first_advance,
+                             unsigned              advance_stride)
 {
   font->get_glyph_v_advances (count, first_glyph, glyph_stride, first_advance, advance_stride);
 }
 
 /**
  * hb_font_get_glyph_h_origin:
- * @font: a font.
- * @glyph:
- * @x: (out):
- * @y: (out):
+ * @font: #hb_font_t to work upon
+ * @glyph: The glyph ID to query
+ * @x: (out): The X coordinate of the origin
+ * @y: (out): The Y coordinate of the origin
  *
+ * Fetches the (X,Y) coordinates of the origin for a glyph ID
+ * in the specified font, for horizontal text segments.
  *
- *
- * Return value:
+ * Return value: %true if data found, %false otherwise
  *
  * Since: 0.9.2
  **/
 hb_bool_t
-hb_font_get_glyph_h_origin (hb_font_t *font,
-                           hb_codepoint_t glyph,
-                           hb_position_t *x, hb_position_t *y)
+hb_font_get_glyph_h_origin (hb_font_t      *font,
+                           hb_codepoint_t  glyph,
+                           hb_position_t  *x,
+                           hb_position_t  *y)
 {
   return font->get_glyph_h_origin (glyph, x, y);
 }
 
 /**
  * hb_font_get_glyph_v_origin:
- * @font: a font.
- * @glyph:
- * @x: (out):
- * @y: (out):
+ * @font: #hb_font_t to work upon
+ * @glyph: The glyph ID to query
+ * @x: (out): The X coordinate of the origin
+ * @y: (out): The Y coordinate of the origin
  *
+ * Fetches the (X,Y) coordinates of the origin for a glyph ID
+ * in the specified font, for vertical text segments.
  *
- *
- * Return value:
+ * Return value: %true if data found, %false otherwise
  *
  * Since: 0.9.2
  **/
 hb_bool_t
-hb_font_get_glyph_v_origin (hb_font_t *font,
-                           hb_codepoint_t glyph,
-                           hb_position_t *x, hb_position_t *y)
+hb_font_get_glyph_v_origin (hb_font_t      *font,
+                           hb_codepoint_t  glyph,
+                           hb_position_t  *x,
+                           hb_position_t  *y)
 {
   return font->get_glyph_v_origin (glyph, x, y);
 }
 
 /**
  * hb_font_get_glyph_h_kerning:
- * @font: a font.
- * @left_glyph:
- * @right_glyph:
+ * @font: #hb_font_t to work upon
+ * @left_glyph: The glyph ID of the left glyph in the glyph pair
+ * @right_glyph: The glyph ID of the right glyph in the glyph pair
  *
+ * Fetches the kerning-adjustment value for a glyph-pair in
+ * the specified font, for horizontal text segments.
  *
+ * <note>It handles legacy kerning only (as returned by the corresponding
+ * #hb_font_funcs_t function).</note>
  *
- * Return value:
+ * Return value: The kerning adjustment value
  *
  * Since: 0.9.2
  **/
 hb_position_t
-hb_font_get_glyph_h_kerning (hb_font_t *font,
-                            hb_codepoint_t left_glyph, hb_codepoint_t right_glyph)
+hb_font_get_glyph_h_kerning (hb_font_t      *font,
+                            hb_codepoint_t  left_glyph,
+                            hb_codepoint_t  right_glyph)
 {
   return font->get_glyph_h_kerning (left_glyph, right_glyph);
 }
@@ -976,20 +1052,25 @@ hb_font_get_glyph_h_kerning (hb_font_t *font,
 #ifndef HB_DISABLE_DEPRECATED
 /**
  * hb_font_get_glyph_v_kerning:
- * @font: a font.
- * @top_glyph:
- * @bottom_glyph:
+ * @font: #hb_font_t to work upon
+ * @top_glyph: The glyph ID of the top glyph in the glyph pair
+ * @bottom_glyph: The glyph ID of the bottom glyph in the glyph pair
  *
+ * Fetches the kerning-adjustment value for a glyph-pair in
+ * the specified font, for vertical text segments.
  *
+ * <note>It handles legacy kerning only (as returned by the corresponding
+ * #hb_font_funcs_t function).</note>
  *
- * Return value:
+ * Return value: The kerning adjustment value
  *
  * Since: 0.9.2
  * Deprecated: 2.0.0
  **/
 hb_position_t
-hb_font_get_glyph_v_kerning (hb_font_t *font,
-                            hb_codepoint_t top_glyph, hb_codepoint_t bottom_glyph)
+hb_font_get_glyph_v_kerning (hb_font_t      *font,
+                            hb_codepoint_t  top_glyph,
+                            hb_codepoint_t  bottom_glyph)
 {
   return font->get_glyph_v_kerning (top_glyph, bottom_glyph);
 }
@@ -997,19 +1078,20 @@ hb_font_get_glyph_v_kerning (hb_font_t *font,
 
 /**
  * hb_font_get_glyph_extents:
- * @font: a font.
- * @glyph:
- * @extents: (out):
- *
+ * @font: #hb_font_t to work upon
+ * @glyph: The glyph ID to query
+ * @extents: (out): The #hb_glyph_extents_t retrieved
  *
+ * Fetches the #hb_glyph_extents_t data for a glyph ID
+ * in the specified font.
  *
- * Return value:
+ * Return value: %true if data found, %false otherwise
  *
  * Since: 0.9.2
  **/
 hb_bool_t
-hb_font_get_glyph_extents (hb_font_t *font,
-                          hb_codepoint_t glyph,
+hb_font_get_glyph_extents (hb_font_t          *font,
+                          hb_codepoint_t      glyph,
                           hb_glyph_extents_t *extents)
 {
   return font->get_glyph_extents (glyph, extents);
@@ -1017,63 +1099,70 @@ hb_font_get_glyph_extents (hb_font_t *font,
 
 /**
  * hb_font_get_glyph_contour_point:
- * @font: a font.
- * @glyph:
- * @point_index:
- * @x: (out):
- * @y: (out):
- *
+ * @font: #hb_font_t to work upon
+ * @glyph: The glyph ID to query
+ * @point_index: The contour-point index to query
+ * @x: (out): The X value retrieved for the contour point
+ * @y: (out): The Y value retrieved for the contour point
  *
+ * Fetches the (x,y) coordinates of a specified contour-point index
+ * in the specified glyph, within the specified font.
  *
- * Return value:
+ * Return value: %true if data found, %false otherwise
  *
  * Since: 0.9.2
  **/
 hb_bool_t
-hb_font_get_glyph_contour_point (hb_font_t *font,
-                                hb_codepoint_t glyph, unsigned int point_index,
-                                hb_position_t *x, hb_position_t *y)
+hb_font_get_glyph_contour_point (hb_font_t      *font,
+                                hb_codepoint_t  glyph,
+                                unsigned int    point_index,
+                                hb_position_t  *x,
+                                hb_position_t  *y)
 {
   return font->get_glyph_contour_point (glyph, point_index, x, y);
 }
 
 /**
  * hb_font_get_glyph_name:
- * @font: a font.
- * @glyph:
- * @name: (array length=size):
- * @size:
- *
+ * @font: #hb_font_t to work upon
+ * @glyph: The glyph ID to query
+ * @name: (out) (array length=size): Name string retrieved for the glyph ID
+ * @size: Length of the glyph-name string retrieved
  *
+ * Fetches the glyph-name string for a glyph ID in the specified @font.
  *
- * Return value:
+ * Return value: %true if data found, %false otherwise
  *
  * Since: 0.9.2
  **/
 hb_bool_t
-hb_font_get_glyph_name (hb_font_t *font,
-                       hb_codepoint_t glyph,
-                       char *name, unsigned int size)
+hb_font_get_glyph_name (hb_font_t      *font,
+                       hb_codepoint_t  glyph,
+                       char           *name,
+                       unsigned int    size)
 {
   return font->get_glyph_name (glyph, name, size);
 }
 
 /**
  * hb_font_get_glyph_from_name:
- * @font: a font.
- * @name: (array length=len):
- * @len:
- * @glyph: (out):
+ * @font: #hb_font_t to work upon
+ * @name: (array length=len): The name string to query
+ * @len: The length of the name queried
+ * @glyph: (out): The glyph ID retrieved
  *
+ * Fetches the glyph ID that corresponds to a name string in the specified @font.
  *
+ * <note>Note: @len == -1 means the name string is null-terminated.</note>
  *
- * Return value:
+ * Return value: %true if data found, %false otherwise
  *
  * Since: 0.9.2
  **/
 hb_bool_t
-hb_font_get_glyph_from_name (hb_font_t *font,
-                            const char *name, int len, /* -1 means nul-terminated */
+hb_font_get_glyph_from_name (hb_font_t      *font,
+                            const char     *name,
+                            int             len, /* -1 means nul-terminated */
                             hb_codepoint_t *glyph)
 {
   return font->get_glyph_from_name (name, len, glyph);
@@ -1084,164 +1173,211 @@ hb_font_get_glyph_from_name (hb_font_t *font,
 
 /**
  * hb_font_get_extents_for_direction:
- * @font: a font.
- * @direction:
- * @extents: (out):
+ * @font: #hb_font_t to work upon
+ * @direction: The direction of the text segment
+ * @extents: (out): The #hb_font_extents_t retrieved
  *
+ * Fetches the extents for a font in a text segment of the
+ * specified direction.
  *
+ * Calls the appropriate direction-specific variant (horizontal
+ * or vertical) depending on the value of @direction.
  *
  * Since: 1.1.3
  **/
 void
-hb_font_get_extents_for_direction (hb_font_t *font,
-                                  hb_direction_t direction,
+hb_font_get_extents_for_direction (hb_font_t         *font,
+                                  hb_direction_t     direction,
                                   hb_font_extents_t *extents)
 {
   return font->get_extents_for_direction (direction, extents);
 }
 /**
  * hb_font_get_glyph_advance_for_direction:
- * @font: a font.
- * @glyph:
- * @direction:
- * @x: (out):
- * @y: (out):
+ * @font: #hb_font_t to work upon
+ * @glyph: The glyph ID to query
+ * @direction: The direction of the text segment
+ * @x: (out): The horizontal advance retrieved
+ * @y: (out):  The vertical advance retrieved
  *
+ * Fetches the advance for a glyph ID from the specified font,
+ * in a text segment of the specified direction.
  *
+ * Calls the appropriate direction-specific variant (horizontal
+ * or vertical) depending on the value of @direction.
  *
  * Since: 0.9.2
  **/
 void
-hb_font_get_glyph_advance_for_direction (hb_font_t *font,
-                                        hb_codepoint_t glyph,
-                                        hb_direction_t direction,
-                                        hb_position_t *x, hb_position_t *y)
+hb_font_get_glyph_advance_for_direction (hb_font_t      *font,
+                                        hb_codepoint_t  glyph,
+                                        hb_direction_t  direction,
+                                        hb_position_t  *x,
+                                        hb_position_t  *y)
 {
   return font->get_glyph_advance_for_direction (glyph, direction, x, y);
 }
 /**
  * hb_font_get_glyph_advances_for_direction:
- * @font: a font.
- * @direction:
+ * @font: #hb_font_t to work upon
+ * @direction: The direction of the text segment
+ * @count: The number of glyph IDs in the sequence queried
+ * @first_glyph: The first glyph ID to query
+ * @glyph_stride: The stride between successive glyph IDs
+ * @first_advance: (out): The first advance retrieved
+ * @advance_stride: (out): The stride between successive advances
  *
+ * Fetches the advances for a sequence of glyph IDs in the specified
+ * font, in a text segment of the specified direction.
  *
+ * Calls the appropriate direction-specific variant (horizontal
+ * or vertical) depending on the value of @direction.
  *
  * Since: 1.8.6
  **/
 HB_EXTERN void
-hb_font_get_glyph_advances_for_direction (hb_font_t* font,
-                                         hb_direction_t direction,
-                                         unsigned int count,
+hb_font_get_glyph_advances_for_direction (hb_font_t*            font,
+                                         hb_direction_t        direction,
+                                         unsigned int          count,
                                          const hb_codepoint_t *first_glyph,
-                                         unsigned glyph_stride,
-                                         hb_position_t *first_advance,
-                                         unsigned advance_stride)
+                                         unsigned              glyph_stride,
+                                         hb_position_t        *first_advance,
+                                         unsigned              advance_stride)
 {
   font->get_glyph_advances_for_direction (direction, count, first_glyph, glyph_stride, first_advance, advance_stride);
 }
 
 /**
  * hb_font_get_glyph_origin_for_direction:
- * @font: a font.
- * @glyph:
- * @direction:
- * @x: (out):
- * @y: (out):
+ * @font: #hb_font_t to work upon
+ * @glyph: The glyph ID to query
+ * @direction: The direction of the text segment
+ * @x: (out): The X coordinate retrieved for the origin
+ * @y: (out): The Y coordinate retrieved for the origin
  *
+ * Fetches the (X,Y) coordinates of the origin for a glyph in
+ * the specified font.
  *
+ * Calls the appropriate direction-specific variant (horizontal
+ * or vertical) depending on the value of @direction.
  *
  * Since: 0.9.2
  **/
 void
-hb_font_get_glyph_origin_for_direction (hb_font_t *font,
-                                       hb_codepoint_t glyph,
-                                       hb_direction_t direction,
-                                       hb_position_t *x, hb_position_t *y)
+hb_font_get_glyph_origin_for_direction (hb_font_t      *font,
+                                       hb_codepoint_t  glyph,
+                                       hb_direction_t  direction,
+                                       hb_position_t  *x,
+                                       hb_position_t  *y)
 {
   return font->get_glyph_origin_for_direction (glyph, direction, x, y);
 }
 
 /**
  * hb_font_add_glyph_origin_for_direction:
- * @font: a font.
- * @glyph:
- * @direction:
- * @x: (out):
- * @y: (out):
+ * @font: #hb_font_t to work upon
+ * @glyph: The glyph ID to query
+ * @direction: The direction of the text segment
+ * @x: (inout): Input = The original X coordinate
+ *     Output = The X coordinate plus the X-coordinate of the origin
+ * @y: (inout): Input = The original Y coordinate
+ *     Output = The Y coordinate plus the Y-coordinate of the origin
  *
+ * Adds the origin coordinates to an (X,Y) point coordinate, in
+ * the specified glyph ID in the specified font.
  *
+ * Calls the appropriate direction-specific variant (horizontal
+ * or vertical) depending on the value of @direction.
  *
  * Since: 0.9.2
  **/
 void
-hb_font_add_glyph_origin_for_direction (hb_font_t *font,
-                                       hb_codepoint_t glyph,
-                                       hb_direction_t direction,
-                                       hb_position_t *x, hb_position_t *y)
+hb_font_add_glyph_origin_for_direction (hb_font_t      *font,
+                                       hb_codepoint_t  glyph,
+                                       hb_direction_t  direction,
+                                       hb_position_t  *x,
+                                       hb_position_t  *y)
 {
   return font->add_glyph_origin_for_direction (glyph, direction, x, y);
 }
 
 /**
  * hb_font_subtract_glyph_origin_for_direction:
- * @font: a font.
- * @glyph:
- * @direction:
- * @x: (out):
- * @y: (out):
+ * @font: #hb_font_t to work upon
+ * @glyph: The glyph ID to query
+ * @direction: The direction of the text segment
+ * @x: (inout): Input = The original X coordinate
+ *     Output = The X coordinate minus the X-coordinate of the origin
+ * @y: (inout): Input = The original Y coordinate
+ *     Output = The Y coordinate minus the Y-coordinate of the origin
  *
+ * Subtracts the origin coordinates from an (X,Y) point coordinate,
+ * in the specified glyph ID in the specified font.
  *
+ * Calls the appropriate direction-specific variant (horizontal
+ * or vertical) depending on the value of @direction.
  *
  * Since: 0.9.2
  **/
 void
-hb_font_subtract_glyph_origin_for_direction (hb_font_t *font,
-                                            hb_codepoint_t glyph,
-                                            hb_direction_t direction,
-                                            hb_position_t *x, hb_position_t *y)
+hb_font_subtract_glyph_origin_for_direction (hb_font_t      *font,
+                                            hb_codepoint_t  glyph,
+                                            hb_direction_t  direction,
+                                            hb_position_t  *x,
+                                            hb_position_t  *y)
 {
   return font->subtract_glyph_origin_for_direction (glyph, direction, x, y);
 }
 
 /**
  * hb_font_get_glyph_kerning_for_direction:
- * @font: a font.
- * @first_glyph:
- * @second_glyph:
- * @direction:
- * @x: (out):
- * @y: (out):
+ * @font: #hb_font_t to work upon
+ * @first_glyph: The glyph ID of the first glyph in the glyph pair to query
+ * @second_glyph: The glyph ID of the second glyph in the glyph pair to query
+ * @direction: The direction of the text segment
+ * @x: (out): The horizontal kerning-adjustment value retrieved
+ * @y: (out): The vertical kerning-adjustment value retrieved
  *
+ * Fetches the kerning-adjustment value for a glyph-pair in the specified font.
  *
+ * Calls the appropriate direction-specific variant (horizontal
+ * or vertical) depending on the value of @direction.
  *
  * Since: 0.9.2
  **/
 void
-hb_font_get_glyph_kerning_for_direction (hb_font_t *font,
-                                        hb_codepoint_t first_glyph, hb_codepoint_t second_glyph,
-                                        hb_direction_t direction,
-                                        hb_position_t *x, hb_position_t *y)
+hb_font_get_glyph_kerning_for_direction (hb_font_t      *font,
+                                        hb_codepoint_t  first_glyph,
+                                        hb_codepoint_t  second_glyph,
+                                        hb_direction_t  direction,
+                                        hb_position_t  *x,
+                                        hb_position_t  *y)
 {
   return font->get_glyph_kerning_for_direction (first_glyph, second_glyph, direction, x, y);
 }
 
 /**
  * hb_font_get_glyph_extents_for_origin:
- * @font: a font.
- * @glyph:
- * @direction:
- * @extents: (out):
+ * @font: #hb_font_t to work upon
+ * @glyph: The glyph ID to query
+ * @direction: The direction of the text segment
+ * @extents: (out): The #hb_glyph_extents_t retrieved
  *
+ * Fetches the #hb_glyph_extents_t data for a glyph ID
+ * in the specified font, with respect to the origin in
+ * a text segment in the specified direction.
  *
+ * Calls the appropriate direction-specific variant (horizontal
+ * or vertical) depending on the value of @direction.
  *
- * Return value:
+ * Return value: %true if data found, %false otherwise
  *
  * Since: 0.9.2
  **/
 hb_bool_t
-hb_font_get_glyph_extents_for_origin (hb_font_t *font,
-                                     hb_codepoint_t glyph,
-                                     hb_direction_t direction,
+hb_font_get_glyph_extents_for_origin (hb_font_t          *font,
+                                     hb_codepoint_t      glyph,
+                                     hb_direction_t      direction,
                                      hb_glyph_extents_t *extents)
 {
   return font->get_glyph_extents_for_origin (glyph, direction, extents);
@@ -1249,65 +1385,79 @@ hb_font_get_glyph_extents_for_origin (hb_font_t *font,
 
 /**
  * hb_font_get_glyph_contour_point_for_origin:
- * @font: a font.
- * @glyph:
- * @point_index:
- * @direction:
- * @x: (out):
- * @y: (out):
+ * @font: #hb_font_t to work upon
+ * @glyph: The glyph ID to query
+ * @point_index: The contour-point index to query
+ * @direction: The direction of the text segment
+ * @x: (out): The X value retrieved for the contour point
+ * @y: (out): The Y value retrieved for the contour point
  *
+ * Fetches the (X,Y) coordinates of a specified contour-point index
+ * in the specified glyph ID in the specified font, with respect
+ * to the origin in a text segment in the specified direction.
  *
+ * Calls the appropriate direction-specific variant (horizontal
+ * or vertical) depending on the value of @direction.
  *
- * Return value:
+ * Return value: %true if data found, %false otherwise
  *
  * Since: 0.9.2
  **/
 hb_bool_t
-hb_font_get_glyph_contour_point_for_origin (hb_font_t *font,
-                                           hb_codepoint_t glyph, unsigned int point_index,
-                                           hb_direction_t direction,
-                                           hb_position_t *x, hb_position_t *y)
+hb_font_get_glyph_contour_point_for_origin (hb_font_t      *font,
+                                           hb_codepoint_t  glyph,
+                                           unsigned int    point_index,
+                                           hb_direction_t  direction,
+                                           hb_position_t  *x,
+                                           hb_position_t  *y)
 {
   return font->get_glyph_contour_point_for_origin (glyph, point_index, direction, x, y);
 }
 
-/* Generates gidDDD if glyph has no name. */
 /**
  * hb_font_glyph_to_string:
- * @font: a font.
- * @glyph:
- * @s: (array length=size):
- * @size:
+ * @font: #hb_font_t to work upon
+ * @glyph: The glyph ID to query
+ * @s: (out) (array length=size): The string containing the glyph name
+ * @size: Length of string @s
  *
+ * Fetches the name of the specified glyph ID in @font and returns
+ * it in string @s.
  *
+ * If the glyph ID has no name in @font, a string of the form `gidDDD` is
+ * generated, with `DDD` being the glyph ID.
  *
  * Since: 0.9.2
  **/
 void
-hb_font_glyph_to_string (hb_font_t *font,
-                        hb_codepoint_t glyph,
-                        char *s, unsigned int size)
+hb_font_glyph_to_string (hb_font_t      *font,
+                        hb_codepoint_t  glyph,
+                        char           *s,
+                        unsigned int    size)
 {
   font->glyph_to_string (glyph, s, size);
 }
 
-/* Parses gidDDD and uniUUUU strings automatically. */
 /**
  * hb_font_glyph_from_string:
- * @font: a font.
- * @s: (array length=len) (element-type uint8_t):
- * @len:
- * @glyph: (out):
+ * @font: #hb_font_t to work upon
+ * @s: (array length=len) (element-type uint8_t): string to query
+ * @len: The length of the string @s
+ * @glyph: (out): The glyph ID corresponding to the string requested
  *
+ * Fetches the glyph ID from @font that matches the specified string.
+ * Strings of the format `gidDDD` or `uniUUUU` are parsed automatically.
  *
+ * <note>Note: @len == -1 means the string is null-terminated.</note>
  *
- * Return value:
+ * Return value: %true if data found, %false otherwise
  *
  * Since: 0.9.2
  **/
 hb_bool_t
-hb_font_glyph_from_string (hb_font_t *font,
-                          const char *s, int len, /* -1 means nul-terminated */
+hb_font_glyph_from_string (hb_font_t      *font,
+                          const char     *s,
+                          int             len,
                           hb_codepoint_t *glyph)
 {
   return font->glyph_from_string (s, len, glyph);
@@ -1327,6 +1477,8 @@ DEFINE_NULL_INSTANCE (hb_font_t) =
 
   1000, /* x_scale */
   1000, /* y_scale */
+  0., /* slant */
+  0., /* slant_xy; */
   1<<16, /* x_mult */
   1<<16, /* y_mult */
 
@@ -1369,9 +1521,16 @@ _hb_font_create (hb_face_t *face)
  * hb_font_create: (Xconstructor)
  * @face: a face.
  *
+ * Constructs a new font object from the specified face.
  *
+ * <note>Note: If @face's index value (as passed to hb_face_create()
+ * has non-zero top 16-bits, those bits minus one are passed to
+ * hb_font_set_var_named_instance(), effectively loading a named-instance
+ * of a variable font, instead of the default-instance.  This allows
+ * specifying which named-instance to load by default when creating the
+ * face.</note>
  *
- * Return value: (transfer full):
+ * Return value: (transfer full): The new font object
  *
  * Since: 0.9.2
  **/
@@ -1385,6 +1544,11 @@ hb_font_create (hb_face_t *face)
   hb_ot_font_set_funcs (font);
 #endif
 
+#ifndef HB_NO_VAR
+  if (face && face->index >> 16)
+    hb_font_set_var_named_instance (font, (face->index >> 16) - 1);
+#endif
+
   return font;
 }
 
@@ -1394,8 +1558,8 @@ _hb_font_adopt_var_coords (hb_font_t *font,
                           float *design_coords,
                           unsigned int coords_length)
 {
-  free (font->coords);
-  free (font->design_coords);
+  hb_free (font->coords);
+  hb_free (font->design_coords);
 
   font->coords = coords;
   font->design_coords = design_coords;
@@ -1404,11 +1568,12 @@ _hb_font_adopt_var_coords (hb_font_t *font,
 
 /**
  * hb_font_create_sub_font:
- * @parent: parent font.
- *
+ * @parent: The parent font object
  *
+ * Constructs a sub-font font object from the specified @parent font,
+ * replicating the parent's properties.
  *
- * Return value: (transfer full):
+ * Return value: (transfer full): The new sub-font font object
  *
  * Since: 0.9.2
  **/
@@ -1427,6 +1592,7 @@ hb_font_create_sub_font (hb_font_t *parent)
 
   font->x_scale = parent->x_scale;
   font->y_scale = parent->y_scale;
+  font->slant = parent->slant;
   font->mults_changed ();
   font->x_ppem = parent->x_ppem;
   font->y_ppem = parent->y_ppem;
@@ -1435,8 +1601,8 @@ hb_font_create_sub_font (hb_font_t *parent)
   unsigned int num_coords = parent->num_coords;
   if (num_coords)
   {
-    int *coords = (int *) calloc (num_coords, sizeof (parent->coords[0]));
-    float *design_coords = (float *) calloc (num_coords, sizeof (parent->design_coords[0]));
+    int *coords = (int *) hb_calloc (num_coords, sizeof (parent->coords[0]));
+    float *design_coords = (float *) hb_calloc (num_coords, sizeof (parent->design_coords[0]));
     if (likely (coords && design_coords))
     {
       memcpy (coords, parent->coords, num_coords * sizeof (parent->coords[0]));
@@ -1445,8 +1611,8 @@ hb_font_create_sub_font (hb_font_t *parent)
     }
     else
     {
-      free (coords);
-      free (design_coords);
+      hb_free (coords);
+      hb_free (design_coords);
     }
   }
 
@@ -1456,9 +1622,9 @@ hb_font_create_sub_font (hb_font_t *parent)
 /**
  * hb_font_get_empty:
  *
+ * Fetches the empty font object.
  *
- *
- * Return value: (transfer full)
+ * Return value: (transfer full): The empty font object
  *
  * Since: 0.9.2
  **/
@@ -1470,11 +1636,11 @@ hb_font_get_empty ()
 
 /**
  * hb_font_reference: (skip)
- * @font: a font.
+ * @font: #hb_font_t to work upon
  *
+ * Increases the reference count on the given font object.
  *
- *
- * Return value: (transfer full):
+ * Return value: (transfer full): The @font object
  *
  * Since: 0.9.2
  **/
@@ -1486,9 +1652,11 @@ hb_font_reference (hb_font_t *font)
 
 /**
  * hb_font_destroy: (skip)
- * @font: a font.
- *
+ * @font: #hb_font_t to work upon
  *
+ * Decreases the reference count on the given font object. When the
+ * reference count reaches zero, the font is destroyed,
+ * freeing all memory.
  *
  * Since: 0.9.2
  **/
@@ -1506,23 +1674,23 @@ hb_font_destroy (hb_font_t *font)
   hb_face_destroy (font->face);
   hb_font_funcs_destroy (font->klass);
 
-  free (font->coords);
-  free (font->design_coords);
+  hb_free (font->coords);
+  hb_free (font->design_coords);
 
-  free (font);
+  hb_free (font);
 }
 
 /**
  * hb_font_set_user_data: (skip)
- * @font: a font.
- * @key:
- * @data:
- * @destroy:
- * @replace:
- *
+ * @font: #hb_font_t to work upon
+ * @key: The user-data key
+ * @data: A pointer to the user data
+ * @destroy: (nullable): A callback to call when @data is not needed anymore
+ * @replace: Whether to replace an existing data with the same key
  *
+ * Attaches a user-data key/data pair to the specified font object.
  *
- * Return value:
+ * Return value: %true if success, %false otherwise
  *
  * Since: 0.9.2
  **/
@@ -1530,7 +1698,7 @@ hb_bool_t
 hb_font_set_user_data (hb_font_t          *font,
                       hb_user_data_key_t *key,
                       void *              data,
-                      hb_destroy_func_t   destroy,
+                      hb_destroy_func_t   destroy /* May be NULL. */,
                       hb_bool_t           replace)
 {
   return hb_object_set_user_data (font, key, data, destroy, replace);
@@ -1538,12 +1706,13 @@ hb_font_set_user_data (hb_font_t          *font,
 
 /**
  * hb_font_get_user_data: (skip)
- * @font: a font.
- * @key:
- *
+ * @font: #hb_font_t to work upon
+ * @key: The user-data key to query
  *
+ * Fetches the user-data object associated with the specified key,
+ * attached to the specified font object.
  *
- * Return value: (transfer none):
+ * Return value: (transfer none): Pointer to the user data
  *
  * Since: 0.9.2
  **/
@@ -1556,9 +1725,9 @@ hb_font_get_user_data (hb_font_t          *font,
 
 /**
  * hb_font_make_immutable:
- * @font: a font.
- *
+ * @font: #hb_font_t to work upon
  *
+ * Makes @font immutable.
  *
  * Since: 0.9.2
  **/
@@ -1576,11 +1745,11 @@ hb_font_make_immutable (hb_font_t *font)
 
 /**
  * hb_font_is_immutable:
- * @font: a font.
+ * @font: #hb_font_t to work upon
  *
+ * Tests whether a font object is immutable.
  *
- *
- * Return value:
+ * Return value: %true if @font is immutable, %false otherwise
  *
  * Since: 0.9.2
  **/
@@ -1592,10 +1761,10 @@ hb_font_is_immutable (hb_font_t *font)
 
 /**
  * hb_font_set_parent:
- * @font: a font.
- * @parent: new parent.
+ * @font: #hb_font_t to work upon
+ * @parent: The parent font object to assign
  *
- * Sets parent font of @font.
+ * Sets the parent font of @font.
  *
  * Since: 1.0.5
  **/
@@ -1618,11 +1787,11 @@ hb_font_set_parent (hb_font_t *font,
 
 /**
  * hb_font_get_parent:
- * @font: a font.
+ * @font: #hb_font_t to work upon
  *
+ * Fetches the parent font of @font.
  *
- *
- * Return value: (transfer none):
+ * Return value: (transfer none): The parent font object
  *
  * Since: 0.9.2
  **/
@@ -1634,10 +1803,10 @@ hb_font_get_parent (hb_font_t *font)
 
 /**
  * hb_font_set_face:
- * @font: a font.
- * @face: new face.
+ * @font: #hb_font_t to work upon
+ * @face: The #hb_face_t to assign
  *
- * Sets font-face of @font.
+ * Sets @face as the font-face value of @font.
  *
  * Since: 1.4.3
  **/
@@ -1662,11 +1831,11 @@ hb_font_set_face (hb_font_t *font,
 
 /**
  * hb_font_get_face:
- * @font: a font.
- *
+ * @font: #hb_font_t to work upon
  *
+ * Fetches the face associated with the specified font object.
  *
- * Return value: (transfer none):
+ * Return value: (transfer none): The #hb_face_t value
  *
  * Since: 0.9.2
  **/
@@ -1679,12 +1848,13 @@ hb_font_get_face (hb_font_t *font)
 
 /**
  * hb_font_set_funcs:
- * @font: a font.
- * @klass: (closure font_data) (destroy destroy) (scope notified):
- * @font_data:
- * @destroy:
- *
+ * @font: #hb_font_t to work upon
+ * @klass: (closure font_data) (destroy destroy) (scope notified): The font-functions structure.
+ * @font_data: Data to attach to @font
+ * @destroy: (nullable): The function to call when @font_data is not needed anymore
  *
+ * Replaces the font-functions structure attached to a font, updating
+ * the font's user-data with @font-data and the @destroy callback.
  *
  * Since: 0.9.2
  **/
@@ -1692,7 +1862,7 @@ void
 hb_font_set_funcs (hb_font_t         *font,
                   hb_font_funcs_t   *klass,
                   void              *font_data,
-                  hb_destroy_func_t  destroy)
+                  hb_destroy_func_t  destroy /* May be NULL. */)
 {
   if (hb_object_is_immutable (font))
   {
@@ -1716,18 +1886,19 @@ hb_font_set_funcs (hb_font_t         *font,
 
 /**
  * hb_font_set_funcs_data:
- * @font: a font.
- * @font_data: (destroy destroy) (scope notified):
- * @destroy:
- *
+ * @font: #hb_font_t to work upon
+ * @font_data: (destroy destroy) (scope notified): Data to attach to @font
+ * @destroy: (nullable): The function to call when @font_data is not needed anymore
  *
+ * Replaces the user data attached to a font, updating the font's
+ * @destroy callback.
  *
  * Since: 0.9.2
  **/
 void
 hb_font_set_funcs_data (hb_font_t         *font,
-                       void              *font_data,
-                       hb_destroy_func_t  destroy)
+                       void              *font_data,
+                       hb_destroy_func_t  destroy /* May be NULL. */)
 {
   /* Destroy user_data? */
   if (hb_object_is_immutable (font))
@@ -1747,18 +1918,18 @@ hb_font_set_funcs_data (hb_font_t         *font,
 
 /**
  * hb_font_set_scale:
- * @font: a font.
- * @x_scale:
- * @y_scale:
- *
+ * @font: #hb_font_t to work upon
+ * @x_scale: Horizontal scale value to assign
+ * @y_scale: Vertical scale value to assign
  *
+ * Sets the horizontal and vertical scale of a font.
  *
  * Since: 0.9.2
  **/
 void
 hb_font_set_scale (hb_font_t *font,
-                  int x_scale,
-                  int y_scale)
+                  int        x_scale,
+                  int        y_scale)
 {
   if (hb_object_is_immutable (font))
     return;
@@ -1770,18 +1941,18 @@ hb_font_set_scale (hb_font_t *font,
 
 /**
  * hb_font_get_scale:
- * @font: a font.
- * @x_scale: (out):
- * @y_scale: (out):
- *
+ * @font: #hb_font_t to work upon
+ * @x_scale: (out): Horizontal scale value
+ * @y_scale: (out): Vertical scale value
  *
+ * Fetches the horizontal and vertical scale of a font.
  *
  * Since: 0.9.2
  **/
 void
 hb_font_get_scale (hb_font_t *font,
-                  int *x_scale,
-                  int *y_scale)
+                  int       *x_scale,
+                  int       *y_scale)
 {
   if (x_scale) *x_scale = font->x_scale;
   if (y_scale) *y_scale = font->y_scale;
@@ -1789,18 +1960,18 @@ hb_font_get_scale (hb_font_t *font,
 
 /**
  * hb_font_set_ppem:
- * @font: a font.
- * @x_ppem:
- * @y_ppem:
- *
+ * @font: #hb_font_t to work upon
+ * @x_ppem: Horizontal ppem value to assign
+ * @y_ppem: Vertical ppem value to assign
  *
+ * Sets the horizontal and vertical pixels-per-em (ppem) of a font.
  *
  * Since: 0.9.2
  **/
 void
-hb_font_set_ppem (hb_font_t *font,
-                 unsigned int x_ppem,
-                 unsigned int y_ppem)
+hb_font_set_ppem (hb_font_t    *font,
+                 unsigned int  x_ppem,
+                 unsigned int  y_ppem)
 {
   if (hb_object_is_immutable (font))
     return;
@@ -1811,16 +1982,16 @@ hb_font_set_ppem (hb_font_t *font,
 
 /**
  * hb_font_get_ppem:
- * @font: a font.
- * @x_ppem: (out):
- * @y_ppem: (out):
- *
+ * @font: #hb_font_t to work upon
+ * @x_ppem: (out): Horizontal ppem value
+ * @y_ppem: (out): Vertical ppem value
  *
+ * Fetches the horizontal and vertical points-per-em (ppem) of a font.
  *
  * Since: 0.9.2
  **/
 void
-hb_font_get_ppem (hb_font_t *font,
+hb_font_get_ppem (hb_font_t    *font,
                  unsigned int *x_ppem,
                  unsigned int *y_ppem)
 {
@@ -1830,17 +2001,19 @@ hb_font_get_ppem (hb_font_t *font,
 
 /**
  * hb_font_set_ptem:
- * @font: a font.
+ * @font: #hb_font_t to work upon
  * @ptem: font size in points.
  *
- * Sets "point size" of the font.  Set to 0 to unset.
+ * Sets the "point size" of a font. Set to zero to unset.
+ * Used in CoreText to implement optical sizing.
  *
- * There are 72 points in an inch.
+ * <note>Note: There are 72 points in an inch.</note>
  *
  * Since: 1.6.0
  **/
 void
-hb_font_set_ptem (hb_font_t *font, float ptem)
+hb_font_set_ptem (hb_font_t *font,
+                 float      ptem)
 {
   if (hb_object_is_immutable (font))
     return;
@@ -1850,13 +2023,14 @@ hb_font_set_ptem (hb_font_t *font, float ptem)
 
 /**
  * hb_font_get_ptem:
- * @font: a font.
+ * @font: #hb_font_t to work upon
  *
- * Gets the "point size" of the font.  A value of 0 means unset.
+ * Fetches the "point size" of a font. Used in CoreText to
+ * implement optical sizing.
  *
- * Return value: Point size.
+ * Return value: Point size.  A value of zero means "not set."
  *
- * Since: 0.9.2
+ * Since: 1.6.0
  **/
 float
 hb_font_get_ptem (hb_font_t *font)
@@ -1864,6 +2038,49 @@ hb_font_get_ptem (hb_font_t *font)
   return font->ptem;
 }
 
+/**
+ * hb_font_set_synthetic_slant:
+ * @font: #hb_font_t to work upon
+ * @slant: synthetic slant value.
+ *
+ * Sets the "synthetic slant" of a font.  By default is zero.
+ * Synthetic slant is the graphical skew that the renderer
+ * applies to the font at rendering time.
+ *
+ * HarfBuzz needs to know this value to adjust shaping results,
+ * metrics, and style values to match the slanted rendering.
+ *
+ * <note>Note: The slant value is a ratio.  For example, a
+ * 20% slant would be represented as a 0.2 value.</note>
+ *
+ * Since: 3.3.0
+ **/
+HB_EXTERN void
+hb_font_set_synthetic_slant (hb_font_t *font, float slant)
+{
+  if (hb_object_is_immutable (font))
+    return;
+
+  font->slant = slant;
+  font->mults_changed ();
+}
+
+/**
+ * hb_font_get_synthetic_slant:
+ * @font: #hb_font_t to work upon
+ *
+ * Fetches the "synthetic slant" of a font.
+ *
+ * Return value: Synthetic slant.  By default is zero.
+ *
+ * Since: 3.3.0
+ **/
+HB_EXTERN float
+hb_font_get_synthetic_slant (hb_font_t *font)
+{
+  return font->slant;
+}
+
 #ifndef HB_NO_VAR
 /*
  * Variations
@@ -1871,13 +2088,22 @@ hb_font_get_ptem (hb_font_t *font)
 
 /**
  * hb_font_set_variations:
+ * @font: #hb_font_t to work upon
+ * @variations: (array length=variations_length): Array of variation settings to apply
+ * @variations_length: Number of variations to apply
+ *
+ * Applies a list of font-variation settings to a font.
+ *
+ * Note that this overrides all existing variations set on @font.
+ * Axes not included in @variations will be effectively set to their
+ * default values.
  *
  * Since: 1.4.2
  */
 void
-hb_font_set_variations (hb_font_t *font,
+hb_font_set_variations (hb_font_t            *font,
                        const hb_variation_t *variations,
-                       unsigned int variations_length)
+                       unsigned int          variations_length)
 {
   if (hb_object_is_immutable (font))
     return;
@@ -1888,29 +2114,30 @@ hb_font_set_variations (hb_font_t *font,
     return;
   }
 
-  unsigned int coords_length = hb_ot_var_get_axis_count (font->face);
+  const OT::fvar &fvar = *font->face->table.fvar;
+  auto axes = fvar.get_axes ();
+  const unsigned coords_length = axes.length;
 
-  int *normalized = coords_length ? (int *) calloc (coords_length, sizeof (int)) : nullptr;
-  float *design_coords = coords_length ? (float *) calloc (coords_length, sizeof (float)) : nullptr;
+  int *normalized = coords_length ? (int *) hb_calloc (coords_length, sizeof (int)) : nullptr;
+  float *design_coords = coords_length ? (float *) hb_calloc (coords_length, sizeof (float)) : nullptr;
 
   if (unlikely (coords_length && !(normalized && design_coords)))
   {
-    free (normalized);
-    free (design_coords);
+    hb_free (normalized);
+    hb_free (design_coords);
     return;
   }
 
-  const OT::fvar &fvar = *font->face->table.fvar;
   for (unsigned int i = 0; i < variations_length; i++)
   {
-    hb_ot_var_axis_info_t info;
-    if (hb_ot_var_find_axis_info (font->face, variations[i].tag, &info) &&
-       info.axis_index < coords_length)
-    {
-      float v = variations[i].value;
-      design_coords[info.axis_index] = v;
-      normalized[info.axis_index] = fvar.normalize_axis_value (info.axis_index, v);
-    }
+    const auto tag = variations[i].tag;
+    const auto v = variations[i].value;
+    for (unsigned axis_index = 0; axis_index < coords_length; axis_index++)
+      if (axes[axis_index].axisTag == tag)
+      {
+       design_coords[axis_index] = v;
+       normalized[axis_index] = fvar.normalize_axis_value (axis_index, v);
+      }
   }
   font->face->table.avar->map_coords (normalized, coords_length);
 
@@ -1919,24 +2146,34 @@ hb_font_set_variations (hb_font_t *font,
 
 /**
  * hb_font_set_var_coords_design:
+ * @font: #hb_font_t to work upon
+ * @coords: (array length=coords_length): Array of variation coordinates to apply
+ * @coords_length: Number of coordinates to apply
+ *
+ * Applies a list of variation coordinates (in design-space units)
+ * to a font.
+ *
+ * Note that this overrides all existing variations set on @font.
+ * Axes not included in @coords will be effectively set to their
+ * default values.
  *
  * Since: 1.4.2
  */
 void
-hb_font_set_var_coords_design (hb_font_t *font,
-                              const float *coords,
-                              unsigned int coords_length)
+hb_font_set_var_coords_design (hb_font_t    *font,
+                              const float  *coords,
+                              unsigned int  coords_length)
 {
   if (hb_object_is_immutable (font))
     return;
 
-  int *normalized = coords_length ? (int *) calloc (coords_length, sizeof (int)) : nullptr;
-  float *design_coords = coords_length ? (float *) calloc (coords_length, sizeof (float)) : nullptr;
+  int *normalized = coords_length ? (int *) hb_calloc (coords_length, sizeof (int)) : nullptr;
+  float *design_coords = coords_length ? (float *) hb_calloc (coords_length, sizeof (float)) : nullptr;
 
   if (unlikely (coords_length && !(normalized && design_coords)))
   {
-    free (normalized);
-    free (design_coords);
+    hb_free (normalized);
+    hb_free (design_coords);
     return;
   }
 
@@ -1965,37 +2202,49 @@ hb_font_set_var_named_instance (hb_font_t *font,
 
   unsigned int coords_length = hb_ot_var_named_instance_get_design_coords (font->face, instance_index, nullptr, nullptr);
 
-  float *coords = coords_length ? (float *) calloc (coords_length, sizeof (float)) : nullptr;
+  float *coords = coords_length ? (float *) hb_calloc (coords_length, sizeof (float)) : nullptr;
   if (unlikely (coords_length && !coords))
     return;
 
   hb_ot_var_named_instance_get_design_coords (font->face, instance_index, &coords_length, coords);
   hb_font_set_var_coords_design (font, coords, coords_length);
-  free (coords);
+  hb_free (coords);
 }
 
 /**
  * hb_font_set_var_coords_normalized:
+ * @font: #hb_font_t to work upon
+ * @coords: (array length=coords_length): Array of variation coordinates to apply
+ * @coords_length: Number of coordinates to apply
+ *
+ * Applies a list of variation coordinates (in normalized units)
+ * to a font.
+ *
+ * Note that this overrides all existing variations set on @font.
+ * Axes not included in @coords will be effectively set to their
+ * default values.
+ *
+ * <note>Note: Coordinates should be normalized to 2.14.</note>
  *
  * Since: 1.4.2
  */
 void
-hb_font_set_var_coords_normalized (hb_font_t *font,
-                                  const int *coords, /* 2.14 normalized */
-                                  unsigned int coords_length)
+hb_font_set_var_coords_normalized (hb_font_t    *font,
+                                  const int    *coords, /* 2.14 normalized */
+                                  unsigned int  coords_length)
 {
   if (hb_object_is_immutable (font))
     return;
 
-  int *copy = coords_length ? (int *) calloc (coords_length, sizeof (coords[0])) : nullptr;
-  int *unmapped = coords_length ? (int *) calloc (coords_length, sizeof (coords[0])) : nullptr;
-  float *design_coords = coords_length ? (float *) calloc (coords_length, sizeof (design_coords[0])) : nullptr;
+  int *copy = coords_length ? (int *) hb_calloc (coords_length, sizeof (coords[0])) : nullptr;
+  int *unmapped = coords_length ? (int *) hb_calloc (coords_length, sizeof (coords[0])) : nullptr;
+  float *design_coords = coords_length ? (float *) hb_calloc (coords_length, sizeof (design_coords[0])) : nullptr;
 
   if (unlikely (coords_length && !(copy && unmapped && design_coords)))
   {
-    free (copy);
-    free (unmapped);
-    free (design_coords);
+    hb_free (copy);
+    hb_free (unmapped);
+    hb_free (design_coords);
     return;
   }
 
@@ -2009,21 +2258,31 @@ hb_font_set_var_coords_normalized (hb_font_t *font,
   font->face->table.avar->unmap_coords (unmapped, coords_length);
   for (unsigned int i = 0; i < coords_length; ++i)
     design_coords[i] = font->face->table.fvar->unnormalize_axis_value (i, unmapped[i]);
-  free (unmapped);
+  hb_free (unmapped);
 
   _hb_font_adopt_var_coords (font, copy, design_coords, coords_length);
 }
 
 /**
  * hb_font_get_var_coords_normalized:
+ * @font: #hb_font_t to work upon
+ * @length: (out): Number of coordinates retrieved
+ *
+ * Fetches the list of normalized variation coordinates currently
+ * set on a font.
+ *
+ * Note that this returned array may only contain values for some
+ * (or none) of the axes; omitted axes effectively have zero values.
  *
  * Return value is valid as long as variation coordinates of the font
  * are not modified.
  *
+ * Return value: coordinates array
+ *
  * Since: 1.4.2
  */
 const int *
-hb_font_get_var_coords_normalized (hb_font_t *font,
+hb_font_get_var_coords_normalized (hb_font_t    *font,
                                   unsigned int *length)
 {
   if (length)
@@ -2032,14 +2291,24 @@ hb_font_get_var_coords_normalized (hb_font_t *font,
   return font->coords;
 }
 
-#ifdef HB_EXPERIMENTAL_API
 /**
  * hb_font_get_var_coords_design:
+ * @font: #hb_font_t to work upon
+ * @length: (out): Number of coordinates retrieved
+ *
+ * Fetches the list of variation coordinates (in design-space units) currently
+ * set on a font.
+ *
+ * Note that this returned array may only contain values for some
+ * (or none) of the axes; omitted axes effectively have their default
+ * values.
  *
  * Return value is valid as long as variation coordinates of the font
  * are not modified.
  *
- * Since: EXPERIMENTAL
+ * Return value: coordinates array
+ *
+ * Since: 3.3.0
  */
 const float *
 hb_font_get_var_coords_design (hb_font_t *font,
@@ -2051,7 +2320,6 @@ hb_font_get_var_coords_design (hb_font_t *font,
   return font->design_coords;
 }
 #endif
-#endif
 
 #ifndef HB_DISABLE_DEPRECATED
 /*
@@ -2080,7 +2348,7 @@ trampoline_create (FuncType           func,
 {
   typedef hb_trampoline_t<FuncType> trampoline_t;
 
-  trampoline_t *trampoline = (trampoline_t *) calloc (1, sizeof (trampoline_t));
+  trampoline_t *trampoline = (trampoline_t *) hb_calloc (1, sizeof (trampoline_t));
 
   if (unlikely (!trampoline))
     return nullptr;
@@ -2109,29 +2377,29 @@ trampoline_destroy (void *user_data)
 
   if (closure->destroy)
     closure->destroy (closure->user_data);
-  free (closure);
+  hb_free (closure);
 }
 
 typedef hb_trampoline_t<hb_font_get_glyph_func_t> hb_font_get_glyph_trampoline_t;
 
 static hb_bool_t
-hb_font_get_nominal_glyph_trampoline (hb_font_t *font,
-                                     void *font_data,
-                                     hb_codepoint_t unicode,
+hb_font_get_nominal_glyph_trampoline (hb_font_t      *font,
+                                     void           *font_data,
+                                     hb_codepoint_t  unicode,
                                      hb_codepoint_t *glyph,
-                                     void *user_data)
+                                     void           *user_data)
 {
   hb_font_get_glyph_trampoline_t *trampoline = (hb_font_get_glyph_trampoline_t *) user_data;
   return trampoline->func (font, font_data, unicode, 0, glyph, trampoline->closure.user_data);
 }
 
 static hb_bool_t
-hb_font_get_variation_glyph_trampoline (hb_font_t *font,
-                                       void *font_data,
-                                       hb_codepoint_t unicode,
-                                       hb_codepoint_t variation_selector,
+hb_font_get_variation_glyph_trampoline (hb_font_t      *font,
+                                       void           *font_data,
+                                       hb_codepoint_t  unicode,
+                                       hb_codepoint_t  variation_selector,
                                        hb_codepoint_t *glyph,
-                                       void *user_data)
+                                       void           *user_data)
 {
   hb_font_get_glyph_trampoline_t *trampoline = (hb_font_get_glyph_trampoline_t *) user_data;
   return trampoline->func (font, font_data, unicode, variation_selector, glyph, trampoline->closure.user_data);
@@ -2139,10 +2407,10 @@ hb_font_get_variation_glyph_trampoline (hb_font_t *font,
 
 /**
  * hb_font_funcs_set_glyph_func:
- * @ffuncs: font functions.
- * @func: (closure user_data) (destroy destroy) (scope notified): callback function.
- * @user_data: data to pass to @func.
- * @destroy: function to call when @user_data is not needed anymore.
+ * @ffuncs: The font-functions structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): callback function
+ * @user_data: data to pass to @func
+ * @destroy: (nullable): function to call when @user_data is not needed anymore
  *
  * Deprecated.  Use hb_font_funcs_set_nominal_glyph_func() and
  * hb_font_funcs_set_variation_glyph_func() instead.
@@ -2151,9 +2419,10 @@ hb_font_get_variation_glyph_trampoline (hb_font_t *font,
  * Deprecated: 1.2.3
  **/
 void
-hb_font_funcs_set_glyph_func (hb_font_funcs_t *ffuncs,
-                             hb_font_get_glyph_func_t func,
-                             void *user_data, hb_destroy_func_t destroy)
+hb_font_funcs_set_glyph_func (hb_font_funcs_t          *ffuncs,
+                             hb_font_get_glyph_func_t  func,
+                             void                     *user_data,
+                             hb_destroy_func_t         destroy /* May be NULL. */)
 {
   if (hb_object_is_immutable (ffuncs))
   {
index e1a5719..a3bbb2e 100644 (file)
@@ -24,7 +24,7 @@
  * Red Hat Author(s): Behdad Esfahbod
  */
 
-#ifndef HB_H_IN
+#if !defined(HB_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb.h> instead."
 #endif
 
 
 HB_BEGIN_DECLS
 
-
+/**
+ * hb_font_t:
+ *
+ * Data type for holding fonts.
+ *
+ */
 typedef struct hb_font_t hb_font_t;
 
 
@@ -45,6 +50,19 @@ typedef struct hb_font_t hb_font_t;
  * hb_font_funcs_t
  */
 
+/**
+ * hb_font_funcs_t:
+ *
+ * Data type containing a set of virtual methods used for
+ * working on #hb_font_t font objects.
+ *
+ * HarfBuzz provides a lightweight default function for each of 
+ * the methods in #hb_font_funcs_t. Client programs can implement
+ * their own replacements for the individual font functions, as
+ * needed, and replace the default by calling the setter for a
+ * method.
+ *
+ **/
 typedef struct hb_font_funcs_t hb_font_funcs_t;
 
 HB_EXTERN hb_font_funcs_t *
@@ -81,12 +99,21 @@ hb_font_funcs_is_immutable (hb_font_funcs_t *ffuncs);
 
 /* font and glyph extents */
 
-/* Note that typically ascender is positive and descender negative in coordinate systems that grow up. */
-typedef struct hb_font_extents_t
-{
-  hb_position_t ascender; /* typographic ascender. */
-  hb_position_t descender; /* typographic descender. */
-  hb_position_t line_gap; /* suggested line spacing gap. */
+/**
+ * hb_font_extents_t:
+ * @ascender: The height of typographic ascenders.
+ * @descender: The depth of typographic descenders.
+ * @line_gap: The suggested line-spacing gap.
+ *
+ * Font-wide extent values, measured in font units.
+ *
+ * Note that typically @ascender is positive and @descender
+ * negative, in coordinate systems that grow up.
+ **/
+typedef struct hb_font_extents_t {
+  hb_position_t ascender;
+  hb_position_t descender;
+  hb_position_t line_gap;
   /*< private >*/
   hb_position_t reserved9;
   hb_position_t reserved8;
@@ -99,33 +126,130 @@ typedef struct hb_font_extents_t
   hb_position_t reserved1;
 } hb_font_extents_t;
 
-/* Note that height is negative in coordinate systems that grow up. */
-typedef struct hb_glyph_extents_t
-{
-  hb_position_t x_bearing; /* left side of glyph from origin. */
-  hb_position_t y_bearing; /* top side of glyph from origin. */
-  hb_position_t width; /* distance from left to right side. */
-  hb_position_t height; /* distance from top to bottom side. */
+/**
+ * hb_glyph_extents_t:
+ * @x_bearing: Distance from the x-origin to the left extremum of the glyph.
+ * @y_bearing: Distance from the top extremum of the glyph to the y-origin.
+ * @width: Distance from the left extremum of the glyph to the right extremum.
+ * @height: Distance from the top extremum of the glyph to the bottom extremum.
+ *
+ * Glyph extent values, measured in font units.
+ *
+ * Note that @height is negative, in coordinate systems that grow up.
+ **/
+typedef struct hb_glyph_extents_t {
+  hb_position_t x_bearing;
+  hb_position_t y_bearing;
+  hb_position_t width;
+  hb_position_t height;
 } hb_glyph_extents_t;
 
 /* func types */
 
+/**
+ * hb_font_get_font_extents_func_t:
+ * @font: #hb_font_t to work upon
+ * @font_data: @font user data pointer
+ * @extents: (out): The font extents retrieved
+ * @user_data: User data pointer passed by the caller
+ *
+ * This method should retrieve the extents for a font.
+ *
+ **/
 typedef hb_bool_t (*hb_font_get_font_extents_func_t) (hb_font_t *font, void *font_data,
                                                       hb_font_extents_t *extents,
                                                       void *user_data);
+
+/**
+ * hb_font_get_font_h_extents_func_t:
+ *
+ * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
+ *
+ * This method should retrieve the extents for a font, for horizontal-direction
+ * text segments. Extents must be returned in an #hb_glyph_extents output
+ * parameter.
+ * 
+ **/
 typedef hb_font_get_font_extents_func_t hb_font_get_font_h_extents_func_t;
+
+/**
+ * hb_font_get_font_v_extents_func_t:
+ *
+ * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
+ *
+ * This method should retrieve the extents for a font, for vertical-direction
+ * text segments. Extents must be returned in an #hb_glyph_extents output
+ * parameter.
+ * 
+ **/
 typedef hb_font_get_font_extents_func_t hb_font_get_font_v_extents_func_t;
 
 
+/**
+ * hb_font_get_nominal_glyph_func_t:
+ * @font: #hb_font_t to work upon
+ * @font_data: @font user data pointer
+ * @unicode: The Unicode code point to query
+ * @glyph: (out): The glyph ID retrieved
+ * @user_data: User data pointer passed by the caller
+ *
+ * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
+ *
+ * This method should retrieve the nominal glyph ID for a specified Unicode code
+ * point. Glyph IDs must be returned in a #hb_codepoint_t output parameter.
+ * 
+ * Return value: %true if data found, %false otherwise
+ *
+ **/
 typedef hb_bool_t (*hb_font_get_nominal_glyph_func_t) (hb_font_t *font, void *font_data,
                                                       hb_codepoint_t unicode,
                                                       hb_codepoint_t *glyph,
                                                       void *user_data);
+
+/**
+ * hb_font_get_variation_glyph_func_t:
+ * @font: #hb_font_t to work upon
+ * @font_data: @font user data pointer
+ * @unicode: The Unicode code point to query
+ * @variation_selector: The  variation-selector code point to query
+ * @glyph: (out): The glyph ID retrieved
+ * @user_data: User data pointer passed by the caller
+ *
+ * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
+ *
+ * This method should retrieve the glyph ID for a specified Unicode code point
+ * followed by a specified Variation Selector code point. Glyph IDs must be
+ * returned in a #hb_codepoint_t output parameter.
+ * 
+ * Return value: %true if data found, %false otherwise
+ *
+ **/
 typedef hb_bool_t (*hb_font_get_variation_glyph_func_t) (hb_font_t *font, void *font_data,
                                                         hb_codepoint_t unicode, hb_codepoint_t variation_selector,
                                                         hb_codepoint_t *glyph,
                                                         void *user_data);
 
+
+/**
+ * hb_font_get_nominal_glyphs_func_t:
+ * @font: #hb_font_t to work upon
+ * @font_data: @font user data pointer
+ * @count: number of code points to query
+ * @first_unicode: The first Unicode code point to query
+ * @unicode_stride: The stride between successive code points
+ * @first_glyph: (out): The first glyph ID retrieved
+ * @glyph_stride: The stride between successive glyph IDs
+ * @user_data: User data pointer passed by the caller
+ *
+ * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
+ *
+ * This method should retrieve the nominal glyph IDs for a sequence of
+ * Unicode code points. Glyph IDs must be returned in a #hb_codepoint_t
+ * output parameter.
+ *
+ * Return value: the number of code points processed
+ * 
+ **/
 typedef unsigned int (*hb_font_get_nominal_glyphs_func_t) (hb_font_t *font, void *font_data,
                                                           unsigned int count,
                                                           const hb_codepoint_t *first_unicode,
@@ -134,13 +258,65 @@ typedef unsigned int (*hb_font_get_nominal_glyphs_func_t) (hb_font_t *font, void
                                                           unsigned int glyph_stride,
                                                           void *user_data);
 
-
+/**
+ * hb_font_get_glyph_advance_func_t:
+ * @font: #hb_font_t to work upon
+ * @font_data: @font user data pointer
+ * @glyph: The glyph ID to query
+ * @user_data: User data pointer passed by the caller
+ *
+ * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
+ *
+ * This method should retrieve the advance for a specified glyph. The
+ * method must return an #hb_position_t.
+ * 
+ * Return value: The advance of @glyph within @font
+ *
+ **/
 typedef hb_position_t (*hb_font_get_glyph_advance_func_t) (hb_font_t *font, void *font_data,
                                                           hb_codepoint_t glyph,
                                                           void *user_data);
+
+/**
+ * hb_font_get_glyph_h_advance_func_t:
+ *
+ * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
+ *
+ * This method should retrieve the advance for a specified glyph, in
+ * horizontal-direction text segments. Advances must be returned in
+ * an #hb_position_t output parameter.
+ * 
+ **/
 typedef hb_font_get_glyph_advance_func_t hb_font_get_glyph_h_advance_func_t;
+
+/**
+ * hb_font_get_glyph_v_advance_func_t:
+ *
+ * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
+ *
+ * This method should retrieve the advance for a specified glyph, in
+ * vertical-direction text segments. Advances must be returned in
+ * an #hb_position_t output parameter.
+ * 
+ **/
 typedef hb_font_get_glyph_advance_func_t hb_font_get_glyph_v_advance_func_t;
 
+/**
+ * hb_font_get_glyph_advances_func_t:
+ * @font: #hb_font_t to work upon
+ * @font_data: @font user data pointer
+ * @count: The number of glyph IDs in the sequence queried
+ * @first_glyph: The first glyph ID to query
+ * @glyph_stride: The stride between successive glyph IDs
+ * @first_advance: (out): The first advance retrieved
+ * @advance_stride: The stride between successive advances
+ * @user_data: User data pointer passed by the caller
+ *
+ * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
+ *
+ * This method should retrieve the advances for a sequence of glyphs.
+ * 
+ **/
 typedef void (*hb_font_get_glyph_advances_func_t) (hb_font_t* font, void* font_data,
                                                   unsigned int count,
                                                   const hb_codepoint_t *first_glyph,
@@ -148,36 +324,188 @@ typedef void (*hb_font_get_glyph_advances_func_t) (hb_font_t* font, void* font_d
                                                   hb_position_t *first_advance,
                                                   unsigned advance_stride,
                                                   void *user_data);
+
+/**
+ * hb_font_get_glyph_h_advances_func_t:
+ *
+ * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
+ *
+ * This method should retrieve the advances for a sequence of glyphs, in
+ * horizontal-direction text segments.
+ * 
+ **/
 typedef hb_font_get_glyph_advances_func_t hb_font_get_glyph_h_advances_func_t;
+
+/**
+ * hb_font_get_glyph_v_advances_func_t:
+ *
+ * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
+ *
+ * This method should retrieve the advances for a sequence of glyphs, in
+ * vertical-direction text segments.
+ * 
+ **/
 typedef hb_font_get_glyph_advances_func_t hb_font_get_glyph_v_advances_func_t;
 
+/**
+ * hb_font_get_glyph_origin_func_t:
+ * @font: #hb_font_t to work upon
+ * @font_data: @font user data pointer
+ * @glyph: The glyph ID to query
+ * @x: (out): The X coordinate of the origin
+ * @y: (out): The Y coordinate of the origin
+ * @user_data: User data pointer passed by the caller
+ *
+ * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
+ *
+ * This method should retrieve the (X,Y) coordinates (in font units) of the
+ * origin for a glyph. Each coordinate must be returned in an #hb_position_t
+ * output parameter.
+ *
+ * Return value: %true if data found, %false otherwise
+ * 
+ **/
 typedef hb_bool_t (*hb_font_get_glyph_origin_func_t) (hb_font_t *font, void *font_data,
                                                      hb_codepoint_t glyph,
                                                      hb_position_t *x, hb_position_t *y,
                                                      void *user_data);
+
+/**
+ * hb_font_get_glyph_h_origin_func_t:
+ *
+ * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
+ *
+ * This method should retrieve the (X,Y) coordinates (in font units) of the
+ * origin for a glyph, for horizontal-direction text segments. Each
+ * coordinate must be returned in an #hb_position_t output parameter.
+ * 
+ **/
 typedef hb_font_get_glyph_origin_func_t hb_font_get_glyph_h_origin_func_t;
+
+/**
+ * hb_font_get_glyph_v_origin_func_t:
+ *
+ * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
+ *
+ * This method should retrieve the (X,Y) coordinates (in font units) of the
+ * origin for a glyph, for vertical-direction text segments. Each coordinate
+ * must be returned in an #hb_position_t output parameter.
+ * 
+ **/
 typedef hb_font_get_glyph_origin_func_t hb_font_get_glyph_v_origin_func_t;
 
+/**
+ * hb_font_get_glyph_kerning_func_t:
+ * @font: #hb_font_t to work upon
+ * @font_data: @font user data pointer
+ * @first_glyph: The glyph ID of the first glyph in the glyph pair
+ * @second_glyph: The glyph ID of the second glyph in the glyph pair
+ * @user_data: User data pointer passed by the caller
+ *
+ * This method should retrieve the kerning-adjustment value for a glyph-pair in
+ * the specified font, for horizontal text segments.
+ *
+ **/
 typedef hb_position_t (*hb_font_get_glyph_kerning_func_t) (hb_font_t *font, void *font_data,
                                                           hb_codepoint_t first_glyph, hb_codepoint_t second_glyph,
                                                           void *user_data);
+/**
+ * hb_font_get_glyph_h_kerning_func_t:
+ *
+ * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
+ *
+ * This method should retrieve the kerning-adjustment value for a glyph-pair in
+ * the specified font, for horizontal text segments.
+ *
+ **/
 typedef hb_font_get_glyph_kerning_func_t hb_font_get_glyph_h_kerning_func_t;
 
 
+/**
+ * hb_font_get_glyph_extents_func_t:
+ * @font: #hb_font_t to work upon
+ * @font_data: @font user data pointer
+ * @glyph: The glyph ID to query
+ * @extents: (out): The #hb_glyph_extents_t retrieved
+ * @user_data: User data pointer passed by the caller
+ *
+ * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
+ *
+ * This method should retrieve the extents for a specified glyph. Extents must be 
+ * returned in an #hb_glyph_extents output parameter.
+ *
+ * Return value: %true if data found, %false otherwise
+ * 
+ **/
 typedef hb_bool_t (*hb_font_get_glyph_extents_func_t) (hb_font_t *font, void *font_data,
                                                       hb_codepoint_t glyph,
                                                       hb_glyph_extents_t *extents,
                                                       void *user_data);
+
+/**
+ * hb_font_get_glyph_contour_point_func_t:
+ * @font: #hb_font_t to work upon
+ * @font_data: @font user data pointer
+ * @glyph: The glyph ID to query
+ * @point_index: The contour-point index to query
+ * @x: (out): The X value retrieved for the contour point
+ * @y: (out): The Y value retrieved for the contour point
+ * @user_data: User data pointer passed by the caller
+ *
+ * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
+ *
+ * This method should retrieve the (X,Y) coordinates (in font units) for a
+ * specified contour point in a glyph. Each coordinate must be returned as
+ * an #hb_position_t output parameter.
+ * 
+ * Return value: %true if data found, %false otherwise
+ *
+ **/
 typedef hb_bool_t (*hb_font_get_glyph_contour_point_func_t) (hb_font_t *font, void *font_data,
                                                             hb_codepoint_t glyph, unsigned int point_index,
                                                             hb_position_t *x, hb_position_t *y,
                                                             void *user_data);
 
 
+/**
+ * hb_font_get_glyph_name_func_t:
+ * @font: #hb_font_t to work upon
+ * @font_data: @font user data pointer
+ * @glyph: The glyph ID to query
+ * @name: (out) (array length=size): Name string retrieved for the glyph ID
+ * @size: Length of the glyph-name string retrieved
+ * @user_data: User data pointer passed by the caller
+ *
+ * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
+ *
+ * This method should retrieve the glyph name that corresponds to a
+ * glyph ID. The name should be returned in a string output parameter.
+ * 
+ * Return value: %true if data found, %false otherwise
+ *
+ **/
 typedef hb_bool_t (*hb_font_get_glyph_name_func_t) (hb_font_t *font, void *font_data,
                                                    hb_codepoint_t glyph,
                                                    char *name, unsigned int size,
                                                    void *user_data);
+
+/**
+ * hb_font_get_glyph_from_name_func_t:
+ * @font: #hb_font_t to work upon
+ * @font_data: @font user data pointer
+ * @name: (array length=len): The name string to query
+ * @len: The length of the name queried
+ * @glyph: (out): The glyph ID retrieved
+ * @user_data: User data pointer passed by the caller
+ *
+ * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
+ *
+ * This method should retrieve the glyph ID that corresponds to a glyph-name
+ * string. 
+ * 
+ * Return value: %true if data found, %false otherwise
+ *
+ **/
 typedef hb_bool_t (*hb_font_get_glyph_from_name_func_t) (hb_font_t *font, void *font_data,
                                                         const char *name, int len, /* -1 means nul-terminated */
                                                         hb_codepoint_t *glyph,
@@ -188,12 +516,12 @@ typedef hb_bool_t (*hb_font_get_glyph_from_name_func_t) (hb_font_t *font, void *
 
 /**
  * hb_font_funcs_set_font_h_extents_func:
- * @ffuncs: font functions.
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
- *
+ * @ffuncs: A font-function structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
+ * @user_data: Data to pass to @func
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
  *
+ * Sets the implementation function for #hb_font_get_font_h_extents_func_t.
  *
  * Since: 1.1.2
  **/
@@ -204,12 +532,12 @@ hb_font_funcs_set_font_h_extents_func (hb_font_funcs_t *ffuncs,
 
 /**
  * hb_font_funcs_set_font_v_extents_func:
- * @ffuncs: font functions.
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
- *
+ * @ffuncs: A font-function structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
+ * @user_data: Data to pass to @func
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
  *
+ * Sets the implementation function for #hb_font_get_font_v_extents_func_t.
  *
  * Since: 1.1.2
  **/
@@ -220,12 +548,12 @@ hb_font_funcs_set_font_v_extents_func (hb_font_funcs_t *ffuncs,
 
 /**
  * hb_font_funcs_set_nominal_glyph_func:
- * @ffuncs: font functions.
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
- *
+ * @ffuncs: A font-function structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
+ * @user_data: Data to pass to @func
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
  *
+ * Sets the implementation function for #hb_font_get_nominal_glyph_func_t.
  *
  * Since: 1.2.3
  **/
@@ -236,12 +564,12 @@ hb_font_funcs_set_nominal_glyph_func (hb_font_funcs_t *ffuncs,
 
 /**
  * hb_font_funcs_set_nominal_glyphs_func:
- * @ffuncs: font functions.
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
- *
+ * @ffuncs: A font-function structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
+ * @user_data: Data to pass to @func
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
  *
+ * Sets the implementation function for #hb_font_get_nominal_glyphs_func_t.
  *
  * Since: 2.0.0
  **/
@@ -252,12 +580,12 @@ hb_font_funcs_set_nominal_glyphs_func (hb_font_funcs_t *ffuncs,
 
 /**
  * hb_font_funcs_set_variation_glyph_func:
- * @ffuncs: font functions.
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
- *
+ * @ffuncs: A font-function structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
+ * @user_data: Data to pass to @func
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
  *
+ * Sets the implementation function for #hb_font_get_variation_glyph_func_t.
  *
  * Since: 1.2.3
  **/
@@ -268,12 +596,12 @@ hb_font_funcs_set_variation_glyph_func (hb_font_funcs_t *ffuncs,
 
 /**
  * hb_font_funcs_set_glyph_h_advance_func:
- * @ffuncs: font functions.
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
- *
+ * @ffuncs: A font-function structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
+ * @user_data: Data to pass to @func
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
  *
+ * Sets the implementation function for #hb_font_get_glyph_h_advance_func_t.
  *
  * Since: 0.9.2
  **/
@@ -284,12 +612,12 @@ hb_font_funcs_set_glyph_h_advance_func (hb_font_funcs_t *ffuncs,
 
 /**
  * hb_font_funcs_set_glyph_v_advance_func:
- * @ffuncs: font functions.
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
- *
+ * @ffuncs: A font-function structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
+ * @user_data: Data to pass to @func
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
  *
+ * Sets the implementation function for #hb_font_get_glyph_v_advance_func_t.
  *
  * Since: 0.9.2
  **/
@@ -300,12 +628,12 @@ hb_font_funcs_set_glyph_v_advance_func (hb_font_funcs_t *ffuncs,
 
 /**
  * hb_font_funcs_set_glyph_h_advances_func:
- * @ffuncs: font functions.
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
- *
+ * @ffuncs: A font-function structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
+ * @user_data: Data to pass to @func
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
  *
+ * Sets the implementation function for #hb_font_get_glyph_h_advances_func_t.
  *
  * Since: 1.8.6
  **/
@@ -316,12 +644,12 @@ hb_font_funcs_set_glyph_h_advances_func (hb_font_funcs_t *ffuncs,
 
 /**
  * hb_font_funcs_set_glyph_v_advances_func:
- * @ffuncs: font functions.
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
- *
+ * @ffuncs: A font-function structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
+ * @user_data: Data to pass to @func
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
  *
+ * Sets the implementation function for #hb_font_get_glyph_v_advances_func_t.
  *
  * Since: 1.8.6
  **/
@@ -332,12 +660,12 @@ hb_font_funcs_set_glyph_v_advances_func (hb_font_funcs_t *ffuncs,
 
 /**
  * hb_font_funcs_set_glyph_h_origin_func:
- * @ffuncs: font functions.
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
- *
+ * @ffuncs: A font-function structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
+ * @user_data: Data to pass to @func
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
  *
+ * Sets the implementation function for #hb_font_get_glyph_h_origin_func_t.
  *
  * Since: 0.9.2
  **/
@@ -348,12 +676,12 @@ hb_font_funcs_set_glyph_h_origin_func (hb_font_funcs_t *ffuncs,
 
 /**
  * hb_font_funcs_set_glyph_v_origin_func:
- * @ffuncs: font functions.
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
- *
+ * @ffuncs: A font-function structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
+ * @user_data: Data to pass to @func
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
  *
+ * Sets the implementation function for #hb_font_get_glyph_v_origin_func_t.
  *
  * Since: 0.9.2
  **/
@@ -364,12 +692,12 @@ hb_font_funcs_set_glyph_v_origin_func (hb_font_funcs_t *ffuncs,
 
 /**
  * hb_font_funcs_set_glyph_h_kerning_func:
- * @ffuncs: font functions.
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
- *
+ * @ffuncs: A font-function structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
+ * @user_data: Data to pass to @func
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
  *
+ * Sets the implementation function for #hb_font_get_glyph_h_kerning_func_t.
  *
  * Since: 0.9.2
  **/
@@ -380,12 +708,12 @@ hb_font_funcs_set_glyph_h_kerning_func (hb_font_funcs_t *ffuncs,
 
 /**
  * hb_font_funcs_set_glyph_extents_func:
- * @ffuncs: font functions.
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
- *
+ * @ffuncs: A font-function structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
+ * @user_data: Data to pass to @func
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
  *
+ * Sets the implementation function for #hb_font_get_glyph_extents_func_t.
  *
  * Since: 0.9.2
  **/
@@ -396,12 +724,12 @@ hb_font_funcs_set_glyph_extents_func (hb_font_funcs_t *ffuncs,
 
 /**
  * hb_font_funcs_set_glyph_contour_point_func:
- * @ffuncs: font functions.
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
- *
+ * @ffuncs: A font-function structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
+ * @user_data: Data to pass to @func
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
  *
+ * Sets the implementation function for #hb_font_get_glyph_contour_point_func_t.
  *
  * Since: 0.9.2
  **/
@@ -412,12 +740,12 @@ hb_font_funcs_set_glyph_contour_point_func (hb_font_funcs_t *ffuncs,
 
 /**
  * hb_font_funcs_set_glyph_name_func:
- * @ffuncs: font functions.
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
- *
+ * @ffuncs: A font-function structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
+ * @user_data: Data to pass to @func
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
  *
+ * Sets the implementation function for #hb_font_get_glyph_name_func_t.
  *
  * Since: 0.9.2
  **/
@@ -428,12 +756,12 @@ hb_font_funcs_set_glyph_name_func (hb_font_funcs_t *ffuncs,
 
 /**
  * hb_font_funcs_set_glyph_from_name_func:
- * @ffuncs: font functions.
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
- *
+ * @ffuncs: A font-function structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
+ * @user_data: Data to pass to @func
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
  *
+ * Sets the implementation function for #hb_font_get_glyph_from_name_func_t.
  *
  * Since: 0.9.2
  **/
@@ -696,6 +1024,12 @@ HB_EXTERN float
 hb_font_get_ptem (hb_font_t *font);
 
 HB_EXTERN void
+hb_font_set_synthetic_slant (hb_font_t *font, float slant);
+
+HB_EXTERN float
+hb_font_get_synthetic_slant (hb_font_t *font);
+
+HB_EXTERN void
 hb_font_set_variations (hb_font_t *font,
                        const hb_variation_t *variations,
                        unsigned int variations_length);
@@ -705,11 +1039,9 @@ hb_font_set_var_coords_design (hb_font_t *font,
                               const float *coords,
                               unsigned int coords_length);
 
-#ifdef HB_EXPERIMENTAL_API
 HB_EXTERN const float *
 hb_font_get_var_coords_design (hb_font_t *font,
                               unsigned int *length);
-#endif
 
 HB_EXTERN void
 hb_font_set_var_coords_normalized (hb_font_t *font,
index 12982fc..0d73589 100644 (file)
@@ -109,6 +109,8 @@ struct hb_font_t
 
   int32_t x_scale;
   int32_t y_scale;
+  float slant;
+  float slant_xy;
   int64_t x_mult;
   int64_t y_mult;
 
@@ -217,9 +219,10 @@ struct hb_font_t
   }
 
   hb_bool_t get_nominal_glyph (hb_codepoint_t unicode,
-                              hb_codepoint_t *glyph)
+                              hb_codepoint_t *glyph,
+                              hb_codepoint_t not_found = 0)
   {
-    *glyph = 0;
+    *glyph = not_found;
     return klass->get.f.nominal_glyph (this, user_data,
                                       unicode, glyph,
                                       klass->user_data.nominal_glyph);
@@ -238,9 +241,10 @@ struct hb_font_t
   }
 
   hb_bool_t get_variation_glyph (hb_codepoint_t unicode, hb_codepoint_t variation_selector,
-                                hb_codepoint_t *glyph)
+                                hb_codepoint_t *glyph,
+                                hb_codepoint_t not_found = 0)
   {
-    *glyph = 0;
+    *glyph = not_found;
     return klass->get.f.variation_glyph (this, user_data,
                                         unicode, variation_selector, glyph,
                                         klass->user_data.variation_glyph);
@@ -339,7 +343,7 @@ struct hb_font_t
   }
 
   hb_bool_t get_glyph_contour_point (hb_codepoint_t glyph, unsigned int point_index,
-                                           hb_position_t *x, hb_position_t *y)
+                                    hb_position_t *x, hb_position_t *y)
   {
     *x = *y = 0;
     return klass->get.f.glyph_contour_point (this, user_data,
@@ -615,12 +619,11 @@ struct hb_font_t
     signed upem = face->get_upem ();
     x_mult = ((int64_t) x_scale << 16) / upem;
     y_mult = ((int64_t) y_scale << 16) / upem;
+    slant_xy = y_scale ? slant * x_scale / y_scale : 0.f;
   }
 
   hb_position_t em_mult (int16_t v, int64_t mult)
-  {
-    return (hb_position_t) ((v * mult) >> 16);
-  }
+  { return (hb_position_t) ((v * mult + 32768) >> 16); }
   hb_position_t em_scalef (float v, int scale)
   { return (hb_position_t) roundf (v * scale / face->get_upem ()); }
   float em_fscale (int16_t v, int scale)
index b18b990..67691e3 100644 (file)
@@ -84,17 +84,15 @@ struct hb_ft_font_t
   bool symbol; /* Whether selected cmap is symbol cmap. */
   bool unref; /* Whether to destroy ft_face when done. */
 
-  mutable hb_atomic_int_t cached_x_scale;
+  mutable int cached_x_scale;
   mutable hb_advance_cache_t advance_cache;
 };
 
 static hb_ft_font_t *
 _hb_ft_font_create (FT_Face ft_face, bool symbol, bool unref)
 {
-  hb_ft_font_t *ft_font = (hb_ft_font_t *) calloc (1, sizeof (hb_ft_font_t));
-
-  if (unlikely (!ft_font))
-    return nullptr;
+  hb_ft_font_t *ft_font = (hb_ft_font_t *) hb_calloc (1, sizeof (hb_ft_font_t));
+  if (unlikely (!ft_font)) return nullptr;
 
   ft_font->lock.init ();
   ft_font->ft_face = ft_face;
@@ -103,7 +101,7 @@ _hb_ft_font_create (FT_Face ft_face, bool symbol, bool unref)
 
   ft_font->load_flags = FT_LOAD_DEFAULT | FT_LOAD_NO_HINTING;
 
-  ft_font->cached_x_scale.set_relaxed (0);
+  ft_font->cached_x_scale = 0;
   ft_font->advance_cache.init ();
 
   return ft_font;
@@ -127,7 +125,7 @@ _hb_ft_font_destroy (void *data)
 
   ft_font->lock.fini ();
 
-  free (ft_font);
+  hb_free (ft_font);
 }
 
 /**
@@ -181,13 +179,13 @@ hb_ft_font_get_load_flags (hb_font_t *font)
 }
 
 /**
- * hb_ft_get_face:
+ * hb_ft_font_get_face:
  * @font: #hb_font_t to work upon
  *
  * Fetches the FT_Face associated with the specified #hb_font_t
  * font object.
  *
- * Return value: the FT_Face found
+ * Return value: (nullable): the FT_Face found or %NULL
  *
  * Since: 0.9.2
  **/
@@ -204,11 +202,12 @@ hb_ft_font_get_face (hb_font_t *font)
 
 /**
  * hb_ft_font_lock_face:
- * @font:
- *
+ * @font: #hb_font_t to work upon
  *
+ * Gets the FT_Face associated with @font, This face will be kept around until
+ * you call hb_ft_font_unlock_face().
  *
- * Return value:
+ * Return value: (nullable): the FT_Face associated with @font or %NULL
  * Since: 2.6.5
  **/
 FT_Face
@@ -226,11 +225,10 @@ hb_ft_font_lock_face (hb_font_t *font)
 
 /**
  * hb_ft_font_unlock_face:
- * @font:
- *
+ * @font: #hb_font_t to work upon
  *
+ * Releases an FT_Face previously obtained with hb_ft_font_lock_face().
  *
- * Return value:
  * Since: 2.6.5
  **/
 void
@@ -337,10 +335,10 @@ hb_ft_get_glyph_h_advances (hb_font_t* font, void* font_data,
   int load_flags = ft_font->load_flags;
   int mult = font->x_scale < 0 ? -1 : +1;
 
-  if (font->x_scale != ft_font->cached_x_scale.get ())
+  if (font->x_scale != ft_font->cached_x_scale)
   {
     ft_font->advance_cache.clear ();
-    ft_font->cached_x_scale.set (font->x_scale);
+    ft_font->cached_x_scale = font->x_scale;
   }
 
   for (unsigned int i = 0; i < count; i++)
@@ -363,6 +361,7 @@ hb_ft_get_glyph_h_advances (hb_font_t* font, void* font_data,
   }
 }
 
+#ifndef HB_NO_VERTICAL
 static hb_position_t
 hb_ft_get_glyph_v_advance (hb_font_t *font,
                           void *font_data,
@@ -383,7 +382,9 @@ hb_ft_get_glyph_v_advance (hb_font_t *font,
    * have a Y growing upward.  Hence the extra negation. */
   return (-v + (1<<9)) >> 10;
 }
+#endif
 
+#ifndef HB_NO_VERTICAL
 static hb_bool_t
 hb_ft_get_glyph_v_origin (hb_font_t *font,
                          void *font_data,
@@ -411,6 +412,7 @@ hb_ft_get_glyph_v_origin (hb_font_t *font,
 
   return true;
 }
+#endif
 
 #ifndef HB_NO_OT_SHAPE_FALLBACK
 static hb_position_t
@@ -563,9 +565,7 @@ hb_ft_get_font_h_extents (hb_font_t *font HB_UNUSED,
   return true;
 }
 
-#if HB_USE_ATEXIT
-static void free_static_ft_funcs ();
-#endif
+static inline void free_static_ft_funcs ();
 
 static struct hb_ft_font_funcs_lazy_loader_t : hb_font_funcs_lazy_loader_t<hb_ft_font_funcs_lazy_loader_t>
 {
@@ -573,15 +573,20 @@ static struct hb_ft_font_funcs_lazy_loader_t : hb_font_funcs_lazy_loader_t<hb_ft
   {
     hb_font_funcs_t *funcs = hb_font_funcs_create ();
 
-    hb_font_funcs_set_font_h_extents_func (funcs, hb_ft_get_font_h_extents, nullptr, nullptr);
-    //hb_font_funcs_set_font_v_extents_func (funcs, hb_ft_get_font_v_extents, nullptr, nullptr);
     hb_font_funcs_set_nominal_glyph_func (funcs, hb_ft_get_nominal_glyph, nullptr, nullptr);
     hb_font_funcs_set_nominal_glyphs_func (funcs, hb_ft_get_nominal_glyphs, nullptr, nullptr);
     hb_font_funcs_set_variation_glyph_func (funcs, hb_ft_get_variation_glyph, nullptr, nullptr);
+
+    hb_font_funcs_set_font_h_extents_func (funcs, hb_ft_get_font_h_extents, nullptr, nullptr);
     hb_font_funcs_set_glyph_h_advances_func (funcs, hb_ft_get_glyph_h_advances, nullptr, nullptr);
-    hb_font_funcs_set_glyph_v_advance_func (funcs, hb_ft_get_glyph_v_advance, nullptr, nullptr);
     //hb_font_funcs_set_glyph_h_origin_func (funcs, hb_ft_get_glyph_h_origin, nullptr, nullptr);
+
+#ifndef HB_NO_VERTICAL
+    //hb_font_funcs_set_font_v_extents_func (funcs, hb_ft_get_font_v_extents, nullptr, nullptr);
+    hb_font_funcs_set_glyph_v_advance_func (funcs, hb_ft_get_glyph_v_advance, nullptr, nullptr);
     hb_font_funcs_set_glyph_v_origin_func (funcs, hb_ft_get_glyph_v_origin, nullptr, nullptr);
+#endif
+
 #ifndef HB_NO_OT_SHAPE_FALLBACK
     hb_font_funcs_set_glyph_h_kerning_func (funcs, hb_ft_get_glyph_h_kerning, nullptr, nullptr);
 #endif
@@ -593,21 +598,17 @@ static struct hb_ft_font_funcs_lazy_loader_t : hb_font_funcs_lazy_loader_t<hb_ft
 
     hb_font_funcs_make_immutable (funcs);
 
-#if HB_USE_ATEXIT
-    atexit (free_static_ft_funcs);
-#endif
+    hb_atexit (free_static_ft_funcs);
 
     return funcs;
   }
 } static_ft_funcs;
 
-#if HB_USE_ATEXIT
-static
+static inline
 void free_static_ft_funcs ()
 {
   static_ft_funcs.free_instance ();
 }
-#endif
 
 static hb_font_funcs_t *
 _hb_ft_get_font_funcs ()
@@ -620,9 +621,12 @@ _hb_ft_font_set_funcs (hb_font_t *font, FT_Face ft_face, bool unref)
 {
   bool symbol = ft_face->charmap && ft_face->charmap->encoding == FT_ENCODING_MS_SYMBOL;
 
+  hb_ft_font_t *ft_font = _hb_ft_font_create (ft_face, symbol, unref);
+  if (unlikely (!ft_font)) return;
+
   hb_font_set_funcs (font,
                     _hb_ft_get_font_funcs (),
-                    _hb_ft_font_create (ft_face, symbol, unref),
+                    ft_font,
                     _hb_ft_font_destroy);
 }
 
@@ -641,26 +645,26 @@ _hb_ft_reference_table (hb_face_t *face HB_UNUSED, hb_tag_t tag, void *user_data
   if (error)
     return nullptr;
 
-  buffer = (FT_Byte *) malloc (length);
+  buffer = (FT_Byte *) hb_malloc (length);
   if (!buffer)
     return nullptr;
 
   error = FT_Load_Sfnt_Table (ft_face, tag, 0, buffer, &length);
   if (error)
   {
-    free (buffer);
+    hb_free (buffer);
     return nullptr;
   }
 
   return hb_blob_create ((const char *) buffer, length,
                         HB_MEMORY_MODE_WRITABLE,
-                        buffer, free);
+                        buffer, hb_free);
 }
 
 /**
  * hb_ft_face_create:
  * @ft_face: (destroy destroy) (scope notified): FT_Face to work upon
- * @destroy: A callback to call when the face object is not needed anymore
+ * @destroy: (nullable): A callback to call when the face object is not needed anymore
  *
  * Creates an #hb_face_t face object from the specified FT_Face.
  *
@@ -770,13 +774,13 @@ hb_ft_face_create_cached (FT_Face ft_face)
 /**
  * hb_ft_font_create:
  * @ft_face: (destroy destroy) (scope notified): FT_Face to work upon
- * @destroy: (optional): A callback to call when the font object is not needed anymore
+ * @destroy: (nullable): A callback to call when the font object is not needed anymore
  *
  * Creates an #hb_font_t font object from the specified FT_Face.
  *
  * <note>Note: You must set the face size on @ft_face before calling
- * hb_ft_font_create() on it. Otherwise, HarfBuzz will not pick up
- * the face size.</note>
+ * hb_ft_font_create() on it. HarfBuzz assumes size is always set and will
+ * access `size` member of FT_Face unconditionally.</note>
  *
  * This variant of the function does not provide any life-cycle management.
  *
@@ -813,7 +817,7 @@ hb_ft_font_create (FT_Face           ft_face,
 }
 
 /**
- * hb_ft_font_has_changed:
+ * hb_ft_font_changed:
  * @font: #hb_font_t to work upon
  *
  * Refreshes the state of @font when the underlying FT_Face has changed.
@@ -829,6 +833,7 @@ hb_ft_font_changed (hb_font_t *font)
     return;
 
   hb_ft_font_t *ft_font = (hb_ft_font_t *) font->user_data;
+
   FT_Face ft_face = ft_font->ft_face;
 
   hb_font_set_scale (font,
@@ -844,8 +849,8 @@ hb_ft_font_changed (hb_font_t *font)
   FT_MM_Var *mm_var = nullptr;
   if (!FT_Get_MM_Var (ft_face, &mm_var))
   {
-    FT_Fixed *ft_coords = (FT_Fixed *) calloc (mm_var->num_axis, sizeof (FT_Fixed));
-    int *coords = (int *) calloc (mm_var->num_axis, sizeof (int));
+    FT_Fixed *ft_coords = (FT_Fixed *) hb_calloc (mm_var->num_axis, sizeof (FT_Fixed));
+    int *coords = (int *) hb_calloc (mm_var->num_axis, sizeof (int));
     if (coords && ft_coords)
     {
       if (!FT_Get_Var_Blend_Coordinates (ft_face, mm_var->num_axis, ft_coords))
@@ -864,12 +869,12 @@ hb_ft_font_changed (hb_font_t *font)
          hb_font_set_var_coords_normalized (font, nullptr, 0);
       }
     }
-    free (coords);
-    free (ft_coords);
+    hb_free (coords);
+    hb_free (ft_coords);
 #ifdef HAVE_FT_DONE_MM_VAR
     FT_Done_MM_Var (ft_face->glyph->library, mm_var);
 #else
-    free (mm_var);
+    hb_free (mm_var);
 #endif
   }
 #endif
@@ -882,8 +887,8 @@ hb_ft_font_changed (hb_font_t *font)
  * Creates an #hb_font_t font object from the specified FT_Face.
  *
  * <note>Note: You must set the face size on @ft_face before calling
- * hb_ft_font_create_references() on it. Otherwise, HarfBuzz will not pick up
- * the face size.</note>
+ * hb_ft_font_create_referenced() on it. HarfBuzz assumes size is always set
+ * and will access `size` member of FT_Face unconditionally.</note>
  *
  * This is the preferred variant of the hb_ft_font_create*
  * function family, because it calls FT_Reference_Face() on @ft_face,
@@ -903,9 +908,7 @@ hb_ft_font_create_referenced (FT_Face ft_face)
   return hb_ft_font_create (ft_face, _hb_ft_face_destroy);
 }
 
-#if HB_USE_ATEXIT
-static void free_static_ft_library ();
-#endif
+static inline void free_static_ft_library ();
 
 static struct hb_ft_library_lazy_loader_t : hb_lazy_loader_t<hb_remove_pointer<FT_Library>,
                                                             hb_ft_library_lazy_loader_t>
@@ -916,9 +919,7 @@ static struct hb_ft_library_lazy_loader_t : hb_lazy_loader_t<hb_remove_pointer<F
     if (FT_Init_FreeType (&l))
       return nullptr;
 
-#if HB_USE_ATEXIT
-    atexit (free_static_ft_library);
-#endif
+    hb_atexit (free_static_ft_library);
 
     return l;
   }
@@ -932,13 +933,11 @@ static struct hb_ft_library_lazy_loader_t : hb_lazy_loader_t<hb_remove_pointer<F
   }
 } static_ft_library;
 
-#if HB_USE_ATEXIT
-static
+static inline
 void free_static_ft_library ()
 {
   static_ft_library.free_instance ();
 }
-#endif
 
 static FT_Library
 get_ft_library ()
@@ -1018,13 +1017,13 @@ hb_ft_font_set_funcs (hb_font_t *font)
   const int *coords = hb_font_get_var_coords_normalized (font, &num_coords);
   if (num_coords)
   {
-    FT_Fixed *ft_coords = (FT_Fixed *) calloc (num_coords, sizeof (FT_Fixed));
+    FT_Fixed *ft_coords = (FT_Fixed *) hb_calloc (num_coords, sizeof (FT_Fixed));
     if (ft_coords)
     {
       for (unsigned int i = 0; i < num_coords; i++)
        ft_coords[i] = coords[i] * 4;
       FT_Set_Var_Blend_Coordinates (ft_face, num_coords, ft_coords);
-      free (ft_coords);
+      hb_free (ft_coords);
     }
   }
 #endif
index f6306ef..8e7589b 100644 (file)
 
 #include "hb-gdi.h"
 
+
+/**
+ * SECTION:hb-gdi
+ * @title: hb-gdi
+ * @short_description: GDI integration
+ * @include: hb-gdi.h
+ *
+ * Functions for using HarfBuzz with GDI fonts.
+ **/
+
 static hb_blob_t *
 _hb_gdi_reference_table (hb_face_t *face HB_UNUSED, hb_tag_t tag, void *user_data)
 {
@@ -40,16 +50,16 @@ _hb_gdi_reference_table (hb_face_t *face HB_UNUSED, hb_tag_t tag, void *user_dat
   length = GetFontData (hdc, hb_uint32_swap (tag), 0, buffer, length);
   if (unlikely (length == GDI_ERROR)) goto fail_with_releasedc;
 
-  buffer = (char *) malloc (length);
+  buffer = (char *) hb_malloc (length);
   if (unlikely (!buffer)) goto fail_with_releasedc;
   length = GetFontData (hdc, hb_uint32_swap (tag), 0, buffer, length);
   if (unlikely (length == GDI_ERROR)) goto fail_with_releasedc_and_free;
   ReleaseDC (nullptr, hdc);
 
-  return hb_blob_create ((const char *) buffer, length, HB_MEMORY_MODE_WRITABLE, buffer, free);
+  return hb_blob_create ((const char *) buffer, length, HB_MEMORY_MODE_WRITABLE, buffer, hb_free);
 
 fail_with_releasedc_and_free:
-  free (buffer);
+  hb_free (buffer);
 fail_with_releasedc:
   ReleaseDC (nullptr, hdc);
 fail:
@@ -60,6 +70,8 @@ fail:
  * hb_gdi_face_create:
  * @hfont: a HFONT object.
  *
+ * Constructs a new face object from the specified GDI HFONT.
+ *
  * Return value: #hb_face_t object corresponding to the given input
  *
  * Since: 2.6.0
index 058f65a..8ddc7eb 100644 (file)
@@ -41,7 +41,7 @@
  * @short_description: GLib integration
  * @include: hb-glib.h
  *
- * Functions for using HarfBuzz with the GLib library. 
+ * Functions for using HarfBuzz with the GLib library.
  *
  * HarfBuzz supports using GLib to provide Unicode data, by attaching
  * GLib functions to the virtual methods in a #hb_unicode_funcs_t function
  **/
 
 
-#if !GLIB_CHECK_VERSION(2,29,14)
-static const hb_script_t
-glib_script_to_script[] =
-{
-  HB_SCRIPT_COMMON,
-  HB_SCRIPT_INHERITED,
-  HB_SCRIPT_ARABIC,
-  HB_SCRIPT_ARMENIAN,
-  HB_SCRIPT_BENGALI,
-  HB_SCRIPT_BOPOMOFO,
-  HB_SCRIPT_CHEROKEE,
-  HB_SCRIPT_COPTIC,
-  HB_SCRIPT_CYRILLIC,
-  HB_SCRIPT_DESERET,
-  HB_SCRIPT_DEVANAGARI,
-  HB_SCRIPT_ETHIOPIC,
-  HB_SCRIPT_GEORGIAN,
-  HB_SCRIPT_GOTHIC,
-  HB_SCRIPT_GREEK,
-  HB_SCRIPT_GUJARATI,
-  HB_SCRIPT_GURMUKHI,
-  HB_SCRIPT_HAN,
-  HB_SCRIPT_HANGUL,
-  HB_SCRIPT_HEBREW,
-  HB_SCRIPT_HIRAGANA,
-  HB_SCRIPT_KANNADA,
-  HB_SCRIPT_KATAKANA,
-  HB_SCRIPT_KHMER,
-  HB_SCRIPT_LAO,
-  HB_SCRIPT_LATIN,
-  HB_SCRIPT_MALAYALAM,
-  HB_SCRIPT_MONGOLIAN,
-  HB_SCRIPT_MYANMAR,
-  HB_SCRIPT_OGHAM,
-  HB_SCRIPT_OLD_ITALIC,
-  HB_SCRIPT_ORIYA,
-  HB_SCRIPT_RUNIC,
-  HB_SCRIPT_SINHALA,
-  HB_SCRIPT_SYRIAC,
-  HB_SCRIPT_TAMIL,
-  HB_SCRIPT_TELUGU,
-  HB_SCRIPT_THAANA,
-  HB_SCRIPT_THAI,
-  HB_SCRIPT_TIBETAN,
-  HB_SCRIPT_CANADIAN_SYLLABICS,
-  HB_SCRIPT_YI,
-  HB_SCRIPT_TAGALOG,
-  HB_SCRIPT_HANUNOO,
-  HB_SCRIPT_BUHID,
-  HB_SCRIPT_TAGBANWA,
-
-  /* Unicode-4.0 additions */
-  HB_SCRIPT_BRAILLE,
-  HB_SCRIPT_CYPRIOT,
-  HB_SCRIPT_LIMBU,
-  HB_SCRIPT_OSMANYA,
-  HB_SCRIPT_SHAVIAN,
-  HB_SCRIPT_LINEAR_B,
-  HB_SCRIPT_TAI_LE,
-  HB_SCRIPT_UGARITIC,
-
-  /* Unicode-4.1 additions */
-  HB_SCRIPT_NEW_TAI_LUE,
-  HB_SCRIPT_BUGINESE,
-  HB_SCRIPT_GLAGOLITIC,
-  HB_SCRIPT_TIFINAGH,
-  HB_SCRIPT_SYLOTI_NAGRI,
-  HB_SCRIPT_OLD_PERSIAN,
-  HB_SCRIPT_KHAROSHTHI,
-
-  /* Unicode-5.0 additions */
-  HB_SCRIPT_UNKNOWN,
-  HB_SCRIPT_BALINESE,
-  HB_SCRIPT_CUNEIFORM,
-  HB_SCRIPT_PHOENICIAN,
-  HB_SCRIPT_PHAGS_PA,
-  HB_SCRIPT_NKO,
-
-  /* Unicode-5.1 additions */
-  HB_SCRIPT_KAYAH_LI,
-  HB_SCRIPT_LEPCHA,
-  HB_SCRIPT_REJANG,
-  HB_SCRIPT_SUNDANESE,
-  HB_SCRIPT_SAURASHTRA,
-  HB_SCRIPT_CHAM,
-  HB_SCRIPT_OL_CHIKI,
-  HB_SCRIPT_VAI,
-  HB_SCRIPT_CARIAN,
-  HB_SCRIPT_LYCIAN,
-  HB_SCRIPT_LYDIAN,
-
-  /* Unicode-5.2 additions */
-  HB_SCRIPT_AVESTAN,
-  HB_SCRIPT_BAMUM,
-  HB_SCRIPT_EGYPTIAN_HIEROGLYPHS,
-  HB_SCRIPT_IMPERIAL_ARAMAIC,
-  HB_SCRIPT_INSCRIPTIONAL_PAHLAVI,
-  HB_SCRIPT_INSCRIPTIONAL_PARTHIAN,
-  HB_SCRIPT_JAVANESE,
-  HB_SCRIPT_KAITHI,
-  HB_SCRIPT_TAI_THAM,
-  HB_SCRIPT_LISU,
-  HB_SCRIPT_MEETEI_MAYEK,
-  HB_SCRIPT_OLD_SOUTH_ARABIAN,
-  HB_SCRIPT_OLD_TURKIC,
-  HB_SCRIPT_SAMARITAN,
-  HB_SCRIPT_TAI_VIET,
-
-  /* Unicode-6.0 additions */
-  HB_SCRIPT_BATAK,
-  HB_SCRIPT_BRAHMI,
-  HB_SCRIPT_MANDAIC,
-
-  /* Unicode-6.1 additions */
-  HB_SCRIPT_CHAKMA,
-  HB_SCRIPT_MEROITIC_CURSIVE,
-  HB_SCRIPT_MEROITIC_HIEROGLYPHS,
-  HB_SCRIPT_MIAO,
-  HB_SCRIPT_SHARADA,
-  HB_SCRIPT_SORA_SOMPENG,
-  HB_SCRIPT_TAKRI
-};
-#endif
-
 /**
  * hb_glib_script_to_script:
  * @script: The GUnicodeScript identifier to query
@@ -187,17 +63,7 @@ glib_script_to_script[] =
 hb_script_t
 hb_glib_script_to_script (GUnicodeScript script)
 {
-#if GLIB_CHECK_VERSION(2,29,14)
   return (hb_script_t) g_unicode_script_to_iso15924 (script);
-#else
-  if (likely ((unsigned int) script < ARRAY_LENGTH (glib_script_to_script)))
-    return glib_script_to_script[script];
-
-  if (unlikely (script == G_UNICODE_SCRIPT_INVALID_CODE))
-    return HB_SCRIPT_INVALID;
-
-  return HB_SCRIPT_UNKNOWN;
-#endif
 }
 
 /**
@@ -214,19 +80,7 @@ hb_glib_script_to_script (GUnicodeScript script)
 GUnicodeScript
 hb_glib_script_from_script (hb_script_t script)
 {
-#if GLIB_CHECK_VERSION(2,29,14)
   return g_unicode_script_from_iso15924 (script);
-#else
-  unsigned int count = ARRAY_LENGTH (glib_script_to_script);
-  for (unsigned int i = 0; i < count; i++)
-    if (glib_script_to_script[i] == script)
-      return (GUnicodeScript) i;
-
-  if (unlikely (script == HB_SCRIPT_INVALID))
-    return G_UNICODE_SCRIPT_INVALID_CODE;
-
-  return G_UNICODE_SCRIPT_UNKNOWN;
-#endif
 }
 
 
@@ -364,9 +218,7 @@ hb_glib_unicode_decompose (hb_unicode_funcs_t *ufuncs HB_UNUSED,
 }
 
 
-#if HB_USE_ATEXIT
-static void free_static_glib_funcs ();
-#endif
+static inline void free_static_glib_funcs ();
 
 static struct hb_glib_unicode_funcs_lazy_loader_t : hb_unicode_funcs_lazy_loader_t<hb_glib_unicode_funcs_lazy_loader_t>
 {
@@ -383,21 +235,17 @@ static struct hb_glib_unicode_funcs_lazy_loader_t : hb_unicode_funcs_lazy_loader
 
     hb_unicode_funcs_make_immutable (funcs);
 
-#if HB_USE_ATEXIT
-    atexit (free_static_glib_funcs);
-#endif
+    hb_atexit (free_static_glib_funcs);
 
     return funcs;
   }
 } static_glib_funcs;
 
-#if HB_USE_ATEXIT
-static
+static inline
 void free_static_glib_funcs ()
 {
   static_glib_funcs.free_instance ();
 }
-#endif
 
 /**
  * hb_glib_get_unicode_funcs:
index 2ffd1c9..87a11dd 100644 (file)
@@ -43,7 +43,7 @@
 /*** END file-header ***/
 
 /*** BEGIN file-production ***/
-/* enumerations from "@filename@" */
+/* enumerations from "@basename@" */
 /*** END file-production ***/
 
 /*** BEGIN file-tail ***/
index f8bd29e..a846786 100644 (file)
@@ -25,7 +25,7 @@
  * Google Author(s): Behdad Esfahbod
  */
 
-#ifndef HB_GOBJECT_H_IN
+#if !defined(HB_GOBJECT_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb-gobject.h> instead."
 #endif
 
index 7c46e26..540b11f 100644 (file)
@@ -80,12 +80,12 @@ hb_gobject_##name##_get_type () \
 #define HB_DEFINE_VALUE_TYPE(name) \
        static hb_##name##_t *_hb_##name##_reference (const hb_##name##_t *l) \
        { \
-         hb_##name##_t *c = (hb_##name##_t *) calloc (1, sizeof (hb_##name##_t)); \
+         hb_##name##_t *c = (hb_##name##_t *) hb_calloc (1, sizeof (hb_##name##_t)); \
          if (unlikely (!c)) return nullptr; \
          *c = *l; \
          return c; \
        } \
-       static void _hb_##name##_destroy (hb_##name##_t *l) { free (l); } \
+       static void _hb_##name##_destroy (hb_##name##_t *l) { hb_free (l); } \
        HB_DEFINE_BOXED_TYPE (name, _hb_##name##_reference, _hb_##name##_destroy)
 
 HB_DEFINE_OBJECT_TYPE (buffer)
index 6fad8d7..63467f8 100644 (file)
@@ -24,7 +24,7 @@
  * Google Author(s): Behdad Esfahbod
  */
 
-#ifndef HB_GOBJECT_H_IN
+#if !defined(HB_GOBJECT_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb-gobject.h> instead."
 #endif
 
@@ -40,47 +40,22 @@ HB_BEGIN_DECLS
 
 /* Object types */
 
-/**
- * hb_gobject_blob_get_type:
- *
- * Since: 0.9.2
- **/
 HB_EXTERN GType
 hb_gobject_blob_get_type (void);
 #define HB_GOBJECT_TYPE_BLOB (hb_gobject_blob_get_type ())
 
-/**
- * hb_gobject_buffer_get_type:
- *
- * Since: 0.9.2
- **/
 HB_EXTERN GType
 hb_gobject_buffer_get_type (void);
 #define HB_GOBJECT_TYPE_BUFFER (hb_gobject_buffer_get_type ())
 
-/**
- * hb_gobject_face_get_type:
- *
- * Since: 0.9.2
- **/
 HB_EXTERN GType
 hb_gobject_face_get_type (void);
 #define HB_GOBJECT_TYPE_FACE (hb_gobject_face_get_type ())
 
-/**
- * hb_gobject_font_get_type:
- *
- * Since: 0.9.2
- **/
 HB_EXTERN GType
 hb_gobject_font_get_type (void);
 #define HB_GOBJECT_TYPE_FONT (hb_gobject_font_get_type ())
 
-/**
- * hb_gobject_font_funcs_get_type:
- *
- * Since: 0.9.2
- **/
 HB_EXTERN GType
 hb_gobject_font_funcs_get_type (void);
 #define HB_GOBJECT_TYPE_FONT_FUNCS (hb_gobject_font_funcs_get_type ())
@@ -97,11 +72,6 @@ HB_EXTERN GType
 hb_gobject_shape_plan_get_type (void);
 #define HB_GOBJECT_TYPE_SHAPE_PLAN (hb_gobject_shape_plan_get_type ())
 
-/**
- * hb_gobject_unicode_funcs_get_type:
- *
- * Since: 0.9.2
- **/
 HB_EXTERN GType
 hb_gobject_unicode_funcs_get_type (void);
 #define HB_GOBJECT_TYPE_UNICODE_FUNCS (hb_gobject_unicode_funcs_get_type ())
index d8a72dc..63dc18b 100644 (file)
@@ -88,7 +88,7 @@ static const void *hb_graphite2_get_table (const void *data, unsigned int tag, s
   {
     blob = face_data->face->reference_table (tag);
 
-    hb_graphite2_tablelist_t *p = (hb_graphite2_tablelist_t *) calloc (1, sizeof (hb_graphite2_tablelist_t));
+    hb_graphite2_tablelist_t *p = (hb_graphite2_tablelist_t *) hb_calloc (1, sizeof (hb_graphite2_tablelist_t));
     if (unlikely (!p)) {
       hb_blob_destroy (blob);
       return nullptr;
@@ -123,15 +123,16 @@ _hb_graphite2_shaper_face_data_create (hb_face_t *face)
   }
   hb_blob_destroy (silf_blob);
 
-  hb_graphite2_face_data_t *data = (hb_graphite2_face_data_t *) calloc (1, sizeof (hb_graphite2_face_data_t));
+  hb_graphite2_face_data_t *data = (hb_graphite2_face_data_t *) hb_calloc (1, sizeof (hb_graphite2_face_data_t));
   if (unlikely (!data))
     return nullptr;
 
   data->face = face;
-  data->grface = gr_make_face (data, &hb_graphite2_get_table, gr_face_preloadAll);
+  const gr_face_ops ops = {sizeof(gr_face_ops), &hb_graphite2_get_table, NULL};
+  data->grface = gr_make_face_with_ops (data, &ops, gr_face_preloadAll);
 
   if (unlikely (!data->grface)) {
-    free (data);
+    hb_free (data);
     return nullptr;
   }
 
@@ -148,12 +149,12 @@ _hb_graphite2_shaper_face_data_destroy (hb_graphite2_face_data_t *data)
     hb_graphite2_tablelist_t *old = tlist;
     hb_blob_destroy (tlist->blob);
     tlist = tlist->next;
-    free (old);
+    hb_free (old);
   }
 
   gr_face_destroy (data->grface);
 
-  free (data);
+  hb_free (data);
 }
 
 /**
@@ -195,6 +196,11 @@ _hb_graphite2_shaper_font_data_destroy (hb_graphite2_font_data_t *data HB_UNUSED
 #ifndef HB_DISABLE_DEPRECATED
 /**
  * hb_graphite2_font_get_gr_font:
+ * @font: An #hb_font_t
+ *
+ * Always returns %NULL. Use hb_graphite2_face_get_gr_face() instead.
+ *
+ * Return value: (nullable): Graphite2 font associated with @font.
  *
  * Since: 0.9.10
  * Deprecated: 1.4.2
@@ -284,7 +290,7 @@ _hb_graphite2_shape (hb_shape_plan_t    *shape_plan HB_UNUSED,
     return true;
   }
 
-  buffer->ensure (glyph_count);
+  (void) buffer->ensure (glyph_count);
   scratch = buffer->get_scratch_buffer (&scratch_size);
   while ((DIV_CEIL (sizeof (hb_graphite2_cluster_t) * buffer->len, sizeof (*scratch)) +
          DIV_CEIL (sizeof (hb_codepoint_t) * glyph_count, sizeof (*scratch))) > scratch_size)
@@ -433,7 +439,8 @@ _hb_graphite2_shape (hb_shape_plan_t    *shape_plan HB_UNUSED,
   if (feats) gr_featureval_destroy (feats);
   gr_seg_destroy (seg);
 
-  buffer->unsafe_to_break_all ();
+  buffer->clear_glyph_flags ();
+  buffer->unsafe_to_break ();
 
   return true;
 }
index c1dcc24..e46401f 100644 (file)
@@ -192,45 +192,13 @@ hb_icu_unicode_compose (hb_unicode_funcs_t *ufuncs HB_UNUSED,
                        hb_codepoint_t      a,
                        hb_codepoint_t      b,
                        hb_codepoint_t     *ab,
-                       void               *user_data HB_UNUSED)
+                       void               *user_data)
 {
-#if U_ICU_VERSION_MAJOR_NUM >= 49
-  {
-    const UNormalizer2 *normalizer = (const UNormalizer2 *) user_data;
-    UChar32 ret = unorm2_composePair (normalizer, a, b);
-    if (ret < 0) return false;
-    *ab = ret;
-    return true;
-  }
-#endif
-
-  /* We don't ifdef-out the fallback code such that compiler always
-   * sees it and makes sure it's compilable. */
-
-  UChar utf16[4], normalized[5];
-  unsigned int len;
-  hb_bool_t ret, err;
-  UErrorCode icu_err;
-
-  len = 0;
-  err = false;
-  U16_APPEND (utf16, len, ARRAY_LENGTH (utf16), a, err);
-  if (err) return false;
-  U16_APPEND (utf16, len, ARRAY_LENGTH (utf16), b, err);
-  if (err) return false;
-
-  icu_err = U_ZERO_ERROR;
-  len = unorm2_normalize (unorm2_getNFCInstance (&icu_err), utf16, len, normalized, ARRAY_LENGTH (normalized), &icu_err);
-  if (U_FAILURE (icu_err))
-    return false;
-  if (u_countChar32 (normalized, len) == 1) {
-    U16_GET_UNSAFE (normalized, 0, *ab);
-    ret = true;
-  } else {
-    ret = false;
-  }
-
-  return ret;
+  const UNormalizer2 *normalizer = (const UNormalizer2 *) user_data;
+  UChar32 ret = unorm2_composePair (normalizer, a, b);
+  if (ret < 0) return false;
+  *ab = ret;
+  return true;
 }
 
 static hb_bool_t
@@ -238,114 +206,43 @@ hb_icu_unicode_decompose (hb_unicode_funcs_t *ufuncs HB_UNUSED,
                          hb_codepoint_t      ab,
                          hb_codepoint_t     *a,
                          hb_codepoint_t     *b,
-                         void               *user_data HB_UNUSED)
+                         void               *user_data)
 {
-#if U_ICU_VERSION_MAJOR_NUM >= 49
+  const UNormalizer2 *normalizer = (const UNormalizer2 *) user_data;
+  UChar decomposed[4];
+  int len;
+  UErrorCode icu_err = U_ZERO_ERROR;
+  len = unorm2_getRawDecomposition (normalizer, ab, decomposed,
+                                   ARRAY_LENGTH (decomposed), &icu_err);
+  if (U_FAILURE (icu_err) || len < 0) return false;
+
+  len = u_countChar32 (decomposed, len);
+  if (len == 1)
   {
-    const UNormalizer2 *normalizer = (const UNormalizer2 *) user_data;
-    UChar decomposed[4];
-    int len;
-    UErrorCode icu_err = U_ZERO_ERROR;
-    len = unorm2_getRawDecomposition (normalizer, ab, decomposed,
-                                     ARRAY_LENGTH (decomposed), &icu_err);
-    if (U_FAILURE (icu_err) || len < 0) return false;
-
-    len = u_countChar32 (decomposed, len);
-    if (len == 1) {
-      U16_GET_UNSAFE (decomposed, 0, *a);
-      *b = 0;
-      return *a != ab;
-    } else if (len == 2) {
-      len = 0;
-      U16_NEXT_UNSAFE (decomposed, len, *a);
-      U16_NEXT_UNSAFE (decomposed, len, *b);
-    }
-    return true;
-  }
-#endif
-
-  /* We don't ifdef-out the fallback code such that compiler always
-   * sees it and makes sure it's compilable. */
-
-  UChar utf16[2], normalized[2 * 19/*HB_UNICODE_MAX_DECOMPOSITION_LEN*/ + 1];
-  unsigned int len;
-  hb_bool_t ret, err;
-  UErrorCode icu_err;
-
-  /* This function is a monster! Maybe it wasn't a good idea adding a
-   * pairwise decompose API... */
-  /* Watchout for the dragons.  Err, watchout for macros changing len. */
-
-  len = 0;
-  err = false;
-  U16_APPEND (utf16, len, ARRAY_LENGTH (utf16), ab, err);
-  if (err) return false;
-
-  icu_err = U_ZERO_ERROR;
-  len = unorm2_normalize (unorm2_getNFDInstance (&icu_err), utf16, len, normalized, ARRAY_LENGTH (normalized), &icu_err);
-  if (U_FAILURE (icu_err))
-    return false;
-
-  len = u_countChar32 (normalized, len);
-
-  if (len == 1) {
-    U16_GET_UNSAFE (normalized, 0, *a);
+    U16_GET_UNSAFE (decomposed, 0, *a);
     *b = 0;
-    ret = *a != ab;
-  } else if (len == 2) {
+    return *a != ab;
+  }
+  else if (len == 2)
+  {
     len = 0;
-    U16_NEXT_UNSAFE (normalized, len, *a);
-    U16_NEXT_UNSAFE (normalized, len, *b);
-
-    /* Here's the ugly part: if ab decomposes to a single character and
-     * that character decomposes again, we have to detect that and undo
-     * the second part :-(. */
-    UChar recomposed[20];
-    icu_err = U_ZERO_ERROR;
-    unorm2_normalize (unorm2_getNFCInstance (&icu_err), normalized, len, recomposed, ARRAY_LENGTH (recomposed), &icu_err);
-    if (U_FAILURE (icu_err))
-      return false;
-    hb_codepoint_t c;
-    U16_GET_UNSAFE (recomposed, 0, c);
-    if (c != *a && c != ab) {
-      *a = c;
-      *b = 0;
-    }
-    ret = true;
-  } else {
-    /* If decomposed to more than two characters, take the last one,
-     * and recompose the rest to get the first component. */
-    U16_PREV_UNSAFE (normalized, len, *b); /* Changes len in-place. */
-    UChar recomposed[18 * 2];
-    icu_err = U_ZERO_ERROR;
-    len = unorm2_normalize (unorm2_getNFCInstance (&icu_err), normalized, len, recomposed, ARRAY_LENGTH (recomposed), &icu_err);
-    if (U_FAILURE (icu_err))
-      return false;
-    /* We expect that recomposed has exactly one character now. */
-    if (unlikely (u_countChar32 (recomposed, len) != 1))
-      return false;
-    U16_GET_UNSAFE (recomposed, 0, *a);
-    ret = true;
+    U16_NEXT_UNSAFE (decomposed, len, *a);
+    U16_NEXT_UNSAFE (decomposed, len, *b);
   }
-
-  return ret;
+  return true;
 }
 
 
-#if HB_USE_ATEXIT
-static void free_static_icu_funcs ();
-#endif
+static inline void free_static_icu_funcs ();
 
 static struct hb_icu_unicode_funcs_lazy_loader_t : hb_unicode_funcs_lazy_loader_t<hb_icu_unicode_funcs_lazy_loader_t>
 {
   static hb_unicode_funcs_t *create ()
   {
     void *user_data = nullptr;
-#if U_ICU_VERSION_MAJOR_NUM >= 49
     UErrorCode icu_err = U_ZERO_ERROR;
     user_data = (void *) unorm2_getNFCInstance (&icu_err);
     assert (user_data);
-#endif
 
     hb_unicode_funcs_t *funcs = hb_unicode_funcs_create (nullptr);
 
@@ -358,21 +255,17 @@ static struct hb_icu_unicode_funcs_lazy_loader_t : hb_unicode_funcs_lazy_loader_
 
     hb_unicode_funcs_make_immutable (funcs);
 
-#if HB_USE_ATEXIT
-    atexit (free_static_icu_funcs);
-#endif
+    hb_atexit (free_static_icu_funcs);
 
     return funcs;
   }
 } static_icu_funcs;
 
-#if HB_USE_ATEXIT
-static
+static inline
 void free_static_icu_funcs ()
 {
   static_icu_funcs.free_instance ();
 }
-#endif
 
 /**
  * hb_icu_get_unicode_funcs:
index 981c5c2..43a3098 100644 (file)
@@ -46,7 +46,7 @@
  * TODO Document more.
  *
  * If iterator implementation implements operator!=, then can be
- * used in range-based for loop.  That comes free if the iterator
+ * used in range-based for loop.  That already happens if the iterator
  * is random-access.  Otherwise, the range-based for loop incurs
  * one traversal to find end(), which can be avoided if written
  * as a while-style for loop, or if iterator implements a faster
@@ -90,8 +90,8 @@ struct hb_iter_t
    * it will be returning pointer to temporary rvalue.
    * TODO Use a wrapper return type to fix for non-reference type. */
   template <typename T = item_t,
-           hb_enable_if (hb_is_reference (T))>
-  hb_remove_reference<item_t>* operator -> () const { return hb_addressof (**thiz()); }
+           hb_enable_if (std::is_reference<T>::value)>
+  hb_remove_reference<item_t>* operator -> () const { return std::addressof (**thiz()); }
   item_t operator * () const { return thiz()->__item__ (); }
   item_t operator * () { return thiz()->__item__ (); }
   item_t operator [] (unsigned i) const { return thiz()->__item_at__ (i); }
@@ -162,7 +162,7 @@ struct
 {
   template <typename T> hb_iter_type<T>
   operator () (T&& c) const
-  { return hb_deref (hb_forward<T> (c)).iter (); }
+  { return hb_deref (std::forward<T> (c)).iter (); }
 
   /* Specialization for C arrays. */
 
@@ -289,7 +289,7 @@ struct hb_is_source_of
 {
   private:
   template <typename Iter2 = Iter,
-           hb_enable_if (hb_is_convertible (typename Iter2::item_t, hb_add_lvalue_reference<hb_add_const<Item>>))>
+           hb_enable_if (hb_is_convertible (typename Iter2::item_t, hb_add_lvalue_reference<const Item>))>
   static hb_true_type impl (hb_priority<2>);
   template <typename Iter2 = Iter>
   static auto impl (hb_priority<1>) -> decltype (hb_declval (Iter2) >> hb_declval (Item &), hb_true_type ());
@@ -353,7 +353,7 @@ static inline auto end (Iterable&& iterable) HB_AUTO_RETURN (hb_iter (iterable).
 template <typename Lhs, typename Rhs,
          hb_requires (hb_is_iterator (Lhs))>
 static inline auto
-operator | (Lhs&& lhs, Rhs&& rhs) HB_AUTO_RETURN (hb_forward<Rhs> (rhs) (hb_forward<Lhs> (lhs)))
+operator | (Lhs&& lhs, Rhs&& rhs) HB_AUTO_RETURN (std::forward<Rhs> (rhs) (std::forward<Lhs> (lhs)))
 
 /* hb_map(), hb_filter(), hb_reduce() */
 
@@ -581,6 +581,91 @@ struct
 }
 HB_FUNCOBJ (hb_zip);
 
+/* hb_concat() */
+
+template <typename A, typename B>
+struct hb_concat_iter_t :
+    hb_iter_t<hb_concat_iter_t<A, B>, typename A::item_t>
+{
+  hb_concat_iter_t () {}
+  hb_concat_iter_t (A& a, B& b) : a (a), b (b) {}
+  hb_concat_iter_t (const A& a, const B& b) : a (a), b (b) {}
+
+
+  typedef typename A::item_t __item_t__;
+  static constexpr bool is_random_access_iterator =
+    A::is_random_access_iterator &&
+    B::is_random_access_iterator;
+  static constexpr bool is_sorted_iterator = false;
+
+  __item_t__ __item__ () const
+  {
+    if (!a)
+      return *b;
+    return *a;
+  }
+
+  __item_t__ __item_at__ (unsigned i) const
+  {
+    unsigned a_len = a.len ();
+    if (i < a_len)
+      return a[i];
+    return b[i - a_len];
+  }
+
+  bool __more__ () const { return bool (a) || bool (b); }
+
+  unsigned __len__ () const { return a.len () + b.len (); }
+
+  void __next__ ()
+  {
+    if (a)
+      ++a;
+    else
+      ++b;
+  }
+
+  void __forward__ (unsigned n)
+  {
+    if (!n) return;
+    if (!is_random_access_iterator) {
+      while (n-- && *this) {
+        (*this)++;
+      }
+      return;
+    }
+
+    unsigned a_len = a.len ();
+    if (n > a_len) {
+      n -= a_len;
+      a.__forward__ (a_len);
+      b.__forward__ (n);
+    } else {
+      a.__forward__ (n);
+    }
+  }
+
+  hb_concat_iter_t __end__ () const { return hb_concat_iter_t (a.end (), b.end ()); }
+  bool operator != (const hb_concat_iter_t& o) const
+  {
+    return a != o.a
+        || b != o.b;
+  }
+
+  private:
+  A a;
+  B b;
+};
+struct
+{ HB_PARTIALIZE(2);
+  template <typename A, typename B,
+           hb_requires (hb_is_iterable (A) && hb_is_iterable (B))>
+  hb_concat_iter_t<hb_iter_type<A>, hb_iter_type<B>>
+  operator () (A&& a, B&& b) const
+  { return hb_concat_iter_t<hb_iter_type<A>, hb_iter_type<B>> (hb_iter (a), hb_iter (b)); }
+}
+HB_FUNCOBJ (hb_concat);
+
 /* hb_apply() */
 
 template <typename Appl>
@@ -674,8 +759,8 @@ struct hb_iota_iter_t :
   template <typename S2 = S>
   auto
   inc (hb_type_identity<S2> s, hb_priority<1>)
-    -> hb_void_t<decltype (hb_invoke (hb_forward<S2> (s), hb_declval<T&> ()))>
-  { v = hb_invoke (hb_forward<S2> (s), v); }
+    -> hb_void_t<decltype (hb_invoke (std::forward<S2> (s), hb_declval<T&> ()))>
+  { v = hb_invoke (std::forward<S2> (s), v); }
 
   void
   inc (S s, hb_priority<0>)
@@ -874,7 +959,7 @@ struct
                    Proj&& f = hb_identity) const
   {
     for (auto it = hb_iter (c); it; ++it)
-      if (!hb_match (hb_forward<Pred> (p), hb_get (hb_forward<Proj> (f), *it)))
+      if (!hb_match (std::forward<Pred> (p), hb_get (std::forward<Proj> (f), *it)))
        return false;
     return true;
   }
@@ -891,7 +976,7 @@ struct
                    Proj&& f = hb_identity) const
   {
     for (auto it = hb_iter (c); it; ++it)
-      if (hb_match (hb_forward<Pred> (p), hb_get (hb_forward<Proj> (f), *it)))
+      if (hb_match (std::forward<Pred> (p), hb_get (std::forward<Proj> (f), *it)))
        return true;
     return false;
   }
@@ -908,7 +993,7 @@ struct
                    Proj&& f = hb_identity) const
   {
     for (auto it = hb_iter (c); it; ++it)
-      if (hb_match (hb_forward<Pred> (p), hb_get (hb_forward<Proj> (f), *it)))
+      if (hb_match (std::forward<Pred> (p), hb_get (std::forward<Proj> (f), *it)))
        return false;
     return true;
   }
@@ -922,7 +1007,7 @@ HB_FUNCOBJ (hb_none);
 template <typename C, typename V,
          hb_requires (hb_is_iterable (C))>
 inline void
-hb_fill (C& c, const V &v)
+hb_fill (C&& c, const V &v)
 {
   for (auto i = hb_iter (c); i; i++)
     *i = v;
index 3f952fe..9ea945c 100644 (file)
@@ -49,6 +49,10 @@ struct hb_kern_machine_t
             hb_mask_t    kern_mask,
             bool         scale = true) const
   {
+    if (!buffer->message (font, "start kern"))
+      return;
+
+    buffer->unsafe_to_concat ();
     OT::hb_ot_apply_context_t c (1, font, buffer);
     c.set_lookup_mask (kern_mask);
     c.set_lookup_props (OT::LookupFlag::IgnoreMarks);
@@ -67,7 +71,8 @@ struct hb_kern_machine_t
       }
 
       skippy_iter.reset (idx, 1);
-      if (!skippy_iter.next ())
+      unsigned unsafe_to;
+      if (!skippy_iter.next (&unsafe_to))
       {
        idx++;
        continue;
@@ -125,6 +130,8 @@ struct hb_kern_machine_t
     skip:
       idx = skippy_iter.idx;
     }
+
+    (void) buffer->message (font, "end kern");
   }
 
   const Driver &driver;
index 54bc60d..b529173 100644 (file)
@@ -80,6 +80,11 @@ static inline Type& StructAfter(TObject &X)
  * Size checking
  */
 
+/* Size signifying variable-sized array */
+#ifndef HB_VAR_ARRAY
+#define HB_VAR_ARRAY 1
+#endif
+
 /* Check _assertion in a method environment */
 #define _DEFINE_INSTANCE_ASSERTION1(_line, _assertion) \
   void _instance_assertion_on_line_##_line () const \
@@ -189,7 +194,8 @@ struct hb_lazy_loader_t : hb_data_wrapper_t<Data, WheresData>
   }
 
   const Returned * operator -> () const { return get (); }
-  const Returned & operator * () const  { return *get (); }
+  template <typename U = Returned, hb_enable_if (!hb_is_same (U, void))>
+  const U & operator * () const  { return *get (); }
   explicit operator bool () const
   { return get_stored () != Funcs::get_null (); }
   template <typename C> operator const C * () const { return get (); }
@@ -237,22 +243,22 @@ struct hb_lazy_loader_t : hb_data_wrapper_t<Data, WheresData>
   static const Stored* get_null () { return &Null (Stored); }
   static Stored *create (Data *data)
   {
-    Stored *p = (Stored *) calloc (1, sizeof (Stored));
+    Stored *p = (Stored *) hb_calloc (1, sizeof (Stored));
     if (likely (p))
-      p->init (data);
+      p = new (p) Stored (data);
     return p;
   }
   static Stored *create ()
   {
-    Stored *p = (Stored *) calloc (1, sizeof (Stored));
+    Stored *p = (Stored *) hb_calloc (1, sizeof (Stored));
     if (likely (p))
-      p->init ();
+      p = new (p) Stored ();
     return p;
   }
   static void destroy (Stored *p)
   {
-    p->fini ();
-    free (p);
+    p->~Stored ();
+    hb_free (p);
   }
 
 //  private:
index 191be14..9f1ac42 100644 (file)
@@ -42,7 +42,9 @@
 /**
  * hb_map_create: (Xconstructor)
  *
- * Return value: (transfer full):
+ * Creates a new, initially empty map.
+ *
+ * Return value: (transfer full): The new #hb_map_t
  *
  * Since: 1.7.7
  **/
@@ -62,7 +64,9 @@ hb_map_create ()
 /**
  * hb_map_get_empty:
  *
- * Return value: (transfer full):
+ * Fetches the singleton empty #hb_map_t.
+ *
+ * Return value: (transfer full): The empty #hb_map_t
  *
  * Since: 1.7.7
  **/
@@ -74,9 +78,11 @@ hb_map_get_empty ()
 
 /**
  * hb_map_reference: (skip)
- * @map: a map.
+ * @map: A map
+ *
+ * Increases the reference count on a map.
  *
- * Return value: (transfer full):
+ * Return value: (transfer full): The map
  *
  * Since: 1.7.7
  **/
@@ -88,7 +94,11 @@ hb_map_reference (hb_map_t *map)
 
 /**
  * hb_map_destroy: (skip)
- * @map: a map.
+ * @map: A map
+ *
+ * Decreases the reference count on a map. When
+ * the reference count reaches zero, the map is
+ * destroyed, freeing all memory.
  *
  * Since: 1.7.7
  **/
@@ -99,18 +109,20 @@ hb_map_destroy (hb_map_t *map)
 
   map->fini_shallow ();
 
-  free (map);
+  hb_free (map);
 }
 
 /**
  * hb_map_set_user_data: (skip)
- * @map: a map.
- * @key:
- * @data:
- * @destroy:
- * @replace:
+ * @map: A map
+ * @key: The user-data key to set
+ * @data: A pointer to the user data to set
+ * @destroy: (nullable): A callback to call when @data is not needed anymore
+ * @replace: Whether to replace an existing data with the same key
+ *
+ * Attaches a user-data key/data pair to the specified map.
  *
- * Return value:
+ * Return value: %true if success, %false otherwise
  *
  * Since: 1.7.7
  **/
@@ -126,10 +138,13 @@ hb_map_set_user_data (hb_map_t           *map,
 
 /**
  * hb_map_get_user_data: (skip)
- * @map: a map.
- * @key:
+ * @map: A map
+ * @key: The user-data key to query
+ *
+ * Fetches the user data associated with the specified key,
+ * attached to the specified map.
  *
- * Return value: (transfer none):
+ * Return value: (transfer none): A pointer to the user data
  *
  * Since: 1.7.7
  **/
@@ -143,11 +158,11 @@ hb_map_get_user_data (hb_map_t           *map,
 
 /**
  * hb_map_allocation_successful:
- * @map: a map.
+ * @map: A map
  *
+ * Tests whether memory allocation for a set was successful.
  *
- *
- * Return value:
+ * Return value: %true if allocation succeeded, %false otherwise
  *
  * Since: 1.7.7
  **/
@@ -160,11 +175,11 @@ hb_map_allocation_successful (const hb_map_t  *map)
 
 /**
  * hb_map_set:
- * @map: a map.
- * @key:
- * @value:
- *
+ * @map: A map
+ * @key: The key to store in the map
+ * @value: The value to store for @key
  *
+ * Stores @key:@value in the map.
  *
  * Since: 1.7.7
  **/
@@ -173,15 +188,16 @@ hb_map_set (hb_map_t       *map,
            hb_codepoint_t  key,
            hb_codepoint_t  value)
 {
+  /* Immutable-safe. */
   map->set (key, value);
 }
 
 /**
  * hb_map_get:
- * @map: a map.
- * @key:
- *
+ * @map: A map
+ * @key: The key to query
  *
+ * Fetches the value stored for @key in @map.
  *
  * Since: 1.7.7
  **/
@@ -194,10 +210,10 @@ hb_map_get (const hb_map_t *map,
 
 /**
  * hb_map_del:
- * @map: a map.
- * @key:
- *
+ * @map: A map
+ * @key: The key to delete
  *
+ * Removes @key and its stored value from @map.
  *
  * Since: 1.7.7
  **/
@@ -205,15 +221,18 @@ void
 hb_map_del (hb_map_t       *map,
            hb_codepoint_t  key)
 {
+  /* Immutable-safe. */
   map->del (key);
 }
 
 /**
  * hb_map_has:
- * @map: a map.
- * @key:
+ * @map: A map
+ * @key: The key to query
  *
+ * Tests whether @key is an element of @map.
  *
+ * Return value: %true if @key is found in @map, %false otherwise
  *
  * Since: 1.7.7
  **/
@@ -227,9 +246,9 @@ hb_map_has (const hb_map_t *map,
 
 /**
  * hb_map_clear:
- * @map: a map.
- *
+ * @map: A map
  *
+ * Clears out the contents of @map.
  *
  * Since: 1.7.7
  **/
@@ -241,9 +260,11 @@ hb_map_clear (hb_map_t *map)
 
 /**
  * hb_map_is_empty:
- * @map: a map.
+ * @map: A map
  *
+ * Tests whether @map is empty (contains no elements).
  *
+ * Return value: %true if @map is empty
  *
  * Since: 1.7.7
  **/
@@ -255,9 +276,11 @@ hb_map_is_empty (const hb_map_t *map)
 
 /**
  * hb_map_get_population:
- * @map: a map.
+ * @map: A map
  *
+ * Returns the number of key-value pairs in the map.
  *
+ * Return value: The population of @map
  *
  * Since: 1.7.7
  **/
index b77843c..6a45a7b 100644 (file)
@@ -24,7 +24,7 @@
  * Google Author(s): Behdad Esfahbod
  */
 
-#ifndef HB_H_IN
+#if !defined(HB_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb.h> instead."
 #endif
 
 HB_BEGIN_DECLS
 
 
-/*
+/**
+ * HB_MAP_VALUE_INVALID:
+ *
+ * Unset #hb_map_t value.
+ *
  * Since: 1.7.7
  */
 #define HB_MAP_VALUE_INVALID ((hb_codepoint_t) -1)
 
+/**
+ * hb_map_t:
+ *
+ * Data type for holding integer-to-integer hash maps.
+ *
+ **/
 typedef struct hb_map_t hb_map_t;
 
 
index b7bf7fe..9341637 100644 (file)
  */
 
 template <typename K, typename V,
-         K kINVALID = hb_is_pointer (K) ? 0 : hb_is_signed (K) ? hb_int_min (K) : (K) -1,
-         V vINVALID = hb_is_pointer (V) ? 0 : hb_is_signed (V) ? hb_int_min (V) : (V) -1>
+         typename k_invalid_t = K,
+         typename v_invalid_t = V,
+         k_invalid_t kINVALID = std::is_pointer<K>::value ? 0 : std::is_signed<K>::value ? hb_int_min (K) : (K) -1,
+         v_invalid_t vINVALID = std::is_pointer<V>::value ? 0 : std::is_signed<V>::value ? hb_int_min (V) : (V) -1>
 struct hb_hashmap_t
 {
-  HB_DELETE_COPY_ASSIGN (hb_hashmap_t);
   hb_hashmap_t ()  { init (); }
   ~hb_hashmap_t () { fini (); }
 
-  static_assert (hb_is_integral (K) || hb_is_pointer (K), "");
-  static_assert (hb_is_integral (V) || hb_is_pointer (V), "");
+  hb_hashmap_t (const hb_hashmap_t& o) : hb_hashmap_t () { hb_copy (o, *this); }
+  hb_hashmap_t (hb_hashmap_t&& o) : hb_hashmap_t () { hb_swap (*this, o); }
+  hb_hashmap_t& operator= (const hb_hashmap_t& o)  { hb_copy (o, *this); return *this; }
+  hb_hashmap_t& operator= (hb_hashmap_t&& o)  { hb_swap (*this, o); return *this; }
+
+  hb_hashmap_t (std::initializer_list<hb_pair_t<K, V>> lst) : hb_hashmap_t ()
+  {
+    for (auto&& item : lst)
+      set (item.first, item.second);
+  }
+  template <typename Iterable,
+           hb_requires (hb_is_iterable (Iterable))>
+  hb_hashmap_t (const Iterable &o) : hb_hashmap_t ()
+  {
+    hb_copy (o, *this);
+  }
 
   struct item_t
   {
@@ -52,13 +67,34 @@ struct hb_hashmap_t
     V value;
     uint32_t hash;
 
-    void clear () { key = kINVALID; value = vINVALID; hash = 0; }
+    void clear ()
+    {
+      new (std::addressof (key)) K ();
+      key = hb_coerce<K> (kINVALID);
+      new (std::addressof (value)) V ();
+      value = hb_coerce<V> (vINVALID);
+      hash = 0;
+    }
 
-    bool operator == (o) { return hb_deref (key) == hb_deref (o); }
+    bool operator == (const K &o) { return hb_deref (key) == hb_deref (o); }
     bool operator == (const item_t &o) { return *this == o.key; }
-    bool is_unused () const    { return key == kINVALID; }
-    bool is_tombstone () const { return key != kINVALID && value == vINVALID; }
-    bool is_real () const { return key != kINVALID && value != vINVALID; }
+    bool is_unused () const
+    {
+      const K inv = hb_coerce<K> (kINVALID);
+      return key == inv;
+    }
+    bool is_tombstone () const
+    {
+      const K kinv = hb_coerce<K> (kINVALID);
+      const V vinv = hb_coerce<V> (vINVALID);
+      return key != kinv && value == vinv;
+    }
+    bool is_real () const
+    {
+      const K kinv = hb_coerce<K> (kINVALID);
+      const V vinv = hb_coerce<V> (vINVALID);
+      return key != kinv && value != vinv;
+    }
     hb_pair_t<K, V> get_pair() const { return hb_pair_t<K, V> (key, value); }
   };
 
@@ -70,6 +106,16 @@ struct hb_hashmap_t
   unsigned int prime;
   item_t *items;
 
+  friend void swap (hb_hashmap_t& a, hb_hashmap_t& b)
+  {
+    if (unlikely (!a.successful || !b.successful))
+      return;
+    hb_swap (a.population, b.population);
+    hb_swap (a.occupancy, b.occupancy);
+    hb_swap (a.mask, b.mask);
+    hb_swap (a.prime, b.prime);
+    hb_swap (a.items, b.items);
+  }
   void init_shallow ()
   {
     successful = true;
@@ -85,8 +131,13 @@ struct hb_hashmap_t
   }
   void fini_shallow ()
   {
-    free (items);
-    items = nullptr;
+    if (likely (items)) {
+      unsigned size = mask + 1;
+      for (unsigned i = 0; i < size; i++)
+        items[i].~item_t ();
+      hb_free (items);
+      items = nullptr;
+    }
     population = occupancy = 0;
   }
   void fini ()
@@ -97,8 +148,6 @@ struct hb_hashmap_t
 
   void reset ()
   {
-    if (unlikely (hb_object_is_immutable (this)))
-      return;
     successful = true;
     clear ();
   }
@@ -111,15 +160,14 @@ struct hb_hashmap_t
 
     unsigned int power = hb_bit_storage (population * 2 + 8);
     unsigned int new_size = 1u << power;
-    item_t *new_items = (item_t *) malloc ((size_t) new_size * sizeof (item_t));
+    item_t *new_items = (item_t *) hb_malloc ((size_t) new_size * sizeof (item_t));
     if (unlikely (!new_items))
     {
       successful = false;
       return false;
     }
-    + hb_iter (new_items, new_size)
-    | hb_apply (&item_t::clear)
-    ;
+    for (auto &_ : hb_iter (new_items, new_size))
+      _.clear ();
 
     unsigned int old_size = mask + 1;
     item_t *old_items = items;
@@ -133,56 +181,59 @@ struct hb_hashmap_t
     /* Insert back old items. */
     if (old_items)
       for (unsigned int i = 0; i < old_size; i++)
+      {
        if (old_items[i].is_real ())
+       {
          set_with_hash (old_items[i].key,
                         old_items[i].hash,
-                        old_items[i].value);
+                        std::move (old_items[i].value));
+       }
+       old_items[i].~item_t ();
+      }
 
-    free (old_items);
+    hb_free (old_items);
 
     return true;
   }
 
-  void set (K key, V value)
-  {
-    set_with_hash (key, hb_hash (key), value);
-  }
+  bool set (K key, const V& value) { return set_with_hash (key, hb_hash (key), value); }
+  bool set (K key, V&& value) { return set_with_hash (key, hb_hash (key), std::move (value)); }
 
   V get (K key) const
   {
-    if (unlikely (!items)) return vINVALID;
+    if (unlikely (!items)) return hb_coerce<V> (vINVALID);
     unsigned int i = bucket_for (key);
-    return items[i].is_real () && items[i] == key ? items[i].value : vINVALID;
+    return items[i].is_real () && items[i] == key ? items[i].value : hb_coerce<V> (vINVALID);
   }
 
-  void del (K key) { set (key, vINVALID); }
+  void del (K key) { set (key, hb_coerce<V> (vINVALID)); }
 
   /* Has interface. */
-  static constexpr V SENTINEL = vINVALID;
   typedef V value_t;
   value_t operator [] (K k) const { return get (k); }
   bool has (K k, V *vp = nullptr) const
   {
     V v = (*this)[k];
     if (vp) *vp = v;
-    return v != SENTINEL;
+    const V vinv = hb_coerce<V> (vINVALID);
+    return v != vinv;
   }
   /* Projection. */
   V operator () (K k) const { return get (k); }
 
   void clear ()
   {
-    if (unlikely (hb_object_is_immutable (this)))
-      return;
+    if (unlikely (!successful)) return;
+
     if (items)
-      + hb_iter (items, mask + 1)
-      | hb_apply (&item_t::clear)
-      ;
+      for (auto &_ : hb_iter (items, mask + 1))
+       _.clear ();
 
     population = occupancy = 0;
   }
 
   bool is_empty () const { return population == 0; }
+  explicit operator bool () const { return !is_empty (); }
 
   unsigned int get_population () const { return population; }
 
@@ -216,20 +267,23 @@ struct hb_hashmap_t
 
   protected:
 
-  void set_with_hash (K key, uint32_t hash, V value)
+  template <typename VV>
+  bool set_with_hash (K key, uint32_t hash, VV&& value)
   {
-    if (unlikely (!successful)) return;
-    if (unlikely (key == kINVALID)) return;
-    if ((occupancy + occupancy / 2) >= mask && !resize ()) return;
+    if (unlikely (!successful)) return false;
+    const K kinv = hb_coerce<K> (kINVALID);
+    if (unlikely (key == kinv)) return true;
+    if (unlikely ((occupancy + occupancy / 2) >= mask && !resize ())) return false;
     unsigned int i = bucket_for_hash (key, hash);
 
-    if (value == vINVALID && items[i].key != key)
-      return; /* Trying to delete non-existent key. */
+    const V vinv = hb_coerce<V> (vINVALID);
+    if (value == vinv && items[i].key != key)
+      return true; /* Trying to delete non-existent key. */
 
     if (!items[i].is_unused ())
     {
       occupancy--;
-      if (items[i].is_tombstone ())
+      if (!items[i].is_tombstone ())
        population--;
     }
 
@@ -240,6 +294,8 @@ struct hb_hashmap_t
     occupancy++;
     if (!items[i].is_tombstone ())
       population++;
+
+    return true;
   }
 
   unsigned int bucket_for (K key) const
@@ -321,8 +377,27 @@ struct hb_hashmap_t
 
 struct hb_map_t : hb_hashmap_t<hb_codepoint_t,
                               hb_codepoint_t,
+                              hb_codepoint_t,
+                              hb_codepoint_t,
                               HB_MAP_VALUE_INVALID,
-                              HB_MAP_VALUE_INVALID> {};
-
+                              HB_MAP_VALUE_INVALID>
+{
+  using hashmap = hb_hashmap_t<hb_codepoint_t,
+                              hb_codepoint_t,
+                              hb_codepoint_t,
+                              hb_codepoint_t,
+                              HB_MAP_VALUE_INVALID,
+                              HB_MAP_VALUE_INVALID>;
+
+  hb_map_t () = default;
+  ~hb_map_t () = default;
+  hb_map_t (hb_map_t&) = default;
+  hb_map_t& operator= (const hb_map_t&) = default;
+  hb_map_t& operator= (hb_map_t&&) = default;
+  hb_map_t (std::initializer_list<hb_pair_t<hb_codepoint_t, hb_codepoint_t>> lst) : hashmap (lst) {}
+  template <typename Iterable,
+           hb_requires (hb_is_iterable (Iterable))>
+  hb_map_t (const Iterable &o) : hashmap (o) {}
+};
 
 #endif /* HB_MAP_HH */
index c08b191..3fea5d9 100644 (file)
 
 #include "hb.hh"
 
+#include <memory>
+#include <type_traits>
+#include <utility>
+
 
 /*
  * C++ template meta-programming & fundamentals used with them.
@@ -49,6 +53,10 @@ template <bool b> using hb_bool_constant = hb_integral_constant<bool, b>;
 using hb_true_type = hb_bool_constant<true>;
 using hb_false_type = hb_bool_constant<false>;
 
+/* Static-assert as expression. */
+template <bool cond> struct static_assert_expr;
+template <> struct static_assert_expr<true> : hb_false_type {};
+#define static_assert_expr(C) static_assert_expr<C>::value
 
 /* Basic type SFINAE. */
 
@@ -78,33 +86,16 @@ template <>             struct hb_priority<0> {};
 template <typename T> struct hb_type_identity_t { typedef T type; };
 template <typename T> using hb_type_identity = typename hb_type_identity_t<T>::type;
 
-struct
-{
-  template <typename T> constexpr T*
-  operator () (T& arg) const
-  {
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wcast-align"
-    /* https://en.cppreference.com/w/cpp/memory/addressof */
-    return reinterpret_cast<T*> (
-            &const_cast<char&> (
-               reinterpret_cast<const volatile char&> (arg)));
-#pragma GCC diagnostic pop
-  }
-}
-HB_FUNCOBJ (hb_addressof);
-
 template <typename T> static inline T hb_declval ();
 #define hb_declval(T) (hb_declval<T> ())
 
-template <typename T> struct hb_match_const            : hb_type_identity_t<T>, hb_bool_constant<false>{};
-template <typename T> struct hb_match_const<const T>   : hb_type_identity_t<T>, hb_bool_constant<true> {};
+template <typename T> struct hb_match_const            : hb_type_identity_t<T>, hb_false_type  {};
+template <typename T> struct hb_match_const<const T>   : hb_type_identity_t<T>, hb_true_type   {};
 template <typename T> using hb_remove_const = typename hb_match_const<T>::type;
-template <typename T> using hb_add_const = const T;
-#define hb_is_const(T) hb_match_const<T>::value
-template <typename T> struct hb_match_reference                : hb_type_identity_t<T>, hb_bool_constant<false>{};
-template <typename T> struct hb_match_reference<T &>   : hb_type_identity_t<T>, hb_bool_constant<true> {};
-template <typename T> struct hb_match_reference<T &&>  : hb_type_identity_t<T>, hb_bool_constant<true> {};
+
+template <typename T> struct hb_match_reference                : hb_type_identity_t<T>, hb_false_type  {};
+template <typename T> struct hb_match_reference<T &>   : hb_type_identity_t<T>, hb_true_type   {};
+template <typename T> struct hb_match_reference<T &&>  : hb_type_identity_t<T>, hb_true_type   {};
 template <typename T> using hb_remove_reference = typename hb_match_reference<T>::type;
 template <typename T> auto _hb_try_add_lvalue_reference (hb_priority<1>) -> hb_type_identity<T&>;
 template <typename T> auto _hb_try_add_lvalue_reference (hb_priority<0>) -> hb_type_identity<T>;
@@ -112,92 +103,39 @@ template <typename T> using hb_add_lvalue_reference = decltype (_hb_try_add_lval
 template <typename T> auto _hb_try_add_rvalue_reference (hb_priority<1>) -> hb_type_identity<T&&>;
 template <typename T> auto _hb_try_add_rvalue_reference (hb_priority<0>) -> hb_type_identity<T>;
 template <typename T> using hb_add_rvalue_reference = decltype (_hb_try_add_rvalue_reference<T> (hb_prioritize));
-#define hb_is_reference(T) hb_match_reference<T>::value
-template <typename T> struct hb_match_pointer          : hb_type_identity_t<T>, hb_bool_constant<false>{};
-template <typename T> struct hb_match_pointer<T *>     : hb_type_identity_t<T>, hb_bool_constant<true> {};
+
+template <typename T> struct hb_match_pointer          : hb_type_identity_t<T>, hb_false_type  {};
+template <typename T> struct hb_match_pointer<T *>     : hb_type_identity_t<T>, hb_true_type   {};
 template <typename T> using hb_remove_pointer = typename hb_match_pointer<T>::type;
 template <typename T> auto _hb_try_add_pointer (hb_priority<1>) -> hb_type_identity<hb_remove_reference<T>*>;
 template <typename T> auto _hb_try_add_pointer (hb_priority<1>) -> hb_type_identity<T>;
 template <typename T> using hb_add_pointer = decltype (_hb_try_add_pointer<T> (hb_prioritize));
-#define hb_is_pointer(T) hb_match_pointer<T>::value
 
 
 /* TODO Add feature-parity to std::decay. */
 template <typename T> using hb_decay = hb_remove_const<hb_remove_reference<T>>;
 
-
-template<bool B, class T, class F>
-struct _hb_conditional { typedef T type; };
-template<class T, class F>
-struct _hb_conditional<false, T, F> { typedef F type; };
-template<bool B, class T, class F>
-using hb_conditional = typename _hb_conditional<B, T, F>::type;
-
-
-template <typename From, typename To>
-struct hb_is_convertible
-{
-  private:
-  static constexpr bool   from_void = hb_is_same (void, hb_decay<From>);
-  static constexpr bool     to_void = hb_is_same (void, hb_decay<To>  );
-  static constexpr bool either_void = from_void || to_void;
-  static constexpr bool   both_void = from_void && to_void;
-
-  static hb_true_type impl2 (hb_conditional<to_void, int, To>);
-
-  template <typename T>
-  static auto impl (hb_priority<1>) -> decltype (impl2 (hb_declval (T)));
-  template <typename T>
-  static hb_false_type impl (hb_priority<0>);
-  public:
-  static constexpr bool value = both_void ||
-                      (!either_void &&
-                       decltype (impl<hb_conditional<from_void, int, From>> (hb_prioritize))::value);
-};
-#define hb_is_convertible(From,To) hb_is_convertible<From, To>::value
-
-template <typename Base, typename Derived>
-using hb_is_base_of = hb_is_convertible<hb_decay<Derived> *, hb_decay<Base> *>;
-#define hb_is_base_of(Base,Derived) hb_is_base_of<Base, Derived>::value
+#define hb_is_convertible(From,To) std::is_convertible<From, To>::value
 
 template <typename From, typename To>
 using hb_is_cr_convertible = hb_bool_constant<
   hb_is_same (hb_decay<From>, hb_decay<To>) &&
-  (!hb_is_const (From) || hb_is_const (To)) &&
-  (!hb_is_reference (To) || hb_is_const (To) || hb_is_reference (To))
+  (!std::is_const<From>::value || std::is_const<To>::value) &&
+  (!std::is_reference<To>::value || std::is_const<To>::value || std::is_reference<To>::value)
 >;
 #define hb_is_cr_convertible(From,To) hb_is_cr_convertible<From, To>::value
 
-/* std::move and std::forward */
-
-template <typename T>
-static constexpr hb_remove_reference<T>&& hb_move (T&& t) { return (hb_remove_reference<T>&&) (t); }
-
-template <typename T>
-static constexpr T&& hb_forward (hb_remove_reference<T>& t) { return (T&&) t; }
-template <typename T>
-static constexpr T&& hb_forward (hb_remove_reference<T>&& t) { return (T&&) t; }
 
 struct
 {
   template <typename T> constexpr auto
-  operator () (T&& v) const HB_AUTO_RETURN (hb_forward<T> (v))
+  operator () (T&& v) const HB_AUTO_RETURN (std::forward<T> (v))
 
   template <typename T> constexpr auto
   operator () (T *v) const HB_AUTO_RETURN (*v)
 }
 HB_FUNCOBJ (hb_deref);
 
-struct
-{
-  template <typename T> constexpr auto
-  operator () (T&& v) const HB_AUTO_RETURN (hb_forward<T> (v))
-
-  template <typename T> constexpr auto
-  operator () (T& v) const HB_AUTO_RETURN (hb_addressof (v))
-}
-HB_FUNCOBJ (hb_ref);
-
 template <typename T>
 struct hb_reference_wrapper
 {
@@ -211,7 +149,7 @@ struct hb_reference_wrapper
 template <typename T>
 struct hb_reference_wrapper<T&>
 {
-  hb_reference_wrapper (T& v) : v (hb_addressof (v)) {}
+  hb_reference_wrapper (T& v) : v (std::addressof (v)) {}
   bool operator == (const hb_reference_wrapper& o) const { return v == o.v; }
   bool operator != (const hb_reference_wrapper& o) const { return v != o.v; }
   operator T& () const { return *v; }
@@ -220,49 +158,7 @@ struct hb_reference_wrapper<T&>
 };
 
 
-template <typename T>
-using hb_is_integral = hb_bool_constant<
-  hb_is_same (hb_decay<T>, char) ||
-  hb_is_same (hb_decay<T>, signed char) ||
-  hb_is_same (hb_decay<T>, unsigned char) ||
-  hb_is_same (hb_decay<T>, signed int) ||
-  hb_is_same (hb_decay<T>, unsigned int) ||
-  hb_is_same (hb_decay<T>, signed short) ||
-  hb_is_same (hb_decay<T>, unsigned short) ||
-  hb_is_same (hb_decay<T>, signed long) ||
-  hb_is_same (hb_decay<T>, unsigned long) ||
-  hb_is_same (hb_decay<T>, signed long long) ||
-  hb_is_same (hb_decay<T>, unsigned long long) ||
-  false
->;
-#define hb_is_integral(T) hb_is_integral<T>::value
-template <typename T>
-using hb_is_floating_point = hb_bool_constant<
-  hb_is_same (hb_decay<T>, float) ||
-  hb_is_same (hb_decay<T>, double) ||
-  hb_is_same (hb_decay<T>, long double) ||
-  false
->;
-#define hb_is_floating_point(T) hb_is_floating_point<T>::value
-template <typename T>
-using hb_is_arithmetic = hb_bool_constant<
-  hb_is_integral (T) ||
-  hb_is_floating_point (T) ||
-  false
->;
-#define hb_is_arithmetic(T) hb_is_arithmetic<T>::value
-
-
-template <typename T>
-using hb_is_signed = hb_conditional<hb_is_arithmetic (T),
-                                   hb_bool_constant<(T) -1 < (T) 0>,
-                                   hb_false_type>;
-#define hb_is_signed(T) hb_is_signed<T>::value
-template <typename T>
-using hb_is_unsigned = hb_conditional<hb_is_arithmetic (T),
-                                     hb_bool_constant<(T) 0 < (T) -1>,
-                                     hb_false_type>;
-#define hb_is_unsigned(T) hb_is_unsigned<T>::value
+/* Type traits */
 
 template <typename T> struct hb_int_min;
 template <> struct hb_int_min<char>                    : hb_integral_constant<char,                    CHAR_MIN>       {};
@@ -276,6 +172,7 @@ template <> struct hb_int_min<signed long>          : hb_integral_constant<signed long,
 template <> struct hb_int_min<unsigned long>           : hb_integral_constant<unsigned long,           0>              {};
 template <> struct hb_int_min<signed long long>                : hb_integral_constant<signed long long,        LLONG_MIN>      {};
 template <> struct hb_int_min<unsigned long long>      : hb_integral_constant<unsigned long long,      0>              {};
+template <typename T> struct hb_int_min<T *>           : hb_integral_constant<T *,                     nullptr>        {};
 #define hb_int_min(T) hb_int_min<T>::value
 template <typename T> struct hb_int_max;
 template <> struct hb_int_max<char>                    : hb_integral_constant<char,                    CHAR_MAX>       {};
@@ -292,109 +189,15 @@ template <> struct hb_int_max<unsigned long long>        : hb_integral_constant<unsigne
 #define hb_int_max(T) hb_int_max<T>::value
 
 
+/* Class traits. */
 
-template <typename T, typename>
-struct _hb_is_destructible : hb_false_type {};
-template <typename T>
-struct _hb_is_destructible<T, hb_void_t<decltype (hb_declval (T).~T ())>> : hb_true_type {};
-template <typename T>
-using hb_is_destructible = _hb_is_destructible<T, void>;
-#define hb_is_destructible(T) hb_is_destructible<T>::value
-
-template <typename T, typename, typename ...Ts>
-struct _hb_is_constructible : hb_false_type {};
-template <typename T, typename ...Ts>
-struct _hb_is_constructible<T, hb_void_t<decltype (T (hb_declval (Ts)...))>, Ts...> : hb_true_type {};
-template <typename T, typename ...Ts>
-using hb_is_constructible = _hb_is_constructible<T, void, Ts...>;
-#define hb_is_constructible(...) hb_is_constructible<__VA_ARGS__>::value
-
-template <typename T>
-using hb_is_default_constructible = hb_is_constructible<T>;
-#define hb_is_default_constructible(T) hb_is_default_constructible<T>::value
-
-template <typename T>
-using hb_is_copy_constructible = hb_is_constructible<T, hb_add_lvalue_reference<hb_add_const<T>>>;
-#define hb_is_copy_constructible(T) hb_is_copy_constructible<T>::value
-
-template <typename T>
-using hb_is_move_constructible = hb_is_constructible<T, hb_add_rvalue_reference<hb_add_const<T>>>;
-#define hb_is_move_constructible(T) hb_is_move_constructible<T>::value
-
-template <typename T, typename U, typename>
-struct _hb_is_assignable : hb_false_type {};
-template <typename T, typename U>
-struct _hb_is_assignable<T, U, hb_void_t<decltype (hb_declval (T) = hb_declval (U))>> : hb_true_type {};
-template <typename T, typename U>
-using hb_is_assignable = _hb_is_assignable<T, U, void>;
-#define hb_is_assignable(T,U) hb_is_assignable<T, U>::value
-
-template <typename T>
-using hb_is_copy_assignable = hb_is_assignable<hb_add_lvalue_reference<T>,
-                                              hb_add_lvalue_reference<hb_add_const<T>>>;
-#define hb_is_copy_assignable(T) hb_is_copy_assignable<T>::value
-
-template <typename T>
-using hb_is_move_assignable = hb_is_assignable<hb_add_lvalue_reference<T>,
-                                              hb_add_rvalue_reference<T>>;
-#define hb_is_move_assignable(T) hb_is_move_assignable<T>::value
-
-/* Trivial versions. */
-
-template <typename T> union hb_trivial { T value; };
-
-/* Don't know how to do the following. */
-template <typename T>
-using hb_is_trivially_destructible= hb_is_destructible<hb_trivial<T>>;
-#define hb_is_trivially_destructible(T) hb_is_trivially_destructible<T>::value
-
-/* Don't know how to do the following. */
-//template <typename T, typename ...Ts>
-//using hb_is_trivially_constructible= hb_is_constructible<hb_trivial<T>, hb_trivial<Ts>...>;
-//#define hb_is_trivially_constructible(...) hb_is_trivially_constructible<__VA_ARGS__>::value
-
-template <typename T>
-using hb_is_trivially_default_constructible= hb_is_default_constructible<hb_trivial<T>>;
-#define hb_is_trivially_default_constructible(T) hb_is_trivially_default_constructible<T>::value
-
-template <typename T>
-using hb_is_trivially_copy_constructible= hb_is_copy_constructible<hb_trivial<T>>;
-#define hb_is_trivially_copy_constructible(T) hb_is_trivially_copy_constructible<T>::value
-
-template <typename T>
-using hb_is_trivially_move_constructible= hb_is_move_constructible<hb_trivial<T>>;
-#define hb_is_trivially_move_constructible(T) hb_is_trivially_move_constructible<T>::value
-
-/* Don't know how to do the following. */
-//template <typename T, typename U>
-//using hb_is_trivially_assignable= hb_is_assignable<hb_trivial<T>, hb_trivial<U>>;
-//#define hb_is_trivially_assignable(T,U) hb_is_trivially_assignable<T, U>::value
-
-template <typename T>
-using hb_is_trivially_copy_assignable= hb_is_copy_assignable<hb_trivial<T>>;
-#define hb_is_trivially_copy_assignable(T) hb_is_trivially_copy_assignable<T>::value
-
-template <typename T>
-using hb_is_trivially_move_assignable= hb_is_move_assignable<hb_trivial<T>>;
-#define hb_is_trivially_move_assignable(T) hb_is_trivially_move_assignable<T>::value
-
-template <typename T>
-using hb_is_trivially_copyable= hb_bool_constant<
-  hb_is_trivially_destructible (T) &&
-  (!hb_is_move_assignable (T) || hb_is_trivially_move_assignable (T)) &&
-  (!hb_is_move_constructible (T) || hb_is_trivially_move_constructible (T)) &&
-  (!hb_is_copy_assignable (T) || hb_is_trivially_copy_assignable (T)) &&
-  (!hb_is_copy_constructible (T) || hb_is_trivially_copy_constructible (T)) &&
-  true
->;
-#define hb_is_trivially_copyable(T) hb_is_trivially_copyable<T>::value
-
-template <typename T>
-using hb_is_trivial= hb_bool_constant<
-  hb_is_trivially_copyable (T) &&
-  hb_is_trivially_default_constructible (T)
->;
-#define hb_is_trivial(T) hb_is_trivial<T>::value
+#define HB_DELETE_COPY_ASSIGN(TypeName) \
+  TypeName(const TypeName&) = delete; \
+  void operator=(const TypeName&) = delete
+#define HB_DELETE_CREATE_COPY_ASSIGN(TypeName) \
+  TypeName() = delete; \
+  TypeName(const TypeName&) = delete; \
+  void operator=(const TypeName&) = delete
 
 /* hb_unwrap_type (T)
  * If T has no T::type, returns T. Otherwise calls itself on T::type recursively.
diff --git a/src/hb-ms-feature-ranges.hh b/src/hb-ms-feature-ranges.hh
new file mode 100644 (file)
index 0000000..d40fdea
--- /dev/null
@@ -0,0 +1,229 @@
+/*
+ * Copyright © 2011,2012,2013  Google, Inc.
+ * Copyright © 2021  Khaled Hosny
+ *
+ *  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_MS_FEATURE_RANGES_HH
+#define HB_MS_FEATURE_RANGES_HH
+
+#include "hb.hh"
+
+typedef struct hb_ms_feature_t {
+  uint32_t tag_le;
+  uint32_t value;
+} hb_ms_feature_t;
+
+typedef struct hb_ms_features_t {
+  hb_ms_feature_t *features;
+  uint32_t         num_features;
+} hb_ms_features_t;
+
+struct hb_ms_active_feature_t {
+  hb_ms_feature_t fea;
+  unsigned int order;
+
+  HB_INTERNAL static int cmp (const void *pa, const void *pb) {
+    const auto *a = (const hb_ms_active_feature_t *) pa;
+    const auto *b = (const hb_ms_active_feature_t *) pb;
+    return a->fea.tag_le < b->fea.tag_le ? -1 : a->fea.tag_le > b->fea.tag_le ? 1 :
+          a->order < b->order ? -1 : a->order > b->order ? 1 :
+          a->fea.value < b->fea.value ? -1 : a->fea.value > b->fea.value ? 1 :
+          0;
+  }
+  bool operator== (const hb_ms_active_feature_t& f) const
+  { return cmp (this, &f) == 0; }
+};
+
+struct hb_ms_feature_event_t {
+  unsigned int index;
+  bool start;
+  hb_ms_active_feature_t feature;
+
+  HB_INTERNAL static int cmp (const void *pa, const void *pb)
+  {
+    const auto *a = (const hb_ms_feature_event_t *) pa;
+    const auto *b = (const hb_ms_feature_event_t *) pb;
+    return a->index < b->index ? -1 : a->index > b->index ? 1 :
+          a->start < b->start ? -1 : a->start > b->start ? 1 :
+          hb_ms_active_feature_t::cmp (&a->feature, &b->feature);
+  }
+};
+
+struct hb_ms_range_record_t {
+  hb_ms_features_t features;
+  unsigned int index_first; /* == start */
+  unsigned int index_last;  /* == end - 1 */
+};
+
+static inline bool
+hb_ms_setup_features (const hb_feature_t                *features,
+                     unsigned int                       num_features,
+                     hb_vector_t<hb_ms_feature_t>      &feature_records, /* OUT */
+                     hb_vector_t<hb_ms_range_record_t> &range_records /* OUT */)
+{
+  feature_records.shrink(0);
+  range_records.shrink(0);
+
+  /* Sort features by start/end events. */
+  hb_vector_t<hb_ms_feature_event_t> feature_events;
+  for (unsigned int i = 0; i < num_features; i++)
+  {
+    hb_ms_active_feature_t feature;
+    feature.fea.tag_le = hb_uint32_swap (features[i].tag);
+    feature.fea.value = features[i].value;
+    feature.order = i;
+
+    hb_ms_feature_event_t *event;
+
+    event = feature_events.push ();
+    event->index = features[i].start;
+    event->start = true;
+    event->feature = feature;
+
+    event = feature_events.push ();
+    event->index = features[i].end;
+    event->start = false;
+    event->feature = feature;
+  }
+  feature_events.qsort ();
+  /* Add a strategic final event. */
+  {
+    hb_ms_active_feature_t feature;
+    feature.fea.tag_le = 0;
+    feature.fea.value = 0;
+    feature.order = num_features + 1;
+
+    auto *event = feature_events.push ();
+    event->index = 0; /* This value does magic. */
+    event->start = false;
+    event->feature = feature;
+  }
+
+  /* Scan events and save features for each range. */
+  hb_vector_t<hb_ms_active_feature_t> active_features;
+  unsigned int last_index = 0;
+  for (unsigned int i = 0; i < feature_events.length; i++)
+  {
+    auto *event = &feature_events[i];
+
+    if (event->index != last_index)
+    {
+      /* Save a snapshot of active features and the range. */
+      auto *range = range_records.push ();
+      auto offset = feature_records.length;
+
+      active_features.qsort ();
+      for (unsigned int j = 0; j < active_features.length; j++)
+      {
+        if (!j || active_features[j].fea.tag_le != feature_records[feature_records.length - 1].tag_le)
+        {
+          feature_records.push (active_features[j].fea);
+        }
+        else
+        {
+          /* Overrides value for existing feature. */
+          feature_records[feature_records.length - 1].value = active_features[j].fea.value;
+        }
+      }
+
+      /* Will convert to pointer after all is ready, since feature_records.array
+       * may move as we grow it. */
+      range->features.features = reinterpret_cast<hb_ms_feature_t *> (offset);
+      range->features.num_features = feature_records.length - offset;
+      range->index_first = last_index;
+      range->index_last  = event->index - 1;
+
+      last_index = event->index;
+    }
+
+    if (event->start)
+    {
+      active_features.push (event->feature);
+    }
+    else
+    {
+      auto *feature = active_features.lsearch (event->feature);
+      if (feature)
+        active_features.remove (feature - active_features.arrayZ);
+    }
+  }
+
+  if (!range_records.length) /* No active feature found. */
+    num_features = 0;
+
+  /* Fixup the pointers. */
+  for (unsigned int i = 0; i < range_records.length; i++)
+  {
+    auto *range = &range_records[i];
+    range->features.features = (hb_ms_feature_t *) feature_records + reinterpret_cast<uintptr_t> (range->features.features);
+  }
+
+  return !!num_features;
+}
+
+static inline void
+hb_ms_make_feature_ranges (hb_vector_t<hb_ms_feature_t>      &feature_records,
+                          hb_vector_t<hb_ms_range_record_t> &range_records,
+                          unsigned int                       chars_offset,
+                          unsigned int                       chars_len,
+                          uint16_t                          *log_clusters,
+                          hb_vector_t<hb_ms_features_t*>    &range_features, /* OUT */
+                          hb_vector_t<uint32_t>             &range_counts /* OUT */)
+{
+  range_features.shrink (0);
+  range_counts.shrink (0);
+
+  auto *last_range = &range_records[0];
+  for (unsigned int i = chars_offset; i < chars_len; i++)
+  {
+    auto *range = last_range;
+    while (log_clusters[i] < range->index_first)
+      range--;
+    while (log_clusters[i] > range->index_last)
+      range++;
+    if (!range_features.length ||
+        &range->features != range_features[range_features.length - 1])
+    {
+      auto **features = range_features.push ();
+      auto *c = range_counts.push ();
+      if (unlikely (!features || !c))
+      {
+        range_features.shrink (0);
+        range_counts.shrink (0);
+        break;
+      }
+      *features = &range->features;
+      *c = 1;
+    }
+    else
+    {
+      range_counts[range_counts.length - 1]++;
+    }
+
+    last_range = range;
+  }
+}
+
+#endif /* HB_MS_FEATURE_RANGES_HH */
index e7f8b1c..6914b22 100644 (file)
@@ -39,8 +39,7 @@
 
 /* We need external help for these */
 
-#if defined(HB_MUTEX_IMPL_INIT) \
- && defined(hb_mutex_impl_init) \
+#if defined(hb_mutex_impl_init) \
  && defined(hb_mutex_impl_lock) \
  && defined(hb_mutex_impl_unlock) \
  && defined(hb_mutex_impl_finish)
 /* Defined externally, i.e. in config.h; must have typedef'ed hb_mutex_impl_t as well. */
 
 
-#elif !defined(HB_NO_MT) && (defined(HAVE_PTHREAD) || defined(__APPLE__))
+#elif !defined(HB_NO_MT) && !defined(HB_MUTEX_IMPL_STD_MUTEX) && (defined(HAVE_PTHREAD) || defined(__APPLE__))
 
 #include <pthread.h>
 typedef pthread_mutex_t hb_mutex_impl_t;
-#define HB_MUTEX_IMPL_INIT     PTHREAD_MUTEX_INITIALIZER
 #define hb_mutex_impl_init(M)  pthread_mutex_init (M, nullptr)
 #define hb_mutex_impl_lock(M)  pthread_mutex_lock (M)
 #define hb_mutex_impl_unlock(M)        pthread_mutex_unlock (M)
 #define hb_mutex_impl_finish(M)        pthread_mutex_destroy (M)
 
 
-#elif !defined(HB_NO_MT) && defined(_WIN32)
+#elif !defined(HB_NO_MT) && !defined(HB_MUTEX_IMPL_STD_MUTEX) && defined(_WIN32)
 
-#include <windows.h>
 typedef CRITICAL_SECTION hb_mutex_impl_t;
-#define HB_MUTEX_IMPL_INIT     {0}
-#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY==WINAPI_FAMILY_PC_APP || WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP)
+#if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
 #define hb_mutex_impl_init(M)  InitializeCriticalSectionEx (M, 0, 0)
 #else
 #define hb_mutex_impl_init(M)  InitializeCriticalSection (M)
@@ -74,52 +70,40 @@ typedef CRITICAL_SECTION hb_mutex_impl_t;
 #define hb_mutex_impl_finish(M)        DeleteCriticalSection (M)
 
 
-#elif !defined(HB_NO_MT) && defined(HAVE_INTEL_ATOMIC_PRIMITIVES)
+#elif !defined(HB_NO_MT)
 
-#if defined(HAVE_SCHED_H) && defined(HAVE_SCHED_YIELD)
-# include <sched.h>
-# define HB_SCHED_YIELD() sched_yield ()
-#else
-# define HB_SCHED_YIELD() HB_STMT_START {} HB_STMT_END
-#endif
+#include <mutex>
+typedef std::mutex              hb_mutex_impl_t;
+#define hb_mutex_impl_init(M)   HB_STMT_START { new (M) hb_mutex_impl_t; } HB_STMT_END
+#define hb_mutex_impl_lock(M)   (M)->lock ()
+#define hb_mutex_impl_unlock(M) (M)->unlock ()
+#define hb_mutex_impl_finish(M) HB_STMT_START { (M)->~hb_mutex_impl_t(); } HB_STMT_END
 
-/* This actually is not a totally awful implementation. */
-typedef volatile int hb_mutex_impl_t;
-#define HB_MUTEX_IMPL_INIT     0
-#define hb_mutex_impl_init(M)  *(M) = 0
-#define hb_mutex_impl_lock(M)  HB_STMT_START { while (__sync_lock_test_and_set((M), 1)) HB_SCHED_YIELD (); } HB_STMT_END
-#define hb_mutex_impl_unlock(M)        __sync_lock_release (M)
-#define hb_mutex_impl_finish(M)        HB_STMT_START {} HB_STMT_END
 
-
-#elif defined(HB_NO_MT)
+#else /* defined(HB_NO_MT) */
 
 typedef int hb_mutex_impl_t;
-#define HB_MUTEX_IMPL_INIT     0
 #define hb_mutex_impl_init(M)  HB_STMT_START {} HB_STMT_END
 #define hb_mutex_impl_lock(M)  HB_STMT_START {} HB_STMT_END
 #define hb_mutex_impl_unlock(M)        HB_STMT_START {} HB_STMT_END
 #define hb_mutex_impl_finish(M)        HB_STMT_START {} HB_STMT_END
 
 
-#else
-
-#error "Could not find any system to define mutex macros."
-#error "Check hb-mutex.hh for possible resolutions."
-
 #endif
 
 
-#define HB_MUTEX_INIT          {HB_MUTEX_IMPL_INIT}
-
 struct hb_mutex_t
 {
-  hb_mutex_impl_t m;
-
-  void init   () { hb_mutex_impl_init   (&m); }
-  void lock   () { hb_mutex_impl_lock   (&m); }
-  void unlock () { hb_mutex_impl_unlock (&m); }
-  void fini ()   { hb_mutex_impl_finish (&m); }
+  /* Create space for, but do not initialize m. */
+  alignas(hb_mutex_impl_t) char m[sizeof (hb_mutex_impl_t)];
+
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wcast-align"
+  void init   () { hb_mutex_impl_init   ((hb_mutex_impl_t *) m); }
+  void lock   () { hb_mutex_impl_lock   ((hb_mutex_impl_t *) m); }
+  void unlock () { hb_mutex_impl_unlock ((hb_mutex_impl_t *) m); }
+  void fini   () { hb_mutex_impl_finish ((hb_mutex_impl_t *) m); }
+#pragma GCC diagnostic pop
 };
 
 struct hb_lock_t
index 9853939..db38a4d 100644 (file)
 
 #define HB_NULL_POOL_SIZE 384
 
-/* Use SFINAE to sniff whether T has min_size; in which case return T::null_size,
- * otherwise return sizeof(T). */
+/* Use SFINAE to sniff whether T has min_size; in which case return the larger
+ * of sizeof(T) and T::null_size, otherwise return sizeof(T).
+ *
+ * The main purpose of this is to let structs communicate that they are not nullable,
+ * by defining min_size but *not* null_size. */
 
 /* The hard way...
  * https://stackoverflow.com/questions/7776448/sfinae-tried-with-bool-gives-compiler-error-template-argument-tvalue-invol
@@ -49,8 +52,9 @@
 template <typename T, typename>
 struct _hb_null_size : hb_integral_constant<unsigned, sizeof (T)> {};
 template <typename T>
-struct _hb_null_size<T, hb_void_t<decltype (T::min_size)>> : hb_integral_constant<unsigned, T::null_size> {};
-
+struct _hb_null_size<T, hb_void_t<decltype (T::min_size)>>
+       : hb_integral_constant<unsigned,
+                              (sizeof (T) > T::null_size ? sizeof (T) : T::null_size)> {};
 template <typename T>
 using hb_null_size = _hb_null_size<T, void>;
 #define hb_null_size(T) hb_null_size<T>::value
@@ -68,6 +72,14 @@ template <typename T>
 using hb_static_size = _hb_static_size<T, void>;
 #define hb_static_size(T) hb_static_size<T>::value
 
+template <typename T, typename>
+struct _hb_min_size : hb_integral_constant<unsigned, sizeof (T)> {};
+template <typename T>
+struct _hb_min_size<T, hb_void_t<decltype (T::min_size)>> : hb_integral_constant<unsigned, T::min_size> {};
+template <typename T>
+using hb_min_size = _hb_min_size<T, void>;
+#define hb_min_size(T) hb_min_size<T>::value
+
 
 /*
  * Null()
@@ -177,6 +189,7 @@ struct hb_nonnull_ptr_t
   T * get () const { return v ? v : const_cast<T *> (&Null (T)); }
   T * get_raw () const { return v; }
 
+  private:
   T *v;
 };
 
index c470532..4b5bc32 100644 (file)
@@ -53,7 +53,7 @@ struct hb_lockable_set_t
   item_t *replace_or_insert (T v, lock_t &l, bool replace)
   {
     l.lock ();
-    item_t *item = items.find (v);
+    item_t *item = items.lsearch (v);
     if (item) {
       if (replace) {
        item_t old = *item;
@@ -76,7 +76,7 @@ struct hb_lockable_set_t
   void remove (T v, lock_t &l)
   {
     l.lock ();
-    item_t *item = items.find (v);
+    item_t *item = items.lsearch (v);
     if (item)
     {
       item_t old = *item;
@@ -93,7 +93,7 @@ struct hb_lockable_set_t
   bool find (T v, item_t *i, lock_t &l)
   {
     l.lock ();
-    item_t *item = items.find (v);
+    item_t *item = items.lsearch (v);
     if (item)
       *i = *item;
     l.unlock ();
@@ -140,10 +140,6 @@ struct hb_lockable_set_t
  * Reference-count.
  */
 
-#define HB_REFERENCE_COUNT_INERT_VALUE 0
-#define HB_REFERENCE_COUNT_POISON_VALUE -0x0000DEAD
-#define HB_REFERENCE_COUNT_INIT {HB_ATOMIC_INT_INIT (HB_REFERENCE_COUNT_INERT_VALUE)}
-
 struct hb_reference_count_t
 {
   mutable hb_atomic_int_t ref_count;
@@ -152,9 +148,9 @@ struct hb_reference_count_t
   int get_relaxed () const { return ref_count.get_relaxed (); }
   int inc () const { return ref_count.inc (); }
   int dec () const { return ref_count.dec (); }
-  void fini () { ref_count.set_relaxed (HB_REFERENCE_COUNT_POISON_VALUE); }
+  void fini () { ref_count.set_relaxed (-0x0000DEAD); }
 
-  bool is_inert () const { return ref_count.get_relaxed () == HB_REFERENCE_COUNT_INERT_VALUE; }
+  bool is_inert () const { return !ref_count.get_relaxed (); }
   bool is_valid () const { return ref_count.get_relaxed () > 0; }
 };
 
@@ -168,8 +164,8 @@ struct hb_user_data_array_t
     void *data;
     hb_destroy_func_t destroy;
 
-    bool operator == (hb_user_data_key_t *other_key) const { return key == other_key; }
-    bool operator == (hb_user_data_item_t &other) const { return key == other.key; }
+    bool operator == (const hb_user_data_key_t *other_key) const { return key == other_key; }
+    bool operator == (const hb_user_data_item_t &other) const { return key == other.key; }
 
     void fini () { if (destroy) destroy (data); }
   };
@@ -197,15 +193,12 @@ struct hb_user_data_array_t
 struct hb_object_header_t
 {
   hb_reference_count_t ref_count;
-  mutable hb_atomic_int_t writable;
+  mutable hb_atomic_int_t writable = 0;
   hb_atomic_ptr_t<hb_user_data_array_t> user_data;
+
+  bool is_inert () const { return !ref_count.get_relaxed (); }
 };
-#define HB_OBJECT_HEADER_STATIC \
-       { \
-         HB_REFERENCE_COUNT_INIT, \
-         HB_ATOMIC_INT_INIT (false), \
-         HB_ATOMIC_PTR_INIT (nullptr) \
-       }
+#define HB_OBJECT_HEADER_STATIC {}
 
 
 /*
@@ -224,7 +217,7 @@ static inline void hb_object_trace (const Type *obj, const char *function)
 template <typename Type>
 static inline Type *hb_object_create ()
 {
-  Type *obj = (Type *) calloc (1, sizeof (Type));
+  Type *obj = (Type *) hb_calloc (1, sizeof (Type));
 
   if (unlikely (!obj))
     return obj;
@@ -241,11 +234,6 @@ static inline void hb_object_init (Type *obj)
   obj->header.user_data.init ();
 }
 template <typename Type>
-static inline bool hb_object_is_inert (const Type *obj)
-{
-  return unlikely (obj->header.ref_count.is_inert ());
-}
-template <typename Type>
 static inline bool hb_object_is_valid (const Type *obj)
 {
   return likely (obj->header.ref_count.is_valid ());
@@ -264,7 +252,7 @@ template <typename Type>
 static inline Type *hb_object_reference (Type *obj)
 {
   hb_object_trace (obj, HB_FUNC);
-  if (unlikely (!obj || hb_object_is_inert (obj)))
+  if (unlikely (!obj || obj->header.is_inert ()))
     return obj;
   assert (hb_object_is_valid (obj));
   obj->header.ref_count.inc ();
@@ -274,7 +262,7 @@ template <typename Type>
 static inline bool hb_object_destroy (Type *obj)
 {
   hb_object_trace (obj, HB_FUNC);
-  if (unlikely (!obj || hb_object_is_inert (obj)))
+  if (unlikely (!obj || obj->header.is_inert ()))
     return false;
   assert (hb_object_is_valid (obj));
   if (obj->header.ref_count.dec () != 1)
@@ -291,7 +279,7 @@ static inline void hb_object_fini (Type *obj)
   if (user_data)
   {
     user_data->fini ();
-    free (user_data);
+    hb_free (user_data);
     user_data = nullptr;
   }
 }
@@ -302,7 +290,7 @@ static inline bool hb_object_set_user_data (Type               *obj,
                                            hb_destroy_func_t   destroy,
                                            hb_bool_t           replace)
 {
-  if (unlikely (!obj || hb_object_is_inert (obj)))
+  if (unlikely (!obj || obj->header.is_inert ()))
     return false;
   assert (hb_object_is_valid (obj));
 
@@ -310,14 +298,14 @@ retry:
   hb_user_data_array_t *user_data = obj->header.user_data.get ();
   if (unlikely (!user_data))
   {
-    user_data = (hb_user_data_array_t *) calloc (sizeof (hb_user_data_array_t), 1);
+    user_data = (hb_user_data_array_t *) hb_calloc (sizeof (hb_user_data_array_t), 1);
     if (unlikely (!user_data))
       return false;
     user_data->init ();
     if (unlikely (!obj->header.user_data.cmpexch (nullptr, user_data)))
     {
       user_data->fini ();
-      free (user_data);
+      hb_free (user_data);
       goto retry;
     }
   }
@@ -329,7 +317,7 @@ template <typename Type>
 static inline void *hb_object_get_user_data (Type               *obj,
                                             hb_user_data_key_t *key)
 {
-  if (unlikely (!obj || hb_object_is_inert (obj)))
+  if (unlikely (!obj || obj->header.is_inert ()))
     return nullptr;
   assert (hb_object_is_valid (obj));
   hb_user_data_array_t *user_data = obj->header.user_data.get ();
index 2f01ce9..6eee582 100644 (file)
@@ -35,7 +35,6 @@
 
 namespace OT {
 
-
 /*
  *
  * The OpenType Font File
@@ -48,7 +47,7 @@ namespace OT {
  */
 
 struct OpenTypeFontFile;
-struct OffsetTable;
+struct OpenTypeOffsetTable;
 struct TTCHeader;
 
 
@@ -78,7 +77,7 @@ typedef struct TableRecord
   DEFINE_SIZE_STATIC (16);
 } OpenTypeTable;
 
-typedef struct OffsetTable
+typedef struct OpenTypeOffsetTable
 {
   friend struct OpenTypeFontFile;
 
@@ -91,15 +90,10 @@ typedef struct OffsetTable
   {
     if (table_count)
     {
-      if (start_offset >= tables.len)
-       *table_count = 0;
-      else
-       *table_count = hb_min (*table_count, tables.len - start_offset);
-
-      const TableRecord *sub_tables = tables.arrayZ + start_offset;
-      unsigned int count = *table_count;
-      for (unsigned int i = 0; i < count; i++)
-       table_tags[i] = sub_tables[i].tag;
+      + tables.sub_array (start_offset, table_count)
+      | hb_map (&TableRecord::tag)
+      | hb_sink (hb_array (table_tags, *table_count))
+      ;
     }
     return tables.len;
   }
@@ -107,7 +101,13 @@ typedef struct OffsetTable
   {
     Tag t;
     t = tag;
-    return tables.bfind (t, table_index, HB_BFIND_NOT_FOUND_STORE, Index::NOT_FOUND_INDEX);
+    /* Use lfind for small fonts; there are fonts that have unsorted table entries;
+     * those tend to work in other tools, so tolerate them.
+     * https://github.com/harfbuzz/harfbuzz/issues/3065 */
+    if (tables.len < 16)
+      return tables.lfind (t, table_index, HB_NOT_FOUND_STORE, Index::NOT_FOUND_INDEX);
+    else
+      return tables.bfind (t, table_index, HB_NOT_FOUND_STORE, Index::NOT_FOUND_INDEX);
   }
   const TableRecord& get_table_by_tag (hb_tag_t tag) const
   {
@@ -118,44 +118,53 @@ typedef struct OffsetTable
 
   public:
 
-  template <typename item_t>
+  template <typename Iterator,
+           hb_requires ((hb_is_source_of<Iterator, hb_pair_t<hb_tag_t, hb_blob_t *>>::value))>
   bool serialize (hb_serialize_context_t *c,
                  hb_tag_t sfnt_tag,
-                 hb_array_t<item_t> items)
+                 Iterator it)
   {
     TRACE_SERIALIZE (this);
     /* Alloc 12 for the OTHeader. */
-    if (unlikely (!c->extend_min (*this))) return_trace (false);
+    if (unlikely (!c->extend_min (this))) return_trace (false);
     /* Write sfntVersion (bytes 0..3). */
     sfnt_version = sfnt_tag;
     /* Take space for numTables, searchRange, entrySelector, RangeShift
      * and the TableRecords themselves.  */
-    if (unlikely (!tables.serialize (c, items.length))) return_trace (false);
+    unsigned num_items = it.len ();
+    if (unlikely (!tables.serialize (c, num_items))) return_trace (false);
 
     const char *dir_end = (const char *) c->head;
     HBUINT32 *checksum_adjustment = nullptr;
 
     /* Write OffsetTables, alloc for and write actual table blobs. */
-    for (unsigned int i = 0; i < tables.len; i++)
+    unsigned i = 0;
+    for (hb_pair_t<hb_tag_t, hb_blob_t*> entry : it)
     {
-      TableRecord &rec = tables.arrayZ[i];
-      hb_blob_t *blob = items[i].blob;
-      rec.tag = items[i].tag;
-      rec.length = blob->length;
-      rec.offset.serialize (c, this);
+      hb_blob_t *blob = entry.second;
+      unsigned len = blob->length;
 
       /* Allocate room for the table and copy it. */
-      char *start = (char *) c->allocate_size<void> (rec.length);
+      char *start = (char *) c->allocate_size<void> (len);
       if (unlikely (!start)) return false;
 
-      if (likely (rec.length))
-       memcpy (start, blob->data, rec.length);
+      TableRecord &rec = tables.arrayZ[i];
+      rec.tag = entry.first;
+      rec.length = len;
+      rec.offset = 0;
+      if (unlikely (!c->check_assign (rec.offset,
+                                     (unsigned) ((char *) start - (char *) this),
+                                     HB_SERIALIZE_ERROR_OFFSET_OVERFLOW)))
+        return_trace (false);
+
+      if (likely (len))
+       memcpy (start, blob->data, len);
 
       /* 4-byte alignment. */
       c->align (4);
       const char *end = (const char *) c->head;
 
-      if (items[i].tag == HB_OT_TAG_head &&
+      if (entry.first == HB_OT_TAG_head &&
          (unsigned) (end - start) >= head::static_size)
       {
        head *h = (head *) start;
@@ -164,6 +173,7 @@ typedef struct OffsetTable
       }
 
       rec.checkSum.set_for_data (start, end - start);
+      i++;
     }
 
     tables.qsort ();
@@ -175,7 +185,7 @@ typedef struct OffsetTable
       /* The following line is a slower version of the following block. */
       //checksum.set_for_data (this, (const char *) c->head - (const char *) this);
       checksum.set_for_data (this, dir_end - (const char *) this);
-      for (unsigned int i = 0; i < items.length; i++)
+      for (unsigned int i = 0; i < num_items; i++)
       {
        TableRecord &rec = tables.arrayZ[i];
        checksum = checksum + rec.checkSum;
@@ -223,7 +233,7 @@ struct TTCHeaderVersion1
   Tag          ttcTag;         /* TrueType Collection ID string: 'ttcf' */
   FixedVersion<>version;       /* Version of the TTC Header (1.0),
                                 * 0x00010000u */
-  LArrayOf<LOffsetTo<OffsetTable>>
+  Array32Of<Offset32To<OpenTypeOffsetTable>>
                table;          /* Array of offsets to the OffsetTable for each font
                                 * from the beginning of the file */
   public:
@@ -300,7 +310,7 @@ struct ResourceRecord
   HBINT16      nameOffset;     /* Offset from beginning of resource name list
                                 * to resource name, -1 means there is none. */
   HBUINT8      attrs;          /* Resource attributes */
-  NNOffsetTo<LArrayOf<HBUINT8>, HBUINT24>
+  NNOffset24To<Array32Of<HBUINT8>>
                offset;         /* Offset from beginning of data block to
                                 * data for this resource */
   HBUINT32     reserved;       /* Reserved for handle to resource */
@@ -335,7 +345,7 @@ struct ResourceTypeRecord
   protected:
   Tag          tag;            /* Resource type. */
   HBUINT16     resCountM1;     /* Number of resources minus 1. */
-  NNOffsetTo<UnsizedArrayOf<ResourceRecord>>
+  NNOffset16To<UnsizedArrayOf<ResourceRecord>>
                resourcesZ;     /* Offset from beginning of resource type list
                                 * to reference item list for this type. */
   public:
@@ -391,7 +401,7 @@ struct ResourceMap
   HBUINT32     reserved1;      /* Reserved for handle to next resource map */
   HBUINT16     resreved2;      /* Reserved for file reference number */
   HBUINT16     attrs;          /* Resource fork attribute */
-  NNOffsetTo<ArrayOfM1<ResourceTypeRecord>>
+  NNOffset16To<ArrayOfM1<ResourceTypeRecord>>
                typeList;       /* Offset from beginning of map to
                                 * resource type list */
   Offset16     nameList;       /* Offset from beginning of map to
@@ -423,10 +433,10 @@ struct ResourceForkHeader
   }
 
   protected:
-  LNNOffsetTo<UnsizedArrayOf<HBUINT8>>
+  NNOffset32To<UnsizedArrayOf<HBUINT8>>
                data;           /* Offset from beginning of resource fork
                                 * to resource data */
-  LNNOffsetTo<ResourceMap >
+  NNOffset32To<ResourceMap >
                map;            /* Offset from beginning of resource fork
                                 * to resource map */
   HBUINT32     dataLen;        /* Length of resource data */
@@ -482,14 +492,15 @@ struct OpenTypeFontFile
     }
   }
 
-  template <typename item_t>
+  template <typename Iterator,
+           hb_requires ((hb_is_source_of<Iterator, hb_pair_t<hb_tag_t, hb_blob_t *>>::value))>
   bool serialize_single (hb_serialize_context_t *c,
                         hb_tag_t sfnt_tag,
-                        hb_array_t<item_t> items)
+                        Iterator items)
   {
     TRACE_SERIALIZE (this);
     assert (sfnt_tag != TTCTag);
-    if (unlikely (!c->extend_min (*this))) return_trace (false);
+    if (unlikely (!c->extend_min (this))) return_trace (false);
     return_trace (u.fontFace.serialize (c, sfnt_tag, items));
   }
 
index fee71df..7e52417 100644 (file)
@@ -53,14 +53,19 @@ namespace OT {
  */
 
 /* Integer types in big-endian order and no alignment requirement */
-template <typename Type, unsigned int Size>
+template <typename Type,
+         unsigned int Size = sizeof (Type)>
 struct IntType
 {
   typedef Type type;
-  typedef hb_conditional<hb_is_signed (Type), signed, unsigned> wide_type;
 
-  IntType& operator = (wide_type i) { v = i; return *this; }
-  operator wide_type () const { return v; }
+  IntType () = default;
+  explicit constexpr IntType (Type V) : v {V} {}
+  IntType& operator = (Type i) { v = i; return *this; }
+  /* For reason we define cast out operator for signed/unsigned, instead of Type, see:
+   * https://github.com/harfbuzz/harfbuzz/pull/2875/commits/09836013995cab2b9f07577a179ad7b024130467 */
+  operator typename std::conditional<std::is_signed<Type>::value, signed, unsigned>::type () const { return v; }
+
   bool operator == (const IntType &o) const { return (Type) v == (Type) o.v; }
   bool operator != (const IntType &o) const { return !(*this == o); }
 
@@ -80,14 +85,21 @@ struct IntType
 
     return pb->cmp (*pa);
   }
-  template <typename Type2>
+  template <typename Type2,
+           hb_enable_if (std::is_integral<Type2>::value &&
+                         sizeof (Type2) < sizeof (int) &&
+                         sizeof (Type) < sizeof (int))>
   int cmp (Type2 a) const
   {
     Type b = v;
-    if (sizeof (Type) < sizeof (int) && sizeof (Type2) < sizeof (int))
-      return (int) a - (int) b;
-    else
-      return a < b ? -1 : a == b ? 0 : +1;
+    return (int) a - (int) b;
+  }
+  template <typename Type2,
+           hb_enable_if (hb_is_convertible (Type2, Type))>
+  int cmp (Type2 a) const
+  {
+    Type b = v;
+    return a < b ? -1 : a == b ? 0 : +1;
   }
   bool sanitize (hb_sanitize_context_t *c) const
   {
@@ -100,16 +112,25 @@ struct IntType
   DEFINE_SIZE_STATIC (Size);
 };
 
-typedef IntType<uint8_t,  1> HBUINT8;  /* 8-bit unsigned integer. */
-typedef IntType<int8_t,   1> HBINT8;   /* 8-bit signed integer. */
-typedef IntType<uint16_t, 2> HBUINT16; /* 16-bit unsigned integer. */
-typedef IntType<int16_t,  2> HBINT16;  /* 16-bit signed integer. */
-typedef IntType<uint32_t, 4> HBUINT32; /* 32-bit unsigned integer. */
-typedef IntType<int32_t,  4> HBINT32;  /* 32-bit signed integer. */
+typedef IntType<uint8_t>  HBUINT8;     /* 8-bit unsigned integer. */
+typedef IntType<int8_t>   HBINT8;      /* 8-bit signed integer. */
+typedef IntType<uint16_t> HBUINT16;    /* 16-bit unsigned integer. */
+typedef IntType<int16_t>  HBINT16;     /* 16-bit signed integer. */
+typedef IntType<uint32_t> HBUINT32;    /* 32-bit unsigned integer. */
+typedef IntType<int32_t>  HBINT32;     /* 32-bit signed integer. */
 /* Note: we cannot defined a signed HBINT24 because there's no corresponding C type.
  * Works for unsigned, but not signed, since we rely on compiler for sign-extension. */
 typedef IntType<uint32_t, 3> HBUINT24; /* 24-bit unsigned integer. */
 
+/* 15-bit unsigned number; top bit used for extension. */
+struct HBUINT15 : HBUINT16
+{
+  /* TODO Flesh out; actually mask top bit. */
+  HBUINT15& operator = (uint16_t i ) { HBUINT16::operator= (i); return *this; }
+  public:
+  DEFINE_SIZE_STATIC (2);
+};
+
 /* 16-bit signed integer (HBINT16) that describes a quantity in FUnits. */
 typedef HBINT16 FWORD;
 
@@ -163,16 +184,16 @@ struct Tag : HBUINT32
 {
   Tag& operator = (hb_tag_t i) { HBUINT32::operator= (i); return *this; }
   /* What the char* converters return is NOT nul-terminated.  Print using "%.4s" */
-  operator const char* () const { return reinterpret_cast<const char *> (&this->v); }
-  operator char* ()             { return reinterpret_cast<char *> (&this->v); }
+  operator const char* () const { return reinterpret_cast<const char *> (this); }
+  operator char* ()             { return reinterpret_cast<char *> (this); }
   public:
   DEFINE_SIZE_STATIC (4);
 };
 
 /* Glyph index number, same as uint16 (length = 16 bits) */
-struct HBGlyphID : HBUINT16
+struct HBGlyphID16 : HBUINT16
 {
-  HBGlyphID& operator = (uint16_t i) { HBUINT16::operator= (i); return *this; }
+  HBGlyphID16& operator = (uint16_t i) { HBUINT16::operator= (i); return *this; }
 };
 
 /* Script/language-system/feature index */
@@ -184,6 +205,12 @@ DECLARE_NULL_NAMESPACE_BYTES (OT, Index);
 
 typedef Index NameID;
 
+struct VarIdx : HBUINT32 {
+  static constexpr unsigned NO_VARIATION = 0xFFFFFFFFu;
+  VarIdx& operator = (uint32_t i) { HBUINT32::operator= (i); return *this; }
+};
+DECLARE_NULL_NAMESPACE_BYTES (OT, VarIdx);
+
 /* Offset, Null offset = 0 */
 template <typename Type, bool has_null=true>
 struct Offset : Type
@@ -194,18 +221,12 @@ struct Offset : Type
 
   bool is_null () const { return has_null && 0 == *this; }
 
-  void *serialize (hb_serialize_context_t *c, const void *base)
-  {
-    void *t = c->start_embed<void> ();
-    c->check_assign (*this, (unsigned) ((char *) t - (char *) base));
-    return t;
-  }
-
   public:
   DEFINE_SIZE_STATIC (sizeof (Type));
 };
 
 typedef Offset<HBUINT16> Offset16;
+typedef Offset<HBUINT24> Offset24;
 typedef Offset<HBUINT32> Offset32;
 
 
@@ -275,7 +296,7 @@ struct _hb_has_null<Type, true>
   static       Type *get_crap () { return &Crap (Type); }
 };
 
-template <typename Type, typename OffsetType=HBUINT16, bool has_null=true>
+template <typename Type, typename OffsetType, bool has_null=true>
 struct OffsetTo : Offset<OffsetType, has_null>
 {
   HB_DELETE_COPY_ASSIGN (OffsetTo);
@@ -307,10 +328,6 @@ struct OffsetTo : Offset<OffsetType, has_null>
            hb_enable_if (hb_is_convertible (Base, void *))>
   friend Type& operator + (OffsetTo &offset, Base &&base) { return offset ((void *) base); }
 
-  Type& serialize (hb_serialize_context_t *c, const void *base)
-  {
-    return * (Type *) Offset<OffsetType>::serialize (c, base);
-  }
 
   template <typename ...Ts>
   bool serialize_subset (hb_subset_context_t *c, const OffsetTo& src,
@@ -324,7 +341,7 @@ struct OffsetTo : Offset<OffsetType, has_null>
 
     s->push ();
 
-    bool ret = c->dispatch (src_base+src, hb_forward<Ts> (ds)...);
+    bool ret = c->dispatch (src_base+src, std::forward<Ts> (ds)...);
 
     if (ret || !has_null)
       s->add_link (*this, s->pop_pack ());
@@ -334,6 +351,23 @@ struct OffsetTo : Offset<OffsetType, has_null>
     return ret;
   }
 
+
+  template <typename ...Ts>
+  bool serialize_serialize (hb_serialize_context_t *c, Ts&&... ds)
+  {
+    *this = 0;
+
+    Type* obj = c->push<Type> ();
+    bool ret = obj->serialize (c, std::forward<Ts> (ds)...);
+
+    if (ret)
+      c->add_link (*this, c->pop_pack ());
+    else
+      c->pop_discard ();
+
+    return ret;
+  }
+
   /* TODO: Somehow merge this with previous function into a serialize_dispatch(). */
   /* Workaround clang bug: https://bugs.llvm.org/show_bug.cgi?id=23029
    * Can't compile: whence = hb_serialize_context_t::Head followed by Ts&&...
@@ -350,7 +384,7 @@ struct OffsetTo : Offset<OffsetType, has_null>
 
     c->push ();
 
-    bool ret = c->copy (src_base+src, hb_forward<Ts> (ds)...);
+    bool ret = c->copy (src_base+src, std::forward<Ts> (ds)...);
 
     c->add_link (*this, c->pop_pack (), whence, dst_bias);
 
@@ -366,7 +400,7 @@ struct OffsetTo : Offset<OffsetType, has_null>
     TRACE_SANITIZE (this);
     if (unlikely (!c->check_struct (this))) return_trace (false);
     if (unlikely (this->is_null ())) return_trace (true);
-    if (unlikely (!c->check_range (base, *this))) return_trace (false);
+    if (unlikely ((const char *) base + (unsigned) *this < (const char *) base)) return_trace (false);
     return_trace (true);
   }
 
@@ -376,7 +410,7 @@ struct OffsetTo : Offset<OffsetType, has_null>
     TRACE_SANITIZE (this);
     return_trace (sanitize_shallow (c, base) &&
                  (this->is_null () ||
-                  c->dispatch (StructAtOffset<Type> (base, *this), hb_forward<Ts> (ds)...) ||
+                  c->dispatch (StructAtOffset<Type> (base, *this), std::forward<Ts> (ds)...) ||
                   neuter (c)));
   }
 
@@ -389,12 +423,14 @@ struct OffsetTo : Offset<OffsetType, has_null>
   DEFINE_SIZE_STATIC (sizeof (OffsetType));
 };
 /* Partial specializations. */
-template <typename Type, bool has_null=true>
-using LOffsetTo = OffsetTo<Type, HBUINT32, has_null>;
-template <typename Type, typename OffsetType=HBUINT16>
-using NNOffsetTo = OffsetTo<Type, OffsetType, false>;
-template <typename Type>
-using LNNOffsetTo = LOffsetTo<Type, false>;
+template <typename Type, bool has_null=true> using Offset16To = OffsetTo<Type, HBUINT16, has_null>;
+template <typename Type, bool has_null=true> using Offset24To = OffsetTo<Type, HBUINT24, has_null>;
+template <typename Type, bool has_null=true> using Offset32To = OffsetTo<Type, HBUINT32, has_null>;
+
+template <typename Type, typename OffsetType> using NNOffsetTo = OffsetTo<Type, OffsetType, false>;
+template <typename Type> using NNOffset16To = Offset16To<Type, false>;
+template <typename Type> using NNOffset24To = Offset24To<Type, false>;
+template <typename Type> using NNOffset32To = Offset32To<Type, false>;
 
 
 /*
@@ -433,8 +469,6 @@ struct UnsizedArrayOf
   { return hb_array (arrayZ, len); }
   hb_array_t<const Type> as_array (unsigned int len) const
   { return hb_array (arrayZ, len); }
-  operator hb_array_t<      Type> ()       { return as_array (); }
-  operator hb_array_t<const Type> () const { return as_array (); }
 
   template <typename T>
   Type &lsearch (unsigned int len, const T &x, Type &not_found = Crap (Type))
@@ -442,6 +476,11 @@ struct UnsizedArrayOf
   template <typename T>
   const Type &lsearch (unsigned int len, const T &x, const Type &not_found = Null (Type)) const
   { return *as_array (len).lsearch (x, &not_found); }
+  template <typename T>
+  bool lfind (unsigned int len, const T &x, unsigned int *i = nullptr,
+             hb_not_found_t not_found = HB_NOT_FOUND_DONT_STORE,
+             unsigned int to_store = (unsigned int) -1) const
+  { return as_array (len).lfind (x, i, not_found, to_store); }
 
   void qsort (unsigned int len, unsigned int start = 0, unsigned int end = (unsigned int) -1)
   { as_array (len).qsort (start, end); }
@@ -449,7 +488,7 @@ struct UnsizedArrayOf
   bool serialize (hb_serialize_context_t *c, unsigned int items_len)
   {
     TRACE_SERIALIZE (this);
-    if (unlikely (!c->extend (*this, items_len))) return_trace (false);
+    if (unlikely (!c->extend (this, items_len))) return_trace (false);
     return_trace (true);
   }
   template <typename Iterator,
@@ -479,9 +518,9 @@ struct UnsizedArrayOf
   {
     TRACE_SANITIZE (this);
     if (unlikely (!sanitize_shallow (c, count))) return_trace (false);
-    if (!sizeof... (Ts) && hb_is_trivially_copyable (Type)) return_trace (true);
+    if (!sizeof... (Ts) && std::is_trivially_copyable<Type>::value) return_trace (true);
     for (unsigned int i = 0; i < count; i++)
-      if (unlikely (!c->dispatch (arrayZ[i], hb_forward<Ts> (ds)...)))
+      if (unlikely (!c->dispatch (arrayZ[i], std::forward<Ts> (ds)...)))
        return_trace (false);
     return_trace (true);
   }
@@ -500,11 +539,11 @@ struct UnsizedArrayOf
 
 /* Unsized array of offset's */
 template <typename Type, typename OffsetType, bool has_null=true>
-using UnsizedOffsetArrayOf = UnsizedArrayOf<OffsetTo<Type, OffsetType, has_null>>;
+using UnsizedArray16OfOffsetTo = UnsizedArrayOf<OffsetTo<Type, OffsetType, has_null>>;
 
 /* Unsized array of offsets relative to the beginning of the array itself. */
 template <typename Type, typename OffsetType, bool has_null=true>
-struct UnsizedOffsetListOf : UnsizedOffsetArrayOf<Type, OffsetType, has_null>
+struct UnsizedListOfOffset16To : UnsizedArray16OfOffsetTo<Type, OffsetType, has_null>
 {
   const Type& operator [] (int i_) const
   {
@@ -525,8 +564,8 @@ struct UnsizedOffsetListOf : UnsizedOffsetArrayOf<Type, OffsetType, has_null>
   bool sanitize (hb_sanitize_context_t *c, unsigned int count, Ts&&... ds) const
   {
     TRACE_SANITIZE (this);
-    return_trace ((UnsizedOffsetArrayOf<Type, OffsetType, has_null>
-                  ::sanitize (c, count, this, hb_forward<Ts> (ds)...)));
+    return_trace ((UnsizedArray16OfOffsetTo<Type, OffsetType, has_null>
+                  ::sanitize (c, count, this, std::forward<Ts> (ds)...)));
   }
 };
 
@@ -549,14 +588,14 @@ struct SortedUnsizedArrayOf : UnsizedArrayOf<Type>
   { return *as_array (len).bsearch (x, &not_found); }
   template <typename T>
   bool bfind (unsigned int len, const T &x, unsigned int *i = nullptr,
-                    hb_bfind_not_found_t not_found = HB_BFIND_NOT_FOUND_DONT_STORE,
-                    unsigned int to_store = (unsigned int) -1) const
+             hb_not_found_t not_found = HB_NOT_FOUND_DONT_STORE,
+             unsigned int to_store = (unsigned int) -1) const
   { return as_array (len).bfind (x, i, not_found, to_store); }
 };
 
 
 /* An array with a number of elements. */
-template <typename Type, typename LenType=HBUINT16>
+template <typename Type, typename LenType>
 struct ArrayOf
 {
   typedef Type item_t;
@@ -604,17 +643,32 @@ struct ArrayOf
   hb_array_t<Type> sub_array (unsigned int start_offset, unsigned int *count = nullptr /* IN/OUT */)
   { return as_array ().sub_array (start_offset, count); }
 
-  hb_success_t serialize (hb_serialize_context_t *c, unsigned items_len)
+  template <typename T>
+  Type &lsearch (const T &x, Type &not_found = Crap (Type))
+  { return *as_array ().lsearch (x, &not_found); }
+  template <typename T>
+  const Type &lsearch (const T &x, const Type &not_found = Null (Type)) const
+  { return *as_array ().lsearch (x, &not_found); }
+  template <typename T>
+  bool lfind (const T &x, unsigned int *i = nullptr,
+             hb_not_found_t not_found = HB_NOT_FOUND_DONT_STORE,
+             unsigned int to_store = (unsigned int) -1) const
+  { return as_array ().lfind (x, i, not_found, to_store); }
+
+  void qsort (unsigned int start = 0, unsigned int end = (unsigned int) -1)
+  { as_array ().qsort (start, end); }
+
+  HB_NODISCARD bool serialize (hb_serialize_context_t *c, unsigned items_len)
   {
     TRACE_SERIALIZE (this);
-    if (unlikely (!c->extend_min (*this))) return_trace (false);
-    c->check_assign (len, items_len);
-    if (unlikely (!c->extend (*this))) return_trace (false);
+    if (unlikely (!c->extend_min (this))) return_trace (false);
+    c->check_assign (len, items_len, HB_SERIALIZE_ERROR_ARRAY_OVERFLOW);
+    if (unlikely (!c->extend (this))) return_trace (false);
     return_trace (true);
   }
   template <typename Iterator,
            hb_requires (hb_is_source_of (Iterator, Type))>
-  hb_success_t serialize (hb_serialize_context_t *c, Iterator items)
+  HB_NODISCARD bool serialize (hb_serialize_context_t *c, Iterator items)
   {
     TRACE_SERIALIZE (this);
     unsigned count = items.len ();
@@ -630,7 +684,7 @@ struct ArrayOf
   {
     TRACE_SERIALIZE (this);
     len++;
-    if (unlikely (!len || !c->extend (*this)))
+    if (unlikely (!len || !c->extend (this)))
     {
       len--;
       return_trace (nullptr);
@@ -643,7 +697,7 @@ struct ArrayOf
     TRACE_SERIALIZE (this);
     auto *out = c->start_embed (this);
     if (unlikely (!c->extend_min (out))) return_trace (nullptr);
-    c->check_assign (out->len, len);
+    c->check_assign (out->len, len, HB_SERIALIZE_ERROR_ARRAY_OVERFLOW);
     if (unlikely (!as_array ().copy (c))) return_trace (nullptr);
     return_trace (out);
   }
@@ -653,24 +707,14 @@ struct ArrayOf
   {
     TRACE_SANITIZE (this);
     if (unlikely (!sanitize_shallow (c))) return_trace (false);
-    if (!sizeof... (Ts) && hb_is_trivially_copyable (Type)) return_trace (true);
+    if (!sizeof... (Ts) && std::is_trivially_copyable<Type>::value) return_trace (true);
     unsigned int count = len;
     for (unsigned int i = 0; i < count; i++)
-      if (unlikely (!c->dispatch (arrayZ[i], hb_forward<Ts> (ds)...)))
+      if (unlikely (!c->dispatch (arrayZ[i], std::forward<Ts> (ds)...)))
        return_trace (false);
     return_trace (true);
   }
 
-  template <typename T>
-  Type &lsearch (const T &x, Type &not_found = Crap (Type))
-  { return *as_array ().lsearch (x, &not_found); }
-  template <typename T>
-  const Type &lsearch (const T &x, const Type &not_found = Null (Type)) const
-  { return *as_array ().lsearch (x, &not_found); }
-
-  void qsort (unsigned int start = 0, unsigned int end = (unsigned int) -1)
-  { as_array ().qsort (start, end); }
-
   bool sanitize_shallow (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -683,21 +727,18 @@ struct ArrayOf
   public:
   DEFINE_SIZE_ARRAY (sizeof (LenType), arrayZ);
 };
-template <typename Type>
-using LArrayOf = ArrayOf<Type, HBUINT32>;
+template <typename Type> using Array16Of = ArrayOf<Type, HBUINT16>;
+template <typename Type> using Array32Of = ArrayOf<Type, HBUINT32>;
 using PString = ArrayOf<HBUINT8, HBUINT8>;
 
 /* Array of Offset's */
-template <typename Type>
-using OffsetArrayOf = ArrayOf<OffsetTo<Type, HBUINT16>>;
-template <typename Type>
-using LOffsetArrayOf = ArrayOf<OffsetTo<Type, HBUINT32>>;
-template <typename Type>
-using LOffsetLArrayOf = ArrayOf<OffsetTo<Type, HBUINT32>, HBUINT32>;
+template <typename Type> using Array16OfOffset16To = ArrayOf<OffsetTo<Type, HBUINT16>, HBUINT16>;
+template <typename Type> using Array16OfOffset32To = ArrayOf<OffsetTo<Type, HBUINT32>, HBUINT16>;
+template <typename Type> using Array32OfOffset32To = ArrayOf<OffsetTo<Type, HBUINT32>, HBUINT32>;
 
 /* Array of offsets relative to the beginning of the array itself. */
 template <typename Type>
-struct OffsetListOf : OffsetArrayOf<Type>
+struct List16OfOffset16To : Array16OfOffset16To<Type>
 {
   const Type& operator [] (int i_) const
   {
@@ -715,7 +756,7 @@ struct OffsetListOf : OffsetArrayOf<Type>
   bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
-    struct OffsetListOf<Type> *out = c->serializer->embed (*this);
+    struct List16OfOffset16To<Type> *out = c->serializer->embed (*this);
     if (unlikely (!out)) return_trace (false);
     unsigned int count = this->len;
     for (unsigned int i = 0; i < count; i++)
@@ -727,7 +768,7 @@ struct OffsetListOf : OffsetArrayOf<Type>
   bool sanitize (hb_sanitize_context_t *c, Ts&&... ds) const
   {
     TRACE_SANITIZE (this);
-    return_trace (OffsetArrayOf<Type>::sanitize (c, this, hb_forward<Ts> (ds)...));
+    return_trace (Array16OfOffset16To<Type>::sanitize (c, this, std::forward<Ts> (ds)...));
   }
 };
 
@@ -770,9 +811,9 @@ struct HeadlessArrayOf
   bool serialize (hb_serialize_context_t *c, unsigned int items_len)
   {
     TRACE_SERIALIZE (this);
-    if (unlikely (!c->extend_min (*this))) return_trace (false);
-    c->check_assign (lenP1, items_len + 1);
-    if (unlikely (!c->extend (*this))) return_trace (false);
+    if (unlikely (!c->extend_min (this))) return_trace (false);
+    c->check_assign (lenP1, items_len + 1, HB_SERIALIZE_ERROR_ARRAY_OVERFLOW);
+    if (unlikely (!c->extend (this))) return_trace (false);
     return_trace (true);
   }
   template <typename Iterator,
@@ -794,10 +835,10 @@ struct HeadlessArrayOf
   {
     TRACE_SANITIZE (this);
     if (unlikely (!sanitize_shallow (c))) return_trace (false);
-    if (!sizeof... (Ts) && hb_is_trivially_copyable (Type)) return_trace (true);
+    if (!sizeof... (Ts) && std::is_trivially_copyable<Type>::value) return_trace (true);
     unsigned int count = get_length ();
     for (unsigned int i = 0; i < count; i++)
-      if (unlikely (!c->dispatch (arrayZ[i], hb_forward<Ts> (ds)...)))
+      if (unlikely (!c->dispatch (arrayZ[i], std::forward<Ts> (ds)...)))
        return_trace (false);
     return_trace (true);
   }
@@ -843,9 +884,10 @@ struct ArrayOfM1
   {
     TRACE_SANITIZE (this);
     if (unlikely (!sanitize_shallow (c))) return_trace (false);
+    if (!sizeof... (Ts) && std::is_trivially_copyable<Type>::value) return_trace (true);
     unsigned int count = lenM1 + 1;
     for (unsigned int i = 0; i < count; i++)
-      if (unlikely (!c->dispatch (arrayZ[i], hb_forward<Ts> (ds)...)))
+      if (unlikely (!c->dispatch (arrayZ[i], std::forward<Ts> (ds)...)))
        return_trace (false);
     return_trace (true);
   }
@@ -866,7 +908,7 @@ struct ArrayOfM1
 };
 
 /* An array with sorted elements.  Supports binary searching. */
-template <typename Type, typename LenType=HBUINT16>
+template <typename Type, typename LenType>
 struct SortedArrayOf : ArrayOf<Type, LenType>
 {
   hb_sorted_array_t<      Type> as_array ()       { return hb_sorted_array (this->arrayZ, this->len); }
@@ -912,11 +954,14 @@ struct SortedArrayOf : ArrayOf<Type, LenType>
   { return *as_array ().bsearch (x, &not_found); }
   template <typename T>
   bool bfind (const T &x, unsigned int *i = nullptr,
-             hb_bfind_not_found_t not_found = HB_BFIND_NOT_FOUND_DONT_STORE,
+             hb_not_found_t not_found = HB_NOT_FOUND_DONT_STORE,
              unsigned int to_store = (unsigned int) -1) const
   { return as_array ().bfind (x, i, not_found, to_store); }
 };
 
+template <typename Type> using SortedArray16Of = SortedArrayOf<Type, HBUINT16>;
+template <typename Type> using SortedArray32Of = SortedArrayOf<Type, HBUINT32>;
+
 /*
  * Binary-search arrays
  */
@@ -1025,10 +1070,10 @@ struct VarSizedBinSearchArrayOf
   {
     TRACE_SANITIZE (this);
     if (unlikely (!sanitize_shallow (c))) return_trace (false);
-    if (!sizeof... (Ts) && hb_is_trivially_copyable (Type)) return_trace (true);
+    if (!sizeof... (Ts) && std::is_trivially_copyable<Type>::value) return_trace (true);
     unsigned int count = get_length ();
     for (unsigned int i = 0; i < count; i++)
-      if (unlikely (!(*this)[i].sanitize (c, hb_forward<Ts> (ds)...)))
+      if (unlikely (!(*this)[i].sanitize (c, std::forward<Ts> (ds)...)))
        return_trace (false);
     return_trace (true);
   }
index e5286cd..c102c15 100644 (file)
@@ -68,8 +68,6 @@ struct code_pair_t
 typedef hb_vector_t<unsigned char> str_buff_t;
 struct str_buff_vec_t : hb_vector_t<str_buff_t>
 {
-  void fini () { SUPER::fini_deep (); }
-
   unsigned int total_size () const
   {
     unsigned int size = 0;
@@ -126,7 +124,7 @@ struct CFFIndex
     else
     {
       /* serialize CFFIndex header */
-      if (unlikely (!c->extend_min (*this))) return_trace (false);
+      if (unlikely (!c->extend_min (this))) return_trace (false);
       this->count = byteArray.length;
       this->offSize = offSize_;
       if (unlikely (!c->allocate_size<HBUINT8> (offSize_ * (byteArray.length + 1))))
@@ -183,7 +181,7 @@ struct CFFIndex
     else
     {
       serialize_header(c, + it | hb_map ([] (const byte_str_t &_) { return _.length; }));
-      for (const byte_str_t &_ : +it)
+      for (const auto &_ : +it)
        _.copy (c);
     }
     return_trace (true);
@@ -214,7 +212,7 @@ struct CFFIndex
     unsigned off_size = calcOffSize (total);
 
     /* serialize CFFIndex header */
-    if (unlikely (!c->extend_min (*this))) return_trace (false);
+    if (unlikely (!c->extend_min (this))) return_trace (false);
     this->count = it.len ();
     this->offSize = off_size;
     if (unlikely (!c->allocate_size<HBUINT8> (off_size * (it.len () + 1))))
@@ -335,7 +333,7 @@ struct CFFIndexOf : CFFIndex<COUNT>
   {
     TRACE_SERIALIZE (this);
     /* serialize CFFIndex header */
-    if (unlikely (!c->extend_min (*this))) return_trace (false);
+    if (unlikely (!c->extend_min (this))) return_trace (false);
     this->count = dataArrayLen;
     this->offSize = offSize_;
     if (unlikely (!c->allocate_size<HBUINT8> (offSize_ * (dataArrayLen + 1))))
@@ -373,7 +371,7 @@ struct Dict : UnsizedByteStr
   {
     TRACE_SERIALIZE (this);
     for (unsigned int i = 0; i < dictval.get_count (); i++)
-      if (unlikely (!opszr.serialize (c, dictval[i], hb_forward<Ts> (ds)...)))
+      if (unlikely (!opszr.serialize (c, dictval[i], std::forward<Ts> (ds)...)))
        return_trace (false);
 
     return_trace (true);
index 66b9c8c..3298fa3 100644 (file)
@@ -426,7 +426,7 @@ bool OT::cff1::accelerator_t::get_extents (hb_font_t *font, hb_codepoint_t glyph
   else
   {
     extents->x_bearing = font->em_scalef_x (bounds.min.x.to_real ());
-    extents->width = font->em_scalef_x (bounds.max.x.to_real () - bounds.min.x.to_real ());
+    extents->width = font->em_scalef_x (bounds.max.x.to_real ()) - extents->x_bearing;
   }
   if (bounds.min.y >= bounds.max.y)
   {
@@ -436,7 +436,7 @@ bool OT::cff1::accelerator_t::get_extents (hb_font_t *font, hb_codepoint_t glyph
   else
   {
     extents->y_bearing = font->em_scalef_y (bounds.max.y.to_real ());
-    extents->height = font->em_scalef_y (bounds.min.y.to_real () - bounds.max.y.to_real ());
+    extents->height = font->em_scalef_y (bounds.min.y.to_real ()) - extents->y_bearing;
   }
 
   return true;
index e1296c3..6fb5931 100644 (file)
@@ -187,7 +187,7 @@ struct Encoding
                  const hb_vector_t<code_pair_t>& supp_codes)
   {
     TRACE_SERIALIZE (this);
-    Encoding *dest = c->extend_min (*this);
+    Encoding *dest = c->extend_min (this);
     if (unlikely (!dest)) return_trace (false);
     dest->format = format | ((supp_codes.length > 0) ? 0x80 : 0);
     switch (format) {
@@ -457,7 +457,7 @@ struct Charset
                  const hb_vector_t<code_pair_t>& sid_ranges)
   {
     TRACE_SERIALIZE (this);
-    Charset *dest = c->extend_min (*this);
+    Charset *dest = c->extend_min (this);
     if (unlikely (!dest)) return_trace (false);
     dest->format = format;
     switch (format)
@@ -713,6 +713,7 @@ struct cff1_top_dict_opset_t : top_dict_opset_t<cff1_top_dict_val_t>
       case OpCode_Notice:
       case OpCode_Copyright:
       case OpCode_FullName:
+      case OpCode_FontName:
       case OpCode_FamilyName:
       case OpCode_Weight:
       case OpCode_PostScript:
@@ -1087,7 +1088,8 @@ struct cff1
       if (num_glyphs != sc.get_num_glyphs ())
       { fini (); return; }
 
-      privateDicts.resize (fdCount);
+      if (unlikely (!privateDicts.resize (fdCount)))
+      { fini (); return; }
       for (unsigned int i = 0; i < fdCount; i++)
        privateDicts[i].init ();
 
@@ -1142,8 +1144,8 @@ struct cff1
     {
       sc.end_processing ();
       topDict.fini ();
-      fontDicts.fini_deep ();
-      privateDicts.fini_deep ();
+      fontDicts.fini ();
+      privateDicts.fini ();
       hb_blob_destroy (blob);
       blob = nullptr;
     }
@@ -1243,32 +1245,32 @@ struct cff1
     }
 
     protected:
-    hb_blob_t             *blob;
+    hb_blob_t             *blob = nullptr;
     hb_sanitize_context_t   sc;
 
     public:
-    const Encoding         *encoding;
-    const Charset          *charset;
-    const CFF1NameIndex     *nameIndex;
-    const CFF1TopDictIndex  *topDictIndex;
-    const CFF1StringIndex   *stringIndex;
-    const CFF1Subrs        *globalSubrs;
-    const CFF1CharStrings   *charStrings;
-    const CFF1FDArray       *fdArray;
-    const CFF1FDSelect      *fdSelect;
-    unsigned int            fdCount;
+    const Encoding         *encoding = nullptr;
+    const Charset          *charset = nullptr;
+    const CFF1NameIndex     *nameIndex = nullptr;
+    const CFF1TopDictIndex  *topDictIndex = nullptr;
+    const CFF1StringIndex   *stringIndex = nullptr;
+    const CFF1Subrs        *globalSubrs = nullptr;
+    const CFF1CharStrings   *charStrings = nullptr;
+    const CFF1FDArray       *fdArray = nullptr;
+    const CFF1FDSelect      *fdSelect = nullptr;
+    unsigned int            fdCount = 0;
 
     cff1_top_dict_values_t   topDict;
     hb_vector_t<cff1_font_dict_values_t>
                             fontDicts;
     hb_vector_t<PRIVDICTVAL> privateDicts;
 
-    unsigned int            num_glyphs;
+    unsigned int            num_glyphs = 0;
   };
 
   struct accelerator_t : accelerator_templ_t<cff1_private_dict_opset_t, cff1_private_dict_values_t>
   {
-    void init (hb_face_t *face)
+    accelerator_t (hb_face_t *face)
     {
       SUPER::init (face);
 
@@ -1293,8 +1295,7 @@ struct cff1
       }
       glyph_names.qsort ();
     }
-
-    void fini ()
+    ~accelerator_t ()
     {
       glyph_names.fini ();
 
@@ -1389,14 +1390,17 @@ struct cff1
 
   public:
   FixedVersion<HBUINT8> version;         /* Version of CFF table. set to 0x0100u */
-  OffsetTo<CFF1NameIndex, HBUINT8> nameIndex; /* headerSize = Offset to Name INDEX. */
+  NNOffsetTo<CFF1NameIndex, HBUINT8> nameIndex; /* headerSize = Offset to Name INDEX. */
   HBUINT8             offSize;   /* offset size (unused?) */
 
   public:
   DEFINE_SIZE_STATIC (4);
 };
 
-struct cff1_accelerator_t : cff1::accelerator_t {};
+struct cff1_accelerator_t : cff1::accelerator_t {
+  cff1_accelerator_t (hb_face_t *face) : cff1::accelerator_t (face) {}
+};
+
 } /* namespace OT */
 
 #endif /* HB_OT_CFF1_TABLE_HH */
index ac0feee..879b7cd 100644 (file)
@@ -127,7 +127,7 @@ bool OT::cff2::accelerator_t::get_extents (hb_font_t *font,
   else
   {
     extents->x_bearing = font->em_scalef_x (param.min_x.to_real ());
-    extents->width = font->em_scalef_x (param.max_x.to_real () - param.min_x.to_real ());
+    extents->width = font->em_scalef_x (param.max_x.to_real ()) - extents->x_bearing;
   }
   if (param.min_y >= param.max_y)
   {
@@ -137,7 +137,7 @@ bool OT::cff2::accelerator_t::get_extents (hb_font_t *font,
   else
   {
     extents->y_bearing = font->em_scalef_y (param.max_y.to_real ());
-    extents->height = font->em_scalef_y (param.min_y.to_real () - param.max_y.to_real ());
+    extents->height = font->em_scalef_y (param.min_y.to_real ()) - extents->y_bearing;
   }
 
   return true;
index 075a0d4..6e1b01c 100644 (file)
@@ -397,7 +397,7 @@ struct cff2
   template <typename PRIVOPSET, typename PRIVDICTVAL>
   struct accelerator_templ_t
   {
-    void init (hb_face_t *face)
+    accelerator_templ_t (hb_face_t *face)
     {
       topDict.init ();
       fontDicts.init ();
@@ -412,15 +412,15 @@ struct cff2
       const OT::cff2 *cff2 = this->blob->template as<OT::cff2> ();
 
       if (cff2 == &Null (OT::cff2))
-      { fini (); return; }
+        goto fail;
 
       { /* parse top dict */
        byte_str_t topDictStr (cff2 + cff2->topDict, cff2->topDictSize);
-       if (unlikely (!topDictStr.sanitize (&sc))) { fini (); return; }
+       if (unlikely (!topDictStr.sanitize (&sc))) goto fail;
        cff2_top_dict_interpreter_t top_interp;
        top_interp.env.init (topDictStr);
        topDict.init ();
-       if (unlikely (!top_interp.interpret (topDict))) { fini (); return; }
+       if (unlikely (!top_interp.interpret (topDict))) goto fail;
       }
 
       globalSubrs = &StructAtOffset<CFF2Subrs> (cff2, cff2->topDict + cff2->topDictSize);
@@ -434,48 +434,55 @@ struct cff2
          (globalSubrs == &Null (CFF2Subrs)) || unlikely (!globalSubrs->sanitize (&sc)) ||
          (fdArray == &Null (CFF2FDArray)) || unlikely (!fdArray->sanitize (&sc)) ||
          (((fdSelect != &Null (CFF2FDSelect)) && unlikely (!fdSelect->sanitize (&sc, fdArray->count)))))
-      { fini (); return; }
+        goto fail;
 
       num_glyphs = charStrings->count;
       if (num_glyphs != sc.get_num_glyphs ())
-      { fini (); return; }
+        goto fail;
 
       fdCount = fdArray->count;
-      privateDicts.resize (fdCount);
+      if (!privateDicts.resize (fdCount))
+        goto fail;
 
       /* parse font dicts and gather private dicts */
       for (unsigned int i = 0; i < fdCount; i++)
       {
        const byte_str_t fontDictStr = (*fdArray)[i];
-       if (unlikely (!fontDictStr.sanitize (&sc))) { fini (); return; }
+       if (unlikely (!fontDictStr.sanitize (&sc))) goto fail;
        cff2_font_dict_values_t  *font;
        cff2_font_dict_interpreter_t font_interp;
        font_interp.env.init (fontDictStr);
        font = fontDicts.push ();
-       if (unlikely (font == &Crap (cff2_font_dict_values_t))) { fini (); return; }
+       if (unlikely (font == &Crap (cff2_font_dict_values_t))) goto fail;
        font->init ();
-       if (unlikely (!font_interp.interpret (*font))) { fini (); return; }
+       if (unlikely (!font_interp.interpret (*font))) goto fail;
 
        const byte_str_t privDictStr (StructAtOffsetOrNull<UnsizedByteStr> (cff2, font->privateDictInfo.offset), font->privateDictInfo.size);
-       if (unlikely (!privDictStr.sanitize (&sc))) { fini (); return; }
+       if (unlikely (!privDictStr.sanitize (&sc))) goto fail;
        dict_interpreter_t<PRIVOPSET, PRIVDICTVAL, cff2_priv_dict_interp_env_t>  priv_interp;
        priv_interp.env.init(privDictStr);
        privateDicts[i].init ();
-       if (unlikely (!priv_interp.interpret (privateDicts[i]))) { fini (); return; }
+       if (unlikely (!priv_interp.interpret (privateDicts[i]))) goto fail;
 
        privateDicts[i].localSubrs = &StructAtOffsetOrNull<CFF2Subrs> (&privDictStr[0], privateDicts[i].subrsOffset);
        if (privateDicts[i].localSubrs != &Null (CFF2Subrs) &&
          unlikely (!privateDicts[i].localSubrs->sanitize (&sc)))
-       { fini (); return; }
+         goto fail;
       }
-    }
 
-    void fini ()
+
+      return;
+
+      fail:
+        _fini ();
+    }
+    ~accelerator_templ_t () { _fini (); }
+    void _fini ()
     {
       sc.end_processing ();
       topDict.fini ();
-      fontDicts.fini_deep ();
-      privateDicts.fini_deep ();
+      fontDicts.fini ();
+      privateDicts.fini ();
       hb_blob_destroy (blob);
       blob = nullptr;
     }
@@ -483,26 +490,28 @@ struct cff2
     bool is_valid () const { return blob; }
 
     protected:
-    hb_blob_t                  *blob;
+    hb_blob_t                  *blob = nullptr;
     hb_sanitize_context_t      sc;
 
     public:
     cff2_top_dict_values_t     topDict;
-    const CFF2Subrs            *globalSubrs;
-    const CFF2VariationStore   *varStore;
-    const CFF2CharStrings      *charStrings;
-    const CFF2FDArray          *fdArray;
-    const CFF2FDSelect         *fdSelect;
-    unsigned int               fdCount;
+    const CFF2Subrs            *globalSubrs = nullptr;
+    const CFF2VariationStore   *varStore = nullptr;
+    const CFF2CharStrings      *charStrings = nullptr;
+    const CFF2FDArray          *fdArray = nullptr;
+    const CFF2FDSelect         *fdSelect = nullptr;
+    unsigned int               fdCount = 0;
 
     hb_vector_t<cff2_font_dict_values_t>     fontDicts;
     hb_vector_t<PRIVDICTVAL>  privateDicts;
 
-    unsigned int             num_glyphs;
+    unsigned int             num_glyphs = 0;
   };
 
   struct accelerator_t : accelerator_templ_t<cff2_private_dict_opset_t, cff2_private_dict_values_t>
   {
+    accelerator_t (hb_face_t *face) : accelerator_templ_t (face) {}
+
     HB_INTERNAL bool get_extents (hb_font_t *font,
                                  hb_codepoint_t glyph,
                                  hb_glyph_extents_t *extents) const;
@@ -524,7 +533,10 @@ struct cff2
   DEFINE_SIZE_STATIC (5);
 };
 
-struct cff2_accelerator_t : cff2::accelerator_t {};
+struct cff2_accelerator_t : cff2::accelerator_t {
+  cff2_accelerator_t (hb_face_t *face) : cff2::accelerator_t (face) {}
+};
+
 } /* namespace OT */
 
 #endif /* HB_OT_CFF2_TABLE_HH */
index c42f3fd..fde57cd 100644 (file)
@@ -49,6 +49,12 @@ struct CmapSubtableFormat0
     *glyph = gid;
     return true;
   }
+
+  unsigned get_language () const
+  {
+    return language;
+  }
+
   void collect_unicodes (hb_set_t *out) const
   {
     for (unsigned int i = 0; i < 256; i++)
@@ -57,14 +63,14 @@ struct CmapSubtableFormat0
   }
 
   void collect_mapping (hb_set_t *unicodes, /* OUT */
-                        hb_map_t *mapping /* OUT */) const
+                       hb_map_t *mapping /* OUT */) const
   {
     for (unsigned i = 0; i < 256; i++)
       if (glyphIdArray[i])
       {
-        hb_codepoint_t glyph = glyphIdArray[i];
-        unicodes->add (i);
-        mapping->set (i, glyph);
+       hb_codepoint_t glyph = glyphIdArray[i];
+       unicodes->add (i);
+       mapping->set (i, glyph);
       }
   }
 
@@ -87,120 +93,192 @@ struct CmapSubtableFormat0
 struct CmapSubtableFormat4
 {
 
+
   template<typename Iterator,
+      typename Writer,
           hb_requires (hb_is_iterator (Iterator))>
-  HBUINT16* serialize_endcode_array (hb_serialize_context_t *c,
-                                    Iterator it)
-  {
-    HBUINT16 *endCode = c->start_embed<HBUINT16> ();
-    hb_codepoint_t prev_endcp = 0xFFFF;
+  void to_ranges (Iterator it, Writer& range_writer)
+  {
+    hb_codepoint_t start_cp = 0, prev_run_start_cp = 0, run_start_cp = 0, end_cp = 0, last_gid = 0;
+    int run_length = 0 , delta = 0, prev_delta = 0;
+
+    enum {
+      FIRST_SUB_RANGE,
+      FOLLOWING_SUB_RANGE,
+    } mode;
+
+    while (it) {
+      // Start a new range
+      start_cp = (*it).first;
+      prev_run_start_cp = (*it).first;
+      run_start_cp = (*it).first;
+      end_cp = (*it).first;
+      last_gid = (*it).second;
+      run_length = 1;
+      prev_delta = 0;
+
+      delta = (*it).second - (*it).first;
+      mode = FIRST_SUB_RANGE;
+      it++;
+
+      while (it) {
+        // Process range
+        hb_codepoint_t next_cp = (*it).first;
+        hb_codepoint_t next_gid = (*it).second;
+        if (next_cp != end_cp + 1) {
+          // Current range is over, stop processing.
+          break;
+        }
 
-    for (const hb_item_type<Iterator> _ : +it)
-    {
-      if (prev_endcp != 0xFFFF && prev_endcp + 1u != _.first)
-      {
-       HBUINT16 end_code;
-       end_code = prev_endcp;
-       c->copy<HBUINT16> (end_code);
-      }
-      prev_endcp = _.first;
-    }
+        if (next_gid == last_gid + 1) {
+          // The current run continues.
+          end_cp = next_cp;
+          run_length++;
+          last_gid = next_gid;
+          it++;
+          continue;
+        }
 
-    {
-      // last endCode
-      HBUINT16 endcode;
-      endcode = prev_endcp;
-      if (unlikely (!c->copy<HBUINT16> (endcode))) return nullptr;
-      // There must be a final entry with end_code == 0xFFFF.
-      if (prev_endcp != 0xFFFF)
-      {
-       HBUINT16 finalcode;
-       finalcode = 0xFFFF;
-       if (unlikely (!c->copy<HBUINT16> (finalcode))) return nullptr;
+        // A new run is starting, decide if we want to commit the current run.
+        int split_cost = (mode == FIRST_SUB_RANGE) ? 8 : 16;
+        int run_cost = run_length * 2;
+        if (run_cost >= split_cost) {
+          commit_current_range(start_cp,
+                               prev_run_start_cp,
+                               run_start_cp,
+                               end_cp,
+                               delta,
+                               prev_delta,
+                               split_cost,
+                               range_writer);
+          start_cp = next_cp;
+        }
+
+        // Start the new run
+        mode = FOLLOWING_SUB_RANGE;
+        prev_run_start_cp = run_start_cp;
+        run_start_cp = next_cp;
+        end_cp = next_cp;
+        prev_delta = delta;
+        delta = next_gid - run_start_cp;
+        run_length = 1;
+        last_gid = next_gid;
+        it++;
       }
+
+      // Finalize range
+      commit_current_range (start_cp,
+                            prev_run_start_cp,
+                            run_start_cp,
+                            end_cp,
+                            delta,
+                            prev_delta,
+                            8,
+                            range_writer);
     }
 
-    return endCode;
+    if (likely (end_cp != 0xFFFF)) {
+      range_writer (0xFFFF, 0xFFFF, 1);
+    }
   }
 
-  template<typename Iterator,
-          hb_requires (hb_is_iterator (Iterator))>
-  HBUINT16* serialize_startcode_array (hb_serialize_context_t *c,
-                                      Iterator it)
-  {
-    HBUINT16 *startCode = c->start_embed<HBUINT16> ();
-    hb_codepoint_t prev_cp = 0xFFFF;
-
-    for (const hb_item_type<Iterator> _ : +it)
-    {
-      if (prev_cp == 0xFFFF || prev_cp + 1u != _.first)
-      {
-       HBUINT16 start_code;
-       start_code = _.first;
-       c->copy<HBUINT16> (start_code);
+  /*
+   * Writes the current range as either one or two ranges depending on what is most efficient.
+   */
+  template<typename Writer>
+  void commit_current_range (hb_codepoint_t start,
+                             hb_codepoint_t prev_run_start,
+                             hb_codepoint_t run_start,
+                             hb_codepoint_t end,
+                             int run_delta,
+                             int previous_run_delta,
+                             int split_cost,
+                             Writer& range_writer) {
+    bool should_split = false;
+    if (start < run_start && run_start < end) {
+      int run_cost = (end - run_start + 1) * 2;
+      if (run_cost >= split_cost) {
+        should_split = true;
       }
+    }
 
-      prev_cp = _.first;
+    // TODO(grieger): handle case where delta is legitimately 0, mark range offset array instead?
+    if (should_split) {
+      if (start == prev_run_start)
+        range_writer (start, run_start - 1, previous_run_delta);
+      else
+        range_writer (start, run_start - 1, 0);
+      range_writer (run_start, end, run_delta);
+      return;
     }
 
-    // There must be a final entry with end_code == 0xFFFF.
-    if (it.len () == 0 || prev_cp != 0xFFFF)
-    {
-      HBUINT16 finalcode;
-      finalcode = 0xFFFF;
-      if (unlikely (!c->copy<HBUINT16> (finalcode))) return nullptr;
+
+    if (start == run_start) {
+      // Range is only a run
+      range_writer (start, end, run_delta);
+      return;
     }
 
-    return startCode;
+    // Write only a single non-run range.
+    range_writer (start, end, 0);
   }
 
   template<typename Iterator,
           hb_requires (hb_is_iterator (Iterator))>
-  HBINT16* serialize_idDelta_array (hb_serialize_context_t *c,
-                                    Iterator it,
-                                    HBUINT16 *endCode,
-                                    HBUINT16 *startCode,
-                                    unsigned segcount)
-  {
-    unsigned i = 0;
-    hb_codepoint_t last_gid = 0, start_gid = 0, last_cp = 0xFFFF;
-    bool use_delta = true;
-
-    HBINT16 *idDelta = c->start_embed<HBINT16> ();
-    if ((char *)idDelta - (char *)startCode != (int) segcount * (int) HBINT16::static_size)
-      return nullptr;
-
-    for (const hb_item_type<Iterator> _ : +it)
-    {
-      if (_.first == startCode[i])
-      {
-       use_delta = true;
-       start_gid = _.second;
+  unsigned serialize_find_segcount (Iterator it) {
+    struct Counter {
+      unsigned segcount = 0;
+
+      void operator() (hb_codepoint_t start,
+                       hb_codepoint_t end,
+                       int delta) {
+        segcount++;
       }
-      else if (_.second != last_gid + 1) use_delta = false;
+    } counter;
 
-      if (_.first == endCode[i])
-      {
-       HBINT16 delta;
-       if (use_delta) delta = (int)start_gid - (int)startCode[i];
-       else delta = 0;
-       c->copy<HBINT16> (delta);
+    to_ranges (+it, counter);
+    return counter.segcount;
+  }
 
-       i++;
+
+  template<typename Iterator,
+          hb_requires (hb_is_iterator (Iterator))>
+  bool serialize_start_end_delta_arrays (hb_serialize_context_t *c,
+                                         Iterator it,
+                                         int segcount)
+  {
+    struct Writer {
+      hb_serialize_context_t *serializer_;
+      HBUINT16* end_code_;
+      HBUINT16* start_code_;
+      HBINT16* id_delta_;
+      int index_;
+
+      Writer(hb_serialize_context_t *serializer)
+          : serializer_(serializer),
+            end_code_(nullptr),
+            start_code_(nullptr),
+            id_delta_(nullptr),
+            index_ (0) {}
+      void operator() (hb_codepoint_t start,
+                       hb_codepoint_t end,
+                       int delta) {
+        start_code_[index_] = start;
+        end_code_[index_] = end;
+        id_delta_[index_] = delta;
+        index_++;
       }
+    } writer(c);
 
-      last_gid = _.second;
-      last_cp = _.first;
-    }
+    writer.end_code_ = c->allocate_size<HBUINT16> (HBUINT16::static_size * segcount);
+    c->allocate_size<HBUINT16> (2); // padding
+    writer.start_code_ = c->allocate_size<HBUINT16> (HBUINT16::static_size * segcount);
+    writer.id_delta_ = c->allocate_size<HBINT16> (HBINT16::static_size * segcount);
 
-    if (it.len () == 0 || last_cp != 0xFFFF)
-    {
-      HBINT16 delta;
-      delta = 1;
-      if (unlikely (!c->copy<HBINT16> (delta))) return nullptr;
-    }
+    if (unlikely (!writer.end_code_ || !writer.start_code_ || !writer.id_delta_)) return false;
 
-    return idDelta;
+    to_ranges (+it, writer);
+    return true;
   }
 
   template<typename Iterator,
@@ -212,29 +290,24 @@ struct CmapSubtableFormat4
                                         HBINT16 *idDelta,
                                         unsigned segcount)
   {
+    hb_hashmap_t<hb_codepoint_t, hb_codepoint_t> cp_to_gid;
+    + it | hb_sink (cp_to_gid);
+
     HBUINT16 *idRangeOffset = c->allocate_size<HBUINT16> (HBUINT16::static_size * segcount);
     if (unlikely (!c->check_success (idRangeOffset))) return nullptr;
     if (unlikely ((char *)idRangeOffset - (char *)idDelta != (int) segcount * (int) HBINT16::static_size)) return nullptr;
 
-    + hb_range (segcount)
-    | hb_filter ([&] (const unsigned _) { return idDelta[_] == 0; })
-    | hb_apply ([&] (const unsigned i)
-               {
-                 idRangeOffset[i] = 2 * (c->start_embed<HBUINT16> () - idRangeOffset - i);
-
-                 + it
-                 | hb_filter ([&] (const hb_item_type<Iterator> _) { return _.first >= startCode[i] && _.first <= endCode[i]; })
-                 | hb_apply ([&] (const hb_item_type<Iterator> _)
-                             {
-                               HBUINT16 glyID;
-                               glyID = _.second;
-                               c->copy<HBUINT16> (glyID);
-                             })
-                 ;
-
-
-               })
-    ;
+    for (unsigned i : + hb_range (segcount)
+             | hb_filter ([&] (const unsigned _) { return idDelta[_] == 0; }))
+    {
+      idRangeOffset[i] = 2 * (c->start_embed<HBUINT16> () - idRangeOffset - i);
+      for (hb_codepoint_t cp = startCode[i]; cp <= endCode[i]; cp++)
+      {
+        HBUINT16 gid;
+        gid = cp_to_gid[cp];
+        c->copy<HBUINT16> (gid);
+      }
+    }
 
     return idRangeOffset;
   }
@@ -253,30 +326,32 @@ struct CmapSubtableFormat4
     if (format4_iter.len () == 0) return;
 
     unsigned table_initpos = c->length ();
-    if (unlikely (!c->extend_min (*this))) return;
+    if (unlikely (!c->extend_min (this))) return;
     this->format = 4;
 
-    //serialize endCode[]
-    HBUINT16 *endCode = serialize_endcode_array (c, format4_iter);
-    if (unlikely (!endCode)) return;
-
-    unsigned segcount = (c->length () - min_size) / HBUINT16::static_size;
-
-    // 2 bytes of padding.
-    if (unlikely (!c->allocate_size<HBUINT16> (HBUINT16::static_size))) return; // 2 bytes of padding.
-
-   // serialize startCode[]
-    HBUINT16 *startCode = serialize_startcode_array (c, format4_iter);
-    if (unlikely (!startCode)) return;
+    //serialize endCode[], startCode[], idDelta[]
+    HBUINT16* endCode = c->start_embed<HBUINT16> ();
+    unsigned segcount = serialize_find_segcount (format4_iter);
+    if (unlikely (!serialize_start_end_delta_arrays (c, format4_iter, segcount)))
+      return;
 
-    //serialize idDelta[]
-    HBINT16 *idDelta = serialize_idDelta_array (c, format4_iter, endCode, startCode, segcount);
-    if (unlikely (!idDelta)) return;
+    HBUINT16 *startCode = endCode + segcount + 1;
+    HBINT16 *idDelta = ((HBINT16*)startCode) + segcount;
 
     HBUINT16 *idRangeOffset = serialize_rangeoffset_glyid (c, format4_iter, endCode, startCode, idDelta, segcount);
     if (unlikely (!c->check_success (idRangeOffset))) return;
 
-    if (unlikely (!c->check_assign(this->length, c->length () - table_initpos))) return;
+    this->length = c->length () - table_initpos;
+    if ((long long) this->length != (long long) c->length () - table_initpos)
+    {
+      // Length overflowed. Discard the current object before setting the error condition, otherwise
+      // discard is a noop which prevents the higher level code from reverting the serializer to the
+      // pre-error state in cmap4 overflow handling code.
+      c->pop_discard ();
+      c->err (HB_SERIALIZE_ERROR_INT_OVERFLOW);
+      return;
+    }
+
     this->segCountX2 = segcount * 2;
     this->entrySelector = hb_max (1u, hb_bit_storage (segcount)) - 1;
     this->searchRange = 2 * (1u << this->entrySelector);
@@ -285,11 +360,15 @@ struct CmapSubtableFormat4
                       : 0;
   }
 
+  unsigned get_language () const
+  {
+    return language;
+  }
+
   struct accelerator_t
   {
     accelerator_t () {}
     accelerator_t (const CmapSubtableFormat4 *subtable) { init (subtable); }
-    ~accelerator_t () { fini (); }
 
     void init (const CmapSubtableFormat4 *subtable)
     {
@@ -301,7 +380,6 @@ struct CmapSubtableFormat4
       glyphIdArray = idRangeOffset + segCount;
       glyphIdArrayLength = (subtable->length - 16 - 8 * segCount) / 2;
     }
-    void fini () {}
 
     bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const
     {
@@ -317,12 +395,12 @@ struct CmapSubtableFormat4
        HBUINT16 last;
       };
 
-      const HBUINT16 *found =hb_bsearch (codepoint,
-                                        this->endCount,
-                                        this->segCount,
-                                        2,
-                                        _hb_cmp_method<hb_codepoint_t, CustomRange, unsigned>,
-                                        this->segCount + 1);
+      const HBUINT16 *found = hb_bsearch (codepoint,
+                                         this->endCount,
+                                         this->segCount,
+                                         2,
+                                         _hb_cmp_method<hb_codepoint_t, CustomRange, unsigned>,
+                                         this->segCount + 1);
       if (!found)
        return false;
       unsigned int i = found - endCount;
@@ -389,41 +467,41 @@ struct CmapSubtableFormat4
     }
 
     void collect_mapping (hb_set_t *unicodes, /* OUT */
-                          hb_map_t *mapping /* OUT */) const
+                         hb_map_t *mapping /* OUT */) const
     {
       unsigned count = this->segCount;
       if (count && this->startCount[count - 1] == 0xFFFFu)
-        count--; /* Skip sentinel segment. */
+       count--; /* Skip sentinel segment. */
       for (unsigned i = 0; i < count; i++)
       {
-        hb_codepoint_t start = this->startCount[i];
-        hb_codepoint_t end = this->endCount[i];
-        unsigned rangeOffset = this->idRangeOffset[i];
-        if (rangeOffset == 0)
-        {
-          for (hb_codepoint_t codepoint = start; codepoint <= end; codepoint++)
-          {
-            hb_codepoint_t gid = (codepoint + this->idDelta[i]) & 0xFFFFu;
-            if (unlikely (!gid))
-              continue;
-            unicodes->add (codepoint);
-            mapping->set (codepoint, gid);
-          }
-        }
-        else
-        {
-          for (hb_codepoint_t codepoint = start; codepoint <= end; codepoint++)
-          {
-            unsigned index = rangeOffset / 2 + (codepoint - this->startCount[i]) + i - this->segCount;
-            if (unlikely (index >= this->glyphIdArrayLength))
-              break;
-            hb_codepoint_t gid = this->glyphIdArray[index];
-            if (unlikely (!gid))
-              continue;
-            unicodes->add (codepoint);
-            mapping->set (codepoint, gid);
-          }
-        }
+       hb_codepoint_t start = this->startCount[i];
+       hb_codepoint_t end = this->endCount[i];
+       unsigned rangeOffset = this->idRangeOffset[i];
+       if (rangeOffset == 0)
+       {
+         for (hb_codepoint_t codepoint = start; codepoint <= end; codepoint++)
+         {
+           hb_codepoint_t gid = (codepoint + this->idDelta[i]) & 0xFFFFu;
+           if (unlikely (!gid))
+             continue;
+           unicodes->add (codepoint);
+           mapping->set (codepoint, gid);
+         }
+       }
+       else
+       {
+         for (hb_codepoint_t codepoint = start; codepoint <= end; codepoint++)
+         {
+           unsigned index = rangeOffset / 2 + (codepoint - this->startCount[i]) + i - this->segCount;
+           if (unlikely (index >= this->glyphIdArrayLength))
+             break;
+           hb_codepoint_t gid = this->glyphIdArray[index];
+           if (unlikely (!gid))
+             continue;
+           unicodes->add (codepoint);
+           mapping->set (codepoint, gid);
+         }
+       }
       }
     }
 
@@ -448,7 +526,7 @@ struct CmapSubtableFormat4
   }
 
   void collect_mapping (hb_set_t *unicodes, /* OUT */
-                        hb_map_t *mapping /* OUT */) const
+                       hb_map_t *mapping /* OUT */) const
   {
     accelerator_t accel (this);
     accel.collect_mapping (unicodes, mapping);
@@ -466,8 +544,8 @@ struct CmapSubtableFormat4
        * If that is the case, just change the value to truncate
        * the subtable at the end of the blob. */
       uint16_t new_length = (uint16_t) hb_min ((uintptr_t) 65535,
-                                           (uintptr_t) (c->end -
-                                                        (char *) this));
+                                              (uintptr_t) (c->end -
+                                                           (char *) this));
       if (!c->try_set (&length, new_length))
        return_trace (false);
     }
@@ -547,6 +625,12 @@ struct CmapSubtableTrimmed
     *glyph = gid;
     return true;
   }
+
+  unsigned get_language () const
+  {
+    return language;
+  }
+
   void collect_unicodes (hb_set_t *out) const
   {
     hb_codepoint_t start = startCharCode;
@@ -557,17 +641,17 @@ struct CmapSubtableTrimmed
   }
 
   void collect_mapping (hb_set_t *unicodes, /* OUT */
-                        hb_map_t *mapping /* OUT */) const
+                       hb_map_t *mapping /* OUT */) const
   {
     hb_codepoint_t start_cp = startCharCode;
     unsigned count = glyphIdArray.len;
     for (unsigned i = 0; i < count; i++)
       if (glyphIdArray[i])
       {
-        hb_codepoint_t unicode = start_cp + i;
-        hb_codepoint_t glyphid = glyphIdArray[i];
-        unicodes->add (unicode);
-        mapping->set (unicode, glyphid);
+       hb_codepoint_t unicode = start_cp + i;
+       hb_codepoint_t glyphid = glyphIdArray[i];
+       unicodes->add (unicode);
+       mapping->set (unicode, glyphid);
       }
   }
 
@@ -582,7 +666,7 @@ struct CmapSubtableTrimmed
   UINT         length;         /* Byte length of this subtable. */
   UINT         language;       /* Ignore. */
   UINT         startCharCode;  /* First character code covered. */
-  ArrayOf<HBGlyphID, UINT>
+  ArrayOf<HBGlyphID16, UINT>
                glyphIdArray;   /* Array of glyph index values for character
                                 * codes in the range. */
   public:
@@ -606,6 +690,11 @@ struct CmapSubtableLongSegmented
     return true;
   }
 
+  unsigned get_language () const
+  {
+    return language;
+  }
+
   void collect_unicodes (hb_set_t *out, unsigned int num_glyphs) const
   {
     for (unsigned int i = 0; i < this->groups.len; i++)
@@ -630,31 +719,31 @@ struct CmapSubtableLongSegmented
   }
 
   void collect_mapping (hb_set_t *unicodes, /* OUT */
-                        hb_map_t *mapping, /* OUT */
-                        unsigned num_glyphs) const
+                       hb_map_t *mapping, /* OUT */
+                       unsigned num_glyphs) const
   {
     for (unsigned i = 0; i < this->groups.len; i++)
     {
       hb_codepoint_t start = this->groups[i].startCharCode;
       hb_codepoint_t end = hb_min ((hb_codepoint_t) this->groups[i].endCharCode,
-                                   (hb_codepoint_t) HB_UNICODE_MAX);
+                                  (hb_codepoint_t) HB_UNICODE_MAX);
       hb_codepoint_t gid = this->groups[i].glyphID;
       if (!gid)
       {
-        /* Intention is: if (hb_is_same (T, CmapSubtableFormat13)) continue; */
-        if (! T::group_get_glyph (this->groups[i], end)) continue;
-        start++;
-        gid++;
+       /* Intention is: if (hb_is_same (T, CmapSubtableFormat13)) continue; */
+       if (! T::group_get_glyph (this->groups[i], end)) continue;
+       start++;
+       gid++;
       }
       if (unlikely ((unsigned int) gid >= num_glyphs)) continue;
       if (unlikely ((unsigned int) (gid + end - start) >= num_glyphs))
-        end = start + (hb_codepoint_t) num_glyphs - gid;
+       end = start + (hb_codepoint_t) num_glyphs - gid;
 
       for (unsigned cp = start; cp <= end; cp++)
       {
-        unicodes->add (cp);
-        mapping->set (cp, gid);
-        gid++;
+       unicodes->add (cp);
+       mapping->set (cp, gid);
+       gid++;
       }
     }
   }
@@ -670,7 +759,7 @@ struct CmapSubtableLongSegmented
   HBUINT16     reserved;       /* Reserved; set to 0. */
   HBUINT32     length;         /* Byte length of this subtable. */
   HBUINT32     language;       /* Ignore. */
-  SortedArrayOf<CmapSubtableLongGroup, HBUINT32>
+  SortedArray32Of<CmapSubtableLongGroup>
                groups;         /* Groupings. */
   public:
   DEFINE_SIZE_ARRAY (16, groups);
@@ -691,12 +780,12 @@ struct CmapSubtableFormat12 : CmapSubtableLongSegmented<CmapSubtableFormat12>
   {
     if (it.len () == 0) return;
     unsigned table_initpos = c->length ();
-    if (unlikely (!c->extend_min (*this))) return;
+    if (unlikely (!c->extend_min (this))) return;
 
     hb_codepoint_t startCharCode = 0xFFFF, endCharCode = 0xFFFF;
     hb_codepoint_t glyphID = 0;
 
-    for (const hb_item_type<Iterator> _ : +it)
+    for (const auto& _ : +it)
     {
       if (startCharCode == 0xFFFF)
       {
@@ -784,7 +873,7 @@ struct UnicodeValueRange
   DEFINE_SIZE_STATIC (4);
 };
 
-struct DefaultUVS : SortedArrayOf<UnicodeValueRange, HBUINT32>
+struct DefaultUVS : SortedArray32Of<UnicodeValueRange>
 {
   void collect_unicodes (hb_set_t *out) const
   {
@@ -793,7 +882,7 @@ struct DefaultUVS : SortedArrayOf<UnicodeValueRange, HBUINT32>
     {
       hb_codepoint_t first = arrayZ[i].startUnicodeValue;
       hb_codepoint_t last = hb_min ((hb_codepoint_t) (first + arrayZ[i].additionalCount),
-                                (hb_codepoint_t) HB_UNICODE_MAX);
+                                   (hb_codepoint_t) HB_UNICODE_MAX);
       out->add_range (first, last);
     }
   }
@@ -850,7 +939,9 @@ struct DefaultUVS : SortedArrayOf<UnicodeValueRange, HBUINT32>
     }
     else
     {
-      if (unlikely (!c->check_assign (out->len, (c->length () - init_len) / UnicodeValueRange::static_size))) return nullptr;
+      if (unlikely (!c->check_assign (out->len,
+                                      (c->length () - init_len) / UnicodeValueRange::static_size,
+                                      HB_SERIALIZE_ERROR_INT_OVERFLOW))) return nullptr;
       return out;
     }
   }
@@ -871,28 +962,26 @@ struct UVSMapping
   }
 
   HBUINT24     unicodeValue;   /* Base Unicode value of the UVS */
-  HBGlyphID    glyphID;        /* Glyph ID of the UVS */
+  HBGlyphID16  glyphID;        /* Glyph ID of the UVS */
   public:
   DEFINE_SIZE_STATIC (5);
 };
 
-struct NonDefaultUVS : SortedArrayOf<UVSMapping, HBUINT32>
+struct NonDefaultUVS : SortedArray32Of<UVSMapping>
 {
   void collect_unicodes (hb_set_t *out) const
   {
-    unsigned int count = len;
-    for (unsigned int i = 0; i < count; i++)
-      out->add (arrayZ[i].unicodeValue);
+    for (const auto& a : as_array ())
+      out->add (a.unicodeValue);
   }
 
   void collect_mapping (hb_set_t *unicodes, /* OUT */
                        hb_map_t *mapping /* OUT */) const
   {
-    unsigned count = len;
-    for (unsigned i = 0; i < count; i++)
+    for (const auto& a : as_array ())
     {
-      hb_codepoint_t unicode = arrayZ[i].unicodeValue;
-      hb_codepoint_t glyphid = arrayZ[i].glyphID;
+      hb_codepoint_t unicode = a.unicodeValue;
+      hb_codepoint_t glyphid = a.glyphID;
       unicodes->add (unicode);
       mapping->set (unicode, glyphid);
     }
@@ -1041,9 +1130,9 @@ struct VariationSelectorRecord
   }
 
   HBUINT24     varSelector;    /* Variation selector. */
-  LOffsetTo<DefaultUVS>
+  Offset32To<DefaultUVS>
                defaultUVS;     /* Offset to Default UVS Table.  May be 0. */
-  LOffsetTo<NonDefaultUVS>
+  Offset32To<NonDefaultUVS>
                nonDefaultUVS;  /* Offset to Non-Default UVS Table.  May be 0. */
   public:
   DEFINE_SIZE_STATIC (11);
@@ -1058,9 +1147,8 @@ struct CmapSubtableFormat14
 
   void collect_variation_selectors (hb_set_t *out) const
   {
-    unsigned int count = record.len;
-    for (unsigned int i = 0; i < count; i++)
-      out->add (record.arrayZ[i].varSelector);
+    for (const auto& a : record.as_array ())
+      out->add (a.varSelector);
   }
   void collect_variation_unicodes (hb_codepoint_t variation_selector,
                                   hb_set_t *out) const
@@ -1076,7 +1164,7 @@ struct CmapSubtableFormat14
     unsigned table_initpos = c->length ();
     const char* init_tail = c->tail;
 
-    if (unlikely (!c->extend_min (*this))) return;
+    if (unlikely (!c->extend_min (this))) return;
     this->format = 14;
 
     auto src_tbl = reinterpret_cast<const CmapSubtableFormat14*> (base);
@@ -1108,11 +1196,16 @@ struct CmapSubtableFormat14
       return;
     }
 
+    if (unlikely (!c->check_success (!obj_indices.in_error ())))
+      return;
+
     int tail_len = init_tail - c->tail;
-    c->check_assign (this->length, c->length () - table_initpos + tail_len);
+    c->check_assign (this->length, c->length () - table_initpos + tail_len,
+                     HB_SERIALIZE_ERROR_INT_OVERFLOW);
     c->check_assign (this->record.len,
                     (c->length () - table_initpos - CmapSubtableFormat14::min_size) /
-                    VariationSelectorRecord::static_size);
+                    VariationSelectorRecord::static_size,
+                     HB_SERIALIZE_ERROR_INT_OVERFLOW);
 
     /* Correct the incorrect write order by reversing the order of the variation
        records array. */
@@ -1177,7 +1270,7 @@ struct CmapSubtableFormat14
   protected:
   HBUINT16     format;         /* Format number is set to 14. */
   HBUINT32     length;         /* Byte length of this subtable. */
-  SortedArrayOf<VariationSelectorRecord, HBUINT32>
+  SortedArray32Of<VariationSelectorRecord>
                record;         /* Variation selector records; sorted
                                 * in increasing order of `varSelector'. */
   public:
@@ -1232,6 +1325,20 @@ struct CmapSubtable
     }
   }
 
+  unsigned get_language () const
+  {
+    switch (u.format) {
+    case  0: return u.format0 .get_language ();
+    case  4: return u.format4 .get_language ();
+    case  6: return u.format6 .get_language ();
+    case 10: return u.format10.get_language ();
+    case 12: return u.format12.get_language ();
+    case 13: return u.format13.get_language ();
+    case 14:
+    default: return 0;
+    }
+  }
+
   template<typename Iterator,
           hb_requires (hb_is_iterator (Iterator))>
   void serialize (hb_serialize_context_t *c,
@@ -1335,7 +1442,7 @@ struct EncodingRecord
 
   HBUINT16     platformID;     /* Platform ID. */
   HBUINT16     encodingID;     /* Platform-specific encoding ID. */
-  LOffsetTo<CmapSubtable>
+  Offset32To<CmapSubtable>
                subtable;       /* Byte offset from beginning of table to the subtable for this encoding. */
   public:
   DEFINE_SIZE_STATIC (8);
@@ -1347,55 +1454,112 @@ struct cmap
 
   template<typename Iterator, typename EncodingRecIter,
           hb_requires (hb_is_iterator (EncodingRecIter))>
-  void serialize (hb_serialize_context_t *c,
+  bool serialize (hb_serialize_context_t *c,
                  Iterator it,
                  EncodingRecIter encodingrec_iter,
                  const void *base,
-                 const hb_subset_plan_t *plan)
+                 const hb_subset_plan_t *plan,
+                  bool drop_format_4 = false)
   {
-    if (unlikely (!c->extend_min ((*this))))  return;
+    if (unlikely (!c->extend_min ((*this))))  return false;
     this->version = 0;
 
     unsigned format4objidx = 0, format12objidx = 0, format14objidx = 0;
+    auto snap = c->snapshot ();
 
     for (const EncodingRecord& _ : encodingrec_iter)
     {
-      hb_set_t unicodes_set;
-      hb_map_t cp_glyphid_map;
-      (base+_.subtable).collect_mapping (&unicodes_set, &cp_glyphid_map);
+      if (c->in_error ())
+        return false;
 
       unsigned format = (base+_.subtable).u.format;
-      if (!plan->glyphs_requested->is_empty ())
+      if (format != 4 && format != 12 && format != 14) continue;
+
+      hb_set_t unicodes_set;
+      (base+_.subtable).collect_unicodes (&unicodes_set);
+
+      if (!drop_format_4 && format == 4)
       {
-        auto table_iter =
-        + hb_zip (unicodes_set.iter(), unicodes_set.iter() | hb_map(cp_glyphid_map))
-        | hb_filter (plan->_glyphset, hb_second)
-        | hb_filter ([plan] (const hb_pair_t<hb_codepoint_t, hb_codepoint_t>& p)
-                     {
-                       return plan->unicodes->has (p.first) ||
-                              plan->glyphs_requested->has (p.second);
-                     })
-        | hb_map ([plan] (const hb_pair_t<hb_codepoint_t, hb_codepoint_t>& p_org)
-                  {
-                    return hb_pair_t<hb_codepoint_t, hb_codepoint_t> (p_org.first, plan->glyph_map->get(p_org.second));
-                  })
-        ;
-  
-        if (format == 4) c->copy (_, table_iter, 4u, base, plan, &format4objidx);
-        else if (format == 12) c->copy (_, table_iter, 12u, base, plan, &format12objidx);
-        else if (format == 14) c->copy (_, table_iter, 14u, base, plan, &format14objidx);
+        c->copy (_, + it | hb_filter (unicodes_set, hb_first), 4u, base, plan, &format4objidx);
+        if (c->in_error () && c->only_overflow ())
+        {
+          // cmap4 overflowed, reset and retry serialization without format 4 subtables.
+          c->revert (snap);
+          return serialize (c, it,
+                            encodingrec_iter,
+                            base,
+                            plan,
+                            true);
+        }
       }
-      /* when --gids option is not used, we iterate input unicodes instead of
-       * all codepoints in each subtable, which is more efficient */
-      else
+
+      else if (format == 12)
       {
-        if (format == 4) c->copy (_, + it | hb_filter (unicodes_set, hb_first), 4u, base, plan, &format4objidx);
-        else if (format == 12) c->copy (_, + it | hb_filter (unicodes_set, hb_first), 12u, base, plan, &format12objidx);
-        else if (format == 14) c->copy (_, it, 14u, base, plan, &format14objidx);
+        if (_can_drop (_, unicodes_set, base, + it | hb_map (hb_first), encodingrec_iter)) continue;
+        c->copy (_, + it | hb_filter (unicodes_set, hb_first), 12u, base, plan, &format12objidx);
       }
+      else if (format == 14) c->copy (_, it, 14u, base, plan, &format14objidx);
     }
+    c->check_assign(this->encodingRecord.len,
+                    (c->length () - cmap::min_size)/EncodingRecord::static_size,
+                    HB_SERIALIZE_ERROR_INT_OVERFLOW);
 
-    c->check_assign(this->encodingRecord.len, (c->length () - cmap::min_size)/EncodingRecord::static_size);
+    // Fail if format 4 was dropped and there is no cmap12.
+    return !drop_format_4 || format12objidx;
+  }
+
+  template<typename Iterator, typename EncodingRecordIterator,
+      hb_requires (hb_is_iterator (Iterator)),
+      hb_requires (hb_is_iterator (EncodingRecordIterator))>
+  bool _can_drop (const EncodingRecord& cmap12,
+                  const hb_set_t& cmap12_unicodes,
+                  const void* base,
+                  Iterator subset_unicodes,
+                  EncodingRecordIterator encoding_records)
+  {
+    for (auto cp : + subset_unicodes | hb_filter (cmap12_unicodes))
+    {
+      if (cp >= 0x10000) return false;
+    }
+
+    unsigned target_platform;
+    unsigned target_encoding;
+    unsigned target_language = (base+cmap12.subtable).get_language ();
+
+    if (cmap12.platformID == 0 && cmap12.encodingID == 4)
+    {
+      target_platform = 0;
+      target_encoding = 3;
+    } else if (cmap12.platformID == 3 && cmap12.encodingID == 10) {
+      target_platform = 3;
+      target_encoding = 1;
+    } else {
+      return false;
+    }
+
+    for (const auto& _ : encoding_records)
+    {
+      if (_.platformID != target_platform
+          || _.encodingID != target_encoding
+          || (base+_.subtable).get_language() != target_language)
+        continue;
+
+      hb_set_t sibling_unicodes;
+      (base+_.subtable).collect_unicodes (&sibling_unicodes);
+
+      auto cmap12 = + subset_unicodes | hb_filter (cmap12_unicodes);
+      auto sibling = + subset_unicodes | hb_filter (sibling_unicodes);
+      for (; cmap12 && sibling; cmap12++, sibling++)
+      {
+        unsigned a = *cmap12;
+        unsigned b = *sibling;
+        if (a != b) return false;
+      }
+
+      return !cmap12 && !sibling;
+    }
+
+    return false;
   }
 
   void closure_glyphs (const hb_set_t      *unicodes,
@@ -1441,7 +1605,7 @@ struct cmap
       unsigned format = (this + _.subtable).u.format;
       if (format == 12) has_format12 = true;
 
-      const EncodingRecord *table = hb_addressof (_);
+      const EncodingRecord *table = std::addressof (_);
       if      (_.platformID == 0 && _.encodingID ==  3) unicode_bmp = table;
       else if (_.platformID == 0 && _.encodingID ==  4) unicode_ucs4 = table;
       else if (_.platformID == 3 && _.encodingID ==  1) ms_bmp = table;
@@ -1462,8 +1626,8 @@ struct cmap
     | hb_filter ([&] (const hb_pair_t<hb_codepoint_t, hb_codepoint_t> _)
                 { return (_.second != HB_MAP_VALUE_INVALID); })
     ;
-    cmap_prime->serialize (c->serializer, it, encodingrec_iter, this, c->plan);
-    return_trace (true);
+
+    return_trace (cmap_prime->serialize (c->serializer, it, encodingrec_iter, this, c->plan));
   }
 
   const CmapSubtable *find_best_subtable (bool *symbol = nullptr) const
@@ -1499,7 +1663,7 @@ struct cmap
 
   struct accelerator_t
   {
-    void init (hb_face_t *face)
+    accelerator_t (hb_face_t *face)
     {
       this->table = hb_sanitize_context_t ().reference_table<cmap> (face);
       bool symbol;
@@ -1534,8 +1698,7 @@ struct cmap
        }
       }
     }
-
-    void fini () { this->table.destroy (); }
+    ~accelerator_t () { this->table.destroy (); }
 
     bool get_nominal_glyph (hb_codepoint_t  unicode,
                            hb_codepoint_t *glyph) const
@@ -1691,13 +1854,15 @@ struct cmap
 
   protected:
   HBUINT16     version;        /* Table version number (0). */
-  SortedArrayOf<EncodingRecord>
+  SortedArray16Of<EncodingRecord>
                encodingRecord; /* Encoding tables. */
   public:
   DEFINE_SIZE_ARRAY (4, encodingRecord);
 };
 
-struct cmap_accelerator_t : cmap::accelerator_t {};
+struct cmap_accelerator_t : cmap::accelerator_t {
+  cmap_accelerator_t (hb_face_t *face) : cmap::accelerator_t (face) {}
+};
 
 } /* namespace OT */
 
index 2500fbe..23fa56c 100644 (file)
@@ -360,6 +360,16 @@ struct IndexSubtable
 
 struct IndexSubtableRecord
 {
+  /* XXX Remove this and fix by not inserting it into vector. */
+  IndexSubtableRecord& operator = (const IndexSubtableRecord &o)
+  {
+    firstGlyphIndex = o.firstGlyphIndex;
+    lastGlyphIndex = o.lastGlyphIndex;
+    offsetToSubtable = (unsigned) o.offsetToSubtable;
+    assert (offsetToSubtable.is_null ());
+    return *this;
+  }
+
   bool sanitize (hb_sanitize_context_t *c, const void *base) const
   {
     TRACE_SANITIZE (this);
@@ -455,7 +465,9 @@ struct IndexSubtableRecord
     unsigned int old_cbdt_prime_length = bitmap_size_context->cbdt_prime->length;
 
     // Set to invalid state to indicate filling glyphs is not yet started.
-    records->resize (records->length + 1);
+    if (unlikely (!c->serializer->check_success (records->resize (records->length + 1))))
+      return_trace (false);
+
     (*records)[records->length - 1].firstGlyphIndex = 1;
     (*records)[records->length - 1].lastGlyphIndex = 0;
     bitmap_size_context->size += IndexSubtableRecord::min_size;
@@ -506,9 +518,9 @@ struct IndexSubtableRecord
                                                   offset, length, format);
   }
 
-  HBGlyphID                    firstGlyphIndex;
-  HBGlyphID                    lastGlyphIndex;
-  LOffsetTo<IndexSubtable>     offsetToSubtable;
+  HBGlyphID16                  firstGlyphIndex;
+  HBGlyphID16                  lastGlyphIndex;
+  Offset32To<IndexSubtable>    offsetToSubtable;
   public:
   DEFINE_SIZE_STATIC (8);
 };
@@ -565,6 +577,8 @@ struct IndexSubtableArray
 
     hb_vector_t<hb_pair_t<hb_codepoint_t, const IndexSubtableRecord*>> lookup;
     build_lookup (c, bitmap_size_context, &lookup);
+    if (unlikely (!c->serializer->propagate_error (lookup)))
+      return false;
 
     bitmap_size_context->size = 0;
     bitmap_size_context->num_tables = 0;
@@ -668,15 +682,15 @@ struct BitmapSizeTable
   }
 
   protected:
-  LNNOffsetTo<IndexSubtableArray>
+  NNOffset32To<IndexSubtableArray>
                        indexSubtableArrayOffset;
   HBUINT32             indexTablesSize;
   HBUINT32             numberOfIndexSubtables;
   HBUINT32             colorRef;
   SBitLineMetrics      horizontal;
   SBitLineMetrics      vertical;
-  HBGlyphID            startGlyphIndex;
-  HBGlyphID            endGlyphIndex;
+  HBGlyphID16          startGlyphIndex;
+  HBGlyphID16          endGlyphIndex;
   HBUINT8              ppemX;
   HBUINT8              ppemY;
   HBUINT8              bitDepth;
@@ -693,7 +707,7 @@ struct BitmapSizeTable
 struct GlyphBitmapDataFormat17
 {
   SmallGlyphMetrics    glyphMetrics;
-  LArrayOf<HBUINT8>    data;
+  Array32Of<HBUINT8>   data;
   public:
   DEFINE_SIZE_ARRAY (9, data);
 };
@@ -701,14 +715,14 @@ struct GlyphBitmapDataFormat17
 struct GlyphBitmapDataFormat18
 {
   BigGlyphMetrics      glyphMetrics;
-  LArrayOf<HBUINT8>    data;
+  Array32Of<HBUINT8>   data;
   public:
   DEFINE_SIZE_ARRAY (12, data);
 };
 
 struct GlyphBitmapDataFormat19
 {
-  LArrayOf<HBUINT8>    data;
+  Array32Of<HBUINT8>   data;
   public:
   DEFINE_SIZE_ARRAY (4, data);
 };
@@ -734,7 +748,7 @@ struct CBLC
                                                 cbdt_prime->length,
                                                 HB_MEMORY_MODE_WRITABLE,
                                                 cbdt_prime->arrayZ,
-                                                free);
+                                                hb_free);
     cbdt_prime->init ();  // Leak arrayZ to the blob.
     bool ret = c->plan->add_table (HB_OT_TAG_CBDT, cbdt_prime_blob);
     hb_blob_destroy (cbdt_prime_blob);
@@ -794,7 +808,7 @@ struct CBLC
 
   protected:
   FixedVersion<>               version;
-  LArrayOf<BitmapSizeTable>    sizeTables;
+  Array32Of<BitmapSizeTable>   sizeTables;
   public:
   DEFINE_SIZE_ARRAY (8, sizeTables);
 };
@@ -805,15 +819,14 @@ struct CBDT
 
   struct accelerator_t
   {
-    void init (hb_face_t *face)
+    accelerator_t (hb_face_t *face)
     {
-      cblc = hb_sanitize_context_t ().reference_table<CBLC> (face);
-      cbdt = hb_sanitize_context_t ().reference_table<CBDT> (face);
+      this->cblc = hb_sanitize_context_t ().reference_table<CBLC> (face);
+      this->cbdt = hb_sanitize_context_t ().reference_table<CBDT> (face);
 
       upem = hb_face_get_upem (face);
     }
-
-    void fini ()
+    ~accelerator_t ()
     {
       this->cblc.destroy ();
       this->cbdt.destroy ();
@@ -974,7 +987,10 @@ CBLC::subset (hb_subset_context_t *c) const
   return_trace (CBLC::sink_cbdt (c, &cbdt_prime));
 }
 
-struct CBDT_accelerator_t : CBDT::accelerator_t {};
+struct CBDT_accelerator_t : CBDT::accelerator_t {
+  CBDT_accelerator_t (hb_face_t *face) : CBDT::accelerator_t (face) {}
+};
+
 
 } /* namespace OT */
 
index 82eab96..dac755c 100644 (file)
@@ -29,6 +29,8 @@
 #define HB_OT_COLOR_COLR_TABLE_HH
 
 #include "hb-open-type.hh"
+#include "hb-ot-layout-common.hh"
+#include "hb-ot-var-common.hh"
 
 /*
  * COLR -- Color
  */
 #define HB_OT_TAG_COLR HB_TAG('C','O','L','R')
 
+#ifndef HB_COLRV1_MAX_NESTING_LEVEL
+#define HB_COLRV1_MAX_NESTING_LEVEL    100
+#endif
+
+#ifndef COLRV1_ENABLE_SUBSETTING
+#define COLRV1_ENABLE_SUBSETTING 1
+#endif
 
 namespace OT {
 
+struct COLR;
+struct hb_colrv1_closure_context_t :
+       hb_dispatch_context_t<hb_colrv1_closure_context_t>
+{
+  template <typename T>
+  return_t dispatch (const T &obj)
+  {
+    if (unlikely (nesting_level_left == 0))
+      return hb_empty_t ();
+
+    if (paint_visited (&obj))
+      return hb_empty_t ();
+
+    nesting_level_left--;
+    obj.closurev1 (this);
+    nesting_level_left++;
+    return hb_empty_t ();
+  }
+  static return_t default_return_value () { return hb_empty_t (); }
+
+  bool paint_visited (const void *paint)
+  {
+    hb_codepoint_t delta = (hb_codepoint_t) ((uintptr_t) paint - (uintptr_t) base);
+    if (visited_paint.in_error() || visited_paint.has (delta))
+      return true;
+
+    visited_paint.add (delta);
+    return false;
+  }
+
+  const COLR* get_colr_table () const
+  { return reinterpret_cast<const COLR *> (base); }
+
+  void add_glyph (unsigned glyph_id)
+  { glyphs->add (glyph_id); }
+
+  void add_layer_indices (unsigned first_layer_index, unsigned num_of_layers)
+  { layer_indices->add_range (first_layer_index, first_layer_index + num_of_layers - 1); }
+
+  void add_palette_index (unsigned palette_index)
+  { palette_indices->add (palette_index); }
+
+  public:
+  const void *base;
+  hb_set_t visited_paint;
+  hb_set_t *glyphs;
+  hb_set_t *layer_indices;
+  hb_set_t *palette_indices;
+  unsigned nesting_level_left;
+
+  hb_colrv1_closure_context_t (const void *base_,
+                               hb_set_t *glyphs_,
+                               hb_set_t *layer_indices_,
+                               hb_set_t *palette_indices_,
+                               unsigned nesting_level_left_ = HB_COLRV1_MAX_NESTING_LEVEL) :
+                          base (base_),
+                          glyphs (glyphs_),
+                          layer_indices (layer_indices_),
+                          palette_indices (palette_indices_),
+                          nesting_level_left (nesting_level_left_)
+  {}
+};
+
+struct LayerRecord
+{
+  operator hb_ot_color_layer_t () const { return {glyphId, colorIdx}; }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  public:
+  HBGlyphID16  glyphId;        /* Glyph ID of layer glyph */
+  Index                colorIdx;       /* Index value to use with a
+                                * selected color palette.
+                                * An index value of 0xFFFF
+                                * is a special case indicating
+                                * that the text foreground
+                                * color (defined by a
+                                * higher-level client) should
+                                * be used and shall not be
+                                * treated as actual index
+                                * into CPAL ColorRecord array. */
+  public:
+  DEFINE_SIZE_STATIC (4);
+};
+
+struct BaseGlyphRecord
+{
+  int cmp (hb_codepoint_t g) const
+  { return g < glyphId ? -1 : g > glyphId ? 1 : 0; }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this)));
+  }
+
+  public:
+  HBGlyphID16  glyphId;        /* Glyph ID of reference glyph */
+  HBUINT16     firstLayerIdx;  /* Index (from beginning of
+                                * the Layer Records) to the
+                                * layer record. There will be
+                                * numLayers consecutive entries
+                                * for this base glyph. */
+  HBUINT16     numLayers;      /* Number of color layers
+                                * associated with this glyph */
+  public:
+  DEFINE_SIZE_STATIC (6);
+};
+
+template <typename T>
+struct Variable
+{
+  Variable<T>* copy (hb_serialize_context_t *c) const
+  {
+    TRACE_SERIALIZE (this);
+    return_trace (c->embed (this));
+  }
+
+  void closurev1 (hb_colrv1_closure_context_t* c) const
+  { value.closurev1 (c); }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    if (!value.subset (c)) return_trace (false);
+    return_trace (c->serializer->embed (varIdxBase));
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && value.sanitize (c));
+  }
+
+  protected:
+  T      value;
+  VarIdx varIdxBase;
+  public:
+  DEFINE_SIZE_STATIC (4 + T::static_size);
+};
+
+template <typename T>
+struct NoVariable
+{
+  NoVariable<T>* copy (hb_serialize_context_t *c) const
+  {
+    TRACE_SERIALIZE (this);
+    return_trace (c->embed (this));
+  }
+
+  void closurev1 (hb_colrv1_closure_context_t* c) const
+  { value.closurev1 (c); }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    return_trace (value.subset (c));
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && value.sanitize (c));
+  }
+
+  T      value;
+  public:
+  DEFINE_SIZE_STATIC (T::static_size);
+};
+
+// Color structures
+
+struct ColorStop
+{
+  void closurev1 (hb_colrv1_closure_context_t* c) const
+  { c->add_palette_index (paletteIndex); }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    auto *out = c->serializer->embed (*this);
+    if (unlikely (!out)) return_trace (false);
+    return_trace (c->serializer->check_assign (out->paletteIndex, c->plan->colr_palettes->get (paletteIndex),
+                                               HB_SERIALIZE_ERROR_INT_OVERFLOW));
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  F2DOT14      stopOffset;
+  HBUINT16     paletteIndex;
+  F2DOT14      alpha;
+  public:
+  DEFINE_SIZE_STATIC (2 + 2 * F2DOT14::static_size);
+};
+
+struct Extend : HBUINT8
+{
+  enum {
+    EXTEND_PAD     = 0,
+    EXTEND_REPEAT  = 1,
+    EXTEND_REFLECT = 2,
+  };
+  public:
+  DEFINE_SIZE_STATIC (1);
+};
+
+template <template<typename> class Var>
+struct ColorLine
+{
+  void closurev1 (hb_colrv1_closure_context_t* c) const
+  {
+    for (const auto &stop : stops.iter ())
+      stop.closurev1 (c);
+  }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    auto *out = c->serializer->start_embed (this);
+    if (unlikely (!out)) return_trace (false);
+    if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
+
+    if (!c->serializer->check_assign (out->extend, extend, HB_SERIALIZE_ERROR_INT_OVERFLOW)) return_trace (false);
+    if (!c->serializer->check_assign (out->stops.len, stops.len, HB_SERIALIZE_ERROR_ARRAY_OVERFLOW)) return_trace (false);
+
+    for (const auto& stop : stops.iter ())
+    {
+      if (!stop.subset (c)) return_trace (false);
+    }
+    return_trace (true);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+                  stops.sanitize (c));
+  }
+
+  Extend       extend;
+  Array16Of<Var<ColorStop>>    stops;
+  public:
+  DEFINE_SIZE_ARRAY_SIZED (3, stops);
+};
+
+// Composition modes
+
+// Compositing modes are taken from https://www.w3.org/TR/compositing-1/
+// NOTE: a brief audit of major implementations suggests most support most
+// or all of the specified modes.
+struct CompositeMode : HBUINT8
+{
+  enum {
+    // Porter-Duff modes
+    // https://www.w3.org/TR/compositing-1/#porterduffcompositingoperators
+    COMPOSITE_CLEAR          =  0,  // https://www.w3.org/TR/compositing-1/#porterduffcompositingoperators_clear
+    COMPOSITE_SRC            =  1,  // https://www.w3.org/TR/compositing-1/#porterduffcompositingoperators_src
+    COMPOSITE_DEST           =  2,  // https://www.w3.org/TR/compositing-1/#porterduffcompositingoperators_dst
+    COMPOSITE_SRC_OVER       =  3,  // https://www.w3.org/TR/compositing-1/#porterduffcompositingoperators_srcover
+    COMPOSITE_DEST_OVER      =  4,  // https://www.w3.org/TR/compositing-1/#porterduffcompositingoperators_dstover
+    COMPOSITE_SRC_IN         =  5,  // https://www.w3.org/TR/compositing-1/#porterduffcompositingoperators_srcin
+    COMPOSITE_DEST_IN        =  6,  // https://www.w3.org/TR/compositing-1/#porterduffcompositingoperators_dstin
+    COMPOSITE_SRC_OUT        =  7,  // https://www.w3.org/TR/compositing-1/#porterduffcompositingoperators_srcout
+    COMPOSITE_DEST_OUT       =  8,  // https://www.w3.org/TR/compositing-1/#porterduffcompositingoperators_dstout
+    COMPOSITE_SRC_ATOP       =  9,  // https://www.w3.org/TR/compositing-1/#porterduffcompositingoperators_srcatop
+    COMPOSITE_DEST_ATOP      = 10,  // https://www.w3.org/TR/compositing-1/#porterduffcompositingoperators_dstatop
+    COMPOSITE_XOR            = 11,  // https://www.w3.org/TR/compositing-1/#porterduffcompositingoperators_xor
+    COMPOSITE_PLUS           = 12,  // https://www.w3.org/TR/compositing-1/#porterduffcompositingoperators_plus
+
+    // Blend modes
+    // https://www.w3.org/TR/compositing-1/#blending
+    COMPOSITE_SCREEN         = 13,  // https://www.w3.org/TR/compositing-1/#blendingscreen
+    COMPOSITE_OVERLAY        = 14,  // https://www.w3.org/TR/compositing-1/#blendingoverlay
+    COMPOSITE_DARKEN         = 15,  // https://www.w3.org/TR/compositing-1/#blendingdarken
+    COMPOSITE_LIGHTEN        = 16,  // https://www.w3.org/TR/compositing-1/#blendinglighten
+    COMPOSITE_COLOR_DODGE    = 17,  // https://www.w3.org/TR/compositing-1/#blendingcolordodge
+    COMPOSITE_COLOR_BURN     = 18,  // https://www.w3.org/TR/compositing-1/#blendingcolorburn
+    COMPOSITE_HARD_LIGHT     = 19,  // https://www.w3.org/TR/compositing-1/#blendinghardlight
+    COMPOSITE_SOFT_LIGHT     = 20,  // https://www.w3.org/TR/compositing-1/#blendingsoftlight
+    COMPOSITE_DIFFERENCE     = 21,  // https://www.w3.org/TR/compositing-1/#blendingdifference
+    COMPOSITE_EXCLUSION      = 22,  // https://www.w3.org/TR/compositing-1/#blendingexclusion
+    COMPOSITE_MULTIPLY       = 23,  // https://www.w3.org/TR/compositing-1/#blendingmultiply
+
+    // Modes that, uniquely, do not operate on components
+    // https://www.w3.org/TR/compositing-1/#blendingnonseparable
+    COMPOSITE_HSL_HUE        = 24,  // https://www.w3.org/TR/compositing-1/#blendinghue
+    COMPOSITE_HSL_SATURATION = 25,  // https://www.w3.org/TR/compositing-1/#blendingsaturation
+    COMPOSITE_HSL_COLOR      = 26,  // https://www.w3.org/TR/compositing-1/#blendingcolor
+    COMPOSITE_HSL_LUMINOSITY = 27,  // https://www.w3.org/TR/compositing-1/#blendingluminosity
+  };
+  public:
+  DEFINE_SIZE_STATIC (1);
+};
+
+struct Affine2x3
+{
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  HBFixed xx;
+  HBFixed yx;
+  HBFixed xy;
+  HBFixed yy;
+  HBFixed dx;
+  HBFixed dy;
+  public:
+  DEFINE_SIZE_STATIC (6 * HBFixed::static_size);
+};
+
+struct PaintColrLayers
+{
+  void closurev1 (hb_colrv1_closure_context_t* c) const;
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    auto *out = c->serializer->embed (this);
+    if (unlikely (!out)) return_trace (false);
+    return_trace (c->serializer->check_assign (out->firstLayerIndex, c->plan->colrv1_layers->get (firstLayerIndex),
+                                               HB_SERIALIZE_ERROR_INT_OVERFLOW));
+
+    return_trace (true);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  HBUINT8      format; /* format = 1 */
+  HBUINT8      numLayers;
+  HBUINT32     firstLayerIndex;  /* index into COLRv1::layerList */
+  public:
+  DEFINE_SIZE_STATIC (6);
+};
+
+struct PaintSolid
+{
+  void closurev1 (hb_colrv1_closure_context_t* c) const
+  { c->add_palette_index (paletteIndex); }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    auto *out = c->serializer->embed (*this);
+    if (unlikely (!out)) return_trace (false);
+    return_trace (c->serializer->check_assign (out->paletteIndex, c->plan->colr_palettes->get (paletteIndex),
+                                               HB_SERIALIZE_ERROR_INT_OVERFLOW));
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  HBUINT8      format; /* format = 2(noVar) or 3(Var)*/
+  HBUINT16     paletteIndex;
+  F2DOT14      alpha;
+  public:
+  DEFINE_SIZE_STATIC (3 + F2DOT14::static_size);
+};
+
+template <template<typename> class Var>
+struct PaintLinearGradient
+{
+  void closurev1 (hb_colrv1_closure_context_t* c) const
+  { (this+colorLine).closurev1 (c); }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    auto *out = c->serializer->embed (this);
+    if (unlikely (!out)) return_trace (false);
+
+    return_trace (out->colorLine.serialize_subset (c, colorLine, this));
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && colorLine.sanitize (c, this));
+  }
+
+  HBUINT8                      format; /* format = 4(noVar) or 5 (Var) */
+  Offset24To<ColorLine<Var>>   colorLine; /* Offset (from beginning of PaintLinearGradient
+                                            * table) to ColorLine subtable. */
+  FWORD                        x0;
+  FWORD                        y0;
+  FWORD                        x1;
+  FWORD                        y1;
+  FWORD                        x2;
+  FWORD                        y2;
+  public:
+  DEFINE_SIZE_STATIC (4 + 6 * FWORD::static_size);
+};
+
+template <template<typename> class Var>
+struct PaintRadialGradient
+{
+  void closurev1 (hb_colrv1_closure_context_t* c) const
+  { (this+colorLine).closurev1 (c); }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    auto *out = c->serializer->embed (this);
+    if (unlikely (!out)) return_trace (false);
+
+    return_trace (out->colorLine.serialize_subset (c, colorLine, this));
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && colorLine.sanitize (c, this));
+  }
+
+  HBUINT8                      format; /* format = 6(noVar) or 7 (Var) */
+  Offset24To<ColorLine<Var>>   colorLine; /* Offset (from beginning of PaintRadialGradient
+                                            * table) to ColorLine subtable. */
+  FWORD                        x0;
+  FWORD                        y0;
+  UFWORD               radius0;
+  FWORD                        x1;
+  FWORD                        y1;
+  UFWORD               radius1;
+  public:
+  DEFINE_SIZE_STATIC (4 + 6 * FWORD::static_size);
+};
+
+template <template<typename> class Var>
+struct PaintSweepGradient
+{
+  void closurev1 (hb_colrv1_closure_context_t* c) const
+  { (this+colorLine).closurev1 (c); }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    auto *out = c->serializer->embed (this);
+    if (unlikely (!out)) return_trace (false);
+
+    return_trace (out->colorLine.serialize_subset (c, colorLine, this));
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && colorLine.sanitize (c, this));
+  }
+
+  HBUINT8                      format; /* format = 8(noVar) or 9 (Var) */
+  Offset24To<ColorLine<Var>>   colorLine; /* Offset (from beginning of PaintSweepGradient
+                                            * table) to ColorLine subtable. */
+  FWORD                        centerX;
+  FWORD                        centerY;
+  F2DOT14              startAngle;
+  F2DOT14              endAngle;
+  public:
+  DEFINE_SIZE_STATIC (4 + 2 * FWORD::static_size + 2 * F2DOT14::static_size);
+};
+
+struct Paint;
+// Paint a non-COLR glyph, filled as indicated by paint.
+struct PaintGlyph
+{
+  void closurev1 (hb_colrv1_closure_context_t* c) const;
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    auto *out = c->serializer->embed (this);
+    if (unlikely (!out)) return_trace (false);
+
+    if (! c->serializer->check_assign (out->gid, c->plan->glyph_map->get (gid),
+                                       HB_SERIALIZE_ERROR_INT_OVERFLOW))
+      return_trace (false);
+
+    return_trace (out->paint.serialize_subset (c, paint, this));
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && paint.sanitize (c, this));
+  }
+
+  HBUINT8              format; /* format = 10 */
+  Offset24To<Paint>    paint;  /* Offset (from beginning of PaintGlyph table) to Paint subtable. */
+  HBUINT16             gid;
+  public:
+  DEFINE_SIZE_STATIC (6);
+};
+
+struct PaintColrGlyph
+{
+  void closurev1 (hb_colrv1_closure_context_t* c) const;
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    auto *out = c->serializer->embed (this);
+    if (unlikely (!out)) return_trace (false);
+
+    return_trace (c->serializer->check_assign (out->gid, c->plan->glyph_map->get (gid),
+                                               HB_SERIALIZE_ERROR_INT_OVERFLOW));
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  HBUINT8      format; /* format = 11 */
+  HBUINT16     gid;
+  public:
+  DEFINE_SIZE_STATIC (3);
+};
+
+template <template<typename> class Var>
+struct PaintTransform
+{
+  HB_INTERNAL void closurev1 (hb_colrv1_closure_context_t* c) const;
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    auto *out = c->serializer->embed (this);
+    if (unlikely (!out)) return_trace (false);
+    if (!out->transform.serialize_copy (c->serializer, transform, this)) return_trace (false);
+    return_trace (out->src.serialize_subset (c, src, this));
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+                  src.sanitize (c, this) &&
+                  transform.sanitize (c, this));
+  }
+
+  HBUINT8                      format; /* format = 12(noVar) or 13 (Var) */
+  Offset24To<Paint>            src; /* Offset (from beginning of PaintTransform table) to Paint subtable. */
+  Offset24To<Var<Affine2x3>>   transform;
+  public:
+  DEFINE_SIZE_STATIC (7);
+};
+
+struct PaintTranslate
+{
+  HB_INTERNAL void closurev1 (hb_colrv1_closure_context_t* c) const;
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    auto *out = c->serializer->embed (this);
+    if (unlikely (!out)) return_trace (false);
+
+    return_trace (out->src.serialize_subset (c, src, this));
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && src.sanitize (c, this));
+  }
+
+  HBUINT8              format; /* format = 14(noVar) or 15 (Var) */
+  Offset24To<Paint>    src; /* Offset (from beginning of PaintTranslate table) to Paint subtable. */
+  FWORD                dx;
+  FWORD                dy;
+  public:
+  DEFINE_SIZE_STATIC (4 + 2 * FWORD::static_size);
+};
+
+struct PaintScale
+{
+  HB_INTERNAL void closurev1 (hb_colrv1_closure_context_t* c) const;
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    auto *out = c->serializer->embed (this);
+    if (unlikely (!out)) return_trace (false);
+
+    return_trace (out->src.serialize_subset (c, src, this));
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && src.sanitize (c, this));
+  }
+
+  HBUINT8              format; /* format = 16 (noVar) or 17(Var) */
+  Offset24To<Paint>    src; /* Offset (from beginning of PaintScale table) to Paint subtable. */
+  F2DOT14              scaleX;
+  F2DOT14              scaleY;
+  public:
+  DEFINE_SIZE_STATIC (4 + 2 * F2DOT14::static_size);
+};
+
+struct PaintScaleAroundCenter
+{
+  HB_INTERNAL void closurev1 (hb_colrv1_closure_context_t* c) const;
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    auto *out = c->serializer->embed (this);
+    if (unlikely (!out)) return_trace (false);
+
+    return_trace (out->src.serialize_subset (c, src, this));
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && src.sanitize (c, this));
+  }
+
+  HBUINT8              format; /* format = 18 (noVar) or 19(Var) */
+  Offset24To<Paint>    src; /* Offset (from beginning of PaintScaleAroundCenter table) to Paint subtable. */
+  F2DOT14      scaleX;
+  F2DOT14      scaleY;
+  FWORD                centerX;
+  FWORD                centerY;
+  public:
+  DEFINE_SIZE_STATIC (4 + 2 * F2DOT14::static_size + 2 * FWORD::static_size);
+};
+
+struct PaintScaleUniform
+{
+  HB_INTERNAL void closurev1 (hb_colrv1_closure_context_t* c) const;
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    auto *out = c->serializer->embed (this);
+    if (unlikely (!out)) return_trace (false);
+
+    return_trace (out->src.serialize_subset (c, src, this));
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && src.sanitize (c, this));
+  }
+
+  HBUINT8              format; /* format = 20 (noVar) or 21(Var) */
+  Offset24To<Paint>    src; /* Offset (from beginning of PaintScaleUniform table) to Paint subtable. */
+  F2DOT14              scale;
+  public:
+  DEFINE_SIZE_STATIC (4 + F2DOT14::static_size);
+};
+
+struct PaintScaleUniformAroundCenter
+{
+  HB_INTERNAL void closurev1 (hb_colrv1_closure_context_t* c) const;
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    auto *out = c->serializer->embed (this);
+    if (unlikely (!out)) return_trace (false);
+
+    return_trace (out->src.serialize_subset (c, src, this));
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && src.sanitize (c, this));
+  }
+
+  HBUINT8              format; /* format = 22 (noVar) or 23(Var) */
+  Offset24To<Paint>    src; /* Offset (from beginning of PaintScaleUniformAroundCenter table) to Paint subtable. */
+  F2DOT14      scale;
+  FWORD                centerX;
+  FWORD                centerY;
+  public:
+  DEFINE_SIZE_STATIC (4 + F2DOT14::static_size + 2 * FWORD::static_size);
+};
+
+struct PaintRotate
+{
+  HB_INTERNAL void closurev1 (hb_colrv1_closure_context_t* c) const;
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    auto *out = c->serializer->embed (this);
+    if (unlikely (!out)) return_trace (false);
 
-struct LayerRecord
+    return_trace (out->src.serialize_subset (c, src, this));
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && src.sanitize (c, this));
+  }
+
+  HBUINT8              format; /* format = 24 (noVar) or 25(Var) */
+  Offset24To<Paint>    src; /* Offset (from beginning of PaintRotate table) to Paint subtable. */
+  F2DOT14              angle;
+  public:
+  DEFINE_SIZE_STATIC (4 + F2DOT14::static_size);
+};
+
+struct PaintRotateAroundCenter
 {
-  operator hb_ot_color_layer_t () const { return {glyphId, colorIdx}; }
+  HB_INTERNAL void closurev1 (hb_colrv1_closure_context_t* c) const;
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    auto *out = c->serializer->embed (this);
+    if (unlikely (!out)) return_trace (false);
+
+    return_trace (out->src.serialize_subset (c, src, this));
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && src.sanitize (c, this));
+  }
+
+  HBUINT8              format; /* format = 26 (noVar) or 27(Var) */
+  Offset24To<Paint>    src; /* Offset (from beginning of PaintRotateAroundCenter table) to Paint subtable. */
+  F2DOT14      angle;
+  FWORD                centerX;
+  FWORD                centerY;
+  public:
+  DEFINE_SIZE_STATIC (4 + F2DOT14::static_size + 2 * FWORD::static_size);
+};
+
+struct PaintSkew
+{
+  HB_INTERNAL void closurev1 (hb_colrv1_closure_context_t* c) const;
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    auto *out = c->serializer->embed (this);
+    if (unlikely (!out)) return_trace (false);
+
+    return_trace (out->src.serialize_subset (c, src, this));
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && src.sanitize (c, this));
+  }
+
+  HBUINT8              format; /* format = 28(noVar) or 29 (Var) */
+  Offset24To<Paint>    src; /* Offset (from beginning of PaintSkew table) to Paint subtable. */
+  F2DOT14              xSkewAngle;
+  F2DOT14              ySkewAngle;
+  public:
+  DEFINE_SIZE_STATIC (4 + 2 * F2DOT14::static_size);
+};
+
+struct PaintSkewAroundCenter
+{
+  HB_INTERNAL void closurev1 (hb_colrv1_closure_context_t* c) const;
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    auto *out = c->serializer->embed (this);
+    if (unlikely (!out)) return_trace (false);
+
+    return_trace (out->src.serialize_subset (c, src, this));
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && src.sanitize (c, this));
+  }
+
+  HBUINT8              format; /* format = 30(noVar) or 31 (Var) */
+  Offset24To<Paint>    src; /* Offset (from beginning of PaintSkewAroundCenter table) to Paint subtable. */
+  F2DOT14      xSkewAngle;
+  F2DOT14      ySkewAngle;
+  FWORD                centerX;
+  FWORD                centerY;
+  public:
+  DEFINE_SIZE_STATIC (4 + 2 * F2DOT14::static_size + 2 * FWORD::static_size);
+};
+
+struct PaintComposite
+{
+  void closurev1 (hb_colrv1_closure_context_t* c) const;
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    auto *out = c->serializer->embed (this);
+    if (unlikely (!out)) return_trace (false);
+
+    if (!out->src.serialize_subset (c, src, this)) return_trace (false);
+    return_trace (out->backdrop.serialize_subset (c, backdrop, this));
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+                  src.sanitize (c, this) &&
+                  backdrop.sanitize (c, this));
+  }
+
+  HBUINT8              format; /* format = 32 */
+  Offset24To<Paint>    src; /* Offset (from beginning of PaintComposite table) to source Paint subtable. */
+  CompositeMode                mode;   /* If mode is unrecognized use COMPOSITE_CLEAR */
+  Offset24To<Paint>    backdrop; /* Offset (from beginning of PaintComposite table) to backdrop Paint subtable. */
+  public:
+  DEFINE_SIZE_STATIC (8);
+};
 
+struct ClipBoxFormat1
+{
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -51,45 +896,353 @@ struct LayerRecord
   }
 
   public:
-  HBGlyphID    glyphId;        /* Glyph ID of layer glyph */
-  Index                colorIdx;       /* Index value to use with a
-                                * selected color palette.
-                                * An index value of 0xFFFF
-                                * is a special case indicating
-                                * that the text foreground
-                                * color (defined by a
-                                * higher-level client) should
-                                * be used and shall not be
-                                * treated as actual index
-                                * into CPAL ColorRecord array. */
+  HBUINT8      format; /* format = 1(noVar) or 2(Var)*/
+  FWORD                xMin;
+  FWORD                yMin;
+  FWORD                xMax;
+  FWORD                yMax;
   public:
-  DEFINE_SIZE_STATIC (4);
+  DEFINE_SIZE_STATIC (1 + 4 * FWORD::static_size);
 };
 
-struct BaseGlyphRecord
+struct ClipBoxFormat2 : Variable<ClipBoxFormat1> {};
+
+struct ClipBox
+{
+  ClipBox* copy (hb_serialize_context_t *c) const
+  {
+    TRACE_SERIALIZE (this);
+    switch (u.format) {
+    case 1: return_trace (reinterpret_cast<ClipBox *> (c->embed (u.format1)));
+    case 2: return_trace (reinterpret_cast<ClipBox *> (c->embed (u.format2)));
+    default:return_trace (nullptr);
+    }
+  }
+
+  template <typename context_t, typename ...Ts>
+  typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
+  {
+    TRACE_DISPATCH (this, u.format);
+    if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
+    switch (u.format) {
+    case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...));
+    case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...));
+    default:return_trace (c->default_return_value ());
+    }
+  }
+
+  protected:
+  union {
+  HBUINT8              format;         /* Format identifier */
+  ClipBoxFormat1       format1;
+  ClipBoxFormat2       format2;
+  } u;
+};
+
+struct ClipRecord
+{
+  ClipRecord* copy (hb_serialize_context_t *c, const void *base) const
+  {
+    TRACE_SERIALIZE (this);
+    auto *out = c->embed (this);
+    if (unlikely (!out)) return_trace (nullptr);
+    if (!out->clipBox.serialize_copy (c, clipBox, base)) return_trace (nullptr);
+    return_trace (out);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && clipBox.sanitize (c, base));
+  }
+
+  public:
+  HBUINT16             startGlyphID;  // first gid clip applies to
+  HBUINT16             endGlyphID;    // last gid clip applies to, inclusive
+  Offset24To<ClipBox>  clipBox;   // Box or VarBox
+  public:
+  DEFINE_SIZE_STATIC (7);
+};
+
+struct ClipList
+{
+  unsigned serialize_clip_records (hb_serialize_context_t *c,
+                                   const hb_set_t& gids,
+                                   const hb_map_t& gid_offset_map) const
+  {
+    TRACE_SERIALIZE (this);
+    if (gids.is_empty () ||
+        gid_offset_map.get_population () != gids.get_population ())
+      return_trace (0);
+
+    unsigned count  = 0;
+
+    hb_codepoint_t start_gid= gids.get_min ();
+    hb_codepoint_t prev_gid = start_gid;
+
+    unsigned offset = gid_offset_map.get (start_gid);
+    unsigned prev_offset = offset;
+    for (const hb_codepoint_t _ : gids.iter ())
+    {
+      if (_ == start_gid) continue;
+
+      offset = gid_offset_map.get (_);
+      if (_ == prev_gid + 1 &&  offset == prev_offset)
+      {
+        prev_gid = _;
+        continue;
+      }
+
+      ClipRecord record;
+      record.startGlyphID = start_gid;
+      record.endGlyphID = prev_gid;
+      record.clipBox = prev_offset;
+
+      if (!c->copy (record, this)) return_trace (0);
+      count++;
+
+      start_gid = _;
+      prev_gid = _;
+      prev_offset = offset;
+    }
+
+    //last one
+    {
+      ClipRecord record;
+      record.startGlyphID = start_gid;
+      record.endGlyphID = prev_gid;
+      record.clipBox = prev_offset;
+      if (!c->copy (record, this)) return_trace (0);
+      count++;
+    }
+    return_trace (count);
+  }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    auto *out = c->serializer->start_embed (*this);
+    if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
+    if (!c->serializer->check_assign (out->format, format, HB_SERIALIZE_ERROR_INT_OVERFLOW)) return_trace (false);
+
+    const hb_set_t& glyphset = *c->plan->_glyphset_colred;
+    const hb_map_t &glyph_map = *c->plan->glyph_map;
+
+    hb_map_t new_gid_offset_map;
+    hb_set_t new_gids;
+    for (const ClipRecord& record : clips.iter ())
+    {
+      unsigned start_gid = record.startGlyphID;
+      unsigned end_gid = record.endGlyphID;
+      for (unsigned gid = start_gid; gid <= end_gid; gid++)
+      {
+        if (!glyphset.has (gid) || !glyph_map.has (gid)) continue;
+        unsigned new_gid = glyph_map.get (gid);
+        new_gid_offset_map.set (new_gid, record.clipBox);
+        new_gids.add (new_gid);
+      }
+    }
+
+    unsigned count = serialize_clip_records (c->serializer, new_gids, new_gid_offset_map);
+    if (!count) return_trace (false);
+    return_trace (c->serializer->check_assign (out->clips.len, count, HB_SERIALIZE_ERROR_INT_OVERFLOW));
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && clips.sanitize (c, this));
+  }
+
+  HBUINT8                      format;  // Set to 1.
+  Array32Of<ClipRecord>                clips;  // Clip records, sorted by startGlyphID
+  public:
+  DEFINE_SIZE_ARRAY_SIZED (5, clips);
+};
+
+struct Paint
+{
+
+  template <typename ...Ts>
+  bool sanitize (hb_sanitize_context_t *c, Ts&&... ds) const
+  {
+    TRACE_SANITIZE (this);
+
+    if (unlikely (!c->check_start_recursion (HB_COLRV1_MAX_NESTING_LEVEL)))
+      return_trace (c->no_dispatch_return_value ());
+
+    return_trace (c->end_recursion (this->dispatch (c, std::forward<Ts> (ds)...)));
+  }
+
+  template <typename context_t, typename ...Ts>
+  typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
+  {
+    TRACE_DISPATCH (this, u.format);
+    if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
+    switch (u.format) {
+    case 1: return_trace (c->dispatch (u.paintformat1, std::forward<Ts> (ds)...));
+    case 2: return_trace (c->dispatch (u.paintformat2, std::forward<Ts> (ds)...));
+    case 3: return_trace (c->dispatch (u.paintformat3, std::forward<Ts> (ds)...));
+    case 4: return_trace (c->dispatch (u.paintformat4, std::forward<Ts> (ds)...));
+    case 5: return_trace (c->dispatch (u.paintformat5, std::forward<Ts> (ds)...));
+    case 6: return_trace (c->dispatch (u.paintformat6, std::forward<Ts> (ds)...));
+    case 7: return_trace (c->dispatch (u.paintformat7, std::forward<Ts> (ds)...));
+    case 8: return_trace (c->dispatch (u.paintformat8, std::forward<Ts> (ds)...));
+    case 9: return_trace (c->dispatch (u.paintformat9, std::forward<Ts> (ds)...));
+    case 10: return_trace (c->dispatch (u.paintformat10, std::forward<Ts> (ds)...));
+    case 11: return_trace (c->dispatch (u.paintformat11, std::forward<Ts> (ds)...));
+    case 12: return_trace (c->dispatch (u.paintformat12, std::forward<Ts> (ds)...));
+    case 13: return_trace (c->dispatch (u.paintformat13, std::forward<Ts> (ds)...));
+    case 14: return_trace (c->dispatch (u.paintformat14, std::forward<Ts> (ds)...));
+    case 15: return_trace (c->dispatch (u.paintformat15, std::forward<Ts> (ds)...));
+    case 16: return_trace (c->dispatch (u.paintformat16, std::forward<Ts> (ds)...));
+    case 17: return_trace (c->dispatch (u.paintformat17, std::forward<Ts> (ds)...));
+    case 18: return_trace (c->dispatch (u.paintformat18, std::forward<Ts> (ds)...));
+    case 19: return_trace (c->dispatch (u.paintformat19, std::forward<Ts> (ds)...));
+    case 20: return_trace (c->dispatch (u.paintformat20, std::forward<Ts> (ds)...));
+    case 21: return_trace (c->dispatch (u.paintformat21, std::forward<Ts> (ds)...));
+    case 22: return_trace (c->dispatch (u.paintformat22, std::forward<Ts> (ds)...));
+    case 23: return_trace (c->dispatch (u.paintformat23, std::forward<Ts> (ds)...));
+    case 24: return_trace (c->dispatch (u.paintformat24, std::forward<Ts> (ds)...));
+    case 25: return_trace (c->dispatch (u.paintformat25, std::forward<Ts> (ds)...));
+    case 26: return_trace (c->dispatch (u.paintformat26, std::forward<Ts> (ds)...));
+    case 27: return_trace (c->dispatch (u.paintformat27, std::forward<Ts> (ds)...));
+    case 28: return_trace (c->dispatch (u.paintformat28, std::forward<Ts> (ds)...));
+    case 29: return_trace (c->dispatch (u.paintformat29, std::forward<Ts> (ds)...));
+    case 30: return_trace (c->dispatch (u.paintformat30, std::forward<Ts> (ds)...));
+    case 31: return_trace (c->dispatch (u.paintformat31, std::forward<Ts> (ds)...));
+    case 32: return_trace (c->dispatch (u.paintformat32, std::forward<Ts> (ds)...));
+    default:return_trace (c->default_return_value ());
+    }
+  }
+
+  protected:
+  union {
+  HBUINT8                                      format;
+  PaintColrLayers                              paintformat1;
+  PaintSolid                                   paintformat2;
+  Variable<PaintSolid>                         paintformat3;
+  PaintLinearGradient<NoVariable>              paintformat4;
+  Variable<PaintLinearGradient<Variable>>      paintformat5;
+  PaintRadialGradient<NoVariable>              paintformat6;
+  Variable<PaintRadialGradient<Variable>>      paintformat7;
+  PaintSweepGradient<NoVariable>               paintformat8;
+  Variable<PaintSweepGradient<Variable>>       paintformat9;
+  PaintGlyph                                   paintformat10;
+  PaintColrGlyph                               paintformat11;
+  PaintTransform<NoVariable>                   paintformat12;
+  PaintTransform<Variable>                     paintformat13;
+  PaintTranslate                               paintformat14;
+  Variable<PaintTranslate>                     paintformat15;
+  PaintScale                                   paintformat16;
+  Variable<PaintScale>                         paintformat17;
+  PaintScaleAroundCenter                       paintformat18;
+  Variable<PaintScaleAroundCenter>             paintformat19;
+  PaintScaleUniform                            paintformat20;
+  Variable<PaintScaleUniform>                  paintformat21;
+  PaintScaleUniformAroundCenter                        paintformat22;
+  Variable<PaintScaleUniformAroundCenter>      paintformat23;
+  PaintRotate                                  paintformat24;
+  Variable<PaintRotate>                                paintformat25;
+  PaintRotateAroundCenter                      paintformat26;
+  Variable<PaintRotateAroundCenter>            paintformat27;
+  PaintSkew                                    paintformat28;
+  Variable<PaintSkew>                          paintformat29;
+  PaintSkewAroundCenter                                paintformat30;
+  Variable<PaintSkewAroundCenter>              paintformat31;
+  PaintComposite                               paintformat32;
+  } u;
+};
+
+struct BaseGlyphPaintRecord
 {
   int cmp (hb_codepoint_t g) const
   { return g < glyphId ? -1 : g > glyphId ? 1 : 0; }
 
-  bool sanitize (hb_sanitize_context_t *c) const
+  bool serialize (hb_serialize_context_t *s, const hb_map_t* glyph_map,
+                  const void* src_base, hb_subset_context_t *c) const
+  {
+    TRACE_SERIALIZE (this);
+    auto *out = s->embed (this);
+    if (unlikely (!out)) return_trace (false);
+    if (!s->check_assign (out->glyphId, glyph_map->get (glyphId),
+                          HB_SERIALIZE_ERROR_INT_OVERFLOW))
+      return_trace (false);
+
+    return_trace (out->paint.serialize_subset (c, paint, src_base));
+  }
+
+  bool sanitize (hb_sanitize_context_t *c, const void *base) const
   {
     TRACE_SANITIZE (this);
-    return_trace (likely (c->check_struct (this)));
+    return_trace (likely (c->check_struct (this) && paint.sanitize (c, base)));
   }
 
   public:
-  HBGlyphID    glyphId;        /* Glyph ID of reference glyph */
-  HBUINT16     firstLayerIdx;  /* Index (from beginning of
-                                * the Layer Records) to the
-                                * layer record. There will be
-                                * numLayers consecutive entries
-                                * for this base glyph. */
-  HBUINT16     numLayers;      /* Number of color layers
-                                * associated with this glyph */
+  HBGlyphID16          glyphId;    /* Glyph ID of reference glyph */
+  Offset32To<Paint>    paint;      /* Offset (from beginning of BaseGlyphPaintRecord array) to Paint,
+                                     * Typically PaintColrLayers */
   public:
   DEFINE_SIZE_STATIC (6);
 };
 
+struct BaseGlyphList : SortedArray32Of<BaseGlyphPaintRecord>
+{
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    auto *out = c->serializer->start_embed (this);
+    if (unlikely (!c->serializer->extend_min (out)))  return_trace (false);
+    const hb_set_t* glyphset = c->plan->_glyphset_colred;
+
+    for (const auto& _ : as_array ())
+    {
+      unsigned gid = _.glyphId;
+      if (!glyphset->has (gid)) continue;
+
+      if (_.serialize (c->serializer, c->plan->glyph_map, this, c)) out->len++;
+      else return_trace (false);
+    }
+
+    return_trace (out->len != 0);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (SortedArray32Of<BaseGlyphPaintRecord>::sanitize (c, this));
+  }
+};
+
+struct LayerList : Array32OfOffset32To<Paint>
+{
+  const Paint& get_paint (unsigned i) const
+  { return this+(*this)[i]; }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    auto *out = c->serializer->start_embed (this);
+    if (unlikely (!c->serializer->extend_min (out)))  return_trace (false);
+
+    for (const auto& _ : + hb_enumerate (*this)
+                         | hb_filter (c->plan->colrv1_layers, hb_first))
+
+    {
+      auto *o = out->serialize_append (c->serializer);
+      if (unlikely (!o) || !o->serialize_subset (c, _.second, this))
+        return_trace (false);
+    }
+    return_trace (true);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (Array32OfOffset32To<Paint>::sanitize (c, this));
+  }
+};
+
 struct COLR
 {
   static constexpr hb_tag_t tableTag = HB_OT_TAG_COLR;
@@ -117,13 +1270,9 @@ struct COLR
 
   struct accelerator_t
   {
-    accelerator_t () {}
-    ~accelerator_t () { fini (); }
-
-    void init (hb_face_t *face)
+    accelerator_t (hb_face_t *face)
     { colr = hb_sanitize_context_t ().reference_table<COLR> (face); }
-
-    void fini () { this->colr.destroy (); }
+    ~accelerator_t () { this->colr.destroy (); }
 
     bool is_valid () { return colr.get_blob ()->length; }
 
@@ -131,6 +1280,15 @@ struct COLR
                         hb_set_t *related_ids /* OUT */) const
     { colr->closure_glyphs (glyph, related_ids); }
 
+    void closure_V0palette_indices (const hb_set_t *glyphs,
+                                   hb_set_t *palettes /* OUT */) const
+    { colr->closure_V0palette_indices (glyphs, palettes); }
+
+    void closure_forV1 (hb_set_t *glyphset,
+                        hb_set_t *layer_indices,
+                        hb_set_t *palette_indices) const
+    { colr->closure_forV1 (glyphset, layer_indices, palette_indices); }
+
     private:
     hb_blob_ptr_t<COLR> colr;
   };
@@ -147,52 +1305,118 @@ struct COLR
     related_ids->add_array (&glyph_layers[0].glyphId, glyph_layers.length, LayerRecord::min_size);
   }
 
+  void closure_V0palette_indices (const hb_set_t *glyphs,
+                                 hb_set_t *palettes /* OUT */) const
+  {
+    if (!numBaseGlyphs || !numLayers) return;
+    hb_array_t<const BaseGlyphRecord> baseGlyphs = (this+baseGlyphsZ).as_array (numBaseGlyphs);
+    hb_array_t<const LayerRecord> all_layers = (this+layersZ).as_array (numLayers);
+
+    for (const BaseGlyphRecord record : baseGlyphs)
+    {
+      if (!glyphs->has (record.glyphId)) continue;
+      hb_array_t<const LayerRecord> glyph_layers = all_layers.sub_array (record.firstLayerIdx,
+                                                                   record.numLayers);
+      for (const LayerRecord layer : glyph_layers)
+        palettes->add (layer.colorIdx);
+    }
+  }
+
+  void closure_forV1 (hb_set_t *glyphset,
+                      hb_set_t *layer_indices,
+                      hb_set_t *palette_indices) const
+  {
+    if (version != 1) return;
+    hb_set_t visited_glyphs;
+
+    hb_colrv1_closure_context_t c (this, &visited_glyphs, layer_indices, palette_indices);
+    const BaseGlyphList &baseglyph_paintrecords = this+baseGlyphList;
+
+    for (const BaseGlyphPaintRecord &baseglyph_paintrecord: baseglyph_paintrecords.iter ())
+    {
+      unsigned gid = baseglyph_paintrecord.glyphId;
+      if (!glyphset->has (gid)) continue;
+
+      const Paint &paint = &baseglyph_paintrecords+baseglyph_paintrecord.paint;
+      paint.dispatch (&c);
+    }
+    hb_set_union (glyphset, &visited_glyphs);
+  }
+
+  const LayerList& get_layerList () const
+  { return (this+layerList); }
+
+  const BaseGlyphList& get_baseglyphList () const
+  { return (this+baseGlyphList); }
+
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
-    return_trace (likely (c->check_struct (this) &&
-                         (this+baseGlyphsZ).sanitize (c, numBaseGlyphs) &&
-                         (this+layersZ).sanitize (c, numLayers)));
+    return_trace (c->check_struct (this) &&
+                  (this+baseGlyphsZ).sanitize (c, numBaseGlyphs) &&
+                  (this+layersZ).sanitize (c, numLayers) &&
+                  (version == 0 ||
+                  (COLRV1_ENABLE_SUBSETTING && version == 1 &&
+                   baseGlyphList.sanitize (c, this) &&
+                   layerList.sanitize (c, this) &&
+                   clipList.sanitize (c, this) &&
+                   varIdxMap.sanitize (c, this) &&
+                   varStore.sanitize (c, this))));
   }
 
   template<typename BaseIterator, typename LayerIterator,
           hb_requires (hb_is_iterator (BaseIterator)),
           hb_requires (hb_is_iterator (LayerIterator))>
-  bool serialize (hb_serialize_context_t *c,
-                 unsigned version,
-                 BaseIterator base_it,
-                 LayerIterator layer_it)
+  bool serialize_V0 (hb_serialize_context_t *c,
+                    unsigned version,
+                    BaseIterator base_it,
+                    LayerIterator layer_it)
   {
     TRACE_SERIALIZE (this);
     if (unlikely (base_it.len () != layer_it.len ()))
       return_trace (false);
 
-    if (unlikely (!c->extend_min (this))) return_trace (false);
     this->version = version;
     numLayers = 0;
     numBaseGlyphs = base_it.len ();
-    baseGlyphsZ = COLR::min_size;
-    layersZ = COLR::min_size + numBaseGlyphs * BaseGlyphRecord::min_size;
+    if (numBaseGlyphs == 0)
+    {
+      baseGlyphsZ = 0;
+      layersZ = 0;
+      return_trace (true);
+    }
 
-    for (const hb_item_type<BaseIterator>& _ : + base_it.iter ())
+    c->push ();
+    for (const hb_item_type<BaseIterator> _ : + base_it.iter ())
     {
       auto* record = c->embed (_);
       if (unlikely (!record)) return_trace (false);
       record->firstLayerIdx = numLayers;
       numLayers += record->numLayers;
     }
+    c->add_link (baseGlyphsZ, c->pop_pack ());
 
+    c->push ();
     for (const hb_item_type<LayerIterator>& _ : + layer_it.iter ())
       _.as_array ().copy (c);
 
+    c->add_link (layersZ, c->pop_pack ());
+
     return_trace (true);
   }
 
   const BaseGlyphRecord* get_base_glyph_record (hb_codepoint_t gid) const
   {
-    if ((unsigned int) gid == 0) // Ignore notdef.
-      return nullptr;
     const BaseGlyphRecord* record = &(this+baseGlyphsZ).bsearch (numBaseGlyphs, (unsigned int) gid);
+    if (record == &Null (BaseGlyphRecord) ||
+        (record && (hb_codepoint_t) record->glyphId != gid))
+      record = nullptr;
+    return record;
+  }
+
+  const BaseGlyphPaintRecord* get_base_glyph_paintrecord (hb_codepoint_t gid) const
+  {
+    const BaseGlyphPaintRecord* record = &(this+baseGlyphList).bsearch ((unsigned) gid);
     if ((record && (hb_codepoint_t) record->glyphId != gid))
       record = nullptr;
     return record;
@@ -203,9 +1427,16 @@ struct COLR
     TRACE_SUBSET (this);
 
     const hb_map_t &reverse_glyph_map = *c->plan->reverse_glyph_map;
+    const hb_set_t& glyphset = *c->plan->_glyphset_colred;
 
     auto base_it =
     + hb_range (c->plan->num_output_glyphs ())
+    | hb_filter ([&](hb_codepoint_t new_gid)
+                {
+                   hb_codepoint_t old_gid = reverse_glyph_map.get (new_gid);
+                   if (glyphset.has (old_gid)) return true;
+                   return false;
+                })
     | hb_map_retains_sorting ([&](hb_codepoint_t new_gid)
                              {
                                hb_codepoint_t old_gid = reverse_glyph_map.get (new_gid);
@@ -213,8 +1444,7 @@ struct COLR
                                const BaseGlyphRecord* old_record = get_base_glyph_record (old_gid);
                                if (unlikely (!old_record))
                                  return hb_pair_t<bool, BaseGlyphRecord> (false, Null (BaseGlyphRecord));
-
-                               BaseGlyphRecord new_record;
+                               BaseGlyphRecord new_record = {};
                                new_record.glyphId = new_gid;
                                new_record.numLayers = old_record->numLayers;
                                return hb_pair_t<bool, BaseGlyphRecord> (true, new_record);
@@ -226,6 +1456,7 @@ struct COLR
     auto layer_it =
     + hb_range (c->plan->num_output_glyphs ())
     | hb_map (reverse_glyph_map)
+    | hb_filter (glyphset)
     | hb_map_retains_sorting ([&](hb_codepoint_t old_gid)
                              {
                                const BaseGlyphRecord* old_record = get_base_glyph_record (old_gid);
@@ -245,6 +1476,7 @@ struct COLR
                                  if (unlikely (!c->plan->new_gid_for_old_gid (out_layers[i].glyphId, &new_gid)))
                                    return hb_pair_t<bool, hb_vector_t<LayerRecord>> (false, out_layers);
                                  out_layers[i].glyphId = new_gid;
+                                 out_layers[i].colorIdx = c->plan->colr_palettes->get (layers[i].colorIdx);
                                }
 
                                return hb_pair_t<bool, hb_vector_t<LayerRecord>> (true, out_layers);
@@ -253,23 +1485,54 @@ struct COLR
     | hb_map_retains_sorting (hb_second)
     ;
 
-    if (unlikely (!base_it || !layer_it || base_it.len () != layer_it.len ()))
+    if (version == 0 && (!base_it || !layer_it))
       return_trace (false);
 
     COLR *colr_prime = c->serializer->start_embed<COLR> ();
-    return_trace (colr_prime->serialize (c->serializer, version, base_it, layer_it));
+    if (unlikely (!c->serializer->extend_min (colr_prime)))  return_trace (false);
+
+    if (version == 0)
+    return_trace (colr_prime->serialize_V0 (c->serializer, version, base_it, layer_it));
+
+    auto snap = c->serializer->snapshot ();
+    if (!c->serializer->allocate_size<void> (5 * HBUINT32::static_size)) return_trace (false);
+    if (!colr_prime->baseGlyphList.serialize_subset (c, baseGlyphList, this))
+    {
+      if (c->serializer->in_error ()) return_trace (false);
+      //no more COLRv1 glyphs: downgrade to version 0
+      c->serializer->revert (snap);
+      return_trace (colr_prime->serialize_V0 (c->serializer, 0, base_it, layer_it));
+    }
+
+    if (!colr_prime->serialize_V0 (c->serializer, version, base_it, layer_it)) return_trace (false);
+
+    colr_prime->layerList.serialize_subset (c, layerList, this);
+    colr_prime->clipList.serialize_subset (c, clipList, this);
+    colr_prime->varIdxMap.serialize_copy (c->serializer, varIdxMap, this);
+    //TODO: subset varStore once it's implemented in fonttools
+    return_trace (true);
   }
 
   protected:
   HBUINT16     version;        /* Table version number (starts at 0). */
   HBUINT16     numBaseGlyphs;  /* Number of Base Glyph Records. */
-  LNNOffsetTo<SortedUnsizedArrayOf<BaseGlyphRecord>>
+  NNOffset32To<SortedUnsizedArrayOf<BaseGlyphRecord>>
                baseGlyphsZ;    /* Offset to Base Glyph records. */
-  LNNOffsetTo<UnsizedArrayOf<LayerRecord>>
+  NNOffset32To<UnsizedArrayOf<LayerRecord>>
                layersZ;        /* Offset to Layer Records. */
   HBUINT16     numLayers;      /* Number of Layer Records. */
+  // Version-1 additions
+  Offset32To<BaseGlyphList>            baseGlyphList;
+  Offset32To<LayerList>                        layerList;
+  Offset32To<ClipList>                 clipList;   // Offset to ClipList table (may be NULL)
+  Offset32To<DeltaSetIndexMap>         varIdxMap;  // Offset to DeltaSetIndexMap table (may be NULL)
+  Offset32To<VariationStore>           varStore;
   public:
-  DEFINE_SIZE_STATIC (14);
+  DEFINE_SIZE_MIN (14);
+};
+
+struct COLR_accelerator_t : COLR::accelerator_t {
+  COLR_accelerator_t (hb_face_t *face) : COLR::accelerator_t (face) {}
 };
 
 } /* namespace OT */
diff --git a/src/hb-ot-color-colrv1-closure.hh b/src/hb-ot-color-colrv1-closure.hh
new file mode 100644 (file)
index 0000000..fbaf2ec
--- /dev/null
@@ -0,0 +1,108 @@
+/*
+ * Copyright © 2018  Ebrahim Byagowi
+ * Copyright © 2020  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.
+ *
+ */
+
+#ifndef HB_OT_COLR_COLRV1_CLOSURE_HH
+#define HB_OT_COLR_COLRV1_CLOSURE_HH
+
+#include "hb-open-type.hh"
+#include "hb-ot-layout-common.hh"
+#include "hb-ot-color-colr-table.hh"
+
+/*
+ * COLR -- Color
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/colr
+ */
+namespace OT {
+
+HB_INTERNAL void PaintColrLayers::closurev1 (hb_colrv1_closure_context_t* c) const
+{
+  c->add_layer_indices (firstLayerIndex, numLayers);
+  const LayerList &paint_offset_lists = c->get_colr_table ()->get_layerList ();
+  for (unsigned i = firstLayerIndex; i < firstLayerIndex + numLayers; i++)
+  {
+    const Paint &paint = std::addressof (paint_offset_lists) + paint_offset_lists[i];
+    paint.dispatch (c);
+  }
+}
+
+HB_INTERNAL void PaintGlyph::closurev1 (hb_colrv1_closure_context_t* c) const
+{
+  c->add_glyph (gid);
+  (this+paint).dispatch (c);
+}
+
+HB_INTERNAL void PaintColrGlyph::closurev1 (hb_colrv1_closure_context_t* c) const
+{
+  const COLR *colr_table = c->get_colr_table ();
+  const BaseGlyphPaintRecord* baseglyph_paintrecord = colr_table->get_base_glyph_paintrecord (gid);
+  if (!baseglyph_paintrecord) return;
+  c->add_glyph (gid);
+
+  const BaseGlyphList &baseglyph_list = colr_table->get_baseglyphList ();
+  (&baseglyph_list+baseglyph_paintrecord->paint).dispatch (c);
+}
+
+template <template<typename> class Var>
+HB_INTERNAL void PaintTransform<Var>::closurev1 (hb_colrv1_closure_context_t* c) const
+{ (this+src).dispatch (c); }
+
+HB_INTERNAL void PaintTranslate::closurev1 (hb_colrv1_closure_context_t* c) const
+{ (this+src).dispatch (c); }
+
+HB_INTERNAL void PaintScale::closurev1 (hb_colrv1_closure_context_t* c) const
+{ (this+src).dispatch (c); }
+
+HB_INTERNAL void PaintScaleAroundCenter::closurev1 (hb_colrv1_closure_context_t* c) const
+{ (this+src).dispatch (c); }
+
+HB_INTERNAL void PaintScaleUniform::closurev1 (hb_colrv1_closure_context_t* c) const
+{ (this+src).dispatch (c); }
+
+HB_INTERNAL void PaintScaleUniformAroundCenter::closurev1 (hb_colrv1_closure_context_t* c) const
+{ (this+src).dispatch (c); }
+
+HB_INTERNAL void PaintRotate::closurev1 (hb_colrv1_closure_context_t* c) const
+{ (this+src).dispatch (c); }
+
+HB_INTERNAL void PaintRotateAroundCenter::closurev1 (hb_colrv1_closure_context_t* c) const
+{ (this+src).dispatch (c); }
+
+HB_INTERNAL void PaintSkew::closurev1 (hb_colrv1_closure_context_t* c) const
+{ (this+src).dispatch (c); }
+
+HB_INTERNAL void PaintSkewAroundCenter::closurev1 (hb_colrv1_closure_context_t* c) const
+{ (this+src).dispatch (c); }
+
+HB_INTERNAL void PaintComposite::closurev1 (hb_colrv1_closure_context_t* c) const
+{
+  (this+src).dispatch (c);
+  (this+backdrop).dispatch (c);
+}
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_COLR_COLRV1_CLOSURE_HH */
index ce9f76e..a9deeba 100644 (file)
@@ -39,7 +39,6 @@
  */
 #define HB_OT_TAG_CPAL HB_TAG('C','P','A','L')
 
-
 namespace OT {
 
 
@@ -74,6 +73,44 @@ struct CPALV1Tail
   }
 
   public:
+  bool serialize (hb_serialize_context_t *c,
+                  unsigned palette_count,
+                  unsigned color_count,
+                  const void *base,
+                  const hb_map_t *color_index_map) const
+  {
+    TRACE_SERIALIZE (this);
+    auto *out = c->allocate_size<CPALV1Tail> (static_size);
+    if (unlikely (!out)) return_trace (false);
+
+    out->paletteFlagsZ = 0;
+    if (paletteFlagsZ)
+      out->paletteFlagsZ.serialize_copy (c, paletteFlagsZ, base, 0, hb_serialize_context_t::Head, palette_count);
+
+    out->paletteLabelsZ = 0;
+    if (paletteLabelsZ)
+      out->paletteLabelsZ.serialize_copy (c, paletteLabelsZ, base, 0, hb_serialize_context_t::Head, palette_count);
+
+    const hb_array_t<const NameID> colorLabels = (base+colorLabelsZ).as_array (color_count);
+    if (colorLabelsZ)
+    {
+      c->push ();
+      for (const auto _ : colorLabels)
+      {
+        if (!color_index_map->has (_)) continue;
+        NameID new_color_idx;
+        new_color_idx = color_index_map->get (_);
+        if (!c->copy<NameID> (new_color_idx))
+        {
+          c->pop_discard ();
+          return_trace (false);
+        }
+      }
+      c->add_link (out->colorLabelsZ, c->pop_pack ());
+    }
+    return_trace (true);
+  }
+
   bool sanitize (hb_sanitize_context_t *c,
                 const void *base,
                 unsigned int palette_count,
@@ -87,15 +124,17 @@ struct CPALV1Tail
   }
 
   protected:
-  LNNOffsetTo<UnsizedArrayOf<HBUINT32>>
+  // TODO(garretrieger): these offsets can hold nulls so we should not be using non-null offsets
+  //                     here. Currently they are needed since UnsizedArrayOf doesn't define null_size
+  NNOffset32To<UnsizedArrayOf<HBUINT32>>
                paletteFlagsZ;          /* Offset from the beginning of CPAL table to
                                         * the Palette Type Array. Set to 0 if no array
                                         * is provided. */
-  LNNOffsetTo<UnsizedArrayOf<NameID>>
+  NNOffset32To<UnsizedArrayOf<NameID>>
                paletteLabelsZ;         /* Offset from the beginning of CPAL table to
                                         * the palette labels array. Set to 0 if no
                                         * array is provided. */
-  LNNOffsetTo<UnsizedArrayOf<NameID>>
+  NNOffset32To<UnsizedArrayOf<NameID>>
                colorLabelsZ;           /* Offset from the beginning of CPAL table to
                                         * the color labels array. Set to 0
                                         * if no array is provided. */
@@ -142,12 +181,9 @@ struct CPAL
                                                                       numColors);
     if (color_count)
     {
-      hb_array_t<const BGRAColor> segment_colors = palette_colors.sub_array (start_offset, *color_count);
-      /* Always return numColors colors per palette even if it has out-of-bounds start index. */
-      unsigned int count = hb_min ((unsigned) hb_max ((int) (numColors - start_offset), 0), *color_count);
-      *color_count = count;
-      for (unsigned int i = 0; i < count; i++)
-       colors[i] = segment_colors[i]; /* Bound-checked read. */
+      + palette_colors.sub_array (start_offset, color_count)
+      | hb_sink (hb_array (colors, *color_count))
+      ;
     }
     return numColors;
   }
@@ -160,6 +196,84 @@ struct CPAL
   }
 
   public:
+  bool serialize (hb_serialize_context_t *c,
+                  const hb_array_t<const BGRAColor> &color_records,
+                  const hb_array_t<const HBUINT16> &color_record_indices,
+                  const hb_map_t &color_record_index_map,
+                  const hb_set_t &retained_color_record_indices) const
+  {
+    TRACE_SERIALIZE (this);
+
+    for (const auto idx : color_record_indices)
+    {
+      HBUINT16 new_idx;
+      if (idx == 0) new_idx = 0;
+      else new_idx = color_record_index_map.get (idx);
+      if (!c->copy<HBUINT16> (new_idx)) return_trace (false);
+    }
+
+    c->push ();
+    for (const auto _ : retained_color_record_indices.iter ())
+    {
+      if (!c->copy<BGRAColor> (color_records[_]))
+      {
+        c->pop_discard ();
+        return_trace (false);
+      }
+    }
+    c->add_link (colorRecordsZ, c->pop_pack ());
+    return_trace (true);
+  }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    const hb_map_t *color_index_map = c->plan->colr_palettes;
+    if (color_index_map->is_empty ()) return_trace (false);
+
+    hb_set_t retained_color_indices;
+    for (const auto _ : color_index_map->keys ())
+    {
+      if (_ == 0xFFFF) continue;
+      retained_color_indices.add (_);
+    }
+    if (retained_color_indices.is_empty ()) return_trace (false);
+
+    auto *out = c->serializer->start_embed (*this);
+    if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
+
+    out->version = version;
+    out->numColors = retained_color_indices.get_population ();
+    out->numPalettes = numPalettes;
+
+    const hb_array_t<const HBUINT16> colorRecordIndices = colorRecordIndicesZ.as_array (numPalettes);
+    hb_map_t color_record_index_map;
+    hb_set_t retained_color_record_indices;
+
+    unsigned record_count = 0;
+    for (const auto first_color_record_idx : colorRecordIndices)
+    {
+      for (unsigned retained_color_idx : retained_color_indices.iter ())
+      {
+        unsigned color_record_idx = first_color_record_idx + retained_color_idx;
+        if (color_record_index_map.has (color_record_idx)) continue;
+        color_record_index_map.set (color_record_idx, record_count);
+        retained_color_record_indices.add (color_record_idx);
+        record_count++;
+      }
+    }
+
+    out->numColorRecords = record_count;
+    const hb_array_t<const BGRAColor> color_records = (this+colorRecordsZ).as_array (numColorRecords);
+    if (!out->serialize (c->serializer, color_records, colorRecordIndices, color_record_index_map, retained_color_record_indices))
+      return_trace (false);
+
+    if (version == 1)
+      return_trace (v1 ().serialize (c->serializer, numPalettes, numColors, this, color_index_map));
+
+    return_trace (true);
+  }
+
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -176,7 +290,7 @@ struct CPAL
   HBUINT16     numPalettes;            /* Number of palettes in the table. */
   HBUINT16     numColorRecords;        /* Total number of color records, combined for
                                         * all palettes. */
-  LNNOffsetTo<UnsizedArrayOf<BGRAColor>>
+  NNOffset32To<UnsizedArrayOf<BGRAColor>>
                colorRecordsZ;          /* Offset from the beginning of CPAL table to
                                         * the first ColorRecord. */
   UnsizedArrayOf<HBUINT16>
index 09da115..9741ebd 100644 (file)
@@ -145,7 +145,7 @@ struct SBIXStrike
     auto* out = c->serializer->start_embed<SBIXStrike> ();
     if (unlikely (!out)) return_trace (false);
     auto snap = c->serializer->snapshot ();
-    if (unlikely (!c->serializer->extend (*out, num_output_glyphs + 1))) return_trace (false);
+    if (unlikely (!c->serializer->extend (out, num_output_glyphs + 1))) return_trace (false);
     out->ppem = ppem;
     out->resolution = resolution;
     HBUINT32 head;
@@ -185,7 +185,7 @@ struct SBIXStrike
   HBUINT16     resolution;     /* The device pixel density (in PPI) for which this
                                 * strike was designed. (E.g., 96 PPI, 192 PPI.) */
   protected:
-  UnsizedArrayOf<LOffsetTo<SBIXGlyph>>
+  UnsizedArrayOf<Offset32To<SBIXGlyph>>
                imageOffsetsZ;  /* Offset from the beginning of the strike data header
                                 * to bitmap data for an individual glyph ID. */
   public:
@@ -202,12 +202,12 @@ struct sbix
 
   struct accelerator_t
   {
-    void init (hb_face_t *face)
+    accelerator_t (hb_face_t *face)
     {
       table = hb_sanitize_context_t ().reference_table<sbix> (face);
       num_glyphs = face->get_num_glyphs ();
     }
-    void fini () { table.destroy (); }
+    ~accelerator_t () { table.destroy (); }
 
     bool has_data () const { return table->has_data (); }
 
@@ -352,11 +352,11 @@ struct sbix
   {
     TRACE_SERIALIZE (this);
 
-    auto *out = c->serializer->start_embed<LOffsetLArrayOf<SBIXStrike>> ();
+    auto *out = c->serializer->start_embed<Array32OfOffset32To<SBIXStrike>> ();
     if (unlikely (!out)) return_trace (false);
     if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
 
-    hb_vector_t<LOffsetTo<SBIXStrike>*> new_strikes;
+    hb_vector_t<Offset32To<SBIXStrike>*> new_strikes;
     hb_vector_t<hb_serialize_context_t::objidx_t> objidxs;
     for (int i = strikes.len - 1; i >= 0; --i)
     {
@@ -400,14 +400,17 @@ struct sbix
   HBUINT16     version;        /* Table version number — set to 1 */
   HBUINT16     flags;          /* Bit 0: Set to 1. Bit 1: Draw outlines.
                                 * Bits 2 to 15: reserved (set to 0). */
-  LOffsetLArrayOf<SBIXStrike>
+  Array32OfOffset32To<SBIXStrike>
                strikes;        /* Offsets from the beginning of the 'sbix'
                                 * table to data for each individual bitmap strike. */
   public:
   DEFINE_SIZE_ARRAY (8, strikes);
 };
 
-struct sbix_accelerator_t : sbix::accelerator_t {};
+struct sbix_accelerator_t : sbix::accelerator_t {
+  sbix_accelerator_t (hb_face_t *face) : sbix::accelerator_t (face) {}
+};
+
 
 } /* namespace OT */
 
index 1cc40ae..fc649f1 100644 (file)
@@ -62,7 +62,7 @@ struct SVGDocumentIndexEntry
                                 * this index entry. */
   HBUINT16     endGlyphID;     /* The last glyph ID in the range described by
                                 * this index entry. Must be >= startGlyphID. */
-  LNNOffsetTo<UnsizedArrayOf<HBUINT8>>
+  NNOffset32To<UnsizedArrayOf<HBUINT8>>
                svgDoc;         /* Offset from the beginning of the SVG Document Index
                                 * to an SVG document. Must be non-zero. */
   HBUINT32     svgDocLength;   /* Length of the SVG document.
@@ -79,9 +79,9 @@ struct SVG
 
   struct accelerator_t
   {
-    void init (hb_face_t *face)
+    accelerator_t (hb_face_t *face)
     { table = hb_sanitize_context_t ().reference_table<SVG> (face); }
-    void fini () { table.destroy (); }
+    ~accelerator_t () { table.destroy (); }
 
     hb_blob_t *reference_blob_for_glyph (hb_codepoint_t glyph_id) const
     {
@@ -107,7 +107,7 @@ struct SVG
 
   protected:
   HBUINT16     version;        /* Table version (starting at 0). */
-  LOffsetTo<SortedArrayOf<SVGDocumentIndexEntry>>
+  Offset32To<SortedArray16Of<SVGDocumentIndexEntry>>
                svgDocEntries;  /* Offset (relative to the start of the SVG table) to the
                                 * SVG Documents Index. Must be non-zero. */
                                /* Array of SVG Document Index Entries. */
@@ -116,7 +116,9 @@ struct SVG
   DEFINE_SIZE_STATIC (10);
 };
 
-struct SVG_accelerator_t : SVG::accelerator_t {};
+struct SVG_accelerator_t : SVG::accelerator_t {
+  SVG_accelerator_t (hb_face_t *face) : SVG::accelerator_t (face) {}
+};
 
 } /* namespace OT */
 
index 0e7203a..1607776 100644 (file)
@@ -37,9 +37,6 @@
 #include "hb-ot-color-sbix-table.hh"
 #include "hb-ot-color-svg-table.hh"
 
-#include <stdlib.h>
-#include <string.h>
-
 
 /**
  * SECTION:hb-ot-color
@@ -64,7 +61,7 @@
  *
  * Tests whether a face includes a `CPAL` color-palette table.
  *
- * Return value: true if data found, false otherwise
+ * Return value: %true if data found, %false otherwise
  *
  * Since: 2.1.0
  */
@@ -93,15 +90,15 @@ hb_ot_color_palette_get_count (hb_face_t *face)
 /**
  * hb_ot_color_palette_get_name_id:
  * @face: #hb_face_t to work upon
- * @palette_index: The index of the color palette 
+ * @palette_index: The index of the color palette
  *
  * Fetches the `name` table Name ID that provides display names for
- * a `CPAL` color palette. 
+ * a `CPAL` color palette.
  *
  * Palette display names can be generic (e.g., "Default") or provide
  * specific, themed names (e.g., "Spring", "Summer", "Fall", and "Winter").
  *
- * Return value: the Named ID found for the palette. 
+ * Return value: the Named ID found for the palette.
  * If the requested palette has no name the result is #HB_OT_NAME_ID_INVALID.
  *
  * Since: 2.1.0
@@ -119,7 +116,7 @@ hb_ot_color_palette_get_name_id (hb_face_t *face,
  * @color_index: The index of the color
  *
  * Fetches the `name` table Name ID that provides display names for
- * the specificed color in a face's `CPAL` color palette. 
+ * the specified color in a face's `CPAL` color palette.
  *
  * Display names can be generic (e.g., "Background") or specific
  * (e.g., "Eye color").
@@ -195,7 +192,7 @@ hb_ot_color_palette_get_colors (hb_face_t     *face,
  *
  * Tests whether a face includes any `COLR` color layers.
  *
- * Return value: true if data found, false otherwise
+ * Return value: %true if data found, %false otherwise
  *
  * Since: 2.1.0
  */
@@ -242,7 +239,7 @@ hb_ot_color_glyph_get_layers (hb_face_t           *face,
  *
  * Tests whether a face includes any `SVG` glyph images.
  *
- * Return value: true if data found, false otherwise.
+ * Return value: %true if data found, %false otherwise.
  *
  * Since: 2.1.0
  */
@@ -259,6 +256,8 @@ hb_ot_color_has_svg (hb_face_t *face)
  *
  * Fetches the SVG document for a glyph. The blob may be either plain text or gzip-encoded.
  *
+ * If the glyph has no SVG document, the singleton empty blob is returned.
+ *
  * Return value: (transfer full): An #hb_blob_t containing the SVG document of the glyph, if available
  *
  * Since: 2.1.0
@@ -280,7 +279,7 @@ hb_ot_color_glyph_reference_svg (hb_face_t *face, hb_codepoint_t glyph)
  *
  * Tests whether a face has PNG glyph images (either in `CBDT` or `sbix` tables).
  *
- * Return value: true if data found, false otherwise
+ * Return value: %true if data found, %false otherwise
  *
  * Since: 2.1.0
  */
@@ -299,6 +298,8 @@ hb_ot_color_has_png (hb_face_t *face)
  * as input. To get an optimally sized PNG blob, the UPEM value must be set on the @font
  * object. If UPEM is unset, the blob returned will be the largest PNG available.
  *
+ * If the glyph has no PNG image, the singleton empty blob is returned.
+ *
  * Return value: (transfer full): An #hb_blob_t containing the PNG image for the glyph, if available
  *
  * Since: 2.1.0
index 63ef20a..c23ce4d 100644 (file)
@@ -26,7 +26,7 @@
  * Google Author(s): Sascha Brawer, Behdad Esfahbod
  */
 
-#ifndef HB_OT_H_IN
+#if !defined(HB_OT_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb-ot.h> instead."
 #endif
 
@@ -66,6 +66,8 @@ hb_ot_color_palette_color_get_name_id (hb_face_t *face,
  * @HB_OT_COLOR_PALETTE_FLAG_USABLE_WITH_DARK_BACKGROUND: Flag indicating that the color
  *   palette is appropriate to use when displaying the font on a dark background such as black.
  *
+ * Flags that describe the properties of color palette.
+ *
  * Since: 2.1.0
  */
 typedef enum { /*< flags >*/
@@ -95,13 +97,14 @@ hb_ot_color_has_layers (hb_face_t *face);
 
 /**
  * hb_ot_color_layer_t:
+ * @glyph: the glyph ID of the layer
+ * @color_index: the palette color index of the layer
  *
  * Pairs of glyph and color index.
  *
  * Since: 2.1.0
  **/
-typedef struct hb_ot_color_layer_t
-{
+typedef struct hb_ot_color_layer_t {
   hb_codepoint_t glyph;
   unsigned int   color_index;
 } hb_ot_color_layer_t;
index bc72f8a..5192ff7 100644 (file)
@@ -24,7 +24,7 @@
  * Google Author(s): Behdad Esfahbod
  */
 
-#ifndef HB_OT_H_IN
+#if !defined(HB_OT_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb-ot.h> instead."
 #endif
 
@@ -41,8 +41,30 @@ HB_BEGIN_DECLS
 
 
 /* https://github.com/harfbuzz/harfbuzz/issues/1734 */
+/**
+ * HB_MATH_GLYPH_PART_FLAG_EXTENDER:
+ *
+ * Use #HB_OT_MATH_GLYPH_PART_FLAG_EXTENDER instead.
+ *
+ * Deprecated: 2.5.1
+ */
 #define HB_MATH_GLYPH_PART_FLAG_EXTENDER HB_OT_MATH_GLYPH_PART_FLAG_EXTENDER
 
+/* https://github.com/harfbuzz/harfbuzz/pull/3417 */
+/**
+ * HB_OT_MATH_SCRIPT:
+ *
+ * Use #HB_SCRIPT_MATH or #HB_OT_TAG_MATH_SCRIPT instead.
+ *
+ * <note>Previous versions of this documentation recommended passing
+ * #HB_OT_MATH_SCRIPT to hb_buffer_set_script() to enable math shaping, but this
+ * usage is no longer supported. Use #HB_SCRIPT_MATH instead.</note>
+ *
+ * Since: 1.3.3
+ * Deprecated: 3.4.0
+ */
+#define HB_OT_MATH_SCRIPT HB_OT_TAG_MATH_SCRIPT
+
 
 /* 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
@@ -71,6 +93,8 @@ hb_ot_tag_from_language (hb_language_t language);
 /**
  * HB_OT_VAR_NO_AXIS_INDEX:
  *
+ * Do not use.
+ *
  * Since: 1.4.2
  * Deprecated: 2.2.0
  */
@@ -78,12 +102,18 @@ hb_ot_tag_from_language (hb_language_t language);
 
 /**
  * hb_ot_var_axis_t:
+ * @tag: axis tag
+ * @name_id: axis name identifier
+ * @min_value: minimum value of the axis
+ * @default_value: default value of the axis
+ * @max_value: maximum value of the axis
+ *
+ * Use #hb_ot_var_axis_info_t instead.
  *
  * Since: 1.4.2
  * Deprecated: 2.2.0
  */
-typedef struct hb_ot_var_axis_t
-{
+typedef struct hb_ot_var_axis_t {
   hb_tag_t tag;
   hb_ot_name_id_t name_id;
   float min_value;
index 6fa9baf..eff0983 100644 (file)
@@ -40,7 +40,7 @@
 
 /* This lists font tables that the hb_face_t will contain and lazily
  * load.  Don't add a table unless it's used though.  This is not
- * exactly free. */
+ * exactly zero-cost. */
 
 /* v--- Add new tables in the right place here. */
 
@@ -53,13 +53,13 @@ HB_OT_ACCELERATOR (OT, cmap)
 HB_OT_TABLE (OT, hhea)
 HB_OT_ACCELERATOR (OT, hmtx)
 HB_OT_TABLE (OT, OS2)
-#if !defined(HB_NO_OT_FONT_GLYPH_NAMES) || !defined(HB_NO_METRICS)
+#if !defined(HB_NO_OT_FONT_GLYPH_NAMES) || !defined(HB_NO_METRICS) || !defined(HB_NO_STYLE)
 HB_OT_ACCELERATOR (OT, post)
 #endif
 #ifndef HB_NO_NAME
 HB_OT_ACCELERATOR (OT, name)
 #endif
-#ifndef HB_NO_STAT
+#ifndef HB_NO_STYLE
 HB_OT_TABLE (OT, STAT)
 #endif
 #ifndef HB_NO_META
@@ -67,8 +67,11 @@ HB_OT_ACCELERATOR (OT, meta)
 #endif
 
 /* Vertical layout. */
+#ifndef HB_NO_VERTICAL
 HB_OT_TABLE (OT, vhea)
 HB_OT_ACCELERATOR (OT, vmtx)
+HB_OT_TABLE (OT, VORG)
+#endif
 
 /* TrueType outlines. */
 HB_OT_ACCELERATOR (OT, glyf)
@@ -77,7 +80,6 @@ HB_OT_ACCELERATOR (OT, glyf)
 #ifndef HB_NO_CFF
 HB_OT_ACCELERATOR (OT, cff1)
 HB_OT_ACCELERATOR (OT, cff2)
-HB_OT_TABLE (OT, VORG)
 #endif
 
 /* OpenType variations. */
@@ -113,7 +115,6 @@ HB_OT_TABLE (AAT, mort)
 HB_OT_TABLE (AAT, kerx)
 HB_OT_TABLE (AAT, ankr)
 HB_OT_TABLE (AAT, trak)
-HB_OT_TABLE (AAT, lcar)
 HB_OT_TABLE (AAT, ltag)
 HB_OT_TABLE (AAT, feat)
 // HB_OT_TABLE (AAT, opbd)
index a1dc886..9f0359a 100644 (file)
@@ -118,6 +118,7 @@ hb_ot_get_glyph_h_advances (hb_font_t* font, void* font_data,
   }
 }
 
+#ifndef HB_NO_VERTICAL
 static void
 hb_ot_get_glyph_v_advances (hb_font_t* font, void* font_data,
                            unsigned count,
@@ -137,7 +138,9 @@ hb_ot_get_glyph_v_advances (hb_font_t* font, void* font_data,
     first_advance = &StructAtOffsetUnaligned<hb_position_t> (first_advance, advance_stride);
   }
 }
+#endif
 
+#ifndef HB_NO_VERTICAL
 static hb_bool_t
 hb_ot_get_glyph_v_origin (hb_font_t *font,
                          void *font_data,
@@ -150,14 +153,12 @@ hb_ot_get_glyph_v_origin (hb_font_t *font,
 
   *x = font->get_glyph_h_advance (glyph) / 2;
 
-#ifndef HB_NO_OT_FONT_CFF
   const OT::VORG &VORG = *ot_face->VORG;
   if (VORG.has_data ())
   {
     *y = font->em_scale_y (VORG.get_y_origin (glyph));
     return true;
   }
-#endif
 
   hb_glyph_extents_t extents = {0};
   if (ot_face->glyf->get_extents (font, glyph, &extents))
@@ -174,6 +175,7 @@ hb_ot_get_glyph_v_origin (hb_font_t *font,
 
   return true;
 }
+#endif
 
 static hb_bool_t
 hb_ot_get_glyph_extents (hb_font_t *font,
@@ -242,6 +244,7 @@ hb_ot_get_font_h_extents (hb_font_t *font,
         _hb_ot_metrics_get_position_common (font, HB_OT_METRICS_TAG_HORIZONTAL_LINE_GAP, &metrics->line_gap);
 }
 
+#ifndef HB_NO_VERTICAL
 static hb_bool_t
 hb_ot_get_font_v_extents (hb_font_t *font,
                          void *font_data HB_UNUSED,
@@ -252,28 +255,33 @@ hb_ot_get_font_v_extents (hb_font_t *font,
         _hb_ot_metrics_get_position_common (font, HB_OT_METRICS_TAG_VERTICAL_DESCENDER, &metrics->descender) &&
         _hb_ot_metrics_get_position_common (font, HB_OT_METRICS_TAG_VERTICAL_LINE_GAP, &metrics->line_gap);
 }
-
-#if HB_USE_ATEXIT
-static void free_static_ot_funcs ();
 #endif
 
+static inline void free_static_ot_funcs ();
+
 static struct hb_ot_font_funcs_lazy_loader_t : hb_font_funcs_lazy_loader_t<hb_ot_font_funcs_lazy_loader_t>
 {
   static hb_font_funcs_t *create ()
   {
     hb_font_funcs_t *funcs = hb_font_funcs_create ();
 
-    hb_font_funcs_set_font_h_extents_func (funcs, hb_ot_get_font_h_extents, nullptr, nullptr);
-    hb_font_funcs_set_font_v_extents_func (funcs, hb_ot_get_font_v_extents, nullptr, nullptr);
     hb_font_funcs_set_nominal_glyph_func (funcs, hb_ot_get_nominal_glyph, nullptr, nullptr);
     hb_font_funcs_set_nominal_glyphs_func (funcs, hb_ot_get_nominal_glyphs, nullptr, nullptr);
     hb_font_funcs_set_variation_glyph_func (funcs, hb_ot_get_variation_glyph, nullptr, nullptr);
+
+    hb_font_funcs_set_font_h_extents_func (funcs, hb_ot_get_font_h_extents, nullptr, nullptr);
     hb_font_funcs_set_glyph_h_advances_func (funcs, hb_ot_get_glyph_h_advances, nullptr, nullptr);
-    hb_font_funcs_set_glyph_v_advances_func (funcs, hb_ot_get_glyph_v_advances, nullptr, nullptr);
     //hb_font_funcs_set_glyph_h_origin_func (funcs, hb_ot_get_glyph_h_origin, nullptr, nullptr);
+
+#ifndef HB_NO_VERTICAL
+    hb_font_funcs_set_font_v_extents_func (funcs, hb_ot_get_font_v_extents, nullptr, nullptr);
+    hb_font_funcs_set_glyph_v_advances_func (funcs, hb_ot_get_glyph_v_advances, nullptr, nullptr);
     hb_font_funcs_set_glyph_v_origin_func (funcs, hb_ot_get_glyph_v_origin, nullptr, nullptr);
+#endif
+
     hb_font_funcs_set_glyph_extents_func (funcs, hb_ot_get_glyph_extents, nullptr, nullptr);
     //hb_font_funcs_set_glyph_contour_point_func (funcs, hb_ot_get_glyph_contour_point, nullptr, nullptr);
+
 #ifndef HB_NO_OT_FONT_GLYPH_NAMES
     hb_font_funcs_set_glyph_name_func (funcs, hb_ot_get_glyph_name, nullptr, nullptr);
     hb_font_funcs_set_glyph_from_name_func (funcs, hb_ot_get_glyph_from_name, nullptr, nullptr);
@@ -281,21 +289,17 @@ static struct hb_ot_font_funcs_lazy_loader_t : hb_font_funcs_lazy_loader_t<hb_ot
 
     hb_font_funcs_make_immutable (funcs);
 
-#if HB_USE_ATEXIT
-    atexit (free_static_ot_funcs);
-#endif
+    hb_atexit (free_static_ot_funcs);
 
     return funcs;
   }
 } static_ot_funcs;
 
-#if HB_USE_ATEXIT
-static
+static inline
 void free_static_ot_funcs ()
 {
   static_ot_funcs.free_instance ();
 }
-#endif
 
 static hb_font_funcs_t *
 _hb_ot_get_font_funcs ()
@@ -306,6 +310,9 @@ _hb_ot_get_font_funcs ()
 
 /**
  * hb_ot_font_set_funcs:
+ * @font: #hb_font_t to work upon
+ *
+ * Sets the font functions to use when working with @font. 
  *
  * Since: 0.9.28
  **/
index 80eaa54..e7959d1 100644 (file)
@@ -24,7 +24,7 @@
  * Google Author(s): Behdad Esfahbod, Roozbeh Pournader
  */
 
-#ifndef HB_OT_H_IN
+#if !defined(HB_OT_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb-ot.h> instead."
 #endif
 
index 4f29192..f2a9cad 100644 (file)
@@ -71,7 +71,7 @@ struct gasp
 
   protected:
   HBUINT16     version;        /* Version number (set to 1) */
-  ArrayOf<GaspRange>
+  Array16Of<GaspRange>
                gaspRanges;     /* Number of records to follow
                                 * Sorted by ppem */
   public:
index ce7ffa9..87a7d80 100644 (file)
@@ -45,6 +45,10 @@ namespace OT {
  */
 #define HB_OT_TAG_loca HB_TAG('l','o','c','a')
 
+#ifndef HB_MAX_COMPOSITE_OPERATIONS
+#define HB_MAX_COMPOSITE_OPERATIONS 100000
+#endif
+
 
 struct loca
 {
@@ -89,33 +93,30 @@ struct glyf
   template<typename Iterator,
           hb_requires (hb_is_source_of (Iterator, unsigned int))>
   static bool
-  _add_loca_and_head (hb_subset_plan_t * plan, Iterator padded_offsets)
+  _add_loca_and_head (hb_subset_plan_t * plan, Iterator padded_offsets, bool use_short_loca)
   {
-    unsigned max_offset = + padded_offsets | hb_reduce(hb_add, 0);
     unsigned num_offsets = padded_offsets.len () + 1;
-    bool use_short_loca = max_offset < 0x1FFFF;
     unsigned entry_size = use_short_loca ? 2 : 4;
-    char *loca_prime_data = (char *) calloc (entry_size, num_offsets);
+    char *loca_prime_data = (char *) hb_calloc (entry_size, num_offsets);
 
     if (unlikely (!loca_prime_data)) return false;
 
-    DEBUG_MSG (SUBSET, nullptr, "loca entry_size %d num_offsets %d "
-                               "max_offset %d size %d",
-              entry_size, num_offsets, max_offset, entry_size * num_offsets);
+    DEBUG_MSG (SUBSET, nullptr, "loca entry_size %d num_offsets %d size %d",
+              entry_size, num_offsets, entry_size * num_offsets);
 
     if (use_short_loca)
-      _write_loca (padded_offsets, 1, hb_array ((HBUINT16*) loca_prime_data, num_offsets));
+      _write_loca (padded_offsets, 1, hb_array ((HBUINT16 *) loca_prime_data, num_offsets));
     else
-      _write_loca (padded_offsets, 0, hb_array ((HBUINT32*) loca_prime_data, num_offsets));
+      _write_loca (padded_offsets, 0, hb_array ((HBUINT32 *) loca_prime_data, num_offsets));
 
-    hb_blob_t * loca_blob = hb_blob_create (loca_prime_data,
-                                           entry_size * num_offsets,
-                                           HB_MEMORY_MODE_WRITABLE,
-                                           loca_prime_data,
-                                           free);
+    hb_blob_t *loca_blob = hb_blob_create (loca_prime_data,
+                                          entry_size * num_offsets,
+                                          HB_MEMORY_MODE_WRITABLE,
+                                          loca_prime_data,
+                                          hb_free);
 
     bool result = plan->add_table (HB_OT_TAG_loca, loca_blob)
-                 && _add_head_and_set_loca_version (plan, use_short_loca);
+              && _add_head_and_set_loca_version (plan, use_short_loca);
 
     hb_blob_destroy (loca_blob);
     return result;
@@ -144,11 +145,12 @@ struct glyf
   template <typename Iterator>
   bool serialize (hb_serialize_context_t *c,
                  Iterator it,
+                  bool use_short_loca,
                  const hb_subset_plan_t *plan)
   {
     TRACE_SERIALIZE (this);
     unsigned init_len = c->length ();
-    for (const auto &_ : it) _.serialize (c, plan);
+    for (const auto &_ : it) _.serialize (c, use_short_loca, plan);
 
     /* As a special case when all glyph in the font are empty, add a zero byte
      * to the table, so that OTS doesn’t reject it, and to make the table work
@@ -176,16 +178,28 @@ struct glyf
     hb_vector_t<SubsetGlyph> glyphs;
     _populate_subset_glyphs (c->plan, &glyphs);
 
-    glyf_prime->serialize (c->serializer, hb_iter (glyphs), c->plan);
-
     auto padded_offsets =
     + hb_iter (glyphs)
     | hb_map (&SubsetGlyph::padded_size)
     ;
 
-    if (c->serializer->in_error ()) return_trace (false);
+    unsigned max_offset = + padded_offsets | hb_reduce (hb_add, 0);
+    bool use_short_loca = max_offset < 0x1FFFF;
+
+
+    glyf_prime->serialize (c->serializer, hb_iter (glyphs), use_short_loca, c->plan);
+    if (!use_short_loca) {
+      padded_offsets =
+          + hb_iter (glyphs)
+          | hb_map (&SubsetGlyph::length)
+          ;
+    }
+
+
+    if (unlikely (c->serializer->in_error ())) return_trace (false);
     return_trace (c->serializer->check_success (_add_loca_and_head (c->plan,
-                                                                   padded_offsets)));
+                                                                   padded_offsets,
+                                                                    use_short_loca)));
   }
 
   template <typename SubsetGlyph>
@@ -193,8 +207,7 @@ struct glyf
   _populate_subset_glyphs (const hb_subset_plan_t   *plan,
                           hb_vector_t<SubsetGlyph> *glyphs /* OUT */) const
   {
-    OT::glyf::accelerator_t glyf;
-    glyf.init (plan->source);
+    OT::glyf::accelerator_t glyf (plan->source);
 
     + hb_range (plan->num_output_glyphs ())
     | hb_map ([&] (hb_codepoint_t new_gid)
@@ -206,16 +219,19 @@ struct glyf
                if (!plan->old_gid_for_new_gid (new_gid, &subset_glyph.old_gid))
                  return subset_glyph;
 
-               subset_glyph.source_glyph = glyf.glyph_for_gid (subset_glyph.old_gid, true);
-               if (plan->drop_hints) subset_glyph.drop_hints_bytes ();
-               else subset_glyph.dest_start = subset_glyph.source_glyph.get_bytes ();
-
+               if (new_gid == 0 &&
+                    !(plan->flags & HB_SUBSET_FLAGS_NOTDEF_OUTLINE))
+                 subset_glyph.source_glyph = Glyph ();
+               else
+                 subset_glyph.source_glyph = glyf.glyph_for_gid (subset_glyph.old_gid, true);
+               if (plan->flags & HB_SUBSET_FLAGS_NO_HINTING)
+                  subset_glyph.drop_hints_bytes ();
+               else
+                  subset_glyph.dest_start = subset_glyph.source_glyph.get_bytes ();
                return subset_glyph;
              })
     | hb_sink (glyphs)
     ;
-
-    glyf.fini ();
   }
 
   static bool
@@ -238,6 +254,7 @@ struct glyf
 
   struct CompositeGlyphChain
   {
+    protected:
     enum composite_glyph_flag_t
     {
       ARG_1_AND_2_ARE_WORDS    = 0x0001,
@@ -254,6 +271,7 @@ struct glyf
       UNSCALED_COMPONENT_OFFSET = 0x1000
     };
 
+    public:
     unsigned int get_size () const
     {
       unsigned int size = min_size;
@@ -272,6 +290,18 @@ struct glyf
       return size;
     }
 
+    void set_glyph_index (hb_codepoint_t new_gid) { glyphIndex = new_gid; }
+    hb_codepoint_t get_glyph_index ()       const { return glyphIndex; }
+
+    void drop_instructions_flag ()  { flags = (uint16_t) flags & ~WE_HAVE_INSTRUCTIONS; }
+    void set_overlaps_flag ()
+    {
+      flags = (uint16_t) flags | OVERLAP_COMPOUND;
+    }
+
+    bool has_instructions ()  const { return   flags & WE_HAVE_INSTRUCTIONS; }
+
+    bool has_more ()          const { return   flags & MORE_COMPONENTS; }
     bool is_use_my_metrics () const { return   flags & USE_MY_METRICS; }
     bool is_anchored ()       const { return !(flags & ARGS_ARE_XY_VALUES); }
     void get_anchor_points (unsigned int &point1, unsigned int &point2) const
@@ -360,9 +390,9 @@ struct glyf
       return tx || ty;
     }
 
-    public:
+    protected:
     HBUINT16   flags;
-    HBGlyphID  glyphIndex;
+    HBGlyphID16        glyphIndex;
     public:
     DEFINE_SIZE_MIN (4);
   };
@@ -371,33 +401,49 @@ struct glyf
   {
     typedef const CompositeGlyphChain *__item_t__;
     composite_iter_t (hb_bytes_t glyph_, __item_t__ current_) :
-      glyph (glyph_), current (current_)
-    { if (!check_range (current)) current = nullptr; }
-    composite_iter_t () : glyph (hb_bytes_t ()), current (nullptr) {}
+        glyph (glyph_), current (nullptr), current_size (0)
+    {
+      set_next (current_);
+    }
+
+    composite_iter_t () : glyph (hb_bytes_t ()), current (nullptr), current_size (0) {}
 
     const CompositeGlyphChain &__item__ () const { return *current; }
     bool __more__ () const { return current; }
     void __next__ ()
     {
-      if (!(current->flags & CompositeGlyphChain::MORE_COMPONENTS)) { current = nullptr; return; }
+      if (!current->has_more ()) { current = nullptr; return; }
 
-      const CompositeGlyphChain *possible = &StructAfter<CompositeGlyphChain,
-                                                        CompositeGlyphChain> (*current);
-      if (!check_range (possible)) { current = nullptr; return; }
-      current = possible;
+      set_next (&StructAtOffset<CompositeGlyphChain> (current, current_size));
     }
     bool operator != (const composite_iter_t& o) const
     { return glyph != o.glyph || current != o.current; }
 
-    bool check_range (const CompositeGlyphChain *composite) const
+
+    void set_next (const CompositeGlyphChain *composite)
     {
-      return glyph.check_range (composite, CompositeGlyphChain::min_size)
-         && glyph.check_range (composite, composite->get_size ());
+      if (!glyph.check_range (composite, CompositeGlyphChain::min_size))
+      {
+        current = nullptr;
+        current_size = 0;
+        return;
+      }
+      unsigned size = composite->get_size ();
+      if (!glyph.check_range (composite, size))
+      {
+        current = nullptr;
+        current_size = 0;
+        return;
+      }
+
+      current = composite;
+      current_size = size;
     }
 
     private:
     hb_bytes_t glyph;
     __item_t__ current;
+    unsigned current_size;
   };
 
   enum phantom_point_index_t
@@ -409,18 +455,20 @@ struct glyf
     PHANTOM_COUNT  = 4
   };
 
+  struct accelerator_t;
+
   struct Glyph
   {
     enum simple_glyph_flag_t
     {
-      FLAG_ON_CURVE  = 0x01,
-      FLAG_X_SHORT   = 0x02,
-      FLAG_Y_SHORT   = 0x04,
-      FLAG_REPEAT    = 0x08,
-      FLAG_X_SAME    = 0x10,
-      FLAG_Y_SAME    = 0x20,
-      FLAG_RESERVED1 = 0x40,
-      FLAG_RESERVED2 = 0x80
+      FLAG_ON_CURVE       = 0x01,
+      FLAG_X_SHORT        = 0x02,
+      FLAG_Y_SHORT        = 0x04,
+      FLAG_REPEAT         = 0x08,
+      FLAG_X_SAME         = 0x10,
+      FLAG_Y_SAME         = 0x20,
+      FLAG_OVERLAP_SIMPLE = 0x40,
+      FLAG_RESERVED2      = 0x80
     };
 
     private:
@@ -428,11 +476,12 @@ struct glyf
     {
       bool has_data () const { return numberOfContours; }
 
-      bool get_extents (hb_font_t *font, hb_codepoint_t gid, hb_glyph_extents_t *extents) const
+      bool get_extents (hb_font_t *font, const accelerator_t &glyf_accelerator,
+                       hb_codepoint_t gid, hb_glyph_extents_t *extents) const
       {
        /* Undocumented rasterizer behavior: shift glyph to the left by (lsb - xMin), i.e., xMin = lsb */
        /* extents->x_bearing = hb_min (glyph_header.xMin, glyph_header.xMax); */
-       extents->x_bearing = font->em_scale_x (font->face->table.hmtx->get_side_bearing (gid));
+       extents->x_bearing = font->em_scale_x (glyf_accelerator.hmtx->get_side_bearing (gid));
        extents->y_bearing = font->em_scale_y (hb_max (yMin, yMax));
        extents->width     = font->em_scale_x (hb_max (xMin, xMax) - hb_min (xMin, xMax));
        extents->height    = font->em_scale_y (hb_min (yMin, yMax) - hb_max (yMin, yMax));
@@ -480,8 +529,8 @@ struct glyf
       const Glyph trim_padding () const
       {
        /* based on FontTools _g_l_y_f.py::trim */
-       const char *glyph = bytes.arrayZ;
-       const char *glyph_end = glyph + bytes.length;
+       const uint8_t *glyph = (uint8_t*) bytes.arrayZ;
+       const uint8_t *glyph_end = glyph + bytes.length;
        /* simple glyph w/contours, possibly trimmable */
        glyph += instruction_len_offset ();
 
@@ -538,6 +587,17 @@ struct glyf
        dest_end = bytes.sub_array (glyph_length, bytes.length - glyph_length);
       }
 
+      void set_overlaps_flag ()
+      {
+        if (unlikely (!header.numberOfContours)) return;
+
+        unsigned flags_offset = length (instructions_length ());
+        if (unlikely (flags_offset + 1 > bytes.length)) return;
+
+       HBUINT8 &first_flag = (HBUINT8 &) StructAtOffset<HBUINT16> (&bytes, flags_offset);
+        first_flag = (uint8_t) first_flag | FLAG_OVERLAP_SIMPLE;
+      }
+
       static bool read_points (const HBUINT8 *&p /* IN/OUT */,
                               contour_point_vector_t &points_ /* IN/OUT */,
                               const hb_bytes_t &bytes,
@@ -606,10 +666,10 @@ struct glyf
        }
 
        /* Read x & y coordinates */
-       return (read_points (p, points_, bytes,
-                            [] (contour_point_t &p, float v) { p.x = v; }, FLAG_X_SHORT, FLAG_X_SAME) &&
-               read_points (p, points_, bytes,
-                            [] (contour_point_t &p, float v) { p.y = v; }, FLAG_Y_SHORT, FLAG_Y_SAME));
+       return read_points (p, points_, bytes, [] (contour_point_t &p, float v) { p.x = v; },
+                           FLAG_X_SHORT, FLAG_X_SAME)
+           && read_points (p, points_, bytes, [] (contour_point_t &p, float v) { p.y = v; },
+                           FLAG_Y_SHORT, FLAG_Y_SAME);
       }
     };
 
@@ -632,7 +692,7 @@ struct glyf
          last = &item;
        if (unlikely (!last)) return 0;
 
-       if ((uint16_t) last->flags & CompositeGlyphChain::WE_HAVE_INSTRUCTIONS)
+       if (last->has_instructions ())
          start = (char *) last - &bytes + last->get_size ();
        if (unlikely (start > end)) return 0;
        return end - start;
@@ -642,16 +702,21 @@ struct glyf
        * If removing hints it falls out of that. */
       const Glyph trim_padding () const { return Glyph (bytes); }
 
-      /* remove WE_HAVE_INSTRUCTIONS flag from composite glyph */
       void drop_hints ()
       {
        for (const auto &_ : get_iterator ())
-         *const_cast<OT::HBUINT16 *> (&_.flags) = (uint16_t) _.flags & ~OT::glyf::CompositeGlyphChain::WE_HAVE_INSTRUCTIONS;
+         const_cast<CompositeGlyphChain &> (_).drop_instructions_flag ();
       }
 
       /* Chop instructions off the end */
       void drop_hints_bytes (hb_bytes_t &dest_start) const
       { dest_start = bytes.sub_array (0, bytes.length - instructions_length (bytes)); }
+
+      void set_overlaps_flag ()
+      {
+        const_cast<CompositeGlyphChain &> (StructAfter<CompositeGlyphChain, GlyphHeader> (header))
+                .set_overlaps_flag ();
+      }
     };
 
     enum glyph_type_t { EMPTY, SIMPLE, COMPOSITE };
@@ -681,6 +746,15 @@ struct glyf
       }
     }
 
+    void set_overlaps_flag ()
+    {
+      switch (type) {
+      case COMPOSITE: CompositeGlyph (*header, bytes).set_overlaps_flag (); return;
+      case SIMPLE:    SimpleGlyph (*header, bytes).set_overlaps_flag (); return;
+      default:        return;
+      }
+    }
+
     void drop_hints_bytes (hb_bytes_t &dest_start, hb_bytes_t &dest_end) const
     {
       switch (type) {
@@ -693,8 +767,7 @@ struct glyf
     /* Note: Recursively calls itself.
      * all_points includes phantom points
      */
-    template<typename T>
-    bool get_points (T glyph_for_gid, hb_font_t *font,
+    bool get_points (hb_font_t *font, const accelerator_t &glyf_accelerator,
                     contour_point_vector_t &all_points /* OUT */,
                     bool phantom_only = false,
                     unsigned int depth = 0) const
@@ -716,20 +789,30 @@ struct glyf
        if (unlikely (!SimpleGlyph (*header, bytes).get_contour_points (points, phantom_only)))
          return false;
        break;
-      default: return false; /* empty glyph */
       }
 
-      hb_face_t *face = font->face;
-
       /* Init phantom points */
       if (unlikely (!points.resize (points.length + PHANTOM_COUNT))) return false;
       hb_array_t<contour_point_t> phantoms = points.sub_array (points.length - PHANTOM_COUNT, PHANTOM_COUNT);
       {
        for (unsigned i = 0; i < PHANTOM_COUNT; ++i) phantoms[i].init ();
-       int h_delta = (int) header->xMin - face->table.hmtx->get_side_bearing (gid);
-       int v_orig  = (int) header->yMax + face->table.vmtx->get_side_bearing (gid);
-       unsigned h_adv = face->table.hmtx->get_advance (gid);
-       unsigned v_adv = face->table.vmtx->get_advance (gid);
+       int h_delta = (int) header->xMin -
+                     glyf_accelerator.hmtx->get_side_bearing (gid);
+       int v_orig  = (int) header->yMax +
+#ifndef HB_NO_VERTICAL
+                     glyf_accelerator.vmtx->get_side_bearing (gid)
+#else
+                     0
+#endif
+                     ;
+       unsigned h_adv = glyf_accelerator.hmtx->get_advance (gid);
+       unsigned v_adv =
+#ifndef HB_NO_VERTICAL
+                        glyf_accelerator.vmtx->get_advance (gid)
+#else
+                        - font->face->get_upem ()
+#endif
+                        ;
        phantoms[PHANTOM_LEFT].x = h_delta;
        phantoms[PHANTOM_RIGHT].x = h_adv + h_delta;
        phantoms[PHANTOM_TOP].y = v_orig;
@@ -737,7 +820,7 @@ struct glyf
       }
 
 #ifndef HB_NO_VAR
-      if (unlikely (!face->table.gvar->apply_deltas_to_points (gid, font, points.as_array ())))
+      if (unlikely (!glyf_accelerator.gvar->apply_deltas_to_points (gid, font, points.as_array ())))
        return false;
 #endif
 
@@ -751,8 +834,10 @@ struct glyf
        for (auto &item : get_composite_iterator ())
        {
          contour_point_vector_t comp_points;
-         if (unlikely (!glyph_for_gid (item.glyphIndex).get_points (glyph_for_gid, font, comp_points, phantom_only, depth + 1))
-                       || comp_points.length < PHANTOM_COUNT)
+         if (unlikely (!glyf_accelerator.glyph_for_gid (item.get_glyph_index ())
+                                        .get_points (font, glyf_accelerator, comp_points,
+                                                     phantom_only, depth + 1)
+                       || comp_points.length < PHANTOM_COUNT))
            return false;
 
          /* Copy phantom points from component if USE_MY_METRICS flag set */
@@ -787,7 +872,8 @@ struct glyf
 
        all_points.extend (phantoms);
       } break;
-      default: return false;
+      default:
+       all_points.extend (phantoms);
       }
 
       if (depth == 0) /* Apply at top level */
@@ -803,10 +889,11 @@ struct glyf
       return true;
     }
 
-    bool get_extents (hb_font_t *font, hb_glyph_extents_t *extents) const
+    bool get_extents (hb_font_t *font, const accelerator_t &glyf_accelerator,
+                     hb_glyph_extents_t *extents) const
     {
       if (type == EMPTY) return true; /* Empty glyph; zero extents. */
-      return header->get_extents (font, gid, extents);
+      return header->get_extents (font, glyf_accelerator, gid, extents);
     }
 
     hb_bytes_t get_bytes () const { return bytes; }
@@ -830,13 +917,19 @@ struct glyf
 
   struct accelerator_t
   {
-    void init (hb_face_t *face_)
+    accelerator_t (hb_face_t *face)
     {
       short_offset = false;
       num_glyphs = 0;
       loca_table = nullptr;
       glyf_table = nullptr;
-      face = face_;
+#ifndef HB_NO_VAR
+      gvar = nullptr;
+#endif
+      hmtx = nullptr;
+#ifndef HB_NO_VERTICAL
+      vmtx = nullptr;
+#endif
       const OT::head &head = *face->table.head;
       if (head.indexToLocFormat > 1 || head.glyphDataFormat > 0)
        /* Unknown format.  Leave num_glyphs=0, that takes care of disabling us. */
@@ -845,12 +938,18 @@ struct glyf
 
       loca_table = hb_sanitize_context_t ().reference_table<loca> (face);
       glyf_table = hb_sanitize_context_t ().reference_table<glyf> (face);
+#ifndef HB_NO_VAR
+      gvar = face->table.gvar;
+#endif
+      hmtx = face->table.hmtx;
+#ifndef HB_NO_VERTICAL
+      vmtx = face->table.vmtx;
+#endif
 
       num_glyphs = hb_max (1u, loca_table.get_length () / (short_offset ? 2 : 4)) - 1;
       num_glyphs = hb_min (num_glyphs, face->get_num_glyphs ());
     }
-
-    void fini ()
+    ~accelerator_t ()
     {
       loca_table.destroy ();
       glyf_table.destroy ();
@@ -860,15 +959,16 @@ struct glyf
     template<typename T>
     bool get_points (hb_font_t *font, hb_codepoint_t gid, T consumer) const
     {
-      /* Making this alloc free is not that easy
+      if (gid >= num_glyphs) return false;
+
+      /* Making this allocfree is not that easy
         https://github.com/harfbuzz/harfbuzz/issues/2095
         mostly because of gvar handling in VF fonts,
         perhaps a separate path for non-VF fonts can be considered */
       contour_point_vector_t all_points;
 
       bool phantom_only = !consumer.is_consuming_contour_points ();
-      if (unlikely (!glyph_for_gid (gid).get_points ([this] (hb_codepoint_t gid) -> const Glyph { return this->glyph_for_gid (gid); },
-                                                    font, all_points, phantom_only)))
+      if (unlikely (!glyph_for_gid (gid).get_points (font, *this, all_points, phantom_only)))
        return false;
 
       if (consumer.is_consuming_contour_points ())
@@ -887,7 +987,6 @@ struct glyf
       return true;
     }
 
-    public:
 #ifndef HB_NO_VAR
     struct points_aggregator_t
     {
@@ -920,9 +1019,9 @@ struct glyf
            return;
          }
          extents->x_bearing = font->em_scalef_x (min_x);
-         extents->width = font->em_scalef_x (max_x - min_x);
+         extents->width = font->em_scalef_x (max_x) - extents->x_bearing;
          extents->y_bearing = font->em_scalef_y (max_y);
-         extents->height = font->em_scalef_y (min_y - max_y);
+         extents->height = font->em_scalef_y (min_y) - extents->y_bearing;
        }
 
        protected:
@@ -944,34 +1043,44 @@ struct glyf
       contour_point_t *get_phantoms_sink () { return phantoms; }
     };
 
-    unsigned int
+    public:
+    unsigned
     get_advance_var (hb_font_t *font, hb_codepoint_t gid, bool is_vertical) const
     {
+      if (unlikely (gid >= num_glyphs)) return 0;
+
       bool success = false;
 
       contour_point_t phantoms[PHANTOM_COUNT];
-      if (likely (font->num_coords == face->table.gvar->get_axis_count ()))
+      if (likely (font->num_coords == gvar->get_axis_count ()))
        success = get_points (font, gid, points_aggregator_t (font, nullptr, phantoms));
 
       if (unlikely (!success))
-       return is_vertical
-            ? face->table.vmtx->get_advance (gid)
-            : face->table.hmtx->get_advance (gid);
+       return
+#ifndef HB_NO_VERTICAL
+         is_vertical ? vmtx->get_advance (gid) :
+#endif
+         hmtx->get_advance (gid);
 
-      return is_vertical
-          ? roundf (phantoms[PHANTOM_TOP].y - phantoms[PHANTOM_BOTTOM].y)
-          : roundf (phantoms[PHANTOM_RIGHT].x - phantoms[PHANTOM_LEFT].x);
+      float result = is_vertical
+                  ? phantoms[PHANTOM_TOP].y - phantoms[PHANTOM_BOTTOM].y
+                  : phantoms[PHANTOM_RIGHT].x - phantoms[PHANTOM_LEFT].x;
+      return hb_clamp (roundf (result), 0.f, (float) UINT_MAX / 2);
     }
 
     int get_side_bearing_var (hb_font_t *font, hb_codepoint_t gid, bool is_vertical) const
     {
+      if (unlikely (gid >= num_glyphs)) return 0;
+
       hb_glyph_extents_t extents;
 
       contour_point_t phantoms[PHANTOM_COUNT];
       if (unlikely (!get_points (font, gid, points_aggregator_t (font, &extents, phantoms))))
-       return is_vertical
-            ? face->table.vmtx->get_side_bearing (gid)
-            : face->table.hmtx->get_side_bearing (gid);
+       return
+#ifndef HB_NO_VERTICAL
+         is_vertical ? vmtx->get_side_bearing (gid) :
+#endif
+         hmtx->get_side_bearing (gid);
 
       return is_vertical
           ? ceilf (phantoms[PHANTOM_TOP].y) - extents.y_bearing
@@ -979,22 +1088,25 @@ struct glyf
     }
 #endif
 
+    public:
     bool get_extents (hb_font_t *font, hb_codepoint_t gid, hb_glyph_extents_t *extents) const
     {
       if (unlikely (gid >= num_glyphs)) return false;
+
 #ifndef HB_NO_VAR
-      if (font->num_coords && font->num_coords == face->table.gvar->get_axis_count ())
+      if (font->num_coords && font->num_coords == gvar->get_axis_count ())
        return get_points (font, gid, points_aggregator_t (font, extents, nullptr));
 #endif
-      return glyph_for_gid (gid).get_extents (font, extents);
+      return glyph_for_gid (gid).get_extents (font, *this, extents);
     }
 
     const Glyph
     glyph_for_gid (hb_codepoint_t gid, bool needs_padding_removal = false) const
     {
-      unsigned int start_offset, end_offset;
       if (unlikely (gid >= num_glyphs)) return Glyph ();
 
+      unsigned int start_offset, end_offset;
+
       if (short_offset)
       {
        const HBUINT16 *offsets = (const HBUINT16 *) loca_table->dataZ.arrayZ;
@@ -1016,18 +1128,28 @@ struct glyf
       return needs_padding_removal ? glyph.trim_padding () : glyph;
     }
 
-    void
-    add_gid_and_children (hb_codepoint_t gid, hb_set_t *gids_to_retain,
-                         unsigned int depth = 0) const
+    unsigned
+    add_gid_and_children (hb_codepoint_t gid,
+                         hb_set_t *gids_to_retain,
+                         unsigned depth = 0,
+                         unsigned operation_count = 0) const
     {
-      if (unlikely (depth++ > HB_MAX_NESTING_LEVEL)) return;
+      if (unlikely (depth++ > HB_MAX_NESTING_LEVEL)) return operation_count;
+      if (unlikely (operation_count++ > HB_MAX_COMPOSITE_OPERATIONS)) return operation_count;
       /* Check if is already visited */
-      if (gids_to_retain->has (gid)) return;
+      if (gids_to_retain->has (gid)) return operation_count;
 
       gids_to_retain->add (gid);
 
-      for (auto &item : glyph_for_gid (gid).get_composite_iterator ())
-       add_gid_and_children (item.glyphIndex, gids_to_retain, depth);
+      auto it = glyph_for_gid (gid).get_composite_iterator ();
+      while (it)
+      {
+        auto item = *(it++);
+        operation_count =
+            add_gid_and_children (item.get_glyph_index (), gids_to_retain, depth, operation_count);
+      }
+
+      return operation_count;
     }
 
 #ifdef HB_EXPERIMENTAL_API
@@ -1151,12 +1273,19 @@ struct glyf
     { return get_points (font, gid, path_builder_t (font, draw_helper)); }
 #endif
 
+#ifndef HB_NO_VAR
+    const gvar_accelerator_t *gvar;
+#endif
+    const hmtx_accelerator_t *hmtx;
+#ifndef HB_NO_VERTICAL
+    const vmtx_accelerator_t *vmtx;
+#endif
+
     private:
     bool short_offset;
     unsigned int num_glyphs;
     hb_blob_ptr_t<loca> loca_table;
     hb_blob_ptr_t<glyf> glyf_table;
-    hb_face_t *face;
   };
 
   struct SubsetGlyph
@@ -1168,14 +1297,15 @@ struct glyf
     hb_bytes_t dest_end;    /* region of source_glyph to copy second */
 
     bool serialize (hb_serialize_context_t *c,
+                    bool use_short_loca,
                    const hb_subset_plan_t *plan) const
     {
       TRACE_SERIALIZE (this);
 
       hb_bytes_t dest_glyph = dest_start.copy (c);
       dest_glyph = hb_bytes_t (&dest_glyph, dest_glyph.length + dest_end.copy (c).length);
-      unsigned int pad_length = padding ();
-      DEBUG_MSG (SUBSET, nullptr, "serialize %d byte glyph, width %d pad %d", dest_glyph.length, dest_glyph.length  + pad_length, pad_length);
+      unsigned int pad_length = use_short_loca ? padding () : 0;
+      DEBUG_MSG (SUBSET, nullptr, "serialize %d byte glyph, width %d pad %d", dest_glyph.length, dest_glyph.length + pad_length, pad_length);
 
       HBUINT8 pad;
       pad = 0;
@@ -1191,11 +1321,15 @@ struct glyf
       for (auto &_ : Glyph (dest_glyph).get_composite_iterator ())
       {
        hb_codepoint_t new_gid;
-       if (plan->new_gid_for_old_gid (_.glyphIndex, &new_gid))
-         ((OT::glyf::CompositeGlyphChain *) &_)->glyphIndex = new_gid;
+       if (plan->new_gid_for_old_gid (_.get_glyph_index (), &new_gid))
+         const_cast<CompositeGlyphChain &> (_).set_glyph_index (new_gid);
       }
 
-      if (plan->drop_hints) Glyph (dest_glyph).drop_hints ();
+      if (plan->flags & HB_SUBSET_FLAGS_NO_HINTING)
+        Glyph (dest_glyph).drop_hints ();
+
+      if (plan->flags & HB_SUBSET_FLAGS_SET_OVERLAPS_FLAG)
+        Glyph (dest_glyph).set_overlaps_flag ();
 
       return_trace (true);
     }
@@ -1218,7 +1352,10 @@ struct glyf
                         * defining it _MIN instead. */
 };
 
-struct glyf_accelerator_t : glyf::accelerator_t {};
+struct glyf_accelerator_t : glyf::accelerator_t {
+  glyf_accelerator_t (hb_face_t *face) : glyf::accelerator_t (face) {}
+};
+
 
 } /* namespace OT */
 
index c9c391b..dea2b7e 100644 (file)
@@ -52,7 +52,7 @@ struct DeviceRecord
 
     unsigned length = it.len ();
 
-    if (unlikely (!c->extend (*this, length)))  return_trace (false);
+    if (unlikely (!c->extend (this, length)))  return_trace (false);
 
     this->pixelSize = pixelSize;
     this->maxWidth =
@@ -110,7 +110,7 @@ struct hdmx
     for (const hb_item_type<Iterator>& _ : +it)
       c->start_embed<DeviceRecord> ()->serialize (c, _.first, _.second);
 
-    return_trace (c->successful);
+    return_trace (c->successful ());
   }
 
 
index 5613a96..20991aa 100644 (file)
@@ -43,7 +43,7 @@ namespace OT {
 
 struct head
 {
-  friend struct OffsetTable;
+  friend struct OpenTypeOffsetTable;
 
   static constexpr hb_tag_t tableTag = HB_OT_TAG_head;
 
@@ -72,12 +72,14 @@ struct head
     UNDERLINE  = 1u<<2,
     OUTLINE    = 1u<<3,
     SHADOW     = 1u<<4,
-    CONDENSED  = 1u<<5
+    CONDENSED  = 1u<<5,
+    EXPANDED   = 1u<<6,
   };
 
   bool is_bold () const      { return macStyle & BOLD; }
   bool is_italic () const    { return macStyle & ITALIC; }
   bool is_condensed () const { return macStyle & CONDENSED; }
+  bool is_expanded () const  { return macStyle & EXPANDED; }
 
   bool sanitize (hb_sanitize_context_t *c) const
   {
index 4137742..739474f 100644 (file)
@@ -101,25 +101,23 @@ struct hmtxvmtx
                  unsigned num_advances)
   {
     unsigned idx = 0;
-    + it
-    | hb_apply ([c, &idx, num_advances] (const hb_item_type<Iterator>& _)
-               {
-                 if (idx < num_advances)
-                 {
-                   LongMetric lm;
-                   lm.advance = _.first;
-                   lm.sb = _.second;
-                   if (unlikely (!c->embed<LongMetric> (&lm))) return;
-                 }
-                 else
-                 {
-                   FWORD *sb = c->allocate_size<FWORD> (FWORD::static_size);
-                   if (unlikely (!sb)) return;
-                   *sb = _.second;
-                 }
-                 idx++;
-               })
-    ;
+    for (auto _ : it)
+    {
+      if (idx < num_advances)
+      {
+       LongMetric lm;
+       lm.advance = _.first;
+       lm.sb = _.second;
+       if (unlikely (!c->embed<LongMetric> (&lm))) return;
+      }
+      else
+      {
+       FWORD *sb = c->allocate_size<FWORD> (FWORD::static_size);
+       if (unlikely (!sb)) return;
+       *sb = _.second;
+      }
+      idx++;
+    }
   }
 
   bool subset (hb_subset_context_t *c) const
@@ -129,9 +127,20 @@ struct hmtxvmtx
     T *table_prime = c->serializer->start_embed <T> ();
     if (unlikely (!table_prime)) return_trace (false);
 
-    accelerator_t _mtx;
-    _mtx.init (c->plan->source);
-    unsigned num_advances = _mtx.num_advances_for_subset (c->plan);
+    accelerator_t _mtx (c->plan->source);
+    unsigned num_advances;
+    {
+      /* Determine num_advances to encode. */
+      auto& plan = c->plan;
+      num_advances = plan->num_output_glyphs ();
+      hb_codepoint_t old_gid = 0;
+      unsigned int last_advance = plan->old_gid_for_new_gid (num_advances - 1, &old_gid) ? _mtx.get_advance (old_gid) : 0;
+      while (num_advances > 1 &&
+            last_advance == (plan->old_gid_for_new_gid (num_advances - 2, &old_gid) ? _mtx.get_advance (old_gid) : 0))
+      {
+       num_advances--;
+      }
+    }
 
     auto it =
     + hb_range (c->plan->num_output_glyphs ())
@@ -146,9 +155,7 @@ struct hmtxvmtx
 
     table_prime->serialize (c->serializer, it, num_advances);
 
-    _mtx.fini ();
-
-    if (unlikely (c->serializer->ran_out_of_room || c->serializer->in_error ()))
+    if (unlikely (c->serializer->in_error ()))
       return_trace (false);
 
     // Amend header num hmetrics
@@ -162,12 +169,19 @@ struct hmtxvmtx
   {
     friend struct hmtxvmtx;
 
-    void init (hb_face_t *face,
-              unsigned int default_advance_ = 0)
+    accelerator_t (hb_face_t *face,
+                  unsigned int default_advance_ = 0)
     {
       default_advance = default_advance_ ? default_advance_ : hb_face_get_upem (face);
 
-      num_advances = T::is_horizontal ? face->table.hhea->numberOfLongMetrics : face->table.vhea->numberOfLongMetrics;
+      num_advances = T::is_horizontal ?
+                    face->table.hhea->numberOfLongMetrics :
+#ifndef HB_NO_VERTICAL
+                    face->table.vhea->numberOfLongMetrics
+#else
+                    0
+#endif
+                    ;
 
       table = hb_sanitize_context_t ().reference_table<hmtxvmtx> (face, T::tableTag);
 
@@ -188,8 +202,7 @@ struct hmtxvmtx
 
       var_table = hb_sanitize_context_t ().reference_table<HVARVVAR> (face, T::variationsTag);
     }
-
-    void fini ()
+    ~accelerator_t ()
     {
       table.destroy ();
       var_table.destroy ();
@@ -258,32 +271,6 @@ struct hmtxvmtx
 #endif
     }
 
-    unsigned int num_advances_for_subset (const hb_subset_plan_t *plan) const
-    {
-      unsigned int num_advances = plan->num_output_glyphs ();
-      unsigned int last_advance = _advance_for_new_gid (plan,
-                                                       num_advances - 1);
-      while (num_advances > 1 &&
-            last_advance == _advance_for_new_gid (plan,
-                                                  num_advances - 2))
-      {
-       num_advances--;
-      }
-
-      return num_advances;
-    }
-
-    private:
-    unsigned int _advance_for_new_gid (const hb_subset_plan_t *plan,
-                                      hb_codepoint_t new_gid) const
-    {
-      hb_codepoint_t old_gid;
-      if (!plan->old_gid_for_new_gid (new_gid, &old_gid))
-       return 0;
-
-      return get_advance (old_gid);
-    }
-
     protected:
     unsigned int num_metrics;
     unsigned int num_advances;
@@ -333,8 +320,12 @@ struct vmtx : hmtxvmtx<vmtx, vhea> {
   static constexpr bool is_horizontal = false;
 };
 
-struct hmtx_accelerator_t : hmtx::accelerator_t {};
-struct vmtx_accelerator_t : vmtx::accelerator_t {};
+struct hmtx_accelerator_t : hmtx::accelerator_t {
+  hmtx_accelerator_t (hb_face_t *face) : hmtx::accelerator_t (face) {}
+};
+struct vmtx_accelerator_t : vmtx::accelerator_t {
+  vmtx_accelerator_t (hb_face_t *face) : vmtx::accelerator_t (face) {}
+};
 
 } /* namespace OT */
 
index 3563cab..ffa11bc 100644 (file)
@@ -134,11 +134,11 @@ struct KernSubTable
     switch (subtable_type) {
     case 0:    return_trace (c->dispatch (u.format0));
 #ifndef HB_NO_AAT_SHAPE
-    case 1:    return_trace (u.header.apple ? c->dispatch (u.format1, hb_forward<Ts> (ds)...) : c->default_return_value ());
+    case 1:    return_trace (u.header.apple ? c->dispatch (u.format1, std::forward<Ts> (ds)...) : c->default_return_value ());
 #endif
     case 2:    return_trace (c->dispatch (u.format2));
 #ifndef HB_NO_AAT_SHAPE
-    case 3:    return_trace (u.header.apple ? c->dispatch (u.format3, hb_forward<Ts> (ds)...) : c->default_return_value ());
+    case 3:    return_trace (u.header.apple ? c->dispatch (u.format3, std::forward<Ts> (ds)...) : c->default_return_value ());
 #endif
     default:   return_trace (c->default_return_value ());
     }
@@ -325,9 +325,9 @@ struct kern
     unsigned int subtable_type = get_type ();
     TRACE_DISPATCH (this, subtable_type);
     switch (subtable_type) {
-    case 0:    return_trace (c->dispatch (u.ot, hb_forward<Ts> (ds)...));
+    case 0:    return_trace (c->dispatch (u.ot, std::forward<Ts> (ds)...));
 #ifndef HB_NO_AAT_SHAPE
-    case 1:    return_trace (c->dispatch (u.aat, hb_forward<Ts> (ds)...));
+    case 1:    return_trace (c->dispatch (u.aat, std::forward<Ts> (ds)...));
 #endif
     default:   return_trace (c->default_return_value ());
     }
index 02fe14f..eb4c3b4 100644 (file)
@@ -73,7 +73,7 @@ struct BaseCoordFormat2
   protected:
   HBUINT16     format;         /* Format identifier--format = 2 */
   FWORD                coordinate;     /* X or Y value, in design units */
-  HBGlyphID    referenceGlyph; /* Glyph ID of control glyph */
+  HBGlyphID16  referenceGlyph; /* Glyph ID of control glyph */
   HBUINT16     coordPoint;     /* Index of contour point on the
                                 * reference glyph */
   public:
@@ -103,7 +103,7 @@ struct BaseCoordFormat3
   protected:
   HBUINT16     format;         /* Format identifier--format = 3 */
   FWORD                coordinate;     /* X or Y value, in design units */
-  OffsetTo<Device>
+  Offset16To<Device>
                deviceTable;    /* Offset to Device table for X or
                                 * Y value, from beginning of
                                 * BaseCoord table (may be NULL). */
@@ -173,11 +173,11 @@ struct FeatMinMaxRecord
   protected:
   Tag          tag;            /* 4-byte feature identification tag--must
                                 * match feature tag in FeatureList */
-  OffsetTo<BaseCoord>
+  Offset16To<BaseCoord>
                minCoord;       /* Offset to BaseCoord table that defines
                                 * the minimum extent value, from beginning
                                 * of MinMax table (may be NULL) */
-  OffsetTo<BaseCoord>
+  Offset16To<BaseCoord>
                maxCoord;       /* Offset to BaseCoord table that defines
                                 * the maximum extent value, from beginning
                                 * of MinMax table (may be NULL) */
@@ -212,15 +212,15 @@ struct MinMax
   }
 
   protected:
-  OffsetTo<BaseCoord>
+  Offset16To<BaseCoord>
                minCoord;       /* Offset to BaseCoord table that defines
                                 * minimum extent value, from the beginning
                                 * of MinMax table (may be NULL) */
-  OffsetTo<BaseCoord>
+  Offset16To<BaseCoord>
                maxCoord;       /* Offset to BaseCoord table that defines
                                 * maximum extent value, from the beginning
                                 * of MinMax table (may be NULL) */
-  SortedArrayOf<FeatMinMaxRecord>
+  SortedArray16Of<FeatMinMaxRecord>
                featMinMaxRecords;
                                /* Array of FeatMinMaxRecords, in alphabetical
                                 * order by featureTableTag */
@@ -247,7 +247,7 @@ struct BaseValues
   Index                defaultIndex;   /* Index number of default baseline for this
                                 * script — equals index position of baseline tag
                                 * in baselineTags array of the BaseTagList */
-  OffsetArrayOf<BaseCoord>
+  Array16OfOffset16To<BaseCoord>
                baseCoords;     /* Number of BaseCoord tables defined — should equal
                                 * baseTagCount in the BaseTagList
                                 *
@@ -275,7 +275,7 @@ struct BaseLangSysRecord
 
   protected:
   Tag          baseLangSysTag; /* 4-byte language system identification tag */
-  OffsetTo<MinMax>
+  Offset16To<MinMax>
                minMax;         /* Offset to MinMax table, from beginning
                                 * of BaseScript table */
   public:
@@ -305,13 +305,13 @@ struct BaseScript
   }
 
   protected:
-  OffsetTo<BaseValues>
+  Offset16To<BaseValues>
                baseValues;     /* Offset to BaseValues table, from beginning
                                 * of BaseScript table (may be NULL) */
-  OffsetTo<MinMax>
+  Offset16To<MinMax>
                defaultMinMax;  /* Offset to MinMax table, from beginning of
                                 * BaseScript table (may be NULL) */
-  SortedArrayOf<BaseLangSysRecord>
+  SortedArray16Of<BaseLangSysRecord>
                baseLangSysRecords;
                                /* Number of BaseLangSysRecords
                                 * defined — may be zero (0) */
@@ -339,7 +339,7 @@ struct BaseScriptRecord
 
   protected:
   Tag          baseScriptTag;  /* 4-byte script identification tag */
-  OffsetTo<BaseScript>
+  Offset16To<BaseScript>
                baseScript;     /* Offset to BaseScript table, from beginning
                                 * of BaseScriptList */
 
@@ -364,7 +364,7 @@ struct BaseScriptList
   }
 
   protected:
-  SortedArrayOf<BaseScriptRecord>
+  SortedArray16Of<BaseScriptRecord>
                        baseScriptRecords;
 
   public:
@@ -379,12 +379,20 @@ struct Axis
                     const BaseCoord **coord) const
   {
     const BaseScript &base_script = (this+baseScriptList).get_base_script (script_tag);
-    if (!base_script.has_data ()) return false;
+    if (!base_script.has_data ())
+    {
+      *coord = nullptr;
+      return false;
+    }
 
     if (likely (coord))
     {
       unsigned int tag_index = 0;
-      (this+baseTagList).bfind (baseline_tag, &tag_index);
+      if (!(this+baseTagList).bfind (baseline_tag, &tag_index))
+      {
+        *coord = nullptr;
+        return false;
+      }
       *coord = &base_script.get_base_coord (tag_index);
     }
 
@@ -398,7 +406,11 @@ struct Axis
                    const BaseCoord **max_coord) const
   {
     const BaseScript &base_script = (this+baseScriptList).get_base_script (script_tag);
-    if (!base_script.has_data ()) return false;
+    if (!base_script.has_data ())
+    {
+      *min_coord = *max_coord = nullptr;
+      return false;
+    }
 
     base_script.get_min_max (language_tag).get_min_max (feature_tag, min_coord, max_coord);
 
@@ -414,12 +426,12 @@ struct Axis
   }
 
   protected:
-  OffsetTo<SortedArrayOf<Tag>>
+  Offset16To<SortedArray16Of<Tag>>
                baseTagList;    /* Offset to BaseTagList table, from beginning
                                 * of Axis table (may be NULL)
                                 * Array of 4-byte baseline identification tags — must
                                 * be in alphabetical order */
-  OffsetTo<BaseScriptList>
+  Offset16To<BaseScriptList>
                baseScriptList; /* Offset to BaseScriptList table, from beginning
                                 * of Axis table
                                 * Array of BaseScriptRecords, in alphabetical order
@@ -489,11 +501,11 @@ struct BASE
 
   protected:
   FixedVersion<>version;       /* Version of the BASE table */
-  OffsetTo<Axis>hAxis;         /* Offset to horizontal Axis table, from beginning
+  Offset16To<Axis>hAxis;               /* Offset to horizontal Axis table, from beginning
                                 * of BASE table (may be NULL) */
-  OffsetTo<Axis>vAxis;         /* Offset to vertical Axis table, from beginning
+  Offset16To<Axis>vAxis;               /* Offset to vertical Axis table, from beginning
                                 * of BASE table (may be NULL) */
-  LOffsetTo<VariationStore>
+  Offset32To<VariationStore>
                varStore;       /* Offset to the table of Item Variation
                                 * Store--from beginning of BASE
                                 * header (may be NULL).  Introduced
index fdd1f31..60a1906 100644 (file)
@@ -68,8 +68,8 @@
 #define HB_MAX_FEATURE_INDICES 1500
 #endif
 
-#ifndef HB_MAX_LOOKUP_INDICES
-#define HB_MAX_LOOKUP_INDICES  20000
+#ifndef HB_MAX_LOOKUP_VISIT_COUNT
+#define HB_MAX_LOOKUP_VISIT_COUNT      35000
 #endif
 
 
@@ -88,12 +88,66 @@ static inline void ClassDef_serialize (hb_serialize_context_t *c,
                                       Iterator it);
 
 static void ClassDef_remap_and_serialize (hb_serialize_context_t *c,
-                                         const hb_set_t &glyphset,
                                          const hb_map_t &gid_klass_map,
-                                         hb_sorted_vector_t<HBGlyphID> &glyphs,
+                                         hb_sorted_vector_t<HBGlyphID16> &glyphs,
                                          const hb_set_t &klasses,
+                                         bool use_class_zero,
                                          hb_map_t *klass_map /*INOUT*/);
 
+
+struct hb_prune_langsys_context_t
+{
+  hb_prune_langsys_context_t (const void         *table_,
+                              hb_hashmap_t<unsigned, hb_set_t *> *script_langsys_map_,
+                              const hb_map_t     *duplicate_feature_map_,
+                              hb_set_t           *new_collected_feature_indexes_)
+      :table (table_),
+      script_langsys_map (script_langsys_map_),
+      duplicate_feature_map (duplicate_feature_map_),
+      new_feature_indexes (new_collected_feature_indexes_),
+      script_count (0),langsys_count (0) {}
+
+  bool visitedScript (const void *s)
+  {
+    if (script_count++ > HB_MAX_SCRIPTS)
+      return true;
+
+    return visited (s, visited_script);
+  }
+
+  bool visitedLangsys (const void *l)
+  {
+    if (langsys_count++ > HB_MAX_LANGSYS)
+      return true;
+
+    return visited (l, visited_langsys);
+  }
+
+  private:
+  template <typename T>
+  bool visited (const T *p, hb_set_t &visited_set)
+  {
+    hb_codepoint_t delta = (hb_codepoint_t) ((uintptr_t) p - (uintptr_t) table);
+    if (visited_set.in_error () || visited_set.has (delta))
+      return true;
+
+    visited_set.add (delta);
+    return false;
+  }
+
+  public:
+  const void *table;
+  hb_hashmap_t<unsigned, hb_set_t *> *script_langsys_map;
+  const hb_map_t     *duplicate_feature_map;
+  hb_set_t           *new_feature_indexes;
+
+  private:
+  hb_set_t visited_script;
+  hb_set_t visited_langsys;
+  unsigned script_count;
+  unsigned langsys_count;
+};
+
 struct hb_subset_layout_context_t :
   hb_dispatch_context_t<hb_subset_layout_context_t, hb_empty_t, HB_DEBUG_SUBSET>
 {
@@ -119,24 +173,27 @@ struct hb_subset_layout_context_t :
   bool visitLookupIndex()
   {
     lookup_index_count++;
-    return lookup_index_count < HB_MAX_LOOKUP_INDICES;
+    return lookup_index_count < HB_MAX_LOOKUP_VISIT_COUNT;
   }
 
   hb_subset_context_t *subset_context;
   const hb_tag_t table_tag;
   const hb_map_t *lookup_index_map;
+  const hb_hashmap_t<unsigned, hb_set_t *> *script_langsys_map;
   const hb_map_t *feature_index_map;
-  unsigned debug_depth;
+  unsigned cur_script_index;
 
   hb_subset_layout_context_t (hb_subset_context_t *c_,
                              hb_tag_t tag_,
                              hb_map_t *lookup_map_,
-                             hb_map_t *feature_map_) :
+                             hb_hashmap_t<unsigned, hb_set_t *> *script_langsys_map_,
+                             hb_map_t *feature_index_map_) :
                                subset_context (c_),
                                table_tag (tag_),
                                lookup_index_map (lookup_map_),
-                               feature_index_map (feature_map_),
-                               debug_depth (0),
+                               script_langsys_map (script_langsys_map_),
+                               feature_index_map (feature_index_map_),
+                               cur_script_index (0xFFFFu),
                                script_count (0),
                                langsys_count (0),
                                feature_index_count (0),
@@ -151,9 +208,8 @@ struct hb_subset_layout_context_t :
 };
 
 struct hb_collect_variation_indices_context_t :
-       hb_dispatch_context_t<hb_collect_variation_indices_context_t, hb_empty_t, 0>
+       hb_dispatch_context_t<hb_collect_variation_indices_context_t>
 {
-  const char *get_name () { return "CLOSURE_LAYOUT_VARIATION_IDXES"; }
   template <typename T>
   return_t dispatch (const T &obj) { obj.collect_variation_indices (this); return hb_empty_t (); }
   static return_t default_return_value () { return hb_empty_t (); }
@@ -161,15 +217,13 @@ struct hb_collect_variation_indices_context_t :
   hb_set_t *layout_variation_indices;
   const hb_set_t *glyph_set;
   const hb_map_t *gpos_lookups;
-  unsigned int debug_depth;
 
   hb_collect_variation_indices_context_t (hb_set_t *layout_variation_indices_,
                                          const hb_set_t *glyph_set_,
                                          const hb_map_t *gpos_lookups_) :
                                        layout_variation_indices (layout_variation_indices_),
                                        glyph_set (glyph_set_),
-                                       gpos_lookups (gpos_lookups_),
-                                       debug_depth (0) {}
+                                       gpos_lookups (gpos_lookups_) {}
 };
 
 template<typename OutputArray>
@@ -183,9 +237,9 @@ struct subset_offset_array_t
   template <typename T>
   bool operator () (T&& offset)
   {
+    auto snap = subset_context->serializer->snapshot ();
     auto *o = out.serialize_append (subset_context->serializer);
     if (unlikely (!o)) return false;
-    auto snap = subset_context->serializer->snapshot ();
     bool ret = o->serialize_subset (subset_context, offset, base);
     if (!ret)
     {
@@ -214,9 +268,9 @@ struct subset_offset_array_arg_t
   template <typename T>
   bool operator () (T&& offset)
   {
+    auto snap = subset_context->serializer->snapshot ();
     auto *o = out.serialize_append (subset_context->serializer);
     if (unlikely (!o)) return false;
-    auto snap = subset_context->serializer->snapshot ();
     bool ret = o->serialize_subset (subset_context, offset, base, arg);
     if (!ret)
     {
@@ -292,6 +346,43 @@ struct
 }
 HB_FUNCOBJ (subset_record_array);
 
+
+template<typename OutputArray>
+struct serialize_math_record_array_t
+{
+  serialize_math_record_array_t (hb_serialize_context_t *serialize_context_,
+                         OutputArray& out_,
+                         const void *base_) : serialize_context (serialize_context_),
+                                              out (out_), base (base_) {}
+
+  template <typename T>
+  bool operator () (T&& record)
+  {
+    if (!serialize_context->copy (record, base)) return false;
+    out.len++;
+    return true;
+  }
+
+  private:
+  hb_serialize_context_t *serialize_context;
+  OutputArray &out;
+  const void *base;
+};
+
+/*
+ * Helper to serialize an array of MATH records.
+ */
+struct
+{
+  template<typename OutputArray>
+  serialize_math_record_array_t<OutputArray>
+  operator () (hb_serialize_context_t *serialize_context, OutputArray& out,
+               const void *base) const
+  { return serialize_math_record_array_t<OutputArray> (serialize_context, out, base); }
+
+}
+HB_FUNCOBJ (serialize_math_record_array);
+
 /*
  *
  * OpenType Layout Common Table Formats
@@ -330,7 +421,7 @@ struct Record
   }
 
   Tag          tag;            /* 4-byte Tag identifier */
-  OffsetTo<Type>
+  Offset16To<Type>
                offset;         /* Offset from beginning of object holding
                                 * the Record */
   public:
@@ -338,11 +429,11 @@ struct Record
 };
 
 template <typename Type>
-struct RecordArrayOf : SortedArrayOf<Record<Type>>
+struct RecordArrayOf : SortedArray16Of<Record<Type>>
 {
-  const OffsetTo<Type>& get_offset (unsigned int i) const
+  const Offset16To<Type>& get_offset (unsigned int i) const
   { return (*this)[i].offset; }
-  OffsetTo<Type>& get_offset (unsigned int i)
+  Offset16To<Type>& get_offset (unsigned int i)
   { return (*this)[i].offset; }
   const Tag& get_tag (unsigned int i) const
   { return (*this)[i].tag; }
@@ -350,17 +441,18 @@ struct RecordArrayOf : SortedArrayOf<Record<Type>>
                         unsigned int *record_count /* IN/OUT */,
                         hb_tag_t     *record_tags /* OUT */) const
   {
-    if (record_count) {
-      const Record<Type> *arr = this->sub_array (start_offset, record_count);
-      unsigned int count = *record_count;
-      for (unsigned int i = 0; i < count; i++)
-       record_tags[i] = arr[i].tag;
+    if (record_count)
+    {
+      + this->sub_array (start_offset, record_count)
+      | hb_map (&Record<Type>::tag)
+      | hb_sink (hb_array (record_tags, *record_count))
+      ;
     }
     return this->len;
   }
   bool find_index (hb_tag_t tag, unsigned int *index) const
   {
-    return this->bfind (tag, index, HB_BFIND_NOT_FOUND_STORE, Index::NOT_FOUND_INDEX);
+    return this->bfind (tag, index, HB_NOT_FOUND_STORE, Index::NOT_FOUND_INDEX);
   }
 };
 
@@ -411,6 +503,30 @@ struct RecordListOfFeature : RecordListOf<Feature>
   }
 };
 
+struct Script;
+struct RecordListOfScript : RecordListOf<Script>
+{
+  bool subset (hb_subset_context_t *c,
+               hb_subset_layout_context_t *l) const
+  {
+    TRACE_SUBSET (this);
+    auto *out = c->serializer->start_embed (*this);
+    if (unlikely (!out || !c->serializer->extend_min (out))) return_trace (false);
+
+    unsigned count = this->len;
+    for (auto _ : + hb_zip (*this, hb_range (count)))
+    {
+      auto snap = c->serializer->snapshot ();
+      l->cur_script_index = _.second;
+      bool ret = _.first.subset (l, this);
+      if (!ret) c->serializer->revert (snap);
+      else out->len++;
+    }
+
+    return_trace (true);
+  }
+};
+
 struct RangeRecord
 {
   int cmp (hb_codepoint_t g) const
@@ -429,8 +545,8 @@ struct RangeRecord
   bool collect_coverage (set_t *glyphs) const
   { return glyphs->add_range (first, last); }
 
-  HBGlyphID    first;          /* First GlyphID in the range */
-  HBGlyphID    last;           /* Last GlyphID in the range */
+  HBGlyphID16  first;          /* First GlyphID in the range */
+  HBGlyphID16  last;           /* Last GlyphID in the range */
   HBUINT16     value;          /* Value */
   public:
   DEFINE_SIZE_STATIC (6);
@@ -438,7 +554,7 @@ struct RangeRecord
 DECLARE_NULL_NAMESPACE_BYTES (OT, RangeRecord);
 
 
-struct IndexArray : ArrayOf<Index>
+struct IndexArray : Array16Of<Index>
 {
   bool intersects (const hb_map_t *indexes) const
   { return hb_any (*this, indexes); }
@@ -467,18 +583,18 @@ struct IndexArray : ArrayOf<Index>
                            unsigned int *_count /* IN/OUT */,
                            unsigned int *_indexes /* OUT */) const
   {
-    if (_count) {
-      const HBUINT16 *arr = this->sub_array (start_offset, _count);
-      unsigned int count = *_count;
-      for (unsigned int i = 0; i < count; i++)
-       _indexes[i] = arr[i];
+    if (_count)
+    {
+      + this->sub_array (start_offset, _count)
+      | hb_sink (hb_array (_indexes, *_count))
+      ;
     }
     return this->len;
   }
 
   void add_indexes_to (hb_set_t* output /* OUT */) const
   {
-    output->add_array (arrayZ, len);
+    output->add_array (as_array ());
   }
 };
 
@@ -510,18 +626,45 @@ struct LangSys
     return_trace (c->embed (*this));
   }
 
-  bool operator == (const LangSys& o) const
+  bool compare (const LangSys& o, const hb_map_t *feature_index_map) const
   {
-    if (featureIndex.len != o.featureIndex.len ||
-       reqFeatureIndex != o.reqFeatureIndex)
+    if (reqFeatureIndex != o.reqFeatureIndex)
       return false;
 
-    for (const auto _ : + hb_zip (featureIndex, o.featureIndex))
+    auto iter =
+    + hb_iter (featureIndex)
+    | hb_filter (feature_index_map)
+    | hb_map (feature_index_map)
+    ;
+
+    auto o_iter =
+    + hb_iter (o.featureIndex)
+    | hb_filter (feature_index_map)
+    | hb_map (feature_index_map)
+    ;
+
+    if (iter.len () != o_iter.len ())
+      return false;
+
+    for (const auto _ : + hb_zip (iter, o_iter))
       if (_.first != _.second) return false;
 
     return true;
   }
 
+  void collect_features (hb_prune_langsys_context_t *c) const
+  {
+    if (!has_required_feature () && !get_feature_count ()) return;
+    if (has_required_feature () &&
+        c->duplicate_feature_map->has (reqFeatureIndex))
+      c->new_feature_indexes->add (get_required_feature_index ());
+
+    + hb_iter (featureIndex)
+    | hb_filter (c->duplicate_feature_map)
+    | hb_sink (c->new_feature_indexes)
+    ;
+  }
+
   bool subset (hb_subset_context_t        *c,
               hb_subset_layout_context_t *l,
               const Tag                  *tag = nullptr) const
@@ -585,6 +728,54 @@ struct Script
   bool has_default_lang_sys () const           { return defaultLangSys != 0; }
   const LangSys& get_default_lang_sys () const { return this+defaultLangSys; }
 
+  void prune_langsys (hb_prune_langsys_context_t *c,
+                      unsigned script_index) const
+  {
+    if (!has_default_lang_sys () && !get_lang_sys_count ()) return;
+    if (c->visitedScript (this)) return;
+
+    if (!c->script_langsys_map->has (script_index))
+    {
+      hb_set_t* empty_set = hb_set_create ();
+      if (unlikely (!c->script_langsys_map->set (script_index, empty_set)))
+      {
+       hb_set_destroy (empty_set);
+       return;
+      }
+    }
+
+    unsigned langsys_count = get_lang_sys_count ();
+    if (has_default_lang_sys ())
+    {
+      //only collect features from non-redundant langsys
+      const LangSys& d = get_default_lang_sys ();
+      if (!c->visitedLangsys (&d)) {
+        d.collect_features (c);
+      }
+
+      for (auto _ : + hb_zip (langSys, hb_range (langsys_count)))
+      {
+
+        const LangSys& l = this+_.first.offset;
+        if (c->visitedLangsys (&l)) continue;
+        if (l.compare (d, c->duplicate_feature_map)) continue;
+
+        l.collect_features (c);
+        c->script_langsys_map->get (script_index)->add (_.second);
+      }
+    }
+    else
+    {
+      for (auto _ : + hb_zip (langSys, hb_range (langsys_count)))
+      {
+        const LangSys& l = this+_.first.offset;
+        if (c->visitedLangsys (&l)) continue;
+        l.collect_features (c);
+        c->script_langsys_map->get (script_index)->add (_.second);
+      }
+    }
+  }
+
   bool subset (hb_subset_context_t         *c,
               hb_subset_layout_context_t  *l,
               const Tag                   *tag) const
@@ -613,16 +804,17 @@ struct Script
       }
     }
 
-    + langSys.iter ()
-    | hb_filter ([=] (const Record<LangSys>& record) {return l->visitLangSys (); })
-    | hb_filter ([&] (const Record<LangSys>& record)
-                {
-                  const LangSys& d = this+defaultLangSys;
-                  const LangSys& l = this+record.offset;
-                  return !(l == d);
-                })
-    | hb_apply (subset_record_array (l, &(out->langSys), this))
-    ;
+    const hb_set_t *active_langsys = l->script_langsys_map->get (l->cur_script_index);
+    if (active_langsys)
+    {
+      unsigned count = langSys.len;
+      + hb_zip (langSys, hb_range (count))
+      | hb_filter (active_langsys, hb_second)
+      | hb_map (hb_first)
+      | hb_filter ([=] (const Record<LangSys>& record) {return l->visitLangSys (); })
+      | hb_apply (subset_record_array (l, &(out->langSys), this))
+      ;
+    }
 
     return_trace (bool (out->langSys.len) || defaultLang || l->table_tag == HB_OT_TAG_GSUB);
   }
@@ -635,7 +827,7 @@ struct Script
   }
 
   protected:
-  OffsetTo<LangSys>
+  Offset16To<LangSys>
                defaultLangSys; /* Offset to DefaultLangSys table--from
                                 * beginning of Script table--may be Null */
   RecordArrayOf<LangSys>
@@ -645,7 +837,7 @@ struct Script
   DEFINE_SIZE_ARRAY_SIZED (4, langSys);
 };
 
-typedef RecordListOf<Script> ScriptList;
+typedef RecordListOfScript ScriptList;
 
 
 /* https://docs.microsoft.com/en-us/typography/opentype/spec/features_pt#size */
@@ -657,7 +849,7 @@ struct FeatureParamsSize
     if (unlikely (!c->check_struct (this))) return_trace (false);
 
     /* This subtable has some "history", if you will.  Some earlier versions of
-     * Adobe tools calculated the offset of the FeatureParams sutable from the
+     * Adobe tools calculated the offset of the FeatureParams subtable from the
      * beginning of the FeatureList table!  Now, that is dealt with in the
      * Feature implementation.  But we still need to be able to tell junk from
      * real data.  Note: We don't check that the nameID actually exists.
@@ -809,11 +1001,16 @@ struct FeatureParamsStylisticSet
 /* https://docs.microsoft.com/en-us/typography/opentype/spec/features_ae#cv01-cv99 */
 struct FeatureParamsCharacterVariants
 {
-  bool sanitize (hb_sanitize_context_t *c) const
+  unsigned
+  get_characters (unsigned start_offset, unsigned *char_count, hb_codepoint_t *chars) const
   {
-    TRACE_SANITIZE (this);
-    return_trace (c->check_struct (this) &&
-                 characters.sanitize (c));
+    if (char_count)
+    {
+      + characters.sub_array (start_offset, char_count)
+      | hb_sink (hb_array (chars, *char_count))
+      ;
+    }
+    return characters.len;
   }
 
   unsigned get_size () const
@@ -825,6 +1022,13 @@ struct FeatureParamsCharacterVariants
     return_trace ((bool) c->serializer->embed (*this));
   }
 
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+                 characters.sanitize (c));
+  }
+
   HBUINT16     format;                 /* Format number is set to 0. */
   NameID       featUILableNameID;      /* The ‘name’ table name ID that
                                         * specifies a string (or strings,
@@ -848,7 +1052,7 @@ struct FeatureParamsCharacterVariants
                                         * user-interface labels for the
                                         * feature parameters. (Must be zero
                                         * if numParameters is zero.) */
-  ArrayOf<HBUINT24>
+  Array16Of<HBUINT24>
                characters;             /* Array of the Unicode Scalar Value
                                         * of the characters for which this
                                         * feature provides glyph variants.
@@ -945,7 +1149,7 @@ struct Feature
     auto *out = c->serializer->start_embed (*this);
     if (unlikely (!out || !c->serializer->extend_min (out))) return_trace (false);
 
-    bool subset_featureParams = out->featureParams.serialize_subset (c, featureParams, this, tag);
+    out->featureParams.serialize_subset (c, featureParams, this, tag);
 
     auto it =
     + hb_iter (lookupIndex)
@@ -954,8 +1158,9 @@ struct Feature
     ;
 
     out->lookupIndex.serialize (c->serializer, l, it);
-    return_trace (bool (it) || subset_featureParams
-                  || (tag && *tag == HB_TAG ('p', 'r', 'e', 'f')));
+    // The decision to keep or drop this feature is already made before we get here
+    // so always retain it.
+    return_trace (true);
   }
 
   bool sanitize (hb_sanitize_context_t *c,
@@ -990,7 +1195,7 @@ struct Feature
       unsigned int new_offset_int = orig_offset -
                                    (((char *) this) - ((char *) closure->list_base));
 
-      OffsetTo<FeatureParams> new_offset;
+      Offset16To<FeatureParams> new_offset;
       /* Check that it would not overflow. */
       new_offset = new_offset_int;
       if (new_offset == new_offset_int &&
@@ -1002,7 +1207,7 @@ struct Feature
     return_trace (true);
   }
 
-  OffsetTo<FeatureParams>
+  Offset16To<FeatureParams>
                 featureParams; /* Offset to Feature Parameters table (if one
                                 * has been defined for the feature), relative
                                 * to the beginning of the Feature Table; = Null
@@ -1041,11 +1246,11 @@ struct Lookup
   unsigned int get_subtable_count () const { return subTable.len; }
 
   template <typename TSubTable>
-  const OffsetArrayOf<TSubTable>& get_subtables () const
-  { return reinterpret_cast<const OffsetArrayOf<TSubTable> &> (subTable); }
+  const Array16OfOffset16To<TSubTable>& get_subtables () const
+  { return reinterpret_cast<const Array16OfOffset16To<TSubTable> &> (subTable); }
   template <typename TSubTable>
-  OffsetArrayOf<TSubTable>& get_subtables ()
-  { return reinterpret_cast<OffsetArrayOf<TSubTable> &> (subTable); }
+  Array16OfOffset16To<TSubTable>& get_subtables ()
+  { return reinterpret_cast<Array16OfOffset16To<TSubTable> &> (subTable); }
 
   template <typename TSubTable>
   const TSubTable& get_subtable (unsigned int i) const
@@ -1085,7 +1290,7 @@ struct Lookup
     TRACE_DISPATCH (this, lookup_type);
     unsigned int count = get_subtable_count ();
     for (unsigned int i = 0; i < count; i++) {
-      typename context_t::return_t r = get_subtable<TSubTable> (i).dispatch (c, lookup_type, hb_forward<Ts> (ds)...);
+      typename context_t::return_t r = get_subtable<TSubTable> (i).dispatch (c, lookup_type, std::forward<Ts> (ds)...);
       if (c->stop_sublookup_iteration (r))
        return_trace (r);
     }
@@ -1098,13 +1303,13 @@ struct Lookup
                  unsigned int num_subtables)
   {
     TRACE_SERIALIZE (this);
-    if (unlikely (!c->extend_min (*this))) return_trace (false);
+    if (unlikely (!c->extend_min (this))) return_trace (false);
     lookupType = lookup_type;
     lookupFlag = lookup_props & 0xFFFFu;
     if (unlikely (!subTable.serialize (c, num_subtables))) return_trace (false);
     if (lookupFlag & LookupFlag::UseMarkFilteringSet)
     {
-      if (unlikely (!c->extend (*this))) return_trace (false);
+      if (unlikely (!c->extend (this))) return_trace (false);
       HBUINT16 &markFilteringSet = StructAfter<HBUINT16> (subTable);
       markFilteringSet = lookup_props >> 16;
     }
@@ -1120,14 +1325,22 @@ struct Lookup
     out->lookupType = lookupType;
     out->lookupFlag = lookupFlag;
 
-    const hb_set_t *glyphset = c->plan->glyphset ();
+    const hb_set_t *glyphset = c->plan->glyphset_gsub ();
     unsigned int lookup_type = get_type ();
     + hb_iter (get_subtables <TSubTable> ())
-    | hb_filter ([this, glyphset, lookup_type] (const OffsetTo<TSubTable> &_) { return (this+_).intersects (glyphset, lookup_type); })
+    | hb_filter ([this, glyphset, lookup_type] (const Offset16To<TSubTable> &_) { return (this+_).intersects (glyphset, lookup_type); })
     | hb_apply (subset_offset_array (c, out->get_subtables<TSubTable> (), this, lookup_type))
     ;
 
-    return_trace (true);
+    if (lookupFlag & LookupFlag::UseMarkFilteringSet)
+    {
+      if (unlikely (!c->serializer->extend (out))) return_trace (false);
+      const HBUINT16 &markFilteringSet = StructAfter<HBUINT16> (subTable);
+      HBUINT16 &outMarkFilteringSet = StructAfter<HBUINT16> (out->subTable);
+      outMarkFilteringSet = markFilteringSet;
+    }
+
+    return_trace (out->subTable.len);
   }
 
   template <typename TSubTable>
@@ -1148,7 +1361,7 @@ struct Lookup
     if (unlikely (!get_subtables<TSubTable> ().sanitize (c, this, get_type ())))
       return_trace (false);
 
-    if (unlikely (get_type () == TSubTable::Extension && !c->get_edit_count ()))
+    if (unlikely (get_type () == TSubTable::Extension && subtables && !c->get_edit_count ()))
     {
       /* The spec says all subtables of an Extension lookup should
        * have the same type, which shall not be the Extension type
@@ -1171,7 +1384,7 @@ struct Lookup
   private:
   HBUINT16     lookupType;             /* Different enumerations for GSUB and GPOS */
   HBUINT16     lookupFlag;             /* Lookup qualifiers */
-  ArrayOf<Offset16>
+  Array16Of<Offset16>
                subTable;               /* Array of SubTables */
 /*HBUINT16     markFilteringSetX[HB_VAR_ARRAY];*//* Index (base 0) into GDEF mark glyph sets
                                         * structure. This field is only present if bit
@@ -1180,10 +1393,10 @@ struct Lookup
   DEFINE_SIZE_ARRAY (6, subTable);
 };
 
-typedef OffsetListOf<Lookup> LookupList;
+typedef List16OfOffset16To<Lookup> LookupList;
 
 template <typename TLookup>
-struct LookupOffsetList : OffsetListOf<TLookup>
+struct LookupOffsetList : List16OfOffset16To<TLookup>
 {
   bool subset (hb_subset_context_t        *c,
               hb_subset_layout_context_t *l) const
@@ -1204,7 +1417,7 @@ struct LookupOffsetList : OffsetListOf<TLookup>
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
-    return_trace (OffsetListOf<TLookup>::sanitize (c, this));
+    return_trace (List16OfOffset16To<TLookup>::sanitize (c, this));
   }
 };
 
@@ -1221,7 +1434,7 @@ struct CoverageFormat1
   unsigned int get_coverage (hb_codepoint_t glyph_id) const
   {
     unsigned int i;
-    glyphArray.bfind (glyph_id, &i, HB_BFIND_NOT_FOUND_STORE, NOT_COVERED);
+    glyphArray.bfind (glyph_id, &i, HB_NOT_FOUND_STORE, NOT_COVERED);
     return i;
   }
 
@@ -1242,18 +1455,25 @@ struct CoverageFormat1
   bool intersects (const hb_set_t *glyphs) const
   {
     /* TODO Speed up, using hb_set_next() and bsearch()? */
-    unsigned int count = glyphArray.len;
-    for (unsigned int i = 0; i < count; i++)
-      if (glyphs->has (glyphArray[i]))
+    for (const auto& g : glyphArray.as_array ())
+      if (glyphs->has (g))
        return true;
     return false;
   }
   bool intersects_coverage (const hb_set_t *glyphs, unsigned int index) const
   { return glyphs->has (glyphArray[index]); }
 
+  void intersected_coverage_glyphs (const hb_set_t *glyphs, hb_set_t *intersect_glyphs) const
+  {
+    unsigned count = glyphArray.len;
+    for (unsigned i = 0; i < count; i++)
+      if (glyphs->has (glyphArray[i]))
+        intersect_glyphs->add (glyphArray[i]);
+  }
+
   template <typename set_t>
   bool collect_coverage (set_t *glyphs) const
-  { return glyphs->add_sorted_array (glyphArray.arrayZ, glyphArray.len); }
+  { return glyphs->add_sorted_array (glyphArray.as_array ()); }
 
   public:
   /* Older compilers need this to be public. */
@@ -1275,7 +1495,7 @@ struct CoverageFormat1
 
   protected:
   HBUINT16     coverageFormat; /* Format identifier--format = 1 */
-  SortedArrayOf<HBGlyphID>
+  SortedArray16Of<HBGlyphID16>
                glyphArray;     /* Array of GlyphIDs--in numerical order */
   public:
   DEFINE_SIZE_ARRAY (4, glyphArray);
@@ -1289,9 +1509,9 @@ struct CoverageFormat2
   unsigned int get_coverage (hb_codepoint_t glyph_id) const
   {
     const RangeRecord &range = rangeRecord.bsearch (glyph_id);
-    return likely (range.first <= range.last) ?
-          (unsigned int) range.value + (glyph_id - range.first) :
-          NOT_COVERED;
+    return likely (range.first <= range.last)
+        ? (unsigned int) range.value + (glyph_id - range.first)
+        : NOT_COVERED;
   }
 
   template <typename Iterator,
@@ -1299,7 +1519,7 @@ struct CoverageFormat2
   bool serialize (hb_serialize_context_t *c, Iterator glyphs)
   {
     TRACE_SERIALIZE (this);
-    if (unlikely (!c->extend_min (*this))) return_trace (false);
+    if (unlikely (!c->extend_min (this))) return_trace (false);
 
     if (unlikely (!glyphs))
     {
@@ -1348,18 +1568,17 @@ struct CoverageFormat2
   bool intersects (const hb_set_t *glyphs) const
   {
     /* TODO Speed up, using hb_set_next() and bsearch()? */
-    unsigned int count = rangeRecord.len;
-    for (unsigned int i = 0; i < count; i++)
-      if (rangeRecord[i].intersects (glyphs))
+    /* TODO(iter) Rewrite as dagger. */
+    for (const auto& range : rangeRecord.as_array ())
+      if (range.intersects (glyphs))
        return true;
     return false;
   }
   bool intersects_coverage (const hb_set_t *glyphs, unsigned int index) const
   {
-    unsigned int i;
-    unsigned int count = rangeRecord.len;
-    for (i = 0; i < count; i++) {
-      const RangeRecord &range = rangeRecord[i];
+    /* TODO(iter) Rewrite as dagger. */
+    for (const auto& range : rangeRecord.as_array ())
+    {
       if (range.value <= index &&
          index < (unsigned int) range.value + (range.last - range.first) &&
          range.intersects (glyphs))
@@ -1370,6 +1589,16 @@ struct CoverageFormat2
     return false;
   }
 
+  void intersected_coverage_glyphs (const hb_set_t *glyphs, hb_set_t *intersect_glyphs) const
+  {
+    for (const auto& range : rangeRecord.as_array ())
+    {
+      if (!range.intersects (glyphs)) continue;
+      for (hb_codepoint_t g = range.first; g <= range.last; g++)
+        if (glyphs->has (g)) intersect_glyphs->add (g);
+    }
+  }
+
   template <typename set_t>
   bool collect_coverage (set_t *glyphs) const
   {
@@ -1436,7 +1665,7 @@ struct CoverageFormat2
 
   protected:
   HBUINT16     coverageFormat; /* Format identifier--format = 2 */
-  SortedArrayOf<RangeRecord>
+  SortedArray16Of<RangeRecord>
                rangeRecord;    /* Array of glyph ranges--ordered by
                                 * Start GlyphID. rangeCount entries
                                 * long */
@@ -1469,7 +1698,7 @@ struct Coverage
   bool serialize (hb_serialize_context_t *c, Iterator glyphs)
   {
     TRACE_SERIALIZE (this);
-    if (unlikely (!c->extend_min (*this))) return_trace (false);
+    if (unlikely (!c->extend_min (this))) return_trace (false);
 
     unsigned count = 0;
     unsigned num_ranges = 0;
@@ -1494,7 +1723,7 @@ struct Coverage
   bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
-    const hb_set_t &glyphset = *c->plan->glyphset ();
+    const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
     const hb_map_t &glyph_map = *c->plan->glyph_map;
 
     auto it =
@@ -1552,6 +1781,16 @@ struct Coverage
     }
   }
 
+  void intersected_coverage_glyphs (const hb_set_t *glyphs, hb_set_t *intersect_glyphs) const
+  {
+    switch (u.format)
+    {
+    case 1: return u.format1.intersected_coverage_glyphs (glyphs, intersect_glyphs);
+    case 2: return u.format2.intersected_coverage_glyphs (glyphs, intersect_glyphs);
+    default:return ;
+    }
+  }
+
   struct iter_t : hb_iter_with_fallback_t<iter_t, hb_codepoint_t>
   {
     static constexpr bool is_sorted_iterator = true;
@@ -1633,10 +1872,10 @@ Coverage_serialize (hb_serialize_context_t *c,
 { c->start_embed<Coverage> ()->serialize (c, it); }
 
 static void ClassDef_remap_and_serialize (hb_serialize_context_t *c,
-                                         const hb_set_t &glyphset,
                                          const hb_map_t &gid_klass_map,
-                                         hb_sorted_vector_t<HBGlyphID> &glyphs,
+                                         hb_sorted_vector_t<HBGlyphID16> &glyphs,
                                          const hb_set_t &klasses,
+                                          bool use_class_zero,
                                          hb_map_t *klass_map /*INOUT*/)
 {
   if (!klass_map)
@@ -1648,7 +1887,7 @@ static void ClassDef_remap_and_serialize (hb_serialize_context_t *c,
 
   /* any glyph not assigned a class value falls into Class zero (0),
    * if any glyph assigned to class 0, remapping must start with 0->0*/
-  if (glyphset.get_population () > gid_klass_map.get_population ())
+  if (!use_class_zero)
     klass_map->set (0, 0);
 
   unsigned idx = klass_map->has (0) ? 1 : 0;
@@ -1661,7 +1900,7 @@ static void ClassDef_remap_and_serialize (hb_serialize_context_t *c,
 
   auto it =
   + glyphs.iter ()
-  | hb_map_retains_sorting ([&] (const HBGlyphID& gid) -> hb_pair_t<hb_codepoint_t, unsigned>
+  | hb_map_retains_sorting ([&] (const HBGlyphID16& gid) -> hb_pair_t<hb_codepoint_t, unsigned>
                            {
                              unsigned new_klass = klass_map->get (gid_klass_map[gid]);
                              return hb_pair ((hb_codepoint_t)gid, new_klass);
@@ -1692,10 +1931,11 @@ struct ClassDefFormat1
                  Iterator it)
   {
     TRACE_SERIALIZE (this);
-    if (unlikely (!c->extend_min (*this))) return_trace (false);
+    if (unlikely (!c->extend_min (this))) return_trace (false);
 
     if (unlikely (!it))
     {
+      classFormat = 1;
       startGlyph = 0;
       classValue.len = 0;
       return_trace (true);
@@ -1709,7 +1949,7 @@ struct ClassDefFormat1
 
     startGlyph = glyph_min;
     if (unlikely (!classValue.serialize (c, glyph_count))) return_trace (false);
-    for (const hb_pair_t<hb_codepoint_t, unsigned>& gid_klass_pair : + it)
+    for (const hb_pair_t<hb_codepoint_t, unsigned> gid_klass_pair : + it)
     {
       unsigned idx = gid_klass_pair.first - glyph_min;
       classValue[idx] = gid_klass_pair.second;
@@ -1718,21 +1958,27 @@ struct ClassDefFormat1
   }
 
   bool subset (hb_subset_context_t *c,
-              hb_map_t *klass_map = nullptr /*OUT*/) const
+              hb_map_t *klass_map = nullptr /*OUT*/,
+               bool keep_empty_table = true,
+               bool use_class_zero = true,
+               const Coverage* glyph_filter = nullptr) const
   {
     TRACE_SUBSET (this);
-    const hb_set_t &glyphset = *c->plan->_glyphset_gsub;
+    const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
     const hb_map_t &glyph_map = *c->plan->glyph_map;
 
-    hb_sorted_vector_t<HBGlyphID> glyphs;
+    hb_sorted_vector_t<HBGlyphID16> glyphs;
     hb_set_t orig_klasses;
     hb_map_t gid_org_klass_map;
 
     hb_codepoint_t start = startGlyph;
     hb_codepoint_t end   = start + classValue.len;
+
     for (const hb_codepoint_t gid : + hb_range (start, end)
-                                   | hb_filter (glyphset))
+                                    | hb_filter (glyphset))
     {
+      if (glyph_filter && !glyph_filter->has(gid)) continue;
+
       unsigned klass = classValue[gid - start];
       if (!klass) continue;
 
@@ -1741,9 +1987,13 @@ struct ClassDefFormat1
       orig_klasses.add (klass);
     }
 
-    ClassDef_remap_and_serialize (c->serializer, glyphset, gid_org_klass_map,
-                                 glyphs, orig_klasses, klass_map);
-    return_trace ((bool) glyphs);
+    unsigned glyph_count = glyph_filter
+                           ? hb_len (hb_iter (glyphset) | hb_filter (glyph_filter))
+                           : glyphset.get_population ();
+    use_class_zero = use_class_zero && glyph_count <= gid_org_klass_map.get_population ();
+    ClassDef_remap_and_serialize (c->serializer, gid_org_klass_map,
+                                 glyphs, orig_klasses, use_class_zero, klass_map);
+    return_trace (keep_empty_table || (bool) glyphs);
   }
 
   bool sanitize (hb_sanitize_context_t *c) const
@@ -1776,7 +2026,7 @@ struct ClassDefFormat1
   }
 
   template <typename set_t>
-  bool collect_class (set_t *glyphs, unsigned int klass) const
+  bool collect_class (set_t *glyphs, unsigned klass) const
   {
     unsigned int count = classValue.len;
     for (unsigned int i = 0; i < count; i++)
@@ -1794,7 +2044,7 @@ struct ClassDefFormat1
       if (classValue[iter - start]) return true;
     return false;
   }
-  bool intersects_class (const hb_set_t *glyphs, unsigned int klass) const
+  bool intersects_class (const hb_set_t *glyphs, uint16_t klass) const
   {
     unsigned int count = classValue.len;
     if (klass == 0)
@@ -1807,16 +2057,54 @@ struct ClassDefFormat1
       if (hb_set_next (glyphs, &g)) return true;
       /* Fall through. */
     }
+    /* TODO Speed up, using set overlap first? */
+    /* TODO(iter) Rewrite as dagger. */
+    HBUINT16 k {klass};
+    const HBUINT16 *arr = classValue.arrayZ;
     for (unsigned int i = 0; i < count; i++)
-      if (classValue[i] == klass && glyphs->has (startGlyph + i))
+      if (arr[i] == k && glyphs->has (startGlyph + i))
        return true;
     return false;
   }
 
+  void intersected_class_glyphs (const hb_set_t *glyphs, unsigned klass, hb_set_t *intersect_glyphs) const
+  {
+    unsigned count = classValue.len;
+    if (klass == 0)
+    {
+      hb_codepoint_t endGlyph = startGlyph + count -1;
+      for (hb_codepoint_t g : glyphs->iter ())
+        if (g < startGlyph || g > endGlyph)
+          intersect_glyphs->add (g);
+
+      return;
+    }
+
+    for (unsigned i = 0; i < count; i++)
+      if (classValue[i] == klass && glyphs->has (startGlyph + i))
+        intersect_glyphs->add (startGlyph + i);
+  }
+
+  void intersected_classes (const hb_set_t *glyphs, hb_set_t *intersect_classes) const
+  {
+    if (glyphs->is_empty ()) return;
+    hb_codepoint_t end_glyph = startGlyph + classValue.len - 1;
+    if (glyphs->get_min () < startGlyph ||
+        glyphs->get_max () > end_glyph)
+      intersect_classes->add (0);
+
+    for (const auto& _ : + hb_enumerate (classValue))
+    {
+      hb_codepoint_t g = startGlyph + _.first;
+      if (glyphs->has (g))
+        intersect_classes->add (_.second);
+    }
+  }
+
   protected:
   HBUINT16     classFormat;    /* Format identifier--format = 1 */
-  HBGlyphID    startGlyph;     /* First GlyphID of the classValueArray */
-  ArrayOf<HBUINT16>
+  HBGlyphID16  startGlyph;     /* First GlyphID of the classValueArray */
+  Array16Of<HBUINT16>
                classValue;     /* Array of Class Values--one per GlyphID */
   public:
   DEFINE_SIZE_ARRAY (6, classValue);
@@ -1838,10 +2126,11 @@ struct ClassDefFormat2
                  Iterator it)
   {
     TRACE_SERIALIZE (this);
-    if (unlikely (!c->extend_min (*this))) return_trace (false);
+    if (unlikely (!c->extend_min (this))) return_trace (false);
 
     if (unlikely (!it))
     {
+      classFormat = 2;
       rangeRecord.len = 0;
       return_trace (true);
     }
@@ -1887,13 +2176,16 @@ struct ClassDefFormat2
   }
 
   bool subset (hb_subset_context_t *c,
-              hb_map_t *klass_map = nullptr /*OUT*/) const
+              hb_map_t *klass_map = nullptr /*OUT*/,
+               bool keep_empty_table = true,
+               bool use_class_zero = true,
+               const Coverage* glyph_filter = nullptr) const
   {
     TRACE_SUBSET (this);
-    const hb_set_t &glyphset = *c->plan->_glyphset_gsub;
+    const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
     const hb_map_t &glyph_map = *c->plan->glyph_map;
 
-    hb_sorted_vector_t<HBGlyphID> glyphs;
+    hb_sorted_vector_t<HBGlyphID16> glyphs;
     hb_set_t orig_klasses;
     hb_map_t gid_org_klass_map;
 
@@ -1907,15 +2199,20 @@ struct ClassDefFormat2
       for (hb_codepoint_t g = start; g < end; g++)
       {
        if (!glyphset.has (g)) continue;
+        if (glyph_filter && !glyph_filter->has (g)) continue;
        glyphs.push (glyph_map[g]);
        gid_org_klass_map.set (glyph_map[g], klass);
        orig_klasses.add (klass);
       }
     }
 
-    ClassDef_remap_and_serialize (c->serializer, glyphset, gid_org_klass_map,
-                                 glyphs, orig_klasses, klass_map);
-    return_trace ((bool) glyphs);
+    unsigned glyph_count = glyph_filter
+                           ? hb_len (hb_iter (glyphset) | hb_filter (glyph_filter))
+                           : glyphset.get_population ();
+    use_class_zero = use_class_zero && glyph_count <= gid_org_klass_map.get_population ();
+    ClassDef_remap_and_serialize (c->serializer, gid_org_klass_map,
+                                 glyphs, orig_klasses, use_class_zero, klass_map);
+    return_trace (keep_empty_table || (bool) glyphs);
   }
 
   bool sanitize (hb_sanitize_context_t *c) const
@@ -1953,11 +2250,14 @@ struct ClassDefFormat2
     /* TODO Speed up, using hb_set_next() and bsearch()? */
     unsigned int count = rangeRecord.len;
     for (unsigned int i = 0; i < count; i++)
-      if (rangeRecord[i].intersects (glyphs))
+    {
+      const auto& range = rangeRecord[i];
+      if (range.intersects (glyphs) && range.value)
        return true;
+    }
     return false;
   }
-  bool intersects_class (const hb_set_t *glyphs, unsigned int klass) const
+  bool intersects_class (const hb_set_t *glyphs, uint16_t klass) const
   {
     unsigned int count = rangeRecord.len;
     if (klass == 0)
@@ -1976,15 +2276,92 @@ struct ClassDefFormat2
        return true;
       /* Fall through. */
     }
+    /* TODO Speed up, using set overlap first? */
+    /* TODO(iter) Rewrite as dagger. */
+    HBUINT16 k {klass};
+    const RangeRecord *arr = rangeRecord.arrayZ;
     for (unsigned int i = 0; i < count; i++)
-      if (rangeRecord[i].value == klass && rangeRecord[i].intersects (glyphs))
+      if (arr[i].value == k && arr[i].intersects (glyphs))
        return true;
     return false;
   }
 
+  void intersected_class_glyphs (const hb_set_t *glyphs, unsigned klass, hb_set_t *intersect_glyphs) const
+  {
+    unsigned count = rangeRecord.len;
+    if (klass == 0)
+    {
+      hb_codepoint_t g = HB_SET_VALUE_INVALID;
+      for (unsigned int i = 0; i < count; i++)
+      {
+        if (!hb_set_next (glyphs, &g))
+          break;
+        while (g != HB_SET_VALUE_INVALID && g < rangeRecord[i].first)
+        {
+          intersect_glyphs->add (g);
+          hb_set_next (glyphs, &g);
+        }
+        g = rangeRecord[i].last;
+      }
+      while (g != HB_SET_VALUE_INVALID && hb_set_next (glyphs, &g))
+        intersect_glyphs->add (g);
+
+      return;
+    }
+
+    hb_codepoint_t g = HB_SET_VALUE_INVALID;
+    for (unsigned int i = 0; i < count; i++)
+    {
+      if (rangeRecord[i].value != klass) continue;
+
+      if (g != HB_SET_VALUE_INVALID)
+      {
+        if (g >= rangeRecord[i].first &&
+            g <= rangeRecord[i].last)
+          intersect_glyphs->add (g);
+        if (g > rangeRecord[i].last)
+          continue;
+      }
+
+      g = rangeRecord[i].first - 1;
+      while (hb_set_next (glyphs, &g))
+      {
+        if (g >= rangeRecord[i].first && g <= rangeRecord[i].last)
+          intersect_glyphs->add (g);
+        else if (g > rangeRecord[i].last)
+          break;
+      }
+    }
+  }
+
+  void intersected_classes (const hb_set_t *glyphs, hb_set_t *intersect_classes) const
+  {
+    if (glyphs->is_empty ()) return;
+
+    unsigned count = rangeRecord.len;
+    hb_codepoint_t g = HB_SET_VALUE_INVALID;
+    for (unsigned int i = 0; i < count; i++)
+    {
+      if (!hb_set_next (glyphs, &g))
+        break;
+      if (g < rangeRecord[i].first)
+      {
+        intersect_classes->add (0);
+        break;
+      }
+      g = rangeRecord[i].last;
+    }
+    if (g != HB_SET_VALUE_INVALID && hb_set_next (glyphs, &g))
+      intersect_classes->add (0);
+
+    for (const RangeRecord& record : rangeRecord.iter ())
+      if (record.intersects (glyphs))
+        intersect_classes->add (record.value);
+  }
+
   protected:
   HBUINT16     classFormat;    /* Format identifier--format = 2 */
-  SortedArrayOf<RangeRecord>
+  SortedArray16Of<RangeRecord>
                rangeRecord;    /* Array of glyph ranges--ordered by
                                 * Start GlyphID */
   public:
@@ -2013,19 +2390,20 @@ struct ClassDef
 
   template<typename Iterator,
           hb_requires (hb_is_iterator (Iterator))>
-  bool serialize (hb_serialize_context_t *c, Iterator it)
+  bool serialize (hb_serialize_context_t *c, Iterator it_with_class_zero)
   {
     TRACE_SERIALIZE (this);
-    if (unlikely (!c->extend_min (*this))) return_trace (false);
+    if (unlikely (!c->extend_min (this))) return_trace (false);
+
+    auto it = + it_with_class_zero | hb_filter (hb_second);
 
     unsigned format = 2;
     if (likely (it))
     {
       hb_codepoint_t glyph_min = (*it).first;
-      hb_codepoint_t glyph_max = + it
-                                | hb_map (hb_first)
-                                | hb_reduce (hb_max, 0u);
+      hb_codepoint_t glyph_max = glyph_min;
 
+      unsigned num_glyphs = 0;
       unsigned num_ranges = 1;
       hb_codepoint_t prev_gid = glyph_min;
       unsigned prev_klass = (*it).second;
@@ -2034,7 +2412,9 @@ struct ClassDef
       {
        hb_codepoint_t cur_gid = gid_klass_pair.first;
        unsigned cur_klass = gid_klass_pair.second;
-       if (cur_gid == glyph_min || !cur_klass) continue;
+        num_glyphs++;
+       if (cur_gid == glyph_min) continue;
+        if (cur_gid > glyph_max) glyph_max = cur_gid;
        if (cur_gid != prev_gid + 1 ||
            cur_klass != prev_klass)
          num_ranges++;
@@ -2043,7 +2423,7 @@ struct ClassDef
        prev_klass = cur_klass;
       }
 
-      if (1 + (glyph_max - glyph_min + 1) <= num_ranges * 3)
+      if (num_glyphs && 1 + (glyph_max - glyph_min + 1) <= num_ranges * 3)
        format = 1;
     }
     u.format = format;
@@ -2057,12 +2437,15 @@ struct ClassDef
   }
 
   bool subset (hb_subset_context_t *c,
-              hb_map_t *klass_map = nullptr /*OUT*/) const
+              hb_map_t *klass_map = nullptr /*OUT*/,
+               bool keep_empty_table = true,
+               bool use_class_zero = true,
+               const Coverage* glyph_filter = nullptr) const
   {
     TRACE_SUBSET (this);
     switch (u.format) {
-    case 1: return_trace (u.format1.subset (c, klass_map));
-    case 2: return_trace (u.format2.subset (c, klass_map));
+    case 1: return_trace (u.format1.subset (c, klass_map, keep_empty_table, use_class_zero, glyph_filter));
+    case 2: return_trace (u.format2.subset (c, klass_map, keep_empty_table, use_class_zero, glyph_filter));
     default:return_trace (false);
     }
   }
@@ -2119,6 +2502,25 @@ struct ClassDef
     }
   }
 
+  void intersected_class_glyphs (const hb_set_t *glyphs, unsigned klass, hb_set_t *intersect_glyphs) const
+  {
+    switch (u.format) {
+    case 1: return u.format1.intersected_class_glyphs (glyphs, klass, intersect_glyphs);
+    case 2: return u.format2.intersected_class_glyphs (glyphs, klass, intersect_glyphs);
+    default:return;
+    }
+  }
+
+  void intersected_classes (const hb_set_t *glyphs, hb_set_t *intersect_classes) const
+  {
+    switch (u.format) {
+    case 1: return u.format1.intersected_classes (glyphs, intersect_classes);
+    case 2: return u.format2.intersected_classes (glyphs, intersect_classes);
+    default:return;
+    }
+  }
+
+
   protected:
   union {
   HBUINT16             format;         /* Format identifier */
@@ -2183,7 +2585,7 @@ struct VarRegionAxis
 struct VarRegionList
 {
   float evaluate (unsigned int region_index,
-                        const int *coords, unsigned int coord_len) const
+                 const int *coords, unsigned int coord_len) const
   {
     if (unlikely (region_index >= regionCount))
       return 0.;
@@ -2206,19 +2608,19 @@ struct VarRegionList
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
-    return_trace (c->check_struct (this) &&
-                 axesZ.sanitize (c, (unsigned int) axisCount * (unsigned int) regionCount));
+    return_trace (c->check_struct (this) && axesZ.sanitize (c, axisCount * regionCount));
   }
 
   bool serialize (hb_serialize_context_t *c, const VarRegionList *src, const hb_bimap_t &region_map)
   {
     TRACE_SERIALIZE (this);
-    VarRegionList *out = c->allocate_min<VarRegionList> ();
-    if (unlikely (!out)) return_trace (false);
+    if (unlikely (!c->extend_min (this))) return_trace (false);
     axisCount = src->axisCount;
     regionCount = region_map.get_population ();
-    if (unlikely (!c->allocate_size<VarRegionList> (get_size () - min_size))) return_trace (false);
-    unsigned int region_count = src->get_region_count ();
+    if (unlikely (hb_unsigned_mul_overflows (axisCount * regionCount,
+                                            VarRegionAxis::static_size))) return_trace (false);
+    if (unlikely (!c->extend (this))) return_trace (false);
+    unsigned int region_count = src->regionCount;
     for (unsigned int r = 0; r < regionCount; r++)
     {
       unsigned int backward = region_map.backward (r);
@@ -2230,11 +2632,11 @@ struct VarRegionList
   }
 
   unsigned int get_size () const { return min_size + VarRegionAxis::static_size * axisCount * regionCount; }
-  unsigned int get_region_count () const { return regionCount; }
 
-  protected:
+  public:
   HBUINT16     axisCount;
-  HBUINT16     regionCount;
+  HBUINT15     regionCount;
+  protected:
   UnsizedArrayOf<VarRegionAxis>
                axesZ;
   public:
@@ -2250,11 +2652,14 @@ struct VarData
   { return shortCount + regionIndices.len; }
 
   unsigned int get_size () const
-  { return itemCount * get_row_size (); }
+  { return min_size
+        - regionIndices.min_size + regionIndices.get_size ()
+        + itemCount * get_row_size ();
+  }
 
   float get_delta (unsigned int inner,
-                         const int *coords, unsigned int coord_count,
-                         const VarRegionList &regions) const
+                  const int *coords, unsigned int coord_count,
+                  const VarRegionList &regions) const
   {
     if (unlikely (inner >= itemCount))
       return 0.;
@@ -2284,10 +2689,10 @@ struct VarData
    return delta;
   }
 
-  void get_scalars (const int *coords, unsigned int coord_count,
-                   const VarRegionList &regions,
-                   float *scalars /*OUT */,
-                   unsigned int num_scalars) const
+  void get_region_scalars (const int *coords, unsigned int coord_count,
+                          const VarRegionList &regions,
+                          float *scalars /*OUT */,
+                          unsigned int num_scalars) const
   {
     unsigned count = hb_min (num_scalars, regionIndices.len);
     for (unsigned int i = 0; i < count; i++)
@@ -2313,7 +2718,7 @@ struct VarData
                  const hb_bimap_t &region_map)
   {
     TRACE_SERIALIZE (this);
-    if (unlikely (!c->extend_min (*this))) return_trace (false);
+    if (unlikely (!c->extend_min (this))) return_trace (false);
     itemCount = inner_map.get_next_value ();
 
     /* Optimize short count */
@@ -2355,9 +2760,7 @@ struct VarData
     shortCount = new_short_count;
     regionIndices.len = new_ri_count;
 
-    unsigned int size = regionIndices.get_size () - HBUINT16::static_size/*regionIndices.len*/ + (get_row_size () * itemCount);
-    if (unlikely (!c->allocate_size<HBUINT8> (size)))
-      return_trace (false);
+    if (unlikely (!c->extend (this))) return_trace (false);
 
     for (r = 0; r < ri_count; r++)
       if (delta_sz[r]) regionIndices[ri_map[r]] = region_map[src->regionIndices[r]];
@@ -2372,16 +2775,16 @@ struct VarData
     return_trace (true);
   }
 
-  void collect_region_refs (hb_inc_bimap_t &region_map, const hb_inc_bimap_t &inner_map) const
+  void collect_region_refs (hb_set_t &region_indices, const hb_inc_bimap_t &inner_map) const
   {
     for (unsigned int r = 0; r < regionIndices.len; r++)
     {
       unsigned int region = regionIndices[r];
-      if (region_map.has (region)) continue;
+      if (region_indices.has (region)) continue;
       for (unsigned int i = 0; i < inner_map.get_next_value (); i++)
        if (get_item_delta (inner_map.backward (i), r) != 0)
        {
-         region_map.add (region);
+         region_indices.add (region);
          break;
        }
     }
@@ -2416,7 +2819,7 @@ struct VarData
   protected:
   HBUINT16             itemCount;
   HBUINT16             shortCount;
-  ArrayOf<HBUINT16>    regionIndices;
+  Array16Of<HBUINT16>  regionIndices;
 /*UnsizedArrayOf<HBUINT8>bytesX;*/
   public:
   DEFINE_SIZE_ARRAY (6, regionIndices);
@@ -2424,6 +2827,7 @@ struct VarData
 
 struct VariationStore
 {
+  private:
   float get_delta (unsigned int outer, unsigned int inner,
                   const int *coords, unsigned int coord_count) const
   {
@@ -2439,6 +2843,7 @@ struct VariationStore
                                             this+regions);
   }
 
+  public:
   float get_delta (unsigned int index,
                   const int *coords, unsigned int coord_count) const
   {
@@ -2465,32 +2870,48 @@ struct VariationStore
                  const hb_array_t <hb_inc_bimap_t> &inner_maps)
   {
     TRACE_SERIALIZE (this);
+    if (unlikely (!c->extend_min (this))) return_trace (false);
+
     unsigned int set_count = 0;
     for (unsigned int i = 0; i < inner_maps.length; i++)
-      if (inner_maps[i].get_population () > 0) set_count++;
+      if (inner_maps[i].get_population ())
+       set_count++;
 
-    unsigned int size = min_size + HBUINT32::static_size * set_count;
-    if (unlikely (!c->allocate_size<HBUINT32> (size))) return_trace (false);
     format = 1;
 
-    hb_inc_bimap_t region_map;
+    const auto &src_regions = src+src->regions;
+
+    hb_set_t region_indices;
     for (unsigned int i = 0; i < inner_maps.length; i++)
-      (src+src->dataSets[i]).collect_region_refs (region_map, inner_maps[i]);
-    region_map.sort ();
+      (src+src->dataSets[i]).collect_region_refs (region_indices, inner_maps[i]);
 
-    if (unlikely (!regions.serialize (c, this)
-                 .serialize (c, &(src+src->regions), region_map))) return_trace (false);
+    if (region_indices.in_error ())
+      return_trace (false);
+
+    region_indices.del_range ((src_regions).regionCount, hb_set_t::INVALID);
+
+    /* TODO use constructor when our data-structures support that. */
+    hb_inc_bimap_t region_map;
+    + hb_iter (region_indices)
+    | hb_apply ([&region_map] (unsigned _) { region_map.add(_); })
+    ;
+    if (region_map.in_error())
+      return_trace (false);
+
+    if (unlikely (!regions.serialize_serialize (c, &src_regions, region_map)))
+      return_trace (false);
 
-    /* TODO: The following code could be simplified when
-     * OffsetListOf::subset () can take a custom param to be passed to VarData::serialize ()
-     */
     dataSets.len = set_count;
+    if (unlikely (!c->extend (dataSets))) return_trace (false);
+
+    /* TODO: The following code could be simplified when
+     * List16OfOffset16To::subset () can take a custom param to be passed to VarData::serialize () */
     unsigned int set_index = 0;
     for (unsigned int i = 0; i < inner_maps.length; i++)
     {
-      if (inner_maps[i].get_population () == 0) continue;
-      if (unlikely (!dataSets[set_index++].serialize (c, this)
-                     .serialize (c, &(src+src->dataSets[i]), inner_maps[i], region_map)))
+      if (!inner_maps[i].get_population ()) continue;
+      if (unlikely (!dataSets[set_index++]
+                    .serialize_serialize (c, &(src+src->dataSets[i]), inner_maps[i], region_map)))
        return_trace (false);
     }
 
@@ -2509,8 +2930,6 @@ struct VariationStore
 
     hb_vector_t<hb_inc_bimap_t> inner_maps;
     inner_maps.resize ((unsigned) dataSets.len);
-    for (unsigned i = 0; i < inner_maps.length; i++)
-      inner_maps[i].init ();
 
     for (unsigned idx : c->plan->layout_variation_indices->iter ())
     {
@@ -2518,27 +2937,23 @@ struct VariationStore
       uint16_t minor = idx & 0xFFFF;
 
       if (major >= inner_maps.length)
-      {
-        for (unsigned i = 0; i < inner_maps.length; i++)
-          inner_maps[i].fini ();
-        return_trace (false);
-      }
+       return_trace (false);
       inner_maps[major].add (minor);
     }
     varstore_prime->serialize (c->serializer, this, inner_maps.as_array ());
 
-    for (unsigned i = 0; i < inner_maps.length; i++)
-      inner_maps[i].fini ();
-    return_trace (bool (varstore_prime->dataSets));
+    return_trace (
+        !c->serializer->in_error()
+        && varstore_prime->dataSets);
   }
 
-  unsigned int get_region_index_count (unsigned int ivs) const
-  { return (this+dataSets[ivs]).get_region_index_count (); }
+  unsigned int get_region_index_count (unsigned int major) const
+  { return (this+dataSets[major]).get_region_index_count (); }
 
-  void get_scalars (unsigned int ivs,
-                   const int *coords, unsigned int coord_count,
-                   float *scalars /*OUT*/,
-                   unsigned int num_scalars) const
+  void get_region_scalars (unsigned int major,
+                          const int *coords, unsigned int coord_count,
+                          float *scalars /*OUT*/,
+                          unsigned int num_scalars) const
   {
 #ifdef HB_NO_VAR
     for (unsigned i = 0; i < num_scalars; i++)
@@ -2546,18 +2961,19 @@ struct VariationStore
     return;
 #endif
 
-    (this+dataSets[ivs]).get_scalars (coords, coord_count, this+regions,
-                                     &scalars[0], num_scalars);
+    (this+dataSets[major]).get_region_scalars (coords, coord_count,
+                                              this+regions,
+                                              &scalars[0], num_scalars);
   }
 
   unsigned int get_sub_table_count () const { return dataSets.len; }
 
   protected:
   HBUINT16                             format;
-  LOffsetTo<VarRegionList>             regions;
-  LOffsetArrayOf<VarData>              dataSets;
+  Offset32To<VarRegionList>            regions;
+  Array16OfOffset32To<VarData>         dataSets;
   public:
-  DEFINE_SIZE_ARRAY (8, dataSets);
+  DEFINE_SIZE_ARRAY_SIZED (8, dataSets);
 };
 
 /*
@@ -2614,7 +3030,7 @@ struct Condition
     TRACE_DISPATCH (this, u.format);
     if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
     switch (u.format) {
-    case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...));
+    case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...));
     default:return_trace (c->default_return_value ());
     }
   }
@@ -2658,7 +3074,8 @@ struct ConditionSet
     + conditions.iter ()
     | hb_apply (subset_offset_array (c, out->conditions, this))
     ;
-    return_trace (true);
+
+    return_trace (bool (out->conditions));
   }
 
   bool sanitize (hb_sanitize_context_t *c) const
@@ -2668,7 +3085,7 @@ struct ConditionSet
   }
 
   protected:
-  LOffsetArrayOf<Condition>    conditions;
+  Array16OfOffset32To<Condition>       conditions;
   public:
   DEFINE_SIZE_ARRAY (2, conditions);
 };
@@ -2693,6 +3110,12 @@ struct FeatureTableSubstitutionRecord
   bool subset (hb_subset_layout_context_t *c, const void *base) const
   {
     TRACE_SUBSET (this);
+    if (!c->feature_index_map->has (featureIndex)) {
+      // Feature that is being substituted is not being retained, so we don't
+      // need this.
+      return_trace (false);
+    }
+
     auto *out = c->subset_context->serializer->embed (this);
     if (unlikely (!out)) return_trace (false);
 
@@ -2709,7 +3132,7 @@ struct FeatureTableSubstitutionRecord
 
   protected:
   HBUINT16             featureIndex;
-  LOffsetTo<Feature>   feature;
+  Offset32To<Feature>  feature;
   public:
   DEFINE_SIZE_STATIC (6);
 };
@@ -2745,6 +3168,15 @@ struct FeatureTableSubstitution
       record.closure_features (this, lookup_indexes, feature_indexes);
   }
 
+  bool intersects_features (const hb_map_t *feature_index_map) const
+  {
+    for (const FeatureTableSubstitutionRecord& record : substitutions)
+    {
+      if (feature_index_map->has (record.featureIndex)) return true;
+    }
+    return false;
+  }
+
   bool subset (hb_subset_context_t        *c,
               hb_subset_layout_context_t *l) const
   {
@@ -2758,7 +3190,8 @@ struct FeatureTableSubstitution
     + substitutions.iter ()
     | hb_apply (subset_record_array (l, &(out->substitutions), this))
     ;
-    return_trace (true);
+
+    return_trace (bool (out->substitutions));
   }
 
   bool sanitize (hb_sanitize_context_t *c) const
@@ -2771,7 +3204,7 @@ struct FeatureTableSubstitution
 
   protected:
   FixedVersion<>       version;        /* Version--0x00010000u */
-  ArrayOf<FeatureTableSubstitutionRecord>
+  Array16Of<FeatureTableSubstitutionRecord>
                        substitutions;
   public:
   DEFINE_SIZE_ARRAY (6, substitutions);
@@ -2795,6 +3228,11 @@ struct FeatureVariationRecord
     (base+substitutions).closure_features (lookup_indexes, feature_indexes);
   }
 
+  bool intersects_features (const void *base, const hb_map_t *feature_index_map) const
+  {
+    return (base+substitutions).intersects_features (feature_index_map);
+  }
+
   bool subset (hb_subset_layout_context_t *c, const void *base) const
   {
     TRACE_SUBSET (this);
@@ -2815,9 +3253,9 @@ struct FeatureVariationRecord
   }
 
   protected:
-  LOffsetTo<ConditionSet>
+  Offset32To<ConditionSet>
                        conditions;
-  LOffsetTo<FeatureTableSubstitution>
+  Offset32To<FeatureTableSubstitution>
                        substitutions;
   public:
   DEFINE_SIZE_STATIC (8);
@@ -2828,7 +3266,7 @@ struct FeatureVariations
   static constexpr unsigned NOT_FOUND_INDEX = 0xFFFFFFFFu;
 
   bool find_index (const int *coords, unsigned int coord_len,
-                         unsigned int *index) const
+                  unsigned int *index) const
   {
     unsigned int count = varRecords.len;
     for (unsigned int i = 0; i < count; i++)
@@ -2881,9 +3319,18 @@ struct FeatureVariations
     out->version.major = version.major;
     out->version.minor = version.minor;
 
-    + varRecords.iter ()
-    | hb_apply (subset_record_array (l, &(out->varRecords), this))
-    ;
+    int keep_up_to = -1;
+    for (int i = varRecords.len - 1; i >= 0; i--) {
+      if (varRecords[i].intersects_features (this, l->feature_index_map)) {
+        keep_up_to = i;
+        break;
+      }
+    }
+
+    unsigned count = (unsigned) (keep_up_to + 1);
+    for (unsigned i = 0; i < count; i++) {
+      subset_record_array (l, &(out->varRecords), this) (varRecords[i]);
+    }
     return_trace (bool (out->varRecords));
   }
 
@@ -2897,7 +3344,7 @@ struct FeatureVariations
 
   protected:
   FixedVersion<>       version;        /* Version--0x00010000u */
-  LArrayOf<FeatureVariationRecord>
+  Array32Of<FeatureVariationRecord>
                        varRecords;
   public:
   DEFINE_SIZE_ARRAY_SIZED (8, varRecords);
@@ -3010,22 +3457,20 @@ struct VariationDevice
     if (unlikely (!out)) return_trace (nullptr);
     if (!layout_variation_idx_map || layout_variation_idx_map->is_empty ()) return_trace (out);
 
-    unsigned org_idx = (outerIndex << 16) + innerIndex;
-    if (!layout_variation_idx_map->has (org_idx))
+    /* TODO Just get() and bail if NO_VARIATION. Needs to setup the map to return that. */
+    if (!layout_variation_idx_map->has (varIdx))
     {
       c->revert (snap);
       return_trace (nullptr);
     }
-    unsigned new_idx = layout_variation_idx_map->get (org_idx);
-    out->outerIndex = new_idx >> 16;
-    out->innerIndex = new_idx & 0xFFFF;
+    unsigned new_idx = layout_variation_idx_map->get (varIdx);
+    out->varIdx = new_idx;
     return_trace (out);
   }
 
   void record_variation_index (hb_set_t *layout_variation_indices) const
   {
-    unsigned var_idx = (outerIndex << 16) + innerIndex;
-    layout_variation_indices->add (var_idx);
+    layout_variation_indices->add (varIdx);
   }
 
   bool sanitize (hb_sanitize_context_t *c) const
@@ -3038,12 +3483,11 @@ struct VariationDevice
 
   float get_delta (hb_font_t *font, const VariationStore &store) const
   {
-    return store.get_delta (outerIndex, innerIndex, font->coords, font->num_coords);
+    return store.get_delta (varIdx, font->coords, font->num_coords);
   }
 
   protected:
-  HBUINT16     outerIndex;
-  HBUINT16     innerIndex;
+  VarIdx       varIdx;
   HBUINT16     deltaFormat;    /* Format identifier for this table: 0x0x8000 */
   public:
   DEFINE_SIZE_STATIC (6);
index 02f4ab0..a76d644 100644 (file)
@@ -42,14 +42,14 @@ namespace OT {
  */
 
 /* Array of contour point indices--in increasing numerical order */
-struct AttachPoint : ArrayOf<HBUINT16>
+struct AttachPoint : Array16Of<HBUINT16>
 {
   bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
     auto *out = c->serializer->start_embed (*this);
     if (unlikely (!out)) return_trace (false);
-    
+
     return_trace (out->serialize (c->serializer, + iter ()));
   }
 };
@@ -73,10 +73,9 @@ struct AttachList
 
     if (point_count)
     {
-      hb_array_t<const HBUINT16> array = points.sub_array (start_offset, point_count);
-      unsigned int count = array.length;
-      for (unsigned int i = 0; i < count; i++)
-       point_array[i] = array[i];
+      + points.sub_array (start_offset, point_count)
+      | hb_sink (hb_array (point_array, *point_count))
+      ;
     }
 
     return points.len;
@@ -85,7 +84,7 @@ struct AttachList
   bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
-    const hb_set_t &glyphset = *c->plan->glyphset ();
+    const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
     const hb_map_t &glyph_map = *c->plan->glyph_map;
 
     auto *out = c->serializer->start_embed (*this);
@@ -99,8 +98,7 @@ struct AttachList
     | hb_map (glyph_map)
     | hb_sink (new_coverage)
     ;
-    out->coverage.serialize (c->serializer, out)
-                .serialize (c->serializer, new_coverage.iter ());
+    out->coverage.serialize_serialize (c->serializer, new_coverage.iter ());
     return_trace (bool (new_coverage));
   }
 
@@ -111,10 +109,10 @@ struct AttachList
   }
 
   protected:
-  OffsetTo<Coverage>
+  Offset16To<Coverage>
                coverage;               /* Offset to Coverage table -- from
                                         * beginning of AttachList table */
-  OffsetArrayOf<AttachPoint>
+  Array16OfOffset16To<AttachPoint>
                attachPoint;            /* Array of AttachPoint tables
                                         * in Coverage Index order */
   public:
@@ -206,7 +204,7 @@ struct CaretValueFormat3
     if (unlikely (!out)) return_trace (false);
 
     return_trace (out->deviceTable.serialize_copy (c->serializer, deviceTable, this, c->serializer->to_bias (out),
-                                                   hb_serialize_context_t::Head, c->plan->layout_variation_idx_map));
+                                                  hb_serialize_context_t::Head, c->plan->layout_variation_idx_map));
   }
 
   void collect_variation_indices (hb_set_t *layout_variation_indices) const
@@ -221,7 +219,7 @@ struct CaretValueFormat3
   protected:
   HBUINT16     caretValueFormat;       /* Format identifier--format = 3 */
   FWORD                coordinate;             /* X or Y value, in design units */
-  OffsetTo<Device>
+  Offset16To<Device>
                deviceTable;            /* Offset to Device table for X or Y
                                         * value--from beginning of CaretValue
                                         * table */
@@ -232,9 +230,9 @@ struct CaretValueFormat3
 struct CaretValue
 {
   hb_position_t get_caret_value (hb_font_t *font,
-                                       hb_direction_t direction,
-                                       hb_codepoint_t glyph_id,
-                                       const VariationStore &var_store) const
+                                hb_direction_t direction,
+                                hb_codepoint_t glyph_id,
+                                const VariationStore &var_store) const
   {
     switch (u.format) {
     case 1: return u.format1.get_caret_value (font, direction);
@@ -250,9 +248,9 @@ struct CaretValue
     TRACE_DISPATCH (this, u.format);
     if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
     switch (u.format) {
-    case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...));
-    case 2: return_trace (c->dispatch (u.format2, hb_forward<Ts> (ds)...));
-    case 3: return_trace (c->dispatch (u.format3, hb_forward<Ts> (ds)...));
+    case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...));
+    case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...));
+    case 3: return_trace (c->dispatch (u.format3, std::forward<Ts> (ds)...));
     default:return_trace (c->default_return_value ());
     }
   }
@@ -330,7 +328,7 @@ struct LigGlyph
 
   void collect_variation_indices (hb_collect_variation_indices_context_t *c) const
   {
-    for (const OffsetTo<CaretValue>& offset : carets.iter ())
+    for (const Offset16To<CaretValue>& offset : carets.iter ())
       (this+offset).collect_variation_indices (c->layout_variation_indices);
   }
 
@@ -341,7 +339,7 @@ struct LigGlyph
   }
 
   protected:
-  OffsetArrayOf<CaretValue>
+  Array16OfOffset16To<CaretValue>
                carets;                 /* Offset array of CaretValue tables
                                         * --from beginning of LigGlyph table
                                         * --in increasing coordinate order */
@@ -373,7 +371,7 @@ struct LigCaretList
   bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
-    const hb_set_t &glyphset = *c->plan->glyphset ();
+    const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
     const hb_map_t &glyph_map = *c->plan->glyph_map;
 
     auto *out = c->serializer->start_embed (*this);
@@ -387,8 +385,7 @@ struct LigCaretList
     | hb_map (glyph_map)
     | hb_sink (new_coverage)
     ;
-    out->coverage.serialize (c->serializer, out)
-                .serialize (c->serializer, new_coverage.iter ());
+    out->coverage.serialize_serialize (c->serializer, new_coverage.iter ());
     return_trace (bool (new_coverage));
   }
 
@@ -409,10 +406,10 @@ struct LigCaretList
   }
 
   protected:
-  OffsetTo<Coverage>
+  Offset16To<Coverage>
                coverage;               /* Offset to Coverage table--from
                                         * beginning of LigCaretList table */
-  OffsetArrayOf<LigGlyph>
+  Array16OfOffset16To<LigGlyph>
                ligGlyph;               /* Array of LigGlyph tables
                                         * in Coverage Index order */
   public:
@@ -433,7 +430,7 @@ struct MarkGlyphSetsFormat1
     out->format = format;
 
     bool ret = true;
-    for (const LOffsetTo<Coverage>& offset : coverage.iter ())
+    for (const Offset32To<Coverage>& offset : coverage.iter ())
     {
       auto *o = out->coverage.serialize_append (c->serializer);
       if (unlikely (!o))
@@ -461,7 +458,7 @@ struct MarkGlyphSetsFormat1
 
   protected:
   HBUINT16     format;                 /* Format identifier--format = 1 */
-  ArrayOf<LOffsetTo<Coverage>>
+  Array16Of<Offset32To<Coverage>>
                coverage;               /* Array of long offsets to mark set
                                         * coverage tables */
   public:
@@ -583,22 +580,21 @@ struct GDEF
     }
   }
 
-  HB_INTERNAL bool is_blacklisted (hb_blob_t *blob,
+  HB_INTERNAL bool is_blocklisted (hb_blob_t *blob,
                                   hb_face_t *face) const;
 
   struct accelerator_t
   {
-    void init (hb_face_t *face)
+    accelerator_t (hb_face_t *face)
     {
-      this->table = hb_sanitize_context_t ().reference_table<GDEF> (face);
-      if (unlikely (this->table->is_blacklisted (this->table.get_blob (), face)))
+      table = hb_sanitize_context_t ().reference_table<GDEF> (face);
+      if (unlikely (table->is_blocklisted (table.get_blob (), face)))
       {
-       hb_blob_destroy (this->table.get_blob ());
-       this->table = hb_blob_get_empty ();
+       hb_blob_destroy (table.get_blob ());
+       table = hb_blob_get_empty ();
       }
     }
-
-    void fini () { this->table.destroy (); }
+    ~accelerator_t () { table.destroy (); }
 
     hb_blob_ptr_t<GDEF> table;
   };
@@ -627,8 +623,8 @@ struct GDEF
       if (major >= (this+varStore).get_sub_table_count ()) break;
       if (major != last_major)
       {
-        new_minor = 0;
-        ++new_major;
+       new_minor = 0;
+       ++new_major;
       }
 
       unsigned new_idx = (new_major << 16) + new_minor;
@@ -644,18 +640,18 @@ struct GDEF
     auto *out = c->serializer->embed (*this);
     if (unlikely (!out)) return_trace (false);
 
-    bool subset_glyphclassdef = out->glyphClassDef.serialize_subset (c, glyphClassDef, this);
+    bool subset_glyphclassdef = out->glyphClassDef.serialize_subset (c, glyphClassDef, this, nullptr, false, true);
     bool subset_attachlist = out->attachList.serialize_subset (c, attachList, this);
     bool subset_ligcaretlist = out->ligCaretList.serialize_subset (c, ligCaretList, this);
-    bool subset_markattachclassdef = out->markAttachClassDef.serialize_subset (c, markAttachClassDef, this);
+    bool subset_markattachclassdef = out->markAttachClassDef.serialize_subset (c, markAttachClassDef, this, nullptr, false, true);
 
     bool subset_markglyphsetsdef = true;
     if (version.to_int () >= 0x00010002u)
     {
       subset_markglyphsetsdef = out->markGlyphSetsDef.serialize_subset (c, markGlyphSetsDef, this);
       if (!subset_markglyphsetsdef &&
-          version.to_int () == 0x00010002u)
-        out->version.minor = 0;
+         version.to_int () == 0x00010002u)
+       out->version.minor = 0;
     }
 
     bool subset_varstore = true;
@@ -663,13 +659,13 @@ struct GDEF
     {
       subset_varstore = out->varStore.serialize_subset (c, varStore, this);
       if (!subset_varstore && version.to_int () == 0x00010003u)
-        out->version.minor = 2;
+       out->version.minor = 2;
     }
 
     return_trace (subset_glyphclassdef || subset_attachlist ||
-                  subset_ligcaretlist || subset_markattachclassdef ||
-                  (out->version.to_int () >= 0x00010002u && subset_markglyphsetsdef) ||
-                  (out->version.to_int () >= 0x00010003u && subset_varstore));
+                 subset_ligcaretlist || subset_markattachclassdef ||
+                 (out->version.to_int () >= 0x00010002u && subset_markglyphsetsdef) ||
+                 (out->version.to_int () >= 0x00010003u && subset_varstore));
   }
 
   bool sanitize (hb_sanitize_context_t *c) const
@@ -688,28 +684,28 @@ struct GDEF
   protected:
   FixedVersion<>version;               /* Version of the GDEF table--currently
                                         * 0x00010003u */
-  OffsetTo<ClassDef>
+  Offset16To<ClassDef>
                glyphClassDef;          /* Offset to class definition table
                                         * for glyph type--from beginning of
                                         * GDEF header (may be Null) */
-  OffsetTo<AttachList>
+  Offset16To<AttachList>
                attachList;             /* Offset to list of glyphs with
                                         * attachment points--from beginning
                                         * of GDEF header (may be Null) */
-  OffsetTo<LigCaretList>
+  Offset16To<LigCaretList>
                ligCaretList;           /* Offset to list of positioning points
                                         * for ligature carets--from beginning
                                         * of GDEF header (may be Null) */
-  OffsetTo<ClassDef>
+  Offset16To<ClassDef>
                markAttachClassDef;     /* Offset to class definition table for
                                         * mark attachment type--from beginning
                                         * of GDEF header (may be Null) */
-  OffsetTo<MarkGlyphSets>
+  Offset16To<MarkGlyphSets>
                markGlyphSetsDef;       /* Offset to the table of mark set
                                         * definitions--from beginning of GDEF
                                         * header (may be NULL).  Introduced
                                         * in version 0x00010002. */
-  LOffsetTo<VariationStore>
+  Offset32To<VariationStore>
                varStore;               /* Offset to the table of Item Variation
                                         * Store--from beginning of GDEF
                                         * header (may be NULL).  Introduced
@@ -718,7 +714,9 @@ struct GDEF
   DEFINE_SIZE_MIN (12);
 };
 
-struct GDEF_accelerator_t : GDEF::accelerator_t {};
+struct GDEF_accelerator_t : GDEF::accelerator_t {
+  GDEF_accelerator_t (hb_face_t *face) : GDEF::accelerator_t (face) {}
+};
 
 } /* namespace OT */
 
index fef88af..2f9186a 100644 (file)
@@ -79,30 +79,32 @@ struct ValueFormat : HBUINT16
 
 /* All fields are options.  Only those available advance the value pointer. */
 #if 0
-  HBINT16              xPlacement;             /* Horizontal adjustment for
+  HBINT16              xPlacement;     /* Horizontal adjustment for
                                         * placement--in design units */
-  HBINT16              yPlacement;             /* Vertical adjustment for
+  HBINT16              yPlacement;     /* Vertical adjustment for
                                         * placement--in design units */
-  HBINT16              xAdvance;               /* Horizontal adjustment for
+  HBINT16              xAdvance;       /* Horizontal adjustment for
                                         * advance--in design units (only used
                                         * for horizontal writing) */
-  HBINT16              yAdvance;               /* Vertical adjustment for advance--in
+  HBINT16              yAdvance;       /* Vertical adjustment for advance--in
                                         * design units (only used for vertical
                                         * writing) */
-  OffsetTo<Device>     xPlaDevice;     /* Offset to Device table for
+  Offset16To<Device>   xPlaDevice;     /* Offset to Device table for
                                         * horizontal placement--measured from
                                         * beginning of PosTable (may be NULL) */
-  OffsetTo<Device>     yPlaDevice;     /* Offset to Device table for vertical
+  Offset16To<Device>   yPlaDevice;     /* Offset to Device table for vertical
                                         * placement--measured from beginning
                                         * of PosTable (may be NULL) */
-  OffsetTo<Device>     xAdvDevice;     /* Offset to Device table for
+  Offset16To<Device>   xAdvDevice;     /* Offset to Device table for
                                         * horizontal advance--measured from
                                         * beginning of PosTable (may be NULL) */
-  OffsetTo<Device>     yAdvDevice;     /* Offset to Device table for vertical
+  Offset16To<Device>   yAdvDevice;     /* Offset to Device table for vertical
                                         * advance--measured from beginning of
                                         * PosTable (may be NULL) */
 #endif
 
+  IntType& operator = (uint16_t i) { v = i; return *this; }
+
   unsigned int get_len () const  { return hb_popcount ((unsigned int) *this); }
   unsigned int get_size () const { return get_len () * Value::static_size; }
 
@@ -116,7 +118,13 @@ struct ValueFormat : HBUINT16
     if (!format) return ret;
 
     hb_font_t *font = c->font;
-    bool horizontal = HB_DIRECTION_IS_HORIZONTAL (c->direction);
+    bool horizontal =
+#ifndef HB_NO_VERTICAL
+      HB_DIRECTION_IS_HORIZONTAL (c->direction)
+#else
+      true
+#endif
+      ;
 
     if (format & xPlacement) glyph_pos.x_offset  += font->em_scale_x (get_short (values++, &ret));
     if (format & yPlacement) glyph_pos.y_offset  += font->em_scale_y (get_short (values++, &ret));
@@ -160,16 +168,40 @@ struct ValueFormat : HBUINT16
     return ret;
   }
 
-  void serialize_copy (hb_serialize_context_t *c, const void *base,
-                       const Value *values, const hb_map_t *layout_variation_idx_map) const
+  unsigned int get_effective_format (const Value *values) const
+  {
+    unsigned int format = *this;
+    for (unsigned flag = xPlacement; flag <= yAdvDevice; flag = flag << 1) {
+      if (format & flag) should_drop (*values++, (Flags) flag, &format);
+    }
+
+    return format;
+  }
+
+  template<typename Iterator,
+      hb_requires (hb_is_iterator (Iterator))>
+  unsigned int get_effective_format (Iterator it) const {
+    unsigned int new_format = 0;
+
+    for (const hb_array_t<const Value>& values : it)
+      new_format = new_format | get_effective_format (&values);
+
+    return new_format;
+  }
+
+  void copy_values (hb_serialize_context_t *c,
+                    unsigned int new_format,
+                    const void *base,
+                    const Value *values,
+                    const hb_map_t *layout_variation_idx_map) const
   {
     unsigned int format = *this;
     if (!format) return;
 
-    if (format & xPlacement) c->copy (*values++);
-    if (format & yPlacement) c->copy (*values++);
-    if (format & xAdvance)   c->copy (*values++);
-    if (format & yAdvance)   c->copy (*values++);
+    if (format & xPlacement) copy_value (c, new_format, xPlacement, *values++);
+    if (format & yPlacement) copy_value (c, new_format, yPlacement, *values++);
+    if (format & xAdvance)   copy_value (c, new_format, xAdvance, *values++);
+    if (format & yAdvance)   copy_value (c, new_format, yAdvance, *values++);
 
     if (format & xPlaDevice) copy_device (c, base, values++, layout_variation_idx_map);
     if (format & yPlaDevice) copy_device (c, base, values++, layout_variation_idx_map);
@@ -177,9 +209,19 @@ struct ValueFormat : HBUINT16
     if (format & yAdvDevice) copy_device (c, base, values++, layout_variation_idx_map);
   }
 
+  void copy_value (hb_serialize_context_t *c,
+                   unsigned int new_format,
+                   Flags flag,
+                   Value value) const
+  {
+    // Filter by new format.
+    if (!(new_format & flag)) return;
+    c->copy (value);
+  }
+
   void collect_variation_indices (hb_collect_variation_indices_context_t *c,
-                                  const void *base,
-                                  const hb_array_t<const Value>& values) const
+                                 const void *base,
+                                 const hb_array_t<const Value>& values) const
   {
     unsigned format = *this;
     unsigned i = 0;
@@ -232,18 +274,18 @@ struct ValueFormat : HBUINT16
     return true;
   }
 
-  static inline OffsetTo<Device>& get_device (Value* value)
+  static inline Offset16To<Device>& get_device (Value* value)
   {
-    return *static_cast<OffsetTo<Device> *> (value);
+    return *static_cast<Offset16To<Device> *> (value);
   }
-  static inline const OffsetTo<Device>& get_device (const Value* value, bool *worked=nullptr)
+  static inline const Offset16To<Device>& get_device (const Value* value, bool *worked=nullptr)
   {
     if (worked) *worked |= bool (*value);
-    return *static_cast<const OffsetTo<Device> *> (value);
+    return *static_cast<const Offset16To<Device> *> (value);
   }
 
   bool copy_device (hb_serialize_context_t *c, const void *base,
-                    const Value *src_value, const hb_map_t *layout_variation_idx_map) const
+                   const Value *src_value, const hb_map_t *layout_variation_idx_map) const
   {
     Value      *dst_value = c->copy (*src_value);
 
@@ -317,14 +359,22 @@ struct ValueFormat : HBUINT16
 
     return_trace (true);
   }
+
+ private:
+
+  void should_drop (Value value, Flags flag, unsigned int* format) const
+  {
+    if (value) return;
+    *format = *format & ~flag;
+  }
+
 };
 
-template<typename Iterator>
+template<typename Iterator, typename SrcLookup>
 static void SinglePos_serialize (hb_serialize_context_t *c,
-                                const void *src,
+                                const SrcLookup *src,
                                 Iterator it,
-                                ValueFormat valFormat,
-                                 const hb_map_t *layout_variation_idx_map);
+                                const hb_map_t *layout_variation_idx_map);
 
 
 struct AnchorFormat1
@@ -346,7 +396,10 @@ struct AnchorFormat1
   AnchorFormat1* copy (hb_serialize_context_t *c) const
   {
     TRACE_SERIALIZE (this);
-    return_trace (c->embed<AnchorFormat1> (this));
+    AnchorFormat1* out = c->embed<AnchorFormat1> (this);
+    if (!out) return_trace (out);
+    out->format = 1;
+    return_trace (out);
   }
 
   protected:
@@ -447,11 +500,11 @@ struct AnchorFormat3
   HBUINT16     format;                 /* Format identifier--format = 3 */
   FWORD                xCoordinate;            /* Horizontal value--in design units */
   FWORD                yCoordinate;            /* Vertical value--in design units */
-  OffsetTo<Device>
+  Offset16To<Device>
                xDeviceTable;           /* Offset to Device table for X
                                         * coordinate-- from beginning of
                                         * Anchor table (may be NULL) */
-  OffsetTo<Device>
+  Offset16To<Device>
                yDeviceTable;           /* Offset to Device table for Y
                                         * coordinate-- from beginning of
                                         * Anchor table (may be NULL) */
@@ -485,14 +538,22 @@ struct Anchor
     }
   }
 
-  Anchor* copy (hb_serialize_context_t *c, const hb_map_t *layout_variation_idx_map) const
+  bool subset (hb_subset_context_t *c) const
   {
-    TRACE_SERIALIZE (this);
+    TRACE_SUBSET (this);
     switch (u.format) {
-    case 1: return_trace (reinterpret_cast<Anchor *> (u.format1.copy (c)));
-    case 2: return_trace (reinterpret_cast<Anchor *> (u.format2.copy (c)));
-    case 3: return_trace (reinterpret_cast<Anchor *> (u.format3.copy (c, layout_variation_idx_map)));
-    default:return_trace (nullptr);
+    case 1: return_trace (bool (reinterpret_cast<Anchor *> (u.format1.copy (c->serializer))));
+    case 2:
+      if (c->plan->flags & HB_SUBSET_FLAGS_NO_HINTING)
+      {
+        // AnchorFormat 2 just containins extra hinting information, so
+        // if hints are being dropped convert to format 1.
+        return_trace (bool (reinterpret_cast<Anchor *> (u.format1.copy (c->serializer))));
+      }
+      return_trace (bool (reinterpret_cast<Anchor *> (u.format2.copy (c->serializer))));
+    case 3: return_trace (bool (reinterpret_cast<Anchor *> (u.format3.copy (c->serializer,
+                                                                            c->plan->layout_variation_idx_map))));
+    default:return_trace (false);
     }
   }
 
@@ -541,26 +602,24 @@ struct AnchorMatrix
   }
 
   template <typename Iterator,
-           hb_requires (hb_is_iterator (Iterator))>
-  bool serialize (hb_serialize_context_t *c,
-                 unsigned                num_rows,
-                 AnchorMatrix const     *offset_matrix,
-                  const hb_map_t         *layout_variation_idx_map,
-                 Iterator                index_iter)
+      hb_requires (hb_is_iterator (Iterator))>
+  bool subset (hb_subset_context_t *c,
+               unsigned             num_rows,
+               Iterator             index_iter) const
   {
-    TRACE_SERIALIZE (this);
-    if (!index_iter.len ()) return_trace (false);
-    if (unlikely (!c->extend_min ((*this))))  return_trace (false);
+    TRACE_SUBSET (this);
 
-    this->rows = num_rows;
+    auto *out = c->serializer->start_embed (this);
+
+    if (!index_iter) return_trace (false);
+    if (unlikely (!c->serializer->extend_min (out)))  return_trace (false);
+
+    out->rows = num_rows;
     for (const unsigned i : index_iter)
     {
-      auto *offset = c->embed (offset_matrix->matrixZ[i]);
+      auto *offset = c->serializer->embed (matrixZ[i]);
       if (!offset) return_trace (false);
-      offset->serialize_copy (c, offset_matrix->matrixZ[i],
-                              offset_matrix, c->to_bias (this),
-                              hb_serialize_context_t::Head,
-                              layout_variation_idx_map);
+      offset->serialize_subset (c, matrixZ[i], this);
     }
 
     return_trace (true);
@@ -579,7 +638,7 @@ struct AnchorMatrix
   }
 
   HBUINT16     rows;                   /* Number of rows */
-  UnsizedArrayOf<OffsetTo<Anchor>>
+  UnsizedArrayOf<Offset16To<Anchor>>
                matrixZ;                /* Matrix of offsets to Anchor tables--
                                         * from beginning of AnchorMatrix table */
   public:
@@ -598,18 +657,16 @@ struct MarkRecord
     return_trace (c->check_struct (this) && markAnchor.sanitize (c, base));
   }
 
-  MarkRecord *copy (hb_serialize_context_t *c,
-                   const void             *src_base,
-                   unsigned                dst_bias,
-                   const hb_map_t         *klass_mapping,
-                   const hb_map_t         *layout_variation_idx_map) const
+  MarkRecord *subset (hb_subset_context_t    *c,
+                      const void             *src_base,
+                      const hb_map_t         *klass_mapping) const
   {
-    TRACE_SERIALIZE (this);
-    auto *out = c->embed (this);
+    TRACE_SUBSET (this);
+    auto *out = c->serializer->embed (this);
     if (unlikely (!out)) return_trace (nullptr);
 
     out->klass = klass_mapping->get (klass);
-    out->markAnchor.serialize_copy (c, markAnchor, src_base, dst_bias, hb_serialize_context_t::Head, layout_variation_idx_map);
+    out->markAnchor.serialize_subset (c, markAnchor, src_base);
     return_trace (out);
   }
 
@@ -621,14 +678,14 @@ struct MarkRecord
 
   protected:
   HBUINT16     klass;                  /* Class defined for this mark */
-  OffsetTo<Anchor>
+  Offset16To<Anchor>
                markAnchor;             /* Offset to Anchor table--from
                                         * beginning of MarkArray table */
   public:
   DEFINE_SIZE_STATIC (4);
 };
 
-struct MarkArray : ArrayOf<MarkRecord> /* Array of MarkRecords--in Coverage order */
+struct MarkArray : Array16Of<MarkRecord>       /* Array of MarkRecords--in Coverage order */
 {
   bool apply (hb_ot_apply_context_t *c,
              unsigned int mark_index, unsigned int glyph_index,
@@ -637,7 +694,7 @@ struct MarkArray : ArrayOf<MarkRecord>      /* Array of MarkRecords--in Coverage orde
   {
     TRACE_APPLY (this);
     hb_buffer_t *buffer = c->buffer;
-    const MarkRecord &record = ArrayOf<MarkRecord>::operator[](mark_index);
+    const MarkRecord &record = Array16Of<MarkRecord>::operator[](mark_index);
     unsigned int mark_class = record.klass;
 
     const Anchor& mark_anchor = this + record.markAnchor;
@@ -649,7 +706,7 @@ struct MarkArray : ArrayOf<MarkRecord>      /* Array of MarkRecords--in Coverage orde
 
     float mark_x, mark_y, base_x, base_y;
 
-    buffer->unsafe_to_break (glyph_pos, buffer->idx);
+    buffer->unsafe_to_break (glyph_pos, buffer->idx + 1);
     mark_anchor.get_anchor (c, buffer->cur().codepoint, &mark_x, &mark_y);
     glyph_anchor.get_anchor (c, buffer->info[glyph_pos].codepoint, &base_x, &base_y);
 
@@ -664,25 +721,42 @@ struct MarkArray : ArrayOf<MarkRecord>    /* Array of MarkRecords--in Coverage orde
     return_trace (true);
   }
 
-  template<typename Iterator,
-          hb_requires (hb_is_source_of (Iterator, MarkRecord))>
-  bool serialize (hb_serialize_context_t *c,
-                 const hb_map_t         *klass_mapping,
-                  const hb_map_t         *layout_variation_idx_map,
-                 const void             *base,
-                 Iterator                it)
+  template <typename Iterator,
+      hb_requires (hb_is_iterator (Iterator))>
+  bool subset (hb_subset_context_t *c,
+               Iterator                    coverage,
+               const hb_map_t      *klass_mapping) const
   {
-    TRACE_SERIALIZE (this);
-    if (unlikely (!c->extend_min (*this))) return_trace (false);
-    if (unlikely (!c->check_assign (len, it.len ()))) return_trace (false);
-    c->copy_all (it, base, c->to_bias (this), klass_mapping, layout_variation_idx_map);
+    TRACE_SUBSET (this);
+    const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
+
+    auto* out = c->serializer->start_embed (this);
+    if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
+
+    auto mark_iter =
+    + hb_zip (coverage, this->iter ())
+    | hb_filter (glyphset, hb_first)
+    | hb_map (hb_second)
+    ;
+
+    unsigned new_length = 0;
+    for (const auto& mark_record : mark_iter) {
+      if (unlikely (!mark_record.subset (c, this, klass_mapping)))
+        return_trace (false);
+      new_length++;
+    }
+
+    if (unlikely (!c->serializer->check_assign (out->len, new_length,
+                                                HB_SERIALIZE_ERROR_ARRAY_OVERFLOW)))
+      return_trace (false);
+
     return_trace (true);
   }
 
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
-    return_trace (ArrayOf<MarkRecord>::sanitize (c, this));
+    return_trace (Array16Of<MarkRecord>::sanitize (c, this));
   }
 };
 
@@ -698,7 +772,7 @@ struct SinglePosFormat1
   void collect_variation_indices (hb_collect_variation_indices_context_t *c) const
   {
     if (!valueFormat.has_device ()) return;
-    
+
     auto it =
     + hb_iter (this+coverage)
     | hb_filter (c->glyph_set)
@@ -713,6 +787,8 @@ struct SinglePosFormat1
 
   const Coverage &get_coverage () const { return this+coverage; }
 
+  ValueFormat get_value_format () const { return valueFormat; }
+
   bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
@@ -727,35 +803,39 @@ struct SinglePosFormat1
   }
 
   template<typename Iterator,
-          hb_requires (hb_is_iterator (Iterator))>
+      typename SrcLookup,
+      hb_requires (hb_is_iterator (Iterator))>
   void serialize (hb_serialize_context_t *c,
-                 const void *src,
+                 const SrcLookup *src,
                  Iterator it,
-                 ValueFormat valFormat,
-                  const hb_map_t *layout_variation_idx_map)
+                 ValueFormat newFormat,
+                 const hb_map_t *layout_variation_idx_map)
   {
-    auto out = c->extend_min (*this);
-    if (unlikely (!out)) return;
-    if (unlikely (!c->check_assign (valueFormat, valFormat))) return;
+    if (unlikely (!c->extend_min (this))) return;
+    if (unlikely (!c->check_assign (valueFormat,
+                                    newFormat,
+                                    HB_SERIALIZE_ERROR_INT_OVERFLOW))) return;
 
-    + it
-    | hb_map (hb_second)
-    | hb_apply ([&] (hb_array_t<const Value> _)
-               { valFormat.serialize_copy (c, src, &_, layout_variation_idx_map); })
-    ;
+    for (const hb_array_t<const Value>& _ : + it | hb_map (hb_second))
+    {
+      src->get_value_format ().copy_values (c, newFormat, src,  &_, layout_variation_idx_map);
+      // Only serialize the first entry in the iterator, the rest are assumed to
+      // be the same.
+      break;
+    }
 
     auto glyphs =
     + it
     | hb_map_retains_sorting (hb_first)
     ;
 
-    coverage.serialize (c, this).serialize (c, glyphs);
+    coverage.serialize_serialize (c, glyphs);
   }
 
   bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
-    const hb_set_t &glyphset = *c->plan->glyphset ();
+    const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
     const hb_map_t &glyph_map = *c->plan->glyph_map;
 
     auto it =
@@ -766,7 +846,7 @@ struct SinglePosFormat1
     ;
 
     bool ret = bool (it);
-    SinglePos_serialize (c->serializer, this, it, valueFormat, c->plan->layout_variation_idx_map);
+    SinglePos_serialize (c->serializer, this, it, c->plan->layout_variation_idx_map);
     return_trace (ret);
   }
 
@@ -780,7 +860,7 @@ struct SinglePosFormat1
 
   protected:
   HBUINT16     format;                 /* Format identifier--format = 1 */
-  OffsetTo<Coverage>
+  Offset16To<Coverage>
                coverage;               /* Offset to Coverage table--from
                                         * beginning of subtable */
   ValueFormat  valueFormat;            /* Defines the types of data in the
@@ -801,7 +881,7 @@ struct SinglePosFormat2
   void collect_variation_indices (hb_collect_variation_indices_context_t *c) const
   {
     if (!valueFormat.has_device ()) return;
-     
+
     auto it =
     + hb_zip (this+coverage, hb_range ((unsigned) valueCount))
     | hb_filter (c->glyph_set, hb_first)
@@ -813,7 +893,7 @@ struct SinglePosFormat2
     const hb_array_t<const Value> values_array = values.as_array (valueCount * sub_length);
 
     for (unsigned i : + it
-                      | hb_map (hb_second))
+                     | hb_map (hb_second))
       valueFormat.collect_variation_indices (c, this, values_array.sub_array (i * sub_length, sub_length));
 
   }
@@ -823,6 +903,8 @@ struct SinglePosFormat2
 
   const Coverage &get_coverage () const { return this+coverage; }
 
+  ValueFormat get_value_format () const { return valueFormat; }
+
   bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
@@ -841,22 +923,23 @@ struct SinglePosFormat2
   }
 
   template<typename Iterator,
-          hb_requires (hb_is_iterator (Iterator))>
+      typename SrcLookup,
+      hb_requires (hb_is_iterator (Iterator))>
   void serialize (hb_serialize_context_t *c,
-                 const void *src,
+                 const SrcLookup *src,
                  Iterator it,
-                 ValueFormat valFormat,
-                  const hb_map_t *layout_variation_idx_map)
+                 ValueFormat newFormat,
+                 const hb_map_t *layout_variation_idx_map)
   {
-    auto out = c->extend_min (*this);
+    auto out = c->extend_min (this);
     if (unlikely (!out)) return;
-    if (unlikely (!c->check_assign (valueFormat, valFormat))) return;
-    if (unlikely (!c->check_assign (valueCount, it.len ()))) return;
+    if (unlikely (!c->check_assign (valueFormat, newFormat, HB_SERIALIZE_ERROR_INT_OVERFLOW))) return;
+    if (unlikely (!c->check_assign (valueCount, it.len (), HB_SERIALIZE_ERROR_ARRAY_OVERFLOW))) return;
 
     + it
     | hb_map (hb_second)
     | hb_apply ([&] (hb_array_t<const Value> _)
-               { valFormat.serialize_copy (c, src, &_, layout_variation_idx_map); })
+    { src->get_value_format ().copy_values (c, newFormat, src, &_, layout_variation_idx_map); })
     ;
 
     auto glyphs =
@@ -864,13 +947,13 @@ struct SinglePosFormat2
     | hb_map_retains_sorting (hb_first)
     ;
 
-    coverage.serialize (c, this).serialize (c, glyphs);
+    coverage.serialize_serialize (c, glyphs);
   }
 
   bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
-    const hb_set_t &glyphset = *c->plan->glyphset ();
+    const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
     const hb_map_t &glyph_map = *c->plan->glyph_map;
 
     unsigned sub_length = valueFormat.get_len ();
@@ -888,7 +971,7 @@ struct SinglePosFormat2
     ;
 
     bool ret = bool (it);
-    SinglePos_serialize (c->serializer, this, it, valueFormat, c->plan->layout_variation_idx_map);
+    SinglePos_serialize (c->serializer, this, it, c->plan->layout_variation_idx_map);
     return_trace (ret);
   }
 
@@ -902,7 +985,7 @@ struct SinglePosFormat2
 
   protected:
   HBUINT16     format;                 /* Format identifier--format = 2 */
-  OffsetTo<Coverage>
+  Offset16To<Coverage>
                coverage;               /* Offset to Coverage table--from
                                         * beginning of subtable */
   ValueFormat  valueFormat;            /* Defines the types of data in the
@@ -932,24 +1015,37 @@ struct SinglePos
 
 
   template<typename Iterator,
-          hb_requires (hb_is_iterator (Iterator))>
+      typename SrcLookup,
+      hb_requires (hb_is_iterator (Iterator))>
   void serialize (hb_serialize_context_t *c,
-                 const void *src,
+                 const SrcLookup* src,
                  Iterator glyph_val_iter_pairs,
-                 ValueFormat valFormat,
-                  const hb_map_t *layout_variation_idx_map)
+                 const hb_map_t *layout_variation_idx_map)
   {
     if (unlikely (!c->extend_min (u.format))) return;
     unsigned format = 2;
+    ValueFormat new_format = src->get_value_format ();
 
-    if (glyph_val_iter_pairs) format = get_format (glyph_val_iter_pairs);
+    if (glyph_val_iter_pairs)
+    {
+      format = get_format (glyph_val_iter_pairs);
+      new_format = src->get_value_format ().get_effective_format (+ glyph_val_iter_pairs | hb_map (hb_second));
+    }
 
     u.format = format;
     switch (u.format) {
-    case 1: u.format1.serialize (c, src, glyph_val_iter_pairs, valFormat, layout_variation_idx_map);
-           return;
-    case 2: u.format2.serialize (c, src, glyph_val_iter_pairs, valFormat, layout_variation_idx_map);
-           return;
+    case 1: u.format1.serialize (c,
+                                 src,
+                                 glyph_val_iter_pairs,
+                                 new_format,
+                                 layout_variation_idx_map);
+      return;
+    case 2: u.format2.serialize (c,
+                                 src,
+                                 glyph_val_iter_pairs,
+                                 new_format,
+                                 layout_variation_idx_map);
+      return;
     default:return;
     }
   }
@@ -960,8 +1056,8 @@ struct SinglePos
     TRACE_DISPATCH (this, u.format);
     if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
     switch (u.format) {
-    case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...));
-    case 2: return_trace (c->dispatch (u.format2, hb_forward<Ts> (ds)...));
+    case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...));
+    case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...));
     default:return_trace (c->default_return_value ());
     }
   }
@@ -974,14 +1070,13 @@ struct SinglePos
   } u;
 };
 
-template<typename Iterator>
+template<typename Iterator, typename SrcLookup>
 static void
 SinglePos_serialize (hb_serialize_context_t *c,
-                    const void *src,
+                    const SrcLookup *src,
                     Iterator it,
-                    ValueFormat valFormat,
-                     const hb_map_t *layout_variation_idx_map)
-{ c->start_embed<SinglePos> ()->serialize (c, src, it, valFormat, layout_variation_idx_map); }
+                    const hb_map_t *layout_variation_idx_map)
+{ c->start_embed<SinglePos> ()->serialize (c, src, it, layout_variation_idx_map); }
 
 
 struct PairValueRecord
@@ -991,33 +1086,42 @@ struct PairValueRecord
   int cmp (hb_codepoint_t k) const
   { return secondGlyph.cmp (k); }
 
-  struct serialize_closure_t
+  struct context_t
   {
     const void                 *base;
     const ValueFormat  *valueFormats;
+    const ValueFormat  *newFormats;
     unsigned           len1; /* valueFormats[0].get_len() */
     const hb_map_t     *glyph_map;
     const hb_map_t      *layout_variation_idx_map;
   };
 
-  bool serialize (hb_serialize_context_t *c,
-                 serialize_closure_t *closure) const
+  bool subset (hb_subset_context_t *c,
+               context_t *closure) const
   {
     TRACE_SERIALIZE (this);
-    auto *out = c->start_embed (*this);
-    if (unlikely (!c->extend_min (out))) return_trace (false);
+    auto *s = c->serializer;
+    auto *out = s->start_embed (*this);
+    if (unlikely (!s->extend_min (out))) return_trace (false);
 
     out->secondGlyph = (*closure->glyph_map)[secondGlyph];
 
-    closure->valueFormats[0].serialize_copy (c, closure->base, &values[0], closure->layout_variation_idx_map);
-    closure->valueFormats[1].serialize_copy (c, closure->base, &values[closure->len1], closure->layout_variation_idx_map);
+    closure->valueFormats[0].copy_values (s,
+                                          closure->newFormats[0],
+                                          closure->base, &values[0],
+                                          closure->layout_variation_idx_map);
+    closure->valueFormats[1].copy_values (s,
+                                          closure->newFormats[1],
+                                          closure->base,
+                                          &values[closure->len1],
+                                          closure->layout_variation_idx_map);
 
     return_trace (true);
   }
 
   void collect_variation_indices (hb_collect_variation_indices_context_t *c,
-                                  const ValueFormat *valueFormats,
-                                  const void *base) const
+                                 const ValueFormat *valueFormats,
+                                 const void *base) const
   {
     unsigned record1_len = valueFormats[0].get_len ();
     unsigned record2_len = valueFormats[1].get_len ();
@@ -1030,8 +1134,23 @@ struct PairValueRecord
       valueFormats[1].collect_variation_indices (c, base, values_array.sub_array (record1_len, record2_len));
   }
 
+  bool intersects (const hb_set_t& glyphset) const
+  {
+    return glyphset.has(secondGlyph);
+  }
+
+  const Value* get_values_1 () const
+  {
+    return &values[0];
+  }
+
+  const Value* get_values_2 (ValueFormat format1) const
+  {
+    return &values[format1.get_len ()];
+  }
+
   protected:
-  HBGlyphID    secondGlyph;            /* GlyphID of second glyph in the
+  HBGlyphID16  secondGlyph;            /* GlyphID of second glyph in the
                                         * pair--first glyph is listed in the
                                         * Coverage table */
   ValueRecord  values;                 /* Positioning data for the first glyph
@@ -1063,7 +1182,7 @@ struct PairSet
   }
 
   void collect_glyphs (hb_collect_glyphs_context_t *c,
-                             const ValueFormat *valueFormats) const
+                      const ValueFormat *valueFormats) const
   {
     unsigned int len1 = valueFormats[0].get_len ();
     unsigned int len2 = valueFormats[1].get_len ();
@@ -1074,7 +1193,7 @@ struct PairSet
   }
 
   void collect_variation_indices (hb_collect_variation_indices_context_t *c,
-                                  const ValueFormat *valueFormats) const
+                                 const ValueFormat *valueFormats) const
   {
     unsigned len1 = valueFormats[0].get_len ();
     unsigned len2 = valueFormats[1].get_len ();
@@ -1107,20 +1226,22 @@ struct PairSet
                                                record_size);
     if (record)
     {
-      /* Note the intentional use of "|" instead of short-circuit "||". */
-      if (valueFormats[0].apply_value (c, this, &record->values[0], buffer->cur_pos()) |
-         valueFormats[1].apply_value (c, this, &record->values[len1], buffer->pos[pos]))
+      bool applied_first = valueFormats[0].apply_value (c, this, &record->values[0], buffer->cur_pos());
+      bool applied_second = valueFormats[1].apply_value (c, this, &record->values[len1], buffer->pos[pos]);
+      if (applied_first || applied_second)
        buffer->unsafe_to_break (buffer->idx, pos + 1);
       if (len2)
        pos++;
       buffer->idx = pos;
       return_trace (true);
     }
+    buffer->unsafe_to_concat (buffer->idx, pos + 1);
     return_trace (false);
   }
 
   bool subset (hb_subset_context_t *c,
-              const ValueFormat valueFormats[2]) const
+              const ValueFormat valueFormats[2],
+               const ValueFormat newFormats[2]) const
   {
     TRACE_SUBSET (this);
     auto snap = c->serializer->snapshot ();
@@ -1129,17 +1250,18 @@ struct PairSet
     if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
     out->len = 0;
 
-    const hb_set_t &glyphset = *c->plan->glyphset ();
+    const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
     const hb_map_t &glyph_map = *c->plan->glyph_map;
 
     unsigned len1 = valueFormats[0].get_len ();
     unsigned len2 = valueFormats[1].get_len ();
     unsigned record_size = HBUINT16::static_size + Value::static_size * (len1 + len2);
 
-    PairValueRecord::serialize_closure_t closure =
+    PairValueRecord::context_t context =
     {
       this,
       valueFormats,
+      newFormats,
       len1,
       &glyph_map,
       c->plan->layout_variation_idx_map
@@ -1150,7 +1272,7 @@ struct PairSet
     for (unsigned i = 0; i < count; i++)
     {
       if (glyphset.has (record->secondGlyph)
-        && record->serialize (c->serializer, &closure)) num++;
+        && record->subset (c, &context)) num++;
       record = &StructAtOffset<const PairValueRecord> (record, record_size);
     }
 
@@ -1198,7 +1320,7 @@ struct PairPosFormat1
     + hb_zip (this+coverage, pairSet)
     | hb_filter (*glyphs, hb_first)
     | hb_map (hb_second)
-    | hb_map ([glyphs, this] (const OffsetTo<PairSet> &_)
+    | hb_map ([glyphs, this] (const Offset16To<PairSet> &_)
              { return (this+_).intersects (glyphs, valueFormat); })
     | hb_any
     ;
@@ -1241,7 +1363,12 @@ struct PairPosFormat1
 
     hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
     skippy_iter.reset (buffer->idx, 1);
-    if (!skippy_iter.next ()) return_trace (false);
+    unsigned unsafe_to;
+    if (!skippy_iter.next (&unsafe_to))
+    {
+      buffer->unsafe_to_concat (buffer->idx, unsafe_to);
+      return_trace (false);
+    }
 
     return_trace ((this+pairSet[index]).apply (c, valueFormat, skippy_iter.idx));
   }
@@ -1250,7 +1377,7 @@ struct PairPosFormat1
   {
     TRACE_SUBSET (this);
 
-    const hb_set_t &glyphset = *c->plan->glyphset ();
+    const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
     const hb_map_t &glyph_map = *c->plan->glyph_map;
 
     auto *out = c->serializer->start_embed (*this);
@@ -1258,17 +1385,23 @@ struct PairPosFormat1
     out->format = format;
     out->valueFormat[0] = valueFormat[0];
     out->valueFormat[1] = valueFormat[1];
+    if (c->plan->flags & HB_SUBSET_FLAGS_NO_HINTING)
+    {
+      hb_pair_t<unsigned, unsigned> newFormats = compute_effective_value_formats (glyphset);
+      out->valueFormat[0] = newFormats.first;
+      out->valueFormat[1] = newFormats.second;
+    }
 
     hb_sorted_vector_t<hb_codepoint_t> new_coverage;
 
     + hb_zip (this+coverage, pairSet)
     | hb_filter (glyphset, hb_first)
-    | hb_filter ([this, c, out] (const OffsetTo<PairSet>& _)
+    | hb_filter ([this, c, out] (const Offset16To<PairSet>& _)
                 {
+                   auto snap = c->serializer->snapshot ();
                   auto *o = out->pairSet.serialize_append (c->serializer);
                   if (unlikely (!o)) return false;
-                  auto snap = c->serializer->snapshot ();
-                  bool ret = o->serialize_subset (c, _, this, valueFormat);
+                  bool ret = o->serialize_subset (c, _, this, valueFormat, out->valueFormat);
                   if (!ret)
                   {
                     out->pairSet.pop ();
@@ -1282,12 +1415,41 @@ struct PairPosFormat1
     | hb_sink (new_coverage)
     ;
 
-    out->coverage.serialize (c->serializer, out)
-                .serialize (c->serializer, new_coverage.iter ());
+    out->coverage.serialize_serialize (c->serializer, new_coverage.iter ());
 
     return_trace (bool (new_coverage));
   }
 
+
+  hb_pair_t<unsigned, unsigned> compute_effective_value_formats (const hb_set_t& glyphset) const
+  {
+    unsigned len1 = valueFormat[0].get_len ();
+    unsigned len2 = valueFormat[1].get_len ();
+    unsigned record_size = HBUINT16::static_size + Value::static_size * (len1 + len2);
+
+    unsigned format1 = 0;
+    unsigned format2 = 0;
+    for (const Offset16To<PairSet>& _ :
+             + hb_zip (this+coverage, pairSet) | hb_filter (glyphset, hb_first) | hb_map (hb_second))
+    {
+      const PairSet& set = (this + _);
+      const PairValueRecord *record = &set.firstPairValueRecord;
+
+      for (unsigned i = 0; i < set.len; i++)
+      {
+        if (record->intersects (glyphset))
+        {
+          format1 = format1 | valueFormat[0].get_effective_format (record->get_values_1 ());
+          format2 = format2 | valueFormat[1].get_effective_format (record->get_values_2 (valueFormat[0]));
+        }
+        record = &StructAtOffset<const PairValueRecord> (record, record_size);
+      }
+    }
+
+    return hb_pair (format1, format2);
+  }
+
+
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -1308,7 +1470,7 @@ struct PairPosFormat1
 
   protected:
   HBUINT16     format;                 /* Format identifier--format = 1 */
-  OffsetTo<Coverage>
+  Offset16To<Coverage>
                coverage;               /* Offset to Coverage table--from
                                         * beginning of subtable */
   ValueFormat  valueFormat[2];         /* [0] Defines the types of data in
@@ -1317,7 +1479,7 @@ struct PairPosFormat1
                                        /* [1] Defines the types of data in
                                         * ValueRecord2--for the second glyph
                                         * in the pair--may be zero (0) */
-  OffsetArrayOf<PairSet>
+  Array16OfOffset16To<PairSet>
                pairSet;                /* Array of PairSet tables
                                         * ordered by Coverage Index */
   public:
@@ -1335,19 +1497,36 @@ struct PairPosFormat2
   void closure_lookups (hb_closure_lookups_context_t *c) const {}
   void collect_variation_indices (hb_collect_variation_indices_context_t *c) const
   {
+    if (!intersects (c->glyph_set)) return;
     if ((!valueFormat1.has_device ()) && (!valueFormat2.has_device ())) return;
 
+    hb_set_t klass1_glyphs, klass2_glyphs;
+    if (!(this+classDef1).collect_coverage (&klass1_glyphs)) return;
+    if (!(this+classDef2).collect_coverage (&klass2_glyphs)) return;
+
     hb_set_t class1_set, class2_set;
-    for (const unsigned cp : c->glyph_set->iter ())
+    for (const unsigned cp : + c->glyph_set->iter () | hb_filter (this + coverage))
+    {
+      if (!klass1_glyphs.has (cp)) class1_set.add (0);
+      else
+      {
+        unsigned klass1 = (this+classDef1).get (cp);
+        class1_set.add (klass1);
+      }
+    }
+
+    class2_set.add (0);
+    for (const unsigned cp : + c->glyph_set->iter () | hb_filter (klass2_glyphs))
     {
-      unsigned klass1 = (this+classDef1).get (cp);
       unsigned klass2 = (this+classDef2).get (cp);
-      class1_set.add (klass1);
       class2_set.add (klass2);
     }
 
-    if (class1_set.is_empty () || class2_set.is_empty ()) return;
-    
+    if (class1_set.is_empty ()
+        || class2_set.is_empty ()
+        || (class2_set.get_population() == 1 && class2_set.has(0)))
+      return;
+
     unsigned len1 = valueFormat1.get_len ();
     unsigned len2 = valueFormat2.get_len ();
     const hb_array_t<const Value> values_array = values.as_array ((unsigned)class1Count * (unsigned) class2Count * (len1 + len2));
@@ -1355,12 +1534,12 @@ struct PairPosFormat2
     {
       for (const unsigned class2_idx : class2_set.iter ())
       {
-        unsigned start_offset = (class1_idx * (unsigned) class2Count + class2_idx) * (len1 + len2);
-        if (valueFormat1.has_device ())
-          valueFormat1.collect_variation_indices (c, this, values_array.sub_array (start_offset, len1));
-        
-        if (valueFormat2.has_device ())
-          valueFormat2.collect_variation_indices (c, this, values_array.sub_array (start_offset+len1, len2));
+       unsigned start_offset = (class1_idx * (unsigned) class2Count + class2_idx) * (len1 + len2);
+       if (valueFormat1.has_device ())
+         valueFormat1.collect_variation_indices (c, this, values_array.sub_array (start_offset, len1));
+
+       if (valueFormat2.has_device ())
+         valueFormat2.collect_variation_indices (c, this, values_array.sub_array (start_offset+len1, len2));
       }
     }
   }
@@ -1382,7 +1561,12 @@ struct PairPosFormat2
 
     hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
     skippy_iter.reset (buffer->idx, 1);
-    if (!skippy_iter.next ()) return_trace (false);
+    unsigned unsafe_to;
+    if (!skippy_iter.next (&unsafe_to))
+    {
+      buffer->unsafe_to_concat (buffer->idx, unsafe_to);
+      return_trace (false);
+    }
 
     unsigned int len1 = valueFormat1.get_len ();
     unsigned int len2 = valueFormat2.get_len ();
@@ -1390,13 +1574,89 @@ struct PairPosFormat2
 
     unsigned int klass1 = (this+classDef1).get_class (buffer->cur().codepoint);
     unsigned int klass2 = (this+classDef2).get_class (buffer->info[skippy_iter.idx].codepoint);
-    if (unlikely (klass1 >= class1Count || klass2 >= class2Count)) return_trace (false);
+    if (unlikely (klass1 >= class1Count || klass2 >= class2Count))
+    {
+      buffer->unsafe_to_concat (buffer->idx, skippy_iter.idx + 1);
+      return_trace (false);
+    }
 
     const Value *v = &values[record_len * (klass1 * class2Count + klass2)];
-    /* Note the intentional use of "|" instead of short-circuit "||". */
-    if (valueFormat1.apply_value (c, this, v, buffer->cur_pos()) |
-       valueFormat2.apply_value (c, this, v + len1, buffer->pos[skippy_iter.idx]))
+
+    bool applied_first = false, applied_second = false;
+
+
+    /* Isolate simple kerning and apply it half to each side.
+     * Results in better cursor positinoing / underline drawing.
+     *
+     * Disabled, because causes issues... :-(
+     * https://github.com/harfbuzz/harfbuzz/issues/3408
+     * https://github.com/harfbuzz/harfbuzz/pull/3235#issuecomment-1029814978
+     */
+#ifndef HB_SPLIT_KERN
+    if (0)
+#endif
+    {
+      if (!len2)
+      {
+       const hb_direction_t dir = buffer->props.direction;
+       const bool horizontal = HB_DIRECTION_IS_HORIZONTAL (dir);
+       const bool backward = HB_DIRECTION_IS_BACKWARD (dir);
+       unsigned mask = horizontal ? ValueFormat::xAdvance : ValueFormat::yAdvance;
+       if (backward)
+         mask |= mask >> 2; /* Add eg. xPlacement in RTL. */
+       /* Add Devices. */
+       mask |= mask << 4;
+
+       if (valueFormat1 & ~mask)
+         goto bail;
+
+       /* Is simple kern. Apply value on an empty position slot,
+        * then split it between sides. */
+
+       hb_glyph_position_t pos{};
+       if (valueFormat1.apply_value (c, this, v, pos))
+       {
+         hb_position_t *src  = &pos.x_advance;
+         hb_position_t *dst1 = &buffer->cur_pos().x_advance;
+         hb_position_t *dst2 = &buffer->pos[skippy_iter.idx].x_advance;
+         unsigned i = horizontal ? 0 : 1;
+
+         hb_position_t kern  = src[i];
+         hb_position_t kern1 = kern >> 1;
+         hb_position_t kern2 = kern - kern1;
+
+         if (!backward)
+         {
+           dst1[i] += kern1;
+           dst2[i] += kern2;
+           dst2[i + 2] += kern2;
+         }
+         else
+         {
+           dst1[i] += kern1;
+           dst1[i + 2] += src[i + 2] - kern2;
+           dst2[i] += kern2;
+         }
+
+         applied_first = applied_second = kern != 0;
+         goto success;
+       }
+       goto boring;
+      }
+    }
+    bail:
+
+
+    applied_first = valueFormat1.apply_value (c, this, v, buffer->cur_pos());
+    applied_second = valueFormat2.apply_value (c, this, v + len1, buffer->pos[skippy_iter.idx]);
+
+    success:
+    if (applied_first || applied_second)
       buffer->unsafe_to_break (buffer->idx, skippy_iter.idx + 1);
+    else
+    boring:
+      buffer->unsafe_to_concat (buffer->idx, skippy_iter.idx + 1);
+
 
     buffer->idx = skippy_iter.idx;
     if (len2)
@@ -1411,37 +1671,36 @@ struct PairPosFormat2
     auto *out = c->serializer->start_embed (*this);
     if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
     out->format = format;
-    out->valueFormat1 = valueFormat1;
-    out->valueFormat2 = valueFormat2;
 
     hb_map_t klass1_map;
-    out->classDef1.serialize_subset (c, classDef1, this, &klass1_map);
+    out->classDef1.serialize_subset (c, classDef1, this, &klass1_map, true, true, &(this + coverage));
     out->class1Count = klass1_map.get_population ();
 
     hb_map_t klass2_map;
-    out->classDef2.serialize_subset (c, classDef2, this, &klass2_map);
+    out->classDef2.serialize_subset (c, classDef2, this, &klass2_map, true, false);
     out->class2Count = klass2_map.get_population ();
 
     unsigned len1 = valueFormat1.get_len ();
     unsigned len2 = valueFormat2.get_len ();
 
-    + hb_range ((unsigned) class1Count)
-    | hb_filter (klass1_map)
-    | hb_apply ([&] (const unsigned class1_idx)
-                {
-                  + hb_range ((unsigned) class2Count)
-                  | hb_filter (klass2_map)
-                  | hb_apply ([&] (const unsigned class2_idx)
-                              {
-                                unsigned idx = (class1_idx * (unsigned) class2Count + class2_idx) * (len1 + len2);
-                                valueFormat1.serialize_copy (c->serializer, this, &values[idx], c->plan->layout_variation_idx_map);
-                                valueFormat2.serialize_copy (c->serializer, this, &values[idx + len1], c->plan->layout_variation_idx_map);
-                              })
-                  ;
-                })
-    ;
+    hb_pair_t<unsigned, unsigned> newFormats = hb_pair (valueFormat1, valueFormat2);
+    if (c->plan->flags & HB_SUBSET_FLAGS_NO_HINTING)
+      newFormats = compute_effective_value_formats (klass1_map, klass2_map);
+
+    out->valueFormat1 = newFormats.first;
+    out->valueFormat2 = newFormats.second;
+
+    for (unsigned class1_idx : + hb_range ((unsigned) class1Count) | hb_filter (klass1_map))
+    {
+      for (unsigned class2_idx : + hb_range ((unsigned) class2Count) | hb_filter (klass2_map))
+      {
+        unsigned idx = (class1_idx * (unsigned) class2Count + class2_idx) * (len1 + len2);
+        valueFormat1.copy_values (c->serializer, newFormats.first, this, &values[idx], c->plan->layout_variation_idx_map);
+        valueFormat2.copy_values (c->serializer, newFormats.second, this, &values[idx + len1], c->plan->layout_variation_idx_map);
+      }
+    }
 
-    const hb_set_t &glyphset = *c->plan->_glyphset_gsub;
+    const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
     const hb_map_t &glyph_map = *c->plan->glyph_map;
 
     auto it =
@@ -1450,10 +1709,34 @@ struct PairPosFormat2
     | hb_map_retains_sorting (glyph_map)
     ;
 
-    out->coverage.serialize (c->serializer, out).serialize (c->serializer, it);
+    out->coverage.serialize_serialize (c->serializer, it);
     return_trace (out->class1Count && out->class2Count && bool (it));
   }
 
+
+  hb_pair_t<unsigned, unsigned> compute_effective_value_formats (const hb_map_t& klass1_map,
+                                                                 const hb_map_t& klass2_map) const
+  {
+    unsigned len1 = valueFormat1.get_len ();
+    unsigned len2 = valueFormat2.get_len ();
+
+    unsigned format1 = 0;
+    unsigned format2 = 0;
+
+    for (unsigned class1_idx : + hb_range ((unsigned) class1Count) | hb_filter (klass1_map))
+    {
+      for (unsigned class2_idx : + hb_range ((unsigned) class2Count) | hb_filter (klass2_map))
+      {
+        unsigned idx = (class1_idx * (unsigned) class2Count + class2_idx) * (len1 + len2);
+        format1 = format1 | valueFormat1.get_effective_format (&values[idx]);
+        format2 = format2 | valueFormat2.get_effective_format (&values[idx + len1]);
+      }
+    }
+
+    return hb_pair (format1, format2);
+  }
+
+
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -1476,7 +1759,7 @@ struct PairPosFormat2
 
   protected:
   HBUINT16     format;                 /* Format identifier--format = 2 */
-  OffsetTo<Coverage>
+  Offset16To<Coverage>
                coverage;               /* Offset to Coverage table--from
                                         * beginning of subtable */
   ValueFormat  valueFormat1;           /* ValueRecord definition--for the
@@ -1485,11 +1768,11 @@ struct PairPosFormat2
   ValueFormat  valueFormat2;           /* ValueRecord definition--for the
                                         * second glyph of the pair--may be
                                         * zero (0) */
-  OffsetTo<ClassDef>
+  Offset16To<ClassDef>
                classDef1;              /* Offset to ClassDef table--from
                                         * beginning of PairPos subtable--for
                                         * the first glyph of the pair */
-  OffsetTo<ClassDef>
+  Offset16To<ClassDef>
                classDef2;              /* Offset to ClassDef table--from
                                         * beginning of PairPos subtable--for
                                         * the second glyph of the pair */
@@ -1512,8 +1795,8 @@ struct PairPos
     TRACE_DISPATCH (this, u.format);
     if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
     switch (u.format) {
-    case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...));
-    case 2: return_trace (c->dispatch (u.format2, hb_forward<Ts> (ds)...));
+    case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...));
+    case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...));
     default:return_trace (c->default_return_value ());
     }
   }
@@ -1544,26 +1827,24 @@ struct EntryExitRecord
     (src_base+exitAnchor).collect_variation_indices (c);
   }
 
-  EntryExitRecord* copy (hb_serialize_context_t *c,
-                        const void *src_base,
-                        const void *dst_base,
-                         const hb_map_t *layout_variation_idx_map) const
+  EntryExitRecord* subset (hb_subset_context_t *c,
+                           const void *src_base) const
   {
     TRACE_SERIALIZE (this);
-    auto *out = c->embed (this);
+    auto *out = c->serializer->embed (this);
     if (unlikely (!out)) return_trace (nullptr);
 
-    out->entryAnchor.serialize_copy (c, entryAnchor, src_base, c->to_bias (dst_base), hb_serialize_context_t::Head, layout_variation_idx_map);
-    out->exitAnchor.serialize_copy (c, exitAnchor, src_base, c->to_bias (dst_base), hb_serialize_context_t::Head, layout_variation_idx_map);
+    out->entryAnchor.serialize_subset (c, entryAnchor, src_base);
+    out->exitAnchor.serialize_subset (c, exitAnchor, src_base);
     return_trace (out);
   }
 
   protected:
-  OffsetTo<Anchor>
+  Offset16To<Anchor>
                entryAnchor;            /* Offset to EntryAnchor table--from
                                         * beginning of CursivePos
                                         * subtable--may be NULL */
-  OffsetTo<Anchor>
+  Offset16To<Anchor>
                exitAnchor;             /* Offset to ExitAnchor table--from
                                         * beginning of CursivePos
                                         * subtable--may be NULL */
@@ -1605,10 +1886,19 @@ struct CursivePosFormat1
 
     hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
     skippy_iter.reset (buffer->idx, 1);
-    if (!skippy_iter.prev ()) return_trace (false);
+    unsigned unsafe_from;
+    if (!skippy_iter.prev (&unsafe_from))
+    {
+      buffer->unsafe_to_concat_from_outbuffer (unsafe_from, buffer->idx + 1);
+      return_trace (false);
+    }
 
     const EntryExitRecord &prev_record = entryExitRecord[(this+coverage).get_coverage  (buffer->info[skippy_iter.idx].codepoint)];
-    if (!prev_record.exitAnchor) return_trace (false);
+    if (!prev_record.exitAnchor)
+    {
+      buffer->unsafe_to_concat_from_outbuffer (skippy_iter.idx, buffer->idx + 1);
+      return_trace (false);
+    }
 
     unsigned int i = skippy_iter.idx;
     unsigned int j = buffer->idx;
@@ -1692,37 +1982,42 @@ struct CursivePosFormat1
     else
       pos[child].x_offset = x_offset;
 
+    /* If parent was attached to child, separate them.
+     * https://github.com/harfbuzz/harfbuzz/issues/2469
+     */
+    if (unlikely (pos[parent].attach_chain() == -pos[child].attach_chain()))
+      pos[parent].attach_chain() = 0;
+
     buffer->idx++;
     return_trace (true);
   }
 
   template <typename Iterator,
            hb_requires (hb_is_iterator (Iterator))>
-  void serialize (hb_serialize_context_t *c,
+  void serialize (hb_subset_context_t *c,
                  Iterator it,
-                 const void *src_base,
-                  const hb_map_t *layout_variation_idx_map)
+                 const void *src_base)
   {
-    if (unlikely (!c->extend_min ((*this)))) return;
+    if (unlikely (!c->serializer->extend_min ((*this)))) return;
     this->format = 1;
     this->entryExitRecord.len = it.len ();
 
     for (const EntryExitRecord& entry_record : + it
                                               | hb_map (hb_second))
-      c->copy (entry_record, src_base, this, layout_variation_idx_map);
+      entry_record.subset (c, src_base);
 
     auto glyphs =
     + it
     | hb_map_retains_sorting (hb_first)
     ;
 
-    coverage.serialize (c, this).serialize (c, glyphs);
+    coverage.serialize_serialize (c->serializer, glyphs);
   }
 
   bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
-    const hb_set_t &glyphset = *c->plan->glyphset ();
+    const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
     const hb_map_t &glyph_map = *c->plan->glyph_map;
 
     auto *out = c->serializer->start_embed (*this);
@@ -1736,7 +2031,7 @@ struct CursivePosFormat1
     ;
 
     bool ret = bool (it);
-    out->serialize (c->serializer, it, this, c->plan->layout_variation_idx_map);
+    out->serialize (c, it, this);
     return_trace (ret);
   }
 
@@ -1748,10 +2043,10 @@ struct CursivePosFormat1
 
   protected:
   HBUINT16     format;                 /* Format identifier--format = 1 */
-  OffsetTo<Coverage>
+  Offset16To<Coverage>
                coverage;               /* Offset to Coverage table--from
                                         * beginning of subtable */
-  ArrayOf<EntryExitRecord>
+  Array16Of<EntryExitRecord>
                entryExitRecord;        /* Array of EntryExit records--in
                                         * Coverage Index order */
   public:
@@ -1766,7 +2061,7 @@ struct CursivePos
     TRACE_DISPATCH (this, u.format);
     if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
     switch (u.format) {
-    case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...));
+    case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...));
     default:return_trace (c->default_return_value ());
     }
   }
@@ -1810,8 +2105,10 @@ static void Markclass_closure_and_remap_indexes (const Coverage  &mark_coverage,
 struct MarkBasePosFormat1
 {
   bool intersects (const hb_set_t *glyphs) const
-  { return (this+markCoverage).intersects (glyphs) &&
-          (this+baseCoverage).intersects (glyphs); }
+  {
+    return (this+markCoverage).intersects (glyphs) &&
+          (this+baseCoverage).intersects (glyphs);
+  }
 
   void closure_lookups (hb_closure_lookups_context_t *c) const {}
 
@@ -1865,7 +2162,13 @@ struct MarkBasePosFormat1
     skippy_iter.reset (buffer->idx, 1);
     skippy_iter.set_lookup_props (LookupFlag::IgnoreMarks);
     do {
-      if (!skippy_iter.prev ()) return_trace (false);
+      unsigned unsafe_from;
+      if (!skippy_iter.prev (&unsafe_from))
+      {
+       buffer->unsafe_to_concat_from_outbuffer (unsafe_from, buffer->idx + 1);
+       return_trace (false);
+      }
+
       /* We only want to attach to the first of a MultipleSubst sequence.
        * https://github.com/harfbuzz/harfbuzz/issues/740
        * Reject others...
@@ -1888,7 +2191,11 @@ struct MarkBasePosFormat1
     //if (!_hb_glyph_info_is_base_glyph (&buffer->info[skippy_iter.idx])) { return_trace (false); }
 
     unsigned int base_index = (this+baseCoverage).get_coverage  (buffer->info[skippy_iter.idx].codepoint);
-    if (base_index == NOT_COVERED) return_trace (false);
+    if (base_index == NOT_COVERED)
+    {
+      buffer->unsafe_to_concat_from_outbuffer (skippy_iter.idx, buffer->idx + 1);
+      return_trace (false);
+    }
 
     return_trace ((this+markArray).apply (c, mark_index, base_index, this+baseArray, classCount, skippy_iter.idx));
   }
@@ -1896,7 +2203,7 @@ struct MarkBasePosFormat1
   bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
-    const hb_set_t &glyphset = *c->plan->glyphset ();
+    const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
     const hb_map_t &glyph_map = *c->plan->glyph_map;
 
     auto *out = c->serializer->start_embed (*this);
@@ -1921,13 +2228,12 @@ struct MarkBasePosFormat1
     | hb_sink (new_coverage)
     ;
 
-    if (!out->markCoverage.serialize (c->serializer, out)
-                         .serialize (c->serializer, new_coverage.iter ()))
+    if (!out->markCoverage.serialize_serialize (c->serializer, new_coverage.iter ()))
       return_trace (false);
 
-    out->markArray.serialize (c->serializer, out)
-                 .serialize (c->serializer, &klass_mapping, c->plan->layout_variation_idx_map, &(this+markArray), + mark_iter
-                                                                                                                  | hb_map (hb_second));
+    out->markArray.serialize_subset (c, markArray, this,
+                                     (this+markCoverage).iter (),
+                                     &klass_mapping);
 
     unsigned basecount = (this+baseArray).rows;
     auto base_iter =
@@ -1942,8 +2248,7 @@ struct MarkBasePosFormat1
     | hb_sink (new_coverage)
     ;
 
-    if (!out->baseCoverage.serialize (c->serializer, out)
-                         .serialize (c->serializer, new_coverage.iter ()))
+    if (!out->baseCoverage.serialize_serialize (c->serializer, new_coverage.iter ()))
       return_trace (false);
 
     hb_sorted_vector_t<unsigned> base_indexes;
@@ -1956,8 +2261,10 @@ struct MarkBasePosFormat1
       | hb_sink (base_indexes)
       ;
     }
-    out->baseArray.serialize (c->serializer, out)
-                 .serialize (c->serializer, base_iter.len (), &(this+baseArray), c->plan->layout_variation_idx_map, base_indexes.iter ());
+
+    out->baseArray.serialize_subset (c, baseArray, this,
+                                     base_iter.len (),
+                                     base_indexes.iter ());
 
     return_trace (true);
   }
@@ -1974,17 +2281,17 @@ struct MarkBasePosFormat1
 
   protected:
   HBUINT16     format;                 /* Format identifier--format = 1 */
-  OffsetTo<Coverage>
+  Offset16To<Coverage>
                markCoverage;           /* Offset to MarkCoverage table--from
                                         * beginning of MarkBasePos subtable */
-  OffsetTo<Coverage>
+  Offset16To<Coverage>
                baseCoverage;           /* Offset to BaseCoverage table--from
                                         * beginning of MarkBasePos subtable */
   HBUINT16     classCount;             /* Number of classes defined for marks */
-  OffsetTo<MarkArray>
+  Offset16To<MarkArray>
                markArray;              /* Offset to MarkArray table--from
                                         * beginning of MarkBasePos subtable */
-  OffsetTo<BaseArray>
+  Offset16To<BaseArray>
                baseArray;              /* Offset to BaseArray table--from
                                         * beginning of MarkBasePos subtable */
   public:
@@ -1999,7 +2306,7 @@ struct MarkBasePos
     TRACE_DISPATCH (this, u.format);
     if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
     switch (u.format) {
-    case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...));
+    case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...));
     default:return_trace (c->default_return_value ());
     }
   }
@@ -2017,16 +2324,50 @@ typedef AnchorMatrix LigatureAttach;    /* component-major--
                                         * mark-minor--
                                         * ordered by class--zero-based. */
 
-typedef OffsetListOf<LigatureAttach> LigatureArray;
-                                       /* Array of LigatureAttach
-                                        * tables ordered by
-                                        * LigatureCoverage Index */
+/* Array of LigatureAttach tables ordered by LigatureCoverage Index */
+struct LigatureArray : List16OfOffset16To<LigatureAttach>
+{
+  template <typename Iterator,
+           hb_requires (hb_is_iterator (Iterator))>
+  bool subset (hb_subset_context_t *c,
+               Iterator                    coverage,
+              unsigned             class_count,
+              const hb_map_t      *klass_mapping) const
+  {
+    TRACE_SUBSET (this);
+    const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
+
+    auto *out = c->serializer->start_embed (this);
+    if (unlikely (!c->serializer->extend_min (out)))  return_trace (false);
+
+    for (const auto _ : + hb_zip (coverage, *this)
+                 | hb_filter (glyphset, hb_first))
+    {
+      auto *matrix = out->serialize_append (c->serializer);
+      if (unlikely (!matrix)) return_trace (false);
+
+      const LigatureAttach& src = (this + _.second);
+      auto indexes =
+          + hb_range (src.rows * class_count)
+          | hb_filter ([=] (unsigned index) { return klass_mapping->has (index % class_count); })
+          ;
+      matrix->serialize_subset (c,
+                               _.second,
+                               this,
+                                src.rows,
+                                indexes);
+    }
+    return_trace (this->len);
+  }
+};
 
 struct MarkLigPosFormat1
 {
   bool intersects (const hb_set_t *glyphs) const
-  { return (this+markCoverage).intersects (glyphs) &&
-          (this+ligatureCoverage).intersects (glyphs); }
+  {
+    return (this+markCoverage).intersects (glyphs) &&
+          (this+ligatureCoverage).intersects (glyphs);
+  }
 
   void closure_lookups (hb_closure_lookups_context_t *c) const {}
 
@@ -2055,11 +2396,11 @@ struct MarkLigPosFormat1
       unsigned row_count = lig_array[i].rows;
       for (unsigned row : + hb_range (row_count))
       {
-        + hb_range ((unsigned) classCount)
-        | hb_filter (klass_mapping)
-        | hb_map ([&] (const unsigned col) { return row * (unsigned) classCount + col; })
-        | hb_sink (lig_indexes)
-        ;
+       + hb_range ((unsigned) classCount)
+       | hb_filter (klass_mapping)
+       | hb_map ([&] (const unsigned col) { return row * (unsigned) classCount + col; })
+       | hb_sink (lig_indexes)
+       ;
       }
 
       lig_array[i].collect_variation_indices (c, lig_indexes.iter ());
@@ -2085,21 +2426,34 @@ struct MarkLigPosFormat1
     hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
     skippy_iter.reset (buffer->idx, 1);
     skippy_iter.set_lookup_props (LookupFlag::IgnoreMarks);
-    if (!skippy_iter.prev ()) return_trace (false);
+    unsigned unsafe_from;
+    if (!skippy_iter.prev (&unsafe_from))
+    {
+      buffer->unsafe_to_concat_from_outbuffer (unsafe_from, buffer->idx + 1);
+      return_trace (false);
+    }
 
     /* Checking that matched glyph is actually a ligature by GDEF is too strong; disabled */
     //if (!_hb_glyph_info_is_ligature (&buffer->info[skippy_iter.idx])) { return_trace (false); }
 
     unsigned int j = skippy_iter.idx;
     unsigned int lig_index = (this+ligatureCoverage).get_coverage  (buffer->info[j].codepoint);
-    if (lig_index == NOT_COVERED) return_trace (false);
+    if (lig_index == NOT_COVERED)
+    {
+      buffer->unsafe_to_concat_from_outbuffer (skippy_iter.idx, buffer->idx + 1);
+      return_trace (false);
+    }
 
     const LigatureArray& lig_array = this+ligatureArray;
     const LigatureAttach& lig_attach = lig_array[lig_index];
 
     /* Find component to attach to */
     unsigned int comp_count = lig_attach.rows;
-    if (unlikely (!comp_count)) return_trace (false);
+    if (unlikely (!comp_count))
+    {
+      buffer->unsafe_to_concat_from_outbuffer (skippy_iter.idx, buffer->idx + 1);
+      return_trace (false);
+    }
 
     /* We must now check whether the ligature ID of the current mark glyph
      * is identical to the ligature ID of the found ligature.  If yes, we
@@ -2120,8 +2474,50 @@ struct MarkLigPosFormat1
   bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
-    // TODO(subset)
-    return_trace (false);
+    const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
+    const hb_map_t &glyph_map = *c->plan->glyph_map;
+
+    auto *out = c->serializer->start_embed (*this);
+    if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
+    out->format = format;
+
+    hb_map_t klass_mapping;
+    Markclass_closure_and_remap_indexes (this+markCoverage, this+markArray, glyphset, &klass_mapping);
+
+    if (!klass_mapping.get_population ()) return_trace (false);
+    out->classCount = klass_mapping.get_population ();
+
+    auto mark_iter =
+    + hb_zip (this+markCoverage, this+markArray)
+    | hb_filter (glyphset, hb_first)
+    ;
+
+    auto new_mark_coverage =
+    + mark_iter
+    | hb_map_retains_sorting (hb_first)
+    | hb_map_retains_sorting (glyph_map)
+    ;
+
+    if (!out->markCoverage.serialize_serialize (c->serializer, new_mark_coverage))
+      return_trace (false);
+
+    out->markArray.serialize_subset (c, markArray, this,
+                                     (this+markCoverage).iter (),
+                                     &klass_mapping);
+
+    auto new_ligature_coverage =
+    + hb_iter (this + ligatureCoverage)
+    | hb_filter (glyphset)
+    | hb_map_retains_sorting (glyph_map)
+    ;
+
+    if (!out->ligatureCoverage.serialize_serialize (c->serializer, new_ligature_coverage))
+      return_trace (false);
+
+    out->ligatureArray.serialize_subset (c, ligatureArray, this,
+                                         hb_iter (this+ligatureCoverage), classCount, &klass_mapping);
+
+    return_trace (true);
   }
 
   bool sanitize (hb_sanitize_context_t *c) const
@@ -2136,24 +2532,25 @@ struct MarkLigPosFormat1
 
   protected:
   HBUINT16     format;                 /* Format identifier--format = 1 */
-  OffsetTo<Coverage>
+  Offset16To<Coverage>
                markCoverage;           /* Offset to Mark Coverage table--from
                                         * beginning of MarkLigPos subtable */
-  OffsetTo<Coverage>
+  Offset16To<Coverage>
                ligatureCoverage;       /* Offset to Ligature Coverage
                                         * table--from beginning of MarkLigPos
                                         * subtable */
   HBUINT16     classCount;             /* Number of defined mark classes */
-  OffsetTo<MarkArray>
+  Offset16To<MarkArray>
                markArray;              /* Offset to MarkArray table--from
                                         * beginning of MarkLigPos subtable */
-  OffsetTo<LigatureArray>
+  Offset16To<LigatureArray>
                ligatureArray;          /* Offset to LigatureArray table--from
                                         * beginning of MarkLigPos subtable */
   public:
   DEFINE_SIZE_STATIC (12);
 };
 
+
 struct MarkLigPos
 {
   template <typename context_t, typename ...Ts>
@@ -2162,7 +2559,7 @@ struct MarkLigPos
     TRACE_DISPATCH (this, u.format);
     if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
     switch (u.format) {
-    case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...));
+    case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...));
     default:return_trace (c->default_return_value ());
     }
   }
@@ -2183,8 +2580,10 @@ typedef AnchorMatrix Mark2Array; /* mark2-major--
 struct MarkMarkPosFormat1
 {
   bool intersects (const hb_set_t *glyphs) const
-  { return (this+mark1Coverage).intersects (glyphs) &&
-          (this+mark2Coverage).intersects (glyphs); }
+  {
+    return (this+mark1Coverage).intersects (glyphs) &&
+          (this+mark2Coverage).intersects (glyphs);
+  }
 
   void closure_lookups (hb_closure_lookups_context_t *c) const {}
 
@@ -2237,9 +2636,18 @@ struct MarkMarkPosFormat1
     hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
     skippy_iter.reset (buffer->idx, 1);
     skippy_iter.set_lookup_props (c->lookup_props & ~LookupFlag::IgnoreFlags);
-    if (!skippy_iter.prev ()) return_trace (false);
+    unsigned unsafe_from;
+    if (!skippy_iter.prev (&unsafe_from))
+    {
+      buffer->unsafe_to_concat_from_outbuffer (unsafe_from, buffer->idx + 1);
+      return_trace (false);
+    }
 
-    if (!_hb_glyph_info_is_mark (&buffer->info[skippy_iter.idx])) { return_trace (false); }
+    if (!_hb_glyph_info_is_mark (&buffer->info[skippy_iter.idx]))
+    {
+      buffer->unsafe_to_concat_from_outbuffer (skippy_iter.idx, buffer->idx + 1);
+      return_trace (false);
+    }
 
     unsigned int j = skippy_iter.idx;
 
@@ -2248,12 +2656,15 @@ struct MarkMarkPosFormat1
     unsigned int comp1 = _hb_glyph_info_get_lig_comp (&buffer->cur());
     unsigned int comp2 = _hb_glyph_info_get_lig_comp (&buffer->info[j]);
 
-    if (likely (id1 == id2)) {
+    if (likely (id1 == id2))
+    {
       if (id1 == 0) /* Marks belonging to the same base. */
        goto good;
       else if (comp1 == comp2) /* Marks belonging to the same ligature component. */
        goto good;
-    } else {
+    }
+    else
+    {
       /* If ligature ids don't match, it may be the case that one of the marks
        * itself is a ligature.  In which case match. */
       if ((id1 > 0 && !comp1) || (id2 > 0 && !comp2))
@@ -2261,11 +2672,16 @@ struct MarkMarkPosFormat1
     }
 
     /* Didn't match. */
+    buffer->unsafe_to_concat_from_outbuffer (skippy_iter.idx, buffer->idx + 1);
     return_trace (false);
 
     good:
     unsigned int mark2_index = (this+mark2Coverage).get_coverage  (buffer->info[j].codepoint);
-    if (mark2_index == NOT_COVERED) return_trace (false);
+    if (mark2_index == NOT_COVERED)
+    {
+      buffer->unsafe_to_concat_from_outbuffer (skippy_iter.idx, buffer->idx + 1);
+      return_trace (false);
+    }
 
     return_trace ((this+mark1Array).apply (c, mark1_index, mark2_index, this+mark2Array, classCount, j));
   }
@@ -2273,7 +2689,7 @@ struct MarkMarkPosFormat1
   bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
-    const hb_set_t &glyphset = *c->plan->glyphset ();
+    const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
     const hb_map_t &glyph_map = *c->plan->glyph_map;
 
     auto *out = c->serializer->start_embed (*this);
@@ -2298,14 +2714,13 @@ struct MarkMarkPosFormat1
     | hb_sink (new_coverage)
     ;
 
-    if (!out->mark1Coverage.serialize (c->serializer, out)
-                          .serialize (c->serializer, new_coverage.iter ()))
+    if (!out->mark1Coverage.serialize_serialize (c->serializer, new_coverage.iter ()))
       return_trace (false);
 
-    out->mark1Array.serialize (c->serializer, out)
-                  .serialize (c->serializer, &klass_mapping, c->plan->layout_variation_idx_map, &(this+mark1Array), + mark1_iter
-                                                                                                                    | hb_map (hb_second));
-    
+    out->mark1Array.serialize_subset (c, mark1Array, this,
+                                      (this+mark1Coverage).iter (),
+                                      &klass_mapping);
+
     unsigned mark2count = (this+mark2Array).rows;
     auto mark2_iter =
     + hb_zip (this+mark2Coverage, hb_range (mark2count))
@@ -2319,8 +2734,7 @@ struct MarkMarkPosFormat1
     | hb_sink (new_coverage)
     ;
 
-    if (!out->mark2Coverage.serialize (c->serializer, out)
-                          .serialize (c->serializer, new_coverage.iter ()))
+    if (!out->mark2Coverage.serialize_serialize (c->serializer, new_coverage.iter ()))
       return_trace (false);
 
     hb_sorted_vector_t<unsigned> mark2_indexes;
@@ -2333,8 +2747,8 @@ struct MarkMarkPosFormat1
       | hb_sink (mark2_indexes)
       ;
     }
-    out->mark2Array.serialize (c->serializer, out)
-                  .serialize (c->serializer, mark2_iter.len (), &(this+mark2Array), c->plan->layout_variation_idx_map, mark2_indexes.iter ());
+
+    out->mark2Array.serialize_subset (c, mark2Array, this, mark2_iter.len (), mark2_indexes.iter ());
 
     return_trace (true);
   }
@@ -2351,19 +2765,19 @@ struct MarkMarkPosFormat1
 
   protected:
   HBUINT16     format;                 /* Format identifier--format = 1 */
-  OffsetTo<Coverage>
+  Offset16To<Coverage>
                mark1Coverage;          /* Offset to Combining Mark1 Coverage
                                         * table--from beginning of MarkMarkPos
                                         * subtable */
-  OffsetTo<Coverage>
+  Offset16To<Coverage>
                mark2Coverage;          /* Offset to Combining Mark2 Coverage
                                         * table--from beginning of MarkMarkPos
                                         * subtable */
   HBUINT16     classCount;             /* Number of defined mark classes */
-  OffsetTo<MarkArray>
+  Offset16To<MarkArray>
                mark1Array;             /* Offset to Mark1Array table--from
                                         * beginning of MarkMarkPos subtable */
-  OffsetTo<Mark2Array>
+  Offset16To<Mark2Array>
                mark2Array;             /* Offset to Mark2Array table--from
                                         * beginning of MarkMarkPos subtable */
   public:
@@ -2378,7 +2792,7 @@ struct MarkMarkPos
     TRACE_DISPATCH (this, u.format);
     if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
     switch (u.format) {
-    case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...));
+    case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...));
     default:return_trace (c->default_return_value ());
     }
   }
@@ -2429,15 +2843,15 @@ struct PosLookupSubTable
   {
     TRACE_DISPATCH (this, lookup_type);
     switch (lookup_type) {
-    case Single:               return_trace (u.single.dispatch (c, hb_forward<Ts> (ds)...));
-    case Pair:                 return_trace (u.pair.dispatch (c, hb_forward<Ts> (ds)...));
-    case Cursive:              return_trace (u.cursive.dispatch (c, hb_forward<Ts> (ds)...));
-    case MarkBase:             return_trace (u.markBase.dispatch (c, hb_forward<Ts> (ds)...));
-    case MarkLig:              return_trace (u.markLig.dispatch (c, hb_forward<Ts> (ds)...));
-    case MarkMark:             return_trace (u.markMark.dispatch (c, hb_forward<Ts> (ds)...));
-    case Context:              return_trace (u.context.dispatch (c, hb_forward<Ts> (ds)...));
-    case ChainContext:         return_trace (u.chainContext.dispatch (c, hb_forward<Ts> (ds)...));
-    case Extension:            return_trace (u.extension.dispatch (c, hb_forward<Ts> (ds)...));
+    case Single:               return_trace (u.single.dispatch (c, std::forward<Ts> (ds)...));
+    case Pair:                 return_trace (u.pair.dispatch (c, std::forward<Ts> (ds)...));
+    case Cursive:              return_trace (u.cursive.dispatch (c, std::forward<Ts> (ds)...));
+    case MarkBase:             return_trace (u.markBase.dispatch (c, std::forward<Ts> (ds)...));
+    case MarkLig:              return_trace (u.markLig.dispatch (c, std::forward<Ts> (ds)...));
+    case MarkMark:             return_trace (u.markMark.dispatch (c, std::forward<Ts> (ds)...));
+    case Context:              return_trace (u.context.dispatch (c, std::forward<Ts> (ds)...));
+    case ChainContext:         return_trace (u.chainContext.dispatch (c, std::forward<Ts> (ds)...));
+    case Extension:            return_trace (u.extension.dispatch (c, std::forward<Ts> (ds)...));
     default:                   return_trace (c->default_return_value ());
     }
   }
@@ -2525,7 +2939,7 @@ struct PosLookup : Lookup
 
   template <typename context_t, typename ...Ts>
   typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
-  { return Lookup::dispatch<SubTable> (c, hb_forward<Ts> (ds)...); }
+  { return Lookup::dispatch<SubTable> (c, std::forward<Ts> (ds)...); }
 
   bool subset (hb_subset_context_t *c) const
   { return Lookup::subset<SubTable> (c); }
@@ -2552,14 +2966,14 @@ struct GPOS : GSUBGPOS
 
   bool subset (hb_subset_context_t *c) const
   {
-    hb_subset_layout_context_t l (c, tableTag, c->plan->gpos_lookups, c->plan->gpos_features);
+    hb_subset_layout_context_t l (c, tableTag, c->plan->gpos_lookups, c->plan->gpos_langsys, c->plan->gpos_features);
     return GSUBGPOS::subset<PosLookup> (&l);
   }
 
   bool sanitize (hb_sanitize_context_t *c) const
   { return GSUBGPOS::sanitize<PosLookup> (c); }
 
-  HB_INTERNAL bool is_blacklisted (hb_blob_t *blob,
+  HB_INTERNAL bool is_blocklisted (hb_blob_t *blob,
                                   hb_face_t *face) const;
 
   void collect_variation_indices (hb_collect_variation_indices_context_t *c) const
@@ -2572,6 +2986,11 @@ struct GPOS : GSUBGPOS
     }
   }
 
+  void closure_lookups (hb_face_t      *face,
+                       const hb_set_t *glyphs,
+                       hb_set_t       *lookup_indexes /* IN/OUT */) const
+  { GSUBGPOS::closure_lookups<PosLookup> (face, glyphs, lookup_indexes); }
+
   typedef GSUBGPOS::accelerator_t<GPOS> accelerator_t;
 };
 
@@ -2665,7 +3084,7 @@ GPOS::position_finish_advances (hb_font_t *font HB_UNUSED, hb_buffer_t *buffer H
 }
 
 void
-GPOS::position_finish_offsets (hb_font_t *font HB_UNUSED, hb_buffer_t *buffer)
+GPOS::position_finish_offsets (hb_font_t *font, hb_buffer_t *buffer)
 {
   _hb_buffer_assert_gsubgpos_vars (buffer);
 
@@ -2675,12 +3094,21 @@ GPOS::position_finish_offsets (hb_font_t *font HB_UNUSED, hb_buffer_t *buffer)
 
   /* Handle attachments */
   if (buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT)
-    for (unsigned int i = 0; i < len; i++)
+    for (unsigned i = 0; i < len; i++)
       propagate_attachment_offsets (pos, len, i, direction);
+
+  if (unlikely (font->slant))
+  {
+    for (unsigned i = 0; i < len; i++)
+      if (unlikely (pos[i].y_offset))
+        pos[i].x_offset += _hb_roundf (font->slant_xy * pos[i].y_offset);
+  }
 }
 
 
-struct GPOS_accelerator_t : GPOS::accelerator_t {};
+struct GPOS_accelerator_t : GPOS::accelerator_t {
+  GPOS_accelerator_t (hb_face_t *face) : GPOS::accelerator_t (face) {}
+};
 
 
 /* Out-of-class implementation for methods recursing */
index 01a5af1..0b0bc54 100644 (file)
@@ -46,14 +46,19 @@ struct SingleSubstFormat1
   bool intersects (const hb_set_t *glyphs) const
   { return (this+coverage).intersects (glyphs); }
 
+  bool may_have_non_1to1 () const
+  { return false; }
+
   void closure (hb_closure_context_t *c) const
   {
     unsigned d = deltaGlyphID;
+
     + hb_iter (this+coverage)
-    | hb_filter (*c->glyphs)
+    | hb_filter (c->parent_active_glyphs ())
     | hb_map ([d] (hb_codepoint_t g) { return (g + d) & 0xFFFFu; })
     | hb_sink (c->output)
     ;
+
   }
 
   void closure_lookups (hb_closure_lookups_context_t *c) const {}
@@ -95,9 +100,9 @@ struct SingleSubstFormat1
                  unsigned delta)
   {
     TRACE_SERIALIZE (this);
-    if (unlikely (!c->extend_min (*this))) return_trace (false);
-    if (unlikely (!coverage.serialize (c, this).serialize (c, glyphs))) return_trace (false);
-    c->check_assign (deltaGlyphID, delta);
+    if (unlikely (!c->extend_min (this))) return_trace (false);
+    if (unlikely (!coverage.serialize_serialize (c, glyphs))) return_trace (false);
+    c->check_assign (deltaGlyphID, delta, HB_SERIALIZE_ERROR_INT_OVERFLOW);
     return_trace (true);
   }
 
@@ -133,7 +138,7 @@ struct SingleSubstFormat1
 
   protected:
   HBUINT16     format;                 /* Format identifier--format = 1 */
-  OffsetTo<Coverage>
+  Offset16To<Coverage>
                coverage;               /* Offset to Coverage table--from
                                         * beginning of Substitution table */
   HBUINT16     deltaGlyphID;           /* Add to original GlyphID to get
@@ -147,13 +152,17 @@ struct SingleSubstFormat2
   bool intersects (const hb_set_t *glyphs) const
   { return (this+coverage).intersects (glyphs); }
 
+  bool may_have_non_1to1 () const
+  { return false; }
+
   void closure (hb_closure_context_t *c) const
   {
     + hb_zip (this+coverage, substitute)
-    | hb_filter (*c->glyphs, hb_first)
+    | hb_filter (c->parent_active_glyphs (), hb_first)
     | hb_map (hb_second)
     | hb_sink (c->output)
     ;
+
   }
 
   void closure_lookups (hb_closure_lookups_context_t *c) const {}
@@ -200,9 +209,9 @@ struct SingleSubstFormat2
       + it
       | hb_map_retains_sorting (hb_first)
       ;
-    if (unlikely (!c->extend_min (*this))) return_trace (false);
+    if (unlikely (!c->extend_min (this))) return_trace (false);
     if (unlikely (!substitute.serialize (c, substitutes))) return_trace (false);
-    if (unlikely (!coverage.serialize (c, this).serialize (c, glyphs))) return_trace (false);
+    if (unlikely (!coverage.serialize_serialize (c, glyphs))) return_trace (false);
     return_trace (true);
   }
 
@@ -216,7 +225,7 @@ struct SingleSubstFormat2
     + hb_zip (this+coverage, substitute)
     | hb_filter (glyphset, hb_first)
     | hb_filter (glyphset, hb_second)
-    | hb_map_retains_sorting ([&] (hb_pair_t<hb_codepoint_t, const HBGlyphID &> p) -> hb_codepoint_pair_t
+    | hb_map_retains_sorting ([&] (hb_pair_t<hb_codepoint_t, const HBGlyphID16 &> p) -> hb_codepoint_pair_t
                              { return hb_pair (glyph_map[p.first], glyph_map[p.second]); })
     ;
 
@@ -233,10 +242,10 @@ struct SingleSubstFormat2
 
   protected:
   HBUINT16     format;                 /* Format identifier--format = 2 */
-  OffsetTo<Coverage>
+  Offset16To<Coverage>
                coverage;               /* Offset to Coverage table--from
                                         * beginning of Substitution table */
-  ArrayOf<HBGlyphID>
+  Array16Of<HBGlyphID16>
                substitute;             /* Array of substitute
                                         * GlyphIDs--ordered by Coverage Index */
   public:
@@ -281,8 +290,8 @@ struct SingleSubst
     TRACE_DISPATCH (this, u.format);
     if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
     switch (u.format) {
-    case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...));
-    case 2: return_trace (c->dispatch (u.format2, hb_forward<Ts> (ds)...));
+    case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...));
+    case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...));
     default:return_trace (c->default_return_value ());
     }
   }
@@ -334,9 +343,14 @@ struct Sequence
 
     unsigned int klass = _hb_glyph_info_is_ligature (&c->buffer->cur()) ?
                         HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH : 0;
+    unsigned lig_id = _hb_glyph_info_get_lig_id (&c->buffer->cur());
 
-    for (unsigned int i = 0; i < count; i++) {
-      _hb_glyph_info_set_lig_props_for_component (&c->buffer->cur(), i);
+    for (unsigned int i = 0; i < count; i++)
+    {
+      /* If is attached to a ligature, don't disturb that.
+       * https://github.com/harfbuzz/harfbuzz/issues/3069 */
+      if (!lig_id)
+       _hb_glyph_info_set_lig_props_for_component (&c->buffer->cur(), i);
       c->output_glyph_for_component (substitute.arrayZ[i], klass);
     }
     c->buffer->skip_glyph ();
@@ -356,7 +370,7 @@ struct Sequence
   bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
-    const hb_set_t &glyphset = *c->plan->glyphset ();
+    const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
     const hb_map_t &glyph_map = *c->plan->glyph_map;
 
     if (!intersects (&glyphset)) return_trace (false);
@@ -377,7 +391,7 @@ struct Sequence
   }
 
   protected:
-  ArrayOf<HBGlyphID>
+  Array16Of<HBGlyphID16>
                substitute;             /* String of GlyphIDs to substitute */
   public:
   DEFINE_SIZE_ARRAY (2, substitute);
@@ -388,10 +402,13 @@ struct MultipleSubstFormat1
   bool intersects (const hb_set_t *glyphs) const
   { return (this+coverage).intersects (glyphs); }
 
+  bool may_have_non_1to1 () const
+  { return true; }
+
   void closure (hb_closure_context_t *c) const
   {
     + hb_zip (this+coverage, sequence)
-    | hb_filter (*c->glyphs, hb_first)
+    | hb_filter (c->parent_active_glyphs (), hb_first)
     | hb_map (hb_second)
     | hb_map (hb_add (this))
     | hb_apply ([c] (const Sequence &_) { _.closure (c); })
@@ -426,28 +443,28 @@ struct MultipleSubstFormat1
   }
 
   bool serialize (hb_serialize_context_t *c,
-                 hb_sorted_array_t<const HBGlyphID> glyphs,
+                 hb_sorted_array_t<const HBGlyphID16> glyphs,
                  hb_array_t<const unsigned int> substitute_len_list,
-                 hb_array_t<const HBGlyphID> substitute_glyphs_list)
+                 hb_array_t<const HBGlyphID16> substitute_glyphs_list)
   {
     TRACE_SERIALIZE (this);
-    if (unlikely (!c->extend_min (*this))) return_trace (false);
+    if (unlikely (!c->extend_min (this))) return_trace (false);
     if (unlikely (!sequence.serialize (c, glyphs.length))) return_trace (false);
     for (unsigned int i = 0; i < glyphs.length; i++)
     {
       unsigned int substitute_len = substitute_len_list[i];
-      if (unlikely (!sequence[i].serialize (c, this)
-                               .serialize (c, substitute_glyphs_list.sub_array (0, substitute_len))))
+      if (unlikely (!sequence[i]
+                        .serialize_serialize (c, substitute_glyphs_list.sub_array (0, substitute_len))))
        return_trace (false);
       substitute_glyphs_list += substitute_len;
     }
-    return_trace (coverage.serialize (c, this).serialize (c, glyphs));
+    return_trace (coverage.serialize_serialize (c, glyphs));
   }
 
   bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
-    const hb_set_t &glyphset = *c->plan->glyphset ();
+    const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
     const hb_map_t &glyph_map = *c->plan->glyph_map;
 
     auto *out = c->serializer->start_embed (*this);
@@ -462,8 +479,7 @@ struct MultipleSubstFormat1
     | hb_map (glyph_map)
     | hb_sink (new_coverage)
     ;
-    out->coverage.serialize (c->serializer, out)
-                .serialize (c->serializer, new_coverage.iter ());
+    out->coverage.serialize_serialize (c->serializer, new_coverage.iter ());
     return_trace (bool (new_coverage));
   }
 
@@ -475,10 +491,10 @@ struct MultipleSubstFormat1
 
   protected:
   HBUINT16     format;                 /* Format identifier--format = 1 */
-  OffsetTo<Coverage>
+  Offset16To<Coverage>
                coverage;               /* Offset to Coverage table--from
                                         * beginning of Substitution table */
-  OffsetArrayOf<Sequence>
+  Array16OfOffset16To<Sequence>
                sequence;               /* Array of Sequence tables
                                         * ordered by Coverage Index */
   public:
@@ -488,9 +504,9 @@ struct MultipleSubstFormat1
 struct MultipleSubst
 {
   bool serialize (hb_serialize_context_t *c,
-                 hb_sorted_array_t<const HBGlyphID> glyphs,
+                 hb_sorted_array_t<const HBGlyphID16> glyphs,
                  hb_array_t<const unsigned int> substitute_len_list,
-                 hb_array_t<const HBGlyphID> substitute_glyphs_list)
+                 hb_array_t<const HBGlyphID16> substitute_glyphs_list)
   {
     TRACE_SERIALIZE (this);
     if (unlikely (!c->extend_min (u.format))) return_trace (false);
@@ -508,7 +524,7 @@ struct MultipleSubst
     TRACE_DISPATCH (this, u.format);
     if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
     switch (u.format) {
-    case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...));
+    case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...));
     default:return_trace (c->default_return_value ());
     }
   }
@@ -547,7 +563,12 @@ struct AlternateSet
 
     /* If alt_index is MAX_VALUE, randomize feature if it is the rand feature. */
     if (alt_index == HB_OT_MAP_MAX_VALUE && c->random)
+    {
+      /* Maybe we can do better than unsafe-to-break all; but since we are
+       * changing random state, it would be hard to track that.  Good 'nough. */
+      c->buffer->unsafe_to_break (0, c->buffer->len);
       alt_index = c->random_number () % count + 1;
+    }
 
     if (unlikely (alt_index > count || alt_index == 0)) return_trace (false);
 
@@ -556,6 +577,20 @@ struct AlternateSet
     return_trace (true);
   }
 
+  unsigned
+  get_alternates (unsigned        start_offset,
+                 unsigned       *alternate_count  /* IN/OUT.  May be NULL. */,
+                 hb_codepoint_t *alternate_glyphs /* OUT.     May be NULL. */) const
+  {
+    if (alternates.len && alternate_count)
+    {
+      + alternates.sub_array (start_offset, alternate_count)
+      | hb_sink (hb_array (alternate_glyphs, *alternate_count))
+      ;
+    }
+    return alternates.len;
+  }
+
   template <typename Iterator,
            hb_requires (hb_is_source_of (Iterator, hb_codepoint_t))>
   bool serialize (hb_serialize_context_t *c,
@@ -568,7 +603,7 @@ struct AlternateSet
   bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
-    const hb_set_t &glyphset = *c->plan->glyphset ();
+    const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
     const hb_map_t &glyph_map = *c->plan->glyph_map;
 
     auto it =
@@ -589,7 +624,7 @@ struct AlternateSet
   }
 
   protected:
-  ArrayOf<HBGlyphID>
+  Array16Of<HBGlyphID16>
                alternates;             /* Array of alternate GlyphIDs--in
                                         * arbitrary order */
   public:
@@ -601,14 +636,18 @@ struct AlternateSubstFormat1
   bool intersects (const hb_set_t *glyphs) const
   { return (this+coverage).intersects (glyphs); }
 
+  bool may_have_non_1to1 () const
+  { return false; }
+
   void closure (hb_closure_context_t *c) const
   {
     + hb_zip (this+coverage, alternateSet)
-    | hb_filter (c->glyphs, hb_first)
+    | hb_filter (c->parent_active_glyphs (), hb_first)
     | hb_map (hb_second)
     | hb_map (hb_add (this))
     | hb_apply ([c] (const AlternateSet &_) { _.closure (c); })
     ;
+
   }
 
   void closure_lookups (hb_closure_lookups_context_t *c) const {}
@@ -628,6 +667,14 @@ struct AlternateSubstFormat1
   bool would_apply (hb_would_apply_context_t *c) const
   { return c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED; }
 
+  unsigned
+  get_glyph_alternates (hb_codepoint_t  gid,
+                       unsigned        start_offset,
+                       unsigned       *alternate_count  /* IN/OUT.  May be NULL. */,
+                       hb_codepoint_t *alternate_glyphs /* OUT.     May be NULL. */) const
+  { return (this+alternateSet[(this+coverage).get_coverage (gid)])
+          .get_alternates (start_offset, alternate_count, alternate_glyphs); }
+
   bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
@@ -639,28 +686,28 @@ struct AlternateSubstFormat1
   }
 
   bool serialize (hb_serialize_context_t *c,
-                 hb_sorted_array_t<const HBGlyphID> glyphs,
+                 hb_sorted_array_t<const HBGlyphID16> glyphs,
                  hb_array_t<const unsigned int> alternate_len_list,
-                 hb_array_t<const HBGlyphID> alternate_glyphs_list)
+                 hb_array_t<const HBGlyphID16> alternate_glyphs_list)
   {
     TRACE_SERIALIZE (this);
-    if (unlikely (!c->extend_min (*this))) return_trace (false);
+    if (unlikely (!c->extend_min (this))) return_trace (false);
     if (unlikely (!alternateSet.serialize (c, glyphs.length))) return_trace (false);
     for (unsigned int i = 0; i < glyphs.length; i++)
     {
       unsigned int alternate_len = alternate_len_list[i];
-      if (unlikely (!alternateSet[i].serialize (c, this)
-                                   .serialize (c, alternate_glyphs_list.sub_array (0, alternate_len))))
+      if (unlikely (!alternateSet[i]
+                        .serialize_serialize (c, alternate_glyphs_list.sub_array (0, alternate_len))))
        return_trace (false);
       alternate_glyphs_list += alternate_len;
     }
-    return_trace (coverage.serialize (c, this).serialize (c, glyphs));
+    return_trace (coverage.serialize_serialize (c, glyphs));
   }
 
   bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
-    const hb_set_t &glyphset = *c->plan->glyphset ();
+    const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
     const hb_map_t &glyph_map = *c->plan->glyph_map;
 
     auto *out = c->serializer->start_embed (*this);
@@ -675,8 +722,7 @@ struct AlternateSubstFormat1
     | hb_map (glyph_map)
     | hb_sink (new_coverage)
     ;
-    out->coverage.serialize (c->serializer, out)
-                .serialize (c->serializer, new_coverage.iter ());
+    out->coverage.serialize_serialize (c->serializer, new_coverage.iter ());
     return_trace (bool (new_coverage));
   }
 
@@ -688,10 +734,10 @@ struct AlternateSubstFormat1
 
   protected:
   HBUINT16     format;                 /* Format identifier--format = 1 */
-  OffsetTo<Coverage>
+  Offset16To<Coverage>
                coverage;               /* Offset to Coverage table--from
                                         * beginning of Substitution table */
-  OffsetArrayOf<AlternateSet>
+  Array16OfOffset16To<AlternateSet>
                alternateSet;           /* Array of AlternateSet tables
                                         * ordered by Coverage Index */
   public:
@@ -701,9 +747,9 @@ struct AlternateSubstFormat1
 struct AlternateSubst
 {
   bool serialize (hb_serialize_context_t *c,
-                 hb_sorted_array_t<const HBGlyphID> glyphs,
+                 hb_sorted_array_t<const HBGlyphID16> glyphs,
                  hb_array_t<const unsigned int> alternate_len_list,
-                 hb_array_t<const HBGlyphID> alternate_glyphs_list)
+                 hb_array_t<const HBGlyphID16> alternate_glyphs_list)
   {
     TRACE_SERIALIZE (this);
     if (unlikely (!c->extend_min (u.format))) return_trace (false);
@@ -721,7 +767,7 @@ struct AlternateSubst
     TRACE_DISPATCH (this, u.format);
     if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
     switch (u.format) {
-    case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...));
+    case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...));
     default:return_trace (c->default_return_value ());
     }
   }
@@ -780,22 +826,25 @@ struct Ligature
 
     unsigned int total_component_count = 0;
 
-    unsigned int match_length = 0;
+    unsigned int match_end = 0;
     unsigned int match_positions[HB_MAX_CONTEXT_LENGTH];
 
     if (likely (!match_input (c, count,
                              &component[1],
                              match_glyph,
                              nullptr,
-                             &match_length,
+                             &match_end,
                              match_positions,
                              &total_component_count)))
+    {
+      c->buffer->unsafe_to_concat (c->buffer->idx, match_end);
       return_trace (false);
+    }
 
     ligate_input (c,
                  count,
                  match_positions,
-                 match_length,
+                 match_end,
                  ligGlyph,
                  total_component_count);
 
@@ -809,19 +858,21 @@ struct Ligature
                  Iterator components /* Starting from second */)
   {
     TRACE_SERIALIZE (this);
-    if (unlikely (!c->extend_min (*this))) return_trace (false);
+    if (unlikely (!c->extend_min (this))) return_trace (false);
     ligGlyph = ligature;
     if (unlikely (!component.serialize (c, components))) return_trace (false);
     return_trace (true);
   }
 
-  bool subset (hb_subset_context_t *c) const
+  bool subset (hb_subset_context_t *c, unsigned coverage_idx) const
   {
     TRACE_SUBSET (this);
-    const hb_set_t &glyphset = *c->plan->glyphset ();
+    const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
     const hb_map_t &glyph_map = *c->plan->glyph_map;
 
     if (!intersects (&glyphset) || !glyphset.has (ligGlyph)) return_trace (false);
+    // Ensure Coverage table is always packed after this.
+    c->serializer->add_virtual_link (coverage_idx);
 
     auto it =
       + hb_iter (component)
@@ -830,8 +881,8 @@ struct Ligature
 
     auto *out = c->serializer->start_embed (*this);
     return_trace (out->serialize (c->serializer,
-                                  glyph_map[ligGlyph],
-                                  it));
+                                 glyph_map[ligGlyph],
+                                 it));
   }
 
   public:
@@ -842,8 +893,8 @@ struct Ligature
   }
 
   protected:
-  HBGlyphID    ligGlyph;               /* GlyphID of ligature to substitute */
-  HeadlessArrayOf<HBGlyphID>
+  HBGlyphID16  ligGlyph;               /* GlyphID of ligature to substitute */
+  HeadlessArrayOf<HBGlyphID16>
                component;              /* Array of component GlyphIDs--start
                                         * with the second  component--ordered
                                         * in writing direction */
@@ -903,36 +954,40 @@ struct LigatureSet
   }
 
   bool serialize (hb_serialize_context_t *c,
-                 hb_array_t<const HBGlyphID> ligatures,
+                 hb_array_t<const HBGlyphID16> ligatures,
                  hb_array_t<const unsigned int> component_count_list,
-                 hb_array_t<const HBGlyphID> &component_list /* Starting from second for each ligature */)
+                 hb_array_t<const HBGlyphID16> &component_list /* Starting from second for each ligature */)
   {
     TRACE_SERIALIZE (this);
-    if (unlikely (!c->extend_min (*this))) return_trace (false);
+    if (unlikely (!c->extend_min (this))) return_trace (false);
     if (unlikely (!ligature.serialize (c, ligatures.length))) return_trace (false);
     for (unsigned int i = 0; i < ligatures.length; i++)
     {
       unsigned int component_count = (unsigned) hb_max ((int) component_count_list[i] - 1, 0);
-      if (unlikely (!ligature[i].serialize (c, this)
-                               .serialize (c,
-                                           ligatures[i],
-                                           component_list.sub_array (0, component_count))))
+      if (unlikely (!ligature[i].serialize_serialize (c,
+                                                      ligatures[i],
+                                                      component_list.sub_array (0, component_count))))
        return_trace (false);
       component_list += component_count;
     }
     return_trace (true);
   }
 
-  bool subset (hb_subset_context_t *c) const
+  bool subset (hb_subset_context_t *c, unsigned coverage_idx) const
   {
     TRACE_SUBSET (this);
     auto *out = c->serializer->start_embed (*this);
     if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
 
     + hb_iter (ligature)
-    | hb_filter (subset_offset_array (c, out->ligature, this))
+    | hb_filter (subset_offset_array (c, out->ligature, this, coverage_idx))
     | hb_drain
     ;
+
+    if (bool (out->ligature))
+      // Ensure Coverage table is always packed after this.
+      c->serializer->add_virtual_link (coverage_idx);
+
     return_trace (bool (out->ligature));
   }
 
@@ -943,7 +998,7 @@ struct LigatureSet
   }
 
   protected:
-  OffsetArrayOf<Ligature>
+  Array16OfOffset16To<Ligature>
                ligature;               /* Array LigatureSet tables
                                         * ordered by preference */
   public:
@@ -958,20 +1013,24 @@ struct LigatureSubstFormat1
     + hb_zip (this+coverage, ligatureSet)
     | hb_filter (*glyphs, hb_first)
     | hb_map (hb_second)
-    | hb_map ([this, glyphs] (const OffsetTo<LigatureSet> &_)
+    | hb_map ([this, glyphs] (const Offset16To<LigatureSet> &_)
              { return (this+_).intersects (glyphs); })
     | hb_any
     ;
   }
 
+  bool may_have_non_1to1 () const
+  { return true; }
+
   void closure (hb_closure_context_t *c) const
   {
     + hb_zip (this+coverage, ligatureSet)
-    | hb_filter (*c->glyphs, hb_first)
+    | hb_filter (c->parent_active_glyphs (), hb_first)
     | hb_map (hb_second)
     | hb_map (hb_add (this))
     | hb_apply ([c] (const LigatureSet &_) { _.closure (c); })
     ;
+
   }
 
   void closure_lookups (hb_closure_lookups_context_t *c) const {}
@@ -1010,49 +1069,71 @@ struct LigatureSubstFormat1
   }
 
   bool serialize (hb_serialize_context_t *c,
-                 hb_sorted_array_t<const HBGlyphID> first_glyphs,
+                 hb_sorted_array_t<const HBGlyphID16> first_glyphs,
                  hb_array_t<const unsigned int> ligature_per_first_glyph_count_list,
-                 hb_array_t<const HBGlyphID> ligatures_list,
+                 hb_array_t<const HBGlyphID16> ligatures_list,
                  hb_array_t<const unsigned int> component_count_list,
-                 hb_array_t<const HBGlyphID> component_list /* Starting from second for each ligature */)
+                 hb_array_t<const HBGlyphID16> component_list /* Starting from second for each ligature */)
   {
     TRACE_SERIALIZE (this);
-    if (unlikely (!c->extend_min (*this))) return_trace (false);
+    if (unlikely (!c->extend_min (this))) return_trace (false);
     if (unlikely (!ligatureSet.serialize (c, first_glyphs.length))) return_trace (false);
     for (unsigned int i = 0; i < first_glyphs.length; i++)
     {
       unsigned int ligature_count = ligature_per_first_glyph_count_list[i];
-      if (unlikely (!ligatureSet[i].serialize (c, this)
-                                  .serialize (c,
-                                              ligatures_list.sub_array (0, ligature_count),
-                                              component_count_list.sub_array (0, ligature_count),
-                                              component_list))) return_trace (false);
+      if (unlikely (!ligatureSet[i]
+                        .serialize_serialize (c,
+                                              ligatures_list.sub_array (0, ligature_count),
+                                              component_count_list.sub_array (0, ligature_count),
+                                              component_list))) return_trace (false);
       ligatures_list += ligature_count;
       component_count_list += ligature_count;
     }
-    return_trace (coverage.serialize (c, this).serialize (c, first_glyphs));
+    return_trace (coverage.serialize_serialize (c, first_glyphs));
   }
 
   bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
-    const hb_set_t &glyphset = *c->plan->glyphset ();
+    const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
     const hb_map_t &glyph_map = *c->plan->glyph_map;
 
     auto *out = c->serializer->start_embed (*this);
     if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
     out->format = format;
 
-    hb_sorted_vector_t<hb_codepoint_t> new_coverage;
-    + hb_zip (this+coverage, ligatureSet)
+    // Due to a bug in some older versions of windows 7 the Coverage table must be
+    // packed after the LigatureSet and Ligature tables, so serialize Coverage first
+    // which places it last in the packed order.
+    hb_set_t new_coverage;
+    + hb_zip (this+coverage, hb_iter (ligatureSet) | hb_map (hb_add (this)))
     | hb_filter (glyphset, hb_first)
-    | hb_filter (subset_offset_array (c, out->ligatureSet, this), hb_second)
+    | hb_filter ([&] (const LigatureSet& _) {
+      return _.intersects (&glyphset);
+    }, hb_second)
     | hb_map (hb_first)
-    | hb_map (glyph_map)
-    | hb_sink (new_coverage)
+    | hb_sink (new_coverage);
+
+    if (!c->serializer->push<Coverage> ()
+        ->serialize (c->serializer,
+                     + new_coverage.iter () | hb_map_retains_sorting (glyph_map)))
+    {
+      c->serializer->pop_discard ();
+      return_trace (false);
+    }
+
+    unsigned coverage_idx = c->serializer->pop_pack ();
+     c->serializer->add_link (out->coverage, coverage_idx);
+
+    + hb_zip (this+coverage, ligatureSet)
+    | hb_filter (new_coverage, hb_first)
+    | hb_map (hb_second)
+    // to ensure that the repacker always orders the coverage table after the LigatureSet
+    // and LigatureSubtable's they will be linked to the Coverage table via a virtual link
+    // the coverage table object idx is passed down to facilitate this.
+    | hb_apply (subset_offset_array (c, out->ligatureSet, this, coverage_idx))
     ;
-    out->coverage.serialize (c->serializer, out)
-                .serialize (c->serializer, new_coverage.iter ());
+
     return_trace (bool (new_coverage));
   }
 
@@ -1064,10 +1145,10 @@ struct LigatureSubstFormat1
 
   protected:
   HBUINT16     format;                 /* Format identifier--format = 1 */
-  OffsetTo<Coverage>
+  Offset16To<Coverage>
                coverage;               /* Offset to Coverage table--from
                                         * beginning of Substitution table */
-  OffsetArrayOf<LigatureSet>
+  Array16OfOffset16To<LigatureSet>
                ligatureSet;            /* Array LigatureSet tables
                                         * ordered by Coverage Index */
   public:
@@ -1077,11 +1158,11 @@ struct LigatureSubstFormat1
 struct LigatureSubst
 {
   bool serialize (hb_serialize_context_t *c,
-                 hb_sorted_array_t<const HBGlyphID> first_glyphs,
+                 hb_sorted_array_t<const HBGlyphID16> first_glyphs,
                  hb_array_t<const unsigned int> ligature_per_first_glyph_count_list,
-                 hb_array_t<const HBGlyphID> ligatures_list,
+                 hb_array_t<const HBGlyphID16> ligatures_list,
                  hb_array_t<const unsigned int> component_count_list,
-                 hb_array_t<const HBGlyphID> component_list /* Starting from second for each ligature */)
+                 hb_array_t<const HBGlyphID16> component_list /* Starting from second for each ligature */)
   {
     TRACE_SERIALIZE (this);
     if (unlikely (!c->extend_min (u.format))) return_trace (false);
@@ -1104,7 +1185,7 @@ struct LigatureSubst
     TRACE_DISPATCH (this, u.format);
     if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
     switch (u.format) {
-    case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...));
+    case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...));
     default:return_trace (c->default_return_value ());
     }
   }
@@ -1135,7 +1216,7 @@ struct ReverseChainSingleSubstFormat1
     if (!(this+coverage).intersects (glyphs))
       return false;
 
-    const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage>> (backtrack);
+    const Array16OfOffset16To<Coverage> &lookahead = StructAfter<Array16OfOffset16To<Coverage>> (backtrack);
 
     unsigned int count;
 
@@ -1152,15 +1233,18 @@ struct ReverseChainSingleSubstFormat1
     return true;
   }
 
+  bool may_have_non_1to1 () const
+  { return false; }
+
   void closure (hb_closure_context_t *c) const
   {
     if (!intersects (c->glyphs)) return;
 
-    const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage>> (backtrack);
-    const ArrayOf<HBGlyphID> &substitute = StructAfter<ArrayOf<HBGlyphID>> (lookahead);
+    const Array16OfOffset16To<Coverage> &lookahead = StructAfter<Array16OfOffset16To<Coverage>> (backtrack);
+    const Array16Of<HBGlyphID16> &substitute = StructAfter<Array16Of<HBGlyphID16>> (lookahead);
 
     + hb_zip (this+coverage, substitute)
-    | hb_filter (*c->glyphs, hb_first)
+    | hb_filter (c->parent_active_glyphs (), hb_first)
     | hb_map (hb_second)
     | hb_sink (c->output)
     ;
@@ -1178,12 +1262,12 @@ struct ReverseChainSingleSubstFormat1
     for (unsigned int i = 0; i < count; i++)
       if (unlikely (!(this+backtrack[i]).collect_coverage (c->before))) return;
 
-    const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage>> (backtrack);
+    const Array16OfOffset16To<Coverage> &lookahead = StructAfter<Array16OfOffset16To<Coverage>> (backtrack);
     count = lookahead.len;
     for (unsigned int i = 0; i < count; i++)
       if (unlikely (!(this+lookahead[i]).collect_coverage (c->after))) return;
 
-    const ArrayOf<HBGlyphID> &substitute = StructAfter<ArrayOf<HBGlyphID>> (lookahead);
+    const Array16Of<HBGlyphID16> &substitute = StructAfter<Array16Of<HBGlyphID16>> (lookahead);
     count = substitute.len;
     c->output->add_array (substitute.arrayZ, substitute.len);
   }
@@ -1202,10 +1286,12 @@ struct ReverseChainSingleSubstFormat1
     unsigned int index = (this+coverage).get_coverage (c->buffer->cur ().codepoint);
     if (likely (index == NOT_COVERED)) return_trace (false);
 
-    const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage>> (backtrack);
-    const ArrayOf<HBGlyphID> &substitute = StructAfter<ArrayOf<HBGlyphID>> (lookahead);
+    const Array16OfOffset16To<Coverage> &lookahead = StructAfter<Array16OfOffset16To<Coverage>> (backtrack);
+    const Array16Of<HBGlyphID16> &substitute = StructAfter<Array16Of<HBGlyphID16>> (lookahead);
+
+    if (unlikely (index >= substitute.len)) return_trace (false);
 
-  unsigned int start_index = 0, end_index = 0;
+    unsigned int start_index = 0, end_index = 0;
     if (match_backtrack (c,
                         backtrack.len, (HBUINT16 *) backtrack.arrayZ,
                         match_coverage, this,
@@ -1213,7 +1299,7 @@ struct ReverseChainSingleSubstFormat1
        match_lookahead (c,
                         lookahead.len, (HBUINT16 *) lookahead.arrayZ,
                         match_coverage, this,
-                        1, &end_index))
+                        c->buffer->idx + 1, &end_index))
     {
       c->buffer->unsafe_to_break_from_outbuffer (start_index, end_index);
       c->replace_glyph_inplace (substitute[index]);
@@ -1222,15 +1308,87 @@ struct ReverseChainSingleSubstFormat1
        * calls us through a Context lookup. */
       return_trace (true);
     }
+    else
+    {
+      c->buffer->unsafe_to_concat_from_outbuffer (start_index, end_index);
+      return_trace (false);
+    }
+  }
 
-    return_trace (false);
+  template<typename Iterator,
+           hb_requires (hb_is_iterator (Iterator))>
+  bool serialize_coverage_offset_array (hb_subset_context_t *c, Iterator it) const
+  {
+    TRACE_SERIALIZE (this);
+    auto *out = c->serializer->start_embed<Array16OfOffset16To<Coverage>> ();
+
+    if (unlikely (!c->serializer->allocate_size<HBUINT16> (HBUINT16::static_size)))
+      return_trace (false);
+
+    for (auto& offset : it) {
+      auto *o = out->serialize_append (c->serializer);
+      if (unlikely (!o) || !o->serialize_subset (c, offset, this))
+        return_trace (false);
+    }
+
+    return_trace (true);
+  }
+
+  template<typename Iterator, typename BacktrackIterator, typename LookaheadIterator,
+           hb_requires (hb_is_sorted_source_of (Iterator, hb_codepoint_pair_t)),
+           hb_requires (hb_is_iterator (BacktrackIterator)),
+           hb_requires (hb_is_iterator (LookaheadIterator))>
+  bool serialize (hb_subset_context_t *c,
+                  Iterator coverage_subst_iter,
+                  BacktrackIterator backtrack_iter,
+                  LookaheadIterator lookahead_iter) const
+  {
+    TRACE_SERIALIZE (this);
+
+    auto *out = c->serializer->start_embed (this);
+    if (unlikely (!c->serializer->check_success (out))) return_trace (false);
+    if (unlikely (!c->serializer->embed (this->format))) return_trace (false);
+    if (unlikely (!c->serializer->embed (this->coverage))) return_trace (false);
+
+    if (!serialize_coverage_offset_array (c, backtrack_iter)) return_trace (false);
+    if (!serialize_coverage_offset_array (c, lookahead_iter)) return_trace (false);
+
+    auto *substitute_out = c->serializer->start_embed<Array16Of<HBGlyphID16>> ();
+    auto substitutes =
+    + coverage_subst_iter
+    | hb_map (hb_second)
+    ;
+
+    auto glyphs =
+    + coverage_subst_iter
+    | hb_map_retains_sorting (hb_first)
+    ;
+    if (unlikely (! c->serializer->check_success (substitute_out->serialize (c->serializer, substitutes))))
+        return_trace (false);
+
+    if (unlikely (!out->coverage.serialize_serialize (c->serializer, glyphs)))
+      return_trace (false);
+    return_trace (true);
   }
 
   bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
-    // TODO(subset)
-    return_trace (false);
+    const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
+    const hb_map_t &glyph_map = *c->plan->glyph_map;
+
+    const Array16OfOffset16To<Coverage> &lookahead = StructAfter<Array16OfOffset16To<Coverage>> (backtrack);
+    const Array16Of<HBGlyphID16> &substitute = StructAfter<Array16Of<HBGlyphID16>> (lookahead);
+
+    auto it =
+    + hb_zip (this+coverage, substitute)
+    | hb_filter (glyphset, hb_first)
+    | hb_filter (glyphset, hb_second)
+    | hb_map_retains_sorting ([&] (hb_pair_t<hb_codepoint_t, const HBGlyphID16 &> p) -> hb_codepoint_pair_t
+                              { return hb_pair (glyph_map[p.first], glyph_map[p.second]); })
+    ;
+
+    return_trace (bool (it) && serialize (c, it, backtrack.iter (), lookahead.iter ()));
   }
 
   bool sanitize (hb_sanitize_context_t *c) const
@@ -1238,27 +1396,27 @@ struct ReverseChainSingleSubstFormat1
     TRACE_SANITIZE (this);
     if (!(coverage.sanitize (c, this) && backtrack.sanitize (c, this)))
       return_trace (false);
-    const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage>> (backtrack);
+    const Array16OfOffset16To<Coverage> &lookahead = StructAfter<Array16OfOffset16To<Coverage>> (backtrack);
     if (!lookahead.sanitize (c, this))
       return_trace (false);
-    const ArrayOf<HBGlyphID> &substitute = StructAfter<ArrayOf<HBGlyphID>> (lookahead);
+    const Array16Of<HBGlyphID16> &substitute = StructAfter<Array16Of<HBGlyphID16>> (lookahead);
     return_trace (substitute.sanitize (c));
   }
 
   protected:
   HBUINT16     format;                 /* Format identifier--format = 1 */
-  OffsetTo<Coverage>
+  Offset16To<Coverage>
                coverage;               /* Offset to Coverage table--from
                                         * beginning of table */
-  OffsetArrayOf<Coverage>
+  Array16OfOffset16To<Coverage>
                backtrack;              /* Array of coverage tables
                                         * in backtracking sequence, in glyph
                                         * sequence order */
-  OffsetArrayOf<Coverage>
+  Array16OfOffset16To<Coverage>
                lookaheadX;             /* Array of coverage tables
                                         * in lookahead sequence, in glyph
                                         * sequence order */
-  ArrayOf<HBGlyphID>
+  Array16Of<HBGlyphID16>
                substituteX;            /* Array of substitute
                                         * GlyphIDs--ordered by Coverage Index */
   public:
@@ -1273,7 +1431,7 @@ struct ReverseChainSingleSubst
     TRACE_DISPATCH (this, u.format);
     if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
     switch (u.format) {
-    case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...));
+    case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...));
     default:return_trace (c->default_return_value ());
     }
   }
@@ -1312,14 +1470,14 @@ struct SubstLookupSubTable
   {
     TRACE_DISPATCH (this, lookup_type);
     switch (lookup_type) {
-    case Single:               return_trace (u.single.dispatch (c, hb_forward<Ts> (ds)...));
-    case Multiple:             return_trace (u.multiple.dispatch (c, hb_forward<Ts> (ds)...));
-    case Alternate:            return_trace (u.alternate.dispatch (c, hb_forward<Ts> (ds)...));
-    case Ligature:             return_trace (u.ligature.dispatch (c, hb_forward<Ts> (ds)...));
-    case Context:              return_trace (u.context.dispatch (c, hb_forward<Ts> (ds)...));
-    case ChainContext:         return_trace (u.chainContext.dispatch (c, hb_forward<Ts> (ds)...));
-    case Extension:            return_trace (u.extension.dispatch (c, hb_forward<Ts> (ds)...));
-    case ReverseChainSingle:   return_trace (u.reverseChainContextSingle.dispatch (c, hb_forward<Ts> (ds)...));
+    case Single:               return_trace (u.single.dispatch (c, std::forward<Ts> (ds)...));
+    case Multiple:             return_trace (u.multiple.dispatch (c, std::forward<Ts> (ds)...));
+    case Alternate:            return_trace (u.alternate.dispatch (c, std::forward<Ts> (ds)...));
+    case Ligature:             return_trace (u.ligature.dispatch (c, std::forward<Ts> (ds)...));
+    case Context:              return_trace (u.context.dispatch (c, std::forward<Ts> (ds)...));
+    case ChainContext:         return_trace (u.chainContext.dispatch (c, std::forward<Ts> (ds)...));
+    case Extension:            return_trace (u.extension.dispatch (c, std::forward<Ts> (ds)...));
+    case ReverseChainSingle:   return_trace (u.reverseChainContextSingle.dispatch (c, std::forward<Ts> (ds)...));
     default:                   return_trace (c->default_return_value ());
     }
   }
@@ -1364,6 +1522,12 @@ struct SubstLookup : Lookup
     return lookup_type_is_reverse (type);
   }
 
+  bool may_have_non_1to1 () const
+  {
+    hb_have_non_1to1_context_t c;
+    return dispatch (&c);
+  }
+
   bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
@@ -1431,79 +1595,101 @@ struct SubstLookup : Lookup
 
   static inline bool apply_recurse_func (hb_ot_apply_context_t *c, unsigned int lookup_index);
 
-  SubTable& serialize_subtable (hb_serialize_context_t *c,
-                               unsigned int i)
-  { return get_subtables<SubTable> ()[i].serialize (c, this); }
-
   bool serialize_single (hb_serialize_context_t *c,
                         uint32_t lookup_props,
-                        hb_sorted_array_t<const HBGlyphID> glyphs,
-                        hb_array_t<const HBGlyphID> substitutes)
+                        hb_sorted_array_t<const HBGlyphID16> glyphs,
+                        hb_array_t<const HBGlyphID16> substitutes)
   {
     TRACE_SERIALIZE (this);
     if (unlikely (!Lookup::serialize (c, SubTable::Single, lookup_props, 1))) return_trace (false);
-    return_trace (serialize_subtable (c, 0).u.single.
-                 serialize (c, hb_zip (glyphs, substitutes)));
+    if (c->push<SubTable> ()->u.single.serialize (c, hb_zip (glyphs, substitutes)))
+    {
+      c->add_link (get_subtables<SubTable> ()[0], c->pop_pack ());
+      return_trace (true);
+    }
+    c->pop_discard ();
+    return_trace (false);
   }
 
   bool serialize_multiple (hb_serialize_context_t *c,
                           uint32_t lookup_props,
-                          hb_sorted_array_t<const HBGlyphID> glyphs,
+                          hb_sorted_array_t<const HBGlyphID16> glyphs,
                           hb_array_t<const unsigned int> substitute_len_list,
-                          hb_array_t<const HBGlyphID> substitute_glyphs_list)
+                          hb_array_t<const HBGlyphID16> substitute_glyphs_list)
   {
     TRACE_SERIALIZE (this);
     if (unlikely (!Lookup::serialize (c, SubTable::Multiple, lookup_props, 1))) return_trace (false);
-    return_trace (serialize_subtable (c, 0).u.multiple.
-                 serialize (c,
-                            glyphs,
-                            substitute_len_list,
-                            substitute_glyphs_list));
+    if (c->push<SubTable> ()->u.multiple.
+        serialize (c,
+                   glyphs,
+                   substitute_len_list,
+                   substitute_glyphs_list))
+    {
+      c->add_link (get_subtables<SubTable> ()[0], c->pop_pack ());
+      return_trace (true);
+    }
+    c->pop_discard ();
+    return_trace (false);
   }
 
   bool serialize_alternate (hb_serialize_context_t *c,
                            uint32_t lookup_props,
-                           hb_sorted_array_t<const HBGlyphID> glyphs,
+                           hb_sorted_array_t<const HBGlyphID16> glyphs,
                            hb_array_t<const unsigned int> alternate_len_list,
-                           hb_array_t<const HBGlyphID> alternate_glyphs_list)
+                           hb_array_t<const HBGlyphID16> alternate_glyphs_list)
   {
     TRACE_SERIALIZE (this);
     if (unlikely (!Lookup::serialize (c, SubTable::Alternate, lookup_props, 1))) return_trace (false);
-    return_trace (serialize_subtable (c, 0).u.alternate.
-                 serialize (c,
-                            glyphs,
-                            alternate_len_list,
-                            alternate_glyphs_list));
+
+    if (c->push<SubTable> ()->u.alternate.
+        serialize (c,
+                   glyphs,
+                   alternate_len_list,
+                   alternate_glyphs_list))
+    {
+      c->add_link (get_subtables<SubTable> ()[0], c->pop_pack ());
+      return_trace (true);
+    }
+    c->pop_discard ();
+    return_trace (false);
   }
 
   bool serialize_ligature (hb_serialize_context_t *c,
                           uint32_t lookup_props,
-                          hb_sorted_array_t<const HBGlyphID> first_glyphs,
+                          hb_sorted_array_t<const HBGlyphID16> first_glyphs,
                           hb_array_t<const unsigned int> ligature_per_first_glyph_count_list,
-                          hb_array_t<const HBGlyphID> ligatures_list,
+                          hb_array_t<const HBGlyphID16> ligatures_list,
                           hb_array_t<const unsigned int> component_count_list,
-                          hb_array_t<const HBGlyphID> component_list /* Starting from second for each ligature */)
+                          hb_array_t<const HBGlyphID16> component_list /* Starting from second for each ligature */)
   {
     TRACE_SERIALIZE (this);
     if (unlikely (!Lookup::serialize (c, SubTable::Ligature, lookup_props, 1))) return_trace (false);
-    return_trace (serialize_subtable (c, 0).u.ligature.
-                 serialize (c,
-                            first_glyphs,
-                            ligature_per_first_glyph_count_list,
-                            ligatures_list,
-                            component_count_list,
-                            component_list));
+    if (c->push<SubTable> ()->u.ligature.
+        serialize (c,
+                   first_glyphs,
+                   ligature_per_first_glyph_count_list,
+                   ligatures_list,
+                   component_count_list,
+                   component_list))
+    {
+      c->add_link (get_subtables<SubTable> ()[0], c->pop_pack ());
+      return_trace (true);
+    }
+    c->pop_discard ();
+    return_trace (false);
   }
 
   template <typename context_t>
   static inline typename context_t::return_t dispatch_recurse_func (context_t *c, unsigned int lookup_index);
 
-  static inline hb_closure_context_t::return_t dispatch_closure_recurse_func (hb_closure_context_t *c, unsigned int lookup_index)
+  static inline typename hb_closure_context_t::return_t closure_glyphs_recurse_func (hb_closure_context_t *c, unsigned lookup_index, hb_set_t *covered_seq_indices, unsigned seq_index, unsigned end_index);
+
+  static inline hb_closure_context_t::return_t dispatch_closure_recurse_func (hb_closure_context_t *c, unsigned lookup_index, hb_set_t *covered_seq_indices, unsigned seq_index, unsigned end_index)
   {
     if (!c->should_visit_lookup (lookup_index))
       return hb_empty_t ();
 
-    hb_closure_context_t::return_t ret = dispatch_recurse_func (c, lookup_index);
+    hb_closure_context_t::return_t ret = closure_glyphs_recurse_func (c, lookup_index, covered_seq_indices, seq_index, end_index);
 
     /* While in theory we should flush here, it will cause timeouts because a recursive
      * lookup can keep growing the glyph set.  Skip, and outer loop will retry up to
@@ -1517,7 +1703,7 @@ struct SubstLookup : Lookup
 
   template <typename context_t, typename ...Ts>
   typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
-  { return Lookup::dispatch<SubTable> (c, hb_forward<Ts> (ds)...); }
+  { return Lookup::dispatch<SubTable> (c, std::forward<Ts> (ds)...); }
 
   bool subset (hb_subset_context_t *c) const
   { return Lookup::subset<SubTable> (c); }
@@ -1540,21 +1726,28 @@ struct GSUB : GSUBGPOS
 
   bool subset (hb_subset_context_t *c) const
   {
-    hb_subset_layout_context_t l (c, tableTag, c->plan->gsub_lookups, c->plan->gsub_features);
+    hb_subset_layout_context_t l (c, tableTag, c->plan->gsub_lookups, c->plan->gsub_langsys, c->plan->gsub_features);
     return GSUBGPOS::subset<SubstLookup> (&l);
   }
 
   bool sanitize (hb_sanitize_context_t *c) const
   { return GSUBGPOS::sanitize<SubstLookup> (c); }
 
-  HB_INTERNAL bool is_blacklisted (hb_blob_t *blob,
+  HB_INTERNAL bool is_blocklisted (hb_blob_t *blob,
                                   hb_face_t *face) const;
 
+  void closure_lookups (hb_face_t      *face,
+                       const hb_set_t *glyphs,
+                       hb_set_t       *lookup_indexes /* IN/OUT */) const
+  { GSUBGPOS::closure_lookups<SubstLookup> (face, glyphs, lookup_indexes); }
+
   typedef GSUBGPOS::accelerator_t<GSUB> accelerator_t;
 };
 
 
-struct GSUB_accelerator_t : GSUB::accelerator_t {};
+struct GSUB_accelerator_t : GSUB::accelerator_t {
+  GSUB_accelerator_t (hb_face_t *face) : GSUB::accelerator_t (face) {}
+};
 
 
 /* Out-of-class implementation for methods recursing */
@@ -1571,6 +1764,14 @@ template <typename context_t>
   return l.dispatch (c);
 }
 
+/*static*/ typename hb_closure_context_t::return_t SubstLookup::closure_glyphs_recurse_func (hb_closure_context_t *c, unsigned lookup_index, hb_set_t *covered_seq_indices, unsigned seq_index, unsigned end_index)
+{
+  const SubstLookup &l = c->face->table.GSUB.get_relaxed ()->table->get_lookup (lookup_index);
+  if (l.may_have_non_1to1 ())
+      hb_set_add_range (covered_seq_indices, seq_index, end_index);
+  return l.dispatch (c);
+}
+
 /*static*/ inline hb_closure_lookups_context_t::return_t SubstLookup::dispatch_closure_lookups_recurse_func (hb_closure_lookups_context_t *c, unsigned this_index)
 {
   const SubstLookup &l = c->face->table.GSUB.get_relaxed ()->table->get_lookup (this_index);
index 2c06312..65de131 100644 (file)
@@ -42,78 +42,143 @@ namespace OT {
 
 
 struct hb_intersects_context_t :
-       hb_dispatch_context_t<hb_intersects_context_t, bool, 0>
+       hb_dispatch_context_t<hb_intersects_context_t, bool>
 {
-  const char *get_name () { return "INTERSECTS"; }
   template <typename T>
   return_t dispatch (const T &obj) { return obj.intersects (this->glyphs); }
   static return_t default_return_value () { return false; }
   bool stop_sublookup_iteration (return_t r) const { return r; }
 
   const hb_set_t *glyphs;
-  unsigned int debug_depth;
 
   hb_intersects_context_t (const hb_set_t *glyphs_) :
-                            glyphs (glyphs_),
-                            debug_depth (0) {}
+                            glyphs (glyphs_) {}
+};
+
+struct hb_have_non_1to1_context_t :
+       hb_dispatch_context_t<hb_have_non_1to1_context_t, bool>
+{
+  template <typename T>
+  return_t dispatch (const T &obj) { return obj.may_have_non_1to1 (); }
+  static return_t default_return_value () { return false; }
+  bool stop_sublookup_iteration (return_t r) const { return r; }
 };
 
 struct hb_closure_context_t :
-       hb_dispatch_context_t<hb_closure_context_t, hb_empty_t, 0>
+       hb_dispatch_context_t<hb_closure_context_t>
 {
-  const char *get_name () { return "CLOSURE"; }
-  typedef return_t (*recurse_func_t) (hb_closure_context_t *c, unsigned int lookup_index);
+  typedef return_t (*recurse_func_t) (hb_closure_context_t *c, unsigned lookup_index, hb_set_t *covered_seq_indicies, unsigned seq_index, unsigned end_index);
   template <typename T>
   return_t dispatch (const T &obj) { obj.closure (this); return hb_empty_t (); }
   static return_t default_return_value () { return hb_empty_t (); }
-  void recurse (unsigned int lookup_index)
+  void recurse (unsigned lookup_index, hb_set_t *covered_seq_indicies, unsigned seq_index, unsigned end_index)
   {
     if (unlikely (nesting_level_left == 0 || !recurse_func))
       return;
 
     nesting_level_left--;
-    recurse_func (this, lookup_index);
+    recurse_func (this, lookup_index, covered_seq_indicies, seq_index, end_index);
     nesting_level_left++;
   }
 
+  void reset_lookup_visit_count ()
+  { lookup_count = 0; }
+
   bool lookup_limit_exceeded ()
-  { return lookup_count > HB_MAX_LOOKUP_INDICES; }
+  { return lookup_count > HB_MAX_LOOKUP_VISIT_COUNT; }
 
   bool should_visit_lookup (unsigned int lookup_index)
   {
-    if (lookup_count++ > HB_MAX_LOOKUP_INDICES)
+    if (lookup_count++ > HB_MAX_LOOKUP_VISIT_COUNT)
       return false;
 
     if (is_lookup_done (lookup_index))
       return false;
 
-    done_lookups->set (lookup_index, glyphs->get_population ());
     return true;
   }
 
   bool is_lookup_done (unsigned int lookup_index)
   {
+    if (done_lookups_glyph_count->in_error () ||
+        done_lookups_glyph_set->in_error ())
+      return true;
+
     /* Have we visited this lookup with the current set of glyphs? */
-    return done_lookups->get (lookup_index) == glyphs->get_population ();
+    if (done_lookups_glyph_count->get (lookup_index) != glyphs->get_population ())
+    {
+      done_lookups_glyph_count->set (lookup_index, glyphs->get_population ());
+
+      if (!done_lookups_glyph_set->get (lookup_index))
+      {
+       hb_set_t* empty_set = hb_set_create ();
+       if (unlikely (!done_lookups_glyph_set->set (lookup_index, empty_set)))
+       {
+         hb_set_destroy (empty_set);
+         return true;
+       }
+      }
+
+      hb_set_clear (done_lookups_glyph_set->get (lookup_index));
+    }
+
+    hb_set_t *covered_glyph_set = done_lookups_glyph_set->get (lookup_index);
+    if (unlikely (covered_glyph_set->in_error ()))
+      return true;
+    if (parent_active_glyphs ().is_subset (*covered_glyph_set))
+      return true;
+
+    covered_glyph_set->union_ (parent_active_glyphs ());
+    return false;
+  }
+
+  const hb_set_t& previous_parent_active_glyphs () {
+    if (active_glyphs_stack.length <= 1)
+      return *glyphs;
+
+    return active_glyphs_stack[active_glyphs_stack.length - 2];
+  }
+
+  const hb_set_t& parent_active_glyphs ()
+  {
+    if (!active_glyphs_stack)
+      return *glyphs;
+
+    return active_glyphs_stack.tail ();
+  }
+
+  hb_set_t& push_cur_active_glyphs ()
+  {
+    return *active_glyphs_stack.push ();
+  }
+
+  bool pop_cur_done_glyphs ()
+  {
+    if (active_glyphs_stack.length < 1)
+      return false;
+
+    active_glyphs_stack.pop ();
+    return true;
   }
 
   hb_face_t *face;
   hb_set_t *glyphs;
   hb_set_t output[1];
+  hb_vector_t<hb_set_t> active_glyphs_stack;
   recurse_func_t recurse_func;
   unsigned int nesting_level_left;
-  unsigned int debug_depth;
 
   hb_closure_context_t (hb_face_t *face_,
                        hb_set_t *glyphs_,
-                       hb_map_t *done_lookups_,
+                       hb_map_t *done_lookups_glyph_count_,
+                       hb_hashmap_t<unsigned, hb_set_t *> *done_lookups_glyph_set_,
                        unsigned int nesting_level_left_ = HB_MAX_NESTING_LEVEL) :
                          face (face_),
                          glyphs (glyphs_),
                          recurse_func (nullptr),
                          nesting_level_left (nesting_level_left_),
-                         debug_depth (0),
-                         done_lookups (done_lookups_),
+                         done_lookups_glyph_count (done_lookups_glyph_count_),
+                         done_lookups_glyph_set (done_lookups_glyph_set_),
                          lookup_count (0)
   {}
 
@@ -123,20 +188,24 @@ struct hb_closure_context_t :
 
   void flush ()
   {
-    hb_set_del_range (output, face->get_num_glyphs (), hb_set_get_max (output));       /* Remove invalid glyphs. */
-    hb_set_union (glyphs, output);
-    hb_set_clear (output);
+    output->del_range (face->get_num_glyphs (), HB_SET_VALUE_INVALID); /* Remove invalid glyphs. */
+    glyphs->union_ (*output);
+    output->clear ();
+    active_glyphs_stack.pop ();
+    active_glyphs_stack.reset ();
   }
 
   private:
-  hb_map_t *done_lookups;
+  hb_map_t *done_lookups_glyph_count;
+  hb_hashmap_t<unsigned, hb_set_t *> *done_lookups_glyph_set;
   unsigned int lookup_count;
 };
 
+
+
 struct hb_closure_lookups_context_t :
-       hb_dispatch_context_t<hb_closure_lookups_context_t, hb_empty_t, 0>
+       hb_dispatch_context_t<hb_closure_lookups_context_t>
 {
-  const char *get_name () { return "CLOSURE_LOOKUPS"; }
   typedef return_t (*recurse_func_t) (hb_closure_lookups_context_t *c, unsigned lookup_index);
   template <typename T>
   return_t dispatch (const T &obj) { obj.closure_lookups (this); return hb_empty_t (); }
@@ -147,10 +216,13 @@ struct hb_closure_lookups_context_t :
       return;
 
     /* Return if new lookup was recursed to before. */
-    if (is_lookup_visited (lookup_index))
+    if (lookup_limit_exceeded ()
+        || visited_lookups->in_error ()
+        || visited_lookups->has (lookup_index))
+      // Don't increment lookup count here, that will be done in the call to closure_lookups()
+      // made by recurse_func.
       return;
 
-    set_lookup_visited (lookup_index);
     nesting_level_left--;
     recurse_func (this, lookup_index);
     nesting_level_left++;
@@ -163,11 +235,22 @@ struct hb_closure_lookups_context_t :
   { inactive_lookups->add (lookup_index); }
 
   bool lookup_limit_exceeded ()
-  { return lookup_count > HB_MAX_LOOKUP_INDICES; }
+  {
+    bool ret = lookup_count > HB_MAX_LOOKUP_VISIT_COUNT;
+    if (ret)
+      DEBUG_MSG (SUBSET, nullptr, "lookup visit count limit exceeded in lookup closure!");
+    return ret; }
 
   bool is_lookup_visited (unsigned lookup_index)
   {
-    if (lookup_count++ > HB_MAX_LOOKUP_INDICES)
+    if (unlikely (lookup_count++ > HB_MAX_LOOKUP_VISIT_COUNT))
+    {
+      DEBUG_MSG (SUBSET, nullptr, "total visited lookup count %u exceeds max limit, lookup %u is dropped.",
+                 lookup_count, lookup_index);
+      return true;
+    }
+
+    if (unlikely (visited_lookups->in_error ()))
       return true;
 
     return visited_lookups->has (lookup_index);
@@ -177,7 +260,6 @@ struct hb_closure_lookups_context_t :
   const hb_set_t *glyphs;
   recurse_func_t recurse_func;
   unsigned int nesting_level_left;
-  unsigned int debug_depth;
 
   hb_closure_lookups_context_t (hb_face_t *face_,
                                const hb_set_t *glyphs_,
@@ -188,7 +270,6 @@ struct hb_closure_lookups_context_t :
                                glyphs (glyphs_),
                                recurse_func (nullptr),
                                nesting_level_left (nesting_level_left_),
-                               debug_depth (0),
                                visited_lookups (visited_lookups_),
                                inactive_lookups (inactive_lookups_),
                                lookup_count (0) {}
@@ -202,9 +283,8 @@ struct hb_closure_lookups_context_t :
 };
 
 struct hb_would_apply_context_t :
-       hb_dispatch_context_t<hb_would_apply_context_t, bool, 0>
+       hb_dispatch_context_t<hb_would_apply_context_t, bool>
 {
-  const char *get_name () { return "WOULD_APPLY"; }
   template <typename T>
   return_t dispatch (const T &obj) { return obj.would_apply (this); }
   static return_t default_return_value () { return false; }
@@ -214,7 +294,6 @@ struct hb_would_apply_context_t :
   const hb_codepoint_t *glyphs;
   unsigned int len;
   bool zero_context;
-  unsigned int debug_depth;
 
   hb_would_apply_context_t (hb_face_t *face_,
                            const hb_codepoint_t *glyphs_,
@@ -223,15 +302,12 @@ struct hb_would_apply_context_t :
                              face (face_),
                              glyphs (glyphs_),
                              len (len_),
-                             zero_context (zero_context_),
-                             debug_depth (0) {}
+                             zero_context (zero_context_) {}
 };
 
-
 struct hb_collect_glyphs_context_t :
-       hb_dispatch_context_t<hb_collect_glyphs_context_t, hb_empty_t, 0>
+       hb_dispatch_context_t<hb_collect_glyphs_context_t>
 {
-  const char *get_name () { return "COLLECT_GLYPHS"; }
   typedef return_t (*recurse_func_t) (hb_collect_glyphs_context_t *c, unsigned int lookup_index);
   template <typename T>
   return_t dispatch (const T &obj) { obj.collect_glyphs (this); return hb_empty_t (); }
@@ -282,7 +358,6 @@ struct hb_collect_glyphs_context_t :
   recurse_func_t recurse_func;
   hb_set_t *recursed_lookups;
   unsigned int nesting_level_left;
-  unsigned int debug_depth;
 
   hb_collect_glyphs_context_t (hb_face_t *face_,
                               hb_set_t  *glyphs_before, /* OUT.  May be NULL */
@@ -297,8 +372,7 @@ struct hb_collect_glyphs_context_t :
                              output (glyphs_output ? glyphs_output : hb_set_get_empty ()),
                              recurse_func (nullptr),
                              recursed_lookups (hb_set_create ()),
-                             nesting_level_left (nesting_level_left_),
-                             debug_depth (0) {}
+                             nesting_level_left (nesting_level_left_) {}
   ~hb_collect_glyphs_context_t () { hb_set_destroy (recursed_lookups); }
 
   void set_recurse_func (recurse_func_t func) { recurse_func = func; }
@@ -308,10 +382,9 @@ struct hb_collect_glyphs_context_t :
 
 template <typename set_t>
 struct hb_collect_coverage_context_t :
-       hb_dispatch_context_t<hb_collect_coverage_context_t<set_t>, const Coverage &, HB_DEBUG_GET_COVERAGE>
+       hb_dispatch_context_t<hb_collect_coverage_context_t<set_t>, const Coverage &>
 {
-  const char *get_name () { return "GET_COVERAGE"; }
-  typedef const Coverage &return_t;
+  typedef const Coverage &return_t; // Stoopid that we have to dupe this here.
   template <typename T>
   return_t dispatch (const T &obj) { return obj.get_coverage (); }
   static return_t default_return_value () { return Null (Coverage); }
@@ -322,11 +395,9 @@ struct hb_collect_coverage_context_t :
   }
 
   hb_collect_coverage_context_t (set_t *set_) :
-                                  set (set_),
-                                  debug_depth (0) {}
+                                  set (set_) {}
 
   set_t *set;
-  unsigned int debug_depth;
 };
 
 
@@ -354,7 +425,7 @@ struct hb_ot_apply_context_t :
     void set_mask (hb_mask_t mask_) { mask = mask_; }
     void set_syllable (uint8_t syllable_)  { syllable = syllable_; }
     void set_match_func (match_func_t match_func_,
-                               const void *match_data_)
+                        const void *match_data_)
     { match_func = match_func_; match_data = match_data_; }
 
     enum may_match_t {
@@ -451,7 +522,7 @@ struct hb_ot_apply_context_t :
     may_skip (const hb_glyph_info_t &info) const
     { return matcher.may_skip (c, info); }
 
-    bool next ()
+    bool next (unsigned *unsafe_to = nullptr)
     {
       assert (num_items > 0);
       while (idx + num_items < end)
@@ -474,11 +545,17 @@ struct hb_ot_apply_context_t :
        }
 
        if (skip == matcher_t::SKIP_NO)
+       {
+         if (unsafe_to)
+           *unsafe_to = idx + 1;
          return false;
+       }
       }
+      if (unsafe_to)
+        *unsafe_to = end;
       return false;
     }
-    bool prev ()
+    bool prev (unsigned *unsafe_from = nullptr)
     {
       assert (num_items > 0);
       while (idx > num_items - 1)
@@ -501,8 +578,14 @@ struct hb_ot_apply_context_t :
        }
 
        if (skip == matcher_t::SKIP_NO)
+       {
+         if (unsafe_from)
+           *unsafe_from = hb_max (1u, idx) - 1u;
          return false;
+       }
       }
+      if (unsafe_from)
+        *unsafe_from = 0;
       return false;
     }
 
@@ -549,7 +632,6 @@ struct hb_ot_apply_context_t :
   unsigned int lookup_index;
   unsigned int lookup_props;
   unsigned int nesting_level_left;
-  unsigned int debug_depth;
 
   bool has_glyph_classes;
   bool auto_zwnj;
@@ -560,8 +642,8 @@ struct hb_ot_apply_context_t :
 
 
   hb_ot_apply_context_t (unsigned int table_index_,
-                     hb_font_t *font_,
-                     hb_buffer_t *buffer_) :
+                        hb_font_t *font_,
+                        hb_buffer_t *buffer_) :
                        iter_input (), iter_context (),
                        font (font_), face (font->face), buffer (buffer_),
                        recurse_func (nullptr),
@@ -579,7 +661,6 @@ struct hb_ot_apply_context_t :
                        lookup_index ((unsigned int) -1),
                        lookup_props (0),
                        nesting_level_left (HB_MAX_NESTING_LEVEL),
-                       debug_depth (0),
                        has_glyph_classes (gdef.has_glyph_classes ()),
                        auto_zwnj (true),
                        auto_zwj (true),
@@ -646,12 +727,11 @@ struct hb_ot_apply_context_t :
   }
 
   void _set_glyph_class (hb_codepoint_t glyph_index,
-                        unsigned int class_guess = 0,
-                        bool ligature = false,
-                        bool component = false) const
+                         unsigned int class_guess = 0,
+                         bool ligature = false,
+                         bool component = false) const
   {
     unsigned int props = _hb_glyph_info_get_glyph_props (&buffer->cur());
-
     props |= HB_OT_LAYOUT_GLYPH_PROPS_SUBSTITUTED;
     if (ligature)
     {
@@ -666,19 +746,24 @@ struct hb_ot_apply_context_t :
     }
     if (component)
       props |= HB_OT_LAYOUT_GLYPH_PROPS_MULTIPLIED;
-
     if (likely (has_glyph_classes))
-      props = (props & ~HB_OT_LAYOUT_GLYPH_PROPS_CLASS_MASK) | gdef.get_glyph_props (glyph_index);
+    {
+      props &= HB_OT_LAYOUT_GLYPH_PROPS_PRESERVE;
+      _hb_glyph_info_set_glyph_props (&buffer->cur(), props | gdef.get_glyph_props (glyph_index));
+    }
     else if (class_guess)
-      props = (props & ~HB_OT_LAYOUT_GLYPH_PROPS_CLASS_MASK) | class_guess;
-
-    _hb_glyph_info_set_glyph_props (&buffer->cur(), props);
+    {
+      props &= HB_OT_LAYOUT_GLYPH_PROPS_PRESERVE;
+      _hb_glyph_info_set_glyph_props (&buffer->cur(), props | class_guess);
+    }
+    else
+      _hb_glyph_info_set_glyph_props (&buffer->cur(), props);
   }
 
   void replace_glyph (hb_codepoint_t glyph_index) const
   {
     _set_glyph_class (glyph_index);
-    buffer->replace_glyph (glyph_index);
+    (void) buffer->replace_glyph (glyph_index);
   }
   void replace_glyph_inplace (hb_codepoint_t glyph_index) const
   {
@@ -689,19 +774,19 @@ struct hb_ot_apply_context_t :
                                    unsigned int class_guess) const
   {
     _set_glyph_class (glyph_index, class_guess, true);
-    buffer->replace_glyph (glyph_index);
+    (void) buffer->replace_glyph (glyph_index);
   }
   void output_glyph_for_component (hb_codepoint_t glyph_index,
                                   unsigned int class_guess) const
   {
     _set_glyph_class (glyph_index, class_guess, false, true);
-    buffer->output_glyph (glyph_index);
+    (void) buffer->output_glyph (glyph_index);
   }
 };
 
 
 struct hb_get_subtables_context_t :
-       hb_dispatch_context_t<hb_get_subtables_context_t, hb_empty_t, HB_DEBUG_APPLY>
+       hb_dispatch_context_t<hb_get_subtables_context_t>
 {
   template <typename Type>
   static inline bool apply_to (const void *obj, OT::hb_ot_apply_context_t *c)
@@ -737,7 +822,6 @@ struct hb_get_subtables_context_t :
   typedef hb_vector_t<hb_applicable_t> array_t;
 
   /* Dispatch interface. */
-  const char *get_name () { return "GET_SUBTABLES"; }
   template <typename T>
   return_t dispatch (const T &obj)
   {
@@ -748,23 +832,23 @@ struct hb_get_subtables_context_t :
   static return_t default_return_value () { return hb_empty_t (); }
 
   hb_get_subtables_context_t (array_t &array_) :
-                             array (array_),
-                             debug_depth (0) {}
+                             array (array_) {}
 
   array_t &array;
-  unsigned int debug_depth;
 };
 
 
 
 
 typedef bool (*intersects_func_t) (const hb_set_t *glyphs, const HBUINT16 &value, const void *data);
+typedef void (*intersected_glyphs_func_t) (const hb_set_t *glyphs, const void *data, unsigned value, hb_set_t *intersected_glyphs);
 typedef void (*collect_glyphs_func_t) (hb_set_t *glyphs, const HBUINT16 &value, const void *data);
 typedef bool (*match_func_t) (hb_codepoint_t glyph_id, const HBUINT16 &value, const void *data);
 
 struct ContextClosureFuncs
 {
   intersects_func_t intersects;
+  intersected_glyphs_func_t intersected_glyphs;
 };
 struct ContextCollectGlyphsFuncs
 {
@@ -787,10 +871,29 @@ static inline bool intersects_class (const hb_set_t *glyphs, const HBUINT16 &val
 }
 static inline bool intersects_coverage (const hb_set_t *glyphs, const HBUINT16 &value, const void *data)
 {
-  const OffsetTo<Coverage> &coverage = (const OffsetTo<Coverage>&)value;
+  const Offset16To<Coverage> &coverage = (const Offset16To<Coverage>&)value;
   return (data+coverage).intersects (glyphs);
 }
 
+
+static inline void intersected_glyph (const hb_set_t *glyphs HB_UNUSED, const void *data, unsigned value, hb_set_t *intersected_glyphs)
+{
+  unsigned g = reinterpret_cast<const HBUINT16 *>(data)[value];
+  intersected_glyphs->add (g);
+}
+static inline void intersected_class_glyphs (const hb_set_t *glyphs, const void *data, unsigned value, hb_set_t *intersected_glyphs)
+{
+  const ClassDef &class_def = *reinterpret_cast<const ClassDef *>(data);
+  class_def.intersected_class_glyphs (glyphs, value, intersected_glyphs);
+}
+static inline void intersected_coverage_glyphs (const hb_set_t *glyphs, const void *data, unsigned value, hb_set_t *intersected_glyphs)
+{
+  Offset16To<Coverage> coverage;
+  coverage = value;
+  (data+coverage).intersected_coverage_glyphs (glyphs, intersected_glyphs);
+}
+
+
 static inline bool array_is_subset_of (const hb_set_t *glyphs,
                                       unsigned int count,
                                       const HBUINT16 values[],
@@ -814,7 +917,7 @@ static inline void collect_class (hb_set_t *glyphs, const HBUINT16 &value, const
 }
 static inline void collect_coverage (hb_set_t *glyphs, const HBUINT16 &value, const void *data)
 {
-  const OffsetTo<Coverage> &coverage = (const OffsetTo<Coverage>&)value;
+  const Offset16To<Coverage> &coverage = (const Offset16To<Coverage>&)value;
   (data+coverage).collect_coverage (glyphs);
 }
 static inline void collect_array (hb_collect_glyphs_context_t *c HB_UNUSED,
@@ -842,7 +945,7 @@ static inline bool match_class (hb_codepoint_t glyph_id, const HBUINT16 &value,
 }
 static inline bool match_coverage (hb_codepoint_t glyph_id, const HBUINT16 &value, const void *data)
 {
-  const OffsetTo<Coverage> &coverage = (const OffsetTo<Coverage>&)value;
+  const Offset16To<Coverage> &coverage = (const Offset16To<Coverage>&)value;
   return (data+coverage).get_coverage (glyph_id) != NOT_COVERED;
 }
 
@@ -866,7 +969,7 @@ static inline bool match_input (hb_ot_apply_context_t *c,
                                const HBUINT16 input[], /* Array of input values--start with second glyph */
                                match_func_t match_func,
                                const void *match_data,
-                               unsigned int *end_offset,
+                               unsigned int *end_position,
                                unsigned int match_positions[HB_MAX_CONTEXT_LENGTH],
                                unsigned int *p_total_component_count = nullptr)
 {
@@ -919,7 +1022,12 @@ static inline bool match_input (hb_ot_apply_context_t *c,
   match_positions[0] = buffer->idx;
   for (unsigned int i = 1; i < count; i++)
   {
-    if (!skippy_iter.next ()) return_trace (false);
+    unsigned unsafe_to;
+    if (!skippy_iter.next (&unsafe_to))
+    {
+      *end_position = unsafe_to;
+      return_trace (false);
+    }
 
     match_positions[i] = skippy_iter.idx;
 
@@ -973,7 +1081,7 @@ static inline bool match_input (hb_ot_apply_context_t *c,
     total_component_count += _hb_glyph_info_get_lig_num_comps (&buffer->info[skippy_iter.idx]);
   }
 
-  *end_offset = skippy_iter.idx - buffer->idx + 1;
+  *end_position = skippy_iter.idx + 1;
 
   if (p_total_component_count)
     *p_total_component_count = total_component_count;
@@ -983,7 +1091,7 @@ static inline bool match_input (hb_ot_apply_context_t *c,
 static inline bool ligate_input (hb_ot_apply_context_t *c,
                                 unsigned int count, /* Including the first glyph */
                                 const unsigned int match_positions[HB_MAX_CONTEXT_LENGTH], /* Including the first glyph */
-                                unsigned int match_length,
+                                unsigned int match_end,
                                 hb_codepoint_t lig_glyph,
                                 unsigned int total_component_count)
 {
@@ -991,7 +1099,7 @@ static inline bool ligate_input (hb_ot_apply_context_t *c,
 
   hb_buffer_t *buffer = c->buffer;
 
-  buffer->merge_clusters (buffer->idx, buffer->idx + match_length);
+  buffer->merge_clusters (buffer->idx, match_end);
 
   /* - If a base and one or more marks ligate, consider that as a base, NOT
    *   ligature, such that all following marks can still attach to it.
@@ -1065,7 +1173,7 @@ static inline bool ligate_input (hb_ot_apply_context_t *c,
                                    hb_min (this_comp, last_num_components);
          _hb_glyph_info_set_lig_props_for_mark (&buffer->cur(), lig_id, new_lig_comp);
       }
-      buffer->next_glyph ();
+      (void) buffer->next_glyph ();
     }
 
     last_lig_id = _hb_glyph_info_get_lig_id (&buffer->cur());
@@ -1108,11 +1216,16 @@ static inline bool match_backtrack (hb_ot_apply_context_t *c,
   skippy_iter.set_match_func (match_func, match_data, backtrack);
 
   for (unsigned int i = 0; i < count; i++)
-    if (!skippy_iter.prev ())
+  {
+    unsigned unsafe_from;
+    if (!skippy_iter.prev (&unsafe_from))
+    {
+      *match_start = unsafe_from;
       return_trace (false);
+    }
+  }
 
   *match_start = skippy_iter.idx;
-
   return_trace (true);
 }
 
@@ -1121,21 +1234,26 @@ static inline bool match_lookahead (hb_ot_apply_context_t *c,
                                    const HBUINT16 lookahead[],
                                    match_func_t match_func,
                                    const void *match_data,
-                                   unsigned int offset,
+                                   unsigned int start_index,
                                    unsigned int *end_index)
 {
   TRACE_APPLY (nullptr);
 
   hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_context;
-  skippy_iter.reset (c->buffer->idx + offset - 1, count);
+  skippy_iter.reset (start_index - 1, count);
   skippy_iter.set_match_func (match_func, match_data, lookahead);
 
   for (unsigned int i = 0; i < count; i++)
-    if (!skippy_iter.next ())
+  {
+    unsigned unsafe_to;
+    if (!skippy_iter.next (&unsafe_to))
+    {
+      *end_index = unsafe_to;
       return_trace (false);
+    }
+  }
 
   *end_index = skippy_iter.idx + 1;
-
   return_trace (true);
 }
 
@@ -1143,15 +1261,14 @@ static inline bool match_lookahead (hb_ot_apply_context_t *c,
 
 struct LookupRecord
 {
-  LookupRecord* copy (hb_serialize_context_t *c,
-                     const hb_map_t         *lookup_map) const
+  bool serialize (hb_serialize_context_t *c,
+                 const hb_map_t         *lookup_map) const
   {
     TRACE_SERIALIZE (this);
     auto *out = c->embed (*this);
-    if (unlikely (!out)) return_trace (nullptr);
+    if (unlikely (!out)) return_trace (false);
 
-    out->lookupListIndex = hb_map_get (lookup_map, lookupListIndex);
-    return_trace (out);
+    return_trace (c->check_assign (out->lookupListIndex, lookup_map->get (lookupListIndex), HB_SERIALIZE_ERROR_INT_OVERFLOW));
   }
 
   bool sanitize (hb_sanitize_context_t *c) const
@@ -1168,24 +1285,110 @@ struct LookupRecord
   DEFINE_SIZE_STATIC (4);
 };
 
+static unsigned serialize_lookuprecord_array (hb_serialize_context_t *c,
+                                             const hb_array_t<const LookupRecord> lookupRecords,
+                                             const hb_map_t *lookup_map)
+{
+  unsigned count = 0;
+  for (const LookupRecord& r : lookupRecords)
+  {
+    if (!lookup_map->has (r.lookupListIndex))
+      continue;
+
+    if (!r.serialize (c, lookup_map))
+      return 0;
+
+    count++;
+  }
+  return count;
+}
+
+enum ContextFormat { SimpleContext = 1, ClassBasedContext = 2, CoverageBasedContext = 3 };
+
+static void context_closure_recurse_lookups (hb_closure_context_t *c,
+                                            unsigned inputCount, const HBUINT16 input[],
+                                            unsigned lookupCount,
+                                            const LookupRecord lookupRecord[] /* Array of LookupRecords--in design order */,
+                                            unsigned value,
+                                            ContextFormat context_format,
+                                            const void *data,
+                                            intersected_glyphs_func_t intersected_glyphs_func)
+{
+  hb_set_t *covered_seq_indicies = hb_set_create ();
+  for (unsigned int i = 0; i < lookupCount; i++)
+  {
+    unsigned seqIndex = lookupRecord[i].sequenceIndex;
+    if (seqIndex >= inputCount) continue;
+
+    bool has_pos_glyphs = false;
+    hb_set_t pos_glyphs;
+
+    if (hb_set_is_empty (covered_seq_indicies) || !hb_set_has (covered_seq_indicies, seqIndex))
+    {
+      has_pos_glyphs = true;
+      if (seqIndex == 0)
+      {
+        switch (context_format) {
+        case ContextFormat::SimpleContext:
+          pos_glyphs.add (value);
+          break;
+        case ContextFormat::ClassBasedContext:
+          intersected_glyphs_func (&c->parent_active_glyphs (), data, value, &pos_glyphs);
+          break;
+        case ContextFormat::CoverageBasedContext:
+          pos_glyphs.set (c->parent_active_glyphs ());
+          break;
+        }
+      }
+      else
+      {
+        const void *input_data = input;
+        unsigned input_value = seqIndex - 1;
+        if (context_format != ContextFormat::SimpleContext)
+        {
+          input_data = data;
+          input_value = input[seqIndex - 1];
+        }
+
+        intersected_glyphs_func (c->glyphs, input_data, input_value, &pos_glyphs);
+      }
+    }
+
+    covered_seq_indicies->add (seqIndex);
+    if (has_pos_glyphs) {
+      c->push_cur_active_glyphs () = pos_glyphs;
+    } else {
+      c->push_cur_active_glyphs ().set (*c->glyphs);
+    }
+
+    unsigned endIndex = inputCount;
+    if (context_format == ContextFormat::CoverageBasedContext)
+      endIndex += 1;
+
+    c->recurse (lookupRecord[i].lookupListIndex, covered_seq_indicies, seqIndex, endIndex);
+
+    c->pop_cur_done_glyphs ();
+  }
+
+  hb_set_destroy (covered_seq_indicies);
+}
+
 template <typename context_t>
 static inline void recurse_lookups (context_t *c,
-                                   unsigned int lookupCount,
-                                   const LookupRecord lookupRecord[] /* Array of LookupRecords--in design order */)
+                                    unsigned int lookupCount,
+                                    const LookupRecord lookupRecord[] /* Array of LookupRecords--in design order */)
 {
   for (unsigned int i = 0; i < lookupCount; i++)
     c->recurse (lookupRecord[i].lookupListIndex);
 }
 
-static inline bool apply_lookup (hb_ot_apply_context_t *c,
+static inline void apply_lookup (hb_ot_apply_context_t *c,
                                 unsigned int count, /* Including the first glyph */
                                 unsigned int match_positions[HB_MAX_CONTEXT_LENGTH], /* Including the first glyph */
                                 unsigned int lookupCount,
                                 const LookupRecord lookupRecord[], /* Array of LookupRecords--in design order */
-                                unsigned int match_length)
+                                unsigned int match_end)
 {
-  TRACE_APPLY (nullptr);
-
   hb_buffer_t *buffer = c->buffer;
   int end;
 
@@ -1193,7 +1396,7 @@ static inline bool apply_lookup (hb_ot_apply_context_t *c,
    * Adjust. */
   {
     unsigned int bl = buffer->backtrack_len ();
-    end = bl + match_length;
+    end = bl + match_end - buffer->idx;
 
     int delta = bl - buffer->idx;
     /* Convert positions to new indexing. */
@@ -1209,7 +1412,7 @@ static inline bool apply_lookup (hb_ot_apply_context_t *c,
 
     /* Don't recurse to ourself at same position.
      * Note that this test is too naive, it doesn't catch longer loops. */
-    if (idx == 0 && lookupRecord[i].lookupListIndex == c->lookup_index)
+    if (unlikely (idx == 0 && lookupRecord[i].lookupListIndex == c->lookup_index))
       continue;
 
     if (unlikely (!buffer->move_to (match_positions[idx])))
@@ -1247,7 +1450,8 @@ static inline bool apply_lookup (hb_ot_apply_context_t *c,
      *     mean that n match positions where removed, as there might
      *     have been marks and default-ignorables in the sequence.  We
      *     should instead drop match positions between current-position
-     *     and current-position + n instead.
+     *     and current-position + n instead. Though, am not sure which
+     *     one is better. Both cases have valid uses. Sigh.
      *
      * It should be possible to construct tests for both of these cases.
      */
@@ -1293,9 +1497,7 @@ static inline bool apply_lookup (hb_ot_apply_context_t *c,
       match_positions[next] += delta;
   }
 
-  buffer->move_to (end);
-
-  return_trace (true);
+  (void) buffer->move_to (end);
 }
 
 
@@ -1305,6 +1507,7 @@ static inline bool apply_lookup (hb_ot_apply_context_t *c,
 struct ContextClosureLookupContext
 {
   ContextClosureFuncs funcs;
+  ContextFormat context_format;
   const void *intersects_data;
 };
 
@@ -1335,13 +1538,19 @@ static inline void context_closure_lookup (hb_closure_context_t *c,
                                           const HBUINT16 input[], /* Array of input values--start with second glyph */
                                           unsigned int lookupCount,
                                           const LookupRecord lookupRecord[],
+                                          unsigned value, /* Index of first glyph in Coverage or Class value in ClassDef table */
                                           ContextClosureLookupContext &lookup_context)
 {
   if (context_intersects (c->glyphs,
                          inputCount, input,
                          lookup_context))
-    recurse_lookups (c,
-                    lookupCount, lookupRecord);
+    context_closure_recurse_lookups (c,
+                                    inputCount, input,
+                                    lookupCount, lookupRecord,
+                                    value,
+                                    lookup_context.context_format,
+                                    lookup_context.intersects_data,
+                                    lookup_context.funcs.intersected_glyphs);
 }
 
 static inline void context_collect_glyphs_lookup (hb_collect_glyphs_context_t *c,
@@ -1376,17 +1585,25 @@ static inline bool context_apply_lookup (hb_ot_apply_context_t *c,
                                         const LookupRecord lookupRecord[],
                                         ContextApplyLookupContext &lookup_context)
 {
-  unsigned int match_length = 0;
-  unsigned int match_positions[HB_MAX_CONTEXT_LENGTH];
-  return match_input (c,
-                     inputCount, input,
-                     lookup_context.funcs.match, lookup_context.match_data,
-                     &match_length, match_positions)
-      && (c->buffer->unsafe_to_break (c->buffer->idx, c->buffer->idx + match_length),
-         apply_lookup (c,
-                      inputCount, match_positions,
-                      lookupCount, lookupRecord,
-                      match_length));
+  unsigned match_end = 0;
+  unsigned match_positions[HB_MAX_CONTEXT_LENGTH];
+  if (match_input (c,
+                  inputCount, input,
+                  lookup_context.funcs.match, lookup_context.match_data,
+                  &match_end, match_positions))
+  {
+    c->buffer->unsafe_to_break (c->buffer->idx, match_end);
+    apply_lookup (c,
+                 inputCount, match_positions,
+                 lookupCount, lookupRecord,
+                 match_end);
+    return true;
+  }
+  else
+  {
+    c->buffer->unsafe_to_concat (c->buffer->idx, match_end);
+    return false;
+  }
 }
 
 struct Rule
@@ -1398,7 +1615,7 @@ struct Rule
                               lookup_context);
   }
 
-  void closure (hb_closure_context_t *c, ContextClosureLookupContext &lookup_context) const
+  void closure (hb_closure_context_t *c, unsigned value, ContextClosureLookupContext &lookup_context) const
   {
     if (unlikely (c->lookup_limit_exceeded ())) return;
 
@@ -1407,12 +1624,14 @@ struct Rule
     context_closure_lookup (c,
                            inputCount, inputZ.arrayZ,
                            lookupCount, lookupRecord.arrayZ,
-                           lookup_context);
+                           value, lookup_context);
   }
 
-  void closure_lookups (hb_closure_lookups_context_t *c) const
+  void closure_lookups (hb_closure_lookups_context_t *c,
+                        ContextClosureLookupContext &lookup_context) const
   {
     if (unlikely (c->lookup_limit_exceeded ())) return;
+    if (!intersects (c->glyphs, lookup_context)) return;
 
     const UnsizedArrayOf<LookupRecord> &lookupRecord = StructAfter<UnsizedArrayOf<LookupRecord>>
                                                       (inputZ.as_array (inputCount ? inputCount - 1 : 0));
@@ -1459,8 +1678,6 @@ struct Rule
     if (unlikely (!c->extend_min (out))) return_trace (false);
 
     out->inputCount = inputCount;
-    out->lookupCount = lookupCount;
-
     const hb_array_t<const HBUINT16> input = inputZ.as_array (inputCount - 1);
     for (const auto org : input)
     {
@@ -1470,11 +1687,10 @@ struct Rule
     }
 
     const UnsizedArrayOf<LookupRecord> &lookupRecord = StructAfter<UnsizedArrayOf<LookupRecord>>
-                                                       (inputZ.as_array ((inputCount ? inputCount - 1 : 0)));
-    for (unsigned i = 0; i < (unsigned) lookupCount; i++)
-      c->copy (lookupRecord[i], lookup_map);
+                                                      (inputZ.as_array ((inputCount ? inputCount - 1 : 0)));
 
-    return_trace (true);
+    unsigned count = serialize_lookuprecord_array (c, lookupRecord.as_array (lookupCount), lookup_map);
+    return_trace (c->check_assign (out->lookupCount, count, HB_SERIALIZE_ERROR_INT_OVERFLOW));
   }
 
   bool subset (hb_subset_context_t *c,
@@ -1482,9 +1698,8 @@ struct Rule
               const hb_map_t *klass_map = nullptr) const
   {
     TRACE_SUBSET (this);
-
-    const hb_array_t<const HBUINT16> input = inputZ.as_array ((inputCount ? inputCount - 1 : 0));
-    if (!input.length) return_trace (false);
+    if (unlikely (!inputCount)) return_trace (false);
+    const hb_array_t<const HBUINT16> input = inputZ.as_array (inputCount - 1);
 
     const hb_map_t *mapping = klass_map == nullptr ? c->plan->glyph_map : klass_map;
     if (!hb_all (input, mapping)) return_trace (false);
@@ -1530,7 +1745,7 @@ struct RuleSet
     ;
   }
 
-  void closure (hb_closure_context_t *c,
+  void closure (hb_closure_context_t *c, unsigned value,
                ContextClosureLookupContext &lookup_context) const
   {
     if (unlikely (c->lookup_limit_exceeded ())) return;
@@ -1538,18 +1753,17 @@ struct RuleSet
     return
     + hb_iter (rule)
     | hb_map (hb_add (this))
-    | hb_apply ([&] (const Rule &_) { _.closure (c, lookup_context); })
+    | hb_apply ([&] (const Rule &_) { _.closure (c, value, lookup_context); })
     ;
   }
 
-  void closure_lookups (hb_closure_lookups_context_t *c) const
+  void closure_lookups (hb_closure_lookups_context_t *c,
+                        ContextClosureLookupContext &lookup_context) const
   {
     if (unlikely (c->lookup_limit_exceeded ())) return;
-
-    return
     + hb_iter (rule)
     | hb_map (hb_add (this))
-    | hb_apply ([&] (const Rule &_) { _.closure_lookups (c); })
+    | hb_apply ([&] (const Rule &_) { _.closure_lookups (c, lookup_context); })
     ;
   }
 
@@ -1597,17 +1811,17 @@ struct RuleSet
     auto *out = c->serializer->start_embed (*this);
     if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
 
-    for (const OffsetTo<Rule>& _ : rule)
+    for (const Offset16To<Rule>& _ : rule)
     {
       if (!_) continue;
+      auto o_snap = c->serializer->snapshot ();
       auto *o = out->rule.serialize_append (c->serializer);
       if (unlikely (!o)) continue;
 
-      auto o_snap = c->serializer->snapshot ();
       if (!o->serialize_subset (c, _, this, lookup_map, klass_map))
       {
-        out->rule.pop ();
-        c->serializer->revert (o_snap);
+       out->rule.pop ();
+       c->serializer->revert (o_snap);
       }
     }
 
@@ -1624,7 +1838,7 @@ struct RuleSet
   }
 
   protected:
-  OffsetArrayOf<Rule>
+  Array16OfOffset16To<Rule>
                rule;                   /* Array of Rule tables
                                         * ordered by preference */
   public:
@@ -1637,7 +1851,8 @@ struct ContextFormat1
   bool intersects (const hb_set_t *glyphs) const
   {
     struct ContextClosureLookupContext lookup_context = {
-      {intersects_glyph},
+      {intersects_glyph, intersected_glyph},
+      ContextFormat::SimpleContext,
       nullptr
     };
 
@@ -1651,26 +1866,45 @@ struct ContextFormat1
     ;
   }
 
+  bool may_have_non_1to1 () const
+  { return true; }
+
   void closure (hb_closure_context_t *c) const
   {
+    hb_set_t* cur_active_glyphs = &c->push_cur_active_glyphs ();
+    get_coverage ().intersected_coverage_glyphs (&c->previous_parent_active_glyphs (),
+                                                 cur_active_glyphs);
+
     struct ContextClosureLookupContext lookup_context = {
-      {intersects_glyph},
+      {intersects_glyph, intersected_glyph},
+      ContextFormat::SimpleContext,
       nullptr
     };
 
-    + hb_zip (this+coverage, ruleSet)
-    | hb_filter (*c->glyphs, hb_first)
-    | hb_map (hb_second)
-    | hb_map (hb_add (this))
-    | hb_apply ([&] (const RuleSet &_) { _.closure (c, lookup_context); })
+    + hb_zip (this+coverage, hb_range ((unsigned) ruleSet.len))
+    | hb_filter ([&] (hb_codepoint_t _) {
+      return c->previous_parent_active_glyphs ().has (_);
+    }, hb_first)
+    | hb_map ([&](const hb_pair_t<hb_codepoint_t, unsigned> _) { return hb_pair_t<unsigned, const RuleSet&> (_.first, this+ruleSet[_.second]); })
+    | hb_apply ([&] (const hb_pair_t<unsigned, const RuleSet&>& _) { _.second.closure (c, _.first, lookup_context); })
     ;
+
+    c->pop_cur_done_glyphs ();
   }
 
   void closure_lookups (hb_closure_lookups_context_t *c) const
   {
-    + hb_iter (ruleSet)
+    struct ContextClosureLookupContext lookup_context = {
+      {intersects_glyph, intersected_glyph},
+      ContextFormat::SimpleContext,
+      nullptr
+    };
+
+    + hb_zip (this+coverage, ruleSet)
+    | hb_filter (*c->glyphs, hb_first)
+    | hb_map (hb_second)
     | hb_map (hb_add (this))
-    | hb_apply ([&] (const RuleSet &_) { _.closure_lookups (c); })
+    | hb_apply ([&] (const RuleSet &_) { _.closure_lookups (c, lookup_context); })
     ;
   }
 
@@ -1721,7 +1955,7 @@ struct ContextFormat1
   bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
-    const hb_set_t &glyphset = *c->plan->glyphset ();
+    const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
     const hb_map_t &glyph_map = *c->plan->glyph_map;
 
     auto *out = c->serializer->start_embed (*this);
@@ -1738,8 +1972,7 @@ struct ContextFormat1
     | hb_sink (new_coverage)
     ;
 
-    out->coverage.serialize (c->serializer, out)
-                 .serialize (c->serializer, new_coverage.iter ());
+    out->coverage.serialize_serialize (c->serializer, new_coverage.iter ());
     return_trace (bool (new_coverage));
   }
 
@@ -1751,10 +1984,10 @@ struct ContextFormat1
 
   protected:
   HBUINT16     format;                 /* Format identifier--format = 1 */
-  OffsetTo<Coverage>
+  Offset16To<Coverage>
                coverage;               /* Offset to Coverage table--from
                                         * beginning of table */
-  OffsetArrayOf<RuleSet>
+  Array16OfOffset16To<RuleSet>
                ruleSet;                /* Array of RuleSet tables
                                         * ordered by Coverage Index */
   public:
@@ -1772,48 +2005,85 @@ struct ContextFormat2
     const ClassDef &class_def = this+classDef;
 
     struct ContextClosureLookupContext lookup_context = {
-      {intersects_class},
+      {intersects_class, intersected_class_glyphs},
+      ContextFormat::ClassBasedContext,
       &class_def
     };
 
+    hb_set_t retained_coverage_glyphs;
+    (this+coverage).intersected_coverage_glyphs (glyphs, &retained_coverage_glyphs);
+
+    hb_set_t coverage_glyph_classes;
+    class_def.intersected_classes (&retained_coverage_glyphs, &coverage_glyph_classes);
+
+
     return
-    + hb_enumerate (ruleSet)
-    | hb_map ([&] (const hb_pair_t<unsigned, const OffsetTo<RuleSet> &> p)
+    + hb_iter (ruleSet)
+    | hb_map (hb_add (this))
+    | hb_enumerate
+    | hb_map ([&] (const hb_pair_t<unsigned, const RuleSet &> p)
              { return class_def.intersects_class (glyphs, p.first) &&
-                      (this+p.second).intersects (glyphs, lookup_context); })
+                      coverage_glyph_classes.has (p.first) &&
+                      p.second.intersects (glyphs, lookup_context); })
     | hb_any
     ;
   }
 
+  bool may_have_non_1to1 () const
+  { return true; }
+
   void closure (hb_closure_context_t *c) const
   {
     if (!(this+coverage).intersects (c->glyphs))
       return;
 
+    hb_set_t* cur_active_glyphs = &c->push_cur_active_glyphs ();
+    get_coverage ().intersected_coverage_glyphs (&c->previous_parent_active_glyphs (),
+                                                 cur_active_glyphs);
+
     const ClassDef &class_def = this+classDef;
 
     struct ContextClosureLookupContext lookup_context = {
-      {intersects_class},
+      {intersects_class, intersected_class_glyphs},
+      ContextFormat::ClassBasedContext,
       &class_def
     };
 
-    return
     + hb_enumerate (ruleSet)
     | hb_filter ([&] (unsigned _)
-                { return class_def.intersects_class (c->glyphs, _); },
+    { return class_def.intersects_class (&c->parent_active_glyphs (), _); },
                 hb_first)
-    | hb_map (hb_second)
-    | hb_map (hb_add (this))
-    | hb_apply ([&] (const RuleSet &_) { _.closure (c, lookup_context); })
+    | hb_apply ([&] (const hb_pair_t<unsigned, const Offset16To<RuleSet>&> _)
+                {
+                  const RuleSet& rule_set = this+_.second;
+                  rule_set.closure (c, _.first, lookup_context);
+                })
     ;
+
+    c->pop_cur_done_glyphs ();
   }
 
   void closure_lookups (hb_closure_lookups_context_t *c) const
   {
+    if (!(this+coverage).intersects (c->glyphs))
+      return;
+
+    const ClassDef &class_def = this+classDef;
+
+    struct ContextClosureLookupContext lookup_context = {
+      {intersects_class, intersected_class_glyphs},
+      ContextFormat::ClassBasedContext,
+      &class_def
+    };
+
     + hb_iter (ruleSet)
     | hb_map (hb_add (this))
-    | hb_apply ([&] (const RuleSet &_) { _.closure_lookups (c); })
-    ;
+    | hb_enumerate
+    | hb_filter ([&] (const hb_pair_t<unsigned, const RuleSet &> p)
+    { return class_def.intersects_class (c->glyphs, p.first); })
+    | hb_map (hb_second)
+    | hb_apply ([&] (const RuleSet & _)
+    { _.closure_lookups (c, lookup_context); });
   }
 
   void collect_variation_indices (hb_collect_variation_indices_context_t *c) const {}
@@ -1876,26 +2146,34 @@ struct ContextFormat2
     hb_map_t klass_map;
     out->classDef.serialize_subset (c, classDef, this, &klass_map);
 
+    const hb_set_t* glyphset = c->plan->glyphset_gsub ();
+    hb_set_t retained_coverage_glyphs;
+    (this+coverage).intersected_coverage_glyphs (glyphset, &retained_coverage_glyphs);
+
+    hb_set_t coverage_glyph_classes;
+    (this+classDef).intersected_classes (&retained_coverage_glyphs, &coverage_glyph_classes);
+
     const hb_map_t *lookup_map = c->table_tag == HB_OT_TAG_GSUB ? c->plan->gsub_lookups : c->plan->gpos_lookups;
     bool ret = true;
-    unsigned non_zero_index = 0, index = 0;
-    for (const hb_pair_t<unsigned, const OffsetTo<RuleSet>&> _ : + hb_enumerate (ruleSet)
-                                                                | hb_filter (klass_map, hb_first))
+    int non_zero_index = -1, index = 0;
+    for (const auto& _ : + hb_enumerate (ruleSet)
+                        | hb_filter (klass_map, hb_first))
     {
       auto *o = out->ruleSet.serialize_append (c->serializer);
       if (unlikely (!o))
       {
-        ret = false;
-        break;
+       ret = false;
+       break;
       }
 
-      if (o->serialize_subset (c, _.second, this, lookup_map, &klass_map))
-        non_zero_index = index;
+      if (coverage_glyph_classes.has (_.first) &&
+         o->serialize_subset (c, _.second, this, lookup_map, &klass_map))
+       non_zero_index = index;
 
       index++;
     }
 
-    if (!ret) return_trace (ret);
+    if (!ret || non_zero_index == -1) return_trace (false);
 
     //prune empty trailing ruleSets
     --index;
@@ -1916,13 +2194,13 @@ struct ContextFormat2
 
   protected:
   HBUINT16     format;                 /* Format identifier--format = 2 */
-  OffsetTo<Coverage>
+  Offset16To<Coverage>
                coverage;               /* Offset to Coverage table--from
                                         * beginning of table */
-  OffsetTo<ClassDef>
+  Offset16To<ClassDef>
                classDef;               /* Offset to glyph ClassDef table--from
                                         * beginning of table */
-  OffsetArrayOf<RuleSet>
+  Array16OfOffset16To<RuleSet>
                ruleSet;                /* Array of RuleSet tables
                                         * ordered by class */
   public:
@@ -1938,7 +2216,8 @@ struct ContextFormat3
       return false;
 
     struct ContextClosureLookupContext lookup_context = {
-      {intersects_coverage},
+      {intersects_coverage, intersected_coverage_glyphs},
+      ContextFormat::CoverageBasedContext,
       this
     };
     return context_intersects (glyphs,
@@ -1946,24 +2225,37 @@ struct ContextFormat3
                               lookup_context);
   }
 
+  bool may_have_non_1to1 () const
+  { return true; }
+
   void closure (hb_closure_context_t *c) const
   {
     if (!(this+coverageZ[0]).intersects (c->glyphs))
       return;
 
+    hb_set_t* cur_active_glyphs = &c->push_cur_active_glyphs ();
+    get_coverage ().intersected_coverage_glyphs (&c->previous_parent_active_glyphs (),
+                                                 cur_active_glyphs);
+
+
     const LookupRecord *lookupRecord = &StructAfter<LookupRecord> (coverageZ.as_array (glyphCount));
     struct ContextClosureLookupContext lookup_context = {
-      {intersects_coverage},
+      {intersects_coverage, intersected_coverage_glyphs},
+      ContextFormat::CoverageBasedContext,
       this
     };
     context_closure_lookup (c,
                            glyphCount, (const HBUINT16 *) (coverageZ.arrayZ + 1),
                            lookupCount, lookupRecord,
-                           lookup_context);
+                           0, lookup_context);
+
+    c->pop_cur_done_glyphs ();
   }
 
   void closure_lookups (hb_closure_lookups_context_t *c) const
   {
+    if (!intersects (c->glyphs))
+      return;
     const LookupRecord *lookupRecord = &StructAfter<LookupRecord> (coverageZ.as_array (glyphCount));
     recurse_lookups (c, lookupCount, lookupRecord);
   }
@@ -2023,23 +2315,23 @@ struct ContextFormat3
 
     out->format = format;
     out->glyphCount = glyphCount;
-    out->lookupCount = lookupCount;
 
-    const hb_array_t<const OffsetTo<Coverage>> coverages = coverageZ.as_array (glyphCount);
+    auto coverages = coverageZ.as_array (glyphCount);
 
-    for (const OffsetTo<Coverage>& offset : coverages)
+    for (const Offset16To<Coverage>& offset : coverages)
     {
-      auto *o = c->serializer->allocate_size<OffsetTo<Coverage>> (OffsetTo<Coverage>::static_size);
+      /* TODO(subset) This looks like should not be necessary to write this way. */
+      auto *o = c->serializer->allocate_size<Offset16To<Coverage>> (Offset16To<Coverage>::static_size);
       if (unlikely (!o)) return_trace (false);
       if (!o->serialize_subset (c, offset, this)) return_trace (false);
     }
 
-    const LookupRecord *lookupRecord = &StructAfter<LookupRecord> (coverageZ.as_array (glyphCount));
+    const UnsizedArrayOf<LookupRecord>& lookupRecord = StructAfter<UnsizedArrayOf<LookupRecord>> (coverageZ.as_array (glyphCount));
     const hb_map_t *lookup_map = c->table_tag == HB_OT_TAG_GSUB ? c->plan->gsub_lookups : c->plan->gpos_lookups;
-    for (unsigned i = 0; i < (unsigned) lookupCount; i++)
-      c->serializer->copy (lookupRecord[i], lookup_map);
 
-    return_trace (true);
+
+    unsigned count = serialize_lookuprecord_array (c->serializer, lookupRecord.as_array (lookupCount), lookup_map);
+    return_trace (c->serializer->check_assign (out->lookupCount, count, HB_SERIALIZE_ERROR_INT_OVERFLOW));
   }
 
   bool sanitize (hb_sanitize_context_t *c) const
@@ -2060,7 +2352,7 @@ struct ContextFormat3
   HBUINT16     glyphCount;             /* Number of glyphs in the input glyph
                                         * sequence */
   HBUINT16     lookupCount;            /* Number of LookupRecords */
-  UnsizedArrayOf<OffsetTo<Coverage>>
+  UnsizedArrayOf<Offset16To<Coverage>>
                coverageZ;              /* Array of offsets to Coverage
                                         * table in glyph sequence order */
 /*UnsizedArrayOf<LookupRecord>
@@ -2078,9 +2370,9 @@ struct Context
     TRACE_DISPATCH (this, u.format);
     if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
     switch (u.format) {
-    case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...));
-    case 2: return_trace (c->dispatch (u.format2, hb_forward<Ts> (ds)...));
-    case 3: return_trace (c->dispatch (u.format3, hb_forward<Ts> (ds)...));
+    case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...));
+    case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...));
+    case 3: return_trace (c->dispatch (u.format3, std::forward<Ts> (ds)...));
     default:return_trace (c->default_return_value ());
     }
   }
@@ -2100,6 +2392,7 @@ struct Context
 struct ChainContextClosureLookupContext
 {
   ContextClosureFuncs funcs;
+  ContextFormat context_format;
   const void *intersects_data[3];
 };
 
@@ -2144,6 +2437,7 @@ static inline void chain_context_closure_lookup (hb_closure_context_t *c,
                                                 const HBUINT16 lookahead[],
                                                 unsigned int lookupCount,
                                                 const LookupRecord lookupRecord[],
+                                                unsigned value,
                                                 ChainContextClosureLookupContext &lookup_context)
 {
   if (chain_context_intersects (c->glyphs,
@@ -2151,8 +2445,13 @@ static inline void chain_context_closure_lookup (hb_closure_context_t *c,
                                inputCount, input,
                                lookaheadCount, lookahead,
                                lookup_context))
-    recurse_lookups (c,
-                    lookupCount, lookupRecord);
+    context_closure_recurse_lookups (c,
+                    inputCount, input,
+                    lookupCount, lookupRecord,
+                    value,
+                    lookup_context.context_format,
+                    lookup_context.intersects_data[1],
+                    lookup_context.funcs.intersected_glyphs);
 }
 
 static inline void chain_context_collect_glyphs_lookup (hb_collect_glyphs_context_t *c,
@@ -2207,25 +2506,38 @@ static inline bool chain_context_apply_lookup (hb_ot_apply_context_t *c,
                                               const LookupRecord lookupRecord[],
                                               ChainContextApplyLookupContext &lookup_context)
 {
-  unsigned int start_index = 0, match_length = 0, end_index = 0;
-  unsigned int match_positions[HB_MAX_CONTEXT_LENGTH];
-  return match_input (c,
-                     inputCount, input,
-                     lookup_context.funcs.match, lookup_context.match_data[1],
-                     &match_length, match_positions)
-      && match_backtrack (c,
-                         backtrackCount, backtrack,
-                         lookup_context.funcs.match, lookup_context.match_data[0],
-                         &start_index)
-      && match_lookahead (c,
-                         lookaheadCount, lookahead,
-                         lookup_context.funcs.match, lookup_context.match_data[2],
-                         match_length, &end_index)
-      && (c->buffer->unsafe_to_break_from_outbuffer (start_index, end_index),
-         apply_lookup (c,
-                       inputCount, match_positions,
-                       lookupCount, lookupRecord,
-                       match_length));
+  unsigned end_index = c->buffer->idx;
+  unsigned match_end = 0;
+  unsigned match_positions[HB_MAX_CONTEXT_LENGTH];
+  if (!(match_input (c,
+                    inputCount, input,
+                    lookup_context.funcs.match, lookup_context.match_data[1],
+                    &match_end, match_positions) && (end_index = match_end)
+       && match_lookahead (c,
+                          lookaheadCount, lookahead,
+                          lookup_context.funcs.match, lookup_context.match_data[2],
+                          match_end, &end_index)))
+  {
+    c->buffer->unsafe_to_concat (c->buffer->idx, end_index);
+    return false;
+  }
+
+  unsigned start_index = c->buffer->out_len;
+  if (!match_backtrack (c,
+                       backtrackCount, backtrack,
+                       lookup_context.funcs.match, lookup_context.match_data[0],
+                       &start_index))
+  {
+    c->buffer->unsafe_to_concat_from_outbuffer (start_index, end_index);
+    return false;
+  }
+
+  c->buffer->unsafe_to_break_from_outbuffer (start_index, end_index);
+  apply_lookup (c,
+               inputCount, match_positions,
+               lookupCount, lookupRecord,
+               match_end);
+  return true;
 }
 
 struct ChainRule
@@ -2233,7 +2545,7 @@ struct ChainRule
   bool intersects (const hb_set_t *glyphs, ChainContextClosureLookupContext &lookup_context) const
   {
     const HeadlessArrayOf<HBUINT16> &input = StructAfter<HeadlessArrayOf<HBUINT16>> (backtrack);
-    const ArrayOf<HBUINT16> &lookahead = StructAfter<ArrayOf<HBUINT16>> (input);
+    const Array16Of<HBUINT16> &lookahead = StructAfter<Array16Of<HBUINT16>> (input);
     return chain_context_intersects (glyphs,
                                     backtrack.len, backtrack.arrayZ,
                                     input.lenP1, input.arrayZ,
@@ -2241,29 +2553,32 @@ struct ChainRule
                                     lookup_context);
   }
 
-  void closure (hb_closure_context_t *c,
+  void closure (hb_closure_context_t *c, unsigned value,
                ChainContextClosureLookupContext &lookup_context) const
   {
     if (unlikely (c->lookup_limit_exceeded ())) return;
 
     const HeadlessArrayOf<HBUINT16> &input = StructAfter<HeadlessArrayOf<HBUINT16>> (backtrack);
-    const ArrayOf<HBUINT16> &lookahead = StructAfter<ArrayOf<HBUINT16>> (input);
-    const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord>> (lookahead);
+    const Array16Of<HBUINT16> &lookahead = StructAfter<Array16Of<HBUINT16>> (input);
+    const Array16Of<LookupRecord> &lookup = StructAfter<Array16Of<LookupRecord>> (lookahead);
     chain_context_closure_lookup (c,
                                  backtrack.len, backtrack.arrayZ,
                                  input.lenP1, input.arrayZ,
                                  lookahead.len, lookahead.arrayZ,
                                  lookup.len, lookup.arrayZ,
+                                 value,
                                  lookup_context);
   }
 
-  void closure_lookups (hb_closure_lookups_context_t *c) const
+  void closure_lookups (hb_closure_lookups_context_t *c,
+                        ChainContextClosureLookupContext &lookup_context) const
   {
     if (unlikely (c->lookup_limit_exceeded ())) return;
+    if (!intersects (c->glyphs, lookup_context)) return;
 
     const HeadlessArrayOf<HBUINT16> &input = StructAfter<HeadlessArrayOf<HBUINT16>> (backtrack);
-    const ArrayOf<HBUINT16> &lookahead = StructAfter<ArrayOf<HBUINT16>> (input);
-    const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord>> (lookahead);
+    const Array16Of<HBUINT16> &lookahead = StructAfter<Array16Of<HBUINT16>> (input);
+    const Array16Of<LookupRecord> &lookup = StructAfter<Array16Of<LookupRecord>> (lookahead);
     recurse_lookups (c, lookup.len, lookup.arrayZ);
   }
 
@@ -2271,8 +2586,8 @@ struct ChainRule
                       ChainContextCollectGlyphsLookupContext &lookup_context) const
   {
     const HeadlessArrayOf<HBUINT16> &input = StructAfter<HeadlessArrayOf<HBUINT16>> (backtrack);
-    const ArrayOf<HBUINT16> &lookahead = StructAfter<ArrayOf<HBUINT16>> (input);
-    const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord>> (lookahead);
+    const Array16Of<HBUINT16> &lookahead = StructAfter<Array16Of<HBUINT16>> (input);
+    const Array16Of<LookupRecord> &lookup = StructAfter<Array16Of<LookupRecord>> (lookahead);
     chain_context_collect_glyphs_lookup (c,
                                         backtrack.len, backtrack.arrayZ,
                                         input.lenP1, input.arrayZ,
@@ -2285,8 +2600,8 @@ struct ChainRule
                    ChainContextApplyLookupContext &lookup_context) const
   {
     const HeadlessArrayOf<HBUINT16> &input = StructAfter<HeadlessArrayOf<HBUINT16>> (backtrack);
-    const ArrayOf<HBUINT16> &lookahead = StructAfter<ArrayOf<HBUINT16>> (input);
-    const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord>> (lookahead);
+    const Array16Of<HBUINT16> &lookahead = StructAfter<Array16Of<HBUINT16>> (input);
+    const Array16Of<LookupRecord> &lookup = StructAfter<Array16Of<LookupRecord>> (lookahead);
     return chain_context_would_apply_lookup (c,
                                             backtrack.len, backtrack.arrayZ,
                                             input.lenP1, input.arrayZ,
@@ -2298,8 +2613,8 @@ struct ChainRule
   {
     TRACE_APPLY (this);
     const HeadlessArrayOf<HBUINT16> &input = StructAfter<HeadlessArrayOf<HBUINT16>> (backtrack);
-    const ArrayOf<HBUINT16> &lookahead = StructAfter<ArrayOf<HBUINT16>> (input);
-    const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord>> (lookahead);
+    const Array16Of<HBUINT16> &lookahead = StructAfter<Array16Of<HBUINT16>> (input);
+    const Array16Of<LookupRecord> &lookup = StructAfter<Array16Of<LookupRecord>> (lookahead);
     return_trace (chain_context_apply_lookup (c,
                                              backtrack.len, backtrack.arrayZ,
                                              input.lenP1, input.arrayZ,
@@ -2315,22 +2630,18 @@ struct ChainRule
   {
     c->copy (len);
     for (const auto g : it)
-    {
-      HBUINT16 gid;
-      gid = g;
-      c->copy (gid);
-    }
+      c->copy ((HBUINT16) g);
   }
 
-  ChainRule* copy (hb_serialize_context_t *c,
-                  const hb_map_t *lookup_map,
-                  const hb_map_t *backtrack_map,
-                  const hb_map_t *input_map = nullptr,
-                  const hb_map_t *lookahead_map = nullptr) const
+  bool serialize (hb_serialize_context_t *c,
+                 const hb_map_t *lookup_map,
+                 const hb_map_t *backtrack_map,
+                 const hb_map_t *input_map = nullptr,
+                 const hb_map_t *lookahead_map = nullptr) const
   {
     TRACE_SERIALIZE (this);
     auto *out = c->start_embed (this);
-    if (unlikely (!out)) return_trace (nullptr);
+    if (unlikely (!out)) return_trace (false);
 
     const hb_map_t *mapping = backtrack_map;
     serialize_array (c, backtrack.len, + backtrack.iter ()
@@ -2341,20 +2652,18 @@ struct ChainRule
     serialize_array (c, input.lenP1, + input.iter ()
                                     | hb_map (mapping));
 
-    const ArrayOf<HBUINT16> &lookahead = StructAfter<ArrayOf<HBUINT16>> (input);
+    const Array16Of<HBUINT16> &lookahead = StructAfter<Array16Of<HBUINT16>> (input);
     if (lookahead_map) mapping = lookahead_map;
     serialize_array (c, lookahead.len, + lookahead.iter ()
                                       | hb_map (mapping));
 
-    const ArrayOf<LookupRecord> &lookupRecord = StructAfter<ArrayOf<LookupRecord>> (lookahead);
-    HBUINT16 lookupCount;
-    lookupCount = lookupRecord.len;
-    if (!c->copy (lookupCount)) return_trace (nullptr);
+    const Array16Of<LookupRecord> &lookupRecord = StructAfter<Array16Of<LookupRecord>> (lookahead);
 
-    for (unsigned i = 0; i < (unsigned) lookupCount; i++)
-      if (!c->copy (lookupRecord[i], lookup_map)) return_trace (nullptr);
+    HBUINT16* lookupCount = c->embed (&(lookupRecord.len));
+    if (!lookupCount) return_trace (false);
 
-    return_trace (out);
+    unsigned count = serialize_lookuprecord_array (c, lookupRecord.as_array (), lookup_map);
+    return_trace (c->check_assign (*lookupCount, count, HB_SERIALIZE_ERROR_INT_OVERFLOW));
   }
 
   bool subset (hb_subset_context_t *c,
@@ -2366,17 +2675,17 @@ struct ChainRule
     TRACE_SUBSET (this);
 
     const HeadlessArrayOf<HBUINT16> &input = StructAfter<HeadlessArrayOf<HBUINT16>> (backtrack);
-    const ArrayOf<HBUINT16> &lookahead = StructAfter<ArrayOf<HBUINT16>> (input);
+    const Array16Of<HBUINT16> &lookahead = StructAfter<Array16Of<HBUINT16>> (input);
 
     if (!backtrack_map)
     {
-      const hb_set_t &glyphset = *c->plan->glyphset ();
+      const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
       if (!hb_all (backtrack, glyphset) ||
          !hb_all (input, glyphset) ||
          !hb_all (lookahead, glyphset))
        return_trace (false);
 
-      copy (c->serializer, lookup_map, c->plan->glyph_map);
+      serialize (c->serializer, lookup_map, c->plan->glyph_map);
     }
     else
     {
@@ -2385,7 +2694,7 @@ struct ChainRule
          !hb_all (lookahead, lookahead_map))
        return_trace (false);
 
-      copy (c->serializer, lookup_map, backtrack_map, input_map, lookahead_map);
+      serialize (c->serializer, lookup_map, backtrack_map, input_map, lookahead_map);
     }
 
     return_trace (true);
@@ -2397,24 +2706,24 @@ struct ChainRule
     if (!backtrack.sanitize (c)) return_trace (false);
     const HeadlessArrayOf<HBUINT16> &input = StructAfter<HeadlessArrayOf<HBUINT16>> (backtrack);
     if (!input.sanitize (c)) return_trace (false);
-    const ArrayOf<HBUINT16> &lookahead = StructAfter<ArrayOf<HBUINT16>> (input);
+    const Array16Of<HBUINT16> &lookahead = StructAfter<Array16Of<HBUINT16>> (input);
     if (!lookahead.sanitize (c)) return_trace (false);
-    const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord>> (lookahead);
+    const Array16Of<LookupRecord> &lookup = StructAfter<Array16Of<LookupRecord>> (lookahead);
     return_trace (lookup.sanitize (c));
   }
 
   protected:
-  ArrayOf<HBUINT16>
+  Array16Of<HBUINT16>
                backtrack;              /* Array of backtracking values
                                         * (to be matched before the input
                                         * sequence) */
   HeadlessArrayOf<HBUINT16>
                inputX;                 /* Array of input values (start with
                                         * second glyph) */
-  ArrayOf<HBUINT16>
+  Array16Of<HBUINT16>
                lookaheadX;             /* Array of lookahead values's (to be
                                         * matched after the input sequence) */
-  ArrayOf<LookupRecord>
+  Array16Of<LookupRecord>
                lookupX;                /* Array of LookupRecords--in
                                         * design order) */
   public:
@@ -2432,25 +2741,25 @@ struct ChainRuleSet
     | hb_any
     ;
   }
-  void closure (hb_closure_context_t *c, ChainContextClosureLookupContext &lookup_context) const
+  void closure (hb_closure_context_t *c, unsigned value, ChainContextClosureLookupContext &lookup_context) const
   {
     if (unlikely (c->lookup_limit_exceeded ())) return;
 
     return
     + hb_iter (rule)
     | hb_map (hb_add (this))
-    | hb_apply ([&] (const ChainRule &_) { _.closure (c, lookup_context); })
+    | hb_apply ([&] (const ChainRule &_) { _.closure (c, value, lookup_context); })
     ;
   }
 
-  void closure_lookups (hb_closure_lookups_context_t *c) const
+  void closure_lookups (hb_closure_lookups_context_t *c,
+                        ChainContextClosureLookupContext &lookup_context) const
   {
     if (unlikely (c->lookup_limit_exceeded ())) return;
 
-    return
     + hb_iter (rule)
     | hb_map (hb_add (this))
-    | hb_apply ([&] (const ChainRule &_) { _.closure_lookups (c); })
+    | hb_apply ([&] (const ChainRule &_) { _.closure_lookups (c, lookup_context); })
     ;
   }
 
@@ -2497,13 +2806,13 @@ struct ChainRuleSet
     auto *out = c->serializer->start_embed (*this);
     if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
 
-    for (const OffsetTo<ChainRule>& _ : rule)
+    for (const Offset16To<ChainRule>& _ : rule)
     {
       if (!_) continue;
+      auto o_snap = c->serializer->snapshot ();
       auto *o = out->rule.serialize_append (c->serializer);
       if (unlikely (!o)) continue;
 
-      auto o_snap = c->serializer->snapshot ();
       if (!o->serialize_subset (c, _, this,
                                lookup_map,
                                backtrack_klass_map,
@@ -2528,7 +2837,7 @@ struct ChainRuleSet
   }
 
   protected:
-  OffsetArrayOf<ChainRule>
+  Array16OfOffset16To<ChainRule>
                rule;                   /* Array of ChainRule tables
                                         * ordered by preference */
   public:
@@ -2540,7 +2849,8 @@ struct ChainContextFormat1
   bool intersects (const hb_set_t *glyphs) const
   {
     struct ChainContextClosureLookupContext lookup_context = {
-      {intersects_glyph},
+      {intersects_glyph, intersected_glyph},
+      ContextFormat::SimpleContext,
       {nullptr, nullptr, nullptr}
     };
 
@@ -2554,26 +2864,45 @@ struct ChainContextFormat1
     ;
   }
 
+  bool may_have_non_1to1 () const
+  { return true; }
+
   void closure (hb_closure_context_t *c) const
   {
+    hb_set_t* cur_active_glyphs = &c->push_cur_active_glyphs ();
+    get_coverage ().intersected_coverage_glyphs (&c->previous_parent_active_glyphs (),
+                                                 cur_active_glyphs);
+
     struct ChainContextClosureLookupContext lookup_context = {
-      {intersects_glyph},
+      {intersects_glyph, intersected_glyph},
+      ContextFormat::SimpleContext,
       {nullptr, nullptr, nullptr}
     };
 
-    + hb_zip (this+coverage, ruleSet)
-    | hb_filter (*c->glyphs, hb_first)
-    | hb_map (hb_second)
-    | hb_map (hb_add (this))
-    | hb_apply ([&] (const ChainRuleSet &_) { _.closure (c, lookup_context); })
+    + hb_zip (this+coverage, hb_range ((unsigned) ruleSet.len))
+    | hb_filter ([&] (hb_codepoint_t _) {
+      return c->previous_parent_active_glyphs ().has (_);
+    }, hb_first)
+    | hb_map ([&](const hb_pair_t<hb_codepoint_t, unsigned> _) { return hb_pair_t<unsigned, const ChainRuleSet&> (_.first, this+ruleSet[_.second]); })
+    | hb_apply ([&] (const hb_pair_t<unsigned, const ChainRuleSet&>& _) { _.second.closure (c, _.first, lookup_context); })
     ;
+
+    c->pop_cur_done_glyphs ();
   }
 
   void closure_lookups (hb_closure_lookups_context_t *c) const
   {
-    + hb_iter (ruleSet)
+    struct ChainContextClosureLookupContext lookup_context = {
+      {intersects_glyph, intersected_glyph},
+      ContextFormat::SimpleContext,
+      {nullptr, nullptr, nullptr}
+    };
+
+    + hb_zip (this+coverage, ruleSet)
+    | hb_filter (*c->glyphs, hb_first)
+    | hb_map (hb_second)
     | hb_map (hb_add (this))
-    | hb_apply ([&] (const ChainRuleSet &_) { _.closure_lookups (c); })
+    | hb_apply ([&] (const ChainRuleSet &_) { _.closure_lookups (c, lookup_context); })
     ;
   }
 
@@ -2623,7 +2952,7 @@ struct ChainContextFormat1
   bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
-    const hb_set_t &glyphset = *c->plan->glyphset ();
+    const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
     const hb_map_t &glyph_map = *c->plan->glyph_map;
 
     auto *out = c->serializer->start_embed (*this);
@@ -2640,8 +2969,7 @@ struct ChainContextFormat1
     | hb_sink (new_coverage)
     ;
 
-    out->coverage.serialize (c->serializer, out)
-                .serialize (c->serializer, new_coverage.iter ());
+    out->coverage.serialize_serialize (c->serializer, new_coverage.iter ());
     return_trace (bool (new_coverage));
   }
 
@@ -2653,10 +2981,10 @@ struct ChainContextFormat1
 
   protected:
   HBUINT16     format;                 /* Format identifier--format = 1 */
-  OffsetTo<Coverage>
+  Offset16To<Coverage>
                coverage;               /* Offset to Coverage table--from
                                         * beginning of table */
-  OffsetArrayOf<ChainRuleSet>
+  Array16OfOffset16To<ChainRuleSet>
                ruleSet;                /* Array of ChainRuleSet tables
                                         * ordered by Coverage Index */
   public:
@@ -2675,52 +3003,95 @@ struct ChainContextFormat2
     const ClassDef &lookahead_class_def = this+lookaheadClassDef;
 
     struct ChainContextClosureLookupContext lookup_context = {
-      {intersects_class},
+      {intersects_class, intersected_class_glyphs},
+      ContextFormat::ClassBasedContext,
       {&backtrack_class_def,
        &input_class_def,
        &lookahead_class_def}
     };
 
+    hb_set_t retained_coverage_glyphs;
+    (this+coverage).intersected_coverage_glyphs (glyphs, &retained_coverage_glyphs);
+
+    hb_set_t coverage_glyph_classes;
+    input_class_def.intersected_classes (&retained_coverage_glyphs, &coverage_glyph_classes);
+
     return
-    + hb_enumerate (ruleSet)
-    | hb_map ([&] (const hb_pair_t<unsigned, const OffsetTo<ChainRuleSet> &> p)
+    + hb_iter (ruleSet)
+    | hb_map (hb_add (this))
+    | hb_enumerate
+    | hb_map ([&] (const hb_pair_t<unsigned, const ChainRuleSet &> p)
              { return input_class_def.intersects_class (glyphs, p.first) &&
-                      (this+p.second).intersects (glyphs, lookup_context); })
+                      coverage_glyph_classes.has (p.first) &&
+                      p.second.intersects (glyphs, lookup_context); })
     | hb_any
     ;
   }
+
+  bool may_have_non_1to1 () const
+  { return true; }
+
   void closure (hb_closure_context_t *c) const
   {
     if (!(this+coverage).intersects (c->glyphs))
       return;
 
+    hb_set_t* cur_active_glyphs = &c->push_cur_active_glyphs ();
+    get_coverage ().intersected_coverage_glyphs (&c->previous_parent_active_glyphs (),
+                                                 cur_active_glyphs);
+
+
     const ClassDef &backtrack_class_def = this+backtrackClassDef;
     const ClassDef &input_class_def = this+inputClassDef;
     const ClassDef &lookahead_class_def = this+lookaheadClassDef;
 
     struct ChainContextClosureLookupContext lookup_context = {
-      {intersects_class},
+      {intersects_class, intersected_class_glyphs},
+      ContextFormat::ClassBasedContext,
       {&backtrack_class_def,
        &input_class_def,
        &lookahead_class_def}
     };
 
-    return
     + hb_enumerate (ruleSet)
     | hb_filter ([&] (unsigned _)
-                { return input_class_def.intersects_class (c->glyphs, _); },
+    { return input_class_def.intersects_class (&c->parent_active_glyphs (), _); },
                 hb_first)
-    | hb_map (hb_second)
-    | hb_map (hb_add (this))
-    | hb_apply ([&] (const ChainRuleSet &_) { _.closure (c, lookup_context); })
+    | hb_apply ([&] (const hb_pair_t<unsigned, const Offset16To<ChainRuleSet>&> _)
+                {
+                  const ChainRuleSet& chainrule_set = this+_.second;
+                  chainrule_set.closure (c, _.first, lookup_context);
+                })
     ;
+
+    c->pop_cur_done_glyphs ();
   }
 
   void closure_lookups (hb_closure_lookups_context_t *c) const
   {
+    if (!(this+coverage).intersects (c->glyphs))
+      return;
+
+    const ClassDef &backtrack_class_def = this+backtrackClassDef;
+    const ClassDef &input_class_def = this+inputClassDef;
+    const ClassDef &lookahead_class_def = this+lookaheadClassDef;
+
+    struct ChainContextClosureLookupContext lookup_context = {
+      {intersects_class, intersected_class_glyphs},
+      ContextFormat::ClassBasedContext,
+      {&backtrack_class_def,
+       &input_class_def,
+       &lookahead_class_def}
+    };
+
     + hb_iter (ruleSet)
     | hb_map (hb_add (this))
-    | hb_apply ([&] (const ChainRuleSet &_) { _.closure_lookups (c); })
+    | hb_enumerate
+    | hb_filter([&] (unsigned klass)
+    { return input_class_def.intersects_class (c->glyphs, klass); }, hb_first)
+    | hb_map (hb_second)
+    | hb_apply ([&] (const ChainRuleSet &_)
+    { _.closure_lookups (c, lookup_context); })
     ;
   }
 
@@ -2796,21 +3167,32 @@ struct ChainContextFormat2
     out->coverage.serialize_subset (c, coverage, this);
 
     hb_map_t backtrack_klass_map;
-    out->backtrackClassDef.serialize_subset (c, backtrackClassDef, this, &backtrack_klass_map);
-
-    // subset inputClassDef based on glyphs survived in Coverage subsetting
     hb_map_t input_klass_map;
-    out->inputClassDef.serialize_subset (c, inputClassDef, this, &input_klass_map);
-
     hb_map_t lookahead_klass_map;
+
+    out->backtrackClassDef.serialize_subset (c, backtrackClassDef, this, &backtrack_klass_map);
+    // TODO: subset inputClassDef based on glyphs survived in Coverage subsetting
+    out->inputClassDef.serialize_subset (c, inputClassDef, this, &input_klass_map);
     out->lookaheadClassDef.serialize_subset (c, lookaheadClassDef, this, &lookahead_klass_map);
 
-    unsigned non_zero_index = 0, index = 0;
+    if (unlikely (!c->serializer->propagate_error (backtrack_klass_map,
+                                                  input_klass_map,
+                                                  lookahead_klass_map)))
+      return_trace (false);
+
+    const hb_set_t* glyphset = c->plan->glyphset_gsub ();
+    hb_set_t retained_coverage_glyphs;
+    (this+coverage).intersected_coverage_glyphs (glyphset, &retained_coverage_glyphs);
+
+    hb_set_t coverage_glyph_classes;
+    (this+inputClassDef).intersected_classes (&retained_coverage_glyphs, &coverage_glyph_classes);
+
+    int non_zero_index = -1, index = 0;
     bool ret = true;
     const hb_map_t *lookup_map = c->table_tag == HB_OT_TAG_GSUB ? c->plan->gsub_lookups : c->plan->gpos_lookups;
-    for (const OffsetTo<ChainRuleSet>& _ : + hb_enumerate (ruleSet)
-                                          | hb_filter (input_klass_map, hb_first)
-                                          | hb_map (hb_second))
+    auto last_non_zero = c->serializer->snapshot ();
+    for (const auto& _ : + hb_enumerate (ruleSet)
+                        | hb_filter (input_klass_map, hb_first))
     {
       auto *o = out->ruleSet.serialize_append (c->serializer);
       if (unlikely (!o))
@@ -2818,24 +3200,26 @@ struct ChainContextFormat2
        ret = false;
        break;
       }
-      if (o->serialize_subset (c, _, this,
+      if (coverage_glyph_classes.has (_.first) &&
+          o->serialize_subset (c, _.second, this,
                               lookup_map,
                               &backtrack_klass_map,
                               &input_klass_map,
                               &lookahead_klass_map))
-        non_zero_index = index;
+      {
+        last_non_zero = c->serializer->snapshot ();
+       non_zero_index = index;
+      }
 
       index++;
     }
 
-    if (!ret) return_trace (ret);
+    if (!ret || non_zero_index == -1) return_trace (false);
 
-    //prune empty trailing ruleSets
-    --index;
-    while (index > non_zero_index)
-    {
-      out->ruleSet.pop ();
-      index--;
+    // prune empty trailing ruleSets
+    if (index > non_zero_index) {
+      c->serializer->revert (last_non_zero);
+      out->ruleSet.len = non_zero_index + 1;
     }
 
     return_trace (bool (out->ruleSet));
@@ -2853,22 +3237,22 @@ struct ChainContextFormat2
 
   protected:
   HBUINT16     format;                 /* Format identifier--format = 2 */
-  OffsetTo<Coverage>
+  Offset16To<Coverage>
                coverage;               /* Offset to Coverage table--from
                                         * beginning of table */
-  OffsetTo<ClassDef>
+  Offset16To<ClassDef>
                backtrackClassDef;      /* Offset to glyph ClassDef table
                                         * containing backtrack sequence
                                         * data--from beginning of table */
-  OffsetTo<ClassDef>
+  Offset16To<ClassDef>
                inputClassDef;          /* Offset to glyph ClassDef
                                         * table containing input sequence
                                         * data--from beginning of table */
-  OffsetTo<ClassDef>
+  Offset16To<ClassDef>
                lookaheadClassDef;      /* Offset to glyph ClassDef table
                                         * containing lookahead sequence
                                         * data--from beginning of table */
-  OffsetArrayOf<ChainRuleSet>
+  Array16OfOffset16To<ChainRuleSet>
                ruleSet;                /* Array of ChainRuleSet tables
                                         * ordered by class */
   public:
@@ -2879,14 +3263,15 @@ struct ChainContextFormat3
 {
   bool intersects (const hb_set_t *glyphs) const
   {
-    const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage>> (backtrack);
+    const Array16OfOffset16To<Coverage> &input = StructAfter<Array16OfOffset16To<Coverage>> (backtrack);
 
     if (!(this+input[0]).intersects (glyphs))
       return false;
 
-    const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage>> (input);
+    const Array16OfOffset16To<Coverage> &lookahead = StructAfter<Array16OfOffset16To<Coverage>> (input);
     struct ChainContextClosureLookupContext lookup_context = {
-      {intersects_coverage},
+      {intersects_coverage, intersected_coverage_glyphs},
+      ContextFormat::CoverageBasedContext,
       {this, this, this}
     };
     return chain_context_intersects (glyphs,
@@ -2896,17 +3281,26 @@ struct ChainContextFormat3
                                     lookup_context);
   }
 
+  bool may_have_non_1to1 () const
+  { return true; }
+
   void closure (hb_closure_context_t *c) const
   {
-    const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage>> (backtrack);
+    const Array16OfOffset16To<Coverage> &input = StructAfter<Array16OfOffset16To<Coverage>> (backtrack);
 
     if (!(this+input[0]).intersects (c->glyphs))
       return;
 
-    const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage>> (input);
-    const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord>> (lookahead);
+    hb_set_t* cur_active_glyphs = &c->push_cur_active_glyphs ();
+    get_coverage ().intersected_coverage_glyphs (&c->previous_parent_active_glyphs (),
+                                                 cur_active_glyphs);
+
+
+    const Array16OfOffset16To<Coverage> &lookahead = StructAfter<Array16OfOffset16To<Coverage>> (input);
+    const Array16Of<LookupRecord> &lookup = StructAfter<Array16Of<LookupRecord>> (lookahead);
     struct ChainContextClosureLookupContext lookup_context = {
-      {intersects_coverage},
+      {intersects_coverage, intersected_coverage_glyphs},
+      ContextFormat::CoverageBasedContext,
       {this, this, this}
     };
     chain_context_closure_lookup (c,
@@ -2914,14 +3308,19 @@ struct ChainContextFormat3
                                  input.len, (const HBUINT16 *) input.arrayZ + 1,
                                  lookahead.len, (const HBUINT16 *) lookahead.arrayZ,
                                  lookup.len, lookup.arrayZ,
-                                 lookup_context);
+                                 0, lookup_context);
+
+    c->pop_cur_done_glyphs ();
   }
 
   void closure_lookups (hb_closure_lookups_context_t *c) const
   {
-    const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage>> (backtrack);
-    const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage>> (input);
-    const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord>> (lookahead);
+    if (!intersects (c->glyphs))
+      return;
+
+    const Array16OfOffset16To<Coverage> &input = StructAfter<Array16OfOffset16To<Coverage>> (backtrack);
+    const Array16OfOffset16To<Coverage> &lookahead = StructAfter<Array16OfOffset16To<Coverage>> (input);
+    const Array16Of<LookupRecord> &lookup = StructAfter<Array16Of<LookupRecord>> (lookahead);
     recurse_lookups (c, lookup.len, lookup.arrayZ);
   }
 
@@ -2929,12 +3328,12 @@ struct ChainContextFormat3
 
   void collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
-    const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage>> (backtrack);
+    const Array16OfOffset16To<Coverage> &input = StructAfter<Array16OfOffset16To<Coverage>> (backtrack);
 
     (this+input[0]).collect_coverage (c->input);
 
-    const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage>> (input);
-    const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord>> (lookahead);
+    const Array16OfOffset16To<Coverage> &lookahead = StructAfter<Array16OfOffset16To<Coverage>> (input);
+    const Array16Of<LookupRecord> &lookup = StructAfter<Array16Of<LookupRecord>> (lookahead);
     struct ChainContextCollectGlyphsLookupContext lookup_context = {
       {collect_coverage},
       {this, this, this}
@@ -2949,9 +3348,9 @@ struct ChainContextFormat3
 
   bool would_apply (hb_would_apply_context_t *c) const
   {
-    const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage>> (backtrack);
-    const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage>> (input);
-    const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord>> (lookahead);
+    const Array16OfOffset16To<Coverage> &input = StructAfter<Array16OfOffset16To<Coverage>> (backtrack);
+    const Array16OfOffset16To<Coverage> &lookahead = StructAfter<Array16OfOffset16To<Coverage>> (input);
+    const Array16Of<LookupRecord> &lookup = StructAfter<Array16Of<LookupRecord>> (lookahead);
     struct ChainContextApplyLookupContext lookup_context = {
       {match_coverage},
       {this, this, this}
@@ -2965,20 +3364,20 @@ struct ChainContextFormat3
 
   const Coverage &get_coverage () const
   {
-    const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage>> (backtrack);
+    const Array16OfOffset16To<Coverage> &input = StructAfter<Array16OfOffset16To<Coverage>> (backtrack);
     return this+input[0];
   }
 
   bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
-    const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage>> (backtrack);
+    const Array16OfOffset16To<Coverage> &input = StructAfter<Array16OfOffset16To<Coverage>> (backtrack);
 
     unsigned int index = (this+input[0]).get_coverage (c->buffer->cur().codepoint);
     if (likely (index == NOT_COVERED)) return_trace (false);
 
-    const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage>> (input);
-    const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord>> (lookahead);
+    const Array16OfOffset16To<Coverage> &lookahead = StructAfter<Array16OfOffset16To<Coverage>> (input);
+    const Array16Of<LookupRecord> &lookup = StructAfter<Array16Of<LookupRecord>> (lookahead);
     struct ChainContextApplyLookupContext lookup_context = {
       {match_coverage},
       {this, this, this}
@@ -2995,15 +3394,18 @@ struct ChainContextFormat3
   bool serialize_coverage_offsets (hb_subset_context_t *c, Iterator it, const void* base) const
   {
     TRACE_SERIALIZE (this);
-    auto *out = c->serializer->start_embed<OffsetArrayOf<Coverage>> ();
+    auto *out = c->serializer->start_embed<Array16OfOffset16To<Coverage>> ();
 
-    if (unlikely (!c->serializer->allocate_size<HBUINT16> (HBUINT16::static_size))) return_trace (false);
+    if (unlikely (!c->serializer->allocate_size<HBUINT16> (HBUINT16::static_size)))
+      return_trace (false);
 
-    + it
-    | hb_apply (subset_offset_array (c, *out, base))
-    ;
+    for (auto& offset : it) {
+      auto *o = out->serialize_append (c->serializer);
+      if (unlikely (!o) || !o->serialize_subset (c, offset, base))
+        return_trace (false);
+    }
 
-    return_trace (out->len);
+    return_trace (true);
   }
 
   bool subset (hb_subset_context_t *c) const
@@ -3017,54 +3419,52 @@ struct ChainContextFormat3
     if (!serialize_coverage_offsets (c, backtrack.iter (), this))
       return_trace (false);
 
-    const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage>> (backtrack);
+    const Array16OfOffset16To<Coverage> &input = StructAfter<Array16OfOffset16To<Coverage>> (backtrack);
     if (!serialize_coverage_offsets (c, input.iter (), this))
       return_trace (false);
 
-    const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage>> (input);
+    const Array16OfOffset16To<Coverage> &lookahead = StructAfter<Array16OfOffset16To<Coverage>> (input);
     if (!serialize_coverage_offsets (c, lookahead.iter (), this))
       return_trace (false);
 
-    const ArrayOf<LookupRecord> &lookupRecord = StructAfter<ArrayOf<LookupRecord>> (lookahead);
-    HBUINT16 lookupCount;
-    lookupCount = lookupRecord.len;
-    if (!c->serializer->copy (lookupCount)) return_trace (false);
-
+    const Array16Of<LookupRecord> &lookupRecord = StructAfter<Array16Of<LookupRecord>> (lookahead);
     const hb_map_t *lookup_map = c->table_tag == HB_OT_TAG_GSUB ? c->plan->gsub_lookups : c->plan->gpos_lookups;
-    for (unsigned i = 0; i < (unsigned) lookupCount; i++)
-      if (!c->serializer->copy (lookupRecord[i], lookup_map)) return_trace (false);
-    
-    return_trace (true);
+
+    HBUINT16 *lookupCount = c->serializer->copy<HBUINT16> (lookupRecord.len);
+    if (!lookupCount) return_trace (false);
+
+    unsigned count = serialize_lookuprecord_array (c->serializer, lookupRecord.as_array (), lookup_map);
+    return_trace (c->serializer->check_assign (*lookupCount, count, HB_SERIALIZE_ERROR_INT_OVERFLOW));
   }
 
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
     if (!backtrack.sanitize (c, this)) return_trace (false);
-    const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage>> (backtrack);
+    const Array16OfOffset16To<Coverage> &input = StructAfter<Array16OfOffset16To<Coverage>> (backtrack);
     if (!input.sanitize (c, this)) return_trace (false);
     if (!input.len) return_trace (false); /* To be consistent with Context. */
-    const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage>> (input);
+    const Array16OfOffset16To<Coverage> &lookahead = StructAfter<Array16OfOffset16To<Coverage>> (input);
     if (!lookahead.sanitize (c, this)) return_trace (false);
-    const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord>> (lookahead);
+    const Array16Of<LookupRecord> &lookup = StructAfter<Array16Of<LookupRecord>> (lookahead);
     return_trace (lookup.sanitize (c));
   }
 
   protected:
   HBUINT16     format;                 /* Format identifier--format = 3 */
-  OffsetArrayOf<Coverage>
+  Array16OfOffset16To<Coverage>
                backtrack;              /* Array of coverage tables
                                         * in backtracking sequence, in  glyph
                                         * sequence order */
-  OffsetArrayOf<Coverage>
+  Array16OfOffset16To<Coverage>
                inputX          ;       /* Array of coverage
                                         * tables in input sequence, in glyph
                                         * sequence order */
-  OffsetArrayOf<Coverage>
+  Array16OfOffset16To<Coverage>
                lookaheadX;             /* Array of coverage tables
                                         * in lookahead sequence, in glyph
                                         * sequence order */
-  ArrayOf<LookupRecord>
+  Array16Of<LookupRecord>
                lookupX;                /* Array of LookupRecords--in
                                         * design order) */
   public:
@@ -3079,9 +3479,9 @@ struct ChainContext
     TRACE_DISPATCH (this, u.format);
     if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
     switch (u.format) {
-    case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...));
-    case 2: return_trace (c->dispatch (u.format2, hb_forward<Ts> (ds)...));
-    case 3: return_trace (c->dispatch (u.format3, hb_forward<Ts> (ds)...));
+    case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...));
+    case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...));
+    case 3: return_trace (c->dispatch (u.format3, std::forward<Ts> (ds)...));
     default:return_trace (c->default_return_value ());
     }
   }
@@ -3103,14 +3503,14 @@ struct ExtensionFormat1
 
   template <typename X>
   const X& get_subtable () const
-  { return this + reinterpret_cast<const LOffsetTo<typename T::SubTable> &> (extensionOffset); }
+  { return this + reinterpret_cast<const Offset32To<typename T::SubTable> &> (extensionOffset); }
 
   template <typename context_t, typename ...Ts>
   typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
   {
     TRACE_DISPATCH (this, format);
     if (unlikely (!c->may_dispatch (this, this))) return_trace (c->no_dispatch_return_value ());
-    return_trace (get_subtable<typename T::SubTable> ().dispatch (c, get_type (), hb_forward<Ts> (ds)...));
+    return_trace (get_subtable<typename T::SubTable> ().dispatch (c, get_type (), std::forward<Ts> (ds)...));
   }
 
   void collect_variation_indices (hb_collect_variation_indices_context_t *c) const
@@ -3124,6 +3524,24 @@ struct ExtensionFormat1
                  extensionLookupType != T::SubTable::Extension);
   }
 
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+
+    auto *out = c->serializer->start_embed (this);
+    if (unlikely (!out || !c->serializer->extend_min (out))) return_trace (false);
+
+    out->format = format;
+    out->extensionLookupType = extensionLookupType;
+
+    const auto& src_offset =
+        reinterpret_cast<const Offset32To<typename T::SubTable> &> (extensionOffset);
+    auto& dest_offset =
+        reinterpret_cast<Offset32To<typename T::SubTable> &> (out->extensionOffset);
+
+    return_trace (dest_offset.serialize_subset (c, src_offset, this, get_type ()));
+  }
+
   protected:
   HBUINT16     format;                 /* Format identifier. Set to 1. */
   HBUINT16     extensionLookupType;    /* Lookup type of subtable referenced
@@ -3154,13 +3572,25 @@ struct Extension
     }
   }
 
+  // Specialization of dispatch for subset. dispatch() normally just
+  // dispatches to the sub table this points too, but for subset
+  // we need to run subset on this subtable too.
+  template <typename ...Ts>
+  typename hb_subset_context_t::return_t dispatch (hb_subset_context_t *c, Ts&&... ds) const
+  {
+    switch (u.format) {
+    case 1: return u.format1.subset (c);
+    default: return c->default_return_value ();
+    }
+  }
+
   template <typename context_t, typename ...Ts>
   typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
   {
     TRACE_DISPATCH (this, u.format);
     if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
     switch (u.format) {
-    case 1: return_trace (u.format1.dispatch (c, hb_forward<Ts> (ds)...));
+    case 1: return_trace (u.format1.dispatch (c, std::forward<Ts> (ds)...));
     default:return_trace (c->default_return_value ());
     }
   }
@@ -3277,6 +3707,35 @@ struct GSUBGPOS
   }
 
   template <typename TLookup>
+  void closure_lookups (hb_face_t      *face,
+                       const hb_set_t *glyphs,
+                       hb_set_t       *lookup_indexes /* IN/OUT */) const
+  {
+    hb_set_t visited_lookups, inactive_lookups;
+    OT::hb_closure_lookups_context_t c (face, glyphs, &visited_lookups, &inactive_lookups);
+
+    for (unsigned lookup_index : + hb_iter (lookup_indexes))
+      reinterpret_cast<const TLookup &> (get_lookup (lookup_index)).closure_lookups (&c, lookup_index);
+
+    hb_set_union (lookup_indexes, &visited_lookups);
+    hb_set_subtract (lookup_indexes, &inactive_lookups);
+  }
+
+  void prune_langsys (const hb_map_t *duplicate_feature_map,
+                      hb_hashmap_t<unsigned, hb_set_t *> *script_langsys_map,
+                      hb_set_t       *new_feature_indexes /* OUT */) const
+  {
+    hb_prune_langsys_context_t c (this, script_langsys_map, duplicate_feature_map, new_feature_indexes);
+
+    unsigned count = get_script_count ();
+    for (unsigned script_index = 0; script_index < count; script_index++)
+    {
+      const Script& s = get_script (script_index);
+      s.prune_langsys (&c, script_index);
+    }
+  }
+
+  template <typename TLookup>
   bool subset (hb_subset_layout_context_t *c) const
   {
     TRACE_SUBSET (this);
@@ -3284,15 +3743,15 @@ struct GSUBGPOS
     if (unlikely (!out)) return_trace (false);
 
     typedef LookupOffsetList<TLookup> TLookupList;
-    reinterpret_cast<OffsetTo<TLookupList> &> (out->lookupList)
+    reinterpret_cast<Offset16To<TLookupList> &> (out->lookupList)
        .serialize_subset (c->subset_context,
-                          reinterpret_cast<const OffsetTo<TLookupList> &> (lookupList),
+                          reinterpret_cast<const Offset16To<TLookupList> &> (lookupList),
                           this,
                           c);
 
-    reinterpret_cast<OffsetTo<RecordListOfFeature> &> (out->featureList)
+    reinterpret_cast<Offset16To<RecordListOfFeature> &> (out->featureList)
        .serialize_subset (c->subset_context,
-                          reinterpret_cast<const OffsetTo<RecordListOfFeature> &> (featureList),
+                          reinterpret_cast<const Offset16To<RecordListOfFeature> &> (featureList),
                           this,
                           c);
 
@@ -3316,20 +3775,118 @@ struct GSUBGPOS
     return_trace (true);
   }
 
-  void closure_features (const hb_map_t *lookup_indexes, /* IN */
-                        hb_set_t       *feature_indexes /* OUT */) const
+  void find_duplicate_features (const hb_map_t *lookup_indices,
+                                const hb_set_t *feature_indices,
+                                hb_map_t *duplicate_feature_map /* OUT */) const
   {
-    unsigned int feature_count = hb_min (get_feature_count (), (unsigned) HB_MAX_FEATURES);
-    for (unsigned i = 0; i < feature_count; i++)
+    if (feature_indices->is_empty ()) return;
+    hb_hashmap_t<hb_tag_t, hb_set_t *> unique_features;
+    //find out duplicate features after subset
+    for (unsigned i : feature_indices->iter ())
     {
-      const Feature& f = get_feature (i);
-      if ((!f.featureParams.is_null ()) || f.intersects_lookup_indexes (lookup_indexes))
-        feature_indexes->add (i);
+      hb_tag_t t = get_feature_tag (i);
+      if (t == HB_MAP_VALUE_INVALID) continue;
+      if (!unique_features.has (t))
+      {
+        hb_set_t* indices = hb_set_create ();
+        if (unlikely (indices == hb_set_get_empty () ||
+                      !unique_features.set (t, indices)))
+        {
+          hb_set_destroy (indices);
+          for (auto _ : unique_features.iter ())
+            hb_set_destroy (_.second);
+          return;
+        }
+        if (unique_features.get (t))
+          unique_features.get (t)->add (i);
+        duplicate_feature_map->set (i, i);
+        continue;
+      }
+
+      bool found = false;
+
+      hb_set_t* same_tag_features = unique_features.get (t);
+      for (unsigned other_f_index : same_tag_features->iter ())
+      {
+        const Feature& f = get_feature (i);
+        const Feature& other_f = get_feature (other_f_index);
+
+        auto f_iter =
+        + hb_iter (f.lookupIndex)
+        | hb_filter (lookup_indices)
+        ;
+
+        auto other_f_iter =
+        + hb_iter (other_f.lookupIndex)
+        | hb_filter (lookup_indices)
+        ;
+
+        bool is_equal = true;
+        for (; f_iter && other_f_iter; f_iter++, other_f_iter++)
+        {
+          unsigned a = *f_iter;
+          unsigned b = *other_f_iter;
+          if (a != b) { is_equal = false; break; }
+        }
+
+        if (is_equal == false || f_iter || other_f_iter) continue;
+
+        found = true;
+        duplicate_feature_map->set (i, other_f_index);
+        break;
+      }
+
+      if (found == false)
+      {
+        same_tag_features->add (i);
+        duplicate_feature_map->set (i, i);
+      }
     }
+
+    for (auto _ : unique_features.iter ())
+      hb_set_destroy (_.second);
+  }
+
+  void prune_features (const hb_map_t *lookup_indices, /* IN */
+                      hb_set_t       *feature_indices /* IN/OUT */) const
+  {
 #ifndef HB_NO_VAR
+    // This is the set of feature indices which have alternate versions defined
+    // if the FeatureVariation's table and the alternate version(s) intersect the
+    // set of lookup indices.
+    hb_set_t alternate_feature_indices;
     if (version.to_int () >= 0x00010001u)
-      (this+featureVars).closure_features (lookup_indexes, feature_indexes);
+      (this+featureVars).closure_features (lookup_indices, &alternate_feature_indices);
+    if (unlikely (alternate_feature_indices.in_error()))
+    {
+      feature_indices->err ();
+      return;
+    }
 #endif
+
+    for (unsigned i : feature_indices->iter())
+    {
+      const Feature& f = get_feature (i);
+      hb_tag_t tag =  get_feature_tag (i);
+      if (tag == HB_TAG ('p', 'r', 'e', 'f'))
+        // Note: Never ever drop feature 'pref', even if it's empty.
+        // HarfBuzz chooses shaper for Khmer based on presence of this
+        // feature.    See thread at:
+       // http://lists.freedesktop.org/archives/harfbuzz/2012-November/002660.html
+        continue;
+
+
+      if (!f.featureParams.is_null () &&
+          tag == HB_TAG ('s', 'i', 'z', 'e'))
+        continue;
+
+      if (!f.intersects_lookup_indexes (lookup_indices)
+#ifndef HB_NO_VAR
+          && !alternate_feature_indices.has (i)
+#endif
+         )
+       feature_indices->del (i);
+    }
   }
 
   unsigned int get_size () const
@@ -3342,12 +3899,12 @@ struct GSUBGPOS
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
-    typedef OffsetListOf<TLookup> TLookupList;
+    typedef List16OfOffset16To<TLookup> TLookupList;
     if (unlikely (!(version.sanitize (c) &&
                    likely (version.major == 1) &&
                    scriptList.sanitize (c, this) &&
                    featureList.sanitize (c, this) &&
-                   reinterpret_cast<const OffsetTo<TLookupList> &> (lookupList).sanitize (c, this))))
+                   reinterpret_cast<const Offset16To<TLookupList> &> (lookupList).sanitize (c, this))))
       return_trace (false);
 
 #ifndef HB_NO_VAR
@@ -3361,10 +3918,10 @@ struct GSUBGPOS
   template <typename T>
   struct accelerator_t
   {
-    void init (hb_face_t *face)
+    accelerator_t (hb_face_t *face)
     {
       this->table = hb_sanitize_context_t ().reference_table<T> (face);
-      if (unlikely (this->table->is_blacklisted (this->table.get_blob (), face)))
+      if (unlikely (this->table->is_blocklisted (this->table.get_blob (), face)))
       {
        hb_blob_destroy (this->table.get_blob ());
        this->table = hb_blob_get_empty ();
@@ -3372,19 +3929,22 @@ struct GSUBGPOS
 
       this->lookup_count = table->get_lookup_count ();
 
-      this->accels = (hb_ot_layout_lookup_accelerator_t *) calloc (this->lookup_count, sizeof (hb_ot_layout_lookup_accelerator_t));
+      this->accels = (hb_ot_layout_lookup_accelerator_t *) hb_calloc (this->lookup_count, sizeof (hb_ot_layout_lookup_accelerator_t));
       if (unlikely (!this->accels))
+      {
        this->lookup_count = 0;
+       this->table.destroy ();
+       this->table = hb_blob_get_empty ();
+      }
 
       for (unsigned int i = 0; i < this->lookup_count; i++)
        this->accels[i].init (table->get_lookup (i));
     }
-
-    void fini ()
+    ~accelerator_t ()
     {
       for (unsigned int i = 0; i < this->lookup_count; i++)
        this->accels[i].fini ();
-      free (this->accels);
+      hb_free (this->accels);
       this->table.destroy ();
     }
 
@@ -3396,13 +3956,13 @@ struct GSUBGPOS
   protected:
   FixedVersion<>version;       /* Version of the GSUB/GPOS table--initially set
                                 * to 0x00010000u */
-  OffsetTo<ScriptList>
+  Offset16To<ScriptList>
                scriptList;     /* ScriptList table */
-  OffsetTo<FeatureList>
+  Offset16To<FeatureList>
                featureList;    /* FeatureList table */
-  OffsetTo<LookupList>
+  Offset16To<LookupList>
                lookupList;     /* LookupList table */
-  LOffsetTo<FeatureVariations>
+  Offset32To<FeatureVariations>
                featureVars;    /* Offset to Feature Variations
                                   table--from beginning of table
                                 * (may be NULL).  Introduced
index ffd2bf4..a1c125b 100644 (file)
@@ -45,7 +45,7 @@ typedef IndexArray JstfModList;
  * JstfMax -- Justification Maximum Table
  */
 
-typedef OffsetListOf<PosLookup> JstfMax;
+typedef List16OfOffset16To<PosLookup> JstfMax;
 
 
 /*
@@ -71,43 +71,43 @@ struct JstfPriority
   }
 
   protected:
-  OffsetTo<JstfModList>
+  Offset16To<JstfModList>
                shrinkageEnableGSUB;    /* Offset to Shrinkage Enable GSUB
                                         * JstfModList table--from beginning of
                                         * JstfPriority table--may be NULL */
-  OffsetTo<JstfModList>
+  Offset16To<JstfModList>
                shrinkageDisableGSUB;   /* Offset to Shrinkage Disable GSUB
                                         * JstfModList table--from beginning of
                                         * JstfPriority table--may be NULL */
-  OffsetTo<JstfModList>
+  Offset16To<JstfModList>
                shrinkageEnableGPOS;    /* Offset to Shrinkage Enable GPOS
                                         * JstfModList table--from beginning of
                                         * JstfPriority table--may be NULL */
-  OffsetTo<JstfModList>
+  Offset16To<JstfModList>
                shrinkageDisableGPOS;   /* Offset to Shrinkage Disable GPOS
                                         * JstfModList table--from beginning of
                                         * JstfPriority table--may be NULL */
-  OffsetTo<JstfMax>
+  Offset16To<JstfMax>
                shrinkageJstfMax;       /* Offset to Shrinkage JstfMax table--
                                         * from beginning of JstfPriority table
                                         * --may be NULL */
-  OffsetTo<JstfModList>
+  Offset16To<JstfModList>
                extensionEnableGSUB;    /* Offset to Extension Enable GSUB
                                         * JstfModList table--from beginning of
                                         * JstfPriority table--may be NULL */
-  OffsetTo<JstfModList>
+  Offset16To<JstfModList>
                extensionDisableGSUB;   /* Offset to Extension Disable GSUB
                                         * JstfModList table--from beginning of
                                         * JstfPriority table--may be NULL */
-  OffsetTo<JstfModList>
+  Offset16To<JstfModList>
                extensionEnableGPOS;    /* Offset to Extension Enable GPOS
                                         * JstfModList table--from beginning of
                                         * JstfPriority table--may be NULL */
-  OffsetTo<JstfModList>
+  Offset16To<JstfModList>
                extensionDisableGPOS;   /* Offset to Extension Disable GPOS
                                         * JstfModList table--from beginning of
                                         * JstfPriority table--may be NULL */
-  OffsetTo<JstfMax>
+  Offset16To<JstfMax>
                extensionJstfMax;       /* Offset to Extension JstfMax table--
                                         * from beginning of JstfPriority table
                                         * --may be NULL */
@@ -121,13 +121,13 @@ struct JstfPriority
  * JstfLangSys -- Justification Language System Table
  */
 
-struct JstfLangSys : OffsetListOf<JstfPriority>
+struct JstfLangSys : List16OfOffset16To<JstfPriority>
 {
   bool sanitize (hb_sanitize_context_t *c,
                 const Record_sanitize_closure_t * = nullptr) const
   {
     TRACE_SANITIZE (this);
-    return_trace (OffsetListOf<JstfPriority>::sanitize (c));
+    return_trace (List16OfOffset16To<JstfPriority>::sanitize (c));
   }
 };
 
@@ -136,7 +136,7 @@ struct JstfLangSys : OffsetListOf<JstfPriority>
  * ExtenderGlyphs -- Extender Glyph Table
  */
 
-typedef SortedArrayOf<HBGlyphID> ExtenderGlyphs;
+typedef SortedArray16Of<HBGlyphID16> ExtenderGlyphs;
 
 
 /*
@@ -174,10 +174,10 @@ struct JstfScript
   }
 
   protected:
-  OffsetTo<ExtenderGlyphs>
+  Offset16To<ExtenderGlyphs>
                extenderGlyphs; /* Offset to ExtenderGlyph table--from beginning
                                 * of JstfScript table-may be NULL */
-  OffsetTo<JstfLangSys>
+  Offset16To<JstfLangSys>
                defaultLangSys; /* Offset to DefaultJstfLangSys table--from
                                 * beginning of JstfScript table--may be Null */
   RecordArrayOf<JstfLangSys>
index bf736fe..a599eea 100644 (file)
@@ -51,9 +51,7 @@
 #include "hb-ot-name-table.hh"
 #include "hb-ot-os2-table.hh"
 
-#include "hb-aat-layout-lcar-table.hh"
 #include "hb-aat-layout-morx-table.hh"
-
 #include "hb-aat-layout-opbd-table.hh" // Just so we compile it; unused otherwise.
 
 /**
@@ -78,7 +76,7 @@
  * Tests whether a face includes any kerning data in the 'kern' table.
  * Does NOT test for kerning lookups in the GPOS table.
  *
- * Return value: true if data found, false otherwise
+ * Return value: %true if data found, %false otherwise
  *
  **/
 bool
@@ -94,7 +92,7 @@ hb_ot_layout_has_kerning (hb_face_t *face)
  * Tests whether a face includes any state-machine kerning in the 'kern' table.
  * Does NOT examine the GPOS table.
  *
- * Return value: true if data found, false otherwise
+ * Return value: %true if data found, %false otherwise
  *
  **/
 bool
@@ -114,7 +112,7 @@ hb_ot_layout_has_machine_kerning (hb_face_t *face)
  *
  * Does NOT examine the GPOS table.
  *
- * Return value: true is data found, false otherwise
+ * Return value: %true is data found, %false otherwise
  *
  **/
 bool
@@ -133,7 +131,9 @@ hb_ot_layout_kern (const hb_ot_shape_plan_t *plan,
 
   AAT::hb_aat_apply_context_t c (plan, font, buffer, blob);
 
+  if (!buffer->message (font, "start table kern")) return;
   kern.apply (&c);
+  (void) buffer->message (font, "end table kern");
 }
 #endif
 
@@ -143,13 +143,13 @@ hb_ot_layout_kern (const hb_ot_shape_plan_t *plan,
  */
 
 bool
-OT::GDEF::is_blacklisted (hb_blob_t *blob,
+OT::GDEF::is_blocklisted (hb_blob_t *blob,
                          hb_face_t *face) const
 {
-#ifdef HB_NO_OT_LAYOUT_BLACKLIST
+#ifdef HB_NO_OT_LAYOUT_BLOCKLIST
   return false;
 #endif
-  /* The ugly business of blacklisting individual fonts' tables happen here!
+  /* The ugly business of blocklisting individual fonts' tables happen here!
    * See this thread for why we finally had to bend in and do this:
    * https://lists.freedesktop.org/archives/harfbuzz/2016-February/005489.html
    *
@@ -270,7 +270,7 @@ _hb_ot_layout_set_glyph_props (hb_font_t *font,
  *
  * Tests whether a face has any glyph classes defined in its GDEF table.
  *
- * Return value: true if data found, false otherwise
+ * Return value: %true if data found, %false otherwise
  *
  **/
 hb_bool_t
@@ -324,7 +324,7 @@ hb_ot_layout_get_glyphs_in_class (hb_face_t                  *face,
  * @face: The #hb_face_t to work on
  * @glyph: The #hb_codepoint_t code point to query
  * @start_offset: offset of the first attachment point to retrieve
- * @point_count: (inout) (allow-none): Input = the maximum number of attachment points to return;
+ * @point_count: (inout) (optional): Input = the maximum number of attachment points to return;
  *               Output = the actual number of attachment points returned (may be zero)
  * @point_array: (out) (array length=point_count): The array of attachment points found for the query
  *
@@ -333,6 +333,8 @@ hb_ot_layout_get_glyphs_in_class (hb_face_t                  *face,
  *
  * Useful if the client program wishes to cache the list.
  *
+ * Return value: Total number of attachment points for @glyph.
+ *
  **/
 unsigned int
 hb_ot_layout_get_attach_points (hb_face_t      *face,
@@ -352,13 +354,15 @@ hb_ot_layout_get_attach_points (hb_face_t      *face,
  * @direction: The #hb_direction_t text direction to use
  * @glyph: The #hb_codepoint_t code point to query
  * @start_offset: offset of the first caret position to retrieve
- * @caret_count: (inout) (allow-none): Input = the maximum number of caret positions to return;
+ * @caret_count: (inout) (optional): Input = the maximum number of caret positions to return;
  *               Output = the actual number of caret positions returned (may be zero)
  * @caret_array: (out) (array length=caret_count): The array of caret positions found for the query
  *
  * Fetches a list of the caret positions defined for a ligature glyph in the GDEF
  * table of the font. The list returned will begin at the offset provided.
  *
+ * Return value: Total number of ligature caret positions for @glyph.
+ *
  **/
 unsigned int
 hb_ot_layout_get_ligature_carets (hb_font_t      *font,
@@ -368,21 +372,7 @@ hb_ot_layout_get_ligature_carets (hb_font_t      *font,
                                  unsigned int   *caret_count /* IN/OUT */,
                                  hb_position_t  *caret_array /* OUT */)
 {
-  unsigned int result_caret_count = caret_count ? *caret_count : 0;
-  unsigned int result = font->face->table.GDEF->table->get_lig_carets (font, direction, glyph, start_offset, &result_caret_count, caret_array);
-  if (result)
-  {
-    if (caret_count) *caret_count = result_caret_count;
-  }
-  else
-  {
-#ifndef HB_NO_AAT
-    result = font->face->table.lcar->get_lig_carets (font, direction, glyph, start_offset, caret_count, caret_array);
-#else
-    if (caret_count) *caret_count = 0;
-#endif
-  }
-  return result;
+  return font->face->table.GDEF->table->get_lig_carets (font, direction, glyph, start_offset, caret_count, caret_array);
 }
 #endif
 
@@ -392,20 +382,20 @@ hb_ot_layout_get_ligature_carets (hb_font_t      *font,
  */
 
 bool
-OT::GSUB::is_blacklisted (hb_blob_t *blob HB_UNUSED,
+OT::GSUB::is_blocklisted (hb_blob_t *blob HB_UNUSED,
                          hb_face_t *face) const
 {
-#ifdef HB_NO_OT_LAYOUT_BLACKLIST
+#ifdef HB_NO_OT_LAYOUT_BLOCKLIST
   return false;
 #endif
   return false;
 }
 
 bool
-OT::GPOS::is_blacklisted (hb_blob_t *blob HB_UNUSED,
+OT::GPOS::is_blocklisted (hb_blob_t *blob HB_UNUSED,
                          hb_face_t *face HB_UNUSED) const
 {
-#ifdef HB_NO_OT_LAYOUT_BLACKLIST
+#ifdef HB_NO_OT_LAYOUT_BLOCKLIST
   return false;
 #endif
   return false;
@@ -426,15 +416,17 @@ get_gsubgpos_table (hb_face_t *face,
 /**
  * hb_ot_layout_table_get_script_tags:
  * @face: #hb_face_t to work upon
- * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS
  * @start_offset: offset of the first script tag to retrieve
- * @script_count: (inout) (allow-none): Input = the maximum number of script tags to return;
+ * @script_count: (inout) (optional): Input = the maximum number of script tags to return;
  *                Output = the actual number of script tags returned (may be zero)
  * @script_tags: (out) (array length=script_count): The array of #hb_tag_t script tags found for the query
  *
  * Fetches a list of all scripts enumerated in the specified face's GSUB table
  * or GPOS table. The list returned will begin at the offset provided.
  *
+ * Return value: Total number of script tags.
+ *
  **/
 unsigned int
 hb_ot_layout_table_get_script_tags (hb_face_t    *face,
@@ -453,14 +445,14 @@ hb_ot_layout_table_get_script_tags (hb_face_t    *face,
 /**
  * hb_ot_layout_table_find_script:
  * @face: #hb_face_t to work upon
- * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS
  * @script_tag: #hb_tag_t of the script tag requested
  * @script_index: (out): The index of the requested script tag
  *
  * Fetches the index if a given script tag in the specified face's GSUB table
  * or GPOS table.
  *
- * Return value: true if the script is found, false otherwise
+ * Return value: %true if the script is found, %false otherwise
  *
  **/
 hb_bool_t
@@ -497,7 +489,7 @@ hb_ot_layout_table_find_script (hb_face_t    *face,
 /**
  * hb_ot_layout_table_choose_script:
  * @face: #hb_face_t to work upon
- * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS
  * @script_tags: Array of #hb_tag_t script tags
  * @script_index: (out): The index of the requested script tag
  * @chosen_script: (out): #hb_tag_t of the script tag requested
@@ -520,11 +512,22 @@ hb_ot_layout_table_choose_script (hb_face_t      *face,
 /**
  * hb_ot_layout_table_select_script:
  * @face: #hb_face_t to work upon
- * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS
  * @script_count: Number of script tags in the array
  * @script_tags: Array of #hb_tag_t script tags
- * @script_index: (out): The index of the requested script
- * @chosen_script: (out): #hb_tag_t of the requested script
+ * @script_index: (out) (optional): The index of the requested script
+ * @chosen_script: (out) (optional): #hb_tag_t of the requested script
+ *
+ * Selects an OpenType script for @table_tag from the @script_tags array.
+ *
+ * If the table does not have any of the requested scripts, then `DFLT`,
+ * `dflt`, and `latn` tags are tried in that order. If the table still does not
+ * have any of these scripts, @script_index and @chosen_script are set to
+ * #HB_OT_LAYOUT_NO_SCRIPT_INDEX.
+ *
+ * Return value:
+ * %true if one of the requested scripts is selected, %false if a fallback
+ * script is selected or if no scripts are selected.
  *
  * Since: 2.0.0
  **/
@@ -582,14 +585,16 @@ hb_ot_layout_table_select_script (hb_face_t      *face,
 /**
  * hb_ot_layout_table_get_feature_tags:
  * @face: #hb_face_t to work upon
- * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS
  * @start_offset: offset of the first feature tag to retrieve
- * @feature_count: (inout) (allow-none): Input = the maximum number of feature tags to return;
+ * @feature_count: (inout) (optional): Input = the maximum number of feature tags to return;
  *                 Output = the actual number of feature tags returned (may be zero)
  * @feature_tags: (out) (array length=feature_count): Array of feature tags found in the table
  *
  * Fetches a list of all feature tags in the given face's GSUB or GPOS table.
  *
+ * Return value: Total number of feature tags.
+ *
  **/
 unsigned int
 hb_ot_layout_table_get_feature_tags (hb_face_t    *face,
@@ -607,14 +612,14 @@ hb_ot_layout_table_get_feature_tags (hb_face_t    *face,
 /**
  * hb_ot_layout_table_find_feature:
  * @face: #hb_face_t to work upon
- * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
- * @feature_tag: The #hb_tag_t og the requested feature tag
+ * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS
+ * @feature_tag: The #hb_tag_t of the requested feature tag
  * @feature_index: (out): The index of the requested feature
  *
  * Fetches the index for a given feature tag in the specified face's GSUB table
  * or GPOS table.
  *
- * Return value: true if the feature is found, false otherwise
+ * Return value: %true if the feature is found, %false otherwise
  **/
 bool
 hb_ot_layout_table_find_feature (hb_face_t    *face,
@@ -642,16 +647,18 @@ hb_ot_layout_table_find_feature (hb_face_t    *face,
 /**
  * hb_ot_layout_script_get_language_tags:
  * @face: #hb_face_t to work upon
- * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS
  * @script_index: The index of the requested script tag
  * @start_offset: offset of the first language tag to retrieve
- * @language_count: (inout) (allow-none): Input = the maximum number of language tags to return;
+ * @language_count: (inout) (optional): Input = the maximum number of language tags to return;
  *                  Output = the actual number of language tags returned (may be zero)
  * @language_tags: (out) (array length=language_count): Array of language tags found in the table
  *
  * Fetches a list of language tags in the given face's GSUB or GPOS table, underneath
  * the specified script index. The list returned will begin at the offset provided.
  *
+ * Return value: Total number of language tags.
+ *
  **/
 unsigned int
 hb_ot_layout_script_get_language_tags (hb_face_t    *face,
@@ -671,7 +678,7 @@ hb_ot_layout_script_get_language_tags (hb_face_t    *face,
 /**
  * hb_ot_layout_script_find_language:
  * @face: #hb_face_t to work upon
- * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS
  * @script_index: The index of the requested script tag
  * @language_tag: The #hb_tag_t of the requested language
  * @language_index: The index of the requested language
@@ -679,10 +686,10 @@ hb_ot_layout_script_get_language_tags (hb_face_t    *face,
  * Fetches the index of a given language tag in the specified face's GSUB table
  * or GPOS table, underneath the specified script tag.
  *
- * Return value: true if the language tag is found, false otherwise
+ * Return value: %true if the language tag is found, %false otherwise
  *
- * Since: ??
- * Deprecated: ??
+ * Since: 0.6.0
+ * Deprecated: 2.0.0
  **/
 hb_bool_t
 hb_ot_layout_script_find_language (hb_face_t    *face,
@@ -704,16 +711,20 @@ hb_ot_layout_script_find_language (hb_face_t    *face,
 /**
  * hb_ot_layout_script_select_language:
  * @face: #hb_face_t to work upon
- * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS
  * @script_index: The index of the requested script tag
  * @language_count: The number of languages in the specified script
  * @language_tags: The array of language tags
  * @language_index: (out): The index of the requested language
  *
- * Fetches the index of a given language tag in the specified face's GSUB table
- * or GPOS table, underneath the specified script index.
+ * Fetches the index of the first language tag fom @language_tags that is present
+ * in the specified face's GSUB or GPOS table, underneath the specified script
+ * index.
+ *
+ * If none of the given language tags is found, %false is returned and
+ * @language_index is set to the default language index.
  *
- * Return value: true if the language tag is found, false otherwise
+ * Return value: %true if one of the given language tags is found, %false otherwise
  *
  * Since: 2.0.0
  **/
@@ -739,7 +750,8 @@ hb_ot_layout_script_select_language (hb_face_t      *face,
   if (s.find_lang_sys_index (HB_OT_TAG_DEFAULT_LANGUAGE, language_index))
     return false;
 
-  if (language_index) *language_index = HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX;
+  if (language_index)
+    *language_index = HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX;
   return false;
 }
 
@@ -747,7 +759,7 @@ hb_ot_layout_script_select_language (hb_face_t      *face,
 /**
  * hb_ot_layout_language_get_required_feature_index:
  * @face: #hb_face_t to work upon
- * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS
  * @script_index: The index of the requested script tag
  * @language_index: The index of the requested language tag
  * @feature_index: (out): The index of the requested feature
@@ -755,7 +767,7 @@ hb_ot_layout_script_select_language (hb_face_t      *face,
  * Fetches the index of a requested feature in the given face's GSUB or GPOS table,
  * underneath the specified script and language.
  *
- * Return value: true if the feature is found, false otherwise
+ * Return value: %true if the feature is found, %false otherwise
  *
  **/
 hb_bool_t
@@ -777,7 +789,7 @@ hb_ot_layout_language_get_required_feature_index (hb_face_t    *face,
 /**
  * hb_ot_layout_language_get_required_feature:
  * @face: #hb_face_t to work upon
- * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS
  * @script_index: The index of the requested script tag
  * @language_index: The index of the requested language tag
  * @feature_index: (out): The index of the requested feature
@@ -786,7 +798,7 @@ hb_ot_layout_language_get_required_feature_index (hb_face_t    *face,
  * Fetches the tag of a requested feature index in the given face's GSUB or GPOS table,
  * underneath the specified script and language.
  *
- * Return value: true if the feature is found, false otherwise
+ * Return value: %true if the feature is found, %false otherwise
  *
  * Since: 0.9.30
  **/
@@ -812,17 +824,19 @@ hb_ot_layout_language_get_required_feature (hb_face_t    *face,
 /**
  * hb_ot_layout_language_get_feature_indexes:
  * @face: #hb_face_t to work upon
- * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS
  * @script_index: The index of the requested script tag
  * @language_index: The index of the requested language tag
  * @start_offset: offset of the first feature tag to retrieve
- * @feature_count: (inout) (allow-none): Input = the maximum number of feature tags to return;
+ * @feature_count: (inout) (optional): Input = the maximum number of feature tags to return;
  *                 Output: the actual number of feature tags returned (may be zero)
  * @feature_indexes: (out) (array length=feature_count): The array of feature indexes found for the query
  *
  * Fetches a list of all features in the specified face's GSUB table
  * or GPOS table, underneath the specified script and language. The list
  * returned will begin at the offset provided.
+ *
+ * Return value: Total number of features.
  **/
 unsigned int
 hb_ot_layout_language_get_feature_indexes (hb_face_t    *face,
@@ -843,11 +857,11 @@ hb_ot_layout_language_get_feature_indexes (hb_face_t    *face,
 /**
  * hb_ot_layout_language_get_feature_tags:
  * @face: #hb_face_t to work upon
- * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS
  * @script_index: The index of the requested script tag
  * @language_index: The index of the requested language tag
  * @start_offset: offset of the first feature tag to retrieve
- * @feature_count: (inout) (allow-none): Input = the maximum number of feature tags to return;
+ * @feature_count: (inout) (optional): Input = the maximum number of feature tags to return;
  *                 Output = the actual number of feature tags returned (may be zero)
  * @feature_tags: (out) (array length=feature_count): The array of #hb_tag_t feature tags found for the query
  *
@@ -855,6 +869,7 @@ hb_ot_layout_language_get_feature_indexes (hb_face_t    *face,
  * or GPOS table, underneath the specified script and language. The list
  * returned will begin at the offset provided.
  *
+ * Return value: Total number of feature tags.
  **/
 unsigned int
 hb_ot_layout_language_get_feature_tags (hb_face_t    *face,
@@ -884,7 +899,7 @@ hb_ot_layout_language_get_feature_tags (hb_face_t    *face,
 /**
  * hb_ot_layout_language_find_feature:
  * @face: #hb_face_t to work upon
- * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS
  * @script_index: The index of the requested script tag
  * @language_index: The index of the requested language tag
  * @feature_tag: #hb_tag_t of the feature tag requested
@@ -893,7 +908,7 @@ hb_ot_layout_language_get_feature_tags (hb_face_t    *face,
  * Fetches the index of a given feature tag in the specified face's GSUB table
  * or GPOS table, underneath the specified script and language.
  *
- * Return value: true if the feature is found, false otherwise
+ * Return value: %true if the feature is found, %false otherwise
  *
  **/
 hb_bool_t
@@ -926,10 +941,10 @@ hb_ot_layout_language_find_feature (hb_face_t    *face,
 /**
  * hb_ot_layout_feature_get_lookups:
  * @face: #hb_face_t to work upon
- * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS
  * @feature_index: The index of the requested feature
  * @start_offset: offset of the first lookup to retrieve
- * @lookup_count: (inout) (allow-none): Input = the maximum number of lookups to return;
+ * @lookup_count: (inout) (optional): Input = the maximum number of lookups to return;
  *                Output = the actual number of lookups returned (may be zero)
  * @lookup_indexes: (out) (array length=lookup_count): The array of lookup indexes found for the query
  *
@@ -937,6 +952,8 @@ hb_ot_layout_language_find_feature (hb_face_t    *face,
  * the specified face's GSUB table or GPOS table. The list returned will
  * begin at the offset provided.
  *
+ * Return value: Total number of lookups.
+ *
  * Since: 0.9.7
  **/
 unsigned int
@@ -960,11 +977,13 @@ hb_ot_layout_feature_get_lookups (hb_face_t    *face,
 /**
  * hb_ot_layout_table_get_lookup_count:
  * @face: #hb_face_t to work upon
- * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS
  *
  * Fetches the total number of lookups enumerated in the specified
  * face's GSUB table or GPOS table.
  *
+ * Return value: Total number of lookups.
+ *
  * Since: 0.9.22
  **/
 unsigned int
@@ -979,10 +998,37 @@ struct hb_collect_features_context_t
 {
   hb_collect_features_context_t (hb_face_t *face,
                                 hb_tag_t   table_tag,
-                                hb_set_t  *feature_indexes_)
+                                hb_set_t  *feature_indices_,
+                                 const hb_tag_t *features)
+
     : g (get_gsubgpos_table (face, table_tag)),
-      feature_indexes (feature_indexes_),
-      script_count (0),langsys_count (0), feature_index_count (0) {}
+      feature_indices (feature_indices_),
+      has_feature_filter (false),
+      script_count (0),langsys_count (0), feature_index_count (0)
+  {
+    compute_feature_filter (features);
+  }
+
+  void compute_feature_filter (const hb_tag_t *features)
+  {
+    if (features == nullptr)
+    {
+      has_feature_filter = false;
+      return;
+    }
+
+    has_feature_filter = true;
+    hb_set_t features_set;
+    for (; *features; features++)
+      features_set.add (*features);
+
+    for (unsigned i = 0; i < g.get_feature_count (); i++)
+    {
+      hb_tag_t tag = g.get_feature_tag (i);
+      if (features_set.has (tag))
+        feature_indices_filter.add(i);
+    }
+  }
 
   bool visited (const OT::Script &s)
   {
@@ -1031,7 +1077,9 @@ struct hb_collect_features_context_t
 
   public:
   const OT::GSUBGPOS &g;
-  hb_set_t           *feature_indexes;
+  hb_set_t *feature_indices;
+  hb_set_t  feature_indices_filter;
+  bool has_feature_filter;
 
   private:
   hb_set_t visited_script;
@@ -1043,37 +1091,31 @@ struct hb_collect_features_context_t
 
 static void
 langsys_collect_features (hb_collect_features_context_t *c,
-                         const OT::LangSys  &l,
-                         const hb_tag_t     *features)
+                         const OT::LangSys  &l)
 {
   if (c->visited (l)) return;
 
-  if (!features)
+  if (!c->has_feature_filter)
   {
     /* All features. */
     if (l.has_required_feature () && !c->visited_feature_indices (1))
-      c->feature_indexes->add (l.get_required_feature_index ());
+      c->feature_indices->add (l.get_required_feature_index ());
 
+    // TODO(garretrieger): filter out indices >= feature count?
     if (!c->visited_feature_indices (l.featureIndex.len))
-      l.add_feature_indexes_to (c->feature_indexes);
+      l.add_feature_indexes_to (c->feature_indices);
   }
   else
   {
-    /* Ugh. Any faster way? */
-    for (; *features; features++)
+    if (c->feature_indices_filter.is_empty()) return;
+    unsigned int num_features = l.get_feature_count ();
+    for (unsigned int i = 0; i < num_features; i++)
     {
-      hb_tag_t feature_tag = *features;
-      unsigned int num_features = l.get_feature_count ();
-      for (unsigned int i = 0; i < num_features; i++)
-      {
-       unsigned int feature_index = l.get_feature_index (i);
+      unsigned int feature_index = l.get_feature_index (i);
+      if (!c->feature_indices_filter.has (feature_index)) continue;
 
-       if (feature_tag == c->g.get_feature_tag (feature_index))
-       {
-         c->feature_indexes->add (feature_index);
-         break;
-       }
-      }
+      c->feature_indices->add (feature_index);
+      c->feature_indices_filter.del (feature_index);
     }
   }
 }
@@ -1081,8 +1123,7 @@ langsys_collect_features (hb_collect_features_context_t *c,
 static void
 script_collect_features (hb_collect_features_context_t *c,
                         const OT::Script   &s,
-                        const hb_tag_t *languages,
-                        const hb_tag_t *features)
+                        const hb_tag_t *languages)
 {
   if (c->visited (s)) return;
 
@@ -1091,14 +1132,13 @@ script_collect_features (hb_collect_features_context_t *c,
     /* All languages. */
     if (s.has_default_lang_sys ())
       langsys_collect_features (c,
-                               s.get_default_lang_sys (),
-                               features);
+                               s.get_default_lang_sys ());
+
 
     unsigned int count = s.get_lang_sys_count ();
     for (unsigned int language_index = 0; language_index < count; language_index++)
       langsys_collect_features (c,
-                               s.get_lang_sys (language_index),
-                               features);
+                               s.get_lang_sys (language_index));
   }
   else
   {
@@ -1107,8 +1147,8 @@ script_collect_features (hb_collect_features_context_t *c,
       unsigned int language_index;
       if (s.find_lang_sys_index (*languages, &language_index))
        langsys_collect_features (c,
-                                 s.get_lang_sys (language_index),
-                                 features);
+                                 s.get_lang_sys (language_index));
+
     }
   }
 }
@@ -1117,7 +1157,7 @@ script_collect_features (hb_collect_features_context_t *c,
 /**
  * hb_ot_layout_collect_features:
  * @face: #hb_face_t to work upon
- * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS
  * @scripts: The array of scripts to collect features for
  * @languages: The array of languages to collect features for
  * @features: The array of features to collect
@@ -1139,7 +1179,7 @@ hb_ot_layout_collect_features (hb_face_t      *face,
                               const hb_tag_t *features,
                               hb_set_t       *feature_indexes /* OUT */)
 {
-  hb_collect_features_context_t c (face, table_tag, feature_indexes);
+  hb_collect_features_context_t c (face, table_tag, feature_indexes, features);
   if (!scripts)
   {
     /* All scripts. */
@@ -1147,8 +1187,7 @@ hb_ot_layout_collect_features (hb_face_t      *face,
     for (unsigned int script_index = 0; script_index < count; script_index++)
       script_collect_features (&c,
                               c.g.get_script (script_index),
-                              languages,
-                              features);
+                              languages);
   }
   else
   {
@@ -1158,8 +1197,7 @@ hb_ot_layout_collect_features (hb_face_t      *face,
       if (c.g.find_script_index (*scripts, &script_index))
        script_collect_features (&c,
                                 c.g.get_script (script_index),
-                                languages,
-                                features);
+                                languages);
     }
   }
 }
@@ -1168,7 +1206,7 @@ hb_ot_layout_collect_features (hb_face_t      *face,
 /**
  * hb_ot_layout_collect_lookups:
  * @face: #hb_face_t to work upon
- * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS
  * @scripts: The array of scripts to collect lookups for
  * @languages: The array of languages to collect lookups for
  * @features: The array of features to collect lookups for
@@ -1202,83 +1240,17 @@ hb_ot_layout_collect_lookups (hb_face_t      *face,
   g.feature_variation_collect_lookups (&feature_indexes, lookup_indexes);
 }
 
-#ifdef HB_EXPERIMENTAL_API
-/**
- * hb_ot_layout_closure_lookups:
- * @face: #hb_face_t to work upon
- * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
- * @lookup_indexes: (inout): lookup_indices collected from feature
- * list
- *
- * Returns all inactive lookups reachable from lookup_indices
- *
- * Since: EXPERIMENTAL
- **/
-void
-hb_ot_layout_closure_lookups (hb_face_t      *face,
-                             hb_tag_t        table_tag,
-                             const hb_set_t *glyphs,
-                             hb_set_t       *lookup_indexes /* IN/OUT */)
-{
-  hb_set_t visited_lookups, inactive_lookups;
-  OT::hb_closure_lookups_context_t c (face, glyphs, &visited_lookups, &inactive_lookups);
-
-  for (unsigned lookup_index : + hb_iter (lookup_indexes))
-  {
-    switch (table_tag)
-    {
-      case HB_OT_TAG_GSUB:
-      {
-       const OT::SubstLookup& l = face->table.GSUB->table->get_lookup (lookup_index);
-       l.closure_lookups (&c, lookup_index);
-       break;
-      }
-      case HB_OT_TAG_GPOS:
-      {
-       const OT::PosLookup& l = face->table.GPOS->table->get_lookup (lookup_index);
-       l.closure_lookups (&c, lookup_index);
-       break;
-      }
-    }
-  }
-
-  hb_set_union (lookup_indexes, &visited_lookups);
-  hb_set_subtract (lookup_indexes, &inactive_lookups);
-}
-
-/**
- * hb_ot_layout_closure_features:
- * @face: #hb_face_t to work upon
- * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
- * @lookup_indexes: (in): collected active lookup_indices
- * @feature_indexes: (out): all active feature indexes collected
- *
- * Returns all active feature indexes
- *
- * Since: EXPERIMENTAL
- **/
-void
-hb_ot_layout_closure_features (hb_face_t      *face,
-                              hb_tag_t        table_tag,
-                              const hb_map_t *lookup_indexes, /* IN */
-                              hb_set_t       *feature_indexes /* OUT */)
-{
-  const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
-  g.closure_features (lookup_indexes, feature_indexes);
-}
-#endif
-
 
 #ifndef HB_NO_LAYOUT_COLLECT_GLYPHS
 /**
  * hb_ot_layout_lookup_collect_glyphs:
  * @face: #hb_face_t to work upon
- * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS
  * @lookup_index: The index of the feature lookup to query
  * @glyphs_before: (out): Array of glyphs preceding the substitution range
  * @glyphs_input: (out): Array of input glyphs that would be substituted by the lookup
  * @glyphs_after: (out): Array of glyphs following the substitution range
- * @glyphs_output: (out): Array of glyphs that would be the substitued output of the lookup
+ * @glyphs_output: (out): Array of glyphs that would be the substituted output of the lookup
  *
  * Fetches a list of all glyphs affected by the specified lookup in the
  * specified face's GSUB table or GPOS table.
@@ -1325,14 +1297,16 @@ hb_ot_layout_lookup_collect_glyphs (hb_face_t    *face,
 /**
  * hb_ot_layout_table_find_feature_variations:
  * @face: #hb_face_t to work upon
- * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS
  * @coords: The variation coordinates to query
- * @num_coords: The number of variation coorinates
+ * @num_coords: The number of variation coordinates
  * @variations_index: (out): The array of feature variations found for the query
  *
  * Fetches a list of feature variations in the specified face's GSUB table
  * or GPOS table, at the specified variation coordinates.
  *
+ * Return value: %true if feature variations were found, %false otherwise.
+ *
  **/
 hb_bool_t
 hb_ot_layout_table_find_feature_variations (hb_face_t    *face,
@@ -1350,11 +1324,11 @@ hb_ot_layout_table_find_feature_variations (hb_face_t    *face,
 /**
  * hb_ot_layout_feature_with_variations_get_lookups:
  * @face: #hb_face_t to work upon
- * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS
  * @feature_index: The index of the feature to query
  * @variations_index: The index of the feature variation to query
  * @start_offset: offset of the first lookup to retrieve
- * @lookup_count: (inout) (allow-none): Input = the maximum number of lookups to return;
+ * @lookup_count: (inout) (optional): Input = the maximum number of lookups to return;
  *                Output = the actual number of lookups returned (may be zero)
  * @lookup_indexes: (out) (array length=lookup_count): The array of lookups found for the query
  *
@@ -1362,6 +1336,8 @@ hb_ot_layout_table_find_feature_variations (hb_face_t    *face,
  * the specified face's GSUB table or GPOS table, enabled at the specified
  * variations index. The list returned will begin at the offset provided.
  *
+ * Return value: Total number of lookups.
+ *
  **/
 unsigned int
 hb_ot_layout_feature_with_variations_get_lookups (hb_face_t    *face,
@@ -1392,7 +1368,7 @@ hb_ot_layout_feature_with_variations_get_lookups (hb_face_t    *face,
  *
  * Tests whether the specified face includes any GSUB substitutions.
  *
- * Return value: true if data found, false otherwise
+ * Return value: %true if data found, %false otherwise
  *
  **/
 hb_bool_t
@@ -1408,12 +1384,13 @@ hb_ot_layout_has_substitution (hb_face_t *face)
  * @lookup_index: The index of the lookup to query
  * @glyphs: The sequence of glyphs to query for substitution
  * @glyphs_length: The length of the glyph sequence
- * @zero_context: #hb_bool_t indicating whether substitutions should be context-free
+ * @zero_context: #hb_bool_t indicating whether pre-/post-context are disallowed
+ * in substitutions
  *
  * Tests whether a specified lookup in the specified face would
  * trigger a substitution on the given glyph sequence.
  *
- * Return value: true if a substitution would be triggered, false otherwise
+ * Return value: %true if a substitution would be triggered, %false otherwise
  *
  * Since: 0.9.7
  **/
@@ -1428,7 +1405,6 @@ hb_ot_layout_lookup_would_substitute (hb_face_t            *face,
   OT::hb_would_apply_context_t c (face, glyphs, glyphs_length, (bool) zero_context);
 
   const OT::SubstLookup& l = face->table.GSUB->table->get_lookup (lookup_index);
-
   return l.would_apply (&c, &face->table.GSUB->accels[lookup_index]);
 }
 
@@ -1446,7 +1422,7 @@ void
 hb_ot_layout_substitute_start (hb_font_t    *font,
                               hb_buffer_t  *buffer)
 {
-_hb_ot_layout_set_glyph_props (font, buffer);
+  _hb_ot_layout_set_glyph_props (font, buffer);
 }
 
 void
@@ -1515,12 +1491,16 @@ hb_ot_layout_lookup_substitute_closure (hb_face_t    *face,
                                        unsigned int  lookup_index,
                                        hb_set_t     *glyphs /* OUT */)
 {
-  hb_map_t done_lookups;
-  OT::hb_closure_context_t c (face, glyphs, &done_lookups);
+  hb_map_t done_lookups_glyph_count;
+  hb_hashmap_t<unsigned, hb_set_t *> done_lookups_glyph_set;
+  OT::hb_closure_context_t c (face, glyphs, &done_lookups_glyph_count, &done_lookups_glyph_set);
 
   const OT::SubstLookup& l = face->table.GSUB->table->get_lookup (lookup_index);
 
   l.closure (&c, lookup_index);
+
+  for (auto _ : done_lookups_glyph_set.iter ())
+    hb_set_destroy (_.second);
 }
 
 /**
@@ -1539,14 +1519,16 @@ hb_ot_layout_lookups_substitute_closure (hb_face_t      *face,
                                         const hb_set_t *lookups,
                                         hb_set_t       *glyphs /* OUT */)
 {
-  hb_map_t done_lookups;
-  OT::hb_closure_context_t c (face, glyphs, &done_lookups);
+  hb_map_t done_lookups_glyph_count;
+  hb_hashmap_t<unsigned, hb_set_t *> done_lookups_glyph_set;
+  OT::hb_closure_context_t c (face, glyphs, &done_lookups_glyph_count, &done_lookups_glyph_set);
   const OT::GSUB& gsub = *face->table.GSUB->table;
 
   unsigned int iteration_count = 0;
   unsigned int glyphs_length;
   do
   {
+    c.reset_lookup_visit_count ();
     glyphs_length = glyphs->get_population ();
     if (lookups)
     {
@@ -1560,6 +1542,9 @@ hb_ot_layout_lookups_substitute_closure (hb_face_t      *face,
     }
   } while (iteration_count++ <= HB_CLOSURE_MAX_STAGES &&
           glyphs_length != glyphs->get_population ());
+
+  for (auto _ : done_lookups_glyph_set.iter ())
+    hb_set_destroy (_.second);
 }
 
 /*
@@ -1571,7 +1556,9 @@ hb_ot_layout_lookups_substitute_closure (hb_face_t      *face,
  * hb_ot_layout_has_positioning:
  * @face: #hb_face_t to work upon
  *
- * Return value: true if the face has GPOS data, false otherwise
+ * Tests whether the specified face includes any GPOS positioning.
+ *
+ * Return value: %true if the face has GPOS data, %false otherwise
  *
  **/
 hb_bool_t
@@ -1644,7 +1631,7 @@ hb_ot_layout_position_finish_offsets (hb_font_t *font, hb_buffer_t *buffer)
  * For more information on this distinction, see the [`size` feature documentation](
  * https://docs.microsoft.com/en-us/typography/opentype/spec/features_pt#tag-size).
  *
- * Return value: true if data found, false otherwise
+ * Return value: %true if data found, %false otherwise
  *
  * Since: 0.9.10
  **/
@@ -1693,22 +1680,22 @@ hb_ot_layout_get_size_params (hb_face_t       *face,
  * @face: #hb_face_t to work upon
  * @table_tag: table tag to query, "GSUB" or "GPOS".
  * @feature_index: index of feature to query.
- * @label_id: (out) (allow-none): The ‘name’ table name ID that specifies a string
+ * @label_id: (out) (optional): The ‘name’ table name ID that specifies a string
  *            for a user-interface label for this feature. (May be NULL.)
- * @tooltip_id: (out) (allow-none): The ‘name’ table name ID that specifies a string
+ * @tooltip_id: (out) (optional): The ‘name’ table name ID that specifies a string
  *              that an application can use for tooltip text for this
  *              feature. (May be NULL.)
- * @sample_id: (out) (allow-none): The ‘name’ table name ID that specifies sample text
+ * @sample_id: (out) (optional): The ‘name’ table name ID that specifies sample text
  *             that illustrates the effect of this feature. (May be NULL.)
- * @num_named_parameters: (out) (allow-none):  Number of named parameters. (May be zero.)
- * @first_param_id: (out) (allow-none): The first ‘name’ table name ID used to specify
+ * @num_named_parameters: (out) (optional):  Number of named parameters. (May be zero.)
+ * @first_param_id: (out) (optional): The first ‘name’ table name ID used to specify
  *                  strings for user-interface labels for the feature
  *                  parameters. (Must be zero if numParameters is zero.)
  *
  * Fetches name indices from feature parameters for "Stylistic Set" ('ssXX') or
  * "Character Variant" ('cvXX') features.
  *
- * Return value: true if data found, false otherwise
+ * Return value: %true if data found, %false otherwise
  *
  * Since: 2.0.0
  **/
@@ -1768,7 +1755,7 @@ hb_ot_layout_feature_get_name_ids (hb_face_t       *face,
  * @table_tag: table tag to query, "GSUB" or "GPOS".
  * @feature_index: index of feature to query.
  * @start_offset: offset of the first character to retrieve
- * @char_count: (inout) (allow-none): Input = the maximum number of characters to return;
+ * @char_count: (inout) (optional): Input = the maximum number of characters to return;
  *              Output = the actual number of characters returned (may be zero)
  * @characters: (out caller-allocates) (array length=char_count): A buffer pointer.
  *              The Unicode codepoints of the characters for which this feature provides
@@ -1777,12 +1764,6 @@ hb_ot_layout_feature_get_name_ids (hb_face_t       *face,
  * Fetches a list of the characters defined as having a variant under the specified
  * "Character Variant" ("cvXX") feature tag.
  *
- * <note>Note: If the char_count output value is equal to its input value, then there
- *       is a chance there were more characters defined under the feature tag than were
- *       returned. This function can be called with incrementally larger start_offset
- *       until the char_count output value is lower than its input value, or the size
- *       of the characters array can be increased.</note>
- *
  * Return value: Number of total sample characters in the cvXX feature.
  *
  * Since: 2.0.0
@@ -1796,24 +1777,10 @@ hb_ot_layout_feature_get_characters (hb_face_t      *face,
                                     hb_codepoint_t *characters  /* OUT.     May be NULL */)
 {
   const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
-
-  hb_tag_t feature_tag = g.get_feature_tag (feature_index);
-  const OT::Feature &f = g.get_feature (feature_index);
-
-  const OT::FeatureParams &feature_params = f.get_feature_params ();
-
-  const OT::FeatureParamsCharacterVariants& cv_params =
-    feature_params.get_character_variants_params(feature_tag);
-
-  unsigned int len = 0;
-  if (char_count && characters && start_offset < cv_params.characters.len)
-  {
-    len = hb_min (cv_params.characters.len - start_offset, *char_count);
-    for (unsigned int i = 0; i < len; ++i)
-      characters[i] = cv_params.characters[start_offset + i];
-  }
-  if (char_count) *char_count = len;
-  return cv_params.characters.len;
+  return g.get_feature (feature_index)
+         .get_feature_params ()
+         .get_character_variants_params(g.get_feature_tag (feature_index))
+         .get_characters (start_offset, char_count, characters);
 }
 #endif
 
@@ -1872,7 +1839,7 @@ apply_forward (OT::hb_ot_apply_context_t *c,
     if (applied)
       ret = true;
     else
-      buffer->next_glyph ();
+      (void) buffer->next_glyph ();
   }
   return ret;
 }
@@ -1914,27 +1881,20 @@ apply_string (OT::hb_ot_apply_context_t *c,
   if (likely (!lookup.is_reverse ()))
   {
     /* in/out forward substitution/positioning */
-    if (Proxy::table_index == 0u)
+    if (!Proxy::inplace)
       buffer->clear_output ();
+
     buffer->idx = 0;
+    apply_forward (c, accel);
 
-    bool ret;
-    ret = apply_forward (c, accel);
-    if (ret)
-    {
-      if (!Proxy::inplace)
-       buffer->swap_buffers ();
-      else
-       assert (!buffer->has_separate_output ());
-    }
+    if (!Proxy::inplace)
+      buffer->sync ();
   }
   else
   {
     /* in-place backward substitution/positioning */
-    if (Proxy::table_index == 0u)
-      buffer->remove_output ();
+    assert (!buffer->have_output);
     buffer->idx = buffer->len - 1;
-
     apply_backward (c, accel);
   }
 }
@@ -1950,7 +1910,8 @@ inline void hb_ot_map_t::apply (const Proxy &proxy,
   OT::hb_ot_apply_context_t c (table_index, font, buffer);
   c.set_recurse_func (Proxy::Lookup::apply_recurse_func);
 
-  for (unsigned int stage_index = 0; stage_index < stages[table_index].length; stage_index++) {
+  for (unsigned int stage_index = 0; stage_index < stages[table_index].length; stage_index++)
+  {
     const stage_map_t *stage = &stages[table_index][stage_index];
     for (; i < stage->last_lookup; i++)
     {
@@ -1960,11 +1921,8 @@ inline void hb_ot_map_t::apply (const Proxy &proxy,
       c.set_lookup_mask (lookups[table_index][i].mask);
       c.set_auto_zwj (lookups[table_index][i].auto_zwj);
       c.set_auto_zwnj (lookups[table_index][i].auto_zwnj);
-      if (lookups[table_index][i].random)
-      {
-       c.set_random (true);
-       buffer->unsafe_to_break_all ();
-      }
+      c.set_random (lookups[table_index][i].random);
+
       apply_string<Proxy> (&c,
                           proxy.table.get_lookup (lookup_index),
                           proxy.accels[lookup_index]);
@@ -1972,23 +1930,24 @@ inline void hb_ot_map_t::apply (const Proxy &proxy,
     }
 
     if (stage->pause_func)
-    {
-      buffer->clear_output ();
       stage->pause_func (plan, font, buffer);
-    }
   }
 }
 
 void hb_ot_map_t::substitute (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) const
 {
   GSUBProxy proxy (font->face);
+  if (!buffer->message (font, "start table GSUB")) return;
   apply (proxy, plan, font, buffer);
+  (void) buffer->message (font, "end table GSUB");
 }
 
 void hb_ot_map_t::position (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) const
 {
   GPOSProxy proxy (font->face);
+  if (!buffer->message (font, "start table GPOS")) return;
   apply (proxy, plan, font, buffer);
+  (void) buffer->message (font, "end table GPOS");
 }
 
 void
@@ -2006,12 +1965,12 @@ hb_ot_layout_substitute_lookup (OT::hb_ot_apply_context_t *c,
  * @baseline_tag: a baseline tag
  * @direction: text direction.
  * @script_tag:  script tag.
- * @language_tag: language tag.
+ * @language_tag: language tag, currently unused.
  * @coord: (out): baseline value if found.
  *
  * Fetches a baseline value from the face.
  *
- * Return value: if found baseline value in the font.
+ * Return value: %true if found baseline value in the font.
  *
  * Since: 2.6.0
  **/
@@ -2031,4 +1990,62 @@ hb_ot_layout_get_baseline (hb_font_t                   *font,
   return result;
 }
 #endif
+
+
+struct hb_get_glyph_alternates_dispatch_t :
+       hb_dispatch_context_t<hb_get_glyph_alternates_dispatch_t, unsigned>
+{
+  static return_t default_return_value () { return 0; }
+  bool stop_sublookup_iteration (return_t r) const { return r; }
+
+  hb_face_t *face;
+
+  hb_get_glyph_alternates_dispatch_t (hb_face_t *face) :
+                                       face (face) {}
+
+  private:
+  template <typename T, typename ...Ts> auto
+  _dispatch (const T &obj, hb_priority<1>, Ts&&... ds) HB_AUTO_RETURN
+  ( obj.get_glyph_alternates (std::forward<Ts> (ds)...) )
+  template <typename T, typename ...Ts> auto
+  _dispatch (const T &obj, hb_priority<0>, Ts&&... ds) HB_AUTO_RETURN
+  ( default_return_value () )
+  public:
+  template <typename T, typename ...Ts> auto
+  dispatch (const T &obj, Ts&&... ds) HB_AUTO_RETURN
+  ( _dispatch (obj, hb_prioritize, std::forward<Ts> (ds)...) )
+};
+
+/**
+ * hb_ot_layout_lookup_get_glyph_alternates:
+ * @face: a face.
+ * @lookup_index: index of the feature lookup to query.
+ * @glyph: a glyph id.
+ * @start_offset: starting offset.
+ * @alternate_count: (inout) (optional): Input = the maximum number of alternate glyphs to return;
+ *                   Output = the actual number of alternate glyphs returned (may be zero).
+ * @alternate_glyphs: (out caller-allocates) (array length=alternate_count): A glyphs buffer.
+ *                    Alternate glyphs associated with the glyph id.
+ *
+ * Fetches alternates of a glyph from a given GSUB lookup index.
+ *
+ * Return value: Total number of alternates found in the specific lookup index for the given glyph id.
+ *
+ * Since: 2.6.8
+ **/
+HB_EXTERN unsigned
+hb_ot_layout_lookup_get_glyph_alternates (hb_face_t      *face,
+                                         unsigned        lookup_index,
+                                         hb_codepoint_t  glyph,
+                                         unsigned        start_offset,
+                                         unsigned       *alternate_count  /* IN/OUT.  May be NULL. */,
+                                         hb_codepoint_t *alternate_glyphs /* OUT.     May be NULL. */)
+{
+  hb_get_glyph_alternates_dispatch_t c (face);
+  const OT::SubstLookup &lookup = face->table.GSUB->table->get_lookup (lookup_index);
+  auto ret = lookup.dispatch (&c, glyph, start_offset, alternate_count, alternate_glyphs);
+  if (!ret && alternate_count) *alternate_count = 0;
+  return ret;
+}
+
 #endif
index 6255a91..d47ba0f 100644 (file)
@@ -24,7 +24,7 @@
  * Red Hat Author(s): Behdad Esfahbod
  */
 
-#ifndef HB_OT_H_IN
+#if !defined(HB_OT_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb-ot.h> instead."
 #endif
 
 HB_BEGIN_DECLS
 
 
+/**
+ * HB_OT_TAG_BASE:
+ *
+ * OpenType [Baseline Table](https://docs.microsoft.com/en-us/typography/opentype/spec/base).
+ */
 #define HB_OT_TAG_BASE HB_TAG('B','A','S','E')
+/**
+ * HB_OT_TAG_GDEF:
+ *
+ * OpenType [Glyph Definition Table](https://docs.microsoft.com/en-us/typography/opentype/spec/gdef).
+ */
 #define HB_OT_TAG_GDEF HB_TAG('G','D','E','F')
+/**
+ * HB_OT_TAG_GSUB:
+ *
+ * OpenType [Glyph Substitution Table](https://docs.microsoft.com/en-us/typography/opentype/spec/gsub).
+ */
 #define HB_OT_TAG_GSUB HB_TAG('G','S','U','B')
+/**
+ * HB_OT_TAG_GPOS:
+ *
+ * OpenType [Glyph Positioning Table](https://docs.microsoft.com/en-us/typography/opentype/spec/gpos).
+ */
 #define HB_OT_TAG_GPOS HB_TAG('G','P','O','S')
+/**
+ * HB_OT_TAG_JSTF:
+ *
+ * OpenType [Justification Table](https://docs.microsoft.com/en-us/typography/opentype/spec/jstf).
+ */
 #define HB_OT_TAG_JSTF HB_TAG('J','S','T','F')
 
 
@@ -49,18 +74,34 @@ HB_BEGIN_DECLS
  * Script & Language tags.
  */
 
+/**
+ * HB_OT_TAG_DEFAULT_SCRIPT:
+ *
+ * OpenType script tag, `DFLT`, for features that are not script-specific.
+ *
+ */
 #define HB_OT_TAG_DEFAULT_SCRIPT       HB_TAG ('D', 'F', 'L', 'T')
+/**
+ * HB_OT_TAG_DEFAULT_LANGUAGE:
+ *
+ * OpenType language tag, `dflt`. Not a valid language tag, but some fonts
+ * mistakenly use it.
+ */
 #define HB_OT_TAG_DEFAULT_LANGUAGE     HB_TAG ('d', 'f', 'l', 't')
 
 /**
  * HB_OT_MAX_TAGS_PER_SCRIPT:
  *
+ * Maximum number of OpenType tags that can correspond to a give #hb_script_t.
+ *
  * Since: 2.0.0
  **/
 #define HB_OT_MAX_TAGS_PER_SCRIPT      3u
 /**
  * HB_OT_MAX_TAGS_PER_LANGUAGE:
  *
+ * Maximum number of OpenType tags that can correspond to a give #hb_language_t.
+ *
  * Since: 2.0.0
  **/
 #define HB_OT_MAX_TAGS_PER_LANGUAGE    3u
@@ -144,9 +185,29 @@ hb_ot_layout_get_ligature_carets (hb_font_t      *font,
  * GSUB/GPOS feature query and enumeration interface
  */
 
+/**
+ * HB_OT_LAYOUT_NO_SCRIPT_INDEX:
+ *
+ * Special value for script index indicating unsupported script.
+ */
 #define HB_OT_LAYOUT_NO_SCRIPT_INDEX           0xFFFFu
+/**
+ * HB_OT_LAYOUT_NO_FEATURE_INDEX:
+ *
+ * Special value for feature index indicating unsupported feature.
+ */
 #define HB_OT_LAYOUT_NO_FEATURE_INDEX          0xFFFFu
+/**
+ * HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX:
+ *
+ * Special value for language index indicating default or unsupported language.
+ */
 #define HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX    0xFFFFu
+/**
+ * HB_OT_LAYOUT_NO_VARIATIONS_INDEX:
+ *
+ * Special value for variations index indicating unsupported variation.
+ */
 #define HB_OT_LAYOUT_NO_VARIATIONS_INDEX       0xFFFFFFFFu
 
 HB_EXTERN unsigned int
@@ -262,20 +323,6 @@ hb_ot_layout_collect_lookups (hb_face_t      *face,
                              const hb_tag_t *features,
                              hb_set_t       *lookup_indexes /* OUT */);
 
-#ifdef HB_EXPERIMENTAL_API
-HB_EXTERN void
-hb_ot_layout_closure_lookups (hb_face_t      *face,
-                             hb_tag_t        table_tag,
-                             const hb_set_t *glyphs,
-                             hb_set_t       *lookup_indexes /* IN/OUT */);
-
-HB_EXTERN void
-hb_ot_layout_closure_features (hb_face_t      *face,
-                              hb_tag_t        table_tag,
-                              const hb_map_t *lookup_indexes, /* IN */
-                              hb_set_t       *feature_indexes /* OUT */);
-#endif
-
 HB_EXTERN void
 hb_ot_layout_lookup_collect_glyphs (hb_face_t    *face,
                                    hb_tag_t      table_tag,
@@ -337,6 +384,14 @@ hb_ot_layout_feature_with_variations_get_lookups (hb_face_t    *face,
 HB_EXTERN hb_bool_t
 hb_ot_layout_has_substitution (hb_face_t *face);
 
+HB_EXTERN unsigned
+hb_ot_layout_lookup_get_glyph_alternates (hb_face_t      *face,
+                                         unsigned        lookup_index,
+                                         hb_codepoint_t  glyph,
+                                         unsigned        start_offset,
+                                         unsigned       *alternate_count /* IN/OUT */,
+                                         hb_codepoint_t *alternate_glyphs /* OUT */);
+
 HB_EXTERN hb_bool_t
 hb_ot_layout_lookup_would_substitute (hb_face_t            *face,
                                      unsigned int          lookup_index,
@@ -439,7 +494,7 @@ hb_ot_layout_feature_get_characters (hb_face_t      *face,
  * @HB_OT_LAYOUT_BASELINE_TAG_MATH: The baseline about which mathematical characters are centered.
  * In vertical writing mode when mathematical characters rotated 90 degrees clockwise, are centered.
  *
- * Baseline tags from https://docs.microsoft.com/en-us/typography/opentype/spec/baselinetags
+ * Baseline tags from [Baseline Tags](https://docs.microsoft.com/en-us/typography/opentype/spec/baselinetags) registry.
  *
  * Since: 2.6.0
  */
@@ -452,6 +507,7 @@ typedef enum {
   HB_OT_LAYOUT_BASELINE_TAG_IDEO_EMBOX_TOP_OR_RIGHT    = HB_TAG ('i','d','t','p'),
   HB_OT_LAYOUT_BASELINE_TAG_MATH                       = HB_TAG ('m','a','t','h'),
 
+  /*< private >*/
   _HB_OT_LAYOUT_BASELINE_TAG_MAX_VALUE = HB_TAG_MAX_SIGNED /*< skip >*/
 } hb_ot_layout_baseline_tag_t;
 
@@ -463,7 +519,6 @@ hb_ot_layout_get_baseline (hb_font_t                   *font,
                           hb_tag_t                     language_tag,
                           hb_position_t               *coord        /* OUT.  May be NULL. */);
 
-
 HB_END_DECLS
 
 #endif /* HB_OT_LAYOUT_H */
index 4e052b0..ede8f00 100644 (file)
@@ -80,14 +80,14 @@ enum hb_ot_layout_glyph_props_flags_t
   HB_OT_LAYOUT_GLYPH_PROPS_LIGATURE    = 0x04u,
   HB_OT_LAYOUT_GLYPH_PROPS_MARK                = 0x08u,
 
-  HB_OT_LAYOUT_GLYPH_PROPS_CLASS_MASK   = HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH |
-                                         HB_OT_LAYOUT_GLYPH_PROPS_LIGATURE |
-                                         HB_OT_LAYOUT_GLYPH_PROPS_MARK,
-
   /* The following are used internally; not derived from GDEF. */
   HB_OT_LAYOUT_GLYPH_PROPS_SUBSTITUTED = 0x10u,
   HB_OT_LAYOUT_GLYPH_PROPS_LIGATED     = 0x20u,
   HB_OT_LAYOUT_GLYPH_PROPS_MULTIPLIED  = 0x40u,
+
+  HB_OT_LAYOUT_GLYPH_PROPS_PRESERVE     = HB_OT_LAYOUT_GLYPH_PROPS_SUBSTITUTED |
+                                         HB_OT_LAYOUT_GLYPH_PROPS_LIGATED |
+                                         HB_OT_LAYOUT_GLYPH_PROPS_MULTIPLIED
 };
 HB_MARK_AS_FLAG_T (hb_ot_layout_glyph_props_flags_t);
 
@@ -187,7 +187,7 @@ _hb_clear_syllables (const hb_ot_shape_plan_t *plan HB_UNUSED,
  * - General_Category: 5 bits.
  * - A bit each for:
  *   * Is it Default_Ignorable(); we have a modified Default_Ignorable().
- *   * Whether it's one of the three Mongolian Free Variation Selectors,
+ *   * Whether it's one of the four Mongolian Free Variation Selectors,
  *     CGJ, or other characters that are hidden but should not be ignored
  *     like most other Default_Ignorable()s do during matching.
  *   * Whether it's a grapheme continuation.
@@ -202,7 +202,7 @@ _hb_clear_syllables (const hb_ot_shape_plan_t *plan HB_UNUSED,
 enum hb_unicode_props_flags_t {
   UPROPS_MASK_GEN_CAT  = 0x001Fu,
   UPROPS_MASK_IGNORABLE        = 0x0020u,
-  UPROPS_MASK_HIDDEN   = 0x0040u, /* MONGOLIAN FREE VARIATION SELECTOR 1..3, or TAG characters */
+  UPROPS_MASK_HIDDEN   = 0x0040u, /* MONGOLIAN FREE VARIATION SELECTOR 1..4, or TAG characters */
   UPROPS_MASK_CONTINUATION=0x0080u,
 
   /* If GEN_CAT=FORMAT, top byte masks: */
@@ -236,7 +236,7 @@ _hb_glyph_info_set_unicode_props (hb_glyph_info_t *info, hb_buffer_t *buffer)
        * FVSes are GC=Mn, we have use a separate bit to remember them.
        * Fixes:
        * https://github.com/harfbuzz/harfbuzz/issues/234 */
-      else if (unlikely (hb_in_range<hb_codepoint_t> (u, 0x180Bu, 0x180Du))) props |= UPROPS_MASK_HIDDEN;
+      else if (unlikely (hb_in_ranges<hb_codepoint_t> (u, 0x180Bu, 0x180Du, 0x180Fu, 0x180Fu))) props |= UPROPS_MASK_HIDDEN;
       /* TAG characters need similar treatment. Fixes:
        * https://github.com/harfbuzz/harfbuzz/issues/463 */
       else if (unlikely (hb_in_range<hb_codepoint_t> (u, 0xE0020u, 0xE007Fu))) props |= UPROPS_MASK_HIDDEN;
@@ -314,20 +314,20 @@ _hb_glyph_info_get_unicode_space_fallback_type (const hb_glyph_info_t *info)
         hb_unicode_funcs_t::NOT_SPACE;
 }
 
-static inline bool _hb_glyph_info_ligated (const hb_glyph_info_t *info);
+static inline bool _hb_glyph_info_substituted (const hb_glyph_info_t *info);
 
 static inline bool
 _hb_glyph_info_is_default_ignorable (const hb_glyph_info_t *info)
 {
   return (info->unicode_props() & UPROPS_MASK_IGNORABLE) &&
-        !_hb_glyph_info_ligated (info);
+        !_hb_glyph_info_substituted (info);
 }
 static inline bool
 _hb_glyph_info_is_default_ignorable_and_not_hidden (const hb_glyph_info_t *info)
 {
   return ((info->unicode_props() & (UPROPS_MASK_IGNORABLE|UPROPS_MASK_HIDDEN))
          == UPROPS_MASK_IGNORABLE) &&
-        !_hb_glyph_info_ligated (info);
+        !_hb_glyph_info_substituted (info);
 }
 static inline void
 _hb_glyph_info_unhide (hb_glyph_info_t *info)
@@ -350,24 +350,20 @@ _hb_glyph_info_is_continuation (const hb_glyph_info_t *info)
 {
   return info->unicode_props() & UPROPS_MASK_CONTINUATION;
 }
-/* Loop over grapheme. Based on foreach_cluster(). */
-#define foreach_grapheme(buffer, start, end) \
-  for (unsigned int \
-       _count = buffer->len, \
-       start = 0, end = _count ? _hb_next_grapheme (buffer, 0) : 0; \
-       start < _count; \
-       start = end, end = _hb_next_grapheme (buffer, start))
 
-static inline unsigned int
-_hb_next_grapheme (hb_buffer_t *buffer, unsigned int start)
-{
-  hb_glyph_info_t *info = buffer->info;
-  unsigned int count = buffer->len;
+static inline bool
+_hb_grapheme_group_func (const hb_glyph_info_t& a HB_UNUSED,
+                        const hb_glyph_info_t& b)
+{ return _hb_glyph_info_is_continuation (&b); }
 
-  while (++start < count && _hb_glyph_info_is_continuation (&info[start]))
-    ;
+#define foreach_grapheme(buffer, start, end) \
+       foreach_group (buffer, start, end, _hb_grapheme_group_func)
 
-  return start;
+static inline void
+_hb_ot_layout_reverse_graphemes (hb_buffer_t *buffer)
+{
+  buffer->reverse_groups (_hb_grapheme_group_func,
+                         buffer->cluster_level == HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS);
 }
 
 static inline bool
@@ -486,10 +482,9 @@ _hb_glyph_info_get_lig_num_comps (const hb_glyph_info_t *info)
 }
 
 static inline uint8_t
-_hb_allocate_lig_id (hb_buffer_t *buffer) {
+_hb_allocate_lig_id (hb_buffer_t *buffer)
+{
   uint8_t lig_id = buffer->next_serial () & 0x07;
-  if (unlikely (!lig_id))
-    lig_id = _hb_allocate_lig_id (buffer); /* in case of overflow */
   return lig_id;
 }
 
index e4bb4b6..12ceea5 100644 (file)
@@ -54,7 +54,6 @@ hb_ot_map_builder_t::hb_ot_map_builder_t (hb_face_t *face_,
   face = face_;
   props = *props_;
 
-
   /* Fetch script/language indices for GSUB/GPOS.  We need these later to skip
    * features not available in either table and not waste precious bits for them. */
 
@@ -63,12 +62,28 @@ hb_ot_map_builder_t::hb_ot_map_builder_t (hb_face_t *face_,
   hb_tag_t script_tags[HB_OT_MAX_TAGS_PER_SCRIPT];
   hb_tag_t language_tags[HB_OT_MAX_TAGS_PER_LANGUAGE];
 
-  hb_ot_tags_from_script_and_language (props.script, props.language, &script_count, script_tags, &language_count, language_tags);
+  hb_ot_tags_from_script_and_language (props.script,
+                                      props.language,
+                                      &script_count,
+                                      script_tags,
+                                      &language_count,
+                                      language_tags);
 
-  for (unsigned int table_index = 0; table_index < 2; table_index++) {
+  for (unsigned int table_index = 0; table_index < 2; table_index++)
+  {
     hb_tag_t table_tag = table_tags[table_index];
-    found_script[table_index] = (bool) hb_ot_layout_table_select_script (face, table_tag, script_count, script_tags, &script_index[table_index], &chosen_script[table_index]);
-    hb_ot_layout_script_select_language (face, table_tag, script_index[table_index], language_count, language_tags, &language_index[table_index]);
+    found_script[table_index] = (bool) hb_ot_layout_table_select_script (face,
+                                                                        table_tag,
+                                                                        script_count,
+                                                                        script_tags,
+                                                                        &script_index[table_index],
+                                                                        &chosen_script[table_index]);
+    hb_ot_layout_script_select_language (face,
+                                        table_tag,
+                                        script_index[table_index],
+                                        language_count,
+                                        language_tags,
+                                        &language_index[table_index]);
   }
 }
 
@@ -150,9 +165,8 @@ void
 hb_ot_map_builder_t::compile (hb_ot_map_t                  &m,
                              const hb_ot_shape_plan_key_t &key)
 {
-  static_assert ((!(HB_GLYPH_FLAG_DEFINED & (HB_GLYPH_FLAG_DEFINED + 1))), "");
-  unsigned int global_bit_mask = HB_GLYPH_FLAG_DEFINED + 1;
-  unsigned int global_bit_shift = hb_popcount (HB_GLYPH_FLAG_DEFINED);
+  unsigned int global_bit_shift = 8 * sizeof (hb_mask_t) - 1;
+  unsigned int global_bit_mask = 1u << global_bit_shift;
 
   m.global_mask = global_bit_mask;
 
@@ -205,7 +219,8 @@ hb_ot_map_builder_t::compile (hb_ot_map_t                  &m,
 
 
   /* Allocate bits now */
-  unsigned int next_bit = global_bit_shift + 1;
+  static_assert ((!(HB_GLYPH_FLAG_DEFINED & (HB_GLYPH_FLAG_DEFINED + 1))), "");
+  unsigned int next_bit = hb_popcount (HB_GLYPH_FLAG_DEFINED) + 1;
 
   for (unsigned int i = 0; i < feature_infos.length; i++)
   {
@@ -220,7 +235,7 @@ hb_ot_map_builder_t::compile (hb_ot_map_t                  &m,
       /* Limit bits per feature. */
       bits_needed = hb_min (HB_OT_MAP_MAX_BITS, hb_bit_storage (info->max_value));
 
-    if (!info->max_value || next_bit + bits_needed > 8 * sizeof (hb_mask_t))
+    if (!info->max_value || next_bit + bits_needed >= global_bit_shift)
       continue; /* Feature disabled, or not enough bits. */
 
 
@@ -274,7 +289,6 @@ hb_ot_map_builder_t::compile (hb_ot_map_t                  &m,
     }
     map->_1_mask = (1u << map->shift) & map->mask;
     map->needs_fallback = !found;
-
   }
   feature_infos.shrink (0); /* Done with these */
 
index b4f2fb9..5f2afae 100644 (file)
@@ -140,12 +140,12 @@ struct hb_ot_map_t
   void get_stage_lookups (unsigned int table_index, unsigned int stage,
                          const struct lookup_map_t **plookups, unsigned int *lookup_count) const
   {
-    if (unlikely (stage == UINT_MAX)) {
+    if (unlikely (stage > stages[table_index].length))
+    {
       *plookups = nullptr;
       *lookup_count = 0;
       return;
     }
-    assert (stage <= stages[table_index].length);
     unsigned int start = stage ? stages[table_index][stage - 1].last_lookup : 0;
     unsigned int end   = stage < stages[table_index].length ? stages[table_index][stage].last_lookup : lookups[table_index].length;
     *plookups = end == start ? nullptr : &lookups[table_index][start];
@@ -213,8 +213,8 @@ struct hb_ot_map_builder_t
   { add_feature (feat.tag, feat.flags); }
 
   void enable_feature (hb_tag_t tag,
-                             hb_ot_map_feature_flags_t flags=F_NONE,
-                             unsigned int value=1)
+                      hb_ot_map_feature_flags_t flags=F_NONE,
+                      unsigned int value=1)
   { add_feature (tag, F_GLOBAL | flags, value); }
 
   void disable_feature (hb_tag_t tag)
index 0033f4c..d834d94 100644 (file)
@@ -41,6 +41,16 @@ struct MathValueRecord
   hb_position_t get_y_value (hb_font_t *font, const void *base) const
   { return font->em_scale_y (value) + (base+deviceTable).get_y_delta (font); }
 
+  MathValueRecord* copy (hb_serialize_context_t *c, const void *base) const
+  {
+    TRACE_SERIALIZE (this);
+    auto *out = c->embed (this);
+    if (unlikely (!out)) return_trace (nullptr);
+    out->deviceTable.serialize_copy (c, deviceTable, base, 0, hb_serialize_context_t::Head);
+
+    return_trace (out);
+  }
+
   bool sanitize (hb_sanitize_context_t *c, const void *base) const
   {
     TRACE_SANITIZE (this);
@@ -49,7 +59,7 @@ struct MathValueRecord
 
   protected:
   HBINT16              value;          /* The X or Y value in design units */
-  OffsetTo<Device>     deviceTable;    /* Offset to the device table - from the
+  Offset16To<Device>   deviceTable;    /* Offset to the device table - from the
                                         * beginning of parent table.  May be NULL.
                                         * Suggested format for device table is 1. */
 
@@ -59,6 +69,29 @@ struct MathValueRecord
 
 struct MathConstants
 {
+  MathConstants* copy (hb_serialize_context_t *c) const
+  {
+    TRACE_SERIALIZE (this);
+    auto *out = c->start_embed (this);
+    if (unlikely (!out)) return_trace (nullptr);
+
+    HBINT16 *p = c->allocate_size<HBINT16> (HBINT16::static_size * 2);
+    if (unlikely (!p)) return_trace (nullptr);
+    memcpy (p, percentScaleDown, HBINT16::static_size * 2);
+
+    HBUINT16 *m = c->allocate_size<HBUINT16> (HBUINT16::static_size * 2);
+    if (unlikely (!m)) return_trace (nullptr);
+    memcpy (m, minHeight, HBUINT16::static_size * 2);
+
+    unsigned count = ARRAY_LENGTH (mathValueRecords);
+    for (unsigned i = 0; i < count; i++)
+      if (!c->copy (mathValueRecords[i], this))
+        return_trace (nullptr);
+
+    if (!c->embed (radicalDegreeBottomRaisePercent)) return_trace (nullptr);
+    return_trace (out);
+  }
+
   bool sanitize_math_value_records (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -78,7 +111,7 @@ struct MathConstants
   }
 
   hb_position_t get_value (hb_ot_math_constant_t constant,
-                                 hb_font_t *font) const
+                          hb_font_t *font) const
   {
     switch (constant) {
 
@@ -165,6 +198,28 @@ struct MathConstants
 
 struct MathItalicsCorrectionInfo
 {
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    const hb_set_t &glyphset = *c->plan->_glyphset_mathed;
+    const hb_map_t &glyph_map = *c->plan->glyph_map;
+
+    auto *out = c->serializer->start_embed (*this);
+    if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
+
+    hb_sorted_vector_t<hb_codepoint_t> new_coverage;
+    + hb_zip (this+coverage, italicsCorrection)
+    | hb_filter (glyphset, hb_first)
+    | hb_filter (serialize_math_record_array (c->serializer, out->italicsCorrection, this), hb_second)
+    | hb_map (hb_first)
+    | hb_map (glyph_map)
+    | hb_sink (new_coverage)
+    ;
+
+    out->coverage.serialize_serialize (c->serializer, new_coverage.iter ());
+    return_trace (true);
+  }
+
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -181,11 +236,11 @@ struct MathItalicsCorrectionInfo
   }
 
   protected:
-  OffsetTo<Coverage>       coverage;           /* Offset to Coverage table -
+  Offset16To<Coverage>       coverage;         /* Offset to Coverage table -
                                                 * from the beginning of
                                                 * MathItalicsCorrectionInfo
                                                 * table. */
-  ArrayOf<MathValueRecord> italicsCorrection;  /* Array of MathValueRecords
+  Array16Of<MathValueRecord> italicsCorrection;        /* Array of MathValueRecords
                                                 * defining italics correction
                                                 * values for each
                                                 * covered glyph. */
@@ -196,6 +251,28 @@ struct MathItalicsCorrectionInfo
 
 struct MathTopAccentAttachment
 {
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    const hb_set_t &glyphset = *c->plan->_glyphset_mathed;
+    const hb_map_t &glyph_map = *c->plan->glyph_map;
+
+    auto *out = c->serializer->start_embed (*this);
+    if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
+
+    hb_sorted_vector_t<hb_codepoint_t> new_coverage;
+    + hb_zip (this+topAccentCoverage, topAccentAttachment)
+    | hb_filter (glyphset, hb_first)
+    | hb_filter (serialize_math_record_array (c->serializer, out->topAccentAttachment, this), hb_second)
+    | hb_map (hb_first)
+    | hb_map (glyph_map)
+    | hb_sink (new_coverage)
+    ;
+
+    out->topAccentCoverage.serialize_serialize (c->serializer, new_coverage.iter ());
+    return_trace (true);
+  }
+
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -214,11 +291,11 @@ struct MathTopAccentAttachment
   }
 
   protected:
-  OffsetTo<Coverage>       topAccentCoverage;   /* Offset to Coverage table -
+  Offset16To<Coverage>       topAccentCoverage;   /* Offset to Coverage table -
                                                 * from the beginning of
                                                 * MathTopAccentAttachment
                                                 * table. */
-  ArrayOf<MathValueRecord> topAccentAttachment; /* Array of MathValueRecords
+  Array16Of<MathValueRecord> topAccentAttachment; /* Array of MathValueRecords
                                                 * defining top accent
                                                 * attachment points for each
                                                 * covered glyph. */
@@ -229,6 +306,22 @@ struct MathTopAccentAttachment
 
 struct MathKern
 {
+  MathKern* copy (hb_serialize_context_t *c) const
+  {
+    TRACE_SERIALIZE (this);
+    auto *out = c->start_embed (this);
+    if (unlikely (!out)) return_trace (nullptr);
+
+    if (unlikely (!c->embed (heightCount))) return_trace (nullptr);
+
+    unsigned count = 2 * heightCount + 1;
+    for (unsigned i = 0; i < count; i++)
+      if (!c->copy (mathValueRecordsZ.arrayZ[i], this))
+        return_trace (nullptr);
+
+    return_trace (out);
+  }
+
   bool sanitize_math_value_records (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -276,6 +369,37 @@ struct MathKern
     return kernValue[i].get_x_value (font, this);
   }
 
+  unsigned int get_entries (unsigned int start_offset,
+                           unsigned int *entries_count, /* IN/OUT */
+                           hb_ot_math_kern_entry_t *kern_entries, /* OUT */
+                           hb_font_t *font) const
+  {
+    const MathValueRecord* correctionHeight = mathValueRecordsZ.arrayZ;
+    const MathValueRecord* kernValue = mathValueRecordsZ.arrayZ + heightCount;
+    const unsigned int entriesCount = heightCount + 1;
+
+    if (entries_count)
+    {
+      unsigned int start = hb_min (start_offset, entriesCount);
+      unsigned int end = hb_min (start + *entries_count, entriesCount);
+      *entries_count = end - start;
+
+      for (unsigned int i = 0; i < *entries_count; i++) {
+       unsigned int j = start + i;
+
+       hb_position_t max_height;
+       if (j == heightCount) {
+         max_height = INT32_MAX;
+       } else {
+         max_height = correctionHeight[j].get_y_value (font, this);
+       }
+
+       kern_entries[i] = {max_height, kernValue[j].get_x_value (font, this)};
+      }
+    }
+    return entriesCount;
+  }
+
   protected:
   HBUINT16     heightCount;
   UnsizedArrayOf<MathValueRecord>
@@ -295,6 +419,19 @@ struct MathKern
 
 struct MathKernInfoRecord
 {
+  MathKernInfoRecord* copy (hb_serialize_context_t *c, const void *base) const
+  {
+    TRACE_SERIALIZE (this);
+    auto *out = c->embed (this);
+    if (unlikely (!out)) return_trace (nullptr);
+
+    unsigned count = ARRAY_LENGTH (mathKern);
+    for (unsigned i = 0; i < count; i++)
+      out->mathKern[i].serialize_copy (c, mathKern[i], base, 0, hb_serialize_context_t::Head);
+
+    return_trace (out);
+  }
+
   bool sanitize (hb_sanitize_context_t *c, const void *base) const
   {
     TRACE_SANITIZE (this);
@@ -317,10 +454,28 @@ struct MathKernInfoRecord
     return (base+mathKern[idx]).get_value (correction_height, font);
   }
 
+  unsigned int get_kernings (hb_ot_math_kern_t kern,
+                            unsigned int start_offset,
+                            unsigned int *entries_count, /* IN/OUT */
+                            hb_ot_math_kern_entry_t *kern_entries, /* OUT */
+                            hb_font_t *font,
+                            const void *base) const
+  {
+    unsigned int idx = kern;
+    if (unlikely (idx >= ARRAY_LENGTH (mathKern)) || !mathKern[idx]) {
+      if (entries_count) *entries_count = 0;
+      return 0;
+    }
+    return (base+mathKern[idx]).get_entries (start_offset,
+                                            entries_count,
+                                            kern_entries,
+                                            font);
+  }
+
   protected:
   /* Offset to MathKern table for each corner -
    * from the beginning of MathKernInfo table.  May be NULL. */
-  OffsetTo<MathKern> mathKern[4];
+  Offset16To<MathKern> mathKern[4];
 
   public:
   DEFINE_SIZE_STATIC (8);
@@ -328,6 +483,28 @@ struct MathKernInfoRecord
 
 struct MathKernInfo
 {
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    const hb_set_t &glyphset = *c->plan->_glyphset_mathed;
+    const hb_map_t &glyph_map = *c->plan->glyph_map;
+
+    auto *out = c->serializer->start_embed (*this);
+    if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
+
+    hb_sorted_vector_t<hb_codepoint_t> new_coverage;
+    + hb_zip (this+mathKernCoverage, mathKernInfoRecords)
+    | hb_filter (glyphset, hb_first)
+    | hb_filter (serialize_math_record_array (c->serializer, out->mathKernInfoRecords, this), hb_second)
+    | hb_map (hb_first)
+    | hb_map (glyph_map)
+    | hb_sink (new_coverage)
+    ;
+
+    out->mathKernCoverage.serialize_serialize (c->serializer, new_coverage.iter ());
+    return_trace (true);
+  }
+
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -345,13 +522,29 @@ struct MathKernInfo
     return mathKernInfoRecords[index].get_kerning (kern, correction_height, font, this);
   }
 
+  unsigned int get_kernings (hb_codepoint_t glyph,
+                            hb_ot_math_kern_t kern,
+                            unsigned int start_offset,
+                            unsigned int *entries_count, /* IN/OUT */
+                            hb_ot_math_kern_entry_t *kern_entries, /* OUT */
+                            hb_font_t *font) const
+  {
+    unsigned int index = (this+mathKernCoverage).get_coverage (glyph);
+    return mathKernInfoRecords[index].get_kernings (kern,
+                                                   start_offset,
+                                                   entries_count,
+                                                   kern_entries,
+                                                   font,
+                                                   this);
+  }
+
   protected:
-  OffsetTo<Coverage>
+  Offset16To<Coverage>
                mathKernCoverage;
                                /* Offset to Coverage table -
                                 * from the beginning of the
                                 * MathKernInfo table. */
-  ArrayOf<MathKernInfoRecord>
+  Array16Of<MathKernInfoRecord>
                mathKernInfoRecords;
                                /* Array of MathKernInfoRecords,
                                 * per-glyph information for
@@ -365,6 +558,31 @@ struct MathKernInfo
 
 struct MathGlyphInfo
 {
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    auto *out = c->serializer->embed (*this);
+    if (unlikely (!out)) return_trace (false);
+
+    out->mathItalicsCorrectionInfo.serialize_subset (c, mathItalicsCorrectionInfo, this);
+    out->mathTopAccentAttachment.serialize_subset (c, mathTopAccentAttachment, this);
+
+    const hb_set_t &glyphset = *c->plan->_glyphset_mathed;
+    const hb_map_t &glyph_map = *c->plan->glyph_map;
+
+    auto it =
+    + hb_iter (this+extendedShapeCoverage)
+    | hb_filter (glyphset)
+    | hb_map_retains_sorting (glyph_map)
+    ;
+
+    if (it) out->extendedShapeCoverage.serialize_serialize (c->serializer, it);
+    else out->extendedShapeCoverage = 0;
+
+    out->mathKernInfo.serialize_subset (c, mathKernInfo, this);
+    return_trace (true);
+  }
+
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -392,25 +610,38 @@ struct MathGlyphInfo
                             hb_font_t *font) const
   { return (this+mathKernInfo).get_kerning (glyph, kern, correction_height, font); }
 
+  hb_position_t get_kernings (hb_codepoint_t glyph,
+                             hb_ot_math_kern_t kern,
+                             unsigned int start_offset,
+                             unsigned int *entries_count, /* IN/OUT */
+                             hb_ot_math_kern_entry_t *kern_entries, /* OUT */
+                             hb_font_t *font) const
+  { return (this+mathKernInfo).get_kernings (glyph,
+                                            kern,
+                                            start_offset,
+                                            entries_count,
+                                            kern_entries,
+                                            font); }
+
   protected:
   /* Offset to MathItalicsCorrectionInfo table -
    * from the beginning of MathGlyphInfo table. */
-  OffsetTo<MathItalicsCorrectionInfo> mathItalicsCorrectionInfo;
+  Offset16To<MathItalicsCorrectionInfo> mathItalicsCorrectionInfo;
 
   /* Offset to MathTopAccentAttachment table -
    * from the beginning of MathGlyphInfo table. */
-  OffsetTo<MathTopAccentAttachment> mathTopAccentAttachment;
+  Offset16To<MathTopAccentAttachment> mathTopAccentAttachment;
 
   /* Offset to coverage table for Extended Shape glyphs -
    * from the beginning of MathGlyphInfo table. When the left or right glyph of
    * a box is an extended shape variant, the (ink) box (and not the default
    * position defined by values in MathConstants table) should be used for
    * vertical positioning purposes.  May be NULL.. */
-  OffsetTo<Coverage> extendedShapeCoverage;
+  Offset16To<Coverage> extendedShapeCoverage;
 
    /* Offset to MathKernInfo table -
     * from the beginning of MathGlyphInfo table. */
-  OffsetTo<MathKernInfo> mathKernInfo;
+  Offset16To<MathKernInfo> mathKernInfo;
 
   public:
   DEFINE_SIZE_STATIC (8);
@@ -420,14 +651,27 @@ struct MathGlyphVariantRecord
 {
   friend struct MathGlyphConstruction;
 
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    auto *out = c->serializer->embed (this);
+    if (unlikely (!out)) return_trace (false);
+
+    const hb_map_t& glyph_map = *c->plan->glyph_map;
+    return_trace (c->serializer->check_assign (out->variantGlyph, glyph_map.get (variantGlyph), HB_SERIALIZE_ERROR_INT_OVERFLOW));
+  }
+
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
     return_trace (c->check_struct (this));
   }
 
+  void closure_glyphs (hb_set_t *variant_glyphs) const
+  { variant_glyphs->add (variantGlyph); }
+
   protected:
-  HBGlyphID variantGlyph;       /* Glyph ID for the variant. */
+  HBGlyphID16 variantGlyph;       /* Glyph ID for the variant. */
   HBUINT16  advanceMeasurement; /* Advance width/height, in design units, of the
                                 * variant, in the direction of requested
                                 * glyph extension. */
@@ -450,6 +694,16 @@ struct PartFlags : HBUINT16
 
 struct MathGlyphPartRecord
 {
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    auto *out = c->serializer->embed (this);
+    if (unlikely (!out)) return_trace (false);
+
+    const hb_map_t& glyph_map = *c->plan->glyph_map;
+    return_trace (c->serializer->check_assign (out->glyph, glyph_map.get (glyph), HB_SERIALIZE_ERROR_INT_OVERFLOW));
+  }
+
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -474,8 +728,11 @@ struct MathGlyphPartRecord
                (partFlags & PartFlags::Defined);
   }
 
+  void closure_glyphs (hb_set_t *variant_glyphs) const
+  { variant_glyphs->add (glyph); }
+
   protected:
-  HBGlyphID    glyph;          /* Glyph ID for the part. */
+  HBGlyphID16  glyph;          /* Glyph ID for the part. */
   HBUINT16     startConnectorLength;
                                /* Advance width/ height of the straight bar
                                 * connector material, in design units, is at
@@ -497,6 +754,20 @@ struct MathGlyphPartRecord
 
 struct MathGlyphAssembly
 {
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    auto *out = c->serializer->start_embed (*this);
+    if (unlikely (!out)) return_trace (false);
+
+    if (!c->serializer->copy (italicsCorrection, this)) return_trace (false);
+    if (!c->serializer->copy<HBUINT16> (partRecords.len)) return_trace (false);
+
+    for (const auto& record : partRecords.iter ())
+      if (!record.subset (c)) return_trace (false);
+    return_trace (true);
+  }
+
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -515,10 +786,9 @@ struct MathGlyphAssembly
     if (parts_count)
     {
       int64_t mult = font->dir_mult (direction);
-      hb_array_t<const MathGlyphPartRecord> arr = partRecords.sub_array (start_offset, parts_count);
-      unsigned int count = arr.length;
-      for (unsigned int i = 0; i < count; i++)
-       arr[i].extract (parts[i], mult, font);
+      for (auto _ : hb_zip (partRecords.sub_array (start_offset, parts_count),
+                           hb_array (parts, *parts_count)))
+       _.first.extract (_.second, mult, font);
     }
 
     if (italics_correction)
@@ -527,13 +797,19 @@ struct MathGlyphAssembly
     return partRecords.len;
   }
 
+  void closure_glyphs (hb_set_t *variant_glyphs) const
+  {
+    for (const auto& _ : partRecords.iter ())
+      _.closure_glyphs (variant_glyphs);
+  }
+
   protected:
   MathValueRecord
                italicsCorrection;
                                /* Italics correction of this
                                 * MathGlyphAssembly. Should not
                                 * depend on the assembly size. */
-  ArrayOf<MathGlyphPartRecord>
+  Array16Of<MathGlyphPartRecord>
                partRecords;    /* Array of part records, from
                                 * left to right and bottom to
                                 * top. */
@@ -544,6 +820,22 @@ struct MathGlyphAssembly
 
 struct MathGlyphConstruction
 {
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    auto *out = c->serializer->start_embed (*this);
+    if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
+
+    out->glyphAssembly.serialize_subset (c, glyphAssembly, this);
+
+    if (!c->serializer->check_assign (out->mathGlyphVariantRecord.len, mathGlyphVariantRecord.len, HB_SERIALIZE_ERROR_INT_OVERFLOW))
+      return_trace (false);
+    for (const auto& record : mathGlyphVariantRecord.iter ())
+      if (!record.subset (c)) return_trace (false);
+
+    return_trace (true);
+  }
+
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -563,24 +855,28 @@ struct MathGlyphConstruction
     if (variants_count)
     {
       int64_t mult = font->dir_mult (direction);
-      hb_array_t<const MathGlyphVariantRecord> arr = mathGlyphVariantRecord.sub_array (start_offset, variants_count);
-      unsigned int count = arr.length;
-      for (unsigned int i = 0; i < count; i++)
-      {
-       variants[i].glyph = arr[i].variantGlyph;
-       variants[i].advance = font->em_mult (arr[i].advanceMeasurement, mult);
-      }
+      for (auto _ : hb_zip (mathGlyphVariantRecord.sub_array (start_offset, variants_count),
+                           hb_array (variants, *variants_count)))
+       _.second = {_.first.variantGlyph, font->em_mult (_.first.advanceMeasurement, mult)};
     }
     return mathGlyphVariantRecord.len;
   }
 
+  void closure_glyphs (hb_set_t *variant_glyphs) const
+  {
+    (this+glyphAssembly).closure_glyphs (variant_glyphs);
+
+    for (const auto& _ : mathGlyphVariantRecord.iter ())
+      _.closure_glyphs (variant_glyphs);
+  }
+
   protected:
   /* Offset to MathGlyphAssembly table for this shape - from the beginning of
      MathGlyphConstruction table.  May be NULL. */
-  OffsetTo<MathGlyphAssembly>    glyphAssembly;
+  Offset16To<MathGlyphAssembly>          glyphAssembly;
 
   /* MathGlyphVariantRecords for alternative variants of the glyphs. */
-  ArrayOf<MathGlyphVariantRecord> mathGlyphVariantRecord;
+  Array16Of<MathGlyphVariantRecord> mathGlyphVariantRecord;
 
   public:
   DEFINE_SIZE_ARRAY (4, mathGlyphVariantRecord);
@@ -588,6 +884,94 @@ struct MathGlyphConstruction
 
 struct MathVariants
 {
+  void closure_glyphs (const hb_set_t *glyph_set,
+                       hb_set_t *variant_glyphs) const
+  {
+    const hb_array_t<const Offset16To<MathGlyphConstruction>> glyph_construction_offsets = glyphConstruction.as_array (vertGlyphCount + horizGlyphCount);
+
+    if (vertGlyphCoverage)
+    {
+      const auto vert_offsets = glyph_construction_offsets.sub_array (0, vertGlyphCount);
+      + hb_zip (this+vertGlyphCoverage, vert_offsets)
+      | hb_filter (glyph_set, hb_first)
+      | hb_map (hb_second)
+      | hb_map (hb_add (this))
+      | hb_apply ([=] (const MathGlyphConstruction &_) { _.closure_glyphs (variant_glyphs); })
+      ;
+    }
+
+    if (horizGlyphCoverage)
+    {
+      const auto hori_offsets = glyph_construction_offsets.sub_array (vertGlyphCount, horizGlyphCount);
+      + hb_zip (this+horizGlyphCoverage, hori_offsets)
+      | hb_filter (glyph_set, hb_first)
+      | hb_map (hb_second)
+      | hb_map (hb_add (this))
+      | hb_apply ([=] (const MathGlyphConstruction &_) { _.closure_glyphs (variant_glyphs); })
+      ;
+    }
+  }
+
+  void collect_coverage_and_indices (hb_sorted_vector_t<hb_codepoint_t>& new_coverage,
+                                     const Offset16To<Coverage>& coverage,
+                                     unsigned i,
+                                     unsigned end_index,
+                                     hb_set_t& indices,
+                                     const hb_set_t& glyphset,
+                                     const hb_map_t& glyph_map) const
+  {
+    if (!coverage) return;
+
+    for (const auto _ : (this+coverage).iter ())
+    {
+      if (i >= end_index) return;
+      if (glyphset.has (_))
+      {
+        unsigned new_gid = glyph_map.get (_);
+        new_coverage.push (new_gid);
+        indices.add (i);
+      }
+      i++;
+    }
+  }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    const hb_set_t &glyphset = *c->plan->_glyphset_mathed;
+    const hb_map_t &glyph_map = *c->plan->glyph_map;
+
+    auto *out = c->serializer->start_embed (*this);
+    if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
+    if (!c->serializer->check_assign (out->minConnectorOverlap, minConnectorOverlap, HB_SERIALIZE_ERROR_INT_OVERFLOW))
+      return_trace (false);
+    
+    hb_sorted_vector_t<hb_codepoint_t> new_vert_coverage;
+    hb_sorted_vector_t<hb_codepoint_t> new_hori_coverage;
+    hb_set_t indices;
+    collect_coverage_and_indices (new_vert_coverage, vertGlyphCoverage, 0, vertGlyphCount, indices, glyphset, glyph_map);
+    collect_coverage_and_indices (new_hori_coverage, horizGlyphCoverage, vertGlyphCount, vertGlyphCount + horizGlyphCount, indices, glyphset, glyph_map);
+    
+    if (!c->serializer->check_assign (out->vertGlyphCount, new_vert_coverage.length, HB_SERIALIZE_ERROR_INT_OVERFLOW))
+      return_trace (false);
+    if (!c->serializer->check_assign (out->horizGlyphCount, new_hori_coverage.length, HB_SERIALIZE_ERROR_INT_OVERFLOW))
+      return_trace (false);
+
+    for (unsigned i : indices.iter ())
+    {
+      auto *o = c->serializer->embed (glyphConstruction[i]);
+      if (!o) return_trace (false);
+      o->serialize_subset (c, glyphConstruction[i], this);
+    }
+    
+    if (new_vert_coverage)
+      out->vertGlyphCoverage.serialize_serialize (c->serializer, new_vert_coverage.iter ());
+    
+    if (new_hori_coverage)
+    out->horizGlyphCoverage.serialize_serialize (c->serializer, new_hori_coverage.iter ());
+    return_trace (true);
+  }
+
   bool sanitize_offsets (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -621,12 +1005,12 @@ struct MathVariants
           .get_variants (direction, font, start_offset, variants_count, variants); }
 
   unsigned int get_glyph_parts (hb_codepoint_t glyph,
-                                      hb_direction_t direction,
-                                      hb_font_t *font,
-                                      unsigned int start_offset,
-                                      unsigned int *parts_count, /* IN/OUT */
-                                      hb_ot_math_glyph_part_t *parts /* OUT */,
-                                      hb_position_t *italics_correction /* OUT */) const
+                               hb_direction_t direction,
+                               hb_font_t *font,
+                               unsigned int start_offset,
+                               unsigned int *parts_count, /* IN/OUT */
+                               hb_ot_math_glyph_part_t *parts /* OUT */,
+                               hb_position_t *italics_correction /* OUT */) const
   { return get_glyph_construction (glyph, direction, font)
           .get_assembly ()
           .get_parts (direction, font,
@@ -641,7 +1025,7 @@ struct MathVariants
   {
     bool vertical = HB_DIRECTION_IS_VERTICAL (direction);
     unsigned int count = vertical ? vertGlyphCount : horizGlyphCount;
-    const OffsetTo<Coverage> &coverage = vertical ? vertGlyphCoverage
+    const Offset16To<Coverage> &coverage = vertical ? vertGlyphCoverage
                                                  : horizGlyphCoverage;
 
     unsigned int index = (this+coverage).get_coverage (glyph);
@@ -658,11 +1042,11 @@ struct MathVariants
                                /* Minimum overlap of connecting
                                 * glyphs during glyph construction,
                                 * in design units. */
-  OffsetTo<Coverage> vertGlyphCoverage;
+  Offset16To<Coverage> vertGlyphCoverage;
                                /* Offset to Coverage table -
                                 * from the beginning of MathVariants
                                 * table. */
-  OffsetTo<Coverage> horizGlyphCoverage;
+  Offset16To<Coverage> horizGlyphCoverage;
                                /* Offset to Coverage table -
                                 * from the beginning of MathVariants
                                 * table. */
@@ -676,7 +1060,7 @@ struct MathVariants
   /* Array of offsets to MathGlyphConstruction tables - from the beginning of
      the MathVariants table, for shapes growing in vertical/horizontal
      direction. */
-  UnsizedArrayOf<OffsetTo<MathGlyphConstruction>>
+  UnsizedArrayOf<Offset16To<MathGlyphConstruction>>
                        glyphConstruction;
 
   public:
@@ -695,6 +1079,28 @@ struct MATH
 
   bool has_data () const { return version.to_int (); }
 
+  void closure_glyphs (hb_set_t *glyph_set) const
+  {
+    if (mathVariants)
+    {
+      hb_set_t variant_glyphs;
+      (this+mathVariants).closure_glyphs (glyph_set, &variant_glyphs);
+      hb_set_union (glyph_set, &variant_glyphs);
+    }
+  }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    auto *out = c->serializer->embed (*this);
+    if (unlikely (!out)) return_trace (false);
+
+    out->mathConstants.serialize_copy (c->serializer, mathConstants, this, 0, hb_serialize_context_t::Head);
+    out->mathGlyphInfo.serialize_subset (c, mathGlyphInfo, this);
+    out->mathVariants.serialize_subset (c, mathVariants, this);
+    return_trace (true);
+  }
+
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -706,7 +1112,7 @@ struct MATH
   }
 
   hb_position_t get_constant (hb_ot_math_constant_t  constant,
-                                    hb_font_t             *font) const
+                             hb_font_t            *font) const
   { return (this+mathConstants).get_value (constant, font); }
 
   const MathGlyphInfo &get_glyph_info () const { return this+mathGlyphInfo; }
@@ -716,11 +1122,11 @@ struct MATH
   protected:
   FixedVersion<>version;       /* Version of the MATH table
                                 * initially set to 0x00010000u */
-  OffsetTo<MathConstants>
+  Offset16To<MathConstants>
                mathConstants;  /* MathConstants table */
-  OffsetTo<MathGlyphInfo>
+  Offset16To<MathGlyphInfo>
                mathGlyphInfo;  /* MathGlyphInfo table */
-  OffsetTo<MathVariants>
+  Offset16To<MathVariants>
                mathVariants;   /* MathVariants table */
 
   public:
index 9d8c6e7..f44ac35 100644 (file)
@@ -56,7 +56,7 @@
  *
  * Tests whether a face has a `MATH` table.
  *
- * Return value: true if the table is found, false otherwise
+ * Return value: %true if the table is found, %false otherwise
  *
  * Since: 1.3.3
  **/
@@ -142,7 +142,7 @@ hb_ot_math_get_glyph_top_accent_attachment (hb_font_t *font,
  *
  * Tests whether the given glyph index is an extended shape in the face.
  *
- * Return value: true if the glyph is an extended shape, false otherwise
+ * Return value: %true if the glyph is an extended shape, %false otherwise
  *
  * Since: 1.3.3
  **/
@@ -185,6 +185,51 @@ hb_ot_math_get_glyph_kerning (hb_font_t *font,
 }
 
 /**
+ * hb_ot_math_get_glyph_kernings:
+ * @font: #hb_font_t to work upon
+ * @glyph: The glyph index from which to retrieve the kernings
+ * @kern: The #hb_ot_math_kern_t from which to retrieve the kernings
+ * @start_offset: offset of the first kern entry to retrieve
+ * @entries_count: (inout) (optional): Input = the maximum number of kern entries to return;
+ *                                     Output = the actual number of kern entries returned
+ * @kern_entries: (out caller-allocates) (array length=entries_count): array of kern entries returned
+ *
+ * Fetches the raw MathKern (cut-in) data for the specified font, glyph index,
+ * and @kern. The corresponding list of kern values and correction heights is
+ * returned as a list of #hb_ot_math_kern_entry_t structs.
+ *
+ * See also #hb_ot_math_get_glyph_kerning, which handles selecting the
+ * appropriate kern value for a given correction height.
+ *
+ * <note>For a glyph with @n defined kern values (where @n > 0), there are only
+ * @n−1 defined correction heights, as each correction height defines a boundary
+ * past which the next kern value should be selected. Therefore, only the
+ * #hb_ot_math_kern_entry_t.kern_value of the uppermost #hb_ot_math_kern_entry_t
+ * actually comes from the font; its corresponding
+ * #hb_ot_math_kern_entry_t.max_correction_height is always set to
+ * <code>INT32_MAX</code>.</note>
+ *
+ * Return value: the total number of kern values available or zero
+ *
+ * Since: 3.4.0
+ **/
+unsigned int
+hb_ot_math_get_glyph_kernings (hb_font_t *font,
+                              hb_codepoint_t glyph,
+                              hb_ot_math_kern_t kern,
+                              unsigned int start_offset,
+                              unsigned int *entries_count, /* IN/OUT */
+                              hb_ot_math_kern_entry_t *kern_entries /* OUT */)
+{
+  return font->face->table.MATH->get_glyph_info().get_kernings (glyph,
+                                                               kern,
+                                                               start_offset,
+                                                               entries_count,
+                                                               kern_entries,
+                                                               font);
+}
+
+/**
  * hb_ot_math_get_glyph_variants:
  * @font: #hb_font_t to work upon
  * @glyph: The index of the glyph to stretch
index ad864a7..1378a06 100644 (file)
@@ -24,7 +24,7 @@
  * Igalia Author(s): Frédéric Wang
  */
 
-#ifndef HB_OT_H_IN
+#if !defined(HB_OT_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb-ot.h> instead."
 #endif
 
@@ -40,18 +40,93 @@ HB_BEGIN_DECLS
  * MATH
  */
 
+/**
+ * HB_OT_TAG_MATH:
+ *
+ * OpenType [Mathematical Typesetting Table](https://docs.microsoft.com/en-us/typography/opentype/spec/math).
+ *
+ * Since: 1.3.3
+ */
 #define HB_OT_TAG_MATH HB_TAG('M','A','T','H')
 
-/* Use with hb_buffer_set_script() for math shaping. */
-#define HB_OT_MATH_SCRIPT HB_TAG('m','a','t','h')
+/**
+ * HB_OT_TAG_MATH_SCRIPT:
+ *
+ * OpenType script tag, `math`, for features specific to math shaping.
+ *
+ * <note>#HB_OT_TAG_MATH_SCRIPT is not a valid #hb_script_t and should only be
+ * used with functions that accept raw OpenType script tags, such as
+ * #hb_ot_layout_collect_features. In other cases, #HB_SCRIPT_MATH should be
+ * used instead.</note>
+ *
+ * Since: 3.4.0
+ */
+#define HB_OT_TAG_MATH_SCRIPT HB_TAG('m','a','t','h')
 
 /* Types */
 
 /**
  * hb_ot_math_constant_t:
+ * @HB_OT_MATH_CONSTANT_SCRIPT_PERCENT_SCALE_DOWN: scriptPercentScaleDown
+ * @HB_OT_MATH_CONSTANT_SCRIPT_SCRIPT_PERCENT_SCALE_DOWN: scriptScriptPercentScaleDown
+ * @HB_OT_MATH_CONSTANT_DELIMITED_SUB_FORMULA_MIN_HEIGHT: delimitedSubFormulaMinHeight
+ * @HB_OT_MATH_CONSTANT_DISPLAY_OPERATOR_MIN_HEIGHT: displayOperatorMinHeight
+ * @HB_OT_MATH_CONSTANT_MATH_LEADING: mathLeading
+ * @HB_OT_MATH_CONSTANT_AXIS_HEIGHT: axisHeight
+ * @HB_OT_MATH_CONSTANT_ACCENT_BASE_HEIGHT: accentBaseHeight
+ * @HB_OT_MATH_CONSTANT_FLATTENED_ACCENT_BASE_HEIGHT: flattenedAccentBaseHeight
+ * @HB_OT_MATH_CONSTANT_SUBSCRIPT_SHIFT_DOWN: subscriptShiftDown
+ * @HB_OT_MATH_CONSTANT_SUBSCRIPT_TOP_MAX: subscriptTopMax
+ * @HB_OT_MATH_CONSTANT_SUBSCRIPT_BASELINE_DROP_MIN: subscriptBaselineDropMin
+ * @HB_OT_MATH_CONSTANT_SUPERSCRIPT_SHIFT_UP: superscriptShiftUp
+ * @HB_OT_MATH_CONSTANT_SUPERSCRIPT_SHIFT_UP_CRAMPED: superscriptShiftUpCramped
+ * @HB_OT_MATH_CONSTANT_SUPERSCRIPT_BOTTOM_MIN: superscriptBottomMin
+ * @HB_OT_MATH_CONSTANT_SUPERSCRIPT_BASELINE_DROP_MAX: superscriptBaselineDropMax
+ * @HB_OT_MATH_CONSTANT_SUB_SUPERSCRIPT_GAP_MIN: subSuperscriptGapMin
+ * @HB_OT_MATH_CONSTANT_SUPERSCRIPT_BOTTOM_MAX_WITH_SUBSCRIPT: superscriptBottomMaxWithSubscript
+ * @HB_OT_MATH_CONSTANT_SPACE_AFTER_SCRIPT: spaceAfterScript
+ * @HB_OT_MATH_CONSTANT_UPPER_LIMIT_GAP_MIN: upperLimitGapMin
+ * @HB_OT_MATH_CONSTANT_UPPER_LIMIT_BASELINE_RISE_MIN: upperLimitBaselineRiseMin
+ * @HB_OT_MATH_CONSTANT_LOWER_LIMIT_GAP_MIN: lowerLimitGapMin
+ * @HB_OT_MATH_CONSTANT_LOWER_LIMIT_BASELINE_DROP_MIN: lowerLimitBaselineDropMin
+ * @HB_OT_MATH_CONSTANT_STACK_TOP_SHIFT_UP: stackTopShiftUp
+ * @HB_OT_MATH_CONSTANT_STACK_TOP_DISPLAY_STYLE_SHIFT_UP: stackTopDisplayStyleShiftUp
+ * @HB_OT_MATH_CONSTANT_STACK_BOTTOM_SHIFT_DOWN: stackBottomShiftDown
+ * @HB_OT_MATH_CONSTANT_STACK_BOTTOM_DISPLAY_STYLE_SHIFT_DOWN: stackBottomDisplayStyleShiftDown
+ * @HB_OT_MATH_CONSTANT_STACK_GAP_MIN: stackGapMin
+ * @HB_OT_MATH_CONSTANT_STACK_DISPLAY_STYLE_GAP_MIN: stackDisplayStyleGapMin
+ * @HB_OT_MATH_CONSTANT_STRETCH_STACK_TOP_SHIFT_UP: stretchStackTopShiftUp
+ * @HB_OT_MATH_CONSTANT_STRETCH_STACK_BOTTOM_SHIFT_DOWN: stretchStackBottomShiftDown
+ * @HB_OT_MATH_CONSTANT_STRETCH_STACK_GAP_ABOVE_MIN: stretchStackGapAboveMin
+ * @HB_OT_MATH_CONSTANT_STRETCH_STACK_GAP_BELOW_MIN: stretchStackGapBelowMin
+ * @HB_OT_MATH_CONSTANT_FRACTION_NUMERATOR_SHIFT_UP: fractionNumeratorShiftUp
+ * @HB_OT_MATH_CONSTANT_FRACTION_NUMERATOR_DISPLAY_STYLE_SHIFT_UP: fractionNumeratorDisplayStyleShiftUp
+ * @HB_OT_MATH_CONSTANT_FRACTION_DENOMINATOR_SHIFT_DOWN: fractionDenominatorShiftDown
+ * @HB_OT_MATH_CONSTANT_FRACTION_DENOMINATOR_DISPLAY_STYLE_SHIFT_DOWN: fractionDenominatorDisplayStyleShiftDown
+ * @HB_OT_MATH_CONSTANT_FRACTION_NUMERATOR_GAP_MIN: fractionNumeratorGapMin
+ * @HB_OT_MATH_CONSTANT_FRACTION_NUM_DISPLAY_STYLE_GAP_MIN: fractionNumDisplayStyleGapMin
+ * @HB_OT_MATH_CONSTANT_FRACTION_RULE_THICKNESS: fractionRuleThickness
+ * @HB_OT_MATH_CONSTANT_FRACTION_DENOMINATOR_GAP_MIN: fractionDenominatorGapMin
+ * @HB_OT_MATH_CONSTANT_FRACTION_DENOM_DISPLAY_STYLE_GAP_MIN: fractionDenomDisplayStyleGapMin
+ * @HB_OT_MATH_CONSTANT_SKEWED_FRACTION_HORIZONTAL_GAP: skewedFractionHorizontalGap
+ * @HB_OT_MATH_CONSTANT_SKEWED_FRACTION_VERTICAL_GAP: skewedFractionVerticalGap
+ * @HB_OT_MATH_CONSTANT_OVERBAR_VERTICAL_GAP: overbarVerticalGap
+ * @HB_OT_MATH_CONSTANT_OVERBAR_RULE_THICKNESS: overbarRuleThickness
+ * @HB_OT_MATH_CONSTANT_OVERBAR_EXTRA_ASCENDER: overbarExtraAscender
+ * @HB_OT_MATH_CONSTANT_UNDERBAR_VERTICAL_GAP: underbarVerticalGap
+ * @HB_OT_MATH_CONSTANT_UNDERBAR_RULE_THICKNESS: underbarRuleThickness
+ * @HB_OT_MATH_CONSTANT_UNDERBAR_EXTRA_DESCENDER: underbarExtraDescender
+ * @HB_OT_MATH_CONSTANT_RADICAL_VERTICAL_GAP: radicalVerticalGap
+ * @HB_OT_MATH_CONSTANT_RADICAL_DISPLAY_STYLE_VERTICAL_GAP: radicalDisplayStyleVerticalGap
+ * @HB_OT_MATH_CONSTANT_RADICAL_RULE_THICKNESS: radicalRuleThickness
+ * @HB_OT_MATH_CONSTANT_RADICAL_EXTRA_ASCENDER: radicalExtraAscender
+ * @HB_OT_MATH_CONSTANT_RADICAL_KERN_BEFORE_DEGREE: radicalKernBeforeDegree
+ * @HB_OT_MATH_CONSTANT_RADICAL_KERN_AFTER_DEGREE: radicalKernAfterDegree
+ * @HB_OT_MATH_CONSTANT_RADICAL_DEGREE_BOTTOM_RAISE_PERCENT: radicalDegreeBottomRaisePercent
  *
- * The 'MATH' table constants specified at
- * https://docs.microsoft.com/en-us/typography/opentype/spec/math
+ * The 'MATH' table constants, refer to
+ * [OpenType documentation](https://docs.microsoft.com/en-us/typography/opentype/spec/math#mathconstants-table)
+ * For more explanations.
  *
  * Since: 1.3.3
  */
@@ -116,6 +191,10 @@ typedef enum {
 
 /**
  * hb_ot_math_kern_t:
+ * @HB_OT_MATH_KERN_TOP_RIGHT: The top right corner of the glyph.
+ * @HB_OT_MATH_KERN_TOP_LEFT: The top left corner of the glyph.
+ * @HB_OT_MATH_KERN_BOTTOM_RIGHT: The bottom right corner of the glyph.
+ * @HB_OT_MATH_KERN_BOTTOM_LEFT: The bottom left corner of the glyph.
  *
  * The math kerning-table types defined for the four corners
  * of a glyph.
@@ -130,6 +209,20 @@ typedef enum {
 } hb_ot_math_kern_t;
 
 /**
+ * hb_ot_math_kern_entry_t:
+ * @max_correction_height: The maximum height at which this entry should be used
+ * @kern_value: The kern value of the entry
+ *
+ * Data type to hold math kerning (cut-in) information for a glyph.
+ *
+ * Since: 3.4.0
+ */
+typedef struct {
+  hb_position_t max_correction_height;
+  hb_position_t kern_value;
+} hb_ot_math_kern_entry_t;
+
+/**
  * hb_ot_math_glyph_variant_t:
  * @glyph: The glyph index of the variant
  * @advance: The advance width of the variant
@@ -145,6 +238,8 @@ typedef struct hb_ot_math_glyph_variant_t {
 
 /**
  * hb_ot_math_glyph_part_flags_t:
+ * @HB_OT_MATH_GLYPH_PART_FLAG_EXTENDER: This is an extender glyph part that
+ * can be repeated to reach the desired length.
  *
  * Flags for math glyph parts.
  *
@@ -204,6 +299,14 @@ hb_ot_math_get_glyph_kerning (hb_font_t *font,
                              hb_position_t correction_height);
 
 HB_EXTERN unsigned int
+hb_ot_math_get_glyph_kernings (hb_font_t *font,
+                              hb_codepoint_t glyph,
+                              hb_ot_math_kern_t kern,
+                              unsigned int start_offset,
+                              unsigned int *entries_count, /* IN/OUT */
+                              hb_ot_math_kern_entry_t *kern_entries /* OUT */);
+
+HB_EXTERN unsigned int
 hb_ot_math_get_glyph_variants (hb_font_t *font,
                               hb_codepoint_t glyph,
                               hb_direction_t direction,
index 929956d..3a019ef 100644 (file)
@@ -107,7 +107,7 @@ struct maxp
       maxpV1Tail *dest_v1 = c->serializer->embed<maxpV1Tail> (src_v1);
       if (unlikely (!dest_v1)) return_trace (false);
 
-      if (c->plan->drop_hints)
+      if (c->plan->flags & HB_SUBSET_FLAGS_NO_HINTING)
        drop_hint_fields (dest_v1);
     }
 
index 1225e26..93e64c5 100644 (file)
@@ -56,7 +56,7 @@ struct DataMap
 
   protected:
   Tag          tag;            /* A tag indicating the type of metadata. */
-  LNNOffsetTo<UnsizedArrayOf<HBUINT8>>
+  NNOffset32To<UnsizedArrayOf<HBUINT8>>
                dataZ;          /* Offset in bytes from the beginning of the
                                 * metadata table to the data for this tag. */
   HBUINT32     dataLength;     /* Length of the data. The data is not required to
@@ -71,9 +71,9 @@ struct meta
 
   struct accelerator_t
   {
-    void init (hb_face_t *face)
+    accelerator_t (hb_face_t *face)
     { table = hb_sanitize_context_t ().reference_table<meta> (face); }
-    void fini () { table.destroy (); }
+    ~accelerator_t () { table.destroy (); }
 
     hb_blob_t *reference_entry (hb_tag_t tag) const
     { return table->dataMaps.lsearch (tag).reference_entry (table.get_blob ()); }
@@ -113,13 +113,15 @@ struct meta
                                 * Offset from the beginning of the table to the data.
                                 * Per OT specification:
                                 * Reserved. Not used; should be set to 0. */
-  LArrayOf<DataMap>
+  Array32Of<DataMap>
                dataMaps;/* Array of data map records. */
   public:
   DEFINE_SIZE_ARRAY (16, dataMaps);
 };
 
-struct meta_accelerator_t : meta::accelerator_t {};
+struct meta_accelerator_t : meta::accelerator_t {
+  meta_accelerator_t (hb_face_t *face) : meta::accelerator_t (face) {}
+};
 
 } /* namespace OT */
 
index a1e081b..35c8eb5 100644 (file)
  **/
 
 /**
- * hb_ot_meta_reference_entry:
+ * hb_ot_meta_get_entry_tags:
  * @face: a face object
  * @start_offset: iteration's start offset
- * @entries_count:(inout) (allow-none): buffer size as input, filled size as output
+ * @entries_count:(inout) (optional): buffer size as input, filled size as output
  * @entries: (out caller-allocates) (array length=entries_count): entries tags buffer
  *
+ * Fetches all available feature types.
+ *
  * Return value: Number of all available feature types.
  *
  * Since: 2.6.0
index 0278d84..7748eb4 100644 (file)
@@ -22,7 +22,7 @@
  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  */
 
-#ifndef HB_OT_H_IN
+#if !defined(HB_OT_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb-ot.h> instead."
 #endif
 
@@ -54,6 +54,7 @@ typedef enum {
   HB_OT_META_TAG_DESIGN_LANGUAGES      = HB_TAG ('d','l','n','g'),
   HB_OT_META_TAG_SUPPORTED_LANGUAGES   = HB_TAG ('s','l','n','g'),
 
+  /*< private >*/
   _HB_OT_META_TAG_MAX_VALUE = HB_TAG_MAX_SIGNED /*< skip >*/
 } hb_ot_meta_tag_t;
 
index 181ac4d..103808c 100644 (file)
 #include "hb-ot-face.hh"
 
 
+/**
+ * SECTION:hb-ot-metrics
+ * @title: hb-ot-metrics
+ * @short_description: OpenType Metrics
+ * @include: hb-ot.h
+ *
+ * Functions for fetching metrics from fonts.
+ **/
+
 static float
 _fix_ascender_descender (float value, hb_ot_metrics_tag_t metrics_tag)
 {
@@ -68,6 +77,7 @@ _hb_ot_metrics_get_position_common (hb_font_t           *font,
   (face->table.TABLE->has_data () && \
     (position && (*position = font->em_scalef_y (_fix_ascender_descender ( \
       face->table.TABLE->ATTR + GET_VAR, metrics_tag))), true))
+
   case HB_OT_METRICS_TAG_HORIZONTAL_ASCENDER:
     return (face->table.OS2->use_typo_metrics () && GET_METRIC_Y (OS2, sTypoAscender)) ||
           GET_METRIC_Y (hhea, ascender);
@@ -77,9 +87,13 @@ _hb_ot_metrics_get_position_common (hb_font_t           *font,
   case HB_OT_METRICS_TAG_HORIZONTAL_LINE_GAP:
     return (face->table.OS2->use_typo_metrics () && GET_METRIC_Y (OS2, sTypoLineGap)) ||
           GET_METRIC_Y (hhea, lineGap);
+
+#ifndef HB_NO_VERTICAL
   case HB_OT_METRICS_TAG_VERTICAL_ASCENDER:  return GET_METRIC_X (vhea, ascender);
   case HB_OT_METRICS_TAG_VERTICAL_DESCENDER: return GET_METRIC_X (vhea, descender);
   case HB_OT_METRICS_TAG_VERTICAL_LINE_GAP:  return GET_METRIC_X (vhea, lineGap);
+#endif
+
 #undef GET_METRIC_Y
 #undef GET_METRIC_X
 #undef GET_VAR
@@ -110,11 +124,11 @@ _get_gasp (hb_face_t *face, float *result, hb_ot_metrics_tag_t metrics_tag)
 
 /**
  * hb_ot_metrics_get_position:
- * @font: a #hb_font_t object.
+ * @font: an #hb_font_t object.
  * @metrics_tag: tag of metrics value you like to fetch.
  * @position: (out) (optional): result of metrics value from the font.
  *
- * It fetches metrics value corresponding to a given tag from a font.
+ * Fetches metrics value corresponding to @metrics_tag from @font.
  *
  * Returns: Whether found the requested metrics in the font.
  * Since: 2.6.0
@@ -146,12 +160,55 @@ hb_ot_metrics_get_position (hb_font_t           *font,
     (position && (*position = font->em_scalef_y (face->table.TABLE->ATTR + GET_VAR)), true))
   case HB_OT_METRICS_TAG_HORIZONTAL_CLIPPING_ASCENT:  return GET_METRIC_Y (OS2, usWinAscent);
   case HB_OT_METRICS_TAG_HORIZONTAL_CLIPPING_DESCENT: return GET_METRIC_Y (OS2, usWinDescent);
-  case HB_OT_METRICS_TAG_HORIZONTAL_CARET_RISE:       return GET_METRIC_Y (hhea, caretSlopeRise);
-  case HB_OT_METRICS_TAG_HORIZONTAL_CARET_RUN:        return GET_METRIC_X (hhea, caretSlopeRun);
+
+  case HB_OT_METRICS_TAG_HORIZONTAL_CARET_RISE:
+  case HB_OT_METRICS_TAG_HORIZONTAL_CARET_RUN:
+  {
+    unsigned mult = 1u;
+
+    if (font->slant)
+    {
+      unsigned rise = face->table.hhea->caretSlopeRise;
+      unsigned upem = face->get_upem ();
+      mult = (rise && rise < upem) ? hb_min (upem / rise, 256u) : 1u;
+    }
+
+    if (metrics_tag == HB_OT_METRICS_TAG_HORIZONTAL_CARET_RISE)
+    {
+      bool ret = GET_METRIC_Y (hhea, caretSlopeRise);
+
+      if (position)
+       *position *= mult;
+
+      return ret;
+    }
+    else
+    {
+      hb_position_t rise = 0;
+
+      if (font->slant && position && GET_METRIC_Y (hhea, caretSlopeRise))
+       rise = *position;
+
+      bool ret = GET_METRIC_X (hhea, caretSlopeRun);
+
+      if (position)
+      {
+       *position *= mult;
+
+       if (font->slant)
+         *position += _hb_roundf (mult * font->slant_xy * rise);
+      }
+
+      return ret;
+    }
+  }
   case HB_OT_METRICS_TAG_HORIZONTAL_CARET_OFFSET:     return GET_METRIC_X (hhea, caretOffset);
+
+#ifndef HB_NO_VERTICAL
   case HB_OT_METRICS_TAG_VERTICAL_CARET_RISE:         return GET_METRIC_X (vhea, caretSlopeRise);
   case HB_OT_METRICS_TAG_VERTICAL_CARET_RUN:          return GET_METRIC_Y (vhea, caretSlopeRun);
   case HB_OT_METRICS_TAG_VERTICAL_CARET_OFFSET:       return GET_METRIC_Y (vhea, caretOffset);
+#endif
   case HB_OT_METRICS_TAG_X_HEIGHT:                    return GET_METRIC_Y (OS2->v2 (), sxHeight);
   case HB_OT_METRICS_TAG_CAP_HEIGHT:                  return GET_METRIC_Y (OS2->v2 (), sCapHeight);
   case HB_OT_METRICS_TAG_SUBSCRIPT_EM_X_SIZE:         return GET_METRIC_X (OS2, ySubscriptXSize);
@@ -184,10 +241,13 @@ hb_ot_metrics_get_position (hb_font_t           *font,
 #ifndef HB_NO_VAR
 /**
  * hb_ot_metrics_get_variation:
- * @font:
- * @metrics_tag:
+ * @font: an #hb_font_t object.
+ * @metrics_tag: tag of metrics value you like to fetch.
  *
- * Returns:
+ * Fetches metrics value corresponding to @metrics_tag from @font with the
+ * current font variation settings applied.
+ *
+ * Returns: The requested metric value.
  *
  * Since: 2.6.0
  **/
@@ -199,10 +259,13 @@ hb_ot_metrics_get_variation (hb_font_t *font, hb_ot_metrics_tag_t metrics_tag)
 
 /**
  * hb_ot_metrics_get_x_variation:
- * @font:
- * @metrics_tag:
+ * @font: an #hb_font_t object.
+ * @metrics_tag: tag of metrics value you like to fetch.
  *
- * Returns:
+ * Fetches horizontal metrics value corresponding to @metrics_tag from @font
+ * with the current font variation settings applied.
+ *
+ * Returns: The requested metric value.
  *
  * Since: 2.6.0
  **/
@@ -214,10 +277,13 @@ hb_ot_metrics_get_x_variation (hb_font_t *font, hb_ot_metrics_tag_t metrics_tag)
 
 /**
  * hb_ot_metrics_get_y_variation:
- * @font:
- * @metrics_tag:
+ * @font: an #hb_font_t object.
+ * @metrics_tag: tag of metrics value you like to fetch.
+ *
+ * Fetches vertical metrics value corresponding to @metrics_tag from @font with
+ * the current font variation settings applied.
  *
- * Returns:
+ * Returns: The requested metric value.
  *
  * Since: 2.6.0
  **/
index 42c7363..5841fc8 100644 (file)
@@ -22,7 +22,7 @@
  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  */
 
-#ifndef HB_OT_H_IN
+#if !defined(HB_OT_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb-ot.h> instead."
 #endif
 
@@ -66,7 +66,8 @@ HB_BEGIN_DECLS
  * @HB_OT_METRICS_TAG_UNDERLINE_SIZE: underline size.
  * @HB_OT_METRICS_TAG_UNDERLINE_OFFSET: underline offset.
  *
- * From https://docs.microsoft.com/en-us/typography/opentype/spec/mvar#value-tags
+ * Metric tags corresponding to [MVAR Value
+ * Tags](https://docs.microsoft.com/en-us/typography/opentype/spec/mvar#value-tags)
  *
  * Since: 2.6.0
  **/
@@ -100,6 +101,7 @@ typedef enum {
   HB_OT_METRICS_TAG_UNDERLINE_SIZE             = HB_TAG ('u','n','d','s'),
   HB_OT_METRICS_TAG_UNDERLINE_OFFSET           = HB_TAG ('u','n','d','o'),
 
+  /*< private >*/
   _HB_OT_METRICS_TAG_MAX_VALUE = HB_TAG_MAX_SIGNED /*< skip >*/
 } hb_ot_metrics_tag_t;
 
index b46976d..d52367e 100644 (file)
@@ -149,7 +149,7 @@ struct NameRecord
   HBUINT16     languageID;     /* Language ID. */
   HBUINT16     nameID;         /* Name ID. */
   HBUINT16     length;         /* String length (in bytes). */
-  NNOffsetTo<UnsizedArrayOf<HBUINT8>>
+  NNOffset16To<UnsizedArrayOf<HBUINT8>>
                offset;         /* String offset from start of storage area (in bytes). */
   public:
   DEFINE_SIZE_STATIC (12);
@@ -214,7 +214,9 @@ struct name
     this->format = 0;
     this->count = it.len ();
 
-    NameRecord *name_records = (NameRecord *) calloc (it.len (), NameRecord::static_size);
+    NameRecord *name_records = (NameRecord *) hb_calloc (it.len (), NameRecord::static_size);
+    if (unlikely (!name_records)) return_trace (false);
+
     hb_array_t<NameRecord> records (name_records, it.len ());
 
     for (const NameRecord& record : it)
@@ -226,9 +228,10 @@ struct name
     records.qsort ();
 
     c->copy_all (records, src_string_pool);
-    free (records.arrayZ);
+    hb_free (records.arrayZ);
+
 
-    if (unlikely (c->ran_out_of_room)) return_trace (false);
+    if (unlikely (c->ran_out_of_room ())) return_trace (false);
 
     this->stringOffset = c->length ();
 
@@ -246,10 +249,14 @@ struct name
     + nameRecordZ.as_array (count)
     | hb_filter (c->plan->name_ids, &NameRecord::nameID)
     | hb_filter (c->plan->name_languages, &NameRecord::languageID)
-    | hb_filter ([&] (const NameRecord& namerecord) { return c->plan->name_legacy || namerecord.isUnicode (); })
+    | hb_filter ([&] (const NameRecord& namerecord) {
+      return
+          (c->plan->flags & HB_SUBSET_FLAGS_NAME_LEGACY)
+          || namerecord.isUnicode ();
+    })
     ;
 
-    name_prime->serialize (c->serializer, it, hb_addressof (this + stringOffset));
+    name_prime->serialize (c->serializer, it, std::addressof (this + stringOffset));
     return_trace (name_prime->count);
   }
 
@@ -272,7 +279,7 @@ struct name
 
   struct accelerator_t
   {
-    void init (hb_face_t *face)
+    accelerator_t (hb_face_t *face)
     {
       this->table = hb_sanitize_context_t ().reference_table<name> (face);
       assert (this->table.get_length () >= this->table->stringOffset);
@@ -281,7 +288,6 @@ struct name
       const hb_array_t<const NameRecord> all_names (this->table->nameRecordZ.arrayZ,
                                                    this->table->count);
 
-      this->names.init ();
       this->names.alloc (all_names.length);
 
       for (unsigned int i = 0; i < all_names.length; i++)
@@ -311,10 +317,8 @@ struct name
       }
       this->names.resize (j);
     }
-
-    void fini ()
+    ~accelerator_t ()
     {
-      this->names.fini ();
       this->table.destroy ();
     }
 
@@ -355,7 +359,7 @@ struct name
   /* We only implement format 0 for now. */
   HBUINT16     format;         /* Format selector (=0/1). */
   HBUINT16     count;          /* Number of name records. */
-  NNOffsetTo<UnsizedArrayOf<HBUINT8>>
+  NNOffset16To<UnsizedArrayOf<HBUINT8>>
                stringOffset;   /* Offset to start of string storage (from start of table). */
   UnsizedArrayOf<NameRecord>
                nameRecordZ;    /* The name records where count is the number of records. */
@@ -366,7 +370,9 @@ struct name
 #undef entry_index
 #undef entry_score
 
-struct name_accelerator_t : name::accelerator_t {};
+struct name_accelerator_t : name::accelerator_t {
+  name_accelerator_t (hb_face_t *face) : name::accelerator_t (face) {}
+};
 
 } /* namespace OT */
 
index 10122b8..c35ac5b 100644 (file)
 /**
  * hb_ot_name_list_names:
  * @face: font face.
- * @num_entries: (out) (allow-none): number of returned entries.
+ * @num_entries: (out) (optional): number of returned entries.
  *
  * Enumerates all available name IDs and language combinations. Returned
  * array is owned by the @face and should not be modified.  It can be
  * used as long as @face is alive.
  *
- * Returns: (out) (transfer none) (array length=num_entries): Array of available name entries.
+ * Returns: (transfer none) (array length=num_entries): Array of available name entries.
  * Since: 2.1.0
  **/
 const hb_ot_name_entry_t *
@@ -150,13 +150,14 @@ hb_ot_name_get_utf (hb_face_t       *face,
  * @face: font face.
  * @name_id: OpenType name identifier to fetch.
  * @language: language to fetch the name for.
- * @text_size: (inout) (allow-none): input size of @text buffer, and output size of
+ * @text_size: (inout) (optional): input size of @text buffer, and output size of
  *                                   text written to buffer.
  * @text: (out caller-allocates) (array length=text_size): buffer to write fetched name into.
  *
  * Fetches a font name from the OpenType 'name' table.
  * If @language is #HB_LANGUAGE_INVALID, English ("en") is assumed.
- * Returns string in UTF-8 encoding.
+ * Returns string in UTF-8 encoding. A NUL terminator is always written
+ * for convenience, and isn't included in the output @text_size.
  *
  * Returns: full length of the requested string, or 0 if not found.
  * Since: 2.1.0
@@ -177,13 +178,14 @@ hb_ot_name_get_utf8 (hb_face_t       *face,
  * @face: font face.
  * @name_id: OpenType name identifier to fetch.
  * @language: language to fetch the name for.
- * @text_size: (inout) (allow-none): input size of @text buffer, and output size of
+ * @text_size: (inout) (optional): input size of @text buffer, and output size of
  *                                   text written to buffer.
  * @text: (out caller-allocates) (array length=text_size): buffer to write fetched name into.
  *
  * Fetches a font name from the OpenType 'name' table.
  * If @language is #HB_LANGUAGE_INVALID, English ("en") is assumed.
- * Returns string in UTF-16 encoding.
+ * Returns string in UTF-16 encoding. A NUL terminator is always written
+ * for convenience, and isn't included in the output @text_size.
  *
  * Returns: full length of the requested string, or 0 if not found.
  * Since: 2.1.0
@@ -203,13 +205,14 @@ hb_ot_name_get_utf16 (hb_face_t       *face,
  * @face: font face.
  * @name_id: OpenType name identifier to fetch.
  * @language: language to fetch the name for.
- * @text_size: (inout) (allow-none): input size of @text buffer, and output size of
+ * @text_size: (inout) (optional): input size of @text buffer, and output size of
  *                                   text written to buffer.
  * @text: (out caller-allocates) (array length=text_size): buffer to write fetched name into.
  *
  * Fetches a font name from the OpenType 'name' table.
  * If @language is #HB_LANGUAGE_INVALID, English ("en") is assumed.
- * Returns string in UTF-32 encoding.
+ * Returns string in UTF-32 encoding. A NUL terminator is always written
+ * for convenience, and isn't included in the output @text_size.
  *
  * Returns: full length of the requested string, or 0 if not found.
  * Since: 2.1.0
index 3b4ad58..1ea4b55 100644 (file)
@@ -22,7 +22,7 @@
  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  */
 
-#ifndef HB_OT_H_IN
+#if !defined(HB_OT_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb-ot.h> instead."
 #endif
 
@@ -36,12 +36,42 @@ HB_BEGIN_DECLS
 
 /**
  * hb_ot_name_id_t:
+ * @HB_OT_NAME_ID_COPYRIGHT: Copyright notice
+ * @HB_OT_NAME_ID_FONT_FAMILY: Font Family name
+ * @HB_OT_NAME_ID_FONT_SUBFAMILY: Font Subfamily name
+ * @HB_OT_NAME_ID_UNIQUE_ID: Unique font identifier
+ * @HB_OT_NAME_ID_FULL_NAME: Full font name that reflects
+ * all family and relevant subfamily descriptors
+ * @HB_OT_NAME_ID_VERSION_STRING: Version string
+ * @HB_OT_NAME_ID_POSTSCRIPT_NAME: PostScript name for the font
+ * @HB_OT_NAME_ID_TRADEMARK: Trademark
+ * @HB_OT_NAME_ID_MANUFACTURER: Manufacturer Name
+ * @HB_OT_NAME_ID_DESIGNER: Designer
+ * @HB_OT_NAME_ID_DESCRIPTION: Description
+ * @HB_OT_NAME_ID_VENDOR_URL: URL of font vendor
+ * @HB_OT_NAME_ID_DESIGNER_URL: URL of typeface designer
+ * @HB_OT_NAME_ID_LICENSE: License Description
+ * @HB_OT_NAME_ID_LICENSE_URL: URL where additional licensing
+ * information can be found
+ * @HB_OT_NAME_ID_TYPOGRAPHIC_FAMILY: Typographic Family name
+ * @HB_OT_NAME_ID_TYPOGRAPHIC_SUBFAMILY: Typographic Subfamily name
+ * @HB_OT_NAME_ID_MAC_FULL_NAME: Compatible Full Name for MacOS
+ * @HB_OT_NAME_ID_SAMPLE_TEXT: Sample text
+ * @HB_OT_NAME_ID_CID_FINDFONT_NAME: PostScript CID findfont name
+ * @HB_OT_NAME_ID_WWS_FAMILY: WWS Family Name
+ * @HB_OT_NAME_ID_WWS_SUBFAMILY: WWS Subfamily Name
+ * @HB_OT_NAME_ID_LIGHT_BACKGROUND: Light Background Palette
+ * @HB_OT_NAME_ID_DARK_BACKGROUND: Dark Background Palette
+ * @HB_OT_NAME_ID_VARIATIONS_PS_PREFIX: Variations PostScript Name Prefix
  * @HB_OT_NAME_ID_INVALID: Value to represent a nonexistent name ID.
  *
  * An integral type representing an OpenType 'name' table name identifier.
  * There are predefined name IDs, as well as name IDs return from other
  * API.  These can be used to fetch name strings from a font face.
  *
+ * For more information on these fields, see the
+ * [OpenType spec](https://docs.microsoft.com/en-us/typography/opentype/spec/name#name-ids).
+ *
  * Since: 2.0.0
  **/
 enum
@@ -88,8 +118,7 @@ typedef unsigned int hb_ot_name_id_t;
  *
  * Since: 2.1.0
  **/
-typedef struct hb_ot_name_entry_t
-{
+typedef struct hb_ot_name_entry_t {
   hb_ot_name_id_t name_id;
   /*< private >*/
   hb_var_int_t    var;
index f538fd4..f0035e2 100644 (file)
@@ -30,7 +30,6 @@
 
 #include "hb-open-type.hh"
 #include "hb-ot-os2-unicode-ranges.hh"
-#include "hb-ot-cmap-table.hh"
 
 #include "hb-set.hh"
 
@@ -172,29 +171,17 @@ struct OS2
     TRACE_SUBSET (this);
     OS2 *os2_prime = c->serializer->embed (this);
     if (unlikely (!os2_prime)) return_trace (false);
+    if (c->plan->flags & HB_SUBSET_FLAGS_NO_PRUNE_UNICODE_RANGES)
+      return_trace (true);
 
-    hb_set_t unicodes;
-    hb_map_t unicode_glyphid_map;
-    
-    OT::cmap::accelerator_t cmap;
-    cmap.init (c->plan->source);
-    cmap.collect_mapping (&unicodes, &unicode_glyphid_map);
-    cmap.fini ();
-    
-    if (c->plan->unicodes->is_empty ()) unicodes.clear ();
-    else hb_set_set (&unicodes, c->plan->unicodes);
-
-    + unicode_glyphid_map.iter ()
-    | hb_filter (c->plan->glyphs_requested, hb_second)
-    | hb_map (hb_first)
-    | hb_sink (unicodes)
-    ;
+    /* when --gids option is not used, no need to do collect_mapping that is
+       * iterating all codepoints in each subtable, which is not efficient */
     uint16_t min_cp, max_cp;
-    find_min_and_max_codepoint (&unicodes, &min_cp, &max_cp);
+    find_min_and_max_codepoint (c->plan->unicodes, &min_cp, &max_cp);
     os2_prime->usFirstCharIndex = min_cp;
     os2_prime->usLastCharIndex = max_cp;
 
-    _update_unicode_ranges (&unicodes, os2_prime->ulUnicodeRange);
+    _update_unicode_ranges (c->plan->unicodes, os2_prime->ulUnicodeRange);
 
     return_trace (true);
   }
diff --git a/src/hb-ot-post-table-v2subset.hh b/src/hb-ot-post-table-v2subset.hh
new file mode 100644 (file)
index 0000000..0f3cd8e
--- /dev/null
@@ -0,0 +1,134 @@
+/*
+ * Copyright © 2021  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.
+ *
+ */
+
+#ifndef HB_OT_POST_TABLE_V2SUBSET_HH
+#define HB_OT_POST_TABLE_V2SUBSET_HH
+
+#include "hb-open-type.hh"
+#include "hb-ot-post-table.hh"
+
+/*
+ * post -- PostScript
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/post
+ */
+
+namespace OT {
+template<typename Iterator>
+HB_INTERNAL bool postV2Tail::serialize (hb_serialize_context_t *c,
+                                        Iterator it,
+                                        const void* _post) const
+{
+  TRACE_SERIALIZE (this);
+  auto *out = c->start_embed (this);
+  if (unlikely (!c->check_success (out))) return_trace (false);
+  if (!out->glyphNameIndex.serialize (c, + it
+                                         | hb_map (hb_second)))
+      return_trace (false);
+
+  hb_set_t copied_indices;
+  for (const auto& _ : + it )
+  {
+    unsigned glyph_id = _.first;
+    unsigned new_index = _.second;
+    
+    if (new_index < 258) continue;
+    if (copied_indices.has (new_index)) continue;
+    copied_indices.add (new_index);
+    
+    hb_bytes_t s = reinterpret_cast<const post::accelerator_t*> (_post)->find_glyph_name (glyph_id);
+    HBUINT8 *o = c->allocate_size<HBUINT8> (HBUINT8::static_size * (s.length + 1));
+    if (unlikely (!o)) return_trace (false);
+    if (!c->check_assign (o[0], s.length, HB_SERIALIZE_ERROR_INT_OVERFLOW)) return_trace (false);
+    memcpy (o+1, s.arrayZ, HBUINT8::static_size * s.length);
+  }
+
+  return_trace (true);
+}
+
+HB_INTERNAL bool postV2Tail::subset (hb_subset_context_t *c) const
+{
+  TRACE_SUBSET (this);
+
+  const hb_map_t &reverse_glyph_map = *c->plan->reverse_glyph_map;
+  unsigned num_glyphs = c->plan->num_output_glyphs ();
+  hb_map_t old_new_index_map, old_gid_new_index_map;
+  unsigned i = 0;
+
+  post::accelerator_t _post (c->plan->source);
+
+  hb_hashmap_t<hb_bytes_t, unsigned, std::nullptr_t, unsigned, nullptr, (unsigned)-1> glyph_name_to_new_index;
+  for (hb_codepoint_t new_gid = 0; new_gid < num_glyphs; new_gid++)
+  {
+    hb_codepoint_t old_gid = reverse_glyph_map.get (new_gid);
+    unsigned old_index = glyphNameIndex[old_gid];
+
+    unsigned new_index;
+    if (old_index <= 257) new_index = old_index;
+    else if (old_new_index_map.has (old_index)) new_index = old_new_index_map.get (old_index);
+    else
+    {
+      hb_bytes_t s = _post.find_glyph_name (old_gid);
+      new_index = glyph_name_to_new_index.get (s);
+      if (new_index == (unsigned)-1)
+      {
+        int standard_glyph_index = -1;
+        for (unsigned i = 0; i < format1_names_length; i++)
+        {
+          if (s == format1_names (i))
+          {
+            standard_glyph_index = i;
+            break;
+          }
+        }
+
+        if (standard_glyph_index == -1)
+        {
+          new_index = 258 + i;
+          i++;
+        }
+        else
+        { new_index = standard_glyph_index; }
+        glyph_name_to_new_index.set (s, new_index);
+      }
+      old_new_index_map.set (old_index, new_index);
+    }
+    old_gid_new_index_map.set (old_gid, new_index);
+  }
+
+  auto index_iter =
+  + hb_range (num_glyphs)
+  | hb_map (reverse_glyph_map)
+  | hb_map_retains_sorting ([&](hb_codepoint_t old_gid)
+                            {
+                              unsigned new_index = old_gid_new_index_map.get (old_gid);
+                              return hb_pair_t<unsigned, unsigned> (old_gid, new_index);
+                            })
+  ;
+
+  return_trace (serialize (c->serializer, index_iter, &_post));
+}
+
+} /* namespace OT */
+#endif /* HB_OT_POST_TABLE_V2SUBSET_HH */
index 8586331..a4844e9 100644 (file)
@@ -55,8 +55,15 @@ struct postV2Tail
     return_trace (glyphNameIndex.sanitize (c));
   }
 
+  template<typename Iterator>
+  bool serialize (hb_serialize_context_t *c,
+                  Iterator it,
+                  const void* _post) const;
+
+  bool subset (hb_subset_context_t *c) const;
+
   protected:
-  ArrayOf<HBUINT16>    glyphNameIndex; /* This is not an offset, but is the
+  Array16Of<HBUINT16>  glyphNameIndex; /* This is not an offset, but is the
                                         * ordinal number of the glyph in 'post'
                                         * string tables. */
 /*UnsizedArrayOf<HBUINT8>
@@ -71,13 +78,18 @@ struct post
 {
   static constexpr hb_tag_t tableTag = HB_OT_TAG_post;
 
-  void serialize (hb_serialize_context_t *c) const
+  bool serialize (hb_serialize_context_t *c, bool glyph_names) const
   {
+    TRACE_SERIALIZE (this);
     post *post_prime = c->allocate_min<post> ();
-    if (unlikely (!post_prime))  return;
+    if (unlikely (!post_prime))  return_trace (false);
 
     memcpy (post_prime, this, post::min_size);
-    post_prime->version.major = 3; // Version 3 does not have any glyph names.
+    if (!glyph_names)
+      return_trace (c->check_assign (post_prime->version.major, 3,
+                                     HB_SERIALIZE_ERROR_INT_OVERFLOW)); // Version 3 does not have any glyph names.
+
+    return_trace (true);
   }
 
   bool subset (hb_subset_context_t *c) const
@@ -86,18 +98,22 @@ struct post
     post *post_prime = c->serializer->start_embed<post> ();
     if (unlikely (!post_prime)) return_trace (false);
 
-    serialize (c->serializer);
-    if (c->serializer->in_error () || c->serializer->ran_out_of_room) return_trace (false);
+    bool glyph_names = c->plan->flags & HB_SUBSET_FLAGS_GLYPH_NAMES;
+    if (!serialize (c->serializer, glyph_names))
+      return_trace (false);
+
+    if (glyph_names && version.major == 2)
+      return_trace (v2X.subset (c));
 
     return_trace (true);
   }
 
   struct accelerator_t
   {
-    void init (hb_face_t *face)
-    {
-      index_to_offset.init ();
+    friend struct postV2Tail;
 
+    accelerator_t (hb_face_t *face)
+    {
       table = hb_sanitize_context_t ().reference_table<post> (face);
       unsigned int table_length = table.get_length ();
 
@@ -115,10 +131,9 @@ struct post
           data += 1 + *data)
        index_to_offset.push (data - pool);
     }
-    void fini ()
+    ~accelerator_t ()
     {
-      index_to_offset.fini ();
-      free (gids_sorted_by_name.get ());
+      hb_free (gids_sorted_by_name.get ());
       table.destroy ();
     }
 
@@ -149,7 +164,7 @@ struct post
 
       if (unlikely (!gids))
       {
-       gids = (uint16_t *) malloc (count * sizeof (gids[0]));
+       gids = (uint16_t *) hb_malloc (count * sizeof (gids[0]));
        if (unlikely (!gids))
          return false; /* Anything better?! */
 
@@ -159,7 +174,7 @@ struct post
 
        if (unlikely (!gids_sorted_by_name.cmpexch (nullptr, gids)))
        {
-         free (gids);
+         hb_free (gids);
          goto retry;
        }
       }
@@ -237,9 +252,9 @@ struct post
 
     private:
     uint32_t version;
-    const ArrayOf<HBUINT16> *glyphNameIndex;
+    const Array16Of<HBUINT16> *glyphNameIndex = nullptr;
     hb_vector_t<uint32_t> index_to_offset;
-    const uint8_t *pool;
+    const uint8_t *pool = nullptr;
     hb_atomic_ptr_t<uint16_t *> gids_sorted_by_name;
   };
 
@@ -290,7 +305,10 @@ struct post
   DEFINE_SIZE_MIN (32);
 };
 
-struct post_accelerator_t : post::accelerator_t {};
+struct post_accelerator_t : post::accelerator_t {
+  post_accelerator_t (hb_face_t *face) : post::accelerator_t (face) {}
+};
+
 
 } /* namespace OT */
 
index 262ab8a..78f46c1 100644 (file)
@@ -49,8 +49,8 @@ arabic_fallback_synthesize_lookup_single (const hb_ot_shape_plan_t *plan HB_UNUS
                                          hb_font_t *font,
                                          unsigned int feature_index)
 {
-  OT::HBGlyphID glyphs[SHAPING_TABLE_LAST - SHAPING_TABLE_FIRST + 1];
-  OT::HBGlyphID substitutes[SHAPING_TABLE_LAST - SHAPING_TABLE_FIRST + 1];
+  OT::HBGlyphID16 glyphs[SHAPING_TABLE_LAST - SHAPING_TABLE_FIRST + 1];
+  OT::HBGlyphID16 substitutes[SHAPING_TABLE_LAST - SHAPING_TABLE_FIRST + 1];
   unsigned int num_glyphs = 0;
 
   /* Populate arrays */
@@ -78,7 +78,7 @@ arabic_fallback_synthesize_lookup_single (const hb_ot_shape_plan_t *plan HB_UNUS
   /* Bubble-sort or something equally good!
    * May not be good-enough for presidential candidate interviews, but good-enough for us... */
   hb_stable_sort (&glyphs[0], num_glyphs,
-                 (int(*)(const OT::HBUINT16*, const OT::HBUINT16 *)) OT::HBGlyphID::cmp,
+                 (int(*)(const OT::HBUINT16*, const OT::HBUINT16 *)) OT::HBGlyphID16::cmp,
                  &substitutes[0]);
 
 
@@ -92,22 +92,22 @@ arabic_fallback_synthesize_lookup_single (const hb_ot_shape_plan_t *plan HB_UNUS
                                       hb_array (substitutes, num_glyphs));
   c.end_serialize ();
 
-  return ret ? c.copy<OT::SubstLookup> () : nullptr;
+  return ret && !c.in_error () ? c.copy<OT::SubstLookup> () : nullptr;
 }
 
 static OT::SubstLookup *
 arabic_fallback_synthesize_lookup_ligature (const hb_ot_shape_plan_t *plan HB_UNUSED,
                                            hb_font_t *font)
 {
-  OT::HBGlyphID first_glyphs[ARRAY_LENGTH_CONST (ligature_table)];
+  OT::HBGlyphID16 first_glyphs[ARRAY_LENGTH_CONST (ligature_table)];
   unsigned int first_glyphs_indirection[ARRAY_LENGTH_CONST (ligature_table)];
   unsigned int ligature_per_first_glyph_count_list[ARRAY_LENGTH_CONST (first_glyphs)];
   unsigned int num_first_glyphs = 0;
 
   /* We know that all our ligatures are 2-component */
-  OT::HBGlyphID ligature_list[ARRAY_LENGTH_CONST (first_glyphs) * ARRAY_LENGTH_CONST(ligature_table[0].ligatures)];
+  OT::HBGlyphID16 ligature_list[ARRAY_LENGTH_CONST (first_glyphs) * ARRAY_LENGTH_CONST(ligature_table[0].ligatures)];
   unsigned int component_count_list[ARRAY_LENGTH_CONST (ligature_list)];
-  OT::HBGlyphID component_list[ARRAY_LENGTH_CONST (ligature_list) * 1/* One extra component per ligature */];
+  OT::HBGlyphID16 component_list[ARRAY_LENGTH_CONST (ligature_list) * 1/* One extra component per ligature */];
   unsigned int num_ligatures = 0;
 
   /* Populate arrays */
@@ -125,7 +125,7 @@ arabic_fallback_synthesize_lookup_ligature (const hb_ot_shape_plan_t *plan HB_UN
     num_first_glyphs++;
   }
   hb_stable_sort (&first_glyphs[0], num_first_glyphs,
-                 (int(*)(const OT::HBUINT16*, const OT::HBUINT16 *)) OT::HBGlyphID::cmp,
+                 (int(*)(const OT::HBUINT16*, const OT::HBUINT16 *)) OT::HBGlyphID16::cmp,
                  &first_glyphs_indirection[0]);
 
   /* Now that the first-glyphs are sorted, walk again, populate ligatures. */
@@ -170,7 +170,7 @@ arabic_fallback_synthesize_lookup_ligature (const hb_ot_shape_plan_t *plan HB_UN
   c.end_serialize ();
   /* TODO sanitize the results? */
 
-  return ret ? c.copy<OT::SubstLookup> () : nullptr;
+  return ret && !c.in_error () ? c.copy<OT::SubstLookup> () : nullptr;
 }
 
 static OT::SubstLookup *
@@ -208,11 +208,11 @@ struct ManifestLookup
 {
   public:
   OT::Tag tag;
-  OT::OffsetTo<OT::SubstLookup> lookupOffset;
+  OT::Offset16To<OT::SubstLookup> lookupOffset;
   public:
   DEFINE_SIZE_STATIC (6);
 };
-typedef OT::ArrayOf<ManifestLookup> Manifest;
+typedef OT::Array16Of<ManifestLookup> Manifest;
 
 static bool
 arabic_fallback_plan_init_win1256 (arabic_fallback_plan_t *fallback_plan HB_UNUSED,
@@ -290,7 +290,7 @@ static arabic_fallback_plan_t *
 arabic_fallback_plan_create (const hb_ot_shape_plan_t *plan,
                             hb_font_t *font)
 {
-  arabic_fallback_plan_t *fallback_plan = (arabic_fallback_plan_t *) calloc (1, sizeof (arabic_fallback_plan_t));
+  arabic_fallback_plan_t *fallback_plan = (arabic_fallback_plan_t *) hb_calloc (1, sizeof (arabic_fallback_plan_t));
   if (unlikely (!fallback_plan))
     return const_cast<arabic_fallback_plan_t *> (&Null (arabic_fallback_plan_t));
 
@@ -308,7 +308,7 @@ arabic_fallback_plan_create (const hb_ot_shape_plan_t *plan,
     return fallback_plan;
 
   assert (fallback_plan->num_lookups == 0);
-  free (fallback_plan);
+  hb_free (fallback_plan);
   return const_cast<arabic_fallback_plan_t *> (&Null (arabic_fallback_plan_t));
 }
 
@@ -323,10 +323,10 @@ arabic_fallback_plan_destroy (arabic_fallback_plan_t *fallback_plan)
     {
       fallback_plan->accel_array[i].fini ();
       if (fallback_plan->free_lookups)
-       free (fallback_plan->lookup_array[i]);
+       hb_free (fallback_plan->lookup_array[i]);
     }
 
-  free (fallback_plan);
+  hb_free (fallback_plan);
 }
 
 static void
diff --git a/src/hb-ot-shape-complex-arabic-joining-list.hh b/src/hb-ot-shape-complex-arabic-joining-list.hh
new file mode 100644 (file)
index 0000000..e6339ee
--- /dev/null
@@ -0,0 +1,47 @@
+/* == Start of generated function == */
+/*
+ * The following function is generated by running:
+ *
+ *   ./gen-arabic-joining-list.py ArabicShaping.txt Scripts.txt
+ *
+ * on files with these headers:
+ *
+ * # ArabicShaping-14.0.0.txt
+ * # Date: 2021-05-21, 01:54:00 GMT [KW, RP]
+ * # Scripts-14.0.0.txt
+ * # Date: 2021-07-10, 00:35:31 GMT
+ */
+
+#ifndef HB_OT_SHAPE_COMPLEX_ARABIC_JOINING_LIST_HH
+#define HB_OT_SHAPE_COMPLEX_ARABIC_JOINING_LIST_HH
+
+static bool
+has_arabic_joining (hb_script_t script)
+{
+  /* List of scripts that have data in arabic-table. */
+  switch ((int) script)
+  {
+    case HB_SCRIPT_ADLAM:
+    case HB_SCRIPT_ARABIC:
+    case HB_SCRIPT_CHORASMIAN:
+    case HB_SCRIPT_HANIFI_ROHINGYA:
+    case HB_SCRIPT_MANDAIC:
+    case HB_SCRIPT_MANICHAEAN:
+    case HB_SCRIPT_MONGOLIAN:
+    case HB_SCRIPT_NKO:
+    case HB_SCRIPT_OLD_UYGHUR:
+    case HB_SCRIPT_PHAGS_PA:
+    case HB_SCRIPT_PSALTER_PAHLAVI:
+    case HB_SCRIPT_SOGDIAN:
+    case HB_SCRIPT_SYRIAC:
+      return true;
+
+    default:
+      return false;
+  }
+}
+
+
+#endif /* HB_OT_SHAPE_COMPLEX_ARABIC_JOINING_LIST_HH */
+
+/* == End of generated function == */
index 70ffe62..c158964 100644 (file)
@@ -6,10 +6,10 @@
  *
  * on files with these headers:
  *
- * # ArabicShaping-13.0.0.txt
- * # Date: 2020-01-31, 23:55:00 GMT [KW, RP]
- * # Blocks-13.0.0.txt
- * # Date: 2019-07-10, 19:06:00 GMT [KW]
+ * # ArabicShaping-14.0.0.txt
+ * # Date: 2021-05-21, 01:54:00 GMT [KW, RP]
+ * # Blocks-14.0.0.txt
+ * # Date: 2021-01-22, 23:29:00 GMT [KW]
  * UnicodeData.txt does not have a header.
  */
 
@@ -75,13 +75,17 @@ static const uint8_t joining_table[] =
 
   /* Syriac Supplement */
 
-  /* 0860 */ D,U,D,D,D,D,U,R,D,R,R,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
-  /* 0880 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
+  /* 0860 */ D,U,D,D,D,D,U,R,D,R,R,X,X,X,X,X,
+
+  /* Arabic Extended-B */
+
+  /* 0860 */                                 R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,
+  /* 0880 */ R,R,R,C,C,C,D,U,U,D,D,D,D,D,R,X,U,U,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
 
   /* Arabic Extended-A */
 
-  /* 08A0 */ D,D,D,D,D,D,D,D,D,D,R,R,R,U,R,D,D,R,R,D,D,X,D,D,D,R,D,D,D,D,D,D,
-  /* 08C0 */ D,D,D,D,D,D,D,D,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
+  /* 08A0 */ D,D,D,D,D,D,D,D,D,D,R,R,R,U,R,D,D,R,R,D,D,D,D,D,D,R,D,D,D,D,D,D,
+  /* 08C0 */ D,D,D,D,D,D,D,D,D,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
   /* 08E0 */ X,X,U,
 
 #define joining_offset_0x1806u 739
@@ -137,23 +141,28 @@ static const uint8_t joining_table[] =
   /* Sogdian */
 
   /* 10F20 */                                 D,D,D,R,D,D,D,D,D,D,D,D,D,D,D,D,
-  /* 10F40 */ D,D,D,D,D,U,X,X,X,X,X,X,X,X,X,X,X,D,D,D,R,
+  /* 10F40 */ D,D,D,D,D,U,X,X,X,X,X,X,X,X,X,X,X,D,D,D,R,X,X,X,X,X,X,X,X,X,X,X,
+  /* 10F60 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
+
+  /* Old Uyghur */
 
-#define joining_offset_0x10fb0u 1219
+  /* 10F60 */                                 D,D,D,D,R,R,D,D,D,D,D,D,D,D,D,D,
+  /* 10F80 */ D,D,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
+  /* 10FA0 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
 
   /* Chorasmian */
 
   /* 10FA0 */                                 D,U,D,D,R,R,R,U,D,R,R,D,D,R,D,D,
   /* 10FC0 */ U,D,R,R,D,U,U,U,U,R,D,L,
 
-#define joining_offset_0x110bdu 1247
+#define joining_offset_0x110bdu 1338
 
   /* Kaithi */
 
   /* 110A0 */                                                           U,X,X,
   /* 110C0 */ X,X,X,X,X,X,X,X,X,X,X,X,X,U,
 
-#define joining_offset_0x1e900u 1264
+#define joining_offset_0x1e900u 1355
 
   /* Adlam */
 
@@ -161,7 +170,7 @@ static const uint8_t joining_table[] =
   /* 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,X,X,X,X,X,X,X,T,
 
-}; /* Table items: 1340; occupancy: 57% */
+}; /* Table items: 1431; occupancy: 57% */
 
 
 static unsigned int
@@ -189,8 +198,7 @@ joining_type (hb_codepoint_t u)
       if (hb_in_range<hb_codepoint_t> (u, 0x10AC0u, 0x10AEFu)) return joining_table[u - 0x10AC0u + joining_offset_0x10ac0u];
       if (hb_in_range<hb_codepoint_t> (u, 0x10B80u, 0x10BAFu)) return joining_table[u - 0x10B80u + joining_offset_0x10b80u];
       if (hb_in_range<hb_codepoint_t> (u, 0x10D00u, 0x10D23u)) return joining_table[u - 0x10D00u + joining_offset_0x10d00u];
-      if (hb_in_range<hb_codepoint_t> (u, 0x10F30u, 0x10F54u)) return joining_table[u - 0x10F30u + joining_offset_0x10f30u];
-      if (hb_in_range<hb_codepoint_t> (u, 0x10FB0u, 0x10FCBu)) return joining_table[u - 0x10FB0u + joining_offset_0x10fb0u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x10F30u, 0x10FCBu)) return joining_table[u - 0x10F30u + joining_offset_0x10f30u];
       break;
 
     case 0x11u:
index b15e145..429974d 100644 (file)
@@ -87,6 +87,8 @@
 
 #define OT_GLYPHID /* GlyphID */ \
        OT_UINT16
+/* Shorthand. */
+#define G      OT_GLYPHID
 
 #define OT_UARRAY(Name, Items) \
        OT_LABEL_START(Name) \
                OT_UARRAY(Name##Substitute, OT_LIST(ToGlyphs)) \
        ) \
        OT_COVERAGE1(Name##Coverage, OT_LIST(FromGlyphs)) \
-       /* ASSERT_STATIC_EXPR_ZERO (len(FromGlyphs) == len(ToGlyphs)) */
+       /* static_assert_expr (len(FromGlyphs) == len(ToGlyphs)) */
 
 #define OT_SUBLOOKUP_LIGATURE_SUBST_FORMAT1(Name, FirstGlyphs, LigatureSetOffsets) \
        OT_SUBLOOKUP(Name, 1, \
                OT_UARRAY(Name##LigatureSetOffsetsArray, OT_LIST(LigatureSetOffsets)) \
        ) \
        OT_COVERAGE1(Name##Coverage, OT_LIST(FirstGlyphs)) \
-       /* ASSERT_STATIC_EXPR_ZERO (len(FirstGlyphs) == len(LigatureSetOffsets)) */
+       /* static_assert_expr (len(FirstGlyphs) == len(LigatureSetOffsets)) */
 
 #define OT_LIGATURE_SET(Name, LigatureSetOffsets) \
        OT_UARRAY(Name, OT_LIST(LigatureSetOffsets))
        Tag \
        OT_OFFSET(manifest, Name)
 
-/* Shorthand. */
-#define G      OT_GLYPHID
 
 /*
  * Table Start
@@ -300,14 +300,40 @@ OT_TABLE_END
 /*
  * Clean up
  */
+
+#undef MANIFEST
+#undef MANIFEST_LOOKUP
+
 #undef OT_TABLE_START
 #undef OT_TABLE_END
 #undef OT_LABEL_START
 #undef OT_LABEL_END
 #undef OT_UINT8
 #undef OT_UINT16
-#undef OT_DISTANCE
 #undef OT_COUNT
+#undef OT_DISTANCE
+
+#undef OT_LABEL
+#undef OT_LIST
+
+#undef OT_TAG
+#undef OT_OFFSET
+#undef OT_GLYPHID
+#undef G
+#undef OT_UARRAY
+#undef OT_UHEADLESSARRAY
+
+#undef OT_LOOKUP_FLAG_IGNORE_MARKS
+#undef OT_LOOKUP
+#undef OT_SUBLOOKUP
+#undef OT_COVERAGE1
+#undef OT_LOOKUP_TYPE_SUBST_SINGLE
+#undef OT_LOOKUP_TYPE_SUBST_LIGATURE
+#undef OT_SUBLOOKUP_SINGLE_SUBST_FORMAT2
+#undef OT_SUBLOOKUP_LIGATURE_SUBST_FORMAT1
+#undef OT_LIGATURE_SET
+#undef OT_LIGATURE
+
 
 /*
  * Include a second time to get the table data...
index 0c1863b..224f8b8 100644 (file)
@@ -33,7 +33,7 @@
 
 
 /* buffer var allocations */
-#define arabic_shaping_action() complex_var_u8_0() /* arabic shaping action */
+#define arabic_shaping_action() complex_var_u8_auxiliary() /* arabic shaping action */
 
 #define HB_BUFFER_SCRATCH_FLAG_ARABIC_HAS_STCH HB_BUFFER_SCRATCH_FLAG_COMPLEX0
 
@@ -228,8 +228,6 @@ collect_features_arabic (hb_ot_shape_planner_t *plan)
   map->enable_feature (HB_TAG('c','a','l','t'), F_MANUAL_ZWJ);
   map->add_gsub_pause (nullptr);
 
-  /* And undo here. */
-
   /* The spec includes 'cswh'.  Earlier versions of Windows
    * used to enable this by default, but testing suggests
    * that Windows 8 and later do not enable it by default,
@@ -261,7 +259,7 @@ struct arabic_shape_plan_t
 void *
 data_create_arabic (const hb_ot_shape_plan_t *plan)
 {
-  arabic_shape_plan_t *arabic_plan = (arabic_shape_plan_t *) calloc (1, sizeof (arabic_shape_plan_t));
+  arabic_shape_plan_t *arabic_plan = (arabic_shape_plan_t *) hb_calloc (1, sizeof (arabic_shape_plan_t));
   if (unlikely (!arabic_plan))
     return nullptr;
 
@@ -284,7 +282,7 @@ data_destroy_arabic (void *data)
 
   arabic_fallback_plan_destroy (arabic_plan->fallback_plan);
 
-  free (data);
+  hb_free (data);
 }
 
 static void
@@ -323,6 +321,20 @@ arabic_joining (hb_buffer_t *buffer)
       info[prev].arabic_shaping_action() = entry->prev_action;
       buffer->unsafe_to_break (prev, i + 1);
     }
+    else
+    {
+      if (prev == UINT_MAX)
+      {
+        if (this_type >= JOINING_TYPE_R)
+         buffer->unsafe_to_concat_from_outbuffer (0, i + 1);
+      }
+      else
+      {
+       if (this_type >= JOINING_TYPE_R ||
+           (2 <= state && state <= 5) /* States that have a possible prev_action. */)
+         buffer->unsafe_to_concat (prev, i + 1);
+      }
+    }
 
     info[i].arabic_shaping_action() = entry->curr_action;
 
@@ -339,7 +351,14 @@ arabic_joining (hb_buffer_t *buffer)
 
     const arabic_state_table_entry *entry = &arabic_state_table[state][this_type];
     if (entry->prev_action != NONE && prev != UINT_MAX)
+    {
       info[prev].arabic_shaping_action() = entry->prev_action;
+      buffer->unsafe_to_break (prev, buffer->len);
+    }
+    else if (2 <= state && state <= 5) /* States that have a possible prev_action. */
+    {
+      buffer->unsafe_to_concat (prev, buffer->len);
+    }
     break;
   }
 }
@@ -351,7 +370,7 @@ mongolian_variation_selectors (hb_buffer_t *buffer)
   unsigned int count = buffer->len;
   hb_glyph_info_t *info = buffer->info;
   for (unsigned int i = 1; i < count; i++)
-    if (unlikely (hb_in_range<hb_codepoint_t> (info[i].codepoint, 0x180Bu, 0x180Du)))
+    if (unlikely (hb_in_ranges<hb_codepoint_t> (info[i].codepoint, 0x180Bu, 0x180Du, 0x180Fu, 0x180Fu)))
       info[i].arabic_shaping_action() = info[i - 1].arabic_shaping_action();
 }
 
@@ -616,6 +635,11 @@ modifier_combining_marks[] =
   0x06E3u, /* ARABIC SMALL LOW SEEN */
   0x06E7u, /* ARABIC SMALL HIGH YEH */
   0x06E8u, /* ARABIC SMALL HIGH NOON */
+  0x08CAu, /* ARABIC SMALL HIGH FARSI YEH */
+  0x08CBu, /* ARABIC SMALL HIGH YEH BARREE WITH TWO DOTS BELOW */
+  0x08CDu, /* ARABIC SMALL HIGH ZAH */
+  0x08CEu, /* ARABIC LARGE ROUND DOT ABOVE */
+  0x08CFu, /* ARABIC LARGE ROUND DOT BELOW */
   0x08D3u, /* ARABIC SMALL LOW WAW */
   0x08F3u, /* ARABIC SMALL HIGH WAW */
 };
index f5915f4..3bc9e9b 100644 (file)
@@ -80,7 +80,7 @@ struct hangul_shape_plan_t
 static void *
 data_create_hangul (const hb_ot_shape_plan_t *plan)
 {
-  hangul_shape_plan_t *hangul_plan = (hangul_shape_plan_t *) calloc (1, sizeof (hangul_shape_plan_t));
+  hangul_shape_plan_t *hangul_plan = (hangul_shape_plan_t *) hb_calloc (1, sizeof (hangul_shape_plan_t));
   if (unlikely (!hangul_plan))
     return nullptr;
 
@@ -93,7 +93,7 @@ data_create_hangul (const hb_ot_shape_plan_t *plan)
 static void
 data_destroy_hangul (void *data)
 {
-  free (data);
+  hb_free (data);
 }
 
 /* Constants for algorithmic hangul syllable [de]composition. */
@@ -119,7 +119,7 @@ data_destroy_hangul (void *data)
 #define isHangulTone(u) (hb_in_range<hb_codepoint_t> ((u), 0x302Eu, 0x302Fu))
 
 /* buffer var allocations */
-#define hangul_shaping_feature() complex_var_u8_0() /* hangul jamo shaping feature */
+#define hangul_shaping_feature() complex_var_u8_auxiliary() /* hangul jamo shaping feature */
 
 static bool
 is_zero_width_char (hb_font_t *font,
@@ -140,7 +140,7 @@ preprocess_text_hangul (const hb_ot_shape_plan_t *plan HB_UNUSED,
    *
    *   - LV can be precomposed, or decomposed.  Lets call those
    *     <LV> and <L,V>,
-   *   - LVT can be fully precomposed, partically precomposed, or
+   *   - LVT can be fully precomposed, partially precomposed, or
    *     fully decomposed.  Ie. <LVT>, <LV,T>, or <L,V,T>.
    *
    * The composition / decomposition is mechanical.  However, not
@@ -205,7 +205,7 @@ preprocess_text_hangul (const hb_ot_shape_plan_t *plan HB_UNUSED,
       {
        /* Tone mark follows a valid syllable; move it in front, unless it's zero width. */
        buffer->unsafe_to_break_from_outbuffer (start, buffer->idx);
-       buffer->next_glyph ();
+       if (unlikely (!buffer->next_glyph ())) break;
        if (!is_zero_width_char (font, u))
        {
          buffer->merge_out_clusters (start, end + 1);
@@ -218,23 +218,25 @@ 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 (!(buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE) &&
-         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)) {
+         if (!is_zero_width_char (font, u))
+         {
            chars[0] = u;
            chars[1] = 0x25CCu;
-         } else {
+         } else
+         {
            chars[0] = 0x25CCu;
            chars[1] = u;
          }
-         buffer->replace_glyphs (1, 2, chars);
+         (void) buffer->replace_glyphs (1, 2, chars);
        }
        else
        {
          /* No dotted circle available in the font; just leave tone mark untouched. */
-         buffer->next_glyph ();
+         (void) buffer->next_glyph ();
        }
       }
       start = end = buffer->out_len;
@@ -271,9 +273,7 @@ preprocess_text_hangul (const hb_ot_shape_plan_t *plan HB_UNUSED,
          hb_codepoint_t s = SBase + (l - LBase) * NCount + (v - VBase) * TCount + tindex;
          if (font->has_glyph (s))
          {
-           buffer->replace_glyphs (t ? 3 : 2, 1, &s);
-           if (unlikely (!buffer->successful))
-             return;
+           (void) buffer->replace_glyphs (t ? 3 : 2, 1, &s);
            end = start + 1;
            continue;
          }
@@ -285,17 +285,19 @@ preprocess_text_hangul (const hb_ot_shape_plan_t *plan HB_UNUSED,
         * Set jamo features on the individual glyphs, and advance past them.
         */
        buffer->cur().hangul_shaping_feature() = LJMO;
-       buffer->next_glyph ();
+       (void) buffer->next_glyph ();
        buffer->cur().hangul_shaping_feature() = VJMO;
-       buffer->next_glyph ();
+       (void) buffer->next_glyph ();
        if (t)
        {
          buffer->cur().hangul_shaping_feature() = TJMO;
-         buffer->next_glyph ();
+         (void) buffer->next_glyph ();
          end = start + 3;
        }
        else
          end = start + 2;
+       if (unlikely (!buffer->successful))
+         break;
        if (buffer->cluster_level == HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES)
          buffer->merge_out_clusters (start, end);
        continue;
@@ -321,9 +323,7 @@ preprocess_text_hangul (const hb_ot_shape_plan_t *plan HB_UNUSED,
        hb_codepoint_t new_s = s + new_tindex;
        if (font->has_glyph (new_s))
        {
-         buffer->replace_glyphs (2, 1, &new_s);
-         if (unlikely (!buffer->successful))
-           return;
+         (void) buffer->replace_glyphs (2, 1, &new_s);
          end = start + 1;
          continue;
        }
@@ -347,19 +347,18 @@ preprocess_text_hangul (const hb_ot_shape_plan_t *plan HB_UNUSED,
            (!tindex || font->has_glyph (decomposed[2])))
        {
          unsigned int s_len = tindex ? 3 : 2;
-         buffer->replace_glyphs (1, s_len, decomposed);
+         (void) buffer->replace_glyphs (1, s_len, decomposed);
 
          /* If we decomposed an LV because of a non-combining T following,
           * we want to include this T in the syllable.
           */
          if (has_glyph && !tindex)
          {
-           buffer->next_glyph ();
+           (void) buffer->next_glyph ();
            s_len++;
          }
-
          if (unlikely (!buffer->successful))
-           return;
+           break;
 
          /* We decomposed S: apply jamo features to the individual glyphs
           * that are now in buffer->out_info.
@@ -383,19 +382,17 @@ preprocess_text_hangul (const hb_ot_shape_plan_t *plan HB_UNUSED,
 
       if (has_glyph)
       {
-       /* We didn't decompose the S, so just advance past it. */
+       /* We didn't decompose the S, so just advance past it and fall through. */
        end = start + 1;
-       buffer->next_glyph ();
-       continue;
       }
     }
 
     /* Didn't find a recognizable syllable, so we leave end <= start;
      * this will prevent tone-mark reordering happening.
      */
-    buffer->next_glyph ();
+    (void) buffer->next_glyph ();
   }
-  buffer->swap_buffers ();
+  buffer->sync ();
 }
 
 static void
index 670b6bf..74bf3ca 100644 (file)
 
 #include "hb.hh"
 
+enum indic_syllable_type_t {
+  indic_consonant_syllable,
+  indic_vowel_syllable,
+  indic_standalone_cluster,
+  indic_symbol_cluster,
+  indic_broken_cluster,
+  indic_non_indic_cluster,
+};
+
 
-#line 36 "hb-ot-shape-complex-indic-machine.hh"
+#line 45 "hb-ot-shape-complex-indic-machine.hh"
+#define indic_syllable_machine_ex_A 10u
+#define indic_syllable_machine_ex_C 1u
+#define indic_syllable_machine_ex_CM 17u
+#define indic_syllable_machine_ex_CS 19u
+#define indic_syllable_machine_ex_DOTTEDCIRCLE 12u
+#define indic_syllable_machine_ex_H 4u
+#define indic_syllable_machine_ex_M 7u
+#define indic_syllable_machine_ex_N 3u
+#define indic_syllable_machine_ex_PLACEHOLDER 11u
+#define indic_syllable_machine_ex_RS 13u
+#define indic_syllable_machine_ex_Ra 16u
+#define indic_syllable_machine_ex_Repha 15u
+#define indic_syllable_machine_ex_SM 8u
+#define indic_syllable_machine_ex_Symbol 18u
+#define indic_syllable_machine_ex_V 2u
+#define indic_syllable_machine_ex_ZWJ 6u
+#define indic_syllable_machine_ex_ZWNJ 5u
+
+
+#line 65 "hb-ot-shape-complex-indic-machine.hh"
 static const unsigned char _indic_syllable_machine_trans_keys[] = {
        8u, 8u, 4u, 8u, 5u, 7u, 5u, 8u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 
        4u, 13u, 4u, 8u, 8u, 8u, 5u, 7u, 5u, 8u, 4u, 8u, 6u, 6u, 16u, 16u, 
@@ -384,18 +413,18 @@ static const int indic_syllable_machine_error = -1;
 static const int indic_syllable_machine_en_main = 39;
 
 
-#line 36 "hb-ot-shape-complex-indic-machine.rl"
+#line 46 "hb-ot-shape-complex-indic-machine.rl"
 
 
 
-#line 93 "hb-ot-shape-complex-indic-machine.rl"
+#line 102 "hb-ot-shape-complex-indic-machine.rl"
 
 
 #define found_syllable(syllable_type) \
   HB_STMT_START { \
     if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \
     for (unsigned int i = ts; i < te; i++) \
-      info[i].syllable() = (syllable_serial << 4) | indic_##syllable_type; \
+      info[i].syllable() = (syllable_serial << 4) | syllable_type; \
     syllable_serial++; \
     if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
   } HB_STMT_END
@@ -407,7 +436,7 @@ find_syllables_indic (hb_buffer_t *buffer)
   int cs;
   hb_glyph_info_t *info = buffer->info;
   
-#line 411 "hb-ot-shape-complex-indic-machine.hh"
+#line 440 "hb-ot-shape-complex-indic-machine.hh"
        {
        cs = indic_syllable_machine_start;
        ts = 0;
@@ -415,7 +444,7 @@ find_syllables_indic (hb_buffer_t *buffer)
        act = 0;
        }
 
-#line 113 "hb-ot-shape-complex-indic-machine.rl"
+#line 122 "hb-ot-shape-complex-indic-machine.rl"
 
 
   p = 0;
@@ -423,7 +452,7 @@ find_syllables_indic (hb_buffer_t *buffer)
 
   unsigned int syllable_serial = 1;
   
-#line 427 "hb-ot-shape-complex-indic-machine.hh"
+#line 456 "hb-ot-shape-complex-indic-machine.hh"
        {
        int _slen;
        int _trans;
@@ -437,7 +466,7 @@ _resume:
 #line 1 "NONE"
        {ts = p;}
        break;
-#line 441 "hb-ot-shape-complex-indic-machine.hh"
+#line 470 "hb-ot-shape-complex-indic-machine.hh"
        }
 
        _keys = _indic_syllable_machine_trans_keys + (cs<<1);
@@ -460,64 +489,64 @@ _eof_trans:
        {te = p+1;}
        break;
        case 11:
-#line 89 "hb-ot-shape-complex-indic-machine.rl"
-       {te = p+1;{ found_syllable (non_indic_cluster); }}
+#line 98 "hb-ot-shape-complex-indic-machine.rl"
+       {te = p+1;{ found_syllable (indic_non_indic_cluster); }}
        break;
        case 13:
-#line 84 "hb-ot-shape-complex-indic-machine.rl"
-       {te = p;p--;{ found_syllable (consonant_syllable); }}
+#line 93 "hb-ot-shape-complex-indic-machine.rl"
+       {te = p;p--;{ found_syllable (indic_consonant_syllable); }}
        break;
        case 14:
-#line 85 "hb-ot-shape-complex-indic-machine.rl"
-       {te = p;p--;{ found_syllable (vowel_syllable); }}
+#line 94 "hb-ot-shape-complex-indic-machine.rl"
+       {te = p;p--;{ found_syllable (indic_vowel_syllable); }}
        break;
        case 17:
-#line 86 "hb-ot-shape-complex-indic-machine.rl"
-       {te = p;p--;{ found_syllable (standalone_cluster); }}
+#line 95 "hb-ot-shape-complex-indic-machine.rl"
+       {te = p;p--;{ found_syllable (indic_standalone_cluster); }}
        break;
        case 19:
-#line 87 "hb-ot-shape-complex-indic-machine.rl"
-       {te = p;p--;{ found_syllable (symbol_cluster); }}
+#line 96 "hb-ot-shape-complex-indic-machine.rl"
+       {te = p;p--;{ found_syllable (indic_symbol_cluster); }}
        break;
        case 15:
-#line 88 "hb-ot-shape-complex-indic-machine.rl"
-       {te = p;p--;{ found_syllable (broken_cluster); }}
+#line 97 "hb-ot-shape-complex-indic-machine.rl"
+       {te = p;p--;{ found_syllable (indic_broken_cluster); }}
        break;
        case 16:
-#line 89 "hb-ot-shape-complex-indic-machine.rl"
-       {te = p;p--;{ found_syllable (non_indic_cluster); }}
+#line 98 "hb-ot-shape-complex-indic-machine.rl"
+       {te = p;p--;{ found_syllable (indic_non_indic_cluster); }}
        break;
        case 1:
-#line 84 "hb-ot-shape-complex-indic-machine.rl"
-       {{p = ((te))-1;}{ found_syllable (consonant_syllable); }}
+#line 93 "hb-ot-shape-complex-indic-machine.rl"
+       {{p = ((te))-1;}{ found_syllable (indic_consonant_syllable); }}
        break;
        case 3:
-#line 85 "hb-ot-shape-complex-indic-machine.rl"
-       {{p = ((te))-1;}{ found_syllable (vowel_syllable); }}
+#line 94 "hb-ot-shape-complex-indic-machine.rl"
+       {{p = ((te))-1;}{ found_syllable (indic_vowel_syllable); }}
        break;
        case 7:
-#line 86 "hb-ot-shape-complex-indic-machine.rl"
-       {{p = ((te))-1;}{ found_syllable (standalone_cluster); }}
+#line 95 "hb-ot-shape-complex-indic-machine.rl"
+       {{p = ((te))-1;}{ found_syllable (indic_standalone_cluster); }}
        break;
        case 8:
-#line 87 "hb-ot-shape-complex-indic-machine.rl"
-       {{p = ((te))-1;}{ found_syllable (symbol_cluster); }}
+#line 96 "hb-ot-shape-complex-indic-machine.rl"
+       {{p = ((te))-1;}{ found_syllable (indic_symbol_cluster); }}
        break;
        case 4:
-#line 88 "hb-ot-shape-complex-indic-machine.rl"
-       {{p = ((te))-1;}{ found_syllable (broken_cluster); }}
+#line 97 "hb-ot-shape-complex-indic-machine.rl"
+       {{p = ((te))-1;}{ found_syllable (indic_broken_cluster); }}
        break;
        case 6:
 #line 1 "NONE"
        {       switch( act ) {
        case 1:
-       {{p = ((te))-1;} found_syllable (consonant_syllable); }
+       {{p = ((te))-1;} found_syllable (indic_consonant_syllable); }
        break;
        case 5:
-       {{p = ((te))-1;} found_syllable (broken_cluster); }
+       {{p = ((te))-1;} found_syllable (indic_broken_cluster); }
        break;
        case 6:
-       {{p = ((te))-1;} found_syllable (non_indic_cluster); }
+       {{p = ((te))-1;} found_syllable (indic_non_indic_cluster); }
        break;
        }
        }
@@ -525,22 +554,22 @@ _eof_trans:
        case 18:
 #line 1 "NONE"
        {te = p+1;}
-#line 84 "hb-ot-shape-complex-indic-machine.rl"
+#line 93 "hb-ot-shape-complex-indic-machine.rl"
        {act = 1;}
        break;
        case 5:
 #line 1 "NONE"
        {te = p+1;}
-#line 88 "hb-ot-shape-complex-indic-machine.rl"
+#line 97 "hb-ot-shape-complex-indic-machine.rl"
        {act = 5;}
        break;
        case 12:
 #line 1 "NONE"
        {te = p+1;}
-#line 89 "hb-ot-shape-complex-indic-machine.rl"
+#line 98 "hb-ot-shape-complex-indic-machine.rl"
        {act = 6;}
        break;
-#line 544 "hb-ot-shape-complex-indic-machine.hh"
+#line 573 "hb-ot-shape-complex-indic-machine.hh"
        }
 
 _again:
@@ -549,7 +578,7 @@ _again:
 #line 1 "NONE"
        {ts = 0;}
        break;
-#line 553 "hb-ot-shape-complex-indic-machine.hh"
+#line 582 "hb-ot-shape-complex-indic-machine.hh"
        }
 
        if ( ++p != pe )
@@ -565,7 +594,7 @@ _again:
 
        }
 
-#line 121 "hb-ot-shape-complex-indic-machine.rl"
+#line 130 "hb-ot-shape-complex-indic-machine.rl"
 
 }
 
index 1613548..df9583f 100644 (file)
 
 #include "hb.hh"
 
+enum indic_syllable_type_t {
+  indic_consonant_syllable,
+  indic_vowel_syllable,
+  indic_standalone_cluster,
+  indic_symbol_cluster,
+  indic_broken_cluster,
+  indic_non_indic_cluster,
+};
+
 %%{
   machine indic_syllable_machine;
   alphtype unsigned char;
+  write exports;
   write data;
 }%%
 
 %%{
 
-# Same order as enum indic_category_t.  Not sure how to avoid duplication.
-C    = 1;
-V    = 2;
-N    = 3;
-H    = 4;
-ZWNJ = 5;
-ZWJ  = 6;
-M    = 7;
-SM   = 8;
-A    = 10;
-PLACEHOLDER = 11;
-DOTTEDCIRCLE = 12;
-RS    = 13;
-Repha = 15;
-Ra    = 16;
-CM    = 17;
-Symbol= 18;
-CS    = 19;
+export C    = 1;
+export V    = 2;
+export N    = 3;
+export H    = 4;
+export ZWNJ = 5;
+export ZWJ  = 6;
+export M    = 7;
+export SM   = 8;
+export A    = 10;
+export PLACEHOLDER = 11;
+export DOTTEDCIRCLE = 12;
+export RS    = 13;
+export Repha = 15;
+export Ra    = 16;
+export CM    = 17;
+export Symbol= 18;
+export CS    = 19;
 
 c = (C | Ra);                  # is_consonant
 n = ((ZWNJ?.RS)? (N.N?)?);     # is_consonant_modifier
@@ -81,12 +90,12 @@ broken_cluster =    reph? n? complex_syllable_tail;
 other =                        any;
 
 main := |*
-       consonant_syllable      => { found_syllable (consonant_syllable); };
-       vowel_syllable          => { found_syllable (vowel_syllable); };
-       standalone_cluster      => { found_syllable (standalone_cluster); };
-       symbol_cluster          => { found_syllable (symbol_cluster); };
-       broken_cluster          => { found_syllable (broken_cluster); };
-       other                   => { found_syllable (non_indic_cluster); };
+       consonant_syllable      => { found_syllable (indic_consonant_syllable); };
+       vowel_syllable          => { found_syllable (indic_vowel_syllable); };
+       standalone_cluster      => { found_syllable (indic_standalone_cluster); };
+       symbol_cluster          => { found_syllable (indic_symbol_cluster); };
+       broken_cluster          => { found_syllable (indic_broken_cluster); };
+       other                   => { found_syllable (indic_non_indic_cluster); };
 *|;
 
 
@@ -96,7 +105,7 @@ main := |*
   HB_STMT_START { \
     if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \
     for (unsigned int i = ts; i < te; i++) \
-      info[i].syllable() = (syllable_serial << 4) | indic_##syllable_type; \
+      info[i].syllable() = (syllable_serial << 4) | syllable_type; \
     syllable_serial++; \
     if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
   } HB_STMT_END
index a150fd2..326aa9f 100644 (file)
@@ -6,12 +6,12 @@
  *
  * on files with these headers:
  *
- * # IndicSyllabicCategory-13.0.0.txt
- * # Date: 2019-07-22, 19:55:00 GMT [KW, RP]
- * # IndicPositionalCategory-13.0.0.txt
- * # Date: 2019-07-23, 00:01:00 GMT [KW, RP]
- * # Blocks-13.0.0.txt
- * # Date: 2019-07-10, 19:06:00 GMT [KW]
+ * # IndicSyllabicCategory-14.0.0.txt
+ * # Date: 2021-05-22, 01:01:00 GMT [KW, RP]
+ * # IndicPositionalCategory-14.0.0.txt
+ * # Date: 2021-05-22, 01:01:00 GMT [KW, RP]
+ * # Blocks-14.0.0.txt
+ * # Date: 2021-01-22, 23:29:00 GMT [KW]
  */
 
 #include "hb.hh"
@@ -27,9 +27,9 @@
 #define ISC_Bi   INDIC_SYLLABIC_CATEGORY_BINDU                       /*   91 chars; Bindu */
 #define ISC_BJN  INDIC_SYLLABIC_CATEGORY_BRAHMI_JOINING_NUMBER       /*   20 chars; Brahmi_Joining_Number */
 #define ISC_Ca   INDIC_SYLLABIC_CATEGORY_CANTILLATION_MARK           /*   59 chars; Cantillation_Mark */
-#define ISC_C    INDIC_SYLLABIC_CATEGORY_CONSONANT                   /* 2195 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_C    INDIC_SYLLABIC_CATEGORY_CONSONANT                   /* 2206 chars; Consonant */
+#define ISC_CD   INDIC_SYLLABIC_CATEGORY_CONSONANT_DEAD              /*   14 chars; Consonant_Dead */
+#define ISC_CF   INDIC_SYLLABIC_CATEGORY_CONSONANT_FINAL             /*   70 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_CPR  INDIC_SYLLABIC_CATEGORY_CONSONANT_PRECEDING_REPHA   /*    3 chars; Consonant_Preceding_Repha */
 #define ISC_CPrf INDIC_SYLLABIC_CATEGORY_CONSONANT_PREFIXED          /*   10 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_CSR  INDIC_SYLLABIC_CATEGORY_CONSONANT_SUCCEEDING_REPHA  /*    1 chars; Consonant_Succeeding_Repha */
 #define ISC_CWS  INDIC_SYLLABIC_CATEGORY_CONSONANT_WITH_STACKER      /*    8 chars; Consonant_With_Stacker */
 #define ISC_GM   INDIC_SYLLABIC_CATEGORY_GEMINATION_MARK             /*    3 chars; Gemination_Mark */
 #define ISC_IS   INDIC_SYLLABIC_CATEGORY_INVISIBLE_STACKER           /*   12 chars; Invisible_Stacker */
 #define ISC_ZWJ  INDIC_SYLLABIC_CATEGORY_JOINER                      /*    1 chars; Joiner */
 #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                       /*   31 chars; Nukta */
+#define ISC_N    INDIC_SYLLABIC_CATEGORY_NUKTA                       /*   32 chars; Nukta */
 #define ISC_Nd   INDIC_SYLLABIC_CATEGORY_NUMBER                      /*  491 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                 /*   23 chars; Pure_Killer */
+#define ISC_PK   INDIC_SYLLABIC_CATEGORY_PURE_KILLER                 /*   25 chars; Pure_Killer */
 #define ISC_RS   INDIC_SYLLABIC_CATEGORY_REGISTER_SHIFTER            /*    2 chars; Register_Shifter */
 #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_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             /*  683 chars; Vowel_Dependent */
-#define ISC_VI   INDIC_SYLLABIC_CATEGORY_VOWEL_INDEPENDENT           /*  484 chars; Vowel_Independent */
+#define ISC_M    INDIC_SYLLABIC_CATEGORY_VOWEL_DEPENDENT             /*  686 chars; Vowel_Dependent */
+#define ISC_VI   INDIC_SYLLABIC_CATEGORY_VOWEL_INDEPENDENT           /*  486 chars; Vowel_Independent */
 
-#define IMC_B    INDIC_MATRA_CATEGORY_BOTTOM                         /*  351 chars; Bottom */
+#define IMC_B    INDIC_MATRA_CATEGORY_BOTTOM                         /*  352 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               /*    4 chars; Bottom_And_Right */
 #define IMC_L    INDIC_MATRA_CATEGORY_LEFT                           /*   64 chars; Left */
 #define IMC_LR   INDIC_MATRA_CATEGORY_LEFT_AND_RIGHT                 /*   22 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                          /*  288 chars; Right */
-#define IMC_T    INDIC_MATRA_CATEGORY_TOP                            /*  415 chars; Top */
+#define IMC_R    INDIC_MATRA_CATEGORY_RIGHT                          /*  290 chars; Right */
+#define IMC_T    INDIC_MATRA_CATEGORY_TOP                            /*  418 chars; Top */
 #define IMC_TB   INDIC_MATRA_CATEGORY_TOP_AND_BOTTOM                 /*   10 chars; Top_And_Bottom */
 #define IMC_TBL  INDIC_MATRA_CATEGORY_TOP_AND_BOTTOM_AND_LEFT        /*    2 chars; Top_And_Bottom_And_Left */
 #define IMC_TBR  INDIC_MATRA_CATEGORY_TOP_AND_BOTTOM_AND_RIGHT       /*    1 chars; Top_And_Bottom_And_Right */
@@ -82,7 +82,7 @@
 #define _(S,M) INDIC_COMBINE_CATEGORIES (ISC_##S, IMC_##M)
 
 
-static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
+static const uint16_t indic_table[] = {
 
 
 #define indic_offset_0x0028u 0
@@ -231,11 +231,11 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 0C20 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 0C28 */  _(C,x),  _(x,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 0C30 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 0C38 */  _(C,x),  _(C,x),  _(x,x),  _(x,x),  _(x,x),  _(A,x),  _(M,T),  _(M,T),
+  /* 0C38 */  _(C,x),  _(C,x),  _(x,x),  _(x,x),  _(N,B),  _(A,x),  _(M,T),  _(M,T),
   /* 0C40 */  _(M,T),  _(M,R),  _(M,R),  _(M,R),  _(M,R),  _(x,x),  _(M,T),  _(M,T),
   /* 0C48 */ _(M,TB),  _(x,x),  _(M,T),  _(M,T),  _(M,T),  _(V,T),  _(x,x),  _(x,x),
   /* 0C50 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(M,T),  _(M,B),  _(x,x),
-  /* 0C58 */  _(C,x),  _(C,x),  _(C,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
+  /* 0C58 */  _(C,x),  _(C,x),  _(C,x),  _(x,x),  _(x,x), _(CD,x),  _(x,x),  _(x,x),
   /* 0C60 */ _(VI,x), _(VI,x),  _(M,B),  _(M,B),  _(x,x),  _(x,x), _(Nd,x), _(Nd,x),
   /* 0C68 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
   /* 0C70 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
@@ -254,7 +254,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 0CC0 */ _(M,TR),  _(M,R),  _(M,R),  _(M,R),  _(M,R),  _(x,x),  _(M,T), _(M,TR),
   /* 0CC8 */ _(M,TR),  _(x,x), _(M,TR), _(M,TR),  _(M,T),  _(V,T),  _(x,x),  _(x,x),
   /* 0CD0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(M,R),  _(M,R),  _(x,x),
-  /* 0CD8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(C,x),  _(x,x),
+  /* 0CD8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x), _(CD,x),  _(C,x),  _(x,x),
   /* 0CE0 */ _(VI,x), _(VI,x),  _(M,B),  _(M,B),  _(x,x),  _(x,x), _(Nd,x), _(Nd,x),
   /* 0CE8 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
   /* 0CF0 */  _(x,x),_(CWS,x),_(CWS,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
@@ -402,9 +402,9 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* AA70 */  _(x,x),  _(C,x),  _(C,x),  _(C,x), _(CP,x), _(CP,x), _(CP,x),  _(x,x),
   /* AA78 */  _(x,x),  _(x,x),  _(C,x), _(TM,R), _(TM,T), _(TM,R),  _(C,x),  _(C,x),
 
-}; /* Table items: 1792; occupancy: 70% */
+}; /* Table items: 1792; occupancy: 71% */
 
-INDIC_TABLE_ELEMENT_TYPE
+uint16_t
 hb_indic_get_categories (hb_codepoint_t u)
 {
   switch (u >> 12)
index 3dab3aa..4a8781c 100644 (file)
@@ -29,6 +29,7 @@
 #ifndef HB_NO_OT_SHAPE
 
 #include "hb-ot-shape-complex-indic.hh"
+#include "hb-ot-shape-complex-indic-machine.hh"
 #include "hb-ot-shape-complex-vowel-constraints.hh"
 #include "hb-ot-layout.hh"
 
@@ -105,7 +106,8 @@ indic_features[] =
 {
   /*
    * Basic features.
-   * These features are applied in order, one at a time, after initial_reordering.
+   * These features are applied in order, one at a time, after initial_reordering,
+   * constrained to the syllable.
    */
   {HB_TAG('n','u','k','t'), F_GLOBAL_MANUAL_JOINERS},
   {HB_TAG('a','k','h','n'), F_GLOBAL_MANUAL_JOINERS},
@@ -120,8 +122,8 @@ indic_features[] =
   {HB_TAG('c','j','c','t'), F_GLOBAL_MANUAL_JOINERS},
   /*
    * Other features.
-   * These features are applied all at once, after final_reordering
-   * but before clearing syllables.
+   * These features are applied all at once, after final_reordering, constrained
+   * to the syllable.
    * Default Bengali font in Windows for example has intermixed
    * lookups for init,pres,abvs,blws features.
    */
@@ -200,9 +202,6 @@ collect_features_indic (hb_ot_shape_planner_t *plan)
   for (; i < INDIC_NUM_FEATURES; i++)
     map->add_feature (indic_features[i]);
 
-  map->enable_feature (HB_TAG('c','a','l','t'));
-  map->enable_feature (HB_TAG('c','l','i','g'));
-
   map->add_gsub_pause (_hb_clear_syllables);
 }
 
@@ -256,7 +255,7 @@ struct indic_shape_plan_t
 static void *
 data_create_indic (const hb_ot_shape_plan_t *plan)
 {
-  indic_shape_plan_t *indic_plan = (indic_shape_plan_t *) calloc (1, sizeof (indic_shape_plan_t));
+  indic_shape_plan_t *indic_plan = (indic_shape_plan_t *) hb_calloc (1, sizeof (indic_shape_plan_t));
   if (unlikely (!indic_plan))
     return nullptr;
 
@@ -299,7 +298,7 @@ data_create_indic (const hb_ot_shape_plan_t *plan)
 static void
 data_destroy_indic (void *data)
 {
-  free (data);
+  hb_free (data);
 }
 
 static indic_position_t
@@ -337,19 +336,6 @@ consonant_position_from_face (const indic_shape_plan_t *indic_plan,
   return POS_BASE_C;
 }
 
-
-enum indic_syllable_type_t {
-  indic_consonant_syllable,
-  indic_vowel_syllable,
-  indic_standalone_cluster,
-  indic_symbol_cluster,
-  indic_broken_cluster,
-  indic_non_indic_cluster,
-};
-
-#include "hb-ot-shape-complex-indic-machine.hh"
-
-
 static void
 setup_masks_indic (const hb_ot_shape_plan_t *plan HB_UNUSED,
                   hb_buffer_t              *buffer,
@@ -650,7 +636,7 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan,
    * is *not* a Halant after last consonant already.  We know that is the
    * case for Kannada, while it reorders unconditionally in other scripts,
    * eg. Malayalam, Bengali, and Devanagari.  We don't currently know about
-   * other scripts, so we blacklist Kannada.
+   * other scripts, so we block Kannada.
    *
    * Kannada test case:
    * U+0C9A,U+0CCD,U+0C9A,U+0CCD
@@ -764,7 +750,28 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan,
      * We could use buffer->sort() for this, if there was no special
      * reordering of pre-base stuff happening later...
      * We don't want to merge_clusters all of that, which buffer->sort()
-     * would.
+     * would.  Here's a concrete example:
+     *
+     * Assume there's a pre-base consonant and explicit Halant before base,
+     * followed by a prebase-reordering (left) Matra:
+     *
+     *   C,H,ZWNJ,B,M
+     *
+     * At this point in reordering we would have:
+     *
+     *   M,C,H,ZWNJ,B
+     *
+     * whereas in final reordering we will bring the Matra closer to Base:
+     *
+     *   C,H,ZWNJ,M,B
+     *
+     * That's why we don't want to merge-clusters anything before the Base
+     * at this point.  But if something moved from after Base to before it,
+     * we should merge clusters from base to them.  In final-reordering, we
+     * only move things around before base, and merge-clusters up to base.
+     * These two merge-clusters from the two sides of base will interlock
+     * to merge things correctly.  See:
+     * https://github.com/harfbuzz/harfbuzz/issues/2272
      */
     if (indic_plan->is_old_spec || end - start > 127)
       buffer->merge_clusters (base, end);
@@ -774,17 +781,18 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan,
       for (unsigned int i = base; i < end; i++)
        if (info[i].syllable() != 255)
        {
+         unsigned int min = i;
          unsigned int max = i;
          unsigned int j = start + info[i].syllable();
          while (j != i)
          {
+           min = hb_min (min, j);
            max = hb_max (max, j);
            unsigned int next = start + info[j].syllable();
            info[j].syllable() = 255; /* So we don't process j later again. */
            j = next;
          }
-         if (i != max)
-           buffer->merge_clusters (i, max + 1);
+         buffer->merge_clusters (hb_max (base, min), max + 1);
        }
     }
 
@@ -938,79 +946,25 @@ initial_reordering_syllable_indic (const hb_ot_shape_plan_t *plan,
   }
 }
 
-static inline void
-insert_dotted_circles_indic (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;
-  unsigned int count = buffer->len;
-  hb_glyph_info_t *info = buffer->info;
-  for (unsigned int i = 0; i < count; i++)
-    if ((info[i].syllable() & 0x0F) == indic_broken_cluster)
-    {
-      has_broken_syllables = true;
-      break;
-    }
-  if (likely (!has_broken_syllables))
-    return;
-
-
-  hb_codepoint_t dottedcircle_glyph;
-  if (!font->get_nominal_glyph (0x25CCu, &dottedcircle_glyph))
-    return;
-
-  hb_glyph_info_t dottedcircle = {0};
-  dottedcircle.codepoint = 0x25CCu;
-  set_indic_properties (dottedcircle);
-  dottedcircle.codepoint = dottedcircle_glyph;
-
-  buffer->clear_output ();
-
-  buffer->idx = 0;
-  unsigned int last_syllable = 0;
-  while (buffer->idx < buffer->len && buffer->successful)
-  {
-    unsigned int syllable = buffer->cur().syllable();
-    indic_syllable_type_t syllable_type = (indic_syllable_type_t) (syllable & 0x0F);
-    if (unlikely (last_syllable != syllable && syllable_type == indic_broken_cluster))
-    {
-      last_syllable = syllable;
-
-      hb_glyph_info_t ginfo = dottedcircle;
-      ginfo.cluster = buffer->cur().cluster;
-      ginfo.mask = buffer->cur().mask;
-      ginfo.syllable() = buffer->cur().syllable();
-
-      /* Insert dottedcircle after possible Repha. */
-      while (buffer->idx < buffer->len && buffer->successful &&
-            last_syllable == buffer->cur().syllable() &&
-            buffer->cur().indic_category() == OT_Repha)
-       buffer->next_glyph ();
-
-      buffer->output_info (ginfo);
-    }
-    else
-      buffer->next_glyph ();
-  }
-  buffer->swap_buffers ();
-}
-
 static void
 initial_reordering_indic (const hb_ot_shape_plan_t *plan,
                          hb_font_t *font,
                          hb_buffer_t *buffer)
 {
+  if (!buffer->message (font, "start reordering indic initial"))
+    return;
+
   update_consonant_positions_indic (plan, font, buffer);
-  insert_dotted_circles_indic (plan, font, buffer);
+  hb_syllabic_insert_dotted_circles (font, buffer,
+                                    indic_broken_cluster,
+                                    OT_DOTTEDCIRCLE,
+                                    OT_Repha,
+                                    POS_END);
 
   foreach_syllable (buffer, start, end)
     initial_reordering_syllable_indic (plan, font->face, buffer, start, end);
+
+  (void) buffer->message (font, "end reordering indic initial");
 }
 
 static void
@@ -1333,6 +1287,7 @@ final_reordering_syllable_indic (const hb_ot_shape_plan_t *plan,
        goto reph_move;
       }
     }
+    /* See https://github.com/harfbuzz/harfbuzz/issues/2298#issuecomment-615318654 */
 
     /*       6. Otherwise, reorder reph to the end of the syllable.
      */
@@ -1484,8 +1439,11 @@ final_reordering_indic (const hb_ot_shape_plan_t *plan,
   unsigned int count = buffer->len;
   if (unlikely (!count)) return;
 
-  foreach_syllable (buffer, start, end)
-    final_reordering_syllable_indic (plan, buffer, start, end);
+  if (buffer->message (font, "start reordering indic final")) {
+    foreach_syllable (buffer, start, end)
+      final_reordering_syllable_indic (plan, buffer, start, end);
+    (void) buffer->message (font, "end reordering indic final");
+  }
 
   HB_BUFFER_DEALLOCATE_VAR (buffer, indic_category);
   HB_BUFFER_DEALLOCATE_VAR (buffer, indic_position);
index 41bd8bd..dcb28a4 100644 (file)
 
 #include "hb.hh"
 
-#include "hb-ot-shape-complex.hh"
+#include "hb-ot-shape-complex-syllabic.hh"
 
 
 /* buffer var allocations */
-#define indic_category() complex_var_u8_0() /* indic_category_t */
-#define indic_position() complex_var_u8_1() /* indic_position_t */
+#define indic_category() complex_var_u8_category() /* indic_category_t */
+#define indic_position() complex_var_u8_auxiliary() /* indic_position_t */
 
 
-#define INDIC_TABLE_ELEMENT_TYPE uint16_t
-
 /* Cateories used in the OpenType spec:
  * https://docs.microsoft.com/en-us/typography/script-development/devanagari
  */
@@ -177,7 +175,7 @@ enum indic_matra_category_t {
 
 #define INDIC_COMBINE_CATEGORIES(S,M) \
   ( \
-    ASSERT_STATIC_EXPR_ZERO (S < 255 && M < 255) + \
+    static_assert_expr (S < 255 && M < 255) + \
     ( S | \
      ( \
       ( \
@@ -194,7 +192,7 @@ enum indic_matra_category_t {
     ) \
    )
 
-HB_INTERNAL INDIC_TABLE_ELEMENT_TYPE
+HB_INTERNAL uint16_t
 hb_indic_get_categories (hb_codepoint_t u);
 
 
@@ -307,17 +305,12 @@ static const hb_codepoint_t ra_chars[] = {
   0x0D30u, /* Malayalam */     /* No Reph, Logical Repha */
 
   0x0DBBu, /* Sinhala */       /* Reph formed only with ZWJ */
-
-  0x179Au, /* Khmer */
 };
 
 static inline bool
 is_ra (hb_codepoint_t u)
 {
-  for (unsigned int i = 0; i < ARRAY_LENGTH (ra_chars); i++)
-    if (u == ra_chars[i])
-      return true;
-  return false;
+  return hb_array (ra_chars).lfind (u);
 }
 
 static inline void
@@ -325,7 +318,7 @@ set_indic_properties (hb_glyph_info_t &info)
 {
   hb_codepoint_t u = info.codepoint;
   unsigned int type = hb_indic_get_categories (u);
-  indic_category_t cat = (indic_category_t) (type & 0x7Fu);
+  indic_category_t cat = (indic_category_t) (type & 0xFFu);
   indic_position_t pos = (indic_position_t) (type >> 8);
 
 
@@ -370,6 +363,7 @@ set_indic_properties (hb_glyph_info_t &info)
   else if (unlikely (u == 0x1133Bu || u == 0x1133Cu)) cat = OT_N;
 
   else if (unlikely (u == 0x0AFBu)) cat = OT_N; /* https://github.com/harfbuzz/harfbuzz/issues/552 */
+  else if (unlikely (u == 0x0B55u)) cat = OT_N; /* https://github.com/harfbuzz/harfbuzz/issues/2849 */
 
   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 */
index a040318..c52f72f 100644 (file)
 
 #include "hb.hh"
 
+enum khmer_syllable_type_t {
+  khmer_consonant_syllable,
+  khmer_broken_cluster,
+  khmer_non_khmer_cluster,
+};
+
 
-#line 36 "hb-ot-shape-complex-khmer-machine.hh"
+#line 42 "hb-ot-shape-complex-khmer-machine.hh"
+#define khmer_syllable_machine_ex_C 1u
+#define khmer_syllable_machine_ex_Coeng 14u
+#define khmer_syllable_machine_ex_DOTTEDCIRCLE 12u
+#define khmer_syllable_machine_ex_PLACEHOLDER 11u
+#define khmer_syllable_machine_ex_Ra 16u
+#define khmer_syllable_machine_ex_Robatic 20u
+#define khmer_syllable_machine_ex_V 2u
+#define khmer_syllable_machine_ex_VAbv 26u
+#define khmer_syllable_machine_ex_VBlw 27u
+#define khmer_syllable_machine_ex_VPre 28u
+#define khmer_syllable_machine_ex_VPst 29u
+#define khmer_syllable_machine_ex_Xgroup 21u
+#define khmer_syllable_machine_ex_Ygroup 22u
+#define khmer_syllable_machine_ex_ZWJ 6u
+#define khmer_syllable_machine_ex_ZWNJ 5u
+
+
+#line 60 "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, 5u, 21u, 5u, 26u, 5u, 21u, 1u, 16u, 5u, 21u, 5u, 26u, 
@@ -215,18 +239,18 @@ static const int khmer_syllable_machine_error = -1;
 static const int khmer_syllable_machine_en_main = 20;
 
 
-#line 36 "hb-ot-shape-complex-khmer-machine.rl"
+#line 43 "hb-ot-shape-complex-khmer-machine.rl"
 
 
 
-#line 80 "hb-ot-shape-complex-khmer-machine.rl"
+#line 86 "hb-ot-shape-complex-khmer-machine.rl"
 
 
 #define found_syllable(syllable_type) \
   HB_STMT_START { \
     if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \
     for (unsigned int i = ts; i < te; i++) \
-      info[i].syllable() = (syllable_serial << 4) | khmer_##syllable_type; \
+      info[i].syllable() = (syllable_serial << 4) | syllable_type; \
     syllable_serial++; \
     if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
   } HB_STMT_END
@@ -238,7 +262,7 @@ find_syllables_khmer (hb_buffer_t *buffer)
   int cs;
   hb_glyph_info_t *info = buffer->info;
   
-#line 242 "hb-ot-shape-complex-khmer-machine.hh"
+#line 266 "hb-ot-shape-complex-khmer-machine.hh"
        {
        cs = khmer_syllable_machine_start;
        ts = 0;
@@ -246,7 +270,7 @@ find_syllables_khmer (hb_buffer_t *buffer)
        act = 0;
        }
 
-#line 100 "hb-ot-shape-complex-khmer-machine.rl"
+#line 106 "hb-ot-shape-complex-khmer-machine.rl"
 
 
   p = 0;
@@ -254,7 +278,7 @@ find_syllables_khmer (hb_buffer_t *buffer)
 
   unsigned int syllable_serial = 1;
   
-#line 258 "hb-ot-shape-complex-khmer-machine.hh"
+#line 282 "hb-ot-shape-complex-khmer-machine.hh"
        {
        int _slen;
        int _trans;
@@ -268,7 +292,7 @@ _resume:
 #line 1 "NONE"
        {ts = p;}
        break;
-#line 272 "hb-ot-shape-complex-khmer-machine.hh"
+#line 296 "hb-ot-shape-complex-khmer-machine.hh"
        }
 
        _keys = _khmer_syllable_machine_trans_keys + (cs<<1);
@@ -291,37 +315,37 @@ _eof_trans:
        {te = p+1;}
        break;
        case 8:
-#line 76 "hb-ot-shape-complex-khmer-machine.rl"
-       {te = p+1;{ found_syllable (non_khmer_cluster); }}
+#line 82 "hb-ot-shape-complex-khmer-machine.rl"
+       {te = p+1;{ found_syllable (khmer_non_khmer_cluster); }}
        break;
        case 10:
-#line 74 "hb-ot-shape-complex-khmer-machine.rl"
-       {te = p;p--;{ found_syllable (consonant_syllable); }}
+#line 80 "hb-ot-shape-complex-khmer-machine.rl"
+       {te = p;p--;{ found_syllable (khmer_consonant_syllable); }}
        break;
        case 12:
-#line 75 "hb-ot-shape-complex-khmer-machine.rl"
-       {te = p;p--;{ found_syllable (broken_cluster); }}
+#line 81 "hb-ot-shape-complex-khmer-machine.rl"
+       {te = p;p--;{ found_syllable (khmer_broken_cluster); }}
        break;
        case 11:
-#line 76 "hb-ot-shape-complex-khmer-machine.rl"
-       {te = p;p--;{ found_syllable (non_khmer_cluster); }}
+#line 82 "hb-ot-shape-complex-khmer-machine.rl"
+       {te = p;p--;{ found_syllable (khmer_non_khmer_cluster); }}
        break;
        case 1:
-#line 74 "hb-ot-shape-complex-khmer-machine.rl"
-       {{p = ((te))-1;}{ found_syllable (consonant_syllable); }}
+#line 80 "hb-ot-shape-complex-khmer-machine.rl"
+       {{p = ((te))-1;}{ found_syllable (khmer_consonant_syllable); }}
        break;
        case 5:
-#line 75 "hb-ot-shape-complex-khmer-machine.rl"
-       {{p = ((te))-1;}{ found_syllable (broken_cluster); }}
+#line 81 "hb-ot-shape-complex-khmer-machine.rl"
+       {{p = ((te))-1;}{ found_syllable (khmer_broken_cluster); }}
        break;
        case 3:
 #line 1 "NONE"
        {       switch( act ) {
        case 2:
-       {{p = ((te))-1;} found_syllable (broken_cluster); }
+       {{p = ((te))-1;} found_syllable (khmer_broken_cluster); }
        break;
        case 3:
-       {{p = ((te))-1;} found_syllable (non_khmer_cluster); }
+       {{p = ((te))-1;} found_syllable (khmer_non_khmer_cluster); }
        break;
        }
        }
@@ -329,16 +353,16 @@ _eof_trans:
        case 4:
 #line 1 "NONE"
        {te = p+1;}
-#line 75 "hb-ot-shape-complex-khmer-machine.rl"
+#line 81 "hb-ot-shape-complex-khmer-machine.rl"
        {act = 2;}
        break;
        case 9:
 #line 1 "NONE"
        {te = p+1;}
-#line 76 "hb-ot-shape-complex-khmer-machine.rl"
+#line 82 "hb-ot-shape-complex-khmer-machine.rl"
        {act = 3;}
        break;
-#line 342 "hb-ot-shape-complex-khmer-machine.hh"
+#line 366 "hb-ot-shape-complex-khmer-machine.hh"
        }
 
 _again:
@@ -347,7 +371,7 @@ _again:
 #line 1 "NONE"
        {ts = 0;}
        break;
-#line 351 "hb-ot-shape-complex-khmer-machine.hh"
+#line 375 "hb-ot-shape-complex-khmer-machine.hh"
        }
 
        if ( ++p != pe )
@@ -363,7 +387,7 @@ _again:
 
        }
 
-#line 108 "hb-ot-shape-complex-khmer-machine.rl"
+#line 114 "hb-ot-shape-complex-khmer-machine.rl"
 
 }
 
index e7f1453..c9cf33f 100644 (file)
 
 #include "hb.hh"
 
+enum khmer_syllable_type_t {
+  khmer_consonant_syllable,
+  khmer_broken_cluster,
+  khmer_non_khmer_cluster,
+};
+
 %%{
   machine khmer_syllable_machine;
   alphtype unsigned char;
+  write exports;
   write data;
 }%%
 
 %%{
 
-# Same order as enum khmer_category_t.  Not sure how to avoid duplication.
-C    = 1;
-V    = 2;
-ZWNJ = 5;
-ZWJ  = 6;
-PLACEHOLDER = 11;
-DOTTEDCIRCLE = 12;
-Coeng= 14;
-Ra   = 16;
-Robatic = 20;
-Xgroup  = 21;
-Ygroup  = 22;
-VAbv = 26;
-VBlw = 27;
-VPre = 28;
-VPst = 29;
+export C    = 1;
+export V    = 2;
+export ZWNJ = 5;
+export ZWJ  = 6;
+export PLACEHOLDER = 11;
+export DOTTEDCIRCLE = 12;
+export Coeng= 14;
+export Ra   = 16;
+export Robatic = 20;
+export Xgroup  = 21;
+export Ygroup  = 22;
+export VAbv = 26;
+export VBlw = 27;
+export VPre = 28;
+export VPst = 29;
 
 c = (C | Ra | V);
 cn = c.((ZWJ|ZWNJ)?.Robatic)?;
@@ -71,9 +77,9 @@ consonant_syllable =  (cn|PLACEHOLDER|DOTTEDCIRCLE) broken_cluster;
 other =                        any;
 
 main := |*
-       consonant_syllable      => { found_syllable (consonant_syllable); };
-       broken_cluster          => { found_syllable (broken_cluster); };
-       other                   => { found_syllable (non_khmer_cluster); };
+       consonant_syllable      => { found_syllable (khmer_consonant_syllable); };
+       broken_cluster          => { found_syllable (khmer_broken_cluster); };
+       other                   => { found_syllable (khmer_non_khmer_cluster); };
 *|;
 
 
@@ -83,7 +89,7 @@ main := |*
   HB_STMT_START { \
     if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \
     for (unsigned int i = ts; i < te; i++) \
-      info[i].syllable() = (syllable_serial << 4) | khmer_##syllable_type; \
+      info[i].syllable() = (syllable_serial << 4) | syllable_type; \
     syllable_serial++; \
     if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
   } HB_STMT_END
index fd8a9be..7787886 100644 (file)
@@ -29,6 +29,7 @@
 #ifndef HB_NO_OT_SHAPE
 
 #include "hb-ot-shape-complex-khmer.hh"
+#include "hb-ot-shape-complex-khmer-machine.hh"
 #include "hb-ot-layout.hh"
 
 
@@ -41,7 +42,8 @@ khmer_features[] =
 {
   /*
    * Basic features.
-   * These features are applied in order, one at a time, after reordering.
+   * These features are applied all at once, before reordering, constrained
+   * to the syllable.
    */
   {HB_TAG('p','r','e','f'), F_MANUAL_JOINERS},
   {HB_TAG('b','l','w','f'), F_MANUAL_JOINERS},
@@ -140,43 +142,16 @@ override_features_khmer (hb_ot_shape_planner_t *plan)
 
 struct khmer_shape_plan_t
 {
-  bool get_virama_glyph (hb_font_t *font, hb_codepoint_t *pglyph) const
-  {
-    hb_codepoint_t glyph = virama_glyph;
-    if (unlikely (virama_glyph == (hb_codepoint_t) -1))
-    {
-      if (!font->get_nominal_glyph (0x17D2u, &glyph))
-       glyph = 0;
-      /* Technically speaking, the spec says we should apply 'locl' to virama too.
-       * Maybe one day... */
-
-      /* Our get_nominal_glyph() function needs a font, so we can't get the virama glyph
-       * during shape planning...  Instead, overwrite it here.  It's safe.  Don't worry! */
-      virama_glyph = glyph;
-    }
-
-    *pglyph = glyph;
-    return glyph != 0;
-  }
-
-  mutable hb_codepoint_t virama_glyph;
-
-  hb_indic_would_substitute_feature_t pref;
-
   hb_mask_t mask_array[KHMER_NUM_FEATURES];
 };
 
 static void *
 data_create_khmer (const hb_ot_shape_plan_t *plan)
 {
-  khmer_shape_plan_t *khmer_plan = (khmer_shape_plan_t *) calloc (1, sizeof (khmer_shape_plan_t));
+  khmer_shape_plan_t *khmer_plan = (khmer_shape_plan_t *) hb_calloc (1, sizeof (khmer_shape_plan_t));
   if (unlikely (!khmer_plan))
     return nullptr;
 
-  khmer_plan->virama_glyph = (hb_codepoint_t) -1;
-
-  khmer_plan->pref.init (&plan->map, HB_TAG('p','r','e','f'), true);
-
   for (unsigned int i = 0; i < ARRAY_LENGTH (khmer_plan->mask_array); i++)
     khmer_plan->mask_array[i] = (khmer_features[i].flags & F_GLOBAL) ?
                                 0 : plan->map.get_1_mask (khmer_features[i].tag);
@@ -187,18 +162,9 @@ data_create_khmer (const hb_ot_shape_plan_t *plan)
 static void
 data_destroy_khmer (void *data)
 {
-  free (data);
+  hb_free (data);
 }
 
-
-enum khmer_syllable_type_t {
-  khmer_consonant_syllable,
-  khmer_broken_cluster,
-  khmer_non_khmer_cluster,
-};
-
-#include "hb-ot-shape-complex-khmer-machine.hh"
-
 static void
 setup_masks_khmer (const hb_ot_shape_plan_t *plan HB_UNUSED,
                   hb_buffer_t              *buffer,
@@ -325,79 +291,22 @@ reorder_syllable_khmer (const hb_ot_shape_plan_t *plan,
   }
 }
 
-static inline void
-insert_dotted_circles_khmer (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;
-  unsigned int count = buffer->len;
-  hb_glyph_info_t *info = buffer->info;
-  for (unsigned int i = 0; i < count; i++)
-    if ((info[i].syllable() & 0x0F) == khmer_broken_cluster)
-    {
-      has_broken_syllables = true;
-      break;
-    }
-  if (likely (!has_broken_syllables))
-    return;
-
-
-  hb_codepoint_t dottedcircle_glyph;
-  if (!font->get_nominal_glyph (0x25CCu, &dottedcircle_glyph))
-    return;
-
-  hb_glyph_info_t dottedcircle = {0};
-  dottedcircle.codepoint = 0x25CCu;
-  set_khmer_properties (dottedcircle);
-  dottedcircle.codepoint = dottedcircle_glyph;
-
-  buffer->clear_output ();
-
-  buffer->idx = 0;
-  unsigned int last_syllable = 0;
-  while (buffer->idx < buffer->len && buffer->successful)
-  {
-    unsigned int syllable = buffer->cur().syllable();
-    khmer_syllable_type_t syllable_type = (khmer_syllable_type_t) (syllable & 0x0F);
-    if (unlikely (last_syllable != syllable && syllable_type == khmer_broken_cluster))
-    {
-      last_syllable = syllable;
-
-      hb_glyph_info_t ginfo = dottedcircle;
-      ginfo.cluster = buffer->cur().cluster;
-      ginfo.mask = buffer->cur().mask;
-      ginfo.syllable() = buffer->cur().syllable();
-
-      /* Insert dottedcircle after possible Repha. */
-      while (buffer->idx < buffer->len && buffer->successful &&
-            last_syllable == buffer->cur().syllable() &&
-            buffer->cur().khmer_category() == OT_Repha)
-       buffer->next_glyph ();
-
-      buffer->output_info (ginfo);
-    }
-    else
-      buffer->next_glyph ();
-  }
-  buffer->swap_buffers ();
-}
-
 static void
 reorder_khmer (const hb_ot_shape_plan_t *plan,
               hb_font_t *font,
               hb_buffer_t *buffer)
 {
-  insert_dotted_circles_khmer (plan, font, buffer);
-
-  foreach_syllable (buffer, start, end)
-    reorder_syllable_khmer (plan, font->face, buffer, start, end);
-
+  if (buffer->message (font, "start reordering khmer"))
+  {
+    hb_syllabic_insert_dotted_circles (font, buffer,
+                                      khmer_broken_cluster,
+                                      OT_DOTTEDCIRCLE,
+                                      OT_Repha);
+
+    foreach_syllable (buffer, start, end)
+      reorder_syllable_khmer (plan, font->face, buffer, start, end);
+    (void) buffer->message (font, "end reordering khmer");
+  }
   HB_BUFFER_DEALLOCATE_VAR (buffer, khmer_category);
 }
 
index 11a77bf..35bfbb6 100644 (file)
@@ -49,13 +49,15 @@ enum khmer_category_t
   //OT_VPst = 29,
 };
 
+using khmer_position_t = indic_position_t;
+
 static inline void
 set_khmer_properties (hb_glyph_info_t &info)
 {
   hb_codepoint_t u = info.codepoint;
   unsigned int type = hb_indic_get_categories (u);
-  khmer_category_t cat = (khmer_category_t) (type & 0x7Fu);
-  indic_position_t pos = (indic_position_t) (type >> 8);
+  khmer_category_t cat = (khmer_category_t) (type & 0xFFu);
+  khmer_position_t pos = (khmer_position_t) (type >> 8);
 
 
   /*
index c2f4c00..f4ef330 100644 (file)
 
 #include "hb.hh"
 
+enum myanmar_syllable_type_t {
+  myanmar_consonant_syllable,
+  myanmar_punctuation_cluster,
+  myanmar_broken_cluster,
+  myanmar_non_myanmar_cluster,
+};
+
 
-#line 36 "hb-ot-shape-complex-myanmar-machine.hh"
+#line 43 "hb-ot-shape-complex-myanmar-machine.hh"
+#define myanmar_syllable_machine_ex_A 10u
+#define myanmar_syllable_machine_ex_As 18u
+#define myanmar_syllable_machine_ex_C 1u
+#define myanmar_syllable_machine_ex_CS 19u
+#define myanmar_syllable_machine_ex_D 32u
+#define myanmar_syllable_machine_ex_D0 20u
+#define myanmar_syllable_machine_ex_DB 3u
+#define myanmar_syllable_machine_ex_GB 11u
+#define myanmar_syllable_machine_ex_H 4u
+#define myanmar_syllable_machine_ex_IV 2u
+#define myanmar_syllable_machine_ex_MH 21u
+#define myanmar_syllable_machine_ex_ML 33u
+#define myanmar_syllable_machine_ex_MR 22u
+#define myanmar_syllable_machine_ex_MW 23u
+#define myanmar_syllable_machine_ex_MY 24u
+#define myanmar_syllable_machine_ex_P 31u
+#define myanmar_syllable_machine_ex_PT 25u
+#define myanmar_syllable_machine_ex_Ra 16u
+#define myanmar_syllable_machine_ex_V 8u
+#define myanmar_syllable_machine_ex_VAbv 26u
+#define myanmar_syllable_machine_ex_VBlw 27u
+#define myanmar_syllable_machine_ex_VPre 28u
+#define myanmar_syllable_machine_ex_VPst 29u
+#define myanmar_syllable_machine_ex_VS 30u
+#define myanmar_syllable_machine_ex_ZWJ 6u
+#define myanmar_syllable_machine_ex_ZWNJ 5u
+
+
+#line 72 "hb-ot-shape-complex-myanmar-machine.hh"
 static const unsigned char _myanmar_syllable_machine_trans_keys[] = {
-       1u, 32u, 3u, 30u, 5u, 29u, 5u, 8u, 5u, 29u, 3u, 25u, 5u, 25u, 5u, 25u, 
-       3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 1u, 16u, 3u, 29u, 3u, 29u, 3u, 29u, 
-       3u, 29u, 3u, 29u, 3u, 30u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 
-       5u, 29u, 5u, 8u, 5u, 29u, 3u, 25u, 5u, 25u, 5u, 25u, 3u, 29u, 3u, 29u, 
-       3u, 29u, 3u, 29u, 1u, 16u, 3u, 30u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 
-       3u, 29u, 3u, 30u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 30u, 
-       3u, 29u, 1u, 32u, 1u, 32u, 8u, 8u, 0
+       1u, 33u, 3u, 33u, 5u, 29u, 5u, 8u, 5u, 29u, 3u, 25u, 5u, 25u, 5u, 25u, 
+       3u, 33u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 33u, 1u, 16u, 3u, 33u, 3u, 33u, 
+       3u, 29u, 3u, 29u, 3u, 29u, 3u, 30u, 3u, 29u, 3u, 33u, 3u, 33u, 3u, 33u, 
+       3u, 33u, 3u, 33u, 5u, 29u, 5u, 8u, 5u, 29u, 3u, 25u, 5u, 25u, 5u, 25u, 
+       3u, 33u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 33u, 1u, 16u, 3u, 33u, 3u, 33u, 
+       3u, 33u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 30u, 3u, 29u, 3u, 33u, 3u, 33u, 
+       3u, 33u, 3u, 33u, 3u, 33u, 3u, 33u, 3u, 33u, 1u, 33u, 1u, 32u, 8u, 8u, 
+       0
 };
 
 static const char _myanmar_syllable_machine_key_spans[] = {
-       32, 28, 25, 4, 25, 23, 21, 21, 
-       27, 27, 27, 27, 16, 27, 27, 27
-       27, 27, 28, 27, 27, 27, 27, 27
-       25, 4, 25, 23, 21, 21, 27, 27
-       27, 27, 16, 28, 27, 27, 27, 27
-       27, 28, 27, 27, 27, 27, 27, 28
-       27, 32, 32, 1
+       33, 31, 25, 4, 25, 23, 21, 21, 
+       31, 27, 27, 27, 31, 16, 31, 31
+       27, 27, 27, 28, 27, 31, 31, 31
+       31, 31, 25, 4, 25, 23, 21, 21
+       31, 27, 27, 27, 31, 16, 31, 31
+       31, 27, 27, 27, 28, 27, 31, 31
+       31, 31, 31, 31, 31, 33, 32, 1
 };
 
 static const short _myanmar_syllable_machine_index_offsets[] = {
-       0, 33, 62, 88, 93, 119, 143, 165
-       187, 215, 243, 271, 299, 316, 344, 372
-       400, 428, 456, 485, 513, 541, 569, 597
-       625, 651, 656, 682, 706, 728, 750, 778
-       806, 834, 862, 879, 908, 936, 964, 992
-       1020, 1048, 1077, 1105, 1133, 1161, 1189, 1217
-       1246, 1274, 1307, 1340
+       0, 34, 66, 92, 97, 123, 147, 169
+       191, 223, 251, 279, 307, 339, 356, 388
+       420, 448, 476, 504, 533, 561, 593, 625
+       657, 689, 721, 747, 752, 778, 802, 824
+       846, 878, 906, 934, 962, 994, 1011, 1043
+       1075, 1107, 1135, 1163, 1191, 1220, 1248, 1280
+       1312, 1344, 1376, 1408, 1440, 1472, 1506, 1539
 };
 
 static const char _myanmar_syllable_machine_indicies[] = {
@@ -68,192 +105,217 @@ static const char _myanmar_syllable_machine_indicies[] = {
        0, 6, 1, 0, 0, 0, 0, 7, 
        0, 8, 9, 0, 10, 11, 12, 13, 
        14, 15, 16, 17, 18, 19, 20, 1, 
-       0, 22, 23, 24, 24, 21, 25, 21, 
-       26, 21, 21, 21, 21, 21, 21, 21, 
-       27, 21, 21, 28, 29, 30, 31, 32, 
-       33, 34, 35, 36, 37, 21, 24, 24, 
-       21, 25, 21, 21, 21, 21, 21, 21, 
-       21, 21, 21, 38, 21, 21, 21, 21, 
-       21, 21, 32, 21, 21, 21, 36, 21, 
-       24, 24, 21, 25, 21, 24, 24, 21, 
-       25, 21, 21, 21, 21, 21, 21, 21, 
-       21, 21, 21, 21, 21, 21, 21, 21, 
-       21, 32, 21, 21, 21, 36, 21, 39, 
-       21, 24, 24, 21, 25, 21, 32, 21, 
-       21, 21, 21, 21, 21, 21, 40, 21, 
-       21, 21, 21, 21, 21, 32, 21, 24, 
-       24, 21, 25, 21, 21, 21, 21, 21, 
-       21, 21, 21, 21, 40, 21, 21, 21, 
-       21, 21, 21, 32, 21, 24, 24, 21, 
-       25, 21, 21, 21, 21, 21, 21, 21, 
-       21, 21, 21, 21, 21, 21, 21, 21, 
-       21, 32, 21, 22, 21, 24, 24, 21, 
-       25, 21, 26, 21, 21, 21, 21, 21, 
-       21, 21, 41, 21, 21, 41, 21, 21, 
-       21, 32, 42, 21, 21, 36, 21, 22, 
-       21, 24, 24, 21, 25, 21, 26, 21, 
-       21, 21, 21, 21, 21, 21, 21, 21, 
-       21, 21, 21, 21, 21, 32, 21, 21, 
-       21, 36, 21, 22, 21, 24, 24, 21, 
-       25, 21, 26, 21, 21, 21, 21, 21, 
-       21, 21, 41, 21, 21, 21, 21, 21, 
-       21, 32, 42, 21, 21, 36, 21, 22, 
-       21, 24, 24, 21, 25, 21, 26, 21, 
-       21, 21, 21, 21, 21, 21, 21, 21, 
-       21, 21, 21, 21, 21, 32, 42, 21, 
-       21, 36, 21, 1, 1, 21, 21, 21, 
-       21, 21, 21, 21, 21, 21, 21, 21, 
-       21, 21, 1, 21, 22, 21, 24, 24, 
-       21, 25, 21, 26, 21, 21, 21, 21, 
-       21, 21, 21, 27, 21, 21, 28, 29, 
-       30, 31, 32, 33, 34, 35, 36, 21, 
-       22, 21, 24, 24, 21, 25, 21, 26, 
-       21, 21, 21, 21, 21, 21, 21, 43, 
-       21, 21, 21, 21, 21, 21, 32, 33, 
-       34, 35, 36, 21, 22, 21, 24, 24, 
-       21, 25, 21, 26, 21, 21, 21, 21, 
-       21, 21, 21, 21, 21, 21, 21, 21, 
-       21, 21, 32, 33, 34, 35, 36, 21, 
-       22, 21, 24, 24, 21, 25, 21, 26, 
-       21, 21, 21, 21, 21, 21, 21, 21, 
-       21, 21, 21, 21, 21, 21, 32, 33, 
-       34, 21, 36, 21, 22, 21, 24, 24, 
-       21, 25, 21, 26, 21, 21, 21, 21, 
-       21, 21, 21, 21, 21, 21, 21, 21, 
-       21, 21, 32, 21, 34, 21, 36, 21, 
-       22, 21, 24, 24, 21, 25, 21, 26, 
-       21, 21, 21, 21, 21, 21, 21, 21, 
-       21, 21, 21, 21, 21, 21, 32, 33, 
-       34, 35, 36, 43, 21, 22, 21, 24, 
-       24, 21, 25, 21, 26, 21, 21, 21, 
-       21, 21, 21, 21, 21, 21, 21, 28, 
-       21, 30, 21, 32, 33, 34, 35, 36, 
-       21, 22, 21, 24, 24, 21, 25, 21, 
-       26, 21, 21, 21, 21, 21, 21, 21, 
-       43, 21, 21, 28, 21, 21, 21, 32, 
-       33, 34, 35, 36, 21, 22, 21, 24, 
-       24, 21, 25, 21, 26, 21, 21, 21, 
-       21, 21, 21, 21, 44, 21, 21, 28, 
-       29, 30, 21, 32, 33, 34, 35, 36, 
-       21, 22, 21, 24, 24, 21, 25, 21, 
-       26, 21, 21, 21, 21, 21, 21, 21, 
-       21, 21, 21, 28, 29, 30, 21, 32, 
-       33, 34, 35, 36, 21, 22, 23, 24, 
-       24, 21, 25, 21, 26, 21, 21, 21, 
-       21, 21, 21, 21, 27, 21, 21, 28, 
-       29, 30, 31, 32, 33, 34, 35, 36, 
-       21, 46, 46, 45, 5, 45, 45, 45, 
-       45, 45, 45, 45, 45, 45, 47, 45, 
-       45, 45, 45, 45, 45, 14, 45, 45, 
-       45, 18, 45, 46, 46, 45, 5, 45, 
-       46, 46, 45, 5, 45, 45, 45, 45, 
-       45, 45, 45, 45, 45, 45, 45, 45, 
-       45, 45, 45, 45, 14, 45, 45, 45, 
-       18, 45, 48, 45, 46, 46, 45, 5, 
-       45, 14, 45, 45, 45, 45, 45, 45, 
-       45, 49, 45, 45, 45, 45, 45, 45, 
-       14, 45, 46, 46, 45, 5, 45, 45, 
-       45, 45, 45, 45, 45, 45, 45, 49, 
-       45, 45, 45, 45, 45, 45, 14, 45, 
-       46, 46, 45, 5, 45, 45, 45, 45, 
-       45, 45, 45, 45, 45, 45, 45, 45, 
-       45, 45, 45, 45, 14, 45, 2, 45, 
-       46, 46, 45, 5, 45, 6, 45, 45, 
-       45, 45, 45, 45, 45, 50, 45, 45, 
-       50, 45, 45, 45, 14, 51, 45, 45, 
-       18, 45, 2, 45, 46, 46, 45, 5, 
-       45, 6, 45, 45, 45, 45, 45, 45, 
-       45, 45, 45, 45, 45, 45, 45, 45, 
-       14, 45, 45, 45, 18, 45, 2, 45, 
-       46, 46, 45, 5, 45, 6, 45, 45, 
-       45, 45, 45, 45, 45, 50, 45, 45, 
-       45, 45, 45, 45, 14, 51, 45, 45, 
-       18, 45, 2, 45, 46, 46, 45, 5, 
-       45, 6, 45, 45, 45, 45, 45, 45, 
-       45, 45, 45, 45, 45, 45, 45, 45, 
-       14, 51, 45, 45, 18, 45, 52, 52, 
-       45, 45, 45, 45, 45, 45, 45, 45, 
-       45, 45, 45, 45, 45, 52, 45, 2, 
-       3, 46, 46, 45, 5, 45, 6, 45, 
-       45, 45, 45, 45, 45, 45, 8, 45, 
-       45, 10, 11, 12, 13, 14, 15, 16, 
-       17, 18, 19, 45, 2, 45, 46, 46, 
-       45, 5, 45, 6, 45, 45, 45, 45, 
-       45, 45, 45, 8, 45, 45, 10, 11, 
-       12, 13, 14, 15, 16, 17, 18, 45, 
-       2, 45, 46, 46, 45, 5, 45, 6, 
-       45, 45, 45, 45, 45, 45, 45, 53, 
-       45, 45, 45, 45, 45, 45, 14, 15, 
-       16, 17, 18, 45, 2, 45, 46, 46, 
-       45, 5, 45, 6, 45, 45, 45, 45, 
-       45, 45, 45, 45, 45, 45, 45, 45, 
-       45, 45, 14, 15, 16, 17, 18, 45, 
-       2, 45, 46, 46, 45, 5, 45, 6, 
-       45, 45, 45, 45, 45, 45, 45, 45, 
-       45, 45, 45, 45, 45, 45, 14, 15, 
-       16, 45, 18, 45, 2, 45, 46, 46, 
-       45, 5, 45, 6, 45, 45, 45, 45, 
-       45, 45, 45, 45, 45, 45, 45, 45, 
-       45, 45, 14, 45, 16, 45, 18, 45, 
-       2, 45, 46, 46, 45, 5, 45, 6, 
-       45, 45, 45, 45, 45, 45, 45, 45, 
-       45, 45, 45, 45, 45, 45, 14, 15, 
-       16, 17, 18, 53, 45, 2, 45, 46, 
-       46, 45, 5, 45, 6, 45, 45, 45, 
-       45, 45, 45, 45, 45, 45, 45, 10, 
-       45, 12, 45, 14, 15, 16, 17, 18, 
-       45, 2, 45, 46, 46, 45, 5, 45, 
-       6, 45, 45, 45, 45, 45, 45, 45, 
-       53, 45, 45, 10, 45, 45, 45, 14, 
-       15, 16, 17, 18, 45, 2, 45, 46, 
-       46, 45, 5, 45, 6, 45, 45, 45, 
-       45, 45, 45, 45, 54, 45, 45, 10, 
-       11, 12, 45, 14, 15, 16, 17, 18, 
-       45, 2, 45, 46, 46, 45, 5, 45, 
-       6, 45, 45, 45, 45, 45, 45, 45, 
-       45, 45, 45, 10, 11, 12, 45, 14, 
-       15, 16, 17, 18, 45, 2, 3, 46, 
-       46, 45, 5, 45, 6, 45, 45, 45, 
-       45, 45, 45, 45, 8, 45, 45, 10, 
-       11, 12, 13, 14, 15, 16, 17, 18, 
-       45, 22, 23, 24, 24, 21, 25, 21, 
-       26, 21, 21, 21, 21, 21, 21, 21, 
-       55, 21, 21, 28, 29, 30, 31, 32, 
-       33, 34, 35, 36, 37, 21, 22, 56, 
-       24, 24, 21, 25, 21, 26, 21, 21, 
-       21, 21, 21, 21, 21, 27, 21, 21, 
-       28, 29, 30, 31, 32, 33, 34, 35, 
-       36, 21, 1, 1, 2, 3, 46, 46, 
-       45, 5, 45, 6, 1, 45, 45, 45, 
-       45, 1, 45, 8, 45, 45, 10, 11, 
-       12, 13, 14, 15, 16, 17, 18, 19, 
-       45, 1, 45, 1, 1, 57, 57, 57, 
-       57, 57, 57, 57, 57, 1, 57, 57, 
-       57, 57, 1, 57, 57, 57, 57, 57, 
-       57, 57, 57, 57, 57, 57, 57, 57, 
-       57, 57, 1, 57, 58, 57, 0
+       21, 0, 23, 24, 25, 25, 22, 26, 
+       22, 27, 22, 22, 22, 22, 22, 22, 
+       22, 28, 22, 22, 29, 30, 31, 32, 
+       33, 34, 35, 36, 37, 38, 22, 22, 
+       39, 22, 25, 25, 22, 26, 22, 22, 
+       22, 22, 22, 22, 22, 22, 22, 40, 
+       22, 22, 22, 22, 22, 22, 33, 22, 
+       22, 22, 37, 22, 25, 25, 22, 26, 
+       22, 25, 25, 22, 26, 22, 22, 22, 
+       22, 22, 22, 22, 22, 22, 22, 22, 
+       22, 22, 22, 22, 22, 33, 22, 22, 
+       22, 37, 22, 41, 22, 25, 25, 22, 
+       26, 22, 33, 22, 22, 22, 22, 22, 
+       22, 22, 42, 22, 22, 22, 22, 22, 
+       22, 33, 22, 25, 25, 22, 26, 22, 
+       22, 22, 22, 22, 22, 22, 22, 22, 
+       42, 22, 22, 22, 22, 22, 22, 33, 
+       22, 25, 25, 22, 26, 22, 22, 22, 
+       22, 22, 22, 22, 22, 22, 22, 22, 
+       22, 22, 22, 22, 22, 33, 22, 23, 
+       22, 25, 25, 22, 26, 22, 27, 22, 
+       22, 22, 22, 22, 22, 22, 43, 22, 
+       22, 44, 22, 22, 22, 33, 45, 22, 
+       22, 37, 22, 22, 22, 43, 22, 23, 
+       22, 25, 25, 22, 26, 22, 27, 22, 
+       22, 22, 22, 22, 22, 22, 22, 22, 
+       22, 22, 22, 22, 22, 33, 22, 22, 
+       22, 37, 22, 23, 22, 25, 25, 22, 
+       26, 22, 27, 22, 22, 22, 22, 22, 
+       22, 22, 43, 22, 22, 22, 22, 22, 
+       22, 33, 45, 22, 22, 37, 22, 23, 
+       22, 25, 25, 22, 26, 22, 27, 22, 
+       22, 22, 22, 22, 22, 22, 22, 22, 
+       22, 22, 22, 22, 22, 33, 45, 22, 
+       22, 37, 22, 23, 22, 25, 25, 22, 
+       26, 22, 27, 22, 22, 22, 22, 22, 
+       22, 22, 43, 22, 22, 22, 22, 22, 
+       22, 33, 45, 22, 22, 37, 22, 22, 
+       22, 43, 22, 1, 1, 22, 22, 22, 
+       22, 22, 22, 22, 22, 22, 22, 22, 
+       22, 22, 1, 22, 23, 22, 25, 25, 
+       22, 26, 22, 27, 22, 22, 22, 22, 
+       22, 22, 22, 28, 22, 22, 29, 30, 
+       31, 32, 33, 34, 35, 36, 37, 22, 
+       22, 22, 39, 22, 23, 22, 25, 25, 
+       22, 26, 22, 27, 22, 22, 22, 22, 
+       22, 22, 22, 46, 22, 22, 22, 22, 
+       22, 22, 33, 34, 35, 36, 37, 22, 
+       22, 22, 39, 22, 23, 22, 25, 25, 
+       22, 26, 22, 27, 22, 22, 22, 22, 
+       22, 22, 22, 22, 22, 22, 22, 22, 
+       22, 22, 33, 34, 35, 36, 37, 22, 
+       23, 22, 25, 25, 22, 26, 22, 27, 
+       22, 22, 22, 22, 22, 22, 22, 22, 
+       22, 22, 22, 22, 22, 22, 33, 34, 
+       35, 22, 37, 22, 23, 22, 25, 25, 
+       22, 26, 22, 27, 22, 22, 22, 22, 
+       22, 22, 22, 22, 22, 22, 22, 22, 
+       22, 22, 33, 22, 35, 22, 37, 22, 
+       23, 22, 25, 25, 22, 26, 22, 27, 
+       22, 22, 22, 22, 22, 22, 22, 22, 
+       22, 22, 22, 22, 22, 22, 33, 34, 
+       35, 36, 37, 46, 22, 23, 22, 25, 
+       25, 22, 26, 22, 27, 22, 22, 22, 
+       22, 22, 22, 22, 46, 22, 22, 22, 
+       22, 22, 22, 33, 34, 35, 36, 37, 
+       22, 23, 22, 25, 25, 22, 26, 22, 
+       27, 22, 22, 22, 22, 22, 22, 22, 
+       22, 22, 22, 29, 22, 31, 22, 33, 
+       34, 35, 36, 37, 22, 22, 22, 39, 
+       22, 23, 22, 25, 25, 22, 26, 22, 
+       27, 22, 22, 22, 22, 22, 22, 22, 
+       46, 22, 22, 29, 22, 22, 22, 33, 
+       34, 35, 36, 37, 22, 22, 22, 39, 
+       22, 23, 22, 25, 25, 22, 26, 22, 
+       27, 22, 22, 22, 22, 22, 22, 22, 
+       47, 22, 22, 29, 30, 31, 22, 33, 
+       34, 35, 36, 37, 22, 22, 22, 39, 
+       22, 23, 22, 25, 25, 22, 26, 22, 
+       27, 22, 22, 22, 22, 22, 22, 22, 
+       22, 22, 22, 29, 30, 31, 22, 33, 
+       34, 35, 36, 37, 22, 22, 22, 39, 
+       22, 23, 24, 25, 25, 22, 26, 22, 
+       27, 22, 22, 22, 22, 22, 22, 22, 
+       28, 22, 22, 29, 30, 31, 32, 33, 
+       34, 35, 36, 37, 22, 22, 22, 39, 
+       22, 49, 49, 48, 5, 48, 48, 48, 
+       48, 48, 48, 48, 48, 48, 50, 48, 
+       48, 48, 48, 48, 48, 14, 48, 48, 
+       48, 18, 48, 49, 49, 48, 5, 48, 
+       49, 49, 48, 5, 48, 48, 48, 48, 
+       48, 48, 48, 48, 48, 48, 48, 48, 
+       48, 48, 48, 48, 14, 48, 48, 48, 
+       18, 48, 51, 48, 49, 49, 48, 5, 
+       48, 14, 48, 48, 48, 48, 48, 48, 
+       48, 52, 48, 48, 48, 48, 48, 48, 
+       14, 48, 49, 49, 48, 5, 48, 48, 
+       48, 48, 48, 48, 48, 48, 48, 52, 
+       48, 48, 48, 48, 48, 48, 14, 48, 
+       49, 49, 48, 5, 48, 48, 48, 48, 
+       48, 48, 48, 48, 48, 48, 48, 48, 
+       48, 48, 48, 48, 14, 48, 2, 48, 
+       49, 49, 48, 5, 48, 6, 48, 48, 
+       48, 48, 48, 48, 48, 53, 48, 48, 
+       54, 48, 48, 48, 14, 55, 48, 48, 
+       18, 48, 48, 48, 53, 48, 2, 48, 
+       49, 49, 48, 5, 48, 6, 48, 48, 
+       48, 48, 48, 48, 48, 48, 48, 48, 
+       48, 48, 48, 48, 14, 48, 48, 48, 
+       18, 48, 2, 48, 49, 49, 48, 5, 
+       48, 6, 48, 48, 48, 48, 48, 48, 
+       48, 53, 48, 48, 48, 48, 48, 48, 
+       14, 55, 48, 48, 18, 48, 2, 48, 
+       49, 49, 48, 5, 48, 6, 48, 48, 
+       48, 48, 48, 48, 48, 48, 48, 48, 
+       48, 48, 48, 48, 14, 55, 48, 48, 
+       18, 48, 2, 48, 49, 49, 48, 5, 
+       48, 6, 48, 48, 48, 48, 48, 48, 
+       48, 53, 48, 48, 48, 48, 48, 48, 
+       14, 55, 48, 48, 18, 48, 48, 48, 
+       53, 48, 56, 56, 48, 48, 48, 48, 
+       48, 48, 48, 48, 48, 48, 48, 48, 
+       48, 56, 48, 2, 3, 49, 49, 48, 
+       5, 48, 6, 48, 48, 48, 48, 48, 
+       48, 48, 8, 48, 48, 10, 11, 12, 
+       13, 14, 15, 16, 17, 18, 19, 48, 
+       48, 21, 48, 2, 48, 49, 49, 48, 
+       5, 48, 6, 48, 48, 48, 48, 48, 
+       48, 48, 8, 48, 48, 10, 11, 12, 
+       13, 14, 15, 16, 17, 18, 48, 48, 
+       48, 21, 48, 2, 48, 49, 49, 48, 
+       5, 48, 6, 48, 48, 48, 48, 48, 
+       48, 48, 57, 48, 48, 48, 48, 48, 
+       48, 14, 15, 16, 17, 18, 48, 48, 
+       48, 21, 48, 2, 48, 49, 49, 48, 
+       5, 48, 6, 48, 48, 48, 48, 48, 
+       48, 48, 48, 48, 48, 48, 48, 48, 
+       48, 14, 15, 16, 17, 18, 48, 2, 
+       48, 49, 49, 48, 5, 48, 6, 48, 
+       48, 48, 48, 48, 48, 48, 48, 48, 
+       48, 48, 48, 48, 48, 14, 15, 16, 
+       48, 18, 48, 2, 48, 49, 49, 48, 
+       5, 48, 6, 48, 48, 48, 48, 48, 
+       48, 48, 48, 48, 48, 48, 48, 48, 
+       48, 14, 48, 16, 48, 18, 48, 2, 
+       48, 49, 49, 48, 5, 48, 6, 48, 
+       48, 48, 48, 48, 48, 48, 48, 48, 
+       48, 48, 48, 48, 48, 14, 15, 16, 
+       17, 18, 57, 48, 2, 48, 49, 49, 
+       48, 5, 48, 6, 48, 48, 48, 48, 
+       48, 48, 48, 57, 48, 48, 48, 48, 
+       48, 48, 14, 15, 16, 17, 18, 48, 
+       2, 48, 49, 49, 48, 5, 48, 6, 
+       48, 48, 48, 48, 48, 48, 48, 48, 
+       48, 48, 10, 48, 12, 48, 14, 15, 
+       16, 17, 18, 48, 48, 48, 21, 48, 
+       2, 48, 49, 49, 48, 5, 48, 6, 
+       48, 48, 48, 48, 48, 48, 48, 57, 
+       48, 48, 10, 48, 48, 48, 14, 15, 
+       16, 17, 18, 48, 48, 48, 21, 48, 
+       2, 48, 49, 49, 48, 5, 48, 6, 
+       48, 48, 48, 48, 48, 48, 48, 58, 
+       48, 48, 10, 11, 12, 48, 14, 15, 
+       16, 17, 18, 48, 48, 48, 21, 48, 
+       2, 48, 49, 49, 48, 5, 48, 6, 
+       48, 48, 48, 48, 48, 48, 48, 48, 
+       48, 48, 10, 11, 12, 48, 14, 15, 
+       16, 17, 18, 48, 48, 48, 21, 48, 
+       2, 3, 49, 49, 48, 5, 48, 6, 
+       48, 48, 48, 48, 48, 48, 48, 8, 
+       48, 48, 10, 11, 12, 13, 14, 15, 
+       16, 17, 18, 48, 48, 48, 21, 48, 
+       23, 24, 25, 25, 22, 26, 22, 27, 
+       22, 22, 22, 22, 22, 22, 22, 59, 
+       22, 22, 29, 30, 31, 32, 33, 34, 
+       35, 36, 37, 38, 22, 22, 39, 22, 
+       23, 60, 25, 25, 22, 26, 22, 27, 
+       22, 22, 22, 22, 22, 22, 22, 28, 
+       22, 22, 29, 30, 31, 32, 33, 34, 
+       35, 36, 37, 22, 22, 22, 39, 22, 
+       1, 1, 2, 3, 49, 49, 48, 5, 
+       48, 6, 1, 48, 48, 48, 48, 1, 
+       48, 8, 48, 48, 10, 11, 12, 13, 
+       14, 15, 16, 17, 18, 19, 48, 1, 
+       21, 48, 1, 1, 61, 61, 61, 61, 
+       61, 61, 61, 61, 1, 61, 61, 61, 
+       61, 1, 61, 61, 61, 61, 61, 61, 
+       61, 61, 61, 61, 61, 61, 61, 61, 
+       61, 1, 61, 62, 61, 0
 };
 
 static const char _myanmar_syllable_machine_trans_targs[] = {
-       0, 1, 24, 34, 0, 25, 31, 47
-       36, 50, 37, 42, 43, 44, 27, 39
-       40, 41, 30, 46, 51, 0, 2, 12, 
-       0, 3, 9, 13, 14, 19, 20, 21
-       5, 16, 17, 18, 8, 23, 4, 6
-       7, 10, 11, 15, 22, 0, 0, 26
-       28, 29, 32, 33, 35, 38, 45, 48
-       49, 0, 0
+       0, 1, 26, 37, 0, 27, 33, 51
+       39, 54, 40, 46, 47, 48, 29, 42
+       43, 44, 32, 50, 55, 45, 0, 2, 
+       13, 0, 3, 9, 14, 15, 21, 22
+       23, 5, 17, 18, 19, 8, 25, 20
+       4, 6, 7, 10, 12, 11, 16, 24
+       0, 0, 28, 30, 31, 34, 36, 35
+       38, 41, 49, 52, 53, 0, 0
 };
 
 static const char _myanmar_syllable_machine_trans_actions[] = {
        3, 0, 0, 0, 4, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0, 5, 0, 0, 
-       6, 0, 0, 0, 0, 0, 0, 0, 
+       0, 0, 0, 0, 0, 0, 5, 0, 
+       0, 6, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0, 7, 8, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 9, 10
+       7, 8, 0, 0, 0, 0, 0, 0, 
+       0, 0, 0, 0, 0, 9, 10
 };
 
 static const char _myanmar_syllable_machine_to_state_actions[] = {
@@ -263,7 +325,7 @@ static const char _myanmar_syllable_machine_to_state_actions[] = {
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0
+       0, 0, 0, 0, 0, 0, 0, 0
 };
 
 static const char _myanmar_syllable_machine_from_state_actions[] = {
@@ -273,17 +335,17 @@ static const char _myanmar_syllable_machine_from_state_actions[] = {
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0
+       0, 0, 0, 0, 0, 0, 0, 0
 };
 
 static const short _myanmar_syllable_machine_eof_trans[] = {
-       0, 22, 22, 22, 22, 22, 22, 22
-       22, 22, 22, 22, 22, 22, 22, 22
-       22, 22, 22, 22, 22, 22, 22, 22
-       46, 46, 46, 46, 46, 46, 46, 46
-       46, 46, 46, 46, 46, 46, 46, 46
-       46, 46, 46, 46, 46, 46, 46, 22
-       22, 46, 58, 58
+       0, 23, 23, 23, 23, 23, 23, 23
+       23, 23, 23, 23, 23, 23, 23, 23
+       23, 23, 23, 23, 23, 23, 23, 23
+       23, 23, 49, 49, 49, 49, 49, 49
+       49, 49, 49, 49, 49, 49, 49, 49
+       49, 49, 49, 49, 49, 49, 49, 49
+       49, 49, 49, 23, 23, 49, 62, 62
 };
 
 static const int myanmar_syllable_machine_start = 0;
@@ -293,18 +355,18 @@ static const int myanmar_syllable_machine_error = -1;
 static const int myanmar_syllable_machine_en_main = 0;
 
 
-#line 36 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 44 "hb-ot-shape-complex-myanmar-machine.rl"
 
 
 
-#line 94 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 102 "hb-ot-shape-complex-myanmar-machine.rl"
 
 
 #define found_syllable(syllable_type) \
   HB_STMT_START { \
     if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \
     for (unsigned int i = ts; i < te; i++) \
-      info[i].syllable() = (syllable_serial << 4) | myanmar_##syllable_type; \
+      info[i].syllable() = (syllable_serial << 4) | syllable_type; \
     syllable_serial++; \
     if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
   } HB_STMT_END
@@ -316,7 +378,7 @@ find_syllables_myanmar (hb_buffer_t *buffer)
   int cs;
   hb_glyph_info_t *info = buffer->info;
   
-#line 320 "hb-ot-shape-complex-myanmar-machine.hh"
+#line 382 "hb-ot-shape-complex-myanmar-machine.hh"
        {
        cs = myanmar_syllable_machine_start;
        ts = 0;
@@ -324,7 +386,7 @@ find_syllables_myanmar (hb_buffer_t *buffer)
        act = 0;
        }
 
-#line 114 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 122 "hb-ot-shape-complex-myanmar-machine.rl"
 
 
   p = 0;
@@ -332,7 +394,7 @@ find_syllables_myanmar (hb_buffer_t *buffer)
 
   unsigned int syllable_serial = 1;
   
-#line 336 "hb-ot-shape-complex-myanmar-machine.hh"
+#line 398 "hb-ot-shape-complex-myanmar-machine.hh"
        {
        int _slen;
        int _trans;
@@ -346,7 +408,7 @@ _resume:
 #line 1 "NONE"
        {ts = p;}
        break;
-#line 350 "hb-ot-shape-complex-myanmar-machine.hh"
+#line 412 "hb-ot-shape-complex-myanmar-machine.hh"
        }
 
        _keys = _myanmar_syllable_machine_trans_keys + (cs<<1);
@@ -365,38 +427,38 @@ _eof_trans:
 
        switch ( _myanmar_syllable_machine_trans_actions[_trans] ) {
        case 6:
-#line 86 "hb-ot-shape-complex-myanmar-machine.rl"
-       {te = p+1;{ found_syllable (consonant_syllable); }}
+#line 94 "hb-ot-shape-complex-myanmar-machine.rl"
+       {te = p+1;{ found_syllable (myanmar_consonant_syllable); }}
        break;
        case 4:
-#line 87 "hb-ot-shape-complex-myanmar-machine.rl"
-       {te = p+1;{ found_syllable (non_myanmar_cluster); }}
+#line 95 "hb-ot-shape-complex-myanmar-machine.rl"
+       {te = p+1;{ found_syllable (myanmar_non_myanmar_cluster); }}
        break;
        case 10:
-#line 88 "hb-ot-shape-complex-myanmar-machine.rl"
-       {te = p+1;{ found_syllable (punctuation_cluster); }}
+#line 96 "hb-ot-shape-complex-myanmar-machine.rl"
+       {te = p+1;{ found_syllable (myanmar_punctuation_cluster); }}
        break;
        case 8:
-#line 89 "hb-ot-shape-complex-myanmar-machine.rl"
-       {te = p+1;{ found_syllable (broken_cluster); }}
+#line 97 "hb-ot-shape-complex-myanmar-machine.rl"
+       {te = p+1;{ found_syllable (myanmar_broken_cluster); }}
        break;
        case 3:
-#line 90 "hb-ot-shape-complex-myanmar-machine.rl"
-       {te = p+1;{ found_syllable (non_myanmar_cluster); }}
+#line 98 "hb-ot-shape-complex-myanmar-machine.rl"
+       {te = p+1;{ found_syllable (myanmar_non_myanmar_cluster); }}
        break;
        case 5:
-#line 86 "hb-ot-shape-complex-myanmar-machine.rl"
-       {te = p;p--;{ found_syllable (consonant_syllable); }}
+#line 94 "hb-ot-shape-complex-myanmar-machine.rl"
+       {te = p;p--;{ found_syllable (myanmar_consonant_syllable); }}
        break;
        case 7:
-#line 89 "hb-ot-shape-complex-myanmar-machine.rl"
-       {te = p;p--;{ found_syllable (broken_cluster); }}
+#line 97 "hb-ot-shape-complex-myanmar-machine.rl"
+       {te = p;p--;{ found_syllable (myanmar_broken_cluster); }}
        break;
        case 9:
-#line 90 "hb-ot-shape-complex-myanmar-machine.rl"
-       {te = p;p--;{ found_syllable (non_myanmar_cluster); }}
+#line 98 "hb-ot-shape-complex-myanmar-machine.rl"
+       {te = p;p--;{ found_syllable (myanmar_non_myanmar_cluster); }}
        break;
-#line 400 "hb-ot-shape-complex-myanmar-machine.hh"
+#line 462 "hb-ot-shape-complex-myanmar-machine.hh"
        }
 
 _again:
@@ -405,7 +467,7 @@ _again:
 #line 1 "NONE"
        {ts = 0;}
        break;
-#line 409 "hb-ot-shape-complex-myanmar-machine.hh"
+#line 471 "hb-ot-shape-complex-myanmar-machine.hh"
        }
 
        if ( ++p != pe )
@@ -421,7 +483,7 @@ _again:
 
        }
 
-#line 122 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 130 "hb-ot-shape-complex-myanmar-machine.rl"
 
 }
 
index 098a63e..2e6ac78 100644 (file)
 
 #include "hb.hh"
 
+enum myanmar_syllable_type_t {
+  myanmar_consonant_syllable,
+  myanmar_punctuation_cluster,
+  myanmar_broken_cluster,
+  myanmar_non_myanmar_cluster,
+};
+
 %%{
   machine myanmar_syllable_machine;
   alphtype unsigned char;
+  write exports;
   write data;
 }%%
 
 %%{
 
-# Same order as enum myanmar_category_t.  Not sure how to avoid duplication.
-A    = 10;
-As   = 18;
-C    = 1;
-D    = 32;
-D0   = 20;
-DB   = 3;
-GB   = 11;
-H    = 4;
-IV   = 2;
-MH   = 21;
-MR   = 22;
-MW   = 23;
-MY   = 24;
-PT   = 25;
-V    = 8;
-VAbv = 26;
-VBlw = 27;
-VPre = 28;
-VPst = 29;
-VS   = 30;
-ZWJ  = 6;
-ZWNJ = 5;
-Ra   = 16;
-P    = 31;
-CS   = 19;
+export A    = 10;
+export As   = 18;
+export C    = 1;
+export D    = 32;
+export D0   = 20;
+export DB   = 3;
+export GB   = 11;
+export H    = 4;
+export IV   = 2;
+export MH   = 21;
+export ML   = 33;
+export MR   = 22;
+export MW   = 23;
+export MY   = 24;
+export PT   = 25;
+export V    = 8;
+export VAbv = 26;
+export VBlw = 27;
+export VPre = 28;
+export VPst = 29;
+export VS   = 30;
+export ZWJ  = 6;
+export ZWNJ = 5;
+export Ra   = 16;
+export P    = 31;
+export CS   = 19;
 
 j = ZWJ|ZWNJ;                  # Joiners
 k = (Ra As H);                 # Kinzi
 
 c = C|Ra;                      # is_consonant
 
-medial_group = MY? As? MR? ((MW MH? | MH) As?)?;
+medial_group = MY? As? MR? ((MW MH? ML? | MH ML? | ML) As?)?;
 main_vowel_group = (VPre.VS?)* VAbv* VBlw* A* (DB As?)?;
-post_vowel_group = VPst MH? As* VAbv* A* (DB As?)?;
+post_vowel_group = VPst MH? ML? As* VAbv* A* (DB As?)?;
 pwo_tone_group = PT A* DB? As?;
 
 complex_syllable_tail = As* medial_group main_vowel_group post_vowel_group* pwo_tone_group* V* j?;
@@ -83,11 +91,11 @@ broken_cluster =    k? VS? syllable_tail;
 other =                        any;
 
 main := |*
-       consonant_syllable      => { found_syllable (consonant_syllable); };
-       j                       => { found_syllable (non_myanmar_cluster); };
-       punctuation_cluster     => { found_syllable (punctuation_cluster); };
-       broken_cluster          => { found_syllable (broken_cluster); };
-       other                   => { found_syllable (non_myanmar_cluster); };
+       consonant_syllable      => { found_syllable (myanmar_consonant_syllable); };
+       j                       => { found_syllable (myanmar_non_myanmar_cluster); };
+       punctuation_cluster     => { found_syllable (myanmar_punctuation_cluster); };
+       broken_cluster          => { found_syllable (myanmar_broken_cluster); };
+       other                   => { found_syllable (myanmar_non_myanmar_cluster); };
 *|;
 
 
@@ -97,7 +105,7 @@ main := |*
   HB_STMT_START { \
     if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \
     for (unsigned int i = ts; i < te; i++) \
-      info[i].syllable() = (syllable_serial << 4) | myanmar_##syllable_type; \
+      info[i].syllable() = (syllable_serial << 4) | syllable_type; \
     syllable_serial++; \
     if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
   } HB_STMT_END
index fc3490d..e6ae75e 100644 (file)
@@ -29,6 +29,7 @@
 #ifndef HB_NO_OT_SHAPE
 
 #include "hb-ot-shape-complex-myanmar.hh"
+#include "hb-ot-shape-complex-myanmar-machine.hh"
 
 
 /*
@@ -40,7 +41,8 @@ myanmar_basic_features[] =
 {
   /*
    * Basic features.
-   * These features are applied in order, one at a time, after reordering.
+   * These features are applied in order, one at a time, after reordering,
+   * constrained to the syllable.
    */
   HB_TAG('r','p','h','f'),
   HB_TAG('p','r','e','f'),
@@ -98,23 +100,6 @@ collect_features_myanmar (hb_ot_shape_planner_t *plan)
 }
 
 static void
-override_features_myanmar (hb_ot_shape_planner_t *plan)
-{
-  plan->map.disable_feature (HB_TAG('l','i','g','a'));
-}
-
-
-enum myanmar_syllable_type_t {
-  myanmar_consonant_syllable,
-  myanmar_punctuation_cluster,
-  myanmar_broken_cluster,
-  myanmar_non_myanmar_cluster,
-};
-
-#include "hb-ot-shape-complex-myanmar-machine.hh"
-
-
-static void
 setup_masks_myanmar (const hb_ot_shape_plan_t *plan HB_UNUSED,
                     hb_buffer_t              *buffer,
                     hb_font_t                *font HB_UNUSED)
@@ -200,7 +185,7 @@ initial_reordering_consonant_syllable (hb_buffer_t *buffer,
       info[i].myanmar_position() = POS_BASE_C;
       i++;
     }
-    indic_position_t pos = POS_AFTER_MAIN;
+    myanmar_position_t pos = POS_AFTER_MAIN;
     /* The following loop may be ugly, but it implements all of
      * Myanmar reordering! */
     for (; i < end; i++)
@@ -271,72 +256,21 @@ reorder_syllable_myanmar (const hb_ot_shape_plan_t *plan HB_UNUSED,
   }
 }
 
-static inline void
-insert_dotted_circles_myanmar (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;
-  unsigned int count = buffer->len;
-  hb_glyph_info_t *info = buffer->info;
-  for (unsigned int i = 0; i < count; i++)
-    if ((info[i].syllable() & 0x0F) == myanmar_broken_cluster)
-    {
-      has_broken_syllables = true;
-      break;
-    }
-  if (likely (!has_broken_syllables))
-    return;
-
-
-  hb_codepoint_t dottedcircle_glyph;
-  if (!font->get_nominal_glyph (0x25CCu, &dottedcircle_glyph))
-    return;
-
-  hb_glyph_info_t dottedcircle = {0};
-  dottedcircle.codepoint = 0x25CCu;
-  set_myanmar_properties (dottedcircle);
-  dottedcircle.codepoint = dottedcircle_glyph;
-
-  buffer->clear_output ();
-
-  buffer->idx = 0;
-  unsigned int last_syllable = 0;
-  while (buffer->idx < buffer->len && buffer->successful)
-  {
-    unsigned int syllable = buffer->cur().syllable();
-    myanmar_syllable_type_t syllable_type = (myanmar_syllable_type_t) (syllable & 0x0F);
-    if (unlikely (last_syllable != syllable && syllable_type == myanmar_broken_cluster))
-    {
-      last_syllable = syllable;
-
-      hb_glyph_info_t ginfo = dottedcircle;
-      ginfo.cluster = buffer->cur().cluster;
-      ginfo.mask = buffer->cur().mask;
-      ginfo.syllable() = buffer->cur().syllable();
-
-      buffer->output_info (ginfo);
-    }
-    else
-      buffer->next_glyph ();
-  }
-  buffer->swap_buffers ();
-}
-
 static void
 reorder_myanmar (const hb_ot_shape_plan_t *plan,
                 hb_font_t *font,
                 hb_buffer_t *buffer)
 {
-  insert_dotted_circles_myanmar (plan, font, buffer);
+  if (buffer->message (font, "start reordering myanmar"))
+  {
+    hb_syllabic_insert_dotted_circles (font, buffer,
+                                      myanmar_broken_cluster,
+                                      OT_GB);
 
-  foreach_syllable (buffer, start, end)
-    reorder_syllable_myanmar (plan, font->face, buffer, start, end);
+    foreach_syllable (buffer, start, end)
+      reorder_syllable_myanmar (plan, font->face, buffer, start, end);
+    (void) buffer->message (font, "end reordering myanmar");
+  }
 
   HB_BUFFER_DEALLOCATE_VAR (buffer, myanmar_category);
   HB_BUFFER_DEALLOCATE_VAR (buffer, myanmar_position);
@@ -346,7 +280,7 @@ reorder_myanmar (const hb_ot_shape_plan_t *plan,
 const hb_ot_complex_shaper_t _hb_ot_complex_shaper_myanmar =
 {
   collect_features_myanmar,
-  override_features_myanmar,
+  nullptr, /* override_features */
   nullptr, /* data_create */
   nullptr, /* data_destroy */
   nullptr, /* preprocess_text */
index 7b9821e..7fbca38 100644 (file)
@@ -56,16 +56,18 @@ enum myanmar_category_t {
   OT_VS   = 30, /* Variation selectors */
   OT_P    = 31, /* Punctuation */
   OT_D    = 32, /* Digits except zero */
+  OT_ML   = 33, /* Various consonant medial types */
 };
 
+using myanmar_position_t = indic_position_t;
 
 static inline void
 set_myanmar_properties (hb_glyph_info_t &info)
 {
   hb_codepoint_t u = info.codepoint;
   unsigned int type = hb_indic_get_categories (u);
-  unsigned int cat = type & 0x7Fu;
-  indic_position_t pos = (indic_position_t) (type >> 8);
+  unsigned int cat = type & 0xFFu;
+  myanmar_position_t pos = (myanmar_position_t) (type >> 8);
 
   /* Myanmar
    * https://docs.microsoft.com/en-us/typography/script-development/myanmar#analyze
@@ -114,10 +116,14 @@ set_myanmar_properties (hb_glyph_info_t &info)
       cat = OT_D; /* XXX The spec says D0, but Uniscribe doesn't seem to do. */
       break;
 
-    case 0x103Eu: case 0x1060u:
+    case 0x103Eu:
       cat = OT_MH;
       break;
 
+    case 0x1060u:
+      cat = OT_ML;
+      break;
+
     case 0x103Cu:
       cat = OT_MR;
       break;
diff --git a/src/hb-ot-shape-complex-syllabic.cc b/src/hb-ot-shape-complex-syllabic.cc
new file mode 100644 (file)
index 0000000..76092c7
--- /dev/null
@@ -0,0 +1,103 @@
+/*
+ * Copyright © 2021  Behdad Esfahbod.
+ *
+ *  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.
+ */
+
+#include "hb.hh"
+
+#ifndef HB_NO_OT_SHAPE
+
+#include "hb-ot-shape-complex-syllabic.hh"
+
+
+void
+hb_syllabic_insert_dotted_circles (hb_font_t *font,
+                                  hb_buffer_t *buffer,
+                                  unsigned int broken_syllable_type,
+                                  unsigned int dottedcircle_category,
+                                  int repha_category,
+                                  int dottedcircle_position)
+{
+  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;
+  unsigned int count = buffer->len;
+  hb_glyph_info_t *info = buffer->info;
+  for (unsigned int i = 0; i < count; i++)
+    if ((info[i].syllable() & 0x0F) == broken_syllable_type)
+    {
+      has_broken_syllables = true;
+      break;
+    }
+  if (likely (!has_broken_syllables))
+    return;
+
+
+  hb_codepoint_t dottedcircle_glyph;
+  if (!font->get_nominal_glyph (0x25CCu, &dottedcircle_glyph))
+    return;
+
+  hb_glyph_info_t dottedcircle = {0};
+  dottedcircle.codepoint = 0x25CCu;
+  dottedcircle.complex_var_u8_category() = dottedcircle_category;
+  if (dottedcircle_position != -1)
+    dottedcircle.complex_var_u8_auxiliary() = dottedcircle_position;
+  dottedcircle.codepoint = dottedcircle_glyph;
+
+  buffer->clear_output ();
+
+  buffer->idx = 0;
+  unsigned int last_syllable = 0;
+  while (buffer->idx < buffer->len && buffer->successful)
+  {
+    unsigned int syllable = buffer->cur().syllable();
+    if (unlikely (last_syllable != syllable && (syllable & 0x0F) == broken_syllable_type))
+    {
+      last_syllable = syllable;
+
+      hb_glyph_info_t ginfo = dottedcircle;
+      ginfo.cluster = buffer->cur().cluster;
+      ginfo.mask = buffer->cur().mask;
+      ginfo.syllable() = buffer->cur().syllable();
+
+      /* Insert dottedcircle after possible Repha. */
+      if (repha_category != -1)
+      {
+       while (buffer->idx < buffer->len && buffer->successful &&
+              last_syllable == buffer->cur().syllable() &&
+              buffer->cur().complex_var_u8_category() == (unsigned) repha_category)
+         (void) buffer->next_glyph ();
+      }
+
+      (void) buffer->output_info (ginfo);
+    }
+    else
+      (void) buffer->next_glyph ();
+  }
+  buffer->sync ();
+}
+
+
+#endif
diff --git a/src/hb-ot-shape-complex-syllabic.hh b/src/hb-ot-shape-complex-syllabic.hh
new file mode 100644 (file)
index 0000000..b901a66
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ * Copyright © 2021  Behdad Esfahbod.
+ *
+ *  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.
+ */
+
+#ifndef HB_OT_SHAPE_COMPLEX_SYLLABIC_HH
+#define HB_OT_SHAPE_COMPLEX_SYLLABIC_HH
+
+#include "hb.hh"
+
+#include "hb-ot-shape-complex.hh"
+
+
+HB_INTERNAL void
+hb_syllabic_insert_dotted_circles (hb_font_t *font,
+                                  hb_buffer_t *buffer,
+                                  unsigned int broken_syllable_type,
+                                  unsigned int dottedcircle_category,
+                                  int repha_category = -1,
+                                  int dottedcircle_position = -1);
+
+
+#endif /* HB_OT_SHAPE_COMPLEX_SYLLABIC_HH */
index 347ea2e..a1e27a8 100644 (file)
@@ -323,20 +323,19 @@ preprocess_text_thai (const hb_ot_shape_plan_t *plan,
 
   buffer->clear_output ();
   unsigned int count = buffer->len;
-  for (buffer->idx = 0; buffer->idx < count && buffer->successful;)
+  for (buffer->idx = 0; buffer->idx < count /* No need for: && buffer->successful */;)
   {
     hb_codepoint_t u = buffer->cur().codepoint;
-    if (likely (!IS_SARA_AM (u))) {
-      buffer->next_glyph ();
+    if (likely (!IS_SARA_AM (u)))
+    {
+      if (unlikely (!buffer->next_glyph ())) break;
       continue;
     }
 
     /* Is SARA AM. Decompose and reorder. */
-    hb_glyph_info_t &nikhahit = buffer->output_glyph (NIKHAHIT_FROM_SARA_AM (u));
-    _hb_glyph_info_set_continuation (&nikhahit);
-    buffer->replace_glyph (SARA_AA_FROM_SARA_AM (u));
-    if (unlikely (!buffer->successful))
-      return;
+    (void) buffer->output_glyph (NIKHAHIT_FROM_SARA_AM (u));
+    _hb_glyph_info_set_continuation (&buffer->prev());
+    if (unlikely (!buffer->replace_glyph (SARA_AA_FROM_SARA_AM (u)))) break;
 
     /* Make Nikhahit be recognized as a ccc=0 mark when zeroing widths. */
     unsigned int end = buffer->out_len;
@@ -365,7 +364,7 @@ preprocess_text_thai (const hb_ot_shape_plan_t *plan,
        buffer->merge_out_clusters (start - 1, end);
     }
   }
-  buffer->swap_buffers ();
+  buffer->sync ();
 
   /* If font has Thai GSUB, we are done. */
   if (plan->props.script == HB_SCRIPT_THAI && !plan->map.found_script[0])
index 462342c..c3920b2 100644 (file)
 
 #include "hb.hh"
 
+#include "hb-ot-shape-complex-syllabic.hh"
+
+/* buffer var allocations */
+#define use_category() complex_var_u8_category()
+
+#define USE(Cat) use_syllable_machine_ex_##Cat
+
+enum use_syllable_type_t {
+  use_virama_terminated_cluster,
+  use_sakot_terminated_cluster,
+  use_standard_cluster,
+  use_number_joiner_terminated_cluster,
+  use_numeral_cluster,
+  use_symbol_cluster,
+  use_hieroglyph_cluster,
+  use_broken_cluster,
+  use_non_cluster,
+};
+
 
-#line 38 "hb-ot-shape-complex-use-machine.hh"
+#line 57 "hb-ot-shape-complex-use-machine.hh"
+#define use_syllable_machine_ex_B 1u
+#define use_syllable_machine_ex_CGJ 6u
+#define use_syllable_machine_ex_CMAbv 31u
+#define use_syllable_machine_ex_CMBlw 32u
+#define use_syllable_machine_ex_CS 43u
+#define use_syllable_machine_ex_FAbv 24u
+#define use_syllable_machine_ex_FBlw 25u
+#define use_syllable_machine_ex_FMAbv 45u
+#define use_syllable_machine_ex_FMBlw 46u
+#define use_syllable_machine_ex_FMPst 47u
+#define use_syllable_machine_ex_FPst 26u
+#define use_syllable_machine_ex_G 49u
+#define use_syllable_machine_ex_GB 5u
+#define use_syllable_machine_ex_H 12u
+#define use_syllable_machine_ex_HN 13u
+#define use_syllable_machine_ex_HVM 44u
+#define use_syllable_machine_ex_J 50u
+#define use_syllable_machine_ex_MAbv 27u
+#define use_syllable_machine_ex_MBlw 28u
+#define use_syllable_machine_ex_MPre 30u
+#define use_syllable_machine_ex_MPst 29u
+#define use_syllable_machine_ex_N 4u
+#define use_syllable_machine_ex_O 0u
+#define use_syllable_machine_ex_R 18u
+#define use_syllable_machine_ex_SB 51u
+#define use_syllable_machine_ex_SE 52u
+#define use_syllable_machine_ex_SMAbv 41u
+#define use_syllable_machine_ex_SMBlw 42u
+#define use_syllable_machine_ex_SUB 11u
+#define use_syllable_machine_ex_Sk 48u
+#define use_syllable_machine_ex_VAbv 33u
+#define use_syllable_machine_ex_VBlw 34u
+#define use_syllable_machine_ex_VMAbv 37u
+#define use_syllable_machine_ex_VMBlw 38u
+#define use_syllable_machine_ex_VMPre 23u
+#define use_syllable_machine_ex_VMPst 39u
+#define use_syllable_machine_ex_VPre 22u
+#define use_syllable_machine_ex_VPst 35u
+#define use_syllable_machine_ex_ZWNJ 14u
+
+
+#line 99 "hb-ot-shape-complex-use-machine.hh"
 static const unsigned char _use_syllable_machine_trans_keys[] = {
-       12u, 48u, 1u, 15u, 1u, 1u, 12u, 48u, 1u, 1u, 0u, 48u, 21u, 21u, 11u, 48u, 
-       11u, 48u, 1u, 15u, 1u, 1u, 11u, 48u, 22u, 48u, 23u, 48u, 24u, 47u, 25u, 47u, 
-       26u, 47u, 45u, 46u, 46u, 46u, 24u, 48u, 24u, 48u, 24u, 48u, 1u, 1u, 24u, 48u, 
-       23u, 48u, 23u, 48u, 23u, 48u, 22u, 48u, 22u, 48u, 22u, 48u, 22u, 48u, 11u, 48u, 
-       1u, 48u, 11u, 48u, 13u, 21u, 4u, 4u, 13u, 13u, 11u, 48u, 11u, 48u, 41u, 42u, 
-       42u, 42u, 11u, 48u, 11u, 48u, 22u, 48u, 23u, 48u, 24u, 47u, 25u, 47u, 26u, 47u, 
-       45u, 46u, 46u, 46u, 24u, 48u, 24u, 48u, 24u, 48u, 24u, 48u, 23u, 48u, 23u, 48u, 
-       23u, 48u, 22u, 48u, 22u, 48u, 22u, 48u, 22u, 48u, 11u, 48u, 1u, 48u, 1u, 15u, 
-       4u, 4u, 13u, 21u, 13u, 13u, 12u, 48u, 1u, 48u, 11u, 48u, 41u, 42u, 42u, 42u, 
-       21u, 42u, 1u, 5u, 0
+       0u, 51u, 41u, 42u, 42u, 42u, 11u, 48u, 11u, 48u, 1u, 1u, 22u, 48u, 23u, 48u, 
+       24u, 47u, 25u, 47u, 26u, 47u, 45u, 46u, 46u, 46u, 24u, 48u, 24u, 48u, 24u, 48u, 
+       1u, 1u, 24u, 48u, 23u, 48u, 23u, 48u, 23u, 48u, 22u, 48u, 22u, 48u, 22u, 48u, 
+       11u, 48u, 1u, 48u, 13u, 13u, 4u, 4u, 11u, 48u, 11u, 48u, 1u, 1u, 22u, 48u, 
+       23u, 48u, 24u, 47u, 25u, 47u, 26u, 47u, 45u, 46u, 46u, 46u, 24u, 48u, 24u, 48u, 
+       24u, 48u, 1u, 1u, 24u, 48u, 23u, 48u, 23u, 48u, 23u, 48u, 22u, 48u, 22u, 48u, 
+       22u, 48u, 11u, 48u, 1u, 48u, 4u, 4u, 13u, 13u, 1u, 48u, 11u, 48u, 41u, 42u, 
+       42u, 42u, 1u, 5u, 50u, 52u, 49u, 52u, 49u, 51u, 0
 };
 
 static const char _use_syllable_machine_key_spans[] = {
-       37, 15, 1, 37, 1, 49, 1, 38, 
-       38, 15, 1, 38, 27, 26, 24, 23, 
-       22, 2, 1, 25, 25, 25, 1, 25, 
-       26, 26, 26, 27, 27, 27, 27, 38, 
-       48, 38, 9, 1, 1, 38, 38, 2, 
-       1, 38, 38, 27, 26, 24, 23, 22, 
-       2, 1, 25, 25, 25, 25, 26, 26, 
-       26, 27, 27, 27, 27, 38, 48, 15, 
-       1, 9, 1, 37, 48, 38, 2, 1, 
-       22, 5
+       52, 2, 1, 38, 38, 1, 27, 26, 
+       24, 23, 22, 2, 1, 25, 25, 25, 
+       1, 25, 26, 26, 26, 27, 27, 27, 
+       38, 48, 1, 1, 38, 38, 1, 27, 
+       26, 24, 23, 22, 2, 1, 25, 25, 
+       25, 1, 25, 26, 26, 26, 27, 27, 
+       27, 38, 48, 1, 1, 48, 38, 2, 
+       1, 5, 3, 4, 3
 };
 
 static const short _use_syllable_machine_index_offsets[] = {
-       0, 38, 54, 56, 94, 96, 146, 148, 
-       187, 226, 242, 244, 283, 311, 338, 363, 
-       387, 410, 413, 415, 441, 467, 493, 495, 
-       521, 548, 575, 602, 630, 658, 686, 714, 
-       753, 802, 841, 851, 853, 855, 894, 933, 
-       936, 938, 977, 1016, 1044, 1071, 1096, 1120, 
-       1143, 1146, 1148, 1174, 1200, 1226, 1252, 1279, 
-       1306, 1333, 1361, 1389, 1417, 1445, 1484, 1533, 
-       1549, 1551, 1561, 1563, 1601, 1650, 1689, 1692, 
-       1694, 1717
+       0, 53, 56, 58, 97, 136, 138, 166, 
+       193, 218, 242, 265, 268, 270, 296, 322, 
+       348, 350, 376, 403, 430, 457, 485, 513, 
+       541, 580, 629, 631, 633, 672, 711, 713, 
+       741, 768, 793, 817, 840, 843, 845, 871, 
+       897, 923, 925, 951, 978, 1005, 1032, 1060, 
+       1088, 1116, 1155, 1204, 1206, 1208, 1257, 1296, 
+       1299, 1301, 1307, 1311, 1316
 };
 
 static const char _use_syllable_machine_indicies[] = {
-       1, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0, 0, 0, 0, 
-       1, 0, 0, 0, 1, 0, 3, 2, 
-       2, 2, 2, 2, 2, 2, 2, 2, 
-       2, 2, 2, 2, 4, 2, 3, 2, 
-       6, 5, 5, 5, 5, 5, 5, 5, 
-       5, 5, 5, 5, 5, 5, 5, 5, 
-       5, 5, 5, 5, 5, 5, 5, 5, 
-       5, 5, 5, 5, 5, 5, 5, 5, 
-       6, 5, 5, 5, 6, 5, 7, 5, 
-       8, 9, 10, 8, 11, 12, 10, 10, 
-       10, 10, 10, 3, 13, 14, 10, 15, 
-       8, 8, 16, 17, 10, 10, 18, 19, 
-       20, 21, 22, 23, 24, 18, 25, 26, 
-       27, 28, 29, 30, 10, 31, 32, 33, 
-       10, 34, 35, 36, 37, 38, 39, 40, 
-       13, 10, 42, 41, 44, 1, 43, 43, 
-       45, 43, 43, 43, 43, 43, 46, 47, 
-       48, 49, 50, 51, 52, 53, 47, 54, 
-       46, 55, 56, 57, 58, 43, 59, 60, 
-       61, 43, 43, 43, 43, 62, 63, 64, 
-       65, 1, 43, 44, 1, 43, 43, 45, 
-       43, 43, 43, 43, 43, 66, 47, 48, 
-       49, 50, 51, 52, 53, 47, 54, 55, 
-       55, 56, 57, 58, 43, 59, 60, 61, 
-       43, 43, 43, 43, 62, 63, 64, 65, 
-       1, 43, 44, 67, 67, 67, 67, 67, 
-       67, 67, 67, 67, 67, 67, 67, 67, 
-       68, 67, 44, 67, 44, 1, 43, 43, 
-       45, 43, 43, 43, 43, 43, 43, 47, 
-       48, 49, 50, 51, 52, 53, 47, 54, 
-       55, 55, 56, 57, 58, 43, 59, 60, 
-       61, 43, 43, 43, 43, 62, 63, 64, 
-       65, 1, 43, 47, 48, 49, 50, 51, 
-       43, 43, 43, 43, 43, 43, 56, 57, 
-       58, 43, 59, 60, 61, 43, 43, 43, 
-       43, 48, 63, 64, 65, 69, 43, 48, 
-       49, 50, 51, 43, 43, 43, 43, 43, 
-       43, 43, 43, 43, 43, 59, 60, 61, 
-       43, 43, 43, 43, 43, 63, 64, 65, 
-       69, 43, 49, 50, 51, 43, 43, 43, 
-       43, 43, 43, 43, 43, 43, 43, 43, 
-       43, 43, 43, 43, 43, 43, 43, 63, 
-       64, 65, 43, 50, 51, 43, 43, 43, 
-       43, 43, 43, 43, 43, 43, 43, 43, 
-       43, 43, 43, 43, 43, 43, 43, 63, 
-       64, 65, 43, 51, 43, 43, 43, 43, 
-       43, 43, 43, 43, 43, 43, 43, 43, 
-       43, 43, 43, 43, 43, 43, 63, 64, 
-       65, 43, 63, 64, 43, 64, 43, 49, 
-       50, 51, 43, 43, 43, 43, 43, 43, 
-       43, 43, 43, 43, 59, 60, 61, 43, 
-       43, 43, 43, 43, 63, 64, 65, 69, 
-       43, 49, 50, 51, 43, 43, 43, 43, 
-       43, 43, 43, 43, 43, 43, 43, 60, 
-       61, 43, 43, 43, 43, 43, 63, 64, 
-       65, 69, 43, 49, 50, 51, 43, 43, 
-       43, 43, 43, 43, 43, 43, 43, 43, 
-       43, 43, 61, 43, 43, 43, 43, 43, 
-       63, 64, 65, 69, 43, 71, 70, 49, 
-       50, 51, 43, 43, 43, 43, 43, 43, 
-       43, 43, 43, 43, 43, 43, 43, 43, 
-       43, 43, 43, 43, 63, 64, 65, 69, 
-       43, 48, 49, 50, 51, 43, 43, 43, 
-       43, 43, 43, 56, 57, 58, 43, 59, 
-       60, 61, 43, 43, 43, 43, 48, 63, 
-       64, 65, 69, 43, 48, 49, 50, 51, 
-       43, 43, 43, 43, 43, 43, 43, 57, 
-       58, 43, 59, 60, 61, 43, 43, 43, 
-       43, 48, 63, 64, 65, 69, 43, 48, 
-       49, 50, 51, 43, 43, 43, 43, 43, 
-       43, 43, 43, 58, 43, 59, 60, 61, 
-       43, 43, 43, 43, 48, 63, 64, 65, 
-       69, 43, 47, 48, 49, 50, 51, 43, 
-       53, 47, 43, 43, 43, 56, 57, 58, 
-       43, 59, 60, 61, 43, 43, 43, 43, 
-       48, 63, 64, 65, 69, 43, 47, 48, 
-       49, 50, 51, 43, 72, 47, 43, 43, 
-       43, 56, 57, 58, 43, 59, 60, 61, 
-       43, 43, 43, 43, 48, 63, 64, 65, 
-       69, 43, 47, 48, 49, 50, 51, 43, 
-       43, 47, 43, 43, 43, 56, 57, 58, 
-       43, 59, 60, 61, 43, 43, 43, 43, 
-       48, 63, 64, 65, 69, 43, 47, 48, 
-       49, 50, 51, 52, 53, 47, 43, 43, 
-       43, 56, 57, 58, 43, 59, 60, 61, 
-       43, 43, 43, 43, 48, 63, 64, 65, 
-       69, 43, 44, 1, 43, 43, 45, 43, 
-       43, 43, 43, 43, 43, 47, 48, 49, 
-       50, 51, 52, 53, 47, 54, 43, 55, 
-       56, 57, 58, 43, 59, 60, 61, 43, 
-       43, 43, 43, 62, 63, 64, 65, 1, 
-       43, 44, 67, 67, 67, 67, 67, 67, 
-       67, 67, 67, 67, 67, 67, 67, 68, 
-       67, 67, 67, 67, 67, 67, 67, 48, 
-       49, 50, 51, 67, 67, 67, 67, 67, 
-       67, 67, 67, 67, 67, 59, 60, 61, 
-       67, 67, 67, 67, 67, 63, 64, 65, 
-       69, 67, 44, 1, 43, 43, 45, 43, 
-       43, 43, 43, 43, 43, 47, 48, 49, 
-       50, 51, 52, 53, 47, 54, 46, 55, 
-       56, 57, 58, 43, 59, 60, 61, 43, 
-       43, 43, 43, 62, 63, 64, 65, 1, 
-       43, 74, 73, 73, 73, 73, 73, 73, 
-       73, 75, 73, 11, 76, 74, 73, 44, 
-       1, 43, 43, 45, 43, 43, 43, 43, 
-       43, 77, 47, 48, 49, 50, 51, 52, 
-       53, 47, 54, 46, 55, 56, 57, 58, 
-       43, 59, 60, 61, 43, 78, 79, 43, 
-       62, 63, 64, 65, 1, 43, 44, 1, 
-       43, 43, 45, 43, 43, 43, 43, 43, 
-       43, 47, 48, 49, 50, 51, 52, 53, 
-       47, 54, 46, 55, 56, 57, 58, 43, 
-       59, 60, 61, 43, 78, 79, 43, 62, 
-       63, 64, 65, 1, 43, 78, 79, 80, 
-       79, 80, 3, 6, 81, 81, 82, 81, 
-       81, 81, 81, 81, 83, 18, 19, 20, 
-       21, 22, 23, 24, 18, 25, 27, 27, 
-       28, 29, 30, 81, 31, 32, 33, 81, 
-       81, 81, 81, 37, 38, 39, 40, 6, 
-       81, 3, 6, 81, 81, 82, 81, 81, 
-       81, 81, 81, 81, 18, 19, 20, 21, 
-       22, 23, 24, 18, 25, 27, 27, 28, 
-       29, 30, 81, 31, 32, 33, 81, 81, 
-       81, 81, 37, 38, 39, 40, 6, 81, 
-       18, 19, 20, 21, 22, 81, 81, 81, 
-       81, 81, 81, 28, 29, 30, 81, 31, 
-       32, 33, 81, 81, 81, 81, 19, 38, 
-       39, 40, 84, 81, 19, 20, 21, 22, 
-       81, 81, 81, 81, 81, 81, 81, 81, 
-       81, 81, 31, 32, 33, 81, 81, 81, 
-       81, 81, 38, 39, 40, 84, 81, 20, 
-       21, 22, 81, 81, 81, 81, 81, 81, 
-       81, 81, 81, 81, 81, 81, 81, 81, 
-       81, 81, 81, 81, 38, 39, 40, 81, 
-       21, 22, 81, 81, 81, 81, 81, 81, 
-       81, 81, 81, 81, 81, 81, 81, 81, 
-       81, 81, 81, 81, 38, 39, 40, 81, 
-       22, 81, 81, 81, 81, 81, 81, 81, 
-       81, 81, 81, 81, 81, 81, 81, 81, 
-       81, 81, 81, 38, 39, 40, 81, 38, 
-       39, 81, 39, 81, 20, 21, 22, 81, 
-       81, 81, 81, 81, 81, 81, 81, 81, 
-       81, 31, 32, 33, 81, 81, 81, 81, 
-       81, 38, 39, 40, 84, 81, 20, 21, 
-       22, 81, 81, 81, 81, 81, 81, 81, 
-       81, 81, 81, 81, 32, 33, 81, 81, 
-       81, 81, 81, 38, 39, 40, 84, 81, 
-       20, 21, 22, 81, 81, 81, 81, 81, 
-       81, 81, 81, 81, 81, 81, 81, 33, 
-       81, 81, 81, 81, 81, 38, 39, 40, 
-       84, 81, 20, 21, 22, 81, 81, 81, 
-       81, 81, 81, 81, 81, 81, 81, 81, 
-       81, 81, 81, 81, 81, 81, 81, 38, 
-       39, 40, 84, 81, 19, 20, 21, 22, 
-       81, 81, 81, 81, 81, 81, 28, 29, 
-       30, 81, 31, 32, 33, 81, 81, 81, 
-       81, 19, 38, 39, 40, 84, 81, 19, 
-       20, 21, 22, 81, 81, 81, 81, 81, 
-       81, 81, 29, 30, 81, 31, 32, 33, 
-       81, 81, 81, 81, 19, 38, 39, 40, 
-       84, 81, 19, 20, 21, 22, 81, 81, 
-       81, 81, 81, 81, 81, 81, 30, 81, 
-       31, 32, 33, 81, 81, 81, 81, 19, 
-       38, 39, 40, 84, 81, 18, 19, 20, 
-       21, 22, 81, 24, 18, 81, 81, 81, 
-       28, 29, 30, 81, 31, 32, 33, 81, 
-       81, 81, 81, 19, 38, 39, 40, 84, 
-       81, 18, 19, 20, 21, 22, 81, 85, 
-       18, 81, 81, 81, 28, 29, 30, 81, 
-       31, 32, 33, 81, 81, 81, 81, 19, 
-       38, 39, 40, 84, 81, 18, 19, 20, 
-       21, 22, 81, 81, 18, 81, 81, 81, 
-       28, 29, 30, 81, 31, 32, 33, 81, 
-       81, 81, 81, 19, 38, 39, 40, 84, 
-       81, 18, 19, 20, 21, 22, 23, 24, 
-       18, 81, 81, 81, 28, 29, 30, 81, 
-       31, 32, 33, 81, 81, 81, 81, 19, 
-       38, 39, 40, 84, 81, 3, 6, 81, 
-       81, 82, 81, 81, 81, 81, 81, 81, 
-       18, 19, 20, 21, 22, 23, 24, 18, 
-       25, 81, 27, 28, 29, 30, 81, 31, 
-       32, 33, 81, 81, 81, 81, 37, 38, 
-       39, 40, 6, 81, 3, 81, 81, 81, 
-       81, 81, 81, 81, 81, 81, 81, 81, 
-       81, 81, 4, 81, 81, 81, 81, 81, 
-       81, 81, 19, 20, 21, 22, 81, 81, 
-       81, 81, 81, 81, 81, 81, 81, 81, 
-       31, 32, 33, 81, 81, 81, 81, 81, 
-       38, 39, 40, 84, 81, 3, 86, 86, 
-       86, 86, 86, 86, 86, 86, 86, 86, 
-       86, 86, 86, 4, 86, 87, 81, 14, 
-       81, 81, 81, 81, 81, 81, 81, 88, 
-       81, 14, 81, 6, 86, 86, 86, 86, 
-       86, 86, 86, 86, 86, 86, 86, 86, 
-       86, 86, 86, 86, 86, 86, 86, 86, 
-       86, 86, 86, 86, 86, 86, 86, 86, 
-       86, 86, 86, 6, 86, 86, 86, 6, 
-       86, 9, 81, 81, 81, 9, 81, 81, 
-       81, 81, 81, 3, 6, 14, 81, 82, 
-       81, 81, 81, 81, 81, 81, 18, 19, 
-       20, 21, 22, 23, 24, 18, 25, 26, 
-       27, 28, 29, 30, 81, 31, 32, 33, 
-       81, 34, 35, 81, 37, 38, 39, 40, 
-       6, 81, 3, 6, 81, 81, 82, 81, 
-       81, 81, 81, 81, 81, 18, 19, 20, 
-       21, 22, 23, 24, 18, 25, 26, 27, 
-       28, 29, 30, 81, 31, 32, 33, 81, 
-       81, 81, 81, 37, 38, 39, 40, 6, 
-       81, 34, 35, 81, 35, 81, 78, 80, 
-       80, 80, 80, 80, 80, 80, 80, 80, 
-       80, 80, 80, 80, 80, 80, 80, 80, 
-       80, 80, 78, 79, 80, 9, 86, 86, 
-       86, 9, 86, 0
+       0, 1, 2, 2, 3, 4, 2, 2, 
+       2, 2, 2, 5, 6, 7, 2, 2, 
+       2, 2, 8, 2, 2, 2, 9, 10, 
+       11, 12, 13, 14, 15, 9, 16, 17, 
+       18, 19, 20, 21, 2, 22, 23, 24, 
+       2, 25, 26, 27, 28, 29, 30, 31, 
+       6, 32, 2, 33, 2, 0, 35, 34, 
+       35, 34, 37, 38, 36, 36, 36, 36, 
+       36, 36, 36, 36, 36, 39, 40, 41, 
+       42, 43, 44, 45, 39, 46, 1, 47, 
+       48, 49, 50, 36, 51, 52, 53, 36, 
+       36, 36, 36, 54, 55, 56, 57, 38, 
+       36, 37, 38, 36, 36, 36, 36, 36, 
+       36, 36, 36, 36, 39, 40, 41, 42, 
+       43, 44, 45, 39, 46, 47, 47, 48, 
+       49, 50, 36, 51, 52, 53, 36, 36, 
+       36, 36, 54, 55, 56, 57, 38, 36, 
+       37, 58, 39, 40, 41, 42, 43, 36, 
+       36, 36, 36, 36, 36, 48, 49, 50, 
+       36, 51, 52, 53, 36, 36, 36, 36, 
+       40, 55, 56, 57, 59, 36, 40, 41, 
+       42, 43, 36, 36, 36, 36, 36, 36, 
+       36, 36, 36, 36, 51, 52, 53, 36, 
+       36, 36, 36, 36, 55, 56, 57, 59, 
+       36, 41, 42, 43, 36, 36, 36, 36, 
+       36, 36, 36, 36, 36, 36, 36, 36, 
+       36, 36, 36, 36, 36, 36, 55, 56, 
+       57, 36, 42, 43, 36, 36, 36, 36, 
+       36, 36, 36, 36, 36, 36, 36, 36, 
+       36, 36, 36, 36, 36, 36, 55, 56, 
+       57, 36, 43, 36, 36, 36, 36, 36, 
+       36, 36, 36, 36, 36, 36, 36, 36, 
+       36, 36, 36, 36, 36, 55, 56, 57, 
+       36, 55, 56, 36, 56, 36, 41, 42, 
+       43, 36, 36, 36, 36, 36, 36, 36, 
+       36, 36, 36, 51, 52, 53, 36, 36, 
+       36, 36, 36, 55, 56, 57, 59, 36, 
+       41, 42, 43, 36, 36, 36, 36, 36, 
+       36, 36, 36, 36, 36, 36, 52, 53, 
+       36, 36, 36, 36, 36, 55, 56, 57, 
+       59, 36, 41, 42, 43, 36, 36, 36, 
+       36, 36, 36, 36, 36, 36, 36, 36, 
+       36, 53, 36, 36, 36, 36, 36, 55, 
+       56, 57, 59, 36, 61, 60, 41, 42, 
+       43, 36, 36, 36, 36, 36, 36, 36, 
+       36, 36, 36, 36, 36, 36, 36, 36, 
+       36, 36, 36, 55, 56, 57, 59, 36, 
+       40, 41, 42, 43, 36, 36, 36, 36, 
+       36, 36, 48, 49, 50, 36, 51, 52, 
+       53, 36, 36, 36, 36, 40, 55, 56, 
+       57, 59, 36, 40, 41, 42, 43, 36, 
+       36, 36, 36, 36, 36, 36, 49, 50, 
+       36, 51, 52, 53, 36, 36, 36, 36, 
+       40, 55, 56, 57, 59, 36, 40, 41, 
+       42, 43, 36, 36, 36, 36, 36, 36, 
+       36, 36, 50, 36, 51, 52, 53, 36, 
+       36, 36, 36, 40, 55, 56, 57, 59, 
+       36, 39, 40, 41, 42, 43, 36, 45, 
+       39, 36, 36, 36, 48, 49, 50, 36, 
+       51, 52, 53, 36, 36, 36, 36, 40, 
+       55, 56, 57, 59, 36, 39, 40, 41, 
+       42, 43, 36, 36, 39, 36, 36, 36, 
+       48, 49, 50, 36, 51, 52, 53, 36, 
+       36, 36, 36, 40, 55, 56, 57, 59, 
+       36, 39, 40, 41, 42, 43, 44, 45, 
+       39, 36, 36, 36, 48, 49, 50, 36, 
+       51, 52, 53, 36, 36, 36, 36, 40, 
+       55, 56, 57, 59, 36, 37, 38, 36, 
+       36, 36, 36, 36, 36, 36, 36, 36, 
+       39, 40, 41, 42, 43, 44, 45, 39, 
+       46, 36, 47, 48, 49, 50, 36, 51, 
+       52, 53, 36, 36, 36, 36, 54, 55, 
+       56, 57, 38, 36, 37, 58, 58, 58, 
+       58, 58, 58, 58, 58, 58, 58, 58, 
+       58, 58, 58, 58, 58, 58, 58, 58, 
+       58, 58, 40, 41, 42, 43, 58, 58, 
+       58, 58, 58, 58, 58, 58, 58, 58, 
+       51, 52, 53, 58, 58, 58, 58, 58, 
+       55, 56, 57, 59, 58, 63, 62, 3, 
+       64, 37, 38, 36, 36, 36, 36, 36, 
+       36, 36, 36, 36, 39, 40, 41, 42, 
+       43, 44, 45, 39, 46, 1, 47, 48, 
+       49, 50, 36, 51, 52, 53, 36, 0, 
+       35, 36, 54, 55, 56, 57, 38, 36, 
+       5, 6, 65, 65, 65, 65, 65, 65, 
+       65, 65, 65, 9, 10, 11, 12, 13, 
+       14, 15, 9, 16, 18, 18, 19, 20, 
+       21, 65, 22, 23, 24, 65, 65, 65, 
+       65, 28, 29, 30, 31, 6, 65, 5, 
+       65, 9, 10, 11, 12, 13, 65, 65, 
+       65, 65, 65, 65, 19, 20, 21, 65, 
+       22, 23, 24, 65, 65, 65, 65, 10, 
+       29, 30, 31, 66, 65, 10, 11, 12, 
+       13, 65, 65, 65, 65, 65, 65, 65, 
+       65, 65, 65, 22, 23, 24, 65, 65, 
+       65, 65, 65, 29, 30, 31, 66, 65, 
+       11, 12, 13, 65, 65, 65, 65, 65, 
+       65, 65, 65, 65, 65, 65, 65, 65, 
+       65, 65, 65, 65, 65, 29, 30, 31, 
+       65, 12, 13, 65, 65, 65, 65, 65, 
+       65, 65, 65, 65, 65, 65, 65, 65, 
+       65, 65, 65, 65, 65, 29, 30, 31, 
+       65, 13, 65, 65, 65, 65, 65, 65, 
+       65, 65, 65, 65, 65, 65, 65, 65, 
+       65, 65, 65, 65, 29, 30, 31, 65, 
+       29, 30, 65, 30, 65, 11, 12, 13, 
+       65, 65, 65, 65, 65, 65, 65, 65, 
+       65, 65, 22, 23, 24, 65, 65, 65, 
+       65, 65, 29, 30, 31, 66, 65, 11, 
+       12, 13, 65, 65, 65, 65, 65, 65, 
+       65, 65, 65, 65, 65, 23, 24, 65, 
+       65, 65, 65, 65, 29, 30, 31, 66, 
+       65, 11, 12, 13, 65, 65, 65, 65, 
+       65, 65, 65, 65, 65, 65, 65, 65, 
+       24, 65, 65, 65, 65, 65, 29, 30, 
+       31, 66, 65, 67, 65, 11, 12, 13, 
+       65, 65, 65, 65, 65, 65, 65, 65, 
+       65, 65, 65, 65, 65, 65, 65, 65, 
+       65, 65, 29, 30, 31, 66, 65, 10, 
+       11, 12, 13, 65, 65, 65, 65, 65, 
+       65, 19, 20, 21, 65, 22, 23, 24, 
+       65, 65, 65, 65, 10, 29, 30, 31, 
+       66, 65, 10, 11, 12, 13, 65, 65, 
+       65, 65, 65, 65, 65, 20, 21, 65, 
+       22, 23, 24, 65, 65, 65, 65, 10, 
+       29, 30, 31, 66, 65, 10, 11, 12, 
+       13, 65, 65, 65, 65, 65, 65, 65, 
+       65, 21, 65, 22, 23, 24, 65, 65, 
+       65, 65, 10, 29, 30, 31, 66, 65, 
+       9, 10, 11, 12, 13, 65, 15, 9, 
+       65, 65, 65, 19, 20, 21, 65, 22, 
+       23, 24, 65, 65, 65, 65, 10, 29, 
+       30, 31, 66, 65, 9, 10, 11, 12, 
+       13, 65, 65, 9, 65, 65, 65, 19, 
+       20, 21, 65, 22, 23, 24, 65, 65, 
+       65, 65, 10, 29, 30, 31, 66, 65, 
+       9, 10, 11, 12, 13, 14, 15, 9, 
+       65, 65, 65, 19, 20, 21, 65, 22, 
+       23, 24, 65, 65, 65, 65, 10, 29, 
+       30, 31, 66, 65, 5, 6, 65, 65, 
+       65, 65, 65, 65, 65, 65, 65, 9, 
+       10, 11, 12, 13, 14, 15, 9, 16, 
+       65, 18, 19, 20, 21, 65, 22, 23, 
+       24, 65, 65, 65, 65, 28, 29, 30, 
+       31, 6, 65, 5, 65, 65, 65, 65, 
+       65, 65, 65, 65, 65, 65, 65, 65, 
+       65, 65, 65, 65, 65, 65, 65, 65, 
+       65, 10, 11, 12, 13, 65, 65, 65, 
+       65, 65, 65, 65, 65, 65, 65, 22, 
+       23, 24, 65, 65, 65, 65, 65, 29, 
+       30, 31, 66, 65, 68, 65, 7, 65, 
+       1, 65, 65, 65, 1, 65, 65, 65, 
+       65, 65, 5, 6, 7, 65, 65, 65, 
+       65, 65, 65, 65, 65, 9, 10, 11, 
+       12, 13, 14, 15, 9, 16, 17, 18, 
+       19, 20, 21, 65, 22, 23, 24, 65, 
+       25, 26, 65, 28, 29, 30, 31, 6, 
+       65, 5, 6, 65, 65, 65, 65, 65, 
+       65, 65, 65, 65, 9, 10, 11, 12, 
+       13, 14, 15, 9, 16, 17, 18, 19, 
+       20, 21, 65, 22, 23, 24, 65, 65, 
+       65, 65, 28, 29, 30, 31, 6, 65, 
+       25, 26, 65, 26, 65, 1, 69, 69, 
+       69, 1, 69, 71, 70, 32, 70, 32, 
+       71, 70, 71, 70, 32, 70, 33, 70, 
+       0
 };
 
 static const char _use_syllable_machine_trans_targs[] = {
-       5, 9, 5, 41, 2, 5, 1, 53, 
-       6, 7, 5, 34, 37, 63, 64, 67, 
-       68, 72, 43, 44, 45, 46, 47, 57, 
-       58, 60, 69, 61, 54, 55, 56, 50, 
-       51, 52, 70, 71, 73, 62, 48, 49, 
-       5, 5, 5, 5, 8, 0, 33, 12, 
-       13, 14, 15, 16, 27, 28, 30, 31, 
-       24, 25, 26, 19, 20, 21, 32, 17, 
-       18, 5, 11, 5, 10, 22, 5, 23, 
-       29, 5, 35, 36, 5, 38, 39, 40, 
-       5, 5, 3, 42, 4, 59, 5, 65, 
-       66
+       1, 3, 0, 26, 28, 29, 30, 51, 
+       53, 31, 32, 33, 34, 35, 46, 47, 
+       48, 54, 49, 43, 44, 45, 38, 39, 
+       40, 55, 56, 57, 50, 36, 37, 0, 
+       58, 60, 0, 2, 0, 4, 5, 6, 
+       7, 8, 9, 10, 21, 22, 23, 24, 
+       18, 19, 20, 13, 14, 15, 25, 11, 
+       12, 0, 0, 16, 0, 17, 0, 27, 
+       0, 0, 41, 42, 52, 0, 0, 59
 };
 
 static const char _use_syllable_machine_trans_actions[] = {
-       1, 0, 2, 3, 0, 4, 0, 5, 
-       0, 5, 8, 0, 5, 9, 0, 9, 
-       3, 0, 5, 5, 0, 0, 0, 5, 
-       5, 5, 3, 3, 5, 5, 5, 5, 
-       5, 5, 0, 0, 0, 3, 0, 0, 
-       10, 11, 12, 13, 5, 0, 5, 0, 
-       0, 0, 0, 0, 0, 0, 0, 5, 
+       0, 0, 3, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 14, 5, 15, 0, 0, 16, 0, 
-       0, 17, 0, 0, 18, 5, 0, 0, 
-       19, 20, 0, 3, 0, 5, 21, 0, 
-       0
+       0, 0, 0, 0, 0, 0, 0, 0, 
+       0, 0, 0, 0, 0, 0, 0, 4, 
+       0, 0, 5, 0, 6, 0, 0, 0, 
+       0, 0, 0, 0, 0, 0, 0, 0, 
+       0, 0, 0, 0, 0, 0, 0, 0, 
+       0, 7, 8, 0, 9, 0, 10, 0, 
+       11, 12, 0, 0, 0, 13, 14, 0
 };
 
 static const char _use_syllable_machine_to_state_actions[] = {
-       0, 0, 0, 0, 0, 6, 0, 0, 
-       0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0, 0, 0, 0, 
+       1, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0
+       0, 0, 0, 0, 0
 };
 
 static const char _use_syllable_machine_from_state_actions[] = {
-       0, 0, 0, 0, 0, 7, 0, 0, 
+       2, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0
+       0, 0, 0, 0, 0
 };
 
 static const short _use_syllable_machine_eof_trans[] = {
-       1, 3, 3, 6, 6, 0, 42, 44, 
-       44, 68, 68, 44, 44, 44, 44, 44, 
-       44, 44, 44, 44, 44, 44, 71, 44, 
-       44, 44, 44, 44, 44, 44, 44, 44, 
-       68, 44, 74, 77, 74, 44, 44, 81, 
-       81, 82, 82, 82, 82, 82, 82, 82, 
-       82, 82, 82, 82, 82, 82, 82, 82, 
-       82, 82, 82, 82, 82, 82, 82, 87, 
-       82, 82, 82, 87, 82, 82, 82, 82, 
-       81, 87
+       0, 35, 35, 37, 37, 59, 37, 37, 
+       37, 37, 37, 37, 37, 37, 37, 37, 
+       61, 37, 37, 37, 37, 37, 37, 37, 
+       37, 59, 63, 65, 37, 66, 66, 66, 
+       66, 66, 66, 66, 66, 66, 66, 66, 
+       66, 66, 66, 66, 66, 66, 66, 66, 
+       66, 66, 66, 66, 66, 66, 66, 66, 
+       66, 70, 71, 71, 71
 };
 
-static const int use_syllable_machine_start = 5;
-static const int use_syllable_machine_first_final = 5;
+static const int use_syllable_machine_start = 0;
+static const int use_syllable_machine_first_final = 0;
 static const int use_syllable_machine_error = -1;
 
-static const int use_syllable_machine_en_main = 5;
+static const int use_syllable_machine_en_main = 0;
 
 
-#line 38 "hb-ot-shape-complex-use-machine.rl"
+#line 58 "hb-ot-shape-complex-use-machine.rl"
 
 
 
-#line 162 "hb-ot-shape-complex-use-machine.rl"
+#line 179 "hb-ot-shape-complex-use-machine.rl"
 
 
 #define found_syllable(syllable_type) \
   HB_STMT_START { \
-    if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \
-    for (unsigned int i = ts; i < te; i++) \
-      info[i].syllable() = (syllable_serial << 4) | use_##syllable_type; \
+    if (0) fprintf (stderr, "syllable %d..%d %s\n", (*ts).second.first, (*te).second.first, #syllable_type); \
+    for (unsigned i = (*ts).second.first; i < (*te).second.first; ++i) \
+      info[i].syllable() = (syllable_serial << 4) | syllable_type; \
     syllable_serial++; \
     if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
   } HB_STMT_END
 
-static void
+
+template <typename Iter>
+struct machine_index_t :
+  hb_iter_with_fallback_t<machine_index_t<Iter>,
+                         typename Iter::item_t>
+{
+  machine_index_t (const Iter& it) : it (it) {}
+  machine_index_t (const machine_index_t& o) : it (o.it) {}
+
+  static constexpr bool is_random_access_iterator = Iter::is_random_access_iterator;
+  static constexpr bool is_sorted_iterator = Iter::is_sorted_iterator;
+
+  typename Iter::item_t __item__ () const { return *it; }
+  typename Iter::item_t __item_at__ (unsigned i) const { return it[i]; }
+  unsigned __len__ () const { return it.len (); }
+  void __next__ () { ++it; }
+  void __forward__ (unsigned n) { it += n; }
+  void __prev__ () { --it; }
+  void __rewind__ (unsigned n) { it -= n; }
+  void operator = (unsigned n)
+  { unsigned index = (*it).first; if (index < n) it += n - index; else if (index > n) it -= index - n; }
+  void operator = (const machine_index_t& o) { *this = (*o.it).first; }
+  bool operator == (const machine_index_t& o) const { return (*it).first == (*o.it).first; }
+  bool operator != (const machine_index_t& o) const { return !(*this == o); }
+
+  private:
+  Iter it;
+};
+struct
+{
+  template <typename Iter,
+           hb_requires (hb_is_iterable (Iter))>
+  machine_index_t<hb_iter_type<Iter>>
+  operator () (Iter&& it) const
+  { return machine_index_t<hb_iter_type<Iter>> (hb_iter (it)); }
+}
+HB_FUNCOBJ (machine_index);
+
+
+
+static bool
+not_ccs_default_ignorable (const hb_glyph_info_t &i)
+{ return !(i.use_category() == USE(CGJ) && _hb_glyph_info_is_default_ignorable (&i)); }
+
+static inline void
 find_syllables_use (hb_buffer_t *buffer)
 {
-  unsigned int p, pe, eof, ts, te, act;
-  int cs;
   hb_glyph_info_t *info = buffer->info;
+  auto p =
+    + hb_iter (info, buffer->len)
+    | hb_enumerate
+    | hb_filter ([] (const hb_glyph_info_t &i) { return not_ccs_default_ignorable (i); },
+                hb_second)
+    | hb_filter ([&] (const hb_pair_t<unsigned, const hb_glyph_info_t &> p)
+                {
+                  if (p.second.use_category() == USE(ZWNJ))
+                    for (unsigned i = p.first + 1; i < buffer->len; ++i)
+                      if (not_ccs_default_ignorable (info[i]))
+                        return !_hb_glyph_info_is_unicode_mark (&info[i]);
+                  return true;
+                })
+    | hb_enumerate
+    | machine_index
+    ;
+  auto pe = p + p.len ();
+  auto eof = +pe;
+  auto ts = +p;
+  auto te = +p;
+  unsigned int act HB_UNUSED;
+  int cs;
   
-#line 396 "hb-ot-shape-complex-use-machine.hh"
+#line 453 "hb-ot-shape-complex-use-machine.hh"
        {
        cs = use_syllable_machine_start;
        ts = 0;
@@ -400,15 +457,12 @@ find_syllables_use (hb_buffer_t *buffer)
        act = 0;
        }
 
-#line 182 "hb-ot-shape-complex-use-machine.rl"
+#line 263 "hb-ot-shape-complex-use-machine.rl"
 
 
-  p = 0;
-  pe = eof = buffer->len;
-
   unsigned int syllable_serial = 1;
   
-#line 412 "hb-ot-shape-complex-use-machine.hh"
+#line 466 "hb-ot-shape-complex-use-machine.hh"
        {
        int _slen;
        int _trans;
@@ -418,20 +472,20 @@ find_syllables_use (hb_buffer_t *buffer)
                goto _test_eof;
 _resume:
        switch ( _use_syllable_machine_from_state_actions[cs] ) {
-       case 7:
+       case 2:
 #line 1 "NONE"
        {ts = p;}
        break;
-#line 426 "hb-ot-shape-complex-use-machine.hh"
+#line 480 "hb-ot-shape-complex-use-machine.hh"
        }
 
        _keys = _use_syllable_machine_trans_keys + (cs<<1);
        _inds = _use_syllable_machine_indicies + _use_syllable_machine_index_offsets[cs];
 
        _slen = _use_syllable_machine_key_spans[cs];
-       _trans = _inds[ _slen > 0 && _keys[0] <=( info[p].use_category()) &&
-               ( info[p].use_category()) <= _keys[1] ?
-               ( info[p].use_category()) - _keys[0] : _slen ];
+       _trans = _inds[ _slen > 0 && _keys[0] <=( (*p).second.second.use_category()) &&
+               ( (*p).second.second.use_category()) <= _keys[1] ?
+               ( (*p).second.second.use_category()) - _keys[0] : _slen ];
 
 _eof_trans:
        cs = _use_syllable_machine_trans_targs[_trans];
@@ -440,104 +494,64 @@ _eof_trans:
                goto _again;
 
        switch ( _use_syllable_machine_trans_actions[_trans] ) {
-       case 5:
-#line 1 "NONE"
-       {te = p+1;}
-       break;
-       case 12:
-#line 150 "hb-ot-shape-complex-use-machine.rl"
-       {te = p+1;{ found_syllable (independent_cluster); }}
+       case 7:
+#line 169 "hb-ot-shape-complex-use-machine.rl"
+       {te = p+1;{ found_syllable (use_standard_cluster); }}
        break;
-       case 14:
-#line 153 "hb-ot-shape-complex-use-machine.rl"
-       {te = p+1;{ found_syllable (standard_cluster); }}
+       case 4:
+#line 174 "hb-ot-shape-complex-use-machine.rl"
+       {te = p+1;{ found_syllable (use_broken_cluster); }}
        break;
-       case 10:
-#line 157 "hb-ot-shape-complex-use-machine.rl"
-       {te = p+1;{ found_syllable (broken_cluster); }}
+       case 3:
+#line 175 "hb-ot-shape-complex-use-machine.rl"
+       {te = p+1;{ found_syllable (use_non_cluster); }}
        break;
        case 8:
-#line 158 "hb-ot-shape-complex-use-machine.rl"
-       {te = p+1;{ found_syllable (non_cluster); }}
-       break;
-       case 11:
-#line 150 "hb-ot-shape-complex-use-machine.rl"
-       {te = p;p--;{ found_syllable (independent_cluster); }}
-       break;
-       case 15:
-#line 151 "hb-ot-shape-complex-use-machine.rl"
-       {te = p;p--;{ found_syllable (virama_terminated_cluster); }}
-       break;
-       case 16:
-#line 152 "hb-ot-shape-complex-use-machine.rl"
-       {te = p;p--;{ found_syllable (sakot_terminated_cluster); }}
-       break;
-       case 13:
-#line 153 "hb-ot-shape-complex-use-machine.rl"
-       {te = p;p--;{ found_syllable (standard_cluster); }}
+#line 167 "hb-ot-shape-complex-use-machine.rl"
+       {te = p;p--;{ found_syllable (use_virama_terminated_cluster); }}
        break;
-       case 18:
-#line 154 "hb-ot-shape-complex-use-machine.rl"
-       {te = p;p--;{ found_syllable (number_joiner_terminated_cluster); }}
-       break;
-       case 17:
-#line 155 "hb-ot-shape-complex-use-machine.rl"
-       {te = p;p--;{ found_syllable (numeral_cluster); }}
-       break;
-       case 19:
-#line 156 "hb-ot-shape-complex-use-machine.rl"
-       {te = p;p--;{ found_syllable (symbol_cluster); }}
-       break;
-       case 20:
-#line 157 "hb-ot-shape-complex-use-machine.rl"
-       {te = p;p--;{ found_syllable (broken_cluster); }}
-       break;
-       case 21:
-#line 158 "hb-ot-shape-complex-use-machine.rl"
-       {te = p;p--;{ found_syllable (non_cluster); }}
+       case 9:
+#line 168 "hb-ot-shape-complex-use-machine.rl"
+       {te = p;p--;{ found_syllable (use_sakot_terminated_cluster); }}
        break;
-       case 1:
-#line 153 "hb-ot-shape-complex-use-machine.rl"
-       {{p = ((te))-1;}{ found_syllable (standard_cluster); }}
+       case 6:
+#line 169 "hb-ot-shape-complex-use-machine.rl"
+       {te = p;p--;{ found_syllable (use_standard_cluster); }}
        break;
-       case 4:
-#line 157 "hb-ot-shape-complex-use-machine.rl"
-       {{p = ((te))-1;}{ found_syllable (broken_cluster); }}
+       case 11:
+#line 170 "hb-ot-shape-complex-use-machine.rl"
+       {te = p;p--;{ found_syllable (use_number_joiner_terminated_cluster); }}
        break;
-       case 2:
-#line 1 "NONE"
-       {       switch( act ) {
-       case 8:
-       {{p = ((te))-1;} found_syllable (broken_cluster); }
+       case 10:
+#line 171 "hb-ot-shape-complex-use-machine.rl"
+       {te = p;p--;{ found_syllable (use_numeral_cluster); }}
        break;
-       case 9:
-       {{p = ((te))-1;} found_syllable (non_cluster); }
+       case 5:
+#line 172 "hb-ot-shape-complex-use-machine.rl"
+       {te = p;p--;{ found_syllable (use_symbol_cluster); }}
        break;
-       }
-       }
+       case 14:
+#line 173 "hb-ot-shape-complex-use-machine.rl"
+       {te = p;p--;{ found_syllable (use_hieroglyph_cluster); }}
        break;
-       case 3:
-#line 1 "NONE"
-       {te = p+1;}
-#line 157 "hb-ot-shape-complex-use-machine.rl"
-       {act = 8;}
+       case 12:
+#line 174 "hb-ot-shape-complex-use-machine.rl"
+       {te = p;p--;{ found_syllable (use_broken_cluster); }}
        break;
-       case 9:
-#line 1 "NONE"
-       {te = p+1;}
-#line 158 "hb-ot-shape-complex-use-machine.rl"
-       {act = 9;}
+       case 13:
+#line 175 "hb-ot-shape-complex-use-machine.rl"
+       {te = p;p--;{ found_syllable (use_non_cluster); }}
        break;
-#line 532 "hb-ot-shape-complex-use-machine.hh"
+#line 546 "hb-ot-shape-complex-use-machine.hh"
        }
 
 _again:
        switch ( _use_syllable_machine_to_state_actions[cs] ) {
-       case 6:
+       case 1:
 #line 1 "NONE"
        {ts = 0;}
        break;
-#line 541 "hb-ot-shape-complex-use-machine.hh"
+#line 555 "hb-ot-shape-complex-use-machine.hh"
        }
 
        if ( ++p != pe )
@@ -553,7 +567,7 @@ _again:
 
        }
 
-#line 190 "hb-ot-shape-complex-use-machine.rl"
+#line 268 "hb-ot-shape-complex-use-machine.rl"
 
 }
 
index 9b75b5c..9e0d98d 100644 (file)
 
 #include "hb.hh"
 
+#include "hb-ot-shape-complex-syllabic.hh"
+
+/* buffer var allocations */
+#define use_category() complex_var_u8_category()
+
+#define USE(Cat) use_syllable_machine_ex_##Cat
+
+enum use_syllable_type_t {
+  use_virama_terminated_cluster,
+  use_sakot_terminated_cluster,
+  use_standard_cluster,
+  use_number_joiner_terminated_cluster,
+  use_numeral_cluster,
+  use_symbol_cluster,
+  use_hieroglyph_cluster,
+  use_broken_cluster,
+  use_non_cluster,
+};
+
 %%{
   machine use_syllable_machine;
   alphtype unsigned char;
+  write exports;
   write data;
 }%%
 
 %%{
 
-# Same order as enum use_category_t.  Not sure how to avoid duplication.
-
-O      = 0; # OTHER
-
-B      = 1; # BASE
-IND    = 3; # BASE_IND
-N      = 4; # BASE_NUM
-GB     = 5; # BASE_OTHER
-CGJ    = 6; # CGJ
-#F     = 7; # CONS_FINAL
-#FM    = 8; # CONS_FINAL_MOD
-#M     = 9; # CONS_MED
-#CM    = 10; # CONS_MOD
-SUB    = 11; # CONS_SUB
-H      = 12; # HALANT
-
-HN     = 13; # HALANT_NUM
-ZWNJ   = 14; # Zero width non-joiner
-ZWJ    = 15; # Zero width joiner
-WJ     = 16; # Word joiner
-Rsv    = 17; # Reserved characters
-R      = 18; # REPHA
-S      = 19; # SYM
-#SM    = 20; # SYM_MOD
-VS     = 21; # VARIATION_SELECTOR
-#V     = 36; # VOWEL
-#VM    = 40; # VOWEL_MOD
-CS     = 43; # CONS_WITH_STACKER
-HVM    = 44; # HALANT_OR_VOWEL_MODIFIER
-Sk     = 48; # SAKOT
-
-FAbv   = 24; # CONS_FINAL_ABOVE
-FBlw   = 25; # CONS_FINAL_BELOW
-FPst   = 26; # CONS_FINAL_POST
-MAbv   = 27; # CONS_MED_ABOVE
-MBlw   = 28; # CONS_MED_BELOW
-MPst   = 29; # CONS_MED_POST
-MPre   = 30; # CONS_MED_PRE
-CMAbv  = 31; # CONS_MOD_ABOVE
-CMBlw  = 32; # CONS_MOD_BELOW
-VAbv   = 33; # VOWEL_ABOVE / VOWEL_ABOVE_BELOW / VOWEL_ABOVE_BELOW_POST / VOWEL_ABOVE_POST
-VBlw   = 34; # VOWEL_BELOW / VOWEL_BELOW_POST
-VPst   = 35; # VOWEL_POST      UIPC = Right
-VPre   = 22; # VOWEL_PRE / VOWEL_PRE_ABOVE / VOWEL_PRE_ABOVE_POST / VOWEL_PRE_POST
-VMAbv  = 37; # VOWEL_MOD_ABOVE
-VMBlw  = 38; # VOWEL_MOD_BELOW
-VMPst  = 39; # VOWEL_MOD_POST
-VMPre  = 23; # VOWEL_MOD_PRE
-SMAbv  = 41; # SYM_MOD_ABOVE
-SMBlw  = 42; # SYM_MOD_BELOW
-FMAbv  = 45; # CONS_FINAL_MOD  UIPC = Top
-FMBlw  = 46; # CONS_FINAL_MOD  UIPC = Bottom
-FMPst  = 47; # CONS_FINAL_MOD  UIPC = Not_Applicable
+# Categories used in the Universal Shaping Engine spec:
+# https://docs.microsoft.com/en-us/typography/script-development/use
+
+export O       = 0; # OTHER
+
+export B       = 1; # BASE
+export N       = 4; # BASE_NUM
+export GB      = 5; # BASE_OTHER
+export CGJ     = 6; # CGJ
+export SUB     = 11; # CONS_SUB
+export H       = 12; # HALANT
+
+export HN      = 13; # HALANT_NUM
+export ZWNJ    = 14; # Zero width non-joiner
+export R       = 18; # REPHA
+export CS      = 43; # CONS_WITH_STACKER
+export HVM     = 44; # HALANT_OR_VOWEL_MODIFIER
+export Sk      = 48; # SAKOT
+export G       = 49; # HIEROGLYPH
+export J       = 50; # HIEROGLYPH_JOINER
+export SB      = 51; # HIEROGLYPH_SEGMENT_BEGIN
+export SE      = 52; # HIEROGLYPH_SEGMENT_END
+
+export FAbv    = 24; # CONS_FINAL_ABOVE
+export FBlw    = 25; # CONS_FINAL_BELOW
+export FPst    = 26; # CONS_FINAL_POST
+export MAbv    = 27; # CONS_MED_ABOVE
+export MBlw    = 28; # CONS_MED_BELOW
+export MPst    = 29; # CONS_MED_POST
+export MPre    = 30; # CONS_MED_PRE
+export CMAbv   = 31; # CONS_MOD_ABOVE
+export CMBlw   = 32; # CONS_MOD_BELOW
+export VAbv    = 33; # VOWEL_ABOVE / VOWEL_ABOVE_BELOW / VOWEL_ABOVE_BELOW_POST / VOWEL_ABOVE_POST
+export VBlw    = 34; # VOWEL_BELOW / VOWEL_BELOW_POST
+export VPst    = 35; # VOWEL_POST      UIPC = Right
+export VPre    = 22; # VOWEL_PRE / VOWEL_PRE_ABOVE / VOWEL_PRE_ABOVE_POST / VOWEL_PRE_POST
+export VMAbv   = 37; # VOWEL_MOD_ABOVE
+export VMBlw   = 38; # VOWEL_MOD_BELOW
+export VMPst   = 39; # VOWEL_MOD_POST
+export VMPre   = 23; # VOWEL_MOD_PRE
+export SMAbv   = 41; # SYM_MOD_ABOVE
+export SMBlw   = 42; # SYM_MOD_BELOW
+export FMAbv   = 45; # CONS_FINAL_MOD  UIPC = Top
+export FMBlw   = 46; # CONS_FINAL_MOD  UIPC = Bottom
+export FMPst   = 47; # CONS_FINAL_MOD  UIPC = Not_Applicable
+
 
 h = H | HVM | Sk;
 
-# Override: Adhoc ZWJ placement. https://github.com/harfbuzz/harfbuzz/issues/542#issuecomment-353169729
-consonant_modifiers = CMAbv* CMBlw* ((ZWJ?.h.ZWJ? B | SUB) VS? CMAbv? CMBlw*)*;
-# Override: Allow two MBlw. https://github.com/harfbuzz/harfbuzz/issues/376
-medial_consonants = MPre? MAbv? MBlw?.MBlw? MPst?;
+consonant_modifiers = CMAbv* CMBlw* ((h B | SUB) CMAbv? CMBlw*)*;
+medial_consonants = MPre? MAbv? MBlw? MPst?;
 dependent_vowels = VPre* VAbv* VBlw* VPst*;
 vowel_modifiers = HVM? VMPre* VMAbv* VMBlw* VMPst*;
 final_consonants = FAbv* FBlw* FPst*;
 final_modifiers = FMAbv* FMBlw* | FMPst?;
 
-complex_syllable_start = (R | CS)? (B | GB) VS?;
+complex_syllable_start = (R | CS)? (B | GB);
 complex_syllable_middle =
        consonant_modifiers
        medial_consonants
@@ -117,45 +128,51 @@ complex_syllable_tail =
        final_consonants
        final_modifiers
 ;
-number_joiner_terminated_cluster_tail = (HN N VS?)* HN;
-numeral_cluster_tail = (HN N VS?)+;
+number_joiner_terminated_cluster_tail = (HN N)* HN;
+numeral_cluster_tail = (HN N)+;
 symbol_cluster_tail = SMAbv+ SMBlw* | SMBlw+;
 
-virama_terminated_cluster =
-       complex_syllable_start
+virama_terminated_cluster_tail =
        consonant_modifiers
-       ZWJ?.h.ZWJ?
+       h
 ;
-sakot_terminated_cluster =
+virama_terminated_cluster =
        complex_syllable_start
+       virama_terminated_cluster_tail
+;
+sakot_terminated_cluster_tail =
        complex_syllable_middle
        Sk
 ;
+sakot_terminated_cluster =
+       complex_syllable_start
+       sakot_terminated_cluster_tail
+;
 standard_cluster =
        complex_syllable_start
        complex_syllable_tail
 ;
 broken_cluster =
        R?
-       (complex_syllable_tail | number_joiner_terminated_cluster_tail | numeral_cluster_tail | symbol_cluster_tail)
+       (complex_syllable_tail | number_joiner_terminated_cluster_tail | numeral_cluster_tail | symbol_cluster_tail | virama_terminated_cluster_tail | sakot_terminated_cluster_tail)
 ;
 
-number_joiner_terminated_cluster = N VS? number_joiner_terminated_cluster_tail;
-numeral_cluster = N VS? numeral_cluster_tail?;
-symbol_cluster = (S | GB) VS? symbol_cluster_tail?;
-independent_cluster = (IND | O | Rsv | WJ) VS?;
+number_joiner_terminated_cluster = N number_joiner_terminated_cluster_tail;
+numeral_cluster = N numeral_cluster_tail?;
+symbol_cluster = (O | GB) symbol_cluster_tail?;
+hieroglyph_cluster = SB+ | SB* G SE* (J SE* (G SE*)?)*;
 other = any;
 
 main := |*
-       independent_cluster                     => { found_syllable (independent_cluster); };
-       virama_terminated_cluster               => { found_syllable (virama_terminated_cluster); };
-       sakot_terminated_cluster                => { found_syllable (sakot_terminated_cluster); };
-       standard_cluster                        => { found_syllable (standard_cluster); };
-       number_joiner_terminated_cluster        => { found_syllable (number_joiner_terminated_cluster); };
-       numeral_cluster                         => { found_syllable (numeral_cluster); };
-       symbol_cluster                          => { found_syllable (symbol_cluster); };
-       broken_cluster                          => { found_syllable (broken_cluster); };
-       other                                   => { found_syllable (non_cluster); };
+       virama_terminated_cluster               => { found_syllable (use_virama_terminated_cluster); };
+       sakot_terminated_cluster                => { found_syllable (use_sakot_terminated_cluster); };
+       standard_cluster                        => { found_syllable (use_standard_cluster); };
+       number_joiner_terminated_cluster        => { found_syllable (use_number_joiner_terminated_cluster); };
+       numeral_cluster                         => { found_syllable (use_numeral_cluster); };
+       symbol_cluster                          => { found_syllable (use_symbol_cluster); };
+       hieroglyph_cluster                      => { found_syllable (use_hieroglyph_cluster); };
+       broken_cluster                          => { found_syllable (use_broken_cluster); };
+       other                                   => { found_syllable (use_non_cluster); };
 *|;
 
 
@@ -163,27 +180,88 @@ main := |*
 
 #define found_syllable(syllable_type) \
   HB_STMT_START { \
-    if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \
-    for (unsigned int i = ts; i < te; i++) \
-      info[i].syllable() = (syllable_serial << 4) | use_##syllable_type; \
+    if (0) fprintf (stderr, "syllable %d..%d %s\n", (*ts).second.first, (*te).second.first, #syllable_type); \
+    for (unsigned i = (*ts).second.first; i < (*te).second.first; ++i) \
+      info[i].syllable() = (syllable_serial << 4) | syllable_type; \
     syllable_serial++; \
     if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
   } HB_STMT_END
 
-static void
+
+template <typename Iter>
+struct machine_index_t :
+  hb_iter_with_fallback_t<machine_index_t<Iter>,
+                         typename Iter::item_t>
+{
+  machine_index_t (const Iter& it) : it (it) {}
+  machine_index_t (const machine_index_t& o) : it (o.it) {}
+
+  static constexpr bool is_random_access_iterator = Iter::is_random_access_iterator;
+  static constexpr bool is_sorted_iterator = Iter::is_sorted_iterator;
+
+  typename Iter::item_t __item__ () const { return *it; }
+  typename Iter::item_t __item_at__ (unsigned i) const { return it[i]; }
+  unsigned __len__ () const { return it.len (); }
+  void __next__ () { ++it; }
+  void __forward__ (unsigned n) { it += n; }
+  void __prev__ () { --it; }
+  void __rewind__ (unsigned n) { it -= n; }
+  void operator = (unsigned n)
+  { unsigned index = (*it).first; if (index < n) it += n - index; else if (index > n) it -= index - n; }
+  void operator = (const machine_index_t& o) { *this = (*o.it).first; }
+  bool operator == (const machine_index_t& o) const { return (*it).first == (*o.it).first; }
+  bool operator != (const machine_index_t& o) const { return !(*this == o); }
+
+  private:
+  Iter it;
+};
+struct
+{
+  template <typename Iter,
+           hb_requires (hb_is_iterable (Iter))>
+  machine_index_t<hb_iter_type<Iter>>
+  operator () (Iter&& it) const
+  { return machine_index_t<hb_iter_type<Iter>> (hb_iter (it)); }
+}
+HB_FUNCOBJ (machine_index);
+
+
+
+static bool
+not_ccs_default_ignorable (const hb_glyph_info_t &i)
+{ return !(i.use_category() == USE(CGJ) && _hb_glyph_info_is_default_ignorable (&i)); }
+
+static inline void
 find_syllables_use (hb_buffer_t *buffer)
 {
-  unsigned int p, pe, eof, ts, te, act;
-  int cs;
   hb_glyph_info_t *info = buffer->info;
+  auto p =
+    + hb_iter (info, buffer->len)
+    | hb_enumerate
+    | hb_filter ([] (const hb_glyph_info_t &i) { return not_ccs_default_ignorable (i); },
+                hb_second)
+    | hb_filter ([&] (const hb_pair_t<unsigned, const hb_glyph_info_t &> p)
+                {
+                  if (p.second.use_category() == USE(ZWNJ))
+                    for (unsigned i = p.first + 1; i < buffer->len; ++i)
+                      if (not_ccs_default_ignorable (info[i]))
+                        return !_hb_glyph_info_is_unicode_mark (&info[i]);
+                  return true;
+                })
+    | hb_enumerate
+    | machine_index
+    ;
+  auto pe = p + p.len ();
+  auto eof = +pe;
+  auto ts = +p;
+  auto te = +p;
+  unsigned int act HB_UNUSED;
+  int cs;
   %%{
     write init;
-    getkey info[p].use_category();
+    getkey (*p).second.second.use_category();
   }%%
 
-  p = 0;
-  pe = eof = buffer->len;
-
   unsigned int syllable_serial = 1;
   %%{
     write exec;
diff --git a/src/hb-ot-shape-complex-use-table.cc b/src/hb-ot-shape-complex-use-table.cc
deleted file mode 100644 (file)
index aa9c350..0000000
+++ /dev/null
@@ -1,873 +0,0 @@
-/* == Start of generated table == */
-/*
- * The following table is generated by running:
- *
- *   ./gen-use-table.py IndicSyllabicCategory.txt IndicPositionalCategory.txt UnicodeData.txt Blocks.txt
- *
- * on files with these headers:
- *
- * # IndicSyllabicCategory-13.0.0.txt
- * # Date: 2019-07-22, 19:55:00 GMT [KW, RP]
- * # IndicPositionalCategory-13.0.0.txt
- * # Date: 2019-07-23, 00:01:00 GMT [KW, RP]
- * # Blocks-13.0.0.txt
- * # Date: 2019-07-10, 19:06:00 GMT [KW]
- * UnicodeData.txt does not have a header.
- */
-
-#include "hb.hh"
-
-#ifndef HB_NO_OT_SHAPE
-
-#include "hb-ot-shape-complex-use.hh"
-
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-macros"
-#define B      USE_B   /* BASE */
-#define CGJ    USE_CGJ /* CGJ */
-#define CS     USE_CS  /* CONS_WITH_STACKER */
-#define GB     USE_GB  /* BASE_OTHER */
-#define H      USE_H   /* HALANT */
-#define HN     USE_HN  /* HALANT_NUM */
-#define HVM    USE_HVM /* HALANT_OR_VOWEL_MODIFIER */
-#define IND    USE_IND /* BASE_IND */
-#define N      USE_N   /* BASE_NUM */
-#define O      USE_O   /* OTHER */
-#define R      USE_R   /* REPHA */
-#define Rsv    USE_Rsv /* Reserved */
-#define S      USE_S   /* SYM */
-#define SUB    USE_SUB /* CONS_SUB */
-#define Sk     USE_Sk  /* SAKOT */
-#define VS     USE_VS  /* VARIATION_SELECTOR */
-#define WJ     USE_WJ  /* Word_Joiner */
-#define ZWJ    USE_ZWJ /* ZWJ */
-#define ZWNJ   USE_ZWNJ        /* ZWNJ */
-#define CMAbv  USE_CMAbv
-#define CMBlw  USE_CMBlw
-#define FAbv   USE_FAbv
-#define FBlw   USE_FBlw
-#define FPst   USE_FPst
-#define FMAbv  USE_FMAbv
-#define FMBlw  USE_FMBlw
-#define FMPst  USE_FMPst
-#define MAbv   USE_MAbv
-#define MBlw   USE_MBlw
-#define MPst   USE_MPst
-#define MPre   USE_MPre
-#define SMAbv  USE_SMAbv
-#define SMBlw  USE_SMBlw
-#define VAbv   USE_VAbv
-#define VBlw   USE_VBlw
-#define VPst   USE_VPst
-#define VPre   USE_VPre
-#define VMAbv  USE_VMAbv
-#define VMBlw  USE_VMBlw
-#define VMPst  USE_VMPst
-#define VMPre  USE_VMPre
-#pragma GCC diagnostic pop
-
-static const USE_TABLE_ELEMENT_TYPE use_table[] = {
-
-
-#define use_offset_0x0028u 0
-
-
-  /* Basic Latin */
-                                                                         O,     O,     O,     O,     O,    GB,     O,     O,
-  /* 0030 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
-
-#define use_offset_0x00a0u 24
-
-
-  /* Latin-1 Supplement */
-
-  /* 00A0 */    GB,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* 00B0 */     O,     O, FMPst, FMPst,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* 00C0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* 00D0 */     O,     O,     O,     O,     O,     O,     O,    GB,
-
-#define use_offset_0x0348u 80
-
-
-  /* Combining Diacritical Marks */
-                                                                         O,     O,     O,     O,     O,     O,     O,   CGJ,
-
-#define use_offset_0x0900u 88
-
-
-  /* Devanagari */
-
-  /* 0900 */ VMAbv, VMAbv, VMAbv, VMPst,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 0910 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 0920 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 0930 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VAbv,  VPst, CMBlw,     B,  VPst,  VPre,
-  /* 0940 */  VPst,  VBlw,  VBlw,  VBlw,  VBlw,  VAbv,  VAbv,  VAbv,  VAbv,  VPst,  VPst,  VPst,  VPst,     H,  VPre,  VPst,
-  /* 0950 */     O, VMAbv, VMBlw,     O,     O,  VAbv,  VBlw,  VBlw,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 0960 */     B,     B,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 0970 */     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-
-  /* Bengali */
-
-  /* 0980 */    GB, VMAbv, VMPst, VMPst,     O,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     B,
-  /* 0990 */     B,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 09A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,
-  /* 09B0 */     B,     O,     B,     O,     O,     O,     B,     B,     B,     B,     O,     O, CMBlw,     B,  VPst,  VPre,
-  /* 09C0 */  VPst,  VBlw,  VBlw,  VBlw,  VBlw,     O,     O,  VPre,  VPre,     O,     O,  VPst,  VPst,     H,   IND,     O,
-  /* 09D0 */     O,     O,     O,     O,     O,     O,     O,  VPst,     O,     O,     O,     O,     B,     B,     O,     B,
-  /* 09E0 */     B,     B,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 09F0 */     B,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     B,     O, FMAbv,     O,
-
-  /* Gurmukhi */
-
-  /* 0A00 */     O, VMAbv, VMAbv, VMPst,     O,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     B,
-  /* 0A10 */     B,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 0A20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,
-  /* 0A30 */     B,     O,     B,     B,     O,     B,     B,     O,     B,     B,     O,     O, CMBlw,     O,  VPst,  VPre,
-  /* 0A40 */  VPst,  VBlw,  VBlw,     O,     O,     O,     O,  VAbv,  VAbv,     O,     O,  VAbv,  VAbv,     H,     O,     O,
-  /* 0A50 */     O, VMBlw,     O,     O,     O,     O,     O,     O,     O,     B,     B,     B,     B,     O,     B,     O,
-  /* 0A60 */     O,     O,     O,     O,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 0A70 */ VMAbv, CMAbv,    GB,    GB,     O,  MBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-
-  /* Gujarati */
-
-  /* 0A80 */     O, VMAbv, VMAbv, VMPst,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,
-  /* 0A90 */     B,     B,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 0AA0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,
-  /* 0AB0 */     B,     O,     B,     B,     O,     B,     B,     B,     B,     B,     O,     O, CMBlw,     B,  VPst,  VPre,
-  /* 0AC0 */  VPst,  VBlw,  VBlw,  VBlw,  VBlw,  VAbv,     O,  VAbv,  VAbv,  VAbv,     O,  VPst,  VPst,     H,     O,     O,
-  /* 0AD0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* 0AE0 */     B,     B,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 0AF0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     B, VMAbv, VMAbv, VMAbv, CMAbv, CMAbv, CMAbv,
-
-  /* Oriya */
-
-  /* 0B00 */     O, VMAbv, VMPst, VMPst,     O,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     B,
-  /* 0B10 */     B,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 0B20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,
-  /* 0B30 */     B,     O,     B,     B,     O,     B,     B,     B,     B,     B,     O,     O, CMBlw,     B,  VPst,  VAbv,
-  /* 0B40 */  VPst,  VBlw,  VBlw,  VBlw,  VBlw,     O,     O,  VPre,  VPst,     O,     O,  VPst,  VPst,     H,     O,     O,
-  /* 0B50 */     O,     O,     O,     O,     O,  VAbv,  VAbv,  VAbv,     O,     O,     O,     O,     B,     B,     O,     B,
-  /* 0B60 */     B,     B,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 0B70 */     O,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-
-  /* Tamil */
-
-  /* 0B80 */     O,     O, VMAbv,   IND,     O,     B,     B,     B,     B,     B,     B,     O,     O,     O,     B,     B,
-  /* 0B90 */     B,     O,     B,     B,     B,     B,     O,     O,     O,     B,     B,     O,     B,     O,     B,     B,
-  /* 0BA0 */     O,     O,     O,     B,     B,     O,     O,     O,     B,     B,     B,     O,     O,     O,     B,     B,
-  /* 0BB0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,  VPst,  VPst,
-  /* 0BC0 */  VAbv,  VPst,  VPst,     O,     O,     O,  VPre,  VPre,  VPre,     O,  VPst,  VPst,  VPst,     H,     O,     O,
-  /* 0BD0 */     O,     O,     O,     O,     O,     O,     O,  VPst,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* 0BE0 */     O,     O,     O,     O,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 0BF0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-
-  /* Telugu */
-
-  /* 0C00 */ VMAbv, VMPst, VMPst, VMPst, VMAbv,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,
-  /* 0C10 */     B,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 0C20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,
-  /* 0C30 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     B,  VAbv,  VAbv,
-  /* 0C40 */  VAbv,  VPst,  VPst,  VPst,  VPst,     O,  VAbv,  VAbv,  VAbv,     O,  VAbv,  VAbv,  VAbv,     H,     O,     O,
-  /* 0C50 */     O,     O,     O,     O,     O,  VAbv,  VBlw,     O,     B,     B,     B,     O,     O,     O,     O,     O,
-  /* 0C60 */     B,     B,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 0C70 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-
-  /* Kannada */
-
-  /* 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,
-  /* 0CC0 */  VAbv,  VPst,  VPst,  VPst,  VPst,     O,  VAbv,  VAbv,  VAbv,     O,  VAbv,  VAbv,  VAbv,     H,     O,     O,
-  /* 0CD0 */     O,     O,     O,     O,     O,  VPst,  VPst,     O,     O,     O,     O,     O,     O,     O,     B,     O,
-  /* 0CE0 */     B,     B,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 0CF0 */     O,    CS,    CS,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-
-  /* Malayalam */
-
-  /* 0D00 */ VMAbv, VMAbv, VMPst, VMPst,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,
-  /* 0D10 */     B,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 0D20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 0D30 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VAbv,  VAbv,     B,  VPst,  VPst,
-  /* 0D40 */  VPst,  VPst,  VPst,  VBlw,  VBlw,     O,  VPre,  VPre,  VPre,     O,  VPst,  VPst,  VPst,     H,     R,     O,
-  /* 0D50 */     O,     O,     O,     O,   IND,   IND,   IND,  VPst,     O,     O,     O,     O,     O,     O,     O,     B,
-  /* 0D60 */     B,     B,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 0D70 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,   IND,   IND,   IND,   IND,   IND,   IND,
-
-  /* Sinhala */
-
-  /* 0D80 */     O, VMAbv, VMPst, VMPst,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 0D90 */     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     B,     B,     B,     B,     B,     B,
-  /* 0DA0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 0DB0 */     B,     B,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     O,     O,
-  /* 0DC0 */     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     H,     O,     O,     O,     O,  VPst,
-  /* 0DD0 */  VPst,  VPst,  VAbv,  VAbv,  VBlw,     O,  VBlw,     O,  VPst,  VPre,  VPst,  VPre,  VPst,  VPst,  VPst,  VPst,
-  /* 0DE0 */     O,     O,     O,     O,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 0DF0 */     O,     O,  VPst,  VPst,     O,     O,     O,     O,
-
-#define use_offset_0x0f18u 1360
-
-
-  /* Tibetan */
-                                                                      VBlw,  VBlw,     O,     O,     O,     O,     O,     O,
-  /* 0F20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 0F30 */     B,     B,     B,     B,     O, FMBlw,     O, FMBlw,     O, CMAbv,     O,     O,     O,     O,  VPst,  VPre,
-  /* 0F40 */     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,     B,
-  /* 0F50 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 0F60 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,
-  /* 0F70 */     O,  VBlw,  VBlw,  VAbv,  VBlw,  VBlw,  VAbv,  VAbv,  VAbv,  VAbv,  VBlw,  VBlw,  VBlw,  VBlw, VMAbv, VMPst,
-  /* 0F80 */  VBlw,  VAbv, VMAbv, VMAbv,  VBlw,   IND, VMAbv, VMAbv,     B,     B,     B,     B,     B,   SUB,   SUB,   SUB,
-  /* 0F90 */   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,     O,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,
-  /* 0FA0 */   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,
-  /* 0FB0 */   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,     O,     O,     O,
-  /* 0FC0 */     O,     O,     O,     O,     O,     O, FMBlw,     O,
-
-#define use_offset_0x1000u 1536
-
-
-  /* Myanmar */
-
-  /* 1000 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1010 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1020 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPst,  VPst,  VAbv,  VAbv,  VBlw,
-  /* 1030 */  VBlw,  VPre,  VAbv,  VAbv,  VAbv,  VAbv, VMAbv, VMBlw, VMPst,     H,  VAbv,  MPst,  MPre,  MBlw,  MBlw,     B,
-  /* 1040 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,    GB,     O,     O,    GB,     O,
-  /* 1050 */     B,     B,     B,     B,     B,     B,  VPst,  VPst,  VBlw,  VBlw,     B,     B,     B,     B,  MBlw,  MBlw,
-  /* 1060 */  MBlw,     B,  VPst, VMPst, VMPst,     B,     B,  VPst,  VPst, VMPst, VMPst, VMPst, VMPst, VMPst,     B,     B,
-  /* 1070 */     B,  VAbv,  VAbv,  VAbv,  VAbv,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1080 */     B,     B,  MBlw,  VPst,  VPre,  VAbv,  VAbv, VMPst, VMPst, VMPst, VMPst, VMPst, VMPst, VMBlw,     B, VMPst,
-  /* 1090 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B, VMPst, VMPst,  VPst,  VAbv,     O,     O,
-
-#define use_offset_0x1700u 1696
-
-
-  /* Tagalog */
-
-  /* 1700 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,
-  /* 1710 */     B,     B,  VAbv,  VBlw,  VBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-
-  /* Hanunoo */
-
-  /* 1720 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1730 */     B,     B,  VAbv,  VBlw,  VBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-
-  /* Buhid */
-
-  /* 1740 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1750 */     B,     B,  VAbv,  VBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-
-  /* Tagbanwa */
-
-  /* 1760 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,
-  /* 1770 */     B,     O,  VAbv,  VBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-
-  /* Khmer */
-
-  /* 1780 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1790 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 17A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 17B0 */     B,     B,     B,     B,     O,     O,  VPst,  VAbv,  VAbv,  VAbv,  VAbv,  VBlw,  VBlw,  VBlw,  VPst,  VPst,
-  /* 17C0 */  VPst,  VPre,  VPre,  VPre,  VPst,  VPst, VMAbv, VMPst,  VPst, VMAbv, VMAbv, FMAbv,  FAbv, CMAbv, FMAbv, FMAbv,
-  /* 17D0 */ FMAbv,  VAbv,     H, FMAbv,     O,     O,     O,     O,     O,     O,     O,     O,     B, FMAbv,     O,     O,
-  /* 17E0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
-
-#define use_offset_0x1900u 1936
-
-
-  /* Limbu */
-
-  /* 1900 */    GB,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1910 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,
-  /* 1920 */  VAbv,  VAbv,  VBlw,  VPst,  VPst,  VAbv,  VAbv,  VAbv,  VAbv,   SUB,   SUB,   SUB,     O,     O,     O,     O,
-  /* 1930 */  FPst,  FPst, VMBlw,  FPst,  FPst,  FPst,  FPst,  FPst,  FPst,  FBlw,  VAbv, FMBlw,     O,     O,     O,     O,
-  /* 1940 */     O,     O,     O,     O,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-
-  /* Tai Le */
-
-  /* 1950 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1960 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,
-  /* 1970 */     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-
-  /* New Tai Lue */
-
-  /* 1980 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1990 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 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,     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,
-
-  /* Buginese */
-
-  /* 1A00 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1A10 */     B,     B,     B,     B,     B,     B,     B,  VAbv,  VBlw,  VPre,  VPst,  VAbv,     O,     O,     O,     O,
-
-  /* Tai Tham */
-
-  /* 1A20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1A30 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1A40 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1A50 */     B,     B,     B,     B,     B,  MPre,  MBlw,   SUB,  FAbv,  FAbv,  MAbv,   SUB,   SUB,   SUB,   SUB,     O,
-  /* 1A60 */    Sk,  VPst,  VAbv,  VPst,  VPst,  VAbv,  VAbv,  VAbv,  VAbv,  VBlw,  VBlw,  VAbv,  VBlw,  VPst,  VPre,  VPre,
-  /* 1A70 */  VPre,  VPre,  VPre,  VAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv,  VAbv, FMAbv, FMAbv,     O,     O, FMBlw,
-  /* 1A80 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
-  /* 1A90 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
-
-#define use_offset_0x1b00u 2352
-
-
-  /* Balinese */
-
-  /* 1B00 */ VMAbv, VMAbv, VMAbv,  FAbv, VMPst,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1B10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1B20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1B30 */     B,     B,     B,     B, CMAbv,  VPst,  VAbv,  VAbv,  VBlw,  VBlw,  VBlw,  VBlw,  VAbv,  VAbv,  VPre,  VPre,
-  /* 1B40 */  VPst,  VPst,  VAbv,  VAbv,     H,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,
-  /* 1B50 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,    GB,    GB,     O,     O,    GB,
-  /* 1B60 */     O,     S,    GB,     S,     S,     S,     S,     S,    GB,     S,     S, SMAbv, SMBlw, SMAbv, SMAbv, SMAbv,
-  /* 1B70 */ SMAbv, SMAbv, SMAbv, SMAbv,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-
-  /* Sundanese */
-
-  /* 1B80 */ VMAbv,  FAbv, VMPst,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1B90 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1BA0 */     B,   SUB,   SUB,   SUB,  VAbv,  VBlw,  VPre,  VPst,  VAbv,  VAbv,  VPst,     H,   SUB,   SUB,     B,     B,
-  /* 1BB0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-
-  /* Batak */
-
-  /* 1BC0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1BD0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1BE0 */     B,     B,     B,     B,     B,     B, CMAbv,  VPst,  VAbv,  VAbv,  VPst,  VPst,  VPst,  VAbv,  VPst,  VAbv,
-  /* 1BF0 */  FAbv,  FAbv, CMBlw, CMBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-
-  /* Lepcha */
-
-  /* 1C00 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1C10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1C20 */     B,     B,     B,     B,   SUB,   SUB,  VPst,  VPre,  VPre,  VPre,  VPst,  VPst,  VBlw,  FAbv,  FAbv,  FAbv,
-  /* 1C30 */  FAbv,  FAbv,  FAbv,  FAbv, VMPre, VMPre, FMAbv, CMBlw,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* 1C40 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     B,     B,     B,
-
-#define use_offset_0x1cd0u 2688
-
-
-  /* Vedic Extensions */
-
-  /* 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,   IND,   IND, VMAbv,    CS,    CS, VMPst, VMAbv, VMAbv,    GB,     O,     O,     O,     O,     O,
-
-#define use_offset_0x1df8u 2736
-
-
-  /* Combining Diacritical Marks Supplement */
-                                                                         O,     O,     O, FMAbv,     O,     O,     O,     O,
-
-#define use_offset_0x2008u 2744
-
-
-  /* General Punctuation */
-                                                                         O,     O,     O,     O,  ZWNJ,   ZWJ,     O,     O,
-  /* 2010 */    GB,    GB,    GB,    GB,    GB,     O,     O,     O,
-
-#define use_offset_0x2060u 2760
-
-  /* 2060 */    WJ,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-
-  /* Superscripts and Subscripts */
-
-  /* 2070 */     O,     O,     O,     O, FMPst,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* 2080 */     O,     O, FMPst, FMPst, FMPst,     O,     O,     O,
-
-#define use_offset_0x20f0u 2800
-
-
-  /* Combining Diacritical Marks for Symbols */
-
-  /* 20F0 */ VMAbv,     O,     O,     O,     O,     O,     O,     O,
-
-#define use_offset_0x25c8u 2808
-
-
-  /* Geometric Shapes */
-                                                                         O,     O,     O,     O,    GB,     O,     O,     O,
-
-#define use_offset_0xa800u 2816
-
-
-  /* Syloti Nagri */
-
-  /* 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,  VBlw,     O,     O,     O,
-  /* A830 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-
-  /* Phags-pa */
-
-  /* A840 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* A850 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* A860 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* A870 */     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-
-  /* Saurashtra */
-
-  /* A880 */ VMPst, VMPst,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* A890 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* A8A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* A8B0 */     B,     B,     B,     B,  MPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,
-  /* A8C0 */  VPst,  VPst,  VPst,  VPst,     H, VMAbv,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* A8D0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
-
-  /* Devanagari Extended */
-
-  /* A8E0 */ VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv,
-  /* A8F0 */ VMAbv, VMAbv,     B,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     B,  VAbv,
-
-  /* Kayah Li */
-
-  /* A900 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* A910 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* A920 */     B,     B,     B,     B,     B,     B,  VAbv,  VAbv,  VAbv,  VAbv,  VAbv, VMBlw, VMBlw, VMBlw,     O,     O,
-
-  /* Rejang */
-
-  /* A930 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* A940 */     B,     B,     B,     B,     B,     B,     B,  VBlw,  VBlw,  VBlw,  VAbv,  VBlw,  VBlw,  VBlw,  VBlw,  FAbv,
-  /* A950 */  FAbv,  FAbv,  FPst,  VPst,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* A960 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* A970 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-
-  /* Javanese */
-
-  /* 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,  MBlw,  MBlw,  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,
-
-  /* Myanmar Extended-B */
-
-  /* A9E0 */     B,     B,     B,     B,     B,  VAbv,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* A9F0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,
-
-  /* Cham */
-
-  /* AA00 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* AA10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* AA20 */     B,     B,     B,     B,     B,     B,     B,     B,     B, VMAbv,  VAbv,  VAbv,  VAbv,  VBlw,  VAbv,  VPre,
-  /* AA30 */  VPre,  VAbv,  VBlw,  MPst,  MPre,  MBlw,  MBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* AA40 */     B,     B,     B,  FAbv,     B,     B,     B,     B,     B,     B,     B,     B,  FAbv,  FPst,     O,     O,
-  /* AA50 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
-
-  /* Myanmar Extended-A */
-
-  /* AA60 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* AA70 */     O,     B,     B,     B,    GB,    GB,    GB,     O,     O,     O,     B, VMPst, VMAbv, VMPst,     B,     B,
-
-  /* Tai Viet */
-
-  /* AA80 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* AA90 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* AAA0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* AAB0 */  VAbv,     B,  VAbv,  VAbv,  VBlw,     B,     B,  VAbv,  VAbv,     B,     B,     B,     B,     B,  VAbv, VMAbv,
-  /* AAC0 */     B, VMAbv,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* AAD0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-
-  /* Meetei Mayek Extensions */
-
-  /* AAE0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPre,  VBlw,  VAbv,  VPre,  VPst,
-  /* AAF0 */     O,     O,     O,     O,     O, VMPst,     H,     O,
-
-#define use_offset_0xabc0u 3576
-
-
-  /* Meetei Mayek */
-
-  /* ABC0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* ABD0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* ABE0 */     B,     B,     B,  VPst,  VPst,  VAbv,  VPst,  VPst,  VBlw,  VPst,  VPst,     O, VMPst,  VBlw,     O,     O,
-  /* ABF0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
-
-#define use_offset_0xfe00u 3640
-
-
-  /* Variation Selectors */
-
-  /* FE00 */    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,
-
-#define use_offset_0x10a00u 3656
-
-
-  /* Kharoshthi */
-
-  /* 10A00 */     B,  VBlw,  VBlw,  VBlw,     O,  VAbv,  VBlw,     O,     O,     O,     O,     O,  VBlw,  VBlw, VMBlw, VMAbv,
-  /* 10A10 */     B,     B,     B,     B,     O,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,     B,
-  /* 10A20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 10A30 */     B,     B,     B,     B,     B,     B,     O,     O, CMAbv, CMBlw, CMBlw,     O,     O,     O,     O,     H,
-  /* 10A40 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,     O,
-
-#define use_offset_0x11000u 3736
-
-
-  /* Brahmi */
-
-  /* 11000 */ VMPst, VMAbv, VMPst,    CS,    CS,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11010 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11020 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11030 */     B,     B,     B,     B,     B,     B,     B,     B,  VAbv,  VAbv,  VAbv,  VAbv,  VBlw,  VBlw,  VBlw,  VBlw,
-  /* 11040 */  VBlw,  VBlw,  VAbv,  VAbv,  VAbv,  VAbv,   HVM,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* 11050 */     O,     O,     N,     N,     N,     N,     N,     N,     N,     N,     N,     N,     N,     N,     N,     N,
-  /* 11060 */     N,     N,     N,     N,     N,     N,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11070 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,    HN,
-
-  /* Kaithi */
-
-  /* 11080 */ VMAbv, VMAbv, VMPst,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11090 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 110A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 110B0 */  VPst,  VPre,  VPst,  VBlw,  VBlw,  VAbv,  VAbv,  VPst,  VPst,     H, CMBlw,     O,     O,     O,     O,     O,
-
-#define use_offset_0x11100u 3928
-
-
-  /* Chakma */
-
-  /* 11100 */ VMAbv, VMAbv, VMAbv,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11110 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11120 */     B,     B,     B,     B,     B,     B,     B,  VBlw,  VBlw,  VBlw,  VAbv,  VAbv,  VPre,  VBlw,  VAbv,  VAbv,
-  /* 11130 */  VBlw,  VAbv,  VAbv,     H, CMBlw,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11140 */     O,     O,     O,     O,     B,  VPst,  VPst,     B,     O,     O,     O,     O,     O,     O,     O,     O,
-
-  /* Mahajani */
-
-  /* 11150 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11160 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11170 */     B,     B,     B, CMBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-
-  /* Sharada */
-
-  /* 11180 */ VMAbv, VMAbv, VMPst,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11190 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 111A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 111B0 */     B,     B,     B,  VPst,  VPre,  VPst,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VAbv,  VAbv,  VAbv,  VAbv,
-  /* 111C0 */     H,     B,     R,     R,     O,     O,     O,     O,    GB, FMBlw, CMBlw,  VAbv,  VBlw,     O,  VPre, VMAbv,
-  /* 111D0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
-
-  /* Sinhala Archaic Numbers */
-
-  /* 111E0 */     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 111F0 */     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-
-  /* Khojki */
-
-  /* 11200 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11210 */     B,     B,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11220 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPst,  VPst,  VPst,  VBlw,
-  /* 11230 */  VAbv,  VAbv,  VAbv,  VAbv, VMAbv,     H, CMAbv, CMAbv,     O,     O,     O,     O,     O,     O, VMAbv,     O,
-
-#define use_offset_0x11280u 4248
-
-
-  /* Multani */
-
-  /* 11280 */     B,     B,     B,     B,     B,     B,     B,     O,     B,     O,     B,     B,     B,     B,     O,     B,
-  /* 11290 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,
-  /* 112A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,     O,
-
-  /* Khudawadi */
-
-  /* 112B0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 112C0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 112D0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B, VMAbv,
-  /* 112E0 */  VPst,  VPre,  VPst,  VBlw,  VBlw,  VAbv,  VAbv,  VAbv,  VAbv, CMBlw,  VBlw,     O,     O,     O,     O,     O,
-  /* 112F0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
-
-  /* Grantha */
-
-  /* 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,
-  /* 11340 */  VAbv,  VPst,  VPst,  VPst,  VPst,     O,     O,  VPre,  VPre,     O,     O,  VPst,  VPst,   HVM,     O,     O,
-  /* 11350 */     O,     O,     O,     O,     O,     O,     O,  VPst,     O,     O,     O,     O,     O,     O,     B,     B,
-  /* 11360 */     B,     B,  VPst,  VPst,     O,     O, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv,     O,     O,     O,
-  /* 11370 */ VMAbv, VMAbv, VMAbv, VMAbv, VMAbv,     O,     O,     O,
-
-#define use_offset_0x11400u 4496
-
-
-  /* Newa */
-
-  /* 11400 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11410 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11420 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11430 */     B,     B,     B,     B,     B,  VPst,  VPre,  VPst,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VAbv,  VAbv,
-  /* 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, FMAbv,     B,
-  /* 11460 */    CS,    CS,     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,
-
-  /* Tirhuta */
-
-  /* 11480 */     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11490 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 114A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 114B0 */  VPst,  VPre,  VPst,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VPre,  VAbv,  VPst,  VPst,  VPst,  VPst, VMAbv,
-  /* 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
-
-
-  /* Siddham */
-
-  /* 11580 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11590 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 115A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPst,
-  /* 115B0 */  VPre,  VPst,  VBlw,  VBlw,  VBlw,  VBlw,     O,     O,  VPre,  VPst,  VPst,  VPst, VMAbv, VMAbv, VMPst,     H,
-  /* 115C0 */ CMBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* 115D0 */     O,     O,     O,     O,     O,     O,     O,     O,     B,     B,     B,     B,  VBlw,  VBlw,     O,     O,
-  /* 115E0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* 115F0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-
-  /* Modi */
-
-  /* 11600 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11610 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11620 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11630 */  VPst,  VPst,  VPst,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VAbv,  VAbv,  VPst,  VPst, VMAbv, VMPst,     H,
-  /* 11640 */  VAbv,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* 11650 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
-  /* 11660 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* 11670 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-
-  /* Takri */
-
-  /* 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,     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,
-  /* 116F0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-
-  /* Ahom */
-
-  /* 11700 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11710 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,  MBlw,  MPre,  MAbv,
-  /* 11720 */  VPst,  VPst,  VAbv,  VAbv,  VBlw,  VBlw,  VPre,  VAbv,  VBlw,  VAbv,  VAbv,  VAbv,     O,     O,     O,     O,
-  /* 11730 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,
-
-#define use_offset_0x11800u 5168
-
-
-  /* Dogra */
-
-  /* 11800 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11810 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 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_0x11900u 5232
-
-
-  /* Dives Akuru */
-
-  /* 11900 */     B,     B,     B,     B,     B,     B,     B,     O,     O,     B,     O,     O,     B,     B,     B,     B,
-  /* 11910 */     B,     B,     B,     B,     O,     B,     B,     O,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11920 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11930 */  VPst,  VPst,  VPst,  VPst,  VPst,  VPre,     O,  VPre,  VPst,     O,     O, VMAbv, VMAbv,  VPst,     H,     R,
-  /* 11940 */  MPst,     R,  MBlw, CMBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* 11950 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
-
-#define use_offset_0x119a0u 5328
-
-
-  /* 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,
-  /* 11A10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11A20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11A30 */     B,     B,     B, FMBlw,  VBlw, VMAbv, VMAbv, VMAbv, VMAbv, VMPst,     R,  MBlw,  MBlw,  MBlw,  MBlw,    GB,
-  /* 11A40 */     O,     O,     O,     O,     O,    GB,     O,     H,     O,     O,     O,     O,     O,     O,     O,     O,
-
-  /* Soyombo */
-
-  /* 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,     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 5584
-
-
-  /* Bhaiksuki */
-
-  /* 11C00 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,
-  /* 11C10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11C20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPst,
-  /* 11C30 */  VAbv,  VAbv,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,     O,  VAbv,  VAbv,  VAbv,  VAbv, VMAbv, VMAbv, VMPst,     H,
-  /* 11C40 */     B,     O,     O,     O,    GB,    GB,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* 11C50 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11C60 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,
-
-  /* Marchen */
-
-  /* 11C70 */     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11C80 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11C90 */     O,     O,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,
-  /* 11CA0 */   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,     O,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,
-  /* 11CB0 */  VBlw,  VPre,  VBlw,  VAbv,  VPst, VMAbv, VMAbv,     O,
-
-#define use_offset_0x11d00u 5768
-
-
-  /* Masaram Gondi */
-
-  /* 11D00 */     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     O,     B,     B,     B,     B,     B,
-  /* 11D10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11D20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11D30 */     B,  VAbv,  VAbv,  VAbv,  VAbv,  VAbv,  VBlw,     O,     O,     O,  VAbv,     O,  VAbv,  VAbv,     O,  VAbv,
-  /* 11D40 */ VMAbv, VMAbv, CMBlw,  VAbv,  VBlw,     H,     R,  MBlw,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* 11D50 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
-
-  /* Gunjala Gondi */
-
-  /* 11D60 */     B,     B,     B,     B,     B,     B,     O,     B,     B,     O,     B,     B,     B,     B,     B,     B,
-  /* 11D70 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11D80 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPst,  VPst,  VPst,  VPst,  VPst,     O,
-  /* 11D90 */  VAbv,  VAbv,     O,  VPst,  VPst, VMAbv, VMPst,     H,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* 11DA0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
-
-#define use_offset_0x11ee0u 5944
-
-
-  /* Makasar */
-
-  /* 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: 5968; occupancy: 74% */
-
-USE_TABLE_ELEMENT_TYPE
-hb_use_get_category (hb_codepoint_t u)
-{
-  switch (u >> 12)
-  {
-    case 0x0u:
-      if (hb_in_range<hb_codepoint_t> (u, 0x0028u, 0x003Fu)) return use_table[u - 0x0028u + use_offset_0x0028u];
-      if (hb_in_range<hb_codepoint_t> (u, 0x00A0u, 0x00D7u)) return use_table[u - 0x00A0u + use_offset_0x00a0u];
-      if (hb_in_range<hb_codepoint_t> (u, 0x0348u, 0x034Fu)) return use_table[u - 0x0348u + use_offset_0x0348u];
-      if (hb_in_range<hb_codepoint_t> (u, 0x0900u, 0x0DF7u)) return use_table[u - 0x0900u + use_offset_0x0900u];
-      if (hb_in_range<hb_codepoint_t> (u, 0x0F18u, 0x0FC7u)) return use_table[u - 0x0F18u + use_offset_0x0f18u];
-      break;
-
-    case 0x1u:
-      if (hb_in_range<hb_codepoint_t> (u, 0x1000u, 0x109Fu)) return use_table[u - 0x1000u + use_offset_0x1000u];
-      if (hb_in_range<hb_codepoint_t> (u, 0x1700u, 0x17EFu)) return use_table[u - 0x1700u + use_offset_0x1700u];
-      if (hb_in_range<hb_codepoint_t> (u, 0x1900u, 0x1A9Fu)) return use_table[u - 0x1900u + use_offset_0x1900u];
-      if (hb_in_range<hb_codepoint_t> (u, 0x1B00u, 0x1C4Fu)) return use_table[u - 0x1B00u + use_offset_0x1b00u];
-      if (hb_in_range<hb_codepoint_t> (u, 0x1CD0u, 0x1CFFu)) return use_table[u - 0x1CD0u + use_offset_0x1cd0u];
-      if (hb_in_range<hb_codepoint_t> (u, 0x1DF8u, 0x1DFFu)) return use_table[u - 0x1DF8u + use_offset_0x1df8u];
-      break;
-
-    case 0x2u:
-      if (hb_in_range<hb_codepoint_t> (u, 0x2008u, 0x2017u)) return use_table[u - 0x2008u + use_offset_0x2008u];
-      if (hb_in_range<hb_codepoint_t> (u, 0x2060u, 0x2087u)) return use_table[u - 0x2060u + use_offset_0x2060u];
-      if (hb_in_range<hb_codepoint_t> (u, 0x20F0u, 0x20F7u)) return use_table[u - 0x20F0u + use_offset_0x20f0u];
-      if (hb_in_range<hb_codepoint_t> (u, 0x25C8u, 0x25CFu)) return use_table[u - 0x25C8u + use_offset_0x25c8u];
-      break;
-
-    case 0xAu:
-      if (hb_in_range<hb_codepoint_t> (u, 0xA800u, 0xAAF7u)) return use_table[u - 0xA800u + use_offset_0xa800u];
-      if (hb_in_range<hb_codepoint_t> (u, 0xABC0u, 0xABFFu)) return use_table[u - 0xABC0u + use_offset_0xabc0u];
-      break;
-
-    case 0xFu:
-      if (hb_in_range<hb_codepoint_t> (u, 0xFE00u, 0xFE0Fu)) return use_table[u - 0xFE00u + use_offset_0xfe00u];
-      break;
-
-    case 0x10u:
-      if (hb_in_range<hb_codepoint_t> (u, 0x10A00u, 0x10A4Fu)) return use_table[u - 0x10A00u + use_offset_0x10a00u];
-      break;
-
-    case 0x11u:
-      if (hb_in_range<hb_codepoint_t> (u, 0x11000u, 0x110BFu)) return use_table[u - 0x11000u + use_offset_0x11000u];
-      if (hb_in_range<hb_codepoint_t> (u, 0x11100u, 0x1123Fu)) return use_table[u - 0x11100u + use_offset_0x11100u];
-      if (hb_in_range<hb_codepoint_t> (u, 0x11280u, 0x11377u)) return use_table[u - 0x11280u + use_offset_0x11280u];
-      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, 0x11900u, 0x1195Fu)) return use_table[u - 0x11900u + use_offset_0x11900u];
-      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];
-      break;
-
-    default:
-      break;
-  }
-  return USE_O;
-}
-
-#undef B
-#undef CGJ
-#undef CS
-#undef GB
-#undef H
-#undef HN
-#undef HVM
-#undef IND
-#undef N
-#undef O
-#undef R
-#undef Rsv
-#undef S
-#undef SUB
-#undef Sk
-#undef VS
-#undef WJ
-#undef ZWJ
-#undef ZWNJ
-#undef CMAbv
-#undef CMBlw
-#undef FAbv
-#undef FBlw
-#undef FPst
-#undef FMAbv
-#undef FMBlw
-#undef FMPst
-#undef MAbv
-#undef MBlw
-#undef MPst
-#undef MPre
-#undef SMAbv
-#undef SMBlw
-#undef VAbv
-#undef VBlw
-#undef VPst
-#undef VPre
-#undef VMAbv
-#undef VMBlw
-#undef VMPst
-#undef VMPre
-
-
-#endif
-/* == End of generated table == */
diff --git a/src/hb-ot-shape-complex-use-table.hh b/src/hb-ot-shape-complex-use-table.hh
new file mode 100644 (file)
index 0000000..7a3a995
--- /dev/null
@@ -0,0 +1,1283 @@
+/* == Start of generated table == */
+/*
+ * The following table is generated by running:
+ *
+ *   ./gen-use-table.py IndicSyllabicCategory.txt IndicPositionalCategory.txt ArabicShaping.txt DerivedCoreProperties.txt UnicodeData.txt Blocks.txt Scripts.txt IndicSyllabicCategory-Additional.txt IndicPositionalCategory-Additional.txt
+ *
+ * on files with these headers:
+ *
+ * # IndicSyllabicCategory-14.0.0.txt
+ * # Date: 2021-05-22, 01:01:00 GMT [KW, RP]
+ * # IndicPositionalCategory-14.0.0.txt
+ * # Date: 2021-05-22, 01:01:00 GMT [KW, RP]
+ * # ArabicShaping-14.0.0.txt
+ * # Date: 2021-05-21, 01:54:00 GMT [KW, RP]
+ * # DerivedCoreProperties-14.0.0.txt
+ * # Date: 2021-08-12, 23:12:53 GMT
+ * # Blocks-14.0.0.txt
+ * # Date: 2021-01-22, 23:29:00 GMT [KW]
+ * # Scripts-14.0.0.txt
+ * # Date: 2021-07-10, 00:35:31 GMT
+ * # Override values For Indic_Syllabic_Category
+ * # Not derivable
+ * # Initial version based on Unicode 7.0 by Andrew Glass 2014-03-17
+ * # Updated for Unicode 10.0 by Andrew Glass 2017-07-25
+ * # Updated for Unicode 12.1 by Andrew Glass 2019-05-24
+ * # Updated for Unicode 13.0 by Andrew Glass 2020-07-28
+ * # Updated for Unicode 14.0 by Andrew Glass 2021-09-25
+ * # Override values For Indic_Positional_Category
+ * # Not derivable
+ * # Initial version based on Unicode 7.0 by Andrew Glass 2014-03-17
+ * # Updated for Unicode 10.0 by Andrew Glass 2017-07-25
+ * # Ammended for Unicode 10.0 by Andrew Glass 2018-09-21
+ * # Updated for L2/19-083    by Andrew Glass 2019-05-06
+ * # Updated for Unicode 12.1 by Andrew Glass 2019-05-30
+ * # Updated for Unicode 13.0 by Andrew Glass 2020-07-28
+ * # Updated for Unicode 14.0 by Andrew Glass 2021-09-28
+ * UnicodeData.txt does not have a header.
+ */
+
+#ifndef HB_OT_SHAPE_COMPLEX_USE_TABLE_HH
+#define HB_OT_SHAPE_COMPLEX_USE_TABLE_HH
+
+#include "hb.hh"
+
+#include "hb-ot-shape-complex-use-machine.hh"
+
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wunused-macros"
+#define B      USE(B)  /* BASE */
+#define CGJ    USE(CGJ)        /* CGJ */
+#define CS     USE(CS) /* CONS_WITH_STACKER */
+#define G      USE(G)  /* HIEROGLYPH */
+#define GB     USE(GB) /* BASE_OTHER */
+#define H      USE(H)  /* HALANT */
+#define HN     USE(HN) /* HALANT_NUM */
+#define HVM    USE(HVM)        /* HALANT_OR_VOWEL_MODIFIER */
+#define J      USE(J)  /* HIEROGLYPH_JOINER */
+#define N      USE(N)  /* BASE_NUM */
+#define O      USE(O)  /* OTHER */
+#define R      USE(R)  /* REPHA */
+#define SB     USE(SB) /* HIEROGLYPH_SEGMENT_BEGIN */
+#define SE     USE(SE) /* HIEROGLYPH_SEGMENT_END */
+#define SUB    USE(SUB)        /* CONS_SUB */
+#define Sk     USE(Sk) /* SAKOT */
+#define ZWNJ   USE(ZWNJ)       /* ZWNJ */
+#define CMAbv  USE(CMAbv)
+#define CMBlw  USE(CMBlw)
+#define FAbv   USE(FAbv)
+#define FBlw   USE(FBlw)
+#define FPst   USE(FPst)
+#define FMAbv  USE(FMAbv)
+#define FMBlw  USE(FMBlw)
+#define FMPst  USE(FMPst)
+#define MAbv   USE(MAbv)
+#define MBlw   USE(MBlw)
+#define MPst   USE(MPst)
+#define MPre   USE(MPre)
+#define SMAbv  USE(SMAbv)
+#define SMBlw  USE(SMBlw)
+#define VAbv   USE(VAbv)
+#define VBlw   USE(VBlw)
+#define VPst   USE(VPst)
+#define VPre   USE(VPre)
+#define VMAbv  USE(VMAbv)
+#define VMBlw  USE(VMBlw)
+#define VMPst  USE(VMPst)
+#define VMPre  USE(VMPre)
+#pragma GCC diagnostic pop
+
+static const uint8_t use_table[] = {
+
+
+#define use_offset_0x0028u 0
+
+
+  /* Basic Latin */
+                                                                         O,     O,     O,     O,     O,    GB,     O,     O,
+  /* 0030 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
+
+#define use_offset_0x00a0u 24
+
+
+  /* Latin-1 Supplement */
+
+  /* 00A0 */    GB,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 00B0 */     O,     O, FMPst, FMPst,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 00C0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 00D0 */     O,     O,     O,     O,     O,     O,     O,    GB,
+
+#define use_offset_0x0348u 80
+
+
+  /* Combining Diacritical Marks */
+                                                                         O,     O,     O,     O,     O,     O,     O,   CGJ,
+
+#define use_offset_0x0640u 88
+
+
+  /* Arabic */
+
+  /* 0640 */     B,     O,     O,     O,     O,     O,     O,     O,
+
+#define use_offset_0x07c8u 96
+
+
+  /* NKo */
+                                                                         O,     O,     B,     B,     B,     B,     B,     B,
+  /* 07D0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 07E0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv,
+  /* 07F0 */ VMAbv, VMAbv, VMAbv, VMAbv,     O,     O,     O,     O,     O,     O,     B,     O,     O, VMAbv,     O,     O,
+
+#define use_offset_0x0840u 152
+
+
+  /* Mandaic */
+
+  /* 0840 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0850 */     B,     B,     B,     B,     B,     B,     B,     B,     B, CMBlw, CMBlw, CMBlw,     O,     O,     O,     O,
+
+#define use_offset_0x0900u 184
+
+
+  /* Devanagari */
+
+  /* 0900 */ VMAbv, VMAbv, VMAbv, VMPst,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0910 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0920 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0930 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VAbv,  VPst, CMBlw,     B,  VPst,  VPre,
+  /* 0940 */  VPst,  VBlw,  VBlw,  VBlw,  VBlw,  VAbv,  VAbv,  VAbv,  VAbv,  VPst,  VPst,  VPst,  VPst,     H,  VPre,  VPst,
+  /* 0950 */     O, VMAbv, VMBlw,     O,     O,  VAbv,  VBlw,  VBlw,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0960 */     B,     B,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0970 */     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+
+  /* Bengali */
+
+  /* 0980 */    GB, VMAbv, VMPst, VMPst,     O,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     B,
+  /* 0990 */     B,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 09A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,
+  /* 09B0 */     B,     O,     B,     O,     O,     O,     B,     B,     B,     B,     O,     O, CMBlw,     B,  VPst,  VPre,
+  /* 09C0 */  VPst,  VBlw,  VBlw,  VBlw,  VBlw,     O,     O,  VPre,  VPre,     O,     O,  VPre,  VPre,     H,     O,     O,
+  /* 09D0 */     O,     O,     O,     O,     O,     O,     O,  VPst,     O,     O,     O,     O,     B,     B,     O,     B,
+  /* 09E0 */     B,     B,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 09F0 */     B,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     B,     O, FMAbv,     O,
+
+  /* Gurmukhi */
+
+  /* 0A00 */     O, VMAbv, VMAbv, VMPst,     O,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     B,
+  /* 0A10 */     B,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0A20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,
+  /* 0A30 */     B,     O,     B,     B,     O,     B,     B,     O,     B,     B,     O,     O, CMBlw,     O,  VPst,  VPre,
+  /* 0A40 */  VPst,  VBlw,  VBlw,     O,     O,     O,     O,  VAbv,  VAbv,     O,     O,  VAbv,  VAbv,     H,     O,     O,
+  /* 0A50 */     O, VMBlw,     O,     O,     O,     O,     O,     O,     O,     B,     B,     B,     B,     O,     B,     O,
+  /* 0A60 */     O,     O,     O,     O,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0A70 */ VMAbv, CMAbv,    GB,    GB,     O,  MBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Gujarati */
+
+  /* 0A80 */     O, VMAbv, VMAbv, VMPst,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,
+  /* 0A90 */     B,     B,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0AA0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,
+  /* 0AB0 */     B,     O,     B,     B,     O,     B,     B,     B,     B,     B,     O,     O, CMBlw,     B,  VPst,  VPre,
+  /* 0AC0 */  VPst,  VBlw,  VBlw,  VBlw,  VBlw,  VAbv,     O,  VAbv,  VAbv,  VAbv,     O,  VPst,  VPst,     H,     O,     O,
+  /* 0AD0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 0AE0 */     B,     B,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0AF0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     B, VMAbv, VMAbv, VMAbv, CMAbv, CMAbv, CMAbv,
+
+  /* Oriya */
+
+  /* 0B00 */     O, VMAbv, VMPst, VMPst,     O,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     B,
+  /* 0B10 */     B,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0B20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,
+  /* 0B30 */     B,     O,     B,     B,     O,     B,     B,     B,     B,     B,     O,     O, CMBlw,     B,  VPst,  VAbv,
+  /* 0B40 */  VPst,  VBlw,  VBlw,  VBlw,  VBlw,     O,     O,  VPre,  VPre,     O,     O,  VPre,  VPre,     H,     O,     O,
+  /* 0B50 */     O,     O,     O,     O,     O,  VAbv,  VAbv,  VAbv,     O,     O,     O,     O,     B,     B,     O,     B,
+  /* 0B60 */     B,     B,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0B70 */     O,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Tamil */
+
+  /* 0B80 */     O,     O, VMAbv,     O,     O,     B,     B,     B,     B,     B,     B,     O,     O,     O,     B,     B,
+  /* 0B90 */     B,     O,     B,     B,     B,     B,     O,     O,     O,     B,     B,     O,     B,     O,     B,     B,
+  /* 0BA0 */     O,     O,     O,     B,     B,     O,     O,     O,     B,     B,     B,     O,     O,     O,     B,     B,
+  /* 0BB0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,  VPst,  VPst,
+  /* 0BC0 */  VAbv,  VPst,  VPst,     O,     O,     O,  VPre,  VPre,  VPre,     O,  VPre,  VPre,  VPre,     H,     O,     O,
+  /* 0BD0 */     O,     O,     O,     O,     O,     O,     O,  VPst,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 0BE0 */     O,     O,     O,     O,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0BF0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Telugu */
+
+  /* 0C00 */ VMAbv, VMPst, VMPst, VMPst, VMAbv,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,
+  /* 0C10 */     B,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0C20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,
+  /* 0C30 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O, CMBlw,     B,  VAbv,  VAbv,
+  /* 0C40 */  VAbv,  VPst,  VPst,  VPst,  VPst,     O,  VAbv,  VAbv,  VAbv,     O,  VAbv,  VAbv,  VAbv,     H,     O,     O,
+  /* 0C50 */     O,     O,     O,     O,     O,  VAbv,  VBlw,     O,     B,     B,     B,     O,     O,     O,     O,     O,
+  /* 0C60 */     B,     B,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0C70 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Kannada */
+
+  /* 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,
+  /* 0CC0 */  VAbv,  VPst,  VPst,  VPst,  VPst,     O,  VAbv,  VAbv,  VAbv,     O,  VAbv,  VAbv,  VAbv,     H,     O,     O,
+  /* 0CD0 */     O,     O,     O,     O,     O,  VPst,  VPst,     O,     O,     O,     O,     O,     O,     O,     B,     O,
+  /* 0CE0 */     B,     B,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0CF0 */     O,    CS,    CS,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Malayalam */
+
+  /* 0D00 */ VMAbv, VMAbv, VMPst, VMPst,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,
+  /* 0D10 */     B,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0D20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0D30 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VAbv,  VAbv,     B,  VPst,  VPst,
+  /* 0D40 */  VPst,  VPst,  VPst,  VBlw,  VBlw,     O,  VPre,  VPre,  VPre,     O,  VPre,  VPre,  VPre,     H,     R,     O,
+  /* 0D50 */     O,     O,     O,     O,     O,     O,     O,  VPst,     O,     O,     O,     O,     O,     O,     O,     B,
+  /* 0D60 */     B,     B,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0D70 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Sinhala */
+
+  /* 0D80 */     O, VMAbv, VMPst, VMPst,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0D90 */     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     B,     B,     B,     B,     B,     B,
+  /* 0DA0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0DB0 */     B,     B,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     O,     O,
+  /* 0DC0 */     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     H,     O,     O,     O,     O,  VPst,
+  /* 0DD0 */  VPst,  VPst,  VAbv,  VAbv,  VBlw,     O,  VBlw,     O,  VPst,  VPre,  VPre,  VPre,  VPre,  VPre,  VPre,  VPst,
+  /* 0DE0 */     O,     O,     O,     O,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0DF0 */     O,     O,  VPst,  VPst,     O,     O,     O,     O,
+
+#define use_offset_0x0f00u 1456
+
+
+  /* Tibetan */
+
+  /* 0F00 */     B,     B,     O,     O,     B,     B,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 0F10 */     O,     O,     O,     O,     O,     O,     O,     O,  VBlw,  VBlw,     O,     O,     O,     O,     O,     O,
+  /* 0F20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0F30 */     B,     B,     B,     B,     O,  FBlw,     O,  FBlw,     O, CMAbv,     O,     O,     O,     O,  VPst,  VPre,
+  /* 0F40 */     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,     B,
+  /* 0F50 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0F60 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,
+  /* 0F70 */     O, CMBlw,  VBlw,  VAbv,  VAbv,  VBlw,  VAbv,  VAbv,  VAbv,  VAbv,  VBlw,  VBlw,  VBlw,  VBlw, VMAbv,     O,
+  /* 0F80 */  VBlw,  VAbv, VMAbv, VMAbv,  VBlw,     O, VMAbv, VMAbv,     B,     B,     B,     B,     B,   SUB,   SUB,   SUB,
+  /* 0F90 */   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,     O,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,
+  /* 0FA0 */   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,
+  /* 0FB0 */   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,     O,     O,     O,
+  /* 0FC0 */     O,     O,     O,     O,     O,     O,  FBlw,     O,
+
+#define use_offset_0x1000u 1656
+
+
+  /* Myanmar */
+
+  /* 1000 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1010 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1020 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPst,  VPst,  VAbv,  VAbv,  VBlw,
+  /* 1030 */  VBlw,  VPre,  VAbv,  VAbv,  VAbv,  VAbv, VMAbv, VMBlw, VMPst,     H,  VAbv,  MPst,  MPre,  MBlw,  MBlw,     B,
+  /* 1040 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,    GB,     O,     O,    GB,     O,
+  /* 1050 */     B,     B,     B,     B,     B,     B,  VPst,  VPst,  VBlw,  VBlw,     B,     B,     B,     B,  MBlw,  MBlw,
+  /* 1060 */  MBlw,     B,  VPst, VMPst, VMPst,     B,     B,  VPst,  VPst, VMPst, VMPst, VMPst, VMPst, VMPst,     B,     B,
+  /* 1070 */     B,  VAbv,  VAbv,  VAbv,  VAbv,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1080 */     B,     B,  MBlw,  VPst,  VPre,  VAbv,  VAbv, VMPst, VMPst, VMPst, VMPst, VMPst, VMPst, VMBlw,     B, VMPst,
+  /* 1090 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B, VMPst, VMPst,  VPst,  VAbv,     O,     O,
+
+#define use_offset_0x1700u 1816
+
+
+  /* Tagalog */
+
+  /* 1700 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1710 */     B,     B,  VAbv,  VBlw,  VBlw,  VPst,     O,     O,     O,     O,     O,     O,     O,     O,     O,     B,
+
+  /* Hanunoo */
+
+  /* 1720 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1730 */     B,     B,  VAbv,  VBlw,  VPst,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Buhid */
+
+  /* 1740 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1750 */     B,     B,  VAbv,  VBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Tagbanwa */
+
+  /* 1760 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,
+  /* 1770 */     B,     O,  VAbv,  VBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Khmer */
+
+  /* 1780 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1790 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 17A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 17B0 */     B,     B,     B,     B,   CGJ,   CGJ,  VPst,  VAbv,  VAbv,  VAbv,  VAbv,  VBlw,  VBlw,  VBlw,  VPre,  VPre,
+  /* 17C0 */  VPre,  VPre,  VPre,  VPre,  VPre,  VPre, VMAbv, VMPst,  VPst, VMAbv, VMAbv, FMAbv,  FAbv, CMAbv, FMAbv, VMAbv,
+  /* 17D0 */ FMAbv,  VAbv,     H, FMAbv,     O,     O,     O,     O,     O,     O,     O,     O,     B, FMAbv,     O,     O,
+  /* 17E0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
+  /* 17F0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Mongolian */
+
+  /* 1800 */     B,     O,     O,     O,     O,     O,     O,     B,     O,     O,     B,   CGJ,   CGJ,   CGJ,     O,   CGJ,
+  /* 1810 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 1820 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1830 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1840 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1850 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1860 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1870 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,     O,
+  /* 1880 */    GB,    GB,    GB,    GB,    GB, CMAbv, CMAbv,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1890 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B, CMBlw,     B,     O,     O,     O,     O,     O,
+
+#define use_offset_0x1900u 2248
+
+
+  /* Limbu */
+
+  /* 1900 */    GB,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1910 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,
+  /* 1920 */  VAbv,  VAbv,  VBlw,  VPst,  VPst,  VAbv,  VAbv,  VAbv,  VAbv,   SUB,   SUB,   SUB,     O,     O,     O,     O,
+  /* 1930 */  FPst,  FPst, VMBlw,  FPst,  FPst,  FPst,  FPst,  FPst,  FPst,  FBlw, VMAbv, FMBlw,     O,     O,     O,     O,
+  /* 1940 */     O,     O,     O,     O,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+
+  /* Tai Le */
+
+  /* 1950 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1960 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,
+  /* 1970 */     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* New Tai Lue */
+
+  /* 1980 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1990 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 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,     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,
+
+  /* Buginese */
+
+  /* 1A00 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1A10 */     B,     B,     B,     B,     B,     B,     B,  VAbv,  VAbv,  VPre,  VPst,  VAbv,     O,     O,     O,     O,
+
+  /* Tai Tham */
+
+  /* 1A20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1A30 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1A40 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1A50 */     B,     B,     B,     B,     B,  MPre,  MBlw,   SUB,  FAbv,  FAbv,  MAbv,   SUB,   SUB,   SUB,   SUB,     O,
+  /* 1A60 */    Sk,  VPst,  VAbv,  VPst,  VPst,  VAbv,  VAbv,  VAbv,  VAbv,  VBlw,  VBlw,  VAbv,  VBlw,  VPst,  VPre,  VPre,
+  /* 1A70 */  VPre,  VPre,  VPre,  VAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv,  VAbv, VMAbv, VMAbv,     O,     O, VMBlw,
+  /* 1A80 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
+  /* 1A90 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
+
+#define use_offset_0x1b00u 2664
+
+
+  /* Balinese */
+
+  /* 1B00 */ VMAbv, VMAbv, VMAbv,  FAbv, VMPst,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1B10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1B20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1B30 */     B,     B,     B,     B, CMAbv,  VPst,  VAbv,  VAbv,  VBlw,  VBlw,  VBlw,  VBlw,  VAbv,  VAbv,  VPre,  VPre,
+  /* 1B40 */  VPre,  VPre,  VAbv,  VAbv,     H,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,
+  /* 1B50 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,    GB,    GB,     O,     O,    GB,
+  /* 1B60 */     O,     O,    GB,     O,     O,     O,     O,     O,    GB,     O,     O, SMAbv, SMBlw, SMAbv, SMAbv, SMAbv,
+  /* 1B70 */ SMAbv, SMAbv, SMAbv, SMAbv,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Sundanese */
+
+  /* 1B80 */ VMAbv,  FAbv, VMPst,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1B90 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1BA0 */     B,   SUB,   SUB,   SUB,  VAbv,  VBlw,  VPre,  VPst,  VAbv,  VAbv,  VPst,     H,   SUB,   SUB,     B,     B,
+  /* 1BB0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+
+  /* Batak */
+
+  /* 1BC0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1BD0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1BE0 */     B,     B,     B,     B,     B,     B, CMAbv,  VPst,  VAbv,  VAbv,  VPst,  VPst,  VPst,  VAbv,  VPst,  VAbv,
+  /* 1BF0 */  FAbv,  FAbv, CMBlw, CMBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Lepcha */
+
+  /* 1C00 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1C10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1C20 */     B,     B,     B,     B,   SUB,   SUB,  VPst,  VPre,  VPre,  VPre,  VPst,  VPst,  VBlw,  FAbv,  FAbv,  FAbv,
+  /* 1C30 */  FAbv,  FAbv,  FAbv,  FAbv, VMPre, VMPre, FMAbv, CMBlw,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 1C40 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     B,     B,     B,
+
+#define use_offset_0x1cd0u 3000
+
+
+  /* Vedic Extensions */
+
+  /* 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,     O,     O, VMAbv,    CS,    CS, VMPst, VMAbv, VMAbv,    GB,     O,     O,     O,     O,     O,
+
+#define use_offset_0x1df8u 3048
+
+
+  /* Combining Diacritical Marks Supplement */
+                                                                         O,     O,     O, FMAbv,     O,     O,     O,     O,
+
+#define use_offset_0x2008u 3056
+
+
+  /* General Punctuation */
+                                                                         O,     O,     O,     O,  ZWNJ,   CGJ,     O,     O,
+  /* 2010 */    GB,    GB,    GB,    GB,    GB,     O,     O,     O,
+
+#define use_offset_0x2070u 3072
+
+
+  /* Superscripts and Subscripts */
+
+  /* 2070 */     O,     O,     O,     O, FMPst,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 2080 */     O,     O, FMPst, FMPst, FMPst,     O,     O,     O,
+
+#define use_offset_0x20f0u 3096
+
+
+  /* Combining Diacritical Marks for Symbols */
+
+  /* 20F0 */ VMAbv,     O,     O,     O,     O,     O,     O,     O,
+
+#define use_offset_0x25c8u 3104
+
+
+  /* Geometric Shapes */
+                                                                         O,     O,     O,     O,     B,     O,     O,     O,
+
+#define use_offset_0x2d30u 3112
+
+
+  /* Tifinagh */
+
+  /* 2D30 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 2D40 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 2D50 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 2D60 */     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,     O,     B,
+  /* 2D70 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     H,
+
+#define use_offset_0xa800u 3192
+
+
+  /* Syloti Nagri */
+
+  /* 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,  VBlw,     O,     O,     O,
+  /* A830 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Phags-pa */
+
+  /* A840 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* A850 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* A860 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* A870 */     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Saurashtra */
+
+  /* A880 */ VMPst, VMPst,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* A890 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* A8A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* A8B0 */     B,     B,     B,     B,  MPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,
+  /* A8C0 */  VPst,  VPst,  VPst,  VPst,     H, VMAbv,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* A8D0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
+
+  /* Devanagari Extended */
+
+  /* A8E0 */ VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv,
+  /* A8F0 */ VMAbv, VMAbv,     B,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     B,  VAbv,
+
+  /* Kayah Li */
+
+  /* A900 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* A910 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* A920 */     B,     B,     B,     B,     B,     B,  VAbv,  VAbv,  VAbv,  VAbv,  VAbv, VMBlw, VMBlw, VMBlw,     O,     O,
+
+  /* Rejang */
+
+  /* A930 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* A940 */     B,     B,     B,     B,     B,     B,     B,  VBlw,  VBlw,  VBlw,  VAbv,  VBlw,  VBlw,  VBlw,  VBlw,  FAbv,
+  /* A950 */  FAbv,  FAbv,  FPst,  VPst,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* A960 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* A970 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Javanese */
+
+  /* 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,  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,
+
+  /* Myanmar Extended-B */
+
+  /* A9E0 */     B,     B,     B,     B,     B,  VAbv,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* A9F0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,
+
+  /* Cham */
+
+  /* AA00 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* AA10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* AA20 */     B,     B,     B,     B,     B,     B,     B,     B,     B, VMAbv,  VAbv,  VAbv,  VAbv,  VBlw,  VAbv,  VPre,
+  /* AA30 */  VPre,  VAbv,  VBlw,  MPst,  MPre,  MAbv,  MBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* AA40 */     B,     B,     B,  FAbv,     B,     B,     B,     B,     B,     B,     B,     B,  FAbv,  FPst,     O,     O,
+  /* AA50 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
+
+  /* Myanmar Extended-A */
+
+  /* AA60 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* AA70 */     O,     B,     B,     B,    GB,    GB,    GB,     O,     O,     O,     B, VMPst, VMAbv, VMPst,     B,     B,
+
+  /* Tai Viet */
+
+  /* AA80 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* AA90 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* AAA0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* AAB0 */  VAbv,     B,  VAbv,  VAbv,  VBlw,     B,     B,  VAbv,  VAbv,     B,     B,     B,     B,     B,  VAbv, VMAbv,
+  /* AAC0 */     B, VMAbv,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* AAD0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Meetei Mayek Extensions */
+
+  /* AAE0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPre,  VBlw,  VAbv,  VPre,  VPst,
+  /* AAF0 */     O,     O,     O,     O,     O, VMPst,     H,     O,
+
+#define use_offset_0xabc0u 3952
+
+
+  /* Meetei Mayek */
+
+  /* ABC0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* ABD0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* ABE0 */     B,     B,     B,  VPst,  VPst,  VAbv,  VPst,  VPst,  VBlw,  VPst,  VPst,     O, VMPst,  VBlw,     O,     O,
+  /* ABF0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
+
+#define use_offset_0xfe00u 4016
+
+
+  /* Variation Selectors */
+
+  /* FE00 */   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,
+
+#define use_offset_0x10570u 4032
+
+
+  /* Vithkuqi */
+
+  /* 10570 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,
+  /* 10580 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,
+  /* 10590 */     B,     B,     B,     O,     B,     B,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 105A0 */     B,     B,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 105B0 */     B,     B,     O,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     O,     O,     O,
+
+#define use_offset_0x10a00u 4112
+
+
+  /* Kharoshthi */
+
+  /* 10A00 */     B,  VBlw,  VBlw,  VBlw,     O,  VAbv,  VBlw,     O,     O,     O,     O,     O,  VPst, VMBlw, VMBlw, VMAbv,
+  /* 10A10 */     B,     B,     B,     B,     O,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,     B,
+  /* 10A20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 10A30 */     B,     B,     B,     B,     B,     B,     O,     O, CMAbv, CMBlw, CMBlw,     O,     O,     O,     O,     H,
+  /* 10A40 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,     O,
+
+#define use_offset_0x10ac0u 4192
+
+
+  /* Manichaean */
+
+  /* 10AC0 */     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,     B,
+  /* 10AD0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 10AE0 */     B,     B,     B,     B,     B, CMBlw, CMBlw,     O,     O,     O,     O,     B,     B,     B,     B,     B,
+
+#define use_offset_0x10b80u 4240
+
+
+  /* Psalter Pahlavi */
+
+  /* 10B80 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 10B90 */     B,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 10BA0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     B,     B,     B,     B,     B,     B,     O,
+
+#define use_offset_0x10d00u 4288
+
+
+  /* Hanifi Rohingya */
+
+  /* 10D00 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 10D10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 10D20 */     B,     B,     B,     B, VMAbv, VMAbv, VMAbv, CMAbv,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 10D30 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
+
+#define use_offset_0x10e80u 4352
+
+
+  /* Yezidi */
+
+  /* 10E80 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 10E90 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 10EA0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,  VAbv,  VAbv,     O,     O,     O,
+  /* 10EB0 */     B,     B,     O,     O,     O,     O,     O,     O,
+
+#define use_offset_0x10f30u 4408
+
+
+  /* Sogdian */
+
+  /* 10F30 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 10F40 */     B,     B,     B,     B,     B,     B, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw,
+  /* 10F50 */ VMBlw,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 10F60 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Old Uyghur */
+
+  /* 10F70 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 10F80 */     B,     B, CMBlw, CMBlw, CMBlw, CMBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 10F90 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 10FA0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Chorasmian */
+
+  /* 10FB0 */     B,     O,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 10FC0 */     O,     B,     B,     B,     B,     O,     O,     O,     O,     B,     B,     B,     O,     O,     O,     O,
+  /* 10FD0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 10FE0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 10FF0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Brahmi */
+
+  /* 11000 */ VMPst, VMAbv, VMPst,    CS,    CS,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11010 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11020 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11030 */     B,     B,     B,     B,     B,     B,     B,     B,  VAbv,  VAbv,  VAbv,  VAbv,  VBlw,  VBlw,  VBlw,  VBlw,
+  /* 11040 */  VBlw,  VBlw,  VAbv,  VAbv,  VAbv,  VAbv,     H,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 11050 */     O,     O,     N,     N,     N,     N,     N,     N,     N,     N,     N,     N,     N,     N,     N,     N,
+  /* 11060 */     N,     N,     N,     N,     N,     N,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11070 */  VAbv,     B,     B,  VAbv,  VAbv,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,    HN,
+
+  /* Kaithi */
+
+  /* 11080 */ VMAbv, VMAbv, VMPst,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11090 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 110A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 110B0 */  VPst,  VPre,  VPst,  VBlw,  VBlw,  VAbv,  VAbv,  VPst,  VPst,     H, CMBlw,     O,     O,     O,     O,     O,
+  /* 110C0 */     O,     O,  VBlw,     O,     O,     O,     O,     O,
+
+#define use_offset_0x11100u 4816
+
+
+  /* Chakma */
+
+  /* 11100 */ VMAbv, VMAbv, VMAbv,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11110 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11120 */     B,     B,     B,     B,     B,     B,     B,  VBlw,  VBlw,  VBlw,  VAbv,  VAbv,  VPre,  VBlw,  VAbv,  VAbv,
+  /* 11130 */  VBlw,  VAbv,  VAbv,     H, CMAbv,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11140 */     O,     O,     O,     O,     B,  VPst,  VPst,     B,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Mahajani */
+
+  /* 11150 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11160 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11170 */     B,     B,     B, CMBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Sharada */
+
+  /* 11180 */ VMAbv, VMAbv, VMPst,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11190 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 111A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 111B0 */     B,     B,     B,  VPst,  VPre,  VPst,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VAbv,  VAbv,  VAbv,  VAbv,
+  /* 111C0 */     H,     B,     R,     R,     O,     O,     O,     O,    GB, FMBlw, CMBlw,  VAbv,  VBlw,     O,  VPre, VMAbv,
+  /* 111D0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,
+
+  /* Sinhala Archaic Numbers */
+
+  /* 111E0 */     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 111F0 */     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Khojki */
+
+  /* 11200 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11210 */     B,     B,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11220 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPst,  VPst,  VPst,  VBlw,
+  /* 11230 */  VAbv,  VAbv,  VAbv,  VAbv, VMAbv,     H, CMAbv, CMAbv,     O,     O,     O,     O,     O,     O, VMAbv,     O,
+
+#define use_offset_0x11280u 5136
+
+
+  /* Multani */
+
+  /* 11280 */     B,     B,     B,     B,     B,     B,     B,     O,     B,     O,     B,     B,     B,     B,     O,     B,
+  /* 11290 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,
+  /* 112A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Khudawadi */
+
+  /* 112B0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 112C0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 112D0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B, VMAbv,
+  /* 112E0 */  VPst,  VPre,  VPst,  VBlw,  VBlw,  VAbv,  VAbv,  VAbv,  VAbv, CMBlw,  VBlw,     O,     O,     O,     O,     O,
+  /* 112F0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
+
+  /* Grantha */
+
+  /* 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,
+  /* 11340 */  VAbv,  VPst,  VPst,  VPst,  VPst,     O,     O,  VPre,  VPre,     O,     O,  VPre,  VPre,   HVM,     O,     O,
+  /* 11350 */     O,     O,     O,     O,     O,     O,     O,  VPst,     O,     O,     O,     O,     O,     O,     B,     B,
+  /* 11360 */     B,     B,  VPst,  VPst,     O,     O, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv,     O,     O,     O,
+  /* 11370 */ VMAbv, VMAbv, VMAbv, VMAbv, VMAbv,     O,     O,     O,
+
+#define use_offset_0x11400u 5384
+
+
+  /* Newa */
+
+  /* 11400 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11410 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11420 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11430 */     B,     B,     B,     B,     B,  VPst,  VPre,  VPst,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VAbv,  VAbv,
+  /* 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, FMAbv,     B,
+  /* 11460 */    CS,    CS,     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,
+
+  /* Tirhuta */
+
+  /* 11480 */     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11490 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 114A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 114B0 */  VPst,  VPre,  VPst,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VPre,  VAbv,  VPre,  VPre,  VPst,  VPre, VMAbv,
+  /* 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 5608
+
+
+  /* Siddham */
+
+  /* 11580 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11590 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 115A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPst,
+  /* 115B0 */  VPre,  VPst,  VBlw,  VBlw,  VBlw,  VBlw,     O,     O,  VPre,  VPre,  VPre,  VPre, VMAbv, VMAbv, VMPst,     H,
+  /* 115C0 */ CMBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 115D0 */     O,     O,     O,     O,     O,     O,     O,     O,     B,     B,     B,     B,  VBlw,  VBlw,     O,     O,
+  /* 115E0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 115F0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Modi */
+
+  /* 11600 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11610 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11620 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11630 */  VPst,  VPst,  VPst,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VAbv,  VAbv,  VPst,  VPst, VMAbv, VMPst,     H,
+  /* 11640 */  VAbv,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 11650 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
+  /* 11660 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 11670 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Takri */
+
+  /* 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,     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,
+  /* 116F0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Ahom */
+
+  /* 11700 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11710 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,  MBlw,  MPre,  MAbv,
+  /* 11720 */  VPst,  VPst,  VAbv,  VAbv,  VBlw,  VBlw,  VPre,  VAbv,  VBlw,  VAbv,  VAbv,  VAbv,     O,     O,     O,     O,
+  /* 11730 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,
+  /* 11740 */     B,     B,     B,     B,     B,     B,     B,     O,
+
+#define use_offset_0x11800u 6064
+
+
+  /* Dogra */
+
+  /* 11800 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11810 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 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_0x11900u 6128
+
+
+  /* Dives Akuru */
+
+  /* 11900 */     B,     B,     B,     B,     B,     B,     B,     O,     O,     B,     O,     O,     B,     B,     B,     B,
+  /* 11910 */     B,     B,     B,     B,     O,     B,     B,     O,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11920 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11930 */  VPst,  VPst,  VPst,  VPst,  VPst,  VPre,     O,  VPre,  VPre,     O,     O, VMAbv, VMAbv,  VPst,     H,     R,
+  /* 11940 */  MPst,     R,  MPst, CMBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 11950 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
+
+#define use_offset_0x119a0u 6224
+
+
+  /* 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,
+  /* 11A10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11A20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11A30 */     B,     B,     B, FMBlw,  VBlw, VMAbv, VMAbv, VMAbv, VMAbv, VMPst,     R,  MBlw,  MBlw,  MBlw,  MBlw,    GB,
+  /* 11A40 */     O,     O,     O,     O,     O,    GB,     O,     H,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Soyombo */
+
+  /* 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,     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 6480
+
+
+  /* Bhaiksuki */
+
+  /* 11C00 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,
+  /* 11C10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11C20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPst,
+  /* 11C30 */  VAbv,  VAbv,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,     O,  VAbv,  VAbv,  VAbv,  VAbv, VMAbv, VMAbv, VMPst,     H,
+  /* 11C40 */     B,     O,     O,     O,    GB,    GB,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 11C50 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11C60 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,
+
+  /* Marchen */
+
+  /* 11C70 */     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11C80 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11C90 */     O,     O,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,
+  /* 11CA0 */   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,     O,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,
+  /* 11CB0 */  VBlw,  VPre,  VBlw,  VAbv,  VPst, VMAbv, VMAbv,     O,
+
+#define use_offset_0x11d00u 6664
+
+
+  /* Masaram Gondi */
+
+  /* 11D00 */     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     O,     B,     B,     B,     B,     B,
+  /* 11D10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11D20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11D30 */     B,  VAbv,  VAbv,  VAbv,  VAbv,  VAbv,  VBlw,     O,     O,     O,  VAbv,     O,  VAbv,  VAbv,     O,  VAbv,
+  /* 11D40 */ VMAbv, VMAbv, CMBlw,  VAbv,  VBlw,     H,     R,  MBlw,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 11D50 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
+
+  /* Gunjala Gondi */
+
+  /* 11D60 */     B,     B,     B,     B,     B,     B,     O,     B,     B,     O,     B,     B,     B,     B,     B,     B,
+  /* 11D70 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11D80 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPst,  VPst,  VPst,  VPst,  VPst,     O,
+  /* 11D90 */  VAbv,  VAbv,     O,  VPst,  VPst, VMAbv, VMPst,     H,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 11DA0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
+
+#define use_offset_0x11ee0u 6840
+
+
+  /* Makasar */
+
+  /* 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,
+
+#define use_offset_0x13000u 6864
+
+
+  /* Egyptian Hieroglyphs */
+
+  /* 13000 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 13010 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 13020 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 13030 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 13040 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 13050 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 13060 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 13070 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 13080 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 13090 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 130A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 130B0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 130C0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 130D0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 130E0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 130F0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 13100 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 13110 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 13120 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 13130 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 13140 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 13150 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 13160 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 13170 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 13180 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 13190 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 131A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 131B0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 131C0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 131D0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 131E0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 131F0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 13200 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 13210 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 13220 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 13230 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 13240 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 13250 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 13260 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 13270 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 13280 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 13290 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 132A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 132B0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 132C0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 132D0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 132E0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 132F0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 13300 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 13310 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 13320 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 13330 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 13340 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 13350 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 13360 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 13370 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 13380 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 13390 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 133A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 133B0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 133C0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 133D0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 133E0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 133F0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 13400 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 13410 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 13420 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,
+
+  /* Egyptian Hieroglyph Format Controls */
+
+  /* 13430 */     H,     H,     H,     H,     H,     H,     H,     B,     B,     O,     O,     O,     O,     O,     O,     O,
+
+#define use_offset_0x16ac0u 7952
+
+
+  /* Tangsa */
+
+  /* 16AC0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
+  /* 16AD0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 16AE0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 16AF0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Pahawh Hmong */
+
+  /* 16B00 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 16B10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 16B20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 16B30 */ VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv,     O,
+
+#define use_offset_0x16f00u 8072
+
+
+  /* Miao */
+
+  /* 16F00 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 16F10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 16F20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 16F30 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 16F40 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O, CMBlw,
+  /* 16F50 */     O,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,
+  /* 16F60 */  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,
+  /* 16F70 */  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,
+  /* 16F80 */  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,     O,     O,     O,     O,     O,     O,     O, VMBlw,
+  /* 16F90 */ VMBlw, VMBlw, VMBlw,     O,     O,     O,     O,     O,
+
+#define use_offset_0x16fe0u 8224
+
+
+  /* Ideographic Symbols and Punctuation */
+
+  /* 16FE0 */     O,     O,     O,     O,     B,     O,     O,     O,
+
+#define use_offset_0x18b00u 8232
+
+
+  /* Khitan Small Script */
+
+  /* 18B00 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18B10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18B20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18B30 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18B40 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18B50 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18B60 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18B70 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18B80 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18B90 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18BA0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18BB0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18BC0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18BD0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18BE0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18BF0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18C00 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18C10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18C20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18C30 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18C40 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18C50 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18C60 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18C70 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18C80 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18C90 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18CA0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18CB0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18CC0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18CD0 */     B,     B,     B,     B,     B,     B,     O,     O,
+
+#define use_offset_0x1bc00u 8704
+
+
+  /* Duployan */
+
+  /* 1BC00 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1BC10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1BC20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1BC30 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1BC40 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1BC50 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1BC60 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,
+  /* 1BC70 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,
+  /* 1BC80 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,     O,
+  /* 1BC90 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O, CMBlw, CMBlw,     O,
+
+#define use_offset_0x1e100u 8864
+
+
+  /* Nyiakeng Puachue Hmong */
+
+  /* 1E100 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1E110 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1E120 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,
+  /* 1E130 */ VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv,     B,     B,     B,     B,     B,     B,     B,     O,     O,
+  /* 1E140 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     B,     B,
+
+#define use_offset_0x1e290u 8944
+
+
+  /* Toto */
+
+  /* 1E290 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1E2A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B, VMAbv,     O,
+  /* 1E2B0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Wancho */
+
+  /* 1E2C0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1E2D0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1E2E0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B, VMAbv, VMAbv, VMAbv, VMAbv,
+  /* 1E2F0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
+
+#define use_offset_0x1e900u 9056
+
+
+  /* Adlam */
+
+  /* 1E900 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1E910 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1E920 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1E930 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1E940 */     B,     B,     B,     B, CMAbv, CMAbv, CMAbv, CMAbv, CMAbv, CMAbv, CMAbv,     B,     O,     O,     O,     O,
+  /* 1E950 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
+
+#define use_offset_0xe0100u 9152
+
+
+  /* Variation Selectors Supplement */
+
+  /* E0100 */   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,
+  /* E0110 */   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,
+  /* E0120 */   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,
+  /* E0130 */   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,
+  /* E0140 */   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,
+  /* E0150 */   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,
+  /* E0160 */   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,
+  /* E0170 */   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,
+  /* E0180 */   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,
+  /* E0190 */   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,
+  /* E01A0 */   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,
+  /* E01B0 */   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,
+  /* E01C0 */   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,
+  /* E01D0 */   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,
+  /* E01E0 */   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,   CGJ,
+
+}; /* Table items: 9392; occupancy: 79% */
+
+static inline uint8_t
+hb_use_get_category (hb_codepoint_t u)
+{
+  switch (u >> 12)
+  {
+    case 0x0u:
+      if (hb_in_range<hb_codepoint_t> (u, 0x0028u, 0x003Fu)) return use_table[u - 0x0028u + use_offset_0x0028u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x00A0u, 0x00D7u)) return use_table[u - 0x00A0u + use_offset_0x00a0u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x0348u, 0x034Fu)) return use_table[u - 0x0348u + use_offset_0x0348u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x0640u, 0x0647u)) return use_table[u - 0x0640u + use_offset_0x0640u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x07C8u, 0x07FFu)) return use_table[u - 0x07C8u + use_offset_0x07c8u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x0840u, 0x085Fu)) return use_table[u - 0x0840u + use_offset_0x0840u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x0900u, 0x0DF7u)) return use_table[u - 0x0900u + use_offset_0x0900u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x0F00u, 0x0FC7u)) return use_table[u - 0x0F00u + use_offset_0x0f00u];
+      break;
+
+    case 0x1u:
+      if (hb_in_range<hb_codepoint_t> (u, 0x1000u, 0x109Fu)) return use_table[u - 0x1000u + use_offset_0x1000u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x1700u, 0x18AFu)) return use_table[u - 0x1700u + use_offset_0x1700u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x1900u, 0x1A9Fu)) return use_table[u - 0x1900u + use_offset_0x1900u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x1B00u, 0x1C4Fu)) return use_table[u - 0x1B00u + use_offset_0x1b00u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x1CD0u, 0x1CFFu)) return use_table[u - 0x1CD0u + use_offset_0x1cd0u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x1DF8u, 0x1DFFu)) return use_table[u - 0x1DF8u + use_offset_0x1df8u];
+      break;
+
+    case 0x2u:
+      if (hb_in_range<hb_codepoint_t> (u, 0x2008u, 0x2017u)) return use_table[u - 0x2008u + use_offset_0x2008u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x2070u, 0x2087u)) return use_table[u - 0x2070u + use_offset_0x2070u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x20F0u, 0x20F7u)) return use_table[u - 0x20F0u + use_offset_0x20f0u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x25C8u, 0x25CFu)) return use_table[u - 0x25C8u + use_offset_0x25c8u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x2D30u, 0x2D7Fu)) return use_table[u - 0x2D30u + use_offset_0x2d30u];
+      break;
+
+    case 0xAu:
+      if (hb_in_range<hb_codepoint_t> (u, 0xA800u, 0xAAF7u)) return use_table[u - 0xA800u + use_offset_0xa800u];
+      if (hb_in_range<hb_codepoint_t> (u, 0xABC0u, 0xABFFu)) return use_table[u - 0xABC0u + use_offset_0xabc0u];
+      break;
+
+    case 0xFu:
+      if (hb_in_range<hb_codepoint_t> (u, 0xFE00u, 0xFE0Fu)) return use_table[u - 0xFE00u + use_offset_0xfe00u];
+      break;
+
+    case 0x10u:
+      if (hb_in_range<hb_codepoint_t> (u, 0x10570u, 0x105BFu)) return use_table[u - 0x10570u + use_offset_0x10570u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x10A00u, 0x10A4Fu)) return use_table[u - 0x10A00u + use_offset_0x10a00u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x10AC0u, 0x10AEFu)) return use_table[u - 0x10AC0u + use_offset_0x10ac0u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x10B80u, 0x10BAFu)) return use_table[u - 0x10B80u + use_offset_0x10b80u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x10D00u, 0x10D3Fu)) return use_table[u - 0x10D00u + use_offset_0x10d00u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x10E80u, 0x10EB7u)) return use_table[u - 0x10E80u + use_offset_0x10e80u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x10F30u, 0x110C7u)) return use_table[u - 0x10F30u + use_offset_0x10f30u];
+      break;
+
+    case 0x11u:
+      if (hb_in_range<hb_codepoint_t> (u, 0x10F30u, 0x110C7u)) return use_table[u - 0x10F30u + use_offset_0x10f30u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x11100u, 0x1123Fu)) return use_table[u - 0x11100u + use_offset_0x11100u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x11280u, 0x11377u)) return use_table[u - 0x11280u + use_offset_0x11280u];
+      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, 0x11747u)) 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, 0x11900u, 0x1195Fu)) return use_table[u - 0x11900u + use_offset_0x11900u];
+      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];
+      break;
+
+    case 0x13u:
+      if (hb_in_range<hb_codepoint_t> (u, 0x13000u, 0x1343Fu)) return use_table[u - 0x13000u + use_offset_0x13000u];
+      break;
+
+    case 0x16u:
+      if (hb_in_range<hb_codepoint_t> (u, 0x16AC0u, 0x16B37u)) return use_table[u - 0x16AC0u + use_offset_0x16ac0u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x16F00u, 0x16F97u)) return use_table[u - 0x16F00u + use_offset_0x16f00u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x16FE0u, 0x16FE7u)) return use_table[u - 0x16FE0u + use_offset_0x16fe0u];
+      break;
+
+    case 0x18u:
+      if (hb_in_range<hb_codepoint_t> (u, 0x18B00u, 0x18CD7u)) return use_table[u - 0x18B00u + use_offset_0x18b00u];
+      break;
+
+    case 0x1Bu:
+      if (hb_in_range<hb_codepoint_t> (u, 0x1BC00u, 0x1BC9Fu)) return use_table[u - 0x1BC00u + use_offset_0x1bc00u];
+      break;
+
+    case 0x1Eu:
+      if (hb_in_range<hb_codepoint_t> (u, 0x1E100u, 0x1E14Fu)) return use_table[u - 0x1E100u + use_offset_0x1e100u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x1E290u, 0x1E2FFu)) return use_table[u - 0x1E290u + use_offset_0x1e290u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x1E900u, 0x1E95Fu)) return use_table[u - 0x1E900u + use_offset_0x1e900u];
+      break;
+
+    case 0xE0u:
+      if (hb_in_range<hb_codepoint_t> (u, 0xE0100u, 0xE01EFu)) return use_table[u - 0xE0100u + use_offset_0xe0100u];
+      break;
+
+    default:
+      break;
+  }
+  return USE(O);
+}
+
+#undef B
+#undef CGJ
+#undef CS
+#undef G
+#undef GB
+#undef H
+#undef HN
+#undef HVM
+#undef J
+#undef N
+#undef O
+#undef R
+#undef SB
+#undef SE
+#undef SUB
+#undef Sk
+#undef ZWNJ
+#undef CMAbv
+#undef CMBlw
+#undef FAbv
+#undef FBlw
+#undef FPst
+#undef FMAbv
+#undef FMBlw
+#undef FMPst
+#undef MAbv
+#undef MBlw
+#undef MPst
+#undef MPre
+#undef SMAbv
+#undef SMBlw
+#undef VAbv
+#undef VBlw
+#undef VPst
+#undef VPre
+#undef VMAbv
+#undef VMBlw
+#undef VMPst
+#undef VMPre
+
+
+#endif /* HB_OT_SHAPE_COMPLEX_USE_TABLE_HH */
+/* == End of generated table == */
index 10f5822..70b6379 100644 (file)
 
 #ifndef HB_NO_OT_SHAPE
 
-#include "hb-ot-shape-complex-use.hh"
+#include "hb-ot-shape-complex-use-machine.hh"
+#include "hb-ot-shape-complex-use-table.hh"
 #include "hb-ot-shape-complex-arabic.hh"
+#include "hb-ot-shape-complex-arabic-joining-list.hh"
 #include "hb-ot-shape-complex-vowel-constraints.hh"
 
-/* buffer var allocations */
-#define use_category() complex_var_u8_0()
-
 
 /*
  * Universal Shaping Engine.
@@ -48,7 +47,8 @@ use_basic_features[] =
 {
   /*
    * Basic features.
-   * These features are applied all at once, before reordering.
+   * These features are applied all at once, before reordering, constrained
+   * to the syllable.
    */
   HB_TAG('r','k','r','f'),
   HB_TAG('a','b','v','f'),
@@ -68,11 +68,11 @@ use_topographical_features[] =
 };
 /* Same order as use_topographical_features. */
 enum joining_form_t {
-  USE_ISOL,
-  USE_INIT,
-  USE_MEDI,
-  USE_FINA,
-  _USE_NONE
+  JOINING_FORM_ISOL,
+  JOINING_FORM_INIT,
+  JOINING_FORM_MEDI,
+  JOINING_FORM_FINA,
+  _JOINING_FORM_NONE
 };
 static const hb_tag_t
 use_other_features[] =
@@ -152,44 +152,10 @@ struct use_shape_plan_t
   arabic_shape_plan_t *arabic_plan;
 };
 
-static bool
-has_arabic_joining (hb_script_t script)
-{
-  /* List of scripts that have data in arabic-table. */
-  switch ((int) script)
-  {
-    /* Unicode-1.1 additions */
-    case HB_SCRIPT_ARABIC:
-
-    /* Unicode-3.0 additions */
-    case HB_SCRIPT_MONGOLIAN:
-    case HB_SCRIPT_SYRIAC:
-
-    /* Unicode-5.0 additions */
-    case HB_SCRIPT_NKO:
-    case HB_SCRIPT_PHAGS_PA:
-
-    /* Unicode-6.0 additions */
-    case HB_SCRIPT_MANDAIC:
-
-    /* Unicode-7.0 additions */
-    case HB_SCRIPT_MANICHAEAN:
-    case HB_SCRIPT_PSALTER_PAHLAVI:
-
-    /* Unicode-9.0 additions */
-    case HB_SCRIPT_ADLAM:
-
-      return true;
-
-    default:
-      return false;
-  }
-}
-
 static void *
 data_create_use (const hb_ot_shape_plan_t *plan)
 {
-  use_shape_plan_t *use_plan = (use_shape_plan_t *) calloc (1, sizeof (use_shape_plan_t));
+  use_shape_plan_t *use_plan = (use_shape_plan_t *) hb_calloc (1, sizeof (use_shape_plan_t));
   if (unlikely (!use_plan))
     return nullptr;
 
@@ -200,7 +166,7 @@ data_create_use (const hb_ot_shape_plan_t *plan)
     use_plan->arabic_plan = (arabic_shape_plan_t *) data_create_arabic (plan);
     if (unlikely (!use_plan->arabic_plan))
     {
-      free (use_plan);
+      hb_free (use_plan);
       return nullptr;
     }
   }
@@ -216,24 +182,9 @@ data_destroy_use (void *data)
   if (use_plan->arabic_plan)
     data_destroy_arabic (use_plan->arabic_plan);
 
-  free (data);
+  hb_free (data);
 }
 
-enum use_syllable_type_t {
-  use_independent_cluster,
-  use_virama_terminated_cluster,
-  use_sakot_terminated_cluster,
-  use_standard_cluster,
-  use_number_joiner_terminated_cluster,
-  use_numeral_cluster,
-  use_symbol_cluster,
-  use_broken_cluster,
-  use_non_cluster,
-};
-
-#include "hb-ot-shape-complex-use-machine.hh"
-
-
 static void
 setup_masks_use (const hb_ot_shape_plan_t *plan,
                 hb_buffer_t              *buffer,
@@ -271,7 +222,7 @@ setup_rphf_mask (const hb_ot_shape_plan_t *plan,
 
   foreach_syllable (buffer, start, end)
   {
-    unsigned int limit = info[start].use_category() == USE_R ? 1 : hb_min (3u, end - start);
+    unsigned int limit = info[start].use_category() == USE(R) ? 1 : hb_min (3u, end - start);
     for (unsigned int i = start; i < start + limit; i++)
       info[i].mask |= mask;
   }
@@ -285,7 +236,7 @@ setup_topographical_masks (const hb_ot_shape_plan_t *plan,
   if (use_plan->arabic_plan)
     return;
 
-  static_assert ((USE_INIT < 4 && USE_ISOL < 4 && USE_MEDI < 4 && USE_FINA < 4), "");
+  static_assert ((JOINING_FORM_INIT < 4 && JOINING_FORM_ISOL < 4 && JOINING_FORM_MEDI < 4 && JOINING_FORM_FINA < 4), "");
   hb_mask_t masks[4], all_masks = 0;
   for (unsigned int i = 0; i < 4; i++)
   {
@@ -299,18 +250,18 @@ setup_topographical_masks (const hb_ot_shape_plan_t *plan,
   hb_mask_t other_masks = ~all_masks;
 
   unsigned int last_start = 0;
-  joining_form_t last_form = _USE_NONE;
+  joining_form_t last_form = _JOINING_FORM_NONE;
   hb_glyph_info_t *info = buffer->info;
   foreach_syllable (buffer, start, end)
   {
     use_syllable_type_t syllable_type = (use_syllable_type_t) (info[start].syllable() & 0x0F);
     switch (syllable_type)
     {
-      case use_independent_cluster:
       case use_symbol_cluster:
+      case use_hieroglyph_cluster:
       case use_non_cluster:
        /* These don't join.  Nothing to do. */
-       last_form = _USE_NONE;
+       last_form = _JOINING_FORM_NONE;
        break;
 
       case use_virama_terminated_cluster:
@@ -320,18 +271,18 @@ setup_topographical_masks (const hb_ot_shape_plan_t *plan,
       case use_numeral_cluster:
       case use_broken_cluster:
 
-       bool join = last_form == USE_FINA || last_form == USE_ISOL;
+       bool join = last_form == JOINING_FORM_FINA || last_form == JOINING_FORM_ISOL;
 
        if (join)
        {
          /* Fixup previous syllable's form. */
-         last_form = last_form == USE_FINA ? USE_MEDI : USE_INIT;
+         last_form = last_form == JOINING_FORM_FINA ? JOINING_FORM_MEDI : JOINING_FORM_INIT;
          for (unsigned int i = last_start; i < start; i++)
            info[i].mask = (info[i].mask & other_masks) | masks[last_form];
        }
 
        /* Form for this syllable. */
-       last_form = join ? USE_FINA : USE_ISOL;
+       last_form = join ? JOINING_FORM_FINA : JOINING_FORM_ISOL;
        for (unsigned int i = start; i < end; i++)
          info[i].mask = (info[i].mask & other_masks) | masks[last_form];
 
@@ -367,11 +318,11 @@ record_rphf_use (const hb_ot_shape_plan_t *plan,
 
   foreach_syllable (buffer, start, end)
   {
-    /* Mark a substituted repha as USE_R. */
+    /* Mark a substituted repha as USE(R). */
     for (unsigned int i = start; i < end && (info[i].mask & mask); i++)
       if (_hb_glyph_info_substituted (&info[i]))
       {
-       info[i].use_category() = USE_R;
+       info[i].use_category() = USE(R);
        break;
       }
   }
@@ -390,7 +341,7 @@ record_pref_use (const hb_ot_shape_plan_t *plan HB_UNUSED,
     for (unsigned int i = start; i < end; i++)
       if (_hb_glyph_info_substituted (&info[i]))
       {
-       info[i].use_category() = USE_VPre;
+       info[i].use_category() = USE(VPre);
        break;
       }
   }
@@ -399,7 +350,7 @@ record_pref_use (const hb_ot_shape_plan_t *plan HB_UNUSED,
 static inline bool
 is_halant_use (const hb_glyph_info_t &info)
 {
-  return (info.use_category() == USE_H || info.use_category() == USE_HVM) &&
+  return (info.use_category() == USE(H) || info.use_category() == USE(HVM)) &&
         !_hb_glyph_info_ligated (&info);
 }
 
@@ -418,25 +369,24 @@ reorder_syllable_use (hb_buffer_t *buffer, unsigned int start, unsigned int end)
 
   hb_glyph_info_t *info = buffer->info;
 
-#define POST_BASE_FLAGS64 (FLAG64 (USE_FM) | \
-                          FLAG64 (USE_FAbv) | \
-                          FLAG64 (USE_FBlw) | \
-                          FLAG64 (USE_FPst) | \
-                          FLAG64 (USE_MAbv) | \
-                          FLAG64 (USE_MBlw) | \
-                          FLAG64 (USE_MPst) | \
-                          FLAG64 (USE_MPre) | \
-                          FLAG64 (USE_VAbv) | \
-                          FLAG64 (USE_VBlw) | \
-                          FLAG64 (USE_VPst) | \
-                          FLAG64 (USE_VPre) | \
-                          FLAG64 (USE_VMAbv) | \
-                          FLAG64 (USE_VMBlw) | \
-                          FLAG64 (USE_VMPst) | \
-                          FLAG64 (USE_VMPre))
+#define POST_BASE_FLAGS64 (FLAG64 (USE(FAbv)) | \
+                          FLAG64 (USE(FBlw)) | \
+                          FLAG64 (USE(FPst)) | \
+                          FLAG64 (USE(MAbv)) | \
+                          FLAG64 (USE(MBlw)) | \
+                          FLAG64 (USE(MPst)) | \
+                          FLAG64 (USE(MPre)) | \
+                          FLAG64 (USE(VAbv)) | \
+                          FLAG64 (USE(VBlw)) | \
+                          FLAG64 (USE(VPst)) | \
+                          FLAG64 (USE(VPre)) | \
+                          FLAG64 (USE(VMAbv)) | \
+                          FLAG64 (USE(VMBlw)) | \
+                          FLAG64 (USE(VMPst)) | \
+                          FLAG64 (USE(VMPre)))
 
   /* Move things forward. */
-  if (info[start].use_category() == USE_R && end - start > 1)
+  if (info[start].use_category() == USE(R) && end - start > 1)
   {
     /* Got a repha.  Reorder it towards the end, but before the first post-base
      * glyph. */
@@ -473,7 +423,7 @@ reorder_syllable_use (hb_buffer_t *buffer, unsigned int start, unsigned int end)
        * shift things in between forward. */
       j = i + 1;
     }
-    else if (((flag) & (FLAG (USE_VPre) | FLAG (USE_VMPre))) &&
+    else if (((flag) & (FLAG (USE(VPre)) | FLAG (USE(VMPre)))) &&
             /* Only move the first component of a MultipleSubst. */
             0 == _hb_glyph_info_get_lig_comp (&info[i]) &&
             j < i)
@@ -486,73 +436,23 @@ reorder_syllable_use (hb_buffer_t *buffer, unsigned int start, unsigned int end)
   }
 }
 
-static inline void
-insert_dotted_circles_use (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;
-  unsigned int count = buffer->len;
-  hb_glyph_info_t *info = buffer->info;
-  for (unsigned int i = 0; i < count; i++)
-    if ((info[i].syllable() & 0x0F) == use_broken_cluster)
-    {
-      has_broken_syllables = true;
-      break;
-    }
-  if (likely (!has_broken_syllables))
-    return;
-
-  hb_glyph_info_t dottedcircle = {0};
-  if (!font->get_nominal_glyph (0x25CCu, &dottedcircle.codepoint))
-    return;
-  dottedcircle.use_category() = hb_use_get_category (0x25CC);
-
-  buffer->clear_output ();
-
-  buffer->idx = 0;
-  unsigned int last_syllable = 0;
-  while (buffer->idx < buffer->len && buffer->successful)
-  {
-    unsigned int syllable = buffer->cur().syllable();
-    use_syllable_type_t syllable_type = (use_syllable_type_t) (syllable & 0x0F);
-    if (unlikely (last_syllable != syllable && syllable_type == use_broken_cluster))
-    {
-      last_syllable = syllable;
-
-      hb_glyph_info_t ginfo = dottedcircle;
-      ginfo.cluster = buffer->cur().cluster;
-      ginfo.mask = buffer->cur().mask;
-      ginfo.syllable() = buffer->cur().syllable();
-
-      /* Insert dottedcircle after possible Repha. */
-      while (buffer->idx < buffer->len && buffer->successful &&
-            last_syllable == buffer->cur().syllable() &&
-            buffer->cur().use_category() == USE_R)
-       buffer->next_glyph ();
-
-      buffer->output_info (ginfo);
-    }
-    else
-      buffer->next_glyph ();
-  }
-  buffer->swap_buffers ();
-}
-
 static void
 reorder_use (const hb_ot_shape_plan_t *plan,
             hb_font_t *font,
             hb_buffer_t *buffer)
 {
-  insert_dotted_circles_use (plan, font, buffer);
+  if (buffer->message (font, "start reordering USE"))
+  {
+    hb_syllabic_insert_dotted_circles (font, buffer,
+                                      use_broken_cluster,
+                                      USE(B),
+                                      USE(R));
 
-  foreach_syllable (buffer, start, end)
-    reorder_syllable_use (buffer, start, end);
+    foreach_syllable (buffer, start, end)
+      reorder_syllable_use (buffer, start, end);
+
+    (void) buffer->message (font, "end reordering USE");
+  }
 
   HB_BUFFER_DEALLOCATE_VAR (buffer, use_category);
 }
diff --git a/src/hb-ot-shape-complex-use.hh b/src/hb-ot-shape-complex-use.hh
deleted file mode 100644 (file)
index ce6645e..0000000
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright © 2015  Mozilla Foundation.
- * Copyright © 2015  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.
- *
- * Mozilla Author(s): Jonathan Kew
- * Google Author(s): Behdad Esfahbod
- */
-
-#ifndef HB_OT_SHAPE_COMPLEX_USE_HH
-#define HB_OT_SHAPE_COMPLEX_USE_HH
-
-#include "hb.hh"
-
-
-#include "hb-ot-shape-complex.hh"
-
-
-#define USE_TABLE_ELEMENT_TYPE uint8_t
-
-/* Cateories used in the Universal Shaping Engine spec:
- * https://docs.microsoft.com/en-us/typography/script-development/use
- */
-/* Note: This enum is duplicated in the -machine.rl source file.
- * Not sure how to avoid duplication. */
-enum use_category_t {
-  USE_O                = 0,    /* OTHER */
-
-  USE_B                = 1,    /* BASE */
-  USE_IND      = 3,    /* BASE_IND */
-  USE_N                = 4,    /* BASE_NUM */
-  USE_GB       = 5,    /* BASE_OTHER */
-  USE_CGJ      = 6,    /* CGJ */
-//  USE_F              = 7,    /* CONS_FINAL */
-  USE_FM       = 8,    /* CONS_FINAL_MOD */
-//  USE_M              = 9,    /* CONS_MED */
-//  USE_CM     = 10,   /* CONS_MOD */
-  USE_SUB      = 11,   /* CONS_SUB */
-  USE_H                = 12,   /* HALANT */
-
-  USE_HN       = 13,   /* HALANT_NUM */
-  USE_ZWNJ     = 14,   /* Zero width non-joiner */
-  USE_ZWJ      = 15,   /* Zero width joiner */
-  USE_WJ       = 16,   /* Word joiner */
-  USE_Rsv      = 17,   /* Reserved characters */
-  USE_R                = 18,   /* REPHA */
-  USE_S                = 19,   /* SYM */
-//  USE_SM     = 20,   /* SYM_MOD */
-  USE_VS       = 21,   /* VARIATION_SELECTOR */
-//  USE_V      = 36,   /* VOWEL */
-//  USE_VM     = 40,   /* VOWEL_MOD */
-  USE_CS       = 43,   /* CONS_WITH_STACKER */
-
-  /* https://github.com/harfbuzz/harfbuzz/issues/1102 */
-  USE_HVM      = 44,   /* HALANT_OR_VOWEL_MODIFIER */
-
-  USE_Sk       = 48,   /* SAKOT */
-
-  USE_FAbv     = 24,   /* CONS_FINAL_ABOVE */
-  USE_FBlw     = 25,   /* CONS_FINAL_BELOW */
-  USE_FPst     = 26,   /* CONS_FINAL_POST */
-  USE_MAbv     = 27,   /* CONS_MED_ABOVE */
-  USE_MBlw     = 28,   /* CONS_MED_BELOW */
-  USE_MPst     = 29,   /* CONS_MED_POST */
-  USE_MPre     = 30,   /* CONS_MED_PRE */
-  USE_CMAbv    = 31,   /* CONS_MOD_ABOVE */
-  USE_CMBlw    = 32,   /* CONS_MOD_BELOW */
-  USE_VAbv     = 33,   /* VOWEL_ABOVE / VOWEL_ABOVE_BELOW / VOWEL_ABOVE_BELOW_POST / VOWEL_ABOVE_POST */
-  USE_VBlw     = 34,   /* VOWEL_BELOW / VOWEL_BELOW_POST */
-  USE_VPst     = 35,   /* VOWEL_POST   UIPC = Right */
-  USE_VPre     = 22,   /* VOWEL_PRE / VOWEL_PRE_ABOVE / VOWEL_PRE_ABOVE_POST / VOWEL_PRE_POST */
-  USE_VMAbv    = 37,   /* VOWEL_MOD_ABOVE */
-  USE_VMBlw    = 38,   /* VOWEL_MOD_BELOW */
-  USE_VMPst    = 39,   /* VOWEL_MOD_POST */
-  USE_VMPre    = 23,   /* VOWEL_MOD_PRE */
-  USE_SMAbv    = 41,   /* SYM_MOD_ABOVE */
-  USE_SMBlw    = 42,   /* SYM_MOD_BELOW */
-  USE_FMAbv    = 45,   /* CONS_FINAL_MOD       UIPC = Top */
-  USE_FMBlw    = 46,   /* CONS_FINAL_MOD       UIPC = Bottom */
-  USE_FMPst    = 47,   /* CONS_FINAL_MOD       UIPC = Not_Applicable */
-};
-
-HB_INTERNAL USE_TABLE_ELEMENT_TYPE
-hb_use_get_category (hb_codepoint_t u);
-
-#endif /* HB_OT_SHAPE_COMPLEX_USE_HH */
index c3368c6..d2cca10 100644 (file)
@@ -10,8 +10,8 @@
  * # Date: 2015-03-12, 21:17:00 GMT [AG]
  * # Date: 2019-11-08, 23:22:00 GMT [AG]
  *
- * # Scripts-13.0.0.txt
- * # Date: 2020-01-22, 00:07:43 GMT
+ * # Scripts-14.0.0.txt
+ * # Date: 2021-07-10, 00:35:31 GMT
  */
 
 #include "hb.hh"
 static void
 _output_dotted_circle (hb_buffer_t *buffer)
 {
-  hb_glyph_info_t &dottedcircle = buffer->output_glyph (0x25CCu);
-  _hb_glyph_info_reset_continuation (&dottedcircle);
+  (void) buffer->output_glyph (0x25CCu);
+  _hb_glyph_info_reset_continuation (&buffer->prev());
 }
 
 static void
 _output_with_dotted_circle (hb_buffer_t *buffer)
 {
   _output_dotted_circle (buffer);
-  buffer->next_glyph ();
+  (void) buffer->next_glyph ();
 }
 
 void
@@ -51,7 +51,6 @@ _hb_preprocess_text_vowel_constraints (const hb_ot_shape_plan_t *plan HB_UNUSED,
    *
    * https://github.com/harfbuzz/harfbuzz/issues/1019
    */
-  bool processed = false;
   buffer->clear_output ();
   unsigned int count = buffer->len;
   switch ((unsigned) buffer->props.script)
@@ -97,15 +96,14 @@ _hb_preprocess_text_vowel_constraints (const hb_ot_shape_plan_t *plan HB_UNUSED,
                buffer->idx + 2 < count &&
                0x0907u == buffer->cur (2).codepoint)
            {
-             buffer->next_glyph ();
+             (void) buffer->next_glyph ();
              matched = true;
            }
            break;
        }
-       buffer->next_glyph ();
+       (void) buffer->next_glyph ();
        if (matched) _output_with_dotted_circle (buffer);
       }
-      processed = true;
       break;
 
     case HB_SCRIPT_BENGALI:
@@ -124,10 +122,9 @@ _hb_preprocess_text_vowel_constraints (const hb_ot_shape_plan_t *plan HB_UNUSED,
            matched = 0x09E2u == buffer->cur (1).codepoint;
            break;
        }
-       buffer->next_glyph ();
+       (void) buffer->next_glyph ();
        if (matched) _output_with_dotted_circle (buffer);
       }
-      processed = true;
       break;
 
     case HB_SCRIPT_GURMUKHI:
@@ -161,10 +158,9 @@ _hb_preprocess_text_vowel_constraints (const hb_ot_shape_plan_t *plan HB_UNUSED,
            }
            break;
        }
-       buffer->next_glyph ();
+       (void) buffer->next_glyph ();
        if (matched) _output_with_dotted_circle (buffer);
       }
-      processed = true;
       break;
 
     case HB_SCRIPT_GUJARATI:
@@ -186,10 +182,9 @@ _hb_preprocess_text_vowel_constraints (const hb_ot_shape_plan_t *plan HB_UNUSED,
            matched = 0x0ABEu == buffer->cur (1).codepoint;
            break;
        }
-       buffer->next_glyph ();
+       (void) buffer->next_glyph ();
        if (matched) _output_with_dotted_circle (buffer);
       }
-      processed = true;
       break;
 
     case HB_SCRIPT_ORIYA:
@@ -205,10 +200,9 @@ _hb_preprocess_text_vowel_constraints (const hb_ot_shape_plan_t *plan HB_UNUSED,
            matched = 0x0B57u == buffer->cur (1).codepoint;
            break;
        }
-       buffer->next_glyph ();
+       (void) buffer->next_glyph ();
        if (matched) _output_with_dotted_circle (buffer);
       }
-      processed = true;
       break;
 
     case HB_SCRIPT_TAMIL:
@@ -220,10 +214,9 @@ _hb_preprocess_text_vowel_constraints (const hb_ot_shape_plan_t *plan HB_UNUSED,
        {
          matched = true;
        }
-       buffer->next_glyph ();
+       (void) buffer->next_glyph ();
        if (matched) _output_with_dotted_circle (buffer);
       }
-      processed = true;
       break;
 
     case HB_SCRIPT_TELUGU:
@@ -244,10 +237,9 @@ _hb_preprocess_text_vowel_constraints (const hb_ot_shape_plan_t *plan HB_UNUSED,
            matched = 0x0C55u == buffer->cur (1).codepoint;
            break;
        }
-       buffer->next_glyph ();
+       (void) buffer->next_glyph ();
        if (matched) _output_with_dotted_circle (buffer);
       }
-      processed = true;
       break;
 
     case HB_SCRIPT_KANNADA:
@@ -263,10 +255,9 @@ _hb_preprocess_text_vowel_constraints (const hb_ot_shape_plan_t *plan HB_UNUSED,
            matched = 0x0CCCu == buffer->cur (1).codepoint;
            break;
        }
-       buffer->next_glyph ();
+       (void) buffer->next_glyph ();
        if (matched) _output_with_dotted_circle (buffer);
       }
-      processed = true;
       break;
 
     case HB_SCRIPT_MALAYALAM:
@@ -290,10 +281,9 @@ _hb_preprocess_text_vowel_constraints (const hb_ot_shape_plan_t *plan HB_UNUSED,
            }
            break;
        }
-       buffer->next_glyph ();
+       (void) buffer->next_glyph ();
        if (matched) _output_with_dotted_circle (buffer);
       }
-      processed = true;
       break;
 
     case HB_SCRIPT_SINHALA:
@@ -320,16 +310,15 @@ _hb_preprocess_text_vowel_constraints (const hb_ot_shape_plan_t *plan HB_UNUSED,
            switch (buffer->cur (1).codepoint)
            {
              case 0x0DCAu: case 0x0DD9u: case 0x0DDAu: case 0x0DDCu:
-             case 0x0DDDu:
+             case 0x0DDDu: case 0x0DDEu:
                matched = true;
                break;
            }
            break;
        }
-       buffer->next_glyph ();
+       (void) buffer->next_glyph ();
        if (matched) _output_with_dotted_circle (buffer);
       }
-      processed = true;
       break;
 
     case HB_SCRIPT_BRAHMI:
@@ -348,10 +337,9 @@ _hb_preprocess_text_vowel_constraints (const hb_ot_shape_plan_t *plan HB_UNUSED,
            matched = 0x11042u == buffer->cur (1).codepoint;
            break;
        }
-       buffer->next_glyph ();
+       (void) buffer->next_glyph ();
        if (matched) _output_with_dotted_circle (buffer);
       }
-      processed = true;
       break;
 
     case HB_SCRIPT_KHUDAWADI:
@@ -370,10 +358,9 @@ _hb_preprocess_text_vowel_constraints (const hb_ot_shape_plan_t *plan HB_UNUSED,
            }
            break;
        }
-       buffer->next_glyph ();
+       (void) buffer->next_glyph ();
        if (matched) _output_with_dotted_circle (buffer);
       }
-      processed = true;
       break;
 
     case HB_SCRIPT_TIRHUTA:
@@ -397,10 +384,9 @@ _hb_preprocess_text_vowel_constraints (const hb_ot_shape_plan_t *plan HB_UNUSED,
            }
            break;
        }
-       buffer->next_glyph ();
+       (void) buffer->next_glyph ();
        if (matched) _output_with_dotted_circle (buffer);
       }
-      processed = true;
       break;
 
     case HB_SCRIPT_MODI:
@@ -418,10 +404,9 @@ _hb_preprocess_text_vowel_constraints (const hb_ot_shape_plan_t *plan HB_UNUSED,
            }
            break;
        }
-       buffer->next_glyph ();
+       (void) buffer->next_glyph ();
        if (matched) _output_with_dotted_circle (buffer);
       }
-      processed = true;
       break;
 
     case HB_SCRIPT_TAKRI:
@@ -442,21 +427,15 @@ _hb_preprocess_text_vowel_constraints (const hb_ot_shape_plan_t *plan HB_UNUSED,
            matched = 0x116B2u == buffer->cur (1).codepoint;
            break;
        }
-       buffer->next_glyph ();
+       (void) buffer->next_glyph ();
        if (matched) _output_with_dotted_circle (buffer);
       }
-      processed = true;
       break;
 
     default:
       break;
   }
-  if (processed)
-  {
-    if (buffer->idx < count)
-      buffer->next_glyph ();
-    buffer->swap_buffers ();
-  }
+  buffer->sync ();
 }
 
 
index 61f4c0e..8012a9a 100644 (file)
@@ -35,8 +35,8 @@
 
 
 /* buffer var allocations, used by complex shapers */
-#define complex_var_u8_0()     var2.u8[2]
-#define complex_var_u8_1()     var2.u8[3]
+#define complex_var_u8_category()      var2.u8[2]
+#define complex_var_u8_auxiliary()     var2.u8[3]
 
 
 #define HB_OT_SHAPE_COMPLEX_MAX_COMBINING_MARKS 32
@@ -186,27 +186,8 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner)
     case HB_SCRIPT_ARABIC:
 
     /* Unicode-3.0 additions */
-    case HB_SCRIPT_MONGOLIAN:
     case HB_SCRIPT_SYRIAC:
 
-    /* Unicode-5.0 additions */
-    case HB_SCRIPT_NKO:
-    case HB_SCRIPT_PHAGS_PA:
-
-    /* Unicode-6.0 additions */
-    case HB_SCRIPT_MANDAIC:
-
-    /* Unicode-7.0 additions */
-    case HB_SCRIPT_MANICHAEAN:
-    case HB_SCRIPT_PSALTER_PAHLAVI:
-
-    /* Unicode-9.0 additions */
-    case HB_SCRIPT_ADLAM:
-
-    /* Unicode-11.0 additions */
-    case HB_SCRIPT_HANIFI_ROHINGYA:
-    case HB_SCRIPT_SOGDIAN:
-
       /* For Arabic script, use the Arabic shaper even if no OT script tag was found.
        * This is because we do fallback shaping for Arabic script (and not others).
        * But note that Arabic shaping is applicable only to horizontal layout; for
@@ -284,8 +265,9 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner)
        return &_hb_ot_complex_shaper_myanmar;
 
 
-    /* https://github.com/harfbuzz/harfbuzz/issues/1162 */
+#define HB_SCRIPT_MYANMAR_ZAWGYI       ((hb_script_t) HB_TAG ('Q','a','a','g'))
     case HB_SCRIPT_MYANMAR_ZAWGYI:
+    /* https://github.com/harfbuzz/harfbuzz/issues/1162 */
 
       return &_hb_ot_complex_shaper_myanmar_zawgyi;
 
@@ -294,7 +276,7 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner)
     case HB_SCRIPT_TIBETAN:
 
     /* Unicode-3.0 additions */
-    //case HB_SCRIPT_MONGOLIAN:
+    case HB_SCRIPT_MONGOLIAN:
     //case HB_SCRIPT_SINHALA:
 
     /* Unicode-3.2 additions */
@@ -315,8 +297,8 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner)
 
     /* Unicode-5.0 additions */
     case HB_SCRIPT_BALINESE:
-    //case HB_SCRIPT_NKO:
-    //case HB_SCRIPT_PHAGS_PA:
+    case HB_SCRIPT_NKO:
+    case HB_SCRIPT_PHAGS_PA:
 
     /* Unicode-5.1 additions */
     case HB_SCRIPT_CHAM:
@@ -337,10 +319,11 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner)
     /* Unicode-6.0 additions */
     case HB_SCRIPT_BATAK:
     case HB_SCRIPT_BRAHMI:
-    //case HB_SCRIPT_MANDAIC:
+    case HB_SCRIPT_MANDAIC:
 
     /* Unicode-6.1 additions */
     case HB_SCRIPT_CHAKMA:
+    case HB_SCRIPT_MIAO:
     case HB_SCRIPT_SHARADA:
     case HB_SCRIPT_TAKRI:
 
@@ -350,18 +333,19 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner)
     case HB_SCRIPT_KHOJKI:
     case HB_SCRIPT_KHUDAWADI:
     case HB_SCRIPT_MAHAJANI:
-    //case HB_SCRIPT_MANICHAEAN:
+    case HB_SCRIPT_MANICHAEAN:
     case HB_SCRIPT_MODI:
     case HB_SCRIPT_PAHAWH_HMONG:
-    //case HB_SCRIPT_PSALTER_PAHLAVI:
+    case HB_SCRIPT_PSALTER_PAHLAVI:
     case HB_SCRIPT_SIDDHAM:
     case HB_SCRIPT_TIRHUTA:
 
     /* Unicode-8.0 additions */
     case HB_SCRIPT_AHOM:
+    case HB_SCRIPT_MULTANI:
 
     /* Unicode-9.0 additions */
-    //case HB_SCRIPT_ADLAM:
+    case HB_SCRIPT_ADLAM:
     case HB_SCRIPT_BHAIKSUKI:
     case HB_SCRIPT_MARCHEN:
     case HB_SCRIPT_NEWA:
@@ -374,16 +358,30 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner)
     /* Unicode-11.0 additions */
     case HB_SCRIPT_DOGRA:
     case HB_SCRIPT_GUNJALA_GONDI:
-    //case HB_SCRIPT_HANIFI_ROHINGYA:
+    case HB_SCRIPT_HANIFI_ROHINGYA:
     case HB_SCRIPT_MAKASAR:
-    //case HB_SCRIPT_SOGDIAN:
+    case HB_SCRIPT_MEDEFAIDRIN:
+    case HB_SCRIPT_OLD_SOGDIAN:
+    case HB_SCRIPT_SOGDIAN:
 
     /* Unicode-12.0 additions */
+    case HB_SCRIPT_ELYMAIC:
     case HB_SCRIPT_NANDINAGARI:
+    case HB_SCRIPT_NYIAKENG_PUACHUE_HMONG:
+    case HB_SCRIPT_WANCHO:
 
     /* Unicode-13.0 additions */
     case HB_SCRIPT_CHORASMIAN:
     case HB_SCRIPT_DIVES_AKURU:
+    case HB_SCRIPT_KHITAN_SMALL_SCRIPT:
+    case HB_SCRIPT_YEZIDI:
+
+    /* Unicode-14.0 additions */
+    case HB_SCRIPT_CYPRO_MINOAN:
+    case HB_SCRIPT_OLD_UYGHUR:
+    case HB_SCRIPT_TANGSA:
+    case HB_SCRIPT_TOTO:
+    case HB_SCRIPT_VITHKUQI:
 
       /* If the designer designed the font for the 'DFLT' script,
        * (or we ended up arbitrarily pick 'latn'), use the default shaper.
index 42bf524..b2eedb0 100644 (file)
@@ -92,7 +92,7 @@ recategorize_combining_class (hb_codepoint_t u,
     case HB_MODIFIED_COMBINING_CLASS_CCC15: /* tsere */
     case HB_MODIFIED_COMBINING_CLASS_CCC16: /* segol */
     case HB_MODIFIED_COMBINING_CLASS_CCC17: /* patah */
-    case HB_MODIFIED_COMBINING_CLASS_CCC18: /* qamats */
+    case HB_MODIFIED_COMBINING_CLASS_CCC18: /* qamats & qamats qatan */
     case HB_MODIFIED_COMBINING_CLASS_CCC20: /* qubuts */
     case HB_MODIFIED_COMBINING_CLASS_CCC22: /* meteg */
       return HB_UNICODE_COMBINING_CLASS_BELOW;
@@ -104,7 +104,7 @@ recategorize_combining_class (hb_codepoint_t u,
       return HB_UNICODE_COMBINING_CLASS_ABOVE_RIGHT;
 
     case HB_MODIFIED_COMBINING_CLASS_CCC25: /* sin dot */
-    case HB_MODIFIED_COMBINING_CLASS_CCC19: /* holam */
+    case HB_MODIFIED_COMBINING_CLASS_CCC19: /* holam & holam haser for vav */
       return HB_UNICODE_COMBINING_CLASS_ABOVE_LEFT;
 
     case HB_MODIFIED_COMBINING_CLASS_CCC26: /* point varika */
@@ -301,7 +301,7 @@ position_mark (const hb_ot_shape_plan_t *plan HB_UNUSED,
       /* Don't shift down "above" marks too much. */
       if ((y_gap > 0) != (pos.y_offset > 0))
       {
-       unsigned int correction = -pos.y_offset / 2;
+       int correction = -pos.y_offset / 2;
        base_extents.y_bearing += correction;
        base_extents.height -= correction;
        pos.y_offset += correction;
@@ -446,6 +446,9 @@ _hb_ot_shape_fallback_mark_position (const hb_ot_shape_plan_t *plan,
   return;
 #endif
 
+  if (!buffer->message (font, "start fallback mark"))
+    return;
+
   _hb_buffer_assert_gsubgpos_vars (buffer);
 
   unsigned int start = 0;
@@ -457,6 +460,8 @@ _hb_ot_shape_fallback_mark_position (const hb_ot_shape_plan_t *plan,
       start = i;
     }
   position_cluster (plan, font, buffer, start, count, adjust_offsets_when_zeroing);
+
+  (void) buffer->message (font, "end fallback mark");
 }
 
 
@@ -497,6 +502,9 @@ _hb_ot_shape_fallback_kern (const hb_ot_shape_plan_t *plan,
       !font->has_glyph_v_kerning_func ())
     return;
 
+  if (!buffer->message (font, "start fallback kern"))
+    return;
+
   bool reverse = HB_DIRECTION_IS_BACKWARD (buffer->props.direction);
 
   if (reverse)
@@ -508,6 +516,8 @@ _hb_ot_shape_fallback_kern (const hb_ot_shape_plan_t *plan,
 
   if (reverse)
     buffer->reverse ();
+
+  (void) buffer->message (font, "end fallback kern");
 #endif
 }
 
@@ -525,6 +535,15 @@ _hb_ot_shape_fallback_spaces (const hb_ot_shape_plan_t *plan HB_UNUSED,
   for (unsigned int i = 0; i < count; i++)
     if (_hb_glyph_info_is_unicode_space (&info[i]) && !_hb_glyph_info_ligated (&info[i]))
     {
+      /* If font had no ASCII space and we used the invisible glyph, give it a 1/4 EM default advance. */
+      if (buffer->invisible && info[i].codepoint == buffer->invisible)
+      {
+        if (horizontal)
+         pos[i].x_advance = +font->x_scale / 4;
+        else
+         pos[i].y_advance = -font->y_scale / 4;
+      }
+
       hb_unicode_funcs_t::space_t space_type = _hb_glyph_info_get_unicode_space_fallback_type (&info[i]);
       hb_codepoint_t glyph;
       typedef hb_unicode_funcs_t t;
index 50b5829..aa5a8ee 100644 (file)
@@ -101,8 +101,9 @@ set_glyph (hb_glyph_info_t &info, hb_font_t *font)
 static inline void
 output_char (hb_buffer_t *buffer, hb_codepoint_t unichar, hb_codepoint_t glyph)
 {
+  /* This is very confusing indeed. */
   buffer->cur().glyph_index() = glyph;
-  buffer->output_glyph (unichar); /* This is very confusing indeed. */
+  (void) buffer->output_glyph (unichar);
   _hb_glyph_info_set_unicode_props (&buffer->prev(), buffer);
 }
 
@@ -110,7 +111,7 @@ static inline void
 next_char (hb_buffer_t *buffer, hb_codepoint_t glyph)
 {
   buffer->cur().glyph_index() = glyph;
-  buffer->next_glyph ();
+  (void) buffer->next_glyph ();
 }
 
 static inline void
@@ -170,7 +171,7 @@ decompose_current_character (const hb_ot_shape_normalize_context_t *c, bool shor
   hb_codepoint_t u = buffer->cur().codepoint;
   hb_codepoint_t glyph = 0;
 
-  if (shortest && c->font->get_nominal_glyph (u, &glyph))
+  if (shortest && c->font->get_nominal_glyph (u, &glyph, c->not_found))
   {
     next_char (buffer, glyph);
     return;
@@ -182,7 +183,7 @@ decompose_current_character (const hb_ot_shape_normalize_context_t *c, bool shor
     return;
   }
 
-  if (!shortest && c->font->get_nominal_glyph (u, &glyph))
+  if (!shortest && c->font->get_nominal_glyph (u, &glyph, c->not_found))
   {
     next_char (buffer, glyph);
     return;
@@ -192,7 +193,8 @@ decompose_current_character (const hb_ot_shape_normalize_context_t *c, bool shor
   {
     hb_codepoint_t space_glyph;
     hb_unicode_funcs_t::space_t space_type = buffer->unicode->space_fallback_type (u);
-    if (space_type != hb_unicode_funcs_t::NOT_SPACE && c->font->get_nominal_glyph (0x0020u, &space_glyph))
+    if (space_type != hb_unicode_funcs_t::NOT_SPACE &&
+       (c->font->get_nominal_glyph (0x0020, &space_glyph) || (space_glyph = buffer->invisible)))
     {
       _hb_glyph_info_set_unicode_space_fallback_type (&buffer->cur(), space_type);
       next_char (buffer, space_glyph);
@@ -229,30 +231,35 @@ handle_variation_selector_cluster (const hb_ot_shape_normalize_context_t *c,
       if (font->get_variation_glyph (buffer->cur().codepoint, buffer->cur(+1).codepoint, &buffer->cur().glyph_index()))
       {
        hb_codepoint_t unicode = buffer->cur().codepoint;
-       buffer->replace_glyphs (2, 1, &unicode);
+       (void) buffer->replace_glyphs (2, 1, &unicode);
       }
       else
       {
        /* Just pass on the two characters separately, let GSUB do its magic. */
        set_glyph (buffer->cur(), font);
-       buffer->next_glyph ();
+       (void) buffer->next_glyph ();
        set_glyph (buffer->cur(), font);
-       buffer->next_glyph ();
+       (void) buffer->next_glyph ();
       }
       /* Skip any further variation selectors. */
-      while (buffer->idx < end && unlikely (buffer->unicode->is_variation_selector (buffer->cur().codepoint)))
+      while (buffer->idx < end &&
+            buffer->successful &&
+            unlikely (buffer->unicode->is_variation_selector (buffer->cur().codepoint)))
       {
        set_glyph (buffer->cur(), font);
-       buffer->next_glyph ();
+       (void) buffer->next_glyph ();
       }
-    } else {
+    }
+    else
+    {
       set_glyph (buffer->cur(), font);
-      buffer->next_glyph ();
+      (void) buffer->next_glyph ();
     }
   }
-  if (likely (buffer->idx < end)) {
+  if (likely (buffer->idx < end))
+  {
     set_glyph (buffer->cur(), font);
-    buffer->next_glyph ();
+    (void) buffer->next_glyph ();
   }
 }
 
@@ -306,6 +313,7 @@ _hb_ot_shape_normalize (const hb_ot_shape_plan_t *plan,
     buffer,
     font,
     buffer->unicode,
+    buffer->not_found,
     plan->shaper->decompose ? plan->shaper->decompose : decompose_unicode,
     plan->shaper->compose   ? plan->shaper->compose   : compose_unicode
   };
@@ -348,7 +356,7 @@ _hb_ot_shape_normalize (const hb_ot_shape_plan_t *plan,
                                                      sizeof (buffer->info[0]),
                                                      &buffer->cur().glyph_index(),
                                                      sizeof (buffer->info[0]));
-       buffer->next_glyphs (done);
+       if (unlikely (!buffer->next_glyphs (done))) break;
       }
       while (buffer->idx < end && buffer->successful)
        decompose_current_character (&c, might_short_circuit);
@@ -367,13 +375,13 @@ _hb_ot_shape_normalize (const hb_ot_shape_plan_t *plan,
       decompose_multi_char_cluster (&c, end, always_short_circuit);
     }
     while (buffer->idx < count && buffer->successful);
-    buffer->swap_buffers ();
+    buffer->sync ();
   }
 
 
   /* Second round, reorder (inplace) */
 
-  if (!all_simple)
+  if (!all_simple && buffer->message(font, "start reorder"))
   {
     count = buffer->len;
     for (unsigned int i = 0; i < count; i++)
@@ -399,6 +407,7 @@ _hb_ot_shape_normalize (const hb_ot_shape_plan_t *plan,
 
       i = end;
     }
+    (void) buffer->message(font, "end reorder");
   }
   if (buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_CGJ)
   {
@@ -408,7 +417,7 @@ _hb_ot_shape_normalize (const hb_ot_shape_plan_t *plan,
      */
     for (unsigned int i = 1; i + 1 < buffer->len; i++)
       if (buffer->info[i].codepoint == 0x034Fu/*CGJ*/ &&
-         info_cc(buffer->info[i-1]) <= info_cc(buffer->info[i+1]))
+         (info_cc(buffer->info[i+1]) == 0 || info_cc(buffer->info[i-1]) <= info_cc(buffer->info[i+1])))
       {
        _hb_glyph_info_unhide (&buffer->info[i]);
       }
@@ -418,6 +427,7 @@ _hb_ot_shape_normalize (const hb_ot_shape_plan_t *plan,
   /* Third round, recompose */
 
   if (!all_simple &&
+      buffer->successful &&
       (mode == HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS ||
        mode == HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT))
   {
@@ -427,8 +437,8 @@ _hb_ot_shape_normalize (const hb_ot_shape_plan_t *plan,
     buffer->clear_output ();
     count = buffer->len;
     unsigned int starter = 0;
-    buffer->next_glyph ();
-    while (buffer->idx < count && buffer->successful)
+    (void) buffer->next_glyph ();
+    while (buffer->idx < count /* No need for: && buffer->successful */)
     {
       hb_codepoint_t composed, glyph;
       if (/* We don't try to compose a non-mark character with it's preceding starter.
@@ -450,9 +460,7 @@ _hb_ot_shape_normalize (const hb_ot_shape_plan_t *plan,
            font->get_nominal_glyph (composed, &glyph))
        {
          /* Composes. */
-         buffer->next_glyph (); /* Copy to out-buffer. */
-         if (unlikely (!buffer->successful))
-           return;
+         if (unlikely (!buffer->next_glyph ())) break; /* Copy to out-buffer. */
          buffer->merge_out_clusters (starter, buffer->out_len);
          buffer->out_len--; /* Remove the second composable. */
          /* Modify starter and carry on. */
@@ -465,12 +473,12 @@ _hb_ot_shape_normalize (const hb_ot_shape_plan_t *plan,
       }
 
       /* Blocked, or doesn't compose. */
-      buffer->next_glyph ();
+      if (unlikely (!buffer->next_glyph ())) break;
 
       if (info_cc (buffer->prev()) == 0)
        starter = buffer->out_len - 1;
     }
-    buffer->swap_buffers ();
+    buffer->sync ();
   }
 }
 
index 04f1a80..12c78a2 100644 (file)
@@ -56,6 +56,7 @@ struct hb_ot_shape_normalize_context_t
   hb_buffer_t *buffer;
   hb_font_t *font;
   hb_unicode_funcs_t *unicode;
+  const hb_codepoint_t not_found;
   bool (*decompose) (const hb_ot_shape_normalize_context_t *c,
                     hb_codepoint_t  ab,
                     hb_codepoint_t *a,
index 00ecdfa..4bd8aaf 100644 (file)
@@ -149,20 +149,26 @@ hb_ot_shape_planner_t::compile (hb_ot_shape_plan_t           &plan,
    * Decide who does positioning. GPOS, kerx, kern, or fallback.
    */
 
-  if (0)
+#ifndef HB_NO_AAT_SHAPE
+  bool has_kerx = hb_aat_layout_has_positioning (face);
+  bool has_gsub = !apply_morx && hb_ot_layout_has_substitution (face);
+#endif
+  bool has_gpos = !disable_gpos && hb_ot_layout_has_positioning (face);
+  if (false)
     ;
 #ifndef HB_NO_AAT_SHAPE
-  else if (hb_aat_layout_has_positioning (face))
+  /* Prefer GPOS over kerx if GSUB is present;
+   * https://github.com/harfbuzz/harfbuzz/issues/3008 */
+  else if (has_kerx && !(has_gsub && has_gpos))
     plan.apply_kerx = true;
 #endif
-  else if (!apply_morx && !disable_gpos && hb_ot_layout_has_positioning (face))
+  else if (has_gpos)
     plan.apply_gpos = true;
 
   if (!plan.apply_kerx && (!has_gpos_kern || !plan.apply_gpos))
   {
-    /* Apparently Apple applies kerx if GPOS kern was not applied. */
 #ifndef HB_NO_AAT_SHAPE
-    if (hb_aat_layout_has_positioning (face))
+    if (has_kerx)
       plan.apply_kerx = true;
     else
 #endif
@@ -172,6 +178,8 @@ hb_ot_shape_planner_t::compile (hb_ot_shape_plan_t           &plan,
 #endif
   }
 
+  plan.apply_fallback_kern = !(plan.apply_gpos || plan.apply_kerx || plan.apply_kern);
+
   plan.zero_marks = script_zero_marks &&
                    !plan.apply_kerx &&
                    (!plan.apply_kern
@@ -193,6 +201,12 @@ hb_ot_shape_planner_t::compile (hb_ot_shape_plan_t           &plan,
                                   script_fallback_mark_positioning;
 
 #ifndef HB_NO_AAT_SHAPE
+  /* If we're using morx shaping, we cancel mark position adjustment because
+     Apple Color Emoji assumes this will NOT be done when forming emoji sequences;
+     https://github.com/harfbuzz/harfbuzz/issues/2967. */
+  if (plan.apply_morx)
+    plan.adjust_mark_positioning_when_zeroing = false;
+
   /* Currently we always apply trak. */
   plan.apply_trak = plan.requested_tracking && hb_aat_layout_has_tracking (face);
 #endif
@@ -220,7 +234,13 @@ hb_ot_shape_plan_t::init0 (hb_face_t                     *face,
   {
     data = shaper->data_create (this);
     if (unlikely (!data))
+    {
+      map.fini ();
+#ifndef HB_NO_AAT_SHAPE
+      aat_map.fini ();
+#endif
       return false;
+    }
   }
 
   return true;
@@ -260,11 +280,12 @@ hb_ot_shape_plan_t::position (hb_font_t   *font,
   else if (this->apply_kerx)
     hb_aat_layout_position (this, font, buffer);
 #endif
+
 #ifndef HB_NO_OT_KERN
-  else if (this->apply_kern)
+  if (this->apply_kern)
     hb_ot_layout_kern (this, font, buffer);
 #endif
-  else
+  else if (this->apply_fallback_kern)
     _hb_ot_shape_fallback_kern (this, font, buffer);
 
 #ifndef HB_NO_AAT_SHAPE
@@ -300,16 +321,17 @@ horizontal_features[] =
 };
 
 static void
-hb_ot_shape_collect_features (hb_ot_shape_planner_t          *planner,
-                             const hb_feature_t             *user_features,
-                             unsigned int                    num_user_features)
+hb_ot_shape_collect_features (hb_ot_shape_planner_t *planner,
+                             const hb_feature_t    *user_features,
+                             unsigned int           num_user_features)
 {
   hb_ot_map_builder_t *map = &planner->map;
 
   map->enable_feature (HB_TAG('r','v','r','n'));
   map->add_gsub_pause (nullptr);
 
-  switch (planner->props.direction) {
+  switch (planner->props.direction)
+  {
     case HB_DIRECTION_LTR:
       map->enable_feature (HB_TAG ('l','t','r','a'));
       map->enable_feature (HB_TAG ('l','t','r','m'));
@@ -342,12 +364,14 @@ hb_ot_shape_collect_features (hb_ot_shape_planner_t          *planner,
   map->enable_feature (HB_TAG ('t','r','a','k'), F_HAS_FALLBACK);
 #endif
 
-  map->enable_feature (HB_TAG ('H','A','R','F'));
+  map->enable_feature (HB_TAG ('H','a','r','f')); /* Considered required. */
+  map->enable_feature (HB_TAG ('H','A','R','F')); /* Considered discretionary. */
 
   if (planner->shaper->collect_features)
     planner->shaper->collect_features (planner);
 
-  map->enable_feature (HB_TAG ('B','U','Z','Z'));
+  map->enable_feature (HB_TAG ('B','u','z','z')); /* Considered required. */
+  map->enable_feature (HB_TAG ('B','U','Z','Z')); /* Considered discretionary. */
 
   for (unsigned int i = 0; i < ARRAY_LENGTH (common_features); i++)
     map->add_feature (common_features[i]);
@@ -357,6 +381,10 @@ hb_ot_shape_collect_features (hb_ot_shape_planner_t          *planner,
       map->add_feature (horizontal_features[i]);
   else
   {
+    /* We only apply `vert` feature. See:
+     * https://github.com/harfbuzz/harfbuzz/commit/d71c0df2d17f4590d5611239577a6cb532c26528
+     * https://lists.freedesktop.org/archives/harfbuzz/2013-August/003490.html */
+
     /* We really want to find a 'vert' feature if there's any in the font, no
      * matter which script/langsys it is listed (or not) under.
      * See various bugs referenced from:
@@ -472,6 +500,14 @@ hb_set_unicode_props (hb_buffer_t *buffer)
     if (unlikely (_hb_glyph_info_get_general_category (&info[i]) == HB_UNICODE_GENERAL_CATEGORY_MODIFIER_SYMBOL &&
                  hb_in_range<hb_codepoint_t> (info[i].codepoint, 0x1F3FBu, 0x1F3FFu)))
     {
+      _hb_glyph_info_set_continuation (&info[i]);
+    }
+    /* Regional_Indicators are hairy as hell...
+     * https://github.com/harfbuzz/harfbuzz/issues/2265 */
+    else if (unlikely (i && hb_in_range<hb_codepoint_t> (info[i].codepoint, 0x1F1E6u, 0x1F1FFu)))
+    {
+      if (hb_in_range<hb_codepoint_t> (info[i - 1].codepoint, 0x1F1E6u, 0x1F1FFu) &&
+         !_hb_glyph_info_is_continuation (&info[i - 1]))
        _hb_glyph_info_set_continuation (&info[i]);
     }
 #ifndef HB_NO_EMOJI_SEQUENCES
@@ -528,10 +564,9 @@ hb_insert_dotted_circle (hb_buffer_t *buffer, hb_font_t *font)
   hb_glyph_info_t info = dottedcircle;
   info.cluster = buffer->cur().cluster;
   info.mask = buffer->cur().mask;
-  buffer->output_info (info);
-  while (buffer->idx < buffer->len && buffer->successful)
-    buffer->next_glyph ();
-  buffer->swap_buffers ();
+  (void) buffer->output_info (info);
+
+  buffer->sync ();
 }
 
 static void
@@ -554,6 +589,36 @@ hb_ensure_native_direction (hb_buffer_t *buffer)
   hb_direction_t direction = buffer->props.direction;
   hb_direction_t horiz_dir = hb_script_get_horizontal_direction (buffer->props.script);
 
+  /* Numeric runs in natively-RTL scripts are actually native-LTR, so we reset
+   * the horiz_dir if the run contains at least one decimal-number char, and no
+   * letter chars (ideally we should be checking for chars with strong
+   * directionality but hb-unicode currently lacks bidi categories).
+   *
+   * This allows digit sequences in Arabic etc to be shaped in "native"
+   * direction, so that features like ligatures will work as intended.
+   *
+   * https://github.com/harfbuzz/harfbuzz/issues/501
+   */
+  if (unlikely (horiz_dir == HB_DIRECTION_RTL && direction == HB_DIRECTION_LTR))
+  {
+    bool found_number = false, found_letter = false;
+    const auto* info = buffer->info;
+    const auto count = buffer->len;
+    for (unsigned i = 0; i < count; i++)
+    {
+      auto gc = _hb_glyph_info_get_general_category (&info[i]);
+      if (gc == HB_UNICODE_GENERAL_CATEGORY_DECIMAL_NUMBER)
+        found_number = true;
+      else if (HB_UNICODE_GENERAL_CATEGORY_IS_LETTER (gc))
+      {
+        found_letter = true;
+        break;
+      }
+    }
+    if (found_number && !found_letter)
+      horiz_dir = HB_DIRECTION_LTR;
+  }
+
   /* TODO vertical:
    * The only BTT vertical script is Ogham, but it's not clear to me whether OpenType
    * Ogham fonts are supposed to be implemented BTT or not.  Need to research that
@@ -563,20 +628,7 @@ hb_ensure_native_direction (hb_buffer_t *buffer)
       (HB_DIRECTION_IS_VERTICAL   (direction) &&
        direction != HB_DIRECTION_TTB))
   {
-
-    if (buffer->cluster_level == HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS)
-      foreach_grapheme (buffer, start, end)
-      {
-       buffer->merge_clusters (start, end);
-       buffer->reverse_range (start, end);
-      }
-    else
-      foreach_grapheme (buffer, start, end)
-       /* form_clusters() merged clusters already, we don't merge. */
-       buffer->reverse_range (start, end);
-
-    buffer->reverse ();
-
+    _hb_ot_layout_reverse_graphemes (buffer);
     buffer->props.direction = HB_DIRECTION_REVERSE (buffer->props.direction);
   }
 }
@@ -586,6 +638,7 @@ hb_ensure_native_direction (hb_buffer_t *buffer)
  * Substitute
  */
 
+#ifndef HB_NO_VERTICAL
 static hb_codepoint_t
 hb_vert_char_for (hb_codepoint_t u)
 {
@@ -636,6 +689,7 @@ hb_vert_char_for (hb_codepoint_t u)
 
   return u;
 }
+#endif
 
 static inline void
 hb_ot_rotate_chars (const hb_ot_shape_context_t *c)
@@ -658,6 +712,7 @@ hb_ot_rotate_chars (const hb_ot_shape_context_t *c)
     }
   }
 
+#ifndef HB_NO_VERTICAL
   if (HB_DIRECTION_IS_VERTICAL (c->target_direction) && !c->plan->has_vert)
   {
     for (unsigned int i = 0; i < count; i++) {
@@ -666,6 +721,7 @@ hb_ot_rotate_chars (const hb_ot_shape_context_t *c)
        info[i].codepoint = codepoint;
     }
   }
+#endif
 }
 
 static inline void
@@ -890,8 +946,11 @@ hb_ot_substitute_post (const hb_ot_shape_context_t *c)
     hb_aat_layout_remove_deleted_glyphs (c->buffer);
 #endif
 
-  if (c->plan->shaper->postprocess_glyphs)
+  if (c->plan->shaper->postprocess_glyphs &&
+    c->buffer->message(c->font, "start postprocess-glyphs")) {
     c->plan->shaper->postprocess_glyphs (c->plan, c->buffer, c->font);
+    (void) c->buffer->message(c->font, "end postprocess-glyphs");
+  }
 }
 
 
@@ -975,7 +1034,7 @@ hb_ot_position_complex (const hb_ot_shape_context_t *c)
    * hanging over the next glyph after the final reordering.
    *
    * Note: If fallback positinoing happens, we don't care about
-   * this as it will be overriden.
+   * this as it will be overridden.
    */
   bool adjust_offsets_when_zeroing = c->plan->adjust_mark_positioning_when_zeroing &&
                                     HB_DIRECTION_IS_FORWARD (c->buffer->props.direction);
@@ -1061,7 +1120,7 @@ hb_propagate_flags (hb_buffer_t *buffer)
   /* Propagate cluster-level glyph flags to be the same on all cluster glyphs.
    * Simplifies using them. */
 
-  if (!(buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_UNSAFE_TO_BREAK))
+  if (!(buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_GLYPH_FLAGS))
     return;
 
   hb_glyph_info_t *info = buffer->info;
@@ -1070,11 +1129,7 @@ hb_propagate_flags (hb_buffer_t *buffer)
   {
     unsigned int mask = 0;
     for (unsigned int i = start; i < end; i++)
-      if (info[i].mask & HB_GLYPH_FLAG_UNSAFE_TO_BREAK)
-      {
-        mask = HB_GLYPH_FLAG_UNSAFE_TO_BREAK;
-        break;
-      }
+      mask |= info[i].mask & HB_GLYPH_FLAG_DEFINED;
     if (mask)
       for (unsigned int i = start; i < end; i++)
        info[i].mask |= mask;
@@ -1086,26 +1141,13 @@ hb_propagate_flags (hb_buffer_t *buffer)
 static void
 hb_ot_shape_internal (hb_ot_shape_context_t *c)
 {
-  c->buffer->deallocate_var_all ();
-  c->buffer->scratch_flags = HB_BUFFER_SCRATCH_FLAG_DEFAULT;
-  if (likely (!hb_unsigned_mul_overflows (c->buffer->len, HB_BUFFER_MAX_LEN_FACTOR)))
-  {
-    c->buffer->max_len = hb_max (c->buffer->len * HB_BUFFER_MAX_LEN_FACTOR,
-                             (unsigned) HB_BUFFER_MAX_LEN_MIN);
-  }
-  if (likely (!hb_unsigned_mul_overflows (c->buffer->len, HB_BUFFER_MAX_OPS_FACTOR)))
-  {
-    c->buffer->max_ops = hb_max (c->buffer->len * HB_BUFFER_MAX_OPS_FACTOR,
-                             (unsigned) HB_BUFFER_MAX_OPS_MIN);
-  }
+  c->buffer->enter ();
 
   /* Save the original direction, we use it later. */
   c->target_direction = c->buffer->props.direction;
 
   _hb_buffer_allocate_unicode_vars (c->buffer);
 
-  c->buffer->clear_output ();
-
   hb_ot_shape_initialize_masks (c);
   hb_set_unicode_props (c->buffer);
   hb_insert_dotted_circle (c->buffer, c->font);
@@ -1114,8 +1156,12 @@ hb_ot_shape_internal (hb_ot_shape_context_t *c)
 
   hb_ensure_native_direction (c->buffer);
 
-  if (c->plan->shaper->preprocess_text)
+  if (c->plan->shaper->preprocess_text &&
+      c->buffer->message(c->font, "start preprocess-text"))
+  {
     c->plan->shaper->preprocess_text (c->plan, c->buffer, c->font);
+    (void) c->buffer->message(c->font, "end preprocess-text");
+  }
 
   hb_ot_substitute_pre (c);
   hb_ot_position (c);
@@ -1127,9 +1173,7 @@ hb_ot_shape_internal (hb_ot_shape_context_t *c)
 
   c->buffer->props.direction = c->target_direction;
 
-  c->buffer->max_len = HB_BUFFER_MAX_LEN_DEFAULT;
-  c->buffer->max_ops = HB_BUFFER_MAX_OPS_DEFAULT;
-  c->buffer->deallocate_var_all ();
+  c->buffer->leave ();
 }
 
 
@@ -1149,6 +1193,12 @@ _hb_ot_shape (hb_shape_plan_t    *shape_plan,
 
 /**
  * hb_ot_shape_plan_collect_lookups:
+ * @shape_plan: #hb_shape_plan_t to query
+ * @table_tag: GSUB or GPOS
+ * @lookup_indexes: (out): The #hb_set_t set of lookups returned
+ *
+ * Computes the complete set of GSUB or GPOS lookups that are applicable
+ * under a given @shape_plan.
  *
  * Since: 0.9.7
  **/
@@ -1183,6 +1233,15 @@ add_char (hb_font_t          *font,
 
 /**
  * hb_ot_shape_glyphs_closure:
+ * @font: #hb_font_t to work upon
+ * @buffer: The input buffer to compute from
+ * @features: (array length=num_features): The features enabled on the buffer
+ * @num_features: The number of features enabled on the buffer
+ * @glyphs: (out): The #hb_set_t set of glyphs comprising the transitive closure of the query
+ *
+ * Computes the transitive closure of glyphs needed for a specified
+ * input buffer under the given font and feature list. The closure is
+ * computed as a set, not as a list.
  *
  * Since: 0.9.2
  **/
index 7b1bcc0..afdff72 100644 (file)
@@ -24,7 +24,7 @@
  * Red Hat Author(s): Behdad Esfahbod
  */
 
-#ifndef HB_OT_H_IN
+#if !defined(HB_OT_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb-ot.h> instead."
 #endif
 
index acc9877..e8c8101 100644 (file)
@@ -112,6 +112,7 @@ struct hb_ot_shape_plan_t
 #else
   static constexpr bool apply_kern = false;
 #endif
+  bool apply_fallback_kern : 1;
 #ifndef HB_NO_AAT_SHAPE
   bool apply_kerx : 1;
   bool apply_morx : 1;
index 8813523..41d1734 100644 (file)
@@ -59,6 +59,9 @@ enum
 
 struct AxisValueFormat1
 {
+  unsigned int get_axis_index () const { return axisIndex; }
+  float get_value ()             const { return value.to_float (); }
+
   hb_ot_name_id_t get_value_name_id () const { return valueNameID; }
 
   bool sanitize (hb_sanitize_context_t *c) const
@@ -84,6 +87,9 @@ struct AxisValueFormat1
 
 struct AxisValueFormat2
 {
+  unsigned int get_axis_index () const { return axisIndex; }
+  float get_value ()             const { return nominalValue.to_float (); }
+
   hb_ot_name_id_t get_value_name_id () const { return valueNameID; }
 
   bool sanitize (hb_sanitize_context_t *c) const
@@ -113,6 +119,9 @@ struct AxisValueFormat2
 
 struct AxisValueFormat3
 {
+  unsigned int get_axis_index () const { return axisIndex; }
+  float get_value ()             const { return value.to_float (); }
+
   hb_ot_name_id_t get_value_name_id () const { return valueNameID; }
 
   bool sanitize (hb_sanitize_context_t *c) const
@@ -140,6 +149,9 @@ struct AxisValueFormat3
 
 struct AxisValueRecord
 {
+  unsigned int get_axis_index () const { return axisIndex; }
+  float get_value ()             const { return value.to_float (); }
+
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -157,6 +169,9 @@ struct AxisValueRecord
 
 struct AxisValueFormat4
 {
+  const AxisValueRecord &get_axis_record (unsigned int axis_index) const
+  { return axisValues.as_array (axisCount)[axis_index]; }
+
   hb_ot_name_id_t get_value_name_id () const { return valueNameID; }
 
   bool sanitize (hb_sanitize_context_t *c) const
@@ -183,6 +198,30 @@ struct AxisValueFormat4
 
 struct AxisValue
 {
+  bool get_value (unsigned int axis_index) const
+  {
+    switch (u.format)
+    {
+    case 1: return u.format1.get_value ();
+    case 2: return u.format2.get_value ();
+    case 3: return u.format3.get_value ();
+    case 4: return u.format4.get_axis_record (axis_index).get_value ();
+    default:return 0;
+    }
+  }
+
+  unsigned int get_axis_index () const
+  {
+    switch (u.format)
+    {
+    case 1: return u.format1.get_axis_index ();
+    case 2: return u.format2.get_axis_index ();
+    case 3: return u.format3.get_axis_index ();
+    /* case 4: Makes more sense for variable fonts which are handled by fvar in hb-style */
+    default:return -1;
+    }
+  }
+
   hb_ot_name_id_t get_value_name_id () const
   {
     switch (u.format)
@@ -226,6 +265,8 @@ struct AxisValue
 
 struct StatAxisRecord
 {
+  int cmp (hb_tag_t key) const { return tag.cmp (key); }
+
   hb_ot_name_id_t get_name_id () const { return nameID; }
 
   bool sanitize (hb_sanitize_context_t *c) const
@@ -251,6 +292,25 @@ struct STAT
 
   bool has_data () const { return version.to_int (); }
 
+  bool get_value (hb_tag_t tag, float *value) const
+  {
+    unsigned int axis_index;
+    if (!get_design_axes ().lfind (tag, &axis_index)) return false;
+
+    hb_array_t<const Offset16To<AxisValue>> axis_values = get_axis_value_offsets ();
+    for (unsigned int i = 0; i < axis_values.length; i++)
+    {
+      const AxisValue& axis_value = this+axis_values[i];
+      if (axis_value.get_axis_index () == axis_index)
+      {
+       if (value)
+         *value = axis_value.get_value (axis_index);
+       return true;
+      }
+    }
+    return false;
+  }
+
   unsigned get_design_axis_count () const { return designAxisCount; }
 
   hb_ot_name_id_t get_axis_record_name_id (unsigned axis_record_index) const
@@ -299,7 +359,7 @@ struct STAT
   hb_array_t<const StatAxisRecord> const get_design_axes () const
   { return (this+designAxesOffset).as_array (designAxisCount); }
 
-  hb_array_t<const OffsetTo<AxisValue>> const get_axis_value_offsets () const
+  hb_array_t<const Offset16To<AxisValue>> const get_axis_value_offsets () const
   { return (this+offsetToAxisValueOffsets).as_array (axisValueCount); }
 
 
@@ -313,7 +373,7 @@ struct STAT
                                 * in the 'fvar' table. In all fonts, must
                                 * be greater than zero if axisValueCount
                                 * is greater than zero. */
-  LNNOffsetTo<UnsizedArrayOf<StatAxisRecord>>
+  NNOffset32To<UnsizedArrayOf<StatAxisRecord>>
                designAxesOffset;
                                /* Offset in bytes from the beginning of
                                 * the STAT table to the start of the design
@@ -321,7 +381,7 @@ struct STAT
                                 * set to zero; if designAxisCount is greater
                                 * than zero, must be greater than zero. */
   HBUINT16     axisValueCount; /* The number of axis value tables. */
-  LNNOffsetTo<UnsizedArrayOf<OffsetTo<AxisValue>>>
+  NNOffset32To<UnsizedArrayOf<Offset16To<AxisValue>>>
                offsetToAxisValueOffsets;
                                /* Offset in bytes from the beginning of
                                 * the STAT table to the start of the design
index 99937d9..61d2814 100644 (file)
@@ -6,8 +6,8 @@
  *
  * on files with these headers:
  *
- * <meta name="updated_at" content="2019-05-22 06:05 PM" />
- * File-Date: 2020-05-12
+ * <meta name="updated_at" content="2022-01-28 10:00 PM" />
+ * File-Date: 2021-12-29
  */
 
 #ifndef HB_OT_TAG_TABLE_HH
@@ -19,14 +19,18 @@ static const LangTag ot_languages[] = {
   {"aao",      HB_TAG('A','R','A',' ')},       /* Algerian Saharan Arabic -> Arabic */
   {"aat",      HB_TAG('S','Q','I',' ')},       /* Arvanitika Albanian -> Albanian */
   {"ab",       HB_TAG('A','B','K',' ')},       /* Abkhazian */
+  {"aba",      HB_TAG_NONE            },       /* Abé != Abaza */
   {"abh",      HB_TAG('A','R','A',' ')},       /* Tajiki Arabic -> Arabic */
   {"abq",      HB_TAG('A','B','A',' ')},       /* Abaza */
+  {"abs",      HB_TAG('C','P','P',' ')},       /* Ambonese Malay -> Creoles */
   {"abv",      HB_TAG('A','R','A',' ')},       /* Baharna Arabic -> Arabic */
   {"acf",      HB_TAG('F','A','N',' ')},       /* Saint Lucian Creole French -> French Antillean */
+  {"acf",      HB_TAG('C','P','P',' ')},       /* Saint Lucian Creole French -> Creoles */
 /*{"ach",      HB_TAG('A','C','H',' ')},*/     /* Acoli -> Acholi */
   {"acm",      HB_TAG('A','R','A',' ')},       /* Mesopotamian Arabic -> Arabic */
   {"acq",      HB_TAG('A','R','A',' ')},       /* Ta'izzi-Adeni Arabic -> Arabic */
-/*{"acr",      HB_TAG('A','C','R',' ')},*/     /* Achi */
+  {"acr",      HB_TAG('A','C','R',' ')},       /* Achi */
+  {"acr",      HB_TAG('M','Y','N',' ')},       /* Achi -> Mayan */
   {"acw",      HB_TAG('A','R','A',' ')},       /* Hijazi Arabic -> Arabic */
   {"acx",      HB_TAG('A','R','A',' ')},       /* Omani Arabic -> Arabic */
   {"acy",      HB_TAG('A','R','A',' ')},       /* Cypriot Arabic -> Arabic */
@@ -38,15 +42,21 @@ static const LangTag ot_languages[] = {
   {"aec",      HB_TAG('A','R','A',' ')},       /* Saidi Arabic -> Arabic */
   {"af",       HB_TAG('A','F','K',' ')},       /* Afrikaans */
   {"afb",      HB_TAG('A','R','A',' ')},       /* Gulf Arabic -> Arabic */
+  {"afk",      HB_TAG_NONE            },       /* Nanubae != Afrikaans */
+  {"afs",      HB_TAG('C','P','P',' ')},       /* Afro-Seminole Creole -> Creoles */
+  {"agu",      HB_TAG('M','Y','N',' ')},       /* Aguacateco -> Mayan */
+  {"agw",      HB_TAG_NONE            },       /* Kahua != Agaw */
   {"ahg",      HB_TAG('A','G','W',' ')},       /* Qimant -> Agaw */
   {"aht",      HB_TAG('A','T','H',' ')},       /* Ahtena -> Athapaskan */
+  {"aig",      HB_TAG('C','P','P',' ')},       /* Antigua and Barbuda Creole English -> Creoles */
   {"aii",      HB_TAG('S','W','A',' ')},       /* Assyrian Neo-Aramaic -> Swadaya Aramaic */
   {"aii",      HB_TAG('S','Y','R',' ')},       /* Assyrian Neo-Aramaic -> Syriac */
 /*{"aio",      HB_TAG('A','I','O',' ')},*/     /* Aiton */
   {"aiw",      HB_TAG('A','R','I',' ')},       /* Aari */
   {"ajp",      HB_TAG('A','R','A',' ')},       /* South Levantine Arabic -> Arabic */
   {"ak",       HB_TAG('A','K','A',' ')},       /* Akan [macrolanguage] */
-  {"ak",       HB_TAG('T','W','I',' ')},       /* Akan [macrolanguage] -> Twi */
+  {"akb",      HB_TAG('A','K','B',' ')},       /* Batak Angkola */
+  {"akb",      HB_TAG('B','T','K',' ')},       /* Batak Angkola -> Batak */
   {"aln",      HB_TAG('S','Q','I',' ')},       /* Gheg Albanian -> Albanian */
   {"als",      HB_TAG('S','Q','I',' ')},       /* Tosk Albanian -> Albanian */
 /*{"alt",      HB_TAG('A','L','T',' ')},*/     /* Southern Altai -> Altai */
@@ -55,6 +65,8 @@ static const LangTag ot_languages[] = {
   {"amw",      HB_TAG('S','Y','R',' ')},       /* Western Neo-Aramaic -> Syriac */
   {"an",       HB_TAG('A','R','G',' ')},       /* Aragonese */
 /*{"ang",      HB_TAG('A','N','G',' ')},*/     /* Old English (ca. 450-1100) -> Anglo-Saxon */
+  {"aoa",      HB_TAG('C','P','P',' ')},       /* Angolar -> Creoles */
+  {"apa",      HB_TAG('A','T','H',' ')},       /* Apache [collection] -> Athapaskan */
   {"apc",      HB_TAG('A','R','A',' ')},       /* North Levantine Arabic -> Arabic */
   {"apd",      HB_TAG('A','R','A',' ')},       /* Sudanese Arabic -> Arabic */
   {"apj",      HB_TAG('A','T','H',' ')},       /* Jicarilla Apache -> Athapaskan */
@@ -64,19 +76,24 @@ static const LangTag ot_languages[] = {
   {"apw",      HB_TAG('A','T','H',' ')},       /* Western Apache -> Athapaskan */
   {"ar",       HB_TAG('A','R','A',' ')},       /* Arabic [macrolanguage] */
   {"arb",      HB_TAG('A','R','A',' ')},       /* Standard Arabic -> Arabic */
+  {"ari",      HB_TAG_NONE            },       /* Arikara != Aari */
+  {"ark",      HB_TAG_NONE            },       /* Arikapú != Rakhine */
   {"arn",      HB_TAG('M','A','P',' ')},       /* Mapudungun */
   {"arq",      HB_TAG('A','R','A',' ')},       /* Algerian Arabic -> Arabic */
   {"ars",      HB_TAG('A','R','A',' ')},       /* Najdi Arabic -> Arabic */
   {"ary",      HB_TAG('M','O','R',' ')},       /* Moroccan Arabic -> Moroccan */
+  {"ary",      HB_TAG('A','R','A',' ')},       /* Moroccan Arabic -> Arabic */
   {"arz",      HB_TAG('A','R','A',' ')},       /* Egyptian Arabic -> Arabic */
   {"as",       HB_TAG('A','S','M',' ')},       /* Assamese */
 /*{"ast",      HB_TAG('A','S','T',' ')},*/     /* Asturian */
-/*{"ath",      HB_TAG('A','T','H',' ')},*/     /* Athapascan [family] -> Athapaskan */
+/*{"ath",      HB_TAG('A','T','H',' ')},*/     /* Athapascan [collection] -> Athapaskan */
   {"atj",      HB_TAG('R','C','R',' ')},       /* Atikamekw -> R-Cree */
   {"atv",      HB_TAG('A','L','T',' ')},       /* Northern Altai -> Altai */
+  {"auj",      HB_TAG('B','B','R',' ')},       /* Awjilah -> Berber */
   {"auz",      HB_TAG('A','R','A',' ')},       /* Uzbeki Arabic -> Arabic */
   {"av",       HB_TAG('A','V','R',' ')},       /* Avaric -> Avar */
   {"avl",      HB_TAG('A','R','A',' ')},       /* Eastern Egyptian Bedawi Arabic -> Arabic */
+/*{"avn",      HB_TAG('A','V','N',' ')},*/     /* Avatime */
 /*{"awa",      HB_TAG('A','W','A',' ')},*/     /* Awadhi */
   {"ay",       HB_TAG('A','Y','M',' ')},       /* Aymara [macrolanguage] */
   {"ayc",      HB_TAG('A','Y','M',' ')},       /* Southern Aymara -> Aymara */
@@ -86,17 +103,29 @@ static const LangTag ot_languages[] = {
   {"ayp",      HB_TAG('A','R','A',' ')},       /* North Mesopotamian Arabic -> Arabic */
   {"ayr",      HB_TAG('A','Y','M',' ')},       /* Central Aymara -> Aymara */
   {"az",       HB_TAG('A','Z','E',' ')},       /* Azerbaijani [macrolanguage] */
-/*{"azb",      HB_TAG('A','Z','B',' ')},*/     /* South Azerbaijani -> Torki */
+  {"azb",      HB_TAG('A','Z','B',' ')},       /* South Azerbaijani -> Torki */
+  {"azb",      HB_TAG('A','Z','E',' ')},       /* South Azerbaijani -> Azerbaijani */
+  {"azd",      HB_TAG('N','A','H',' ')},       /* Eastern Durango Nahuatl -> Nahuatl */
   {"azj",      HB_TAG('A','Z','E',' ')},       /* North Azerbaijani -> Azerbaijani */
+  {"azn",      HB_TAG('N','A','H',' ')},       /* Western Durango Nahuatl -> Nahuatl */
+  {"azz",      HB_TAG('N','A','H',' ')},       /* Highland Puebla Nahuatl -> Nahuatl */
   {"ba",       HB_TAG('B','S','H',' ')},       /* Bashkir */
-  {"bad",      HB_TAG('B','A','D','0')},       /* Banda [family] */
-  {"bai",      HB_TAG('B','M','L',' ')},       /* Bamileke [family] */
+  {"bad",      HB_TAG('B','A','D','0')},       /* Banda [collection] */
+  {"bag",      HB_TAG_NONE            },       /* Tuki != Baghelkhandi */
+  {"bah",      HB_TAG('C','P','P',' ')},       /* Bahamas Creole English -> Creoles */
+  {"bai",      HB_TAG('B','M','L',' ')},       /* Bamileke [collection] */
   {"bal",      HB_TAG('B','L','I',' ')},       /* Baluchi [macrolanguage] */
 /*{"ban",      HB_TAG('B','A','N',' ')},*/     /* Balinese */
 /*{"bar",      HB_TAG('B','A','R',' ')},*/     /* Bavarian */
-/*{"bbc",      HB_TAG('B','B','C',' ')},*/     /* Batak Toba */
+  {"bau",      HB_TAG_NONE            },       /* Bada (Nigeria) != Baulé */
+  {"bbc",      HB_TAG('B','B','C',' ')},       /* Batak Toba */
+  {"bbc",      HB_TAG('B','T','K',' ')},       /* Batak Toba -> Batak */
+  {"bbj",      HB_TAG('B','M','L',' ')},       /* Ghomálá' -> Bamileke */
+  {"bbp",      HB_TAG('B','A','D','0')},       /* West Central Banda -> Banda */
+  {"bbr",      HB_TAG_NONE            },       /* Girawa != Berber */
   {"bbz",      HB_TAG('A','R','A',' ')},       /* Babalia Creole Arabic (retired code) -> Arabic */
   {"bcc",      HB_TAG('B','L','I',' ')},       /* Southern Balochi -> Baluchi */
+  {"bch",      HB_TAG_NONE            },       /* Bariai != Bench */
   {"bci",      HB_TAG('B','A','U',' ')},       /* Baoulé -> Baulé */
   {"bcl",      HB_TAG('B','I','K',' ')},       /* Central Bikol -> Bikol */
   {"bcq",      HB_TAG('B','C','H',' ')},       /* Bench */
@@ -106,7 +135,9 @@ static const LangTag ot_languages[] = {
   {"bea",      HB_TAG('A','T','H',' ')},       /* Beaver -> Athapaskan */
   {"beb",      HB_TAG('B','T','I',' ')},       /* Bebele -> Beti */
 /*{"bem",      HB_TAG('B','E','M',' ')},*/     /* Bemba (Zambia) */
-  {"ber",      HB_TAG('B','B','R',' ')},       /* Berber [family] */
+  {"ber",      HB_TAG('B','B','R',' ')},       /* Berber [collection] */
+  {"bew",      HB_TAG('C','P','P',' ')},       /* Betawi -> Creoles */
+  {"bfl",      HB_TAG('B','A','D','0')},       /* Banda-Ndélé -> Banda */
   {"bfq",      HB_TAG('B','A','D',' ')},       /* Badaga */
   {"bft",      HB_TAG('B','L','T',' ')},       /* Balti */
   {"bfu",      HB_TAG('L','A','H',' ')},       /* Gahri -> Lahuli */
@@ -115,7 +146,8 @@ static const LangTag ot_languages[] = {
 /*{"bgc",      HB_TAG('B','G','C',' ')},*/     /* Haryanvi */
   {"bgn",      HB_TAG('B','L','I',' ')},       /* Western Balochi -> Baluchi */
   {"bgp",      HB_TAG('B','L','I',' ')},       /* Eastern Balochi -> Baluchi */
-/*{"bgq",      HB_TAG('B','G','Q',' ')},*/     /* Bagri */
+  {"bgq",      HB_TAG('B','G','Q',' ')},       /* Bagri */
+  {"bgq",      HB_TAG('R','A','J',' ')},       /* Bagri -> Rajasthani */
   {"bgr",      HB_TAG('Q','I','N',' ')},       /* Bawm Chin -> Chin */
   {"bhb",      HB_TAG('B','H','I',' ')},       /* Bhili */
 /*{"bhi",      HB_TAG('B','H','I',' ')},*/     /* Bhilali -> Bhili */
@@ -123,58 +155,110 @@ static const LangTag ot_languages[] = {
 /*{"bho",      HB_TAG('B','H','O',' ')},*/     /* Bhojpuri */
   {"bhr",      HB_TAG('M','L','G',' ')},       /* Bara Malagasy -> Malagasy */
   {"bi",       HB_TAG('B','I','S',' ')},       /* Bislama */
+  {"bi",       HB_TAG('C','P','P',' ')},       /* Bislama -> Creoles */
 /*{"bik",      HB_TAG('B','I','K',' ')},*/     /* Bikol [macrolanguage] */
+  {"bil",      HB_TAG_NONE            },       /* Bile != Bilen */
   {"bin",      HB_TAG('E','D','O',' ')},       /* Edo */
+  {"biu",      HB_TAG('Q','I','N',' ')},       /* Biete -> Chin */
 /*{"bjj",      HB_TAG('B','J','J',' ')},*/     /* Kanauji */
   {"bjn",      HB_TAG('M','L','Y',' ')},       /* Banjar -> Malay */
+  {"bjo",      HB_TAG('B','A','D','0')},       /* Mid-Southern Banda -> Banda */
   {"bjq",      HB_TAG('M','L','G',' ')},       /* Southern Betsimisaraka Malagasy (retired code) -> Malagasy */
+  {"bjs",      HB_TAG('C','P','P',' ')},       /* Bajan -> Creoles */
   {"bjt",      HB_TAG('B','L','N',' ')},       /* Balanta-Ganja -> Balante */
+  {"bkf",      HB_TAG_NONE            },       /* Beeke != Blackfoot */
+  {"bko",      HB_TAG('B','M','L',' ')},       /* Kwa' -> Bamileke */
   {"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 */
+  {"blg",      HB_TAG('I','B','A',' ')},       /* Balau (retired code) -> Iban */
+  {"bli",      HB_TAG_NONE            },       /* Bolia != Baluchi */
+  {"blk",      HB_TAG('B','L','K',' ')},       /* Pa’o Karen */
+  {"blk",      HB_TAG('K','R','N',' ')},       /* Pa'o Karen -> Karen */
   {"bln",      HB_TAG('B','I','K',' ')},       /* Southern Catanduanes Bikol -> Bikol */
+  {"blt",      HB_TAG_NONE            },       /* Tai Dam != Balti */
   {"bm",       HB_TAG('B','M','B',' ')},       /* Bambara (Bamanankan) */
+  {"bmb",      HB_TAG_NONE            },       /* Bembe != Bambara (Bamanankan) */
+  {"bml",      HB_TAG_NONE            },       /* Bomboli != Bamileke */
   {"bmm",      HB_TAG('M','L','G',' ')},       /* Northern Betsimisaraka Malagasy -> Malagasy */
   {"bn",       HB_TAG('B','E','N',' ')},       /* Bengali */
   {"bo",       HB_TAG('T','I','B',' ')},       /* Tibetan */
+  {"bpd",      HB_TAG('B','A','D','0')},       /* Banda-Banda -> Banda */
+  {"bpl",      HB_TAG('C','P','P',' ')},       /* Broome Pearling Lugger Pidgin -> Creoles */
+  {"bpq",      HB_TAG('C','P','P',' ')},       /* Banda Malay -> Creoles */
 /*{"bpy",      HB_TAG('B','P','Y',' ')},*/     /* Bishnupriya -> Bishnupriya Manipuri */
   {"bqi",      HB_TAG('L','R','C',' ')},       /* Bakhtiari -> Luri */
+  {"bqk",      HB_TAG('B','A','D','0')},       /* Banda-Mbrès -> Banda */
   {"br",       HB_TAG('B','R','E',' ')},       /* Breton */
   {"bra",      HB_TAG('B','R','I',' ')},       /* Braj -> Braj Bhasha */
+  {"brc",      HB_TAG('C','P','P',' ')},       /* Berbice Creole Dutch -> Creoles */
 /*{"brh",      HB_TAG('B','R','H',' ')},*/     /* Brahui */
+  {"bri",      HB_TAG_NONE            },       /* Mokpwe != Braj Bhasha */
+  {"brm",      HB_TAG_NONE            },       /* Barambu != Burmese */
 /*{"brx",      HB_TAG('B','R','X',' ')},*/     /* Bodo (India) */
   {"bs",       HB_TAG('B','O','S',' ')},       /* Bosnian */
+  {"bsh",      HB_TAG_NONE            },       /* Kati != Bashkir */
 /*{"bsk",      HB_TAG('B','S','K',' ')},*/     /* Burushaski */
   {"btb",      HB_TAG('B','T','I',' ')},       /* Beti (Cameroon) (retired code) */
+  {"btd",      HB_TAG('B','T','D',' ')},       /* Batak Dairi (Pakpak) */
+  {"btd",      HB_TAG('B','T','K',' ')},       /* Batak Dairi -> Batak */
+  {"bti",      HB_TAG_NONE            },       /* Burate != Beti */
   {"btj",      HB_TAG('M','L','Y',' ')},       /* Bacanese Malay -> Malay */
+/*{"btk",      HB_TAG('B','T','K',' ')},*/     /* Batak [collection] */
+  {"btm",      HB_TAG('B','T','M',' ')},       /* Batak Mandailing */
+  {"btm",      HB_TAG('B','T','K',' ')},       /* Batak Mandailing -> Batak */
   {"bto",      HB_TAG('B','I','K',' ')},       /* Rinconada Bikol -> Bikol */
-/*{"bts",      HB_TAG('B','T','S',' ')},*/     /* Batak Simalungun */
+  {"bts",      HB_TAG('B','T','S',' ')},       /* Batak Simalungun */
+  {"bts",      HB_TAG('B','T','K',' ')},       /* Batak Simalungun -> Batak */
+  {"btx",      HB_TAG('B','T','X',' ')},       /* Batak Karo */
+  {"btx",      HB_TAG('B','T','K',' ')},       /* Batak Karo -> Batak */
+  {"btz",      HB_TAG('B','T','Z',' ')},       /* Batak Alas-Kluet */
+  {"btz",      HB_TAG('B','T','K',' ')},       /* Batak Alas-Kluet -> Batak */
 /*{"bug",      HB_TAG('B','U','G',' ')},*/     /* Buginese -> Bugis */
   {"bum",      HB_TAG('B','T','I',' ')},       /* Bulu (Cameroon) -> Beti */
   {"bve",      HB_TAG('M','L','Y',' ')},       /* Berau Malay -> Malay */
   {"bvu",      HB_TAG('M','L','Y',' ')},       /* Bukit Malay -> Malay */
+  {"bwe",      HB_TAG('K','R','N',' ')},       /* Bwe Karen -> Karen */
   {"bxk",      HB_TAG('L','U','H',' ')},       /* Bukusu -> Luyia */
+  {"bxo",      HB_TAG('C','P','P',' ')},       /* Barikanchi -> Creoles */
   {"bxp",      HB_TAG('B','T','I',' ')},       /* Bebil -> Beti */
   {"bxr",      HB_TAG('R','B','U',' ')},       /* Russia Buriat -> Russian Buriat */
   {"byn",      HB_TAG('B','I','L',' ')},       /* Bilin -> Bilen */
-/*{"byv",      HB_TAG('B','Y','V',' ')},*/     /* Medumba */
+  {"byv",      HB_TAG('B','Y','V',' ')},       /* Medumba */
+  {"byv",      HB_TAG('B','M','L',' ')},       /* Medumba -> Bamileke */
   {"bzc",      HB_TAG('M','L','G',' ')},       /* Southern Betsimisaraka Malagasy -> Malagasy */
+  {"bzj",      HB_TAG('C','P','P',' ')},       /* Belize Kriol English -> Creoles */
+  {"bzk",      HB_TAG('C','P','P',' ')},       /* Nicaragua Creole English -> Creoles */
   {"ca",       HB_TAG('C','A','T',' ')},       /* Catalan */
+  {"caa",      HB_TAG('M','Y','N',' ')},       /* Chortí -> Mayan */
+  {"cac",      HB_TAG('M','Y','N',' ')},       /* Chuj -> Mayan */
   {"caf",      HB_TAG('C','R','R',' ')},       /* Southern Carrier -> Carrier */
   {"caf",      HB_TAG('A','T','H',' ')},       /* Southern Carrier -> Athapaskan */
-/*{"cak",      HB_TAG('C','A','K',' ')},*/     /* Kaqchikel */
-/*{"cbk",      HB_TAG('C','B','K',' ')},*/     /* Chavacano -> Zamboanga Chavacano */
+  {"cak",      HB_TAG('C','A','K',' ')},       /* Kaqchikel */
+  {"cak",      HB_TAG('M','Y','N',' ')},       /* Kaqchikel -> Mayan */
+  {"cbk",      HB_TAG('C','B','K',' ')},       /* Chavacano -> Zamboanga Chavacano */
+  {"cbk",      HB_TAG('C','P','P',' ')},       /* Chavacano -> Creoles */
   {"cbl",      HB_TAG('Q','I','N',' ')},       /* Bualkhaw Chin -> Chin */
+  {"ccl",      HB_TAG('C','P','P',' ')},       /* Cutchi-Swahili -> Creoles */
+  {"ccm",      HB_TAG('C','P','P',' ')},       /* Malaccan Creole Malay -> Creoles */
   {"cco",      HB_TAG('C','C','H','N')},       /* Comaltepec Chinantec -> Chinantec */
   {"ccq",      HB_TAG('A','R','K',' ')},       /* Chaungtha (retired code) -> Rakhine */
-  {"cdo",      HB_TAG('Z','H','S',' ')},       /* Min Dong Chinese -> Chinese Simplified */
+  {"cdo",      HB_TAG('Z','H','S',' ')},       /* Min Dong Chinese -> Chinese, Simplified */
   {"ce",       HB_TAG('C','H','E',' ')},       /* Chechen */
 /*{"ceb",      HB_TAG('C','E','B',' ')},*/     /* Cebuano */
+  {"cek",      HB_TAG('Q','I','N',' ')},       /* Eastern Khumi Chin -> Chin */
+  {"cey",      HB_TAG('Q','I','N',' ')},       /* Ekai Chin -> Chin */
   {"cfm",      HB_TAG('H','A','L',' ')},       /* Halam (Falam Chin) */
+  {"cfm",      HB_TAG('Q','I','N',' ')},       /* Falam Chin -> Chin */
 /*{"cgg",      HB_TAG('C','G','G',' ')},*/     /* Chiga */
   {"ch",       HB_TAG('C','H','A',' ')},       /* Chamorro */
+  {"chf",      HB_TAG('M','Y','N',' ')},       /* Tabasco Chontal -> Mayan */
+  {"chg",      HB_TAG_NONE            },       /* Chagatai != Chaha Gurage */
+  {"chh",      HB_TAG_NONE            },       /* Chinook != Chattisgarhi */
   {"chj",      HB_TAG('C','C','H','N')},       /* Ojitlán Chinantec -> Chinantec */
   {"chk",      HB_TAG('C','H','K','0')},       /* Chuukese */
+  {"chm",      HB_TAG('H','M','A',' ')},       /* Mari (Russia) [macrolanguage] -> High Mari */
+  {"chm",      HB_TAG('L','M','A',' ')},       /* Mari (Russia) [macrolanguage] -> Low Mari */
+  {"chn",      HB_TAG('C','P','P',' ')},       /* Chinook jargon -> Creoles */
 /*{"cho",      HB_TAG('C','H','O',' ')},*/     /* Choctaw */
   {"chp",      HB_TAG('C','H','P',' ')},       /* Chipewyan */
   {"chp",      HB_TAG('S','A','Y',' ')},       /* Chipewyan -> Sayisi */
@@ -186,59 +270,86 @@ static const LangTag ot_languages[] = {
   {"ciw",      HB_TAG('O','J','B',' ')},       /* Chippewa -> Ojibway */
 /*{"cja",      HB_TAG('C','J','A',' ')},*/     /* Western Cham */
 /*{"cjm",      HB_TAG('C','J','M',' ')},*/     /* Eastern Cham */
-  {"cjy",      HB_TAG('Z','H','S',' ')},       /* Jinyu Chinese -> Chinese Simplified */
+  {"cjy",      HB_TAG('Z','H','S',' ')},       /* Jinyu Chinese -> Chinese, Simplified */
   {"cka",      HB_TAG('Q','I','N',' ')},       /* Khumi Awa Chin (retired code) -> Chin */
   {"ckb",      HB_TAG('K','U','R',' ')},       /* Central Kurdish -> Kurdish */
+  {"ckn",      HB_TAG('Q','I','N',' ')},       /* Kaang Chin -> Chin */
+  {"cks",      HB_TAG('C','P','P',' ')},       /* Tayo -> Creoles */
   {"ckt",      HB_TAG('C','H','K',' ')},       /* Chukot -> Chukchi */
+  {"ckz",      HB_TAG('M','Y','N',' ')},       /* Cakchiquel-Quiché Mixed Language -> Mayan */
   {"clc",      HB_TAG('A','T','H',' ')},       /* Chilcotin -> Athapaskan */
   {"cld",      HB_TAG('S','Y','R',' ')},       /* Chaldean Neo-Aramaic -> Syriac */
   {"cle",      HB_TAG('C','C','H','N')},       /* Lealao Chinantec -> Chinantec */
-  {"cmn",      HB_TAG('Z','H','S',' ')},       /* Mandarin Chinese -> Chinese Simplified */
+  {"clj",      HB_TAG('Q','I','N',' ')},       /* Laitu Chin -> Chin */
+  {"clt",      HB_TAG('Q','I','N',' ')},       /* Lautu Chin -> Chin */
+  {"cmn",      HB_TAG('Z','H','S',' ')},       /* Mandarin Chinese -> Chinese, Simplified */
   {"cmr",      HB_TAG('Q','I','N',' ')},       /* Mro-Khimi Chin -> Chin */
   {"cnb",      HB_TAG('Q','I','N',' ')},       /* Chinbon Chin -> Chin */
   {"cnh",      HB_TAG('Q','I','N',' ')},       /* Hakha Chin -> Chin */
   {"cnk",      HB_TAG('Q','I','N',' ')},       /* Khumi Chin -> Chin */
   {"cnl",      HB_TAG('C','C','H','N')},       /* Lalana Chinantec -> Chinantec */
-  {"cnp",      HB_TAG('Z','H','S',' ')},       /* Northern Ping Chinese -> Chinese Simplified */
+  {"cnp",      HB_TAG('Z','H','S',' ')},       /* Northern Ping Chinese -> Chinese, Simplified */
+  {"cnr",      HB_TAG('S','R','B',' ')},       /* Montenegrin -> Serbian */
   {"cnt",      HB_TAG('C','C','H','N')},       /* Tepetotutla Chinantec -> Chinantec */
+  {"cnu",      HB_TAG('B','B','R',' ')},       /* Chenoua -> Berber */
   {"cnw",      HB_TAG('Q','I','N',' ')},       /* Ngawn Chin -> Chin */
   {"co",       HB_TAG('C','O','S',' ')},       /* Corsican */
   {"coa",      HB_TAG('M','L','Y',' ')},       /* Cocos Islands Malay -> Malay */
+  {"cob",      HB_TAG('M','Y','N',' ')},       /* Chicomuceltec -> Mayan */
 /*{"cop",      HB_TAG('C','O','P',' ')},*/     /* Coptic */
   {"coq",      HB_TAG('A','T','H',' ')},       /* Coquille -> Athapaskan */
   {"cpa",      HB_TAG('C','C','H','N')},       /* Palantla Chinantec -> Chinantec */
-  {"cpe",      HB_TAG('C','P','P',' ')},       /* English-based creoles and pidgins [family] -> Creoles */
-  {"cpf",      HB_TAG('C','P','P',' ')},       /* French-based creoles and pidgins [family] -> Creoles */
-/*{"cpp",      HB_TAG('C','P','P',' ')},*/     /* Portuguese-based creoles and pidgins [family] -> Creoles */
-  {"cpx",      HB_TAG('Z','H','S',' ')},       /* Pu-Xian Chinese -> Chinese Simplified */
+  {"cpe",      HB_TAG('C','P','P',' ')},       /* English-based creoles and pidgins [collection] -> Creoles */
+  {"cpf",      HB_TAG('C','P','P',' ')},       /* French-based creoles and pidgins [collection] -> Creoles */
+  {"cpi",      HB_TAG('C','P','P',' ')},       /* Chinese Pidgin English -> Creoles */
+/*{"cpp",      HB_TAG('C','P','P',' ')},*/     /* Portuguese-based creoles and pidgins [collection] -> Creoles */
+  {"cpx",      HB_TAG('Z','H','S',' ')},       /* Pu-Xian Chinese -> Chinese, Simplified */
   {"cqd",      HB_TAG('H','M','N',' ')},       /* Chuanqiandian Cluster Miao -> Hmong */
   {"cqu",      HB_TAG('Q','U','H',' ')},       /* Chilean Quechua (retired code) -> Quechua (Bolivia) */
+  {"cqu",      HB_TAG('Q','U','Z',' ')},       /* Chilean Quechua (retired code) -> Quechua */
   {"cr",       HB_TAG('C','R','E',' ')},       /* Cree [macrolanguage] */
-  {"cr",       HB_TAG('Y','C','R',' ')},       /* Cree [macrolanguage] -> Y-Cree */
   {"crh",      HB_TAG('C','R','T',' ')},       /* Crimean Tatar */
+  {"cri",      HB_TAG('C','P','P',' ')},       /* Sãotomense -> Creoles */
   {"crj",      HB_TAG('E','C','R',' ')},       /* Southern East Cree -> Eastern Cree */
+  {"crj",      HB_TAG('Y','C','R',' ')},       /* Southern East Cree -> Y-Cree */
+  {"crj",      HB_TAG('C','R','E',' ')},       /* Southern East Cree -> Cree */
   {"crk",      HB_TAG('W','C','R',' ')},       /* Plains Cree -> West-Cree */
+  {"crk",      HB_TAG('Y','C','R',' ')},       /* Plains Cree -> Y-Cree */
+  {"crk",      HB_TAG('C','R','E',' ')},       /* Plains Cree -> Cree */
   {"crl",      HB_TAG('E','C','R',' ')},       /* Northern East Cree -> Eastern Cree */
+  {"crl",      HB_TAG('Y','C','R',' ')},       /* Northern East Cree -> Y-Cree */
+  {"crl",      HB_TAG('C','R','E',' ')},       /* Northern East Cree -> Cree */
   {"crm",      HB_TAG('M','C','R',' ')},       /* Moose Cree */
   {"crm",      HB_TAG('L','C','R',' ')},       /* Moose Cree -> L-Cree */
-  {"crp",      HB_TAG('C','P','P',' ')},       /* Creoles and pidgins [family] -> Creoles */
+  {"crm",      HB_TAG('C','R','E',' ')},       /* Moose Cree -> Cree */
+  {"crp",      HB_TAG('C','P','P',' ')},       /* Creoles and pidgins [collection] -> Creoles */
+  {"crr",      HB_TAG_NONE            },       /* Carolina Algonquian != Carrier */
+  {"crs",      HB_TAG('C','P','P',' ')},       /* Seselwa Creole French -> Creoles */
+  {"crt",      HB_TAG_NONE            },       /* Iyojwa'ja Chorote != Crimean Tatar */
   {"crx",      HB_TAG('C','R','R',' ')},       /* Carrier */
   {"crx",      HB_TAG('A','T','H',' ')},       /* Carrier -> Athapaskan */
   {"cs",       HB_TAG('C','S','Y',' ')},       /* Czech */
   {"csa",      HB_TAG('C','C','H','N')},       /* Chiltepec Chinantec -> Chinantec */
 /*{"csb",      HB_TAG('C','S','B',' ')},*/     /* Kashubian */
   {"csh",      HB_TAG('Q','I','N',' ')},       /* Asho Chin -> Chin */
+  {"csj",      HB_TAG('Q','I','N',' ')},       /* Songlai Chin -> Chin */
+  {"csl",      HB_TAG_NONE            },       /* Chinese Sign Language != Church Slavonic */
   {"cso",      HB_TAG('C','C','H','N')},       /* Sochiapam Chinantec -> Chinantec */
-  {"csp",      HB_TAG('Z','H','S',' ')},       /* Southern Ping Chinese -> Chinese Simplified */
+  {"csp",      HB_TAG('Z','H','S',' ')},       /* Southern Ping Chinese -> Chinese, Simplified */
+  {"csv",      HB_TAG('Q','I','N',' ')},       /* Sumtu Chin -> Chin */
   {"csw",      HB_TAG('N','C','R',' ')},       /* Swampy Cree -> N-Cree */
   {"csw",      HB_TAG('N','H','C',' ')},       /* Swampy Cree -> Norway House Cree */
+  {"csw",      HB_TAG('C','R','E',' ')},       /* Swampy Cree -> Cree */
   {"csy",      HB_TAG('Q','I','N',' ')},       /* Siyin Chin -> Chin */
   {"ctc",      HB_TAG('A','T','H',' ')},       /* Chetco -> Athapaskan */
   {"ctd",      HB_TAG('Q','I','N',' ')},       /* Tedim Chin -> Chin */
   {"cte",      HB_TAG('C','C','H','N')},       /* Tepinapa Chinantec -> Chinantec */
 /*{"ctg",      HB_TAG('C','T','G',' ')},*/     /* Chittagonian */
+  {"cth",      HB_TAG('Q','I','N',' ')},       /* Thaiphum Chin -> Chin */
   {"ctl",      HB_TAG('C','C','H','N')},       /* Tlacoatzintepec Chinantec -> Chinantec */
   {"cts",      HB_TAG('B','I','K',' ')},       /* Northern Catanduanes Bikol -> Bikol */
+/*{"ctt",      HB_TAG('C','T','T',' ')},*/     /* Wayanad Chetti */
+  {"ctu",      HB_TAG('M','Y','N',' ')},       /* Chol -> Mayan */
   {"cu",       HB_TAG('C','S','L',' ')},       /* Church Slavonic */
   {"cuc",      HB_TAG('C','C','H','N')},       /* Usila Chinantec -> Chinantec */
 /*{"cuk",      HB_TAG('C','U','K',' ')},*/     /* San Blas Kuna */
@@ -246,39 +357,51 @@ static const LangTag ot_languages[] = {
   {"cvn",      HB_TAG('C','C','H','N')},       /* Valle Nacional Chinantec -> Chinantec */
   {"cwd",      HB_TAG('D','C','R',' ')},       /* Woods Cree */
   {"cwd",      HB_TAG('T','C','R',' ')},       /* Woods Cree -> TH-Cree */
+  {"cwd",      HB_TAG('C','R','E',' ')},       /* Woods Cree -> Cree */
   {"cy",       HB_TAG('W','E','L',' ')},       /* Welsh */
-  {"czh",      HB_TAG('Z','H','S',' ')},       /* Huizhou Chinese -> Chinese Simplified */
-  {"czo",      HB_TAG('Z','H','S',' ')},       /* Min Zhong Chinese -> Chinese Simplified */
+  {"czh",      HB_TAG('Z','H','S',' ')},       /* Huizhou Chinese -> Chinese, Simplified */
+  {"czo",      HB_TAG('Z','H','S',' ')},       /* Min Zhong Chinese -> Chinese, Simplified */
   {"czt",      HB_TAG('Q','I','N',' ')},       /* Zotung Chin -> Chin */
   {"da",       HB_TAG('D','A','N',' ')},       /* Danish */
+/*{"dag",      HB_TAG('D','A','G',' ')},*/     /* Dagbani */
   {"dao",      HB_TAG('Q','I','N',' ')},       /* Daai Chin -> Chin */
   {"dap",      HB_TAG('N','I','S',' ')},       /* Nisi (India) (retired code) */
 /*{"dar",      HB_TAG('D','A','R',' ')},*/     /* Dargwa */
 /*{"dax",      HB_TAG('D','A','X',' ')},*/     /* Dayi */
+  {"dcr",      HB_TAG('C','P','P',' ')},       /* Negerhollands -> Creoles */
   {"de",       HB_TAG('D','E','U',' ')},       /* German */
   {"den",      HB_TAG('S','L','A',' ')},       /* Slave (Athapascan) [macrolanguage] -> Slavey */
   {"den",      HB_TAG('A','T','H',' ')},       /* Slave (Athapascan) [macrolanguage] -> Athapaskan */
-/*{"dgo",      HB_TAG('D','G','O',' ')},*/     /* Dogri */
+  {"dep",      HB_TAG('C','P','P',' ')},       /* Pidgin Delaware -> Creoles */
+  {"dgo",      HB_TAG('D','G','O',' ')},       /* Dogri (individual language) */
+  {"dgo",      HB_TAG('D','G','R',' ')},       /* Dogri (macrolanguage) */
   {"dgr",      HB_TAG('A','T','H',' ')},       /* Dogrib -> Athapaskan */
   {"dhd",      HB_TAG('M','A','W',' ')},       /* Dhundari -> Marwari */
 /*{"dhg",      HB_TAG('D','H','G',' ')},*/     /* Dhangu */
+  {"dhv",      HB_TAG_NONE            },       /* Dehu != Divehi (Dhivehi, Maldivian) (deprecated) */
   {"dib",      HB_TAG('D','N','K',' ')},       /* South Central Dinka -> Dinka */
   {"dik",      HB_TAG('D','N','K',' ')},       /* Southwestern Dinka -> Dinka */
   {"din",      HB_TAG('D','N','K',' ')},       /* Dinka [macrolanguage] */
   {"dip",      HB_TAG('D','N','K',' ')},       /* Northeastern Dinka -> Dinka */
-/*{"diq",      HB_TAG('D','I','Q',' ')},*/     /* Dimli */
+  {"diq",      HB_TAG('D','I','Q',' ')},       /* Dimli */
+  {"diq",      HB_TAG('Z','Z','A',' ')},       /* Dimli -> Zazaki */
   {"diw",      HB_TAG('D','N','K',' ')},       /* Northwestern Dinka -> Dinka */
   {"dje",      HB_TAG('D','J','R',' ')},       /* Zarma */
+  {"djk",      HB_TAG('C','P','P',' ')},       /* Eastern Maroon Creole -> Creoles */
   {"djr",      HB_TAG('D','J','R','0')},       /* Djambarrpuyngu */
   {"dks",      HB_TAG('D','N','K',' ')},       /* Southeastern Dinka -> Dinka */
   {"dng",      HB_TAG('D','U','N',' ')},       /* Dungan */
 /*{"dnj",      HB_TAG('D','N','J',' ')},*/     /* Dan */
-  {"doi",      HB_TAG('D','G','R',' ')},       /* Dogri [macrolanguage] */
+  {"dnk",      HB_TAG_NONE            },       /* Dengka != Dinka */
+  {"doi",      HB_TAG('D','G','R',' ')},       /* Dogri (macrolanguage) [macrolanguage] */
   {"drh",      HB_TAG('M','N','G',' ')},       /* Darkhat (retired code) -> Mongolian */
+  {"dri",      HB_TAG_NONE            },       /* C'Lela != Dari */
   {"drw",      HB_TAG('D','R','I',' ')},       /* Darwazi (retired code) -> Dari */
+  {"drw",      HB_TAG('F','A','R',' ')},       /* Darwazi (retired code) -> Persian */
   {"dsb",      HB_TAG('L','S','B',' ')},       /* Lower Sorbian */
   {"dty",      HB_TAG('N','E','P',' ')},       /* Dotyali -> Nepali */
 /*{"duj",      HB_TAG('D','U','J',' ')},*/     /* Dhuwal (retired code) */
+  {"dun",      HB_TAG_NONE            },       /* Dusun Deyah != Dungan */
   {"dup",      HB_TAG('M','L','Y',' ')},       /* Duano -> Malay */
   {"dv",       HB_TAG('D','I','V',' ')},       /* Divehi (Dhivehi, Maldivian) */
   {"dv",       HB_TAG('D','H','V',' ')},       /* Divehi (Dhivehi, Maldivian) (deprecated) */
@@ -287,16 +410,20 @@ static const LangTag ot_languages[] = {
   {"dwy",      HB_TAG('D','U','J',' ')},       /* Dhuwaya -> Dhuwal */
   {"dyu",      HB_TAG('J','U','L',' ')},       /* Dyula -> Jula */
   {"dz",       HB_TAG('D','Z','N',' ')},       /* Dzongkha */
+  {"dzn",      HB_TAG_NONE            },       /* Dzando != Dzongkha */
+  {"ecr",      HB_TAG_NONE            },       /* Eteocretan != Eastern Cree */
   {"ee",       HB_TAG('E','W','E',' ')},       /* Ewe */
 /*{"efi",      HB_TAG('E','F','I',' ')},*/     /* Efik */
   {"ekk",      HB_TAG('E','T','I',' ')},       /* Standard Estonian -> Estonian */
+  {"eky",      HB_TAG('K','R','N',' ')},       /* Eastern Kayah -> Karen */
   {"el",       HB_TAG('E','L','L',' ')},       /* Modern Greek (1453-) -> Greek */
   {"emk",      HB_TAG('E','M','K',' ')},       /* Eastern Maninkakan */
   {"emk",      HB_TAG('M','N','K',' ')},       /* Eastern Maninkakan -> Maninka */
+  {"emy",      HB_TAG('M','Y','N',' ')},       /* Epigraphic Mayan -> Mayan */
   {"en",       HB_TAG('E','N','G',' ')},       /* English */
   {"enb",      HB_TAG('K','A','L',' ')},       /* Markweeta -> Kalenjin */
-  {"enf",      HB_TAG('F','N','E',' ')},       /* Forest Enets -> Forest Nenets */
-  {"enh",      HB_TAG('T','N','E',' ')},       /* Tundra Enets -> Tundra Nenets */
+  {"enf",      HB_TAG('F','N','E',' ')},       /* Forest Enets */
+  {"enh",      HB_TAG('T','N','E',' ')},       /* Tundra Enets */
   {"eo",       HB_TAG('N','T','O',' ')},       /* Esperanto */
   {"es",       HB_TAG('E','S','P',' ')},       /* Spanish */
   {"esg",      HB_TAG('G','O','N',' ')},       /* Aheri Gondi -> Gondi */
@@ -306,13 +433,18 @@ static const LangTag ot_languages[] = {
   {"et",       HB_TAG('E','T','I',' ')},       /* Estonian [macrolanguage] */
   {"eto",      HB_TAG('B','T','I',' ')},       /* Eton (Cameroon) -> Beti */
   {"eu",       HB_TAG('E','U','Q',' ')},       /* Basque */
+  {"euq",      HB_TAG_NONE            },       /* Basque [collection] != Basque */
   {"eve",      HB_TAG('E','V','N',' ')},       /* Even */
   {"evn",      HB_TAG('E','V','K',' ')},       /* Evenki */
   {"ewo",      HB_TAG('B','T','I',' ')},       /* Ewondo -> Beti */
   {"eyo",      HB_TAG('K','A','L',' ')},       /* Keiyo -> Kalenjin */
   {"fa",       HB_TAG('F','A','R',' ')},       /* Persian [macrolanguage] */
+  {"fab",      HB_TAG('C','P','P',' ')},       /* Fa d'Ambu -> Creoles */
   {"fan",      HB_TAG('F','A','N','0')},       /* Fang (Equatorial Guinea) */
-/*{"fat",      HB_TAG('F','A','T',' ')},*/     /* Fanti */
+  {"fan",      HB_TAG('B','T','I',' ')},       /* Fang (Equatorial Guinea) -> Beti */
+  {"far",      HB_TAG_NONE            },       /* Fataleka != Persian */
+  {"fat",      HB_TAG('F','A','T',' ')},       /* Fanti */
+  {"fat",      HB_TAG('A','K','A',' ')},       /* Fanti -> Akan */
   {"fbl",      HB_TAG('B','I','K',' ')},       /* West Albay Bikol -> Bikol */
   {"ff",       HB_TAG('F','U','L',' ')},       /* Fulah [macrolanguage] */
   {"ffm",      HB_TAG('F','U','L',' ')},       /* Maasina Fulfulde -> Fulah */
@@ -321,9 +453,13 @@ static const LangTag ot_languages[] = {
   {"fj",       HB_TAG('F','J','I',' ')},       /* Fijian */
   {"flm",      HB_TAG('H','A','L',' ')},       /* Halam (Falam Chin) (retired code) */
   {"flm",      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’ */
+  {"fmp",      HB_TAG('B','M','L',' ')},       /* Fe'fe' -> Bamileke */
+  {"fng",      HB_TAG('C','P','P',' ')},       /* Fanagalo -> Creoles */
   {"fo",       HB_TAG('F','O','S',' ')},       /* Faroese */
 /*{"fon",      HB_TAG('F','O','N',' ')},*/     /* Fon */
+  {"fos",      HB_TAG_NONE            },       /* Siraya != Faroese */
+  {"fpe",      HB_TAG('C','P','P',' ')},       /* Fernando Po Creole English -> Creoles */
   {"fr",       HB_TAG('F','R','A',' ')},       /* French */
 /*{"frc",      HB_TAG('F','R','C',' ')},*/     /* Cajun French */
 /*{"frp",      HB_TAG('F','R','P',' ')},*/     /* Arpitan */
@@ -331,68 +467,101 @@ static const LangTag ot_languages[] = {
   {"fuc",      HB_TAG('F','U','L',' ')},       /* Pulaar -> Fulah */
   {"fue",      HB_TAG('F','U','L',' ')},       /* Borgu Fulfulde -> Fulah */
   {"fuf",      HB_TAG('F','T','A',' ')},       /* Pular -> Futa */
+  {"fuf",      HB_TAG('F','U','L',' ')},       /* Pular -> Fulah */
   {"fuh",      HB_TAG('F','U','L',' ')},       /* Western Niger Fulfulde -> Fulah */
   {"fui",      HB_TAG('F','U','L',' ')},       /* Bagirmi Fulfulde -> Fulah */
   {"fuq",      HB_TAG('F','U','L',' ')},       /* Central-Eastern Niger Fulfulde -> Fulah */
   {"fur",      HB_TAG('F','R','L',' ')},       /* Friulian */
-/*{"fuv",      HB_TAG('F','U','V',' ')},*/     /* Nigerian Fulfulde */
+  {"fuv",      HB_TAG('F','U','V',' ')},       /* Nigerian Fulfulde */
+  {"fuv",      HB_TAG('F','U','L',' ')},       /* Nigerian Fulfulde -> Fulah */
   {"fy",       HB_TAG('F','R','I',' ')},       /* Western Frisian -> Frisian */
   {"ga",       HB_TAG('I','R','I',' ')},       /* Irish */
   {"gaa",      HB_TAG('G','A','D',' ')},       /* Ga */
+  {"gac",      HB_TAG('C','P','P',' ')},       /* Mixed Great Andamanese -> Creoles */
+  {"gad",      HB_TAG_NONE            },       /* Gaddang != Ga */
+  {"gae",      HB_TAG_NONE            },       /* Guarequena != Scottish Gaelic (Gaelic) */
 /*{"gag",      HB_TAG('G','A','G',' ')},*/     /* Gagauz */
-  {"gan",      HB_TAG('Z','H','S',' ')},       /* Gan Chinese -> Chinese Simplified */
+  {"gal",      HB_TAG_NONE            },       /* Galolen != Galician */
+  {"gan",      HB_TAG('Z','H','S',' ')},       /* Gan Chinese -> Chinese, Simplified */
+  {"gar",      HB_TAG_NONE            },       /* Galeya != Garshuni */
+  {"gaw",      HB_TAG_NONE            },       /* Nobonob != Garhwali */
   {"gax",      HB_TAG('O','R','O',' ')},       /* Borana-Arsi-Guji Oromo -> Oromo */
   {"gaz",      HB_TAG('O','R','O',' ')},       /* West Central Oromo -> Oromo */
   {"gbm",      HB_TAG('G','A','W',' ')},       /* Garhwali */
   {"gce",      HB_TAG('A','T','H',' ')},       /* Galice -> Athapaskan */
+  {"gcf",      HB_TAG('C','P','P',' ')},       /* Guadeloupean Creole French -> Creoles */
+  {"gcl",      HB_TAG('C','P','P',' ')},       /* Grenadian Creole English -> Creoles */
+  {"gcr",      HB_TAG('C','P','P',' ')},       /* Guianese Creole French -> Creoles */
   {"gd",       HB_TAG('G','A','E',' ')},       /* Scottish Gaelic (Gaelic) */
   {"gda",      HB_TAG('R','A','J',' ')},       /* Gade Lohar -> Rajasthani */
 /*{"gez",      HB_TAG('G','E','Z',' ')},*/     /* Geez */
   {"ggo",      HB_TAG('G','O','N',' ')},       /* Southern Gondi (retired code) -> Gondi */
+  {"gha",      HB_TAG('B','B','R',' ')},       /* Ghadamès -> Berber */
+  {"ghk",      HB_TAG('K','R','N',' ')},       /* Geko Karen -> Karen */
+  {"gho",      HB_TAG('B','B','R',' ')},       /* Ghomara -> Berber */
+  {"gib",      HB_TAG('C','P','P',' ')},       /* Gibanawa -> Creoles */
 /*{"gih",      HB_TAG('G','I','H',' ')},*/     /* Githabul */
   {"gil",      HB_TAG('G','I','L','0')},       /* Kiribati (Gilbertese) */
   {"gju",      HB_TAG('R','A','J',' ')},       /* Gujari -> Rajasthani */
-/*{"gkp",      HB_TAG('G','K','P',' ')},*/     /* Guinea Kpelle -> Kpelle (Guinea) */
+  {"gkp",      HB_TAG('G','K','P',' ')},       /* Guinea Kpelle -> Kpelle (Guinea) */
+  {"gkp",      HB_TAG('K','P','L',' ')},       /* Guinea Kpelle -> Kpelle */
   {"gl",       HB_TAG('G','A','L',' ')},       /* Galician */
   {"gld",      HB_TAG('N','A','N',' ')},       /* Nanai */
 /*{"glk",      HB_TAG('G','L','K',' ')},*/     /* Gilaki */
+  {"gmz",      HB_TAG_NONE            },       /* Mgbolizhia != Gumuz */
   {"gn",       HB_TAG('G','U','A',' ')},       /* Guarani [macrolanguage] */
+  {"gnb",      HB_TAG('Q','I','N',' ')},       /* Gangte -> Chin */
 /*{"gnn",      HB_TAG('G','N','N',' ')},*/     /* Gumatj */
   {"gno",      HB_TAG('G','O','N',' ')},       /* Northern Gondi -> Gondi */
   {"gnw",      HB_TAG('G','U','A',' ')},       /* Western Bolivian Guaraní -> Guarani */
 /*{"gog",      HB_TAG('G','O','G',' ')},*/     /* Gogo */
   {"gom",      HB_TAG('K','O','K',' ')},       /* Goan Konkani -> Konkani */
 /*{"gon",      HB_TAG('G','O','N',' ')},*/     /* Gondi [macrolanguage] */
+  {"goq",      HB_TAG('C','P','P',' ')},       /* Gorap -> Creoles */
+  {"gox",      HB_TAG('B','A','D','0')},       /* Gobu -> Banda */
+  {"gpe",      HB_TAG('C','P','P',' ')},       /* Ghanaian Pidgin English -> Creoles */
+  {"gro",      HB_TAG_NONE            },       /* Groma != Garo */
+  {"grr",      HB_TAG('B','B','R',' ')},       /* Taznatit -> Berber */
   {"grt",      HB_TAG('G','R','O',' ')},       /* Garo */
   {"gru",      HB_TAG('S','O','G',' ')},       /* Kistane -> Sodo Gurage */
   {"gsw",      HB_TAG('A','L','S',' ')},       /* Alsatian */
   {"gu",       HB_TAG('G','U','J',' ')},       /* Gujarati */
+  {"gua",      HB_TAG_NONE            },       /* Shiki != Guarani */
 /*{"guc",      HB_TAG('G','U','C',' ')},*/     /* Wayuu */
 /*{"guf",      HB_TAG('G','U','F',' ')},*/     /* Gupapuyngu */
   {"gug",      HB_TAG('G','U','A',' ')},       /* Paraguayan Guaraní -> Guarani */
   {"gui",      HB_TAG('G','U','A',' ')},       /* Eastern Bolivian Guaraní -> Guarani */
   {"guk",      HB_TAG('G','M','Z',' ')},       /* Gumuz */
-  {"guk",      HB_TAG('G','U','K',' ')},       /* Gumuz (SIL fonts) */
+  {"gul",      HB_TAG('C','P','P',' ')},       /* Sea Island Creole English -> Creoles */
   {"gun",      HB_TAG('G','U','A',' ')},       /* Mbyá Guaraní -> Guarani */
 /*{"guz",      HB_TAG('G','U','Z',' ')},*/     /* Gusii */
   {"gv",       HB_TAG('M','N','X',' ')},       /* Manx */
   {"gwi",      HB_TAG('A','T','H',' ')},       /* Gwichʼin -> Athapaskan */
+  {"gyn",      HB_TAG('C','P','P',' ')},       /* Guyanese Creole English -> Creoles */
   {"ha",       HB_TAG('H','A','U',' ')},       /* Hausa */
   {"haa",      HB_TAG('A','T','H',' ')},       /* Han -> Athapaskan */
   {"hae",      HB_TAG('O','R','O',' ')},       /* Eastern Oromo -> Oromo */
-  {"hak",      HB_TAG('Z','H','S',' ')},       /* Hakka Chinese -> Chinese Simplified */
+  {"hai",      HB_TAG('H','A','I','0')},       /* Haida [macrolanguage] */
+  {"hak",      HB_TAG('Z','H','S',' ')},       /* Hakka Chinese -> Chinese, Simplified */
+  {"hal",      HB_TAG_NONE            },       /* Halang != Halam (Falam Chin) */
   {"har",      HB_TAG('H','R','I',' ')},       /* Harari */
 /*{"haw",      HB_TAG('H','A','W',' ')},*/     /* Hawaiian */
+  {"hax",      HB_TAG('H','A','I','0')},       /* Southern Haida -> Haida */
 /*{"hay",      HB_TAG('H','A','Y',' ')},*/     /* Haya */
 /*{"haz",      HB_TAG('H','A','Z',' ')},*/     /* Hazaragi */
+  {"hbn",      HB_TAG_NONE            },       /* Heiban != Hammer-Banna */
+  {"hca",      HB_TAG('C','P','P',' ')},       /* Andaman Creole Hindi -> Creoles */
+  {"hdn",      HB_TAG('H','A','I','0')},       /* Northern Haida -> Haida */
   {"he",       HB_TAG('I','W','R',' ')},       /* Hebrew */
   {"hea",      HB_TAG('H','M','N',' ')},       /* Northern Qiandong Miao -> Hmong */
+/*{"hei",      HB_TAG('H','E','I',' ')},*/     /* Heiltsuk */
   {"hi",       HB_TAG('H','I','N',' ')},       /* Hindi */
 /*{"hil",      HB_TAG('H','I','L',' ')},*/     /* Hiligaynon */
   {"hji",      HB_TAG('M','L','Y',' ')},       /* Haji -> Malay */
   {"hlt",      HB_TAG('Q','I','N',' ')},       /* Matu Chin -> Chin */
   {"hma",      HB_TAG('H','M','N',' ')},       /* Southern Mashan Hmong -> Hmong */
   {"hmc",      HB_TAG('H','M','N',' ')},       /* Central Huishui Hmong -> Hmong */
+  {"hmd",      HB_TAG('H','M','D',' ')},       /* Large Flowery Miao -> A-Hmao */
   {"hmd",      HB_TAG('H','M','N',' ')},       /* Large Flowery Miao -> Hmong */
   {"hme",      HB_TAG('H','M','N',' ')},       /* Eastern Huishui Hmong -> Hmong */
   {"hmg",      HB_TAG('H','M','N',' ')},       /* Southwestern Guiyang Hmong -> Hmong */
@@ -404,26 +573,34 @@ static const LangTag ot_languages[] = {
 /*{"hmn",      HB_TAG('H','M','N',' ')},*/     /* Hmong [macrolanguage] */
   {"hmp",      HB_TAG('H','M','N',' ')},       /* Northern Mashan Hmong -> Hmong */
   {"hmq",      HB_TAG('H','M','N',' ')},       /* Eastern Qiandong Miao -> Hmong */
+  {"hmr",      HB_TAG('Q','I','N',' ')},       /* Hmar -> Chin */
   {"hms",      HB_TAG('H','M','N',' ')},       /* Southern Qiandong Miao -> Hmong */
   {"hmw",      HB_TAG('H','M','N',' ')},       /* Western Mashan Hmong -> Hmong */
   {"hmy",      HB_TAG('H','M','N',' ')},       /* Southern Guiyang Hmong -> Hmong */
+  {"hmz",      HB_TAG('H','M','Z',' ')},       /* Hmong Shua -> Hmong Shuat */
   {"hmz",      HB_TAG('H','M','N',' ')},       /* Hmong Shua -> Hmong */
 /*{"hnd",      HB_TAG('H','N','D',' ')},*/     /* Southern Hindko -> Hindko */
   {"hne",      HB_TAG('C','H','H',' ')},       /* Chhattisgarhi -> Chattisgarhi */
   {"hnj",      HB_TAG('H','M','N',' ')},       /* Hmong Njua -> Hmong */
   {"hno",      HB_TAG('H','N','D',' ')},       /* Northern Hindko -> Hindko */
   {"ho",       HB_TAG('H','M','O',' ')},       /* Hiri Motu */
+  {"ho",       HB_TAG('C','P','P',' ')},       /* Hiri Motu -> Creoles */
   {"hoc",      HB_TAG('H','O',' ',' ')},       /* Ho */
   {"hoi",      HB_TAG('A','T','H',' ')},       /* Holikachuk -> Athapaskan */
   {"hoj",      HB_TAG('H','A','R',' ')},       /* Hadothi -> Harauti */
+  {"hoj",      HB_TAG('R','A','J',' ')},       /* Hadothi -> Rajasthani */
   {"hr",       HB_TAG('H','R','V',' ')},       /* Croatian */
+  {"hra",      HB_TAG('Q','I','N',' ')},       /* Hrangkhol -> Chin */
   {"hrm",      HB_TAG('H','M','N',' ')},       /* Horned Miao -> Hmong */
   {"hsb",      HB_TAG('U','S','B',' ')},       /* Upper Sorbian */
-  {"hsn",      HB_TAG('Z','H','S',' ')},       /* Xiang Chinese -> Chinese Simplified */
+  {"hsn",      HB_TAG('Z','H','S',' ')},       /* Xiang Chinese -> Chinese, Simplified */
   {"ht",       HB_TAG('H','A','I',' ')},       /* Haitian (Haitian Creole) */
+  {"ht",       HB_TAG('C','P','P',' ')},       /* Haitian -> Creoles */
   {"hu",       HB_TAG('H','U','N',' ')},       /* Hungarian */
   {"huj",      HB_TAG('H','M','N',' ')},       /* Northern Guiyang Hmong -> Hmong */
   {"hup",      HB_TAG('A','T','H',' ')},       /* Hupa -> Athapaskan */
+  {"hus",      HB_TAG('M','Y','N',' ')},       /* Huastec -> Mayan */
+  {"hwc",      HB_TAG('C','P','P',' ')},       /* Hawai'i Creole English -> Creoles */
   {"hy",       HB_TAG('H','Y','E','0')},       /* Armenian -> Armenian East */
   {"hy",       HB_TAG('H','Y','E',' ')},       /* Armenian */
   {"hyw",      HB_TAG('H','Y','E',' ')},       /* Western Armenian -> Armenian */
@@ -431,122 +608,210 @@ static const LangTag ot_languages[] = {
   {"ia",       HB_TAG('I','N','A',' ')},       /* Interlingua (International Auxiliary Language Association) */
 /*{"iba",      HB_TAG('I','B','A',' ')},*/     /* Iban */
 /*{"ibb",      HB_TAG('I','B','B',' ')},*/     /* Ibibio */
+  {"iby",      HB_TAG('I','J','O',' ')},       /* Ibani -> Ijo */
+  {"icr",      HB_TAG('C','P','P',' ')},       /* Islander Creole English -> Creoles */
   {"id",       HB_TAG('I','N','D',' ')},       /* Indonesian */
+  {"id",       HB_TAG('M','L','Y',' ')},       /* Indonesian -> Malay */
   {"ida",      HB_TAG('L','U','H',' ')},       /* Idakho-Isukha-Tiriki -> Luyia */
+  {"idb",      HB_TAG('C','P','P',' ')},       /* Indo-Portuguese -> Creoles */
   {"ie",       HB_TAG('I','L','E',' ')},       /* Interlingue */
   {"ig",       HB_TAG('I','B','O',' ')},       /* Igbo */
   {"igb",      HB_TAG('E','B','I',' ')},       /* Ebira */
+  {"ihb",      HB_TAG('C','P','P',' ')},       /* Iha Based Pidgin -> Creoles */
   {"ii",       HB_TAG('Y','I','M',' ')},       /* Sichuan Yi -> Yi Modern */
   {"ijc",      HB_TAG('I','J','O',' ')},       /* Izon -> Ijo */
-/*{"ijo",      HB_TAG('I','J','O',' ')},*/     /* Ijo [family] */
+  {"ije",      HB_TAG('I','J','O',' ')},       /* Biseni -> Ijo */
+  {"ijn",      HB_TAG('I','J','O',' ')},       /* Kalabari -> Ijo */
+/*{"ijo",      HB_TAG('I','J','O',' ')},*/     /* Ijo [collection] */
+  {"ijs",      HB_TAG('I','J','O',' ')},       /* Southeast Ijo -> Ijo */
   {"ik",       HB_TAG('I','P','K',' ')},       /* Inupiaq [macrolanguage] -> Inupiat */
   {"ike",      HB_TAG('I','N','U',' ')},       /* Eastern Canadian Inuktitut -> Inuktitut */
+  {"ike",      HB_TAG('I','N','U','K')},       /* Eastern Canadian Inuktitut -> Nunavik Inuktitut */
   {"ikt",      HB_TAG('I','N','U',' ')},       /* Inuinnaqtun -> Inuktitut */
 /*{"ilo",      HB_TAG('I','L','O',' ')},*/     /* Iloko -> Ilokano */
   {"in",       HB_TAG('I','N','D',' ')},       /* Indonesian (retired code) */
+  {"in",       HB_TAG('M','L','Y',' ')},       /* Indonesian (retired code) -> Malay */
   {"ing",      HB_TAG('A','T','H',' ')},       /* Degexit'an -> Athapaskan */
   {"inh",      HB_TAG('I','N','G',' ')},       /* Ingush */
   {"io",       HB_TAG('I','D','O',' ')},       /* Ido */
+  {"iri",      HB_TAG_NONE            },       /* Rigwe != Irish */
+/*{"iru",      HB_TAG('I','R','U',' ')},*/     /* Irula */
   {"is",       HB_TAG('I','S','L',' ')},       /* Icelandic */
+  {"ism",      HB_TAG_NONE            },       /* Masimasi != Inari Sami */
   {"it",       HB_TAG('I','T','A',' ')},       /* Italian */
+  {"itz",      HB_TAG('M','Y','N',' ')},       /* Itzá -> Mayan */
   {"iu",       HB_TAG('I','N','U',' ')},       /* Inuktitut [macrolanguage] */
+  {"iu",       HB_TAG('I','N','U','K')},       /* Inuktitut [macrolanguage] -> Nunavik Inuktitut */
   {"iw",       HB_TAG('I','W','R',' ')},       /* Hebrew (retired code) */
+  {"ixl",      HB_TAG('M','Y','N',' ')},       /* Ixil -> Mayan */
   {"ja",       HB_TAG('J','A','N',' ')},       /* Japanese */
+  {"jac",      HB_TAG('M','Y','N',' ')},       /* Popti' -> Mayan */
   {"jak",      HB_TAG('M','L','Y',' ')},       /* Jakun -> Malay */
-/*{"jam",      HB_TAG('J','A','M',' ')},*/     /* Jamaican Creole English -> Jamaican Creole */
+  {"jam",      HB_TAG('J','A','M',' ')},       /* Jamaican Creole English -> Jamaican Creole */
+  {"jam",      HB_TAG('C','P','P',' ')},       /* Jamaican Creole English -> Creoles */
+  {"jan",      HB_TAG_NONE            },       /* Jandai != Japanese */
   {"jax",      HB_TAG('M','L','Y',' ')},       /* Jambi Malay -> Malay */
+  {"jbe",      HB_TAG('B','B','R',' ')},       /* Judeo-Berber -> Berber */
+  {"jbn",      HB_TAG('B','B','R',' ')},       /* Nafusi -> Berber */
 /*{"jbo",      HB_TAG('J','B','O',' ')},*/     /* Lojban */
 /*{"jct",      HB_TAG('J','C','T',' ')},*/     /* Krymchak */
+  {"jgo",      HB_TAG('B','M','L',' ')},       /* Ngomba -> Bamileke */
   {"ji",       HB_TAG('J','I','I',' ')},       /* Yiddish (retired code) */
+  {"jii",      HB_TAG_NONE            },       /* Jiiddu != Yiddish */
+  {"jkm",      HB_TAG('K','R','N',' ')},       /* Mobwa Karen -> Karen */
+  {"jkp",      HB_TAG('K','R','N',' ')},       /* Paku Karen -> Karen */
+  {"jud",      HB_TAG_NONE            },       /* Worodougou != Ladino */
+  {"jul",      HB_TAG_NONE            },       /* Jirel != Jula */
   {"jv",       HB_TAG('J','A','V',' ')},       /* Javanese */
+  {"jvd",      HB_TAG('C','P','P',' ')},       /* Javindo -> Creoles */
   {"jw",       HB_TAG('J','A','V',' ')},       /* Javanese (retired code) */
   {"ka",       HB_TAG('K','A','T',' ')},       /* Georgian */
   {"kaa",      HB_TAG('K','R','K',' ')},       /* Karakalpak */
   {"kab",      HB_TAG('K','A','B','0')},       /* Kabyle */
+  {"kab",      HB_TAG('B','B','R',' ')},       /* Kabyle -> Berber */
+  {"kac",      HB_TAG_NONE            },       /* Kachin != Kachchi */
   {"kam",      HB_TAG('K','M','B',' ')},       /* Kamba (Kenya) */
-  {"kar",      HB_TAG('K','R','N',' ')},       /* Karen [family] */
+  {"kar",      HB_TAG('K','R','N',' ')},       /* Karen [collection] */
+/*{"kaw",      HB_TAG('K','A','W',' ')},*/     /* Kawi (Old Javanese) */
   {"kbd",      HB_TAG('K','A','B',' ')},       /* Kabardian */
   {"kby",      HB_TAG('K','N','R',' ')},       /* Manga Kanuri -> Kanuri */
   {"kca",      HB_TAG('K','H','K',' ')},       /* Khanty -> Khanty-Kazim */
   {"kca",      HB_TAG('K','H','S',' ')},       /* Khanty -> Khanty-Shurishkar */
   {"kca",      HB_TAG('K','H','V',' ')},       /* Khanty -> Khanty-Vakhi */
+  {"kcn",      HB_TAG('C','P','P',' ')},       /* Nubi -> Creoles */
 /*{"kde",      HB_TAG('K','D','E',' ')},*/     /* Makonde */
   {"kdr",      HB_TAG('K','R','M',' ')},       /* Karaim */
   {"kdt",      HB_TAG('K','U','Y',' ')},       /* Kuy */
-/*{"kea",      HB_TAG('K','E','A',' ')},*/     /* Kabuverdianu (Crioulo) */
-/*{"kek",      HB_TAG('K','E','K',' ')},*/     /* Kekchi */
+  {"kea",      HB_TAG('K','E','A',' ')},       /* Kabuverdianu (Crioulo) */
+  {"kea",      HB_TAG('C','P','P',' ')},       /* Kabuverdianu -> Creoles */
+  {"keb",      HB_TAG_NONE            },       /* Kélé != Kebena */
+  {"kek",      HB_TAG('K','E','K',' ')},       /* Kekchi */
+  {"kek",      HB_TAG('M','Y','N',' ')},       /* Kekchí -> Mayan */
   {"kex",      HB_TAG('K','K','N',' ')},       /* Kukna -> Kokni */
   {"kfa",      HB_TAG('K','O','D',' ')},       /* Kodava -> Kodagu */
   {"kfr",      HB_TAG('K','A','C',' ')},       /* Kachhi -> Kachchi */
   {"kfx",      HB_TAG('K','U','L',' ')},       /* Kullu Pahari -> Kulvi */
   {"kfy",      HB_TAG('K','M','N',' ')},       /* Kumaoni */
   {"kg",       HB_TAG('K','O','N','0')},       /* Kongo [macrolanguage] */
+  {"kge",      HB_TAG_NONE            },       /* Komering != Khutsuri Georgian */
   {"kha",      HB_TAG('K','S','I',' ')},       /* Khasi */
   {"khb",      HB_TAG('X','B','D',' ')},       /* Lü */
   {"khk",      HB_TAG('M','N','G',' ')},       /* Halh Mongolian -> Mongolian */
+  {"khn",      HB_TAG_NONE            },       /* Khandesi != Khamti Shan (Microsoft fonts) */
+  {"khs",      HB_TAG_NONE            },       /* Kasua != Khanty-Shurishkar */
+  {"kht",      HB_TAG('K','H','T',' ')},       /* Khamti -> Khamti Shan */
   {"kht",      HB_TAG('K','H','N',' ')},       /* Khamti -> Khamti Shan (Microsoft fonts) */
-  {"kht",      HB_TAG('K','H','T',' ')},       /* Khamti -> Khamti Shan (OpenType spec and SIL fonts) */
+  {"khv",      HB_TAG_NONE            },       /* Khvarshi != Khanty-Vakhi */
 /*{"khw",      HB_TAG('K','H','W',' ')},*/     /* Khowar */
   {"ki",       HB_TAG('K','I','K',' ')},       /* Kikuyu (Gikuyu) */
-/*{"kiu",      HB_TAG('K','I','U',' ')},*/     /* Kirmanjki */
+  {"kis",      HB_TAG_NONE            },       /* Kis != Kisii */
+  {"kiu",      HB_TAG('K','I','U',' ')},       /* Kirmanjki */
+  {"kiu",      HB_TAG('Z','Z','A',' ')},       /* Kirmanjki -> Zazaki */
   {"kj",       HB_TAG('K','U','A',' ')},       /* Kuanyama */
+  {"kjb",      HB_TAG('M','Y','N',' ')},       /* Q'anjob'al -> Mayan */
 /*{"kjd",      HB_TAG('K','J','D',' ')},*/     /* Southern Kiwai */
   {"kjh",      HB_TAG('K','H','A',' ')},       /* Khakas -> Khakass */
-/*{"kjp",      HB_TAG('K','J','P',' ')},*/     /* Pwo Eastern Karen -> Eastern Pwo Karen */
+  {"kjp",      HB_TAG('K','J','P',' ')},       /* Pwo Eastern Karen -> Eastern Pwo Karen */
+  {"kjp",      HB_TAG('K','R','N',' ')},       /* Pwo Eastern Karen -> Karen */
+  {"kjt",      HB_TAG('K','R','N',' ')},       /* Phrae Pwo Karen -> Karen */
 /*{"kjz",      HB_TAG('K','J','Z',' ')},*/     /* Bumthangkha */
   {"kk",       HB_TAG('K','A','Z',' ')},       /* Kazakh */
+  {"kkn",      HB_TAG_NONE            },       /* Kon Keu != Kokni */
   {"kkz",      HB_TAG('A','T','H',' ')},       /* Kaska -> Athapaskan */
   {"kl",       HB_TAG('G','R','N',' ')},       /* Greenlandic */
+  {"klm",      HB_TAG_NONE            },       /* Migum != Kalmyk */
   {"kln",      HB_TAG('K','A','L',' ')},       /* Kalenjin [macrolanguage] */
   {"km",       HB_TAG('K','H','M',' ')},       /* Khmer */
   {"kmb",      HB_TAG('M','B','N',' ')},       /* Kimbundu -> Mbundu */
+  {"kmn",      HB_TAG_NONE            },       /* Awtuw != Kumaoni */
+  {"kmo",      HB_TAG_NONE            },       /* Kwoma != Komo */
   {"kmr",      HB_TAG('K','U','R',' ')},       /* Northern Kurdish -> Kurdish */
+  {"kms",      HB_TAG_NONE            },       /* Kamasau != Komso */
+  {"kmv",      HB_TAG('C','P','P',' ')},       /* Karipúna Creole French -> Creoles */
   {"kmw",      HB_TAG('K','M','O',' ')},       /* Komo (Democratic Republic of Congo) */
 /*{"kmz",      HB_TAG('K','M','Z',' ')},*/     /* Khorasani Turkish -> Khorasani Turkic */
   {"kn",       HB_TAG('K','A','N',' ')},       /* Kannada */
   {"knc",      HB_TAG('K','N','R',' ')},       /* Central Kanuri -> Kanuri */
   {"kng",      HB_TAG('K','O','N','0')},       /* Koongo -> Kongo */
+  {"knj",      HB_TAG('M','Y','N',' ')},       /* Western Kanjobal -> Mayan */
   {"knn",      HB_TAG('K','O','K',' ')},       /* Konkani */
+  {"knr",      HB_TAG_NONE            },       /* Kaningra != Kanuri */
   {"ko",       HB_TAG('K','O','R',' ')},       /* Korean */
+  {"ko",       HB_TAG('K','O','H',' ')},       /* Korean -> Korean Old Hangul */
+  {"kod",      HB_TAG_NONE            },       /* Kodi != Kodagu */
+  {"koh",      HB_TAG_NONE            },       /* Koyo != Korean Old Hangul */
   {"koi",      HB_TAG('K','O','P',' ')},       /* Komi-Permyak */
+  {"koi",      HB_TAG('K','O','M',' ')},       /* Komi-Permyak -> Komi */
 /*{"kok",      HB_TAG('K','O','K',' ')},*/     /* Konkani [macrolanguage] */
+  {"kop",      HB_TAG_NONE            },       /* Waube != Komi-Permyak */
 /*{"kos",      HB_TAG('K','O','S',' ')},*/     /* Kosraean */
   {"koy",      HB_TAG('A','T','H',' ')},       /* Koyukon -> Athapaskan */
+  {"koz",      HB_TAG_NONE            },       /* Korak != Komi-Zyrian */
   {"kpe",      HB_TAG('K','P','L',' ')},       /* Kpelle [macrolanguage] */
+  {"kpl",      HB_TAG_NONE            },       /* Kpala != Kpelle */
+  {"kpp",      HB_TAG('K','R','N',' ')},       /* Paku Karen (retired code) -> Karen */
   {"kpv",      HB_TAG('K','O','Z',' ')},       /* Komi-Zyrian */
+  {"kpv",      HB_TAG('K','O','M',' ')},       /* Komi-Zyrian -> Komi */
   {"kpy",      HB_TAG('K','Y','K',' ')},       /* Koryak */
   {"kqs",      HB_TAG('K','I','S',' ')},       /* Northern Kissi -> Kisii */
   {"kqy",      HB_TAG('K','R','T',' ')},       /* Koorete */
   {"kr",       HB_TAG('K','N','R',' ')},       /* Kanuri [macrolanguage] */
   {"krc",      HB_TAG('K','A','R',' ')},       /* Karachay-Balkar -> Karachay */
   {"krc",      HB_TAG('B','A','L',' ')},       /* Karachay-Balkar -> Balkar */
-/*{"kri",      HB_TAG('K','R','I',' ')},*/     /* Krio */
+  {"kri",      HB_TAG('K','R','I',' ')},       /* Krio */
+  {"kri",      HB_TAG('C','P','P',' ')},       /* Krio -> Creoles */
+  {"krk",      HB_TAG_NONE            },       /* Kerek != Karakalpak */
 /*{"krl",      HB_TAG('K','R','L',' ')},*/     /* Karelian */
+  {"krm",      HB_TAG_NONE            },       /* Krim (retired code) != Karaim */
+  {"krn",      HB_TAG_NONE            },       /* Sapo != Karen */
   {"krt",      HB_TAG('K','N','R',' ')},       /* Tumari Kanuri -> Kanuri */
   {"kru",      HB_TAG('K','U','U',' ')},       /* Kurukh */
   {"ks",       HB_TAG('K','S','H',' ')},       /* Kashmiri */
   {"ksh",      HB_TAG('K','S','H','0')},       /* Kölsch -> Ripuarian */
+  {"ksi",      HB_TAG_NONE            },       /* Krisa != Khasi */
+  {"ksm",      HB_TAG_NONE            },       /* Kumba != Kildin Sami */
   {"kss",      HB_TAG('K','I','S',' ')},       /* Southern Kisi -> Kisii */
-/*{"ksw",      HB_TAG('K','S','W',' ')},*/     /* S’gaw Karen */
+  {"ksw",      HB_TAG('K','S','W',' ')},       /* S’gaw Karen */
+  {"ksw",      HB_TAG('K','R','N',' ')},       /* S'gaw Karen -> Karen */
   {"ktb",      HB_TAG('K','E','B',' ')},       /* Kambaata -> Kebena */
   {"ktu",      HB_TAG('K','O','N',' ')},       /* Kituba (Democratic Republic of Congo) -> Kikongo */
   {"ktw",      HB_TAG('A','T','H',' ')},       /* Kato -> Athapaskan */
   {"ku",       HB_TAG('K','U','R',' ')},       /* Kurdish [macrolanguage] */
+  {"kui",      HB_TAG_NONE            },       /* Kuikúro-Kalapálo != Kui */
+  {"kul",      HB_TAG_NONE            },       /* Kulere != Kulvi */
 /*{"kum",      HB_TAG('K','U','M',' ')},*/     /* Kumyk */
   {"kuu",      HB_TAG('A','T','H',' ')},       /* Upper Kuskokwim -> Athapaskan */
+  {"kuw",      HB_TAG('B','A','D','0')},       /* Kpagua -> Banda */
+  {"kuy",      HB_TAG_NONE            },       /* Kuuku-Ya'u != Kuy */
   {"kv",       HB_TAG('K','O','M',' ')},       /* Komi [macrolanguage] */
   {"kvb",      HB_TAG('M','L','Y',' ')},       /* Kubu -> Malay */
+  {"kvl",      HB_TAG('K','R','N',' ')},       /* Kayaw -> Karen */
+  {"kvq",      HB_TAG('K','R','N',' ')},       /* Geba Karen -> Karen */
   {"kvr",      HB_TAG('M','L','Y',' ')},       /* Kerinci -> Malay */
+  {"kvt",      HB_TAG('K','R','N',' ')},       /* Lahta Karen -> Karen */
+  {"kvu",      HB_TAG('K','R','N',' ')},       /* Yinbaw Karen -> Karen */
+  {"kvy",      HB_TAG('K','R','N',' ')},       /* Yintale Karen -> Karen */
   {"kw",       HB_TAG('C','O','R',' ')},       /* Cornish */
+/*{"kwk",      HB_TAG('K','W','K',' ')},*/     /* Kwakiutl -> Kwakʼwala */
+  {"kww",      HB_TAG('C','P','P',' ')},       /* Kwinti -> Creoles */
   {"kwy",      HB_TAG('K','O','N','0')},       /* San Salvador Kongo -> Kongo */
   {"kxc",      HB_TAG('K','M','S',' ')},       /* Konso -> Komso */
   {"kxd",      HB_TAG('M','L','Y',' ')},       /* Brunei -> Malay */
+  {"kxf",      HB_TAG('K','R','N',' ')},       /* Manumanaw Karen -> Karen */
+  {"kxk",      HB_TAG('K','R','N',' ')},       /* Zayein Karen -> Karen */
   {"kxl",      HB_TAG('K','U','U',' ')},       /* Nepali Kurux (retired code) -> Kurukh */
   {"kxu",      HB_TAG('K','U','I',' ')},       /* Kui (India) (retired code) */
   {"ky",       HB_TAG('K','I','R',' ')},       /* Kirghiz (Kyrgyz) */
-/*{"kyu",      HB_TAG('K','Y','U',' ')},*/     /* Western Kayah */
+  {"kyk",      HB_TAG_NONE            },       /* Kamayo != Koryak */
+  {"kyu",      HB_TAG('K','Y','U',' ')},       /* Western Kayah */
+  {"kyu",      HB_TAG('K','R','N',' ')},       /* Western Kayah -> Karen */
   {"la",       HB_TAG('L','A','T',' ')},       /* Latin */
+  {"lac",      HB_TAG('M','Y','N',' ')},       /* Lacandon -> Mayan */
   {"lad",      HB_TAG('J','U','D',' ')},       /* Ladino */
+  {"lah",      HB_TAG_NONE            },       /* Lahnda [macrolanguage] != Lahuli */
+  {"lak",      HB_TAG_NONE            },       /* Laka (Nigeria) != Lak */
+  {"lam",      HB_TAG_NONE            },       /* Lamba != Lambani */
+  {"laz",      HB_TAG_NONE            },       /* Aribwatsa != Laz */
   {"lb",       HB_TAG('L','T','Z',' ')},       /* Luxembourgish */
   {"lbe",      HB_TAG('L','A','K',' ')},       /* Lak */
   {"lbj",      HB_TAG('L','D','K',' ')},       /* Ladakhi */
@@ -554,85 +819,133 @@ static const LangTag ot_languages[] = {
   {"lce",      HB_TAG('M','L','Y',' ')},       /* Loncong -> Malay */
   {"lcf",      HB_TAG('M','L','Y',' ')},       /* Lubu -> Malay */
   {"ldi",      HB_TAG('K','O','N','0')},       /* Laari -> Kongo */
+  {"ldk",      HB_TAG_NONE            },       /* Leelau != Ladakhi */
+/*{"lef",      HB_TAG('L','E','F',' ')},*/     /* Lelemi */
 /*{"lez",      HB_TAG('L','E','Z',' ')},*/     /* Lezghian -> Lezgi */
   {"lg",       HB_TAG('L','U','G',' ')},       /* Ganda */
   {"li",       HB_TAG('L','I','M',' ')},       /* Limburgish */
   {"lif",      HB_TAG('L','M','B',' ')},       /* Limbu */
 /*{"lij",      HB_TAG('L','I','J',' ')},*/     /* Ligurian */
+  {"lir",      HB_TAG('C','P','P',' ')},       /* Liberian English -> Creoles */
 /*{"lis",      HB_TAG('L','I','S',' ')},*/     /* Lisu */
   {"liw",      HB_TAG('M','L','Y',' ')},       /* Col -> Malay */
+  {"liy",      HB_TAG('B','A','D','0')},       /* Banda-Bambari -> Banda */
 /*{"ljp",      HB_TAG('L','J','P',' ')},*/     /* Lampung Api -> Lampung */
   {"lkb",      HB_TAG('L','U','H',' ')},       /* Kabras -> Luyia */
 /*{"lki",      HB_TAG('L','K','I',' ')},*/     /* Laki */
   {"lko",      HB_TAG('L','U','H',' ')},       /* Khayo -> Luyia */
   {"lks",      HB_TAG('L','U','H',' ')},       /* Kisa -> Luyia */
   {"lld",      HB_TAG('L','A','D',' ')},       /* Ladin */
+  {"lma",      HB_TAG_NONE            },       /* East Limba != Low Mari */
+  {"lmb",      HB_TAG_NONE            },       /* Merei != Limbu */
   {"lmn",      HB_TAG('L','A','M',' ')},       /* Lambadi -> Lambani */
 /*{"lmo",      HB_TAG('L','M','O',' ')},*/     /* Lombard */
+  {"lmw",      HB_TAG_NONE            },       /* Lake Miwok != Lomwe */
   {"ln",       HB_TAG('L','I','N',' ')},       /* Lingala */
+  {"lna",      HB_TAG('B','A','D','0')},       /* Langbashe -> Banda */
+  {"lnl",      HB_TAG('B','A','D','0')},       /* South Central Banda -> Banda */
   {"lo",       HB_TAG('L','A','O',' ')},       /* Lao */
 /*{"lom",      HB_TAG('L','O','M',' ')},*/     /* Loma (Liberia) */
+  {"lou",      HB_TAG('C','P','P',' ')},       /* Louisiana Creole -> Creoles */
+/*{"lpo",      HB_TAG('L','P','O',' ')},*/     /* Lipo */
 /*{"lrc",      HB_TAG('L','R','C',' ')},*/     /* Northern Luri -> Luri */
   {"lri",      HB_TAG('L','U','H',' ')},       /* Marachi -> Luyia */
   {"lrm",      HB_TAG('L','U','H',' ')},       /* Marama -> Luyia */
+  {"lrt",      HB_TAG('C','P','P',' ')},       /* Larantuka Malay -> Creoles */
+  {"lsb",      HB_TAG_NONE            },       /* Burundian Sign Language != Lower Sorbian */
   {"lsm",      HB_TAG('L','U','H',' ')},       /* Saamia -> Luyia */
   {"lt",       HB_TAG('L','T','H',' ')},       /* Lithuanian */
   {"ltg",      HB_TAG('L','V','I',' ')},       /* Latgalian -> Latvian */
+  {"lth",      HB_TAG_NONE            },       /* Thur != Lithuanian */
   {"lto",      HB_TAG('L','U','H',' ')},       /* Tsotso -> Luyia */
   {"lts",      HB_TAG('L','U','H',' ')},       /* Tachoni -> Luyia */
   {"lu",       HB_TAG('L','U','B',' ')},       /* Luba-Katanga */
 /*{"lua",      HB_TAG('L','U','A',' ')},*/     /* Luba-Lulua */
 /*{"luo",      HB_TAG('L','U','O',' ')},*/     /* Luo (Kenya and Tanzania) */
   {"lus",      HB_TAG('M','I','Z',' ')},       /* Lushai -> Mizo */
+  {"lus",      HB_TAG('Q','I','N',' ')},       /* Lushai -> Chin */
   {"luy",      HB_TAG('L','U','H',' ')},       /* Luyia [macrolanguage] */
   {"luz",      HB_TAG('L','R','C',' ')},       /* Southern Luri -> Luri */
   {"lv",       HB_TAG('L','V','I',' ')},       /* Latvian [macrolanguage] */
+  {"lvi",      HB_TAG_NONE            },       /* Lavi != Latvian */
   {"lvs",      HB_TAG('L','V','I',' ')},       /* Standard Latvian -> Latvian */
   {"lwg",      HB_TAG('L','U','H',' ')},       /* Wanga -> Luyia */
-  {"lzh",      HB_TAG('Z','H','T',' ')},       /* Literary Chinese -> Chinese Traditional */
+  {"lzh",      HB_TAG('Z','H','T',' ')},       /* Literary Chinese -> Chinese, Traditional */
   {"lzz",      HB_TAG('L','A','Z',' ')},       /* Laz */
 /*{"mad",      HB_TAG('M','A','D',' ')},*/     /* Madurese -> Madura */
 /*{"mag",      HB_TAG('M','A','G',' ')},*/     /* Magahi */
   {"mai",      HB_TAG('M','T','H',' ')},       /* Maithili */
+  {"maj",      HB_TAG_NONE            },       /* Jalapa De Díaz Mazatec != Majang */
   {"mak",      HB_TAG('M','K','R',' ')},       /* Makasar */
-/*{"mam",      HB_TAG('M','A','M',' ')},*/     /* Mam */
+  {"mam",      HB_TAG('M','A','M',' ')},       /* Mam */
+  {"mam",      HB_TAG('M','Y','N',' ')},       /* Mam -> Mayan */
   {"man",      HB_TAG('M','N','K',' ')},       /* Mandingo [macrolanguage] -> Maninka */
+  {"map",      HB_TAG_NONE            },       /* Austronesian [collection] != Mapudungun */
+  {"maw",      HB_TAG_NONE            },       /* Mampruli != Marwari */
   {"max",      HB_TAG('M','L','Y',' ')},       /* North Moluccan Malay -> Malay */
+  {"max",      HB_TAG('C','P','P',' ')},       /* North Moluccan Malay -> Creoles */
+  {"mbf",      HB_TAG('C','P','P',' ')},       /* Baba Malay -> Creoles */
+  {"mbn",      HB_TAG_NONE            },       /* Macaguán != Mbundu */
 /*{"mbo",      HB_TAG('M','B','O',' ')},*/     /* Mbo (Cameroon) */
+  {"mch",      HB_TAG_NONE            },       /* Maquiritari != Manchu */
+  {"mcm",      HB_TAG('C','P','P',' ')},       /* Malaccan Creole Portuguese -> Creoles */
+  {"mcr",      HB_TAG_NONE            },       /* Menya != Moose Cree */
   {"mct",      HB_TAG('B','T','I',' ')},       /* Mengisa -> Beti */
+  {"mde",      HB_TAG_NONE            },       /* Maba (Chad) != Mende */
   {"mdf",      HB_TAG('M','O','K',' ')},       /* Moksha */
 /*{"mdr",      HB_TAG('M','D','R',' ')},*/     /* Mandar */
   {"mdy",      HB_TAG('M','L','E',' ')},       /* Male (Ethiopia) */
   {"men",      HB_TAG('M','D','E',' ')},       /* Mende (Sierra Leone) */
   {"meo",      HB_TAG('M','L','Y',' ')},       /* Kedah Malay -> Malay */
 /*{"mer",      HB_TAG('M','E','R',' ')},*/     /* Meru */
-/*{"mfa",      HB_TAG('M','F','A',' ')},*/     /* Pattani Malay */
+  {"mfa",      HB_TAG('M','F','A',' ')},       /* Pattani Malay */
+  {"mfa",      HB_TAG('M','L','Y',' ')},       /* Pattani Malay -> Malay */
   {"mfb",      HB_TAG('M','L','Y',' ')},       /* Bangka -> Malay */
-/*{"mfe",      HB_TAG('M','F','E',' ')},*/     /* Morisyen */
+  {"mfe",      HB_TAG('M','F','E',' ')},       /* Morisyen */
+  {"mfe",      HB_TAG('C','P','P',' ')},       /* Morisyen -> Creoles */
+  {"mfp",      HB_TAG('C','P','P',' ')},       /* Makassar Malay -> Creoles */
   {"mg",       HB_TAG('M','L','G',' ')},       /* Malagasy [macrolanguage] */
   {"mh",       HB_TAG('M','A','H',' ')},       /* Marshallese */
+  {"mhc",      HB_TAG('M','Y','N',' ')},       /* Mocho -> Mayan */
   {"mhr",      HB_TAG('L','M','A',' ')},       /* Eastern Mari -> Low Mari */
   {"mhv",      HB_TAG('A','R','K',' ')},       /* Arakanese (retired code) -> Rakhine */
   {"mi",       HB_TAG('M','R','I',' ')},       /* Maori */
-/*{"min",      HB_TAG('M','I','N',' ')},*/     /* Minangkabau */
+  {"min",      HB_TAG('M','I','N',' ')},       /* Minangkabau */
+  {"min",      HB_TAG('M','L','Y',' ')},       /* Minangkabau -> Malay */
+  {"miz",      HB_TAG_NONE            },       /* Coatzospan Mixtec != Mizo */
   {"mk",       HB_TAG('M','K','D',' ')},       /* Macedonian */
+  {"mkn",      HB_TAG('C','P','P',' ')},       /* Kupang Malay -> Creoles */
+  {"mkr",      HB_TAG_NONE            },       /* Malas != Makasar */
   {"mku",      HB_TAG('M','N','K',' ')},       /* Konyanka Maninka -> Maninka */
 /*{"mkw",      HB_TAG('M','K','W',' ')},*/     /* Kituba (Congo) */
   {"ml",       HB_TAG('M','A','L',' ')},       /* Malayalam -> Malayalam Traditional */
   {"ml",       HB_TAG('M','L','R',' ')},       /* Malayalam -> Malayalam Reformed */
+  {"mle",      HB_TAG_NONE            },       /* Manambu != Male */
+  {"mln",      HB_TAG_NONE            },       /* Malango != Malinke */
   {"mlq",      HB_TAG('M','L','N',' ')},       /* Western Maninkakan -> Malinke */
   {"mlq",      HB_TAG('M','N','K',' ')},       /* Western Maninkakan -> Maninka */
+  {"mlr",      HB_TAG_NONE            },       /* Vame != Malayalam Reformed */
   {"mmr",      HB_TAG('H','M','N',' ')},       /* Western Xiangxi Miao -> Hmong */
   {"mn",       HB_TAG('M','N','G',' ')},       /* Mongolian [macrolanguage] */
   {"mnc",      HB_TAG('M','C','H',' ')},       /* Manchu */
+  {"mnd",      HB_TAG_NONE            },       /* Mondé != Mandinka */
+  {"mng",      HB_TAG_NONE            },       /* Eastern Mnong != Mongolian */
+  {"mnh",      HB_TAG('B','A','D','0')},       /* Mono (Democratic Republic of Congo) -> Banda */
 /*{"mni",      HB_TAG('M','N','I',' ')},*/     /* Manipuri */
   {"mnk",      HB_TAG('M','N','D',' ')},       /* Mandinka */
   {"mnk",      HB_TAG('M','N','K',' ')},       /* Mandinka -> Maninka */
-  {"mnp",      HB_TAG('Z','H','S',' ')},       /* Min Bei Chinese -> Chinese Simplified */
+  {"mnp",      HB_TAG('Z','H','S',' ')},       /* Min Bei Chinese -> Chinese, Simplified */
   {"mns",      HB_TAG('M','A','N',' ')},       /* Mansi */
   {"mnw",      HB_TAG('M','O','N',' ')},       /* Mon */
+  {"mnw",      HB_TAG('M','O','N','T')},       /* Mon -> Thailand Mon */
+  {"mnx",      HB_TAG_NONE            },       /* Manikion != Manx */
   {"mo",       HB_TAG('M','O','L',' ')},       /* Moldavian (retired code) */
+  {"mo",       HB_TAG('R','O','M',' ')},       /* Moldavian (retired code) -> Romanian */
+  {"mod",      HB_TAG('C','P','P',' ')},       /* Mobilian -> Creoles */
 /*{"moh",      HB_TAG('M','O','H',' ')},*/     /* Mohawk */
+  {"mok",      HB_TAG_NONE            },       /* Morori != Moksha */
+  {"mop",      HB_TAG('M','Y','N',' ')},       /* Mopán Maya -> Mayan */
+  {"mor",      HB_TAG_NONE            },       /* Moro != Moroccan */
 /*{"mos",      HB_TAG('M','O','S',' ')},*/     /* Mossi */
   {"mpe",      HB_TAG('M','A','J',' ')},       /* Majang */
   {"mqg",      HB_TAG('M','L','Y',' ')},       /* Kota Bangun Kutai Malay -> Malay */
@@ -643,9 +956,14 @@ static const LangTag ot_languages[] = {
   {"msc",      HB_TAG('M','N','K',' ')},       /* Sankaran Maninka -> Maninka */
   {"msh",      HB_TAG('M','L','G',' ')},       /* Masikoro Malagasy -> Malagasy */
   {"msi",      HB_TAG('M','L','Y',' ')},       /* Sabah Malay -> Malay */
+  {"msi",      HB_TAG('C','P','P',' ')},       /* Sabah Malay -> Creoles */
   {"mt",       HB_TAG('M','T','S',' ')},       /* Maltese */
+  {"mth",      HB_TAG_NONE            },       /* Munggui != Maithili */
   {"mtr",      HB_TAG('M','A','W',' ')},       /* Mewari -> Marwari */
+  {"mts",      HB_TAG_NONE            },       /* Yora != Maltese */
+  {"mud",      HB_TAG('C','P','P',' ')},       /* Mednyj Aleut -> Creoles */
   {"mui",      HB_TAG('M','L','Y',' ')},       /* Musi -> Malay */
+  {"mun",      HB_TAG_NONE            },       /* Munda [collection] != Mundari */
   {"mup",      HB_TAG('R','A','J',' ')},       /* Malvi -> Rajasthani */
   {"muq",      HB_TAG('H','M','N',' ')},       /* Eastern Xiangxi Miao -> Hmong */
 /*{"mus",      HB_TAG('M','U','S',' ')},*/     /* Creek -> Muscogee */
@@ -654,49 +972,100 @@ static const LangTag ot_languages[] = {
   {"mvf",      HB_TAG('M','N','G',' ')},       /* Peripheral Mongolian -> Mongolian */
   {"mwk",      HB_TAG('M','N','K',' ')},       /* Kita Maninkakan -> Maninka */
 /*{"mwl",      HB_TAG('M','W','L',' ')},*/     /* Mirandese */
+  {"mwq",      HB_TAG('Q','I','N',' ')},       /* Mün Chin -> Chin */
   {"mwr",      HB_TAG('M','A','W',' ')},       /* Marwari [macrolanguage] */
-/*{"mww",      HB_TAG('M','W','W',' ')},*/     /* Hmong Daw */
+  {"mww",      HB_TAG('M','W','W',' ')},       /* Hmong Daw */
+  {"mww",      HB_TAG('H','M','N',' ')},       /* Hmong Daw -> Hmong */
   {"my",       HB_TAG('B','R','M',' ')},       /* Burmese */
   {"mym",      HB_TAG('M','E','N',' ')},       /* Me’en */
-/*{"myn",      HB_TAG('M','Y','N',' ')},*/     /* Mayan [family] */
+/*{"myn",      HB_TAG('M','Y','N',' ')},*/     /* Mayan [collection] */
   {"myq",      HB_TAG('M','N','K',' ')},       /* Forest Maninka (retired code) -> Maninka */
   {"myv",      HB_TAG('E','R','Z',' ')},       /* Erzya */
+  {"mzb",      HB_TAG('B','B','R',' ')},       /* Tumzabt -> Berber */
 /*{"mzn",      HB_TAG('M','Z','N',' ')},*/     /* Mazanderani */
+  {"mzs",      HB_TAG('C','P','P',' ')},       /* Macanese -> Creoles */
   {"na",       HB_TAG('N','A','U',' ')},       /* Nauru -> Nauruan */
-/*{"nag",      HB_TAG('N','A','G',' ')},*/     /* Naga Pidgin -> Naga-Assamese */
-/*{"nah",      HB_TAG('N','A','H',' ')},*/     /* Nahuatl [family] */
-  {"nan",      HB_TAG('Z','H','S',' ')},       /* Min Nan Chinese -> Chinese Simplified */
+  {"nag",      HB_TAG('N','A','G',' ')},       /* Naga Pidgin -> Naga-Assamese */
+  {"nag",      HB_TAG('C','P','P',' ')},       /* Naga Pidgin -> Creoles */
+/*{"nah",      HB_TAG('N','A','H',' ')},*/     /* Nahuatl [collection] */
+  {"nan",      HB_TAG('Z','H','S',' ')},       /* Min Nan Chinese -> Chinese, Simplified */
 /*{"nap",      HB_TAG('N','A','P',' ')},*/     /* Neapolitan */
+  {"nas",      HB_TAG_NONE            },       /* Naasioi != Naskapi */
+  {"naz",      HB_TAG('N','A','H',' ')},       /* Coatepec Nahuatl -> Nahuatl */
   {"nb",       HB_TAG('N','O','R',' ')},       /* Norwegian Bokmål -> Norwegian */
+  {"nch",      HB_TAG('N','A','H',' ')},       /* Central Huasteca Nahuatl -> Nahuatl */
+  {"nci",      HB_TAG('N','A','H',' ')},       /* Classical Nahuatl -> Nahuatl */
+  {"ncj",      HB_TAG('N','A','H',' ')},       /* Northern Puebla Nahuatl -> Nahuatl */
+  {"ncl",      HB_TAG('N','A','H',' ')},       /* Michoacán Nahuatl -> Nahuatl */
+  {"ncr",      HB_TAG_NONE            },       /* Ncane != N-Cree */
+  {"ncx",      HB_TAG('N','A','H',' ')},       /* Central Puebla Nahuatl -> Nahuatl */
   {"nd",       HB_TAG('N','D','B',' ')},       /* North Ndebele -> Ndebele */
+  {"ndb",      HB_TAG_NONE            },       /* Kenswei Nsei != Ndebele */
 /*{"ndc",      HB_TAG('N','D','C',' ')},*/     /* Ndau */
+  {"ndg",      HB_TAG_NONE            },       /* Ndengereko != Ndonga */
 /*{"nds",      HB_TAG('N','D','S',' ')},*/     /* Low Saxon */
   {"ne",       HB_TAG('N','E','P',' ')},       /* Nepali [macrolanguage] */
+  {"nef",      HB_TAG('C','P','P',' ')},       /* Nefamese -> Creoles */
 /*{"new",      HB_TAG('N','E','W',' ')},*/     /* Newari */
   {"ng",       HB_TAG('N','D','G',' ')},       /* Ndonga */
 /*{"nga",      HB_TAG('N','G','A',' ')},*/     /* Ngbaka */
   {"ngl",      HB_TAG('L','M','W',' ')},       /* Lomwe */
-  {"ngo",      HB_TAG('S','X','T',' ')},       /* Ngoni -> Sutu */
+  {"ngm",      HB_TAG('C','P','P',' ')},       /* Ngatik Men's Creole -> Creoles */
+  {"ngo",      HB_TAG('S','X','T',' ')},       /* Ngoni (retired code) -> Sutu */
+  {"ngr",      HB_TAG_NONE            },       /* Engdewu != Nagari */
+  {"ngu",      HB_TAG('N','A','H',' ')},       /* Guerrero Nahuatl -> Nahuatl */
+  {"nhc",      HB_TAG('N','A','H',' ')},       /* Tabasco Nahuatl -> Nahuatl */
   {"nhd",      HB_TAG('G','U','A',' ')},       /* Chiripá -> Guarani */
+  {"nhe",      HB_TAG('N','A','H',' ')},       /* Eastern Huasteca Nahuatl -> Nahuatl */
+  {"nhg",      HB_TAG('N','A','H',' ')},       /* Tetelcingo Nahuatl -> Nahuatl */
+  {"nhi",      HB_TAG('N','A','H',' ')},       /* Zacatlán-Ahuacatlán-Tepetzintla Nahuatl -> Nahuatl */
+  {"nhk",      HB_TAG('N','A','H',' ')},       /* Isthmus-Cosoleacaque Nahuatl -> Nahuatl */
+  {"nhm",      HB_TAG('N','A','H',' ')},       /* Morelos Nahuatl -> Nahuatl */
+  {"nhn",      HB_TAG('N','A','H',' ')},       /* Central Nahuatl -> Nahuatl */
+  {"nhp",      HB_TAG('N','A','H',' ')},       /* Isthmus-Pajapan Nahuatl -> Nahuatl */
+  {"nhq",      HB_TAG('N','A','H',' ')},       /* Huaxcaleca Nahuatl -> Nahuatl */
+  {"nht",      HB_TAG('N','A','H',' ')},       /* Ometepec Nahuatl -> Nahuatl */
+  {"nhv",      HB_TAG('N','A','H',' ')},       /* Temascaltepec Nahuatl -> Nahuatl */
+  {"nhw",      HB_TAG('N','A','H',' ')},       /* Western Huasteca Nahuatl -> Nahuatl */
+  {"nhx",      HB_TAG('N','A','H',' ')},       /* Isthmus-Mecayapan Nahuatl -> Nahuatl */
+  {"nhy",      HB_TAG('N','A','H',' ')},       /* Northern Oaxaca Nahuatl -> Nahuatl */
+  {"nhz",      HB_TAG('N','A','H',' ')},       /* Santa María La Alta Nahuatl -> Nahuatl */
   {"niq",      HB_TAG('K','A','L',' ')},       /* Nandi -> Kalenjin */
+  {"nis",      HB_TAG_NONE            },       /* Nimi != Nisi */
 /*{"niu",      HB_TAG('N','I','U',' ')},*/     /* Niuean */
   {"niv",      HB_TAG('G','I','L',' ')},       /* Gilyak */
+  {"njt",      HB_TAG('C','P','P',' ')},       /* Ndyuka-Trio Pidgin -> Creoles */
   {"njz",      HB_TAG('N','I','S',' ')},       /* Nyishi -> Nisi */
+  {"nko",      HB_TAG_NONE            },       /* Nkonya != N’Ko */
+  {"nkx",      HB_TAG('I','J','O',' ')},       /* Nkoroo -> Ijo */
   {"nl",       HB_TAG('N','L','D',' ')},       /* Dutch */
+  {"nla",      HB_TAG('B','M','L',' ')},       /* Ngombale -> Bamileke */
   {"nle",      HB_TAG('L','U','H',' ')},       /* East Nyala -> Luyia */
+  {"nln",      HB_TAG('N','A','H',' ')},       /* Durango Nahuatl (retired code) -> Nahuatl */
+  {"nlv",      HB_TAG('N','A','H',' ')},       /* Orizaba Nahuatl -> Nahuatl */
   {"nn",       HB_TAG('N','Y','N',' ')},       /* Norwegian Nynorsk (Nynorsk, Norwegian) */
+  {"nnh",      HB_TAG('B','M','L',' ')},       /* Ngiemboon -> Bamileke */
+  {"nnz",      HB_TAG('B','M','L',' ')},       /* Nda'nda' -> Bamileke */
   {"no",       HB_TAG('N','O','R',' ')},       /* Norwegian [macrolanguage] */
   {"nod",      HB_TAG('N','T','A',' ')},       /* Northern Thai -> Northern Tai */
 /*{"noe",      HB_TAG('N','O','E',' ')},*/     /* Nimadi */
 /*{"nog",      HB_TAG('N','O','G',' ')},*/     /* Nogai */
 /*{"nov",      HB_TAG('N','O','V',' ')},*/     /* Novial */
   {"npi",      HB_TAG('N','E','P',' ')},       /* Nepali */
+  {"npl",      HB_TAG('N','A','H',' ')},       /* Southeastern Puebla Nahuatl -> Nahuatl */
   {"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 */
+  {"nsm",      HB_TAG_NONE            },       /* Sumi Naga != Northern Sami */
+/*{"nso",      HB_TAG('N','S','O',' ')},*/     /* Northern Sotho */
+  {"nsu",      HB_TAG('N','A','H',' ')},       /* Sierra Negra Nahuatl -> Nahuatl */
+  {"nto",      HB_TAG_NONE            },       /* Ntomba != Esperanto */
+  {"nue",      HB_TAG('B','A','D','0')},       /* Ngundu -> Banda */
+  {"nuu",      HB_TAG('B','A','D','0')},       /* Ngbundu -> Banda */
+  {"nuz",      HB_TAG('N','A','H',' ')},       /* Tlamacazapa Nahuatl -> Nahuatl */
   {"nv",       HB_TAG('N','A','V',' ')},       /* Navajo */
   {"nv",       HB_TAG('A','T','H',' ')},       /* Navajo -> Athapaskan */
+  {"nwe",      HB_TAG('B','M','L',' ')},       /* Ngwe -> Bamileke */
   {"ny",       HB_TAG('C','H','I',' ')},       /* Chichewa (Chewa, Nyanja) */
   {"nyd",      HB_TAG('L','U','H',' ')},       /* Nyore -> Luyia */
 /*{"nym",      HB_TAG('N','Y','M',' ')},*/     /* Nyamwezi */
@@ -708,21 +1077,33 @@ static const LangTag ot_languages[] = {
   {"ojc",      HB_TAG('O','J','B',' ')},       /* Central Ojibwa -> Ojibway */
   {"ojg",      HB_TAG('O','J','B',' ')},       /* Eastern Ojibwa -> Ojibway */
   {"ojs",      HB_TAG('O','C','R',' ')},       /* Severn Ojibwa -> Oji-Cree */
+  {"ojs",      HB_TAG('O','J','B',' ')},       /* Severn Ojibwa -> Ojibway */
   {"ojw",      HB_TAG('O','J','B',' ')},       /* Western Ojibwa -> Ojibway */
+  {"okd",      HB_TAG('I','J','O',' ')},       /* Okodia -> Ijo */
   {"oki",      HB_TAG('K','A','L',' ')},       /* Okiek -> Kalenjin */
   {"okm",      HB_TAG('K','O','H',' ')},       /* Middle Korean (10th-16th cent.) -> Korean Old Hangul */
+  {"okr",      HB_TAG('I','J','O',' ')},       /* Kirike -> Ijo */
   {"om",       HB_TAG('O','R','O',' ')},       /* Oromo [macrolanguage] */
+  {"onx",      HB_TAG('C','P','P',' ')},       /* Onin Based Pidgin -> Creoles */
+  {"oor",      HB_TAG('C','P','P',' ')},       /* Oorlams -> Creoles */
   {"or",       HB_TAG('O','R','I',' ')},       /* Odia (formerly Oriya) [macrolanguage] */
   {"orc",      HB_TAG('O','R','O',' ')},       /* Orma -> Oromo */
   {"orn",      HB_TAG('M','L','Y',' ')},       /* Orang Kanaq -> Malay */
+  {"oro",      HB_TAG_NONE            },       /* Orokolo != Oromo */
+  {"orr",      HB_TAG('I','J','O',' ')},       /* Oruma -> Ijo */
   {"ors",      HB_TAG('M','L','Y',' ')},       /* Orang Seletar -> Malay */
   {"ory",      HB_TAG('O','R','I',' ')},       /* Odia (formerly Oriya) */
   {"os",       HB_TAG('O','S','S',' ')},       /* Ossetian */
   {"otw",      HB_TAG('O','J','B',' ')},       /* Ottawa -> Ojibway */
+  {"oua",      HB_TAG('B','B','R',' ')},       /* Tagargrent -> Berber */
   {"pa",       HB_TAG('P','A','N',' ')},       /* Punjabi */
+  {"paa",      HB_TAG_NONE            },       /* Papuan [collection] != Palestinian Aramaic */
 /*{"pag",      HB_TAG('P','A','G',' ')},*/     /* Pangasinan */
+  {"pal",      HB_TAG_NONE            },       /* Pahlavi != Pali */
 /*{"pam",      HB_TAG('P','A','M',' ')},*/     /* Pampanga -> Pampangan */
   {"pap",      HB_TAG('P','A','P','0')},       /* Papiamento -> Papiamentu */
+  {"pap",      HB_TAG('C','P','P',' ')},       /* Papiamento -> Creoles */
+  {"pas",      HB_TAG_NONE            },       /* Papasena != Pashto */
 /*{"pau",      HB_TAG('P','A','U',' ')},*/     /* Palauan */
   {"pbt",      HB_TAG('P','A','S',' ')},       /* Southern Pashto -> Pashto */
   {"pbu",      HB_TAG('P','A','S',' ')},       /* Northern Pashto -> Pashto */
@@ -730,83 +1111,147 @@ static const LangTag ot_languages[] = {
 /*{"pcd",      HB_TAG('P','C','D',' ')},*/     /* Picard */
   {"pce",      HB_TAG('P','L','G',' ')},       /* Ruching Palaung -> Palaung */
   {"pck",      HB_TAG('Q','I','N',' ')},       /* Paite Chin -> Chin */
+  {"pcm",      HB_TAG('C','P','P',' ')},       /* Nigerian Pidgin -> Creoles */
 /*{"pdc",      HB_TAG('P','D','C',' ')},*/     /* Pennsylvania German */
+  {"pdu",      HB_TAG('K','R','N',' ')},       /* Kayan -> Karen */
+  {"pea",      HB_TAG('C','P','P',' ')},       /* Peranakan Indonesian -> Creoles */
   {"pel",      HB_TAG('M','L','Y',' ')},       /* Pekal -> Malay */
   {"pes",      HB_TAG('F','A','R',' ')},       /* Iranian Persian -> Persian */
+  {"pey",      HB_TAG('C','P','P',' ')},       /* Petjo -> Creoles */
   {"pga",      HB_TAG('A','R','A',' ')},       /* Sudanese Creole Arabic -> Arabic */
+  {"pga",      HB_TAG('C','P','P',' ')},       /* Sudanese Creole Arabic -> Creoles */
 /*{"phk",      HB_TAG('P','H','K',' ')},*/     /* Phake */
   {"pi",       HB_TAG('P','A','L',' ')},       /* Pali */
-/*{"pih",      HB_TAG('P','I','H',' ')},*/     /* Pitcairn-Norfolk -> Norfolk */
+  {"pih",      HB_TAG('P','I','H',' ')},       /* Pitcairn-Norfolk -> Norfolk */
+  {"pih",      HB_TAG('C','P','P',' ')},       /* Pitcairn-Norfolk -> Creoles */
+  {"pil",      HB_TAG_NONE            },       /* Yom != Filipino */
+  {"pis",      HB_TAG('C','P','P',' ')},       /* Pijin -> Creoles */
+  {"pkh",      HB_TAG('Q','I','N',' ')},       /* Pankhu -> Chin */
   {"pko",      HB_TAG('K','A','L',' ')},       /* Pökoot -> Kalenjin */
   {"pl",       HB_TAG('P','L','K',' ')},       /* Polish */
+  {"plg",      HB_TAG_NONE            },       /* Pilagá != Palaung */
+  {"plk",      HB_TAG_NONE            },       /* Kohistani Shina != Polish */
   {"pll",      HB_TAG('P','L','G',' ')},       /* Shwe Palaung -> Palaung */
+  {"pln",      HB_TAG('C','P','P',' ')},       /* Palenquero -> Creoles */
   {"plp",      HB_TAG('P','A','P',' ')},       /* Palpa (retired code) */
   {"plt",      HB_TAG('M','L','G',' ')},       /* Plateau Malagasy -> Malagasy */
+  {"pml",      HB_TAG('C','P','P',' ')},       /* Lingua Franca -> Creoles */
 /*{"pms",      HB_TAG('P','M','S',' ')},*/     /* Piemontese */
+  {"pmy",      HB_TAG('C','P','P',' ')},       /* Papuan Malay -> Creoles */
 /*{"pnb",      HB_TAG('P','N','B',' ')},*/     /* Western Panjabi */
-/*{"poh",      HB_TAG('P','O','H',' ')},*/     /* Poqomchi' -> Pocomchi */
+  {"poc",      HB_TAG('M','Y','N',' ')},       /* Poqomam -> Mayan */
+  {"poh",      HB_TAG('P','O','H',' ')},       /* Poqomchi' -> Pocomchi */
+  {"poh",      HB_TAG('M','Y','N',' ')},       /* Poqomchi' -> Mayan */
 /*{"pon",      HB_TAG('P','O','N',' ')},*/     /* Pohnpeian */
+  {"pov",      HB_TAG('C','P','P',' ')},       /* Upper Guinea Crioulo -> Creoles */
   {"ppa",      HB_TAG('B','A','G',' ')},       /* Pao (retired code) -> Baghelkhandi */
+  {"pre",      HB_TAG('C','P','P',' ')},       /* Principense -> Creoles */
 /*{"pro",      HB_TAG('P','R','O',' ')},*/     /* Old Provençal (to 1500) -> Provençal / Old Provençal */
   {"prs",      HB_TAG('D','R','I',' ')},       /* Dari */
+  {"prs",      HB_TAG('F','A','R',' ')},       /* Dari -> Persian */
   {"ps",       HB_TAG('P','A','S',' ')},       /* Pashto [macrolanguage] */
   {"pse",      HB_TAG('M','L','Y',' ')},       /* Central Malay -> Malay */
   {"pst",      HB_TAG('P','A','S',' ')},       /* Central Pashto -> Pashto */
   {"pt",       HB_TAG('P','T','G',' ')},       /* Portuguese */
-/*{"pwo",      HB_TAG('P','W','O',' ')},*/     /* Pwo Western Karen -> Western Pwo Karen */
+  {"pub",      HB_TAG('Q','I','N',' ')},       /* Purum -> Chin */
+  {"puz",      HB_TAG('Q','I','N',' ')},       /* Purum Naga (retired code) -> Chin */
+  {"pwo",      HB_TAG('P','W','O',' ')},       /* Pwo Western Karen -> Western Pwo Karen */
+  {"pwo",      HB_TAG('K','R','N',' ')},       /* Pwo Western Karen -> Karen */
+  {"pww",      HB_TAG('K','R','N',' ')},       /* Pwo Northern Karen -> Karen */
   {"qu",       HB_TAG('Q','U','Z',' ')},       /* Quechua [macrolanguage] */
   {"qub",      HB_TAG('Q','W','H',' ')},       /* Huallaga Huánuco Quechua -> Quechua (Peru) */
-/*{"quc",      HB_TAG('Q','U','C',' ')},*/     /* K’iche’ */
+  {"qub",      HB_TAG('Q','U','Z',' ')},       /* Huallaga Huánuco Quechua -> Quechua */
+  {"quc",      HB_TAG('Q','U','C',' ')},       /* K’iche’ */
+  {"quc",      HB_TAG('M','Y','N',' ')},       /* K'iche' -> Mayan */
   {"qud",      HB_TAG('Q','V','I',' ')},       /* Calderón Highland Quichua -> Quechua (Ecuador) */
+  {"qud",      HB_TAG('Q','U','Z',' ')},       /* Calderón Highland Quichua -> Quechua */
   {"quf",      HB_TAG('Q','U','Z',' ')},       /* Lambayeque Quechua -> Quechua */
   {"qug",      HB_TAG('Q','V','I',' ')},       /* Chimborazo Highland Quichua -> Quechua (Ecuador) */
-/*{"quh",      HB_TAG('Q','U','H',' ')},*/     /* South Bolivian Quechua -> Quechua (Bolivia) */
+  {"qug",      HB_TAG('Q','U','Z',' ')},       /* Chimborazo Highland Quichua -> Quechua */
+  {"quh",      HB_TAG('Q','U','H',' ')},       /* South Bolivian Quechua -> Quechua (Bolivia) */
+  {"quh",      HB_TAG('Q','U','Z',' ')},       /* South Bolivian Quechua -> Quechua */
   {"quk",      HB_TAG('Q','U','Z',' ')},       /* Chachapoyas Quechua -> Quechua */
+  {"qul",      HB_TAG('Q','U','H',' ')},       /* North Bolivian Quechua -> Quechua (Bolivia) */
   {"qul",      HB_TAG('Q','U','Z',' ')},       /* North Bolivian Quechua -> Quechua */
+  {"qum",      HB_TAG('M','Y','N',' ')},       /* Sipacapense -> Mayan */
   {"qup",      HB_TAG('Q','V','I',' ')},       /* Southern Pastaza Quechua -> Quechua (Ecuador) */
+  {"qup",      HB_TAG('Q','U','Z',' ')},       /* Southern Pastaza Quechua -> Quechua */
   {"qur",      HB_TAG('Q','W','H',' ')},       /* Yanahuanca Pasco Quechua -> Quechua (Peru) */
+  {"qur",      HB_TAG('Q','U','Z',' ')},       /* Yanahuanca Pasco Quechua -> Quechua */
   {"qus",      HB_TAG('Q','U','H',' ')},       /* Santiago del Estero Quichua -> Quechua (Bolivia) */
+  {"qus",      HB_TAG('Q','U','Z',' ')},       /* Santiago del Estero Quichua -> Quechua */
+  {"quv",      HB_TAG('M','Y','N',' ')},       /* Sacapulteco -> Mayan */
   {"quw",      HB_TAG('Q','V','I',' ')},       /* Tena Lowland Quichua -> Quechua (Ecuador) */
+  {"quw",      HB_TAG('Q','U','Z',' ')},       /* Tena Lowland Quichua -> Quechua */
   {"qux",      HB_TAG('Q','W','H',' ')},       /* Yauyos Quechua -> Quechua (Peru) */
+  {"qux",      HB_TAG('Q','U','Z',' ')},       /* Yauyos Quechua -> Quechua */
   {"quy",      HB_TAG('Q','U','Z',' ')},       /* Ayacucho Quechua -> Quechua */
 /*{"quz",      HB_TAG('Q','U','Z',' ')},*/     /* Cusco Quechua -> Quechua */
   {"qva",      HB_TAG('Q','W','H',' ')},       /* Ambo-Pasco Quechua -> Quechua (Peru) */
+  {"qva",      HB_TAG('Q','U','Z',' ')},       /* Ambo-Pasco Quechua -> Quechua */
   {"qvc",      HB_TAG('Q','U','Z',' ')},       /* Cajamarca Quechua -> Quechua */
   {"qve",      HB_TAG('Q','U','Z',' ')},       /* Eastern Apurímac Quechua -> Quechua */
   {"qvh",      HB_TAG('Q','W','H',' ')},       /* Huamalíes-Dos de Mayo Huánuco Quechua -> Quechua (Peru) */
-/*{"qvi",      HB_TAG('Q','V','I',' ')},*/     /* Imbabura Highland Quichua -> Quechua (Ecuador) */
+  {"qvh",      HB_TAG('Q','U','Z',' ')},       /* Huamalíes-Dos de Mayo Huánuco Quechua -> Quechua */
+  {"qvi",      HB_TAG('Q','V','I',' ')},       /* Imbabura Highland Quichua -> Quechua (Ecuador) */
+  {"qvi",      HB_TAG('Q','U','Z',' ')},       /* Imbabura Highland Quichua -> Quechua */
   {"qvj",      HB_TAG('Q','V','I',' ')},       /* Loja Highland Quichua -> Quechua (Ecuador) */
+  {"qvj",      HB_TAG('Q','U','Z',' ')},       /* Loja Highland Quichua -> Quechua */
   {"qvl",      HB_TAG('Q','W','H',' ')},       /* Cajatambo North Lima Quechua -> Quechua (Peru) */
+  {"qvl",      HB_TAG('Q','U','Z',' ')},       /* Cajatambo North Lima Quechua -> Quechua */
   {"qvm",      HB_TAG('Q','W','H',' ')},       /* Margos-Yarowilca-Lauricocha Quechua -> Quechua (Peru) */
+  {"qvm",      HB_TAG('Q','U','Z',' ')},       /* Margos-Yarowilca-Lauricocha Quechua -> Quechua */
   {"qvn",      HB_TAG('Q','W','H',' ')},       /* North Junín Quechua -> Quechua (Peru) */
+  {"qvn",      HB_TAG('Q','U','Z',' ')},       /* North Junín Quechua -> Quechua */
   {"qvo",      HB_TAG('Q','V','I',' ')},       /* Napo Lowland Quechua -> Quechua (Ecuador) */
+  {"qvo",      HB_TAG('Q','U','Z',' ')},       /* Napo Lowland Quechua -> Quechua */
   {"qvp",      HB_TAG('Q','W','H',' ')},       /* Pacaraos Quechua -> Quechua (Peru) */
+  {"qvp",      HB_TAG('Q','U','Z',' ')},       /* Pacaraos Quechua -> Quechua */
   {"qvs",      HB_TAG('Q','U','Z',' ')},       /* San Martín Quechua -> Quechua */
   {"qvw",      HB_TAG('Q','W','H',' ')},       /* Huaylla Wanca Quechua -> Quechua (Peru) */
+  {"qvw",      HB_TAG('Q','U','Z',' ')},       /* Huaylla Wanca Quechua -> Quechua */
   {"qvz",      HB_TAG('Q','V','I',' ')},       /* Northern Pastaza Quichua -> Quechua (Ecuador) */
+  {"qvz",      HB_TAG('Q','U','Z',' ')},       /* Northern Pastaza Quichua -> Quechua */
   {"qwa",      HB_TAG('Q','W','H',' ')},       /* Corongo Ancash Quechua -> Quechua (Peru) */
+  {"qwa",      HB_TAG('Q','U','Z',' ')},       /* Corongo Ancash Quechua -> Quechua */
   {"qwc",      HB_TAG('Q','U','Z',' ')},       /* Classical Quechua -> Quechua */
-/*{"qwh",      HB_TAG('Q','W','H',' ')},*/     /* Huaylas Ancash Quechua -> Quechua (Peru) */
+  {"qwh",      HB_TAG('Q','W','H',' ')},       /* Huaylas Ancash Quechua -> Quechua (Peru) */
+  {"qwh",      HB_TAG('Q','U','Z',' ')},       /* Huaylas Ancash Quechua -> Quechua */
   {"qws",      HB_TAG('Q','W','H',' ')},       /* Sihuas Ancash Quechua -> Quechua (Peru) */
+  {"qws",      HB_TAG('Q','U','Z',' ')},       /* Sihuas Ancash Quechua -> Quechua */
+  {"qwt",      HB_TAG('A','T','H',' ')},       /* Kwalhioqua-Tlatskanai -> Athapaskan */
   {"qxa",      HB_TAG('Q','W','H',' ')},       /* Chiquián Ancash Quechua -> Quechua (Peru) */
+  {"qxa",      HB_TAG('Q','U','Z',' ')},       /* Chiquián Ancash Quechua -> Quechua */
   {"qxc",      HB_TAG('Q','W','H',' ')},       /* Chincha Quechua -> Quechua (Peru) */
+  {"qxc",      HB_TAG('Q','U','Z',' ')},       /* Chincha Quechua -> Quechua */
   {"qxh",      HB_TAG('Q','W','H',' ')},       /* Panao Huánuco Quechua -> Quechua (Peru) */
+  {"qxh",      HB_TAG('Q','U','Z',' ')},       /* Panao Huánuco Quechua -> Quechua */
   {"qxl",      HB_TAG('Q','V','I',' ')},       /* Salasaca Highland Quichua -> Quechua (Ecuador) */
+  {"qxl",      HB_TAG('Q','U','Z',' ')},       /* Salasaca Highland Quichua -> Quechua */
   {"qxn",      HB_TAG('Q','W','H',' ')},       /* Northern Conchucos Ancash Quechua -> Quechua (Peru) */
+  {"qxn",      HB_TAG('Q','U','Z',' ')},       /* Northern Conchucos Ancash Quechua -> Quechua */
   {"qxo",      HB_TAG('Q','W','H',' ')},       /* Southern Conchucos Ancash Quechua -> Quechua (Peru) */
+  {"qxo",      HB_TAG('Q','U','Z',' ')},       /* Southern Conchucos Ancash Quechua -> Quechua */
   {"qxp",      HB_TAG('Q','U','Z',' ')},       /* Puno Quechua -> Quechua */
   {"qxr",      HB_TAG('Q','V','I',' ')},       /* Cañar Highland Quichua -> Quechua (Ecuador) */
+  {"qxr",      HB_TAG('Q','U','Z',' ')},       /* Cañar Highland Quichua -> Quechua */
   {"qxt",      HB_TAG('Q','W','H',' ')},       /* Santa Ana de Tusi Pasco Quechua -> Quechua (Peru) */
+  {"qxt",      HB_TAG('Q','U','Z',' ')},       /* Santa Ana de Tusi Pasco Quechua -> Quechua */
   {"qxu",      HB_TAG('Q','U','Z',' ')},       /* Arequipa-La Unión Quechua -> Quechua */
   {"qxw",      HB_TAG('Q','W','H',' ')},       /* Jauja Wanca Quechua -> Quechua (Peru) */
+  {"qxw",      HB_TAG('Q','U','Z',' ')},       /* Jauja Wanca Quechua -> Quechua */
   {"rag",      HB_TAG('L','U','H',' ')},       /* Logooli -> Luyia */
 /*{"raj",      HB_TAG('R','A','J',' ')},*/     /* Rajasthani [macrolanguage] */
+  {"ral",      HB_TAG('Q','I','N',' ')},       /* Ralte -> Chin */
 /*{"rar",      HB_TAG('R','A','R',' ')},*/     /* Rarotongan */
   {"rbb",      HB_TAG('P','L','G',' ')},       /* Rumai Palaung -> Palaung */
   {"rbl",      HB_TAG('B','I','K',' ')},       /* Miraya Bikol -> Bikol */
+  {"rcf",      HB_TAG('C','P','P',' ')},       /* Réunion Creole French -> Creoles */
 /*{"rej",      HB_TAG('R','E','J',' ')},*/     /* Rejang */
+/*{"rhg",      HB_TAG('R','H','G',' ')},*/     /* Rohingya */
 /*{"ria",      HB_TAG('R','I','A',' ')},*/     /* Riang (India) */
-/*{"rif",      HB_TAG('R','I','F',' ')},*/     /* Tarifit */
+  {"rif",      HB_TAG('R','I','F',' ')},       /* Tarifit */
+  {"rif",      HB_TAG('B','B','R',' ')},       /* Tarifit -> Berber */
 /*{"rit",      HB_TAG('R','I','T',' ')},*/     /* Ritharrngu -> Ritarungo */
   {"rki",      HB_TAG('A','R','K',' ')},       /* Rakhine */
 /*{"rkw",      HB_TAG('R','K','W',' ')},*/     /* Arakwal */
@@ -816,13 +1261,16 @@ static const LangTag ot_languages[] = {
   {"rml",      HB_TAG('R','O','Y',' ')},       /* Baltic Romani -> Romany */
   {"rmn",      HB_TAG('R','O','Y',' ')},       /* Balkan Romani -> Romany */
   {"rmo",      HB_TAG('R','O','Y',' ')},       /* Sinte Romani -> Romany */
+  {"rms",      HB_TAG_NONE            },       /* Romanian Sign Language != Romansh */
   {"rmw",      HB_TAG('R','O','Y',' ')},       /* Welsh Romani -> Romany */
-/*{"rmy",      HB_TAG('R','M','Y',' ')},*/     /* Vlax Romani */
+  {"rmy",      HB_TAG('R','M','Y',' ')},       /* Vlax Romani */
+  {"rmy",      HB_TAG('R','O','Y',' ')},       /* Vlax Romani -> Romany */
   {"rmz",      HB_TAG('A','R','K',' ')},       /* Marma -> Rakhine */
   {"rn",       HB_TAG('R','U','N',' ')},       /* Rundi */
-  {"rnl",      HB_TAG('H','A','L',' ')},       /* Ranglong -> Halam (Falam Chin) */
   {"ro",       HB_TAG('R','O','M',' ')},       /* Romanian */
   {"rom",      HB_TAG('R','O','Y',' ')},       /* Romany [macrolanguage] */
+  {"rop",      HB_TAG('C','P','P',' ')},       /* Kriol -> Creoles */
+  {"rtc",      HB_TAG('Q','I','N',' ')},       /* Rungtu Chin -> Chin */
 /*{"rtm",      HB_TAG('R','T','M',' ')},*/     /* Rotuman */
   {"ru",       HB_TAG('R','U','S',' ')},       /* Russian */
   {"rue",      HB_TAG('R','S','Y',' ')},       /* Rusyn */
@@ -830,11 +1278,16 @@ static const LangTag ot_languages[] = {
   {"rw",       HB_TAG('R','U','A',' ')},       /* Kinyarwanda */
   {"rwr",      HB_TAG('M','A','W',' ')},       /* Marwari (India) */
   {"sa",       HB_TAG('S','A','N',' ')},       /* Sanskrit */
+  {"sad",      HB_TAG_NONE            },       /* Sandawe != Sadri */
   {"sah",      HB_TAG('Y','A','K',' ')},       /* Yakut -> Sakha */
   {"sam",      HB_TAG('P','A','A',' ')},       /* Samaritan Aramaic -> Palestinian Aramaic */
 /*{"sas",      HB_TAG('S','A','S',' ')},*/     /* Sasak */
 /*{"sat",      HB_TAG('S','A','T',' ')},*/     /* Santali */
+  {"say",      HB_TAG_NONE            },       /* Saya != Sayisi */
   {"sc",       HB_TAG('S','R','D',' ')},       /* Sardinian [macrolanguage] */
+  {"scf",      HB_TAG('C','P','P',' ')},       /* San Miguel Creole French -> Creoles */
+  {"sch",      HB_TAG('Q','I','N',' ')},       /* Sakachep -> Chin */
+  {"sci",      HB_TAG('C','P','P',' ')},       /* Sri Lankan Creole Malay -> Creoles */
   {"sck",      HB_TAG('S','A','D',' ')},       /* Sadri */
 /*{"scn",      HB_TAG('S','C','N',' ')},*/     /* Sicilian */
 /*{"sco",      HB_TAG('S','C','O',' ')},*/     /* Scots */
@@ -845,60 +1298,92 @@ static const LangTag ot_languages[] = {
   {"sdc",      HB_TAG('S','R','D',' ')},       /* Sassarese Sardinian -> Sardinian */
   {"sdh",      HB_TAG('K','U','R',' ')},       /* Southern Kurdish -> Kurdish */
   {"sdn",      HB_TAG('S','R','D',' ')},       /* Gallurese Sardinian -> Sardinian */
+  {"sds",      HB_TAG('B','B','R',' ')},       /* Sened -> Berber */
   {"se",       HB_TAG('N','S','M',' ')},       /* Northern Sami */
   {"seh",      HB_TAG('S','N','A',' ')},       /* Sena */
   {"sek",      HB_TAG('A','T','H',' ')},       /* Sekani -> Athapaskan */
 /*{"sel",      HB_TAG('S','E','L',' ')},*/     /* Selkup */
   {"sez",      HB_TAG('Q','I','N',' ')},       /* Senthang Chin -> Chin */
+  {"sfm",      HB_TAG('S','F','M',' ')},       /* Small Flowery Miao */
   {"sfm",      HB_TAG('H','M','N',' ')},       /* Small Flowery Miao -> Hmong */
   {"sg",       HB_TAG('S','G','O',' ')},       /* Sango */
 /*{"sga",      HB_TAG('S','G','A',' ')},*/     /* Old Irish (to 900) */
   {"sgc",      HB_TAG('K','A','L',' ')},       /* Kipsigis -> Kalenjin */
+  {"sgo",      HB_TAG_NONE            },       /* Songa (retired code) != Sango */
 /*{"sgs",      HB_TAG('S','G','S',' ')},*/     /* Samogitian */
   {"sgw",      HB_TAG('C','H','G',' ')},       /* Sebat Bet Gurage -> Chaha Gurage */
-  {"sgw",      HB_TAG('S','G','W',' ')},       /* Sebat Bet Gurage -> Chaha Gurage (SIL fonts) */
-/*{"shi",      HB_TAG('S','H','I',' ')},*/     /* Tachelhit */
+  {"sh",       HB_TAG('B','O','S',' ')},       /* Serbo-Croatian [macrolanguage] -> Bosnian */
+  {"sh",       HB_TAG('H','R','V',' ')},       /* Serbo-Croatian [macrolanguage] -> Croatian */
+  {"sh",       HB_TAG('S','R','B',' ')},       /* Serbo-Croatian [macrolanguage] -> Serbian */
+  {"shi",      HB_TAG('S','H','I',' ')},       /* Tachelhit */
+  {"shi",      HB_TAG('B','B','R',' ')},       /* Tachelhit -> Berber */
+  {"shl",      HB_TAG('Q','I','N',' ')},       /* Shendu -> Chin */
 /*{"shn",      HB_TAG('S','H','N',' ')},*/     /* Shan */
   {"shu",      HB_TAG('A','R','A',' ')},       /* Chadian Arabic -> Arabic */
+  {"shy",      HB_TAG('B','B','R',' ')},       /* Tachawit -> Berber */
   {"si",       HB_TAG('S','N','H',' ')},       /* Sinhala (Sinhalese) */
+  {"sib",      HB_TAG_NONE            },       /* Sebop != Sibe */
 /*{"sid",      HB_TAG('S','I','D',' ')},*/     /* Sidamo */
+  {"sig",      HB_TAG_NONE            },       /* Paasaal != Silte Gurage */
+  {"siz",      HB_TAG('B','B','R',' ')},       /* Siwi -> Berber */
   {"sjd",      HB_TAG('K','S','M',' ')},       /* Kildin Sami */
   {"sjo",      HB_TAG('S','I','B',' ')},       /* Xibe -> Sibe */
+  {"sjs",      HB_TAG('B','B','R',' ')},       /* Senhaja De Srair -> Berber */
   {"sk",       HB_TAG('S','K','Y',' ')},       /* Slovak */
   {"skg",      HB_TAG('M','L','G',' ')},       /* Sakalava Malagasy -> Malagasy */
   {"skr",      HB_TAG('S','R','K',' ')},       /* Saraiki */
+  {"sks",      HB_TAG_NONE            },       /* Maia != Skolt Sami */
+  {"skw",      HB_TAG('C','P','P',' ')},       /* Skepi Creole Dutch -> Creoles */
+  {"sky",      HB_TAG_NONE            },       /* Sikaiana != Slovak */
   {"sl",       HB_TAG('S','L','V',' ')},       /* Slovenian */
+  {"sla",      HB_TAG_NONE            },       /* Slavic [collection] != Slavey */
   {"sm",       HB_TAG('S','M','O',' ')},       /* Samoan */
   {"sma",      HB_TAG('S','S','M',' ')},       /* Southern Sami */
   {"smj",      HB_TAG('L','S','M',' ')},       /* Lule Sami */
+  {"sml",      HB_TAG_NONE            },       /* Central Sama != Somali */
   {"smn",      HB_TAG('I','S','M',' ')},       /* Inari Sami */
   {"sms",      HB_TAG('S','K','S',' ')},       /* Skolt Sami */
+  {"smt",      HB_TAG('Q','I','N',' ')},       /* Simte -> Chin */
   {"sn",       HB_TAG('S','N','A','0')},       /* Shona */
+  {"snh",      HB_TAG_NONE            },       /* Shinabo (retired code) != Sinhala (Sinhalese) */
 /*{"snk",      HB_TAG('S','N','K',' ')},*/     /* Soninke */
   {"so",       HB_TAG('S','M','L',' ')},       /* Somali */
+  {"sog",      HB_TAG_NONE            },       /* Sogdian != Sodo Gurage */
 /*{"sop",      HB_TAG('S','O','P',' ')},*/     /* Songe */
   {"spv",      HB_TAG('O','R','I',' ')},       /* Sambalpuri -> Odia (formerly Oriya) */
   {"spy",      HB_TAG('K','A','L',' ')},       /* Sabaot -> Kalenjin */
   {"sq",       HB_TAG('S','Q','I',' ')},       /* Albanian [macrolanguage] */
   {"sr",       HB_TAG('S','R','B',' ')},       /* Serbian */
+  {"srb",      HB_TAG_NONE            },       /* Sora != Serbian */
   {"src",      HB_TAG('S','R','D',' ')},       /* Logudorese Sardinian -> Sardinian */
+  {"srk",      HB_TAG_NONE            },       /* Serudung Murut != Saraiki */
+  {"srm",      HB_TAG('C','P','P',' ')},       /* Saramaccan -> Creoles */
+  {"srn",      HB_TAG('C','P','P',' ')},       /* Sranan Tongo -> Creoles */
   {"sro",      HB_TAG('S','R','D',' ')},       /* Campidanese Sardinian -> Sardinian */
 /*{"srr",      HB_TAG('S','R','R',' ')},*/     /* Serer */
   {"srs",      HB_TAG('A','T','H',' ')},       /* Sarsi -> Athapaskan */
   {"ss",       HB_TAG('S','W','Z',' ')},       /* Swati */
   {"ssh",      HB_TAG('A','R','A',' ')},       /* Shihhi Arabic -> Arabic */
-  {"st",       HB_TAG('S','O','T',' ')},       /* Southern Sotho -> Sotho, Southern */
+  {"ssl",      HB_TAG_NONE            },       /* Western Sisaala != South Slavey */
+  {"ssm",      HB_TAG_NONE            },       /* Semnam != Southern Sami */
+  {"st",       HB_TAG('S','O','T',' ')},       /* Southern Sotho */
+  {"sta",      HB_TAG('C','P','P',' ')},       /* Settla -> Creoles */
 /*{"stq",      HB_TAG('S','T','Q',' ')},*/     /* Saterfriesisch -> Saterland Frisian */
   {"stv",      HB_TAG('S','I','G',' ')},       /* Silt'e -> Silte Gurage */
   {"su",       HB_TAG('S','U','N',' ')},       /* Sundanese */
 /*{"suk",      HB_TAG('S','U','K',' ')},*/     /* Sukuma */
   {"suq",      HB_TAG('S','U','R',' ')},       /* Suri */
+  {"sur",      HB_TAG_NONE            },       /* Mwaghavul != Suri */
   {"sv",       HB_TAG('S','V','E',' ')},       /* Swedish */
 /*{"sva",      HB_TAG('S','V','A',' ')},*/     /* Svan */
+  {"svc",      HB_TAG('C','P','P',' ')},       /* Vincentian Creole English -> Creoles */
+  {"sve",      HB_TAG_NONE            },       /* Serili != Swedish */
   {"sw",       HB_TAG('S','W','K',' ')},       /* Swahili [macrolanguage] */
   {"swb",      HB_TAG('C','M','R',' ')},       /* Maore Comorian -> Comorian */
   {"swc",      HB_TAG('S','W','K',' ')},       /* Congo Swahili -> Swahili */
   {"swh",      HB_TAG('S','W','K',' ')},       /* Swahili */
+  {"swk",      HB_TAG_NONE            },       /* Malawi Sena != Swahili */
+  {"swn",      HB_TAG('B','B','R',' ')},       /* Sawknah -> Berber */
   {"swv",      HB_TAG('M','A','W',' ')},       /* Shekhawati -> Marwari */
 /*{"sxu",      HB_TAG('S','X','U',' ')},*/     /* Upper Saxon */
   {"syc",      HB_TAG('S','Y','R',' ')},       /* Classical Syriac -> Syriac */
@@ -908,11 +1393,16 @@ static const LangTag ot_languages[] = {
   {"ta",       HB_TAG('T','A','M',' ')},       /* Tamil */
   {"taa",      HB_TAG('A','T','H',' ')},       /* Lower Tanana -> Athapaskan */
 /*{"tab",      HB_TAG('T','A','B',' ')},*/     /* Tabassaran -> Tabasaran */
+  {"taj",      HB_TAG_NONE            },       /* Eastern Tamang != Tajiki */
   {"taq",      HB_TAG('T','M','H',' ')},       /* Tamasheq -> Tamashek */
+  {"taq",      HB_TAG('B','B','R',' ')},       /* Tamasheq -> Berber */
+  {"tas",      HB_TAG('C','P','P',' ')},       /* Tay Boi -> Creoles */
   {"tau",      HB_TAG('A','T','H',' ')},       /* Upper Tanana -> Athapaskan */
   {"tcb",      HB_TAG('A','T','H',' ')},       /* Tanacross -> Athapaskan */
   {"tce",      HB_TAG('A','T','H',' ')},       /* Southern Tutchone -> Athapaskan */
+  {"tch",      HB_TAG('C','P','P',' ')},       /* Turks And Caicos Creole English -> Creoles */
   {"tcp",      HB_TAG('Q','I','N',' ')},       /* Tawr Chin -> Chin */
+  {"tcs",      HB_TAG('C','P','P',' ')},       /* Torres Strait Creole -> Creoles */
   {"tcy",      HB_TAG('T','U','L',' ')},       /* Tulu -> Tumbuka */
   {"tcz",      HB_TAG('Q','I','N',' ')},       /* Thado Chin -> Chin */
 /*{"tdd",      HB_TAG('T','D','D',' ')},*/     /* Tai Nüa -> Dehong Dai */
@@ -921,41 +1411,72 @@ static const LangTag ot_languages[] = {
   {"tec",      HB_TAG('K','A','L',' ')},       /* Terik -> Kalenjin */
   {"tem",      HB_TAG('T','M','N',' ')},       /* Timne -> Temne */
 /*{"tet",      HB_TAG('T','E','T',' ')},*/     /* Tetum */
+  {"tez",      HB_TAG('B','B','R',' ')},       /* Tetserret -> Berber */
   {"tfn",      HB_TAG('A','T','H',' ')},       /* Tanaina -> Athapaskan */
   {"tg",       HB_TAG('T','A','J',' ')},       /* Tajik -> Tajiki */
+  {"tgh",      HB_TAG('C','P','P',' ')},       /* Tobagonian Creole English -> Creoles */
   {"tgj",      HB_TAG('N','I','S',' ')},       /* Tagin -> Nisi */
+  {"tgn",      HB_TAG_NONE            },       /* Tandaganon != Tongan */
+  {"tgr",      HB_TAG_NONE            },       /* Tareng != Tigre */
   {"tgx",      HB_TAG('A','T','H',' ')},       /* Tagish -> Athapaskan */
+  {"tgy",      HB_TAG_NONE            },       /* Togoyo != Tigrinya */
   {"th",       HB_TAG('T','H','A',' ')},       /* Thai */
   {"tht",      HB_TAG('A','T','H',' ')},       /* Tahltan -> Athapaskan */
   {"thv",      HB_TAG('T','M','H',' ')},       /* Tahaggart Tamahaq -> Tamashek */
+  {"thv",      HB_TAG('B','B','R',' ')},       /* Tahaggart Tamahaq -> Berber */
   {"thz",      HB_TAG('T','M','H',' ')},       /* Tayart Tamajeq -> Tamashek */
+  {"thz",      HB_TAG('B','B','R',' ')},       /* Tayart Tamajeq -> Berber */
   {"ti",       HB_TAG('T','G','Y',' ')},       /* Tigrinya */
+  {"tia",      HB_TAG('B','B','R',' ')},       /* Tidikelt Tamazight -> Berber */
   {"tig",      HB_TAG('T','G','R',' ')},       /* Tigre */
 /*{"tiv",      HB_TAG('T','I','V',' ')},*/     /* Tiv */
+/*{"tjl",      HB_TAG('T','J','L',' ')},*/     /* Tai Laing */
+  {"tjo",      HB_TAG('B','B','R',' ')},       /* Temacine Tamazight -> Berber */
   {"tk",       HB_TAG('T','K','M',' ')},       /* Turkmen */
   {"tkg",      HB_TAG('M','L','G',' ')},       /* Tesaka Malagasy -> Malagasy */
+  {"tkm",      HB_TAG_NONE            },       /* Takelma != Turkmen */
   {"tl",       HB_TAG('T','G','L',' ')},       /* Tagalog */
-/*{"tmh",      HB_TAG('T','M','H',' ')},*/     /* Tamashek [macrolanguage] */
+/*{"tli",      HB_TAG('T','L','I',' ')},*/     /* Tlingit */
+  {"tmg",      HB_TAG('C','P','P',' ')},       /* Ternateño -> Creoles */
+  {"tmh",      HB_TAG('T','M','H',' ')},       /* Tamashek [macrolanguage] */
+  {"tmh",      HB_TAG('B','B','R',' ')},       /* Tamashek [macrolanguage] -> Berber */
+  {"tmn",      HB_TAG_NONE            },       /* Taman (Indonesia) != Temne */
   {"tmw",      HB_TAG('M','L','Y',' ')},       /* Temuan -> Malay */
   {"tn",       HB_TAG('T','N','A',' ')},       /* Tswana */
+  {"tna",      HB_TAG_NONE            },       /* Tacana != Tswana */
+  {"tne",      HB_TAG_NONE            },       /* Tinoc Kallahan (retired code) != Tundra Enets */
   {"tnf",      HB_TAG('D','R','I',' ')},       /* Tangshewi (retired code) -> Dari */
+  {"tnf",      HB_TAG('F','A','R',' ')},       /* Tangshewi (retired code) -> Persian */
+  {"tng",      HB_TAG_NONE            },       /* Tobanga != Tonga */
   {"to",       HB_TAG('T','G','N',' ')},       /* Tonga (Tonga Islands) -> Tongan */
   {"tod",      HB_TAG('T','O','D','0')},       /* Toma */
   {"toi",      HB_TAG('T','N','G',' ')},       /* Tonga (Zambia) */
+  {"toj",      HB_TAG('M','Y','N',' ')},       /* Tojolabal -> Mayan */
   {"tol",      HB_TAG('A','T','H',' ')},       /* Tolowa -> Athapaskan */
-/*{"tpi",      HB_TAG('T','P','I',' ')},*/     /* Tok Pisin */
+  {"tor",      HB_TAG('B','A','D','0')},       /* Togbo-Vara Banda -> Banda */
+  {"tpi",      HB_TAG('T','P','I',' ')},       /* Tok Pisin */
+  {"tpi",      HB_TAG('C','P','P',' ')},       /* Tok Pisin -> Creoles */
   {"tr",       HB_TAG('T','R','K',' ')},       /* Turkish */
+  {"trf",      HB_TAG('C','P','P',' ')},       /* Trinidadian Creole English -> Creoles */
+  {"trk",      HB_TAG_NONE            },       /* Turkic [collection] != Turkish */
   {"tru",      HB_TAG('T','U','A',' ')},       /* Turoyo -> Turoyo Aramaic */
   {"tru",      HB_TAG('S','Y','R',' ')},       /* Turoyo -> Syriac */
   {"ts",       HB_TAG('T','S','G',' ')},       /* Tsonga */
+  {"tsg",      HB_TAG_NONE            },       /* Tausug != Tsonga */
 /*{"tsj",      HB_TAG('T','S','J',' ')},*/     /* Tshangla */
   {"tt",       HB_TAG('T','A','T',' ')},       /* Tatar */
+  {"ttc",      HB_TAG('M','Y','N',' ')},       /* Tektiteko -> Mayan */
   {"ttm",      HB_TAG('A','T','H',' ')},       /* Northern Tutchone -> Athapaskan */
   {"ttq",      HB_TAG('T','M','H',' ')},       /* Tawallammat Tamajaq -> Tamashek */
+  {"ttq",      HB_TAG('B','B','R',' ')},       /* Tawallammat Tamajaq -> Berber */
+  {"tua",      HB_TAG_NONE            },       /* Wiarumus != Turoyo Aramaic */
+  {"tul",      HB_TAG_NONE            },       /* Tula != Tumbuka */
 /*{"tum",      HB_TAG('T','U','M',' ')},*/     /* Tumbuka -> Tulu */
   {"tuu",      HB_TAG('A','T','H',' ')},       /* Tututni -> Athapaskan */
+  {"tuv",      HB_TAG_NONE            },       /* Turkana != Tuvin */
   {"tuy",      HB_TAG('K','A','L',' ')},       /* Tugen -> Kalenjin */
 /*{"tvl",      HB_TAG('T','V','L',' ')},*/     /* Tuvalu */
+  {"tvy",      HB_TAG('C','P','P',' ')},       /* Timor Pidgin -> Creoles */
   {"tw",       HB_TAG('T','W','I',' ')},       /* Twi */
   {"tw",       HB_TAG('A','K','A',' ')},       /* Twi -> Akan */
   {"txc",      HB_TAG('A','T','H',' ')},       /* Tsetsaut -> Athapaskan */
@@ -963,33 +1484,49 @@ static const LangTag ot_languages[] = {
   {"ty",       HB_TAG('T','H','T',' ')},       /* Tahitian */
   {"tyv",      HB_TAG('T','U','V',' ')},       /* Tuvinian -> Tuvin */
 /*{"tyz",      HB_TAG('T','Y','Z',' ')},*/     /* Tày */
-/*{"tzm",      HB_TAG('T','Z','M',' ')},*/     /* Central Atlas Tamazight -> Tamazight */
-/*{"tzo",      HB_TAG('T','Z','O',' ')},*/     /* Tzotzil */
+  {"tzh",      HB_TAG('M','Y','N',' ')},       /* Tzeltal -> Mayan */
+  {"tzj",      HB_TAG('M','Y','N',' ')},       /* Tz'utujil -> Mayan */
+  {"tzm",      HB_TAG('T','Z','M',' ')},       /* Central Atlas Tamazight -> Tamazight */
+  {"tzm",      HB_TAG('B','B','R',' ')},       /* Central Atlas Tamazight -> Berber */
+  {"tzo",      HB_TAG('T','Z','O',' ')},       /* Tzotzil */
+  {"tzo",      HB_TAG('M','Y','N',' ')},       /* Tzotzil -> Mayan */
   {"ubl",      HB_TAG('B','I','K',' ')},       /* Buhi'non Bikol -> Bikol */
 /*{"udm",      HB_TAG('U','D','M',' ')},*/     /* Udmurt */
   {"ug",       HB_TAG('U','Y','G',' ')},       /* Uyghur */
   {"uk",       HB_TAG('U','K','R',' ')},       /* Ukrainian */
   {"uki",      HB_TAG('K','U','I',' ')},       /* Kui (India) */
+  {"uln",      HB_TAG('C','P','P',' ')},       /* Unserdeutsch -> Creoles */
 /*{"umb",      HB_TAG('U','M','B',' ')},*/     /* Umbundu */
   {"unr",      HB_TAG('M','U','N',' ')},       /* Mundari */
   {"ur",       HB_TAG('U','R','D',' ')},       /* Urdu */
   {"urk",      HB_TAG('M','L','Y',' ')},       /* Urak Lawoi' -> Malay */
+  {"usp",      HB_TAG('M','Y','N',' ')},       /* Uspanteco -> Mayan */
   {"uz",       HB_TAG('U','Z','B',' ')},       /* Uzbek [macrolanguage] */
   {"uzn",      HB_TAG('U','Z','B',' ')},       /* Northern Uzbek -> Uzbek */
   {"uzs",      HB_TAG('U','Z','B',' ')},       /* Southern Uzbek -> Uzbek */
+  {"vap",      HB_TAG('Q','I','N',' ')},       /* Vaiphei -> Chin */
   {"ve",       HB_TAG('V','E','N',' ')},       /* Venda */
 /*{"vec",      HB_TAG('V','E','C',' ')},*/     /* Venetian */
   {"vi",       HB_TAG('V','I','T',' ')},       /* Vietnamese */
+  {"vic",      HB_TAG('C','P','P',' ')},       /* Virgin Islands Creole English -> Creoles */
+  {"vit",      HB_TAG_NONE            },       /* Viti != Vietnamese */
   {"vkk",      HB_TAG('M','L','Y',' ')},       /* Kaur -> Malay */
+  {"vkp",      HB_TAG('C','P','P',' ')},       /* Korlai Creole Portuguese -> Creoles */
   {"vkt",      HB_TAG('M','L','Y',' ')},       /* Tenggarong Kutai Malay -> Malay */
   {"vls",      HB_TAG('F','L','E',' ')},       /* Vlaams -> Dutch (Flemish) */
   {"vmw",      HB_TAG('M','A','K',' ')},       /* Makhuwa */
   {"vo",       HB_TAG('V','O','L',' ')},       /* Volapük */
 /*{"vro",      HB_TAG('V','R','O',' ')},*/     /* Võro */
   {"wa",       HB_TAG('W','L','N',' ')},       /* Walloon */
+  {"wag",      HB_TAG_NONE            },       /* Wa'ema != Wagdi */
 /*{"war",      HB_TAG('W','A','R',' ')},*/     /* Waray (Philippines) -> Waray-Waray */
   {"wbm",      HB_TAG('W','A',' ',' ')},       /* Wa */
   {"wbr",      HB_TAG('W','A','G',' ')},       /* Wagdi */
+  {"wbr",      HB_TAG('R','A','J',' ')},       /* Wagdi -> Rajasthani */
+/*{"wci",      HB_TAG('W','C','I',' ')},*/     /* Waci Gbe */
+  {"wea",      HB_TAG('K','R','N',' ')},       /* Wewaw -> Karen */
+  {"wes",      HB_TAG('C','P','P',' ')},       /* Cameroon Pidgin -> Creoles */
+  {"weu",      HB_TAG('Q','I','N',' ')},       /* Rawngtu Chin -> Chin */
   {"wlc",      HB_TAG('C','M','R',' ')},       /* Mwali Comorian -> Comorian */
   {"wle",      HB_TAG('S','I','G',' ')},       /* Wolane -> Silte Gurage */
   {"wlk",      HB_TAG('A','T','H',' ')},       /* Wailaki -> Athapaskan */
@@ -998,45 +1535,63 @@ static const LangTag ot_languages[] = {
   {"wry",      HB_TAG('M','A','W',' ')},       /* Merwari -> Marwari */
   {"wsg",      HB_TAG('G','O','N',' ')},       /* Adilabad Gondi -> Gondi */
 /*{"wtm",      HB_TAG('W','T','M',' ')},*/     /* Mewati */
-  {"wuu",      HB_TAG('Z','H','S',' ')},       /* Wu Chinese -> Chinese Simplified */
+  {"wuu",      HB_TAG('Z','H','S',' ')},       /* Wu Chinese -> Chinese, Simplified */
   {"xal",      HB_TAG('K','L','M',' ')},       /* Kalmyk */
   {"xal",      HB_TAG('T','O','D',' ')},       /* Kalmyk -> Todo */
   {"xan",      HB_TAG('S','E','K',' ')},       /* Xamtanga -> Sekota */
+  {"xbd",      HB_TAG_NONE            },       /* Bindal != Lü */
   {"xh",       HB_TAG('X','H','S',' ')},       /* Xhosa */
 /*{"xjb",      HB_TAG('X','J','B',' ')},*/     /* Minjungbal -> Minjangbal */
 /*{"xkf",      HB_TAG('X','K','F',' ')},*/     /* Khengkha */
+  {"xmg",      HB_TAG('B','M','L',' ')},       /* Mengaka -> Bamileke */
   {"xmm",      HB_TAG('M','L','Y',' ')},       /* Manado Malay -> Malay */
+  {"xmm",      HB_TAG('C','P','P',' ')},       /* Manado Malay -> Creoles */
   {"xmv",      HB_TAG('M','L','G',' ')},       /* Antankarana Malagasy -> Malagasy */
   {"xmw",      HB_TAG('M','L','G',' ')},       /* Tsimihety Malagasy -> Malagasy */
-  {"xnr",      HB_TAG('D','G','R',' ')},       /* Kangri -> Dogri */
+  {"xnj",      HB_TAG('S','X','T',' ')},       /* Ngoni (Tanzania) -> Sutu */
+  {"xnq",      HB_TAG('S','X','T',' ')},       /* Ngoni (Mozambique) -> Sutu */
+  {"xnr",      HB_TAG('D','G','R',' ')},       /* Kangri -> Dogri (macrolanguage) */
 /*{"xog",      HB_TAG('X','O','G',' ')},*/     /* Soga */
-/*{"xpe",      HB_TAG('X','P','E',' ')},*/     /* Liberia Kpelle -> Kpelle (Liberia) */
+  {"xpe",      HB_TAG('X','P','E',' ')},       /* Liberia Kpelle -> Kpelle (Liberia) */
+  {"xpe",      HB_TAG('K','P','L',' ')},       /* Liberia Kpelle -> Kpelle */
   {"xsl",      HB_TAG('S','S','L',' ')},       /* South Slavey */
   {"xsl",      HB_TAG('S','L','A',' ')},       /* South Slavey -> Slavey */
   {"xsl",      HB_TAG('A','T','H',' ')},       /* South Slavey -> Athapaskan */
   {"xst",      HB_TAG('S','I','G',' ')},       /* Silt'e (retired code) -> Silte Gurage */
+/*{"xub",      HB_TAG('X','U','B',' ')},*/     /* Betta Kurumba -> Bette Kuruma */
+/*{"xuj",      HB_TAG('X','U','J',' ')},*/     /* Jennu Kurumba -> Jennu Kuruma */
+  {"xup",      HB_TAG('A','T','H',' ')},       /* Upper Umpqua -> Athapaskan */
   {"xwo",      HB_TAG('T','O','D',' ')},       /* Written Oirat -> Todo */
+  {"yaj",      HB_TAG('B','A','D','0')},       /* Banda-Yangere -> Banda */
+  {"yak",      HB_TAG_NONE            },       /* Yakama != Sakha */
 /*{"yao",      HB_TAG('Y','A','O',' ')},*/     /* Yao */
 /*{"yap",      HB_TAG('Y','A','P',' ')},*/     /* Yapese */
+  {"yba",      HB_TAG_NONE            },       /* Yala != Yoruba */
+  {"ybb",      HB_TAG('B','M','L',' ')},       /* Yemba -> Bamileke */
   {"ybd",      HB_TAG('A','R','K',' ')},       /* Yangbye (retired code) -> Rakhine */
   {"ydd",      HB_TAG('J','I','I',' ')},       /* Eastern Yiddish -> Yiddish */
+/*{"ygp",      HB_TAG('Y','G','P',' ')},*/     /* Gepo */
   {"yi",       HB_TAG('J','I','I',' ')},       /* Yiddish [macrolanguage] */
   {"yih",      HB_TAG('J','I','I',' ')},       /* Western Yiddish -> Yiddish */
+  {"yim",      HB_TAG_NONE            },       /* Yimchungru Naga != Yi Modern */
+/*{"yna",      HB_TAG('Y','N','A',' ')},*/     /* Aluo */
   {"yo",       HB_TAG('Y','B','A',' ')},       /* Yoruba */
   {"yos",      HB_TAG('Q','I','N',' ')},       /* Yos (retired code) -> Chin */
-  {"yrk",      HB_TAG('T','N','E',' ')},       /* Nenets -> Tundra Nenets */
-  {"yrk",      HB_TAG('F','N','E',' ')},       /* Nenets -> Forest Nenets */
-  {"yue",      HB_TAG('Z','H','H',' ')},       /* Yue Chinese -> Chinese, Hong Kong SAR */
+  {"yua",      HB_TAG('M','Y','N',' ')},       /* Yucateco -> Mayan */
+  {"yue",      HB_TAG('Z','H','H',' ')},       /* Yue Chinese -> Chinese, Traditional, Hong Kong SAR */
+/*{"ywq",      HB_TAG('Y','W','Q',' ')},*/     /* Wuding-Luquan Yi */
   {"za",       HB_TAG('Z','H','A',' ')},       /* Zhuang [macrolanguage] */
   {"zch",      HB_TAG('Z','H','A',' ')},       /* Central Hongshuihe Zhuang -> Zhuang */
   {"zdj",      HB_TAG('C','M','R',' ')},       /* Ngazidja Comorian -> Comorian */
 /*{"zea",      HB_TAG('Z','E','A',' ')},*/     /* Zeeuws -> Zealandic */
   {"zeh",      HB_TAG('Z','H','A',' ')},       /* Eastern Hongshuihe Zhuang -> Zhuang */
+  {"zen",      HB_TAG('B','B','R',' ')},       /* Zenaga -> Berber */
   {"zgb",      HB_TAG('Z','H','A',' ')},       /* Guibei Zhuang -> Zhuang */
-/*{"zgh",      HB_TAG('Z','G','H',' ')},*/     /* Standard Moroccan Tamazight */
+  {"zgh",      HB_TAG('Z','G','H',' ')},       /* Standard Moroccan Tamazight */
+  {"zgh",      HB_TAG('B','B','R',' ')},       /* Standard Moroccan Tamazight -> Berber */
   {"zgm",      HB_TAG('Z','H','A',' ')},       /* Minz Zhuang -> Zhuang */
   {"zgn",      HB_TAG('Z','H','A',' ')},       /* Guibian Zhuang -> Zhuang */
-  {"zh",       HB_TAG('Z','H','S',' ')},       /* Chinese [macrolanguage] -> Chinese Simplified */
+  {"zh",       HB_TAG('Z','H','S',' ')},       /* Chinese, Simplified [macrolanguage] */
   {"zhd",      HB_TAG('Z','H','A',' ')},       /* Dai Zhuang -> Zhuang */
   {"zhn",      HB_TAG('Z','H','A',' ')},       /* Nong Zhuang -> Zhuang */
   {"zlj",      HB_TAG('Z','H','A',' ')},       /* Liujiang Zhuang -> Zhuang */
@@ -1044,6 +1599,8 @@ static const LangTag ot_languages[] = {
   {"zln",      HB_TAG('Z','H','A',' ')},       /* Lianshan Zhuang -> Zhuang */
   {"zlq",      HB_TAG('Z','H','A',' ')},       /* Liuqian Zhuang -> Zhuang */
   {"zmi",      HB_TAG('M','L','Y',' ')},       /* Negeri Sembilan Malay -> Malay */
+  {"zmz",      HB_TAG('B','A','D','0')},       /* Mbandja -> Banda */
+  {"znd",      HB_TAG_NONE            },       /* Zande [collection] != Zande */
   {"zne",      HB_TAG('Z','N','D',' ')},       /* Zande */
   {"zom",      HB_TAG('Q','I','N',' ')},       /* Zou -> Chin */
   {"zqe",      HB_TAG('Z','H','A',' ')},       /* Qiubei Zhuang -> Zhuang */
@@ -1054,6 +1611,7 @@ static const LangTag ot_languages[] = {
   {"zyg",      HB_TAG('Z','H','A',' ')},       /* Yang Zhuang -> Zhuang */
   {"zyj",      HB_TAG('Z','H','A',' ')},       /* Youjiang Zhuang -> Zhuang */
   {"zyn",      HB_TAG('Z','H','A',' ')},       /* Yongnan Zhuang -> Zhuang */
+  {"zyp",      HB_TAG('Q','I','N',' ')},       /* Zyphe Chin -> Chin */
 /*{"zza",      HB_TAG('Z','Z','A',' ')},*/     /* Zazaki [macrolanguage] */
   {"zzj",      HB_TAG('Z','H','A',' ')},       /* Zuojiang Zhuang -> Zhuang */
 };
@@ -1092,6 +1650,13 @@ hb_ot_tags_from_complex_language (const char   *lang_str,
     *count = 1;
     return true;
   }
+  if (subtag_matches (lang_str, limit, "-arevmda"))
+  {
+    /* Armenian; Western Armenian (retired code) */
+    tags[0] = HB_TAG('H','Y','E',' ');  /* Armenian */
+    *count = 1;
+    return true;
+  }
   if (subtag_matches (lang_str, limit, "-provenc"))
   {
     /* Occitan (post 1500); Provençal */
@@ -1139,7 +1704,7 @@ hb_ot_tags_from_complex_language (const char   *lang_str,
   case 'a':
     if (0 == strcmp (&lang_str[1], "rt-lojban"))
     {
-      /* Lojban */
+      /* Lojban (retired code) */
       tags[0] = HB_TAG('J','B','O',' ');  /* Lojban */
       *count = 1;
       return true;
@@ -1148,225 +1713,273 @@ hb_ot_tags_from_complex_language (const char   *lang_str,
   case 'c':
     if (lang_matches (&lang_str[1], "do-hant-hk"))
     {
-      /* Min Dong Chinese */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      /* Min Dong Chinese; Han (Traditional variant); Hong Kong */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
       *count = 1;
       return true;
     }
     if (lang_matches (&lang_str[1], "do-hant-mo"))
     {
-      /* Min Dong Chinese */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
-      *count = 1;
+      /* Min Dong Chinese; Han (Traditional variant); Macao */
+      unsigned int i;
+      hb_tag_t possible_tags[] = {
+       HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
+       HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
+      };
+      for (i = 0; i < 2 && i < *count; i++)
+       tags[i] = possible_tags[i];
+      *count = i;
       return true;
     }
     if (lang_matches (&lang_str[1], "jy-hant-hk"))
     {
-      /* Jinyu Chinese */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      /* Jinyu Chinese; Han (Traditional variant); Hong Kong */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
       *count = 1;
       return true;
     }
     if (lang_matches (&lang_str[1], "jy-hant-mo"))
     {
-      /* Jinyu Chinese */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
-      *count = 1;
+      /* Jinyu Chinese; Han (Traditional variant); Macao */
+      unsigned int i;
+      hb_tag_t possible_tags[] = {
+       HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
+       HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
+      };
+      for (i = 0; i < 2 && i < *count; i++)
+       tags[i] = possible_tags[i];
+      *count = i;
       return true;
     }
     if (lang_matches (&lang_str[1], "mn-hant-hk"))
     {
-      /* Mandarin Chinese */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      /* Mandarin Chinese; Han (Traditional variant); Hong Kong */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
       *count = 1;
       return true;
     }
     if (lang_matches (&lang_str[1], "mn-hant-mo"))
     {
-      /* Mandarin Chinese */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
-      *count = 1;
+      /* Mandarin Chinese; Han (Traditional variant); Macao */
+      unsigned int i;
+      hb_tag_t possible_tags[] = {
+       HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
+       HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
+      };
+      for (i = 0; i < 2 && i < *count; i++)
+       tags[i] = possible_tags[i];
+      *count = i;
       return true;
     }
     if (lang_matches (&lang_str[1], "np-hant-hk"))
     {
-      /* Northern Ping Chinese */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      /* Northern Ping Chinese; Han (Traditional variant); Hong Kong */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
       *count = 1;
       return true;
     }
     if (lang_matches (&lang_str[1], "np-hant-mo"))
     {
-      /* Northern Ping Chinese */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
-      *count = 1;
+      /* Northern Ping Chinese; Han (Traditional variant); Macao */
+      unsigned int i;
+      hb_tag_t possible_tags[] = {
+       HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
+       HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
+      };
+      for (i = 0; i < 2 && i < *count; i++)
+       tags[i] = possible_tags[i];
+      *count = i;
       return true;
     }
     if (lang_matches (&lang_str[1], "px-hant-hk"))
     {
-      /* Pu-Xian Chinese */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      /* Pu-Xian Chinese; Han (Traditional variant); Hong Kong */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
       *count = 1;
       return true;
     }
     if (lang_matches (&lang_str[1], "px-hant-mo"))
     {
-      /* Pu-Xian Chinese */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
-      *count = 1;
+      /* Pu-Xian Chinese; Han (Traditional variant); Macao */
+      unsigned int i;
+      hb_tag_t possible_tags[] = {
+       HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
+       HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
+      };
+      for (i = 0; i < 2 && i < *count; i++)
+       tags[i] = possible_tags[i];
+      *count = i;
       return true;
     }
     if (lang_matches (&lang_str[1], "sp-hant-hk"))
     {
-      /* Southern Ping Chinese */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      /* Southern Ping Chinese; Han (Traditional variant); Hong Kong */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
       *count = 1;
       return true;
     }
     if (lang_matches (&lang_str[1], "sp-hant-mo"))
     {
-      /* Southern Ping Chinese */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
-      *count = 1;
+      /* Southern Ping Chinese; Han (Traditional variant); Macao */
+      unsigned int i;
+      hb_tag_t possible_tags[] = {
+       HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
+       HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
+      };
+      for (i = 0; i < 2 && i < *count; i++)
+       tags[i] = possible_tags[i];
+      *count = i;
       return true;
     }
     if (lang_matches (&lang_str[1], "zh-hant-hk"))
     {
-      /* Huizhou Chinese */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      /* Huizhou Chinese; Han (Traditional variant); Hong Kong */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
       *count = 1;
       return true;
     }
     if (lang_matches (&lang_str[1], "zh-hant-mo"))
     {
-      /* Huizhou Chinese */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
-      *count = 1;
+      /* Huizhou Chinese; Han (Traditional variant); Macao */
+      unsigned int i;
+      hb_tag_t possible_tags[] = {
+       HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
+       HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
+      };
+      for (i = 0; i < 2 && i < *count; i++)
+       tags[i] = possible_tags[i];
+      *count = i;
       return true;
     }
     if (lang_matches (&lang_str[1], "zo-hant-hk"))
     {
-      /* Min Zhong Chinese */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      /* Min Zhong Chinese; Han (Traditional variant); Hong Kong */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
       *count = 1;
       return true;
     }
     if (lang_matches (&lang_str[1], "zo-hant-mo"))
     {
-      /* Min Zhong Chinese */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
-      *count = 1;
+      /* Min Zhong Chinese; Han (Traditional variant); Macao */
+      unsigned int i;
+      hb_tag_t possible_tags[] = {
+       HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
+       HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
+      };
+      for (i = 0; i < 2 && i < *count; i++)
+       tags[i] = possible_tags[i];
+      *count = i;
       return true;
     }
     if (lang_matches (&lang_str[1], "do-hans"))
     {
-      /* Min Dong Chinese */
-      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese Simplified */
+      /* Min Dong Chinese; Han (Simplified variant) */
+      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese, Simplified */
       *count = 1;
       return true;
     }
     if (lang_matches (&lang_str[1], "do-hant"))
     {
-      /* Min Dong Chinese */
-      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      /* Min Dong Chinese; Han (Traditional variant) */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
       *count = 1;
       return true;
     }
     if (lang_matches (&lang_str[1], "jy-hans"))
     {
-      /* Jinyu Chinese */
-      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese Simplified */
+      /* Jinyu Chinese; Han (Simplified variant) */
+      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese, Simplified */
       *count = 1;
       return true;
     }
     if (lang_matches (&lang_str[1], "jy-hant"))
     {
-      /* Jinyu Chinese */
-      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      /* Jinyu Chinese; Han (Traditional variant) */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
       *count = 1;
       return true;
     }
     if (lang_matches (&lang_str[1], "mn-hans"))
     {
-      /* Mandarin Chinese */
-      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese Simplified */
+      /* Mandarin Chinese; Han (Simplified variant) */
+      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese, Simplified */
       *count = 1;
       return true;
     }
     if (lang_matches (&lang_str[1], "mn-hant"))
     {
-      /* Mandarin Chinese */
-      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      /* Mandarin Chinese; Han (Traditional variant) */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
       *count = 1;
       return true;
     }
     if (lang_matches (&lang_str[1], "np-hans"))
     {
-      /* Northern Ping Chinese */
-      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese Simplified */
+      /* Northern Ping Chinese; Han (Simplified variant) */
+      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese, Simplified */
       *count = 1;
       return true;
     }
     if (lang_matches (&lang_str[1], "np-hant"))
     {
-      /* Northern Ping Chinese */
-      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      /* Northern Ping Chinese; Han (Traditional variant) */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
       *count = 1;
       return true;
     }
     if (lang_matches (&lang_str[1], "px-hans"))
     {
-      /* Pu-Xian Chinese */
-      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese Simplified */
+      /* Pu-Xian Chinese; Han (Simplified variant) */
+      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese, Simplified */
       *count = 1;
       return true;
     }
     if (lang_matches (&lang_str[1], "px-hant"))
     {
-      /* Pu-Xian Chinese */
-      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      /* Pu-Xian Chinese; Han (Traditional variant) */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
       *count = 1;
       return true;
     }
     if (lang_matches (&lang_str[1], "sp-hans"))
     {
-      /* Southern Ping Chinese */
-      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese Simplified */
+      /* Southern Ping Chinese; Han (Simplified variant) */
+      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese, Simplified */
       *count = 1;
       return true;
     }
     if (lang_matches (&lang_str[1], "sp-hant"))
     {
-      /* Southern Ping Chinese */
-      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      /* Southern Ping Chinese; Han (Traditional variant) */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
       *count = 1;
       return true;
     }
     if (lang_matches (&lang_str[1], "zh-hans"))
     {
-      /* Huizhou Chinese */
-      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese Simplified */
+      /* Huizhou Chinese; Han (Simplified variant) */
+      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese, Simplified */
       *count = 1;
       return true;
     }
     if (lang_matches (&lang_str[1], "zh-hant"))
     {
-      /* Huizhou Chinese */
-      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      /* Huizhou Chinese; Han (Traditional variant) */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
       *count = 1;
       return true;
     }
     if (lang_matches (&lang_str[1], "zo-hans"))
     {
-      /* Min Zhong Chinese */
-      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese Simplified */
+      /* Min Zhong Chinese; Han (Simplified variant) */
+      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese, Simplified */
       *count = 1;
       return true;
     }
     if (lang_matches (&lang_str[1], "zo-hant"))
     {
-      /* Min Zhong Chinese */
-      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      /* Min Zhong Chinese; Han (Traditional variant) */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
       *count = 1;
       return true;
     }
@@ -1374,7 +1987,7 @@ hb_ot_tags_from_complex_language (const char   *lang_str,
        && subtag_matches (lang_str, limit, "-hk"))
     {
       /* Min Dong Chinese; Hong Kong */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
       *count = 1;
       return true;
     }
@@ -1382,15 +1995,21 @@ hb_ot_tags_from_complex_language (const char   *lang_str,
        && subtag_matches (lang_str, limit, "-mo"))
     {
       /* Min Dong Chinese; Macao */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
-      *count = 1;
+      unsigned int i;
+      hb_tag_t possible_tags[] = {
+       HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
+       HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
+      };
+      for (i = 0; i < 2 && i < *count; i++)
+       tags[i] = possible_tags[i];
+      *count = i;
       return true;
     }
     if (0 == strncmp (&lang_str[1], "do-", 3)
        && subtag_matches (lang_str, limit, "-tw"))
     {
       /* Min Dong Chinese; Taiwan, Province of China */
-      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
       *count = 1;
       return true;
     }
@@ -1398,7 +2017,7 @@ hb_ot_tags_from_complex_language (const char   *lang_str,
        && subtag_matches (lang_str, limit, "-hk"))
     {
       /* Jinyu Chinese; Hong Kong */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
       *count = 1;
       return true;
     }
@@ -1406,15 +2025,21 @@ hb_ot_tags_from_complex_language (const char   *lang_str,
        && subtag_matches (lang_str, limit, "-mo"))
     {
       /* Jinyu Chinese; Macao */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
-      *count = 1;
+      unsigned int i;
+      hb_tag_t possible_tags[] = {
+       HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
+       HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
+      };
+      for (i = 0; i < 2 && i < *count; i++)
+       tags[i] = possible_tags[i];
+      *count = i;
       return true;
     }
     if (0 == strncmp (&lang_str[1], "jy-", 3)
        && subtag_matches (lang_str, limit, "-tw"))
     {
       /* Jinyu Chinese; Taiwan, Province of China */
-      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
       *count = 1;
       return true;
     }
@@ -1422,7 +2047,7 @@ hb_ot_tags_from_complex_language (const char   *lang_str,
        && subtag_matches (lang_str, limit, "-hk"))
     {
       /* Mandarin Chinese; Hong Kong */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
       *count = 1;
       return true;
     }
@@ -1430,15 +2055,21 @@ hb_ot_tags_from_complex_language (const char   *lang_str,
        && subtag_matches (lang_str, limit, "-mo"))
     {
       /* Mandarin Chinese; Macao */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
-      *count = 1;
+      unsigned int i;
+      hb_tag_t possible_tags[] = {
+       HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
+       HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
+      };
+      for (i = 0; i < 2 && i < *count; i++)
+       tags[i] = possible_tags[i];
+      *count = i;
       return true;
     }
     if (0 == strncmp (&lang_str[1], "mn-", 3)
        && subtag_matches (lang_str, limit, "-tw"))
     {
       /* Mandarin Chinese; Taiwan, Province of China */
-      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
       *count = 1;
       return true;
     }
@@ -1446,7 +2077,7 @@ hb_ot_tags_from_complex_language (const char   *lang_str,
        && subtag_matches (lang_str, limit, "-hk"))
     {
       /* Northern Ping Chinese; Hong Kong */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
       *count = 1;
       return true;
     }
@@ -1454,15 +2085,21 @@ hb_ot_tags_from_complex_language (const char   *lang_str,
        && subtag_matches (lang_str, limit, "-mo"))
     {
       /* Northern Ping Chinese; Macao */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
-      *count = 1;
+      unsigned int i;
+      hb_tag_t possible_tags[] = {
+       HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
+       HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
+      };
+      for (i = 0; i < 2 && i < *count; i++)
+       tags[i] = possible_tags[i];
+      *count = i;
       return true;
     }
     if (0 == strncmp (&lang_str[1], "np-", 3)
        && subtag_matches (lang_str, limit, "-tw"))
     {
       /* Northern Ping Chinese; Taiwan, Province of China */
-      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
       *count = 1;
       return true;
     }
@@ -1470,7 +2107,7 @@ hb_ot_tags_from_complex_language (const char   *lang_str,
        && subtag_matches (lang_str, limit, "-hk"))
     {
       /* Pu-Xian Chinese; Hong Kong */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
       *count = 1;
       return true;
     }
@@ -1478,15 +2115,21 @@ hb_ot_tags_from_complex_language (const char   *lang_str,
        && subtag_matches (lang_str, limit, "-mo"))
     {
       /* Pu-Xian Chinese; Macao */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
-      *count = 1;
+      unsigned int i;
+      hb_tag_t possible_tags[] = {
+       HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
+       HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
+      };
+      for (i = 0; i < 2 && i < *count; i++)
+       tags[i] = possible_tags[i];
+      *count = i;
       return true;
     }
     if (0 == strncmp (&lang_str[1], "px-", 3)
        && subtag_matches (lang_str, limit, "-tw"))
     {
       /* Pu-Xian Chinese; Taiwan, Province of China */
-      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
       *count = 1;
       return true;
     }
@@ -1494,7 +2137,7 @@ hb_ot_tags_from_complex_language (const char   *lang_str,
        && subtag_matches (lang_str, limit, "-hk"))
     {
       /* Southern Ping Chinese; Hong Kong */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
       *count = 1;
       return true;
     }
@@ -1502,15 +2145,21 @@ hb_ot_tags_from_complex_language (const char   *lang_str,
        && subtag_matches (lang_str, limit, "-mo"))
     {
       /* Southern Ping Chinese; Macao */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
-      *count = 1;
+      unsigned int i;
+      hb_tag_t possible_tags[] = {
+       HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
+       HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
+      };
+      for (i = 0; i < 2 && i < *count; i++)
+       tags[i] = possible_tags[i];
+      *count = i;
       return true;
     }
     if (0 == strncmp (&lang_str[1], "sp-", 3)
        && subtag_matches (lang_str, limit, "-tw"))
     {
       /* Southern Ping Chinese; Taiwan, Province of China */
-      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
       *count = 1;
       return true;
     }
@@ -1518,7 +2167,7 @@ hb_ot_tags_from_complex_language (const char   *lang_str,
        && subtag_matches (lang_str, limit, "-hk"))
     {
       /* Huizhou Chinese; Hong Kong */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
       *count = 1;
       return true;
     }
@@ -1526,15 +2175,21 @@ hb_ot_tags_from_complex_language (const char   *lang_str,
        && subtag_matches (lang_str, limit, "-mo"))
     {
       /* Huizhou Chinese; Macao */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
-      *count = 1;
+      unsigned int i;
+      hb_tag_t possible_tags[] = {
+       HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
+       HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
+      };
+      for (i = 0; i < 2 && i < *count; i++)
+       tags[i] = possible_tags[i];
+      *count = i;
       return true;
     }
     if (0 == strncmp (&lang_str[1], "zh-", 3)
        && subtag_matches (lang_str, limit, "-tw"))
     {
       /* Huizhou Chinese; Taiwan, Province of China */
-      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
       *count = 1;
       return true;
     }
@@ -1542,7 +2197,7 @@ hb_ot_tags_from_complex_language (const char   *lang_str,
        && subtag_matches (lang_str, limit, "-hk"))
     {
       /* Min Zhong Chinese; Hong Kong */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
       *count = 1;
       return true;
     }
@@ -1550,15 +2205,21 @@ hb_ot_tags_from_complex_language (const char   *lang_str,
        && subtag_matches (lang_str, limit, "-mo"))
     {
       /* Min Zhong Chinese; Macao */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
-      *count = 1;
+      unsigned int i;
+      hb_tag_t possible_tags[] = {
+       HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
+       HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
+      };
+      for (i = 0; i < 2 && i < *count; i++)
+       tags[i] = possible_tags[i];
+      *count = i;
       return true;
     }
     if (0 == strncmp (&lang_str[1], "zo-", 3)
        && subtag_matches (lang_str, limit, "-tw"))
     {
       /* Min Zhong Chinese; Taiwan, Province of China */
-      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
       *count = 1;
       return true;
     }
@@ -1566,35 +2227,41 @@ hb_ot_tags_from_complex_language (const char   *lang_str,
   case 'g':
     if (lang_matches (&lang_str[1], "an-hant-hk"))
     {
-      /* Gan Chinese */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      /* Gan Chinese; Han (Traditional variant); Hong Kong */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
       *count = 1;
       return true;
     }
     if (lang_matches (&lang_str[1], "an-hant-mo"))
     {
-      /* Gan Chinese */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
-      *count = 1;
+      /* Gan Chinese; Han (Traditional variant); Macao */
+      unsigned int i;
+      hb_tag_t possible_tags[] = {
+       HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
+       HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
+      };
+      for (i = 0; i < 2 && i < *count; i++)
+       tags[i] = possible_tags[i];
+      *count = i;
       return true;
     }
     if (lang_matches (&lang_str[1], "an-hans"))
     {
-      /* Gan Chinese */
-      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese Simplified */
+      /* Gan Chinese; Han (Simplified variant) */
+      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese, Simplified */
       *count = 1;
       return true;
     }
     if (lang_matches (&lang_str[1], "an-hant"))
     {
-      /* Gan Chinese */
-      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      /* Gan Chinese; Han (Traditional variant) */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
       *count = 1;
       return true;
     }
     if (lang_matches (&lang_str[1], "a-latg"))
     {
-      /* Irish */
+      /* Irish; Latin (Gaelic variant) */
       tags[0] = HB_TAG('I','R','T',' ');  /* Irish Traditional */
       *count = 1;
       return true;
@@ -1603,7 +2270,7 @@ hb_ot_tags_from_complex_language (const char   *lang_str,
        && subtag_matches (lang_str, limit, "-hk"))
     {
       /* Gan Chinese; Hong Kong */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
       *count = 1;
       return true;
     }
@@ -1611,15 +2278,21 @@ hb_ot_tags_from_complex_language (const char   *lang_str,
        && subtag_matches (lang_str, limit, "-mo"))
     {
       /* Gan Chinese; Macao */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
-      *count = 1;
+      unsigned int i;
+      hb_tag_t possible_tags[] = {
+       HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
+       HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
+      };
+      for (i = 0; i < 2 && i < *count; i++)
+       tags[i] = possible_tags[i];
+      *count = i;
       return true;
     }
     if (0 == strncmp (&lang_str[1], "an-", 3)
        && subtag_matches (lang_str, limit, "-tw"))
     {
       /* Gan Chinese; Taiwan, Province of China */
-      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
       *count = 1;
       return true;
     }
@@ -1627,57 +2300,69 @@ hb_ot_tags_from_complex_language (const char   *lang_str,
   case 'h':
     if (lang_matches (&lang_str[1], "ak-hant-hk"))
     {
-      /* Hakka Chinese */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      /* Hakka Chinese; Han (Traditional variant); Hong Kong */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
       *count = 1;
       return true;
     }
     if (lang_matches (&lang_str[1], "ak-hant-mo"))
     {
-      /* Hakka Chinese */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
-      *count = 1;
+      /* Hakka Chinese; Han (Traditional variant); Macao */
+      unsigned int i;
+      hb_tag_t possible_tags[] = {
+       HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
+       HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
+      };
+      for (i = 0; i < 2 && i < *count; i++)
+       tags[i] = possible_tags[i];
+      *count = i;
       return true;
     }
     if (lang_matches (&lang_str[1], "sn-hant-hk"))
     {
-      /* Xiang Chinese */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      /* Xiang Chinese; Han (Traditional variant); Hong Kong */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
       *count = 1;
       return true;
     }
     if (lang_matches (&lang_str[1], "sn-hant-mo"))
     {
-      /* Xiang Chinese */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
-      *count = 1;
+      /* Xiang Chinese; Han (Traditional variant); Macao */
+      unsigned int i;
+      hb_tag_t possible_tags[] = {
+       HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
+       HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
+      };
+      for (i = 0; i < 2 && i < *count; i++)
+       tags[i] = possible_tags[i];
+      *count = i;
       return true;
     }
     if (lang_matches (&lang_str[1], "ak-hans"))
     {
-      /* Hakka Chinese */
-      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese Simplified */
+      /* Hakka Chinese; Han (Simplified variant) */
+      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese, Simplified */
       *count = 1;
       return true;
     }
     if (lang_matches (&lang_str[1], "ak-hant"))
     {
-      /* Hakka Chinese */
-      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      /* Hakka Chinese; Han (Traditional variant) */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
       *count = 1;
       return true;
     }
     if (lang_matches (&lang_str[1], "sn-hans"))
     {
-      /* Xiang Chinese */
-      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese Simplified */
+      /* Xiang Chinese; Han (Simplified variant) */
+      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese, Simplified */
       *count = 1;
       return true;
     }
     if (lang_matches (&lang_str[1], "sn-hant"))
     {
-      /* Xiang Chinese */
-      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      /* Xiang Chinese; Han (Traditional variant) */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
       *count = 1;
       return true;
     }
@@ -1685,7 +2370,7 @@ hb_ot_tags_from_complex_language (const char   *lang_str,
        && subtag_matches (lang_str, limit, "-hk"))
     {
       /* Hakka Chinese; Hong Kong */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
       *count = 1;
       return true;
     }
@@ -1693,15 +2378,21 @@ hb_ot_tags_from_complex_language (const char   *lang_str,
        && subtag_matches (lang_str, limit, "-mo"))
     {
       /* Hakka Chinese; Macao */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
-      *count = 1;
+      unsigned int i;
+      hb_tag_t possible_tags[] = {
+       HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
+       HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
+      };
+      for (i = 0; i < 2 && i < *count; i++)
+       tags[i] = possible_tags[i];
+      *count = i;
       return true;
     }
     if (0 == strncmp (&lang_str[1], "ak-", 3)
        && subtag_matches (lang_str, limit, "-tw"))
     {
       /* Hakka Chinese; Taiwan, Province of China */
-      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
       *count = 1;
       return true;
     }
@@ -1709,7 +2400,7 @@ hb_ot_tags_from_complex_language (const char   *lang_str,
        && subtag_matches (lang_str, limit, "-hk"))
     {
       /* Xiang Chinese; Hong Kong */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
       *count = 1;
       return true;
     }
@@ -1717,15 +2408,21 @@ hb_ot_tags_from_complex_language (const char   *lang_str,
        && subtag_matches (lang_str, limit, "-mo"))
     {
       /* Xiang Chinese; Macao */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
-      *count = 1;
+      unsigned int i;
+      hb_tag_t possible_tags[] = {
+       HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
+       HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
+      };
+      for (i = 0; i < 2 && i < *count; i++)
+       tags[i] = possible_tags[i];
+      *count = i;
       return true;
     }
     if (0 == strncmp (&lang_str[1], "sn-", 3)
        && subtag_matches (lang_str, limit, "-tw"))
     {
       /* Xiang Chinese; Taiwan, Province of China */
-      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
       *count = 1;
       return true;
     }
@@ -1733,7 +2430,7 @@ hb_ot_tags_from_complex_language (const char   *lang_str,
   case 'i':
     if (0 == strcmp (&lang_str[1], "-navajo"))
     {
-      /* Navajo */
+      /* Navajo (retired code) */
       unsigned int i;
       hb_tag_t possible_tags[] = {
        HB_TAG('N','A','V',' '),  /* Navajo */
@@ -1746,14 +2443,14 @@ hb_ot_tags_from_complex_language (const char   *lang_str,
     }
     if (0 == strcmp (&lang_str[1], "-hak"))
     {
-      /* Hakka */
-      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese Simplified */
+      /* Hakka (retired code) */
+      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese, Simplified */
       *count = 1;
       return true;
     }
     if (0 == strcmp (&lang_str[1], "-lux"))
     {
-      /* Luxembourgish */
+      /* Luxembourgish (retired code) */
       tags[0] = HB_TAG('L','T','Z',' ');  /* Luxembourgish */
       *count = 1;
       return true;
@@ -1762,8 +2459,8 @@ hb_ot_tags_from_complex_language (const char   *lang_str,
   case 'l':
     if (lang_matches (&lang_str[1], "zh-hans"))
     {
-      /* Literary Chinese */
-      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese Simplified */
+      /* Literary Chinese; Han (Simplified variant) */
+      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese, Simplified */
       *count = 1;
       return true;
     }
@@ -1771,29 +2468,35 @@ hb_ot_tags_from_complex_language (const char   *lang_str,
   case 'm':
     if (lang_matches (&lang_str[1], "np-hant-hk"))
     {
-      /* Min Bei Chinese */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      /* Min Bei Chinese; Han (Traditional variant); Hong Kong */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
       *count = 1;
       return true;
     }
     if (lang_matches (&lang_str[1], "np-hant-mo"))
     {
-      /* Min Bei Chinese */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
-      *count = 1;
+      /* Min Bei Chinese; Han (Traditional variant); Macao */
+      unsigned int i;
+      hb_tag_t possible_tags[] = {
+       HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
+       HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
+      };
+      for (i = 0; i < 2 && i < *count; i++)
+       tags[i] = possible_tags[i];
+      *count = i;
       return true;
     }
     if (lang_matches (&lang_str[1], "np-hans"))
     {
-      /* Min Bei Chinese */
-      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese Simplified */
+      /* Min Bei Chinese; Han (Simplified variant) */
+      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese, Simplified */
       *count = 1;
       return true;
     }
     if (lang_matches (&lang_str[1], "np-hant"))
     {
-      /* Min Bei Chinese */
-      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      /* Min Bei Chinese; Han (Traditional variant) */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
       *count = 1;
       return true;
     }
@@ -1801,7 +2504,7 @@ hb_ot_tags_from_complex_language (const char   *lang_str,
        && subtag_matches (lang_str, limit, "-hk"))
     {
       /* Min Bei Chinese; Hong Kong */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
       *count = 1;
       return true;
     }
@@ -1809,15 +2512,29 @@ hb_ot_tags_from_complex_language (const char   *lang_str,
        && subtag_matches (lang_str, limit, "-mo"))
     {
       /* Min Bei Chinese; Macao */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
-      *count = 1;
+      unsigned int i;
+      hb_tag_t possible_tags[] = {
+       HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
+       HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
+      };
+      for (i = 0; i < 2 && i < *count; i++)
+       tags[i] = possible_tags[i];
+      *count = i;
       return true;
     }
     if (0 == strncmp (&lang_str[1], "np-", 3)
        && subtag_matches (lang_str, limit, "-tw"))
     {
       /* Min Bei Chinese; Taiwan, Province of China */
-      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
+      *count = 1;
+      return true;
+    }
+    if (0 == strncmp (&lang_str[1], "nw-", 3)
+       && subtag_matches (lang_str, limit, "-th"))
+    {
+      /* Mon; Thailand */
+      tags[0] = HB_TAG('M','O','N','T');  /* Thailand Mon */
       *count = 1;
       return true;
     }
@@ -1825,29 +2542,35 @@ hb_ot_tags_from_complex_language (const char   *lang_str,
   case 'n':
     if (lang_matches (&lang_str[1], "an-hant-hk"))
     {
-      /* Min Nan Chinese */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      /* Min Nan Chinese; Han (Traditional variant); Hong Kong */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
       *count = 1;
       return true;
     }
     if (lang_matches (&lang_str[1], "an-hant-mo"))
     {
-      /* Min Nan Chinese */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
-      *count = 1;
+      /* Min Nan Chinese; Han (Traditional variant); Macao */
+      unsigned int i;
+      hb_tag_t possible_tags[] = {
+       HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
+       HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
+      };
+      for (i = 0; i < 2 && i < *count; i++)
+       tags[i] = possible_tags[i];
+      *count = i;
       return true;
     }
     if (lang_matches (&lang_str[1], "an-hans"))
     {
-      /* Min Nan Chinese */
-      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese Simplified */
+      /* Min Nan Chinese; Han (Simplified variant) */
+      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese, Simplified */
       *count = 1;
       return true;
     }
     if (lang_matches (&lang_str[1], "an-hant"))
     {
-      /* Min Nan Chinese */
-      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      /* Min Nan Chinese; Han (Traditional variant) */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
       *count = 1;
       return true;
     }
@@ -1855,7 +2578,7 @@ hb_ot_tags_from_complex_language (const char   *lang_str,
        && subtag_matches (lang_str, limit, "-hk"))
     {
       /* Min Nan Chinese; Hong Kong */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
       *count = 1;
       return true;
     }
@@ -1863,28 +2586,34 @@ hb_ot_tags_from_complex_language (const char   *lang_str,
        && subtag_matches (lang_str, limit, "-mo"))
     {
       /* Min Nan Chinese; Macao */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
-      *count = 1;
+      unsigned int i;
+      hb_tag_t possible_tags[] = {
+       HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
+       HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
+      };
+      for (i = 0; i < 2 && i < *count; i++)
+       tags[i] = possible_tags[i];
+      *count = i;
       return true;
     }
     if (0 == strncmp (&lang_str[1], "an-", 3)
        && subtag_matches (lang_str, limit, "-tw"))
     {
       /* Min Nan Chinese; Taiwan, Province of China */
-      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
       *count = 1;
       return true;
     }
     if (0 == strcmp (&lang_str[1], "o-bok"))
     {
-      /* Norwegian Bokmal */
+      /* Norwegian Bokmal (retired code) */
       tags[0] = HB_TAG('N','O','R',' ');  /* Norwegian */
       *count = 1;
       return true;
     }
     if (0 == strcmp (&lang_str[1], "o-nyn"))
     {
-      /* Norwegian Nynorsk */
+      /* Norwegian Nynorsk (retired code) */
       tags[0] = HB_TAG('N','Y','N',' ');  /* Norwegian Nynorsk (Nynorsk, Norwegian) */
       *count = 1;
       return true;
@@ -1895,37 +2624,49 @@ hb_ot_tags_from_complex_language (const char   *lang_str,
        && subtag_matches (lang_str, limit, "-md"))
     {
       /* Romanian; Moldova */
-      tags[0] = HB_TAG('M','O','L',' ');  /* Moldavian */
-      *count = 1;
+      unsigned int i;
+      hb_tag_t possible_tags[] = {
+       HB_TAG('M','O','L',' '),  /* Moldavian */
+       HB_TAG('R','O','M',' '),  /* Romanian */
+      };
+      for (i = 0; i < 2 && i < *count; i++)
+       tags[i] = possible_tags[i];
+      *count = i;
       return true;
     }
     break;
   case 'w':
     if (lang_matches (&lang_str[1], "uu-hant-hk"))
     {
-      /* Wu Chinese */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      /* Wu Chinese; Han (Traditional variant); Hong Kong */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
       *count = 1;
       return true;
     }
     if (lang_matches (&lang_str[1], "uu-hant-mo"))
     {
-      /* Wu Chinese */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
-      *count = 1;
+      /* Wu Chinese; Han (Traditional variant); Macao */
+      unsigned int i;
+      hb_tag_t possible_tags[] = {
+       HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
+       HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
+      };
+      for (i = 0; i < 2 && i < *count; i++)
+       tags[i] = possible_tags[i];
+      *count = i;
       return true;
     }
     if (lang_matches (&lang_str[1], "uu-hans"))
     {
-      /* Wu Chinese */
-      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese Simplified */
+      /* Wu Chinese; Han (Simplified variant) */
+      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese, Simplified */
       *count = 1;
       return true;
     }
     if (lang_matches (&lang_str[1], "uu-hant"))
     {
-      /* Wu Chinese */
-      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      /* Wu Chinese; Han (Traditional variant) */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
       *count = 1;
       return true;
     }
@@ -1933,7 +2674,7 @@ hb_ot_tags_from_complex_language (const char   *lang_str,
        && subtag_matches (lang_str, limit, "-hk"))
     {
       /* Wu Chinese; Hong Kong */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
       *count = 1;
       return true;
     }
@@ -1941,15 +2682,21 @@ hb_ot_tags_from_complex_language (const char   *lang_str,
        && subtag_matches (lang_str, limit, "-mo"))
     {
       /* Wu Chinese; Macao */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
-      *count = 1;
+      unsigned int i;
+      hb_tag_t possible_tags[] = {
+       HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
+       HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
+      };
+      for (i = 0; i < 2 && i < *count; i++)
+       tags[i] = possible_tags[i];
+      *count = i;
       return true;
     }
     if (0 == strncmp (&lang_str[1], "uu-", 3)
        && subtag_matches (lang_str, limit, "-tw"))
     {
       /* Wu Chinese; Taiwan, Province of China */
-      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
       *count = 1;
       return true;
     }
@@ -1957,8 +2704,8 @@ hb_ot_tags_from_complex_language (const char   *lang_str,
   case 'y':
     if (lang_matches (&lang_str[1], "ue-hans"))
     {
-      /* Yue Chinese */
-      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese Simplified */
+      /* Yue Chinese; Han (Simplified variant) */
+      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese, Simplified */
       *count = 1;
       return true;
     }
@@ -1966,67 +2713,79 @@ hb_ot_tags_from_complex_language (const char   *lang_str,
   case 'z':
     if (lang_matches (&lang_str[1], "h-hant-hk"))
     {
-      /* Chinese */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      /* Chinese [macrolanguage]; Han (Traditional variant); Hong Kong */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
       *count = 1;
       return true;
     }
     if (lang_matches (&lang_str[1], "h-hant-mo"))
     {
-      /* Chinese */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
-      *count = 1;
+      /* Chinese [macrolanguage]; Han (Traditional variant); Macao */
+      unsigned int i;
+      hb_tag_t possible_tags[] = {
+       HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
+       HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
+      };
+      for (i = 0; i < 2 && i < *count; i++)
+       tags[i] = possible_tags[i];
+      *count = i;
       return true;
     }
     if (0 == strcmp (&lang_str[1], "h-min-nan"))
     {
-      /* Minnan, Hokkien, Amoy, Taiwanese, Southern Min, Southern Fujian, Hoklo, Southern Fukien, Ho-lo */
-      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese Simplified */
+      /* Minnan, Hokkien, Amoy, Taiwanese, Southern Min, Southern Fujian, Hoklo, Southern Fukien, Ho-lo (retired code) */
+      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese, Simplified */
       *count = 1;
       return true;
     }
     if (lang_matches (&lang_str[1], "h-hans"))
     {
-      /* Chinese */
-      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese Simplified */
+      /* Chinese [macrolanguage]; Han (Simplified variant) */
+      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese, Simplified */
       *count = 1;
       return true;
     }
     if (lang_matches (&lang_str[1], "h-hant"))
     {
-      /* Chinese */
-      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      /* Chinese [macrolanguage]; Han (Traditional variant) */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
       *count = 1;
       return true;
     }
     if (0 == strcmp (&lang_str[1], "h-min"))
     {
-      /* Min, Fuzhou, Hokkien, Amoy, or Taiwanese */
-      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese Simplified */
+      /* Min, Fuzhou, Hokkien, Amoy, or Taiwanese (retired code) */
+      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese, Simplified */
       *count = 1;
       return true;
     }
     if (0 == strncmp (&lang_str[1], "h-", 2)
        && subtag_matches (lang_str, limit, "-hk"))
     {
-      /* Chinese; Hong Kong */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      /* Chinese [macrolanguage]; Hong Kong */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
       *count = 1;
       return true;
     }
     if (0 == strncmp (&lang_str[1], "h-", 2)
        && subtag_matches (lang_str, limit, "-mo"))
     {
-      /* Chinese; Macao */
-      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
-      *count = 1;
+      /* Chinese [macrolanguage]; Macao */
+      unsigned int i;
+      hb_tag_t possible_tags[] = {
+       HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
+       HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
+      };
+      for (i = 0; i < 2 && i < *count; i++)
+       tags[i] = possible_tags[i];
+      *count = i;
       return true;
     }
     if (0 == strncmp (&lang_str[1], "h-", 2)
        && subtag_matches (lang_str, limit, "-tw"))
     {
-      /* Chinese; Taiwan, Province of China */
-      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese Traditional */
+      /* Chinese [macrolanguage]; Taiwan, Province of China */
+      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
       *count = 1;
       return true;
     }
@@ -2057,99 +2816,139 @@ hb_ot_ambiguous_tag_to_language (hb_tag_t tag)
   case HB_TAG('A','P','P','H'):  /* Phonetic transcription—Americanist conventions */
     return hb_language_from_string ("und-fonnapa", -1);  /* Undetermined; North American Phonetic Alphabet */
   case HB_TAG('A','R','A',' '):  /* Arabic */
-    return hb_language_from_string ("ar", -1);  /* Arabic */
+    return hb_language_from_string ("ar", -1);  /* Arabic [macrolanguage] */
   case HB_TAG('A','R','K',' '):  /* Rakhine */
     return hb_language_from_string ("rki", -1);  /* Rakhine */
   case HB_TAG('A','T','H',' '):  /* Athapaskan */
-    return hb_language_from_string ("ath", -1);  /* Athapascan */
+    return hb_language_from_string ("ath", -1);  /* Athapascan [collection] */
+  case HB_TAG('B','B','R',' '):  /* Berber */
+    return hb_language_from_string ("ber", -1);  /* Berber [collection] */
   case HB_TAG('B','I','K',' '):  /* Bikol */
-    return hb_language_from_string ("bik", -1);  /* Bikol */
+    return hb_language_from_string ("bik", -1);  /* Bikol [macrolanguage] */
+  case HB_TAG('B','T','K',' '):  /* Batak */
+    return hb_language_from_string ("btk", -1);  /* Batak [collection] */
   case HB_TAG('C','P','P',' '):  /* Creoles */
-    return hb_language_from_string ("crp", -1);  /* Creoles and pidgins */
+    return hb_language_from_string ("crp", -1);  /* Creoles and pidgins [collection] */
   case HB_TAG('C','R','R',' '):  /* Carrier */
     return hb_language_from_string ("crx", -1);  /* Carrier */
+  case HB_TAG('D','G','R',' '):  /* Dogri (macrolanguage) */
+    return hb_language_from_string ("doi", -1);  /* Dogri [macrolanguage] */
   case HB_TAG('D','N','K',' '):  /* Dinka */
-    return hb_language_from_string ("din", -1);  /* Dinka */
+    return hb_language_from_string ("din", -1);  /* Dinka [macrolanguage] */
   case HB_TAG('D','R','I',' '):  /* Dari */
     return hb_language_from_string ("prs", -1);  /* Dari */
   case HB_TAG('D','Z','N',' '):  /* Dzongkha */
     return hb_language_from_string ("dz", -1);  /* Dzongkha */
   case HB_TAG('E','T','I',' '):  /* Estonian */
-    return hb_language_from_string ("et", -1);  /* Estonian */
+    return hb_language_from_string ("et", -1);  /* Estonian [macrolanguage] */
+  case HB_TAG('F','A','R',' '):  /* Persian */
+    return hb_language_from_string ("fa", -1);  /* Persian [macrolanguage] */
   case HB_TAG('G','O','N',' '):  /* Gondi */
-    return hb_language_from_string ("gon", -1);  /* Gondi */
+    return hb_language_from_string ("gon", -1);  /* Gondi [macrolanguage] */
+  case HB_TAG('H','M','A',' '):  /* High Mari */
+    return hb_language_from_string ("mrj", -1);  /* Western Mari */
   case HB_TAG('H','M','N',' '):  /* Hmong */
-    return hb_language_from_string ("hmn", -1);  /* Hmong */
+    return hb_language_from_string ("hmn", -1);  /* Hmong [macrolanguage] */
   case HB_TAG('H','N','D',' '):  /* Hindko */
     return hb_language_from_string ("hnd", -1);  /* Southern Hindko */
+  case HB_TAG('H','Y','E',' '):  /* Armenian */
+    return hb_language_from_string ("hyw", -1);  /* Western Armenian */
+  case HB_TAG('I','B','A',' '):  /* Iban */
+    return hb_language_from_string ("iba", -1);  /* Iban */
   case HB_TAG('I','J','O',' '):  /* Ijo */
-    return hb_language_from_string ("ijo", -1);  /* Ijo */
+    return hb_language_from_string ("ijo", -1);  /* Ijo [collection] */
   case HB_TAG('I','N','U',' '):  /* Inuktitut */
-    return hb_language_from_string ("iu", -1);  /* Inuktitut */
+    return hb_language_from_string ("iu", -1);  /* Inuktitut [macrolanguage] */
   case HB_TAG('I','P','K',' '):  /* Inupiat */
-    return hb_language_from_string ("ik", -1);  /* Inupiaq */
+    return hb_language_from_string ("ik", -1);  /* Inupiaq [macrolanguage] */
   case HB_TAG('I','P','P','H'):  /* Phonetic transcription—IPA conventions */
     return hb_language_from_string ("und-fonipa", -1);  /* Undetermined; International Phonetic Alphabet */
   case HB_TAG('I','R','T',' '):  /* Irish Traditional */
     return hb_language_from_string ("ga-Latg", -1);  /* Irish; Latin (Gaelic variant) */
   case HB_TAG('J','I','I',' '):  /* Yiddish */
-    return hb_language_from_string ("yi", -1);  /* Yiddish */
+    return hb_language_from_string ("yi", -1);  /* Yiddish [macrolanguage] */
   case HB_TAG('K','A','L',' '):  /* Kalenjin */
-    return hb_language_from_string ("kln", -1);  /* Kalenjin */
+    return hb_language_from_string ("kln", -1);  /* Kalenjin [macrolanguage] */
   case HB_TAG('K','G','E',' '):  /* Khutsuri Georgian */
     return hb_language_from_string ("und-Geok", -1);  /* Undetermined; Khutsuri (Asomtavruli and Nuskhuri) */
   case HB_TAG('K','N','R',' '):  /* Kanuri */
-    return hb_language_from_string ("kr", -1);  /* Kanuri */
+    return hb_language_from_string ("kr", -1);  /* Kanuri [macrolanguage] */
+  case HB_TAG('K','O','H',' '):  /* Korean Old Hangul */
+    return hb_language_from_string ("okm", -1);  /* Middle Korean (10th-16th cent.) */
   case HB_TAG('K','O','K',' '):  /* Konkani */
-    return hb_language_from_string ("kok", -1);  /* Konkani */
+    return hb_language_from_string ("kok", -1);  /* Konkani [macrolanguage] */
+  case HB_TAG('K','O','M',' '):  /* Komi */
+    return hb_language_from_string ("kv", -1);  /* Komi [macrolanguage] */
+  case HB_TAG('K','P','L',' '):  /* Kpelle */
+    return hb_language_from_string ("kpe", -1);  /* Kpelle [macrolanguage] */
+  case HB_TAG('K','R','N',' '):  /* Karen */
+    return hb_language_from_string ("kar", -1);  /* Karen [collection] */
   case HB_TAG('K','U','I',' '):  /* Kui */
     return hb_language_from_string ("uki", -1);  /* Kui (India) */
   case HB_TAG('K','U','R',' '):  /* Kurdish */
-    return hb_language_from_string ("ku", -1);  /* Kurdish */
+    return hb_language_from_string ("ku", -1);  /* Kurdish [macrolanguage] */
+  case HB_TAG('L','M','A',' '):  /* Low Mari */
+    return hb_language_from_string ("mhr", -1);  /* Eastern Mari */
   case HB_TAG('L','U','H',' '):  /* Luyia */
-    return hb_language_from_string ("luy", -1);  /* Luyia */
+    return hb_language_from_string ("luy", -1);  /* Luyia [macrolanguage] */
   case HB_TAG('L','V','I',' '):  /* Latvian */
-    return hb_language_from_string ("lv", -1);  /* Latvian */
+    return hb_language_from_string ("lv", -1);  /* Latvian [macrolanguage] */
   case HB_TAG('M','A','W',' '):  /* Marwari */
-    return hb_language_from_string ("mwr", -1);  /* Marwari */
+    return hb_language_from_string ("mwr", -1);  /* Marwari [macrolanguage] */
   case HB_TAG('M','L','G',' '):  /* Malagasy */
-    return hb_language_from_string ("mg", -1);  /* Malagasy */
+    return hb_language_from_string ("mg", -1);  /* Malagasy [macrolanguage] */
   case HB_TAG('M','L','Y',' '):  /* Malay */
-    return hb_language_from_string ("ms", -1);  /* Malay */
+    return hb_language_from_string ("ms", -1);  /* Malay [macrolanguage] */
   case HB_TAG('M','N','G',' '):  /* Mongolian */
-    return hb_language_from_string ("mn", -1);  /* Mongolian */
+    return hb_language_from_string ("mn", -1);  /* Mongolian [macrolanguage] */
+  case HB_TAG('M','N','K',' '):  /* Maninka */
+    return hb_language_from_string ("man", -1);  /* Mandingo [macrolanguage] */
   case HB_TAG('M','O','L',' '):  /* Moldavian */
     return hb_language_from_string ("ro-MD", -1);  /* Romanian; Moldova */
+  case HB_TAG('M','O','N','T'):  /* Thailand Mon */
+    return hb_language_from_string ("mnw-TH", -1);  /* Mon; Thailand */
+  case HB_TAG('M','Y','N',' '):  /* Mayan */
+    return hb_language_from_string ("myn", -1);  /* Mayan [collection] */
+  case HB_TAG('N','A','H',' '):  /* Nahuatl */
+    return hb_language_from_string ("nah", -1);  /* Nahuatl [collection] */
   case HB_TAG('N','E','P',' '):  /* Nepali */
-    return hb_language_from_string ("ne", -1);  /* Nepali */
+    return hb_language_from_string ("ne", -1);  /* Nepali [macrolanguage] */
   case HB_TAG('N','I','S',' '):  /* Nisi */
     return hb_language_from_string ("njz", -1);  /* Nyishi */
   case HB_TAG('N','O','R',' '):  /* Norwegian */
-    return hb_language_from_string ("no", -1);  /* Norwegian */
+    return hb_language_from_string ("no", -1);  /* Norwegian [macrolanguage] */
   case HB_TAG('O','J','B',' '):  /* Ojibway */
-    return hb_language_from_string ("oj", -1);  /* Ojibwa */
+    return hb_language_from_string ("oj", -1);  /* Ojibwa [macrolanguage] */
   case HB_TAG('O','R','O',' '):  /* Oromo */
-    return hb_language_from_string ("om", -1);  /* Oromo */
+    return hb_language_from_string ("om", -1);  /* Oromo [macrolanguage] */
   case HB_TAG('P','A','S',' '):  /* Pashto */
-    return hb_language_from_string ("ps", -1);  /* Pashto */
+    return hb_language_from_string ("ps", -1);  /* Pashto [macrolanguage] */
   case HB_TAG('P','G','R',' '):  /* Polytonic Greek */
     return hb_language_from_string ("el-polyton", -1);  /* Modern Greek (1453-); Polytonic Greek */
   case HB_TAG('P','R','O',' '):  /* Provençal / Old Provençal */
     return hb_language_from_string ("pro", -1);  /* Old Provençal (to 1500) */
   case HB_TAG('Q','U','H',' '):  /* Quechua (Bolivia) */
     return hb_language_from_string ("quh", -1);  /* South Bolivian Quechua */
+  case HB_TAG('Q','U','Z',' '):  /* Quechua */
+    return hb_language_from_string ("qu", -1);  /* Quechua [macrolanguage] */
   case HB_TAG('Q','V','I',' '):  /* Quechua (Ecuador) */
     return hb_language_from_string ("qvi", -1);  /* Imbabura Highland Quichua */
   case HB_TAG('Q','W','H',' '):  /* Quechua (Peru) */
     return hb_language_from_string ("qwh", -1);  /* Huaylas Ancash Quechua */
   case HB_TAG('R','A','J',' '):  /* Rajasthani */
-    return hb_language_from_string ("raj", -1);  /* Rajasthani */
+    return hb_language_from_string ("raj", -1);  /* Rajasthani [macrolanguage] */
+  case HB_TAG('R','O','M',' '):  /* Romanian */
+    return hb_language_from_string ("ro", -1);  /* Romanian */
   case HB_TAG('R','O','Y',' '):  /* Romany */
-    return hb_language_from_string ("rom", -1);  /* Romany */
+    return hb_language_from_string ("rom", -1);  /* Romany [macrolanguage] */
   case HB_TAG('S','Q','I',' '):  /* Albanian */
-    return hb_language_from_string ("sq", -1);  /* Albanian */
+    return hb_language_from_string ("sq", -1);  /* Albanian [macrolanguage] */
+  case HB_TAG('S','R','B',' '):  /* Serbian */
+    return hb_language_from_string ("sr", -1);  /* Serbian */
+  case HB_TAG('S','X','T',' '):  /* Sutu */
+    return hb_language_from_string ("xnj", -1);  /* Ngoni (Tanzania) */
   case HB_TAG('S','Y','R',' '):  /* Syriac */
-    return hb_language_from_string ("syr", -1);  /* Syriac */
+    return hb_language_from_string ("syr", -1);  /* Syriac [macrolanguage] */
   case HB_TAG('S','Y','R','E'):  /* Syriac, Estrangela script-variant (equivalent to ISO 15924 'Syre') */
     return hb_language_from_string ("und-Syre", -1);  /* Undetermined; Syriac (Estrangelo variant) */
   case HB_TAG('S','Y','R','J'):  /* Syriac, Western script-variant (equivalent to ISO 15924 'Syrj') */
@@ -2157,15 +2956,19 @@ hb_ot_ambiguous_tag_to_language (hb_tag_t tag)
   case HB_TAG('S','Y','R','N'):  /* Syriac, Eastern script-variant (equivalent to ISO 15924 'Syrn') */
     return hb_language_from_string ("und-Syrn", -1);  /* Undetermined; Syriac (Eastern variant) */
   case HB_TAG('T','M','H',' '):  /* Tamashek */
-    return hb_language_from_string ("tmh", -1);  /* Tamashek */
-  case HB_TAG('T','N','E',' '):  /* Tundra Nenets */
-    return hb_language_from_string ("yrk", -1);  /* Nenets */
-  case HB_TAG('Z','H','H',' '):  /* Chinese, Hong Kong SAR */
-    return hb_language_from_string ("zh-HK", -1);  /* Chinese; Hong Kong */
-  case HB_TAG('Z','H','S',' '):  /* Chinese Simplified */
-    return hb_language_from_string ("zh-Hans", -1);  /* Chinese; Han (Simplified variant) */
-  case HB_TAG('Z','H','T',' '):  /* Chinese Traditional */
-    return hb_language_from_string ("zh-Hant", -1);  /* Chinese; Han (Traditional variant) */
+    return hb_language_from_string ("tmh", -1);  /* Tamashek [macrolanguage] */
+  case HB_TAG('T','O','D',' '):  /* Todo */
+    return hb_language_from_string ("xwo", -1);  /* Written Oirat */
+  case HB_TAG('Z','H','H',' '):  /* Chinese, Traditional, Hong Kong SAR */
+    return hb_language_from_string ("zh-HK", -1);  /* Chinese [macrolanguage]; Hong Kong */
+  case HB_TAG('Z','H','S',' '):  /* Chinese, Simplified */
+    return hb_language_from_string ("zh-Hans", -1);  /* Chinese [macrolanguage]; Han (Simplified variant) */
+  case HB_TAG('Z','H','T',' '):  /* Chinese, Traditional */
+    return hb_language_from_string ("zh-Hant", -1);  /* Chinese [macrolanguage]; Han (Traditional variant) */
+  case HB_TAG('Z','H','T','M'):  /* Chinese, Traditional, Macao SAR */
+    return hb_language_from_string ("zh-MO", -1);  /* Chinese [macrolanguage]; Macao */
+  case HB_TAG('Z','Z','A',' '):  /* Zazaki */
+    return hb_language_from_string ("zza", -1);  /* Zazaki [macrolanguage] */
   default:
     return HB_LANGUAGE_INVALID;
   }
index 7ec91c5..f50be97 100644 (file)
@@ -41,6 +41,7 @@ hb_ot_old_tag_from_script (hb_script_t script)
   switch ((hb_tag_t) script)
   {
     case HB_SCRIPT_INVALID:            return HB_OT_TAG_DEFAULT_SCRIPT;
+    case HB_SCRIPT_MATH:               return HB_OT_TAG_MATH_SCRIPT;
 
     /* KATAKANA and HIRAGANA both map to 'kana' */
     case HB_SCRIPT_HIRAGANA:           return HB_TAG('k','a','n','a');
@@ -63,6 +64,8 @@ hb_ot_old_tag_to_script (hb_tag_t tag)
 {
   if (unlikely (tag == HB_OT_TAG_DEFAULT_SCRIPT))
     return HB_SCRIPT_INVALID;
+  if (unlikely (tag == HB_OT_TAG_MATH_SCRIPT))
+    return HB_SCRIPT_MATH;
 
   /* This side of the conversion is fully algorithmic. */
 
@@ -164,6 +167,15 @@ hb_ot_all_tags_from_script (hb_script_t   script,
   *count = i;
 }
 
+/**
+ * hb_ot_tag_to_script:
+ * @tag: a script tag
+ *
+ * Converts a script tag to an #hb_script_t.
+ *
+ * Return value: The #hb_script_t corresponding to @tag.
+ *
+ **/
 hb_script_t
 hb_ot_tag_to_script (hb_tag_t tag)
 {
@@ -280,6 +292,7 @@ hb_ot_tags_from_language (const char   *lang_str,
       for (i = 0;
           i < *count &&
           tag_idx + i < ARRAY_LENGTH (ot_languages) &&
+          ot_languages[tag_idx + i].tag != HB_TAG_NONE &&
           0 == strcmp (ot_languages[tag_idx + i].language, ot_languages[tag_idx].language);
           i++)
        tags[i] = ot_languages[tag_idx + i].tag;
@@ -350,13 +363,13 @@ parse_private_use_subtag (const char     *private_use_subtag,
  * hb_ot_tags_from_script_and_language:
  * @script: an #hb_script_t to convert.
  * @language: an #hb_language_t to convert.
- * @script_count: (allow-none): maximum number of script tags to retrieve (IN)
+ * @script_count: (inout) (optional): maximum number of script tags to retrieve (IN)
  * and actual number of script tags retrieved (OUT)
- * @script_tags: (out) (allow-none): array of size at least @script_count to store the
+ * @script_tags: (out) (optional): array of size at least @script_count to store the
  * script tag results
- * @language_count: (allow-none): maximum number of language tags to retrieve
+ * @language_count: (inout) (optional): maximum number of language tags to retrieve
  * (IN) and actual number of language tags retrieved (OUT)
- * @language_tags: (out) (allow-none): array of size at least @language_count to store
+ * @language_tags: (out) (optional): array of size at least @language_count to store
  * the language tag results
  *
  * Converts an #hb_script_t and an #hb_language_t to script and language tags.
@@ -423,10 +436,12 @@ hb_ot_tags_from_script_and_language (hb_script_t   script,
 
 /**
  * hb_ot_tag_to_language:
+ * @tag: an language tag
  *
+ * Converts a language tag to an #hb_language_t.
  *
- *
- * Return value: (transfer none):
+ * Return value: (transfer none) (nullable):
+ * The #hb_language_t corresponding to @tag.
  *
  * Since: 0.9.2
  **/
@@ -477,9 +492,9 @@ hb_ot_tag_to_language (hb_tag_t tag)
  * hb_ot_tags_to_script_and_language:
  * @script_tag: a script tag
  * @language_tag: a language tag
- * @script: (allow-none): the #hb_script_t corresponding to @script_tag (OUT).
- * @language: (allow-none): the #hb_language_t corresponding to @script_tag and
- * @language_tag (OUT).
+ * @script: (out) (optional): the #hb_script_t corresponding to @script_tag.
+ * @language: (out) (optional): the #hb_language_t corresponding to @script_tag and
+ * @language_tag.
  *
  * Converts a script tag and a language tag to an #hb_script_t and an
  * #hb_language_t.
@@ -510,7 +525,7 @@ hb_ot_tags_to_script_and_language (hb_tag_t       script_tag,
       unsigned char *buf;
       const char *lang_str = hb_language_to_string (*language);
       size_t len = strlen (lang_str);
-      buf = (unsigned char *) malloc (len + 16);
+      buf = (unsigned char *) hb_malloc (len + 16);
       if (unlikely (!buf))
       {
        *language = nullptr;
@@ -532,7 +547,7 @@ hb_ot_tags_to_script_and_language (hb_tag_t       script_tag,
        for (shift = 28; shift >= 0; shift -= 4)
          buf[len++] = TOHEX (script_tag >> shift);
        *language = hb_language_from_string ((char *) buf, len);
-       free (buf);
+       hb_free (buf);
       }
     }
   }
index 29219ad..65f26c1 100644 (file)
@@ -58,7 +58,7 @@ struct AxisValueMap
   DEFINE_SIZE_STATIC (4);
 };
 
-struct SegmentMaps : ArrayOf<AxisValueMap>
+struct SegmentMaps : Array16Of<AxisValueMap>
 {
   int map (int value, unsigned int from_offset = 0, unsigned int to_offset = 1) const
   {
diff --git a/src/hb-ot-var-common.hh b/src/hb-ot-var-common.hh
new file mode 100644 (file)
index 0000000..0eafb94
--- /dev/null
@@ -0,0 +1,264 @@
+/*
+ * Copyright © 2021  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.
+ *
+ */
+
+#ifndef HB_OT_VAR_COMMON_HH
+#define HB_OT_VAR_COMMON_HH
+
+#include "hb-ot-layout-common.hh"
+
+
+namespace OT {
+
+struct DeltaSetIndexMapFormat0
+{
+  friend struct DeltaSetIndexMap;
+
+  private:
+  DeltaSetIndexMapFormat0* copy (hb_serialize_context_t *c) const
+  {
+    TRACE_SERIALIZE (this);
+    auto *out = c->start_embed (this);
+    if (unlikely (!out)) return_trace (nullptr);
+
+    unsigned total_size = min_size + mapCount * get_width ();
+    HBUINT8 *p = c->allocate_size<HBUINT8> (total_size);
+    if (unlikely (!p)) return_trace (nullptr);
+
+    memcpy (p, this, HBUINT8::static_size * total_size);
+    return_trace (out);
+  }
+
+  template <typename T>
+  bool serialize (hb_serialize_context_t *c, const T &plan)
+  {
+    unsigned int width = plan.get_width ();
+    unsigned int inner_bit_count = plan.get_inner_bit_count ();
+    const hb_array_t<const uint32_t> output_map = plan.get_output_map ();
+
+    TRACE_SERIALIZE (this);
+    if (unlikely (output_map.length && ((((inner_bit_count-1)&~0xF)!=0) || (((width-1)&~0x3)!=0))))
+      return_trace (false);
+    if (unlikely (!c->extend_min (this))) return_trace (false);
+
+    entryFormat = ((width-1)<<4)|(inner_bit_count-1);
+    mapCount = output_map.length;
+    HBUINT8 *p = c->allocate_size<HBUINT8> (width * output_map.length);
+    if (unlikely (!p)) return_trace (false);
+    for (unsigned int i = 0; i < output_map.length; i++)
+    {
+      unsigned int v = output_map[i];
+      unsigned int outer = v >> 16;
+      unsigned int inner = v & 0xFFFF;
+      unsigned int u = (outer << inner_bit_count) | inner;
+      for (unsigned int w = width; w > 0;)
+      {
+        p[--w] = u;
+        u >>= 8;
+      }
+      p += width;
+    }
+    return_trace (true);
+  }
+
+  uint32_t map (unsigned int v) const /* Returns 16.16 outer.inner. */
+  {
+    /* If count is zero, pass value unchanged.  This takes
+     * care of direct mapping for advance map. */
+    if (!mapCount)
+      return v;
+
+    if (v >= mapCount)
+      v = mapCount - 1;
+
+    unsigned int u = 0;
+    { /* Fetch it. */
+      unsigned int w = get_width ();
+      const HBUINT8 *p = mapDataZ.arrayZ + w * v;
+      for (; w; w--)
+        u = (u << 8) + *p++;
+    }
+
+    { /* Repack it. */
+      unsigned int n = get_inner_bit_count ();
+      unsigned int outer = u >> n;
+      unsigned int inner = u & ((1 << n) - 1);
+      u = (outer<<16) | inner;
+    }
+
+    return u;
+  }
+
+  unsigned get_map_count () const       { return mapCount; }
+  unsigned get_width () const           { return ((entryFormat >> 4) & 3) + 1; }
+  unsigned get_inner_bit_count () const { return (entryFormat & 0xF) + 1; }
+
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+                  c->check_range (mapDataZ.arrayZ,
+                                  mapCount,
+                                  get_width ()));
+  }
+
+  protected:
+  HBUINT8       format;         /* Format identifier--format = 0 */
+  HBUINT8       entryFormat;    /* A packed field that describes the compressed
+                                 * representation of delta-set indices. */
+  HBUINT16      mapCount;       /* The number of mapping entries. */
+  UnsizedArrayOf<HBUINT8>
+                mapDataZ;       /* The delta-set index mapping data. */
+
+  public:
+  DEFINE_SIZE_ARRAY (4, mapDataZ);
+};
+
+struct DeltaSetIndexMapFormat1
+{
+  friend struct DeltaSetIndexMap;
+
+  private:
+  DeltaSetIndexMapFormat1* copy (hb_serialize_context_t *c) const
+  {
+    TRACE_SERIALIZE (this);
+    auto *out = c->start_embed (this);
+    if (unlikely (!out)) return_trace (nullptr);
+
+    unsigned total_size = min_size + mapCount * get_width ();
+    HBUINT8 *p = c->allocate_size<HBUINT8> (total_size);
+    if (unlikely (!p)) return_trace (nullptr);
+
+    memcpy (p, this, HBUINT8::static_size * total_size);
+    return_trace (out);
+  }
+
+  unsigned get_map_count () const       { return mapCount; }
+  unsigned get_width () const           { return ((entryFormat >> 4) & 3) + 1; }
+  unsigned get_inner_bit_count () const { return (entryFormat & 0xF) + 1; }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+                  c->check_range (mapDataZ.arrayZ,
+                                  mapCount,
+                                  get_width ()));
+  }
+
+  protected:
+  HBUINT8       format;         /* Format identifier--format = 1 */
+  HBUINT8       entryFormat;    /* A packed field that describes the compressed
+                                 * representation of delta-set indices. */
+  HBUINT32      mapCount;       /* The number of mapping entries. */
+  UnsizedArrayOf<HBUINT8>
+                mapDataZ;       /* The delta-set index mapping data. */
+
+  public:
+  DEFINE_SIZE_ARRAY (6, mapDataZ);
+};
+
+struct DeltaSetIndexMap
+{
+  template <typename T>
+  bool serialize (hb_serialize_context_t *c, const T &plan)
+  {
+    TRACE_SERIALIZE (this);
+    switch (u.format) {
+    case 0: return_trace (u.format0.serialize (c, plan));
+    default:return_trace (false);
+    }
+  }
+
+  uint32_t map (unsigned v) const
+  {
+    switch (u.format) {
+    case 0: return (u.format0.map (v));
+    default:return v;
+    }
+  }
+
+  unsigned get_map_count () const
+  {
+    switch (u.format) {
+    case 0: return u.format0.get_map_count ();
+    case 1: return u.format1.get_map_count ();
+    default:return 0;
+    }
+  }
+
+  unsigned get_width () const
+  {
+    switch (u.format) {
+    case 0: return u.format0.get_width ();
+    case 1: return u.format1.get_width ();
+    default:return 0;
+    }
+  }
+
+  unsigned get_inner_bit_count () const
+  {
+    switch (u.format) {
+    case 0: return u.format0.get_inner_bit_count ();
+    case 1: return u.format1.get_inner_bit_count ();
+    default:return 0;
+    }
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (!u.format.sanitize (c)) return_trace (false);
+    switch (u.format) {
+    case 0: return_trace (u.format0.sanitize (c));
+    case 1: return_trace (u.format1.sanitize (c));
+    default:return_trace (true);
+    }
+  }
+
+  DeltaSetIndexMap* copy (hb_serialize_context_t *c) const
+  {
+    TRACE_SERIALIZE (this);
+    switch (u.format) {
+    case 0: return_trace (reinterpret_cast<DeltaSetIndexMap *> (u.format0.copy (c)));
+    case 1: return_trace (reinterpret_cast<DeltaSetIndexMap *> (u.format1.copy (c)));
+    default:return_trace (nullptr);
+    }
+  }
+
+  protected:
+  union {
+  HBUINT8                       format;         /* Format identifier */
+  DeltaSetIndexMapFormat0       format0;
+  DeltaSetIndexMapFormat1       format1;
+  } u;
+  public:
+  DEFINE_SIZE_UNION (1, format);
+};
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_VAR_COMMON_HH */
index af22f70..e066558 100644 (file)
@@ -70,22 +70,85 @@ struct InstanceRecord
 
 struct AxisRecord
 {
+  int cmp (hb_tag_t key) const { return axisTag.cmp (key); }
+
   enum
   {
     AXIS_FLAG_HIDDEN   = 0x0001,
   };
 
+#ifndef HB_DISABLE_DEPRECATED
+  void get_axis_deprecated (hb_ot_var_axis_t *info) const
+  {
+    info->tag = axisTag;
+    info->name_id = axisNameID;
+    get_coordinates (info->min_value, info->default_value, info->max_value);
+  }
+#endif
+
+  void get_axis_info (unsigned axis_index, hb_ot_var_axis_info_t *info) const
+  {
+    info->axis_index = axis_index;
+    info->tag = axisTag;
+    info->name_id = axisNameID;
+    info->flags = (hb_ot_var_axis_flags_t) (unsigned int) flags;
+    get_coordinates (info->min_value, info->default_value, info->max_value);
+    info->reserved = 0;
+  }
+
+  int normalize_axis_value (float v) const
+  {
+    float min_value, default_value, max_value;
+    get_coordinates (min_value, default_value, max_value);
+
+    v = hb_clamp (v, min_value, max_value);
+
+    if (v == default_value)
+      return 0;
+    else if (v < default_value)
+      v = (v - default_value) / (default_value - min_value);
+    else
+      v = (v - default_value) / (max_value - default_value);
+    return roundf (v * 16384.f);
+  }
+
+  float unnormalize_axis_value (int v) const
+  {
+    float min_value, default_value, max_value;
+    get_coordinates (min_value, default_value, max_value);
+
+    if (v == 0)
+      return default_value;
+    else if (v < 0)
+      return v * (default_value - min_value) / 16384.f + default_value;
+    else
+      return v * (max_value - default_value) / 16384.f + default_value;
+  }
+
+  hb_ot_name_id_t get_name_id () const { return axisNameID; }
+
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
     return_trace (c->check_struct (this));
   }
 
+  protected:
+  void get_coordinates (float &min, float &default_, float &max) const
+  {
+    default_ = defaultValue / 65536.f;
+    /* Ensure order, to simplify client math. */
+    min = hb_min (default_, minValue / 65536.f);
+    max = hb_max (default_, maxValue / 65536.f);
+  }
+
   public:
   Tag          axisTag;        /* Tag identifying the design variation for the axis. */
+  protected:
   HBFixed      minValue;       /* The minimum coordinate value for the axis. */
   HBFixed      defaultValue;   /* The default coordinate value for the axis. */
   HBFixed      maxValue;       /* The maximum coordinate value for the axis. */
+  public:
   HBUINT16     flags;          /* Axis flags. */
   NameID       axisNameID;     /* The name ID for entries in the 'name' table that
                                 * provide a display name for this axis. */
@@ -115,44 +178,15 @@ struct fvar
   unsigned int get_axis_count () const { return axisCount; }
 
 #ifndef HB_DISABLE_DEPRECATED
-  void get_axis_deprecated (unsigned int axis_index,
-                                  hb_ot_var_axis_t *info) const
-  {
-    const AxisRecord &axis = get_axes ()[axis_index];
-    info->tag = axis.axisTag;
-    info->name_id =  axis.axisNameID;
-    info->default_value = axis.defaultValue / 65536.f;
-    /* Ensure order, to simplify client math. */
-    info->min_value = hb_min (info->default_value, axis.minValue / 65536.f);
-    info->max_value = hb_max (info->default_value, axis.maxValue / 65536.f);
-  }
-#endif
-
-  void get_axis_info (unsigned int axis_index,
-                     hb_ot_var_axis_info_t *info) const
-  {
-    const AxisRecord &axis = get_axes ()[axis_index];
-    info->axis_index = axis_index;
-    info->tag = axis.axisTag;
-    info->name_id =  axis.axisNameID;
-    info->flags = (hb_ot_var_axis_flags_t) (unsigned int) axis.flags;
-    info->default_value = axis.defaultValue / 65536.f;
-    /* Ensure order, to simplify client math. */
-    info->min_value = hb_min (info->default_value, axis.minValue / 65536.f);
-    info->max_value = hb_max (info->default_value, axis.maxValue / 65536.f);
-    info->reserved = 0;
-  }
-
-#ifndef HB_DISABLE_DEPRECATED
   unsigned int get_axes_deprecated (unsigned int      start_offset,
                                    unsigned int     *axes_count /* IN/OUT */,
                                    hb_ot_var_axis_t *axes_array /* OUT */) const
   {
     if (axes_count)
     {
-      hb_array_t<const AxisRecord> arr = hb_array (&(this+firstAxis), axisCount).sub_array (start_offset, axes_count);
+      hb_array_t<const AxisRecord> arr = get_axes ().sub_array (start_offset, axes_count);
       for (unsigned i = 0; i < arr.length; ++i)
-       get_axis_deprecated (start_offset + i, axes_array + i);
+       arr[i].get_axis_deprecated (&axes_array[i]);
     }
     return axisCount;
   }
@@ -164,77 +198,37 @@ struct fvar
   {
     if (axes_count)
     {
-      hb_array_t<const AxisRecord> arr = hb_array (&(this+firstAxis), axisCount).sub_array (start_offset, axes_count);
+      hb_array_t<const AxisRecord> arr = get_axes ().sub_array (start_offset, axes_count);
       for (unsigned i = 0; i < arr.length; ++i)
-       get_axis_info (start_offset + i, axes_array + i);
+       arr[i].get_axis_info (start_offset + i, &axes_array[i]);
     }
     return axisCount;
   }
 
 #ifndef HB_DISABLE_DEPRECATED
-  bool find_axis_deprecated (hb_tag_t tag,
-                            unsigned int *axis_index,
-                            hb_ot_var_axis_t *info) const
+  bool
+  find_axis_deprecated (hb_tag_t tag, unsigned *axis_index, hb_ot_var_axis_t *info) const
   {
-    const AxisRecord *axes = get_axes ();
-    unsigned int count = get_axis_count ();
-    for (unsigned int i = 0; i < count; i++)
-      if (axes[i].axisTag == tag)
-      {
-       if (axis_index)
-         *axis_index = i;
-       get_axis_deprecated (i, info);
-       return true;
-      }
-    if (axis_index)
-      *axis_index = HB_OT_VAR_NO_AXIS_INDEX;
-    return false;
+    unsigned i;
+    if (!axis_index) axis_index = &i;
+    *axis_index = HB_OT_VAR_NO_AXIS_INDEX;
+    auto axes = get_axes ();
+    return axes.lfind (tag, axis_index) && (axes[*axis_index].get_axis_deprecated (info), true);
   }
 #endif
-
-  bool find_axis_info (hb_tag_t tag,
-                      hb_ot_var_axis_info_t *info) const
+  bool
+  find_axis_info (hb_tag_t tag, hb_ot_var_axis_info_t *info) const
   {
-    const AxisRecord *axes = get_axes ();
-    unsigned int count = get_axis_count ();
-    for (unsigned int i = 0; i < count; i++)
-      if (axes[i].axisTag == tag)
-      {
-       get_axis_info (i, info);
-       return true;
-      }
-    return false;
+    unsigned i;
+    auto axes = get_axes ();
+    return axes.lfind (tag, &i) && (axes[i].get_axis_info (i, info), true);
   }
 
   int normalize_axis_value (unsigned int axis_index, float v) const
-  {
-    hb_ot_var_axis_info_t axis;
-    get_axis_info (axis_index, &axis);
+  { return get_axes ()[axis_index].normalize_axis_value (v); }
 
-    v = hb_clamp (v, axis.min_value, axis.max_value);
-
-    if (v == axis.default_value)
-      return 0;
-    else if (v < axis.default_value)
-      v = (v - axis.default_value) / (axis.default_value - axis.min_value);
-    else
-      v = (v - axis.default_value) / (axis.max_value - axis.default_value);
-    return roundf (v * 16384.f);
-  }
-
-  float unnormalize_axis_value (unsigned int axis_index, float v) const
-  {
-    hb_ot_var_axis_info_t axis;
-    get_axis_info (axis_index, &axis);
-
-    if (v == 0)
-      return axis.default_value;
-    else if (v < 0)
-      v = v * (axis.default_value - axis.min_value) / 16384.f + axis.default_value;
-    else
-      v = v * (axis.max_value - axis.default_value) / 16384.f + axis.default_value;
-    return v;
-  }
+  float unnormalize_axis_value (unsigned int axis_index, int v) const
+  { return get_axes ()[axis_index].unnormalize_axis_value (v); }
 
   unsigned int get_instance_count () const { return instanceCount; }
 
@@ -269,7 +263,7 @@ struct fvar
     if (coords_length && *coords_length)
     {
       hb_array_t<const HBFixed> instanceCoords = instance->get_coordinates (axisCount)
-                                                        .sub_array (0, *coords_length);
+                                                        .sub_array (0, coords_length);
       for (unsigned int i = 0; i < instanceCoords.length; i++)
        coords[i] = instanceCoords.arrayZ[i].to_float ();
     }
@@ -281,7 +275,7 @@ struct fvar
     if (!has_data ()) return;
 
     + get_axes ()
-    | hb_map (&AxisRecord::axisNameID)
+    | hb_map (&AxisRecord::get_name_id)
     | hb_sink (nameids)
     ;
 
@@ -296,8 +290,7 @@ struct fvar
     ;
   }
 
-
-  protected:
+  public:
   hb_array_t<const AxisRecord> get_axes () const
   { return hb_array (&(this+firstAxis), axisCount); }
 
@@ -311,7 +304,7 @@ struct fvar
   protected:
   FixedVersion<>version;       /* Version of the fvar table
                                 * initially set to 0x00010000u */
-  OffsetTo<AxisRecord>
+  Offset16To<AxisRecord>
                firstAxis;      /* Offset in bytes from the beginning of the table
                                 * to the start of the AxisRecord array. */
   HBUINT16     reserved;       /* This field is permanently reserved. Set to 2. */
index db944f6..539213c 100644 (file)
@@ -138,10 +138,10 @@ struct TupleVariationHeader
     return scalar;
   }
 
-  bool           has_peak () const { return (tupleIndex & TuppleIndex::EmbeddedPeakTuple); }
-  bool   has_intermediate () const { return (tupleIndex & TuppleIndex::IntermediateRegion); }
-  bool has_private_points () const { return (tupleIndex & TuppleIndex::PrivatePointNumbers); }
-  unsigned int  get_index () const { return (tupleIndex & TuppleIndex::TupleIndexMask); }
+  bool           has_peak () const { return tupleIndex & TuppleIndex::EmbeddedPeakTuple; }
+  bool   has_intermediate () const { return tupleIndex & TuppleIndex::IntermediateRegion; }
+  bool has_private_points () const { return tupleIndex & TuppleIndex::PrivatePointNumbers; }
+  unsigned      get_index () const { return tupleIndex & TuppleIndex::TupleIndexMask; }
 
   protected:
   struct TuppleIndex : HBUINT16
@@ -374,7 +374,7 @@ struct GlyphVariationData
                                 * low 12 bits are the number of tuple variation tables
                                 * for this glyph. The number of tuple variation tables
                                 * can be any number between 1 and 4095. */
-  OffsetTo<HBUINT8>
+  Offset16To<HBUINT8>
                data;           /* Offset from the start of the GlyphVariationData table
                                 * to the serialized data. */
   /* TupleVariationHeader tupleVariationHeaders[] *//* Array of tuple variation headers. */
@@ -399,7 +399,7 @@ struct gvar
                                  get_offset (glyphCount) - get_offset (0)));
   }
 
-  /* GlyphVariationData not sanitized here; must be checked while accessing each glyph varation data */
+  /* GlyphVariationData not sanitized here; must be checked while accessing each glyph variation data */
   bool sanitize (hb_sanitize_context_t *c) const
   { return sanitize_shallow (c); }
 
@@ -419,7 +419,9 @@ struct gvar
     out->glyphCount = num_glyphs;
 
     unsigned int subset_data_size = 0;
-    for (hb_codepoint_t gid = 0; gid < num_glyphs; gid++)
+    for (hb_codepoint_t gid = (c->plan->flags & HB_SUBSET_FLAGS_NOTDEF_OUTLINE) ? 0 : 1;
+         gid < num_glyphs;
+         gid++)
     {
       hb_codepoint_t old_gid;
       if (!c->plan->old_gid_for_new_gid (gid, &old_gid)) continue;
@@ -449,7 +451,9 @@ struct gvar
     out->dataZ = subset_data - (char *) out;
 
     unsigned int glyph_offset = 0;
-    for (hb_codepoint_t gid = 0; gid < num_glyphs; gid++)
+    for (hb_codepoint_t gid = (c->plan->flags & HB_SUBSET_FLAGS_NOTDEF_OUTLINE) ? 0 : 1;
+         gid < num_glyphs;
+         gid++)
     {
       hb_codepoint_t old_gid;
       hb_bytes_t var_data_bytes = c->plan->old_gid_for_new_gid (gid, &old_gid)
@@ -483,15 +487,10 @@ struct gvar
     return likely (var_data.length >= GlyphVariationData::min_size) ? var_data : hb_bytes_t ();
   }
 
-  bool is_long_offset () const { return (flags & 1) != 0; }
+  bool is_long_offset () const { return flags & 1; }
 
-  unsigned int get_offset (unsigned int i) const
-  {
-    if (is_long_offset ())
-      return get_long_offset_array ()[i];
-    else
-      return get_short_offset_array ()[i] * 2;
-  }
+  unsigned get_offset (unsigned i) const
+  { return is_long_offset () ? get_long_offset_array ()[i] : get_short_offset_array ()[i] * 2; }
 
   const HBUINT32 * get_long_offset_array () const { return (const HBUINT32 *) &offsetZ; }
   const HBUINT16 *get_short_offset_array () const { return (const HBUINT16 *) &offsetZ; }
@@ -499,9 +498,9 @@ struct gvar
   public:
   struct accelerator_t
   {
-    void init (hb_face_t *face)
+    accelerator_t (hb_face_t *face)
     { table = hb_sanitize_context_t ().reference_table<gvar> (face); }
-    void fini () { table.destroy (); }
+    ~accelerator_t () { table.destroy (); }
 
     private:
     struct x_getter { static float get (const contour_point_t &p) { return p.x; } };
@@ -540,12 +539,14 @@ struct gvar
       /* num_coords should exactly match gvar's axisCount due to how GlyphVariationData tuples are aligned */
       if (!font->num_coords || font->num_coords != table->axisCount) return true;
 
+      if (unlikely (glyph >= table->glyphCount)) return true;
+
       hb_bytes_t var_data_bytes = table->get_glyph_var_data_bytes (table.get_blob (), glyph);
       if (!var_data_bytes.as<GlyphVariationData> ()->has_data ()) return true;
       hb_vector_t<unsigned int> shared_indices;
       GlyphVariationData::tuple_iterator_t iterator;
       if (!GlyphVariationData::get_tuple_iterator (var_data_bytes, table->axisCount,
-                                            shared_indices, &iterator))
+                                                  shared_indices, &iterator))
        return true; /* so isn't applied at all */
 
       /* Save original points for inferred delta calculation */
@@ -655,8 +656,8 @@ no_more_gaps:
        /* apply specified / inferred deltas to points */
        for (unsigned int i = 0; i < points.length; i++)
        {
-         points[i].x += (float) roundf (deltas[i].x);
-         points[i].y += (float) roundf (deltas[i].y);
+         points[i].x += deltas[i].x;
+         points[i].y += deltas[i].y;
        }
       } while (iterator.move_to_next ());
 
@@ -679,7 +680,7 @@ no_more_gaps:
                                 * can be referenced within glyph variation data tables for
                                 * multiple glyphs, as opposed to other tuple records stored
                                 * directly within a glyph variation data table. */
-  LNNOffsetTo<UnsizedArrayOf<F2DOT14>>
+  NNOffset32To<UnsizedArrayOf<F2DOT14>>
                sharedTuples;   /* Offset from the start of this table to the shared tuple records.
                                 * Array of tuple records shared across all glyph variation data tables. */
   HBUINT16     glyphCount;     /* The number of glyphs in this font. This must match the number of
@@ -687,7 +688,7 @@ no_more_gaps:
   HBUINT16     flags;          /* Bit-field that gives the format of the offset array that follows.
                                 * If bit 0 is clear, the offsets are uint16; if bit 0 is set, the
                                 * offsets are uint32. */
-  LOffsetTo<GlyphVariationData>
+  Offset32To<GlyphVariationData>
                dataZ;          /* Offset from the start of this table to the array of
                                 * GlyphVariationData tables. */
   UnsizedArrayOf<HBUINT8>
@@ -697,7 +698,9 @@ no_more_gaps:
   DEFINE_SIZE_MIN (20);
 };
 
-struct gvar_accelerator_t : gvar::accelerator_t {};
+struct gvar_accelerator_t : gvar::accelerator_t {
+  gvar_accelerator_t (hb_face_t *face) : gvar::accelerator_t (face) {}
+};
 
 } /* namespace OT */
 
index fdcc88d..e9d9035 100644 (file)
 #define HB_OT_VAR_HVAR_TABLE_HH
 
 #include "hb-ot-layout-common.hh"
-
+#include "hb-ot-var-common.hh"
 
 namespace OT {
 
 
-struct DeltaSetIndexMap
-{
-  bool sanitize (hb_sanitize_context_t *c) const
-  {
-    TRACE_SANITIZE (this);
-    return_trace (c->check_struct (this) &&
-                 c->check_range (mapDataZ.arrayZ,
-                                 mapCount,
-                                 get_width ()));
-  }
-
-  template <typename T>
-  bool serialize (hb_serialize_context_t *c, const T &plan)
-  {
-    unsigned int width = plan.get_width ();
-    unsigned int inner_bit_count = plan.get_inner_bit_count ();
-    const hb_array_t<const unsigned int> output_map = plan.get_output_map ();
-
-    TRACE_SERIALIZE (this);
-    if (unlikely (output_map.length && ((((inner_bit_count-1)&~0xF)!=0) || (((width-1)&~0x3)!=0))))
-      return_trace (false);
-    if (unlikely (!c->extend_min (*this))) return_trace (false);
-
-    format = ((width-1)<<4)|(inner_bit_count-1);
-    mapCount = output_map.length;
-    HBUINT8 *p = c->allocate_size<HBUINT8> (width * output_map.length);
-    if (unlikely (!p)) return_trace (false);
-    for (unsigned int i = 0; i < output_map.length; i++)
-    {
-      unsigned int v = output_map[i];
-      unsigned int outer = v >> 16;
-      unsigned int inner = v & 0xFFFF;
-      unsigned int u = (outer << inner_bit_count) | inner;
-      for (unsigned int w = width; w > 0;)
-      {
-       p[--w] = u;
-       u >>= 8;
-      }
-      p += width;
-    }
-    return_trace (true);
-  }
-
-  unsigned int map (unsigned int v) const /* Returns 16.16 outer.inner. */
-  {
-    /* If count is zero, pass value unchanged.  This takes
-     * care of direct mapping for advance map. */
-    if (!mapCount)
-      return v;
-
-    if (v >= mapCount)
-      v = mapCount - 1;
-
-    unsigned int u = 0;
-    { /* Fetch it. */
-      unsigned int w = get_width ();
-      const HBUINT8 *p = mapDataZ.arrayZ + w * v;
-      for (; w; w--)
-       u = (u << 8) + *p++;
-    }
-
-    { /* Repack it. */
-      unsigned int n = get_inner_bit_count ();
-      unsigned int outer = u >> n;
-      unsigned int inner = u & ((1 << n) - 1);
-      u = (outer<<16) | inner;
-    }
-
-    return u;
-  }
-
-  unsigned int get_map_count () const      { return mapCount; }
-  unsigned int get_width () const           { return ((format >> 4) & 3) + 1; }
-  unsigned int get_inner_bit_count () const { return (format & 0xF) + 1; }
-
-  protected:
-  HBUINT16     format;         /* A packed field that describes the compressed
-                                * representation of delta-set indices. */
-  HBUINT16     mapCount;       /* The number of mapping entries. */
-  UnsizedArrayOf<HBUINT8>
-               mapDataZ;       /* The delta-set index mapping data. */
-
-  public:
-  DEFINE_SIZE_ARRAY (4, mapDataZ);
-};
-
 struct index_map_subset_plan_t
 {
   enum index_map_index_t {
@@ -217,7 +131,7 @@ struct index_map_subset_plan_t
       hb_codepoint_t   old_gid;
       if (plan->old_gid_for_new_gid (gid, &old_gid))
       {
-       unsigned int v = input_map->map (old_gid);
+       uint32_t v = input_map->map (old_gid);
        unsigned int outer = v >> 16;
        output_map[gid] = (outer_map[outer] << 16) | (inner_maps[outer][v & 0xFFFF]);
       }
@@ -234,14 +148,14 @@ struct index_map_subset_plan_t
   { return (map_count? (DeltaSetIndexMap::min_size + get_width () * map_count): 0); }
 
   bool is_identity () const { return get_output_map ().length == 0; }
-  hb_array_t<const unsigned int> get_output_map () const { return output_map.as_array (); }
+  hb_array_t<const uint32_t> get_output_map () const { return output_map.as_array (); }
 
   protected:
   unsigned int map_count;
   hb_vector_t<unsigned int> max_inners;
   unsigned int outer_bit_count;
   unsigned int inner_bit_count;
-  hb_vector_t<unsigned int> output_map;
+  hb_vector_t<uint32_t> output_map;
 };
 
 struct hvarvvar_subset_plan_t
@@ -263,16 +177,13 @@ struct hvarvvar_subset_plan_t
 
     inner_maps.resize (var_store->get_sub_table_count ());
 
-    for (unsigned int i = 0; i < inner_maps.length; i++)
-      inner_maps[i].init ();
-
     if (unlikely (!index_map_plans.length || !inner_sets.length || !inner_maps.length)) return;
 
     bool retain_adv_map = false;
     index_map_plans[0].init (*index_maps[0], outer_map, inner_sets, plan);
     if (index_maps[0] == &Null (DeltaSetIndexMap))
     {
-      retain_adv_map = plan->retain_gids;
+      retain_adv_map = plan->flags & HB_SUBSET_FLAGS_RETAIN_GIDS;
       outer_map.add (0);
       for (hb_codepoint_t gid = 0; gid < plan->num_output_glyphs (); gid++)
       {
@@ -315,8 +226,8 @@ struct hvarvvar_subset_plan_t
     for (unsigned int i = 0; i < inner_sets.length; i++)
       hb_set_destroy (inner_sets[i]);
     hb_set_destroy (adv_set);
-    inner_maps.fini_deep ();
-    index_map_plans.fini_deep ();
+    inner_maps.fini ();
+    index_map_plans.fini ();
   }
 
   hb_inc_bimap_t outer_map;
@@ -367,15 +278,15 @@ struct HVARVVAR
     TRACE_SERIALIZE (this);
     if (im_plans[index_map_subset_plan_t::ADV_INDEX].is_identity ())
       advMap = 0;
-    else if (unlikely (!advMap.serialize (c, this).serialize (c, im_plans[index_map_subset_plan_t::ADV_INDEX])))
+    else if (unlikely (!advMap.serialize_serialize (c, im_plans[index_map_subset_plan_t::ADV_INDEX])))
       return_trace (false);
     if (im_plans[index_map_subset_plan_t::LSB_INDEX].is_identity ())
       lsbMap = 0;
-    else if (unlikely (!lsbMap.serialize (c, this).serialize (c, im_plans[index_map_subset_plan_t::LSB_INDEX])))
+    else if (unlikely (!lsbMap.serialize_serialize (c, im_plans[index_map_subset_plan_t::LSB_INDEX])))
       return_trace (false);
     if (im_plans[index_map_subset_plan_t::RSB_INDEX].is_identity ())
       rsbMap = 0;
-    else if (unlikely (!rsbMap.serialize (c, this).serialize (c, im_plans[index_map_subset_plan_t::RSB_INDEX])))
+    else if (unlikely (!rsbMap.serialize_serialize (c, im_plans[index_map_subset_plan_t::RSB_INDEX])))
       return_trace (false);
 
     return_trace (true);
@@ -398,8 +309,10 @@ struct HVARVVAR
     out->version.major = 1;
     out->version.minor = 0;
 
-    if (unlikely (!out->varStore.serialize (c->serializer, out)
-                    .serialize (c->serializer, hvar_plan.var_store, hvar_plan.inner_maps.as_array ())))
+    if (unlikely (!out->varStore
+                     .serialize_serialize (c->serializer,
+                                           hvar_plan.var_store,
+                                           hvar_plan.inner_maps.as_array ())))
       return_trace (false);
 
     return_trace (out->T::serialize_index_maps (c->serializer,
@@ -408,7 +321,7 @@ struct HVARVVAR
 
   float get_advance_var (hb_codepoint_t glyph, hb_font_t *font) const
   {
-    unsigned int varidx = (this+advMap).map (glyph);
+    uint32_t varidx = (this+advMap).map (glyph);
     return (this+varStore).get_delta (varidx, font->coords, font->num_coords);
   }
 
@@ -416,7 +329,7 @@ struct HVARVVAR
                              const int *coords, unsigned int coord_count) const
   {
     if (!has_side_bearing_deltas ()) return 0.f;
-    unsigned int varidx = (this+lsbMap).map (glyph);
+    uint32_t varidx = (this+lsbMap).map (glyph);
     return (this+varStore).get_delta (varidx, coords, coord_count);
   }
 
@@ -425,13 +338,13 @@ struct HVARVVAR
   protected:
   FixedVersion<>version;       /* Version of the metrics variation table
                                 * initially set to 0x00010000u */
-  LOffsetTo<VariationStore>
+  Offset32To<VariationStore>
                varStore;       /* Offset to item variation store table. */
-  LOffsetTo<DeltaSetIndexMap>
+  Offset32To<DeltaSetIndexMap>
                advMap;         /* Offset to advance var-idx mapping. */
-  LOffsetTo<DeltaSetIndexMap>
+  Offset32To<DeltaSetIndexMap>
                lsbMap;         /* Offset to lsb/tsb var-idx mapping. */
-  LOffsetTo<DeltaSetIndexMap>
+  Offset32To<DeltaSetIndexMap>
                rsbMap;         /* Offset to rsb/bsb var-idx mapping. */
 
   public:
@@ -466,7 +379,7 @@ struct VVAR : HVARVVAR {
       return_trace (false);
     if (!im_plans[index_map_subset_plan_t::VORG_INDEX].get_map_count ())
       vorgMap = 0;
-    else if (unlikely (!vorgMap.serialize (c, this).serialize (c, im_plans[index_map_subset_plan_t::VORG_INDEX])))
+    else if (unlikely (!vorgMap.serialize_serialize (c, im_plans[index_map_subset_plan_t::VORG_INDEX])))
       return_trace (false);
 
     return_trace (true);
@@ -475,7 +388,7 @@ struct VVAR : HVARVVAR {
   bool subset (hb_subset_context_t *c) const { return HVARVVAR::_subset<VVAR> (c); }
 
   protected:
-  LOffsetTo<DeltaSetIndexMap>
+  Offset32To<DeltaSetIndexMap>
                vorgMap;        /* Offset to vertical-origin var-idx mapping. */
 
   public:
index 1b7fad9..208db46 100644 (file)
@@ -103,7 +103,7 @@ protected:
   HBUINT16     valueRecordSize;/* The size in bytes of each value record —
                                 * must be greater than zero. */
   HBUINT16     valueRecordCount;/* The number of value records — may be zero. */
-  OffsetTo<VariationStore>
+  Offset16To<VariationStore>
                varStore;       /* Offset to item variation store table. */
   UnsizedArrayOf<HBUINT8>
                valuesZ;        /* Array of value records. The records must be
index 6b8b09b..0376e26 100644 (file)
 
 /**
  * hb_ot_var_has_data:
- * @face: #hb_face_t to test
+ * @face: The #hb_face_t to work on
  *
- * This function allows to verify the presence of OpenType variation data on the face.
+ * Tests whether a face includes any OpenType variation data in the `fvar` table.
  *
- * Return value: true if face has a `fvar' table and false otherwise
+ * Return value: %true if data found, %false otherwise
  *
  * Since: 1.4.2
  **/
@@ -68,6 +68,11 @@ hb_ot_var_has_data (hb_face_t *face)
 
 /**
  * hb_ot_var_get_axis_count:
+ * @face: The #hb_face_t to work on
+ *
+ * Fetches the number of OpenType variation axes included in the face. 
+ *
+ * Return value: the number of variation axes defined
  *
  * Since: 1.4.2
  **/
@@ -80,9 +85,17 @@ hb_ot_var_get_axis_count (hb_face_t *face)
 #ifndef HB_DISABLE_DEPRECATED
 /**
  * hb_ot_var_get_axes:
+ * @face: #hb_face_t to work upon
+ * @start_offset: offset of the first lookup to retrieve
+ * @axes_count: (inout) (optional): Input = the maximum number of variation axes to return;
+ *                Output = the actual number of variation axes returned (may be zero)
+ * @axes_array: (out caller-allocates) (array length=axes_count): The array of variation axes found
+ *
+ * Fetches a list of all variation axes in the specified face. The list returned will begin
+ * at the offset provided.
  *
  * Since: 1.4.2
- * Deprecated: 2.2.0
+ * Deprecated: 2.2.0: use hb_ot_var_get_axis_infos() instead
  **/
 unsigned int
 hb_ot_var_get_axes (hb_face_t        *face,
@@ -95,9 +108,16 @@ hb_ot_var_get_axes (hb_face_t        *face,
 
 /**
  * hb_ot_var_find_axis:
+ * @face: #hb_face_t to work upon
+ * @axis_tag: The #hb_tag_t of the variation axis to query
+ * @axis_index: The index of the variation axis
+ * @axis_info: (out): The #hb_ot_var_axis_info_t of the axis tag queried
+ *
+ * Fetches the variation-axis information corresponding to the specified axis tag
+ * in the specified face.
  *
  * Since: 1.4.2
- * Deprecated: 2.2.0
+ * Deprecated: 2.2.0 - use hb_ot_var_find_axis_info() instead
  **/
 hb_bool_t
 hb_ot_var_find_axis (hb_face_t        *face,
@@ -111,6 +131,16 @@ hb_ot_var_find_axis (hb_face_t        *face,
 
 /**
  * hb_ot_var_get_axis_infos:
+ * @face: #hb_face_t to work upon
+ * @start_offset: offset of the first lookup to retrieve
+ * @axes_count: (inout) (optional): Input = the maximum number of variation axes to return;
+ *                Output = the actual number of variation axes returned (may be zero)
+ * @axes_array: (out caller-allocates) (array length=axes_count): The array of variation axes found
+ *
+ * Fetches a list of all variation axes in the specified face. The list returned will begin
+ * at the offset provided.
+ *
+ * Return value: the number of variation axes in the face
  *
  * Since: 2.2.0
  **/
@@ -125,6 +155,14 @@ hb_ot_var_get_axis_infos (hb_face_t             *face,
 
 /**
  * hb_ot_var_find_axis_info:
+ * @face: #hb_face_t to work upon
+ * @axis_tag: The #hb_tag_t of the variation axis to query
+ * @axis_info: (out): The #hb_ot_var_axis_info_t of the axis tag queried
+ *
+ * Fetches the variation-axis information corresponding to the specified axis tag
+ * in the specified face.
+ *
+ * Return value: %true if data found, %false otherwise
  *
  * Since: 2.2.0
  **/
@@ -141,12 +179,34 @@ hb_ot_var_find_axis_info (hb_face_t             *face,
  * Named instances.
  */
 
+/**
+ * hb_ot_var_get_named_instance_count:
+ * @face: The #hb_face_t to work on
+ *
+ * Fetches the number of named instances included in the face. 
+ *
+ * Return value: the number of named instances defined
+ *
+ * Since: 2.2.0
+ **/
 unsigned int
 hb_ot_var_get_named_instance_count (hb_face_t *face)
 {
   return face->table.fvar->get_instance_count ();
 }
 
+/**
+ * hb_ot_var_named_instance_get_subfamily_name_id:
+ * @face: The #hb_face_t to work on
+ * @instance_index: The index of the named instance to query
+ *
+ * Fetches the `name` table Name ID that provides display names for
+ * the "Subfamily name" defined for the given named instance in the face.
+ *
+ * Return value: the Name ID found for the Subfamily name
+ *
+ * Since: 2.2.0
+ **/
 hb_ot_name_id_t
 hb_ot_var_named_instance_get_subfamily_name_id (hb_face_t   *face,
                                                unsigned int instance_index)
@@ -154,6 +214,18 @@ hb_ot_var_named_instance_get_subfamily_name_id (hb_face_t   *face,
   return face->table.fvar->get_instance_subfamily_name_id (instance_index);
 }
 
+/**
+ * hb_ot_var_named_instance_get_postscript_name_id:
+ * @face: The #hb_face_t to work on
+ * @instance_index: The index of the named instance to query
+ *
+ * Fetches the `name` table Name ID that provides display names for
+ * the "PostScript name" defined for the given named instance in the face.
+ *
+ * Return value: the Name ID found for the PostScript name
+ *
+ * Since: 2.2.0
+ **/
 hb_ot_name_id_t
 hb_ot_var_named_instance_get_postscript_name_id (hb_face_t  *face,
                                                unsigned int instance_index)
@@ -161,6 +233,21 @@ hb_ot_var_named_instance_get_postscript_name_id (hb_face_t  *face,
   return face->table.fvar->get_instance_postscript_name_id (instance_index);
 }
 
+/**
+ * hb_ot_var_named_instance_get_design_coords:
+ * @face: The #hb_face_t to work on
+ * @instance_index: The index of the named instance to query
+ * @coords_length: (inout) (optional): Input = the maximum number of coordinates to return;
+ *                 Output = the actual number of coordinates returned (may be zero)
+ * @coords: (out) (array length=coords_length): The array of coordinates found for the query
+ *
+ * Fetches the design-space coordinates corresponding to the given
+ * named instance in the face.
+ *
+ * Return value: the number of variation axes in the face
+ *
+ * Since: 2.2.0
+ **/
 unsigned int
 hb_ot_var_named_instance_get_design_coords (hb_face_t    *face,
                                            unsigned int  instance_index,
@@ -173,6 +260,13 @@ hb_ot_var_named_instance_get_design_coords (hb_face_t    *face,
 
 /**
  * hb_ot_var_normalize_variations:
+ * @face: The #hb_face_t to work on
+ * @variations: The array of variations to normalize
+ * @variations_length: The number of variations to normalize
+ * @coords: (out) (array length=coords_length): The array of normalized coordinates 
+ * @coords_length: The length of the coordinate array
+ *
+ * Normalizes all of the coordinates in the given list of variation axes.
  *
  * Since: 1.4.2
  **/
@@ -200,6 +294,20 @@ hb_ot_var_normalize_variations (hb_face_t            *face,
 
 /**
  * hb_ot_var_normalize_coords:
+ * @face: The #hb_face_t to work on
+ * @coords_length: The length of the coordinate array
+ * @design_coords: The design-space coordinates to normalize
+ * @normalized_coords: (out): The normalized coordinates
+ *
+ * Normalizes the given design-space coordinates. The minimum and maximum
+ * values for the axis are mapped to the interval [-1,1], with the default
+ * axis value mapped to 0.
+ *
+ * The normalized values have 14 bits of fixed-point sub-integer precision as per
+ * OpenType specification.
+ *
+ * Any additional scaling defined in the face's `avar` table is also
+ * applied, as described at https://docs.microsoft.com/en-us/typography/opentype/spec/avar
  *
  * Since: 1.4.2
  **/
index df89bc5..05147cc 100644 (file)
@@ -24,7 +24,7 @@
  * Red Hat Author(s): Behdad Esfahbod
  */
 
-#ifndef HB_OT_H_IN
+#if !defined(HB_OT_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb-ot.h> instead."
 #endif
 
 
 HB_BEGIN_DECLS
 
-
+/**
+ * HB_OT_TAG_VAR_AXIS_ITALIC:
+ *
+ * Registered tag for the roman/italic axis.
+ */
 #define HB_OT_TAG_VAR_AXIS_ITALIC      HB_TAG('i','t','a','l')
+
+/**
+ * HB_OT_TAG_VAR_AXIS_OPTICAL_SIZE:
+ *
+ * Registered tag for the optical-size axis.
+ * <note>Note: The optical-size axis supersedes the OpenType `size` feature.</note>
+ */
 #define HB_OT_TAG_VAR_AXIS_OPTICAL_SIZE        HB_TAG('o','p','s','z')
+
+/**
+ * HB_OT_TAG_VAR_AXIS_SLANT:
+ *
+ * Registered tag for the slant axis
+ */
 #define HB_OT_TAG_VAR_AXIS_SLANT       HB_TAG('s','l','n','t')
+
+/**
+ * HB_OT_TAG_VAR_AXIS_WIDTH:
+ *
+ * Registered tag for the width axis.
+ */
 #define HB_OT_TAG_VAR_AXIS_WIDTH       HB_TAG('w','d','t','h')
+
+/**
+ * HB_OT_TAG_VAR_AXIS_WEIGHT:
+ *
+ * Registered tag for the weight axis.
+ */
 #define HB_OT_TAG_VAR_AXIS_WEIGHT      HB_TAG('w','g','h','t')
 
 
@@ -63,21 +92,37 @@ hb_ot_var_get_axis_count (hb_face_t *face);
  * hb_ot_var_axis_flags_t:
  * @HB_OT_VAR_AXIS_FLAG_HIDDEN: The axis should not be exposed directly in user interfaces.
  *
+ * Flags for #hb_ot_var_axis_info_t.
+ *
  * Since: 2.2.0
  */
 typedef enum { /*< flags >*/
   HB_OT_VAR_AXIS_FLAG_HIDDEN   = 0x00000001u,
 
+  /*< private >*/
   _HB_OT_VAR_AXIS_FLAG_MAX_VALUE= HB_TAG_MAX_SIGNED /*< skip >*/
 } hb_ot_var_axis_flags_t;
 
 /**
  * hb_ot_var_axis_info_t:
+ * @axis_index: Index of the axis in the variation-axis array
+ * @tag: The #hb_tag_t tag identifying the design variation of the axis
+ * @name_id: The `name` table Name ID that provides display names for the axis
+ * @flags: The #hb_ot_var_axis_flags_t flags for the axis
+ * @min_value: The minimum value on the variation axis that the font covers
+ * @default_value: The position on the variation axis corresponding to the font's defaults
+ * @max_value: The maximum value on the variation axis that the font covers
+ * 
+ * Data type for holding variation-axis values.
+ *
+ * The minimum, default, and maximum values are in un-normalized, user scales.
+ *
+ * <note>Note: at present, the only flag defined for @flags is
+ * #HB_OT_VAR_AXIS_FLAG_HIDDEN.</note>
  *
  * Since: 2.2.0
  */
-typedef struct hb_ot_var_axis_info_t
-{
+typedef struct hb_ot_var_axis_info_t {
   unsigned int                 axis_index;
   hb_tag_t                     tag;
   hb_ot_name_id_t              name_id;
index c680320..811e139 100644 (file)
@@ -48,7 +48,7 @@ struct VertOriginMetric
   }
 
   public:
-  HBGlyphID    glyph;
+  HBGlyphID16  glyph;
   FWORD                vertOriginY;
 
   public:
@@ -125,7 +125,7 @@ struct VORG
   FixedVersion<>version;       /* Version of VORG table. Set to 0x00010000u. */
   FWORD                defaultVertOriginY;
                                /* The default vertical origin. */
-  SortedArrayOf<VertOriginMetric>
+  SortedArray16Of<VertOriginMetric>
                vertYOrigins;   /* The array of vertical origins. */
 
   public:
index dcf0faf..dcf8f66 100644 (file)
@@ -41,7 +41,7 @@ struct hb_pool_t
   {
     next = nullptr;
 
-    for (chunk_t *_ : chunks) ::free (_);
+    for (chunk_t *_ : chunks) hb_free (_);
 
     chunks.fini ();
   }
@@ -51,7 +51,7 @@ struct hb_pool_t
     if (unlikely (!next))
     {
       if (unlikely (!chunks.alloc (chunks.length + 1))) return nullptr;
-      chunk_t *chunk = (chunk_t *) calloc (1, sizeof (chunk_t));
+      chunk_t *chunk = (chunk_t *) hb_calloc (1, sizeof (chunk_t));
       if (unlikely (!chunk)) return nullptr;
       chunks.push (chunk);
       next = chunk->thread ();
@@ -65,7 +65,7 @@ struct hb_pool_t
     return obj;
   }
 
-  void free (T* obj)
+  void release (T* obj)
   {
     * (T**) obj = next;
     next = obj;
diff --git a/src/hb-priority-queue.hh b/src/hb-priority-queue.hh
new file mode 100644 (file)
index 0000000..7d799ae
--- /dev/null
@@ -0,0 +1,151 @@
+/*
+ * Copyright © 2020  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): Garret Rieger
+ */
+
+#ifndef HB_PRIORITY_QUEUE_HH
+#define HB_PRIORITY_QUEUE_HH
+
+#include "hb.hh"
+#include "hb-vector.hh"
+
+/*
+ * hb_priority_queue_t
+ *
+ * Priority queue implemented as a binary heap. Supports extract minimum
+ * and insert operations.
+ */
+struct hb_priority_queue_t
+{
+  HB_DELETE_COPY_ASSIGN (hb_priority_queue_t);
+  hb_priority_queue_t ()  { init (); }
+  ~hb_priority_queue_t () { fini (); }
+
+ private:
+  typedef hb_pair_t<int64_t, unsigned> item_t;
+  hb_vector_t<item_t> heap;
+
+ public:
+  void init () { heap.init (); }
+
+  void fini () { heap.fini (); }
+
+  void reset () { heap.resize (0); }
+
+  bool in_error () const { return heap.in_error (); }
+
+  void insert (int64_t priority, unsigned value)
+  {
+    heap.push (item_t (priority, value));
+    bubble_up (heap.length - 1);
+  }
+
+  item_t pop_minimum ()
+  {
+    item_t result = heap[0];
+
+    heap[0] = heap[heap.length - 1];
+    heap.shrink (heap.length - 1);
+    bubble_down (0);
+
+    return result;
+  }
+
+  const item_t& minimum ()
+  {
+    return heap[0];
+  }
+
+  bool is_empty () const { return heap.length == 0; }
+  explicit operator bool () const { return !is_empty (); }
+  unsigned int get_population () const { return heap.length; }
+
+  /* Sink interface. */
+  hb_priority_queue_t& operator << (item_t item)
+  { insert (item.first, item.second); return *this; }
+
+ private:
+
+  static constexpr unsigned parent (unsigned index)
+  {
+    return (index - 1) / 2;
+  }
+
+  static constexpr unsigned left_child (unsigned index)
+  {
+    return 2 * index + 1;
+  }
+
+  static constexpr unsigned right_child (unsigned index)
+  {
+    return 2 * index + 2;
+  }
+
+  void bubble_down (unsigned index)
+  {
+    unsigned left = left_child (index);
+    unsigned right = right_child (index);
+
+    bool has_left = left < heap.length;
+    if (!has_left)
+      // If there's no left, then there's also no right.
+      return;
+
+    bool has_right = right < heap.length;
+    if (heap[index].first <= heap[left].first
+        && (!has_right || heap[index].first <= heap[right].first))
+      return;
+
+    if (!has_right || heap[left].first < heap[right].first)
+    {
+      swap (index, left);
+      bubble_down (left);
+      return;
+    }
+
+    swap (index, right);
+    bubble_down (right);
+  }
+
+  void bubble_up (unsigned index)
+  {
+    if (index == 0) return;
+
+    unsigned parent_index = parent (index);
+    if (heap[parent_index].first <= heap[index].first)
+      return;
+
+    swap (index, parent_index);
+    bubble_up (parent_index);
+  }
+
+  void swap (unsigned a, unsigned b)
+  {
+    item_t temp = heap[a];
+    heap[a] = heap[b];
+    heap[b] = temp;
+  }
+};
+
+#endif /* HB_PRIORITY_QUEUE_HH */
diff --git a/src/hb-repacker.hh b/src/hb-repacker.hh
new file mode 100644 (file)
index 0000000..b1726d8
--- /dev/null
@@ -0,0 +1,1272 @@
+/*
+ * Copyright © 2020  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): Garret Rieger
+ */
+
+#ifndef HB_REPACKER_HH
+#define HB_REPACKER_HH
+
+#include "hb-open-type.hh"
+#include "hb-map.hh"
+#include "hb-priority-queue.hh"
+#include "hb-serialize.hh"
+#include "hb-vector.hh"
+
+/*
+ * For a detailed writeup on the overflow resolution algorithm see:
+ * docs/repacker.md
+ */
+
+struct graph_t
+{
+  struct vertex_t
+  {
+    hb_serialize_context_t::object_t obj;
+    int64_t distance = 0 ;
+    int64_t space = 0 ;
+    hb_vector_t<unsigned> parents;
+    unsigned start = 0;
+    unsigned end = 0;
+    unsigned priority = 0;
+
+    bool is_shared () const
+    {
+      return parents.length > 1;
+    }
+
+    unsigned incoming_edges () const
+    {
+      return parents.length;
+    }
+
+    void remove_parent (unsigned parent_index)
+    {
+      for (unsigned i = 0; i < parents.length; i++)
+      {
+        if (parents[i] != parent_index) continue;
+        parents.remove (i);
+        break;
+      }
+    }
+
+    void remap_parents (const hb_vector_t<unsigned>& id_map)
+    {
+      for (unsigned i = 0; i < parents.length; i++)
+        parents[i] = id_map[parents[i]];
+    }
+
+    void remap_parent (unsigned old_index, unsigned new_index)
+    {
+      for (unsigned i = 0; i < parents.length; i++)
+      {
+        if (parents[i] == old_index)
+          parents[i] = new_index;
+      }
+    }
+
+    bool is_leaf () const
+    {
+      return !obj.real_links.length && !obj.virtual_links.length;
+    }
+
+    bool raise_priority ()
+    {
+      if (has_max_priority ()) return false;
+      priority++;
+      return true;
+    }
+
+    bool has_max_priority () const {
+      return priority >= 3;
+    }
+
+    int64_t modified_distance (unsigned order) const
+    {
+      // TODO(garretrieger): once priority is high enough, should try
+      // setting distance = 0 which will force to sort immediately after
+      // it's parent where possible.
+
+      int64_t modified_distance =
+          hb_min (hb_max(distance + distance_modifier (), 0), 0x7FFFFFFFFFF);
+      if (has_max_priority ()) {
+        modified_distance = 0;
+      }
+      return (modified_distance << 18) | (0x003FFFF & order);
+    }
+
+    int64_t distance_modifier () const
+    {
+      if (!priority) return 0;
+      int64_t table_size = obj.tail - obj.head;
+
+      if (priority == 1)
+        return -table_size / 2;
+
+      return -table_size;
+    }
+  };
+
+  struct overflow_record_t
+  {
+    unsigned parent;
+    unsigned child;
+  };
+
+  /*
+   * A topological sorting of an object graph. Ordered
+   * in reverse serialization order (first object in the
+   * serialization is at the end of the list). This matches
+   * the 'packed' object stack used internally in the
+   * serializer
+   */
+  graph_t (const hb_vector_t<hb_serialize_context_t::object_t *>& objects)
+      : parents_invalid (true),
+        distance_invalid (true),
+        positions_invalid (true),
+        successful (true)
+  {
+    num_roots_for_space_.push (1);
+    bool removed_nil = false;
+    for (unsigned i = 0; i < objects.length; i++)
+    {
+      // TODO(grieger): check all links point to valid objects.
+
+      // If this graph came from a serialization buffer object 0 is the
+      // nil object. We don't need it for our purposes here so drop it.
+      if (i == 0 && !objects[i])
+      {
+        removed_nil = true;
+        continue;
+      }
+
+      vertex_t* v = vertices_.push ();
+      if (check_success (!vertices_.in_error ()))
+        v->obj = *objects[i];
+      if (!removed_nil) continue;
+      // Fix indices to account for removed nil object.
+      for (auto& l : v->obj.all_links_writer ()) {
+        l.objidx--;
+      }
+    }
+  }
+
+  ~graph_t ()
+  {
+    vertices_.fini ();
+  }
+
+  bool in_error () const
+  {
+    return !successful ||
+        vertices_.in_error () ||
+        num_roots_for_space_.in_error ();
+  }
+
+  const vertex_t& root () const
+  {
+    return vertices_[root_idx ()];
+  }
+
+  unsigned root_idx () const
+  {
+    // Object graphs are in reverse order, the first object is at the end
+    // of the vector. Since the graph is topologically sorted it's safe to
+    // assume the first object has no incoming edges.
+    return vertices_.length - 1;
+  }
+
+  const hb_serialize_context_t::object_t& object(unsigned i) const
+  {
+    return vertices_[i].obj;
+  }
+
+  /*
+   * serialize graph into the provided serialization buffer.
+   */
+  hb_blob_t* serialize () const
+  {
+    hb_vector_t<char> buffer;
+    size_t size = serialized_length ();
+    if (!buffer.alloc (size)) {
+      DEBUG_MSG (SUBSET_REPACK, nullptr, "Unable to allocate output buffer.");
+      return nullptr;
+    }
+    hb_serialize_context_t c((void *) buffer, size);
+
+    c.start_serialize<void> ();
+    for (unsigned i = 0; i < vertices_.length; i++) {
+      c.push ();
+
+      size_t size = vertices_[i].obj.tail - vertices_[i].obj.head;
+      char* start = c.allocate_size <char> (size);
+      if (!start) {
+        DEBUG_MSG (SUBSET_REPACK, nullptr, "Buffer out of space.");
+        return nullptr;
+      }
+
+      memcpy (start, vertices_[i].obj.head, size);
+
+      // Only real links needs to be serialized.
+      for (const auto& link : vertices_[i].obj.real_links)
+        serialize_link (link, start, &c);
+
+      // All duplications are already encoded in the graph, so don't
+      // enable sharing during packing.
+      c.pop_pack (false);
+    }
+    c.end_serialize ();
+
+    if (c.in_error ()) {
+      DEBUG_MSG (SUBSET_REPACK, nullptr, "Error during serialization. Err flag: %d",
+                 c.errors);
+      return nullptr;
+    }
+
+    return c.copy_blob ();
+  }
+
+  /*
+   * Generates a new topological sorting of graph using Kahn's
+   * algorithm: https://en.wikipedia.org/wiki/Topological_sorting#Algorithms
+   */
+  void sort_kahn ()
+  {
+    positions_invalid = true;
+
+    if (vertices_.length <= 1) {
+      // Graph of 1 or less doesn't need sorting.
+      return;
+    }
+
+    hb_vector_t<unsigned> queue;
+    hb_vector_t<vertex_t> sorted_graph;
+    if (unlikely (!check_success (sorted_graph.resize (vertices_.length)))) return;
+    hb_vector_t<unsigned> id_map;
+    if (unlikely (!check_success (id_map.resize (vertices_.length)))) return;
+
+    hb_vector_t<unsigned> removed_edges;
+    if (unlikely (!check_success (removed_edges.resize (vertices_.length)))) return;
+    update_parents ();
+
+    queue.push (root_idx ());
+    int new_id = vertices_.length - 1;
+
+    while (!queue.in_error () && queue.length)
+    {
+      unsigned next_id = queue[0];
+      queue.remove (0);
+
+      vertex_t& next = vertices_[next_id];
+      sorted_graph[new_id] = next;
+      id_map[next_id] = new_id--;
+
+      for (const auto& link : next.obj.all_links ()) {
+        removed_edges[link.objidx]++;
+        if (!(vertices_[link.objidx].incoming_edges () - removed_edges[link.objidx]))
+          queue.push (link.objidx);
+      }
+    }
+
+    check_success (!queue.in_error ());
+    check_success (!sorted_graph.in_error ());
+    if (!check_success (new_id == -1))
+      print_orphaned_nodes ();
+
+    remap_all_obj_indices (id_map, &sorted_graph);
+
+    hb_swap (vertices_, sorted_graph);
+    sorted_graph.fini ();
+  }
+
+  /*
+   * Generates a new topological sorting of graph ordered by the shortest
+   * distance to each node.
+   */
+  void sort_shortest_distance ()
+  {
+    positions_invalid = true;
+
+    if (vertices_.length <= 1) {
+      // Graph of 1 or less doesn't need sorting.
+      return;
+    }
+
+    update_distances ();
+
+    hb_priority_queue_t queue;
+    hb_vector_t<vertex_t> sorted_graph;
+    if (unlikely (!check_success (sorted_graph.resize (vertices_.length)))) return;
+    hb_vector_t<unsigned> id_map;
+    if (unlikely (!check_success (id_map.resize (vertices_.length)))) return;
+
+    hb_vector_t<unsigned> removed_edges;
+    if (unlikely (!check_success (removed_edges.resize (vertices_.length)))) return;
+    update_parents ();
+
+    queue.insert (root ().modified_distance (0), root_idx ());
+    int new_id = root_idx ();
+    unsigned order = 1;
+    while (!queue.in_error () && !queue.is_empty ())
+    {
+      unsigned next_id = queue.pop_minimum().second;
+
+      vertex_t& next = vertices_[next_id];
+      sorted_graph[new_id] = next;
+      id_map[next_id] = new_id--;
+
+      for (const auto& link : next.obj.all_links ()) {
+        removed_edges[link.objidx]++;
+        if (!(vertices_[link.objidx].incoming_edges () - removed_edges[link.objidx]))
+          // Add the order that the links were encountered to the priority.
+          // This ensures that ties between priorities objects are broken in a consistent
+          // way. More specifically this is set up so that if a set of objects have the same
+          // distance they'll be added to the topological order in the order that they are
+          // referenced from the parent object.
+          queue.insert (vertices_[link.objidx].modified_distance (order++),
+                        link.objidx);
+      }
+    }
+
+    check_success (!queue.in_error ());
+    check_success (!sorted_graph.in_error ());
+    if (!check_success (new_id == -1))
+      print_orphaned_nodes ();
+
+    remap_all_obj_indices (id_map, &sorted_graph);
+
+    hb_swap (vertices_, sorted_graph);
+    sorted_graph.fini ();
+  }
+
+  /*
+   * Assign unique space numbers to each connected subgraph of 32 bit offset(s).
+   */
+  bool assign_32bit_spaces ()
+  {
+    unsigned root_index = root_idx ();
+    hb_set_t visited;
+    hb_set_t roots;
+    for (unsigned i = 0; i <= root_index; i++)
+    {
+      // Only real links can form 32 bit spaces
+      for (auto& l : vertices_[i].obj.real_links)
+      {
+        if (l.width == 4 && !l.is_signed)
+        {
+          roots.add (l.objidx);
+          find_subgraph (l.objidx, visited);
+        }
+      }
+    }
+
+    // Mark everything not in the subgraphs of 32 bit roots as visited.
+    // This prevents 32 bit subgraphs from being connected via nodes not in the 32 bit subgraphs.
+    visited.invert ();
+
+    if (!roots) return false;
+
+    while (roots)
+    {
+      unsigned next = HB_SET_VALUE_INVALID;
+      if (unlikely (!check_success (!roots.in_error ()))) break;
+      if (!roots.next (&next)) break;
+
+      hb_set_t connected_roots;
+      find_connected_nodes (next, roots, visited, connected_roots);
+      if (unlikely (!check_success (!connected_roots.in_error ()))) break;
+
+      isolate_subgraph (connected_roots);
+      if (unlikely (!check_success (!connected_roots.in_error ()))) break;
+
+      unsigned next_space = this->next_space ();
+      num_roots_for_space_.push (0);
+      for (unsigned root : connected_roots)
+      {
+        DEBUG_MSG (SUBSET_REPACK, nullptr, "Subgraph %u gets space %u", root, next_space);
+        vertices_[root].space = next_space;
+        num_roots_for_space_[next_space] = num_roots_for_space_[next_space] + 1;
+        distance_invalid = true;
+        positions_invalid = true;
+      }
+
+      // TODO(grieger): special case for GSUB/GPOS use extension promotions to move 16 bit space
+      //                into the 32 bit space as needed, instead of using isolation.
+    }
+
+
+
+    return true;
+  }
+
+  /*
+   * Isolates the subgraph of nodes reachable from root. Any links to nodes in the subgraph
+   * that originate from outside of the subgraph will be removed by duplicating the linked to
+   * object.
+   *
+   * Indices stored in roots will be updated if any of the roots are duplicated to new indices.
+   */
+  bool isolate_subgraph (hb_set_t& roots)
+  {
+    update_parents ();
+    hb_hashmap_t<unsigned, unsigned> subgraph;
+
+    // incoming edges to root_idx should be all 32 bit in length so we don't need to de-dup these
+    // set the subgraph incoming edge count to match all of root_idx's incoming edges
+    hb_set_t parents;
+    for (unsigned root_idx : roots)
+    {
+      subgraph.set (root_idx, wide_parents (root_idx, parents));
+      find_subgraph (root_idx, subgraph);
+    }
+
+    unsigned original_root_idx = root_idx ();
+    hb_hashmap_t<unsigned, unsigned> index_map;
+    bool made_changes = false;
+    for (auto entry : subgraph.iter ())
+    {
+      const auto& node = vertices_[entry.first];
+      unsigned subgraph_incoming_edges = entry.second;
+
+      if (subgraph_incoming_edges < node.incoming_edges ())
+      {
+        // Only  de-dup objects with incoming links from outside the subgraph.
+        made_changes = true;
+        duplicate_subgraph (entry.first, index_map);
+      }
+    }
+
+    if (!made_changes)
+      return false;
+
+    if (original_root_idx != root_idx ()
+        && parents.has (original_root_idx))
+    {
+      // If the root idx has changed since parents was determined, update root idx in parents
+      parents.add (root_idx ());
+      parents.del (original_root_idx);
+    }
+
+    auto new_subgraph =
+        + subgraph.keys ()
+        | hb_map([&] (unsigned node_idx) {
+          if (index_map.has (node_idx)) return index_map[node_idx];
+          return node_idx;
+        })
+        ;
+
+    remap_obj_indices (index_map, new_subgraph);
+    remap_obj_indices (index_map, parents.iter (), true);
+
+    // Update roots set with new indices as needed.
+    unsigned next = HB_SET_VALUE_INVALID;
+    while (roots.next (&next))
+    {
+      if (index_map.has (next))
+      {
+        roots.del (next);
+        roots.add (index_map[next]);
+      }
+    }
+
+    return true;
+  }
+
+  void find_subgraph (unsigned node_idx, hb_hashmap_t<unsigned, unsigned>& subgraph)
+  {
+    for (const auto& link : vertices_[node_idx].obj.all_links ())
+    {
+      if (subgraph.has (link.objidx))
+      {
+        subgraph.set (link.objidx, subgraph[link.objidx] + 1);
+        continue;
+      }
+      subgraph.set (link.objidx, 1);
+      find_subgraph (link.objidx, subgraph);
+    }
+  }
+
+  void find_subgraph (unsigned node_idx, hb_set_t& subgraph)
+  {
+    if (subgraph.has (node_idx)) return;
+    subgraph.add (node_idx);
+    for (const auto& link : vertices_[node_idx].obj.all_links ())
+      find_subgraph (link.objidx, subgraph);
+  }
+
+  /*
+   * duplicates all nodes in the subgraph reachable from node_idx. Does not re-assign
+   * links. index_map is updated with mappings from old id to new id. If a duplication has already
+   * been performed for a given index, then it will be skipped.
+   */
+  void duplicate_subgraph (unsigned node_idx, hb_hashmap_t<unsigned, unsigned>& index_map)
+  {
+    if (index_map.has (node_idx))
+      return;
+
+    index_map.set (node_idx, duplicate (node_idx));
+    for (const auto& l : object (node_idx).all_links ()) {
+      duplicate_subgraph (l.objidx, index_map);
+    }
+  }
+
+  /*
+   * Creates a copy of node_idx and returns it's new index.
+   */
+  unsigned duplicate (unsigned node_idx)
+  {
+    positions_invalid = true;
+    distance_invalid = true;
+
+    auto* clone = vertices_.push ();
+    auto& child = vertices_[node_idx];
+    if (vertices_.in_error ()) {
+      return -1;
+    }
+
+    clone->obj.head = child.obj.head;
+    clone->obj.tail = child.obj.tail;
+    clone->distance = child.distance;
+    clone->space = child.space;
+    clone->parents.reset ();
+
+    unsigned clone_idx = vertices_.length - 2;
+    for (const auto& l : child.obj.real_links)
+    {
+      clone->obj.real_links.push (l);
+      vertices_[l.objidx].parents.push (clone_idx);
+    }
+    for (const auto& l : child.obj.virtual_links)
+    {
+      clone->obj.virtual_links.push (l);
+      vertices_[l.objidx].parents.push (clone_idx);
+    }
+
+    check_success (!clone->obj.real_links.in_error ());
+    check_success (!clone->obj.virtual_links.in_error ());
+
+    // The last object is the root of the graph, so swap back the root to the end.
+    // The root's obj idx does change, however since it's root nothing else refers to it.
+    // all other obj idx's will be unaffected.
+    vertex_t root = vertices_[vertices_.length - 2];
+    vertices_[clone_idx] = *clone;
+    vertices_[vertices_.length - 1] = root;
+
+    // Since the root moved, update the parents arrays of all children on the root.
+    for (const auto& l : root.obj.all_links ())
+      vertices_[l.objidx].remap_parent (root_idx () - 1, root_idx ());
+
+    return clone_idx;
+  }
+
+  /*
+   * Creates a copy of child and re-assigns the link from
+   * parent to the clone. The copy is a shallow copy, objects
+   * linked from child are not duplicated.
+   */
+  bool duplicate (unsigned parent_idx, unsigned child_idx)
+  {
+    update_parents ();
+
+    unsigned links_to_child = 0;
+    for (const auto& l : vertices_[parent_idx].obj.all_links ())
+    {
+      if (l.objidx == child_idx) links_to_child++;
+    }
+
+    if (vertices_[child_idx].incoming_edges () <= links_to_child)
+    {
+      // Can't duplicate this node, doing so would orphan the original one as all remaining links
+      // to child are from parent.
+      DEBUG_MSG (SUBSET_REPACK, nullptr, "  Not duplicating %d => %d",
+                 parent_idx, child_idx);
+      return false;
+    }
+
+    DEBUG_MSG (SUBSET_REPACK, nullptr, "  Duplicating %d => %d",
+               parent_idx, child_idx);
+
+    unsigned clone_idx = duplicate (child_idx);
+    if (clone_idx == (unsigned) -1) return false;
+    // duplicate shifts the root node idx, so if parent_idx was root update it.
+    if (parent_idx == clone_idx) parent_idx++;
+
+    auto& parent = vertices_[parent_idx];
+    for (auto& l : parent.obj.all_links_writer ())
+    {
+      if (l.objidx != child_idx)
+        continue;
+
+      reassign_link (l, parent_idx, clone_idx);
+    }
+
+    return true;
+  }
+
+  /*
+   * Raises the sorting priority of all children.
+   */
+  bool raise_childrens_priority (unsigned parent_idx)
+  {
+    DEBUG_MSG (SUBSET_REPACK, nullptr, "  Raising priority of all children of %d",
+               parent_idx);
+    // This operation doesn't change ordering until a sort is run, so no need
+    // to invalidate positions. It does not change graph structure so no need
+    // to update distances or edge counts.
+    auto& parent = vertices_[parent_idx].obj;
+    bool made_change = false;
+    for (auto& l : parent.all_links_writer ())
+      made_change |= vertices_[l.objidx].raise_priority ();
+    return made_change;
+  }
+
+  /*
+   * Will any offsets overflow on graph when it's serialized?
+   */
+  bool will_overflow (hb_vector_t<overflow_record_t>* overflows = nullptr)
+  {
+    if (overflows) overflows->resize (0);
+    update_positions ();
+
+    for (int parent_idx = vertices_.length - 1; parent_idx >= 0; parent_idx--)
+    {
+      // Don't need to check virtual links for overflow
+      for (const auto& link : vertices_[parent_idx].obj.real_links)
+      {
+        int64_t offset = compute_offset (parent_idx, link);
+        if (is_valid_offset (offset, link))
+          continue;
+
+        if (!overflows) return true;
+
+        overflow_record_t r;
+        r.parent = parent_idx;
+        r.child = link.objidx;
+        overflows->push (r);
+      }
+    }
+
+    if (!overflows) return false;
+    return overflows->length;
+  }
+
+  void print_orphaned_nodes ()
+  {
+    if (!DEBUG_ENABLED(SUBSET_REPACK)) return;
+
+    DEBUG_MSG (SUBSET_REPACK, nullptr, "Graph is not fully connected.");
+    parents_invalid = true;
+    update_parents();
+
+    for (unsigned i = 0; i < root_idx (); i++)
+    {
+      const auto& v = vertices_[i];
+      if (!v.parents)
+        DEBUG_MSG (SUBSET_REPACK, nullptr, "Node %u is orphaned.", i);
+    }
+  }
+
+  void print_overflows (const hb_vector_t<overflow_record_t>& overflows)
+  {
+    if (!DEBUG_ENABLED(SUBSET_REPACK)) return;
+
+    update_parents ();
+    int limit = 10;
+    for (const auto& o : overflows)
+    {
+      if (!limit--) break;
+      const auto& parent = vertices_[o.parent];
+      const auto& child = vertices_[o.child];
+      DEBUG_MSG (SUBSET_REPACK, nullptr,
+                 "  overflow from "
+                 "%4d (%4d in, %4d out, space %2d) => "
+                 "%4d (%4d in, %4d out, space %2d)",
+                 o.parent,
+                 parent.incoming_edges (),
+                 parent.obj.real_links.length + parent.obj.virtual_links.length,
+                 space_for (o.parent),
+                 o.child,
+                 child.incoming_edges (),
+                 child.obj.real_links.length + child.obj.virtual_links.length,
+                 space_for (o.child));
+    }
+    if (overflows.length > 10) {
+      DEBUG_MSG (SUBSET_REPACK, nullptr, "  ... plus %d more overflows.", overflows.length - 10);
+    }
+  }
+
+  unsigned num_roots_for_space (unsigned space) const
+  {
+    return num_roots_for_space_[space];
+  }
+
+  unsigned next_space () const
+  {
+    return num_roots_for_space_.length;
+  }
+
+  void move_to_new_space (const hb_set_t& indices)
+  {
+    num_roots_for_space_.push (0);
+    unsigned new_space = num_roots_for_space_.length - 1;
+
+    for (unsigned index : indices) {
+      auto& node = vertices_[index];
+      num_roots_for_space_[node.space] = num_roots_for_space_[node.space] - 1;
+      num_roots_for_space_[new_space] = num_roots_for_space_[new_space] + 1;
+      node.space = new_space;
+      distance_invalid = true;
+      positions_invalid = true;
+    }
+  }
+
+  unsigned space_for (unsigned index, unsigned* root = nullptr) const
+  {
+    const auto& node = vertices_[index];
+    if (node.space)
+    {
+      if (root != nullptr)
+        *root = index;
+      return node.space;
+    }
+
+    if (!node.parents)
+    {
+      if (root)
+        *root = index;
+      return 0;
+    }
+
+    return space_for (node.parents[0], root);
+  }
+
+  void err_other_error () { this->successful = false; }
+
+ private:
+
+  size_t serialized_length () const {
+    size_t total_size = 0;
+    for (unsigned i = 0; i < vertices_.length; i++) {
+      size_t size = vertices_[i].obj.tail - vertices_[i].obj.head;
+      total_size += size;
+    }
+    return total_size;
+  }
+
+  /*
+   * Returns the numbers of incoming edges that are 32bits wide.
+   */
+  unsigned wide_parents (unsigned node_idx, hb_set_t& parents) const
+  {
+    unsigned count = 0;
+    hb_set_t visited;
+    for (unsigned p : vertices_[node_idx].parents)
+    {
+      if (visited.has (p)) continue;
+      visited.add (p);
+
+      // Only real links can be wide
+      for (const auto& l : vertices_[p].obj.real_links)
+      {
+        if (l.objidx == node_idx && l.width == 4 && !l.is_signed)
+        {
+          count++;
+          parents.add (p);
+        }
+      }
+    }
+    return count;
+  }
+
+  bool check_success (bool success)
+  { return this->successful && (success || (err_other_error (), false)); }
+
+  /*
+   * Creates a map from objid to # of incoming edges.
+   */
+  void update_parents ()
+  {
+    if (!parents_invalid) return;
+
+    for (unsigned i = 0; i < vertices_.length; i++)
+      vertices_[i].parents.reset ();
+
+    for (unsigned p = 0; p < vertices_.length; p++)
+    {
+      for (auto& l : vertices_[p].obj.all_links ())
+      {
+        vertices_[l.objidx].parents.push (p);
+      }
+    }
+
+    parents_invalid = false;
+  }
+
+  /*
+   * compute the serialized start and end positions for each vertex.
+   */
+  void update_positions ()
+  {
+    if (!positions_invalid) return;
+
+    unsigned current_pos = 0;
+    for (int i = root_idx (); i >= 0; i--)
+    {
+      auto& v = vertices_[i];
+      v.start = current_pos;
+      current_pos += v.obj.tail - v.obj.head;
+      v.end = current_pos;
+    }
+
+    positions_invalid = false;
+  }
+
+  /*
+   * Finds the distance to each object in the graph
+   * from the initial node.
+   */
+  void update_distances ()
+  {
+    if (!distance_invalid) return;
+
+    // Uses Dijkstra's algorithm to find all of the shortest distances.
+    // https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm
+    //
+    // Implementation Note:
+    // Since our priority queue doesn't support fast priority decreases
+    // we instead just add new entries into the queue when a priority changes.
+    // Redundant ones are filtered out later on by the visited set.
+    // According to https://www3.cs.stonybrook.edu/~rezaul/papers/TR-07-54.pdf
+    // for practical performance this is faster then using a more advanced queue
+    // (such as a fibonacci queue) with a fast decrease priority.
+    for (unsigned i = 0; i < vertices_.length; i++)
+    {
+      if (i == vertices_.length - 1)
+        vertices_[i].distance = 0;
+      else
+        vertices_[i].distance = hb_int_max (int64_t);
+    }
+
+    hb_priority_queue_t queue;
+    queue.insert (0, vertices_.length - 1);
+
+    hb_vector_t<bool> visited;
+    visited.resize (vertices_.length);
+
+    while (!queue.in_error () && !queue.is_empty ())
+    {
+      unsigned next_idx = queue.pop_minimum ().second;
+      if (visited[next_idx]) continue;
+      const auto& next = vertices_[next_idx];
+      int64_t next_distance = vertices_[next_idx].distance;
+      visited[next_idx] = true;
+
+      for (const auto& link : next.obj.all_links ())
+      {
+        if (visited[link.objidx]) continue;
+
+        const auto& child = vertices_[link.objidx].obj;
+        unsigned link_width = link.width ? link.width : 4; // treat virtual offsets as 32 bits wide
+        int64_t child_weight = (child.tail - child.head) +
+                               ((int64_t) 1 << (link_width * 8)) * (vertices_[link.objidx].space + 1);
+        int64_t child_distance = next_distance + child_weight;
+
+        if (child_distance < vertices_[link.objidx].distance)
+        {
+          vertices_[link.objidx].distance = child_distance;
+          queue.insert (child_distance, link.objidx);
+        }
+      }
+    }
+
+    check_success (!queue.in_error ());
+    if (!check_success (queue.is_empty ()))
+    {
+      print_orphaned_nodes ();
+      return;
+    }
+
+    distance_invalid = false;
+  }
+
+  int64_t compute_offset (
+      unsigned parent_idx,
+      const hb_serialize_context_t::object_t::link_t& link) const
+  {
+    const auto& parent = vertices_[parent_idx];
+    const auto& child = vertices_[link.objidx];
+    int64_t offset = 0;
+    switch ((hb_serialize_context_t::whence_t) link.whence) {
+      case hb_serialize_context_t::whence_t::Head:
+        offset = child.start - parent.start; break;
+      case hb_serialize_context_t::whence_t::Tail:
+        offset = child.start - parent.end; break;
+      case hb_serialize_context_t::whence_t::Absolute:
+        offset = child.start; break;
+    }
+
+    assert (offset >= link.bias);
+    offset -= link.bias;
+    return offset;
+  }
+
+  bool is_valid_offset (int64_t offset,
+                        const hb_serialize_context_t::object_t::link_t& link) const
+  {
+    if (unlikely (!link.width))
+      // Virtual links can't overflow.
+      return link.is_signed || offset >= 0;
+
+    if (link.is_signed)
+    {
+      if (link.width == 4)
+        return offset >= -((int64_t) 1 << 31) && offset < ((int64_t) 1 << 31);
+      else
+        return offset >= -(1 << 15) && offset < (1 << 15);
+    }
+    else
+    {
+      if (link.width == 4)
+        return offset >= 0 && offset < ((int64_t) 1 << 32);
+      else if (link.width == 3)
+        return offset >= 0 && offset < ((int32_t) 1 << 24);
+      else
+        return offset >= 0 && offset < (1 << 16);
+    }
+  }
+
+  /*
+   * Updates a link in the graph to point to a different object. Corrects the
+   * parents vector on the previous and new child nodes.
+   */
+  void reassign_link (hb_serialize_context_t::object_t::link_t& link,
+                      unsigned parent_idx,
+                      unsigned new_idx)
+  {
+    unsigned old_idx = link.objidx;
+    link.objidx = new_idx;
+    vertices_[old_idx].remove_parent (parent_idx);
+    vertices_[new_idx].parents.push (parent_idx);
+  }
+
+  /*
+   * Updates all objidx's in all links using the provided mapping. Corrects incoming edge counts.
+   */
+  template<typename Iterator, hb_requires (hb_is_iterator (Iterator))>
+  void remap_obj_indices (const hb_hashmap_t<unsigned, unsigned>& id_map,
+                          Iterator subgraph,
+                          bool only_wide = false)
+  {
+    if (!id_map) return;
+    for (unsigned i : subgraph)
+    {
+      for (auto& link : vertices_[i].obj.all_links_writer ())
+      {
+        if (!id_map.has (link.objidx)) continue;
+        if (only_wide && !(link.width == 4 && !link.is_signed)) continue;
+
+        reassign_link (link, i, id_map[link.objidx]);
+      }
+    }
+  }
+
+  /*
+   * Updates all objidx's in all links using the provided mapping.
+   */
+  void remap_all_obj_indices (const hb_vector_t<unsigned>& id_map,
+                              hb_vector_t<vertex_t>* sorted_graph) const
+  {
+    for (unsigned i = 0; i < sorted_graph->length; i++)
+    {
+      (*sorted_graph)[i].remap_parents (id_map);
+      for (auto& link : (*sorted_graph)[i].obj.all_links_writer ())
+      {
+        link.objidx = id_map[link.objidx];
+      }
+    }
+  }
+
+  template <typename O> void
+  serialize_link_of_type (const hb_serialize_context_t::object_t::link_t& link,
+                          char* head,
+                          hb_serialize_context_t* c) const
+  {
+    OT::Offset<O>* offset = reinterpret_cast<OT::Offset<O>*> (head + link.position);
+    *offset = 0;
+    c->add_link (*offset,
+                 // serializer has an extra nil object at the start of the
+                 // object array. So all id's are +1 of what our id's are.
+                 link.objidx + 1,
+                 (hb_serialize_context_t::whence_t) link.whence,
+                 link.bias);
+  }
+
+  void serialize_link (const hb_serialize_context_t::object_t::link_t& link,
+                 char* head,
+                 hb_serialize_context_t* c) const
+  {
+    switch (link.width)
+    {
+    case 0:
+      // Virtual links aren't serialized.
+      return;
+    case 4:
+      if (link.is_signed)
+      {
+        serialize_link_of_type<OT::HBINT32> (link, head, c);
+      } else {
+        serialize_link_of_type<OT::HBUINT32> (link, head, c);
+      }
+      return;
+    case 2:
+      if (link.is_signed)
+      {
+        serialize_link_of_type<OT::HBINT16> (link, head, c);
+      } else {
+        serialize_link_of_type<OT::HBUINT16> (link, head, c);
+      }
+      return;
+    case 3:
+      serialize_link_of_type<OT::HBUINT24> (link, head, c);
+      return;
+    default:
+      // Unexpected link width.
+      assert (0);
+    }
+  }
+
+  /*
+   * Finds all nodes in targets that are reachable from start_idx, nodes in visited will be skipped.
+   * For this search the graph is treated as being undirected.
+   *
+   * Connected targets will be added to connected and removed from targets. All visited nodes
+   * will be added to visited.
+   */
+  void find_connected_nodes (unsigned start_idx,
+                             hb_set_t& targets,
+                             hb_set_t& visited,
+                             hb_set_t& connected)
+  {
+    if (unlikely (!check_success (!visited.in_error ()))) return;
+    if (visited.has (start_idx)) return;
+    visited.add (start_idx);
+
+    if (targets.has (start_idx))
+    {
+      targets.del (start_idx);
+      connected.add (start_idx);
+    }
+
+    const auto& v = vertices_[start_idx];
+
+    // Graph is treated as undirected so search children and parents of start_idx
+    for (const auto& l : v.obj.all_links ())
+      find_connected_nodes (l.objidx, targets, visited, connected);
+
+    for (unsigned p : v.parents)
+      find_connected_nodes (p, targets, visited, connected);
+  }
+
+ public:
+  // TODO(garretrieger): make private, will need to move most of offset overflow code into graph.
+  hb_vector_t<vertex_t> vertices_;
+ private:
+  bool parents_invalid;
+  bool distance_invalid;
+  bool positions_invalid;
+  bool successful;
+  hb_vector_t<unsigned> num_roots_for_space_;
+};
+
+static bool _try_isolating_subgraphs (const hb_vector_t<graph_t::overflow_record_t>& overflows,
+                                      graph_t& sorted_graph)
+{
+  unsigned space = 0;
+  hb_set_t roots_to_isolate;
+
+  for (int i = overflows.length - 1; i >= 0; i--)
+  {
+    const graph_t::overflow_record_t& r = overflows[i];
+
+    unsigned root;
+    unsigned overflow_space = sorted_graph.space_for (r.parent, &root);
+    if (!overflow_space) continue;
+    if (sorted_graph.num_roots_for_space (overflow_space) <= 1) continue;
+
+    if (!space) {
+      space = overflow_space;
+    }
+
+    if (space == overflow_space)
+      roots_to_isolate.add(root);
+  }
+
+  if (!roots_to_isolate) return false;
+
+  unsigned maximum_to_move = hb_max ((sorted_graph.num_roots_for_space (space) / 2u), 1u);
+  if (roots_to_isolate.get_population () > maximum_to_move) {
+    // Only move at most half of the roots in a space at a time.
+    unsigned extra = roots_to_isolate.get_population () - maximum_to_move;
+    while (extra--) {
+      unsigned root = HB_SET_VALUE_INVALID;
+      roots_to_isolate.previous (&root);
+      roots_to_isolate.del (root);
+    }
+  }
+
+  DEBUG_MSG (SUBSET_REPACK, nullptr,
+             "Overflow in space %d (%d roots). Moving %d roots to space %d.",
+             space,
+             sorted_graph.num_roots_for_space (space),
+             roots_to_isolate.get_population (),
+             sorted_graph.next_space ());
+
+  sorted_graph.isolate_subgraph (roots_to_isolate);
+  sorted_graph.move_to_new_space (roots_to_isolate);
+
+  return true;
+}
+
+static bool _process_overflows (const hb_vector_t<graph_t::overflow_record_t>& overflows,
+                                hb_set_t& priority_bumped_parents,
+                                graph_t& sorted_graph)
+{
+  bool resolution_attempted = false;
+
+  // Try resolving the furthest overflows first.
+  for (int i = overflows.length - 1; i >= 0; i--)
+  {
+    const graph_t::overflow_record_t& r = overflows[i];
+    const auto& child = sorted_graph.vertices_[r.child];
+    if (child.is_shared ())
+    {
+      // The child object is shared, we may be able to eliminate the overflow
+      // by duplicating it.
+      if (!sorted_graph.duplicate (r.parent, r.child)) continue;
+      return true;
+    }
+
+    if (child.is_leaf () && !priority_bumped_parents.has (r.parent))
+    {
+      // This object is too far from it's parent, attempt to move it closer.
+      //
+      // TODO(garretrieger): initially limiting this to leaf's since they can be
+      //                     moved closer with fewer consequences. However, this can
+      //                     likely can be used for non-leafs as well.
+      // TODO(garretrieger): also try lowering priority of the parent. Make it
+      //                     get placed further up in the ordering, closer to it's children.
+      //                     this is probably preferable if the total size of the parent object
+      //                     is < then the total size of the children (and the parent can be moved).
+      //                     Since in that case moving the parent will cause a smaller increase in
+      //                     the length of other offsets.
+      if (sorted_graph.raise_childrens_priority (r.parent)) {
+        priority_bumped_parents.add (r.parent);
+        resolution_attempted = true;
+      }
+      continue;
+    }
+
+    // TODO(garretrieger): add additional offset resolution strategies
+    // - Promotion to extension lookups.
+    // - Table splitting.
+  }
+
+  return resolution_attempted;
+}
+
+/*
+ * Attempts to modify the topological sorting of the provided object graph to
+ * eliminate offset overflows in the links between objects of the graph. If a
+ * non-overflowing ordering is found the updated graph is serialized it into the
+ * provided serialization context.
+ *
+ * If necessary the structure of the graph may be modified in ways that do not
+ * affect the functionality of the graph. For example shared objects may be
+ * duplicated.
+ *
+ * For a detailed writeup describing how the algorithm operates see:
+ * docs/repacker.md
+ */
+inline hb_blob_t*
+hb_resolve_overflows (const hb_vector_t<hb_serialize_context_t::object_t *>& packed,
+                      hb_tag_t table_tag,
+                      unsigned max_rounds = 20) {
+  // Kahn sort is ~twice as fast as shortest distance sort and works for many fonts
+  // so try it first to save time.
+  graph_t sorted_graph (packed);
+  sorted_graph.sort_kahn ();
+  if (!sorted_graph.will_overflow ())
+  {
+    return sorted_graph.serialize ();
+  }
+
+  sorted_graph.sort_shortest_distance ();
+
+  if ((table_tag == HB_OT_TAG_GPOS
+       ||  table_tag == HB_OT_TAG_GSUB)
+      && sorted_graph.will_overflow ())
+  {
+    DEBUG_MSG (SUBSET_REPACK, nullptr, "Assigning spaces to 32 bit subgraphs.");
+    if (sorted_graph.assign_32bit_spaces ())
+      sorted_graph.sort_shortest_distance ();
+  }
+
+  unsigned round = 0;
+  hb_vector_t<graph_t::overflow_record_t> overflows;
+  // TODO(garretrieger): select a good limit for max rounds.
+  while (!sorted_graph.in_error ()
+         && sorted_graph.will_overflow (&overflows)
+         && round++ < max_rounds) {
+    DEBUG_MSG (SUBSET_REPACK, nullptr, "=== Overflow resolution round %d ===", round);
+    sorted_graph.print_overflows (overflows);
+
+    hb_set_t priority_bumped_parents;
+
+    if (!_try_isolating_subgraphs (overflows, sorted_graph))
+    {
+      if (!_process_overflows (overflows, priority_bumped_parents, sorted_graph))
+      {
+        DEBUG_MSG (SUBSET_REPACK, nullptr, "No resolution available :(");
+        break;
+      }
+    }
+
+    sorted_graph.sort_shortest_distance ();
+  }
+
+  if (sorted_graph.in_error ())
+  {
+    DEBUG_MSG (SUBSET_REPACK, nullptr, "Sorted graph in error state.");
+    return nullptr;
+  }
+
+  if (sorted_graph.will_overflow ())
+  {
+    DEBUG_MSG (SUBSET_REPACK, nullptr, "Offset overflow resolution failed.");
+    return nullptr;
+  }
+
+  return sorted_graph.serialize ();
+}
+
+#endif /* HB_REPACKER_HH */
index 091b301..65c2772 100644 (file)
@@ -73,7 +73,7 @@
  * === The sanitize() contract ===
  *
  * The sanitize() method of each object type shall return true if it's safe to
- * call other methods of the object, and false otherwise.
+ * call other methods of the object, and %false otherwise.
  *
  * Note that what sanitize() checks for might align with what the specification
  * describes as valid table data, but does not have to be.  In particular, we
 #define HB_SANITIZE_MAX_EDITS 32
 #endif
 #ifndef HB_SANITIZE_MAX_OPS_FACTOR
-#define HB_SANITIZE_MAX_OPS_FACTOR 8
+#define HB_SANITIZE_MAX_OPS_FACTOR 64
 #endif
 #ifndef HB_SANITIZE_MAX_OPS_MIN
 #define HB_SANITIZE_MAX_OPS_MIN 16384
 #ifndef HB_SANITIZE_MAX_OPS_MAX
 #define HB_SANITIZE_MAX_OPS_MAX 0x3FFFFFFF
 #endif
-#ifndef HB_SANITIZE_MAX_SUTABLES
-#define HB_SANITIZE_MAX_SUTABLES 0x4000
+#ifndef HB_SANITIZE_MAX_SUBTABLES
+#define HB_SANITIZE_MAX_SUBTABLES 0x4000
 #endif
 
 struct hb_sanitize_context_t :
        hb_dispatch_context_t<hb_sanitize_context_t, bool, HB_DEBUG_SANITIZE>
 {
   hb_sanitize_context_t () :
-       debug_depth (0),
        start (nullptr), end (nullptr),
        max_ops (0), max_subtables (0),
+        recursion_depth (0),
        writable (false), edit_count (0),
        blob (nullptr),
        num_glyphs (65536),
@@ -140,20 +140,20 @@ struct hb_sanitize_context_t :
   bool visit_subtables (unsigned count)
   {
     max_subtables += count;
-    return max_subtables < HB_SANITIZE_MAX_SUTABLES;
+    return max_subtables < HB_SANITIZE_MAX_SUBTABLES;
   }
 
   private:
   template <typename T, typename ...Ts> auto
   _dispatch (const T &obj, hb_priority<1>, Ts&&... ds) HB_AUTO_RETURN
-  ( obj.sanitize (this, hb_forward<Ts> (ds)...) )
+  ( obj.sanitize (this, std::forward<Ts> (ds)...) )
   template <typename T, typename ...Ts> auto
   _dispatch (const T &obj, hb_priority<0>, Ts&&... ds) HB_AUTO_RETURN
-  ( obj.dispatch (this, hb_forward<Ts> (ds)...) )
+  ( obj.dispatch (this, std::forward<Ts> (ds)...) )
   public:
   template <typename T, typename ...Ts> auto
   dispatch (const T &obj, Ts&&... ds) HB_AUTO_RETURN
-  ( _dispatch (obj, hb_prioritize, hb_forward<Ts> (ds)...) )
+  ( _dispatch (obj, hb_prioritize, std::forward<Ts> (ds)...) )
 
 
   void init (hb_blob_t *b)
@@ -206,6 +206,7 @@ struct hb_sanitize_context_t :
                                (unsigned) HB_SANITIZE_MAX_OPS_MAX);
     this->edit_count = 0;
     this->debug_depth = 0;
+    this->recursion_depth = 0;
 
     DEBUG_MSG_LEVEL (SANITIZE, start, 0, +1,
                     "start [%p..%p] (%lu bytes)",
@@ -234,7 +235,7 @@ struct hb_sanitize_context_t :
              (this->start <= p &&
               p <= this->end &&
               (unsigned int) (this->end - p) >= len &&
-              this->max_ops-- > 0);
+              (this->max_ops -= len) > 0);
 
     DEBUG_MSG_LEVEL (SANITIZE, p, this->debug_depth+1, 0,
                     "check_range [%p..%p]"
@@ -279,6 +280,18 @@ struct hb_sanitize_context_t :
     return this->check_range (base, a, b, hb_static_size (T));
   }
 
+  bool check_start_recursion (int max_depth)
+  {
+    if (unlikely (recursion_depth >= max_depth)) return false;
+    return ++recursion_depth;
+  }
+
+  bool end_recursion (bool result)
+  {
+    recursion_depth--;
+    return result;
+  }
+
   template <typename Type>
   bool check_struct (const Type *obj) const
   { return likely (this->check_range (obj, obj->min_size)); }
@@ -387,10 +400,10 @@ struct hb_sanitize_context_t :
     return sanitize_blob<Type> (hb_face_reference_table (face, tableTag));
   }
 
-  mutable unsigned int debug_depth;
   const char *start, *end;
   mutable int max_ops, max_subtables;
   private:
+  int recursion_depth;
   bool writable;
   unsigned int edit_count;
   hb_blob_t *blob;
index 4fb4f4e..6615f03 100644 (file)
  * Serialize
  */
 
+enum hb_serialize_error_t {
+  HB_SERIALIZE_ERROR_NONE =            0x00000000u,
+  HB_SERIALIZE_ERROR_OTHER =           0x00000001u,
+  HB_SERIALIZE_ERROR_OFFSET_OVERFLOW = 0x00000002u,
+  HB_SERIALIZE_ERROR_OUT_OF_ROOM =     0x00000004u,
+  HB_SERIALIZE_ERROR_INT_OVERFLOW =    0x00000008u,
+  HB_SERIALIZE_ERROR_ARRAY_OVERFLOW =  0x00000010u
+};
+HB_MARK_AS_FLAG_T (hb_serialize_error_t);
+
 struct hb_serialize_context_t
 {
   typedef unsigned objidx_t;
@@ -51,26 +61,35 @@ struct hb_serialize_context_t
      Absolute  /* Absolute: from the start of the serialize buffer. */
    };
 
+
+
   struct object_t
   {
-    void fini () { links.fini (); }
+    void fini () {
+      real_links.fini ();
+      virtual_links.fini ();
+    }
 
     bool operator == (const object_t &o) const
     {
+      // Virtual links aren't considered for equality since they don't affect the functionality
+      // of the object.
       return (tail - head == o.tail - o.head)
-         && (links.length == o.links.length)
+         && (real_links.length == o.real_links.length)
          && 0 == hb_memcmp (head, o.head, tail - head)
-         && links.as_bytes () == o.links.as_bytes ();
+         && real_links.as_bytes () == o.real_links.as_bytes ();
     }
     uint32_t hash () const
     {
+      // Virtual links aren't considered for equality since they don't affect the functionality
+      // of the object.
       return hb_bytes_t (head, tail - head).hash () ^
-            links.as_bytes ().hash ();
+          real_links.as_bytes ().hash ();
     }
 
     struct link_t
     {
-      bool is_wide: 1;
+      unsigned width: 3;
       bool is_signed: 1;
       unsigned whence: 2;
       unsigned position: 28;
@@ -80,8 +99,14 @@ struct hb_serialize_context_t
 
     char *head;
     char *tail;
-    hb_vector_t<link_t> links;
+    hb_vector_t<link_t> real_links;
+    hb_vector_t<link_t> virtual_links;
     object_t *next;
+
+    auto all_links () const HB_AUTO_RETURN
+        (( hb_concat (this->real_links, this->virtual_links) ));
+    auto all_links_writer () HB_AUTO_RETURN
+        (( hb_concat (this->real_links.writer (), this->virtual_links.writer ()) ));
   };
 
   struct snapshot_t
@@ -89,11 +114,14 @@ struct hb_serialize_context_t
     char *head;
     char *tail;
     object_t *current; // Just for sanity check
-    unsigned num_links;
+    unsigned num_real_links;
+    unsigned num_virtual_links;
+    hb_serialize_error_t errors;
   };
 
   snapshot_t snapshot ()
-  { return snapshot_t { head, tail, current, current->links.length }; }
+  { return snapshot_t {
+      head, tail, current, current->real_links.length, current->virtual_links.length, errors }; }
 
   hb_serialize_context_t (void *start_, unsigned int size) :
     start ((char *) start_),
@@ -117,37 +145,67 @@ struct hb_serialize_context_t
     object_pool.fini ();
   }
 
-  bool in_error () const { return !this->successful; }
+  bool in_error () const { return bool (errors); }
+
+  bool successful () const { return !bool (errors); }
+
+  HB_NODISCARD bool ran_out_of_room () const { return errors & HB_SERIALIZE_ERROR_OUT_OF_ROOM; }
+  HB_NODISCARD bool offset_overflow () const { return errors & HB_SERIALIZE_ERROR_OFFSET_OVERFLOW; }
+  HB_NODISCARD bool only_offset_overflow () const { return errors == HB_SERIALIZE_ERROR_OFFSET_OVERFLOW; }
+  HB_NODISCARD bool only_overflow () const
+  {
+    return errors == HB_SERIALIZE_ERROR_OFFSET_OVERFLOW
+        || errors == HB_SERIALIZE_ERROR_INT_OVERFLOW
+        || errors == HB_SERIALIZE_ERROR_ARRAY_OVERFLOW;
+  }
+
+  void reset (void *start_, unsigned int size)
+  {
+    start = (char*) start_;
+    end = start + size;
+    reset ();
+    current = nullptr;
+  }
 
   void reset ()
   {
-    this->successful = true;
-    this->ran_out_of_room = false;
+    this->errors = HB_SERIALIZE_ERROR_NONE;
     this->head = this->start;
     this->tail = this->end;
     this->debug_depth = 0;
 
     fini ();
     this->packed.push (nullptr);
+    this->packed_map.init ();
   }
 
-  bool check_success (bool success)
-  { return this->successful && (success || (err_other_error (), false)); }
+  bool check_success (bool success,
+                      hb_serialize_error_t err_type = HB_SERIALIZE_ERROR_OTHER)
+  {
+    return successful ()
+        && (success || err (err_type));
+  }
 
   template <typename T1, typename T2>
-  bool check_equal (T1 &&v1, T2 &&v2)
-  { return check_success ((long long) v1 == (long long) v2); }
+  bool check_equal (T1 &&v1, T2 &&v2, hb_serialize_error_t err_type)
+  {
+    if ((long long) v1 != (long long) v2)
+    {
+      return err (err_type);
+    }
+    return true;
+  }
 
   template <typename T1, typename T2>
-  bool check_assign (T1 &v1, T2 &&v2)
-  { return check_equal (v1 = v2, v2); }
+  bool check_assign (T1 &v1, T2 &&v2, hb_serialize_error_t err_type)
+  { return check_equal (v1 = v2, v2, err_type); }
 
   template <typename T> bool propagate_error (T &&obj)
   { return check_success (!hb_deref (obj).in_error ()); }
 
   template <typename T1, typename... Ts> bool propagate_error (T1 &&o1, Ts&&... os)
-  { return propagate_error (hb_forward<T1> (o1)) &&
-          propagate_error (hb_forward<Ts> (os)...); }
+  { return propagate_error (std::forward<T1> (o1)) &&
+          propagate_error (std::forward<Ts> (os)...); }
 
   /* To be called around main operation. */
   template <typename Type>
@@ -167,11 +225,19 @@ struct hb_serialize_context_t
                     "end [%p..%p] serialized %u bytes; %s",
                     this->start, this->end,
                     (unsigned) (this->head - this->start),
-                    this->successful ? "successful" : "UNSUCCESSFUL");
+                    successful () ? "successful" : "UNSUCCESSFUL");
 
     propagate_error (packed, packed_map);
 
     if (unlikely (!current)) return;
+    if (unlikely (in_error()))
+    {
+      // Offset overflows that occur before link resolution cannot be handled
+      // by repacking, so set a more general error.
+      if (offset_overflow ()) err (HB_SERIALIZE_ERROR_OTHER);
+      return;
+    }
+
     assert (!current->next);
 
     /* Only "pack" if there exist other objects... Otherwise, don't bother.
@@ -187,6 +253,8 @@ struct hb_serialize_context_t
   template <typename Type = void>
   Type *push ()
   {
+    if (unlikely (in_error ())) return start_embed<Type> ();
+
     object_t *obj = object_pool.alloc ();
     if (unlikely (!obj))
       check_success (false);
@@ -203,13 +271,15 @@ struct hb_serialize_context_t
   {
     object_t *obj = current;
     if (unlikely (!obj)) return;
+    if (unlikely (in_error())) return;
+
     current = current->next;
     revert (obj->head, obj->tail);
     obj->fini ();
-    object_pool.free (obj);
+    object_pool.release (obj);
   }
 
-  /* Set share to false when an object is unlikely sharable with others
+  /* Set share to false when an object is unlikely shareable with others
    * so not worth an attempt, or a contiguous table is serialized as
    * multiple consecutive objects in the reverse order so can't be shared.
    */
@@ -217,6 +287,8 @@ struct hb_serialize_context_t
   {
     object_t *obj = current;
     if (unlikely (!obj)) return 0;
+    if (unlikely (in_error())) return 0;
+
     current = current->next;
     obj->tail = head;
     obj->next = nullptr;
@@ -225,7 +297,8 @@ struct hb_serialize_context_t
 
     if (!len)
     {
-      assert (!obj->links.length);
+      assert (!obj->real_links.length);
+      assert (!obj->virtual_links.length);
       return 0;
     }
 
@@ -235,6 +308,7 @@ struct hb_serialize_context_t
       objidx = packed_map.get (obj);
       if (objidx)
       {
+        merge_virtual_links (obj, objidx);
        obj->fini ();
        return objidx;
       }
@@ -248,25 +322,38 @@ struct hb_serialize_context_t
 
     packed.push (obj);
 
-    if (unlikely (packed.in_error ()))
+    if (unlikely (!propagate_error (packed)))
+    {
+      /* Obj wasn't successfully added to packed, so clean it up otherwise its
+       * links will be leaked. When we use constructor/destructors properly, we
+       * can remove these. */
+      obj->fini ();
       return 0;
+    }
 
     objidx = packed.length - 1;
 
     if (share) packed_map.set (obj, objidx);
+    propagate_error (packed_map);
 
     return objidx;
   }
 
   void revert (snapshot_t snap)
   {
+    // Overflows that happened after the snapshot will be erased by the revert.
+    if (unlikely (in_error () && !only_overflow ())) return;
     assert (snap.current == current);
-    current->links.shrink (snap.num_links);
+    current->real_links.shrink (snap.num_real_links);
+    current->virtual_links.shrink (snap.num_virtual_links);
+    errors = snap.errors;
     revert (snap.head, snap.tail);
   }
+
   void revert (char *snap_head,
               char *snap_tail)
   {
+    if (unlikely (in_error ())) return;
     assert (snap_head <= head);
     assert (tail <= snap_tail);
     head = snap_head;
@@ -276,6 +363,7 @@ struct hb_serialize_context_t
 
   void discard_stale_objects ()
   {
+    if (unlikely (in_error ())) return;
     while (packed.length > 1 &&
           packed.tail ()->head < tail)
     {
@@ -288,12 +376,41 @@ struct hb_serialize_context_t
       assert (packed.tail ()->head == tail);
   }
 
+  // Adds a virtual link from the current object to objidx. A virtual link is not associated with
+  // an actual offset field. They are solely used to enforce ordering constraints between objects.
+  // Adding a virtual link from object a to object b will ensure that object b is always packed after
+  // object a in the final serialized order.
+  //
+  // This is useful in certain situations where there needs to be a specific ordering in the
+  // final serialization. Such as when platform bugs require certain orderings, or to provide
+  //  guidance to the repacker for better offset overflow resolution.
+  void add_virtual_link (objidx_t objidx)
+  {
+    if (unlikely (in_error ())) return;
+
+    if (!objidx)
+      return;
+
+    assert (current);
+
+    auto& link = *current->virtual_links.push ();
+    if (current->virtual_links.in_error ())
+      err (HB_SERIALIZE_ERROR_OTHER);
+
+    link.width = 0;
+    link.objidx = objidx;
+    link.is_signed = 0;
+    link.whence = 0;
+    link.position = 0;
+    link.bias = 0;
+  }
+
   template <typename T>
   void add_link (T &ofs, objidx_t objidx,
                 whence_t whence = Head,
                 unsigned bias = 0)
   {
-    static_assert (sizeof (T) == 2 || sizeof (T) == 4, "");
+    if (unlikely (in_error ())) return;
 
     if (!objidx)
       return;
@@ -301,18 +418,32 @@ struct hb_serialize_context_t
     assert (current);
     assert (current->head <= (const char *) &ofs);
 
-    auto& link = *current->links.push ();
+    auto& link = *current->real_links.push ();
+    if (current->real_links.in_error ())
+      err (HB_SERIALIZE_ERROR_OTHER);
 
-    link.is_wide = sizeof (T) == 4;
-    link.is_signed = hb_is_signed (hb_unwrap_type (T));
+    link.width = sizeof (T);
+    link.objidx = objidx;
+    if (unlikely (!sizeof (T)))
+    {
+      // This link is not associated with an actual offset and exists merely to enforce
+      // an ordering constraint.
+      link.is_signed = 0;
+      link.whence = 0;
+      link.position = 0;
+      link.bias = 0;
+      return;
+    }
+
+    link.is_signed = std::is_signed<hb_unwrap_type (T)>::value;
     link.whence = (unsigned) whence;
     link.position = (const char *) &ofs - current->head;
     link.bias = bias;
-    link.objidx = objidx;
   }
 
   unsigned to_bias (const void *base) const
   {
+    if (unlikely (in_error ())) return 0;
     if (!base) return 0;
     assert (current);
     assert (current->head <= (const char *) base);
@@ -327,10 +458,10 @@ struct hb_serialize_context_t
     assert (packed.length > 1);
 
     for (const object_t* parent : ++hb_iter (packed))
-      for (const object_t::link_t &link : parent->links)
+      for (const object_t::link_t &link : parent->real_links)
       {
        const object_t* child = packed[link.objidx];
-       if (unlikely (!child)) { err_other_error(); return; }
+       if (unlikely (!child)) { err (HB_SERIALIZE_ERROR_OTHER); return; }
        unsigned offset = 0;
        switch ((whence_t) link.whence) {
        case Head:     offset = child->head - parent->head; break;
@@ -342,22 +473,30 @@ struct hb_serialize_context_t
        offset -= link.bias;
        if (link.is_signed)
        {
-         if (link.is_wide)
+         assert (link.width == 2 || link.width == 4);
+         if (link.width == 4)
            assign_offset<int32_t> (parent, link, offset);
          else
            assign_offset<int16_t> (parent, link, offset);
        }
        else
        {
-         if (link.is_wide)
+         assert (link.width == 2 || link.width == 3 || link.width == 4);
+         if (link.width == 4)
            assign_offset<uint32_t> (parent, link, offset);
+         else if (link.width == 3)
+           assign_offset<uint32_t, 3> (parent, link, offset);
          else
            assign_offset<uint16_t> (parent, link, offset);
        }
       }
   }
 
-  unsigned int length () const { return this->head - current->head; }
+  unsigned int length () const
+  {
+    if (unlikely (!current)) return 0;
+    return this->head - current->head;
+  }
 
   void align (unsigned int alignment)
   {
@@ -371,24 +510,24 @@ struct hb_serialize_context_t
   { return reinterpret_cast<Type *> (this->head); }
   template <typename Type>
   Type *start_embed (const Type &obj) const
-  { return start_embed (hb_addressof (obj)); }
+  { return start_embed (std::addressof (obj)); }
 
-  /* Following two functions exist to allow setting breakpoint on. */
-  void err_ran_out_of_room () { this->ran_out_of_room = true; }
-  void err_other_error () { this->successful = false; }
+  bool err (hb_serialize_error_t err_type)
+  {
+    return !bool ((errors = (errors | err_type)));
+  }
 
   template <typename Type>
-  Type *allocate_size (unsigned int size)
+  Type *allocate_size (size_t size)
   {
-    if (unlikely (!this->successful)) return nullptr;
+    if (unlikely (in_error ())) return nullptr;
 
-    if (this->tail - this->head < ptrdiff_t (size))
+    if (unlikely (size > INT_MAX || this->tail - this->head < ptrdiff_t (size)))
     {
-      err_ran_out_of_room ();
-      this->successful = false;
+      err (HB_SERIALIZE_ERROR_OUT_OF_ROOM);
       return nullptr;
     }
-    memset (this->head, 0, size);
+    hb_memset (this->head, 0, size);
     char *ret = this->head;
     this->head += size;
     return reinterpret_cast<Type *> (ret);
@@ -409,11 +548,11 @@ struct hb_serialize_context_t
   }
   template <typename Type>
   Type *embed (const Type &obj)
-  { return embed (hb_addressof (obj)); }
+  { return embed (std::addressof (obj)); }
 
   template <typename Type, typename ...Ts> auto
   _copy (const Type &src, hb_priority<1>, Ts&&... ds) HB_RETURN
-  (Type *, src.copy (this, hb_forward<Ts> (ds)...))
+  (Type *, src.copy (this, std::forward<Ts> (ds)...))
 
   template <typename Type> auto
   _copy (const Type &src, hb_priority<0>) -> decltype (&(hb_declval<Type> () = src))
@@ -428,54 +567,61 @@ struct hb_serialize_context_t
    * instead of memcpy(). */
   template <typename Type, typename ...Ts>
   Type *copy (const Type &src, Ts&&... ds)
-  { return _copy (src, hb_prioritize, hb_forward<Ts> (ds)...); }
+  { return _copy (src, hb_prioritize, std::forward<Ts> (ds)...); }
   template <typename Type, typename ...Ts>
   Type *copy (const Type *src, Ts&&... ds)
-  { return copy (*src, hb_forward<Ts> (ds)...); }
+  { return copy (*src, std::forward<Ts> (ds)...); }
 
   template<typename Iterator,
           hb_requires (hb_is_iterator (Iterator)),
           typename ...Ts>
   void copy_all (Iterator it, Ts&&... ds)
-  { for (decltype (*it) _ : it) copy (_, hb_forward<Ts> (ds)...); }
+  { for (decltype (*it) _ : it) copy (_, std::forward<Ts> (ds)...); }
 
   template <typename Type>
   hb_serialize_context_t& operator << (const Type &obj) & { embed (obj); return *this; }
 
   template <typename Type>
-  Type *extend_size (Type *obj, unsigned int size)
+  Type *extend_size (Type *obj, size_t size)
   {
+    if (unlikely (in_error ())) return nullptr;
+
     assert (this->start <= (char *) obj);
     assert ((char *) obj <= this->head);
-    assert ((char *) obj + size >= this->head);
-    if (unlikely (!this->allocate_size<Type> (((char *) obj) + size - this->head))) return nullptr;
+    assert ((size_t) (this->head - (char *) obj) <= size);
+    if (unlikely (((char *) obj + size < (char *) obj) ||
+                 !this->allocate_size<Type> (((char *) obj) + size - this->head))) return nullptr;
     return reinterpret_cast<Type *> (obj);
   }
   template <typename Type>
-  Type *extend_size (Type &obj, unsigned int size)
-  { return extend_size (hb_addressof (obj), size); }
+  Type *extend_size (Type &obj, size_t size)
+  { return extend_size (std::addressof (obj), size); }
 
   template <typename Type>
   Type *extend_min (Type *obj) { return extend_size (obj, obj->min_size); }
   template <typename Type>
-  Type *extend_min (Type &obj) { return extend_min (hb_addressof (obj)); }
+  Type *extend_min (Type &obj) { return extend_min (std::addressof (obj)); }
 
   template <typename Type, typename ...Ts>
   Type *extend (Type *obj, Ts&&... ds)
-  { return extend_size (obj, obj->get_size (hb_forward<Ts> (ds)...)); }
+  { return extend_size (obj, obj->get_size (std::forward<Ts> (ds)...)); }
   template <typename Type, typename ...Ts>
   Type *extend (Type &obj, Ts&&... ds)
-  { return extend (hb_addressof (obj), hb_forward<Ts> (ds)...); }
+  { return extend (std::addressof (obj), std::forward<Ts> (ds)...); }
 
   /* Output routines. */
   hb_bytes_t copy_bytes () const
   {
-    assert (this->successful);
+    assert (successful ());
     /* Copy both items from head side and tail side... */
     unsigned int len = (this->head - this->start)
                     + (this->end  - this->tail);
 
-    char *p = (char *) malloc (len);
+    // If len is zero don't hb_malloc as the memory won't get properly
+    // cleaned up later.
+    if (!len) return hb_bytes_t ();
+
+    char *p = (char *) hb_malloc (len);
     if (unlikely (!p)) return hb_bytes_t ();
 
     memcpy (p, this->start, this->head - this->start);
@@ -490,26 +636,35 @@ struct hb_serialize_context_t
     hb_bytes_t b = copy_bytes ();
     return hb_blob_create (b.arrayZ, b.length,
                           HB_MEMORY_MODE_WRITABLE,
-                          (char *) b.arrayZ, free);
+                          (char *) b.arrayZ, hb_free);
   }
 
+  const hb_vector_t<object_t *>& object_graph() const
+  { return packed; }
+
   private:
-  template <typename T>
+  template <typename T, unsigned Size = sizeof (T)>
   void assign_offset (const object_t* parent, const object_t::link_t &link, unsigned offset)
   {
-    auto &off = * ((BEInt<T, sizeof (T)> *) (parent->head + link.position));
+    auto &off = * ((BEInt<T, Size> *) (parent->head + link.position));
     assert (0 == off);
-    check_assign (off, offset);
+    check_assign (off, offset, HB_SERIALIZE_ERROR_OFFSET_OVERFLOW);
   }
 
   public: /* TODO Make private. */
   char *start, *head, *tail, *end;
   unsigned int debug_depth;
-  bool successful;
-  bool ran_out_of_room;
+  hb_serialize_error_t errors;
 
   private:
 
+  void merge_virtual_links (const object_t* from, objidx_t to_idx) {
+    object_t* to = packed[to_idx];
+    for (const auto& l : from->virtual_links) {
+      to->virtual_links.push (l);
+    }
+  }
+
   /* Object memory pool. */
   hb_pool_t<object_t> object_pool;
 
@@ -520,8 +675,9 @@ struct hb_serialize_context_t
   hb_vector_t<object_t *> packed;
 
   /* Map view of packed objects. */
-  hb_hashmap_t<const object_t *, objidx_t, nullptr, 0> packed_map;
+  hb_hashmap_t<const object_t *, objidx_t,
+              const object_t *, objidx_t,
+              nullptr, 0> packed_map;
 };
 
-
 #endif /* HB_SERIALIZE_HH */
index b97526f..7d4979b 100644 (file)
@@ -87,6 +87,8 @@ struct hb_set_digest_lowest_bits_t
     }
   }
   template <typename T>
+  void add_array (const hb_array_t<const T>& arr) { add_array (&arr, arr.len ()); }
+  template <typename T>
   bool add_sorted_array (const T *array, unsigned int count, unsigned int stride=sizeof(T))
   {
     for (unsigned int i = 0; i < count; i++)
@@ -96,6 +98,8 @@ struct hb_set_digest_lowest_bits_t
     }
     return true;
   }
+  template <typename T>
+  bool add_sorted_array (const hb_sorted_array_t<const T>& arr) { return add_sorted_array (&arr, arr.len ()); }
 
   bool may_have (hb_codepoint_t g) const
   { return !!(mask & mask_for (g)); }
@@ -135,12 +139,16 @@ struct hb_set_digest_combiner_t
     tail.add_array (array, count, stride);
   }
   template <typename T>
+  void add_array (const hb_array_t<const T>& arr) { add_array (&arr, arr.len ()); }
+  template <typename T>
   bool add_sorted_array (const T *array, unsigned int count, unsigned int stride=sizeof(T))
   {
     head.add_sorted_array (array, count, stride);
     tail.add_sorted_array (array, count, stride);
     return true;
   }
+  template <typename T>
+  bool add_sorted_array (const hb_sorted_array_t<const T>& arr) { return add_sorted_array (&arr, arr.len ()); }
 
   bool may_have (hb_codepoint_t g) const
   {
@@ -160,15 +168,17 @@ struct hb_set_digest_combiner_t
  * There is not much science to this: it's a result of intuition
  * and testing.
  */
-typedef hb_set_digest_combiner_t
-<
-  hb_set_digest_lowest_bits_t<unsigned long, 4>,
+using hb_set_digest_t =
   hb_set_digest_combiner_t
   <
-    hb_set_digest_lowest_bits_t<unsigned long, 0>,
-    hb_set_digest_lowest_bits_t<unsigned long, 9>
+    hb_set_digest_lowest_bits_t<unsigned long, 4>,
+    hb_set_digest_combiner_t
+    <
+      hb_set_digest_lowest_bits_t<unsigned long, 0>,
+      hb_set_digest_lowest_bits_t<unsigned long, 9>
+    >
   >
-> hb_set_digest_t;
+;
 
 
 #endif /* HB_SET_DIGEST_HH */
index 0551ed8..204dbb5 100644 (file)
 /**
  * SECTION:hb-set
  * @title: hb-set
- * @short_description: Object representing a set of integers
+ * @short_description: Objects representing a set of integers
  * @include: hb.h
  *
  * Set objects represent a mathematical set of integer values.  They are
- * used in non-shaping API to query certain set of characters or glyphs,
+ * used in non-shaping APIs to query certain sets of characters or glyphs,
  * or other integer values.
  **/
 
@@ -42,7 +42,9 @@
 /**
  * hb_set_create: (Xconstructor)
  *
- * Return value: (transfer full):
+ * Creates a new, initially empty set.
+ *
+ * Return value: (transfer full): The new #hb_set_t
  *
  * Since: 0.9.2
  **/
@@ -62,7 +64,9 @@ hb_set_create ()
 /**
  * hb_set_get_empty:
  *
- * Return value: (transfer full):
+ * Fetches the singleton empty #hb_set_t.
+ *
+ * Return value: (transfer full): The empty #hb_set_t
  *
  * Since: 0.9.2
  **/
@@ -74,9 +78,11 @@ hb_set_get_empty ()
 
 /**
  * hb_set_reference: (skip)
- * @set: a set.
+ * @set: A set
+ *
+ * Increases the reference count on a set.
  *
- * Return value: (transfer full):
+ * Return value: (transfer full): The set
  *
  * Since: 0.9.2
  **/
@@ -88,7 +94,11 @@ hb_set_reference (hb_set_t *set)
 
 /**
  * hb_set_destroy: (skip)
- * @set: a set.
+ * @set: A set
+ *
+ * Decreases the reference count on a set. When
+ * the reference count reaches zero, the set is
+ * destroyed, freeing all memory.
  *
  * Since: 0.9.2
  **/
@@ -99,18 +109,20 @@ hb_set_destroy (hb_set_t *set)
 
   set->fini_shallow ();
 
-  free (set);
+  hb_free (set);
 }
 
 /**
  * hb_set_set_user_data: (skip)
- * @set: a set.
- * @key:
- * @data:
- * @destroy:
- * @replace:
+ * @set: A set
+ * @key: The user-data key to set
+ * @data: A pointer to the user data to set
+ * @destroy: (nullable): A callback to call when @data is not needed anymore
+ * @replace: Whether to replace an existing data with the same key
+ *
+ * Attaches a user-data key/data pair to the specified set.
  *
- * Return value:
+ * Return value: %true if success, %false otherwise
  *
  * Since: 0.9.2
  **/
@@ -126,10 +138,13 @@ hb_set_set_user_data (hb_set_t           *set,
 
 /**
  * hb_set_get_user_data: (skip)
- * @set: a set.
- * @key:
+ * @set: A set
+ * @key: The user-data key to query
+ *
+ * Fetches the user data associated with the specified key,
+ * attached to the specified set.
  *
- * Return value: (transfer none):
+ * Return value: (transfer none): A pointer to the user data
  *
  * Since: 0.9.2
  **/
@@ -143,31 +158,50 @@ hb_set_get_user_data (hb_set_t           *set,
 
 /**
  * hb_set_allocation_successful:
- * @set: a set.
- *
+ * @set: A set
  *
+ * Tests whether memory allocation for a set was successful.
  *
- * Return value:
+ * Return value: %true if allocation succeeded, %false otherwise
  *
  * Since: 0.9.2
  **/
 hb_bool_t
 hb_set_allocation_successful (const hb_set_t  *set)
 {
-  return set->successful;
+  return !set->in_error ();
 }
 
 /**
- * hb_set_clear:
- * @set: a set.
+ * hb_set_copy:
+ * @set: A set
  *
+ * Allocate a copy of @set.
  *
+ * Return value: Newly-allocated set.
+ *
+ * Since: 2.8.2
+ **/
+hb_set_t *
+hb_set_copy (const hb_set_t *set)
+{
+  hb_set_t *copy = hb_set_create ();
+  copy->set (*set);
+  return copy;
+}
+
+/**
+ * hb_set_clear:
+ * @set: A set
+ *
+ * Clears out the contents of a set.
  *
  * Since: 0.9.2
  **/
 void
 hb_set_clear (hb_set_t *set)
 {
+  /* Immutible-safe. */
   set->clear ();
 }
 
@@ -175,9 +209,9 @@ hb_set_clear (hb_set_t *set)
  * hb_set_is_empty:
  * @set: a set.
  *
+ * Tests whether a set is empty (contains no elements).
  *
- *
- * Return value:
+ * Return value: %true if @set is empty
  *
  * Since: 0.9.7
  **/
@@ -189,12 +223,12 @@ hb_set_is_empty (const hb_set_t *set)
 
 /**
  * hb_set_has:
- * @set: a set.
- * @codepoint:
- *
+ * @set: A set
+ * @codepoint: The element to query
  *
+ * Tests whether @codepoint belongs to @set.
  *
- * Return value:
+ * Return value: %true if @codepoint is in @set, %false otherwise
  *
  * Since: 0.9.2
  **/
@@ -207,10 +241,10 @@ hb_set_has (const hb_set_t *set,
 
 /**
  * hb_set_add:
- * @set: a set.
- * @codepoint:
- *
+ * @set: A set
+ * @codepoint: The element to add to @set
  *
+ * Adds @codepoint to @set.
  *
  * Since: 0.9.2
  **/
@@ -218,16 +252,18 @@ void
 hb_set_add (hb_set_t       *set,
            hb_codepoint_t  codepoint)
 {
+  /* Immutible-safe. */
   set->add (codepoint);
 }
 
 /**
  * hb_set_add_range:
- * @set: a set.
- * @first:
- * @last:
- *
+ * @set: A set
+ * @first: The first element to add to @set
+ * @last: The final element to add to @set
  *
+ * Adds all of the elements from @first to @last
+ * (inclusive) to @set.
  *
  * Since: 0.9.7
  **/
@@ -236,15 +272,16 @@ hb_set_add_range (hb_set_t       *set,
                  hb_codepoint_t  first,
                  hb_codepoint_t  last)
 {
+  /* Immutible-safe. */
   set->add_range (first, last);
 }
 
 /**
  * hb_set_del:
- * @set: a set.
- * @codepoint:
- *
+ * @set: A set
+ * @codepoint: Removes @codepoint from @set
  *
+ * Removes @codepoint from @set.
  *
  * Since: 0.9.2
  **/
@@ -252,16 +289,21 @@ void
 hb_set_del (hb_set_t       *set,
            hb_codepoint_t  codepoint)
 {
+  /* Immutible-safe. */
   set->del (codepoint);
 }
 
 /**
  * hb_set_del_range:
- * @set: a set.
- * @first:
- * @last:
+ * @set: A set
+ * @first: The first element to remove from @set
+ * @last: The final element to remove from @set
  *
+ * Removes all of the elements from @first to @last
+ * (inclusive) from @set.
  *
+ * If @last is #HB_SET_VALUE_INVALID, then all values
+ * greater than or equal to @first are removed.
  *
  * Since: 0.9.7
  **/
@@ -270,17 +312,19 @@ hb_set_del_range (hb_set_t       *set,
                  hb_codepoint_t  first,
                  hb_codepoint_t  last)
 {
+  /* Immutible-safe. */
   set->del_range (first, last);
 }
 
 /**
  * hb_set_is_equal:
- * @set: a set.
- * @other: other set.
- *
+ * @set: A set
+ * @other: Another set
  *
+ * Tests whether @set and @other are equal (contain the same
+ * elements).
  *
- * Return value: %TRUE if the two sets are equal, %FALSE otherwise.
+ * Return value: %true if the two sets are equal, %false otherwise.
  *
  * Since: 0.9.7
  **/
@@ -288,17 +332,17 @@ hb_bool_t
 hb_set_is_equal (const hb_set_t *set,
                 const hb_set_t *other)
 {
-  return set->is_equal (other);
+  return set->is_equal (*other);
 }
 
 /**
  * hb_set_is_subset:
- * @set: a set.
- * @larger_set: other set.
- *
+ * @set: A set
+ * @larger_set: Another set
  *
+ * Tests whether @set is a subset of @larger_set.
  *
- * Return value: %TRUE if the @set is a subset of (or equal to) @larger_set, %FALSE otherwise.
+ * Return value: %true if the @set is a subset of (or equal to) @larger_set, %false otherwise.
  *
  * Since: 1.8.1
  **/
@@ -306,15 +350,15 @@ hb_bool_t
 hb_set_is_subset (const hb_set_t *set,
                  const hb_set_t *larger_set)
 {
-  return set->is_subset (larger_set);
+  return set->is_subset (*larger_set);
 }
 
 /**
  * hb_set_set:
- * @set: a set.
- * @other:
- *
+ * @set: A set
+ * @other: Another set
  *
+ * Makes the contents of @set equal to the contents of @other.
  *
  * Since: 0.9.2
  **/
@@ -322,15 +366,16 @@ void
 hb_set_set (hb_set_t       *set,
            const hb_set_t *other)
 {
-  set->set (other);
+  /* Immutible-safe. */
+  set->set (*other);
 }
 
 /**
  * hb_set_union:
- * @set: a set.
- * @other:
- *
+ * @set: A set
+ * @other: Another set
  *
+ * Makes @set the union of @set and @other.
  *
  * Since: 0.9.2
  **/
@@ -338,15 +383,16 @@ void
 hb_set_union (hb_set_t       *set,
              const hb_set_t *other)
 {
-  set->union_ (other);
+  /* Immutible-safe. */
+  set->union_ (*other);
 }
 
 /**
  * hb_set_intersect:
- * @set: a set.
- * @other:
- *
+ * @set: A set
+ * @other: Another set
  *
+ * Makes @set the intersection of @set and @other.
  *
  * Since: 0.9.2
  **/
@@ -354,15 +400,16 @@ void
 hb_set_intersect (hb_set_t       *set,
                  const hb_set_t *other)
 {
-  set->intersect (other);
+  /* Immutible-safe. */
+  set->intersect (*other);
 }
 
 /**
  * hb_set_subtract:
- * @set: a set.
- * @other:
- *
+ * @set: A set
+ * @other: Another set
  *
+ * Subtracts the contents of @other from @set.
  *
  * Since: 0.9.2
  **/
@@ -370,15 +417,17 @@ void
 hb_set_subtract (hb_set_t       *set,
                 const hb_set_t *other)
 {
-  set->subtract (other);
+  /* Immutible-safe. */
+  set->subtract (*other);
 }
 
 /**
  * hb_set_symmetric_difference:
- * @set: a set.
- * @other:
- *
+ * @set: A set
+ * @other: Another set
  *
+ * Makes @set the symmetric difference of @set
+ * and @other.
  *
  * Since: 0.9.2
  **/
@@ -386,33 +435,32 @@ void
 hb_set_symmetric_difference (hb_set_t       *set,
                             const hb_set_t *other)
 {
-  set->symmetric_difference (other);
+  /* Immutible-safe. */
+  set->symmetric_difference (*other);
 }
 
-#ifndef HB_DISABLE_DEPRECATED
 /**
  * hb_set_invert:
- * @set: a set.
+ * @set: A set
  *
+ * Inverts the contents of @set.
  *
- *
- * Since: 0.9.10
- *
- * Deprecated: 1.6.1
+ * Since: 3.0.0
  **/
 void
-hb_set_invert (hb_set_t *set HB_UNUSED)
+hb_set_invert (hb_set_t *set)
 {
+  /* Immutible-safe. */
+  set->invert ();
 }
-#endif
 
 /**
  * hb_set_get_population:
- * @set: a set.
+ * @set: A set
  *
- * Returns the number of numbers in the set.
+ * Returns the number of elements in the set.
  *
- * Return value: set population.
+ * Return value: The population of @set
  *
  * Since: 0.9.7
  **/
@@ -424,11 +472,11 @@ hb_set_get_population (const hb_set_t *set)
 
 /**
  * hb_set_get_min:
- * @set: a set.
+ * @set: A set
  *
- * Finds the minimum number in the set.
+ * Finds the smallest element in the set.
  *
- * Return value: minimum of the set, or %HB_SET_VALUE_INVALID if set is empty.
+ * Return value: minimum of @set, or #HB_SET_VALUE_INVALID if @set is empty.
  *
  * Since: 0.9.7
  **/
@@ -440,11 +488,11 @@ hb_set_get_min (const hb_set_t *set)
 
 /**
  * hb_set_get_max:
- * @set: a set.
+ * @set: A set
  *
- * Finds the maximum number in the set.
+ * Finds the largest element in the set.
  *
- * Return value: minimum of the set, or %HB_SET_VALUE_INVALID if set is empty.
+ * Return value: maximum of @set, or #HB_SET_VALUE_INVALID if @set is empty.
  *
  * Since: 0.9.7
  **/
@@ -456,14 +504,15 @@ hb_set_get_max (const hb_set_t *set)
 
 /**
  * hb_set_next:
- * @set: a set.
- * @codepoint: (inout):
+ * @set: A set
+ * @codepoint: (inout): Input = Code point to query
+ *             Output = Code point retrieved
  *
- * Gets the next number in @set that is greater than current value of @codepoint.
+ * Fetches the next element in @set that is greater than current value of @codepoint.
  *
- * Set @codepoint to %HB_SET_VALUE_INVALID to get started.
+ * Set @codepoint to #HB_SET_VALUE_INVALID to get started.
  *
- * Return value: whether there was a next value.
+ * Return value: %true if there was a next value, %false otherwise
  *
  * Since: 0.9.2
  **/
@@ -476,14 +525,15 @@ hb_set_next (const hb_set_t *set,
 
 /**
  * hb_set_previous:
- * @set: a set.
- * @codepoint: (inout):
+ * @set: A set
+ * @codepoint: (inout): Input = Code point to query
+ *             Output = Code point retrieved
  *
- * Gets the previous number in @set that is lower than current value of @codepoint.
+ * Fetches the previous element in @set that is lower than current value of @codepoint.
  *
- * Set @codepoint to %HB_SET_VALUE_INVALID to get started.
+ * Set @codepoint to #HB_SET_VALUE_INVALID to get started.
  *
- * Return value: whether there was a previous value.
+ * Return value: %true if there was a previous value, %false otherwise
  *
  * Since: 1.8.0
  **/
@@ -496,16 +546,17 @@ hb_set_previous (const hb_set_t *set,
 
 /**
  * hb_set_next_range:
- * @set: a set.
- * @first: (out): output first codepoint in the range.
- * @last: (inout): input current last and output last codepoint in the range.
+ * @set: A set
+ * @first: (out): The first code point in the range
+ * @last: (inout): Input = The current last code point in the range
+ *         Output = The last code point in the range
  *
- * Gets the next consecutive range of numbers in @set that
+ * Fetches the next consecutive range of elements in @set that
  * are greater than current value of @last.
  *
- * Set @last to %HB_SET_VALUE_INVALID to get started.
+ * Set @last to #HB_SET_VALUE_INVALID to get started.
  *
- * Return value: whether there was a next range.
+ * Return value: %true if there was a next range, %false otherwise
  *
  * Since: 0.9.7
  **/
@@ -519,16 +570,17 @@ hb_set_next_range (const hb_set_t *set,
 
 /**
  * hb_set_previous_range:
- * @set: a set.
- * @first: (inout): input current first and output first codepoint in the range.
- * @last: (out): output last codepoint in the range.
+ * @set: A set
+ * @first: (inout): Input = The current first code point in the range
+ *         Output = The first code point in the range
+ * @last: (out): The last code point in the range
  *
- * Gets the previous consecutive range of numbers in @set that
- * are less than current value of @first.
+ * Fetches the previous consecutive range of elements in @set that
+ * are greater than current value of @last.
  *
- * Set @first to %HB_SET_VALUE_INVALID to get started.
+ * Set @first to #HB_SET_VALUE_INVALID to get started.
  *
- * Return value: whether there was a previous range.
+ * Return value: %true if there was a previous range, %false otherwise
  *
  * Since: 1.8.0
  **/
index ed0e05d..423225b 100644 (file)
@@ -24,7 +24,7 @@
  * Google Author(s): Behdad Esfahbod
  */
 
-#ifndef HB_H_IN
+#if !defined(HB_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb.h> instead."
 #endif
 
 HB_BEGIN_DECLS
 
 
-/*
+/**
+ * HB_SET_VALUE_INVALID:
+ *
+ * Unset #hb_set_t value.
+ *
  * Since: 0.9.21
  */
 #define HB_SET_VALUE_INVALID ((hb_codepoint_t) -1)
 
+/**
+ * hb_set_t:
+ *
+ * Data type for holding a set of integers. #hb_set_t's are
+ * used to gather and contain glyph IDs, Unicode code
+ * points, and various other collections of discrete 
+ * values.
+ *
+ **/
 typedef struct hb_set_t hb_set_t;
 
 
@@ -72,12 +85,18 @@ hb_set_get_user_data (hb_set_t           *set,
 HB_EXTERN hb_bool_t
 hb_set_allocation_successful (const hb_set_t *set);
 
+HB_EXTERN hb_set_t *
+hb_set_copy (const hb_set_t *set);
+
 HB_EXTERN void
 hb_set_clear (hb_set_t *set);
 
 HB_EXTERN hb_bool_t
 hb_set_is_empty (const hb_set_t *set);
 
+HB_EXTERN void
+hb_set_invert (hb_set_t *set);
+
 HB_EXTERN hb_bool_t
 hb_set_has (const hb_set_t *set,
            hb_codepoint_t  codepoint);
index b6e2086..af02e9e 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright © 2012,2017  Google, Inc.
+ * Copyright © 2021 Behdad Esfahbod
  *
  *  This is part of HarfBuzz, a text shaping library.
  *
 #define HB_SET_HH
 
 #include "hb.hh"
-#include "hb-machinery.hh"
+#include "hb-bit-set-invertible.hh"
 
 
-/*
- * hb_set_t
- */
-
-/* TODO Keep a free-list so we can free pages that are completely zeroed.  At that
- * point maybe also use a sentinel value for "all-1" pages? */
-
-struct hb_set_t
+template <typename impl_t>
+struct hb_sparseset_t
 {
-  HB_DELETE_COPY_ASSIGN (hb_set_t);
-  hb_set_t ()  { init (); }
-  ~hb_set_t () { fini (); }
+  hb_object_header_t header;
+  impl_t s;
 
-  struct page_map_t
-  {
-    int cmp (const page_map_t &o) const { return (int) o.major - (int) major; }
+  hb_sparseset_t () { init (); }
+  ~hb_sparseset_t () { fini (); }
 
-    uint32_t major;
-    uint32_t index;
-  };
+  hb_sparseset_t (const hb_sparseset_t& other) : hb_sparseset_t () { set (other); }
+  hb_sparseset_t (hb_sparseset_t&& other) : hb_sparseset_t () { s = std::move (other.s); }
+  hb_sparseset_t& operator= (const hb_sparseset_t& other) { set (other); return *this; }
+  hb_sparseset_t& operator= (hb_sparseset_t&& other) { hb_swap (*this, other); return *this; }
+  friend void swap (hb_sparseset_t& a, hb_sparseset_t& b) { hb_swap (a.s, b.s); }
 
-  struct page_t
+  hb_sparseset_t (std::initializer_list<hb_codepoint_t> lst) : hb_sparseset_t ()
   {
-    void init0 () { v.clear (); }
-    void init1 () { v.clear (0xFF); }
-
-    unsigned int len () const
-    { return ARRAY_LENGTH_CONST (v); }
-
-    bool is_empty () const
-    {
-      for (unsigned int i = 0; i < len (); i++)
-       if (v[i])
-         return false;
-      return true;
-    }
-
-    void add (hb_codepoint_t g) { elt (g) |= mask (g); }
-    void del (hb_codepoint_t g) { elt (g) &= ~mask (g); }
-    bool get (hb_codepoint_t g) const { return elt (g) & mask (g); }
-
-    void add_range (hb_codepoint_t a, hb_codepoint_t b)
-    {
-      elt_t *la = &elt (a);
-      elt_t *lb = &elt (b);
-      if (la == lb)
-       *la |= (mask (b) << 1) - mask(a);
-      else
-      {
-       *la |= ~(mask (a) - 1);
-       la++;
-
-       memset (la, 0xff, (char *) lb - (char *) la);
-
-       *lb |= ((mask (b) << 1) - 1);
-      }
-    }
-
-    void del_range (hb_codepoint_t a, hb_codepoint_t b)
-    {
-      elt_t *la = &elt (a);
-      elt_t *lb = &elt (b);
-      if (la == lb)
-       *la &= ~((mask (b) << 1) - mask(a));
-      else
-      {
-       *la &= mask (a) - 1;
-       la++;
-
-       memset (la, 0, (char *) lb - (char *) la);
-
-       *lb &= ~((mask (b) << 1) - 1);
-      }
-    }
-
-    bool is_equal (const page_t *other) const
-    {
-      return 0 == hb_memcmp (&v, &other->v, sizeof (v));
-    }
-
-    unsigned int get_population () const
-    {
-      unsigned int pop = 0;
-      for (unsigned int i = 0; i < len (); i++)
-       pop += hb_popcount (v[i]);
-      return pop;
-    }
-
-    bool next (hb_codepoint_t *codepoint) const
-    {
-      unsigned int m = (*codepoint + 1) & MASK;
-      if (!m)
-      {
-       *codepoint = INVALID;
-       return false;
-      }
-      unsigned int i = m / ELT_BITS;
-      unsigned int j = m & ELT_MASK;
-
-      const elt_t vv = v[i] & ~((elt_t (1) << j) - 1);
-      for (const elt_t *p = &vv; i < len (); p = &v[++i])
-       if (*p)
-       {
-         *codepoint = i * ELT_BITS + elt_get_min (*p);
-         return true;
-       }
-
-      *codepoint = INVALID;
-      return false;
-    }
-    bool previous (hb_codepoint_t *codepoint) const
-    {
-      unsigned int m = (*codepoint - 1) & MASK;
-      if (m == MASK)
-      {
-       *codepoint = INVALID;
-       return false;
-      }
-      unsigned int i = m / ELT_BITS;
-      unsigned int j = m & ELT_MASK;
-
-      /* Fancy mask to avoid shifting by elt_t bitsize, which is undefined. */
-      const elt_t mask = j < 8 * sizeof (elt_t) - 1 ?
-                        ((elt_t (1) << (j + 1)) - 1) :
-                        (elt_t) -1;
-      const elt_t vv = v[i] & mask;
-      const elt_t *p = &vv;
-      while (true)
-      {
-       if (*p)
-       {
-         *codepoint = i * ELT_BITS + elt_get_max (*p);
-         return true;
-       }
-       if ((int) i <= 0) break;
-       p = &v[--i];
-      }
-
-      *codepoint = INVALID;
-      return false;
-    }
-    hb_codepoint_t get_min () const
-    {
-      for (unsigned int i = 0; i < len (); i++)
-       if (v[i])
-         return i * ELT_BITS + elt_get_min (v[i]);
-      return INVALID;
-    }
-    hb_codepoint_t get_max () const
-    {
-      for (int i = len () - 1; i >= 0; i--)
-       if (v[i])
-         return i * ELT_BITS + elt_get_max (v[i]);
-      return 0;
-    }
-
-    typedef unsigned long long elt_t;
-    static constexpr unsigned PAGE_BITS = 512;
-    static_assert ((PAGE_BITS & ((PAGE_BITS) - 1)) == 0, "");
-
-    static unsigned int elt_get_min (const elt_t &elt) { return hb_ctz (elt); }
-    static unsigned int elt_get_max (const elt_t &elt) { return hb_bit_storage (elt) - 1; }
-
-    typedef hb_vector_size_t<elt_t, PAGE_BITS / 8> vector_t;
-
-    static constexpr unsigned ELT_BITS = sizeof (elt_t) * 8;
-    static constexpr unsigned ELT_MASK = ELT_BITS - 1;
-    static constexpr unsigned BITS = sizeof (vector_t) * 8;
-    static constexpr unsigned MASK = BITS - 1;
-    static_assert ((unsigned) PAGE_BITS == (unsigned) BITS, "");
-
-    elt_t &elt (hb_codepoint_t g) { return v[(g & MASK) / ELT_BITS]; }
-    elt_t const &elt (hb_codepoint_t g) const { return v[(g & MASK) / ELT_BITS]; }
-    elt_t mask (hb_codepoint_t g) const { return elt_t (1) << (g & ELT_MASK); }
-
-    vector_t v;
-  };
-  static_assert (page_t::PAGE_BITS == sizeof (page_t) * 8, "");
-
-  hb_object_header_t header;
-  bool successful; /* Allocations successful */
-  mutable unsigned int population;
-  hb_sorted_vector_t<page_map_t> page_map;
-  hb_vector_t<page_t> pages;
-
-  void init_shallow ()
+    for (auto&& item : lst)
+      add (item);
+  }
+  template <typename Iterable,
+           hb_requires (hb_is_iterable (Iterable))>
+  hb_sparseset_t (const Iterable &o) : hb_sparseset_t ()
   {
-    successful = true;
-    population = 0;
-    page_map.init ();
-    pages.init ();
+    hb_copy (o, *this);
   }
+
+  void init_shallow () { s.init (); }
   void init ()
   {
     hb_object_init (this);
     init_shallow ();
   }
-  void fini_shallow ()
-  {
-    population = 0;
-    page_map.fini ();
-    pages.fini ();
-  }
+  void fini_shallow () { s.fini (); }
   void fini ()
   {
     hb_object_fini (this);
     fini_shallow ();
   }
 
-  bool in_error () const { return !successful; }
-
-  bool resize (unsigned int count)
-  {
-    if (unlikely (!successful)) return false;
-    if (!pages.resize (count) || !page_map.resize (count))
-    {
-      pages.resize (page_map.length);
-      successful = false;
-      return false;
-    }
-    return true;
-  }
-
-  void reset ()
-  {
-    if (unlikely (hb_object_is_immutable (this)))
-      return;
-    clear ();
-    successful = true;
-  }
+  explicit operator bool () const { return !is_empty (); }
 
-  void clear ()
-  {
-    if (unlikely (hb_object_is_immutable (this)))
-      return;
-    population = 0;
-    page_map.resize (0);
-    pages.resize (0);
-  }
-  bool is_empty () const
-  {
-    unsigned int count = pages.length;
-    for (unsigned int i = 0; i < count; i++)
-      if (!pages[i].is_empty ())
-       return false;
-    return true;
-  }
+  void err () { s.err (); }
+  bool in_error () const { return s.in_error (); }
 
-  void dirty () { population = UINT_MAX; }
+  void reset () { s.reset (); }
+  void clear () { s.clear (); }
+  void invert () { s.invert (); }
+  bool is_empty () const { return s.is_empty (); }
 
-  void add (hb_codepoint_t g)
-  {
-    if (unlikely (!successful)) return;
-    if (unlikely (g == INVALID)) return;
-    dirty ();
-    page_t *page = page_for_insert (g); if (unlikely (!page)) return;
-    page->add (g);
-  }
-  bool add_range (hb_codepoint_t a, hb_codepoint_t b)
-  {
-    if (unlikely (!successful)) return true; /* https://github.com/harfbuzz/harfbuzz/issues/657 */
-    if (unlikely (a > b || a == INVALID || b == INVALID)) return false;
-    dirty ();
-    unsigned int ma = get_major (a);
-    unsigned int mb = get_major (b);
-    if (ma == mb)
-    {
-      page_t *page = page_for_insert (a); if (unlikely (!page)) return false;
-      page->add_range (a, b);
-    }
-    else
-    {
-      page_t *page = page_for_insert (a); if (unlikely (!page)) return false;
-      page->add_range (a, major_start (ma + 1) - 1);
-
-      for (unsigned int m = ma + 1; m < mb; m++)
-      {
-       page = page_for_insert (major_start (m)); if (unlikely (!page)) return false;
-       page->init1 ();
-      }
-
-      page = page_for_insert (b); if (unlikely (!page)) return false;
-      page->add_range (major_start (mb), b);
-    }
-    return true;
-  }
+  void add (hb_codepoint_t g) { s.add (g); }
+  bool add_range (hb_codepoint_t a, hb_codepoint_t b) { return s.add_range (a, b); }
 
   template <typename T>
   void add_array (const T *array, unsigned int count, unsigned int stride=sizeof(T))
-  {
-    if (unlikely (!successful)) return;
-    if (!count) return;
-    dirty ();
-    hb_codepoint_t g = *array;
-    while (count)
-    {
-      unsigned int m = get_major (g);
-      page_t *page = page_for_insert (g); if (unlikely (!page)) return;
-      unsigned int start = major_start (m);
-      unsigned int end = major_start (m + 1);
-      do
-      {
-       page->add (g);
-
-       array = &StructAtOffsetUnaligned<T> (array, stride);
-       count--;
-      }
-      while (count && (g = *array, start <= g && g < end));
-    }
-  }
+  { s.add_array (array, count, stride); }
+  template <typename T>
+  void add_array (const hb_array_t<const T>& arr) { add_array (&arr, arr.len ()); }
 
   /* Might return false if array looks unsorted.
    * Used for faster rejection of corrupt data. */
   template <typename T>
   bool add_sorted_array (const T *array, unsigned int count, unsigned int stride=sizeof(T))
-  {
-    if (unlikely (!successful)) return true; /* https://github.com/harfbuzz/harfbuzz/issues/657 */
-    if (!count) return true;
-    dirty ();
-    hb_codepoint_t g = *array;
-    hb_codepoint_t last_g = g;
-    while (count)
-    {
-      unsigned int m = get_major (g);
-      page_t *page = page_for_insert (g); if (unlikely (!page)) return false;
-      unsigned int end = major_start (m + 1);
-      do
-      {
-       /* If we try harder we can change the following comparison to <=;
-        * Not sure if it's worth it. */
-       if (g < last_g) return false;
-       last_g = g;
-       page->add (g);
-
-       array = (const T *) ((const char *) array + stride);
-       count--;
-      }
-      while (count && (g = *array, g < end));
-    }
-    return true;
-  }
-
-  void del (hb_codepoint_t g)
-  {
-    /* TODO perform op even if !successful. */
-    if (unlikely (!successful)) return;
-    page_t *page = page_for (g);
-    if (!page)
-      return;
-    dirty ();
-    page->del (g);
-  }
-
-  private:
-  void del_pages (int ds, int de)
-  {
-    if (ds <= de)
-    {
-      unsigned int write_index = 0;
-      for (unsigned int i = 0; i < page_map.length; i++)
-      {
-       int m = (int) page_map[i].major;
-       if (m < ds || de < m)
-         page_map[write_index++] = page_map[i];
-      }
-      compact (write_index);
-      resize (write_index);
-    }
-  }
+  { return s.add_sorted_array (array, count, stride); }
+  template <typename T>
+  bool add_sorted_array (const hb_sorted_array_t<const T>& arr) { return add_sorted_array (&arr, arr.len ()); }
 
-  public:
-  void del_range (hb_codepoint_t a, hb_codepoint_t b)
-  {
-    /* TODO perform op even if !successful. */
-    if (unlikely (!successful)) return;
-    if (unlikely (a > b || a == INVALID || b == INVALID)) return;
-    dirty ();
-    unsigned int ma = get_major (a);
-    unsigned int mb = get_major (b);
-    /* Delete pages from ds through de if ds <= de. */
-    int ds = (a == major_start (ma))? (int) ma: (int) (ma + 1);
-    int de = (b + 1 == major_start (mb + 1))? (int) mb: ((int) mb - 1);
-    if (ds > de || (int) ma < ds)
-    {
-      page_t *page = page_for (a);
-      if (page)
-      {
-       if (ma == mb)
-         page->del_range (a, b);
-       else
-         page->del_range (a, major_start (ma + 1) - 1);
-      }
-    }
-    if (de < (int) mb && ma != mb)
-    {
-      page_t *page = page_for (b);
-      if (page)
-       page->del_range (major_start (mb), b);
-    }
-    del_pages (ds, de);
-  }
+  void del (hb_codepoint_t g) { s.del (g); }
+  void del_range (hb_codepoint_t a, hb_codepoint_t b) { s.del_range (a, b); }
 
-  bool get (hb_codepoint_t g) const
-  {
-    const page_t *page = page_for (g);
-    if (!page)
-      return false;
-    return page->get (g);
-  }
+  bool get (hb_codepoint_t g) const { return s.get (g); }
 
   /* Has interface. */
   static constexpr bool SENTINEL = false;
@@ -450,435 +113,60 @@ struct hb_set_t
   bool operator () (hb_codepoint_t k) const { return has (k); }
 
   /* Sink interface. */
-  hb_set_t& operator << (hb_codepoint_t v)
+  hb_sparseset_t& operator << (hb_codepoint_t v)
   { add (v); return *this; }
-  hb_set_t& operator << (const hb_pair_t<hb_codepoint_t, hb_codepoint_t>& range)
+  hb_sparseset_t& operator << (const hb_pair_t<hb_codepoint_t, hb_codepoint_t>& range)
   { add_range (range.first, range.second); return *this; }
 
   bool intersects (hb_codepoint_t first, hb_codepoint_t last) const
-  {
-    hb_codepoint_t c = first - 1;
-    return next (&c) && c <= last;
-  }
-  void set (const hb_set_t *other)
-  {
-    if (unlikely (!successful)) return;
-    unsigned int count = other->pages.length;
-    if (!resize (count))
-      return;
-    population = other->population;
-    memcpy ((void *) pages, (const void *) other->pages, count * pages.item_size);
-    memcpy ((void *) page_map, (const void *) other->page_map, count * page_map.item_size);
-  }
+  { return s.intersects (first, last); }
 
-  bool is_equal (const hb_set_t *other) const
-  {
-    if (get_population () != other->get_population ())
-      return false;
+  void set (const hb_sparseset_t &other) { s.set (other.s); }
 
-    unsigned int na = pages.length;
-    unsigned int nb = other->pages.length;
+  bool is_equal (const hb_sparseset_t &other) const { return s.is_equal (other.s); }
 
-    unsigned int a = 0, b = 0;
-    for (; a < na && b < nb; )
-    {
-      if (page_at (a).is_empty ()) { a++; continue; }
-      if (other->page_at (b).is_empty ()) { b++; continue; }
-      if (page_map[a].major != other->page_map[b].major ||
-         !page_at (a).is_equal (&other->page_at (b)))
-       return false;
-      a++;
-      b++;
-    }
-    for (; a < na; a++)
-      if (!page_at (a).is_empty ()) { return false; }
-    for (; b < nb; b++)
-      if (!other->page_at (b).is_empty ()) { return false; }
+  bool is_subset (const hb_sparseset_t &larger_set) const { return s.is_subset (larger_set.s); }
 
-    return true;
-  }
-
-  bool is_subset (const hb_set_t *larger_set) const
-  {
-    if (get_population () > larger_set->get_population ())
-      return false;
-
-    /* TODO Optimize to use pages. */
-    hb_codepoint_t c = INVALID;
-    while (next (&c))
-      if (!larger_set->has (c))
-       return false;
-
-    return true;
-  }
-
-  void compact (unsigned int length)
-  {
-    hb_vector_t<uint32_t> old_index_to_page_map_index;
-    old_index_to_page_map_index.resize(pages.length);
-    for (uint32_t i = 0; i < old_index_to_page_map_index.length; i++)
-      old_index_to_page_map_index[i] = 0xFFFFFFFF;
-
-    for (uint32_t i = 0; i < length; i++)
-      old_index_to_page_map_index[page_map[i].index] =  i;
-
-    compact_pages (old_index_to_page_map_index);
-  }
-
-  void compact_pages (const hb_vector_t<uint32_t>& old_index_to_page_map_index)
-  {
-    unsigned int write_index = 0;
-    for (unsigned int i = 0; i < pages.length; i++)
-    {
-      if (old_index_to_page_map_index[i] == 0xFFFFFFFF) continue;
-
-      if (write_index < i)
-       pages[write_index] = pages[i];
-
-      page_map[old_index_to_page_map_index[i]].index = write_index;
-      write_index++;
-    }
-  }
-
-  template <typename Op>
-  void process (const Op& op, const hb_set_t *other)
-  {
-    if (unlikely (!successful)) return;
-
-    dirty ();
-
-    unsigned int na = pages.length;
-    unsigned int nb = other->pages.length;
-    unsigned int next_page = na;
-
-    unsigned int count = 0, newCount = 0;
-    unsigned int a = 0, b = 0;
-    unsigned int write_index = 0;
-    for (; a < na && b < nb; )
-    {
-      if (page_map[a].major == other->page_map[b].major)
-      {
-       if (!Op::passthru_left)
-       {
-         // Move page_map entries that we're keeping from the left side set
-         // to the front of the page_map vector. This isn't necessary if
-         // passthru_left is set since no left side pages will be removed
-         // in that case.
-         if (write_index < a)
-           page_map[write_index] = page_map[a];
-         write_index++;
-       }
-
-       count++;
-       a++;
-       b++;
-      }
-      else if (page_map[a].major < other->page_map[b].major)
-      {
-       if (Op::passthru_left)
-         count++;
-       a++;
-      }
-      else
-      {
-       if (Op::passthru_right)
-         count++;
-       b++;
-      }
-    }
-    if (Op::passthru_left)
-      count += na - a;
-    if (Op::passthru_right)
-      count += nb - b;
-
-    if (!Op::passthru_left)
-    {
-      na  = write_index;
-      next_page = write_index;
-      compact (write_index);
-    }
-
-    if (!resize (count))
-      return;
-
-    newCount = count;
-
-    /* Process in-place backward. */
-    a = na;
-    b = nb;
-    for (; a && b; )
-    {
-      if (page_map[a - 1].major == other->page_map[b - 1].major)
-      {
-       a--;
-       b--;
-       count--;
-       page_map[count] = page_map[a];
-       page_at (count).v = op (page_at (a).v, other->page_at (b).v);
-      }
-      else if (page_map[a - 1].major > other->page_map[b - 1].major)
-      {
-       a--;
-       if (Op::passthru_left)
-       {
-         count--;
-         page_map[count] = page_map[a];
-       }
-      }
-      else
-      {
-       b--;
-       if (Op::passthru_right)
-       {
-         count--;
-         page_map[count].major = other->page_map[b].major;
-         page_map[count].index = next_page++;
-         page_at (count).v = other->page_at (b).v;
-       }
-      }
-    }
-    if (Op::passthru_left)
-      while (a)
-      {
-       a--;
-       count--;
-       page_map[count] = page_map [a];
-      }
-    if (Op::passthru_right)
-      while (b)
-      {
-       b--;
-       count--;
-       page_map[count].major = other->page_map[b].major;
-       page_map[count].index = next_page++;
-       page_at (count).v = other->page_at (b).v;
-      }
-    assert (!count);
-    if (pages.length > newCount)
-      resize (newCount);
-  }
-
-  void union_ (const hb_set_t *other)
-  {
-    process (hb_bitwise_or, other);
-  }
-  void intersect (const hb_set_t *other)
-  {
-    process (hb_bitwise_and, other);
-  }
-  void subtract (const hb_set_t *other)
-  {
-    process (hb_bitwise_sub, other);
-  }
-  void symmetric_difference (const hb_set_t *other)
-  {
-    process (hb_bitwise_xor, other);
-  }
-  bool next (hb_codepoint_t *codepoint) const
-  {
-    if (unlikely (*codepoint == INVALID)) {
-      *codepoint = get_min ();
-      return *codepoint != INVALID;
-    }
+  void union_ (const hb_sparseset_t &other) { s.union_ (other.s); }
+  void intersect (const hb_sparseset_t &other) { s.intersect (other.s); }
+  void subtract (const hb_sparseset_t &other) { s.subtract (other.s); }
+  void symmetric_difference (const hb_sparseset_t &other) { s.symmetric_difference (other.s); }
 
-    page_map_t map = {get_major (*codepoint), 0};
-    unsigned int i;
-    page_map.bfind (map, &i, HB_BFIND_NOT_FOUND_STORE_CLOSEST);
-    if (i < page_map.length && page_map[i].major == map.major)
-    {
-      if (pages[page_map[i].index].next (codepoint))
-      {
-       *codepoint += page_map[i].major * page_t::PAGE_BITS;
-       return true;
-      }
-      i++;
-    }
-    for (; i < page_map.length; i++)
-    {
-      hb_codepoint_t m = pages[page_map[i].index].get_min ();
-      if (m != INVALID)
-      {
-       *codepoint = page_map[i].major * page_t::PAGE_BITS + m;
-       return true;
-      }
-    }
-    *codepoint = INVALID;
-    return false;
-  }
-  bool previous (hb_codepoint_t *codepoint) const
-  {
-    if (unlikely (*codepoint == INVALID)) {
-      *codepoint = get_max ();
-      return *codepoint != INVALID;
-    }
-
-    page_map_t map = {get_major (*codepoint), 0};
-    unsigned int i;
-    page_map.bfind (map, &i, HB_BFIND_NOT_FOUND_STORE_CLOSEST);
-    if (i < page_map.length && page_map[i].major == map.major)
-    {
-      if (pages[page_map[i].index].previous (codepoint))
-      {
-       *codepoint += page_map[i].major * page_t::PAGE_BITS;
-       return true;
-      }
-    }
-    i--;
-    for (; (int) i >= 0; i--)
-    {
-      hb_codepoint_t m = pages[page_map[i].index].get_max ();
-      if (m != INVALID)
-      {
-       *codepoint = page_map[i].major * page_t::PAGE_BITS + m;
-       return true;
-      }
-    }
-    *codepoint = INVALID;
-    return false;
-  }
+  bool next (hb_codepoint_t *codepoint) const { return s.next (codepoint); }
+  bool previous (hb_codepoint_t *codepoint) const { return s.previous (codepoint); }
   bool next_range (hb_codepoint_t *first, hb_codepoint_t *last) const
-  {
-    hb_codepoint_t i;
-
-    i = *last;
-    if (!next (&i))
-    {
-      *last = *first = INVALID;
-      return false;
-    }
-
-    /* TODO Speed up. */
-    *last = *first = i;
-    while (next (&i) && i == *last + 1)
-      (*last)++;
-
-    return true;
-  }
+  { return s.next_range (first, last); }
   bool previous_range (hb_codepoint_t *first, hb_codepoint_t *last) const
-  {
-    hb_codepoint_t i;
-
-    i = *first;
-    if (!previous (&i))
-    {
-      *last = *first = INVALID;
-      return false;
-    }
-
-    /* TODO Speed up. */
-    *last = *first = i;
-    while (previous (&i) && i == *first - 1)
-      (*first)--;
-
-    return true;
-  }
+  { return s.previous_range (first, last); }
 
-  unsigned int get_population () const
-  {
-    if (population != UINT_MAX)
-      return population;
-
-    unsigned int pop = 0;
-    unsigned int count = pages.length;
-    for (unsigned int i = 0; i < count; i++)
-      pop += pages[i].get_population ();
-
-    population = pop;
-    return pop;
-  }
-  hb_codepoint_t get_min () const
-  {
-    unsigned int count = pages.length;
-    for (unsigned int i = 0; i < count; i++)
-      if (!page_at (i).is_empty ())
-       return page_map[i].major * page_t::PAGE_BITS + page_at (i).get_min ();
-    return INVALID;
-  }
-  hb_codepoint_t get_max () const
-  {
-    unsigned int count = pages.length;
-    for (int i = count - 1; i >= 0; i++)
-      if (!page_at (i).is_empty ())
-       return page_map[(unsigned) i].major * page_t::PAGE_BITS + page_at (i).get_max ();
-    return INVALID;
-  }
+  unsigned int get_population () const { return s.get_population (); }
+  hb_codepoint_t get_min () const { return s.get_min (); }
+  hb_codepoint_t get_max () const { return s.get_max (); }
 
-  static constexpr hb_codepoint_t INVALID = HB_SET_VALUE_INVALID;
+  static constexpr hb_codepoint_t INVALID = impl_t::INVALID;
 
   /*
    * Iterator implementation.
    */
-  struct iter_t : hb_iter_with_fallback_t<iter_t, hb_codepoint_t>
-  {
-    static constexpr bool is_sorted_iterator = true;
-    iter_t (const hb_set_t &s_ = Null (hb_set_t),
-           bool init = true) : s (&s_), v (INVALID), l(0)
-    {
-      if (init)
-      {
-       l = s->get_population () + 1;
-       __next__ ();
-      }
-    }
-
-    typedef hb_codepoint_t __item_t__;
-    hb_codepoint_t __item__ () const { return v; }
-    bool __more__ () const { return v != INVALID; }
-    void __next__ () { s->next (&v); if (l) l--; }
-    void __prev__ () { s->previous (&v); }
-    unsigned __len__ () const { return l; }
-    iter_t end () const { return iter_t (*s, false); }
-    bool operator != (const iter_t& o) const
-    { return s != o.s || v != o.v; }
-
-    protected:
-    const hb_set_t *s;
-    hb_codepoint_t v;
-    unsigned l;
-  };
-  iter_t iter () const { return iter_t (*this); }
+  using iter_t = typename impl_t::iter_t;
+  iter_t iter () const { return iter_t (this->s); }
   operator iter_t () const { return iter (); }
+};
 
-  protected:
-
-  page_t *page_for_insert (hb_codepoint_t g)
-  {
-    page_map_t map = {get_major (g), pages.length};
-    unsigned int i;
-    if (!page_map.bfind (map, &i, HB_BFIND_NOT_FOUND_STORE_CLOSEST))
-    {
-      if (!resize (pages.length + 1))
-       return nullptr;
-
-      pages[map.index].init0 ();
-      memmove (page_map + i + 1,
-              page_map + i,
-              (page_map.length - 1 - i) * page_map.item_size);
-      page_map[i] = map;
-    }
-    return &pages[page_map[i].index];
-  }
-  page_t *page_for (hb_codepoint_t g)
-  {
-    page_map_t key = {get_major (g)};
-    const page_map_t *found = page_map.bsearch (key);
-    if (found)
-      return &pages[found->index];
-    return nullptr;
-  }
-  const page_t *page_for (hb_codepoint_t g) const
-  {
-    page_map_t key = {get_major (g)};
-    const page_map_t *found = page_map.bsearch (key);
-    if (found)
-      return &pages[found->index];
-    return nullptr;
-  }
-  page_t &page_at (unsigned int i) { return pages[page_map[i].index]; }
-  const page_t &page_at (unsigned int i) const { return pages[page_map[i].index]; }
-  unsigned int get_major (hb_codepoint_t g) const { return g / page_t::PAGE_BITS; }
-  hb_codepoint_t major_start (unsigned int major) const { return major * page_t::PAGE_BITS; }
+struct hb_set_t : hb_sparseset_t<hb_bit_set_invertible_t>
+{
+  hb_set_t () = default;
+  ~hb_set_t () = default;
+  hb_set_t (hb_set_t&) = default;
+  hb_set_t& operator= (const hb_set_t&) = default;
+  hb_set_t& operator= (hb_set_t&&) = default;
+  hb_set_t (std::initializer_list<hb_codepoint_t> lst) : hb_sparseset_t<hb_bit_set_invertible_t> (lst) {}
+  template <typename Iterable,
+           hb_requires (hb_is_iterable (Iterable))>
+  hb_set_t (const Iterable &o) : hb_sparseset_t<hb_bit_set_invertible_t> (o) {}
 };
 
+static_assert (hb_set_t::INVALID == HB_SET_VALUE_INVALID, "");
+
 
 #endif /* HB_SET_HH */
index 666470b..6633216 100644 (file)
  * @short_description: Object representing a shaping plan
  * @include: hb.h
  *
- * Shape plans are not used for shaping directly, but can be access to query
- * certain information about how shaping will perform given a set of input
- * parameters (script, language, direction, features, etc.)
- * Most client would not need to deal with shape plans directly.
+ * Shape plans are an internal mechanism. Each plan contains state
+ * describing how HarfBuzz will shape a particular text segment, based on
+ * the combination of segment properties and the capabilities in the
+ * font face in use.
+ *
+ * Shape plans are not used for shaping directly, but can be queried to
+ * access certain information about how shaping will perform, given a set
+ * of specific input parameters (script, language, direction, features,
+ * etc.).
+ *
+ * Most client programs will not need to deal with shape plans directly.
  **/
 
 
@@ -59,7 +66,7 @@ hb_shape_plan_key_t::init (bool                           copy,
                           const char * const            *shaper_list)
 {
   hb_feature_t *features = nullptr;
-  if (copy && num_user_features && !(features = (hb_feature_t *) calloc (num_user_features, sizeof (hb_feature_t))))
+  if (copy && num_user_features && !(features = (hb_feature_t *) hb_calloc (num_user_features, sizeof (hb_feature_t))))
     goto bail;
 
   this->props = *props;
@@ -123,7 +130,7 @@ hb_shape_plan_key_t::init (bool                           copy,
 #undef HB_SHAPER_PLAN
 
 bail:
-  ::free (features);
+  ::hb_free (features);
   return false;
 }
 
@@ -164,15 +171,16 @@ hb_shape_plan_key_t::equal (const hb_shape_plan_key_t *other)
 
 /**
  * hb_shape_plan_create: (Xconstructor)
- * @face:
- * @props:
- * @user_features: (array length=num_user_features):
- * @num_user_features:
- * @shaper_list: (array zero-terminated=1):
- *
+ * @face: #hb_face_t to use
+ * @props: The #hb_segment_properties_t of the segment
+ * @user_features: (array length=num_user_features): The list of user-selected features
+ * @num_user_features: The number of user-selected features
+ * @shaper_list: (array zero-terminated=1): List of shapers to try
  *
+ * Constructs a shaping plan for a combination of @face, @user_features, @props,
+ * and @shaper_list.
  *
- * Return value: (transfer full):
+ * Return value: (transfer full): The shaping plan
  *
  * Since: 0.9.7
  **/
@@ -189,6 +197,24 @@ hb_shape_plan_create (hb_face_t                     *face,
                                shaper_list);
 }
 
+/**
+ * hb_shape_plan_create2: (Xconstructor)
+ * @face: #hb_face_t to use
+ * @props: The #hb_segment_properties_t of the segment
+ * @user_features: (array length=num_user_features): The list of user-selected features
+ * @num_user_features: The number of user-selected features
+ * @coords: (array length=num_coords): The list of variation-space coordinates
+ * @num_coords: The number of variation-space coordinates
+ * @shaper_list: (array zero-terminated=1): List of shapers to try
+ *
+ * The variable-font version of #hb_shape_plan_create. 
+ * Constructs a shaping plan for a combination of @face, @user_features, @props,
+ * and @shaper_list, plus the variation-space coordinates @coords.
+ *
+ * Return value: (transfer full): The shaping plan
+ *
+ * Since: 1.4.0
+ **/
 hb_shape_plan_t *
 hb_shape_plan_create2 (hb_face_t                     *face,
                       const hb_segment_properties_t *props,
@@ -238,9 +264,9 @@ hb_shape_plan_create2 (hb_face_t                     *face,
 #ifndef HB_NO_OT_SHAPE
 bail3:
 #endif
-  shape_plan->key.free ();
+  shape_plan->key.fini ();
 bail2:
-  free (shape_plan);
+  hb_free (shape_plan);
 bail:
   return hb_shape_plan_get_empty ();
 }
@@ -248,9 +274,9 @@ bail:
 /**
  * hb_shape_plan_get_empty:
  *
+ * Fetches the singleton empty shaping plan.
  *
- *
- * Return value: (transfer full):
+ * Return value: (transfer full): The empty shaping plan
  *
  * Since: 0.9.7
  **/
@@ -262,11 +288,11 @@ hb_shape_plan_get_empty ()
 
 /**
  * hb_shape_plan_reference: (skip)
- * @shape_plan: a shape plan.
+ * @shape_plan: A shaping plan
  *
+ * Increases the reference count on the given shaping plan.
  *
- *
- * Return value: (transfer full):
+ * Return value: (transfer full): @shape_plan
  *
  * Since: 0.9.7
  **/
@@ -278,9 +304,11 @@ hb_shape_plan_reference (hb_shape_plan_t *shape_plan)
 
 /**
  * hb_shape_plan_destroy: (skip)
- * @shape_plan: a shape plan.
- *
+ * @shape_plan: A shaping plan
  *
+ * Decreases the reference count on the given shaping plan. When the
+ * reference count reaches zero, the shaping plan is destroyed,
+ * freeing all memory.
  *
  * Since: 0.9.7
  **/
@@ -292,21 +320,21 @@ hb_shape_plan_destroy (hb_shape_plan_t *shape_plan)
 #ifndef HB_NO_OT_SHAPE
   shape_plan->ot.fini ();
 #endif
-  shape_plan->key.free ();
-  free (shape_plan);
+  shape_plan->key.fini ();
+  hb_free (shape_plan);
 }
 
 /**
  * hb_shape_plan_set_user_data: (skip)
- * @shape_plan: a shape plan.
- * @key:
- * @data:
- * @destroy:
- * @replace:
- *
+ * @shape_plan: A shaping plan
+ * @key: The user-data key to set
+ * @data: A pointer to the user data
+ * @destroy: (nullable): A callback to call when @data is not needed anymore
+ * @replace: Whether to replace an existing data with the same key
  *
+ * Attaches a user-data key/data pair to the given shaping plan. 
  *
- * Return value:
+ * Return value: %true if success, %false otherwise.
  *
  * Since: 0.9.7
  **/
@@ -322,12 +350,13 @@ hb_shape_plan_set_user_data (hb_shape_plan_t    *shape_plan,
 
 /**
  * hb_shape_plan_get_user_data: (skip)
- * @shape_plan: a shape plan.
- * @key:
+ * @shape_plan: A shaping plan
+ * @key: The user-data key to query
  *
+ * Fetches the user data associated with the specified key, 
+ * attached to the specified shaping plan.
  *
- *
- * Return value: (transfer none):
+ * Return value: (transfer none): A pointer to the user data
  *
  * Since: 0.9.7
  **/
@@ -340,11 +369,11 @@ hb_shape_plan_get_user_data (hb_shape_plan_t    *shape_plan,
 
 /**
  * hb_shape_plan_get_shaper:
- * @shape_plan: a shape plan.
- *
+ * @shape_plan: A shaping plan
  *
+ * Fetches the shaper from a given shaping plan.
  *
- * Return value: (transfer none):
+ * Return value: (transfer none): The shaper
  *
  * Since: 0.9.7
  **/
@@ -355,26 +384,12 @@ hb_shape_plan_get_shaper (hb_shape_plan_t *shape_plan)
 }
 
 
-/**
- * hb_shape_plan_execute:
- * @shape_plan: a shape plan.
- * @font: a font.
- * @buffer: a buffer.
- * @features: (array length=num_features):
- * @num_features:
- *
- *
- *
- * Return value:
- *
- * Since: 0.9.7
- **/
-hb_bool_t
-hb_shape_plan_execute (hb_shape_plan_t    *shape_plan,
-                      hb_font_t          *font,
-                      hb_buffer_t        *buffer,
-                      const hb_feature_t *features,
-                      unsigned int        num_features)
+static bool
+_hb_shape_plan_execute_internal (hb_shape_plan_t    *shape_plan,
+                                hb_font_t          *font,
+                                hb_buffer_t        *buffer,
+                                const hb_feature_t *features,
+                                unsigned int        num_features)
 {
   DEBUG_MSG_FUNC (SHAPE_PLAN, shape_plan,
                  "num_features=%d shaper_func=%p, shaper_name=%s",
@@ -386,9 +401,10 @@ hb_shape_plan_execute (hb_shape_plan_t    *shape_plan,
     return true;
 
   assert (!hb_object_is_immutable (buffer));
-  assert (buffer->content_type == HB_BUFFER_CONTENT_TYPE_UNICODE);
 
-  if (unlikely (hb_object_is_inert (shape_plan)))
+  buffer->assert_unicode ();
+
+  if (unlikely (!hb_object_is_valid (shape_plan)))
     return false;
 
   assert (shape_plan->face_unsafe == font->face);
@@ -412,6 +428,36 @@ hb_shape_plan_execute (hb_shape_plan_t    *shape_plan,
 
   return false;
 }
+/**
+ * hb_shape_plan_execute:
+ * @shape_plan: A shaping plan
+ * @font: The #hb_font_t to use
+ * @buffer: The #hb_buffer_t to work upon
+ * @features: (array length=num_features): Features to enable
+ * @num_features: The number of features to enable
+ *
+ * Executes the given shaping plan on the specified buffer, using
+ * the given @font and @features.
+ *
+ * Return value: %true if success, %false otherwise.
+ *
+ * Since: 0.9.7
+ **/
+hb_bool_t
+hb_shape_plan_execute (hb_shape_plan_t    *shape_plan,
+                      hb_font_t          *font,
+                      hb_buffer_t        *buffer,
+                      const hb_feature_t *features,
+                      unsigned int        num_features)
+{
+  bool ret = _hb_shape_plan_execute_internal (shape_plan, font, buffer,
+                                             features, num_features);
+
+  if (ret && buffer->content_type == HB_BUFFER_CONTENT_TYPE_UNICODE)
+    buffer->content_type = HB_BUFFER_CONTENT_TYPE_GLYPHS;
+
+  return ret;
+}
 
 
 /*
@@ -420,15 +466,16 @@ hb_shape_plan_execute (hb_shape_plan_t    *shape_plan,
 
 /**
  * hb_shape_plan_create_cached:
- * @face:
- * @props:
- * @user_features: (array length=num_user_features):
- * @num_user_features:
- * @shaper_list: (array zero-terminated=1):
- *
+ * @face: #hb_face_t to use
+ * @props: The #hb_segment_properties_t of the segment
+ * @user_features: (array length=num_user_features): The list of user-selected features
+ * @num_user_features: The number of user-selected features
+ * @shaper_list: (array zero-terminated=1): List of shapers to try
  *
+ * Creates a cached shaping plan suitable for reuse, for a combination
+ * of @face, @user_features, @props, and @shaper_list.
  *
- * Return value: (transfer full):
+ * Return value: (transfer full): The shaping plan
  *
  * Since: 0.9.7
  **/
@@ -445,6 +492,25 @@ hb_shape_plan_create_cached (hb_face_t                     *face,
                                       shaper_list);
 }
 
+/**
+ * hb_shape_plan_create_cached2:
+ * @face: #hb_face_t to use
+ * @props: The #hb_segment_properties_t of the segment
+ * @user_features: (array length=num_user_features): The list of user-selected features
+ * @num_user_features: The number of user-selected features
+ * @coords: (array length=num_coords): The list of variation-space coordinates
+ * @num_coords: The number of variation-space coordinates
+ * @shaper_list: (array zero-terminated=1): List of shapers to try
+ *
+ * The variable-font version of #hb_shape_plan_create_cached. 
+ * Creates a cached shaping plan suitable for reuse, for a combination
+ * of @face, @user_features, @props, and @shaper_list, plus the
+ * variation-space coordinates @coords.
+ *
+ * Return value: (transfer full): The shaping plan
+ *
+ * Since: 1.4.0
+ **/
 hb_shape_plan_t *
 hb_shape_plan_create_cached2 (hb_face_t                     *face,
                              const hb_segment_properties_t *props,
@@ -463,7 +529,7 @@ hb_shape_plan_create_cached2 (hb_face_t                     *face,
 retry:
   hb_face_t::plan_node_t *cached_plan_nodes = face->shape_plans;
 
-  bool dont_cache = hb_object_is_inert (face);
+  bool dont_cache = !hb_object_is_valid (face);
 
   if (likely (!dont_cache))
   {
@@ -494,7 +560,7 @@ retry:
   if (unlikely (dont_cache))
     return shape_plan;
 
-  hb_face_t::plan_node_t *node = (hb_face_t::plan_node_t *) calloc (1, sizeof (hb_face_t::plan_node_t));
+  hb_face_t::plan_node_t *node = (hb_face_t::plan_node_t *) hb_calloc (1, sizeof (hb_face_t::plan_node_t));
   if (unlikely (!node))
     return shape_plan;
 
@@ -504,7 +570,7 @@ retry:
   if (unlikely (!face->shape_plans.cmpexch (cached_plan_nodes, node)))
   {
     hb_shape_plan_destroy (shape_plan);
-    free (node);
+    hb_free (node);
     goto retry;
   }
   DEBUG_MSG_FUNC (SHAPE_PLAN, shape_plan, "inserted into cache");
index b62ae7c..fc7c041 100644 (file)
@@ -24,7 +24,7 @@
  * Google Author(s): Behdad Esfahbod
  */
 
-#ifndef HB_H_IN
+#if !defined(HB_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb.h> instead."
 #endif
 
 
 HB_BEGIN_DECLS
 
+/**
+ * hb_shape_plan_t:
+ *
+ * Data type for holding a shaping plan. 
+ *
+ * Shape plans contain information about how HarfBuzz will shape a
+ * particular text segment, based on the segment's properties and the
+ * capabilities in the font face in use.
+ *
+ * Shape plans can be queried about how shaping will perform, given a set
+ * of specific input parameters (script, language, direction, features,
+ * etc.).
+ *
+ **/
 typedef struct hb_shape_plan_t hb_shape_plan_t;
 
 HB_EXTERN hb_shape_plan_t *
index 6da7edb..8cb4ddb 100644 (file)
@@ -55,7 +55,7 @@ struct hb_shape_plan_key_t
                         unsigned int                   num_coords,
                         const char * const            *shaper_list);
 
-  HB_INTERNAL void free () { ::free ((void *) user_features); }
+  HB_INTERNAL void fini () { hb_free ((void *) user_features); }
 
   HB_INTERNAL bool user_features_match (const hb_shape_plan_key_t *other);
 
index cf4e152..3407e1a 100644 (file)
@@ -48,9 +48,7 @@
  **/
 
 
-#if HB_USE_ATEXIT
-static void free_static_shaper_list ();
-#endif
+static inline void free_static_shaper_list ();
 
 static const char *nil_shaper_list[] = {nullptr};
 
@@ -59,7 +57,7 @@ static struct hb_shaper_list_lazy_loader_t : hb_lazy_loader_t<const char *,
 {
   static const char ** create ()
   {
-    const char **shaper_list = (const char **) calloc (1 + HB_SHAPERS_COUNT, sizeof (const char *));
+    const char **shaper_list = (const char **) hb_calloc (1 + HB_SHAPERS_COUNT, sizeof (const char *));
     if (unlikely (!shaper_list))
       return nullptr;
 
@@ -69,25 +67,21 @@ static struct hb_shaper_list_lazy_loader_t : hb_lazy_loader_t<const char *,
       shaper_list[i] = shapers[i].name;
     shaper_list[i] = nullptr;
 
-#if HB_USE_ATEXIT
-    atexit (free_static_shaper_list);
-#endif
+    hb_atexit (free_static_shaper_list);
 
     return shaper_list;
   }
   static void destroy (const char **l)
-  { free (l); }
+  { hb_free (l); }
   static const char ** get_null ()
   { return nil_shaper_list; }
 } static_shaper_list;
 
-#if HB_USE_ATEXIT
-static
+static inline
 void free_static_shaper_list ()
 {
   static_shaper_list.free_instance ();
 }
-#endif
 
 
 /**
@@ -111,10 +105,10 @@ hb_shape_list_shapers ()
  * hb_shape_full:
  * @font: an #hb_font_t to use for shaping
  * @buffer: an #hb_buffer_t to shape
- * @features: (array length=num_features) (allow-none): an array of user
+ * @features: (array length=num_features) (nullable): an array of user
  *    specified #hb_feature_t or %NULL
  * @num_features: the length of @features array
- * @shaper_list: (array zero-terminated=1) (allow-none): a %NULL-terminated
+ * @shaper_list: (array zero-terminated=1) (nullable): a %NULL-terminated
  *    array of shapers to use or %NULL
  *
  * See hb_shape() for details. If @shaper_list is not %NULL, the specified
@@ -132,6 +126,13 @@ hb_shape_full (hb_font_t          *font,
               unsigned int        num_features,
               const char * const *shaper_list)
 {
+  hb_buffer_t *text_buffer = nullptr;
+  if (buffer->flags & HB_BUFFER_FLAG_VERIFY)
+  {
+    text_buffer = hb_buffer_create ();
+    hb_buffer_append (text_buffer, buffer, 0, -1);
+  }
+
   hb_shape_plan_t *shape_plan = hb_shape_plan_create_cached2 (font->face, &buffer->props,
                                                              features, num_features,
                                                              font->coords, font->num_coords,
@@ -139,8 +140,17 @@ hb_shape_full (hb_font_t          *font,
   hb_bool_t res = hb_shape_plan_execute (shape_plan, font, buffer, features, num_features);
   hb_shape_plan_destroy (shape_plan);
 
-  if (res)
-    buffer->content_type = HB_BUFFER_CONTENT_TYPE_GLYPHS;
+  if (text_buffer)
+  {
+    if (res && !buffer->verify (text_buffer,
+                               font,
+                               features,
+                               num_features,
+                               shaper_list))
+      res = false;
+    hb_buffer_destroy (text_buffer);
+  }
+
   return res;
 }
 
@@ -148,7 +158,7 @@ hb_shape_full (hb_font_t          *font,
  * hb_shape:
  * @font: an #hb_font_t to use for shaping
  * @buffer: an #hb_buffer_t to shape
- * @features: (array length=num_features) (allow-none): an array of user
+ * @features: (array length=num_features) (nullable): an array of user
  *    specified #hb_feature_t or %NULL
  * @num_features: the length of @features array
  *
index 39507ff..922f8c0 100644 (file)
@@ -26,7 +26,7 @@
  * Google Author(s): Behdad Esfahbod
  */
 
-#ifndef HB_H_IN
+#if !defined(HB_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb.h> instead."
 #endif
 
index 0ea68ad..a11ed83 100644 (file)
@@ -38,9 +38,7 @@ static const hb_shaper_entry_t all_shapers[] = {
 static_assert (0 != ARRAY_LENGTH_CONST (all_shapers), "No shaper enabled.");
 #endif
 
-#if HB_USE_ATEXIT
-static void free_static_shapers ();
-#endif
+static inline void free_static_shapers ();
 
 static struct hb_shapers_lazy_loader_t : hb_lazy_loader_t<const hb_shaper_entry_t,
                                                          hb_shapers_lazy_loader_t>
@@ -51,7 +49,7 @@ static struct hb_shapers_lazy_loader_t : hb_lazy_loader_t<const hb_shaper_entry_
     if (!env || !*env)
       return nullptr;
 
-    hb_shaper_entry_t *shapers = (hb_shaper_entry_t *) calloc (1, sizeof (all_shapers));
+    hb_shaper_entry_t *shapers = (hb_shaper_entry_t *) hb_calloc (1, sizeof (all_shapers));
     if (unlikely (!shapers))
       return nullptr;
 
@@ -83,23 +81,19 @@ static struct hb_shapers_lazy_loader_t : hb_lazy_loader_t<const hb_shaper_entry_
        p = end + 1;
     }
 
-#if HB_USE_ATEXIT
-    atexit (free_static_shapers);
-#endif
+    hb_atexit (free_static_shapers);
 
     return shapers;
   }
-  static void destroy (const hb_shaper_entry_t *p) { free ((void *) p); }
+  static void destroy (const hb_shaper_entry_t *p) { hb_free ((void *) p); }
   static const hb_shaper_entry_t *get_null ()      { return all_shapers; }
 } static_shapers;
 
-#if HB_USE_ATEXIT
-static
+static inline
 void free_static_shapers ()
 {
   static_shapers.free_instance ();
 }
-#endif
 
 const hb_shaper_entry_t *
 _hb_shapers_get ()
index f5b7fa5..ec4b241 100644 (file)
@@ -43,6 +43,7 @@ uint64_t const _hb_NullPool[(HB_NULL_POOL_SIZE + sizeof (uint64_t) - 1) / sizeof
 /*thread_local*/ uint64_t _hb_CrapPool[(HB_NULL_POOL_SIZE + sizeof (uint64_t) - 1) / sizeof (uint64_t)] = {};
 
 DEFINE_NULL_NAMESPACE_BYTES (OT, Index) =  {0xFF,0xFF};
+DEFINE_NULL_NAMESPACE_BYTES (OT, VarIdx) =  {0xFF,0xFF,0xFF,0xFF};
 DEFINE_NULL_NAMESPACE_BYTES (OT, LangSys) = {0x00,0x00, 0xFF,0xFF, 0x00,0x00};
 DEFINE_NULL_NAMESPACE_BYTES (OT, RangeRecord) = {0x00,0x01, 0x00,0x00, 0x00, 0x00};
 DEFINE_NULL_NAMESPACE_BYTES (OT, CmapSubtableLongGroup) = {0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00};
diff --git a/src/hb-style.cc b/src/hb-style.cc
new file mode 100644 (file)
index 0000000..c0c5c48
--- /dev/null
@@ -0,0 +1,135 @@
+/*
+ * Copyright © 2019  Ebrahim Byagowi
+ *
+ *  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.
+ */
+
+#include "hb.hh"
+
+#ifndef HB_NO_STYLE
+
+#include "hb-ot-var-avar-table.hh"
+#include "hb-ot-var-fvar-table.hh"
+#include "hb-ot-stat-table.hh"
+#include "hb-ot-os2-table.hh"
+#include "hb-ot-head-table.hh"
+#include "hb-ot-post-table.hh"
+#include "hb-ot-face.hh"
+
+/**
+ * SECTION:hb-style
+ * @title: hb-style
+ * @short_description: Font Styles
+ * @include: hb.h
+ *
+ * Functions for fetching style information from fonts.
+ **/
+
+static inline float
+_hb_angle_to_ratio (float a)
+{
+  return tanf (a * float (M_PI / 180.));
+}
+
+static inline float
+_hb_ratio_to_angle (float r)
+{
+  return atanf (r) * float (180. / M_PI);
+}
+
+/**
+ * hb_style_get_value:
+ * @font: a #hb_font_t object.
+ * @style_tag: a style tag.
+ *
+ * Searches variation axes of a #hb_font_t object for a specific axis first,
+ * if not set, then tries to get default style values from different
+ * tables of the font.
+ *
+ * Returns: Corresponding axis or default value to a style tag.
+ *
+ * Since: 3.0.0
+ **/
+float
+hb_style_get_value (hb_font_t *font, hb_style_tag_t style_tag)
+{
+  if (unlikely (style_tag == HB_STYLE_TAG_SLANT_RATIO))
+    return _hb_angle_to_ratio (hb_style_get_value (font, HB_STYLE_TAG_SLANT_ANGLE))
+        + font->slant;
+
+  hb_face_t *face = font->face;
+
+#ifndef HB_NO_VAR
+  hb_ot_var_axis_info_t axis;
+  if (hb_ot_var_find_axis_info (face, style_tag, &axis))
+  {
+    if (axis.axis_index < font->num_coords) return font->design_coords[axis.axis_index];
+    /* If a face is variable, fvar's default_value is better than STAT records */
+    return axis.default_value;
+  }
+#endif
+
+  if (style_tag == HB_STYLE_TAG_OPTICAL_SIZE && font->ptem)
+    return font->ptem;
+
+  /* STAT */
+  float value;
+  if (face->table.STAT->get_value (style_tag, &value))
+    return value;
+
+  switch ((unsigned) style_tag)
+  {
+  case HB_STYLE_TAG_ITALIC:
+    return face->table.OS2->is_italic () || face->table.head->is_italic () ? 1 : 0;
+  case HB_STYLE_TAG_OPTICAL_SIZE:
+  {
+    unsigned int lower, design, upper;
+    return face->table.OS2->v5 ().get_optical_size (&lower, &upper)
+          ? (float) (lower + upper) / 2.f
+          : hb_ot_layout_get_size_params (face, &design, nullptr, nullptr, nullptr, nullptr)
+          ? design / 10.f
+          : 12.f;
+  }
+  case HB_STYLE_TAG_SLANT_ANGLE:
+  {
+    float angle = face->table.post->table->italicAngle.to_float ();
+
+    if (font->slant)
+      angle = _hb_ratio_to_angle (font->slant + _hb_angle_to_ratio (angle));
+
+    return angle;
+  }
+  case HB_STYLE_TAG_WIDTH:
+    return face->table.OS2->has_data ()
+          ? face->table.OS2->get_width ()
+          : (face->table.head->is_condensed () ? 75 :
+             face->table.head->is_expanded () ? 125 :
+             100);
+  case HB_STYLE_TAG_WEIGHT:
+    return face->table.OS2->has_data ()
+          ? face->table.OS2->usWeightClass
+          : (face->table.head->is_bold () ? 700 : 400);
+  default:
+    return 0;
+  }
+}
+
+#endif
diff --git a/src/hb-style.h b/src/hb-style.h
new file mode 100644 (file)
index 0000000..30a6f2b
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * Copyright © 2019  Ebrahim Byagowi
+ *
+ *  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.
+ */
+
+#if !defined(HB_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
+#error "Include <hb.h> instead."
+#endif
+
+#ifndef HB_STYLE_H
+#define HB_STYLE_H
+
+#include "hb.h"
+
+HB_BEGIN_DECLS
+
+/**
+ * hb_style_tag_t:
+ * @HB_STYLE_TAG_ITALIC: Used to vary between non-italic and italic.
+ * A value of 0 can be interpreted as "Roman" (non-italic); a value of 1 can
+ * be interpreted as (fully) italic.
+ * @HB_STYLE_TAG_OPTICAL_SIZE: Used to vary design to suit different text sizes.
+ * Non-zero. Values can be interpreted as text size, in points.
+ * @HB_STYLE_TAG_SLANT_ANGLE: Used to vary between upright and slanted text. Values
+ * must be greater than -90 and less than +90. Values can be interpreted as
+ * the angle, in counter-clockwise degrees, of oblique slant from whatever the
+ * designer considers to be upright for that font design.
+ * @HB_STYLE_TAG_SLANT_RATIO: same as @HB_STYLE_TAG_SLANT_ANGLE expression as ratio.
+ * @HB_STYLE_TAG_WIDTH: Used to vary width of text from narrower to wider.
+ * Non-zero. Values can be interpreted as a percentage of whatever the font
+ * designer considers “normal width” for that font design.
+ * @HB_STYLE_TAG_WEIGHT: Used to vary stroke thicknesses or other design details
+ * to give variation from lighter to blacker. Values can be interpreted in direct
+ * comparison to values for usWeightClass in the OS/2 table,
+ * or the CSS font-weight property.
+ *
+ * Defined by [OpenType Design-Variation Axis Tag Registry](https://docs.microsoft.com/en-us/typography/opentype/spec/dvaraxisreg).
+ *
+ * Since: 3.0.0
+ **/
+typedef enum
+{
+  HB_STYLE_TAG_ITALIC          = HB_TAG ('i','t','a','l'),
+  HB_STYLE_TAG_OPTICAL_SIZE    = HB_TAG ('o','p','s','z'),
+  HB_STYLE_TAG_SLANT_ANGLE     = HB_TAG ('s','l','n','t'),
+  HB_STYLE_TAG_SLANT_RATIO     = HB_TAG ('S','l','n','t'),
+  HB_STYLE_TAG_WIDTH           = HB_TAG ('w','d','t','h'),
+  HB_STYLE_TAG_WEIGHT          = HB_TAG ('w','g','h','t'),
+
+  /*< private >*/
+  _HB_STYLE_TAG_MAX_VALUE      = HB_TAG_MAX_SIGNED /*< skip >*/
+} hb_style_tag_t;
+
+
+HB_EXTERN float
+hb_style_get_value (hb_font_t *font, hb_style_tag_t style_tag);
+
+HB_END_DECLS
+
+#endif /* HB_STYLE_H */
index 04e1db2..711b223 100644 (file)
 
 using namespace CFF;
 
-/**
- * hb_plan_subset_cff_fdselect
- * Determine an optimal FDSelect format according to a provided plan.
+
+/* Determine an optimal FDSelect format according to a provided plan.
  *
  * Return value: FDSelect format, size, and ranges for the most compact subset FDSelect
  * along with a font index remapping table
- **/
+ */
 
 bool
 hb_plan_subset_cff_fdselect (const hb_subset_plan_t *plan,
@@ -169,10 +168,7 @@ serialize_fdselect_3_4 (hb_serialize_context_t *c,
   return_trace (true);
 }
 
-/**
- * hb_serialize_cff_fdselect
- * Serialize a subset FDSelect format planned above.
- **/
+/* Serialize a subset FDSelect format planned above. */
 bool
 hb_serialize_cff_fdselect (hb_serialize_context_t *c,
                           const unsigned int num_glyphs,
index 3400892..1865770 100644 (file)
@@ -110,7 +110,11 @@ struct str_encoder_t
   void copy_str (const byte_str_t &str)
   {
     unsigned int  offset = buff.length;
-    buff.resize (offset + str.length);
+    if (unlikely (!buff.resize (offset + str.length)))
+    {
+      set_error ();
+      return;
+    }
     if (unlikely (buff.length < offset + str.length))
     {
       set_error ();
@@ -255,7 +259,10 @@ struct subr_flattener_t
        return false;
       cs_interpreter_t<ENV, OPSET, flatten_param_t> interp;
       interp.env.init (str, acc, fd);
-      flatten_param_t  param = { flat_charstrings[i], plan->drop_hints };
+      flatten_param_t  param = {
+        flat_charstrings[i],
+        (bool) (plan->flags & HB_SUBSET_FLAGS_NO_HINTING)
+      };
       if (unlikely (!interp.interpret (param)))
        return false;
     }
@@ -268,60 +275,36 @@ struct subr_flattener_t
 
 struct subr_closures_t
 {
-  subr_closures_t () : valid (false), global_closure (nullptr)
-  { local_closures.init (); }
-
-  void init (unsigned int fd_count)
+  subr_closures_t (unsigned int fd_count) : valid (false), global_closure (), local_closures ()
   {
     valid = true;
-    global_closure = hb_set_create ();
-    if (global_closure == hb_set_get_empty ())
-      valid = false;
     if (!local_closures.resize (fd_count))
       valid = false;
-
-    for (unsigned int i = 0; i < local_closures.length; i++)
-    {
-      local_closures[i] = hb_set_create ();
-      if (local_closures[i] == hb_set_get_empty ())
-       valid = false;
-    }
-  }
-
-  void fini ()
-  {
-    hb_set_destroy (global_closure);
-    for (unsigned int i = 0; i < local_closures.length; i++)
-      hb_set_destroy (local_closures[i]);
-    local_closures.fini ();
   }
 
   void reset ()
   {
-    hb_set_clear (global_closure);
+    global_closure.clear();
     for (unsigned int i = 0; i < local_closures.length; i++)
-      hb_set_clear (local_closures[i]);
+      local_closures[i].clear();
   }
 
   bool is_valid () const { return valid; }
   bool  valid;
-  hb_set_t  *global_closure;
-  hb_vector_t<hb_set_t *> local_closures;
+  hb_set_t  global_closure;
+  hb_vector_t<hb_set_t> local_closures;
 };
 
 struct parsed_cs_op_t : op_str_t
 {
   void init (unsigned int subr_num_ = 0)
   {
-    op_str_t::init ();
     subr_num = subr_num_;
     drop_flag = false;
     keep_flag = false;
     skip_flag = false;
   }
 
-  void fini () { op_str_t::fini (); }
-
   bool for_drop () const { return drop_flag; }
   void set_drop ()       { if (!for_keep ()) drop_flag = true; }
 
@@ -409,15 +392,6 @@ struct parsed_cs_str_t : parsed_values_t<parsed_cs_op_t>
 
 struct parsed_cs_str_vec_t : hb_vector_t<parsed_cs_str_t>
 {
-  void init (unsigned int len_ = 0)
-  {
-    SUPER::init ();
-    resize (len_);
-    for (unsigned int i = 0; i < length; i++)
-      (*this)[i].init ();
-  }
-  void fini () { SUPER::fini_deep (); }
-
   private:
   typedef hb_vector_t<parsed_cs_str_t> SUPER;
 };
@@ -488,7 +462,7 @@ struct subr_subset_param_t
 
 struct subr_remap_t : hb_inc_bimap_t
 {
-  void create (hb_set_t *closure)
+  void create (const hb_set_t *closure)
   {
     /* create a remapping of subroutine numbers from old to new.
      * no optimization based on usage counts. fonttools doesn't appear doing that either.
@@ -518,32 +492,21 @@ struct subr_remap_t : hb_inc_bimap_t
 
 struct subr_remaps_t
 {
-  subr_remaps_t ()
+  subr_remaps_t (unsigned int fdCount)
   {
-    global_remap.init ();
-    local_remaps.init ();
+    local_remaps.resize (fdCount);
   }
 
-  ~subr_remaps_t () { fini (); }
-
-  void init (unsigned int fdCount)
+  bool in_error()
   {
-    local_remaps.resize (fdCount);
-    for (unsigned int i = 0; i < fdCount; i++)
-      local_remaps[i].init ();
+    return local_remaps.in_error ();
   }
 
   void create (subr_closures_t& closures)
   {
-    global_remap.create (closures.global_closure);
+    global_remap.create (&closures.global_closure);
     for (unsigned int i = 0; i < local_remaps.length; i++)
-      local_remaps[i].create (closures.local_closures[i]);
-  }
-
-  void fini ()
-  {
-    global_remap.fini ();
-    local_remaps.fini_deep ();
+      local_remaps[i].create (&closures.local_closures[i]);
   }
 
   subr_remap_t        global_remap;
@@ -554,21 +517,8 @@ template <typename SUBSETTER, typename SUBRS, typename ACC, typename ENV, typena
 struct subr_subsetter_t
 {
   subr_subsetter_t (ACC &acc_, const hb_subset_plan_t *plan_)
-    : acc (acc_), plan (plan_)
-  {
-    parsed_charstrings.init ();
-    parsed_global_subrs.init ();
-    parsed_local_subrs.init ();
-  }
-
-  ~subr_subsetter_t ()
-  {
-    closures.fini ();
-    remaps.fini ();
-    parsed_charstrings.fini_deep ();
-    parsed_global_subrs.fini_deep ();
-    parsed_local_subrs.fini_deep ();
-  }
+      : acc (acc_), plan (plan_), closures(acc_.fdCount), remaps(acc_.fdCount)
+  {}
 
   /* Subroutine subsetting with --no-desubroutinize runs in phases:
    *
@@ -586,15 +536,21 @@ struct subr_subsetter_t
    */
   bool subset (void)
   {
-    closures.init (acc.fdCount);
-    remaps.init (acc.fdCount);
+    parsed_charstrings.resize (plan->num_output_glyphs ());
+    parsed_global_subrs.resize (acc.globalSubrs->count);
+
+    if (unlikely (remaps.in_error()
+                  || parsed_charstrings.in_error ()
+                  || parsed_global_subrs.in_error ())) {
+      return false;
+    }
+
+    if (unlikely (!parsed_local_subrs.resize (acc.fdCount))) return false;
 
-    parsed_charstrings.init (plan->num_output_glyphs ());
-    parsed_global_subrs.init (acc.globalSubrs->count);
-    parsed_local_subrs.resize (acc.fdCount);
     for (unsigned int i = 0; i < acc.fdCount; i++)
     {
-      parsed_local_subrs[i].init (acc.privateDicts[i].localSubrs->count);
+      parsed_local_subrs[i].resize (acc.privateDicts[i].localSubrs->count);
+      if (unlikely (parsed_local_subrs[i].in_error ())) return false;
     }
     if (unlikely (!closures.valid))
       return false;
@@ -616,8 +572,8 @@ struct subr_subsetter_t
       subr_subset_param_t  param;
       param.init (&parsed_charstrings[i],
                  &parsed_global_subrs,  &parsed_local_subrs[fd],
-                 closures.global_closure, closures.local_closures[fd],
-                 plan->drop_hints);
+                 &closures.global_closure, &closures.local_closures[fd],
+                 plan->flags & HB_SUBSET_FLAGS_NO_HINTING);
 
       if (unlikely (!interp.interpret (param)))
        return false;
@@ -626,7 +582,7 @@ struct subr_subsetter_t
       SUBSETTER::complete_parsed_str (interp.env, param, parsed_charstrings[i]);
     }
 
-    if (plan->drop_hints)
+    if (plan->flags & HB_SUBSET_FLAGS_NO_HINTING)
     {
       /* mark hint ops and arguments for drop */
       for (unsigned int i = 0; i < plan->num_output_glyphs (); i++)
@@ -640,8 +596,8 @@ struct subr_subsetter_t
        subr_subset_param_t  param;
        param.init (&parsed_charstrings[i],
                    &parsed_global_subrs,  &parsed_local_subrs[fd],
-                   closures.global_closure, closures.local_closures[fd],
-                   plan->drop_hints);
+                   &closures.global_closure, &closures.local_closures[fd],
+                    plan->flags & HB_SUBSET_FLAGS_NO_HINTING);
 
        drop_hints_param_t  drop;
        if (drop_hints_in_str (parsed_charstrings[i], param, drop))
@@ -665,8 +621,8 @@ struct subr_subsetter_t
        subr_subset_param_t  param;
        param.init (&parsed_charstrings[i],
                    &parsed_global_subrs,  &parsed_local_subrs[fd],
-                   closures.global_closure, closures.local_closures[fd],
-                   plan->drop_hints);
+                   &closures.global_closure, &closures.local_closures[fd],
+                    plan->flags & HB_SUBSET_FLAGS_NO_HINTING);
        collect_subr_refs_in_str (parsed_charstrings[i], param);
       }
     }
index f3ed518..35fecd6 100644 (file)
@@ -114,7 +114,7 @@ struct cff1_top_dict_values_mod_t : cff1_top_dict_values_t
 struct top_dict_modifiers_t
 {
   top_dict_modifiers_t (const cff1_sub_table_info_t &info_,
-                          const unsigned int (&nameSIDs_)[name_dict_values_t::ValCount])
+                       const unsigned int (&nameSIDs_)[name_dict_values_t::ValCount])
     : info (info_),
       nameSIDs (nameSIDs_)
   {}
@@ -362,52 +362,24 @@ struct cff1_subr_subsetter_t : subr_subsetter_t<cff1_subr_subsetter_t, CFF1Subrs
 
 struct cff_subset_plan {
   cff_subset_plan ()
-    : info (),
-      orig_fdcount (0),
-      subset_fdcount (1),
-      subset_fdselect_format (0),
-      drop_hints (false),
-      desubroutinize(false)
   {
-    topdict_mod.init ();
-    subset_fdselect_ranges.init ();
-    fdmap.init ();
-    subset_charstrings.init ();
-    subset_globalsubrs.init ();
-    subset_localsubrs.init ();
-    fontdicts_mod.init ();
-    subset_enc_code_ranges.init ();
-    subset_enc_supp_codes.init ();
-    subset_charset_ranges.init ();
-    sidmap.init ();
     for (unsigned int i = 0; i < name_dict_values_t::ValCount; i++)
       topDictModSIDs[i] = CFF_UNDEF_SID;
   }
 
-  ~cff_subset_plan ()
-  {
-    topdict_mod.fini ();
-    subset_fdselect_ranges.fini ();
-    fdmap.fini ();
-    subset_charstrings.fini_deep ();
-    subset_globalsubrs.fini_deep ();
-    subset_localsubrs.fini_deep ();
-    fontdicts_mod.fini ();
-    subset_enc_code_ranges.fini ();
-    subset_enc_supp_codes.fini ();
-    subset_charset_ranges.fini ();
-    sidmap.fini ();
-  }
-
   void plan_subset_encoding (const OT::cff1::accelerator_subset_t &acc, hb_subset_plan_t *plan)
   {
     const Encoding *encoding = acc.encoding;
-    unsigned int  size0, size1, supp_size;
+    unsigned int  size0, size1;
     hb_codepoint_t  code, last_code = CFF_UNDEF_CODE;
     hb_vector_t<hb_codepoint_t> supp_codes;
 
-    subset_enc_code_ranges.resize (0);
-    supp_size = 0;
+    if (unlikely (!subset_enc_code_ranges.resize (0)))
+    {
+      plan->check_success (false);
+      return;
+    }
+
     supp_codes.init ();
 
     subset_enc_num_codes = plan->num_output_glyphs () - 1;
@@ -443,7 +415,6 @@ struct cff_subset_plan {
          code_pair_t pair = { supp_codes[i], sid };
          subset_enc_supp_codes.push (pair);
        }
-       supp_size += SuppEncoding::static_size * supp_codes.length;
       }
     }
     supp_codes.fini ();
@@ -465,7 +436,12 @@ struct cff_subset_plan {
     unsigned int  size0, size_ranges;
     hb_codepoint_t  sid, last_sid = CFF_UNDEF_CODE;
 
-    subset_charset_ranges.resize (0);
+    if (unlikely (!subset_charset_ranges.resize (0)))
+    {
+      plan->check_success (false);
+      return;
+    }
+
     unsigned int glyph;
     for (glyph = 1; glyph < plan->num_output_glyphs (); glyph++)
     {
@@ -535,8 +511,8 @@ struct cff_subset_plan {
 
     num_glyphs = plan->num_output_glyphs ();
     orig_fdcount = acc.fdCount;
-    drop_hints = plan->drop_hints;
-    desubroutinize = plan->desubroutinize;
+    drop_hints = plan->flags & HB_SUBSET_FLAGS_NO_HINTING;
+    desubroutinize = plan->flags & HB_SUBSET_FLAGS_DESUBROUTINIZE;
 
     /* check whether the subset renumbers any glyph IDs */
     gid_renum = false;
@@ -664,9 +640,9 @@ struct cff_subset_plan {
   cff1_sub_table_info_t                info;
 
   unsigned int    num_glyphs;
-  unsigned int    orig_fdcount;
-  unsigned int    subset_fdcount;
-  unsigned int    subset_fdselect_format;
+  unsigned int    orig_fdcount = 0;
+  unsigned int    subset_fdcount = 1;
+  unsigned int    subset_fdselect_format = 0;
   hb_vector_t<code_pair_t>   subset_fdselect_ranges;
 
   /* font dict index remap table from fullset FDArray to subset FDArray.
@@ -678,7 +654,7 @@ struct cff_subset_plan {
   hb_vector_t<str_buff_vec_t>  subset_localsubrs;
   hb_vector_t<cff1_font_dict_values_mod_t>  fontdicts_mod;
 
-  bool         drop_hints;
+  bool         drop_hints = false;
 
   bool         gid_renum;
   bool         subset_encoding;
@@ -694,7 +670,7 @@ struct cff_subset_plan {
   remap_sid_t  sidmap;
   unsigned int topDictModSIDs[name_dict_values_t::ValCount];
 
-  bool         desubroutinize;
+  bool         desubroutinize = false;
 };
 
 static bool _serialize_cff1 (hb_serialize_context_t *c,
@@ -909,12 +885,6 @@ _hb_subset_cff1 (const OT::cff1::accelerator_subset_t  &acc,
   return _serialize_cff1 (c->serializer, cff_plan, acc, c->plan->num_output_glyphs ());
 }
 
-/**
- * hb_subset_cff1:
- * Subsets the CFF table according to a provided plan.
- *
- * Return value: subsetted cff table.
- **/
 bool
 hb_subset_cff1 (hb_subset_context_t *c)
 {
index 637f38f..92dd6b1 100644 (file)
@@ -233,37 +233,14 @@ struct cff2_subr_subsetter_t : subr_subsetter_t<cff2_subr_subsetter_t, CFF2Subrs
 };
 
 struct cff2_subset_plan {
-  cff2_subset_plan ()
-    : orig_fdcount (0),
-      subset_fdcount(1),
-      subset_fdselect_size (0),
-      subset_fdselect_format (0),
-      drop_hints (false),
-      desubroutinize (false)
-  {
-    subset_fdselect_ranges.init ();
-    fdmap.init ();
-    subset_charstrings.init ();
-    subset_globalsubrs.init ();
-    subset_localsubrs.init ();
-  }
-
-  ~cff2_subset_plan ()
-  {
-    subset_fdselect_ranges.fini ();
-    fdmap.fini ();
-    subset_charstrings.fini_deep ();
-    subset_globalsubrs.fini_deep ();
-    subset_localsubrs.fini_deep ();
-  }
 
   bool create (const OT::cff2::accelerator_subset_t &acc,
              hb_subset_plan_t *plan)
   {
     orig_fdcount = acc.fdArray->count;
 
-    drop_hints = plan->drop_hints;
-    desubroutinize = plan->desubroutinize;
+    drop_hints = plan->flags & HB_SUBSET_FLAGS_NO_HINTING;
+    desubroutinize = plan->flags & HB_SUBSET_FLAGS_DESUBROUTINIZE;
 
     if (desubroutinize)
     {
@@ -303,13 +280,13 @@ struct cff2_subset_plan {
     if (acc.fdSelect != &Null (CFF2FDSelect))
     {
       if (unlikely (!hb_plan_subset_cff_fdselect (plan,
-                                 orig_fdcount,
-                                 *(const FDSelect *)acc.fdSelect,
-                                 subset_fdcount,
-                                 subset_fdselect_size,
-                                 subset_fdselect_format,
-                                 subset_fdselect_ranges,
-                                 fdmap)))
+                                                 orig_fdcount,
+                                                 *(const FDSelect *)acc.fdSelect,
+                                                 subset_fdcount,
+                                                 subset_fdselect_size,
+                                                 subset_fdselect_format,
+                                                 subset_fdselect_ranges,
+                                                 fdmap)))
        return false;
     }
     else
@@ -320,10 +297,10 @@ struct cff2_subset_plan {
 
   cff2_sub_table_info_t info;
 
-  unsigned int    orig_fdcount;
-  unsigned int    subset_fdcount;
-  unsigned int   subset_fdselect_size;
-  unsigned int    subset_fdselect_format;
+  unsigned int    orig_fdcount = 0;
+  unsigned int    subset_fdcount = 1;
+  unsigned int   subset_fdselect_size = 0;
+  unsigned int    subset_fdselect_format = 0;
   hb_vector_t<code_pair_t>   subset_fdselect_ranges;
 
   hb_inc_bimap_t   fdmap;
@@ -332,8 +309,8 @@ struct cff2_subset_plan {
   str_buff_vec_t           subset_globalsubrs;
   hb_vector_t<str_buff_vec_t> subset_localsubrs;
 
-  bool     drop_hints;
-  bool     desubroutinize;
+  bool     drop_hints = false;
+  bool     desubroutinize = false;
 };
 
 static bool _serialize_cff2 (hb_serialize_context_t *c,
@@ -470,19 +447,11 @@ _hb_subset_cff2 (const OT::cff2::accelerator_subset_t  &acc,
   return _serialize_cff2 (c->serializer, cff2_plan, acc, c->plan->num_output_glyphs ());
 }
 
-/**
- * hb_subset_cff2:
- * Subsets the CFF2 table according to a provided subset context.
- **/
 bool
 hb_subset_cff2 (hb_subset_context_t *c)
 {
-  OT::cff2::accelerator_subset_t acc;
-  acc.init (c->plan->source);
-  bool result = likely (acc.is_valid ()) && _hb_subset_cff2 (acc, c);
-  acc.fini ();
-
-  return result;
+  OT::cff2::accelerator_subset_t acc (c->plan->source);
+  return acc.is_valid () && _hb_subset_cff2 (acc, c);
 }
 
 #endif
index fe9be3c..4885280 100644 (file)
 /**
  * hb_subset_input_create_or_fail:
  *
- * Return value: New subset input.
+ * Creates a new subset input object.
+ *
+ * Return value: (transfer full): New subset input, or %NULL if failed. Destroy
+ * with hb_subset_input_destroy().
  *
  * Since: 1.8.0
  **/
 hb_subset_input_t *
-hb_subset_input_create_or_fail ()
+hb_subset_input_create_or_fail (void)
 {
   hb_subset_input_t *input = hb_object_create<hb_subset_input_t>();
 
   if (unlikely (!input))
     return nullptr;
 
-  input->unicodes = hb_set_create ();
-  input->glyphs = hb_set_create ();
-  input->name_ids = hb_set_create ();
-  hb_set_add_range (input->name_ids, 0, 6);
-  input->name_languages = hb_set_create ();
-  hb_set_add (input->name_languages, 0x0409);
-  input->drop_tables = hb_set_create ();
-  input->drop_hints = false;
-  input->desubroutinize = false;
-  input->retain_gids = false;
-  input->name_legacy = false;
+  for (auto& set : input->sets_iter ())
+    set = hb_set_create ();
+
+  if (input->in_error ())
+  {
+    hb_subset_input_destroy (input);
+    return nullptr;
+  }
+
+  input->flags = HB_SUBSET_FLAGS_DEFAULT;
+
+  hb_set_add_range (input->sets.name_ids, 0, 6);
+  hb_set_add (input->sets.name_languages, 0x0409);
 
   hb_tag_t default_drop_tables[] = {
     // Layout disabled by default
-    HB_TAG ('G', 'S', 'U', 'B'),
-    HB_TAG ('G', 'P', 'O', 'S'),
-    HB_TAG ('G', 'D', 'E', 'F'),
     HB_TAG ('m', 'o', 'r', 'x'),
     HB_TAG ('m', 'o', 'r', 't'),
     HB_TAG ('k', 'e', 'r', 'x'),
@@ -81,149 +83,281 @@ hb_subset_input_create_or_fail ()
     HB_TAG ('S', 'i', 'l', 'f'),
     HB_TAG ('S', 'i', 'l', 'l'),
   };
+  input->sets.drop_tables->add_array (default_drop_tables, ARRAY_LENGTH (default_drop_tables));
+
+  hb_tag_t default_no_subset_tables[] = {
+    HB_TAG ('a', 'v', 'a', 'r'),
+    HB_TAG ('f', 'v', 'a', 'r'),
+    HB_TAG ('g', 'a', 's', 'p'),
+    HB_TAG ('c', 'v', 't', ' '),
+    HB_TAG ('f', 'p', 'g', 'm'),
+    HB_TAG ('p', 'r', 'e', 'p'),
+    HB_TAG ('V', 'D', 'M', 'X'),
+    HB_TAG ('D', 'S', 'I', 'G'),
+    HB_TAG ('M', 'V', 'A', 'R'),
+    HB_TAG ('c', 'v', 'a', 'r'),
+    HB_TAG ('S', 'T', 'A', 'T'),
+  };
+  input->sets.no_subset_tables->add_array (default_no_subset_tables,
+                                         ARRAY_LENGTH (default_no_subset_tables));
+
+  //copied from _layout_features_groups in fonttools
+  hb_tag_t default_layout_features[] = {
+    // default shaper
+    // common
+    HB_TAG ('r', 'v', 'r', 'n'),
+    HB_TAG ('c', 'c', 'm', 'p'),
+    HB_TAG ('l', 'i', 'g', 'a'),
+    HB_TAG ('l', 'o', 'c', 'l'),
+    HB_TAG ('m', 'a', 'r', 'k'),
+    HB_TAG ('m', 'k', 'm', 'k'),
+    HB_TAG ('r', 'l', 'i', 'g'),
 
-  input->drop_tables->add_array (default_drop_tables, ARRAY_LENGTH (default_drop_tables));
+    //fractions
+    HB_TAG ('f', 'r', 'a', 'c'),
+    HB_TAG ('n', 'u', 'm', 'r'),
+    HB_TAG ('d', 'n', 'o', 'm'),
 
+    //horizontal
+    HB_TAG ('c', 'a', 'l', 't'),
+    HB_TAG ('c', 'l', 'i', 'g'),
+    HB_TAG ('c', 'u', 'r', 's'),
+    HB_TAG ('k', 'e', 'r', 'n'),
+    HB_TAG ('r', 'c', 'l', 't'),
+
+    //vertical
+    HB_TAG ('v', 'a', 'l', 't'),
+    HB_TAG ('v', 'e', 'r', 't'),
+    HB_TAG ('v', 'k', 'r', 'n'),
+    HB_TAG ('v', 'p', 'a', 'l'),
+    HB_TAG ('v', 'r', 't', '2'),
+
+    //ltr
+    HB_TAG ('l', 't', 'r', 'a'),
+    HB_TAG ('l', 't', 'r', 'm'),
+
+    //rtl
+    HB_TAG ('r', 't', 'l', 'a'),
+    HB_TAG ('r', 't', 'l', 'm'),
+
+    //Complex shapers
+    //arabic
+    HB_TAG ('i', 'n', 'i', 't'),
+    HB_TAG ('m', 'e', 'd', 'i'),
+    HB_TAG ('f', 'i', 'n', 'a'),
+    HB_TAG ('i', 's', 'o', 'l'),
+    HB_TAG ('m', 'e', 'd', '2'),
+    HB_TAG ('f', 'i', 'n', '2'),
+    HB_TAG ('f', 'i', 'n', '3'),
+    HB_TAG ('c', 's', 'w', 'h'),
+    HB_TAG ('m', 's', 'e', 't'),
+    HB_TAG ('s', 't', 'c', 'h'),
+
+    //hangul
+    HB_TAG ('l', 'j', 'm', 'o'),
+    HB_TAG ('v', 'j', 'm', 'o'),
+    HB_TAG ('t', 'j', 'm', 'o'),
+
+    //tibetan
+    HB_TAG ('a', 'b', 'v', 's'),
+    HB_TAG ('b', 'l', 'w', 's'),
+    HB_TAG ('a', 'b', 'v', 'm'),
+    HB_TAG ('b', 'l', 'w', 'm'),
+
+    //indic
+    HB_TAG ('n', 'u', 'k', 't'),
+    HB_TAG ('a', 'k', 'h', 'n'),
+    HB_TAG ('r', 'p', 'h', 'f'),
+    HB_TAG ('r', 'k', 'r', 'f'),
+    HB_TAG ('p', 'r', 'e', 'f'),
+    HB_TAG ('b', 'l', 'w', 'f'),
+    HB_TAG ('h', 'a', 'l', 'f'),
+    HB_TAG ('a', 'b', 'v', 'f'),
+    HB_TAG ('p', 's', 't', 'f'),
+    HB_TAG ('c', 'f', 'a', 'r'),
+    HB_TAG ('v', 'a', 't', 'u'),
+    HB_TAG ('c', 'j', 'c', 't'),
+    HB_TAG ('i', 'n', 'i', 't'),
+    HB_TAG ('p', 'r', 'e', 's'),
+    HB_TAG ('a', 'b', 'v', 's'),
+    HB_TAG ('b', 'l', 'w', 's'),
+    HB_TAG ('p', 's', 't', 's'),
+    HB_TAG ('h', 'a', 'l', 'n'),
+    HB_TAG ('d', 'i', 's', 't'),
+    HB_TAG ('a', 'b', 'v', 'm'),
+    HB_TAG ('b', 'l', 'w', 'm'),
+  };
+
+  input->sets.layout_features->add_array (default_layout_features, ARRAY_LENGTH (default_layout_features));
+
+  if (input->in_error ())
+  {
+    hb_subset_input_destroy (input);
+    return nullptr;
+  }
   return input;
 }
 
 /**
  * hb_subset_input_reference: (skip)
- * @subset_input: a subset_input.
+ * @input: a #hb_subset_input_t object.
  *
+ * Increases the reference count on @input.
  *
- *
- * Return value:
+ * Return value: @input.
  *
  * Since: 1.8.0
  **/
 hb_subset_input_t *
-hb_subset_input_reference (hb_subset_input_t *subset_input)
+hb_subset_input_reference (hb_subset_input_t *input)
 {
-  return hb_object_reference (subset_input);
+  return hb_object_reference (input);
 }
 
 /**
  * hb_subset_input_destroy:
- * @subset_input: a subset_input.
+ * @input: a #hb_subset_input_t object.
+ *
+ * Decreases the reference count on @input, and if it reaches zero, destroys
+ * @input, freeing all memory.
  *
  * Since: 1.8.0
  **/
 void
-hb_subset_input_destroy (hb_subset_input_t *subset_input)
+hb_subset_input_destroy (hb_subset_input_t *input)
 {
-  if (!hb_object_destroy (subset_input)) return;
+  if (!hb_object_destroy (input)) return;
 
-  hb_set_destroy (subset_input->unicodes);
-  hb_set_destroy (subset_input->glyphs);
-  hb_set_destroy (subset_input->name_ids);
-  hb_set_destroy (subset_input->name_languages);
-  hb_set_destroy (subset_input->drop_tables);
+  for (hb_set_t* set : input->sets_iter ())
+    hb_set_destroy (set);
 
-  free (subset_input);
+  hb_free (input);
 }
 
 /**
  * hb_subset_input_unicode_set:
- * @subset_input: a subset_input.
+ * @input: a #hb_subset_input_t object.
+ *
+ * Gets the set of Unicode code points to retain, the caller should modify the
+ * set as needed.
+ *
+ * Return value: (transfer none): pointer to the #hb_set_t of Unicode code
+ * points.
  *
  * Since: 1.8.0
  **/
 HB_EXTERN hb_set_t *
-hb_subset_input_unicode_set (hb_subset_input_t *subset_input)
+hb_subset_input_unicode_set (hb_subset_input_t *input)
 {
-  return subset_input->unicodes;
+  return input->sets.unicodes;
 }
 
 /**
  * hb_subset_input_glyph_set:
- * @subset_input: a subset_input.
+ * @input: a #hb_subset_input_t object.
+ *
+ * Gets the set of glyph IDs to retain, the caller should modify the set as
+ * needed.
+ *
+ * Return value: (transfer none): pointer to the #hb_set_t of glyph IDs.
  *
  * Since: 1.8.0
  **/
 HB_EXTERN hb_set_t *
-hb_subset_input_glyph_set (hb_subset_input_t *subset_input)
-{
-  return subset_input->glyphs;
-}
-
-HB_EXTERN hb_set_t *
-hb_subset_input_nameid_set (hb_subset_input_t *subset_input)
-{
-  return subset_input->name_ids;
-}
-
-HB_EXTERN hb_set_t *
-hb_subset_input_namelangid_set (hb_subset_input_t *subset_input)
+hb_subset_input_glyph_set (hb_subset_input_t *input)
 {
-  return subset_input->name_languages;
+  return input->sets.glyphs;
 }
 
+/**
+ * hb_subset_input_set:
+ * @input: a #hb_subset_input_t object.
+ * @set_type: a #hb_subset_sets_t set type.
+ *
+ * Gets the set of the specified type.
+ *
+ * Return value: (transfer none): pointer to the #hb_set_t of the specified type.
+ *
+ * Since: 2.9.1
+ **/
 HB_EXTERN hb_set_t *
-hb_subset_input_drop_tables_set (hb_subset_input_t *subset_input)
-{
-  return subset_input->drop_tables;
-}
-
-HB_EXTERN void
-hb_subset_input_set_drop_hints (hb_subset_input_t *subset_input,
-                               hb_bool_t drop_hints)
+hb_subset_input_set (hb_subset_input_t *input, hb_subset_sets_t set_type)
 {
-  subset_input->drop_hints = drop_hints;
+  return input->sets_iter () [set_type];
 }
 
-HB_EXTERN hb_bool_t
-hb_subset_input_get_drop_hints (hb_subset_input_t *subset_input)
-{
-  return subset_input->drop_hints;
-}
-
-HB_EXTERN void
-hb_subset_input_set_desubroutinize (hb_subset_input_t *subset_input,
-                                   hb_bool_t desubroutinize)
-{
-  subset_input->desubroutinize = desubroutinize;
-}
-
-HB_EXTERN hb_bool_t
-hb_subset_input_get_desubroutinize (hb_subset_input_t *subset_input)
+/**
+ * hb_subset_input_get_flags:
+ * @input: a #hb_subset_input_t object.
+ *
+ * Gets all of the subsetting flags in the input object.
+ *
+ * Return value: the subsetting flags bit field.
+ *
+ * Since: 2.9.0
+ **/
+HB_EXTERN hb_subset_flags_t
+hb_subset_input_get_flags (hb_subset_input_t *input)
 {
-  return subset_input->desubroutinize;
+  return (hb_subset_flags_t) input->flags;
 }
 
 /**
- * hb_subset_input_set_retain_gids:
- * @subset_input: a subset_input.
- * @retain_gids: If true the subsetter will not renumber glyph ids.
- * Since: 2.4.0
+ * hb_subset_input_set_flags:
+ * @input: a #hb_subset_input_t object.
+ * @value: bit field of flags
+ *
+ * Sets all of the flags in the input object to the values specified by the bit
+ * field.
+ *
+ * Since: 2.9.0
  **/
 HB_EXTERN void
-hb_subset_input_set_retain_gids (hb_subset_input_t *subset_input,
-                                hb_bool_t retain_gids)
+hb_subset_input_set_flags (hb_subset_input_t *input,
+                          unsigned value)
 {
-  subset_input->retain_gids = retain_gids;
+  input->flags = (hb_subset_flags_t) value;
 }
 
 /**
- * hb_subset_input_get_retain_gids:
- * Returns: value of retain_gids.
- * Since: 2.4.0
+ * hb_subset_input_set_user_data: (skip)
+ * @input: a #hb_subset_input_t object.
+ * @key: The user-data key to set
+ * @data: A pointer to the user data
+ * @destroy: (nullable): A callback to call when @data is not needed anymore
+ * @replace: Whether to replace an existing data with the same key
+ *
+ * Attaches a user-data key/data pair to the given subset input object.
+ *
+ * Return value: %true if success, %false otherwise
+ *
+ * Since: 2.9.0
  **/
-HB_EXTERN hb_bool_t
-hb_subset_input_get_retain_gids (hb_subset_input_t *subset_input)
+hb_bool_t
+hb_subset_input_set_user_data (hb_subset_input_t  *input,
+                              hb_user_data_key_t *key,
+                              void *              data,
+                              hb_destroy_func_t   destroy,
+                              hb_bool_t           replace)
 {
-  return subset_input->retain_gids;
+  return hb_object_set_user_data (input, key, data, destroy, replace);
 }
 
-HB_EXTERN void
-hb_subset_input_set_name_legacy (hb_subset_input_t *subset_input,
-                                hb_bool_t name_legacy)
-{
-  subset_input->name_legacy = name_legacy;
-}
-
-HB_EXTERN hb_bool_t
-hb_subset_input_get_name_legacy (hb_subset_input_t *subset_input)
+/**
+ * hb_subset_input_get_user_data: (skip)
+ * @input: a #hb_subset_input_t object.
+ * @key: The user-data key to query
+ *
+ * Fetches the user data associated with the specified key,
+ * attached to the specified subset input object.
+ *
+ * Return value: (transfer none): A pointer to the user data
+ *
+ * Since: 2.9.0
+ **/
+void *
+hb_subset_input_get_user_data (const hb_subset_input_t *input,
+                              hb_user_data_key_t     *key)
 {
-  return subset_input->name_legacy;
+  return hb_object_get_user_data (input, key);
 }
index 0aeb966..07c0e22 100644 (file)
 #include "hb.hh"
 
 #include "hb-subset.h"
+#include "hb-map.hh"
+#include "hb-set.hh"
 
 #include "hb-font.hh"
 
+HB_MARK_AS_FLAG_T (hb_subset_flags_t);
+
 struct hb_subset_input_t
 {
   hb_object_header_t header;
 
-  hb_set_t *unicodes;
-  hb_set_t *glyphs;
-  hb_set_t *name_ids;
-  hb_set_t *name_languages;
-  hb_set_t *drop_tables;
-
-  bool drop_hints;
-  bool desubroutinize;
-  bool retain_gids;
-  bool name_legacy;
-  /* TODO
-   *
-   * features
-   * lookups
-   * name_ids
-   * ...
-   */
+  struct sets_t {
+    hb_set_t *glyphs;
+    hb_set_t *unicodes;
+    hb_set_t *no_subset_tables;
+    hb_set_t *drop_tables;
+    hb_set_t *name_ids;
+    hb_set_t *name_languages;
+    hb_set_t *layout_features;
+  };
+
+  union {
+    sets_t sets;
+    hb_set_t* set_ptrs[sizeof (sets_t) / sizeof (hb_set_t*)];
+  };
+
+  unsigned flags;
+
+  inline unsigned num_sets () const
+  {
+    return sizeof (set_ptrs) / sizeof (hb_set_t*);
+  }
+
+  inline hb_array_t<hb_set_t*> sets_iter ()
+  {
+    return hb_array_t<hb_set_t*> (set_ptrs, num_sets ());
+  }
+
+  bool in_error () const
+  {
+    for (unsigned i = 0; i < num_sets (); i++)
+    {
+      if (unlikely (set_ptrs[i]->in_error ()))
+        return true;
+    }
+    return false;
+  }
 };
 
 
index 232131c..af4fcb8 100644 (file)
 #include "hb-ot-glyf-table.hh"
 #include "hb-ot-layout-gdef-table.hh"
 #include "hb-ot-layout-gpos-table.hh"
+#include "hb-ot-layout-gsub-table.hh"
 #include "hb-ot-cff1-table.hh"
 #include "hb-ot-color-colr-table.hh"
+#include "hb-ot-color-colrv1-closure.hh"
 #include "hb-ot-var-fvar-table.hh"
 #include "hb-ot-stat-table.hh"
+#include "hb-ot-math-table.hh"
 
 
+typedef hb_hashmap_t<unsigned, hb_set_t *> script_langsys_map;
 #ifndef HB_NO_SUBSET_CFF
 static inline void
 _add_cff_seac_components (const OT::cff1::accelerator_t &cff,
@@ -53,8 +57,23 @@ _add_cff_seac_components (const OT::cff1::accelerator_t &cff,
 }
 #endif
 
-#ifndef HB_NO_SUBSET_LAYOUT
-#ifdef HB_EXPERIMENTAL_API
+static void
+_remap_palette_indexes (const hb_set_t *palette_indexes,
+                       hb_map_t       *mapping /* OUT */)
+{
+  unsigned new_idx = 0;
+  for (unsigned palette_index : palette_indexes->iter ())
+  {
+    if (palette_index == 0xFFFF)
+    {
+      mapping->set (palette_index, palette_index);
+      continue;
+    }
+    mapping->set (palette_index, new_idx);
+    new_idx++;
+  }
+}
+
 static void
 _remap_indexes (const hb_set_t *indexes,
                hb_map_t       *mapping /* OUT */)
@@ -65,70 +84,113 @@ _remap_indexes (const hb_set_t *indexes,
     mapping->set (_.first, _.second);
 
 }
-#endif
 
-static inline void
-_gsub_closure_glyphs_lookups_features (hb_face_t *face,
-                                      hb_set_t *gids_to_retain,
-                                      hb_map_t *gsub_lookups,
-                                      hb_map_t *gsub_features)
+#ifndef HB_NO_SUBSET_LAYOUT
+typedef void (*layout_collect_func_t) (hb_face_t *face, hb_tag_t table_tag, const hb_tag_t *scripts, const hb_tag_t *languages, const hb_tag_t *features, hb_set_t *lookup_indexes /* OUT */);
+
+
+template <typename T>
+static void _collect_layout_indices (hb_face_t           *face,
+                                     const T&              table,
+                                     const hb_set_t      *layout_features_to_retain,
+                                     layout_collect_func_t layout_collect_func,
+                                     hb_set_t            *indices /* OUT */)
 {
-  hb_set_t lookup_indices;
-  hb_ot_layout_collect_lookups (face,
-                               HB_OT_TAG_GSUB,
-                               nullptr,
-                               nullptr,
-                               nullptr,
-                               &lookup_indices);
-  hb_ot_layout_lookups_substitute_closure (face,
-                                          &lookup_indices,
-                                          gids_to_retain);
-#ifdef HB_EXPERIMENTAL_API
-  hb_ot_layout_closure_lookups (face,
-                               HB_OT_TAG_GSUB,
-                               gids_to_retain,
-                               &lookup_indices);
-  _remap_indexes (&lookup_indices, gsub_lookups);
-
-  //closure features
-  hb_set_t feature_indices;
-  hb_ot_layout_closure_features (face,
-                                HB_OT_TAG_GSUB,
-                                gsub_lookups,
-                                &feature_indices);
-  _remap_indexes (&feature_indices, gsub_features);
-#endif
+  hb_vector_t<hb_tag_t> features;
+  if (!features.alloc (table.get_feature_count () + 1))
+    return;
+
+  hb_set_t visited_features;
+  bool retain_all_features = true;
+  for (unsigned i = 0; i < table.get_feature_count (); i++)
+  {
+    hb_tag_t tag = table.get_feature_tag (i);
+    if (!tag) continue;
+    if (!layout_features_to_retain->has (tag))
+    {
+      retain_all_features = false;
+      continue;
+    }
+    
+    if (visited_features.has (tag))
+      continue;
+
+    features.push (tag);
+    visited_features.add (tag);
+  }
+
+  if (!features)
+    return;
+
+  // The collect function needs a null element to signal end of the array.
+  features.push (0);
+
+  if (retain_all_features)
+  {
+    // Looking for all features, trigger the faster collection method.
+    layout_collect_func (face,
+                         T::tableTag,
+                         nullptr,
+                         nullptr,
+                         nullptr,
+                         indices);
+    return;
+  }
+
+  layout_collect_func (face,
+                       T::tableTag,
+                      nullptr,
+                      nullptr,
+                      features.arrayZ,
+                      indices);
 }
 
+template <typename T>
 static inline void
-_gpos_closure_lookups_features (hb_face_t      *face,
-                               const hb_set_t *gids_to_retain,
-                               hb_map_t       *gpos_lookups,
-                               hb_map_t       *gpos_features)
+_closure_glyphs_lookups_features (hb_face_t         *face,
+                                 hb_set_t           *gids_to_retain,
+                                 const hb_set_t     *layout_features_to_retain,
+                                 hb_map_t           *lookups,
+                                 hb_map_t           *features,
+                                 script_langsys_map *langsys_map)
 {
+  hb_blob_ptr_t<T> table = hb_sanitize_context_t ().reference_table<T> (face);
+  hb_tag_t table_tag = table->tableTag;
   hb_set_t lookup_indices;
-  hb_ot_layout_collect_lookups (face,
-                               HB_OT_TAG_GPOS,
-                               nullptr,
-                               nullptr,
-                               nullptr,
-                               &lookup_indices);
-#ifdef HB_EXPERIMENTAL_API
-  hb_ot_layout_closure_lookups (face,
-                               HB_OT_TAG_GPOS,
-                               gids_to_retain,
-                               &lookup_indices);
-  _remap_indexes (&lookup_indices, gpos_lookups);
-
-  //closure features
+  _collect_layout_indices<T> (face,
+                              *table,
+                              layout_features_to_retain,
+                              hb_ot_layout_collect_lookups,
+                              &lookup_indices);
+
+  if (table_tag == HB_OT_TAG_GSUB)
+    hb_ot_layout_lookups_substitute_closure (face,
+                                           &lookup_indices,
+                                            gids_to_retain);
+  table->closure_lookups (face,
+                         gids_to_retain,
+                        &lookup_indices);
+  _remap_indexes (&lookup_indices, lookups);
+
+  // Collect and prune features
   hb_set_t feature_indices;
-  hb_ot_layout_closure_features (face,
-                                HB_OT_TAG_GPOS,
-                                gpos_lookups,
-                                &feature_indices);
-  _remap_indexes (&feature_indices, gpos_features);
-#endif
+  _collect_layout_indices<T> (face,
+                              *table,
+                              layout_features_to_retain,
+                              hb_ot_layout_collect_features,
+                              &feature_indices);
+
+  table->prune_features (lookups, &feature_indices);
+  hb_map_t duplicate_feature_map;
+  table->find_duplicate_features (lookups, &feature_indices, &duplicate_feature_map);
+
+  feature_indices.clear ();
+  table->prune_langsys (&duplicate_feature_map, langsys_map, &feature_indices);
+  _remap_indexes (&feature_indices, features);
+
+  table.destroy ();
 }
+
 #endif
 
 #ifndef HB_NO_VAR
@@ -155,23 +217,62 @@ static inline void
     gpos->collect_variation_indices (&c);
 
   gdef->remap_layout_variation_indices (layout_variation_indices, layout_variation_idx_map);
-  
+
   gdef.destroy ();
   gpos.destroy ();
 }
 #endif
 
 static inline void
-_cmap_closure (hb_face_t           *face,
-              const hb_set_t      *unicodes,
-              hb_set_t            *glyphset)
+_cmap_closure (hb_face_t          *face,
+              const hb_set_t      *unicodes,
+              hb_set_t            *glyphset)
 {
-  OT::cmap::accelerator_t cmap;
-  cmap.init (face);
+  OT::cmap::accelerator_t cmap (face);
   cmap.table->closure_glyphs (unicodes, glyphset);
-  cmap.fini ();
 }
 
+static void _colr_closure (hb_face_t *face,
+                           hb_map_t *layers_map,
+                           hb_map_t *palettes_map,
+                           hb_set_t *glyphs_colred)
+{
+  OT::COLR::accelerator_t colr (face);
+  if (!colr.is_valid ()) return;
+
+  unsigned iteration_count = 0;
+  hb_set_t palette_indices, layer_indices;
+  unsigned glyphs_num;
+  {
+    glyphs_num = glyphs_colred->get_population ();
+    // Collect all glyphs referenced by COLRv0
+    hb_set_t glyphset_colrv0;
+    for (hb_codepoint_t gid : glyphs_colred->iter ())
+      colr.closure_glyphs (gid, &glyphset_colrv0);
+    
+    glyphs_colred->union_ (glyphset_colrv0);
+    
+    //closure for COLRv1
+    colr.closure_forV1 (glyphs_colred, &layer_indices, &palette_indices);
+  } while (iteration_count++ <= HB_CLOSURE_MAX_STAGES &&
+           glyphs_num != glyphs_colred->get_population ());
+
+  colr.closure_V0palette_indices (glyphs_colred, &palette_indices);
+  _remap_indexes (&layer_indices, layers_map);
+  _remap_palette_indexes (&palette_indices, palettes_map);
+}
+
+static inline void
+_math_closure (hb_face_t           *face,
+               hb_set_t            *glyphset)
+{
+  hb_blob_ptr_t<OT::MATH> math = hb_sanitize_context_t ().reference_table<OT::MATH> (face);
+  if (math->has_data ())
+    math->closure_glyphs (glyphset);
+  math.destroy ();
+}
+
+
 static inline void
 _remove_invalid_gids (hb_set_t *glyphs,
                      unsigned int num_glyphs)
@@ -185,90 +286,137 @@ _remove_invalid_gids (hb_set_t *glyphs,
 }
 
 static void
+_populate_unicodes_to_retain (const hb_set_t *unicodes,
+                              const hb_set_t *glyphs,
+                              hb_subset_plan_t *plan)
+{
+  OT::cmap::accelerator_t cmap (plan->source);
+
+  constexpr static const int size_threshold = 4096;
+
+  if (glyphs->is_empty () && unicodes->get_population () < size_threshold)
+  {
+    /* This is the fast path if it's anticipated that size of unicodes
+     * is << than the number of codepoints in the font. */
+    for (hb_codepoint_t cp : *unicodes)
+    {
+      hb_codepoint_t gid;
+      if (!cmap.get_nominal_glyph (cp, &gid))
+      {
+        DEBUG_MSG(SUBSET, nullptr, "Drop U+%04X; no gid", cp);
+        continue;
+      }
+
+      plan->codepoint_to_glyph->set (cp, gid);
+    }
+  }
+  else
+  {
+    hb_map_t unicode_glyphid_map;
+    cmap.collect_mapping (hb_set_get_empty (), &unicode_glyphid_map);
+
+    for (hb_pair_t<hb_codepoint_t, hb_codepoint_t> cp_gid :
+        + unicode_glyphid_map.iter ())
+    {
+      if (!unicodes->has (cp_gid.first) && !glyphs->has (cp_gid.second))
+       continue;
+
+      plan->codepoint_to_glyph->set (cp_gid.first, cp_gid.second);
+    }
+
+    /* Add gids which where requested, but not mapped in cmap */
+    // TODO(garretrieger):
+    // Once https://github.com/harfbuzz/harfbuzz/issues/3169
+    // is implemented, this can be done with union and del_range
+    for (hb_codepoint_t gid : glyphs->iter ())
+    {
+      if (gid >= plan->source->get_num_glyphs ())
+       break;
+      plan->_glyphset_gsub->add (gid);
+    }
+  }
+
+  + plan->codepoint_to_glyph->keys ()   | hb_sink (plan->unicodes);
+  + plan->codepoint_to_glyph->values () | hb_sink (plan->_glyphset_gsub);
+}
+
+static void
 _populate_gids_to_retain (hb_subset_plan_t* plan,
-                         const hb_set_t *unicodes,
-                         const hb_set_t *input_glyphs_to_retain,
                          bool close_over_gsub,
                          bool close_over_gpos,
-                          bool close_over_gdef)
+                         bool close_over_gdef)
 {
-  OT::cmap::accelerator_t cmap;
-  OT::glyf::accelerator_t glyf;
-#ifndef HB_NO_SUBSET_CFF
-  OT::cff1::accelerator_t cff;
-#endif
-  OT::COLR::accelerator_t colr;
-  cmap.init (plan->source);
-  glyf.init (plan->source);
+  OT::glyf::accelerator_t glyf (plan->source);
 #ifndef HB_NO_SUBSET_CFF
-  cff.init (plan->source);
+  OT::cff1::accelerator_t cff (plan->source);
 #endif
-  colr.init (plan->source);
 
   plan->_glyphset_gsub->add (0); // Not-def
-  hb_set_union (plan->_glyphset_gsub, input_glyphs_to_retain);
-
-  hb_codepoint_t cp = HB_SET_VALUE_INVALID;
-  while (unicodes->next (&cp))
-  {
-    hb_codepoint_t gid;
-    if (!cmap.get_nominal_glyph (cp, &gid))
-    {
-      DEBUG_MSG(SUBSET, nullptr, "Drop U+%04X; no gid", cp);
-      continue;
-    }
-    plan->unicodes->add (cp);
-    plan->codepoint_to_glyph->set (cp, gid);
-    plan->_glyphset_gsub->add (gid);
-  }
 
   _cmap_closure (plan->source, plan->unicodes, plan->_glyphset_gsub);
 
 #ifndef HB_NO_SUBSET_LAYOUT
   if (close_over_gsub)
     // closure all glyphs/lookups/features needed for GSUB substitutions.
-    _gsub_closure_glyphs_lookups_features (plan->source, plan->_glyphset_gsub, plan->gsub_lookups, plan->gsub_features);
+    _closure_glyphs_lookups_features<OT::GSUB> (
+        plan->source,
+        plan->_glyphset_gsub,
+        plan->layout_features,
+        plan->gsub_lookups,
+        plan->gsub_features,
+        plan->gsub_langsys);
 
   if (close_over_gpos)
-    _gpos_closure_lookups_features (plan->source, plan->_glyphset_gsub, plan->gpos_lookups, plan->gpos_features);
+    _closure_glyphs_lookups_features<OT::GPOS> (
+        plan->source,
+        plan->_glyphset_gsub,
+        plan->layout_features,
+        plan->gpos_lookups,
+        plan->gpos_features,
+        plan->gpos_langsys);
 #endif
   _remove_invalid_gids (plan->_glyphset_gsub, plan->source->get_num_glyphs ());
 
+  hb_set_set (plan->_glyphset_mathed, plan->_glyphset_gsub);
+  _math_closure (plan->source, plan->_glyphset_mathed);
+  _remove_invalid_gids (plan->_glyphset_mathed, plan->source->get_num_glyphs ());
+
+  hb_set_t cur_glyphset = *plan->_glyphset_mathed;
+  _colr_closure (plan->source, plan->colrv1_layers, plan->colr_palettes, &cur_glyphset);
+  _remove_invalid_gids (&cur_glyphset, plan->source->get_num_glyphs ());
+
+  hb_set_set (plan->_glyphset_colred, &cur_glyphset);
   // Populate a full set of glyphs to retain by adding all referenced
   // composite glyphs.
-  hb_codepoint_t gid = HB_SET_VALUE_INVALID;
-  while (plan->_glyphset_gsub->next (&gid))
+  for (hb_codepoint_t gid : cur_glyphset.iter ())
   {
     glyf.add_gid_and_children (gid, plan->_glyphset);
 #ifndef HB_NO_SUBSET_CFF
     if (cff.is_valid ())
       _add_cff_seac_components (cff, gid, plan->_glyphset);
 #endif
-    if (colr.is_valid ())
-      colr.closure_glyphs (gid, plan->_glyphset);
   }
 
   _remove_invalid_gids (plan->_glyphset, plan->source->get_num_glyphs ());
 
+
 #ifndef HB_NO_VAR
   if (close_over_gdef)
-    _collect_layout_variation_indices (plan->source, plan->_glyphset, plan->gpos_lookups, plan->layout_variation_indices, plan->layout_variation_idx_map);
-#endif
-
-#ifndef HB_NO_SUBSET_CFF
-  cff.fini ();
+    _collect_layout_variation_indices (plan->source,
+                                      plan->_glyphset_gsub,
+                                      plan->gpos_lookups,
+                                      plan->layout_variation_indices,
+                                      plan->layout_variation_idx_map);
 #endif
-  glyf.fini ();
-  cmap.fini ();
 }
 
 static void
 _create_old_gid_to_new_gid_map (const hb_face_t *face,
-                               bool             retain_gids,
-                               const 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 */)
+                               bool             retain_gids,
+                               const 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 */)
 {
   if (!retain_gids)
   {
@@ -301,7 +449,7 @@ static void
 _nameid_closure (hb_face_t *face,
                 hb_set_t  *nameids)
 {
-#ifndef HB_NO_STAT
+#ifndef HB_NO_STYLE
   face->table.STAT->collect_name_ids (nameids);
 #endif
 #ifndef HB_NO_VAR
@@ -311,54 +459,74 @@ _nameid_closure (hb_face_t *face,
 
 /**
  * hb_subset_plan_create:
+ * @face: font face to create the plan for.
+ * @input: a #hb_subset_input_t input.
+ *
  * Computes a plan for subsetting the supplied face according
  * to a provided input. The plan describes
  * which tables and glyphs should be retained.
  *
- * Return value: New subset plan.
+ * Return value: (transfer full): New subset plan. Destroy with
+ * hb_subset_plan_destroy().
  *
  * Since: 1.7.5
  **/
 hb_subset_plan_t *
-hb_subset_plan_create (hb_face_t         *face,
-                      hb_subset_input_t *input)
+hb_subset_plan_create (hb_face_t        *face,
+                      const hb_subset_input_t *input)
 {
-  hb_subset_plan_t *plan = hb_object_create<hb_subset_plan_t> ();
+  hb_subset_plan_t *plan;
+  if (unlikely (!(plan = hb_object_create<hb_subset_plan_t> ())))
+    return const_cast<hb_subset_plan_t *> (&Null (hb_subset_plan_t));
 
-  plan->drop_hints = input->drop_hints;
-  plan->desubroutinize = input->desubroutinize;
-  plan->retain_gids = input->retain_gids;
-  plan->name_legacy = input->name_legacy;
+  plan->successful = true;
+  plan->flags = input->flags;
   plan->unicodes = hb_set_create ();
-  plan->name_ids = hb_set_reference (input->name_ids);
+  plan->name_ids = hb_set_copy (input->sets.name_ids);
   _nameid_closure (face, plan->name_ids);
-  plan->name_languages = hb_set_reference (input->name_languages);
-  plan->glyphs_requested = hb_set_reference (input->glyphs);
-  plan->drop_tables = hb_set_reference (input->drop_tables);
+  plan->name_languages = hb_set_copy (input->sets.name_languages);
+  plan->layout_features = hb_set_copy (input->sets.layout_features);
+  plan->glyphs_requested = hb_set_copy (input->sets.glyphs);
+  plan->drop_tables = hb_set_copy (input->sets.drop_tables);
+  plan->no_subset_tables = hb_set_copy (input->sets.no_subset_tables);
   plan->source = hb_face_reference (face);
   plan->dest = hb_face_builder_create ();
 
   plan->_glyphset = hb_set_create ();
   plan->_glyphset_gsub = hb_set_create ();
+  plan->_glyphset_mathed = hb_set_create ();
+  plan->_glyphset_colred = hb_set_create ();
   plan->codepoint_to_glyph = hb_map_create ();
   plan->glyph_map = hb_map_create ();
   plan->reverse_glyph_map = hb_map_create ();
   plan->gsub_lookups = hb_map_create ();
   plan->gpos_lookups = hb_map_create ();
+
+  if (plan->check_success (plan->gsub_langsys = hb_object_create<script_langsys_map> ()))
+    plan->gsub_langsys->init_shallow ();
+  if (plan->check_success (plan->gpos_langsys = hb_object_create<script_langsys_map> ()))
+    plan->gpos_langsys->init_shallow ();
+
   plan->gsub_features = hb_map_create ();
   plan->gpos_features = hb_map_create ();
+  plan->colrv1_layers = hb_map_create ();
+  plan->colr_palettes = hb_map_create ();
   plan->layout_variation_indices = hb_set_create ();
   plan->layout_variation_idx_map = hb_map_create ();
 
+  if (plan->in_error ()) {
+    return plan;
+  }
+
+  _populate_unicodes_to_retain (input->sets.unicodes, input->sets.glyphs, plan);
+
   _populate_gids_to_retain (plan,
-                           input->unicodes,
-                           input->glyphs,
-                           !input->drop_tables->has (HB_OT_TAG_GSUB),
-                           !input->drop_tables->has (HB_OT_TAG_GPOS),
-                            !input->drop_tables->has (HB_OT_TAG_GDEF));
+                           !input->sets.drop_tables->has (HB_OT_TAG_GSUB),
+                           !input->sets.drop_tables->has (HB_OT_TAG_GPOS),
+                           !input->sets.drop_tables->has (HB_OT_TAG_GDEF));
 
   _create_old_gid_to_new_gid_map (face,
-                                 input->retain_gids,
+                                  input->flags & HB_SUBSET_FLAGS_RETAIN_GIDS,
                                  plan->_glyphset,
                                  plan->glyph_map,
                                  plan->reverse_glyph_map,
@@ -369,6 +537,10 @@ hb_subset_plan_create (hb_face_t         *face,
 
 /**
  * hb_subset_plan_destroy:
+ * @plan: a #hb_subset_plan_t
+ *
+ * Decreases the reference count on @plan, and if it reaches zero, destroys
+ * @plan, freeing all memory.
  *
  * Since: 1.7.5
  **/
@@ -380,8 +552,10 @@ hb_subset_plan_destroy (hb_subset_plan_t *plan)
   hb_set_destroy (plan->unicodes);
   hb_set_destroy (plan->name_ids);
   hb_set_destroy (plan->name_languages);
+  hb_set_destroy (plan->layout_features);
   hb_set_destroy (plan->glyphs_requested);
   hb_set_destroy (plan->drop_tables);
+  hb_set_destroy (plan->no_subset_tables);
   hb_face_destroy (plan->source);
   hb_face_destroy (plan->dest);
   hb_map_destroy (plan->codepoint_to_glyph);
@@ -389,13 +563,36 @@ hb_subset_plan_destroy (hb_subset_plan_t *plan)
   hb_map_destroy (plan->reverse_glyph_map);
   hb_set_destroy (plan->_glyphset);
   hb_set_destroy (plan->_glyphset_gsub);
+  hb_set_destroy (plan->_glyphset_mathed);
+  hb_set_destroy (plan->_glyphset_colred);
   hb_map_destroy (plan->gsub_lookups);
   hb_map_destroy (plan->gpos_lookups);
   hb_map_destroy (plan->gsub_features);
   hb_map_destroy (plan->gpos_features);
+  hb_map_destroy (plan->colrv1_layers);
+  hb_map_destroy (plan->colr_palettes);
   hb_set_destroy (plan->layout_variation_indices);
   hb_map_destroy (plan->layout_variation_idx_map);
 
+  if (plan->gsub_langsys)
+  {
+    for (auto _ : plan->gsub_langsys->iter ())
+      hb_set_destroy (_.second);
+
+    hb_object_destroy (plan->gsub_langsys);
+    plan->gsub_langsys->fini_shallow ();
+    hb_free (plan->gsub_langsys);
+  }
+
+  if (plan->gpos_langsys)
+  {
+    for (auto _ : plan->gpos_langsys->iter ())
+      hb_set_destroy (_.second);
+
+    hb_object_destroy (plan->gpos_langsys);
+    plan->gpos_langsys->fini_shallow ();
+    hb_free (plan->gpos_langsys);
+  }
 
-  free (plan);
+  hb_free (plan);
 }
index 7a85b51..b9244e5 100644 (file)
@@ -39,10 +39,8 @@ struct hb_subset_plan_t
 {
   hb_object_header_t header;
 
-  bool drop_hints : 1;
-  bool desubroutinize : 1;
-  bool retain_gids : 1;
-  bool name_legacy : 1;
+  bool successful;
+  unsigned flags;
 
   // For each cp that we'd like to retain maps to the corresponding gid.
   hb_set_t *unicodes;
@@ -53,9 +51,15 @@ struct hb_subset_plan_t
   // name_languages we would like to retain
   hb_set_t *name_languages;
 
+  //layout features which will be preserved
+  hb_set_t *layout_features;
+
   //glyph ids requested to retain
   hb_set_t *glyphs_requested;
 
+  // Tables which should not be processed, just pass them through.
+  hb_set_t *no_subset_tables;
+
   // Tables which should be dropped.
   hb_set_t *drop_tables;
 
@@ -73,15 +77,25 @@ struct hb_subset_plan_t
   unsigned int _num_output_glyphs;
   hb_set_t *_glyphset;
   hb_set_t *_glyphset_gsub;
+  hb_set_t *_glyphset_mathed;
+  hb_set_t *_glyphset_colred;
 
   //active lookups we'd like to retain
   hb_map_t *gsub_lookups;
   hb_map_t *gpos_lookups;
 
-  //active features we'd like to retain
+  //active langsys we'd like to retain
+  hb_hashmap_t<unsigned, hb_set_t *> *gsub_langsys;
+  hb_hashmap_t<unsigned, hb_set_t *> *gpos_langsys;
+
+  //active features after removing redundant langsys and prune_features
   hb_map_t *gsub_features;
   hb_map_t *gpos_features;
 
+  //active layers/palettes we'd like to retain
+  hb_map_t *colrv1_layers;
+  hb_map_t *colr_palettes;
+
   //The set of layout item variation store delta set indices to be retained
   hb_set_t *layout_variation_indices;
   //Old -> New layout item variation store delta set index mapping
@@ -89,6 +103,14 @@ struct hb_subset_plan_t
 
  public:
 
+  bool in_error () const { return !successful; }
+
+  bool check_success(bool success)
+  {
+    successful = (successful && success);
+    return successful;
+  }
+
   /*
    * The set of input glyph ids which will be retained in the subset.
    * Does NOT include ids kept due to retain_gids. You probably want to use
@@ -163,12 +185,15 @@ struct hb_subset_plan_t
   add_table (hb_tag_t tag,
             hb_blob_t *contents)
   {
-    hb_blob_t *source_blob = source->reference_table (tag);
-    DEBUG_MSG(SUBSET, nullptr, "add table %c%c%c%c, dest %d bytes, source %d bytes",
-             HB_UNTAG(tag),
-             hb_blob_get_length (contents),
-             hb_blob_get_length (source_blob));
-    hb_blob_destroy (source_blob);
+    if (HB_DEBUG_SUBSET)
+    {
+      hb_blob_t *source_blob = source->reference_table (tag);
+      DEBUG_MSG(SUBSET, nullptr, "add table %c%c%c%c, dest %d bytes, source %d bytes",
+               HB_UNTAG(tag),
+               hb_blob_get_length (contents),
+               hb_blob_get_length (source_blob));
+      hb_blob_destroy (source_blob);
+    }
     return hb_face_builder_add_table (dest, tag, contents);
   }
 };
@@ -177,7 +202,7 @@ typedef struct hb_subset_plan_t hb_subset_plan_t;
 
 HB_INTERNAL hb_subset_plan_t *
 hb_subset_plan_create (hb_face_t           *face,
-                      hb_subset_input_t   *input);
+                      const hb_subset_input_t   *input);
 
 HB_INTERNAL void
 hb_subset_plan_destroy (hb_subset_plan_t *plan);
index 3112739..bb46e5b 100644 (file)
 #include "hb-ot-maxp-table.hh"
 #include "hb-ot-color-sbix-table.hh"
 #include "hb-ot-color-colr-table.hh"
+#include "hb-ot-color-cpal-table.hh"
 #include "hb-ot-os2-table.hh"
 #include "hb-ot-post-table.hh"
+#include "hb-ot-post-table-v2subset.hh"
 #include "hb-ot-cff1-table.hh"
 #include "hb-ot-cff2-table.hh"
 #include "hb-ot-vorg-table.hh"
 #include "hb-ot-layout-gpos-table.hh"
 #include "hb-ot-var-gvar-table.hh"
 #include "hb-ot-var-hvar-table.hh"
+#include "hb-ot-math-table.hh"
+#include "hb-repacker.hh"
 
+/**
+ * SECTION:hb-subset
+ * @title: hb-subset
+ * @short_description: Subsets font files.
+ * @include: hb-subset.h
+ *
+ * Subsetting reduces the codepoint coverage of font files and removes all data
+ * that is no longer needed. A subset input describes the desired subset. The input is
+ * provided along with a font to the subsetting operation. Output is a new font file
+ * containing only the data specified in the input.
+ *
+ * Currently most outline and bitmap tables are supported: glyf, CFF, CFF2, sbix,
+ * COLR, and CBDT/CBLC. This also includes fonts with variable outlines via OpenType
+ * variations. Notably EBDT/EBLC and SVG are not supported. Layout subsetting is supported
+ * only for OpenType Layout tables (GSUB, GPOS, GDEF). Notably subsetting of graphite or AAT tables
+ * is not yet supported.
+ *
+ * Fonts with graphite or AAT tables may still be subsetted but will likely need to use the
+ * retain glyph ids option and configure the subset to pass through the layout tables untouched.
+ */
 
 static unsigned
 _plan_estimate_subset_table_size (hb_subset_plan_t *plan, unsigned table_len)
@@ -64,69 +88,129 @@ _plan_estimate_subset_table_size (hb_subset_plan_t *plan, unsigned table_len)
   return 512 + (unsigned) (table_len * sqrt ((double) dst_glyphs / src_glyphs));
 }
 
+/*
+ * Repack the serialization buffer if any offset overflows exist.
+ */
+static hb_blob_t*
+_repack (hb_tag_t tag, const hb_serialize_context_t& c)
+{
+  if (tag != HB_OT_TAG_GPOS
+      &&  tag != HB_OT_TAG_GSUB)
+  {
+    // Check for overflow in a non-handled table.
+    return c.successful () ? c.copy_blob () : nullptr;
+  }
+
+  if (!c.offset_overflow ())
+    return c.copy_blob ();
+
+  hb_blob_t* result = hb_resolve_overflows (c.object_graph (), tag);
+
+  if (unlikely (!result))
+  {
+    DEBUG_MSG (SUBSET, nullptr, "OT::%c%c%c%c offset overflow resolution failed.",
+               HB_UNTAG (tag));
+    return nullptr;
+  }
+
+  return result;
+}
+
+template<typename TableType>
+static
+bool
+_try_subset (const TableType *table,
+             hb_vector_t<char>* buf,
+             unsigned buf_size,
+             hb_subset_context_t* c /* OUT */)
+{
+  c->serializer->start_serialize<TableType> ();
+  if (c->serializer->in_error ()) return false;
+
+  bool needed = table->subset (c);
+  if (!c->serializer->ran_out_of_room ())
+  {
+    c->serializer->end_serialize ();
+    return needed;
+  }
+
+  buf_size += (buf_size >> 1) + 32;
+  DEBUG_MSG (SUBSET, nullptr, "OT::%c%c%c%c ran out of room; reallocating to %u bytes.",
+             HB_UNTAG (c->table_tag), buf_size);
+
+  if (unlikely (!buf->alloc (buf_size)))
+  {
+    DEBUG_MSG (SUBSET, nullptr, "OT::%c%c%c%c failed to reallocate %u bytes.",
+               HB_UNTAG (c->table_tag), buf_size);
+    return needed;
+  }
+
+  c->serializer->reset (buf->arrayZ, buf_size);
+  return _try_subset (table, buf, buf_size, c);
+}
+
 template<typename TableType>
 static bool
 _subset (hb_subset_plan_t *plan)
 {
-  bool result = false;
   hb_blob_t *source_blob = hb_sanitize_context_t ().reference_table<TableType> (plan->source);
   const TableType *table = source_blob->as<TableType> ();
 
   hb_tag_t tag = TableType::tableTag;
-  if (source_blob->data)
+  if (!source_blob->data)
+  {
+    DEBUG_MSG (SUBSET, nullptr,
+               "OT::%c%c%c%c::subset sanitize failed on source table.", HB_UNTAG (tag));
+    hb_blob_destroy (source_blob);
+    return false;
+  }
+
+  hb_vector_t<char> buf;
+  /* TODO Not all tables are glyph-related.  'name' table size for example should not be
+   * affected by number of glyphs.  Accommodate that. */
+  unsigned buf_size = _plan_estimate_subset_table_size (plan, source_blob->length);
+  DEBUG_MSG (SUBSET, nullptr,
+             "OT::%c%c%c%c initial estimated table size: %u bytes.", HB_UNTAG (tag), buf_size);
+  if (unlikely (!buf.alloc (buf_size)))
+  {
+    DEBUG_MSG (SUBSET, nullptr, "OT::%c%c%c%c failed to allocate %u bytes.", HB_UNTAG (tag), buf_size);
+    hb_blob_destroy (source_blob);
+    return false;
+  }
+
+  bool needed = false;
+  hb_serialize_context_t serializer (buf.arrayZ, buf_size);
   {
-    hb_vector_t<char> buf;
-    /* TODO Not all tables are glyph-related.  'name' table size for example should not be
-     * affected by number of glyphs.  Accommodate that. */
-    unsigned buf_size = _plan_estimate_subset_table_size (plan, source_blob->length);
-    DEBUG_MSG (SUBSET, nullptr, "OT::%c%c%c%c initial estimated table size: %u bytes.", HB_UNTAG (tag), buf_size);
-    if (unlikely (!buf.alloc (buf_size)))
-    {
-      DEBUG_MSG (SUBSET, nullptr, "OT::%c%c%c%c failed to allocate %u bytes.", HB_UNTAG (tag), buf_size);
-      hb_blob_destroy (source_blob);
-      return false;
-    }
-  retry:
-    hb_serialize_context_t serializer ((void *) buf, buf_size);
-    serializer.start_serialize<TableType> ();
     hb_subset_context_t c (source_blob, plan, &serializer, tag);
-    bool needed = table->subset (&c);
-    if (serializer.ran_out_of_room)
-    {
-      buf_size += (buf_size >> 1) + 32;
-      DEBUG_MSG (SUBSET, nullptr, "OT::%c%c%c%c ran out of room; reallocating to %u bytes.", HB_UNTAG (tag), buf_size);
-      if (unlikely (!buf.alloc (buf_size)))
-      {
-       DEBUG_MSG (SUBSET, nullptr, "OT::%c%c%c%c failed to reallocate %u bytes.", HB_UNTAG (tag), buf_size);
-       hb_blob_destroy (source_blob);
-       return false;
-      }
-      goto retry;
-    }
-    serializer.end_serialize ();
+    needed = _try_subset (table, &buf, buf_size, &c);
+  }
+  hb_blob_destroy (source_blob);
 
-    result = !serializer.in_error ();
+  if (serializer.in_error () && !serializer.only_offset_overflow ())
+  {
+    DEBUG_MSG (SUBSET, nullptr, "OT::%c%c%c%c::subset FAILED!", HB_UNTAG (tag));
+    return false;
+  }
 
-    if (result)
-    {
-      if (needed)
-      {
-       hb_blob_t *dest_blob = serializer.copy_blob ();
-       DEBUG_MSG (SUBSET, nullptr, "OT::%c%c%c%c final subset table size: %u bytes.", HB_UNTAG (tag), dest_blob->length);
-       result = c.plan->add_table (tag, dest_blob);
-       hb_blob_destroy (dest_blob);
-      }
-      else
-      {
-       DEBUG_MSG (SUBSET, nullptr, "OT::%c%c%c%c::subset table subsetted to empty.", HB_UNTAG (tag));
-      }
-    }
+  if (!needed)
+  {
+    DEBUG_MSG (SUBSET, nullptr, "OT::%c%c%c%c::subset table subsetted to empty.", HB_UNTAG (tag));
+    return true;
   }
-  else
-    DEBUG_MSG (SUBSET, nullptr, "OT::%c%c%c%c::subset sanitize failed on source table.", HB_UNTAG (tag));
 
-  hb_blob_destroy (source_blob);
-  DEBUG_MSG (SUBSET, nullptr, "OT::%c%c%c%c::subset %s", HB_UNTAG (tag), result ? "success" : "FAILED!");
+  bool result = false;
+  hb_blob_t *dest_blob = _repack (tag, serializer);
+  if (dest_blob)
+  {
+    DEBUG_MSG (SUBSET, nullptr,
+               "OT::%c%c%c%c final subset table size: %u bytes.",
+               HB_UNTAG (tag), dest_blob->length);
+    result = plan->add_table (tag, dest_blob);
+    hb_blob_destroy (dest_blob);
+  }
+
+  DEBUG_MSG (SUBSET, nullptr, "OT::%c%c%c%c::subset %s",
+             HB_UNTAG (tag), result ? "success" : "FAILED!");
   return result;
 }
 
@@ -159,7 +243,7 @@ _should_drop_table (hb_subset_plan_t *plan, hb_tag_t tag)
   case HB_TAG ('p','r','e','p'): /* hint table, fallthrough */
   case HB_TAG ('h','d','m','x'): /* hint table, fallthrough */
   case HB_TAG ('V','D','M','X'): /* hint table, fallthrough */
-    return plan->drop_hints;
+    return plan->flags & HB_SUBSET_FLAGS_NO_HINTING;
 
 #ifdef HB_NO_SUBSET_LAYOUT
     // Drop Layout Tables if requested.
@@ -179,8 +263,21 @@ _should_drop_table (hb_subset_plan_t *plan, hb_tag_t tag)
 }
 
 static bool
+_passthrough (hb_subset_plan_t *plan, hb_tag_t tag)
+{
+  hb_blob_t *source_table = hb_face_reference_table (plan->source, tag);
+  bool result = plan->add_table (tag, source_table);
+  hb_blob_destroy (source_table);
+  return result;
+}
+
+static bool
 _subset_table (hb_subset_plan_t *plan, hb_tag_t tag)
 {
+  if (plan->no_subset_tables->has (tag)) {
+    return _passthrough (plan, tag);
+  }
+
   DEBUG_MSG (SUBSET, nullptr, "subset %c%c%c%c", HB_UNTAG (tag));
   switch (tag)
   {
@@ -202,8 +299,10 @@ _subset_table (hb_subset_plan_t *plan, hb_tag_t tag)
   case HB_OT_TAG_OS2 : return _subset<const OT::OS2 > (plan);
   case HB_OT_TAG_post: return _subset<const OT::post> (plan);
   case HB_OT_TAG_COLR: return _subset<const OT::COLR> (plan);
+  case HB_OT_TAG_CPAL: return _subset<const OT::CPAL> (plan);
   case HB_OT_TAG_CBLC: return _subset<const OT::CBLC> (plan);
   case HB_OT_TAG_CBDT: return true; /* skip CBDT, handled by CBLC */
+  case HB_OT_TAG_MATH: return _subset<const OT::MATH> (plan);
 
 #ifndef HB_NO_SUBSET_CFF
   case HB_OT_TAG_cff1: return _subset<const OT::cff1> (plan);
@@ -221,26 +320,34 @@ _subset_table (hb_subset_plan_t *plan, hb_tag_t tag)
 #endif
 
   default:
-    hb_blob_t *source_table = hb_face_reference_table (plan->source, tag);
-    bool result = plan->add_table (tag, source_table);
-    hb_blob_destroy (source_table);
-    return result;
+    if (plan->flags & HB_SUBSET_FLAGS_PASSTHROUGH_UNRECOGNIZED)
+      return _passthrough (plan, tag);
+
+    // Drop table
+    return true;
   }
 }
 
 /**
- * hb_subset:
+ * hb_subset_or_fail:
  * @source: font face data to be subset.
  * @input: input to use for the subsetting.
  *
- * Subsets a font according to provided input.
+ * Subsets a font according to provided input. Returns nullptr
+ * if the subset operation fails.
+ *
+ * Since: 2.9.0
  **/
 hb_face_t *
-hb_subset (hb_face_t *source, hb_subset_input_t *input)
+hb_subset_or_fail (hb_face_t *source, const hb_subset_input_t *input)
 {
   if (unlikely (!input || !source)) return hb_face_get_empty ();
 
   hb_subset_plan_t *plan = hb_subset_plan_create (source, input);
+  if (unlikely (plan->in_error ())) {
+    hb_subset_plan_destroy (plan);
+    return nullptr;
+  }
 
   hb_set_t tags_set;
   bool success = true;
@@ -260,7 +367,8 @@ hb_subset (hb_face_t *source, hb_subset_input_t *input)
   }
 end:
 
-  hb_face_t *result = success ? hb_face_reference (plan->dest) : hb_face_get_empty ();
+  hb_face_t *result = success ? hb_face_reference (plan->dest) : nullptr;
+
   hb_subset_plan_destroy (plan);
   return result;
 }
index ddf4409..1c65a4d 100644 (file)
 
 HB_BEGIN_DECLS
 
-/*
- * hb_subset_input_t
+/**
+ * hb_subset_input_t:
  *
  * Things that change based on the input. Characters to keep, etc.
  */
 
 typedef struct hb_subset_input_t hb_subset_input_t;
 
+/**
+ * hb_subset_flags_t:
+ * @HB_SUBSET_FLAGS_DEFAULT: all flags at their default value of false.
+ * @HB_SUBSET_FLAGS_NO_HINTING: If set hinting instructions will be dropped in
+ * the produced subset. Otherwise hinting instructions will be retained.
+ * @HB_SUBSET_FLAGS_RETAIN_GIDS: If set glyph indices will not be modified in
+ * the produced subset. If glyphs are dropped their indices will be retained
+ * as an empty glyph.
+ * @HB_SUBSET_FLAGS_DESUBROUTINIZE: If set and subsetting a CFF font the
+ * subsetter will attempt to remove subroutines from the CFF glyphs.
+ * @HB_SUBSET_FLAGS_NAME_LEGACY: If set non-unicode name records will be
+ * retained in the subset.
+ * @HB_SUBSET_FLAGS_SET_OVERLAPS_FLAG: If set the subsetter will set the
+ * OVERLAP_SIMPLE flag on each simple glyph.
+ * @HB_SUBSET_FLAGS_PASSTHROUGH_UNRECOGNIZED: If set the subsetter will not
+ * drop unrecognized tables and instead pass them through untouched.
+ * @HB_SUBSET_FLAGS_NOTDEF_OUTLINE: If set the notdef glyph outline will be
+ * retained in the final subset.
+ * @HB_SUBSET_FLAGS_GLYPH_NAMES: If set the PS glyph names will be retained
+ * in the final subset.
+ * @HB_SUBSET_FLAGS_NO_PRUNE_UNICODE_RANGES: If set then the unicode ranges in
+ * OS/2 will not be recalculated.
+ *
+ * List of boolean properties that can be configured on the subset input.
+ *
+ * Since: 2.9.0
+ **/
+typedef enum { /*< flags >*/
+  HB_SUBSET_FLAGS_DEFAULT =                 0x00000000u,
+  HB_SUBSET_FLAGS_NO_HINTING =              0x00000001u,
+  HB_SUBSET_FLAGS_RETAIN_GIDS =                     0x00000002u,
+  HB_SUBSET_FLAGS_DESUBROUTINIZE =          0x00000004u,
+  HB_SUBSET_FLAGS_NAME_LEGACY =                     0x00000008u,
+  HB_SUBSET_FLAGS_SET_OVERLAPS_FLAG =       0x00000010u,
+  HB_SUBSET_FLAGS_PASSTHROUGH_UNRECOGNIZED = 0x00000020u,
+  HB_SUBSET_FLAGS_NOTDEF_OUTLINE =          0x00000040u,
+  HB_SUBSET_FLAGS_GLYPH_NAMES =                     0x00000080u,
+  HB_SUBSET_FLAGS_NO_PRUNE_UNICODE_RANGES =  0x00000100u,
+} hb_subset_flags_t;
+
+/**
+ * hb_subset_sets_t:
+ * @HB_SUBSET_SETS_GLYPH_INDEX: the set of glyph indexes to retain in the subset.
+ * @HB_SUBSET_SETS_UNICODE: the set of unicode codepoints to retain in the subset.
+ * @HB_SUBSET_SETS_NO_SUBSET_TABLE_TAG: the set of table tags which specifies tables that should not be
+ * subsetted.
+ * @HB_SUBSET_SETS_DROP_TABLE_TAG: the set of table tags which specifies tables which will be dropped
+ * in the subset.
+ * @HB_SUBSET_SETS_NAME_ID: the set of name ids that will be retained.
+ * @HB_SUBSET_SETS_NAME_LANG_ID: the set of name lang ids that will be retained.
+ * @HB_SUBSET_SETS_LAYOUT_FEATURE_TAG: the set of layout feature tags that will be retained
+ * in the subset.
+ *
+ * List of sets that can be configured on the subset input.
+ *
+ * Since: 2.9.1
+ **/
+typedef enum {
+  HB_SUBSET_SETS_GLYPH_INDEX = 0,
+  HB_SUBSET_SETS_UNICODE,
+  HB_SUBSET_SETS_NO_SUBSET_TABLE_TAG,
+  HB_SUBSET_SETS_DROP_TABLE_TAG,
+  HB_SUBSET_SETS_NAME_ID,
+  HB_SUBSET_SETS_NAME_LANG_ID,
+  HB_SUBSET_SETS_LAYOUT_FEATURE_TAG,
+} hb_subset_sets_t;
+
 HB_EXTERN hb_subset_input_t *
 hb_subset_input_create_or_fail (void);
 
 HB_EXTERN hb_subset_input_t *
-hb_subset_input_reference (hb_subset_input_t *subset_input);
+hb_subset_input_reference (hb_subset_input_t *input);
 
 HB_EXTERN void
-hb_subset_input_destroy (hb_subset_input_t *subset_input);
+hb_subset_input_destroy (hb_subset_input_t *input);
 
-HB_EXTERN hb_set_t *
-hb_subset_input_unicode_set (hb_subset_input_t *subset_input);
+HB_EXTERN hb_bool_t
+hb_subset_input_set_user_data (hb_subset_input_t  *input,
+                              hb_user_data_key_t *key,
+                              void *              data,
+                              hb_destroy_func_t   destroy,
+                              hb_bool_t           replace);
 
-HB_EXTERN hb_set_t *
-hb_subset_input_glyph_set (hb_subset_input_t *subset_input);
+HB_EXTERN void *
+hb_subset_input_get_user_data (const hb_subset_input_t *input,
+                              hb_user_data_key_t          *key);
 
 HB_EXTERN hb_set_t *
-hb_subset_input_nameid_set (hb_subset_input_t *subset_input);
+hb_subset_input_unicode_set (hb_subset_input_t *input);
 
 HB_EXTERN hb_set_t *
-hb_subset_input_namelangid_set (hb_subset_input_t *subset_input);
+hb_subset_input_glyph_set (hb_subset_input_t *input);
 
 HB_EXTERN hb_set_t *
-hb_subset_input_drop_tables_set (hb_subset_input_t *subset_input);
+hb_subset_input_set (hb_subset_input_t *input, hb_subset_sets_t set_type);
 
-HB_EXTERN void
-hb_subset_input_set_drop_hints (hb_subset_input_t *subset_input,
-                               hb_bool_t drop_hints);
-HB_EXTERN hb_bool_t
-hb_subset_input_get_drop_hints (hb_subset_input_t *subset_input);
+HB_EXTERN hb_subset_flags_t
+hb_subset_input_get_flags (hb_subset_input_t *input);
 
 HB_EXTERN void
-hb_subset_input_set_desubroutinize (hb_subset_input_t *subset_input,
-                                   hb_bool_t desubroutinize);
-HB_EXTERN hb_bool_t
-hb_subset_input_get_desubroutinize (hb_subset_input_t *subset_input);
-
-HB_EXTERN void
-hb_subset_input_set_retain_gids (hb_subset_input_t *subset_input,
-                                hb_bool_t retain_gids);
-HB_EXTERN hb_bool_t
-hb_subset_input_get_retain_gids (hb_subset_input_t *subset_input);
+hb_subset_input_set_flags (hb_subset_input_t *input,
+                          unsigned value);
 
-HB_EXTERN void
-hb_subset_input_set_name_legacy (hb_subset_input_t *subset_input,
-                                hb_bool_t name_legacy);
-HB_EXTERN hb_bool_t
-hb_subset_input_get_name_legacy (hb_subset_input_t *subset_input);
-
-/* hb_subset () */
 HB_EXTERN hb_face_t *
-hb_subset (hb_face_t *source, hb_subset_input_t *input);
-
+hb_subset_or_fail (hb_face_t *source, const hb_subset_input_t *input);
 
 HB_END_DECLS
 
index dc86f15..98c5f06 100644 (file)
@@ -45,20 +45,19 @@ struct hb_subset_context_t :
   private:
   template <typename T, typename ...Ts> auto
   _dispatch (const T &obj, hb_priority<1>, Ts&&... ds) HB_AUTO_RETURN
-  ( obj.subset (this, hb_forward<Ts> (ds)...) )
+  ( obj.subset (this, std::forward<Ts> (ds)...) )
   template <typename T, typename ...Ts> auto
   _dispatch (const T &obj, hb_priority<0>, Ts&&... ds) HB_AUTO_RETURN
-  ( obj.dispatch (this, hb_forward<Ts> (ds)...) )
+  ( obj.dispatch (this, std::forward<Ts> (ds)...) )
   public:
   template <typename T, typename ...Ts> auto
   dispatch (const T &obj, Ts&&... ds) HB_AUTO_RETURN
-  ( _dispatch (obj, hb_prioritize, hb_forward<Ts> (ds)...) )
+  ( _dispatch (obj, hb_prioritize, std::forward<Ts> (ds)...) )
 
   hb_blob_t *source_blob;
   hb_subset_plan_t *plan;
   hb_serialize_context_t *serializer;
   hb_tag_t table_tag;
-  unsigned int debug_depth;
 
   hb_subset_context_t (hb_blob_t *source_blob_,
                       hb_subset_plan_t *plan_,
@@ -67,8 +66,7 @@ struct hb_subset_context_t :
                        source_blob (source_blob_),
                        plan (plan_),
                        serializer (serializer_),
-                       table_tag (table_tag_),
-                       debug_depth (0) {}
+                       table_tag (table_tag_) {}
 };
 
 
index 88623db..1a4c89c 100644 (file)
@@ -4,7 +4,7 @@
  *
  *   ./gen-ucd-table.py ucd.nounihan.grouped.xml
  *
- * on file with this description: Unicode 13.0.0
+ * on file with this description: Unicode 14.0.0
  */
 
 #ifndef HB_UCD_TABLE_HH
@@ -13,7 +13,7 @@
 #include "hb.hh"
 
 static const hb_script_t
-_hb_ucd_sc_map[157] =
+_hb_ucd_sc_map[162] =
 {
                    HB_SCRIPT_COMMON,              HB_SCRIPT_INHERITED,
                   HB_SCRIPT_UNKNOWN,                 HB_SCRIPT_ARABIC,
@@ -93,7 +93,9 @@ _hb_ucd_sc_map[157] =
               HB_SCRIPT_NANDINAGARI, HB_SCRIPT_NYIAKENG_PUACHUE_HMONG,
                    HB_SCRIPT_WANCHO,             HB_SCRIPT_CHORASMIAN,
               HB_SCRIPT_DIVES_AKURU,    HB_SCRIPT_KHITAN_SMALL_SCRIPT,
-                   HB_SCRIPT_YEZIDI,
+                   HB_SCRIPT_YEZIDI,           HB_SCRIPT_CYPRO_MINOAN,
+               HB_SCRIPT_OLD_UYGHUR,                 HB_SCRIPT_TANGSA,
+                     HB_SCRIPT_TOTO,               HB_SCRIPT_VITHKUQI,
 };
 static const uint16_t
 _hb_ucd_dm1_p0_map[825] =
@@ -1065,144 +1067,144 @@ _hb_ucd_dm2_u64_map[388] =
 #ifndef HB_OPTIMIZE_SIZE
 
 static const uint8_t
-_hb_ucd_u8[32480] =
+_hb_ucd_u8[33120] =
 {
     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
    16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 26, 26, 26, 26, 26,
    26, 26, 26, 26, 26, 26, 27, 26, 26, 26, 26, 26, 26, 26, 26, 26,
    26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
-   26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 28,
-   29, 26, 30, 31, 32, 33, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
-   26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 34, 35, 35, 35, 35,
-   36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 37, 38, 39, 40,
-   41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
-   26, 57, 58, 59, 59, 59, 59, 59, 26, 26, 60, 59, 59, 59, 59, 59,
-   59, 59, 26, 61, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 26, 62, 59, 63, 26, 26, 26, 26, 26, 26, 26, 26,
-   26, 26, 26, 64, 26, 26, 65, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 66, 67, 59, 59, 59, 59, 68, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 69, 70, 71, 72, 73, 74, 59, 59,
-   75, 76, 59, 59, 77, 59, 78, 79, 80, 81, 73, 82, 83, 84, 59, 59,
    26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+   28, 26, 29, 30, 31, 32, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+   26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 33, 34, 34, 34, 34,
+   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 36, 37, 38, 39,
+   40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
+   26, 56, 57, 58, 58, 58, 58, 59, 26, 26, 60, 58, 58, 58, 58, 58,
+   58, 58, 26, 61, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 26, 62, 58, 63, 26, 26, 26, 26, 26, 26, 26, 26,
+   26, 26, 26, 64, 26, 26, 65, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 66, 67, 68, 58, 58, 58, 58, 69, 58,
+   58, 58, 58, 58, 58, 58, 58, 70, 71, 72, 73, 74, 75, 76, 58, 77,
+   78, 79, 58, 80, 81, 58, 82, 83, 84, 85, 75, 86, 87, 88, 58, 58,
    26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
    26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
    26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
    26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
-   26, 26, 26, 85, 26, 26, 26, 26, 26, 26, 26, 86, 87, 26, 26, 26,
-   26, 26, 26, 26, 26, 26, 26, 88, 26, 26, 26, 26, 26, 26, 26, 26,
-   26, 26, 26, 26, 26, 89, 59, 59, 59, 59, 59, 59, 26, 90, 59, 59,
-   26, 26, 26, 26, 26, 26, 26, 26, 26, 91, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   92, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-   36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-   36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-   36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-   36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-   36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-   36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-   36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 93,
-   36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-   36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-   36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-   36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-   36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-   36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-   36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-   36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 94,
+   26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+   26, 26, 26, 89, 26, 26, 26, 26, 26, 26, 26, 90, 91, 26, 26, 26,
+   26, 26, 26, 26, 26, 26, 26, 92, 26, 26, 26, 26, 26, 26, 26, 26,
+   26, 26, 26, 26, 26, 93, 58, 58, 58, 58, 58, 58, 26, 94, 58, 58,
+   26, 26, 26, 26, 26, 26, 26, 26, 26, 95, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   96, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 97,
+   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 98,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    29, 21, 21, 21, 23, 21, 21, 21, 22, 18, 21, 25, 21, 17, 21, 21,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 21, 21, 25, 25, 25, 21,
@@ -1255,7 +1257,7 @@ _hb_ucd_u8[32480] =
     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  2,  2,  2,  2,  7,
     7,  7,  7, 21, 21,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
     1,  1,  1,  1,  1,  1, 25, 25, 25, 21, 21, 23, 21, 21, 26, 26,
-   12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 21,  1,  2, 21, 21,
+   12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 21,  1, 21, 21, 21,
     6,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7, 12, 12, 12, 12, 12,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 21, 21, 21, 21,  7,  7,
    12,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
@@ -1275,10 +1277,9 @@ _hb_ucd_u8[32480] =
    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,  2,
     7,  7,  7,  7,  7,  7,  7,  7,  7, 12, 12, 12,  2,  2, 21,  2,
     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  2,  2,  2,  2,  2,
-    2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-    7,  7,  7,  7,  7,  2,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-    7,  7,  7,  7,  7,  7,  7,  7,  2,  2,  2,  2,  2,  2,  2,  2,
-    2,  2,  2, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    7,  7,  7,  7,  7,  7,  7,  7, 24,  7,  7,  7,  7,  7,  7,  2,
+    1,  1,  2,  2,  2,  2,  2,  2, 12, 12, 12, 12, 12, 12, 12, 12,
+    7,  7,  7,  7,  7,  7,  7,  7,  7,  6, 12, 12, 12, 12, 12, 12,
    12, 12,  1, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 10,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
     7,  7,  7,  7,  7,  7,  7,  7,  7,  7, 12, 10, 12,  7, 10, 10,
@@ -1320,14 +1321,14 @@ _hb_ucd_u8[32480] =
    15, 15, 15, 26, 26, 26, 26, 26, 26, 23, 26,  2,  2,  2,  2,  2,
    12, 10, 10, 10, 12,  7,  7,  7,  7,  7,  7,  7,  7,  2,  7,  7,
     7,  2,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-    7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  2,  2,  2,  7, 12, 12,
+    7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  2,  2, 12,  7, 12, 12,
    12, 10, 10, 10, 10,  2, 12, 12, 12,  2, 12, 12, 12, 12,  2,  2,
-    2,  2,  2,  2,  2, 12, 12,  2,  7,  7,  7,  2,  2,  2,  2,  2,
+    2,  2,  2,  2,  2, 12, 12,  2,  7,  7,  7,  2,  2,  7,  2,  2,
     2,  2,  2,  2,  2,  2,  2, 21, 15, 15, 15, 15, 15, 15, 15, 26,
     7, 12, 10, 10, 21,  7,  7,  7,  7,  7,  7,  7,  7,  2,  7,  7,
     7,  7,  7,  7,  2,  7,  7,  7,  7,  7,  2,  2, 12,  7, 10, 12,
    10, 10, 10, 10, 10,  2, 12, 10, 10,  2, 10, 10, 12, 12,  2,  2,
-    2,  2,  2,  2,  2, 10, 10,  2,  2,  2,  2,  2,  2,  2,  7,  2,
+    2,  2,  2,  2,  2, 10, 10,  2,  2,  2,  2,  2,  2,  7,  7,  2,
     2,  7,  7,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
    12, 12, 10, 10,  7,  7,  7,  7,  7,  7,  7,  7,  7,  2,  7,  7,
     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7, 12, 12,  7, 10, 10,
@@ -1344,6 +1345,7 @@ _hb_ucd_u8[32480] =
     7, 12,  7,  7, 12, 12, 12, 12, 12, 12, 12,  2,  2,  2,  2, 23,
     7,  7,  7,  7,  7,  7,  6, 12, 12, 12, 12, 12, 12, 12, 12, 21,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 21, 21,  2,  2,  2,  2,
+    2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
     2,  7,  7,  2,  7,  2,  7,  7,  7,  7,  7,  2,  7,  7,  7,  7,
     7,  7,  7,  7,  2,  7,  2,  7,  7,  7,  7,  7,  7,  7,  7,  7,
     7, 12,  7,  7, 12, 12, 12, 12, 12, 12, 12, 12, 12,  7,  2,  2,
@@ -1387,17 +1389,17 @@ _hb_ucd_u8[32480] =
     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7, 22, 18,  2,  2,  2,
     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7, 21, 21, 21, 14, 14,
    14,  7,  7,  7,  7,  7,  7,  7,  7,  2,  2,  2,  2,  2,  2,  2,
-    7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  2,  7,  7,
-    7,  7, 12, 12, 12,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-    7,  7, 12, 12, 12, 21, 21,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+    7,  7, 12, 12, 12, 10,  2,  2,  2,  2,  2,  2,  2,  2,  2,  7,
+    7,  7, 12, 12, 10, 21, 21,  2,  2,  2,  2,  2,  2,  2,  2,  2,
     7,  7, 12, 12,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+    7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  2,  7,  7,
     7,  2, 12, 12,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
     7,  7,  7,  7, 12, 12, 10, 12, 12, 12, 12, 12, 12, 12, 10, 10,
    10, 10, 10, 10, 10, 10, 12, 10, 10, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 21, 21, 21,  6, 21, 21, 21, 23,  7, 12,  2,  2,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  2,  2,  2,  2,  2,  2,
    15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  2,  2,  2,  2,  2,  2,
-   21, 21, 21, 21, 21, 21, 17, 21, 21, 21, 21, 12, 12, 12,  1,  2,
+   21, 21, 21, 21, 21, 21, 17, 21, 21, 21, 21, 12, 12, 12,  1, 12,
     7,  7,  7,  6,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
     7,  7,  7,  7,  7,  7,  7,  7,  7,  2,  2,  2,  2,  2,  2,  2,
     7,  7,  7,  7,  7, 12, 12,  7,  7,  7,  7,  7,  7,  7,  7,  7,
@@ -1419,12 +1421,12 @@ _hb_ucd_u8[32480] =
    10, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,  2,  2, 12,
    21, 21, 21, 21, 21, 21, 21,  6, 21, 21, 21, 21, 21, 21,  2,  2,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 12,
-   12,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+   12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,  2,
    12, 12, 12, 12, 10,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
     7,  7,  7,  7, 12, 10, 12, 12, 12, 12, 12, 10, 12, 10, 10, 10,
-   10, 10, 12, 10, 10,  7,  7,  7,  7,  7,  7,  7,  2,  2,  2,  2,
+   10, 10, 12, 10, 10,  7,  7,  7,  7,  7,  7,  7,  7,  2,  2,  2,
    21, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 12, 12, 12, 12, 12,
-   12, 12, 12, 12, 26, 26, 26, 26, 26, 26, 26, 26, 26,  2,  2,  2,
+   12, 12, 12, 12, 26, 26, 26, 26, 26, 26, 26, 26, 26, 21, 21,  2,
    12, 12, 10,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
     7, 10, 12, 12, 12, 12, 10, 10, 12, 12, 10, 12, 12, 12,  7,  7,
     7,  7,  7,  7,  7,  7, 12, 10, 12, 12, 10, 10, 10, 12, 10, 12,
@@ -1443,7 +1445,6 @@ _hb_ucd_u8[32480] =
     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  5,  5,  5,  5,  5,
     5,  5,  5,  5,  5,  5,  5,  5,  6,  5,  5,  5,  5,  5,  5,  5,
     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  6,  6,  6,  6,  6,
-   12, 12, 12, 12, 12, 12, 12, 12, 12, 12,  2, 12, 12, 12, 12, 12,
     9,  5,  9,  5,  9,  5,  5,  5,  5,  5,  5,  5,  5,  5,  9,  5,
     5,  5,  5,  5,  5,  5,  5,  5,  9,  9,  9,  9,  9,  9,  9,  9,
     5,  5,  5,  5,  5,  5,  2,  2,  9,  9,  9,  9,  9,  9,  2,  2,
@@ -1466,8 +1467,10 @@ _hb_ucd_u8[32480] =
    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 25, 25, 25, 22, 18,  2,
     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  2,  2,  2,
    23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+   23,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 11, 11,
    11, 12, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+   12,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
    26, 26,  9, 26, 26, 26, 26,  9, 26, 26,  5,  9,  9,  9,  5,  5,
     9,  9,  9,  5, 26,  9, 26, 26, 25,  9,  9,  9,  9,  9, 26, 26,
    26, 26, 26, 26,  9, 26,  9, 26,  9, 26,  9,  9,  9,  9, 26,  5,
@@ -1509,8 +1512,6 @@ _hb_ucd_u8[32480] =
    25, 25, 25, 25, 25, 26, 26, 25, 25, 25, 25, 25, 25, 26, 26, 26,
    26, 26, 26, 26,  2,  2, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
    26, 26, 26, 26, 26, 26,  2, 26, 26, 26, 26, 26, 26, 26, 26, 26,
-    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  2,
-    5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  2,
     9,  5,  9,  9,  9,  5,  5,  9,  5,  9,  5,  9,  5,  9,  9,  9,
     9,  5,  9,  5,  5,  9,  5,  5,  5,  5,  5,  5,  6,  6,  9,  9,
     9,  5,  9,  5,  5, 26, 26, 26, 26, 26, 26,  9,  5,  9,  5, 12,
@@ -1525,7 +1526,7 @@ _hb_ucd_u8[32480] =
    20, 19, 22, 18, 22, 18, 22, 18, 22, 18, 21, 21, 21, 21, 21,  6,
    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 17, 17, 21, 21, 21, 21,
    17, 21, 22, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
-   26, 26, 21,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+   26, 26, 21, 21, 21, 22, 18, 22, 18, 22, 18, 22, 18, 17,  2,  2,
    26, 26, 26, 26, 26, 26, 26, 26, 26, 26,  2, 26, 26, 26, 26, 26,
    26, 26, 26, 26,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
    26, 26, 26, 26, 26, 26,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
@@ -1558,8 +1559,9 @@ _hb_ucd_u8[32480] =
     9,  5,  9,  5,  5,  5,  9,  5,  9,  5,  9,  5,  9,  5,  9,  5,
     9,  5,  9,  5,  9,  5,  9,  5,  9,  5,  9,  9,  9,  9,  9,  5,
     9,  9,  9,  9,  9,  5,  9,  5,  9,  5,  9,  5,  9,  5,  9,  5,
-    2,  2,  9,  5,  9,  9,  9,  9,  5,  9,  5,  2,  2,  2,  2,  2,
-    2,  2,  2,  2,  2,  9,  5,  7,  6,  6,  5,  7,  7,  7,  7,  7,
+    9,  5,  9,  5,  9,  9,  9,  9,  5,  9,  5,  2,  2,  2,  2,  2,
+    9,  5,  2,  5,  2,  5,  9,  5,  9,  5,  2,  2,  2,  2,  2,  2,
+    2,  2,  6,  6,  6,  9,  5,  7,  6,  6,  5,  7,  7,  7,  7,  7,
     7,  7, 12,  7,  7,  7, 12,  7,  7,  7,  7, 12,  7,  7,  7,  7,
     7,  7,  7, 10, 10, 12, 12, 10, 26, 26, 26, 26, 12,  2,  2,  2,
    15, 15, 15, 15, 15, 15, 26, 26, 23, 26,  2,  2,  2,  2,  2,  2,
@@ -1601,16 +1603,18 @@ _hb_ucd_u8[32480] =
     7,  7,  7,  7,  7,  7,  7,  2,  7,  7,  7,  7,  7,  2,  7,  2,
     7,  7,  2,  7,  7,  2,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
     7,  7, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
-   24, 24,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+   24, 24, 24,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
     2,  2,  2,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7, 18, 22,
     2,  2,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-    7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7, 23, 26,  2,  2,
+    7,  7,  7,  7,  7,  7,  7,  7,  2,  2,  2,  2,  2,  2,  2, 26,
+    7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7, 23, 26, 26, 26,
    21, 21, 21, 21, 21, 21, 21, 22, 18, 21,  2,  2,  2,  2,  2,  2,
    21, 17, 17, 16, 16, 22, 18, 22, 18, 22, 18, 22, 18, 22, 18, 22,
    18, 22, 18, 22, 18, 21, 21, 22, 18, 21, 21, 21, 21, 16, 16, 16,
    21, 21, 21,  2, 21, 21, 21, 21, 17, 22, 18, 22, 18, 22, 18, 21,
    21, 21, 25, 17, 25, 25, 25,  2, 21, 23, 21, 21,  2,  2,  2,  2,
+    7,  7,  7,  7,  7,  2,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  2,  2,  1,
     2, 21, 21, 21, 23, 21, 21, 21, 22, 18, 21, 25, 21, 17, 21, 21,
     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 22, 25, 18, 25, 22,
@@ -1641,7 +1645,14 @@ _hb_ucd_u8[32480] =
     9,  9,  9,  9,  9,  9,  9,  9,  5,  5,  5,  5,  5,  5,  5,  5,
     9,  9,  9,  9,  2,  2,  2,  2,  5,  5,  5,  5,  5,  5,  5,  5,
     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  2,  2,  2,  2,
+    7,  7,  7,  7,  7,  7,  7,  7,  2,  2,  2,  2,  2,  2,  2,  2,
     7,  7,  7,  7,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 21,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  2,  9,  9,  9,  9,
+    9,  9,  9,  2,  9,  9,  2,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+    5,  5,  2,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+    5,  5,  2,  5,  5,  5,  5,  5,  5,  5,  2,  5,  5,  2,  2,  2,
+    6,  6,  6,  6,  6,  6,  2,  6,  6,  6,  6,  6,  6,  6,  6,  6,
+    6,  2,  6,  6,  6,  6,  6,  6,  6,  6,  6,  2,  2,  2,  2,  2,
     7,  7,  7,  7,  7,  7,  2,  2,  7,  2,  7,  7,  7,  7,  7,  7,
     7,  7,  7,  7,  7,  7,  2,  7,  7,  2,  2,  2,  7,  2,  2,  7,
     7,  7,  7,  7,  7,  7,  2, 21, 15, 15, 15, 15, 15, 15, 15, 15,
@@ -1675,14 +1686,15 @@ _hb_ucd_u8[32480] =
     7,  7,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
    15, 15, 15, 15, 15, 15, 15,  7,  2,  2,  2,  2,  2,  2,  2,  2,
    12, 15, 15, 15, 15, 21, 21, 21, 21, 21,  2,  2,  2,  2,  2,  2,
+    7,  7, 12, 12, 12, 12, 21, 21, 21, 21,  2,  2,  2,  2,  2,  2,
     7,  7,  7,  7,  7, 15, 15, 15, 15, 15, 15, 15,  2,  2,  2,  2,
    10, 12, 10,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
     7,  7,  7,  7,  7,  7,  7,  7, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 21, 21, 21, 21, 21, 21, 21,  2,  2,
    15, 15, 15, 15, 15, 15, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 12,
+   12,  7,  7, 12, 12,  7,  2,  2,  2,  2,  2,  2,  2,  2,  2, 12,
    10, 10, 10, 12, 12, 12, 12, 10, 10, 12, 12, 21, 21,  1, 21, 21,
-   21, 21,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  1,  2,  2,
+   21, 21, 12,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  1,  2,  2,
    12, 12, 12,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
     7,  7,  7,  7,  7,  7,  7, 12, 12, 12, 12, 12, 10, 12, 12, 12,
    12, 12, 12, 12, 12,  2, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
@@ -1719,7 +1731,7 @@ _hb_ucd_u8[32480] =
    12, 21, 21, 21,  7,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,  2,  2,  2,
     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7, 12, 10, 12, 10, 10,
-   12, 12, 12, 12, 12, 12, 10, 12,  7,  2,  2,  2,  2,  2,  2,  2,
+   12, 12, 12, 12, 12, 12, 10, 12,  7, 21,  2,  2,  2,  2,  2,  2,
    10, 10, 12, 12, 12, 12, 10, 12, 12, 12, 12, 12,  2,  2,  2,  2,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 15, 15, 21, 21, 21, 26,
    12, 12, 12, 12, 12, 12, 12, 12, 10, 12, 12, 21,  2,  2,  2,  2,
@@ -1756,6 +1768,7 @@ _hb_ucd_u8[32480] =
    26, 26,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 21,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  2,
    21, 21, 21, 21, 21,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+    7, 21, 21,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  2,  2,  2,  2,  2,  2,  2,
    12, 12, 12, 12, 12, 21,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
    12, 12, 12, 12, 12, 12, 12, 21, 21, 21, 21, 21, 26, 26, 26, 26,
@@ -1771,16 +1784,18 @@ _hb_ucd_u8[32480] =
    12, 12, 12,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
     6,  6, 21,  6, 12,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
    10, 10,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+    6,  6,  6,  6,  2,  6,  6,  6,  6,  6,  6,  6,  2,  6,  6,  2,
     7,  7,  7,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
     2,  2,  2,  2,  7,  7,  7,  7,  2,  2,  2,  2,  2,  2,  2,  2,
     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  2,  2, 26, 12, 12, 21,
     1,  1,  1,  1,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+   12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,  2,  2,
+   12, 12, 12, 12, 12, 12, 12,  2,  2,  2,  2,  2,  2,  2,  2,  2,
    26, 26, 26, 26, 26, 26, 26,  2,  2, 26, 26, 26, 26, 26, 26, 26,
    26, 26, 26, 26, 26, 10, 10, 12, 12, 12, 26, 26, 26, 10, 10, 10,
    10, 10, 10,  1,  1,  1,  1,  1,  1,  1,  1, 12, 12, 12, 12, 12,
    12, 12, 12, 26, 26, 12, 12, 12, 12, 12, 12, 12, 26, 26, 26, 26,
    26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 12, 12, 12, 12, 26, 26,
-   26, 26, 26, 26, 26, 26, 26, 26, 26,  2,  2,  2,  2,  2,  2,  2,
    26, 26, 12, 12, 12, 26,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
    15, 15, 15, 15,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  5,  5,  5,  5,  5,  5,
@@ -1818,15 +1833,18 @@ _hb_ucd_u8[32480] =
    26, 26, 26, 26, 26, 12, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
    26, 26, 26, 26, 12, 26, 26, 21, 21, 21, 21, 21,  2,  2,  2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 12, 12, 12, 12, 12,
+    5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  7,  5,  5,  5,  5,  5,
+    5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  2,
    12, 12, 12, 12, 12, 12, 12,  2, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12,  2,  2, 12, 12, 12, 12, 12,
    12, 12,  2, 12, 12,  2, 12, 12, 12, 12, 12,  2,  2,  2,  2,  2,
    12, 12, 12, 12, 12, 12, 12,  6,  6,  6,  6,  6,  6,  6,  2,  2,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  2,  2,  2,  2,  7, 26,
+    7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7, 12,  2,
     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7, 12, 12, 12, 12,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  2,  2,  2,  2,  2, 23,
+    7,  7,  7,  7,  7,  7,  7,  2,  7,  7,  7,  7,  2,  7,  7,  2,
     7,  7,  7,  7,  7,  2,  2, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-   12, 12, 12, 12, 12, 12, 12,  2,  2,  2,  2,  2,  2,  2,  2,  2,
     5,  5,  5,  5, 12, 12, 12, 12, 12, 12, 12,  6,  2,  2,  2,  2,
    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 26, 15, 15, 15,
    23, 15, 15, 15, 15,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
@@ -1847,12 +1865,12 @@ _hb_ucd_u8[32480] =
    26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,  2,  2,
     2,  2,  2,  2,  2,  2, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
    26, 26, 26,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+   26, 26, 26, 26, 26, 26, 26, 26, 26,  2,  2,  2,  2,  2,  2,  2,
    26, 26,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
    26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 24, 24, 24, 24, 24,
+   26, 26, 26, 26, 26, 26, 26, 26,  2,  2,  2,  2,  2, 26, 26, 26,
    26, 26, 26, 26, 26, 26, 26, 26,  2,  2,  2,  2,  2,  2,  2,  2,
-   26, 26, 26, 26, 26, 26, 26, 26, 26,  2, 26, 26, 26, 26, 26, 26,
-   26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,  2, 26, 26, 26,
-   26, 26, 26, 26, 26,  2,  2,  2, 26, 26, 26,  2,  2,  2,  2,  2,
+   26, 26, 26, 26, 26,  2,  2,  2, 26, 26, 26, 26, 26,  2,  2,  2,
    26, 26, 26,  2, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
     2,  1,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
@@ -1891,9 +1909,9 @@ _hb_ucd_u8[32480] =
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0, 49,  0,  0,  0,  0,  0, 50,  0,  0,  0,
     0,  0,  0, 51,  0, 52, 53,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0, 54, 55,  0,  0,  0,  0, 56,  0,  0, 57, 58,  0,
-   59, 60, 61, 62, 63, 64, 65,  0, 66, 67,  0, 68, 69, 70, 71,  0,
-   60,  0, 72, 73, 74, 75,  0,  0, 69,  0, 76, 77,  0,  0,  0,  0,
+    0,  0,  0,  0, 54, 55,  0,  0,  0,  0, 56,  0,  0, 57, 58, 59,
+   60, 61, 62, 63, 64, 65, 66,  0, 67, 68,  0, 69, 70, 71, 72,  0,
+   61,  0, 73, 74, 75, 76,  0,  0, 70,  0, 77, 78,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
@@ -1903,7 +1921,7 @@ _hb_ucd_u8[32480] =
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0, 78, 79,  0,  0,  0,  0,  0,  0,  0,  0, 80,
+    0,  0,  0,  0,  0, 79, 80,  0,  0,  0,  0,  0,  0,  0,  0, 81,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
@@ -1913,13 +1931,13 @@ _hb_ucd_u8[32480] =
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0, 81,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0, 82,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0, 82, 83, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0, 83, 84, 85,  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,
-   85,  0, 79,  0,  0, 86,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0, 87, 88,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+   86,  0, 80,  0,  0, 87,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0, 88, 89,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  1,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11,
    12,  1,  0,  0, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0, 14, 15, 16, 17, 18, 19, 20,  0,  0,  0,
@@ -1928,86 +1946,87 @@ _hb_ucd_u8[32480] =
    28, 29,  0,  0,  0,  0, 30,  0,  0,  0, 31, 32, 33, 34,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0, 13, 35, 36,  0,  0, 26, 37, 38, 39,  0,  0,  0,  0,  0, 40,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 41,  1,
-   42, 43, 44, 45,  0,  0,  0,  0,  0,  0,  0, 46,  0, 47, 48,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 46,  0, 47,  0,  0,
-    0,  0,  0, 49,  0,  0,  0,  0,  0,  0,  0, 46,  0, 47,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 47,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 47, 50,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 51,  0, 47,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 52,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 53,  0, 54,  0,  0,
+    0,  0,  0,  0,  0,  0,  0, 41,  0,  0,  0,  0,  0, 42, 43,  1,
+   44, 45, 46, 47,  0,  0,  0,  0,  0,  0,  0, 48,  0, 49, 50,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 48,  0, 49,  0,  0,
+    0,  0,  0, 51,  0,  0,  0,  0,  0,  0,  0, 48,  0, 49,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 49,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 48,  0, 49, 52,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 53,  0, 49,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 54,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 55,  0, 56,  0,  0,
-    0,  0,  0,  0,  0,  0,  0, 57,  0,  0, 58, 59,  0,  0,  0,  0,
-    0,  0, 60, 61, 62,  0,  0,  0,  0,  0,  0,  0, 63,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 64, 65,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 57,  0, 58,  0,  0,
+    0,  0,  0,  0,  0,  0,  0, 59,  0,  0, 60, 61,  0,  0,  0,  0,
+    0,  0, 62, 63, 64,  0,  0,  0,  0,  0,  0,  0, 65,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 66, 67,  0,  0,  0,  0,
     0,  0,  0,  0,  0, 36,  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, 66,
-    0,  0,  0,  0,  0,  0, 67,  0,  0,  0, 67,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 52, 68,
-    0,  0,  0,  0,  0,  0,  0,  0,  0, 69,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 70,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0, 71, 72,  0,  0,  0,  0,  0,  0,  0,  0,
-   73,  0, 66, 74,  0,  0,  0,  0,  0,  0, 75, 76, 72,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 46,  0, 67,  0,  0,  0,
-    0, 77, 78,  0,  0,  0,  0,  0,  0, 79,  0,  0,  0,  0,  0,  0,
-   80,  0, 79,  0,  0,  0,  0,  0,  0,  0, 64,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 81, 82,
-   83, 84, 85, 86,  0,  0,  0,  0,  0,  0,  0,  0, 87, 88, 89,  1,
-    1,  1, 90, 91,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 92, 93,
-   94, 95, 96,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0, 71, 86,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0, 97,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    1,  1,  1,  1,  0,  0,  0,  0,  0, 98,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0, 99,  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, 71,100,101,  0,  0,  0, 26,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0, 86,  0,102,  0,  0,  0,  0, 67,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 67,  0,  0,  0,
-    1,  1, 86,  0,  0,  0,  0,  0,  0,103,  0,  0,  0,  0,104,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,105,  0, 73,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,106,107,108,  0,  0,  0,
-    0,  0,102,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0, 47,  0,  0,  0,  0,  0,109,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,110,111,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 68,
+    0,  0,  0,  0,  0,  0, 69,  0,  0,  0, 70,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 54, 71,
+    0,  0,  0,  0,  0,  0,  0,  0,  0, 72,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 73,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0, 74, 75,  0,  0,  0,  0,  0,  0,  0,  0,
+   76,  0, 68, 77,  0,  0,  0,  0,  0,  0, 78, 79, 80, 81,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 48,  0, 70,  0,  0,  0,
+    0, 82, 83,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,
+   85,  0, 84,  0,  0,  0,  0,  0,  0,  0, 66,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 86, 87,
+   88, 89, 90, 91,  0,  0,  0,  0,  0,  0,  0,  0, 92, 93, 94,  1,
+    1,  1, 95, 96,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 97, 98,
+   99,100,101,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0, 74, 91,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,102,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    1,  1,  1,  1,  0,  0,  0,  0,  0,103,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,104,  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, 74,105,106,  0,  0,  0, 26,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0, 91,  0,107,  0,  0,  0,  0, 70,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 70,  0,  0,  0,
+    1,  1, 91,  0,  0,  0,  0,  0,  0,108,  0,  0,  0,  0,109,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,110,  0, 76,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,111,112,113,  0,  0,  0,
+    0,  0,107,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0, 49,  0,  0,  0,  0,  0,114,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,115,116,  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, 36,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-   72,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0, 26,112,  0,113,  0,  0,  0,  0,  0,114,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-  115,  0,  0,  0,  0,  0,  0,  0,100,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,116,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,117,118, 72,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,102,  0,  0,  0,
-    0,  0,  0, 97,  0,  0,  0,  0,  0,  0,  0,119,  0,  0,  0,  0,
-    0,  0,  0,  0,112,  0,  0,  0,  0,  0, 51,  0,  0,  0,  0,  0,
-    0,  0,105,  0,  0,  0,  0,  0,  0,  0,  0,  0, 73,120,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,121,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,122,  0,  0,  0,  0,  0,  0,  0,  0,  0,123,  0, 47,  0,  0,
-   26,124,124,  0,  0,  0,  0,  0,  0,  0,  0,  0,125,  0,  0, 49,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,126,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 97,127,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 97,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,128,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,104,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,129,105,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-   73,  0,  0,  0,  0,  0,  0,  0,  0,  0, 67,  0, 97,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,130,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,131,  0,  0,  0,
-    0,  0,  0,  0,  0,  0, 97,  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,132,  0,  0,  0,  0,  0,  0,  0,133,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,134,  0,  0,  0,  0,135,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-  136,137,138,139,140,141,  0,  0,  0,142,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,143,  0,  0,  0,
-    0,  0,  0,  0,133,  1,  1,144,145,112,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,100,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,146,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,100,147,  0,  0,
+   75,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0, 26,117,  0,118,  0,  0,  0,  0,  0,119,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+  120,  0,  0,  0,  0,  0,  0,  0,105,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,121,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,122,123, 75,  0,
+    0,  0,  0,  0,124,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,107,  0,  0,  0,
+    0,  0, 76,102,  0,  0,  0,  0,  0,  0,  0,125,  0,  0,  0,  0,
+    0,  0,  0,  0,117,  0,  0,  0,  0,  0, 53,  0,  0,  0,  0,  0,
+    0,  0,110,  0,  0,  0,  0,  0,  0,  0,  0,  0, 76,126,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,129,  0, 49,  0,  0,
+   26,130,130,  0,  0,  0,  0,  0,  0,  0,  0,  0,131,  0,  0, 51,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,132,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,102,133,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,102,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,134,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,109,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,135,110,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+   76,  0,  0,  0,  0,  0,  0,  0,  0,  0, 70,  0,102,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,136,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,137,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,102,  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,138,  0,  0,  0,  0,  0,  0,  0,139,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,140,  0,  0,  0,  0,141,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+  142,143,144,145,146,147,  0,  0,  0,148,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,149,  0,  0,  0,
+    0,  0,  0,  0,139,  1,  1,150,151,117,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0, 51,  0,  0,  0,  0,  0,  0,
+    0,105,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,152,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,105,153,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,230,230,230,230,
   230,230,230,230,230,230,230,230,230,232,220,220,220,220,232,216,
   220,220,220,220,220,202,202,220,220,220,220,202,202,220,220,220,
@@ -2028,7 +2047,8 @@ _hb_ucd_u8[32480] =
   220,230,220,230,220,230,230,  0,  0,  0,  0,  0,230,230,220,230,
     0,  0,  0,  0,  0,  0,  0,  0,  0,220,  0,  0,230,230,  0,230,
   230,230,230,230,230,230,230,230,  0,230,230,230,  0,230,230,230,
-  230,230,  0,  0,  0,220,220,220,  0,  0,  0,  0,  0,  0,  0,220,
+  230,230,  0,  0,  0,220,220,220,  0,  0,  0,  0,230,220,220,220,
+  230,230,230,230,  0,  0,230,230,230,230,230,220,220,220,220,220,
   230,230,230,230,230,230,  0,220,230,230,220,230,230,220,230,230,
   230,220,220,220, 27, 28, 29,230,230,230,220,230,230,220,220,230,
   230,230,230,230,  0,  0,  0,  0,  7,  0,  0,  0,  0,  0,  0,  0,
@@ -2042,32 +2062,34 @@ _hb_ucd_u8[32480] =
   130,130,  0,  0,130,  0,230,230,  9,  0,230,230,  0,  0,  0,  0,
     0,  0,220,  0,  0,  0,  0,  0,  0,  0,  0,  7,  0,  9,  9,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,230,230,230,  0,  0,  0,  0,
-    9,  0,  0,  0,  0,  0,  0,  0,  0,230,  0,  0,  0,228,  0,  0,
-    0,  0,  0,  0,  0,222,230,220,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,230,220,  0,  0,  0,  0,  0,  0,  0,  9,  0,  0,  0,
-    0,  0,  0,  0,230,230,230,230,230,  0,  0,220,230,230,230,230,
-  230,220,220,220,220,220,220,230,230,220,  0,220,  0,  0,  0,230,
-  220,230,230,230,230,230,230,230,  0,  0,  0,  0,  0,  0,  9,  9,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  7,  0,230,230,230,  0,
-    1,220,220,220,220,220,230,230,220,220,220,220,230,  0,  1,  1,
-    1,  1,  1,  1,  1,  0,  0,  0,  0,220,  0,  0,  0,  0,  0,  0,
-  230,  0,  0,  0,230,230,  0,  0,  0,  0,  0,  0,230,230,220,230,
-  230,230,230,230,230,230,220,230,230,234,214,220,202,230,230,230,
-  230,230,230,230,230,230,230,230,230,230,232,228,228,220,  0,230,
-  233,220,230,220,230,230,  1,  1,230,230,230,230,  1,  1,  1,230,
-  230,  0,  0,  0,  0,230,  0,  0,  0,  1,  1,230,220,230,  1,  1,
-  220,220,220,220,230,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  9,  0,  0,218,228,232,222,224,224,  0,  8,  8,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,230,230,230,230,230,230,230,230,
-  230,230,  0,  0,  0,  0,  0,  0,  0,  0,  9,  0,  0,  0,  0,220,
-  220,220,  0,  0,  0,  0,  0,  9,  0,  0,  0,  0,  0,  0,  0,  7,
-    0,  0,  0,  0,230,  0,230,230,220,  0,  0,230,230,  0,  0,  0,
-    0,  0,230,230,  0,230,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0, 26,  0,230,230,230,230,230,230,230,220,220,220,220,220,
-  220,220,230,230,230,230,230,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,220,  0,230,230,  1,220,  0,  0,  0,  0,  9,  0,  0,  0,  0,
-    0,230,220,  0,  0,  0,  0,230,230,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,220,220,230,230,230,220,230,220,220,220,  0,  9,  7,  0,
+    9,  9,  0,  0,  0,  0,  0,  0,  9,  0,  0,  0,  0,  0,  0,  0,
+    0,230,  0,  0,  0,228,  0,  0,  0,  0,  0,  0,  0,222,230,220,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,230,220,  0,  0,  0,
+    0,  0,  0,  0,  9,  0,  0,  0,  0,  0,  0,  0,230,230,230,230,
+  230,  0,  0,220,230,230,230,230,230,220,220,220,220,220,220,230,
+  230,220,  0,220,220,230,230,220,220,230,230,230,230,230,220,230,
+  230,230,230,  0,  0,  0,  0,230,220,230,230,230,230,230,230,230,
+    0,  0,  0,  0,  0,  0,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  7,  0,230,230,230,  0,  1,220,220,220,220,220,230,230,
+  220,220,220,220,230,  0,  1,  1,  1,  1,  1,  1,  1,  0,  0,  0,
+    0,220,  0,  0,  0,  0,  0,  0,230,  0,  0,  0,230,230,  0,  0,
+    0,  0,  0,  0,230,230,220,230,230,230,230,230,230,230,220,230,
+  230,234,214,220,202,230,230,230,230,230,230,230,230,230,230,230,
+  230,230,232,228,228,220,218,230,233,220,230,220,230,230,  1,  1,
+  230,230,230,230,  1,  1,  1,230,230,  0,  0,  0,  0,230,  0,  0,
+    0,  1,  1,230,220,230,  1,  1,220,220,220,220,230,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  9,  0,  0,218,228,
+  232,222,224,224,  0,  8,  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+  230,230,230,230,230,230,230,230,230,230,  0,  0,  0,  0,  0,  0,
+    0,  0,  9,  0,  0,  0,  0,220,220,220,  0,  0,  0,  0,  0,  9,
+    0,  0,  0,  0,  0,  0,  0,  7,  0,  0,  0,  0,230,  0,230,230,
+  220,  0,  0,230,230,  0,  0,  0,  0,  0,230,230,  0,230,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 26,  0,230,230,230,230,
+  230,230,230,220,220,220,220,220,220,220,230,230,230,230,230,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,220,  0,230,230,  1,220,  0,
+    0,  0,  0,  9,  0,  0,  0,  0,  0,230,220,  0,  0,  0,  0,230,
+  230,  0,  0,  0,  0,  0,  0,  0,  0,  0,220,220,230,230,230,220,
+  230,220,220,220,  0,  0,230,220,230,220,  0,  0,  0,  9,  7,  0,
     0,  0,  0,  0,  0,  0,  7,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  9,  7,  0,  0,  7,  9,  0,  0,  0,  0,  0,  0,  0,  0,  7,
     7,  0,  0,  0,230,230,230,230,230,  0,  0,  0,  0,  0,  9,  0,
@@ -2135,7 +2157,7 @@ _hb_ucd_u8[32480] =
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0, 46,  7,  1, 10,  1,  0,  0,  0,  1, 20, 20,  1,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0, 26, 34,  9,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0, 20, 20,  1, 20, 20,  0,  0,  0,  0,  0,
@@ -2155,141 +2177,141 @@ _hb_ucd_u8[32480] =
    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 25, 25, 25, 25, 25,
    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-   25, 25, 25, 27, 28, 28, 29, 30, 31, 32, 33, 33, 33, 33, 33, 33,
-   33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 34,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,
-   52, 53, 54, 55, 56, 57, 58, 35, 35, 35, 35, 35, 59, 59, 60, 35,
-   35, 35, 35, 35, 35, 35, 61, 62, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 63, 64, 35, 65, 66, 66, 66, 66,
-   66, 66, 66, 66, 66, 66, 66, 67, 66, 68, 69, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 70, 71, 35, 35,
-   35, 35, 72, 35, 35, 35, 35, 35, 35, 35, 35, 35, 73, 74, 75, 76,
-   77, 78, 35, 35, 79, 80, 35, 35, 81, 35, 82, 83, 84, 85, 17, 86,
-   87, 88, 35, 35, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+   25, 25, 25, 25, 27, 27, 28, 29, 30, 31, 32, 32, 32, 32, 32, 32,
+   32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 33,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
+   51, 52, 53, 54, 55, 56, 57, 34, 34, 34, 34, 58, 59, 59, 60, 34,
+   34, 34, 34, 34, 34, 34, 61, 62, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 63, 64, 34, 65, 66, 66, 66, 66,
+   66, 66, 66, 66, 66, 66, 66, 67, 66, 68, 69, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 70, 71, 72, 34, 34,
+   34, 34, 73, 34, 34, 34, 34, 34, 34, 34, 34, 74, 75, 76, 77, 78,
+   79, 80, 34, 81, 82, 83, 34, 84, 85, 34, 86, 87, 88, 89, 17, 90,
+   91, 92, 34, 34, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-   25, 25, 25, 25, 25, 25, 25, 89, 25, 25, 25, 25, 25, 25, 25, 90,
-   91, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 92, 25, 25, 25, 25,
-   25, 25, 25, 25, 25, 25, 25, 25, 25, 93, 35, 35, 35, 35, 35, 35,
-   25, 94, 35, 35, 25, 25, 25, 25, 25, 25, 25, 25, 25, 95, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 96,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0, 19, 19, 19, 19, 19, 19, 19, 19, 19,
-   19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
-   19,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-   19,  0,  0,  0,  0,  0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
-   19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,  0, 19, 19,
-   19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,  0,
-    0,  0,  0,  0,  0,  0, 19, 19, 19, 19, 19,  0,  0,  0,  0,  0,
-   26, 26,  0,  0,  0,  0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-    1,  1,  1,  1,  1,  1,  9,  9,  9,  9,  0,  9,  9,  9,  2,  2,
-    9,  9,  9,  9,  0,  9,  2,  2,  2,  2,  9,  0,  9,  0,  9,  9,
-    9,  2,  9,  2,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    9,  9,  9,  9,  9,  9,  9,  9,  2,  9,  9,  9,  9,  9,  9,  9,
-    9,  9,  9,  9,  9,  9,  9,  9, 55, 55, 55, 55, 55, 55, 55, 55,
-   55, 55, 55, 55, 55, 55,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-    6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  1,  1,  6,  6,  6,
-    6,  6,  6,  6,  6,  6,  2,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-    4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-    4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  2,  2,  4,
-    4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-    4,  2,  2,  4,  4,  4,  2, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-   14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-   14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  2,  2,
-    2,  2,  2,  2,  2,  2, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-   14,  2,  2,  2,  2, 14, 14, 14, 14, 14, 14,  2,  2,  2,  2,  2,
-    2,  2,  2,  2,  2,  2,  3,  3,  3,  3,  3,  0,  3,  3,  3,  3,
-    3,  3,  0,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-    3,  0,  3,  2,  3,  0,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+   25, 25, 25, 25, 25, 25, 25, 93, 25, 25, 25, 25, 25, 25, 25, 94,
+   95, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 96, 25, 25, 25, 25,
+   25, 25, 25, 25, 25, 25, 25, 25, 25, 97, 34, 34, 34, 34, 34, 34,
+   25, 98, 34, 34, 25, 25, 25, 25, 25, 25, 25, 25, 25, 99, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34,100,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+   19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+   19,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+   19,  0,  0,  0,  0,  0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+   19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,  0, 19, 19,
+   19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,  0,
+    0,  0,  0,  0,  0,  0, 19, 19, 19, 19, 19,  0,  0,  0,  0,  0,
+   26, 26,  0,  0,  0,  0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+    1,  1,  1,  1,  1,  1,  9,  9,  9,  9,  0,  9,  9,  9,  2,  2,
+    9,  9,  9,  9,  0,  9,  2,  2,  2,  2,  9,  0,  9,  0,  9,  9,
+    9,  2,  9,  2,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    9,  9,  9,  9,  9,  9,  9,  9,  2,  9,  9,  9,  9,  9,  9,  9,
+    9,  9,  9,  9,  9,  9,  9,  9, 55, 55, 55, 55, 55, 55, 55, 55,
+   55, 55, 55, 55, 55, 55,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
+    6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  1,  1,  6,  6,  6,
+    6,  6,  6,  6,  6,  6,  2,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+    4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+    4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  2,  2,  4,
+    4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+    4,  2,  2,  4,  4,  4,  2, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+   14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+   14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  2,  2,
+    2,  2,  2,  2,  2,  2, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+   14,  2,  2,  2,  2, 14, 14, 14, 14, 14, 14,  2,  2,  2,  2,  2,
+    2,  2,  2,  2,  2,  2,  3,  3,  3,  3,  3,  0,  3,  3,  3,  3,
+    3,  3,  0,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+    3,  0,  3,  3,  3,  0,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
     3,  3,  3,  3,  3,  3,  0,  3,  3,  3,  3,  3,  3,  3,  3,  3,
     3,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  3,  3,  3,  3,
     3,  3,  3,  3,  3,  3,  1,  3,  3,  3,  3,  3,  3,  3,  3,  3,
@@ -2307,10 +2329,8 @@ _hb_ucd_u8[32480] =
    90, 90, 90, 90, 90,  2, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95,
    95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95,
    95, 95,  2,  2, 95,  2, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
-   37,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-    2,  2,  2,  2,  2,  2,  3,  3,  3,  3,  3,  2,  3,  3,  3,  3,
-    3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  2,  2,
-    2,  2,  2,  2,  2,  2,  2,  2,  2,  3,  3,  3,  3,  3,  3,  3,
+   37,  2,  2,  2,  2,  2,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+    3,  3,  3,  3,  3,  2,  3,  3,  2,  2,  2,  2,  2,  2,  3,  3,
     3,  3,  3,  3,  3,  3,  3,  3,  0,  3,  3,  3,  3,  3,  3,  3,
     3,  3,  3,  3,  3,  3,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
     7,  7,  7,  7,  7,  7,  7,  1,  1,  1,  1,  7,  7,  7,  7,  7,
@@ -2359,9 +2379,9 @@ _hb_ucd_u8[32480] =
    23, 23, 23,  2, 23, 23, 23,  2, 23, 23, 23, 23, 23, 23, 23, 23,
    23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,  2,
    23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
-    2,  2,  2, 23, 23, 23, 23, 23, 23, 23, 23,  2, 23, 23, 23,  2,
+    2,  2, 23, 23, 23, 23, 23, 23, 23, 23, 23,  2, 23, 23, 23,  2,
    23, 23, 23, 23,  2,  2,  2,  2,  2,  2,  2, 23, 23,  2, 23, 23,
-   23,  2,  2,  2,  2,  2, 23, 23, 23, 23,  2,  2, 23, 23, 23, 23,
+   23,  2,  2, 23,  2,  2, 23, 23, 23, 23,  2,  2, 23, 23, 23, 23,
    23, 23, 23, 23, 23, 23,  2,  2,  2,  2,  2,  2,  2, 23, 23, 23,
    23, 23, 23, 23, 23, 23, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
    16, 16, 16,  2, 16, 16, 16,  2, 16, 16, 16, 16, 16, 16, 16, 16,
@@ -2369,7 +2389,7 @@ _hb_ucd_u8[32480] =
    16, 16, 16, 16, 16, 16, 16, 16, 16, 16,  2, 16, 16, 16, 16, 16,
     2,  2, 16, 16, 16, 16, 16, 16, 16, 16, 16,  2, 16, 16, 16,  2,
    16, 16, 16, 16,  2,  2,  2,  2,  2,  2,  2, 16, 16,  2,  2,  2,
-    2,  2,  2,  2, 16,  2, 16, 16, 16, 16,  2,  2, 16, 16, 16, 16,
+    2,  2,  2, 16, 16,  2, 16, 16, 16, 16,  2,  2, 16, 16, 16, 16,
    16, 16, 16, 16, 16, 16,  2, 16, 16,  2,  2,  2,  2,  2,  2,  2,
     2,  2,  2,  2,  2,  2, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
    20, 20, 20,  2, 20, 20, 20,  2, 20, 20, 20, 20, 20, 20, 20, 20,
@@ -2389,7 +2409,8 @@ _hb_ucd_u8[32480] =
    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
    24,  2,  2,  2,  2,  0, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
-   24, 24,  2,  2,  2,  2,  2, 18, 18,  2, 18,  2, 18, 18, 18, 18,
+   24, 24,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+    2,  2,  2,  2,  2,  2,  2, 18, 18,  2, 18,  2, 18, 18, 18, 18,
    18,  2, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
    18, 18, 18, 18, 18, 18, 18, 18, 18, 18,  2, 18,  2, 18, 18, 18,
    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
@@ -2424,8 +2445,8 @@ _hb_ucd_u8[32480] =
    35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
    35,  0,  0,  0, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,  2,
     2,  2,  2,  2,  2,  2, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-   45, 45, 45,  2, 45, 45, 45, 45, 45, 45, 45,  2,  2,  2,  2,  2,
-    2,  2,  2,  2,  2,  2, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+   45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,  2,  2,  2,  2,
+    2,  2,  2,  2,  2, 45, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
    44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,  0,  0,  2,  2,  2,
     2,  2,  2,  2,  2,  2, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
    43, 43, 43, 43, 43, 43, 43, 43, 43, 43,  2,  2,  2,  2,  2,  2,
@@ -2435,7 +2456,7 @@ _hb_ucd_u8[32480] =
    31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
    31, 31, 31, 31,  2,  2, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
     2,  2,  2,  2,  2,  2, 32, 32,  0,  0, 32,  0, 32, 32, 32, 32,
-   32, 32, 32, 32, 32,  2, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+   32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
     2,  2,  2,  2,  2,  2, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
    32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,  2,
     2,  2,  2,  2,  2,  2, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
@@ -2458,11 +2479,11 @@ _hb_ucd_u8[32480] =
    91, 91, 91, 91, 91,  2, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91,
    91, 91, 91,  2,  2, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91,
     2,  2,  2,  2,  2,  2, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91,
-   91, 91, 91, 91,  2,  2,  1,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-    2,  2,  2,  2,  2,  2, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+   91, 91, 91, 91,  2,  2,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+    1,  1,  1,  1,  1,  2, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
    62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
-   62, 62,  2,  2,  2,  2, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
-   62, 62, 62,  2,  2,  2, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76,
+   62, 62, 62,  2,  2,  2, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+   62, 62, 62, 62, 62,  2, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76,
    76, 76, 76, 76, 76, 76, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93,
    93, 93, 93, 93, 93, 93, 93, 93, 93, 93,  2,  2,  2,  2,  2,  2,
     2,  2, 93, 93, 93, 93, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
@@ -2480,8 +2501,7 @@ _hb_ucd_u8[32480] =
    19, 19, 19,  9,  9,  9,  9,  9, 19, 19, 19, 19,  9,  9,  9,  9,
     9, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,  6, 19,
    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
-   19, 19, 19, 19, 19,  9,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-    2,  1,  1,  1,  1,  1,  9,  9,  9,  9,  9,  9,  2,  2,  9,  9,
+   19, 19, 19, 19, 19,  9,  9,  9,  9,  9,  9,  9,  2,  2,  9,  9,
     9,  9,  9,  9,  2,  2,  9,  9,  9,  9,  9,  9,  9,  9,  2,  9,
     2,  9,  2,  9,  2,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
     9,  9,  9,  9,  2,  2,  9,  9,  9,  9,  9,  2,  9,  9,  9,  9,
@@ -2492,7 +2512,9 @@ _hb_ucd_u8[32480] =
     0,  0,  0,  0,  0,  0,  0, 19,  2,  2,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0, 19,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  2, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
-   19, 19, 19,  2,  2,  2,  0,  0,  0,  0,  0,  0,  9,  0,  0,  0,
+   19, 19, 19,  2,  2,  2,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+    2,  2,  2,  2,  2,  2,  1,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+    2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  9,  0,  0,  0,
    19, 19,  0,  0,  0,  0,  0,  0, 19,  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, 19,  0, 19, 19, 19, 19, 19, 19, 19, 19, 19,  0,
@@ -2502,16 +2524,15 @@ _hb_ucd_u8[32480] =
    27, 27, 27, 27, 27, 27,  0,  0,  0,  0,  2,  2,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  0,  0,  0,
     0,  0,  0,  0,  0,  0, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
-   56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
-   56, 56, 56, 56, 56,  2, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+   56, 56, 56, 56, 56, 56, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
    55, 55, 55, 55, 55, 55, 55, 55, 55, 55,  2,  2,  2,  2,  2, 55,
    55, 55, 55, 55, 55, 55, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
    61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,  2,  2,
     2,  2,  2,  2,  2, 61, 61,  2,  2,  2,  2,  2,  2,  2,  2,  2,
     2,  2,  2,  2,  2, 61, 30, 30, 30, 30, 30, 30, 30,  2,  2,  2,
     2,  2,  2,  2,  2,  2, 30, 30, 30, 30, 30, 30, 30,  2, 30, 30,
-   30, 30, 30, 30, 30,  2,  0,  0,  0,  2,  2,  2,  2,  2,  2,  2,
-    2,  2,  2,  2,  2,  2, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   30, 30, 30, 30, 30,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  2,  2, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
     2, 13, 13, 13, 13, 13, 13, 13, 13, 13,  2,  2,  2,  2,  2,  2,
     2,  2,  2,  2,  2,  2, 13, 13, 13, 13, 13, 13,  2,  2,  2,  2,
@@ -2533,8 +2554,7 @@ _hb_ucd_u8[32480] =
     2,  2,  2,  2,  2,  2, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12,  0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
    17, 17, 17, 17, 17,  0, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0,
-    0,  0,  0,  0,  0,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-   13, 13, 13,  2,  2,  2, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
+    0,  0,  0,  0,  0,  0, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
    39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
    39, 39, 39,  2,  2,  2, 39, 39, 39, 39, 39, 39, 39,  2,  2,  2,
     2,  2,  2,  2,  2,  2, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86,
@@ -2544,8 +2564,9 @@ _hb_ucd_u8[32480] =
    79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,  2,  2,
     2,  2,  2,  2,  2,  2,  0,  0, 19, 19, 19, 19, 19, 19, 19, 19,
    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,  0,  0,
-    0, 19, 19, 19, 19, 19,  2,  2, 19, 19, 19, 19, 19, 19, 19, 19,
-   19,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 19, 19, 19, 19, 19,
+    0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+   19,  2,  2,  2,  2,  2, 19, 19,  2, 19,  2, 19, 19, 19, 19, 19,
+    2,  2,  2,  2,  2,  2,  2,  2, 19, 19, 19, 19, 19, 19, 19, 19,
    19, 19, 19, 19, 19, 19, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
    60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
    60, 60, 60,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
@@ -2587,14 +2608,16 @@ _hb_ucd_u8[32480] =
     2,  2,  2,  2,  2,  2,  2,  2,  2,  4,  4,  4,  4,  4,  2,  2,
     2,  2,  2, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  2, 14, 14,
    14, 14, 14,  2, 14,  2, 14, 14,  2, 14, 14,  2, 14, 14, 14, 14,
-   14, 14, 14, 14, 14, 14,  3,  3,  2,  2,  2,  2,  2,  2,  2,  2,
-    2,  2,  2,  2,  2,  2,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-    3,  3,  3,  3,  0,  0,  2,  2,  3,  3,  3,  3,  3,  3,  3,  3,
+   14, 14, 14, 14, 14, 14,  3,  3,  3,  2,  2,  2,  2,  2,  2,  2,
+    2,  2,  2,  2,  2,  2,  2,  2,  2,  3,  3,  3,  3,  3,  3,  3,
     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-    3,  3,  3,  3,  2,  2,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+    3,  3,  3,  3,  0,  0,  2,  2,  3,  3,  3,  3,  3,  3,  3,  3,
+    3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  2,  2,
+    2,  2,  2,  2,  2,  3,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
     1,  1,  1,  1,  6,  6,  0,  0,  0,  2,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  0,  0,
-    0,  0,  2,  2,  2,  2,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+    0,  0,  2,  2,  2,  2,  3,  3,  3,  3,  3,  2,  3,  3,  3,  3,
+    3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
     3,  3,  3,  2,  2,  0,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 17, 17, 17, 17,
    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
@@ -2642,11 +2665,17 @@ _hb_ucd_u8[32480] =
   106,106,106,106,106,106,106,106,106,106,106,106,106,106,  2,  2,
     2,  2,  2,  2,  2,  2,104,104,104,104,104,104,104,104,104,104,
   104,104,104,104,104,104,104,104,104,104,  2,  2,  2,  2,  2,  2,
-    2,  2,  2,  2,  2,104,110,110,110,110,110,110,110,110,110,110,
+    2,  2,  2,  2,  2,104,161,161,161,161,161,161,161,161,161,161,
+  161,  2,161,161,161,161,161,161,161,  2,161,161,  2,161,161,161,
+  161,161,161,161,161,161,161,161,  2,161,161,161,161,161,161,161,
+  161,161,161,161,161,161,161,161,  2,161,161,161,161,161,161,161,
+    2,161,161,  2,  2,  2,110,110,110,110,110,110,110,110,110,110,
   110,110,110,110,110,110,110,110,110,110,110,110,110,  2,  2,  2,
     2,  2,  2,  2,  2,  2,110,110,110,110,110,110,  2,  2,  2,  2,
     2,  2,  2,  2,  2,  2,110,110,110,110,110,110,110,110,  2,  2,
-    2,  2,  2,  2,  2,  2, 47, 47, 47, 47, 47, 47,  2,  2, 47,  2,
+    2,  2,  2,  2,  2,  2, 19, 19, 19, 19, 19, 19,  2, 19, 19, 19,
+   19, 19, 19, 19, 19, 19, 19,  2, 19, 19, 19, 19, 19, 19, 19, 19,
+   19,  2,  2,  2,  2,  2, 47, 47, 47, 47, 47, 47,  2,  2, 47,  2,
    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,  2, 47, 47,  2,
     2,  2, 47,  2,  2, 47, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
@@ -2692,14 +2721,15 @@ _hb_ucd_u8[32480] =
   130,130,130,130,130,130,144,144,144,144,144,144,144,144,144,144,
   144,144,144,144,144,144,144,144,144,144,144,144,144,144,  2,  2,
     2,  2,  2,  2,  2,  2,144,144,144,144,144,144,144,144,144,144,
-    2,  2,  2,  2,  2,  2,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-    3,  3,  3,  3,  3,  2,156,156,156,156,156,156,156,156,156,156,
+    2,  2,  2,  2,  2,  2,156,156,156,156,156,156,156,156,156,156,
   156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,
     2,156,156,156,  2,  2,156,156,  2,  2,  2,  2,  2,  2,  2,  2,
     2,  2,  2,  2,  2,  2,147,147,147,147,147,147,147,147,147,147,
   147,147,147,147,147,147,147,147,147,147,147,147,147,147,  2,  2,
     2,  2,  2,  2,  2,  2,148,148,148,148,148,148,148,148,148,148,
   148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,
+    2,  2,  2,  2,  2,  2,158,158,158,158,158,158,158,158,158,158,
+  158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,
     2,  2,  2,  2,  2,  2,153,153,153,153,153,153,153,153,153,153,
   153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,
   153,153,  2,  2,  2,  2,149,149,149,149,149,149,149,149,149,149,
@@ -2707,9 +2737,9 @@ _hb_ucd_u8[32480] =
     2,  2,  2,  2,  2,  2, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
    94, 94, 94, 94,  2,  2,  2,  2, 94, 94, 94, 94, 94, 94, 94, 94,
-   94, 94, 94, 94, 94, 94,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+   94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,  2,  2,  2,  2,
     2,  2,  2,  2,  2, 94, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-   85, 85, 85, 85, 85, 85, 85, 85,  2,  2,  2,  2,  2,  2,  2,  2,
+   85, 85, 85, 85, 85, 85, 85, 85, 85,  2,  2,  2,  2,  2,  2,  2,
     2,  2,  2, 85,  2,  2,101,101,101,101,101,101,101,101,101,101,
   101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,  2,
     2,  2,  2,  2,  2,  2,101,101,101,101,101,101,101,101,101,101,
@@ -2752,12 +2782,12 @@ _hb_ucd_u8[32480] =
     2,  2,  2,  2,  2,  2,114,114,114,114,114,114,114,114,114,114,
     2,  2,  2,  2,  2,  2, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
    32, 32, 32,  2,  2,  2,102,102,102,102,102,102,102,102,102,102,
-  102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,  2,
-    2,  2,  2,  2,  2,  2,102,102,102,102,102,102,102,102,102,102,
+  102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
     2,  2,  2,  2,  2,  2,126,126,126,126,126,126,126,126,126,126,
   126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,
   126,  2,  2,126,126,126,126,126,126,126,126,126,126,126,126,126,
-  126,126,  2,  2,  2,  2,142,142,142,142,142,142,142,142,142,142,
+  126,126,  2,  2,  2,  2,126,126,126,126,126,126,126,  2,  2,  2,
+    2,  2,  2,  2,  2,  2,142,142,142,142,142,142,142,142,142,142,
   142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,
   142,142,  2,  2,  2,  2,125,125,125,125,125,125,125,125,125,125,
   125,125,125,125,125,125,125,125,125,  2,  2,  2,  2,  2,  2,  2,
@@ -2805,6 +2835,8 @@ _hb_ucd_u8[32480] =
     2,  2,  2,  2,  2,  2, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63,
    63, 63, 63, 63, 63,  2, 63, 63, 63, 63, 63,  2,  2,  2,  2,  2,
     2,  2,  2,  2,  2,  2, 63, 63, 63, 63,  2,  2,  2,  2,  2,  2,
+    2,  2,  2,  2,  2,  2,157,157,157,157,157,157,157,157,157,157,
+  157,157,157,157,157,157,157,157,157,  2,  2,  2,  2,  2,  2,  2,
     2,  2,  2,  2,  2,  2, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
    80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
    80, 80, 80, 80, 80,  2, 80, 80, 80, 80, 80, 80, 80, 80, 80,  2,
@@ -2814,7 +2846,10 @@ _hb_ucd_u8[32480] =
     2,  2,  2,  2,  2,  2,115,115,115,115,115,115,115,115,115,115,
   115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
   115,115,115,115,115,  2,115,115,115,115,115,115,115,115,115,115,
-    2,  2,  2,  2,115,115,103,103,103,103,103,103,103,103,103,103,
+    2,  2,  2,  2,115,115,159,159,159,159,159,159,159,159,159,159,
+  159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,
+  159,159,159,159,159,  2,159,159,159,159,159,159,159,159,159,159,
+    2,  2,  2,  2,  2,  2,103,103,103,103,103,103,103,103,103,103,
   103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,
   103,103,103,103,  2,  2,103,103,103,103,103,103,  2,  2,  2,  2,
     2,  2,  2,  2,  2,  2,119,119,119,119,119,119,119,119,119,119,
@@ -2827,16 +2862,17 @@ _hb_ucd_u8[32480] =
   146,  2,  2,  2,  2,  2, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
    99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
    99,  2,  2,  2,  2, 99, 99, 99, 99, 99, 99, 99, 99, 99,  2,  2,
-    2,  2,  2,  2,  2, 99,136,139,  0,  0,155,  2,  2,  2,  2,  2,
+    2,  2,  2,  2,  2, 99,136,139, 13, 13,155,  2,  2,  2,  2,  2,
     2,  2,  2,  2,  2,  2, 13, 13,  2,  2,  2,  2,  2,  2,  2,  2,
     2,  2,  2,  2,  2,  2,136,136,136,136,136,136,136,136,136,136,
   136,136,136,136,136,136,136,136,136,136,136,136,136,136,  2,  2,
     2,  2,  2,  2,  2,  2,155,155,155,155,155,155,155,155,155,155,
   155,155,155,155,155,155,155,155,155,155,155,155,  2,  2,  2,  2,
     2,  2,  2,  2,  2,  2,136,136,136,136,136,136,136,136,136,  2,
-    2,  2,  2,  2,  2,  2, 17, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-   15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-   15, 15, 15, 15, 15,  2, 15, 15, 15,  2,  2,  2,  2,  2,  2,  2,
+    2,  2,  2,  2,  2,  2, 17, 17, 17, 17,  2, 17, 17, 17, 17, 17,
+   17, 17,  2, 17, 17,  2, 17, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+   15, 15, 15, 15, 15, 15, 17, 17, 17,  2,  2,  2,  2,  2,  2,  2,
+    2,  2,  2,  2,  2,  2, 15, 15, 15,  2,  2,  2,  2,  2,  2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 17, 17, 17, 17,  2,  2,
     2,  2,  2,  2,  2,  2,139,139,139,139,139,139,139,139,139,139,
   139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,
@@ -2845,14 +2881,16 @@ _hb_ucd_u8[32480] =
   105,  2,  2,  2,  2,  2,105,105,105,105,105,105,105,105,105,105,
   105,105,105,  2,  2,  2,105,105,105,105,105,105,105,105,105,  2,
     2,  2,  2,  2,  2,  2,105,105,105,105,105,105,105,105,105,105,
-    2,  2,105,105,105,105,  0,  0,  0,  0,  0,  0,  2,  2,  2,  2,
+    2,  2,105,105,105,105,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+    1,  1,  1,  1,  2,  2,  1,  1,  1,  1,  1,  1,  1,  2,  2,  2,
+    2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  2,  2,  2,  2,
     2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  2,  2,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  1,  1,  1,  1,  1,  1,  1,  1,  0,  0,  1,  1,  1,  1,  1,
     1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,
-    2,  2,  2,  2,  2,  2,  9,  9,  9,  9,  9,  9,  2,  2,  2,  2,
+    1,  1,  1,  1,  0,  0,  9,  9,  9,  9,  9,  9,  2,  2,  2,  2,
+    2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,
     2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  2,  0,  0,  2,  2,  0,  2,  2,  0,  0,  2,  2,  0,
     0,  0,  0,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
@@ -2868,24 +2906,28 @@ _hb_ucd_u8[32480] =
   131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,
   131,131,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
     2,131,131,131,131,131,  2,131,131,131,131,131,131,131,131,131,
-  131,131,131,131,131,131, 56, 56, 56, 56, 56, 56, 56,  2, 56, 56,
+  131,131,131,131,131,131, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+   19, 19, 19, 19, 19,  2, 56, 56, 56, 56, 56, 56, 56,  2, 56, 56,
    56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,  2,
     2, 56, 56, 56, 56, 56, 56, 56,  2, 56, 56,  2, 56, 56, 56, 56,
    56,  2,  2,  2,  2,  2,151,151,151,151,151,151,151,151,151,151,
   151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,
   151,151,151,  2,  2,  2,151,151,151,151,151,151,151,151,151,151,
   151,151,151,151,  2,  2,151,151,151,151,151,151,151,151,151,151,
-    2,  2,  2,  2,151,151,152,152,152,152,152,152,152,152,152,152,
+    2,  2,  2,  2,151,151,160,160,160,160,160,160,160,160,160,160,
+  160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,
+  160,160,160,160,160,  2,152,152,152,152,152,152,152,152,152,152,
   152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,
-    2,  2,  2,  2,  2,152,113,113,113,113,113,113,113,113,113,113,
+    2,  2,  2,  2,  2,152, 30, 30, 30, 30, 30, 30, 30,  2, 30, 30,
+   30, 30,  2, 30, 30,  2, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
+   30, 30, 30, 30, 30,  2,113,113,113,113,113,113,113,113,113,113,
   113,113,113,113,113,113,113,113,113,113,113,  2,  2,113,113,113,
   113,113,113,113,113,113,113,113,113,113,113,113,113,  2,  2,  2,
     2,  2,  2,  2,  2,  2,132,132,132,132,132,132,132,132,132,132,
   132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,
   132,132,  2,  2,  2,  2,132,132,132,132,132,132,132,132,132,132,
     2,  2,  2,  2,132,132,  0,  0,  0,  0,  0,  2,  2,  2,  2,  2,
-    2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  2,  2,  3,  3,  3,  3,  2,  3,  3,  3,  3,  3,
+    2,  2,  2,  2,  2,  2,  3,  3,  3,  3,  2,  3,  3,  3,  3,  3,
     3,  3,  3,  3,  3,  3,  2,  3,  3,  2,  3,  2,  2,  3,  2,  3,
     3,  3,  3,  3,  3,  3,  3,  3,  3,  2,  3,  3,  3,  3,  2,  3,
     2,  3,  2,  2,  2,  2,  2,  2,  3,  2,  2,  2,  2,  3,  2,  3,
@@ -2895,14 +2937,14 @@ _hb_ucd_u8[32480] =
     3,  3,  3,  2,  3,  2,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
     2,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
     3,  3,  2,  2,  2,  2,  2,  3,  3,  3,  2,  3,  3,  3,  3,  3,
-    2,  3,  3,  3,  3,  3,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,
+    2,  3,  3,  3,  3,  3,  3,  3,  2,  2,  2,  2,  2,  2,  2,  2,
+    2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0, 15,  0,  0,  2,  2,  2,  2,  2,  2,  2,
     2,  2,  2,  2,  2,  2,  0,  0,  2,  2,  2,  2,  2,  2,  2,  2,
     2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  2,  2,
-    2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  2,  0,  0,  0,  0,  0,  0,  0,  0,  2,  2,  2,  0,  0,
-    0,  2,  2,  2,  2,  2, 13, 13, 13, 13, 13,  2,  2,  2,  2,  2,
+    2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  2,
+    2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  2,  2,  2,  0,  0,
+    0,  0,  0,  2,  2,  2, 13, 13, 13, 13, 13, 13, 13, 13, 13,  2,
     2,  2,  2,  2,  2,  2, 13,  2,  2,  2,  2,  2,  2,  2,  2,  2,
     2,  2,  2,  2,  2,  2, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13,  2,  2,  2,  2,  2,  2,  0,  2,  2,  2,  2,  2,  2,  2,  2,
@@ -3099,7 +3141,7 @@ _hb_ucd_u8[32480] =
     0,  0,  0,  0,  0,  0, 72, 73, 74, 75, 76, 77, 78, 79, 80,  0,
 };
 static const uint16_t
-_hb_ucd_u16[11328] =
+_hb_ucd_u16[11584] =
 {
      0,   0,   1,   2,   3,   4,   5,   6,   0,   0,   7,   8,   9,  10,  11,  12,
     13,  13,  13,  14,  15,  13,  13,  16,  17,  18,  19,  20,  21,  22,  13,  23,
@@ -3109,14 +3151,14 @@ _hb_ucd_u16[11328] =
     13,  13,  13,  42,   9,  43,  11,  11,  44,  45,  32,  46,  47,  48,  49,  50,
     51,  52,  48,  48,  53,  32,  54,  55,  48,  48,  48,  48,  48,  56,  57,  58,
     59,  60,  48,  32,  61,  48,  48,  48,  48,  48,  62,  63,  64,  48,  65,  66,
-    48,  67,  68,  69,  48,  70,  71,  72,  72,  72,  48,  73,  74,  75,  76,  32,
-    77,  48,  48,  78,  79,  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,
-    91,  84,  85,  92,  93,  94,  95,  96,  97,  98,  85,  99, 100, 101,  89, 102,
-   103,  84,  85, 104, 105, 106,  89, 107, 108, 109, 110, 111, 112, 113,  95, 114,
-   115, 116,  85, 117, 118, 119,  89, 120, 121, 116,  85, 122, 123, 124,  89, 125,
-   126, 116,  48, 127, 128, 129,  89, 130, 131, 132,  48, 133, 134, 135,  95, 136,
-   137,  48,  48, 138, 139, 140,  72,  72, 141,  48, 142, 143, 144, 145,  72,  72,
-   146, 147, 148, 149, 150,  48, 151, 152, 153, 154,  32, 155, 156, 157,  72,  72,
+    48,  67,  68,  69,  48,  70,  71,  48,  72,  73,  48,  48,  74,  32,  75,  32,
+    76,  48,  48,  77,  78,  79,  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,
+    90,  83,  84,  91,  92,  93,  94,  95,  96,  97,  84,  98,  99, 100,  88, 101,
+   102,  83,  84, 103, 104, 105,  88, 106, 107, 108, 109, 110, 111, 112,  94, 113,
+   114, 115,  84, 116, 117, 118,  88, 119, 120, 115,  84, 121, 122, 123,  88, 124,
+   125, 115,  48, 126, 127, 128,  88, 129, 130, 131,  48, 132, 133, 134,  94, 135,
+   136,  48,  48, 137, 138, 139, 140, 140, 141,  48, 142, 143, 144, 145, 140, 140,
+   146, 147, 148, 149, 150,  48, 151, 152, 153, 154,  32, 155, 156, 157, 140, 140,
     48,  48, 158, 159, 160, 161, 162, 163, 164, 165,   9,   9, 166,  11,  11, 167,
     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
     48,  48,  48,  48, 168, 169,  48,  48, 168,  48,  48, 170, 171, 172,  48,  48,
@@ -3124,51 +3166,49 @@ _hb_ucd_u16[11328] =
    178,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
     48,  48,  48,  48,  48,  48, 179,  48, 180, 181,  48,  48,  48,  48, 182, 183,
-   184, 185,  48, 186,  48, 187, 184, 188,  48,  48,  48, 189, 190, 191, 192, 193,
+    48, 184,  48, 185,  48, 186, 187, 188,  48,  48,  48, 189, 190, 191, 192, 193,
    194, 192,  48,  48, 195,  48,  48, 196, 197,  48, 198,  48,  48,  48,  48, 199,
     48, 200, 201, 202, 203,  48, 204, 205,  48,  48, 206,  48, 207, 208, 209, 209,
-    48, 210,  48,  48,  48, 211, 212, 213, 192, 192, 214, 215, 216,  72,  72,  72,
+    48, 210,  48,  48,  48, 211, 212, 213, 192, 192, 214, 215, 216, 140, 140, 140,
    217,  48,  48, 218, 219, 160, 220, 221, 222,  48, 223,  64,  48,  48, 224, 225,
     48,  48, 226, 227, 228,  64,  48, 229, 230,   9,   9, 231, 232, 233, 234, 235,
-    11,  11, 236,  27,  27,  27, 237, 238,  11, 239,  27,  27,  32,  32,  32, 240,
-    13,  13,  13,  13,  13,  13,  13,  13,  13, 241,  13,  13,  13,  13,  13,  13,
-   242, 243, 242, 242, 243, 244, 242, 245, 246, 246, 246, 247, 248, 249, 250, 251,
-   252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 262,  72, 263, 264, 216,
-   265, 266, 267, 268, 269, 270, 271, 271, 272, 273, 274, 209, 275, 276, 209, 277,
-   278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278,
-   279, 209, 280, 209, 209, 209, 209, 281, 209, 282, 278, 283, 209, 284, 285, 209,
-   209, 209, 286,  72, 287,  72, 270, 270, 270, 288, 209, 209, 209, 209, 289, 270,
-   209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 290, 291, 209, 209, 292,
-   209, 209, 209, 209, 209, 209, 293, 209, 209, 209, 209, 209, 209, 209, 209, 209,
-   209, 209, 209, 209, 209, 209, 294, 295, 270, 296, 209, 209, 297, 278, 298, 278,
+    11,  11, 236,  27,  27,  27, 237, 238,  11, 239,  27,  27,  32,  32,  32,  32,
+    13,  13,  13,  13,  13,  13,  13,  13,  13, 240,  13,  13,  13,  13,  13,  13,
+   241, 242, 241, 241, 242, 243, 241, 244, 245, 245, 245, 246, 247, 248, 249, 250,
+   251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 261, 262, 263, 264, 265,
+   266, 267, 268, 269, 270, 271, 272, 272, 273, 274, 275, 209, 276, 277, 209, 278,
+   279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279,
+   280, 209, 281, 209, 209, 209, 209, 282, 209, 283, 279, 284, 209, 285, 286, 209,
+   209, 209, 287, 140, 288, 140, 271, 271, 271, 289, 209, 209, 209, 209, 290, 271,
+   209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 291, 292, 209, 209, 293,
+   209, 209, 209, 209, 209, 209, 294, 209, 209, 209, 209, 209, 209, 209, 209, 209,
+   209, 209, 209, 209, 209, 209, 295, 296, 271, 297, 209, 209, 298, 279, 299, 279,
    209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209,
-   278, 278, 278, 278, 278, 278, 278, 278, 299, 300, 278, 278, 278, 301, 278, 302,
-   278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278,
-   209, 209, 209, 278, 303, 209, 209, 304, 209, 305, 209, 209, 209, 209, 209, 209,
-     9,   9, 306,  11,  11, 307, 308, 309,  13,  13,  13,  13,  13,  13, 310, 311,
-    11,  11, 312,  48,  48,  48, 313, 314,  48, 315, 316, 316, 316, 316,  32,  32,
-   317, 318, 319, 320, 321, 322,  72,  72, 209, 323, 209, 209, 209, 209, 209, 324,
-   209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 325,  72, 326,
-   327, 328, 329, 330, 137,  48,  48,  48,  48, 331, 178,  48,  48,  48,  48, 332,
-   333,  48,  48, 137,  48,  48,  48,  48, 200, 334,  48,  48, 209, 209, 324,  48,
-   209, 335, 336, 209, 337, 338, 209, 209, 336, 209, 209, 338, 209, 209, 209, 209,
+   279, 279, 279, 279, 279, 279, 279, 279, 300, 301, 279, 279, 279, 302, 279, 303,
+   279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279,
+   209, 209, 209, 279, 304, 209, 209, 305, 209, 306, 209, 209, 209, 209, 209, 209,
+     9,   9,   9,  11,  11,  11, 307, 308,  13,  13,  13,  13,  13,  13, 309, 310,
+    11,  11, 311,  48,  48,  48, 312, 313,  48, 314, 315, 315, 315, 315,  32,  32,
+   316, 317, 318, 319, 320, 321, 140, 140, 209, 322, 209, 209, 209, 209, 209, 323,
+   209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 324, 140, 325,
+   326, 327, 328, 329, 136,  48,  48,  48,  48, 330, 178,  48,  48,  48,  48, 331,
+   332,  48,  48, 136,  48,  48,  48,  48, 200, 333,  48,  48, 209, 209, 323,  48,
+   209, 334, 335, 209, 336, 337, 209, 209, 335, 209, 209, 337, 209, 209, 209, 209,
    209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209,
     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 209, 209, 209, 209,
+    48, 338,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-    48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 151,
-    48, 339,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
+    48,  48,  48,  48,  48,  48,  48,  48, 151, 209, 209, 209, 287,  48,  48, 229,
     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-    48,  48,  48,  48,  48,  48,  48,  48, 151, 209, 209, 209, 286,  48,  48, 229,
-    48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-   340,  48, 341,  72,  13,  13, 342, 343,  13, 344,  48,  48,  48,  48, 345, 346,
-    31, 347, 348, 349,  13,  13,  13, 350, 351, 352, 353, 354, 355,  72,  72, 356,
+   339,  48, 340, 140,  13,  13, 341, 342,  13, 343,  48,  48,  48,  48, 344, 345,
+    31, 346, 347, 348,  13,  13,  13, 349, 350, 351, 352, 353, 354, 355, 140, 356,
    357,  48, 358, 359,  48,  48,  48, 360, 361,  48,  48, 362, 363, 192,  32, 364,
-    64,  48, 365,  48, 366, 367,  48, 151,  77,  48,  48, 368, 369, 370, 371, 372,
+    64,  48, 365,  48, 366, 367,  48, 151,  76,  48,  48, 368, 369, 370, 371, 372,
     48,  48, 373, 374, 375, 376,  48, 377,  48,  48,  48, 378, 379, 380, 381, 382,
-   383, 384, 316,  11,  11, 385, 386,  11,  11,  11,  11,  11,  48,  48, 387, 192,
+   383, 384, 315,  11,  11, 385, 386,  11,  11,  11,  11,  11,  48,  48, 387, 192,
     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
     48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 388,  48, 389,  48,  48, 206,
    390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390,
@@ -3177,120 +3217,130 @@ _hb_ucd_u16[11328] =
    391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391,
    391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391,
     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-    48,  48,  48,  48,  48,  48, 204,  48,  48,  48,  48,  48,  48, 207,  72,  72,
+    48,  48,  48,  48,  48,  48, 204,  48,  48,  48,  48,  48,  48, 207, 140, 140,
    392, 393, 394, 395, 396,  48,  48,  48,  48,  48,  48, 397, 398, 399,  48,  48,
     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-    48,  48,  48, 400,  72,  48,  48,  48,  48, 401,  48,  48,  74,  72,  72, 402,
-    32, 403,  32, 404, 405, 406, 407,  73,  48,  48,  48,  48,  48,  48,  48, 408,
-   409,   2,   3,   4,   5, 410, 411, 412,  48, 413,  48, 200, 414, 415, 416, 417,
-   418,  48, 172, 419, 204, 204,  72,  72,  48,  48,  48,  48,  48,  48,  48,  71,
-   420, 270, 270, 421, 271, 271, 271, 422, 423, 424, 425,  72,  72, 209, 209, 426,
-    72,  72,  72,  72,  72,  72,  72,  72,  48, 151,  48,  48,  48, 101, 427, 428,
-    48,  48, 429,  48, 430,  48,  48, 431,  48, 432,  48,  48, 433, 434,  72,  72,
-     9,   9, 435,  11,  11,  48,  48,  48,  48, 204, 192,   9,   9, 436,  11, 437,
-    48,  48,  74,  48,  48,  48, 438,  72,  72,  72,  72,  72,  72,  72,  72,  72,
+    48,  48,  48, 400, 209,  48,  48,  48,  48, 401,  48,  48, 402, 140, 140, 403,
+    32, 404,  32, 405, 406, 407, 408, 409,  48,  48,  48,  48,  48,  48,  48, 410,
+   411,   2,   3,   4,   5, 412, 413, 414,  48, 415,  48, 200, 416, 417, 418, 419,
+   420,  48, 172, 421, 204, 204, 140, 140,  48,  48,  48,  48,  48,  48,  48,  71,
+   422, 271, 271, 423, 272, 272, 272, 424, 425, 426, 427, 140, 140, 209, 209, 428,
+   140, 140, 140, 140, 140, 140, 140, 140,  48, 151,  48,  48,  48, 100, 429, 430,
+    48,  48, 431,  48, 432,  48,  48, 433,  48, 434,  48,  48, 435, 436, 140, 140,
+     9,   9, 437,  11,  11,  48,  48,  48,  48, 204, 192,   9,   9, 438,  11, 439,
+    48,  48, 440,  48,  48,  48, 441, 442, 442, 443, 444, 445, 140, 140, 140, 140,
     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-    48,  48,  48, 315,  48, 199,  74,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-   439,  48,  48, 440,  48, 441,  48, 442,  48, 200, 443,  72,  72,  72,  48, 444,
-    48, 445,  48, 446,  72,  72,  72,  72,  48,  48,  48, 447, 270, 448, 270, 270,
-   449, 450,  48, 451, 452, 453,  48, 454,  48, 455,  72,  72, 456,  48, 457, 458,
-    48,  48,  48, 459,  48, 460,  48, 461,  48, 462, 463,  72,  72,  72,  72,  72,
-    48,  48,  48,  48, 196,  72,  72,  72,   9,   9,   9, 464,  11,  11,  11, 465,
-    48,  48, 466, 192,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-    72,  72,  72,  72,  72,  72, 270, 467,  48,  48, 468, 469,  72,  72,  72,  72,
-    48, 455, 470,  48,  62, 471,  72,  72,  72,  72,  72,  48, 472,  72,  48, 315,
-   473,  48,  48, 474, 475, 448, 476, 477, 222,  48,  48, 478, 479,  48, 196, 192,
-   480,  48, 481, 482, 483,  48,  48, 484, 222,  48,  48, 485, 486, 487, 488, 489,
-    48,  98, 490, 491,  72,  72,  72,  72, 492, 493, 494,  48,  48, 495, 496, 192,
-   497,  84,  85, 498, 499, 500, 501, 502,  72,  72,  72,  72,  72,  72,  72,  72,
-    48,  48,  48, 503, 504, 505, 469,  72,  48,  48,  48, 506, 507, 192,  72,  72,
-    72,  72,  72,  72,  72,  72,  72,  72,  48,  48, 508, 509, 510, 511,  72,  72,
-    48,  48,  48, 512, 513, 192, 514,  72,  48,  48, 515, 516, 192,  72,  72,  72,
-    48, 173, 517, 518,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-    48,  48, 490, 519,  72,  72,  72,  72,  72,  72,   9,   9,  11,  11, 148, 520,
-   521, 522,  48, 523, 524, 192,  72,  72,  72,  72, 525,  48,  48, 526, 527,  72,
-   528,  48,  48, 529, 530, 531,  48,  48, 532, 533, 534,  72,  48,  48,  48, 196,
-    72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-    85,  48, 508, 535, 536, 148, 175, 537,  48, 538, 539, 540,  72,  72,  72,  72,
-   541,  48,  48, 542, 543, 192, 544,  48, 545, 546, 192,  72,  72,  72,  72,  72,
-    72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  48, 547,
-    72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72, 101, 270, 548, 549, 550,
+    48,  48,  48, 314,  48, 199, 440, 140, 446,  27,  27, 447, 140, 140, 140, 140,
+   448,  48,  48, 449,  48, 450,  48, 451,  48, 200, 452, 140, 140, 140,  48, 453,
+    48, 454,  48, 455, 140, 140, 140, 140,  48,  48,  48, 456, 271, 457, 271, 271,
+   458, 459,  48, 460, 461, 462,  48, 463,  48, 464, 140, 140, 465,  48, 466, 467,
+    48,  48,  48, 468,  48, 469,  48, 470,  48, 471, 472, 140, 140, 140, 140, 140,
+    48,  48,  48,  48, 196, 140, 140, 140,   9,   9,   9, 473,  11,  11,  11, 474,
+    48,  48, 475, 192, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+   140, 140, 140, 140, 140, 140, 271, 476,  48,  48, 477, 478, 140, 140, 140, 140,
+    48, 464, 479,  48,  62, 480, 140,  48, 481, 140, 140,  48, 482, 140,  48, 314,
+   483,  48,  48, 484, 485, 457, 486, 487, 222,  48,  48, 488, 489,  48, 196, 192,
+   490,  48, 491, 492, 493,  48,  48, 494, 222,  48,  48, 495, 496, 497, 498, 499,
+    48,  97, 500, 501, 140, 140, 140, 140, 502, 503, 504,  48,  48, 505, 506, 192,
+   507,  83,  84, 508, 509, 510, 511, 512, 140, 140, 140, 140, 140, 140, 140, 140,
+    48,  48,  48, 513, 514, 515, 478, 140,  48,  48,  48, 516, 517, 192, 140, 140,
+   140, 140, 140, 140, 140, 140, 140, 140,  48,  48, 518, 519, 520, 521, 140, 140,
+    48,  48,  48, 522, 523, 192, 524, 140,  48,  48, 525, 526, 192, 140, 140, 140,
+    48, 173, 527, 528, 314, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+    48,  48, 500, 529, 140, 140, 140, 140, 140, 140,   9,   9,  11,  11, 148, 530,
+   531, 532,  48, 533, 534, 192, 140, 140, 140, 140, 535,  48,  48, 536, 537, 140,
+   538,  48,  48, 539, 540, 541,  48,  48, 542, 543, 544,  48,  48,  48,  48, 196,
+   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+    84,  48, 518, 545, 546, 148, 175, 547,  48, 548, 549, 550, 140, 140, 140, 140,
+   551,  48,  48, 552, 553, 192, 554,  48, 555, 556, 192, 140, 140, 140, 140, 140,
+   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,  48, 557,
+   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 100, 271, 558, 559, 560,
     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-    48,  48,  48,  48,  48,  48,  48,  48,  48, 207,  72,  72,  72,  72,  72,  72,
-   271, 271, 271, 271, 271, 271, 551, 552,  48,  48,  48,  48,  48,  48,  48,  48,
-    48,  48,  48,  48, 388,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-    72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-    72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-    48,  48, 200, 553,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-    72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-    48,  48,  48,  48, 315,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-    72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-    48,  48,  48, 196,  48, 200, 370,  72,  72,  72,  72,  72,  72,  48, 204, 554,
-    48,  48,  48, 555, 556, 557, 558, 559,  48,  72,  72,  72,  72,  72,  72,  72,
-    72,  72,  72,  72,   9,   9,  11,  11, 270, 560,  72,  72,  72,  72,  72,  72,
-    48,  48,  48,  48, 561, 562, 563, 563, 564, 565,  72,  72,  72,  72, 566, 567,
+    48,  48,  48,  48,  48,  48,  48,  48,  48, 207, 140, 140, 140, 140, 140, 140,
+   272, 272, 272, 272, 272, 272, 561, 562,  48,  48,  48,  48,  48,  48,  48,  48,
+    48,  48,  48,  48, 388, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+   140, 140, 140, 140, 140, 140, 140, 140, 140,  48,  48,  48,  48,  48,  48, 563,
+    48,  48, 200, 564, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+    48,  48,  48,  48, 314, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+    48,  48,  48, 196,  48, 200, 370,  48,  48,  48,  48, 200, 192,  48, 204, 565,
+    48,  48,  48, 566, 567, 568, 569, 570,  48, 140, 140, 140, 140, 140, 140, 140,
+   140, 140, 140, 140,   9,   9,  11,  11, 271, 571, 140, 140, 140, 140, 140, 140,
+    48,  48,  48,  48, 572, 573, 574, 574, 575, 576, 140, 140, 140, 140, 577, 578,
     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-    48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  74,
-    48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 199,  72,  72,
-   196,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
+    48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 440,
+    48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 199, 140, 140,
+   196, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 579,
     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-    48, 200,  72,  72,  72, 568, 569,  48,  48,  48,  48,  48,  48,  48,  48,  48,
+    48,  48, 580, 140, 140, 580, 581,  48,  48,  48,  48,  48,  48,  48,  48,  48,
     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 206,
-    72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-    48,  48,  48,  48,  48,  48,  71, 151, 196, 570, 571,  72,  72,  72,  72,  72,
-    72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-   209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 325,
-   209, 209, 572, 209, 209, 209, 573, 574, 575, 209, 576, 209, 209, 209, 577,  72,
-   209, 209, 209, 209, 578,  72,  72,  72,  72,  72,  72,  72,  72,  72, 270, 579,
-   209, 209, 209, 209, 209, 286, 270, 452,  72,  72,  72,  72,  72,  72,  72,  72,
-     9, 580,  11, 581, 582, 583, 242,   9, 584, 585, 586, 587, 588,   9, 580,  11,
-   589, 590,  11, 591, 592, 593, 594,   9, 595,  11,   9, 580,  11, 581, 582,  11,
-   242,   9, 584, 594,   9, 595,  11,   9, 580,  11, 596,   9, 597, 598, 599, 600,
-    11, 601,   9, 602, 603, 604, 605,  11, 606,   9, 607,  11, 608, 609, 609, 609,
+   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+    48,  48,  48,  48,  48,  48,  71, 151, 196, 582, 583, 140, 140, 140, 140, 140,
+   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+    32,  32, 584,  32, 585, 209, 209, 209, 209, 209, 209, 209, 323, 140, 140, 140,
+   209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 324,
+   209, 209, 586, 209, 209, 209, 587, 588, 589, 209, 590, 209, 209, 209, 288, 140,
+   209, 209, 209, 209, 591, 140, 140, 140, 140, 140, 140, 140, 140, 140, 271, 592,
+   209, 209, 209, 209, 209, 287, 271, 461, 140, 140, 140, 140, 140, 140, 140, 140,
+     9, 593,  11, 594, 595, 596, 241,   9, 597, 598, 599, 600, 601,   9, 593,  11,
+   602, 603,  11, 604, 605, 606, 607,   9, 608,  11,   9, 593,  11, 594, 595,  11,
+   241,   9, 597, 607,   9, 608,  11,   9, 593,  11, 609,   9, 610, 611, 612, 613,
+    11, 614,   9, 615, 616, 617, 618,  11, 619,   9, 620,  11, 621, 622, 622, 622,
+   209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209,
    209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209,
+    32,  32,  32, 623,  32,  32, 624, 625, 626, 627,  45, 140, 140, 140, 140, 140,
+   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+   628, 629, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+   630, 631, 632, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+    48,  48, 151, 633, 634, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+   140, 140, 140, 140, 140, 140, 140, 140, 140,  48, 635, 140,  48,  48, 636, 637,
+   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 638, 200,
+    48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 639, 585, 140, 140,
+     9,   9, 597,  11, 640, 370, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+   140, 140, 140, 140, 140, 140, 140, 498, 271, 271, 641, 642, 140, 140, 140, 140,
+   498, 271, 643, 644, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+   645,  48, 646, 647, 648, 649, 650, 651, 652, 206, 653, 206, 140, 140, 140, 654,
+   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+   209, 209, 325, 209, 209, 209, 209, 209, 209, 323, 334, 655, 655, 655, 209, 324,
+   656, 209, 209, 209, 209, 209, 209, 209, 209, 209, 657, 140, 140, 140, 658, 209,
+   659, 209, 209, 325, 660, 661, 324, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+   209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 662,
+   209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 663, 426, 426,
+   209, 209, 209, 209, 209, 209, 209, 323, 209, 209, 209, 209, 209, 660, 325, 427,
+   325, 209, 209, 209, 664, 176, 209, 209, 664, 209, 657, 661, 140, 140, 140, 140,
    209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209,
-    32,  32,  32, 610,  32,  32, 611, 612, 613, 614,  45,  72,  72,  72,  72,  72,
-    72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-   615, 616, 617,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-    48,  48, 151, 618, 619,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-    72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  48,  48, 620, 621,
-    72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-    48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 622, 623,  72,  72,
-     9,   9, 584,  11, 624, 370,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-    72,  72,  72,  72,  72,  72,  72, 488, 270, 270, 625, 626,  72,  72,  72,  72,
-   488, 270, 627, 628,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-   629,  48, 630, 631, 632, 633, 634, 635, 636, 206, 637, 206,  72,  72,  72, 638,
-    72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-   209, 209, 326, 209, 209, 209, 209, 209, 209, 324, 335, 639, 639, 639, 209, 325,
-   640, 209, 209, 209, 209, 209, 209, 209, 209, 209, 641,  72,  72,  72, 642, 209,
-   643, 209, 209, 326, 577, 644, 325,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-   209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 645,
-   209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 646, 424, 424,
-   209, 209, 209, 209, 209, 209, 209, 324, 209, 209, 209, 209, 209, 577, 326,  72,
-   326, 209, 209, 209, 646, 176, 209, 209, 646, 209, 641, 644,  72,  72,  72,  72,
-   209, 209, 209, 209, 209, 209, 209, 647, 209, 209, 209, 209, 648, 209, 209, 209,
-   209, 209, 209, 209, 209, 324, 641, 649, 286, 209, 577, 286, 643, 286,  72,  72,
-   209, 209, 209, 209, 209, 209, 209, 209, 209, 650, 209, 209, 287,  72,  72, 192,
-    48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 204,  72,  72,
+   209, 209, 209, 209, 209, 323, 657, 665, 287, 209, 426, 288, 324, 176, 664, 287,
+   209, 209, 209, 209, 209, 209, 209, 209, 209, 666, 209, 209, 288, 140, 140, 192,
+    48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 140, 140,
     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-    48,  48,  48, 205,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
+    48,  48,  48, 196,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
     48, 204,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-    48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 469,  48,  48,  48,  48,  48,
+    48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 478,  48,  48,  48,  48,  48,
     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-    48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 101,  72,
-    48, 204,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-    72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
+    48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 100, 140,
+    48, 204, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-    48,  48,  48,  48,  71,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-   651,  72, 652, 652, 652, 652, 652, 652,  72,  72,  72,  72,  72,  72,  72,  72,
-    32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  72,
+    48,  48,  48,  48,  71, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+   667, 140, 668, 668, 668, 668, 668, 668, 140, 140, 140, 140, 140, 140, 140, 140,
+    32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32, 140,
    391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391,
-   391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 653,
+   391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 669,
    391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391,
-   391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 654,
+   391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 670,
      0,   0,   0,   0,   1,   2,   1,   2,   0,   0,   3,   3,   4,   5,   4,   5,
      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   6,   0,   0,   7,   0,
@@ -3299,191 +3349,199 @@ _hb_ucd_u16[11328] =
     14,  14,  14,  16,  17,  18,  17,  17,  19,  20,  21,  21,  22,  21,  23,  24,
     25,  26,  27,  27,  28,  29,  27,  30,  27,  27,  27,  27,  27,  31,  27,  27,
     32,  33,  33,  33,  34,  27,  27,  27,  35,  35,  35,  36,  37,  37,  37,  38,
-    39,  39,  40,  41,  42,  43,  44,  45,  45,  45,  27,  46,  47,  48,  49,  27,
-    50,  50,  50,  50,  50,  51,  52,  50,  53,  54,  55,  56,  57,  58,  59,  60,
-    61,  62,  63,  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,
-    77,  78,  79,  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,
-    93,  94,  95,  96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108,
-   109, 110, 111, 111, 112, 113, 114, 111, 115, 116, 117, 118, 119, 120, 121, 122,
-   123, 124, 124, 125, 124, 126,  45,  45, 127, 128, 129, 130, 131, 132,  45,  45,
-   133, 133, 133, 133, 134, 133, 135, 136, 133, 134, 133, 137, 137, 138,  45,  45,
-   139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 140, 140, 141, 140, 140, 142,
-   143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143,
-   144, 144, 144, 144, 145, 146, 144, 144, 145, 144, 144, 147, 148, 149, 144, 144,
-   144, 148, 144, 144, 144, 150, 144, 151, 144, 152, 153, 153, 153, 153, 153, 154,
-   155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
-   155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
-   155, 155, 155, 155, 155, 155, 155, 155, 156, 157, 158, 158, 158, 158, 159, 160,
-   161, 162, 163, 164, 165, 166, 167, 168, 169, 169, 169, 169, 169, 170, 171, 171,
-   172, 173, 174, 174, 174, 174, 174, 175, 174, 174, 176, 155, 155, 155, 155, 177,
-   178, 179, 180, 180, 181, 182, 183, 184, 185, 185, 186, 185, 187, 188, 169, 169,
-   189, 190, 191, 191, 191, 192, 191, 193, 194, 194, 195,   8, 196,  45,  45,  45,
-   197, 197, 197, 197, 198, 197, 197, 199, 200, 200, 200, 200, 201, 201, 201, 202,
-   203, 203, 203, 204, 205, 206, 206, 206, 207, 140, 140, 208, 209, 210, 211, 212,
-     4,   4, 213,   4,   4, 214, 215, 216,   4,   4,   4, 217,   8,   8,   8, 218,
+    39,  39,  40,  41,  42,  43,  44,  27,  45,  46,  27,  27,  27,  27,  47,  27,
+    48,  48,  48,  48,  48,  49,  50,  48,  51,  52,  53,  54,  55,  56,  57,  58,
+    59,  60,  61,  62,  63,  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,
+    75,  76,  77,  78,  79,  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,
+    91,  92,  93,  94,  95,  96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106,
+   107, 108, 109, 109, 110, 111, 112, 109, 113, 114, 115, 116, 117, 118, 119, 120,
+   121, 122, 122, 123, 122, 124, 125, 125, 126, 127, 128, 129, 130, 131, 125, 125,
+   132, 132, 132, 132, 133, 132, 134, 135, 132, 133, 132, 136, 136, 137, 125, 125,
+   138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 139, 139, 140, 139, 139, 141,
+   142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142,
+   143, 143, 143, 143, 144, 145, 143, 143, 144, 143, 143, 146, 147, 148, 143, 143,
+   143, 147, 143, 143, 143, 149, 143, 150, 143, 151, 152, 152, 152, 152, 152, 153,
+   154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
+   154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
+   154, 154, 154, 154, 154, 154, 154, 154, 155, 156, 157, 157, 157, 157, 158, 159,
+   160, 161, 162, 163, 164, 165, 166, 167, 168, 168, 168, 168, 168, 169, 170, 170,
+   171, 172, 173, 173, 173, 173, 173, 174, 173, 173, 175, 154, 154, 154, 154, 176,
+   177, 178, 179, 179, 180, 181, 182, 183, 184, 184, 185, 184, 186, 187, 168, 168,
+   188, 189, 190, 190, 190, 191, 190, 192, 193, 193, 194,   8, 195, 125, 125, 125,
+   196, 196, 196, 196, 197, 196, 196, 198, 199, 199, 199, 199, 200, 200, 200, 201,
+   202, 202, 202, 203, 204, 205, 205, 205, 206, 139, 139, 207, 208, 209, 210, 211,
+     4,   4, 212,   4,   4, 213, 214, 215,   4,   4,   4, 216,   8,   8,   8,   8,
      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
-    11, 219,  11,  11, 219, 220,  11, 221,  11,  11,  11, 222, 222, 223,  11, 224,
-   225,   0,   0,   0,   0,   0, 226, 227, 228, 229,   0,   0,  45,   8,   8, 196,
+    11, 217,  11,  11, 217, 218,  11, 219,  11,  11,  11, 220, 220, 221,  11, 222,
+   223,   0,   0,   0,   0,   0, 224, 225, 226, 227,   0,   0, 228,   8,   8, 229,
      0,   0, 230, 231, 232,   0,   4,   4, 233,   0,   0,   0,   0,   0,   0,   0,
      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0, 234,  45, 235,  45,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0, 234, 125, 235, 125,   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,
    236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236,
      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
      0,   0,   0,   0,   0,   0,   0, 237,   0, 238,   0,   0,   0,   0,   0,   0,
-   239, 239, 240, 239, 239, 240,   4,   4, 241, 241, 241, 241, 241, 241, 241, 242,
-   140, 140, 141, 243, 243, 243, 244, 245, 144, 246, 247, 247, 247, 247,  14,  14,
-     0,   0,   0,   0,   0, 248,  45,  45, 249, 250, 249, 249, 249, 249, 249, 251,
-   249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 252,  45, 253,
-   254,   0, 255, 256, 257, 258, 258, 258, 258, 259, 260, 261, 261, 261, 261, 262,
-   263, 264, 264, 265, 143, 143, 143, 143, 266,   0, 264, 264,   0,   0, 267, 261,
-   143, 266,   0,   0,   0,   0, 143, 268,   0,   0,   0,   0,   0, 261, 261, 269,
-   261, 261, 261, 261, 261, 270,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-   249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249,
-   249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249,
-   249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249,
-   249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249,   0,   0,   0,   0,
-   249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249,
-   249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 271,
-   272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272,
-   272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272,
-   272, 272, 272, 272, 272, 272, 272, 272, 273, 272, 272, 272, 274, 275, 275, 275,
-   276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
-   276, 276, 277,  45,  14,  14,  14,  14,  14,  14, 278, 278, 278, 278, 278, 279,
-     0,   0, 280,   4,   4,   4,   4,   4, 281,   4,   4,   4, 282,  45,  45, 283,
-   284, 284, 285, 286, 287, 287, 287, 288, 289, 289, 289, 289, 290, 291,  50,  50,
-   292, 292, 293, 294, 294, 295, 143, 296, 297, 297, 297, 297, 298, 299, 139, 300,
-   301, 301, 301, 302, 303, 304, 139, 139, 305, 305, 305, 305, 306, 307, 308, 309,
-   310, 311, 247,   4,   4, 312, 313, 153, 153, 153, 153, 153, 308, 308, 314, 315,
-   143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143,
-   143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143,
-   143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143,
-   143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 316, 143, 317, 143, 143, 318,
-    45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,
-    45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,
-    45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,
-   249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249,
-   249, 249, 249, 249, 249, 249, 319, 249, 249, 249, 249, 249, 249, 320,  45,  45,
-   321, 322,  21, 323, 324,  27,  27,  27,  27,  27,  27,  27, 325,  48,  27,  27,
+   239, 239, 239, 239, 239, 239,   4,   4, 240, 240, 240, 240, 240, 240, 240, 241,
+   139, 139, 140, 242, 242, 242, 243, 244, 143, 245, 246, 246, 246, 246,  14,  14,
+     0,   0,   0,   0,   0, 247, 125, 125, 248, 249, 248, 248, 248, 248, 248, 250,
+   248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 251, 125, 252,
+   253,   0, 254, 255, 256, 257, 257, 257, 257, 258, 259, 260, 260, 260, 260, 261,
+   262, 263, 263, 264, 142, 142, 142, 142, 265,   0, 263, 263,   0,   0, 266, 260,
+   142, 265,   0,   0,   0,   0, 142, 267,   0,   0,   0,   0,   0, 260, 260, 268,
+   260, 260, 260, 260, 260, 269,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+   248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248,
+   248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248,
+   248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248,
+   248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248,   0,   0,   0,   0,
+   270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
+   270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
+   270, 270, 270, 270, 270, 270, 270, 270, 271, 270, 270, 270, 272, 273, 273, 273,
+   274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274,
+   274, 274, 275, 125,  14,  14,  14,  14,  14,  14, 276, 276, 276, 276, 276, 277,
+     0,   0, 278,   4,   4,   4,   4,   4, 279,   4,   4,   4, 280, 281, 125, 282,
+   283, 283, 284, 285, 286, 286, 286, 287, 288, 288, 288, 288, 289, 290,  48,  48,
+   291, 291, 292, 293, 293, 294, 142, 295, 296, 296, 296, 296, 297, 298, 138, 299,
+   300, 300, 300, 301, 302, 303, 138, 138, 304, 304, 304, 304, 305, 306, 307, 308,
+   309, 310, 246,   4,   4, 311, 312, 152, 152, 152, 152, 152, 307, 307, 313, 314,
+   142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142,
+   142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142,
+   142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142,
+   142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 315, 142, 316, 142, 142, 317,
+   125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+   125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+   125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+   248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248,
+   248, 248, 248, 248, 248, 248, 318, 248, 248, 248, 248, 248, 248, 319, 125, 125,
+   320, 321,  21, 322, 323,  27,  27,  27,  27,  27,  27,  27, 324, 325,  27,  27,
     27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,
-    27,  27,  27, 326,  45,  27,  27,  27,  27, 327,  27,  27,  47,  45,  45, 328,
-     8, 286, 329,   0,   0, 330, 331,  46,  27,  27,  27,  27,  27,  27,  27, 332,
-   333,   0,   1,   2,   1,   2, 334, 260, 261, 335, 143, 266, 336, 337, 338, 339,
-   340, 341, 342, 343, 344, 344,  45,  45, 341, 341, 341, 341, 341, 341, 341, 345,
-   346,   0,   0, 347,  11,  11,  11,  11, 348, 349, 350,  45,  45,   0,   0, 351,
-    45,  45,  45,  45,  45,  45,  45,  45, 352, 353, 354, 354, 354, 355, 356, 253,
-   357, 357, 358, 359, 360, 361, 361, 362, 363, 364, 365, 365, 366, 367,  45,  45,
-   368, 368, 368, 368, 368, 369, 369, 369, 370, 371, 372, 373, 373, 374, 373, 375,
-   376, 376, 377, 378, 378, 378, 379,  45,  45,  45,  45,  45,  45,  45,  45,  45,
-   380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380,
-   380, 380, 380, 381, 380, 382, 383,  45,  45,  45,  45,  45,  45,  45,  45,  45,
-   384, 385, 385, 386, 387, 388, 389, 389, 390, 391, 392,  45,  45,  45, 393, 394,
-   395, 396, 397, 398,  45,  45,  45,  45, 399, 399, 400, 401, 400, 402, 400, 400,
-   403, 404, 405, 406, 407, 407, 408, 408, 409, 409,  45,  45, 410, 410, 411, 412,
-   413, 413, 413, 414, 415, 416, 417, 418, 419, 420, 421,  45,  45,  45,  45,  45,
-   422, 422, 422, 422, 423,  45,  45,  45, 424, 424, 424, 425, 424, 424, 424, 426,
-   427, 427, 428, 429,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,
-    45,  45,  45,  45,  45,  45,  27, 430, 431, 431, 432, 433,  45,  45,  45,  45,
-   434, 434, 435, 436, 436, 437,  45,  45,  45,  45,  45, 438, 439,  45, 440, 441,
-   442, 442, 442, 442, 443, 444, 442, 445, 446, 446, 446, 446, 447, 448, 449, 450,
-   451, 451, 451, 452, 453, 454, 454, 455, 456, 456, 456, 456, 456, 456, 457, 458,
-   459, 460, 459, 461,  45,  45,  45,  45, 462, 463, 464, 465, 465, 465, 466, 467,
-   468, 469, 470, 471, 472, 473, 474, 475,  45,  45,  45,  45,  45,  45,  45,  45,
-   476, 476, 476, 476, 476, 477, 478,  45, 479, 479, 479, 479, 480, 481,  45,  45,
-    45,  45,  45,  45,  45,  45,  45,  45, 482, 482, 482, 483, 482, 484,  45,  45,
-   485, 485, 485, 485, 486, 487, 488,  45, 489, 489, 489, 490, 491,  45,  45,  45,
-   492, 493, 494, 492,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,
-   495, 495, 495, 496,  45,  45,  45,  45,  45,  45, 497, 497, 497, 497, 497, 498,
-   499, 500, 501, 502, 503, 504,  45,  45,  45,  45, 505, 506, 506, 505, 507,  45,
-   508, 508, 508, 508, 509, 510, 510, 510, 510, 510, 511,  45, 512, 512, 512, 513,
-    45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,
-   514, 515, 515, 516, 517, 515, 518, 519, 519, 520, 521, 522,  45,  45,  45,  45,
-   523, 524, 524, 525, 526, 527, 528, 529, 530, 531, 532,  45,  45,  45,  45,  45,
-    45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45, 533, 534,
-    45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45, 535, 536, 536, 536, 537,
-   538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 538,
-   538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 538,
-   538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 538,
-   538, 538, 538, 538, 538, 538, 538, 538, 538, 539,  45,  45,  45,  45,  45,  45,
-   538, 538, 538, 538, 538, 538, 540, 541, 538, 538, 538, 538, 538, 538, 538, 538,
-   538, 538, 538, 538, 542,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,
-   543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543,
-   543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543,
-   543, 543, 544, 545,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,
-    45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,
+    27,  27,  27, 326,  27,  27,  27,  27,  27, 327,  27,  27, 328, 125, 125,  27,
+     8, 285, 329,   0,   0, 330, 331, 332,  27,  27,  27,  27,  27,  27,  27, 333,
+   334,   0,   1,   2,   1,   2, 335, 259, 260, 336, 142, 265, 337, 338, 339, 340,
+   341, 342, 343, 344, 345, 345, 125, 125, 342, 342, 342, 342, 342, 342, 342, 346,
+   347,   0,   0, 348,  11,  11,  11,  11, 349, 350, 351, 125, 125,   0,   0, 352,
+   125, 125, 125, 125, 125, 125, 125, 125, 353, 354, 355, 355, 355, 356, 357, 252,
+   358, 358, 359, 360, 361, 362, 362, 363, 364, 365, 366, 366, 367, 368, 125, 125,
+   369, 369, 369, 369, 369, 370, 370, 370, 371, 372, 373, 374, 374, 375, 374, 376,
+   377, 377, 378, 379, 379, 379, 380, 381, 381, 382, 383, 384, 125, 125, 125, 125,
+   385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385,
+   385, 385, 385, 386, 385, 387, 388, 125, 389,   4,   4, 390, 125, 125, 125, 125,
+   391, 392, 392, 393, 394, 395, 396, 396, 397, 398, 399, 125, 125, 125, 400, 401,
+   402, 403, 404, 405, 125, 125, 125, 125, 406, 406, 407, 408, 407, 409, 407, 407,
+   410, 411, 412, 413, 414, 414, 415, 415, 416, 416, 125, 125, 417, 417, 418, 419,
+   420, 420, 420, 421, 422, 423, 424, 425, 426, 427, 428, 125, 125, 125, 125, 125,
+   429, 429, 429, 429, 430, 125, 125, 125, 431, 431, 431, 432, 431, 431, 431, 433,
+   434, 434, 435, 436, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+   125, 125, 125, 125, 125, 125,  27,  45, 437, 437, 438, 439, 125, 125, 125, 125,
+   440, 440, 441, 442, 442, 443, 125, 444, 445, 125, 125, 446, 447, 125, 448, 449,
+   450, 450, 450, 450, 451, 452, 450, 453, 454, 454, 454, 454, 455, 456, 457, 458,
+   459, 459, 459, 460, 461, 462, 462, 463, 464, 464, 464, 464, 464, 464, 465, 466,
+   467, 468, 467, 469, 125, 125, 125, 125, 470, 471, 472, 473, 473, 473, 474, 475,
+   476, 477, 478, 479, 480, 481, 482, 483, 125, 125, 125, 125, 125, 125, 125, 125,
+   484, 484, 484, 484, 484, 485, 486, 125, 487, 487, 487, 487, 488, 489, 125, 125,
+   125, 125, 125, 125, 125, 125, 125, 125, 490, 490, 490, 491, 490, 492, 125, 125,
+   493, 493, 493, 493, 494, 495, 496, 125, 497, 497, 497, 498, 498, 125, 125, 125,
+   499, 500, 501, 499, 502, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+   503, 503, 503, 504, 125, 125, 125, 125, 125, 125, 505, 505, 505, 505, 505, 506,
+   507, 508, 509, 510, 511, 512, 125, 125, 125, 125, 513, 514, 514, 513, 515, 125,
+   516, 516, 516, 516, 517, 518, 518, 518, 518, 518, 519, 154, 520, 520, 520, 521,
+   125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+   522, 523, 523, 524, 525, 523, 526, 527, 527, 528, 529, 530, 125, 125, 125, 125,
+   531, 532, 532, 533, 534, 535, 536, 537, 538, 539, 540, 125, 125, 125, 125, 125,
+   125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 541, 542,
+   125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 543, 544, 544, 544, 545,
+   546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546,
    546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546,
    546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546,
-   546, 546, 546, 546, 547,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,
-    45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,
-   278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278,
-   278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278,
-   278, 278, 278, 548, 549, 550, 551,  45,  45,  45,  45,  45,  45, 552, 553, 554,
-   555, 555, 555, 555, 556, 557, 558, 559, 555,  45,  45,  45,  45,  45,  45,  45,
-    45,  45,  45,  45, 560, 560, 560, 560, 560, 561,  45,  45,  45,  45,  45,  45,
-   562, 562, 562, 562, 563, 562, 562, 562, 564, 562,  45,  45,  45,  45, 565, 566,
-   567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567,
-   567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567,
-   567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567,
-   567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 568,
-   567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567,
-   569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569,
-   569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 570,  45,  45,
-   571,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,
-   572, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258,
-   258, 573,  45,  45,  45, 574, 575, 576, 576, 576, 576, 576, 576, 576, 576, 576,
-   576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 577,
-    45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,
-   578, 578, 578, 578, 578, 578, 579, 580, 581, 582, 267,  45,  45,  45,  45,  45,
-    45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 583,
-     0,   0, 584,   0,   0,   0, 585, 586, 587,   0, 588,   0,   0,   0, 589,  45,
-    11,  11,  11,  11, 590,  45,  45,  45,  45,  45,  45,  45,  45,  45,   0, 267,
-     0,   0,   0,   0,   0, 234,   0, 589,  45,  45,  45,  45,  45,  45,  45,  45,
-     0,   0,   0,   0,   0, 226,   0,   0,   0, 591, 592, 593, 594,   0,   0,   0,
-   595, 596,   0, 597, 598, 599,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 600,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 601,   0,   0,   0,
-   602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602,
-   602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602,
-   602, 602, 602, 602, 602, 602, 602, 602, 603, 604, 605,  45,  45,  45,  45,  45,
-    45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,
-   606, 607, 608,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,
-   609, 609, 610, 611, 612,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,
-    45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45, 613, 613, 613, 614,
-    45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,
-   615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 616, 617,  45,  45,
-   618, 618, 618, 618, 619, 620,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,
-    45,  45,  45,  45,  45,  45,  45, 333,   0,   0,   0, 621,  45,  45,  45,  45,
-   333,   0,   0, 622,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,
-   623,  27, 624, 625, 626, 627, 628, 629, 630, 631, 632, 631,  45,  45,  45, 325,
-    45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,
-     0,   0, 253,   0,   0,   0,   0,   0,   0, 267, 228, 333, 333, 333,   0, 583,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 622,  45,  45,  45, 633,   0,
-   634,   0,   0, 253, 589, 635, 583,  45,  45,  45,  45,  45,  45,  45,  45,  45,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 636, 349, 349,
-     0,   0,   0,   0,   0,   0,   0, 267,   0,   0,   0,   0,   0, 589, 253,  45,
-   253,   0,   0,   0, 636, 286,   0,   0, 636,   0, 622, 635,  45,  45,  45,  45,
-     0,   0,   0,   0,   0,   0,   0, 637,   0,   0,   0,   0, 638,   0,   0,   0,
-     0,   0,   0,   0,   0, 267, 622, 639, 234,   0, 589, 234, 248, 234,  45,  45,
-     0,   0,   0,   0,   0,   0,   0,   0,   0, 330,   0,   0, 235,  45,  45, 286,
-   249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 319,  45,  45,
-   249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249,
-   249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249,
-   249, 249, 249, 640, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249,
-   249, 319, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249,
-   249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249,
-   249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 566, 249, 249, 249, 249, 249,
-   249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249,
-   249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249,
-   249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 641,  45,
-   249, 319,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,
-    45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,
-   249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249,
-   249, 249, 249, 249, 642,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,
-   643,  45,   0,   0,   0,   0,   0,   0,  45,  45,  45,  45,  45,  45,  45,  45,
+   546, 546, 546, 546, 546, 546, 546, 546, 546, 547, 125, 125, 125, 125, 125, 125,
+   546, 546, 546, 546, 546, 546, 548, 549, 546, 546, 546, 546, 546, 546, 546, 546,
+   546, 546, 546, 546, 550, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+   125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+   125, 125, 125, 125, 125, 125, 125, 125, 125, 551, 551, 551, 551, 551, 551, 552,
+   553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553,
+   553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553,
+   553, 553, 554, 555, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+   125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+   556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556,
+   556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556,
+   556, 556, 556, 556, 557, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+   125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+   276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+   276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+   276, 276, 276, 558, 559, 560, 561, 562, 562, 562, 562, 563, 564, 565, 566, 567,
+   568, 568, 568, 568, 569, 570, 571, 572, 568, 125, 125, 125, 125, 125, 125, 125,
+   125, 125, 125, 125, 573, 573, 573, 573, 573, 574, 125, 125, 125, 125, 125, 125,
+   575, 575, 575, 575, 576, 575, 575, 575, 577, 575, 125, 125, 125, 125, 578, 579,
+   580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580,
+   580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580,
+   580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580,
+   580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 581,
+   580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580,
+   582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582,
+   582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 583, 125, 125,
+   584, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+   125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+   125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 585,
+   586, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257,
+   257, 257, 587, 125, 125, 588, 589, 590, 590, 590, 590, 590, 590, 590, 590, 590,
+   590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 591,
+   125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+   592, 592, 592, 592, 592, 592, 593, 594, 595, 596, 266, 125, 125, 125, 125, 125,
+   125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+   125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+     8,   8, 597,   8, 598,   0,   0,   0,   0,   0,   0,   0, 266, 125, 125, 125,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 599,
+     0,   0, 600,   0,   0,   0, 601, 602, 603,   0, 604,   0,   0,   0, 235, 125,
+    11,  11,  11,  11, 605, 125, 125, 125, 125, 125, 125, 125, 125, 125,   0, 266,
+     0,   0,   0,   0,   0, 234,   0, 606, 125, 125, 125, 125, 125, 125, 125, 125,
+     0,   0,   0,   0,   0, 224,   0,   0,   0, 607, 608, 609, 610,   0,   0,   0,
+   611, 612,   0, 613, 614, 615,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 616,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 617,   0,   0,   0,
+   618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618,
+   618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618,
+   618, 618, 618, 618, 618, 618, 618, 618, 619, 620, 621, 125, 125, 125, 125, 125,
+   125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+   125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+     4, 622, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+   623, 624, 625, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+   626, 626, 627, 628, 629, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+   125, 125, 125, 125, 125, 125, 125, 125, 125, 630, 631, 125, 632, 632, 632, 633,
+   125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+   125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+   125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 634, 635,
+   636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 637, 638, 125, 125,
+   639, 639, 639, 639, 640, 641, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+   125, 125, 125, 125, 125, 125, 125, 334,   0,   0,   0, 642, 125, 125, 125, 125,
+   334,   0,   0, 247, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+   643,  27, 644, 645, 646, 647, 648, 649, 650, 651, 652, 651, 125, 125, 125, 653,
+   125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+     0,   0, 252,   0,   0,   0,   0,   0,   0, 266, 226, 334, 334, 334,   0, 599,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 247, 125, 125, 125, 654,   0,
+   655,   0,   0, 252, 606, 656, 599, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 657, 350, 350,
+     0,   0,   0,   0,   0,   0,   0, 266,   0,   0,   0,   0,   0, 606, 252, 228,
+   252,   0,   0,   0, 658, 285,   0,   0, 658,   0, 247, 656, 125, 125, 125, 125,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0, 266, 247, 659, 234,   0, 350, 235, 599, 285, 658, 234,
+     0,   0,   0,   0,   0,   0,   0,   0,   0, 330,   0,   0, 235, 125, 125, 285,
+   248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 125, 125,
+   248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248,
+   248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248,
+   248, 248, 248, 660, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248,
+   248, 318, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248,
+   248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248,
+   248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 579, 248, 248, 248, 248, 248,
+   248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248,
+   248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248,
+   248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 661, 125,
+   248, 318, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+   125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+   248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248,
+   248, 248, 248, 248, 662, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+   663, 125,   0,   0,   0,   0,   0,   0, 125, 125, 125, 125, 125, 125, 125, 125,
      8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   0,
      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
@@ -3836,7 +3894,7 @@ _hb_ucd_gc (unsigned u)
 static inline uint_fast8_t
 _hb_ucd_ccc (unsigned u)
 {
-  return u<125259u?_hb_ucd_u8[15060+(((_hb_ucd_u8[13636+(((_hb_ucd_u8[12656+(u>>3>>4)])<<4)+((u>>3)&15u))])<<3)+((u)&7u))]:0;
+  return u<125259u?_hb_ucd_u8[15332+(((_hb_ucd_u8[13892+(((_hb_ucd_u8[12912+(u>>3>>4)])<<4)+((u>>3)&15u))])<<3)+((u)&7u))]:0;
 }
 static inline unsigned
 _hb_ucd_b4 (const uint8_t* a, unsigned i)
@@ -3846,59 +3904,59 @@ _hb_ucd_b4 (const uint8_t* a, unsigned i)
 static inline int_fast16_t
 _hb_ucd_bmg (unsigned u)
 {
-  return u<65380u?_hb_ucd_i16[((_hb_ucd_u8[16372+(((_hb_ucd_b4(16244+_hb_ucd_u8,u>>2>>6))<<6)+((u>>2)&63u))])<<2)+((u)&3u)]:0;
+  return u<65380u?_hb_ucd_i16[((_hb_ucd_u8[16692+(((_hb_ucd_b4(16564+_hb_ucd_u8,u>>2>>6))<<6)+((u>>2)&63u))])<<2)+((u)&3u)]:0;
 }
 static inline uint_fast8_t
 _hb_ucd_sc (unsigned u)
 {
-  return u<918000u?_hb_ucd_u8[19126+(((_hb_ucd_u16[3040+(((_hb_ucd_u8[17332+(u>>4>>5)])<<5)+((u>>4)&31u))])<<4)+((u)&15u))]:2;
+  return u<918000u?_hb_ucd_u8[19446+(((_hb_ucd_u16[3168+(((_hb_ucd_u8[17652+(u>>4>>5)])<<5)+((u>>4)&31u))])<<4)+((u)&15u))]:2;
 }
 static inline uint_fast16_t
 _hb_ucd_dm (unsigned u)
 {
-  return u<195102u?_hb_ucd_u16[6144+(((_hb_ucd_u8[29430+(u>>6)])<<6)+((u)&63u))]:0;
+  return u<195102u?_hb_ucd_u16[6400+(((_hb_ucd_u8[30070+(u>>6)])<<6)+((u)&63u))]:0;
 }
 
 
 #elif !defined(HB_NO_UCD_UNASSIGNED)
 
 static const uint8_t
-_hb_ucd_u8[17508] =
+_hb_ucd_u8[17936] =
 {
     0,  1,  2,  3,  4,  5,  6,  7,  7,  8,  7,  7,  7,  7,  7,  7,
-    7,  7,  7,  9, 10, 11,  7,  7,  7,  7, 12, 13, 14, 14, 14, 15,
-   16, 17, 18, 19, 20, 21, 22, 21, 23, 21, 21, 21, 21, 24,  7,  7,
-   25, 26, 21, 21, 21, 21, 27, 28, 21, 21, 29, 30, 31, 32, 33, 34,
+    7,  7,  7,  7,  9, 10,  7,  7,  7,  7, 11, 12, 13, 13, 13, 14,
+   15, 16, 17, 18, 19, 20, 21, 22, 23, 22, 22, 22, 22, 24,  7,  7,
+   25, 26, 22, 22, 22, 27, 28, 29, 22, 30, 31, 32, 33, 34, 35, 36,
     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-    7,  7,  7,  7, 35,  7, 36, 37,  7, 38,  7,  7,  7, 39, 21, 40,
-    7,  7, 41, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
-   21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
-   21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
-   21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
-   21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
-   21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
-   21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
-   21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
-   21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
-   21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
-   21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
-   21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
-   21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
-   21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
-   21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
-   21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
-   21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
-   21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
-   21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
-   21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
-   21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
-   21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
-   42, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
-   21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
-   14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-   14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 43,
-   14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-   14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 44,
+    7,  7,  7,  7, 37,  7, 38, 39,  7, 40,  7,  7,  7, 41, 22, 42,
+    7,  7, 43, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+   44, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 45,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 46,
     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
    16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
    32, 33, 34, 34, 35, 36, 37, 38, 39, 34, 34, 34, 40, 41, 42, 43,
@@ -3908,42 +3966,44 @@ _hb_ucd_u8[17508] =
    84, 85, 86, 87, 88, 89, 69, 69, 34, 34, 34, 34, 34, 34, 34, 34,
    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 90, 34, 34, 34, 34,
-   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 91,
-   92, 34, 34, 34, 34, 34, 34, 34, 34, 93, 34, 34, 94, 95, 96, 97,
-   98, 99,100,101,102,103,104,105, 34, 34, 34, 34, 34, 34, 34, 34,
-   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,106,
+   91, 34, 34, 34, 34, 34, 34, 34, 34, 92, 34, 34, 93, 94, 95, 96,
+   97, 98, 99,100,101,102,103,104, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,105,
+  106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,
   107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,
-  108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
-  108,108, 34, 34,109,110,111,112, 34, 34,113,114,115,116,117,118,
-  119,120,121,122,123,124,125,126,127,128,129,123, 34, 34,130,123,
-  131,132,133,134,135,136,137,138,139,140,141,123,142,143,144,145,
-  146,147,148,149,150,151,152,123,153,154,123,155,156,157,158,123,
-  159,160,161,162,163,164,123,123,165,166,167,168,123,169,123,170,
-   34, 34, 34, 34, 34, 34, 34,171,172, 34,173,123,123,123,123,123,
-  123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,
-   34, 34, 34, 34, 34, 34, 34, 34,174,123,123,123,123,123,123,123,
-  123,123,123,123,123,123,123,123, 34, 34, 34, 34,175,123,123,123,
-   34, 34, 34, 34,176,177,178,179,123,123,123,123,180,181,182,183,
-   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,184,
-   34, 34, 34, 34, 34, 34, 34, 34, 34,185,186,123,123,123,123,123,
-   34, 34,187, 34, 34,188,123,123,123,123,123,123,123,123,123,123,
-  123,123,123,123,123,123,123,123,189,190,123,123,123,123,123,123,
-   69,191,192,193,194,195,196,123,197,198,199,200,201,202,203,204,
-   69, 69, 69, 69,205,206,123,123,123,123,123,123,123,123,123,123,
-  207,123,208,123,123,209,123,123,123,123,123,123,123,123,123,123,
-   34,210,211,123,123,123,123,123,212,213,214,123,215,216,123,123,
-  217,218,219,220,221,123, 69,222, 69, 69, 69, 69, 69,223,224,225,
-  226,227,228,229,230,231, 69,232,123,123,123,123,123,123,123,123,
-   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,233, 34, 34,
-   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,234, 34,
-  235, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
-   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,236, 34, 34,
-   34, 34, 34, 34, 34, 34, 34,237,123,123,123,123,123,123,123,123,
-   34, 34, 34, 34,238,123,123,123,123,123,123,123,123,123,123,123,
-   34, 34, 34, 34, 34, 34,239,123,123,123,123,123,123,123,123,123,
-  240,123,241,242,123,123,123,123,123,123,123,123,123,123,123,123,
-  108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,243,
-  108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,244,
+  107,107, 34, 34,108,109,110,111, 34, 34,112,113,114,115,116,117,
+  118,119,120,121,122,123,124,125,126,127,128,129, 34, 34,130,131,
+  132,133,134,135,136,137,138,139,140,141,142,122,143,144,145,146,
+  147,148,149,150,151,152,153,122,154,155,122,156,157,158,159,122,
+  160,161,162,163,164,165,122,122,166,167,168,169,122,170,122,171,
+   34, 34, 34, 34, 34, 34, 34,172,173, 34,174,122,122,122,122,122,
+  122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,175,
+   34, 34, 34, 34, 34, 34, 34, 34,176,122,122,122,122,122,122,122,
+  122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,
+  122,122,122,122,122,122,122,122, 34, 34, 34, 34,177,122,122,122,
+   34, 34, 34, 34,178,179,180,181,122,122,122,122,182,183,184,185,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,186,
+   34, 34, 34, 34, 34, 34, 34, 34, 34,187,188,122,122,122,122,122,
+  122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,189,
+   34, 34,190, 34, 34,191,122,122,122,122,122,122,122,122,122,122,
+  122,122,122,122,122,122,122,122,192,193,122,122,122,122,122,122,
+  122,122,122,122,122,122,122,122,122,122,122,122,122,122,194,195,
+   69,196,197,198,199,200,201,122,202,203,204,205,206,207,208,209,
+   69, 69, 69, 69,210,211,122,122,122,122,122,122,122,122,212,122,
+  213,122,214,122,122,215,122,122,122,122,122,122,122,122,122,216,
+   34,217,218,122,122,122,122,122,219,220,221,122,222,223,122,122,
+  224,225,226,227,228,122, 69,229, 69, 69, 69, 69, 69,230,231,232,
+  233,234, 69, 69,235,236, 69,237,122,122,122,122,122,122,122,122,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,238, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,239, 34,
+  240, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,241, 34, 34,
+   34, 34, 34, 34, 34, 34, 34,242,122,122,122,122,122,122,122,122,
+   34, 34, 34, 34,243,122,122,122,122,122,122,122,122,122,122,122,
+   34, 34, 34, 34, 34, 34,244,122,122,122,122,122,122,122,122,122,
+  245,122,246,247,122,122,122,122,122,122,122,122,122,122,122,122,
+  107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,248,
+  107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,249,
     0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  3,  2,  4,  5,  6,  2,
     7,  7,  7,  7,  7,  2,  8,  9, 10, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16,
@@ -3980,298 +4040,306 @@ _hb_ucd_u8[17508] =
    43, 43, 40, 21,  2, 81, 57, 20, 36, 36, 36, 43, 43, 75, 43, 43,
    43, 43, 75, 43, 75, 43, 43, 44,  2,  2,  2,  2,  2,  2,  2, 64,
    36, 36, 36, 36, 70, 43, 44, 64, 36, 36, 36, 36, 36, 61, 44, 44,
-   44, 44, 44, 44, 44, 44, 44, 44, 36, 36, 61, 36, 36, 36, 36, 36,
-   36, 36, 36, 36, 44, 44, 44, 44, 44, 57, 43, 43, 43, 43, 43, 43,
-   43, 82, 43, 43, 43, 43, 43, 43, 43, 83, 36, 36, 36, 36, 36, 36,
-   36, 36, 36, 36, 36, 83, 71, 84, 85, 43, 43, 43, 83, 84, 85, 84,
-   70, 43, 43, 43, 36, 36, 36, 36, 36, 43,  2,  7,  7,  7,  7,  7,
-   86, 36, 36, 36, 36, 36, 36, 36, 70, 84, 62, 36, 36, 36, 61, 62,
-   61, 62, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 61, 36, 36, 36,
-   61, 61, 44, 36, 36, 44, 71, 84, 85, 43, 80, 87, 88, 87, 85, 61,
-   44, 44, 44, 87, 44, 44, 36, 62, 36, 43, 44,  7,  7,  7,  7,  7,
-   36, 20, 27, 27, 27, 56, 63, 80, 57, 83, 62, 36, 36, 61, 44, 62,
-   61, 36, 62, 61, 36, 44, 80, 84, 85, 80, 44, 57, 80, 57, 43, 44,
-   57, 44, 44, 44, 62, 36, 61, 61, 44, 44, 44,  7,  7,  7,  7,  7,
-   43, 36, 70, 64, 44, 44, 44, 44, 57, 83, 62, 36, 36, 36, 36, 62,
-   36, 62, 36, 36, 36, 36, 36, 36, 61, 36, 62, 36, 36, 44, 71, 84,
-   85, 43, 43, 57, 83, 87, 85, 44, 61, 44, 44, 44, 44, 44, 44, 44,
-   66, 44, 44, 44, 62, 43, 43, 43, 57, 84, 62, 36, 36, 36, 61, 62,
-   61, 36, 62, 36, 36, 44, 71, 85, 85, 43, 80, 87, 88, 87, 85, 44,
-   44, 44, 57, 83, 44, 44, 36, 62, 78, 27, 27, 27, 44, 44, 44, 44,
-   44, 71, 62, 36, 36, 61, 44, 36, 61, 36, 36, 44, 62, 61, 61, 36,
-   44, 62, 61, 44, 36, 61, 44, 36, 36, 36, 36, 36, 36, 44, 44, 84,
-   83, 88, 44, 84, 88, 84, 85, 44, 61, 44, 44, 87, 44, 44, 44, 44,
-   27, 89, 67, 67, 56, 90, 44, 44, 83, 84, 71, 36, 36, 36, 61, 36,
-   61, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 44, 62, 43,
-   83, 84, 88, 43, 80, 43, 43, 44, 44, 44, 57, 80, 36, 61, 44, 44,
-   44, 44, 44, 91, 27, 27, 27, 89, 70, 84, 72, 36, 36, 36, 61, 36,
-   36, 36, 62, 36, 36, 44, 71, 85, 84, 84, 88, 83, 88, 84, 43, 44,
-   44, 44, 87, 88, 44, 44, 44, 61, 62, 61, 44, 44, 44, 44, 44, 44,
-   43, 84, 36, 36, 36, 36, 61, 36, 36, 36, 36, 36, 36, 70, 71, 84,
-   85, 43, 80, 84, 88, 84, 85, 77, 44, 44, 36, 92, 27, 27, 27, 93,
-   27, 27, 27, 27, 89, 36, 36, 36, 57, 84, 62, 36, 36, 36, 36, 36,
-   36, 36, 36, 61, 44, 36, 36, 36, 36, 62, 36, 36, 36, 36, 62, 44,
-   36, 36, 36, 61, 44, 80, 44, 87, 84, 43, 80, 80, 84, 84, 84, 84,
-   44, 84, 64, 44, 44, 44, 44, 44, 62, 36, 36, 36, 36, 36, 36, 36,
-   70, 36, 43, 43, 43, 80, 44, 94, 36, 36, 36, 75, 43, 43, 43, 60,
-    7,  7,  7,  7,  7,  2, 44, 44, 62, 61, 61, 36, 36, 61, 36, 36,
+   36, 36, 36, 36, 82, 36, 36, 61, 65, 44, 44, 44, 43, 43, 43, 43,
+   36, 36, 36, 36, 83, 43, 43, 43, 43, 84, 43, 43, 43, 43, 43, 43,
+   43, 85, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 85, 71, 86,
+   87, 43, 43, 43, 85, 86, 87, 86, 70, 43, 43, 43, 36, 36, 36, 36,
+   36, 43,  2,  7,  7,  7,  7,  7, 88, 36, 36, 36, 36, 36, 36, 36,
+   70, 86, 62, 36, 36, 36, 61, 62, 61, 62, 36, 36, 36, 36, 36, 36,
+   36, 36, 36, 36, 61, 36, 36, 36, 61, 61, 44, 36, 36, 44, 71, 86,
+   87, 43, 80, 89, 90, 89, 87, 61, 44, 44, 44, 89, 44, 44, 36, 62,
+   36, 43, 44,  7,  7,  7,  7,  7, 36, 20, 27, 27, 27, 56, 63, 80,
+   57, 85, 62, 36, 36, 61, 44, 62, 61, 36, 62, 61, 36, 44, 80, 86,
+   87, 80, 44, 57, 80, 57, 43, 44, 57, 44, 44, 44, 62, 36, 61, 61,
+   44, 44, 44,  7,  7,  7,  7,  7, 43, 36, 70, 64, 44, 44, 44, 44,
+   57, 85, 62, 36, 36, 36, 36, 62, 36, 62, 36, 36, 36, 36, 36, 36,
+   61, 36, 62, 36, 36, 44, 71, 86, 87, 43, 43, 57, 85, 89, 87, 44,
+   61, 44, 44, 44, 44, 44, 44, 44, 66, 44, 44, 44, 62, 43, 43, 43,
+   57, 86, 62, 36, 36, 36, 61, 62, 61, 36, 62, 36, 36, 44, 71, 87,
+   87, 43, 80, 89, 90, 89, 87, 44, 44, 44, 57, 85, 44, 44, 36, 62,
+   78, 27, 27, 27, 44, 44, 44, 44, 44, 71, 62, 36, 36, 61, 44, 36,
+   61, 36, 36, 44, 62, 61, 61, 36, 44, 62, 61, 44, 36, 61, 44, 36,
+   36, 36, 36, 36, 36, 44, 44, 86, 85, 90, 44, 86, 90, 86, 87, 44,
+   61, 44, 44, 89, 44, 44, 44, 44, 27, 91, 67, 67, 56, 92, 44, 44,
+   85, 86, 71, 36, 36, 36, 61, 36, 61, 36, 36, 36, 36, 36, 36, 36,
+   36, 36, 36, 36, 36, 44, 71, 43, 85, 86, 90, 43, 80, 43, 43, 44,
+   44, 44, 57, 80, 36, 61, 62, 44, 44, 44, 44, 93, 27, 27, 27, 91,
+   70, 86, 72, 36, 36, 36, 61, 36, 36, 36, 62, 36, 36, 44, 71, 87,
+   86, 86, 90, 85, 90, 86, 43, 44, 44, 44, 89, 90, 44, 44, 62, 61,
+   62, 61, 44, 44, 44, 44, 44, 44, 43, 86, 36, 36, 36, 36, 61, 36,
+   36, 36, 36, 36, 36, 70, 71, 86, 87, 43, 80, 86, 90, 86, 87, 77,
+   44, 44, 36, 94, 27, 27, 27, 95, 27, 27, 27, 27, 91, 36, 36, 36,
+   57, 86, 62, 36, 36, 36, 36, 36, 36, 36, 36, 61, 44, 36, 36, 36,
+   36, 62, 36, 36, 36, 36, 62, 44, 36, 36, 36, 61, 44, 80, 44, 89,
+   86, 43, 80, 80, 86, 86, 86, 86, 44, 86, 64, 44, 44, 44, 44, 44,
+   62, 36, 36, 36, 36, 36, 36, 36, 70, 36, 43, 43, 43, 80, 44, 96,
+   36, 36, 36, 75, 43, 43, 43, 60,  7,  7,  7,  7,  7,  2, 44, 44,
+   44, 44, 44, 44, 44, 44, 44, 44, 62, 61, 61, 36, 36, 61, 36, 36,
    36, 36, 62, 62, 36, 36, 36, 36, 70, 36, 43, 43, 43, 43, 71, 44,
    36, 36, 61, 81, 43, 43, 43, 44,  7,  7,  7,  7,  7, 44, 36, 36,
-   77, 67,  2,  2,  2,  2,  2,  2,  2, 95, 95, 67, 43, 67, 67, 67,
-    7,  7,  7,  7,  7, 27, 27, 27, 27, 27, 50, 50, 50,  4,  4, 84,
+   77, 67,  2,  2,  2,  2,  2,  2,  2, 97, 97, 67, 43, 67, 67, 67,
+    7,  7,  7,  7,  7, 27, 27, 27, 27, 27, 50, 50, 50,  4,  4, 86,
    36, 36, 36, 36, 62, 36, 36, 36, 36, 36, 36, 36, 36, 36, 61, 44,
-   57, 43, 43, 43, 43, 43, 43, 83, 43, 43, 60, 43, 36, 36, 70, 43,
+   57, 43, 43, 43, 43, 43, 43, 85, 43, 43, 60, 43, 36, 36, 70, 43,
    43, 43, 43, 43, 57, 43, 43, 43, 43, 43, 43, 43, 43, 43, 80, 67,
-   67, 67, 67, 76, 67, 67, 90, 67,  2,  2, 95, 67, 21, 64, 44, 44,
-   36, 36, 36, 36, 36, 92, 85, 43, 83, 43, 43, 43, 85, 83, 85, 71,
-    7,  7,  7,  7,  7,  2,  2,  2, 36, 36, 36, 84, 43, 36, 36, 43,
-   71, 84, 96, 92, 84, 84, 84, 36, 70, 43, 71, 36, 36, 36, 36, 36,
-   36, 83, 85, 83, 84, 84, 85, 92,  7,  7,  7,  7,  7, 84, 85, 67,
+   67, 67, 67, 76, 67, 67, 92, 67,  2,  2, 97, 67, 21, 64, 44, 44,
+   36, 36, 36, 36, 36, 94, 87, 43, 85, 43, 43, 43, 87, 85, 87, 71,
+    7,  7,  7,  7,  7,  2,  2,  2, 36, 36, 36, 86, 43, 36, 36, 43,
+   71, 86, 98, 94, 86, 86, 86, 36, 70, 43, 71, 36, 36, 36, 36, 36,
+   36, 85, 87, 85, 86, 86, 87, 94,  7,  7,  7,  7,  7, 86, 87, 67,
    11, 11, 11, 48, 44, 44, 48, 44, 16, 16, 16, 16, 16, 53, 45, 16,
    36, 36, 36, 36, 61, 36, 36, 44, 36, 36, 36, 61, 61, 36, 36, 44,
    61, 36, 36, 44, 36, 36, 36, 61, 61, 36, 36, 44, 36, 36, 36, 36,
    36, 36, 36, 61, 36, 36, 36, 36, 36, 36, 36, 36, 36, 61, 57, 43,
-    2,  2,  2,  2, 97, 27, 27, 27, 27, 27, 27, 27, 27, 27, 98, 44,
+    2,  2,  2,  2, 99, 27, 27, 27, 27, 27, 27, 27, 27, 27,100, 44,
    67, 67, 67, 67, 67, 44, 44, 44, 11, 11, 11, 44, 16, 16, 16, 44,
-   99, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 77, 72,
-  100, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,101,102, 44,
-   36, 36, 36, 36, 36, 63,  2,103,104, 36, 36, 36, 61, 44, 44, 44,
-   36, 36, 36, 36, 36, 36, 61, 36, 36, 43, 80, 44, 44, 44, 44, 44,
-   36, 43, 60, 64, 44, 44, 44, 44, 36, 43, 44, 44, 44, 44, 44, 44,
-   61, 43, 44, 44, 44, 44, 44, 44, 36, 36, 43, 85, 43, 43, 43, 84,
-   84, 84, 84, 83, 85, 43, 43, 43, 43, 43,  2, 86,  2, 66, 70, 44,
+  101, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 77, 72,
+  102, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,103,104, 44,
+   36, 36, 36, 36, 36, 63,  2,105,106, 36, 36, 36, 61, 44, 44, 44,
+   36, 43, 85, 44, 44, 44, 44, 62, 36, 43,107, 64, 44, 44, 44, 44,
+   36, 43, 44, 44, 44, 44, 44, 44, 36, 36, 36, 36, 36, 36, 61, 36,
+   61, 43, 44, 44, 44, 44, 44, 44, 36, 36, 43, 87, 43, 43, 43, 86,
+   86, 86, 86, 85, 87, 43, 43, 43, 43, 43,  2, 88,  2, 66, 70, 44,
     7,  7,  7,  7,  7, 44, 44, 44, 27, 27, 27, 27, 27, 44, 44, 44,
-    2,  2,  2,105,  2, 59, 43, 68, 36,106, 36, 36, 36, 36, 36, 36,
+    2,  2,  2,108,  2, 59, 43, 84, 36, 83, 36, 36, 36, 36, 36, 36,
    36, 36, 36, 36, 61, 44, 44, 44, 36, 36, 70, 71, 36, 36, 36, 36,
    36, 36, 36, 36, 70, 61, 44, 44, 36, 36, 36, 44, 44, 44, 44, 44,
-   36, 36, 36, 36, 36, 36, 36, 61, 43, 83, 84, 85, 83, 84, 44, 44,
-   84, 83, 84, 84, 85, 43, 44, 44, 90, 44,  2,  7,  7,  7,  7,  7,
+   36, 36, 36, 36, 36, 36, 36, 61, 43, 85, 86, 87, 85, 86, 44, 44,
+   86, 85, 86, 86, 87, 43, 44, 44, 92, 44,  2,  7,  7,  7,  7,  7,
    36, 36, 36, 36, 36, 36, 36, 44, 36, 36, 61, 44, 44, 44, 44, 44,
    36, 36, 36, 36, 36, 36, 44, 44, 36, 36, 36, 36, 36, 44, 44, 44,
-    7,  7,  7,  7,  7, 98, 44, 67, 67, 67, 67, 67, 67, 67, 67, 67,
-   36, 36, 36, 70, 83, 85, 44,  2, 36, 36, 92, 83, 43, 43, 43, 80,
-   83, 83, 85, 43, 43, 43, 83, 84, 84, 85, 43, 43, 43, 43, 80, 57,
-    2,  2,  2, 86,  2,  2,  2, 44, 43, 43, 43, 43, 43, 43, 43,107,
-   80, 44, 44, 44, 44, 44, 44, 44, 43, 43, 96, 36, 36, 36, 36, 36,
-   36, 36, 83, 43, 43, 83, 83, 84, 84, 83, 96, 36, 36, 36, 44, 44,
-   95, 67, 67, 67, 67, 50, 43, 43, 43, 43, 67, 67, 67, 67, 90, 44,
-   43, 96, 36, 36, 36, 36, 36, 36, 92, 43, 43, 84, 43, 85, 43, 36,
-   36, 36, 36, 83, 43, 84, 85, 85, 43, 84, 44, 44, 44, 44,  2,  2,
-   36, 36, 84, 84, 84, 84, 43, 43, 43, 43, 84, 43, 44, 91,  2,  2,
+    7,  7,  7,  7,  7,100, 44, 67, 67, 67, 67, 67, 67, 67, 67, 67,
+   36, 36, 36, 70, 85, 87, 44,  2, 36, 36, 94, 85, 43, 43, 43, 80,
+   85, 85, 87, 43, 43, 43, 85, 86, 86, 87, 43, 43, 43, 43, 80, 57,
+    2,  2,  2, 88,  2,  2,  2, 44, 43, 43, 43, 43, 43, 43, 43,109,
+   43, 43, 43, 43, 43, 43, 43, 80, 43, 43, 98, 36, 36, 36, 36, 36,
+   36, 36, 85, 43, 43, 85, 85, 86, 86, 85, 98, 36, 36, 36, 61, 44,
+   97, 67, 67, 67, 67, 50, 43, 43, 43, 43, 67, 67, 67, 67, 21, 64,
+   43, 98, 36, 36, 36, 36, 36, 36, 94, 43, 43, 86, 43, 87, 43, 36,
+   36, 36, 36, 85, 43, 86, 87, 87, 43, 86, 44, 44, 44, 44,  2,  2,
+   36, 36, 86, 86, 86, 86, 43, 43, 43, 43, 86, 43, 44, 93,  2,  2,
     7,  7,  7,  7,  7, 44, 62, 36, 36, 36, 36, 36, 40, 40, 40,  2,
-   16, 16, 16, 16,108, 44, 44, 44, 11, 11, 11, 11, 11, 47, 48, 11,
+   16, 16, 16, 16,110, 44, 44, 44, 11, 11, 11, 11, 11, 47, 48, 11,
     2,  2,  2,  2, 44, 44, 44, 44, 43, 60, 43, 43, 43, 43, 43, 43,
-   83, 43, 43, 43, 71, 36, 70, 36, 36, 36, 71, 92, 43, 61, 44, 44,
+   85, 43, 43, 43, 71, 36, 70, 36, 36, 36, 71, 94, 43, 61, 44, 44,
    16, 16, 16, 16, 16, 16, 40, 40, 40, 40, 40, 40, 40, 45, 16, 16,
-   16, 16, 16, 16, 45, 16, 16, 16, 16, 16, 16, 16, 16,109, 40, 40,
-   43, 43, 43, 43, 43, 57, 43, 43, 32, 32, 32, 16, 16, 16, 16, 32,
-   16, 16, 16, 16, 11, 11, 11, 11, 16, 16, 16, 44, 11, 11, 11, 44,
-   16, 16, 16, 16, 48, 48, 48, 48, 16, 16, 16, 16, 16, 16, 16, 44,
-   16, 16, 16, 16,110,110,110,110, 16, 16,108, 16, 11, 11,111,112,
-   41, 16,108, 16, 11, 11,111, 41, 16, 16, 44, 16, 11, 11,113, 41,
-   16, 16, 16, 16, 11, 11,114, 41, 44, 16,108, 16, 11, 11,111,115,
-  116,116,116,116,116,117, 65, 65,118,118,118,  2,119,120,119,120,
-    2,  2,  2,  2,121, 65, 65,122,  2,  2,  2,  2,123,124,  2,125,
-  126,  2,127,128,  2,  2,  2,  2,  2,  9,126,  2,  2,  2,  2,129,
-   65, 65, 68, 65, 65, 65, 65, 65,130, 44, 27, 27, 27,  8,127,131,
-   27, 27, 27, 27, 27,  8,127,102, 40, 40, 40, 40, 40, 40, 81, 44,
-   20, 20, 20, 20, 20, 20, 20, 20, 43, 43, 43, 43, 43, 43,132, 51,
-  107, 51,107, 43, 43, 43, 43, 43, 67,133, 67,134, 67, 34, 11, 16,
-   11, 32,134, 67, 49, 11, 11, 67, 67, 67,133,133,133, 11, 11,135,
-   11, 11, 35, 36, 39, 67, 16, 11,  8,  8, 49, 16, 16, 26, 67,136,
-   27, 27, 27, 27, 27, 27, 27, 27,103,103,103,103,103,103,103,103,
-  103,137,138,103,139, 67, 44, 44,  8,  8,140, 67, 67,  8, 67, 67,
-  140, 26, 67,140, 67, 67, 67,140, 67, 67, 67, 67, 67, 67, 67,  8,
-   67,140,140, 67, 67, 67, 67, 67, 67, 67,  8,  8,  8,  8,  8,  8,
-    8,  8,  8,  8,  8,  8,  8,  8, 67, 67, 67, 67,  4,  4, 67, 67,
-    8, 67, 67, 67,141,142, 67, 67, 67, 67, 67, 67, 67, 67,140, 67,
-   67, 67, 67, 67, 67, 26,  8,  8,  8,  8, 67, 67, 67, 67, 67, 67,
-   67, 67, 67, 67, 67, 67,  8,  8,  8, 67, 67, 67, 67, 67, 67, 67,
-   67, 67, 67, 90, 44, 44, 44, 44, 67, 67, 67, 67, 67, 90, 44, 44,
-   27, 27, 27, 27, 27, 27, 67, 67, 67, 67, 67, 67, 67, 27, 27, 27,
-   67, 67, 67, 26, 67, 67, 67, 67, 26, 67, 67, 67, 67, 67, 67, 67,
-   67, 67, 67, 67,  8,  8,  8,  8, 67, 67, 67, 67, 67, 67, 67, 26,
-   67, 67, 67, 67,  4,  4,  4,  4,  4,  4,  4, 27, 27, 27, 27, 27,
-   27, 27, 67, 67, 67, 67, 67, 67,  8,  8,127,143,  8,  8,  8,  8,
-    8,  8,  8,  4,  4,  4,  4,  4,  8,127,144,144,144,144,144,144,
-  144,144,144,144,143,  8,  8,  8,  8,  8,  8,  8,  4,  4,  8,  8,
-    8,  8,  8,  8,  8,  8,  4,  8,  8,  8,140, 26,  8,  8,140, 67,
-   67, 67, 44, 67, 67, 67, 67, 67, 67, 67, 67, 55, 67, 67, 67, 67,
-   11, 11, 11, 11, 11, 11, 11, 47, 16, 16, 16, 16, 16, 16, 16,108,
-   32, 11, 32, 34, 34, 34, 34, 11, 32, 32, 34, 16, 16, 16, 40, 11,
-   32, 32,136, 67, 67,134, 34,145, 43, 32, 44, 44, 91,  2, 97,  2,
-   16, 16, 16,146, 44, 44,146, 44, 36, 36, 36, 36, 44, 44, 44, 52,
-   64, 44, 44, 44, 44, 44, 44, 57, 36, 36, 36, 61, 44, 44, 44, 44,
-   36, 36, 36, 61, 36, 36, 36, 61,  2,119,119,  2,123,124,119,  2,
-    2,  2,  2,  6,  2,105,119,  2,119,  4,  4,  4,  4,  2,  2, 86,
-    2,  2,  2,  2,  2,118,  2,  2,105,147,  2,  2,  2,  2,  2,  2,
-   67, 64, 44, 44, 44, 44, 44, 44, 67, 67, 67, 67, 67, 55, 67, 67,
-   67, 67, 44, 44, 44, 44, 44, 44, 67, 67, 67, 44, 44, 44, 44, 44,
-   67, 67, 67, 67, 67, 67, 44, 44,  1,  2,148,149,  4,  4,  4,  4,
-    4, 67,  4,  4,  4,  4,150,151,152,103,103,103,103, 43, 43, 84,
-  153, 40, 40, 67,103,154, 63, 67, 36, 36, 36, 61, 57,155,156, 69,
-   36, 36, 36, 36, 36, 63, 40, 69, 44, 44, 62, 36, 36, 36, 36, 36,
-   67, 27, 27, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 90,
-   27, 27, 27, 27, 27, 67, 67, 67, 67, 67, 67, 67, 27, 27, 27, 27,
-  157, 27, 27, 27, 27, 27, 27, 27, 36, 36,106, 36, 36, 36, 36, 36,
-   36, 36, 36, 36, 36, 36,158,  2,  7,  7,  7,  7,  7, 36, 44, 44,
-   32, 32, 32, 32, 32, 32, 32, 70, 51,159, 43, 43, 43, 43, 43, 86,
-   32, 32, 32, 32, 32, 32, 40, 43, 36, 36, 36,103,103,103,103,103,
-   43,  2,  2,  2, 44, 44, 44, 44, 41, 41, 41,156, 40, 40, 40, 40,
-   41, 32, 32, 32, 32, 32, 32, 32, 16, 32, 32, 32, 32, 32, 32, 32,
-   45, 16, 16, 16, 34, 34, 34, 32, 32, 32, 32, 32, 42,160, 34, 35,
-   32, 32, 16, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 11, 11, 32,
-   11, 11, 32, 32, 32, 32, 32, 32, 44, 32, 11, 11, 34,108, 44, 44,
-   44, 44, 48, 35, 40, 35, 36, 36, 36, 71, 36, 71, 36, 70, 36, 36,
-   36, 92, 85, 83, 67, 67, 80, 44, 27, 27, 27, 67,161, 44, 44, 44,
-   36, 36,  2,  2, 44, 44, 44, 44, 84, 36, 36, 36, 36, 36, 36, 36,
-   36, 36, 84, 84, 84, 84, 84, 84, 84, 84, 43, 44, 44, 44, 44,  2,
+   16, 16, 16, 16, 45, 16, 16, 16, 16, 16, 16, 16, 16,111, 40, 40,
+   32, 32, 32, 16, 16, 16, 16, 32, 16, 16, 16, 16, 11, 11, 11, 11,
+   16, 16, 16, 44, 11, 11, 11, 44, 16, 16, 16, 16, 48, 48, 48, 48,
+   16, 16, 16, 16, 16, 16, 16, 44, 16, 16, 16, 16,112,112,112,112,
+   16, 16,110, 16, 11, 11,113,114, 41, 16,110, 16, 11, 11,113, 41,
+   16, 16, 44, 16, 11, 11,115, 41, 16, 16, 16, 16, 11, 11,116, 41,
+   44, 16,110, 16, 11, 11,113,117,118,118,118,118,118,119, 65, 65,
+  120,120,120,  2,121,122,121,122,  2,  2,  2,  2,123, 65, 65,124,
+    2,  2,  2,  2,125,126,  2,127,128,  2,129,130,  2,  2,  2,  2,
+    2,  9,128,  2,  2,  2,  2,131, 65, 65,132, 65, 65, 65, 65, 65,
+  133, 44, 27, 27, 27,  8,129,134, 27, 27, 27, 27, 27,  8,129,104,
+   40, 40, 40, 40, 40, 40, 81, 44, 20, 20, 20, 20, 20, 20, 20, 20,
+  135, 44, 44, 44, 44, 44, 44, 44, 43, 43, 43, 43, 43, 43,136, 51,
+  109, 51,109, 43, 43, 43, 43, 43, 80, 44, 44, 44, 44, 44, 44, 44,
+   67,137, 67,138, 67, 34, 11, 16, 11, 32,138, 67, 49, 11, 11, 67,
+   67, 67,137,137,137, 11, 11,139, 11, 11, 35, 36, 39, 67, 16, 11,
+    8,  8, 49, 16, 16, 26, 67,140, 27, 27, 27, 27, 27, 27, 27, 27,
+  105,105,105,105,105,105,105,105,105,141,142,105,143, 67, 44, 44,
+    8,  8,144, 67, 67,  8, 67, 67,144, 26, 67,144, 67, 67, 67,144,
+   67, 67, 67, 67, 67, 67, 67,  8, 67,144,144, 67, 67, 67, 67, 67,
+   67, 67,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+   67, 67, 67, 67,  4,  4, 67, 67,  8, 67, 67, 67,145,146, 67, 67,
+   67, 67, 67, 67, 67, 67,144, 67, 67, 67, 67, 67, 67, 26,  8,  8,
+    8,  8, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,  8,  8,
+    8, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 92, 44, 44, 44, 44,
+   67, 67, 67, 67, 67, 92, 44, 44, 27, 27, 27, 27, 27, 27, 67, 67,
+   67, 67, 67, 67, 67, 27, 27, 27, 67, 67, 67, 26, 67, 67, 67, 67,
+   26, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,  8,  8,  8,  8,
+   67, 67, 67, 67, 67, 67, 67, 26, 67, 67, 67, 67,  4,  4,  4,  4,
+    4,  4,  4, 27, 27, 27, 27, 27, 27, 27, 67, 67, 67, 67, 67, 67,
+    8,  8,129,147,  8,  8,  8,  8,  8,  8,  8,  4,  4,  4,  4,  4,
+    8,129,148,148,148,148,148,148,148,148,148,148,147,  8,  8,  8,
+    8,  8,  8,  8,  4,  4,  8,  8,  8,  8,  8,  8,  8,  8,  4,  8,
+    8,  8,144, 26,  8,  8,144, 67, 67, 67, 44, 67, 67, 67, 67, 67,
+   67, 67, 67, 55, 67, 67, 67, 67, 32, 11, 32, 34, 34, 34, 34, 11,
+   32, 32, 34, 16, 16, 16, 40, 11, 32, 32,140, 67, 67,138, 34,149,
+   43, 32, 44, 44, 93,  2, 99,  2, 16, 16, 16,150, 44, 44,150, 44,
+   36, 36, 36, 36, 44, 44, 44, 52, 64, 44, 44, 44, 44, 44, 44, 57,
+   36, 36, 36, 61, 44, 44, 44, 44, 36, 36, 36, 61, 36, 36, 36, 61,
+    2,121,121,  2,125,126,121,  2,  2,  2,  2,  6,  2,108,121,  2,
+  121,  4,  4,  4,  4,  2,  2, 88,  2,  2,  2,  2,  2,120,  2,  2,
+  108,151,  2,  2,  2,  2,  2,  2, 67,  2,152,148,148,148,153, 44,
+   67, 67, 67, 67, 67, 55, 67, 67, 67, 67, 44, 44, 44, 44, 44, 44,
+   67, 67, 67, 44, 44, 44, 44, 44, 67, 67, 67, 67, 67, 67, 44, 44,
+    1,  2,154,155,  4,  4,  4,  4,  4, 67,  4,  4,  4,  4,156,157,
+  158,105,105,105,105, 43, 43, 86,159, 40, 40, 67,105,160, 63, 67,
+   36, 36, 36, 61, 57,161,162, 69, 36, 36, 36, 36, 36, 63, 40, 69,
+   44, 44, 62, 36, 36, 36, 36, 36, 67, 27, 27, 67, 67, 67, 67, 67,
+   67, 67, 67, 67, 67, 67, 67, 92, 27, 27, 27, 27, 27, 67, 67, 67,
+   67, 67, 67, 67, 27, 27, 27, 27,163, 27, 27, 27, 27, 27, 27, 27,
+   36, 36, 83, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,164,  2,
+    7,  7,  7,  7,  7, 36, 44, 44, 32, 32, 32, 32, 32, 32, 32, 70,
+   51,165, 43, 43, 43, 43, 43, 88, 32, 32, 32, 32, 32, 32, 40, 43,
+   36, 36, 36,105,105,105,105,105, 43,  2,  2,  2, 44, 44, 44, 44,
+   41, 41, 41,162, 40, 40, 40, 40, 41, 32, 32, 32, 32, 32, 32, 32,
+   16, 32, 32, 32, 32, 32, 32, 32, 45, 16, 16, 16, 34, 34, 34, 32,
+   32, 32, 32, 32, 42,166, 34, 35, 32, 32, 16, 32, 32, 32, 32, 32,
+   32, 32, 32, 32, 32, 11, 11, 32, 11, 11, 32, 32, 32, 32, 32, 32,
+   32, 32, 11, 11, 34,110, 44, 44, 32,150,150, 32, 32, 44, 44, 44,
+   44, 40,167, 35, 40, 35, 36, 36, 36, 71, 36, 71, 36, 70, 36, 36,
+   36, 94, 87, 85, 67, 67, 80, 44, 27, 27, 27, 67,168, 44, 44, 44,
+   36, 36,  2,  2, 44, 44, 44, 44, 86, 36, 36, 36, 36, 36, 36, 36,
+   36, 36, 86, 86, 86, 86, 86, 86, 86, 86, 43, 44, 44, 44, 44,  2,
    43, 36, 36, 36,  2, 72, 72, 70, 36, 36, 36, 43, 43, 43, 43,  2,
-   36, 36, 36, 70, 43, 43, 43, 43, 43, 84, 44, 44, 44, 44, 44, 91,
-   36, 70, 84, 43, 43, 84, 43, 84,162,  2,  2,  2,  2,  2,  2, 52,
+   36, 36, 36, 70, 43, 43, 43, 43, 43, 86, 44, 44, 44, 44, 44, 93,
+   36, 70, 86, 43, 43, 86, 43, 86,107,  2,  2,  2,  2,  2,  2, 52,
     7,  7,  7,  7,  7, 44, 44,  2, 36, 36, 70, 69, 36, 36, 36, 36,
-    7,  7,  7,  7,  7, 36, 36, 61, 36, 36, 36, 36, 70, 43, 43, 83,
-   85, 83, 85, 80, 44, 44, 44, 44, 36, 70, 36, 36, 36, 36, 83, 44,
-    7,  7,  7,  7,  7, 44,  2,  2, 69, 36, 36, 77, 67, 92, 83, 36,
+    7,  7,  7,  7,  7, 36, 36, 61, 36, 36, 36, 36, 70, 43, 43, 85,
+   87, 85, 87, 80, 44, 44, 44, 44, 36, 70, 36, 36, 36, 36, 85, 44,
+    7,  7,  7,  7,  7, 44,  2,  2, 69, 36, 36, 77, 67, 94, 85, 36,
    71, 43, 71, 70, 71, 36, 36, 43, 70, 61, 44, 44, 44, 44, 44, 44,
-   44, 44, 44, 44, 44, 62,106,  2, 36, 36, 36, 36, 36, 92, 43, 84,
-    2,106,163, 80, 44, 44, 44, 44, 62, 36, 36, 61, 62, 36, 36, 61,
-   62, 36, 36, 61, 44, 44, 44, 44, 16, 16, 16, 16, 16,112, 40, 40,
-   16, 16, 16, 16,109, 41, 44, 44, 36, 92, 85, 84, 83,162, 85, 44,
+   44, 44, 44, 44, 44, 62, 83,  2, 36, 36, 36, 36, 36, 94, 43, 86,
+    2, 83,169, 80, 44, 44, 44, 44, 62, 36, 36, 61, 62, 36, 36, 61,
+   62, 36, 36, 61, 44, 44, 44, 44, 16, 16, 16, 16, 16,114, 40, 40,
+   16, 16, 16, 16,111, 41, 44, 44, 36, 94, 87, 86, 85,107, 87, 44,
    36, 36, 44, 44, 44, 44, 44, 44, 36, 36, 36, 61, 44, 62, 36, 36,
-  164,164,164,164,164,164,164,164,165,165,165,165,165,165,165,165,
-   16, 16, 16,108, 44, 44, 44, 44, 44,146, 16, 16, 44, 44, 62, 71,
-   36, 36, 36, 36,166, 36, 36, 36, 36, 36, 36, 61, 36, 36, 61, 61,
+  170,170,170,170,170,170,170,170,171,171,171,171,171,171,171,171,
+   16, 16, 16,110, 44, 44, 44, 44, 44,150, 16, 16, 44, 44, 62, 71,
+   36, 36, 36, 36,172, 36, 36, 36, 36, 36, 36, 61, 36, 36, 61, 61,
    36, 62, 61, 36, 36, 36, 36, 36, 36, 41, 41, 41, 41, 41, 41, 41,
-   41, 44, 44, 44, 44, 44, 44, 44, 44, 62, 36, 36, 36, 36, 36, 36,
-   36, 36, 36, 36, 36, 36, 36,144, 44, 36, 36, 36, 36, 36, 36, 36,
-   36, 36, 36, 36, 36, 36,161, 44,  2,  2,  2,167,128, 44, 44, 44,
-    6,168,169,144,144,144,144,144,144,144,128,167,128,  2,125,170,
-    2, 64,  2,  2,150,144,144,128,  2,171,  8,172, 66,  2, 44, 44,
-   36, 36, 36, 36, 36, 36, 61, 79, 91,  2,  3,  2,  4,  5,  6,  2,
-   16, 16, 16, 16, 16, 17, 18,127,128,  4,  2, 36, 36, 36, 36, 36,
+   41,117, 44, 44, 44, 44, 44, 44, 44, 62, 36, 36, 36, 36, 36, 36,
+   36, 36, 36, 36, 36, 36, 36,148, 44, 36, 36, 36, 36, 36, 36, 36,
+   36, 36, 36, 36, 44, 44, 44, 55, 36, 36, 36, 36, 36, 36,168, 67,
+    2,  2,  2,152,130, 44, 44, 44,  6,173,174,148,148,148,148,148,
+  148,148,130,152,130,  2,127,175,  2, 64,  2,  2,156,148,148,130,
+    2,176,  8,177, 66,  2, 44, 44, 36, 36, 61, 36, 36, 36, 36, 36,
+   36, 36, 36, 36, 36, 36, 61, 79, 93,  2,  3,  2,  4,  5,  6,  2,
+   16, 16, 16, 16, 16, 17, 18,129,130,  4,  2, 36, 36, 36, 36, 36,
    69, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 40,
    44, 36, 36, 36, 44, 36, 36, 36, 44, 36, 36, 36, 44, 36, 61, 44,
-   20,173, 56,174, 26,  8,140, 90, 44, 44, 44, 44, 79, 65, 67, 44,
+   20,178, 56,135, 26,  8,144, 92, 44, 44, 44, 44, 79, 65, 67, 44,
    36, 36, 36, 36, 36, 36, 62, 36, 36, 36, 36, 36, 36, 61, 36, 62,
-    2, 64, 44,175, 27, 27, 27, 27, 27, 27, 44, 55, 67, 67, 67, 67,
-  103,103,139, 27, 89, 67, 67, 67, 67, 67, 67, 67, 67, 27, 67, 90,
-   67, 67, 67, 67, 67, 67, 90, 44, 90, 44, 44, 44, 44, 44, 44, 44,
-   67, 67, 67, 67, 67, 67, 50, 44,176, 27, 27, 27, 27, 27, 27, 27,
+    2, 64, 44,179, 27, 27, 27, 27, 27, 27, 44, 55, 67, 67, 67, 67,
+  105,105,143, 27, 91, 67, 67, 67, 67, 67, 67, 67, 67, 27, 67, 92,
+   67, 67, 67, 67, 67, 67, 92, 44, 92, 44, 44, 44, 44, 44, 44, 44,
+   67, 67, 67, 67, 67, 67, 50, 44,180, 27, 27, 27, 27, 27, 27, 27,
    27, 27, 27, 27, 27, 27, 44, 44, 27, 27, 44, 44, 44, 44, 62, 36,
-  149, 36, 36, 36, 36,177, 44, 44, 36, 36, 36, 43, 43, 80, 44, 44,
-   36, 36, 36, 36, 36, 36, 36, 91, 36, 36, 44, 44, 36, 36, 36, 36,
-  178,103,103, 44, 44, 44, 44, 44, 11, 11, 11, 11, 16, 16, 16, 16,
+  155, 36, 36, 36, 36,181, 44, 44, 36, 36, 36, 43, 43, 80, 44, 44,
+   36, 36, 36, 36, 36, 36, 36, 93, 36, 36, 44, 44, 36, 36, 36, 36,
+  182,105,105, 44, 44, 44, 44, 44, 11, 11, 11, 11, 16, 16, 16, 16,
    11, 11, 44, 44, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 44, 44,
-   36, 36, 44, 44, 44, 44, 44, 91, 36, 36, 36, 44, 61, 36, 36, 36,
-   36, 36, 36, 62, 61, 44, 61, 62, 36, 36, 36, 91, 27, 27, 27, 27,
-   36, 36, 36, 77,157, 27, 27, 27, 44, 44, 44,175, 27, 27, 27, 27,
-   36, 61, 36, 44, 44,175, 27, 27, 36, 36, 36, 27, 27, 27, 44, 91,
-   36, 36, 36, 36, 36, 44, 44, 91, 36, 36, 36, 36, 44, 44, 27, 36,
-   44, 27, 27, 27, 27, 27, 27, 27, 70, 43, 57, 80, 44, 44, 43, 43,
-   36, 36, 62, 36, 62, 36, 36, 36, 36, 36, 36, 44, 43, 80, 44, 57,
-   27, 27, 27, 27, 98, 44, 44, 44,  2,  2,  2,  2, 64, 44, 44, 44,
-   36, 36, 36, 36, 36, 36,179, 30, 36, 36, 36, 36, 36, 36,179, 27,
-   36, 36, 36, 36, 78, 36, 36, 36, 36, 36, 70, 80, 44,175, 27, 27,
-    2,  2,  2, 64, 44, 44, 44, 44, 36, 36, 36, 44, 91,  2,  2,  2,
-   36, 36, 36, 44, 27, 27, 27, 27, 36, 61, 44, 44, 27, 27, 27, 27,
-   36, 44, 44, 44, 91,  2, 64, 44, 44, 44, 44, 44,175, 27, 27, 27,
-   11, 47, 44, 44, 44, 44, 44, 44, 16,108, 44, 44, 44, 27, 27, 27,
-   36, 36, 43, 43, 44, 44, 44, 44, 27, 27, 27, 27, 27, 27, 27, 98,
-   36, 36, 36, 36, 36, 57,180, 44, 36, 44, 44, 44, 44, 44, 44, 44,
-   27, 27, 27, 93, 44, 44, 44, 44,176, 27, 30,  2,  2, 44, 44, 44,
-   36, 36,179, 27, 27, 27, 44, 44, 85, 96, 36, 36, 36, 36, 36, 36,
+   36, 36, 36, 36, 44, 44, 44, 44, 36, 36, 44, 44, 44, 44, 44, 93,
+   11, 11, 11, 11, 11, 47, 11, 11, 11, 47, 11,150, 16, 16, 16, 16,
+   16,150, 16, 16, 16, 16, 16, 16, 16,150, 16, 16, 16,150,110, 44,
+   40, 40, 40, 52, 40, 40, 40, 40, 81, 40, 40, 40, 40, 81, 44, 44,
+   36, 36, 36, 44, 61, 36, 36, 36, 36, 36, 36, 62, 61, 44, 61, 62,
+   36, 36, 36, 93, 27, 27, 27, 27, 36, 36, 36, 77,163, 27, 27, 27,
+   44, 44, 44,179, 27, 27, 27, 27, 36, 61, 36, 44, 44,179, 27, 27,
+   36, 36, 36, 27, 27, 27, 44, 93, 36, 36, 36, 36, 36, 44, 44, 93,
+   36, 36, 36, 36, 44, 44, 27, 36, 44, 27, 27, 27, 27, 27, 27, 27,
+   70, 43, 57, 80, 44, 44, 43, 43, 36, 36, 62, 36, 62, 36, 36, 36,
+   36, 36, 36, 44, 43, 80, 44, 57, 27, 27, 27, 27,100, 44, 44, 44,
+    2,  2,  2,  2, 64, 44, 44, 44, 36, 36, 36, 36, 36, 36,183, 30,
+   36, 36, 36, 36, 36, 36,183, 27, 36, 36, 36, 36, 78, 36, 36, 36,
+   36, 36, 70, 80, 44,179, 27, 27,  2,  2,  2, 64, 44, 44, 44, 44,
+   36, 36, 36, 44, 93,  2,  2,  2, 36, 36, 36, 44, 27, 27, 27, 27,
+   36, 61, 44, 44, 27, 27, 27, 27, 36, 44, 44, 44, 93,  2, 64, 44,
+   44, 44, 44, 44,179, 27, 27, 27, 11, 47, 44, 44, 44, 44, 44, 44,
+   16,110, 44, 44, 44, 27, 27, 27, 36, 36, 43, 43, 44, 44, 44, 44,
+   27, 27, 27, 27, 27, 27, 27,100, 36, 36, 36, 36, 36, 57,184, 44,
+   36, 44, 44, 44, 44, 44, 44, 44, 27, 27, 27, 95, 44, 44, 44, 44,
+  180, 27, 30,  2,  2, 44, 44, 44, 36, 43, 43,  2,  2, 44, 44, 44,
+   36, 36,183, 27, 27, 27, 44, 44, 87, 98, 36, 36, 36, 36, 36, 36,
    36, 36, 36, 36, 43, 43, 43, 43, 43, 43, 43, 60,  2,  2,  2, 44,
-   27, 27, 27,  7,  7,  7,  7,  7, 44, 44, 44, 44, 44, 44, 44, 57,
-   84, 85, 43, 83, 85, 60,181,  2,  2, 44, 44, 44, 44, 44, 79, 44,
-   43, 71, 36, 36, 36, 36, 36, 36, 36, 36, 36, 70, 43, 43, 85, 43,
-   43, 43, 80,  7,  7,  7,  7,  7,  2,  2, 92, 96, 44, 44, 44, 44,
-   36, 70,  2, 61, 44, 44, 44, 44, 36, 92, 84, 43, 43, 43, 43, 83,
-   96, 36, 63,  2, 59, 43, 60, 85,  7,  7,  7,  7,  7, 63, 63,  2,
-  175, 27, 27, 27, 27, 27, 27, 27, 27, 27, 98, 44, 44, 44, 44, 44,
-   36, 36, 36, 36, 36, 36, 84, 85, 43, 84, 83, 43,  2,  2,  2, 80,
+   27, 27, 27,  7,  7,  7,  7,  7, 71, 70, 71, 44, 44, 44, 44, 57,
+   86, 87, 43, 85, 87, 60,185,  2,  2, 80, 44, 44, 44, 44, 79, 44,
+   43, 71, 36, 36, 36, 36, 36, 36, 36, 36, 36, 70, 43, 43, 87, 43,
+   43, 43, 80,  7,  7,  7,  7,  7,  2,  2, 94, 98, 44, 44, 44, 44,
+   36, 70,  2, 61, 44, 44, 44, 44, 36, 94, 86, 43, 43, 43, 43, 85,
+   98, 36, 63,  2, 59, 43, 60, 87,  7,  7,  7,  7,  7, 63, 63,  2,
+  179, 27, 27, 27, 27, 27, 27, 27, 27, 27,100, 44, 44, 44, 44, 44,
+   36, 36, 36, 36, 36, 36, 86, 87, 43, 86, 85, 43,  2,  2,  2, 80,
    36, 36, 36, 61, 61, 36, 36, 62, 36, 36, 36, 36, 36, 36, 36, 62,
    36, 36, 36, 36, 63, 44, 44, 44, 36, 36, 36, 36, 36, 36, 36, 70,
-   84, 85, 43, 43, 43, 80, 44, 44, 43, 84, 62, 36, 36, 36, 61, 62,
-   61, 36, 62, 36, 36, 57, 71, 84, 83, 84, 88, 87, 88, 87, 84, 44,
-   61, 44, 44, 87, 44, 44, 62, 36, 36, 84, 44, 43, 43, 43, 80, 44,
-   43, 43, 80, 44, 44, 44, 44, 44, 36, 36, 92, 84, 43, 43, 43, 43,
-   84, 43, 83, 71, 36, 63,  2,  2,  7,  7,  7,  7,  7,  2, 91, 71,
-   84, 85, 43, 43, 83, 83, 84, 85, 83, 43, 36, 72, 44, 44, 44, 44,
-   36, 36, 36, 36, 36, 36, 36, 92, 84, 43, 43, 44, 84, 84, 43, 85,
+   86, 87, 43, 43, 43, 80, 44, 44, 43, 86, 62, 36, 36, 36, 61, 62,
+   61, 36, 62, 36, 36, 57, 71, 86, 85, 86, 90, 89, 90, 89, 86, 44,
+   61, 44, 44, 89, 44, 44, 62, 36, 36, 86, 44, 43, 43, 43, 80, 44,
+   43, 43, 80, 44, 44, 44, 44, 44, 36, 36, 94, 86, 43, 43, 43, 43,
+   86, 43, 85, 71, 36, 63,  2,  2,  7,  7,  7,  7,  7,  2, 93, 71,
+   86, 87, 43, 43, 85, 85, 86, 87, 85, 43, 36, 72, 44, 44, 44, 44,
+   36, 36, 36, 36, 36, 36, 36, 94, 86, 43, 43, 44, 86, 86, 43, 87,
    60,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 36, 36, 43, 44,
-   84, 85, 43, 43, 43, 83, 85, 85, 60,  2, 61, 44, 44, 44, 44, 44,
-    2,  2,  2,  2,  2,  2, 64, 44, 36, 36, 36, 36, 36, 70, 85, 84,
-   43, 43, 43, 85, 61, 44, 44, 44, 84, 43, 43, 85, 43, 43, 44, 44,
-    7,  7,  7,  7,  7, 27,  2, 95, 43, 43, 43, 43, 85, 60, 44, 44,
-   27, 98, 44, 44, 44, 44, 44, 62, 36, 36, 36, 61, 62, 44, 36, 36,
-   36, 36, 62, 61, 36, 36, 36, 36, 84, 84, 84, 87, 88, 57, 83, 71,
-   96, 85,  2, 64, 44, 44, 44, 44, 36, 36, 36, 36, 44, 36, 36, 36,
-   92, 84, 43, 43, 44, 43, 84, 84, 71, 72, 88, 44, 44, 44, 44, 44,
-   70, 43, 43, 43, 43, 71, 36, 36, 36, 70, 43, 43, 83, 70, 43, 60,
-    2,  2,  2, 59, 44, 44, 44, 44, 70, 43, 43, 83, 85, 43, 36, 36,
-   36, 36, 36, 36, 36, 43, 43, 43, 43, 43, 43, 83, 43,  2, 72,  2,
-    2, 64, 44, 44, 44, 44, 44, 44, 43, 43, 43, 80, 43, 43, 43, 85,
+   86, 87, 43, 43, 43, 85, 87, 87, 60,  2, 61, 44, 44, 44, 44, 44,
+    2,  2,  2,  2,  2,  2, 64, 44, 36, 36, 36, 36, 36, 70, 87, 86,
+   43, 43, 43, 87, 63, 44, 44, 44, 86, 43, 43, 87, 43, 43, 44, 44,
+    7,  7,  7,  7,  7, 27,  2, 97, 43, 43, 43, 43, 87, 60, 44, 44,
+   27,100, 44, 44, 44, 44, 44, 62, 36, 36, 36, 61, 62, 44, 36, 36,
+   36, 36, 62, 61, 36, 36, 36, 36, 86, 86, 86, 89, 90, 57, 85, 71,
+   98, 87,  2, 64, 44, 44, 44, 44, 36, 36, 36, 36, 44, 36, 36, 36,
+   94, 86, 43, 43, 44, 43, 86, 86, 71, 72, 90, 44, 44, 44, 44, 44,
+   70, 43, 43, 43, 43, 71, 36, 36, 36, 70, 43, 43, 85, 70, 43, 60,
+    2,  2,  2, 59, 44, 44, 44, 44, 70, 43, 43, 85, 87, 43, 36, 36,
+   36, 36, 36, 36, 36, 43, 43, 43, 43, 43, 43, 85, 43,  2, 72,  2,
+    2, 64, 44, 44, 44, 44, 44, 44, 43, 43, 43, 80, 43, 43, 43, 87,
    63,  2,  2, 44, 44, 44, 44, 44,  2, 36, 36, 36, 36, 36, 36, 36,
-   44, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 87, 43, 43, 43,
-   83, 43, 85, 80, 44, 44, 44, 44, 36, 36, 36, 61, 36, 62, 36, 36,
+   44, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 89, 43, 43, 43,
+   85, 43, 87, 80, 44, 44, 44, 44, 36, 36, 36, 61, 36, 62, 36, 36,
    70, 43, 43, 80, 44, 80, 43, 57, 43, 43, 43, 70, 44, 44, 44, 44,
-   36, 36, 36, 62, 61, 36, 36, 36, 36, 36, 36, 36, 36, 84, 84, 88,
-   43, 87, 85, 85, 61, 44, 44, 44, 36, 70, 83,162, 64, 44, 44, 44,
-   27, 27, 89, 67, 67, 67, 56, 20,161, 67, 67, 67, 67, 67, 67, 67,
-   67, 44, 44, 44, 44, 44, 44, 91,103,103,103,103,103,103,103,177,
-    2,  2, 64, 44, 44, 44, 44, 44, 65, 65, 65, 65, 68, 44, 44, 44,
-   43, 43, 60, 44, 44, 44, 44, 44, 43, 43, 43, 60,  2,  2, 67, 67,
-   40, 40, 95, 44, 44, 44, 44, 44,  7,  7,  7,  7,  7,175, 27, 27,
-   27, 62, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 44, 44, 62, 36,
-   27, 27, 27, 30,  2, 64, 44, 44, 36, 36, 36, 36, 36, 61, 44, 57,
-   92, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
-   84, 84, 84, 84, 44, 44, 44, 57, 43, 74, 40, 40, 40, 40, 40, 40,
-   40, 86, 80, 44, 44, 44, 44, 44, 84, 44, 44, 44, 44, 44, 44, 44,
+   36, 36, 36, 62, 61, 36, 36, 36, 36, 36, 36, 36, 36, 86, 86, 90,
+   43, 89, 87, 87, 61, 44, 44, 44, 36, 70, 85,107, 64, 44, 44, 44,
+   27, 27, 91, 67, 67, 67, 56, 20,168, 67, 67, 67, 67, 67, 67, 67,
+   67, 44, 44, 44, 44, 44, 44, 93,105,105,105,105,105,105,105,181,
+    2,  2, 64, 44, 44, 44, 44, 44, 63, 64, 44, 44, 44, 44, 44, 44,
+   65, 65, 65, 65,132, 44, 44, 44, 43, 43, 60, 44, 44, 44, 44, 44,
+   43, 43, 43, 60,  2,  2, 67, 67, 40, 40, 97, 44, 44, 44, 44, 44,
+    7,  7,  7,  7,  7,179, 27, 27, 27, 62, 36, 36, 36, 36, 36, 36,
+   36, 36, 36, 36, 44, 44, 62, 36, 27, 27, 27, 30,  2, 64, 44, 44,
+   36, 36, 36, 36, 36, 61, 44, 57, 94, 86, 86, 86, 86, 86, 86, 86,
+   86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 44, 44, 44, 57,
+   43, 74, 40, 40, 40, 40, 40, 40, 40, 88, 80, 44, 44, 44, 44, 44,
+   86, 44, 44, 44, 44, 44, 44, 44, 40, 40, 52, 40, 40, 40, 52, 81,
    36, 61, 44, 44, 44, 44, 44, 44, 44, 44, 36, 36, 44, 44, 44, 44,
    36, 36, 36, 36, 36, 44, 50, 60, 65, 65, 44, 44, 44, 44, 44, 44,
-   67, 67, 67, 90, 55, 67, 67, 67, 67, 67,182, 85, 43, 67,182, 84,
-   84,183, 65, 65, 65, 82, 43, 43, 43, 76, 50, 43, 43, 43, 67, 67,
-   67, 67, 67, 67, 67, 43, 43, 67, 67, 67, 67, 67, 90, 44, 44, 44,
-   67, 43, 76, 44, 44, 44, 44, 44, 27, 27, 44, 44, 44, 44, 44, 44,
-   11, 11, 11, 11, 11, 16, 16, 16, 16, 16, 11, 11, 11, 11, 11, 11,
-   11, 11, 11, 11, 11, 11, 11, 16, 16, 16,108, 16, 16, 16, 16, 16,
-   11, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 47, 11,
-   44, 47, 48, 47, 48, 11, 47, 11, 11, 11, 11, 16, 16,146,146, 16,
-   16, 16,146, 16, 16, 16, 16, 16, 16, 16, 11, 48, 11, 47, 48, 11,
-   11, 11, 47, 11, 11, 11, 47, 16, 16, 16, 16, 16, 11, 48, 11, 47,
-   11, 11, 47, 47, 44, 11, 11, 11, 47, 16, 16, 16, 16, 16, 16, 16,
-   16, 16, 16, 16, 16, 16, 11, 11, 11, 11, 11, 16, 16, 16, 16, 16,
-   16, 16, 16, 44, 11, 11, 11, 11, 31, 16, 16, 16, 16, 16, 16, 16,
-   16, 16, 16, 16, 16, 33, 16, 16, 16, 11, 11, 11, 11, 11, 11, 11,
-   11, 11, 11, 11, 11, 31, 16, 16, 16, 16, 33, 16, 16, 16, 11, 11,
-   11, 11, 31, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 33,
-   16, 16, 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 31,
-   16, 16, 16, 16, 33, 16, 16, 16, 11, 11, 11, 11, 31, 16, 16, 16,
-   16, 33, 16, 16, 16, 32, 44,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-   43, 43, 43, 76, 67, 50, 43, 43, 43, 43, 43, 43, 43, 43, 76, 67,
-   67, 67, 50, 67, 67, 67, 67, 67, 67, 67, 76, 21,  2,  2, 44, 44,
-   44, 44, 44, 44, 44, 57, 43, 43, 43, 43, 43, 80, 43, 43, 43, 43,
-   43, 43, 43, 43, 80, 57, 43, 43, 43, 57, 80, 43, 43, 80, 44, 44,
-   43, 43, 43, 74, 40, 40, 40, 44,  7,  7,  7,  7,  7, 44, 44, 77,
-   36, 36, 36, 36, 36, 36, 43, 43,  7,  7,  7,  7,  7, 44, 44, 94,
-   36, 36, 61,175, 27, 27, 27, 27, 43, 43, 43, 80, 44, 44, 44, 44,
-   16, 16, 43, 43, 43, 74, 44, 44, 27, 27, 27, 27, 27, 27,157, 27,
-  184, 27, 98, 44, 44, 44, 44, 44, 27, 27, 27, 27, 27, 27, 27,157,
+   43, 43, 43, 43, 43, 43, 43, 44, 43, 43, 43, 80, 44, 44, 44, 44,
+   67, 67, 67, 92, 55, 67, 67, 67, 67, 67,186, 87, 43, 67,186, 86,
+   86,187, 65, 65, 65, 84, 43, 43, 43, 76, 50, 43, 43, 43, 67, 67,
+   67, 67, 67, 67, 67, 43, 43, 67, 67, 43, 76, 44, 44, 44, 44, 44,
+   27, 27, 44, 44, 44, 44, 44, 44, 11, 11, 11, 11, 11, 16, 16, 16,
+   16, 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 16,
+   16, 16,110, 16, 16, 16, 16, 16, 11, 16, 16, 16, 16, 16, 16, 16,
+   16, 16, 16, 16, 16, 16, 47, 11, 44, 47, 48, 47, 48, 11, 47, 11,
+   11, 11, 11, 16, 16,150,150, 16, 16, 16,150, 16, 16, 16, 16, 16,
+   16, 16, 11, 48, 11, 47, 48, 11, 11, 11, 47, 11, 11, 11, 47, 16,
+   16, 16, 16, 16, 11, 48, 11, 47, 11, 11, 47, 47, 44, 11, 11, 11,
+   47, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 11, 11,
+   11, 11, 11, 16, 16, 16, 16, 16, 16, 16, 16, 44, 11, 11, 11, 11,
+   31, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 33, 16, 16,
+   16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 31, 16, 16,
+   16, 16, 33, 16, 16, 16, 11, 11, 11, 11, 31, 16, 16, 16, 16, 16,
+   16, 16, 16, 16, 16, 16, 16, 33, 16, 16, 16, 11, 11, 11, 11, 11,
+   11, 11, 11, 11, 11, 11, 11, 31, 16, 16, 16, 16, 33, 16, 16, 16,
+   11, 11, 11, 11, 31, 16, 16, 16, 16, 33, 16, 16, 16, 32, 44,  7,
+    7,  7,  7,  7,  7,  7,  7,  7, 43, 43, 43, 76, 67, 50, 43, 43,
+   43, 43, 43, 43, 43, 43, 76, 67, 67, 67, 50, 67, 67, 67, 67, 67,
+   67, 67, 76, 21,  2,  2, 44, 44, 44, 44, 44, 44, 44, 57, 43, 43,
+   16, 16, 16, 16, 16, 39, 16, 16, 16, 16, 16, 16, 16, 16, 16,110,
+   43, 43, 43, 80, 43, 43, 43, 43, 43, 43, 43, 43, 80, 57, 43, 43,
+   43, 57, 80, 43, 43, 80, 44, 44, 43, 43, 43, 74, 40, 40, 40, 44,
+    7,  7,  7,  7,  7, 44, 44, 77, 36, 36, 36, 36, 36, 36, 36, 80,
+   36, 36, 36, 36, 36, 36, 43, 43,  7,  7,  7,  7,  7, 44, 44, 96,
+   36, 36, 36, 61, 36, 36, 62, 61, 36, 36, 61,179, 27, 27, 27, 27,
+   16, 16, 43, 43, 43, 74, 44, 44, 27, 27, 27, 27, 27, 27,163, 27,
+  188, 27,100, 44, 44, 44, 44, 44, 27, 27, 27, 27, 27, 27, 27,163,
    27, 27, 27, 27, 27, 27, 27, 44, 36, 36, 62, 36, 36, 36, 36, 36,
    62, 61, 61, 62, 62, 36, 36, 36, 36, 61, 36, 36, 62, 62, 44, 44,
    44, 61, 44, 62, 62, 62, 62, 36, 62, 61, 61, 62, 62, 62, 62, 62,
    62, 61, 61, 62, 36, 61, 36, 36, 36, 61, 36, 36, 62, 36, 61, 61,
    36, 36, 36, 36, 36, 62, 36, 36, 62, 36, 62, 36, 36, 62, 36, 36,
     8, 44, 44, 44, 44, 44, 44, 44, 55, 67, 67, 67, 67, 67, 67, 67,
-   27, 27, 27, 27, 27, 27, 89, 67, 67, 67, 67, 67, 67, 67, 67, 44,
-   44, 44, 44, 67, 67, 67, 67, 67, 67, 90, 44, 44, 44, 44, 44, 44,
-   67, 44, 44, 44, 44, 44, 44, 44, 67, 67, 67, 67, 67, 25, 41, 41,
-   67, 67, 67, 67, 44, 44, 44, 44, 67, 67, 67, 67, 90, 67, 67, 67,
-   67, 67, 67, 67, 67, 67, 55, 67, 67, 67, 90, 44, 67, 90, 44, 44,
-   67, 90, 67, 67, 67, 67, 67, 67, 79, 44, 44, 44, 44, 44, 44, 44,
-   65, 65, 65, 65, 65, 65, 65, 65,165,165,165,165,165,165,165, 44,
-  165,165,165,165,165,165,165,  0,  0,  0, 29, 21, 21, 21, 23, 21,
+   27, 27, 27, 27, 27, 27, 91, 67, 67, 67, 67, 67, 67, 67, 67, 44,
+   44, 44, 44, 67, 67, 67, 67, 67, 67, 92, 44, 44, 44, 44, 44, 44,
+   67, 67, 67, 67, 92, 44, 44, 44, 67, 44, 44, 44, 44, 44, 44, 44,
+   67, 67, 67, 67, 67, 25, 41, 41, 67, 67, 67, 67, 44, 44, 55, 67,
+   67, 67, 67, 67, 44, 44, 44, 44, 67, 67, 92, 44, 67, 67, 92, 44,
+   67, 92, 67, 67, 67, 67, 67, 67, 79, 44, 44, 44, 44, 44, 44, 44,
+   65, 65, 65, 65, 65, 65, 65, 65,171,171,171,171,171,171,171, 44,
+  171,171,171,171,171,171,171,  0,  0,  0, 29, 21, 21, 21, 23, 21,
    22, 18, 21, 25, 21, 17, 13, 13, 25, 25, 25, 21, 21,  9,  9,  9,
     9, 22, 21, 18, 24, 16, 24,  5,  5,  5,  5, 22, 25, 18, 25,  0,
    23, 23, 26, 21, 24, 26,  7, 20, 25,  1, 26, 24, 26, 25, 15, 15,
@@ -4280,627 +4348,643 @@ _hb_ucd_u8[17508] =
     2,  2,  6,  5,  9, 21,  9,  2,  2,  9, 25,  9, 26, 12, 11, 11,
     2,  6,  5, 21, 17,  2,  2, 26, 26, 23,  2, 12, 17, 12, 21, 12,
    12, 21,  7,  2,  2,  7,  7, 21, 21,  2,  1,  1, 21, 23, 26, 26,
-    1,  2,  6,  7,  7, 12, 12,  7, 21,  7, 12,  1, 12,  6,  6, 12,
-   12, 26,  7, 26, 26,  7,  2,  1, 12,  2,  6,  2,  1, 12, 12, 10,
-   10, 10, 10, 12, 21,  6,  2, 10, 10,  2, 15, 26, 26,  2,  2, 21,
-    7, 10, 15,  7,  2, 23, 21, 26, 10,  7, 21, 15, 15,  2, 17,  7,
-   29,  7,  7, 22, 18,  2, 14, 14, 14,  7, 17, 21,  7,  6, 11, 12,
-    5,  2,  5,  6,  8,  8,  8, 24,  5, 24,  2, 24,  9, 24, 24,  2,
-   29, 29, 29,  1, 17, 17, 20, 19, 22, 20, 27, 28,  1, 29, 21, 20,
-   19, 21, 21, 16, 16, 21, 25, 22, 18, 21, 21, 29, 15,  6, 18,  6,
-   12, 11,  9, 26, 26,  9, 26,  5,  5, 26, 14,  9,  5, 14, 14, 15,
-   25, 26, 26, 22, 18, 26, 18, 25, 18, 22,  5, 12,  2,  5, 22, 21,
-   26,  6,  7, 14, 17, 22, 18, 18, 26, 14, 17,  6, 14,  6, 12, 24,
-   24,  6, 26, 15,  6, 21, 11, 21, 24,  9, 23, 26, 10, 21,  6, 10,
-    4,  4,  3,  3,  7, 25, 21, 22, 17, 16, 16, 22, 16, 16, 25, 17,
-   25,  2, 25, 24, 23,  2,  2, 15, 12, 15, 14,  2, 21, 14,  7, 15,
-   12, 17, 21,  1, 26, 10, 10,  1, 23, 15,  0,  1,  2,  3,  4,  5,
-    6,  7,  8,  9,  0, 10, 11, 12, 13,  0, 14,  0,  0,  0,  0,  0,
-   15,  0, 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 17, 18, 19,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0, 20,  0, 21, 22, 23,  0,  0,  0, 24,
-   25, 26, 27, 28, 29, 30, 31, 32, 33,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 34,
-    0, 35,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0, 36,  0,  0,  0,  0,  0,  0,  0,
-    0,  0, 37, 38,  0,  0,  0,  0,  0,  0, 39, 40,  0,  0, 41,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  3,  4,  0,  0,  0,  0,
-    0,  0,  0,  0,  5,  0,  0,  0,  0,  0,  0,  0,  6,  7,  8,  0,
-    9,  0, 10, 11,  0,  0, 12, 13, 14, 15, 16,  0,  0,  0,  0, 17,
-   18, 19, 20,  0,  0,  0, 21, 22,  0, 23, 24,  0,  0, 23, 25, 26,
-    0, 23, 25,  0,  0, 23, 25,  0,  0, 23, 25,  0,  0,  0, 25,  0,
-    0,  0, 27,  0,  0, 23, 25,  0,  0, 28, 25,  0,  0,  0, 29,  0,
-    0, 30, 31,  0,  0, 32, 33,  0, 34, 35,  0, 36, 37,  0, 38,  0,
-    0, 39,  0,  0, 40,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 41,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0, 42, 42,  0,  0,  0,  0, 43,  0,
-    0,  0,  0,  0,  0, 44,  0,  0,  0, 45,  0,  0,  0,  0,  0,  0,
-   46,  0,  0, 47,  0, 48, 49,  0,  0, 50, 51, 52,  0, 53,  0, 54,
-    0, 55,  0,  0,  0,  0, 56, 57,  0,  0,  0,  0,  0,  0, 58, 59,
-    0,  0,  0,  0,  0,  0, 60, 61,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0, 62,  0,  0,  0, 63,  0,  0,  0, 64,
-    0, 65,  0,  0, 66,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0, 67, 68,  0,  0, 69,  0,  0,  0,  0,  0,  0,  0,  0,
-   70, 71,  0,  0,  0,  0, 51, 72,  0, 73, 74,  0,  0, 75, 76,  0,
-    0,  0,  0,  0,  0, 77, 78, 79,  0,  0,  0,  0,  0,  0,  0, 25,
-    0,  0,  0,  0,  0,  0,  0,  0, 80,  0,  0,  0,  0,  0,  0,  0,
-    0, 81,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 82,
-    0,  0,  0,  0,  0,  0,  0, 49,  0,  0,  0, 83,  0,  0,  0,  0,
-   84, 85,  0,  0,  0,  0,  0, 86,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0, 87,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0, 88,  0,  0,  0,  0, 89,  0,  0,  0,  0,  0,
-    0,  0, 70, 63,  0, 90,  0,  0, 91, 92,  0, 75,  0,  0, 93,  0,
-    0, 94,  0,  0,  0,  0,  0, 95,  0, 96, 25, 97,  0,  0,  0,  0,
-    0,  0, 98,  0,  0,  0, 99,  0,  0,  0,  0,  0,  0, 63,100,  0,
-    0, 63,  0,  0,  0,101,  0,  0,  0,102,  0,  0,  0,  0,  0,  0,
-    0, 90,  0,  0,  0,  0,  0,  0,  0,103,104,  0,  0,  0,  0, 76,
-    0, 42,105,  0,106,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0, 63,  0,  0,  0,  0,  0,  0,  0,  0,107,  0,108,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,109,  0,110,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,111,
-    0,  0,  0,  0,112,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,113,114,115,  0,  0,
-    0,  0,116,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-  117,118,  0,  0,  0,  0,  0,  0,  0,110,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,119,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,120,  0,  0,  0,121,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  2,  3,  4,
-    5,  6,  7,  4,  4,  8,  9, 10,  1, 11, 12, 13, 14, 15, 16, 17,
-   18,  1,  1,  1,  0,  0,  0,  0, 19,  1,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0, 20, 21, 22,  1, 23,  4, 21, 24, 25, 26, 27, 28,
-   29, 30,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1, 31,  0,
-    0,  0, 32, 33, 34, 35,  1, 36,  0,  0,  0,  0, 37,  0,  0,  0,
-    0,  0,  0,  0,  0, 38,  1, 39, 14, 39, 40, 41,  0,  0,  0,  0,
-    0,  0,  0,  0, 42,  0,  0,  0,  0,  0,  0,  0, 43, 36, 44, 45,
-   21, 45, 46,  0,  0,  0,  0,  0,  0,  0, 19,  1, 21,  0,  0, 47,
-    0,  0,  0,  0,  0, 38, 48,  1,  1, 49, 49, 50,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0, 51,  0,  0,  0,  0,  0, 52,  1,  1,  1,
-   53, 21, 43, 54, 55, 21, 35,  1,  0,  0,  0,  0,  0,  0,  0, 56,
-    0,  0,  0, 57, 58, 59,  0,  0,  0,  0,  0, 57,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0, 60,  0,  0,  0, 57,  0, 61,  0,  0,
-    0,  0,  0,  0,  0,  0, 62, 63,  0,  0, 64,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0, 65,  0,  0,  0, 66,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0, 67,  0,  0,  0, 68,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0, 69,  0,  0,  0,  0,  0,  0, 70, 71,  0,
-    0,  0,  0,  0, 72, 73, 74, 75, 76, 77,  0,  0,  0,  0,  0,  0,
-    0, 78,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 79, 80,  0,
+    1, 21,  6,  7,  7, 12, 12,  7, 21,  7, 12,  1, 12,  6,  6, 12,
+   12, 26,  7, 26, 26,  7,  2,  1, 12,  2,  6,  2, 24,  7,  7,  6,
+    1, 12, 12, 10, 10, 10, 10, 12, 21,  6,  2, 10, 10,  2, 15, 26,
+   26,  2,  2, 21,  7, 10, 15,  7,  2, 23, 21, 26, 10,  7, 21, 15,
+   15,  2, 17,  7, 29,  7,  7, 22, 18,  2, 14, 14, 14,  7, 10, 21,
+   17, 21, 11, 12,  5,  2,  5,  6,  8,  8,  8, 24,  5, 24,  2, 24,
+    9, 24, 24,  2, 29, 29, 29,  1, 17, 17, 20, 19, 22, 20, 27, 28,
+    1, 29, 21, 20, 19, 21, 21, 16, 16, 21, 25, 22, 18, 21, 21, 29,
+    1,  2, 15,  6, 18,  6, 23,  2, 12, 11,  9, 26, 26,  9, 26,  5,
+    5, 26, 14,  9,  5, 14, 14, 15, 25, 26, 26, 22, 18, 26, 18, 25,
+   18, 22,  5, 12,  2,  5, 22, 21, 21, 22, 18, 17, 26,  6,  7, 14,
+   17, 22, 18, 18, 26, 14, 17,  6, 14,  6, 12, 24, 24,  6, 26, 15,
+    6, 21, 11, 21, 24,  9,  6,  9, 23, 26,  6, 10,  4,  4,  3,  3,
+    7, 25, 17, 16, 16, 22, 16, 16, 25, 17, 25,  2, 25, 24,  2, 15,
+   12, 15, 14,  2, 21, 14,  7, 15, 12, 17, 21,  1, 26, 10, 10,  1,
+   23, 15,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  0, 10, 11, 12,
+   13,  0, 14,  0,  0,  0,  0,  0, 15,  0, 16,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0, 17, 18, 19,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 20,
+    0, 21, 22, 23,  0,  0,  0, 24, 25, 26, 27, 28, 29, 30, 31, 32,
+   33,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0, 34,  0, 35,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+   36,  0,  0,  0,  0,  0,  0,  0,  0,  0, 37, 38,  0,  0,  0,  0,
+    0,  0, 39, 40,  0,  0, 41,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    1,  2,  3,  4,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  0,  0,
+    0,  0,  0,  0,  6,  7,  8,  0,  9,  0, 10, 11,  0,  0, 12, 13,
+   14, 15, 16,  0,  0,  0,  0, 17, 18, 19, 20,  0, 21,  0, 22, 23,
+    0, 24, 25,  0,  0, 24, 26, 27,  0, 24, 26,  0,  0, 24, 26,  0,
+    0, 24, 26,  0,  0,  0, 26,  0,  0, 24, 28,  0,  0, 24, 26,  0,
+    0, 29, 26,  0,  0,  0, 30,  0,  0, 31, 32,  0,  0, 33, 34,  0,
+   35, 36,  0, 37, 38,  0, 39,  0,  0, 40,  0,  0, 41,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0, 42,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+   43, 44,  0,  0,  0,  0, 45,  0,  0,  0,  0,  0,  0, 46,  0,  0,
+    0, 47,  0,  0,  0,  0,  0,  0, 48,  0,  0, 49,  0, 50, 51,  0,
+    0, 52, 53, 54,  0, 55,  0, 56,  0, 57,  0,  0,  0,  0, 58, 59,
+    0,  0,  0,  0,  0,  0, 60, 61,  0,  0,  0,  0,  0,  0, 62, 63,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 64,
+    0,  0,  0, 65,  0,  0,  0, 66,  0, 67,  0,  0, 68,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 69, 70,  0,  0, 71,
+    0,  0,  0,  0,  0,  0,  0,  0, 72, 73,  0,  0,  0,  0, 53, 74,
+    0, 75, 76,  0,  0, 77, 78,  0,  0,  0,  0,  0,  0, 79, 80, 81,
+    0,  0,  0,  0,  0,  0,  0, 26,  0,  0,  0,  0,  0,  0,  0,  0,
+   82,  0,  0,  0,  0,  0,  0,  0,  0, 83,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0, 85,
+    0,  0,  0, 86,  0,  0,  0,  0, 87, 88,  0,  0,  0,  0,  0, 89,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0, 90,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0,  0,
+    0,  0, 92,  0, 93,  0,  0,  0,  0,  0, 72, 94,  0, 95,  0,  0,
+   96, 97,  0, 77,  0,  0, 98,  0,  0, 99,  0,  0,  0,  0,  0,100,
+    0,101, 26,102,  0,  0,  0,  0,  0,  0,103,  0,  0,  0,104,  0,
+    0,  0,  0,  0,  0, 65,105,  0,  0, 65,  0,  0,  0,106,  0,  0,
+    0,107,  0,  0,  0,  0,  0,  0,  0, 95,  0,  0,  0,  0,  0,  0,
+    0,108,109,  0,  0,  0,  0, 78,  0, 44,110,  0,111,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0,  0,  0,  0,  0,  0,
+    0,  0,112,  0,113,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,114,
+    0,115,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,116,  0,  0,  0,  0,117,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,118,119,120,  0,  0,  0,  0,121,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,122,123,  0,  0,  0,  0,  0,  0,
+    0,115,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,124,  0,125,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,126,  0,
+    0,  0,127,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    1,  1,  1,  1,  1,  2,  3,  4,  5,  6,  7,  4,  4,  8,  9, 10,
+    1, 11, 12, 13, 14, 15, 16, 17, 18,  1,  1,  1,  0,  0,  0,  0,
+   19,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 20, 21, 22,  1,
+   23,  4, 21, 24, 25, 26, 27, 28, 29, 30,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  1,  1, 31,  0,  0,  0, 32, 33, 34, 35,  1, 36,
+    0,  0,  0,  0, 37,  0,  0,  0,  0,  0,  0,  0,  0, 38,  1, 39,
+   14, 39, 40, 41,  0,  0,  0,  0,  0,  0,  0,  0, 42,  0,  0,  0,
+    0,  0,  0,  0, 43, 36, 44, 45, 21, 45, 46,  0,  0,  0,  0,  0,
+    0,  0, 19,  1, 21,  0,  0, 47,  0,  0,  0,  0,  0, 38, 48,  1,
+    1, 49, 49, 50,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 51,  0,
+    0,  0,  0,  0,  0,  0, 52,  1,  0,  0, 38, 14,  4,  1,  1,  1,
+   53, 21, 43, 52, 54, 21, 35,  1,  0,  0,  0,  0,  0,  0,  0, 55,
+    0,  0,  0, 56, 57, 58,  0,  0,  0,  0,  0, 56,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0, 59,  0,  0,  0, 56,  0, 60,  0,  0,
+    0,  0,  0,  0,  0,  0, 61, 62,  0,  0, 63,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0, 64,  0,  0,  0, 65,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0, 66,  0,  0,  0, 67,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0, 68,  0,  0,  0,  0,  0,  0, 69, 70,  0,
+    0,  0,  0,  0, 71, 72, 73, 74, 75, 76,  0,  0,  0,  0,  0,  0,
+    0, 77,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 78, 79,  0,
     0,  0,  0, 47,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 49,
-    0,  0,  0,  0,  0, 63,  0,  0,  0,  0,  0,  0, 64,  0,  0, 81,
-    0,  0, 82,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 83,  0,
-    0,  0,  0,  0,  0, 19, 84,  0, 63,  0,  0,  0,  0, 49,  1, 85,
-    0,  0,  0,  0,  1, 54, 15, 86, 84,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0, 56,  0,  0,  0, 63,  0,  0,  0,  0,  0,  0,
-    0,  0, 19, 10,  1,  0,  0,  0,  0,  0, 87,  0,  0,  0,  0,  0,
-    0, 88,  0,  0, 87,  0,  0,  0,  0,  0,  0,  0,  0, 79,  0,  0,
-    0,  0,  0,  0, 89,  9, 12,  4, 90,  8, 91, 47,  0, 59, 50,  0,
-   21,  1, 21, 92, 93,  1,  1,  1,  1,  1,  1,  1,  1, 94, 95, 96,
-    0,  0,  0,  0, 97,  1, 98, 59, 81, 99,100,  4, 59,  0,  0,  0,
-    0,  0,  0, 19, 50,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 62,
-    1,  1,  1,  1,  1,  1,  1,  1,  0,  0,101,102,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,103,  0,  0,  0,  0, 19,  0,  1,  1, 50,
-    0,  0,  0,  0,  0,  0,  0, 38,  0,  0,  0,  0, 50,  0,  0,  0,
-    0, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0, 63,  0,  0,  0,  0,
-    1,  1,  1,  1, 50,  0,  0,  0,  0,  0, 52, 69,  0,  0,  0,  0,
-    0,  0,  0,  0, 62,  0,  0,  0,  0,  0,  0,  0, 79,  0,  0,  0,
-   63,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,104,105, 59, 38,
-   81,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 64,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,106,  1, 14,  4, 12,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0, 47,  0,  0,  0,  0,  0, 38, 89,  0,
-    0,  0,  0,107,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,108, 62,
-    0,109,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,
-    0,  0, 19, 59,  0,  0,  0,  0,  0,110, 14, 54, 84,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,111,  0, 89,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0, 62, 63,  0,  0, 63,  0, 88,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,111,  0,  0,  0,  0,112,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0, 79, 56,  0, 38,  1, 59,  1, 59,  0,  0,
-   64, 88,  0,  0,  0,  0,  0, 60,113,  0,  0,  0,  0,  0,  0,  0,
-   56,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,113,  0,  0,
-    0,  0, 62,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 80,
-   79,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0, 57,  0, 88,114,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0, 62,  0,  0,  0,  0,  0,  0,  8, 91,  0,  0,
-    0,  0,  0,  0,  1, 89,  0,  0,  0,  0,  0,  0,115,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,116,  0,117,118,119,120,  0, 52,  4,
-  121, 49, 23,  0,  0,  0,  0,  0,  0,  0, 38, 50,  0,  0,  0,  0,
-   38, 59,  0,  0,  0,  0,  0,  0,  1, 89,  1,  1,  1,  1, 39,  1,
-   48,104, 89,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,
-    0,  0,  0,  0,  4,121,  0,  0,  0,  1,122,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,230,230,230,230,230,232,220,220,220,220,232,216,
-  220,220,220,220,220,202,202,220,220,220,220,202,202,220,220,220,
-    1,  1,  1,  1,  1,220,220,220,220,230,230,230,230,240,230,220,
-  220,220,230,230,230,220,220,  0,230,230,230,220,220,220,220,230,
-  232,220,220,230,233,234,234,233,234,234,233,230,  0,  0,  0,230,
-    0,220,230,230,230,230,220,230,230,230,222,220,230,230,220,220,
-  230,222,228,230, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20,
-   21, 22,  0, 23,  0, 24, 25,  0,230,220,  0, 18, 30, 31, 32,  0,
-    0,  0,  0, 27, 28, 29, 30, 31, 32, 33, 34,230,230,220,220,230,
-  220,230,230,220, 35,  0,  0,  0,  0,  0,230,230,230,  0,  0,230,
-  230,  0,220,230,230,220,  0,  0,  0, 36,  0,  0,230,220,230,230,
-  220,220,230,220,220,230,220,230,220,230,230,  0,  0,220,  0,  0,
-  230,230,  0,230,  0,230,230,230,230,230,  0,  0,  0,220,220,220,
-    0,  0,  0,220,230,230,  0,220,230,220,220,220, 27, 28, 29,230,
-    7,  0,  0,  0,  0,  9,  0,  0,  0,230,220,230,230,  0,  0,  0,
-    0,  0,230,  0,  0, 84, 91,  0,  0,  0,  0,  9,  9,  0,  0,  0,
-    0,  0,  9,  0,103,103,  9,  0,107,107,107,107,118,118,  9,  0,
-  122,122,122,122,220,220,  0,  0,  0,220,  0,220,  0,216,  0,  0,
-    0,129,130,  0,132,  0,  0,  0,  0,  0,130,130,130,130,  0,  0,
-  130,  0,230,230,  9,  0,230,230,  0,  0,220,  0,  0,  0,  0,  7,
-    0,  9,  9,  0,  0,230,  0,  0,  0,228,  0,  0,  0,222,230,220,
-  220,  0,  0,  0,230,  0,  0,220,230,220,  0,220,  0,  0,  9,  9,
-    0,  0,  7,  0,230,230,230,  0,230,  0,  1,  1,  1,  0,  0,  0,
-  230,234,214,220,202,230,230,230,230,230,232,228,228,220,  0,230,
-  233,220,230,220,230,230,  1,  1,  1,  1,  1,230,  0,  1,  1,230,
-  220,230,  1,  1,  0,  0,218,228,232,222,224,224,  0,  8,  8,  0,
-  230,  0,230,230,220,  0,  0,230,  0,  0, 26,  0,  0,220,  0,230,
-  230,  1,220,  0,  0,230,220,  0,  0,  0,220,220,  0,  9,  7,  0,
-    0,  7,  9,  0,  0,  0,  9,  7,  9,  9,  0,  0,  6,  6,  0,  0,
-    0,  0,  1,  0,  0,216,216,  1,  1,  1,  0,  0,  0,226,216,216,
-  216,216,216,  0,220,220,220,  0,230,230,  7,  0, 16, 17, 17, 17,
-   17, 17, 17, 33, 17, 17, 17, 19, 17, 17, 17, 17, 20,101, 17,113,
-  129,169, 17, 27, 28, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+    0,  0,  0,  0,  0, 80,  0,  0,  0,  0,  0,  0,  0, 62,  0,  0,
+    0,  0,  0,  0, 63,  0,  0, 81,  0,  0, 82,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0, 83,  0,  0,  0,  0,  0,  0, 19, 84,  0,
+   62,  0,  0,  0,  0, 49,  1, 85,  0,  0,  0,  0,  1, 52, 15, 86,
+   36, 10, 21, 87,  0,  0,  0,  0,  0,  0,  0,  0,  0, 55,  0,  0,
+    0, 62,  0,  0,  0,  0,  0,  0,  0,  0, 19, 10,  1,  0,  0,  0,
+    0,  0, 88,  0,  0,  0,  0,  0,  0, 89,  0,  0, 88,  0,  0,  0,
+    0,  0,  0,  0,  0, 78,  0,  0,  0,  0,  0,  0, 87,  9, 12,  4,
+   90,  8, 91, 47,  0, 58, 50,  0, 21,  1, 21, 92, 93,  1,  1,  1,
+    1,  1,  1,  1,  1, 94, 95, 96,  0,  0,  0,  0, 97,  1, 98, 58,
+   81, 99,100,  4, 58,  0,  0,  0,  0,  0,  0, 19, 50,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0, 61,  1,  1,  1,  1,  1,  1,  1,  1,
+    0,  0,101,102,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,103,  0,
+    0,  0,  0, 19,  0,  1,  1, 50,  0,  0,  0,  0,  0,  0,  0, 38,
+    0,  0,  0,  0, 50,  0,  0,  0,  0, 63,  0,  0,  0,  0,  0,  0,
+    0,  0,  0, 62,  0,  0,  0,  0,  1,  1,  1,  1, 50,  0,  0,  0,
+    0,  0,104, 68,  0,  0,  0,  0,  0,  0,  0,  0, 61,  0,  0,  0,
+    0,  0,  0,  0, 78,  0,  0,  0, 62,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,105,106, 58, 38, 81,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0, 63,  0,  0,  0,  0,  0,  0,  0,  0,  0,107,
+    1, 14,  4, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 47,
+   84,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 38, 87,  0,
+    0,  0,  0,108,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,109, 61,
+    0,110,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,
+    0,  0, 19, 58,  0,  0,  0,  0,  0,111, 14, 52, 84,  0,  0,  0,
+  112, 41,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0,  0, 61,
+    0,  0,  0,  0,  0,  0,113,  0, 87,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0, 61, 62,  0,  0, 62,  0, 89,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,113,  0,  0,  0,  0,114,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0, 78, 55,  0, 38,  1, 58,  1, 58,  0,  0,
+   63, 89,  0,  0,  0,  0,  0, 59,115,  0,  0,  0,  0,  0,  0,  0,
+   55,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,115,  0,  0,
+    0,  0, 61,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 79,
+   78,  0,  0,  0,  0,  0,  0,  0,  0, 61,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0, 56,  0, 89, 80,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0, 61,  0,  0,  0,  0,  0,  0,  8, 91,  0,  0,
+    0,  0,  0,  0,  1, 87,  0,  0,  0,  0,  0,  0,116,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,117,  0,118,119,120,121,  0,104,  4,
+  122, 49, 23,  0,  0,  0,  0,  0,  0,  0, 38, 50,  0,  0,  0,  0,
+   38, 58,  0,  0,  0,  0,  0,  0,  1, 87,  1,  1,  1,  1, 39,  1,
+   48,105, 87,  0,  0,  0,  0,  0,  0,  0,  0, 59,  0,  0,  0,  0,
+    0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  4,122,  0,  0,
+    0,  1,123,  0,  0,  0,  0,  0,  0,  0,  0,  0,230,230,230,230,
+  230,232,220,220,220,220,232,216,220,220,220,220,220,202,202,220,
+  220,220,220,202,202,220,220,220,  1,  1,  1,  1,  1,220,220,220,
+  220,230,230,230,230,240,230,220,220,220,230,230,230,220,220,  0,
+  230,230,230,220,220,220,220,230,232,220,220,230,233,234,234,233,
+  234,234,233,230,  0,  0,  0,230,  0,220,230,230,230,230,220,230,
+  230,230,222,220,230,230,220,220,230,222,228,230, 10, 11, 12, 13,
+   14, 15, 16, 17, 18, 19, 19, 20, 21, 22,  0, 23,  0, 24, 25,  0,
+  230,220,  0, 18, 30, 31, 32,  0,  0,  0,  0, 27, 28, 29, 30, 31,
+   32, 33, 34,230,230,220,220,230,220,230,230,220, 35,  0,  0,  0,
+    0,  0,230,230,230,  0,  0,230,230,  0,220,230,230,220,  0,  0,
+    0, 36,  0,  0,230,220,230,230,220,220,230,220,220,230,220,230,
+  220,230,230,  0,  0,220,  0,  0,230,230,  0,230,  0,230,230,230,
+  230,230,  0,  0,  0,220,220,220,230,220,220,220,230,230,  0,220,
+   27, 28, 29,230,  7,  0,  0,  0,  0,  9,  0,  0,  0,230,220,230,
+  230,  0,  0,  0,  0,  0,230,  0,  0, 84, 91,  0,  0,  0,  0,  9,
+    9,  0,  0,  0,  0,  0,  9,  0,103,103,  9,  0,107,107,107,107,
+  118,118,  9,  0,122,122,122,122,220,220,  0,  0,  0,220,  0,220,
+    0,216,  0,  0,  0,129,130,  0,132,  0,  0,  0,  0,  0,130,130,
+  130,130,  0,  0,130,  0,230,230,  9,  0,230,230,  0,  0,220,  0,
+    0,  0,  0,  7,  0,  9,  9,  0,  9,  9,  0,  0,  0,230,  0,  0,
+    0,228,  0,  0,  0,222,230,220,220,  0,  0,  0,230,  0,  0,220,
+  230,220,  0,220,230,230,230,  0,  0,  0,  9,  9,  0,  0,  7,  0,
+  230,  0,  1,  1,  1,  0,  0,  0,230,234,214,220,202,230,230,230,
+  230,230,232,228,228,220,218,230,233,220,230,220,230,230,  1,  1,
+    1,  1,  1,230,  0,  1,  1,230,220,230,  1,  1,  0,  0,218,228,
+  232,222,224,224,  0,  8,  8,  0,  0,  0,  0,220,230,  0,230,230,
+  220,  0,  0,230,  0,  0, 26,  0,  0,220,  0,230,230,  1,220,  0,
+    0,230,220,  0,  0,  0,220,220,  0,  0,230,220,  0,  9,  7,  0,
+    0,  7,  9,  0,  0,  0,  9,  7,  6,  6,  0,  0,  0,  0,  1,  0,
+    0,216,216,  1,  1,  1,  0,  0,  0,226,216,216,216,216,216,  0,
+  220,220,220,  0,230,230,  7,  0, 16, 17, 17, 17, 17, 17, 17, 33,
+   17, 17, 17, 19, 17, 17, 17, 17, 20,101, 17,113,129,169, 17, 27,
+   28, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
-   17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,237,  0,  1,  2,  2,
-    0,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  0,  0,  0,  6,  7,  8,
-    9,  0,  0,  0, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,  0,  0,
-    0,  0,  0,  0,  0,  0,  0, 20,  0,  0, 21, 22,  0,  0,  0,  0,
-   23, 24, 25, 26,  0, 27,  0, 28, 29, 30, 31, 32,  0,  0,  0,  0,
-    0,  0,  0, 33, 34, 35,  0,  0,  0,  0,  0,  0, 36,  0,  0,  0,
-    0,  0,  0,  0,  0,  0, 37, 38,  0,  0,  0,  0,  1,  2, 39, 40,
-    0,  1,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,
-    0,  0,  0,  2,  0,  0,  0,  0,  0,  0,  3,  4,  0,  0,  5,  0,
-    0,  0,  6,  0,  0,  0,  0,  0,  0,  0,  7,  1,  0,  0,  0,  0,
-    0,  0,  8,  9,  0,  0,  0,  0,  0,  0, 10,  0,  0, 10,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10,  0,  0,  0, 10,
-    0,  0,  0,  0,  0,  0, 11, 12,  0, 13,  0, 14, 15, 16,  0,  0,
-    0,  0,  0,  1, 17, 18,  0, 19,  7,  1,  0,  0,  0, 20, 20,  7,
-   20, 20, 20, 20, 20, 20, 20,  8, 21,  0, 22,  0,  7, 23, 24,  0,
-   20, 20, 25,  0,  0,  0, 26, 27,  1,  7, 20, 20, 20, 20, 20,  1,
-   28, 29, 30, 31,  0,  0, 20,  0,  0,  0,  0,  0,  0,  0, 10,  0,
-    0,  0,  0,  0,  0,  0, 20, 20, 20,  1,  0,  0,  8, 21, 32,  4,
-    0, 10,  0, 33,  7, 20, 20, 20,  0,  0,  0,  0,  8, 34, 34, 35,
-   36, 34, 37,  0, 38,  1, 20, 20,  0,  0, 39,  0,  1,  1,  0,  8,
-   21,  1, 20,  0,  0,  0,  1,  0,  0, 40,  1,  1,  0,  0,  8, 21,
-    0,  1,  0,  1,  0,  1,  0,  0,  0,  0, 26, 34, 34, 34, 34, 34,
-   34, 34, 34, 34, 21,  7, 20, 41, 34, 34, 34, 34, 34, 34, 34, 34,
-   34, 21,  0, 42, 43, 44,  0, 45,  0,  8, 21,  0,  0,  0,  0,  0,
-    0,  0,  0, 46,  7,  1, 10,  1,  0,  0,  0,  1, 20, 20,  1,  0,
-    0,  0,  0,  0,  0,  0, 20, 20,  1, 20, 20,  0,  0,  0,  0,  0,
-    0,  0, 26, 21,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  3, 47, 48,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  3,
-    4,  5,  6,  7,  7,  8,  7,  7,  7,  7,  7,  7,  7,  7,  7,  9,
-   10, 11, 12, 12, 12, 12, 13, 14, 14, 14, 14, 15, 16, 17, 18, 19,
-   20, 14, 21, 14, 22, 14, 14, 14, 14, 23, 24, 24, 25, 26, 14, 14,
-   14, 14, 27, 28, 14, 14, 29, 30, 31, 32, 33, 34,  7,  7,  7,  7,
+   17, 17, 17, 17, 17, 17, 17,237,  0,  1,  2,  2,  0,  3,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  5,  0,  0,  0,  0,  6,  7,  8,  9,  0,  0,  0,
+   10, 11, 12, 13, 14, 15, 16, 17, 18, 19,  0,  0,  0,  0,  0,  0,
+    0,  0,  0, 20,  0,  0, 21, 22,  0,  0,  0,  0, 23, 24, 25, 26,
+    0, 27,  0, 28, 29, 30, 31, 32,  0,  0,  0,  0,  0,  0,  0, 33,
+   34, 35, 36,  0,  0,  0,  0,  0, 37,  0,  0,  0,  0,  0,  0,  0,
+    0,  0, 38, 39,  0,  0,  0,  0,  1,  2, 40, 41,  0,  1,  2,  2,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  2,
+    0,  0,  0,  0,  0,  0,  3,  4,  0,  0,  5,  0,  0,  0,  6,  0,
+    0,  0,  0,  0,  0,  0,  7,  1,  0,  0,  0,  0,  0,  0,  8,  9,
+    0,  0,  0,  0,  0,  0, 10,  0,  0, 10,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0, 10,  0,  0,  0, 10,  0,  0,  0,  0,
+    0,  0, 11, 12,  0, 13,  0, 14, 15, 16,  0,  0,  0,  0,  0,  1,
+   17, 18,  0, 19,  7,  1,  0,  0,  0, 20, 20,  7, 20, 20, 20, 20,
+   20, 20, 20,  8, 21,  0, 22,  0,  7, 23, 24,  0, 20, 20, 25,  0,
+    0,  0, 26, 27,  1,  7, 20, 20, 20, 20, 20,  1, 28, 29, 30, 31,
+    0,  0, 20,  0,  0,  0,  0,  0,  0,  0, 10,  0,  0,  0,  0,  0,
+    0,  0, 20, 20, 20,  1,  0,  0,  8, 21, 32,  4,  0, 10,  0, 33,
+    7, 20, 20, 20,  0,  0,  0,  0,  8, 34, 34, 35, 36, 34, 37,  0,
+   38,  1, 20, 20,  0,  0, 39,  0,  1,  1,  0,  8, 21,  1, 20,  0,
+    0,  0,  1,  0,  0, 40,  1,  1,  0,  0,  8, 21,  0,  1,  0,  1,
+    0,  1,  0,  0,  0,  0, 26, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   21,  7, 20, 41, 34, 34, 34, 34, 34, 34, 34, 34, 34, 21,  0, 42,
+   43, 44,  0, 45,  0,  8, 21,  0,  0,  0,  0,  0,  0,  0,  0, 46,
+    7,  1, 10,  1,  0,  0,  0,  1, 20, 20,  1,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0, 26, 34,  9,  0,  0, 20, 20,  1, 20, 20,  0,
+    0,  0,  0,  0,  0,  0, 26, 21,  0,  1,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  3, 47, 48,  0,  0,  0,  0,  0,  0,  0,
+    0,  1,  2,  3,  4,  5,  6,  7,  7,  8,  7,  7,  7,  7,  7,  7,
+    7,  7,  7,  7,  9, 10, 11, 11, 11, 11, 12, 13, 13, 13, 13, 14,
+   15, 16, 17, 18, 19, 20, 21, 13, 22, 13, 13, 13, 13, 23, 24, 24,
+   25, 26, 13, 13, 13, 27, 28, 29, 13, 30, 31, 32, 33, 34, 35, 36,
     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-   35,  7, 36, 37,  7, 38,  7,  7,  7, 39, 14, 40,  7,  7, 41, 14,
-   14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-   14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-   14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-   14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-   14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-   14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-   14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-   14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-   14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-   14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-   14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-   14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-   14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-   14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-   14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-   14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-   14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-   14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-   14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-   14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-   14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-   14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 42,  0,  0,  1,
-    2,  2,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
-   16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
-   32, 32, 33, 34, 35, 36, 37, 37, 37, 37, 37, 38, 39, 40, 41, 42,
-   43, 44, 45, 46, 47, 48, 49, 50, 51, 52,  2,  2, 53, 54, 55, 56,
-   57, 58, 59, 59, 59, 59, 60, 59, 59, 59, 59, 59, 59, 59, 61, 61,
-   59, 59, 59, 59, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
-   74, 75, 76, 77, 78, 59, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
-   70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
-   70, 70, 70, 70, 70, 70, 70, 70, 70, 79, 70, 70, 70, 70, 70, 70,
-   70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 80, 81, 81,
-   81, 81, 81, 81, 81, 81, 81, 82, 83, 83, 84, 85, 86, 87, 88, 89,
-   90, 91, 92, 93, 94, 95, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
-   32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
-   32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 96, 97, 97,
-   97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97,
-   70, 70, 98, 99,100,101,102,102,103,104,105,106,107,108,109,110,
-  111,112, 97,113,114,115,116,117,118, 97,119,119,120, 97,121,122,
-  123,124,125,126,127,128,129,130,131, 97,132,133,134,135,136,137,
-  138,139,140,141,142, 97,143,144, 97,145,146,147,148, 97,149,150,
-  151,152,153,154, 97, 97,155,156,157,158, 97,159, 97,160,161,161,
-  161,161,161,161,161,162,163,161,164, 97, 97, 97, 97, 97,165,165,
-  165,165,165,165,165,165,166, 97, 97, 97, 97, 97, 97, 97, 97, 97,
-   97, 97, 97, 97, 97, 97,167,167,167,167,168, 97, 97, 97,169,169,
-  169,169,170,171,172,173, 97, 97, 97, 97,174,175,176,177,178,178,
-  178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,
-  178,178,178,178,178,178,178,178,178,178,178,178,178,179,178,178,
-  178,178,178,178,180,180,180,181,182, 97, 97, 97, 97, 97,183,184,
-  185,186,186,187, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97,
-   97, 97, 97, 97, 97, 97,188,189, 97, 97, 97, 97, 97, 97, 59,190,
-  191,192,193,194,195, 97,196,197,198, 59, 59,199, 59,200,201,201,
-  201,201,201,202, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97,203, 97,
-  204, 97, 97,205, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97,206,207,
-  208, 97, 97, 97, 97, 97,209,210,211, 97,212,213, 97, 97,214,215,
-   59,216,217, 97, 59, 59, 59, 59, 59, 59, 59,218,219,220,221,222,
-  223,224,225,226, 59,227, 97, 97, 97, 97, 97, 97, 97, 97, 70, 70,
-   70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,228, 70, 70, 70, 70,
-   70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,229, 70,230, 70,
-   70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
-   70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,231, 70, 70, 70, 70,
-   70, 70, 70, 70, 70,232, 97, 97, 97, 97, 97, 97, 97, 97, 70, 70,
-   70, 70,233, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 70, 70,
-   70, 70, 70, 70,234, 97, 97, 97, 97, 97, 97, 97, 97, 97,235, 97,
-  236,237,  0,  1,  2,  2,  0,  1,  2,  2,  2,  3,  4,  5,  0,  0,
-    0,  0,  0,  0,  0,  0,  0, 19, 19, 19, 19, 19, 19, 19, 19, 19,
-   19, 19, 19, 19, 19, 19, 19, 19, 19,  0,  0,  0,  0,  0,  0,  0,
-   19,  0,  0,  0,  0,  0, 19, 19, 19, 19, 19, 19, 19,  0, 19,  0,
-    0,  0,  0,  0,  0,  0, 19, 19, 19, 19, 19,  0,  0,  0,  0,  0,
-   26, 26,  0,  0,  0,  0,  1,  1,  1,  1,  1,  1,  1,  1,  9,  9,
-    9,  9,  0,  9,  9,  9,  2,  2,  9,  9,  9,  9,  0,  9,  2,  2,
-    2,  2,  9,  0,  9,  0,  9,  9,  9,  2,  9,  2,  9,  9,  9,  9,
-    9,  9,  9,  9,  9,  9,  9,  9,  2,  9,  9,  9,  9,  9,  9,  9,
-   55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,  6,  6,
-    6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  1,  1,  6,  2,  4,
-    4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-    4,  4,  4,  4,  4,  2,  4,  4,  4,  2,  2,  4,  4,  4,  2, 14,
-   14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  2,  2,
-    2,  2,  2,  2,  2,  2, 14, 14, 14,  2,  2,  2,  2, 14, 14, 14,
-   14, 14, 14,  2,  2,  2,  3,  3,  3,  3,  3,  0,  3,  3,  3,  3,
-    3,  3,  0,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-    3,  0,  3,  2,  3,  0,  0,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-    3,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  3,  3,  1,  3,
-    3,  3,  3,  3,  3,  3, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
-   37, 37, 37, 37,  2, 37, 37, 37, 37,  2,  2, 37, 37, 37, 38, 38,
-   38, 38, 38, 38, 38, 38, 38, 38,  2,  2,  2,  2,  2,  2, 64, 64,
-   64, 64, 64, 64, 64, 64, 64, 64, 64,  2,  2, 64, 64, 64, 90, 90,
-   90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,  2,  2, 90, 90,
-   90, 90, 90, 90, 90,  2, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95,
-   95, 95,  2,  2, 95,  2, 37, 37, 37,  2,  2,  2,  2,  2,  3,  3,
-    3,  3,  3,  2,  3,  3,  2,  2,  2,  3,  3,  3,  3,  3,  3,  3,
-    0,  3,  3,  3,  3,  3,  7,  7,  7,  7,  7,  7,  7,  7,  7,  1,
-    1,  1,  1,  7,  7,  7,  7,  7,  7,  7,  0,  0,  7,  7,  5,  5,
-    5,  5,  2,  5,  5,  5,  5,  5,  5,  5,  5,  2,  2,  5,  5,  2,
-    2,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  2,
-    5,  5,  5,  5,  5,  5,  5,  2,  5,  2,  2,  2,  5,  5,  5,  5,
-    2,  2,  5,  5,  5,  5,  5,  2,  2,  5,  5,  5,  5,  2,  2,  2,
-    2,  2,  2,  2,  2,  5,  2,  2,  2,  2,  5,  5,  2,  5,  5,  5,
-    5,  5,  2,  2,  5,  5,  5,  5,  5,  5,  5,  5,  5,  2,  2, 11,
-   11, 11,  2, 11, 11, 11, 11, 11, 11,  2,  2,  2,  2, 11, 11,  2,
-    2, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  2,
-   11, 11, 11, 11, 11, 11, 11,  2, 11, 11,  2, 11, 11,  2, 11, 11,
-    2,  2, 11,  2, 11, 11, 11,  2,  2, 11, 11, 11,  2,  2,  2, 11,
-    2,  2,  2,  2,  2,  2,  2, 11, 11, 11, 11,  2, 11,  2,  2,  2,
-    2,  2,  2,  2, 11, 11, 11, 11, 11, 11, 11, 11, 11,  2,  2, 10,
-   10, 10,  2, 10, 10, 10, 10, 10, 10, 10, 10, 10,  2, 10, 10, 10,
-    2, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  2,
-   10, 10, 10, 10, 10, 10, 10,  2, 10, 10,  2, 10, 10, 10, 10, 10,
-    2,  2, 10, 10, 10, 10, 10, 10,  2, 10, 10, 10,  2,  2, 10,  2,
-    2,  2,  2,  2,  2,  2, 10, 10, 10, 10,  2,  2, 10, 10, 10, 10,
-    2,  2,  2,  2,  2,  2,  2, 10, 10, 10, 10, 10, 10, 10,  2, 21,
-   21, 21,  2, 21, 21, 21, 21, 21, 21, 21, 21,  2,  2, 21, 21,  2,
-    2, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,  2,
-   21, 21, 21, 21, 21, 21, 21,  2, 21, 21,  2, 21, 21, 21, 21, 21,
-    2,  2, 21, 21, 21, 21, 21,  2,  2, 21, 21, 21,  2,  2,  2,  2,
-    2,  2,  2, 21, 21, 21,  2,  2,  2,  2, 21, 21,  2, 21, 21, 21,
-   21, 21,  2,  2, 21, 21,  2,  2, 22, 22,  2, 22, 22, 22, 22, 22,
-   22,  2,  2,  2, 22, 22, 22,  2, 22, 22, 22, 22,  2,  2,  2, 22,
-   22,  2, 22,  2, 22, 22,  2,  2,  2, 22, 22,  2,  2,  2, 22, 22,
-   22, 22, 22, 22, 22, 22, 22, 22,  2,  2,  2,  2, 22, 22, 22,  2,
-    2,  2,  2,  2,  2, 22,  2,  2,  2,  2,  2,  2, 22, 22, 22, 22,
-   22,  2,  2,  2,  2,  2, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
-   23, 23, 23,  2, 23, 23, 23,  2, 23, 23, 23, 23, 23, 23, 23, 23,
-    2,  2,  2, 23, 23, 23, 23,  2, 23, 23, 23, 23,  2,  2,  2,  2,
-    2,  2,  2, 23, 23,  2, 23, 23, 23,  2,  2,  2,  2,  2, 23, 23,
-   23, 23,  2,  2, 23, 23,  2,  2,  2,  2,  2,  2,  2, 23, 16, 16,
-   16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,  2, 16, 16, 16,  2,
-   16, 16, 16, 16, 16, 16, 16, 16, 16, 16,  2, 16, 16, 16, 16, 16,
-    2,  2, 16, 16, 16, 16, 16,  2, 16, 16, 16, 16,  2,  2,  2,  2,
-    2,  2,  2, 16, 16,  2,  2,  2,  2,  2,  2,  2, 16,  2, 16, 16,
-   16, 16,  2,  2, 16, 16,  2, 16, 16,  2,  2,  2,  2,  2, 20, 20,
-   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,  2, 20, 20, 20,  2,
-   20, 20, 20, 20, 20, 20,  2,  2,  2,  2, 20, 20, 20, 20, 20, 20,
-   20, 20,  2,  2, 20, 20,  2, 36, 36, 36,  2, 36, 36, 36, 36, 36,
-   36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,  2,  2,  2,
-   36, 36, 36, 36, 36, 36, 36, 36,  2, 36, 36, 36, 36, 36, 36, 36,
-   36, 36,  2, 36,  2,  2,  2,  2, 36,  2,  2,  2,  2, 36, 36, 36,
-   36, 36, 36,  2, 36,  2,  2,  2,  2,  2,  2,  2, 36, 36,  2,  2,
-   36, 36, 36,  2,  2,  2,  2, 24, 24, 24, 24, 24, 24, 24, 24, 24,
-   24, 24, 24, 24, 24, 24, 24, 24, 24,  2,  2,  2,  2,  0, 24, 24,
-   24, 24,  2,  2,  2,  2,  2, 18, 18,  2, 18,  2, 18, 18, 18, 18,
-   18,  2, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
-   18, 18,  2, 18,  2, 18, 18, 18, 18, 18, 18, 18,  2,  2, 18, 18,
-   18, 18, 18,  2, 18,  2, 18, 18,  2,  2, 18, 18, 18, 18, 25, 25,
-   25, 25, 25, 25, 25, 25,  2, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-   25, 25, 25,  2,  2,  2, 25, 25, 25, 25, 25,  2, 25, 25, 25, 25,
-   25, 25, 25,  0,  0,  0,  0, 25, 25,  2,  2,  2,  2,  2, 33, 33,
-   33, 33, 33, 33, 33, 33,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-    8,  8,  8,  8,  2,  8,  2,  2,  2,  2,  2,  8,  2,  2,  8,  8,
-    8,  0,  8,  8,  8,  8, 12, 12, 12, 12, 12, 12, 12, 12, 30, 30,
-   30, 30, 30, 30, 30, 30, 30,  2, 30, 30, 30, 30,  2,  2, 30, 30,
-   30, 30, 30, 30, 30,  2, 30, 30, 30,  2,  2, 30, 30, 30, 30, 30,
-   30, 30, 30,  2,  2,  2, 30, 30,  2,  2,  2,  2,  2,  2, 29, 29,
-   29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,  2,  2, 28, 28,
-   28, 28, 28, 28, 28, 28, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
-   34, 34, 34,  2,  2,  2, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35,  0,  0,  0, 35, 35, 35,  2,  2,  2,  2,  2,  2,  2, 45, 45,
-   45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,  2, 45, 45, 45, 45,
-   45, 45, 45,  2,  2,  2, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
-   44, 44, 44,  0,  0,  2, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
-   43, 43,  2,  2,  2,  2, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
-   46, 46, 46,  2, 46, 46, 46,  2, 46, 46,  2,  2,  2,  2, 31, 31,
-   31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,  2,  2, 31, 31,
-    2,  2,  2,  2,  2,  2, 32, 32,  0,  0, 32,  0, 32, 32, 32, 32,
-   32, 32, 32, 32, 32,  2, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
-    2,  2,  2,  2,  2,  2, 32,  2,  2,  2,  2,  2,  2,  2, 32, 32,
-   32,  2,  2,  2,  2,  2, 28, 28, 28, 28, 28, 28,  2,  2, 48, 48,
-   48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,  2, 48, 48,
-   48, 48,  2,  2,  2,  2, 48,  2,  2,  2, 48, 48, 48, 48, 52, 52,
-   52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,  2,  2, 52, 52,
-   52, 52, 52,  2,  2,  2, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
-   58, 58,  2,  2,  2,  2, 58, 58,  2,  2,  2,  2,  2,  2, 58, 58,
-   58,  2,  2,  2, 58, 58, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54,
-   54, 54,  2,  2, 54, 54, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91,
-   91, 91, 91, 91, 91,  2, 91, 91, 91, 91, 91,  2,  2, 91, 91, 91,
-    2,  2,  2,  2,  2,  2, 91, 91, 91, 91, 91, 91,  2,  2,  1,  2,
-    2,  2,  2,  2,  2,  2, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
-   62, 62,  2,  2,  2,  2, 62, 62, 62, 62, 62,  2,  2,  2, 76, 76,
-   76, 76, 76, 76, 76, 76, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93,
-   93, 93,  2,  2,  2,  2,  2,  2,  2,  2, 93, 93, 93, 93, 70, 70,
-   70, 70, 70, 70, 70, 70,  2,  2,  2, 70, 70, 70, 70, 70, 70, 70,
-    2,  2,  2, 70, 70, 70, 73, 73, 73, 73, 73, 73, 73, 73,  6,  2,
-    2,  2,  2,  2,  2,  2,  8,  8,  8,  2,  2,  8,  8,  8,  1,  1,
-    1,  0,  1,  1,  1,  1,  1,  0,  1,  1,  1,  1,  1,  1,  1,  0,
-    0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  1,  1,
-    0,  2,  2,  2,  2,  2, 19, 19, 19, 19, 19, 19,  9,  9,  9,  9,
-    9,  6, 19, 19, 19, 19, 19, 19, 19, 19, 19,  9,  9,  9,  9,  9,
-   19, 19, 19, 19,  9,  9,  9,  9,  9, 19, 19, 19, 19, 19,  6, 19,
-   19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,  9,  1,  1,
-    2,  1,  1,  1,  1,  1,  9,  9,  9,  9,  9,  9,  2,  2,  2,  9,
-    2,  9,  2,  9,  2,  9,  9,  9,  9,  9,  9,  2,  9,  9,  9,  9,
-    9,  9,  2,  2,  9,  9,  9,  9,  9,  9,  2,  9,  9,  9,  2,  2,
-    9,  9,  9,  2,  9,  9,  9,  9,  9,  9,  9,  9,  9,  2,  0,  0,
-    0,  0,  1,  1,  0,  0,  0,  0,  0,  0,  0,  2,  0,  0,  0, 19,
-    2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 19,  0,  0,
-    0,  0,  0,  0,  0,  2, 19, 19, 19, 19, 19,  2,  2,  2,  0,  0,
-    0,  0,  0,  0,  9,  0,  0,  0, 19, 19,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0, 19,  0, 19,  0,  0,  0,  2,  2,  2,  2,  0,  0,
-    0,  2,  2,  2,  2,  2, 27, 27, 27, 27, 27, 27, 27, 27,  0,  0,
-    0,  0,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  2,  0, 56, 56,
-   56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,  2, 55, 55,
-   55, 55,  2,  2,  2,  2,  2, 55, 55, 55, 55, 55, 55, 55, 61, 61,
-   61, 61, 61, 61, 61, 61,  2,  2,  2,  2,  2,  2,  2, 61, 61,  2,
-    2,  2,  2,  2,  2,  2, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    2, 13, 13, 13, 13, 13, 13, 13, 13, 13,  2,  2,  2,  2, 13, 13,
-   13, 13, 13, 13,  2,  2,  0,  0,  0,  0,  2,  2,  2,  2,  0,  0,
-    0,  0,  0, 13,  0, 13,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    1,  1,  1,  1, 12, 12, 13, 13, 13, 13,  0,  0,  0,  0,  2, 15,
+    7,  7,  7,  7, 37,  7, 38, 39,  7, 40,  7,  7,  7, 41, 13, 42,
+    7,  7, 43, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   44,  0,  0,  1,  2,  2,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11,
+   12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27,
+   28, 29, 30, 31, 32, 32, 33, 34, 35, 36, 37, 37, 37, 37, 37, 38,
+   39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,  2,  2,
+   53, 54, 55, 56, 57, 58, 59, 59, 59, 59, 60, 59, 59, 59, 59, 59,
+   59, 59, 61, 61, 59, 59, 59, 59, 62, 63, 64, 65, 66, 67, 68, 69,
+   70, 71, 72, 73, 74, 75, 76, 77, 78, 59, 70, 70, 70, 70, 70, 70,
+   70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
+   70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 79, 70, 70,
+   70, 70, 80, 80, 80, 80, 80, 80, 80, 80, 80, 81, 82, 82, 83, 84,
+   85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 32, 32, 32, 32, 32, 32,
+   32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+   32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+   32, 95, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
+   96, 96, 96, 96, 70, 70, 97, 98, 99,100,101,101,102,103,104,105,
+  106,107,108,109,110,111, 96,112,113,114,115,116,117,118,119,119,
+  120,121,122,123,124,125,126,127,128,129,130,131,132, 96,133,134,
+  135,136,137,138,139,140,141,142,143, 96,144,145, 96,146,147,148,
+  149, 96,150,151,152,153,154,155, 96, 96,156,157,158,159, 96,160,
+   96,161,162,162,162,162,162,162,162,163,164,162,165, 96, 96, 96,
+   96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
+   96,166,167,167,167,167,167,167,167,167,168, 96, 96, 96, 96, 96,
+   96, 96, 96, 96, 96, 96, 96, 96, 96, 96,169,169,169,169,170, 96,
+   96, 96,171,171,171,171,172,173,174,175, 96, 96, 96, 96,176,177,
+  178,179,180,180,180,180,180,180,180,180,180,180,180,180,180,180,
+  180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,
+  180,181,180,180,180,180,180,180,182,182,182,183,184, 96, 96, 96,
+   96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
+   96,185,186,187,188,189,189,190, 96, 96, 96, 96, 96, 96, 96, 96,
+   96, 96, 96, 96, 96, 96, 96, 96, 96, 96,191,192, 96, 96, 96, 96,
+   96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
+  193,194, 59,195,196,197,198,199,200, 96,201,202,203, 59, 59,204,
+   59,205,206,206,206,206,206,207, 96, 96, 96, 96, 96, 96, 96, 96,
+  208, 96,209, 96,210, 96, 96,211, 96, 96, 96, 96, 96, 96, 96, 96,
+   96,212,213,214,215, 96, 96, 96, 96, 96,216,217,218, 96,219,220,
+   96, 96,221,222, 59,223,224, 96, 59, 59, 59, 59, 59, 59, 59,225,
+  226,227,228,229, 59, 59,230,231, 59,232, 96, 96, 96, 96, 96, 96,
+   96, 96, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,233,
+   70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
+  234, 70,235, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
+   70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,236,
+   70, 70, 70, 70, 70, 70, 70, 70, 70,237, 96, 96, 96, 96, 96, 96,
+   96, 96, 70, 70, 70, 70,238, 96, 96, 96, 96, 96, 96, 96, 96, 96,
+   96, 96, 70, 70, 70, 70, 70, 70,239, 96, 96, 96, 96, 96, 96, 96,
+   96, 96,240, 96,241,242,  0,  1,  2,  2,  0,  1,  2,  2,  2,  3,
+    4,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0, 19, 19, 19, 19, 19,
+   19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,  0,  0,  0,
+    0,  0,  0,  0, 19,  0,  0,  0,  0,  0, 19, 19, 19, 19, 19, 19,
+   19,  0, 19,  0,  0,  0,  0,  0,  0,  0, 19, 19, 19, 19, 19,  0,
+    0,  0,  0,  0, 26, 26,  0,  0,  0,  0,  1,  1,  1,  1,  1,  1,
+    1,  1,  9,  9,  9,  9,  0,  9,  9,  9,  2,  2,  9,  9,  9,  9,
+    0,  9,  2,  2,  2,  2,  9,  0,  9,  0,  9,  9,  9,  2,  9,  2,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  2,  9,  9,  9,
+    9,  9,  9,  9, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+   55, 55,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  1,
+    1,  6,  2,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+    4,  4,  4,  4,  4,  4,  4,  4,  4,  2,  4,  4,  4,  2,  2,  4,
+    4,  4,  2, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+   14, 14,  2,  2,  2,  2,  2,  2,  2,  2, 14, 14, 14,  2,  2,  2,
+    2, 14, 14, 14, 14, 14, 14,  2,  2,  2,  3,  3,  3,  3,  3,  0,
+    3,  3,  3,  3,  3,  3,  0,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+    3,  3,  3,  3,  3,  0,  3,  3,  3,  0,  0,  3,  3,  3,  3,  3,
+    3,  3,  3,  3,  3,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+    3,  3,  1,  3,  3,  3,  3,  3,  3,  3, 37, 37, 37, 37, 37, 37,
+   37, 37, 37, 37, 37, 37, 37, 37,  2, 37, 37, 37, 37,  2,  2, 37,
+   37, 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,  2,  2,  2,  2,
+    2,  2, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,  2,  2, 64,
+   64, 64, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+    2,  2, 90, 90, 90, 90, 90, 90, 90,  2, 95, 95, 95, 95, 95, 95,
+   95, 95, 95, 95, 95, 95,  2,  2, 95,  2, 37, 37, 37,  2,  2,  2,
+    2,  2,  3,  3,  3,  3,  3,  3,  3,  2,  3,  3,  2,  2,  2,  2,
+    2,  2,  3,  3,  0,  3,  3,  3,  3,  3,  7,  7,  7,  7,  7,  7,
+    7,  7,  7,  1,  1,  1,  1,  7,  7,  7,  7,  7,  7,  7,  0,  0,
+    7,  7,  5,  5,  5,  5,  2,  5,  5,  5,  5,  5,  5,  5,  5,  2,
+    2,  5,  5,  2,  2,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+    5,  5,  5,  2,  5,  5,  5,  5,  5,  5,  5,  2,  5,  2,  2,  2,
+    5,  5,  5,  5,  2,  2,  5,  5,  5,  5,  5,  2,  2,  5,  5,  5,
+    5,  2,  2,  2,  2,  2,  2,  2,  2,  5,  2,  2,  2,  2,  5,  5,
+    2,  5,  5,  5,  5,  5,  2,  2,  5,  5,  5,  5,  5,  5,  5,  5,
+    5,  2,  2, 11, 11, 11,  2, 11, 11, 11, 11, 11, 11,  2,  2,  2,
+    2, 11, 11,  2,  2, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+   11, 11, 11,  2, 11, 11, 11, 11, 11, 11, 11,  2, 11, 11,  2, 11,
+   11,  2, 11, 11,  2,  2, 11,  2, 11, 11, 11,  2,  2, 11, 11, 11,
+    2,  2,  2, 11,  2,  2,  2,  2,  2,  2,  2, 11, 11, 11, 11,  2,
+   11,  2,  2,  2,  2,  2,  2,  2, 11, 11, 11, 11, 11, 11, 11, 11,
+   11,  2,  2, 10, 10, 10,  2, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    2, 10, 10, 10,  2, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+   10, 10, 10,  2, 10, 10, 10, 10, 10, 10, 10,  2, 10, 10,  2, 10,
+   10, 10, 10, 10,  2,  2, 10, 10, 10, 10, 10, 10,  2, 10, 10, 10,
+    2,  2, 10,  2,  2,  2,  2,  2,  2,  2, 10, 10, 10, 10,  2,  2,
+   10, 10, 10, 10,  2,  2,  2,  2,  2,  2,  2, 10, 10, 10, 10, 10,
+   10, 10,  2, 21, 21, 21,  2, 21, 21, 21, 21, 21, 21, 21, 21,  2,
+    2, 21, 21,  2,  2, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+   21, 21, 21,  2, 21, 21, 21, 21, 21, 21, 21,  2, 21, 21,  2, 21,
+   21, 21, 21, 21,  2,  2, 21, 21, 21, 21, 21,  2,  2, 21, 21, 21,
+    2,  2,  2,  2,  2,  2,  2, 21, 21, 21,  2,  2,  2,  2, 21, 21,
+    2, 21, 21, 21, 21, 21,  2,  2, 21, 21,  2,  2, 22, 22,  2, 22,
+   22, 22, 22, 22, 22,  2,  2,  2, 22, 22, 22,  2, 22, 22, 22, 22,
+    2,  2,  2, 22, 22,  2, 22,  2, 22, 22,  2,  2,  2, 22, 22,  2,
+    2,  2, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,  2,  2,  2,  2,
+   22, 22, 22,  2,  2,  2,  2,  2,  2, 22,  2,  2,  2,  2,  2,  2,
+   22, 22, 22, 22, 22,  2,  2,  2,  2,  2, 23, 23, 23, 23, 23, 23,
+   23, 23, 23, 23, 23, 23, 23,  2, 23, 23, 23,  2, 23, 23, 23, 23,
+   23, 23, 23, 23,  2,  2, 23, 23, 23, 23, 23,  2, 23, 23, 23, 23,
+    2,  2,  2,  2,  2,  2,  2, 23, 23,  2, 23, 23, 23,  2,  2, 23,
+    2,  2, 23, 23, 23, 23,  2,  2, 23, 23,  2,  2,  2,  2,  2,  2,
+    2, 23, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,  2,
+   16, 16, 16,  2, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,  2, 16,
+   16, 16, 16, 16,  2,  2, 16, 16, 16, 16, 16,  2, 16, 16, 16, 16,
+    2,  2,  2,  2,  2,  2,  2, 16, 16,  2, 16, 16, 16, 16,  2,  2,
+   16, 16,  2, 16, 16,  2,  2,  2,  2,  2, 20, 20, 20, 20, 20, 20,
+   20, 20, 20, 20, 20, 20, 20,  2, 20, 20, 20,  2, 20, 20, 20, 20,
+   20, 20,  2,  2,  2,  2, 20, 20, 20, 20, 20, 20, 20, 20,  2,  2,
+   20, 20,  2, 36, 36, 36,  2, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+   36, 36, 36, 36, 36, 36, 36, 36, 36,  2,  2,  2, 36, 36, 36, 36,
+   36, 36, 36, 36,  2, 36, 36, 36, 36, 36, 36, 36, 36, 36,  2, 36,
+    2,  2,  2,  2, 36,  2,  2,  2,  2, 36, 36, 36, 36, 36, 36,  2,
+   36,  2,  2,  2,  2,  2,  2,  2, 36, 36,  2,  2, 36, 36, 36,  2,
+    2,  2,  2, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+   24, 24, 24, 24, 24,  2,  2,  2,  2,  0, 24, 24, 24, 24,  2,  2,
+    2,  2,  2, 18, 18,  2, 18,  2, 18, 18, 18, 18, 18,  2, 18, 18,
+   18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,  2, 18,
+    2, 18, 18, 18, 18, 18, 18, 18,  2,  2, 18, 18, 18, 18, 18,  2,
+   18,  2, 18, 18,  2,  2, 18, 18, 18, 18, 25, 25, 25, 25, 25, 25,
+   25, 25,  2, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,  2,
+    2,  2, 25, 25, 25, 25, 25,  2, 25, 25, 25, 25, 25, 25, 25,  0,
+    0,  0,  0, 25, 25,  2,  2,  2,  2,  2, 33, 33, 33, 33, 33, 33,
+   33, 33,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+    2,  8,  2,  2,  2,  2,  2,  8,  2,  2,  8,  8,  8,  0,  8,  8,
+    8,  8, 12, 12, 12, 12, 12, 12, 12, 12, 30, 30, 30, 30, 30, 30,
+   30, 30, 30,  2, 30, 30, 30, 30,  2,  2, 30, 30, 30, 30, 30, 30,
+   30,  2, 30, 30, 30,  2,  2, 30, 30, 30, 30, 30, 30, 30, 30,  2,
+    2,  2, 30, 30,  2,  2,  2,  2,  2,  2, 29, 29, 29, 29, 29, 29,
+   29, 29, 29, 29, 29, 29, 29, 29,  2,  2, 28, 28, 28, 28, 28, 28,
+   28, 28, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,  2,
+    2,  2, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,  0,  0,  0,
+   35, 35, 35,  2,  2,  2,  2,  2,  2,  2, 45, 45, 45, 45, 45, 45,
+   45, 45, 45, 45, 45, 45, 45, 45,  2,  2,  2,  2,  2,  2,  2,  2,
+    2, 45, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,  0,
+    0,  2, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,  2,  2,
+    2,  2, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,  2,
+   46, 46, 46,  2, 46, 46,  2,  2,  2,  2, 31, 31, 31, 31, 31, 31,
+   31, 31, 31, 31, 31, 31, 31, 31,  2,  2, 31, 31,  2,  2,  2,  2,
+    2,  2, 32, 32,  0,  0, 32,  0, 32, 32, 32, 32, 32, 32, 32, 32,
+   32, 32, 32, 32,  2,  2,  2,  2,  2,  2, 32,  2,  2,  2,  2,  2,
+    2,  2, 32, 32, 32,  2,  2,  2,  2,  2, 28, 28, 28, 28, 28, 28,
+    2,  2, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+   48,  2, 48, 48, 48, 48,  2,  2,  2,  2, 48,  2,  2,  2, 48, 48,
+   48, 48, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+    2,  2, 52, 52, 52, 52, 52,  2,  2,  2, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58,  2,  2,  2,  2, 58, 58,  2,  2,  2,  2,
+    2,  2, 58, 58, 58,  2,  2,  2, 58, 58, 54, 54, 54, 54, 54, 54,
+   54, 54, 54, 54, 54, 54,  2,  2, 54, 54, 91, 91, 91, 91, 91, 91,
+   91, 91, 91, 91, 91, 91, 91, 91, 91,  2, 91, 91, 91, 91, 91,  2,
+    2, 91, 91, 91,  2,  2,  2,  2,  2,  2, 91, 91, 91, 91, 91, 91,
+    2,  2,  1,  1,  1,  1,  1,  1,  1,  2, 62, 62, 62, 62, 62, 62,
+   62, 62, 62, 62, 62, 62, 62,  2,  2,  2, 62, 62, 62, 62, 62, 62,
+   62,  2, 76, 76, 76, 76, 76, 76, 76, 76, 93, 93, 93, 93, 93, 93,
+   93, 93, 93, 93, 93, 93,  2,  2,  2,  2,  2,  2,  2,  2, 93, 93,
+   93, 93, 70, 70, 70, 70, 70, 70, 70, 70,  2,  2,  2, 70, 70, 70,
+   70, 70, 70, 70,  2,  2,  2, 70, 70, 70, 73, 73, 73, 73, 73, 73,
+   73, 73,  6,  2,  2,  2,  2,  2,  2,  2,  8,  8,  8,  2,  2,  8,
+    8,  8,  1,  1,  1,  0,  1,  1,  1,  1,  1,  0,  1,  1,  1,  1,
+    1,  1,  1,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  1,  0,
+    0,  0,  1,  1,  0,  2,  2,  2,  2,  2, 19, 19, 19, 19, 19, 19,
+    9,  9,  9,  9,  9,  6, 19, 19, 19, 19, 19, 19, 19, 19, 19,  9,
+    9,  9,  9,  9, 19, 19, 19, 19,  9,  9,  9,  9,  9, 19, 19, 19,
+   19, 19,  6, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+   19,  9,  9,  9,  9,  9,  9,  9,  2,  2,  2,  9,  2,  9,  2,  9,
+    2,  9,  9,  9,  9,  9,  9,  2,  9,  9,  9,  9,  9,  9,  2,  2,
+    9,  9,  9,  9,  9,  9,  2,  9,  9,  9,  2,  2,  9,  9,  9,  2,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  2,  0,  0,  0,  0,  1,  1,
+    0,  0,  0,  0,  0,  0,  0,  2,  0,  0,  0, 19,  2,  2,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0, 19,  0,  0,  0,  0,  0,  0,
+    0,  2, 19, 19, 19, 19, 19,  2,  2,  2,  0,  2,  2,  2,  2,  2,
+    2,  2,  1,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,
+    9,  0,  0,  0, 19, 19,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+   19,  0, 19,  0,  0,  0,  2,  2,  2,  2,  0,  0,  0,  2,  2,  2,
+    2,  2, 27, 27, 27, 27, 27, 27, 27, 27,  0,  0,  0,  0,  2,  2,
+    0,  0,  0,  0,  0,  0,  0,  0,  2,  0, 56, 56, 56, 56, 56, 56,
+   56, 56, 55, 55, 55, 55,  2,  2,  2,  2,  2, 55, 55, 55, 55, 55,
+   55, 55, 61, 61, 61, 61, 61, 61, 61, 61,  2,  2,  2,  2,  2,  2,
+    2, 61, 61,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,
+    2,  2, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  2, 13, 13, 13,
+   13, 13, 13, 13, 13, 13,  2,  2,  2,  2, 13, 13, 13, 13, 13, 13,
+    2,  2,  0,  0,  0,  0,  2,  2,  2,  2,  0,  0,  0,  0,  0, 13,
+    0, 13,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13,  1,  1,  1,  1,
+   12, 12, 13, 13, 13, 13,  0,  0,  0,  0,  2, 15, 15, 15, 15, 15,
    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-   15, 15, 15, 15, 15,  2,  2,  1,  1,  0,  0, 15, 15, 15,  0, 17,
-   17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
-   17,  0,  0, 17, 17, 17,  2,  2,  2,  2,  2, 26, 26, 26, 26, 26,
-   26, 26, 26, 26, 26, 26,  2, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-   12, 12, 12, 12, 12,  2, 12, 12, 12, 12, 12, 12, 12,  0, 17, 17,
-   17, 17, 17, 17, 17,  0, 13, 13, 13, 13, 13,  2,  2,  2, 39, 39,
-   39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,  2,  2,  2, 39, 39,
-   39, 39, 39, 39, 39,  2, 86, 86, 86, 86, 86, 86, 86, 86, 77, 77,
-   77, 77, 77, 77, 77, 77, 77, 77, 77, 77,  2,  2,  2,  2, 79, 79,
-   79, 79, 79, 79, 79, 79,  0,  0, 19, 19, 19, 19, 19, 19,  0,  0,
-    0, 19, 19, 19, 19, 19,  2,  2, 19, 19, 19, 19, 19, 19, 19, 19,
-   19,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 19, 19, 19, 60, 60,
-   60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,  2,  2,  2,  0,  0,
-    2,  2,  2,  2,  2,  2, 65, 65, 65, 65, 65, 65, 65, 65, 75, 75,
-   75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75,  2,  2,  2,  2,
-    2,  2,  2,  2, 75, 75, 75, 75,  2,  2,  2,  2,  2,  2, 69, 69,
-   69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,  0, 69, 74, 74,
-   74, 74, 74, 74, 74, 74, 74, 74, 74, 74,  2,  2,  2,  2,  2,  2,
-    2,  2,  2,  2,  2, 74, 12, 12, 12, 12, 12,  2,  2,  2, 84, 84,
-   84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,  2,  0, 84, 84,
-    2,  2,  2,  2, 84, 84, 33, 33, 33, 33, 33, 33, 33,  2, 68, 68,
-   68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,  2, 68, 68,
-   68, 68, 68, 68,  2,  2, 68, 68,  2,  2, 68, 68, 68, 68, 92, 92,
-   92, 92, 92, 92, 92, 92, 92, 92, 92,  2,  2,  2,  2,  2,  2,  2,
-    2, 92, 92, 92, 92, 92, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
-   87, 87, 87, 87, 87,  2,  2, 30, 30, 30, 30, 30, 30,  2, 19, 19,
-   19,  0, 19, 19, 19, 19, 19, 19, 19, 19, 19,  9, 19, 19, 19, 19,
-    0,  0,  2,  2,  2,  2, 87, 87, 87, 87, 87, 87,  2,  2, 87, 87,
-    2,  2,  2,  2,  2,  2, 12, 12, 12, 12,  2,  2,  2,  2,  2,  2,
-    2, 12, 12, 12, 12, 12, 13, 13,  2,  2,  2,  2,  2,  2, 19, 19,
-   19, 19, 19, 19, 19,  2,  2,  2,  2,  4,  4,  4,  4,  4,  2,  2,
-    2,  2,  2, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  2, 14, 14,
-   14, 14, 14,  2, 14,  2, 14, 14,  2, 14, 14,  2, 14, 14,  3,  3,
-    2,  2,  2,  2,  2,  2,  3,  3,  3,  3,  3,  3,  0,  0,  2,  2,
-    3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  2,  2,  1,  1,
-    1,  1,  1,  1,  6,  6,  0,  0,  0,  2,  0,  0,  0,  0,  3,  3,
-    3,  3,  3,  2,  2,  0,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0,  2,  2,
-   12, 12, 12, 12, 12, 12,  2,  2, 12, 12, 12,  2,  2,  2,  2,  0,
-    0,  0,  0,  0,  2,  2, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
-   49, 49,  2, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,  2, 49, 49,
-   49,  2, 49, 49,  2, 49, 49, 49, 49, 49, 49, 49,  2,  2, 49, 49,
-   49,  2,  2,  2,  2,  2,  0,  0,  0,  2,  2,  2,  2,  0,  0,  0,
-    0,  0,  2,  2,  2,  0,  0,  0,  0,  0,  0,  2,  2,  2,  9,  2,
-    2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  1,  2,  2, 71, 71,
-   71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,  2,  2,  2, 67, 67,
-   67, 67, 67, 67, 67, 67, 67,  2,  2,  2,  2,  2,  2,  2,  1,  0,
-    0,  0,  0,  0,  0,  0, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
-   42, 42,  2,  2,  2,  2,  2,  2,  2,  2,  2, 42, 42, 42, 41, 41,
-   41, 41, 41, 41, 41, 41, 41, 41, 41,  2,  2,  2,  2,  2,118,118,
-  118,118,118,118,118,118,118,118,118,  2,  2,  2,  2,  2, 53, 53,
-   53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,  2, 53, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59,  2,  2,  2,  2, 59, 59,
-   59, 59, 59, 59,  2,  2, 40, 40, 40, 40, 40, 40, 40, 40, 51, 51,
-   51, 51, 51, 51, 51, 51, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
-   50, 50, 50, 50,  2,  2, 50, 50,  2,  2,  2,  2,  2,  2,135,135,
-  135,135,135,135,135,135,135,135,135,135,  2,  2,  2,  2,106,106,
-  106,106,106,106,106,106,104,104,104,104,104,104,104,104,104,104,
-  104,104,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,104,110,110,
-  110,110,110,110,110,110,110,110,110,110,110,110,110,  2,110,110,
-  110,110,110,110,  2,  2, 47, 47, 47, 47, 47, 47,  2,  2, 47,  2,
-   47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
-   47, 47, 47, 47,  2, 47, 47,  2,  2,  2, 47,  2,  2, 47, 81, 81,
-   81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,  2, 81,120,120,
-  120,120,120,120,120,120,116,116,116,116,116,116,116,116,116,116,
-  116,116,116,116,116,  2,  2,  2,  2,  2,  2,  2,  2,116,128,128,
-  128,128,128,128,128,128,128,128,128,  2,128,128,  2,  2,  2,  2,
-    2,128,128,128,128,128, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
-   66, 66,  2,  2,  2, 66, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
-    2,  2,  2,  2,  2, 72, 98, 98, 98, 98, 98, 98, 98, 98, 97, 97,
-   97, 97, 97, 97, 97, 97,  2,  2,  2,  2, 97, 97, 97, 97,  2,  2,
-   97, 97, 97, 97, 97, 97, 57, 57, 57, 57,  2, 57, 57,  2,  2,  2,
-    2,  2, 57, 57, 57, 57, 57, 57, 57, 57,  2, 57, 57, 57,  2, 57,
-   57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
-   57, 57, 57, 57,  2,  2, 57, 57, 57,  2,  2,  2,  2, 57, 57,  2,
-    2,  2,  2,  2,  2,  2, 88, 88, 88, 88, 88, 88, 88, 88,117,117,
-  117,117,117,117,117,117,112,112,112,112,112,112,112,112,112,112,
-  112,112,112,112,112,  2,  2,  2,  2,112,112,112,112,112, 78, 78,
-   78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,  2,  2,  2, 78,
-   78, 78, 78, 78, 78, 78, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83,
-   83, 83, 83, 83,  2,  2, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82,
-   82,  2,  2,  2,  2,  2,122,122,122,122,122,122,122,122,122,122,
-    2,  2,  2,  2,  2,  2,  2,122,122,122,122,  2,  2,  2,  2,122,
-  122,122,122,122,122,122, 89, 89, 89, 89, 89, 89, 89, 89, 89,  2,
-    2,  2,  2,  2,  2,  2,130,130,130,130,130,130,130,130,130,130,
-  130,  2,  2,  2,  2,  2,  2,  2,130,130,130,130,130,130,144,144,
-  144,144,144,144,144,144,144,144,  2,  2,  2,  2,  2,  2,  3,  3,
-    3,  3,  3,  3,  3,  2,156,156,156,156,156,156,156,156,156,156,
-    2,156,156,156,  2,  2,156,156,  2,  2,  2,  2,  2,  2,147,147,
-  147,147,147,147,147,147,148,148,148,148,148,148,148,148,148,148,
-    2,  2,  2,  2,  2,  2,153,153,153,153,153,153,153,153,153,153,
-  153,153,  2,  2,  2,  2,149,149,149,149,149,149,149,149,149,149,
-  149,149,149,149,149,  2, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-   94, 94, 94, 94,  2,  2,  2,  2, 94, 94, 94, 94, 94, 94,  2,  2,
-    2,  2,  2,  2,  2, 94, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-    2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 85,  2,  2,101,101,
-  101,101,101,101,101,101,101,  2,  2,  2,  2,  2,  2,  2,101,101,
-    2,  2,  2,  2,  2,  2, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
-   96, 96, 96,  2, 96, 96,111,111,111,111,111,111,111,111,111,111,
-  111,111,111,111,111,  2,100,100,100,100,100,100,100,100,  2, 36,
-   36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,  2,  2,  2,108,108,
-  108,108,108,108,108,108,108,108,  2,108,108,108,108,108,108,108,
-  108,108,108,108,108,  2,129,129,129,129,129,129,129,  2,129,  2,
-  129,129,129,129,  2,129,129,129,129,129,129,129,129,129,129,129,
-  129,129,129,129,  2,129,129,129,  2,  2,  2,  2,  2,  2,109,109,
-  109,109,109,109,109,109,109,109,109,  2,  2,  2,  2,  2,109,109,
-    2,  2,  2,  2,  2,  2,107,107,107,107,  2,107,107,107,107,107,
-  107,107,107,  2,  2,107,107,  2,  2,107,107,107,107,107,107,107,
-  107,107,107,107,107,107,107,  2,107,107,107,107,107,107,107,  2,
-  107,107,  2,107,107,107,107,107,  2,  1,107,107,107,107,107,  2,
-    2,107,107,107,  2,  2,107,  2,  2,  2,  2,  2,  2,107,  2,  2,
-    2,  2,  2,107,107,107,107,107,107,107,  2,  2,107,107,107,107,
-  107,107,107,  2,  2,  2,137,137,137,137,137,137,137,137,137,137,
-  137,137,  2,137,137,137,137,137,  2,  2,  2,  2,  2,  2,124,124,
-  124,124,124,124,124,124,124,124,  2,  2,  2,  2,  2,  2,123,123,
-  123,123,123,123,123,123,123,123,123,123,123,123,  2,  2,114,114,
-  114,114,114,114,114,114,114,114,114,114,114,  2,  2,  2,114,114,
-    2,  2,  2,  2,  2,  2, 32, 32, 32, 32, 32,  2,  2,  2,102,102,
-  102,102,102,102,102,102,102,  2,  2,  2,  2,  2,  2,  2,102,102,
-    2,  2,  2,  2,  2,  2,126,126,126,126,126,126,126,126,126,126,
-  126,  2,  2,126,126,126,126,126,126,126,  2,  2,  2,  2,142,142,
-  142,142,142,142,142,142,142,142,142,142,  2,  2,  2,  2,125,125,
-  125,125,125,125,125,125,125,125,125,  2,  2,  2,  2,  2,  2,  2,
-    2,  2,  2,  2,  2,125,154,154,154,154,154,154,154,  2,  2,154,
-    2,  2,154,154,154,154,154,154,154,154,  2,154,154,  2,154,154,
-  154,154,154,154,154,154,154,154,154,154,154,154,  2,154,154,  2,
-    2,154,154,154,154,154,154,154,  2,  2,  2,  2,  2,  2,150,150,
-  150,150,150,150,150,150,  2,  2,150,150,150,150,150,150,150,150,
-  150,150,150,  2,  2,  2,141,141,141,141,141,141,141,141,140,140,
-  140,140,140,140,140,140,140,140,140,  2,  2,  2,  2,  2,121,121,
-  121,121,121,121,121,121,121,  2,  2,  2,  2,  2,  2,  2,133,133,
-  133,133,133,133,133,133,133,  2,133,133,133,133,133,133,133,133,
-  133,133,133,133,133,  2,133,133,133,133,133,133,  2,  2,133,133,
-  133,133,133,  2,  2,  2,134,134,134,134,134,134,134,134,  2,  2,
-  134,134,134,134,134,134,  2,134,134,134,134,134,134,134,134,134,
-  134,134,134,134,134,  2,138,138,138,138,138,138,138,  2,138,138,
-    2,138,138,138,138,138,138,138,138,138,138,138,138,138,  2,  2,
-  138,  2,138,138,  2,138,138,138,  2,  2,  2,  2,  2,  2,143,143,
-  143,143,143,143,  2,143,143,  2,143,143,143,143,143,143,143,143,
-  143,143,143,143,143,143,143,143,143,143,143,143,143,  2,143,143,
-    2,143,143,143,143,143,143,  2,  2,  2,  2,  2,  2,  2,143,143,
-    2,  2,  2,  2,  2,  2,145,145,145,145,145,145,145,145,145,  2,
-    2,  2,  2,  2,  2,  2, 86,  2,  2,  2,  2,  2,  2,  2, 22, 22,
-    2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 22, 63, 63,
-   63, 63, 63, 63, 63, 63, 63, 63,  2,  2,  2,  2,  2,  2, 63, 63,
-   63, 63, 63, 63, 63,  2, 63, 63, 63, 63, 63,  2,  2,  2, 63, 63,
-   63, 63,  2,  2,  2,  2, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
-   80, 80, 80, 80, 80,  2, 80,  2,  2,  2,  2,  2,  2,  2,127,127,
-  127,127,127,127,127,127,127,127,127,127,127,127,127,  2, 79,  2,
-    2,  2,  2,  2,  2,  2,115,115,115,115,115,115,115,115,115,115,
-  115,115,115,115,115,  2,115,115,  2,  2,  2,  2,115,115,103,103,
-  103,103,103,103,103,103,103,103,103,103,103,103,  2,  2,119,119,
-  119,119,119,119,119,119,119,119,119,119,119,119,  2,  2,119,119,
-    2,119,119,119,119,119,  2,  2,  2,  2,  2,119,119,119,146,146,
-  146,146,146,146,146,146,146,146,146,  2,  2,  2,  2,  2, 99, 99,
-   99, 99, 99, 99, 99, 99, 99, 99, 99,  2,  2,  2,  2, 99,  2,  2,
-    2,  2,  2,  2,  2, 99,136,139,  0,  0,155,  2,  2,  2,136,136,
-  136,136,136,136,136,136,155,155,155,155,155,155,155,155,155,155,
-  155,155,155,155,  2,  2,136,  2,  2,  2,  2,  2,  2,  2, 17, 15,
-   15, 15, 15, 15, 15, 15, 15, 15, 15,  2,  2,  2,  2,  2,  2,  2,
-    2,  2, 17, 17, 17, 17,139,139,139,139,139,139,139,139,139,139,
-  139,139,  2,  2,  2,  2,105,105,105,105,105,105,105,105,105,105,
-  105,  2,  2,  2,  2,  2,105,105,105,105,105,  2,  2,  2,105,  2,
-    2,  2,  2,  2,  2,  2,105,105,  2,  2,105,105,105,105,  0,  0,
-    0,  0,  0,  0,  2,  2,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  1,  1,
-    1,  0,  0,  1,  1,  1,  1,  1,  1,  1,  0,  0,  0,  0,  0,  0,
-    1,  1,  1,  1,  0,  0,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-    0,  2,  2,  0,  0,  2,  2,  0,  0,  0,  0,  2,  0,  0,  0,  0,
-    2,  0,  2,  0,  0,  0,  0,  0,  0,  0,  2,  0,  0,  0,  0,  0,
-    0,  2,  2,  0,  0,  0,  0,  0,  2,  0,  0,  0,  0,  2,  0,  0,
-    0,  0,  0,  2,  0,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  2,
-    0,  0,  0,  0,  0,  0,131,131,131,131,131,131,131,131,131,131,
-  131,131,  2,  2,  2,  2,  2,  2,  2,131,131,131,131,131,  2,131,
-  131,131,131,131,131,131, 56,  2,  2, 56, 56, 56, 56, 56, 56, 56,
-    2, 56, 56,  2, 56, 56, 56, 56, 56,  2,  2,  2,  2,  2,151,151,
-  151,151,151,151,151,151,151,151,151,151,151,  2,  2,  2,151,151,
-  151,151,151,151,  2,  2,151,151,  2,  2,  2,  2,151,151,152,152,
-  152,152,152,152,152,152,152,152,  2,  2,  2,  2,  2,152,113,113,
-  113,113,113,113,113,113,113,113,113,113,113,  2,  2,113,113,113,
-  113,113,113,113,113,  2,132,132,132,132,132,132,132,132,132,132,
-  132,132,  2,  2,  2,  2,132,132,  2,  2,  2,  2,132,132,  3,  3,
-    3,  3,  2,  3,  3,  3,  2,  3,  3,  2,  3,  2,  2,  3,  2,  3,
-    3,  3,  3,  3,  3,  3,  3,  3,  3,  2,  3,  3,  3,  3,  2,  3,
-    2,  3,  2,  2,  2,  2,  2,  2,  3,  2,  2,  2,  2,  3,  2,  3,
-    2,  3,  2,  3,  3,  3,  2,  3,  2,  3,  2,  3,  2,  3,  2,  3,
-    3,  3,  3,  2,  3,  2,  3,  3,  2,  3,  3,  3,  3,  3,  3,  3,
-    3,  3,  2,  2,  2,  2,  2,  3,  3,  3,  2,  3,  3,  3,  2,  2,
-    2,  2,  2,  2,  0,  0, 15,  0,  0,  2,  2,  2,  2,  2, 13,  2,
-    2,  2,  2,  2,  2,  2, 13, 13, 13,  2,  2,  2,  2,  2,  2,  0,
-    2,  2,  2,  2,  2,  2,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9,
-    9,  9,  9, 10,  9, 11, 12, 13,  9,  9,  9, 14,  9,  9, 15,  9,
-    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+   15,  2,  2,  1,  1,  0,  0, 15, 15, 15,  0, 17, 17, 17, 17, 17,
+   17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0, 17,
+   17, 17,  2,  2,  2,  2,  2, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+   26, 26,  2, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+   12,  2, 12, 12, 12, 12, 12, 12, 12,  0, 17, 17, 17, 17, 17, 17,
+   17,  0, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,  2,
+    2,  2, 39, 39, 39, 39, 39, 39, 39,  2, 86, 86, 86, 86, 86, 86,
+   86, 86, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,  2,  2,
+    2,  2, 79, 79, 79, 79, 79, 79, 79, 79,  0,  0, 19, 19, 19, 19,
+   19, 19,  0,  0,  0, 19, 19, 19, 19, 19, 19, 19, 19,  2,  2,  2,
+    2,  2, 19, 19,  2, 19,  2, 19, 19, 19, 19, 19,  2,  2,  2,  2,
+    2,  2,  2,  2, 19, 19, 19, 19, 19, 19, 60, 60, 60, 60, 60, 60,
+   60, 60, 60, 60, 60, 60, 60,  2,  2,  2,  0,  0,  2,  2,  2,  2,
+    2,  2, 65, 65, 65, 65, 65, 65, 65, 65, 75, 75, 75, 75, 75, 75,
+   75, 75, 75, 75, 75, 75, 75, 75,  2,  2,  2,  2,  2,  2,  2,  2,
+   75, 75, 75, 75,  2,  2,  2,  2,  2,  2, 69, 69, 69, 69, 69, 69,
+   69, 69, 69, 69, 69, 69, 69, 69,  0, 69, 74, 74, 74, 74, 74, 74,
+   74, 74, 74, 74, 74, 74,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+    2, 74, 12, 12, 12, 12, 12,  2,  2,  2, 84, 84, 84, 84, 84, 84,
+   84, 84, 84, 84, 84, 84, 84, 84,  2,  0, 84, 84,  2,  2,  2,  2,
+   84, 84, 33, 33, 33, 33, 33, 33, 33,  2, 68, 68, 68, 68, 68, 68,
+   68, 68, 68, 68, 68, 68, 68, 68, 68,  2, 68, 68, 68, 68, 68, 68,
+    2,  2, 68, 68,  2,  2, 68, 68, 68, 68, 92, 92, 92, 92, 92, 92,
+   92, 92, 92, 92, 92,  2,  2,  2,  2,  2,  2,  2,  2, 92, 92, 92,
+   92, 92, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+   87,  2,  2, 30, 30, 30, 30, 30, 30,  2, 19, 19, 19,  0, 19, 19,
+   19, 19, 19, 19, 19, 19, 19,  9, 19, 19, 19, 19,  0,  0,  2,  2,
+    2,  2, 87, 87, 87, 87, 87, 87,  2,  2, 87, 87,  2,  2,  2,  2,
+    2,  2, 12, 12, 12, 12,  2,  2,  2,  2,  2,  2,  2, 12, 12, 12,
+   12, 12, 13, 13,  2,  2,  2,  2,  2,  2, 19, 19, 19, 19, 19, 19,
+   19,  2,  2,  2,  2,  4,  4,  4,  4,  4,  2,  2,  2,  2,  2, 14,
+   14, 14, 14, 14, 14, 14, 14, 14, 14,  2, 14, 14, 14, 14, 14,  2,
+   14,  2, 14, 14,  2, 14, 14,  2, 14, 14,  3,  3,  3,  2,  2,  2,
+    2,  2,  2,  2,  2,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+    0,  0,  2,  2,  3,  3,  3,  3,  3,  3,  2,  2,  2,  2,  2,  2,
+    2,  3,  1,  1,  1,  1,  1,  1,  6,  6,  0,  0,  0,  2,  0,  0,
+    0,  0,  3,  3,  3,  3,  3,  2,  3,  3,  3,  3,  3,  3,  3,  2,
+    2,  0,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+   17, 17, 17, 17, 17, 17, 17, 17,  0,  0,  2,  2, 12, 12, 12, 12,
+   12, 12,  2,  2, 12, 12, 12,  2,  2,  2,  2,  0,  0,  0,  0,  0,
+    2,  2, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,  2, 49,
+   49, 49, 49, 49, 49, 49, 49, 49, 49,  2, 49, 49, 49,  2, 49, 49,
+    2, 49, 49, 49, 49, 49, 49, 49,  2,  2, 49, 49, 49,  2,  2,  2,
+    2,  2,  0,  0,  0,  2,  2,  2,  2,  0,  0,  0,  0,  0,  2,  2,
+    2,  0,  0,  0,  0,  0,  0,  2,  2,  2,  9,  2,  2,  2,  2,  2,
+    2,  2,  0,  0,  0,  0,  0,  1,  2,  2, 71, 71, 71, 71, 71, 71,
+   71, 71, 71, 71, 71, 71, 71,  2,  2,  2, 67, 67, 67, 67, 67, 67,
+   67, 67, 67,  2,  2,  2,  2,  2,  2,  2,  1,  0,  0,  0,  0,  0,
+    0,  0, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,  2,  2,
+    2,  2,  2,  2,  2,  2,  2, 42, 42, 42, 41, 41, 41, 41, 41, 41,
+   41, 41, 41, 41, 41,  2,  2,  2,  2,  2,118,118,118,118,118,118,
+  118,118,118,118,118,  2,  2,  2,  2,  2, 53, 53, 53, 53, 53, 53,
+   53, 53, 53, 53, 53, 53, 53, 53,  2, 53, 59, 59, 59, 59, 59, 59,
+   59, 59, 59, 59, 59, 59,  2,  2,  2,  2, 59, 59, 59, 59, 59, 59,
+    2,  2, 40, 40, 40, 40, 40, 40, 40, 40, 51, 51, 51, 51, 51, 51,
+   51, 51, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+    2,  2, 50, 50,  2,  2,  2,  2,  2,  2,135,135,135,135,135,135,
+  135,135,135,135,135,135,  2,  2,  2,  2,106,106,106,106,106,106,
+  106,106,104,104,104,104,104,104,104,104,104,104,104,104,  2,  2,
+    2,  2,  2,  2,  2,  2,  2,  2,  2,104,161,161,161,161,161,161,
+  161,161,161,161,161,  2,161,161,161,161,161,161,161,  2,161,161,
+    2,161,161,161,  2,161,161,161,161,161,161,161,  2,161,161,  2,
+    2,  2,110,110,110,110,110,110,110,110,110,110,110,110,110,110,
+  110,  2,110,110,110,110,110,110,  2,  2, 19, 19, 19, 19, 19, 19,
+    2, 19, 19,  2, 19, 19, 19, 19, 19, 19, 47, 47, 47, 47, 47, 47,
+    2,  2, 47,  2, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+   47, 47, 47, 47, 47, 47, 47, 47,  2, 47, 47,  2,  2,  2, 47,  2,
+    2, 47, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+    2, 81,120,120,120,120,120,120,120,120,116,116,116,116,116,116,
+  116,116,116,116,116,116,116,116,116,  2,  2,  2,  2,  2,  2,  2,
+    2,116,128,128,128,128,128,128,128,128,128,128,128,  2,128,128,
+    2,  2,  2,  2,  2,128,128,128,128,128, 66, 66, 66, 66, 66, 66,
+   66, 66, 66, 66, 66, 66,  2,  2,  2, 66, 72, 72, 72, 72, 72, 72,
+   72, 72, 72, 72,  2,  2,  2,  2,  2, 72, 98, 98, 98, 98, 98, 98,
+   98, 98, 97, 97, 97, 97, 97, 97, 97, 97,  2,  2,  2,  2, 97, 97,
+   97, 97,  2,  2, 97, 97, 97, 97, 97, 97, 57, 57, 57, 57,  2, 57,
+   57,  2,  2,  2,  2,  2, 57, 57, 57, 57, 57, 57, 57, 57,  2, 57,
+   57, 57,  2, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
+   57, 57, 57, 57, 57, 57, 57, 57,  2,  2, 57, 57, 57,  2,  2,  2,
+    2, 57, 57,  2,  2,  2,  2,  2,  2,  2, 88, 88, 88, 88, 88, 88,
+   88, 88,117,117,117,117,117,117,117,117,112,112,112,112,112,112,
+  112,112,112,112,112,112,112,112,112,  2,  2,  2,  2,112,112,112,
+  112,112, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
+    2,  2,  2, 78, 78, 78, 78, 78, 78, 78, 83, 83, 83, 83, 83, 83,
+   83, 83, 83, 83, 83, 83, 83, 83,  2,  2, 82, 82, 82, 82, 82, 82,
+   82, 82, 82, 82, 82,  2,  2,  2,  2,  2,122,122,122,122,122,122,
+  122,122,122,122,  2,  2,  2,  2,  2,  2,  2,122,122,122,122,  2,
+    2,  2,  2,122,122,122,122,122,122,122, 89, 89, 89, 89, 89, 89,
+   89, 89, 89,  2,  2,  2,  2,  2,  2,  2,130,130,130,130,130,130,
+  130,130,130,130,130,  2,  2,  2,  2,  2,  2,  2,130,130,130,130,
+  130,130,144,144,144,144,144,144,144,144,144,144,  2,  2,  2,  2,
+    2,  2,156,156,156,156,156,156,156,156,156,156,  2,156,156,156,
+    2,  2,156,156,  2,  2,  2,  2,  2,  2,147,147,147,147,147,147,
+  147,147,148,148,148,148,148,148,148,148,148,148,  2,  2,  2,  2,
+    2,  2,158,158,158,158,158,158,158,158,158,158,  2,  2,  2,  2,
+    2,  2,153,153,153,153,153,153,153,153,153,153,153,153,  2,  2,
+    2,  2,149,149,149,149,149,149,149,149,149,149,149,149,149,149,
+  149,  2, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+    2,  2,  2,  2, 94, 94, 94, 94, 94, 94,  2,  2,  2,  2,  2,  2,
+    2, 94, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,  2,  2,  2,
+    2,  2,  2,  2,  2,  2,  2, 85,  2,  2,101,101,101,101,101,101,
+  101,101,101,  2,  2,  2,  2,  2,  2,  2,101,101,  2,  2,  2,  2,
+    2,  2, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,  2,
+   96, 96,111,111,111,111,111,111,111,111,111,111,111,111,111,111,
+  111,  2,100,100,100,100,100,100,100,100,  2, 36, 36, 36, 36, 36,
+   36, 36, 36, 36, 36, 36, 36,  2,  2,  2,108,108,108,108,108,108,
+  108,108,108,108,  2,108,108,108,108,108,108,108,108,108,108,108,
+  108,  2,129,129,129,129,129,129,129,  2,129,  2,129,129,129,129,
+    2,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,
+    2,129,129,129,  2,  2,  2,  2,  2,  2,109,109,109,109,109,109,
+  109,109,109,109,109,  2,  2,  2,  2,  2,109,109,  2,  2,  2,  2,
+    2,  2,107,107,107,107,  2,107,107,107,107,107,107,107,107,  2,
+    2,107,107,  2,  2,107,107,107,107,107,107,107,107,107,107,107,
+  107,107,107,  2,107,107,107,107,107,107,107,  2,107,107,  2,107,
+  107,107,107,107,  2,  1,107,107,107,107,107,  2,  2,107,107,107,
+    2,  2,107,  2,  2,  2,  2,  2,  2,107,  2,  2,  2,  2,  2,107,
+  107,107,107,107,107,107,  2,  2,107,107,107,107,107,107,107,  2,
+    2,  2,137,137,137,137,137,137,137,137,137,137,137,137,  2,137,
+  137,137,137,137,  2,  2,  2,  2,  2,  2,124,124,124,124,124,124,
+  124,124,124,124,  2,  2,  2,  2,  2,  2,123,123,123,123,123,123,
+  123,123,123,123,123,123,123,123,  2,  2,114,114,114,114,114,114,
+  114,114,114,114,114,114,114,  2,  2,  2,114,114,  2,  2,  2,  2,
+    2,  2, 32, 32, 32, 32, 32,  2,  2,  2,102,102,102,102,102,102,
+  102,102,102,102,  2,  2,  2,  2,  2,  2,126,126,126,126,126,126,
+  126,126,126,126,126,  2,  2,126,126,126,126,126,126,126,  2,  2,
+    2,  2,126,126,126,126,126,126,126,  2,142,142,142,142,142,142,
+  142,142,142,142,142,142,  2,  2,  2,  2,125,125,125,125,125,125,
+  125,125,125,125,125,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+    2,125,154,154,154,154,154,154,154,  2,  2,154,  2,  2,154,154,
+  154,154,154,154,154,154,  2,154,154,  2,154,154,154,154,154,154,
+  154,154,154,154,154,154,154,154,  2,154,154,  2,  2,154,154,154,
+  154,154,154,154,  2,  2,  2,  2,  2,  2,150,150,150,150,150,150,
+  150,150,  2,  2,150,150,150,150,150,150,150,150,150,150,150,  2,
+    2,  2,141,141,141,141,141,141,141,141,140,140,140,140,140,140,
+  140,140,140,140,140,  2,  2,  2,  2,  2,121,121,121,121,121,121,
+  121,121,121,  2,  2,  2,  2,  2,  2,  2,133,133,133,133,133,133,
+  133,133,133,  2,133,133,133,133,133,133,133,133,133,133,133,133,
+  133,  2,133,133,133,133,133,133,  2,  2,133,133,133,133,133,  2,
+    2,  2,134,134,134,134,134,134,134,134,  2,  2,134,134,134,134,
+  134,134,  2,134,134,134,134,134,134,134,134,134,134,134,134,134,
+  134,  2,138,138,138,138,138,138,138,  2,138,138,  2,138,138,138,
+  138,138,138,138,138,138,138,138,138,138,  2,  2,138,  2,138,138,
+    2,138,138,138,  2,  2,  2,  2,  2,  2,143,143,143,143,143,143,
+    2,143,143,  2,143,143,143,143,143,143,143,143,143,143,143,143,
+  143,143,143,143,143,143,143,143,143,  2,143,143,  2,143,143,143,
+  143,143,143,  2,  2,  2,  2,  2,  2,  2,143,143,  2,  2,  2,  2,
+    2,  2,145,145,145,145,145,145,145,145,145,  2,  2,  2,  2,  2,
+    2,  2, 86,  2,  2,  2,  2,  2,  2,  2, 22, 22,  2,  2,  2,  2,
+    2,  2,  2,  2,  2,  2,  2,  2,  2, 22, 63, 63, 63, 63, 63, 63,
+   63, 63, 63, 63,  2,  2,  2,  2,  2,  2, 63, 63, 63, 63, 63, 63,
+   63,  2, 63, 63, 63, 63, 63,  2,  2,  2, 63, 63, 63, 63,  2,  2,
+    2,  2,157,157,157,157,157,157,157,157,157,157,157,  2,  2,  2,
+    2,  2, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
+   80,  2, 80,  2,  2,  2,  2,  2,  2,  2,127,127,127,127,127,127,
+  127,127,127,127,127,127,127,127,127,  2, 79,  2,  2,  2,  2,  2,
+    2,  2,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+  115,  2,115,115,  2,  2,  2,  2,115,115,159,159,159,159,159,159,
+  159,159,159,159,159,159,159,159,159,  2,159,159,  2,  2,  2,  2,
+    2,  2,103,103,103,103,103,103,103,103,103,103,103,103,103,103,
+    2,  2,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
+    2,  2,119,119,  2,119,119,119,119,119,  2,  2,  2,  2,  2,119,
+  119,119,146,146,146,146,146,146,146,146,146,146,146,  2,  2,  2,
+    2,  2, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,  2,  2,  2,
+    2, 99,  2,  2,  2,  2,  2,  2,  2, 99,136,139, 13, 13,155,  2,
+    2,  2,136,136,136,136,136,136,136,136,155,155,155,155,155,155,
+  155,155,155,155,155,155,155,155,  2,  2,136,  2,  2,  2,  2,  2,
+    2,  2, 17, 17, 17, 17,  2, 17, 17, 17, 17, 17, 17, 17,  2, 17,
+   17,  2, 17, 15, 15, 15, 15, 15, 15, 15, 17, 17, 17,  2,  2,  2,
+    2,  2, 15, 15, 15,  2,  2,  2,  2,  2,  2,  2,  2,  2, 17, 17,
+   17, 17,139,139,139,139,139,139,139,139,139,139,139,139,  2,  2,
+    2,  2,105,105,105,105,105,105,105,105,105,105,105,  2,  2,  2,
+    2,  2,105,105,105,105,105,  2,  2,  2,105,  2,  2,  2,  2,  2,
+    2,  2,105,105,  2,  2,105,105,105,105,  1,  1,  1,  1,  1,  1,
+    2,  2,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  1,  1,  1,  0,  0,  1,
+    1,  1,  1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,
+    0,  0,  2,  2,  0,  2,  2,  0,  0,  2,  2,  0,  0,  0,  0,  2,
+    0,  0,  0,  0,  2,  0,  2,  0,  0,  0,  0,  0,  0,  0,  2,  0,
+    0,  0,  0,  0,  0,  2,  2,  0,  0,  0,  0,  0,  2,  0,  0,  0,
+    0,  2,  0,  0,  0,  0,  0,  2,  0,  2,  2,  2,  0,  0,  0,  0,
+    0,  0,  0,  2,  0,  0,  0,  0,  0,  0,131,131,131,131,131,131,
+  131,131,131,131,131,131,  2,  2,  2,  2,  2,  2,  2,131,131,131,
+  131,131,  2,131,131,131,131,131,131,131, 56, 56, 56, 56, 56, 56,
+   56,  2, 56,  2,  2, 56, 56, 56, 56, 56, 56, 56,  2, 56, 56,  2,
+   56, 56, 56, 56, 56,  2,  2,  2,  2,  2,151,151,151,151,151,151,
+  151,151,151,151,151,151,151,  2,  2,  2,151,151,151,151,151,151,
+    2,  2,151,151,  2,  2,  2,  2,151,151,160,160,160,160,160,160,
+  160,160,160,160,160,160,160,160,160,  2,152,152,152,152,152,152,
+  152,152,152,152,  2,  2,  2,  2,  2,152, 30, 30, 30, 30,  2, 30,
+   30,  2,113,113,113,113,113,113,113,113,113,113,113,113,113,  2,
+    2,113,113,113,113,113,113,113,113,  2,132,132,132,132,132,132,
+  132,132,132,132,132,132,  2,  2,  2,  2,132,132,  2,  2,  2,  2,
+  132,132,  3,  3,  3,  3,  2,  3,  3,  3,  2,  3,  3,  2,  3,  2,
+    2,  3,  2,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  2,  3,  3,
+    3,  3,  2,  3,  2,  3,  2,  2,  2,  2,  2,  2,  3,  2,  2,  2,
+    2,  3,  2,  3,  2,  3,  2,  3,  3,  3,  2,  3,  2,  3,  2,  3,
+    2,  3,  2,  3,  3,  3,  3,  2,  3,  2,  3,  3,  2,  3,  3,  3,
+    3,  3,  3,  3,  3,  3,  2,  2,  2,  2,  2,  3,  3,  3,  2,  3,
+    3,  3,  2,  2,  2,  2,  2,  2,  0,  0, 15,  0,  0,  2,  2,  2,
+    2,  2,  2,  2,  2,  2,  2,  0,  0,  0, 13,  2,  2,  2,  2,  2,
+    2,  2, 13, 13, 13,  2,  2,  2,  2,  2,  2,  0,  2,  2,  2,  2,
+    2,  2,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  9,  9,  9, 10,
+    9, 11, 12, 13,  9,  9,  9, 14,  9,  9, 15,  9,  9,  9,  9,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    9,  9, 16, 17,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 18, 19,
-   20,  9, 21,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 16, 17,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 18, 19, 20,  9, 21,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 22,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 22,  9,  9,  9,  9,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
@@ -4909,60 +4993,60 @@ _hb_ucd_u8[17508] =
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    9,  9, 23, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12,  0,  0, 13, 14,
-   15, 16, 17, 18, 19, 20, 21, 22,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0, 23,  0,  0, 24, 25, 26, 27, 28,
-   29, 30,  0,  0, 31, 32,  0, 33,  0, 34,  0, 35,  0,  0,  0,  0,
-   36, 37, 38, 39,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0, 40,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-   41, 42,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0, 43, 44,  0, 45,  0,  0,  0,  0,  0,  0,
-   46, 47,  0,  0,  0,  0,  0, 48,  0, 49,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0, 50, 51,  0,  0,  0, 52,  0,  0,
-   53,  0,  0,  0,  0,  0,  0,  0, 54,  0,  0,  0,  0,  0,  0,  0,
-   55,  0,  0,  0,  0,  0,  0,  0, 56,  0,  0,  0,  0,  0,  0,  0,
-    0, 57,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0, 58, 59, 60, 61, 62, 63, 64, 65,
-    0,  0,  0,  0,  0,  0, 66,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  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, 67, 68,  0, 69, 70,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82,
-   83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98,
-   99,100,101,102,103,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,104,  0,  0,  0,  0,  0,  0,105,106,  0,
-  107,  0,  0,  0,108,  0,109,  0,110,  0,111,112,113,  0,114,  0,
-    0,  0,115,  0,  0,  0,116,  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,117,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,118,119,120,121,  0,122,123,124,
-  125,126,  0,127,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,128,129,130,131,132,133,134,135,136,137,138,139,
-  140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,
-  156,157,  0,  0,  0,158,159,160,161,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,162,163,  0,
-    0,  0,  0,  0,  0,  0,164,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,165,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,166,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,167,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,168,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,169,170,  0,  0,  0,  0,171,
-  172,  0,  0,  0,173,174,175,176,177,178,179,180,181,182,183,184,
-  185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,
-  201,202,203,204,205,206,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    1,  2,  3,  4,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 23, 24,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  3,  4,
+    5,  6,  7,  8,  9, 10, 11, 12,  0,  0, 13, 14, 15, 16, 17, 18,
+   19, 20, 21, 22,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0, 23,  0,  0, 24, 25, 26, 27, 28, 29, 30,  0,  0,
+   31, 32,  0, 33,  0, 34,  0, 35,  0,  0,  0,  0, 36, 37, 38, 39,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0, 40,  0,  0,  0,  0,  0,  0,  0,  0,  0, 41, 42,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0, 43, 44,  0, 45,  0,  0,  0,  0,  0,  0, 46, 47,  0,  0,
+    0,  0,  0, 48,  0, 49,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0, 50, 51,  0,  0,  0, 52,  0,  0, 53,  0,  0,  0,
+    0,  0,  0,  0, 54,  0,  0,  0,  0,  0,  0,  0, 55,  0,  0,  0,
+    0,  0,  0,  0, 56,  0,  0,  0,  0,  0,  0,  0,  0, 57,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0, 58, 59, 60, 61, 62, 63, 64, 65,  0,  0,  0,  0,
+    0,  0, 66,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  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,
+   67, 68,  0, 69, 70,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+   71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86,
+   87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,100,101,102,
+  103,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,104,  0,  0,  0,  0,  0,  0,105,106,  0,107,  0,  0,  0,
+  108,  0,109,  0,110,  0,111,112,113,  0,114,  0,  0,  0,115,  0,
+    0,  0,116,  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,117,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,118,119,120,121,  0,122,123,124,125,126,  0,127,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+  128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
+  144,145,146,147,148,149,150,151,152,153,154,155,156,157,  0,  0,
+    0,158,159,160,161,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,162,163,  0,  0,  0,  0,  0,
+    0,  0,164,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,165,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,166,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,167,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,168,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,169,170,  0,  0,  0,  0,171,172,  0,  0,  0,
+  173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,
+  189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,
+  205,206,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  3,  4,
 };
 static const uint16_t
-_hb_ucd_u16[9080] =
+_hb_ucd_u16[9200] =
 {
      0,   0,   1,   2,   3,   4,   5,   6,   0,   0,   7,   8,   9,  10,  11,  12,
     13,  13,  13,  14,  15,  13,  13,  16,  17,  18,  19,  20,  21,  22,  13,  23,
@@ -4972,566 +5056,573 @@ _hb_ucd_u16[9080] =
     13,  13,  13,  42,   9,  43,  11,  11,  44,  45,  32,  46,  47,  48,  49,  50,
     51,  52,  48,  48,  53,  32,  54,  55,  48,  48,  48,  48,  48,  56,  57,  58,
     59,  60,  48,  32,  61,  48,  48,  48,  48,  48,  62,  63,  64,  48,  65,  66,
-    48,  67,  68,  69,  48,  70,  71,  72,  72,  72,  48,  73,  74,  75,  76,  32,
-    77,  48,  48,  78,  79,  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,
-    91,  84,  85,  92,  93,  94,  95,  96,  97,  98,  85,  99, 100, 101,  89, 102,
-   103,  84,  85, 104, 105, 106,  89, 107, 108, 109, 110, 111, 112, 113,  95, 114,
-   115, 116,  85, 117, 118, 119,  89, 120, 121, 116,  85, 122, 123, 124,  89, 125,
-   126, 116,  48, 127, 128, 129,  89, 130, 131, 132,  48, 133, 134, 135,  95, 136,
-   137,  48,  48, 138, 139, 140,  72,  72, 141,  48, 142, 143, 144, 145,  72,  72,
-   146, 147, 148, 149, 150,  48, 151, 152, 153, 154,  32, 155, 156, 157,  72,  72,
+    48,  67,  68,  69,  48,  70,  71,  48,  72,  73,  48,  48,  74,  32,  75,  32,
+    76,  48,  48,  77,  78,  79,  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,
+    90,  83,  84,  91,  92,  93,  94,  95,  96,  97,  84,  98,  99, 100,  88, 101,
+   102,  83,  84, 103, 104, 105,  88, 106, 107, 108, 109, 110, 111, 112,  94, 113,
+   114, 115,  84, 116, 117, 118,  88, 119, 120, 115,  84, 121, 122, 123,  88, 124,
+   125, 115,  48, 126, 127, 128,  88, 129, 130, 131,  48, 132, 133, 134,  94, 135,
+   136,  48,  48, 137, 138, 139, 140, 140, 141,  48, 142, 143, 144, 145, 140, 140,
+   146, 147, 148, 149, 150,  48, 151, 152, 153, 154,  32, 155, 156, 157, 140, 140,
     48,  48, 158, 159, 160, 161, 162, 163, 164, 165,   9,   9, 166,  11,  11, 167,
     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 168, 169,  48,  48,
    168,  48,  48, 170, 171, 172,  48,  48,  48, 171,  48,  48,  48, 173, 174, 175,
     48, 176,   9,   9,   9,   9,   9, 177, 178,  48,  48,  48,  48,  48,  48,  48,
     48,  48,  48,  48,  48,  48, 179,  48, 180, 181,  48,  48,  48,  48, 182, 183,
-   184, 185,  48, 186,  48, 187, 184, 188,  48,  48,  48, 189, 190, 191, 192, 193,
+    48, 184,  48, 185,  48, 186, 187, 188,  48,  48,  48, 189, 190, 191, 192, 193,
    194, 192,  48,  48, 195,  48,  48, 196, 197,  48, 198,  48,  48,  48,  48, 199,
     48, 200, 201, 202, 203,  48, 204, 205,  48,  48, 206,  48, 207, 208, 209, 209,
-    48, 210,  48,  48,  48, 211, 212, 213, 192, 192, 214, 215, 216,  72,  72,  72,
+    48, 210,  48,  48,  48, 211, 212, 213, 192, 192, 214, 215, 216, 140, 140, 140,
    217,  48,  48, 218, 219, 160, 220, 221, 222,  48, 223,  64,  48,  48, 224, 225,
     48,  48, 226, 227, 228,  64,  48, 229, 230,   9,   9, 231, 232, 233, 234, 235,
-    11,  11, 236,  27,  27,  27, 237, 238,  11, 239,  27,  27,  32,  32,  32, 240,
-    13,  13,  13,  13,  13,  13,  13,  13,  13, 241,  13,  13,  13,  13,  13,  13,
-   242, 243, 242, 242, 243, 244, 242, 245, 246, 246, 246, 247, 248, 249, 250, 251,
-   252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 262,  72, 263, 264, 216,
-   265, 266, 267, 268, 269, 270, 271, 271, 272, 273, 274, 209, 275, 276, 209, 277,
-   278, 278, 278, 278, 278, 278, 278, 278, 279, 209, 280, 209, 209, 209, 209, 281,
-   209, 282, 278, 283, 209, 284, 285, 209, 209, 209, 286,  72, 287,  72, 270, 270,
-   270, 288, 209, 209, 209, 209, 289, 270, 209, 209, 209, 209, 209, 209, 209, 209,
-   209, 209, 209, 290, 291, 209, 209, 292, 209, 209, 209, 209, 209, 209, 293, 209,
-   209, 209, 209, 209, 209, 209, 294, 295, 270, 296, 209, 209, 297, 278, 298, 278,
-   299, 300, 278, 278, 278, 301, 278, 302, 209, 209, 209, 278, 303, 209, 209, 304,
-   209, 305, 209, 209, 209, 209, 209, 209,   9,   9, 306,  11,  11, 307, 308, 309,
-    13,  13,  13,  13,  13,  13, 310, 311,  11,  11, 312,  48,  48,  48, 313, 314,
-    48, 315, 316, 316, 316, 316,  32,  32, 317, 318, 319, 320, 321, 322,  72,  72,
-   209, 323, 209, 209, 209, 209, 209, 324, 209, 209, 209, 209, 209, 325,  72, 326,
-   327, 328, 329, 330, 137,  48,  48,  48,  48, 331, 178,  48,  48,  48,  48, 332,
-   333,  48,  48, 137,  48,  48,  48,  48, 200, 334,  48,  48, 209, 209, 324,  48,
-   209, 335, 336, 209, 337, 338, 209, 209, 336, 209, 209, 338, 209, 209, 209, 209,
-    48,  48,  48,  48, 209, 209, 209, 209,  48,  48,  48,  48,  48,  48,  48, 151,
-    48, 339,  48,  48,  48,  48,  48,  48, 151, 209, 209, 209, 286,  48,  48, 229,
-   340,  48, 341,  72,  13,  13, 342, 343,  13, 344,  48,  48,  48,  48, 345, 346,
-    31, 347, 348, 349,  13,  13,  13, 350, 351, 352, 353, 354, 355,  72,  72, 356,
-   357,  48, 358, 359,  48,  48,  48, 360, 361,  48,  48, 362, 363, 192,  32, 364,
-    64,  48, 365,  48, 366, 367,  48, 151,  77,  48,  48, 368, 369, 370, 371, 372,
-    48,  48, 373, 374, 375, 376,  48, 377,  48,  48,  48, 378, 379, 380, 381, 382,
-   383, 384, 316,  11,  11, 385, 386,  11,  11,  11,  11,  11,  48,  48, 387, 192,
-    48,  48, 388,  48, 389,  48,  48, 206, 390, 390, 390, 390, 390, 390, 390, 390,
-   391, 391, 391, 391, 391, 391, 391, 391,  48,  48,  48,  48,  48,  48, 204,  48,
-    48,  48,  48,  48,  48, 207,  72,  72, 392, 393, 394, 395, 396,  48,  48,  48,
-    48,  48,  48, 397, 398, 399,  48,  48,  48,  48,  48, 400,  72,  48,  48,  48,
-    48, 401,  48,  48,  74,  72,  72, 402,  32, 403,  32, 404, 405, 406, 407,  73,
-    48,  48,  48,  48,  48,  48,  48, 408, 409,   2,   3,   4,   5, 410, 411, 412,
-    48, 413,  48, 200, 414, 415, 416, 417, 418,  48, 172, 419, 204, 204,  72,  72,
-    48,  48,  48,  48,  48,  48,  48,  71, 420, 270, 270, 421, 271, 271, 271, 422,
-   423, 424, 425,  72,  72, 209, 209, 426,  72,  72,  72,  72,  72,  72,  72,  72,
-    48, 151,  48,  48,  48, 101, 427, 428,  48,  48, 429,  48, 430,  48,  48, 431,
-    48, 432,  48,  48, 433, 434,  72,  72,   9,   9, 435,  11,  11,  48,  48,  48,
-    48, 204, 192,   9,   9, 436,  11, 437,  48,  48,  74,  48,  48,  48, 438,  72,
-    48,  48,  48, 315,  48, 199,  74,  72, 439,  48,  48, 440,  48, 441,  48, 442,
-    48, 200, 443,  72,  72,  72,  48, 444,  48, 445,  48, 446,  72,  72,  72,  72,
-    48,  48,  48, 447, 270, 448, 270, 270, 449, 450,  48, 451, 452, 453,  48, 454,
-    48, 455,  72,  72, 456,  48, 457, 458,  48,  48,  48, 459,  48, 460,  48, 461,
-    48, 462, 463,  72,  72,  72,  72,  72,  48,  48,  48,  48, 196,  72,  72,  72,
-     9,   9,   9, 464,  11,  11,  11, 465,  48,  48, 466, 192,  72,  72,  72,  72,
-    72,  72,  72,  72,  72,  72, 270, 467,  48,  48, 468, 469,  72,  72,  72,  72,
-    48, 455, 470,  48,  62, 471,  72,  72,  72,  72,  72,  48, 472,  72,  48, 315,
-   473,  48,  48, 474, 475, 448, 476, 477, 222,  48,  48, 478, 479,  48, 196, 192,
-   480,  48, 481, 482, 483,  48,  48, 484, 222,  48,  48, 485, 486, 487, 488, 489,
-    48,  98, 490, 491,  72,  72,  72,  72, 492, 493, 494,  48,  48, 495, 496, 192,
-   497,  84,  85, 498, 499, 500, 501, 502,  48,  48,  48, 503, 504, 505, 469,  72,
-    48,  48,  48, 506, 507, 192,  72,  72,  48,  48, 508, 509, 510, 511,  72,  72,
-    48,  48,  48, 512, 513, 192, 514,  72,  48,  48, 515, 516, 192,  72,  72,  72,
-    48, 173, 517, 518,  72,  72,  72,  72,  48,  48, 490, 519,  72,  72,  72,  72,
-    72,  72,   9,   9,  11,  11, 148, 520, 521, 522,  48, 523, 524, 192,  72,  72,
-    72,  72, 525,  48,  48, 526, 527,  72, 528,  48,  48, 529, 530, 531,  48,  48,
-   532, 533, 534,  72,  48,  48,  48, 196,  85,  48, 508, 535, 536, 148, 175, 537,
-    48, 538, 539, 540,  72,  72,  72,  72, 541,  48,  48, 542, 543, 192, 544,  48,
-   545, 546, 192,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  48, 547,
-    72,  72,  72, 101, 270, 548, 549, 550,  48, 207,  72,  72,  72,  72,  72,  72,
-   271, 271, 271, 271, 271, 271, 551, 552,  48,  48,  48,  48, 388,  72,  72,  72,
-    48,  48, 200, 553,  72,  72,  72,  72,  48,  48,  48,  48, 315,  72,  72,  72,
-    48,  48,  48, 196,  48, 200, 370,  72,  72,  72,  72,  72,  72,  48, 204, 554,
-    48,  48,  48, 555, 556, 557, 558, 559,  48,  72,  72,  72,  72,  72,  72,  72,
-    72,  72,  72,  72,   9,   9,  11,  11, 270, 560,  72,  72,  72,  72,  72,  72,
-    48,  48,  48,  48, 561, 562, 563, 563, 564, 565,  72,  72,  72,  72, 566, 567,
-    48,  48,  48,  48,  48,  48,  48,  74,  48,  48,  48,  48,  48, 199,  72,  72,
-   196,  72,  72,  72,  72,  72,  72,  72,  48, 200,  72,  72,  72, 568, 569,  48,
-    48,  48,  48,  48,  48,  48,  48, 206,  48,  48,  48,  48,  48,  48,  71, 151,
-   196, 570, 571,  72,  72,  72,  72,  72, 209, 209, 209, 209, 209, 209, 209, 325,
-   209, 209, 572, 209, 209, 209, 573, 574, 575, 209, 576, 209, 209, 209, 577,  72,
-   209, 209, 209, 209, 578,  72,  72,  72,  72,  72,  72,  72,  72,  72, 270, 579,
-   209, 209, 209, 209, 209, 286, 270, 452,   9, 580,  11, 581, 582, 583, 242,   9,
-   584, 585, 586, 587, 588,   9, 580,  11, 589, 590,  11, 591, 592, 593, 594,   9,
-   595,  11,   9, 580,  11, 581, 582,  11, 242,   9, 584, 594,   9, 595,  11,   9,
-   580,  11, 596,   9, 597, 598, 599, 600,  11, 601,   9, 602, 603, 604, 605,  11,
-   606,   9, 607,  11, 608, 609, 609, 609,  32,  32,  32, 610,  32,  32, 611, 612,
-   613, 614,  45,  72,  72,  72,  72,  72, 615, 616, 617,  72,  72,  72,  72,  72,
-    48,  48, 151, 618, 619,  72,  72,  72,  72,  72,  72,  72,  48,  48, 620, 621,
-    48,  48,  48,  48, 622, 623,  72,  72,   9,   9, 584,  11, 624, 370,  72,  72,
-    72,  72,  72,  72,  72,  72,  72, 488, 270, 270, 625, 626,  72,  72,  72,  72,
-   488, 270, 627, 628,  72,  72,  72,  72, 629,  48, 630, 631, 632, 633, 634, 635,
-   636, 206, 637, 206,  72,  72,  72, 638, 209, 209, 326, 209, 209, 209, 209, 209,
-   209, 324, 335, 639, 639, 639, 209, 325, 640, 209, 209, 209, 209, 209, 209, 209,
-   209, 209, 641,  72,  72,  72, 642, 209, 643, 209, 209, 326, 577, 644, 325,  72,
-   209, 209, 209, 209, 209, 209, 209, 645, 209, 209, 209, 209, 209, 646, 424, 424,
-   209, 209, 209, 209, 209, 209, 209, 324, 209, 209, 209, 209, 209, 577, 326,  72,
-   326, 209, 209, 209, 646, 176, 209, 209, 646, 209, 641, 644,  72,  72,  72,  72,
-   209, 209, 209, 209, 209, 209, 209, 647, 209, 209, 209, 209, 648, 209, 209, 209,
-   209, 209, 209, 209, 209, 324, 641, 649, 286, 209, 577, 286, 643, 286,  72,  72,
-   209, 650, 209, 209, 287,  72,  72, 192,  48,  48,  48,  48,  48, 204,  72,  72,
-    48,  48,  48, 205,  48,  48,  48,  48,  48, 204,  48,  48,  48,  48,  48,  48,
-    48,  48, 469,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 101,  72,
-    48, 204,  72,  72,  72,  72,  72,  72,  48,  48,  48,  48,  71,  72,  72,  72,
-   651,  72, 652, 652, 652, 652, 652, 652,  32,  32,  32,  32,  32,  32,  32,  32,
-    32,  32,  32,  32,  32,  32,  32,  72, 391, 391, 391, 391, 391, 391, 391, 653,
-   391, 391, 391, 391, 391, 391, 391, 654,   0,   0,   0,   0,   0,   0,   0,   0,
-     1,   2,   2,   3,   1,   2,   2,   3,   0,   0,   0,   0,   0,   4,   0,   4,
-     2,   2,   5,   2,   2,   2,   5,   2,   2,   2,   2,   2,   2,   2,   2,   2,
-     2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   6,
-     0,   0,   0,   0,   7,   8,   0,   0,   9,   9,   9,   9,   9,   9,   9,   9,
-     9,   9,   9,   9,   9,   9,  10,  11,  12,  13,  14,  14,  15,  14,  14,  14,
-    14,  14,  14,  14,  16,  17,  14,  14,  18,  18,  18,  18,  18,  18,  18,  18,
-    18,  18,  18,  18,  18,  18,  18,  18,  19,  18,  18,  18,  18,  18,  18,  18,
-    18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  20,  21,
-    21,  21,  22,  20,  21,  21,  21,  21,  21,  23,  24,  25,  25,  25,  25,  25,
-    25,  26,  25,  25,  25,  27,  28,  26,  29,  30,  31,  32,  31,  31,  31,  31,
-    33,  34,  35,  31,  31,  31,  36,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-    31,  31,  31,  29,  31,  31,  31,  31,  37,  38,  37,  37,  37,  37,  37,  37,
-    37,  39,  31,  31,  31,  31,  31,  31,  40,  40,  40,  40,  40,  40,  41,  26,
-    42,  42,  42,  42,  42,  42,  42,  43,  44,  44,  44,  44,  44,  45,  44,  46,
-    47,  47,  47,  48,  37,  49,  26,  26,  26,  26,  26,  26,  31,  31,  50,  31,
-    31,  26,  51,  31,  52,  31,  31,  31,  53,  53,  53,  53,  53,  53,  53,  53,
-    53,  53,  54,  53,  55,  53,  53,  53,  56,  57,  58,  59,  59,  60,  61,  62,
-    57,  63,  64,  65,  66,  59,  59,  67,  68,  69,  70,  71,  71,  72,  73,  74,
-    69,  75,  76,  77,  78,  71,  79,  26,  80,  81,  82,  83,  83,  84,  85,  86,
-    81,  87,  88,  26,  89,  83,  90,  91,  92,  93,  94,  95,  95,  96,  97,  98,
-    93,  99, 100, 101, 102,  95,  95,  26, 103, 104, 105, 106, 107, 104, 108, 109,
-   104, 105, 110,  26, 111, 108, 108, 112, 113, 114, 115, 113, 113, 115, 113, 116,
-   114, 117, 118, 119, 120, 113, 121, 113, 122, 123, 124, 122, 122, 124, 125, 126,
-   123, 127, 128, 129, 130, 122, 131,  26, 132, 133, 134, 132, 132, 132, 132, 132,
-   133, 134, 135, 132, 136, 132, 132, 132, 137, 138, 139, 140, 138, 138, 141, 142,
-   139, 143, 144, 138, 145, 138, 146,  26, 147, 148, 148, 148, 148, 148, 148, 149,
-   148, 148, 148, 150,  26,  26,  26,  26, 151, 152, 153, 153, 154, 153, 153, 155,
-   156, 155, 153, 157,  26,  26,  26,  26, 158, 158, 158, 158, 158, 158, 158, 158,
-   158, 159, 158, 158, 158, 160, 159, 158, 158, 158, 158, 159, 158, 158, 158, 161,
-   158, 161, 162, 163,  26,  26,  26,  26, 164, 164, 164, 164, 164, 164, 164, 164,
-   164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 165, 165, 165, 165,
-   166, 167, 165, 165, 165, 165, 165, 168, 169, 169, 169, 169, 169, 169, 169, 169,
-   169, 169, 169, 169, 169, 169, 169, 169, 170, 170, 170, 170, 170, 170, 170, 170,
-   170, 171, 172, 171, 170, 170, 170, 170, 170, 171, 170, 170, 170, 170, 171, 172,
-   171, 170, 172, 170, 170, 170, 170, 170, 170, 170, 171, 170, 170, 170, 170, 170,
-   170, 170, 170, 173, 170, 170, 170, 174, 170, 170, 170, 175, 176, 176, 176, 176,
-   176, 176, 176, 176, 176, 176, 177, 177, 178, 178, 178, 178, 178, 178, 178, 178,
-   178, 178, 178, 178, 178, 178, 178, 178, 179, 179, 179, 180, 181, 181, 181, 181,
-   181, 181, 181, 181, 181, 182, 181, 183, 184, 185, 186,  26, 187, 187, 188,  26,
-   189, 189, 190,  26, 191, 192, 193,  26, 194, 194, 194, 194, 194, 194, 194, 194,
-   194, 194, 194, 195, 194, 196, 194, 196, 197, 198, 199, 200, 199, 199, 199, 199,
-   199, 199, 199, 199, 199, 199, 199, 201, 199, 199, 199, 199, 199, 202, 178, 178,
-   178, 178, 178, 178, 178, 178, 203,  26, 204, 204, 204, 205, 204, 206, 204, 206,
-   207, 204, 208, 208, 208, 209, 210,  26, 211, 211, 211, 211, 211, 212, 211, 211,
-   211, 213, 211, 214, 194, 194, 194, 194, 215, 215, 215, 216, 217, 217, 217, 217,
-   217, 217, 217, 218, 217, 217, 217, 219, 217, 220, 217, 220, 217, 221,   9,   9,
-   222,  26,  26,  26,  26,  26,  26,  26, 223, 223, 223, 223, 223, 223, 223, 223,
-   223, 224, 223, 223, 223, 223, 223, 225, 226, 226, 226, 226, 226, 226, 226, 226,
-   227, 227, 227, 227, 227, 227, 228, 229, 230, 230, 230, 230, 230, 230, 230, 231,
-   230, 232, 233, 233, 233, 233, 233, 233,  18, 234, 165, 165, 165, 165, 165, 235,
-   226,  26, 236,   9, 237, 238, 239, 240,   2,   2,   2,   2, 241, 242,   2,   2,
-     2,   2,   2, 243, 244, 245,   2, 246,   2,   2,   2,   2,   2,   2,   2, 247,
-     9,   9,   9,   9,   9,   9,   9, 248,  14,  14, 249, 249,  14,  14,  14,  14,
-   249, 249,  14, 250,  14,  14,  14, 249,  14,  14,  14,  14,  14,  14, 251,  14,
-   251,  14, 252, 253,  14,  14, 254, 255,   0, 256,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0, 257,   0, 258, 259,   0, 260,   2, 261,   0,   0,   0,   0,
-    26,  26,   9,   9,   9,   9, 222,  26,   0,   0,   0,   0, 262, 263,   4,   0,
-     0, 264,   0,   0,   2,   2,   2,   2,   2, 265,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 260,  26,  26,  26,
-     0, 266,  26,  26,   0,   0,   0,   0, 267, 267, 267, 267, 267, 267, 267, 267,
-   267, 267, 267, 267, 267, 267, 267, 267,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0, 268,   0,   0,   0, 269,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0, 270, 270, 270, 270, 270, 271, 270, 270,
-   270, 270, 270, 271,   2,   2,   2,   2,  17,  17,  17,  17,  17,  17,  17,  17,
-    17,  17,  17,  17,  17,  17, 272, 273, 165, 165, 165, 165, 166, 167, 274, 274,
-   274, 274, 274, 274, 274, 275, 276, 275, 170, 170, 172,  26, 172, 172, 172, 172,
-   172, 172, 172, 172,  18,  18,  18,  18,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0, 266,  26,  26,  26,  26,  26, 277, 277, 277, 278, 277, 277, 277, 277,
-   277, 277, 277, 277, 277, 277, 279,  26, 277, 277, 277, 277, 277, 277, 277, 277,
-   277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
-   277, 277, 280,  26,  26,  26,   0, 281, 282,   0,   0,   0, 283, 284,   0, 285,
-   286, 287, 287, 287, 287, 287, 287, 287, 287, 287, 288, 289, 290, 291, 291, 291,
-   291, 291, 291, 291, 291, 291, 291, 292, 293, 294, 294, 294, 294, 294, 295, 169,
-   169, 169, 169, 169, 169, 169, 169, 169, 169, 296,   0,   0, 294, 294, 294, 294,
-     0,   0,   0,   0, 281,  26, 291, 291, 169, 169, 169, 296,   0,   0,   0,   0,
-     0,   0,   0,   0, 169, 169, 169, 297,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0, 291, 291, 291, 291, 291, 298, 291, 291, 291, 291, 291, 291, 291, 291,
-   291, 291, 291,   0,   0,   0,   0,   0, 277, 277, 277, 277, 277, 277, 277, 277,
-     0,   0,   0,   0,   0,   0,   0,   0, 277, 277, 277, 277, 277, 277, 277, 277,
-   277, 277, 277, 277, 277, 277, 277, 299, 300, 300, 300, 300, 300, 300, 300, 300,
-   300, 300, 300, 300, 300, 300, 300, 300, 300, 301, 300, 300, 300, 300, 300, 300,
-   302,  26, 303, 303, 303, 303, 303, 303, 304, 304, 304, 304, 304, 304, 304, 304,
-   304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 305,  26,  26,
-    18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18, 306, 306, 306, 306,
-   306, 306, 306, 306, 306, 306, 306,  26,   0,   0,   0,   0, 307,   2,   2,   2,
-     2,   2,   2,   2,   2,   2,   2,   2,   2, 308,   2,   2,   2,   2,   2,   2,
-   309, 310,  26,  26,  26,  26, 311,   2, 312, 312, 312, 312, 312, 313,   0, 314,
-   315, 315, 315, 315, 315, 315, 315,  26, 316, 316, 316, 316, 316, 316, 316, 316,
-   317, 318, 316, 319,  53,  53,  53,  53, 320, 320, 320, 320, 320, 321, 322, 322,
-   322, 322, 323, 324, 169, 169, 169, 325, 326, 326, 326, 326, 326, 326, 326, 326,
-   326, 327, 326, 328, 164, 164, 164, 329, 330, 330, 330, 330, 330, 330, 331,  26,
-   330, 332, 330, 333, 164, 164, 164, 164, 334, 334, 334, 334, 334, 334, 334, 334,
-   335,  26,  26, 336, 337, 337, 338,  26, 339, 339, 339,  26, 172, 172,   2,   2,
-     2,   2,   2, 340, 341, 342, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176,
-   337, 337, 337, 337, 337, 343, 337, 344, 169, 169, 169, 169, 345,  26, 169, 169,
-   296, 346, 169, 169, 169, 169, 169, 345,  26,  26,  26,  26,  26,  26,  26,  26,
-    26,  26,  26,  26,  26,  26,  26,  26, 277, 277, 277, 277, 277, 277, 277, 277,
-   277, 277, 277, 277, 277, 280, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
-   277, 277, 277, 347,  26,  26,  26,  26, 348,  26, 349, 350,  25,  25, 351, 352,
-   353,  25,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-   354,  26,  51,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-    31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31, 355,
-    26,  26,  31,  31,  31,  31,  31,  31,  31,  31, 356,  31,  31,  31,  31,  31,
-    31,  26,  26,  26,  26,  26,  31, 357,   9,   9,   0, 314,   9, 358,   0,   0,
-     0,   0, 359,   0, 260, 281,  50,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-    31,  31,  31,  31,  31,  31,  31, 360, 361,   0,   0,   0,   1,   2,   2,   3,
-     1,   2,   2,   3, 362, 291, 290, 291, 291, 291, 291, 363, 169, 169, 169, 296,
-   364, 364, 364, 365, 260, 260,  26, 366, 367, 368, 367, 367, 369, 367, 367, 370,
-   367, 371, 367, 371,  26,  26,  26,  26, 367, 367, 367, 367, 367, 367, 367, 367,
-   367, 367, 367, 367, 367, 367, 367, 372, 373,   0,   0,   0,   0,   0, 374,   0,
-    14,  14,  14,  14,  14,  14,  14,  14,  14, 255,   0, 375, 376,  26,  26,  26,
-    26,  26,   0,   0,   0,   0,   0, 377, 378, 378, 378, 379, 380, 380, 380, 380,
-   380, 380, 381,  26, 382,   0,   0, 281, 383, 383, 383, 383, 384, 385, 386, 386,
-   386, 387, 388, 388, 388, 388, 388, 389, 390, 390, 390, 391, 392, 392, 392, 392,
-   393, 392, 394,  26,  26,  26,  26,  26, 395, 395, 395, 395, 395, 395, 395, 395,
-   395, 395, 396, 396, 396, 396, 396, 396, 397, 397, 397, 398, 397, 399, 400, 400,
-   400, 400, 401, 400, 400, 400, 400, 401, 402, 402, 402, 402, 402,  26, 403, 403,
-   403, 403, 403, 403, 404, 405,  26,  26, 406, 406, 406, 406, 406, 406, 406, 406,
-   406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 407,  26,
-   406, 406, 408,  26, 406,  26,  26,  26, 409, 410, 411, 411, 411, 411, 412, 413,
-   414, 414, 415, 414, 416, 416, 416, 416, 417, 417, 417, 418, 419, 417,  26,  26,
-    26,  26,  26,  26, 420, 420, 421, 422, 423, 423, 423, 424, 425, 425, 425, 426,
-    26,  26,  26,  26,  26,  26,  26,  26, 427, 427, 427, 427, 428, 428, 428, 429,
-   428, 428, 430, 428, 428, 428, 428, 428, 431, 432, 433, 434, 435, 435, 436, 437,
-   435, 438, 435, 438, 439, 439, 439, 439, 440, 440, 440, 440,  26,  26,  26,  26,
-   441, 441, 441, 441, 442, 443, 442,  26, 444, 444, 444, 444, 444, 444, 445, 446,
-   447, 447, 448, 447, 449, 449, 450, 449, 451, 451, 452, 453,  26, 454,  26,  26,
-    26,  26,  26,  26,  26,  26,  26,  26, 455, 455, 455, 455, 455, 455, 455, 455,
-   455, 456,  26,  26,  26,  26,  26,  26, 457, 457, 457, 457, 457, 457, 458,  26,
-   457, 457, 457, 457, 457, 457, 458, 459, 460, 460, 460, 460, 460,  26, 460, 461,
-    26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-    26,  26,  26,  26,  31,  31,  31, 462, 463, 463, 463, 463, 463, 464, 465,  26,
-    26,  26,  26,  26,  26,  26,  26,  26, 466, 466, 466, 466, 466,  26, 467, 467,
-   467, 467, 467, 468,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26, 469, 469,
-   469, 470,  26,  26, 471, 471, 472,  26, 473, 473, 473, 473, 473, 473, 473, 473,
-   473, 474, 475, 473, 473, 473,  26, 476, 477, 477, 477, 477, 477, 477, 477, 477,
-   478, 479, 480, 480, 480, 481, 480, 482, 483, 483, 483, 483, 483, 483, 484, 483,
-   483,  26, 485, 485, 485, 485, 486,  26, 487, 487, 487, 487, 487, 487, 487, 487,
-   487, 487, 487, 487, 488, 138, 489,  26, 490, 490, 491, 490, 490, 490, 490, 492,
-    26,  26,  26,  26,  26,  26,  26,  26, 493, 494, 495, 496, 495, 497, 498, 498,
-   498, 498, 498, 498, 498, 499, 498, 500, 501, 502, 503, 504, 504, 505, 506, 507,
-   502, 508, 509, 510, 511, 512, 512,  26, 513, 513, 513, 513, 513, 513, 513, 513,
-   513, 513, 513, 514, 515,  26,  26,  26, 516, 516, 516, 516, 516, 516, 516, 516,
-   516,  26, 516, 517,  26,  26,  26,  26, 518, 518, 518, 518, 518, 518, 519, 518,
-   518, 518, 518, 519,  26,  26,  26,  26, 520, 520, 520, 520, 520, 520, 520, 520,
-   521,  26, 520, 522, 199, 523,  26,  26, 524, 524, 524, 524, 524, 524, 524, 525,
-   524, 526,  26,  26,  26,  26,  26,  26, 527, 527, 527, 528, 527, 529, 527, 527,
-    26,  26,  26,  26,  26,  26,  26,  26, 530, 530, 530, 530, 530, 530, 530, 531,
-    26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26, 532, 532, 532, 532,
-   532, 532, 532, 532, 532, 532, 533, 534, 535, 536, 537, 538, 538, 538, 539, 540,
-   535,  26, 538, 541,  26,  26,  26,  26,  26,  26,  26,  26, 542, 543, 542, 542,
-   542, 542, 542, 543, 544,  26,  26,  26, 545, 545, 545, 545, 545, 545, 545, 545,
-   545,  26, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 547,  26,  26,  26,
-   548, 548, 548, 548, 548, 548, 548, 549, 550, 551, 550, 550, 550, 550, 552, 550,
-   553,  26, 550, 550, 550, 554, 555, 555, 555, 555, 556, 555, 555, 557, 558,  26,
-    26,  26,  26,  26,  26,  26,  26,  26, 559, 560, 561, 561, 561, 561, 559, 562,
-   561,  26, 561, 563, 564, 565, 566, 566, 566, 567, 568, 569, 566, 570,  26,  26,
-    26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-    26,  26,  26,  26, 571, 571, 571, 572,  26,  26,  26,  26,  26,  26, 573,  26,
-   108, 108, 108, 108, 108, 108, 574, 575, 576, 576, 576, 576, 576, 576, 576, 576,
-   576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 577,  26,  26,  26,  26,
-    26,  26,  26,  26,  26,  26,  26,  26, 576, 576, 576, 576, 576, 576, 576, 576,
-   576, 576, 576, 576, 576, 578, 579,  26, 576, 576, 576, 576, 576, 576, 576, 576,
-   580,  26,  26,  26,  26,  26,  26,  26, 581, 581, 581, 581, 581, 581, 581, 581,
-   581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 582, 581, 583,
-    26,  26,  26,  26,  26,  26,  26,  26, 584, 584, 584, 584, 584, 584, 584, 584,
-   584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584,
-   585,  26,  26,  26,  26,  26,  26,  26, 306, 306, 306, 306, 306, 306, 306, 306,
-   306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 586,
-   587, 587, 587, 588, 587, 589,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-    26,  26, 590, 590, 590, 591, 591,  26, 592, 592, 592, 592, 592, 592, 592, 592,
-   593,  26, 592, 594, 594, 592, 592, 595, 592, 592,  26,  26,  26,  26,  26,  26,
+    11,  11, 236,  27,  27,  27, 237, 238,  11, 239,  27,  27,  32,  32,  32,  32,
+    13,  13,  13,  13,  13,  13,  13,  13,  13, 240,  13,  13,  13,  13,  13,  13,
+   241, 242, 241, 241, 242, 243, 241, 244, 245, 245, 245, 246, 247, 248, 249, 250,
+   251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 261, 262, 263, 264, 265,
+   266, 267, 268, 269, 270, 271, 272, 272, 273, 274, 275, 209, 276, 277, 209, 278,
+   279, 279, 279, 279, 279, 279, 279, 279, 280, 209, 281, 209, 209, 209, 209, 282,
+   209, 283, 279, 284, 209, 285, 286, 209, 209, 209, 287, 140, 288, 140, 271, 271,
+   271, 289, 209, 209, 209, 209, 290, 271, 209, 209, 209, 209, 209, 209, 209, 209,
+   209, 209, 209, 291, 292, 209, 209, 293, 209, 209, 209, 209, 209, 209, 294, 209,
+   209, 209, 209, 209, 209, 209, 295, 296, 271, 297, 209, 209, 298, 279, 299, 279,
+   300, 301, 279, 279, 279, 302, 279, 303, 209, 209, 209, 279, 304, 209, 209, 305,
+   209, 306, 209, 209, 209, 209, 209, 209,   9,   9,   9,  11,  11,  11, 307, 308,
+    13,  13,  13,  13,  13,  13, 309, 310,  11,  11, 311,  48,  48,  48, 312, 313,
+    48, 314, 315, 315, 315, 315,  32,  32, 316, 317, 318, 319, 320, 321, 140, 140,
+   209, 322, 209, 209, 209, 209, 209, 323, 209, 209, 209, 209, 209, 324, 140, 325,
+   326, 327, 328, 329, 136,  48,  48,  48,  48, 330, 178,  48,  48,  48,  48, 331,
+   332,  48,  48, 136,  48,  48,  48,  48, 200, 333,  48,  48, 209, 209, 323,  48,
+   209, 334, 335, 209, 336, 337, 209, 209, 335, 209, 209, 337, 209, 209, 209, 209,
+    48,  48,  48,  48, 209, 209, 209, 209,  48, 338,  48,  48,  48,  48,  48,  48,
+   151, 209, 209, 209, 287,  48,  48, 229, 339,  48, 340, 140,  13,  13, 341, 342,
+    13, 343,  48,  48,  48,  48, 344, 345,  31, 346, 347, 348,  13,  13,  13, 349,
+   350, 351, 352, 353, 354, 355, 140, 356, 357,  48, 358, 359,  48,  48,  48, 360,
+   361,  48,  48, 362, 363, 192,  32, 364,  64,  48, 365,  48, 366, 367,  48, 151,
+    76,  48,  48, 368, 369, 370, 371, 372,  48,  48, 373, 374, 375, 376,  48, 377,
+    48,  48,  48, 378, 379, 380, 381, 382, 383, 384, 315,  11,  11, 385, 386,  11,
+    11,  11,  11,  11,  48,  48, 387, 192,  48,  48, 388,  48, 389,  48,  48, 206,
+   390, 390, 390, 390, 390, 390, 390, 390, 391, 391, 391, 391, 391, 391, 391, 391,
+    48,  48,  48,  48,  48,  48, 204,  48,  48,  48,  48,  48,  48, 207, 140, 140,
+   392, 393, 394, 395, 396,  48,  48,  48,  48,  48,  48, 397, 398, 399,  48,  48,
+    48,  48,  48, 400, 209,  48,  48,  48,  48, 401,  48,  48, 402, 140, 140, 403,
+    32, 404,  32, 405, 406, 407, 408, 409,  48,  48,  48,  48,  48,  48,  48, 410,
+   411,   2,   3,   4,   5, 412, 413, 414,  48, 415,  48, 200, 416, 417, 418, 419,
+   420,  48, 172, 421, 204, 204, 140, 140,  48,  48,  48,  48,  48,  48,  48,  71,
+   422, 271, 271, 423, 272, 272, 272, 424, 425, 426, 427, 140, 140, 209, 209, 428,
+   140, 140, 140, 140, 140, 140, 140, 140,  48, 151,  48,  48,  48, 100, 429, 430,
+    48,  48, 431,  48, 432,  48,  48, 433,  48, 434,  48,  48, 435, 436, 140, 140,
+     9,   9, 437,  11,  11,  48,  48,  48,  48, 204, 192,   9,   9, 438,  11, 439,
+    48,  48, 440,  48,  48,  48, 441, 442, 442, 443, 444, 445, 140, 140, 140, 140,
+    48,  48,  48, 314,  48, 199, 440, 140, 446,  27,  27, 447, 140, 140, 140, 140,
+   448,  48,  48, 449,  48, 450,  48, 451,  48, 200, 452, 140, 140, 140,  48, 453,
+    48, 454,  48, 455, 140, 140, 140, 140,  48,  48,  48, 456, 271, 457, 271, 271,
+   458, 459,  48, 460, 461, 462,  48, 463,  48, 464, 140, 140, 465,  48, 466, 467,
+    48,  48,  48, 468,  48, 469,  48, 470,  48, 471, 472, 140, 140, 140, 140, 140,
+    48,  48,  48,  48, 196, 140, 140, 140,   9,   9,   9, 473,  11,  11,  11, 474,
+    48,  48, 475, 192, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 271, 476,
+    48,  48, 477, 478, 140, 140, 140, 140,  48, 464, 479,  48,  62, 480, 140,  48,
+   481, 140, 140,  48, 482, 140,  48, 314, 483,  48,  48, 484, 485, 457, 486, 487,
+   222,  48,  48, 488, 489,  48, 196, 192, 490,  48, 491, 492, 493,  48,  48, 494,
+   222,  48,  48, 495, 496, 497, 498, 499,  48,  97, 500, 501, 140, 140, 140, 140,
+   502, 503, 504,  48,  48, 505, 506, 192, 507,  83,  84, 508, 509, 510, 511, 512,
+    48,  48,  48, 513, 514, 515, 478, 140,  48,  48,  48, 516, 517, 192, 140, 140,
+    48,  48, 518, 519, 520, 521, 140, 140,  48,  48,  48, 522, 523, 192, 524, 140,
+    48,  48, 525, 526, 192, 140, 140, 140,  48, 173, 527, 528, 314, 140, 140, 140,
+    48,  48, 500, 529, 140, 140, 140, 140, 140, 140,   9,   9,  11,  11, 148, 530,
+   531, 532,  48, 533, 534, 192, 140, 140, 140, 140, 535,  48,  48, 536, 537, 140,
+   538,  48,  48, 539, 540, 541,  48,  48, 542, 543, 544,  48,  48,  48,  48, 196,
+    84,  48, 518, 545, 546, 148, 175, 547,  48, 548, 549, 550, 140, 140, 140, 140,
+   551,  48,  48, 552, 553, 192, 554,  48, 555, 556, 192, 140, 140, 140, 140, 140,
+   140, 140, 140, 140, 140, 140,  48, 557, 140, 140, 140, 100, 271, 558, 559, 560,
+    48, 207, 140, 140, 140, 140, 140, 140, 272, 272, 272, 272, 272, 272, 561, 562,
+    48,  48,  48,  48, 388, 140, 140, 140, 140,  48,  48,  48,  48,  48,  48, 563,
+    48,  48, 200, 564, 140, 140, 140, 140,  48,  48,  48,  48, 314, 140, 140, 140,
+    48,  48,  48, 196,  48, 200, 370,  48,  48,  48,  48, 200, 192,  48, 204, 565,
+    48,  48,  48, 566, 567, 568, 569, 570,  48, 140, 140, 140, 140, 140, 140, 140,
+   140, 140, 140, 140,   9,   9,  11,  11, 271, 571, 140, 140, 140, 140, 140, 140,
+    48,  48,  48,  48, 572, 573, 574, 574, 575, 576, 140, 140, 140, 140, 577, 578,
+    48,  48,  48,  48,  48,  48,  48, 440,  48,  48,  48,  48,  48, 199, 140, 140,
+   196, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 579,
+    48,  48, 580, 140, 140, 580, 581,  48,  48,  48,  48,  48,  48,  48,  48, 206,
+    48,  48,  48,  48,  48,  48,  71, 151, 196, 582, 583, 140, 140, 140, 140, 140,
+    32,  32, 584,  32, 585, 209, 209, 209, 209, 209, 209, 209, 323, 140, 140, 140,
+   209, 209, 209, 209, 209, 209, 209, 324, 209, 209, 586, 209, 209, 209, 587, 588,
+   589, 209, 590, 209, 209, 209, 288, 140, 209, 209, 209, 209, 591, 140, 140, 140,
+   140, 140, 140, 140, 140, 140, 271, 592, 209, 209, 209, 209, 209, 287, 271, 461,
+     9, 593,  11, 594, 595, 596, 241,   9, 597, 598, 599, 600, 601,   9, 593,  11,
+   602, 603,  11, 604, 605, 606, 607,   9, 608,  11,   9, 593,  11, 594, 595,  11,
+   241,   9, 597, 607,   9, 608,  11,   9, 593,  11, 609,   9, 610, 611, 612, 613,
+    11, 614,   9, 615, 616, 617, 618,  11, 619,   9, 620,  11, 621, 622, 622, 622,
+    32,  32,  32, 623,  32,  32, 624, 625, 626, 627,  45, 140, 140, 140, 140, 140,
+   628, 629, 140, 140, 140, 140, 140, 140, 630, 631, 632, 140, 140, 140, 140, 140,
+    48,  48, 151, 633, 634, 140, 140, 140, 140,  48, 635, 140,  48,  48, 636, 637,
+   140, 140, 140, 140, 140, 140, 638, 200,  48,  48,  48,  48, 639, 585, 140, 140,
+     9,   9, 597,  11, 640, 370, 140, 140, 140, 140, 140, 140, 140, 140, 140, 498,
+   271, 271, 641, 642, 140, 140, 140, 140, 498, 271, 643, 644, 140, 140, 140, 140,
+   645,  48, 646, 647, 648, 649, 650, 651, 652, 206, 653, 206, 140, 140, 140, 654,
+   209, 209, 325, 209, 209, 209, 209, 209, 209, 323, 334, 655, 655, 655, 209, 324,
+   656, 209, 209, 209, 209, 209, 209, 209, 209, 209, 657, 140, 140, 140, 658, 209,
+   659, 209, 209, 325, 660, 661, 324, 140, 209, 209, 209, 209, 209, 209, 209, 662,
+   209, 209, 209, 209, 209, 663, 426, 426, 209, 209, 209, 209, 209, 209, 209, 323,
+   209, 209, 209, 209, 209, 660, 325, 427, 325, 209, 209, 209, 664, 176, 209, 209,
+   664, 209, 657, 661, 140, 140, 140, 140, 209, 209, 209, 209, 209, 323, 657, 665,
+   287, 209, 426, 288, 324, 176, 664, 287, 209, 666, 209, 209, 288, 140, 140, 192,
+    48,  48,  48,  48,  48,  48, 140, 140,  48,  48,  48, 196,  48,  48,  48,  48,
+    48, 204,  48,  48,  48,  48,  48,  48,  48,  48, 478,  48,  48,  48,  48,  48,
+    48,  48,  48,  48,  48,  48, 100, 140,  48, 204, 140, 140, 140, 140, 140, 140,
+    48,  48,  48,  48,  71, 140, 140, 140, 667, 140, 668, 668, 668, 668, 668, 668,
+    32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32, 140,
+   391, 391, 391, 391, 391, 391, 391, 669, 391, 391, 391, 391, 391, 391, 391, 670,
+     0,   0,   0,   0,   0,   0,   0,   0,   1,   2,   2,   3,   1,   2,   2,   3,
+     0,   0,   0,   0,   0,   4,   0,   4,   2,   2,   5,   2,   2,   2,   5,   2,
+     2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+     2,   2,   2,   2,   2,   2,   2,   6,   0,   0,   0,   0,   7,   8,   0,   0,
+     9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  10,  11,
+    12,  13,  14,  14,  15,  14,  14,  14,  14,  14,  14,  14,  16,  17,  14,  14,
+    18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
+    19,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
+    18,  18,  18,  18,  18,  18,  20,  21,  21,  21,  22,  20,  21,  21,  21,  21,
+    21,  23,  24,  25,  25,  25,  25,  25,  25,  26,  25,  25,  25,  27,  28,  26,
+    29,  30,  31,  32,  31,  31,  31,  31,  33,  34,  35,  31,  31,  31,  36,  31,
+    31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  29,  31,  31,  31,  31,
+    37,  38,  37,  37,  37,  37,  37,  37,  37,  39,  31,  31,  31,  31,  31,  31,
+    40,  40,  40,  40,  40,  40,  41,  26,  42,  42,  42,  42,  42,  42,  42,  43,
+    44,  44,  44,  44,  44,  45,  44,  46,  47,  47,  47,  48,  37,  49,  31,  31,
+    31,  50,  51,  31,  31,  31,  31,  31,  31,  31,  31,  31,  52,  31,  31,  31,
+    53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  54,  53,  55,  53,  53,  53,
+    56,  57,  58,  59,  59,  60,  61,  62,  57,  63,  64,  65,  66,  59,  59,  67,
+    68,  69,  70,  71,  71,  72,  73,  74,  69,  75,  76,  77,  78,  71,  79,  26,
+    80,  81,  82,  83,  83,  84,  85,  86,  81,  87,  88,  26,  89,  83,  90,  91,
+    92,  93,  94,  95,  95,  96,  97,  98,  93,  99, 100, 101, 102,  95,  95,  26,
+   103, 104, 105, 106, 107, 104, 108, 109, 104, 105, 110,  26, 111, 108, 108, 112,
+   113, 114, 115, 113, 113, 115, 113, 116, 114, 117, 118, 119, 120, 113, 121, 113,
+   122, 123, 124, 122, 122, 124, 125, 126, 123, 127, 128, 128, 129, 122, 130,  26,
+   131, 132, 133, 131, 131, 131, 131, 131, 132, 133, 134, 131, 135, 131, 131, 131,
+   136, 137, 138, 139, 137, 137, 140, 141, 138, 142, 143, 137, 144, 137, 145,  26,
+   146, 147, 147, 147, 147, 147, 147, 148, 147, 147, 147, 149,  26,  26,  26,  26,
+   150, 151, 152, 152, 153, 152, 152, 154, 155, 154, 152, 156,  26,  26,  26,  26,
+   157, 157, 157, 157, 157, 157, 157, 157, 157, 158, 157, 157, 157, 159, 158, 157,
+   157, 157, 157, 158, 157, 157, 157, 160, 157, 160, 161, 162,  26,  26,  26,  26,
+   163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+   163, 163, 163, 163, 164, 164, 164, 164, 165, 166, 164, 164, 164, 164, 164, 167,
+   168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+   169, 169, 169, 169, 169, 169, 169, 169, 169, 170, 171, 170, 169, 169, 169, 169,
+   169, 170, 169, 169, 169, 169, 170, 171, 170, 169, 171, 169, 169, 169, 169, 169,
+   169, 169, 170, 169, 169, 169, 169, 169, 169, 169, 169, 172, 169, 169, 169, 173,
+   169, 169, 169, 174, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 176, 176,
+   177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
+   178, 178, 178, 179, 180, 180, 180, 180, 180, 180, 180, 180, 180, 181, 180, 182,
+   183, 183, 184, 185, 186, 186, 187,  26, 188, 188, 189,  26, 190, 191, 192,  26,
+   193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 194, 193, 195, 193, 195,
+   196, 197, 197, 198, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 199,
+   197, 197, 197, 197, 197, 200, 177, 177, 177, 177, 177, 177, 177, 177, 201,  26,
+   202, 202, 202, 203, 202, 204, 202, 204, 205, 202, 206, 206, 206, 207, 208,  26,
+   209, 209, 209, 209, 209, 210, 209, 209, 209, 211, 209, 212, 193, 193, 193, 193,
+   213, 213, 213, 214, 215, 215, 215, 215, 215, 215, 215, 216, 215, 215, 215, 217,
+   215, 218, 215, 218, 215, 219,   9,   9,   9, 220,  26,  26,  26,  26,  26,  26,
+   221, 221, 221, 221, 221, 221, 221, 221, 221, 222, 221, 221, 221, 221, 221, 223,
+   224, 224, 224, 224, 224, 224, 224, 224, 225, 225, 225, 225, 225, 225, 226, 227,
+   228, 228, 228, 228, 228, 228, 228, 229, 228, 230, 231, 231, 231, 231, 231, 231,
+    18, 232, 164, 164, 164, 164, 164, 233, 224,  26, 234,   9, 235, 236, 237, 238,
+     2,   2,   2,   2, 239, 240,   2,   2,   2,   2,   2, 241, 242, 243,   2, 244,
+     2,   2,   2,   2,   2,   2,   2, 245,   9,   9,   9,   9,   9,   9,   9,   9,
+    14,  14, 246, 246,  14,  14,  14,  14, 246, 246,  14, 247,  14,  14,  14, 246,
+    14,  14,  14,  14,  14,  14, 248,  14, 248,  14, 249, 250,  14,  14, 251, 252,
+     0, 253,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 254,   0, 255, 256,
+     0, 257,   2, 258,   0,   0,   0,   0, 259,  26,   9,   9,   9,   9, 260,  26,
+     0,   0,   0,   0, 261, 262,   4,   0,   0, 263,   0,   0,   2,   2,   2,   2,
+     2, 264,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0, 257,  26,  26,  26,   0, 265,  26,  26,   0,   0,   0,   0,
+   266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 267,   0,
+     0,   0, 268,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+   269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269,   2,   2,   2,   2,
+    17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17, 270, 271,
+   164, 164, 164, 164, 165, 166, 272, 272, 272, 272, 272, 272, 272, 273, 274, 273,
+   169, 169, 171,  26, 171, 171, 171, 171, 171, 171, 171, 171,  18,  18,  18,  18,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 275,  26,  26,  26,  26,
+   276, 276, 276, 277, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 278,  26,
+   276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+   276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 279,  26,  26,  26,   0, 280,
+   281,   0,   0,   0, 282, 283,   0, 284, 285, 286, 286, 286, 286, 286, 286, 286,
+   286, 286, 287, 288, 289, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 291,
+   292, 293, 293, 293, 293, 293, 294, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+   168, 295,   0,   0, 293, 293, 293, 293,   0,   0,   0,   0, 280,  26, 290, 290,
+   168, 168, 168, 295,   0,   0,   0,   0,   0,   0,   0,   0, 168, 168, 168, 296,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 290, 290, 290, 290, 290, 297,
+   290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290,   0,   0,   0,   0,   0,
+   276, 276, 276, 276, 276, 276, 276, 276,   0,   0,   0,   0,   0,   0,   0,   0,
+   298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298,
+   298, 299, 298, 298, 298, 298, 298, 298, 300,  26, 301, 301, 301, 301, 301, 301,
+   302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302,
+   302, 302, 302, 302, 302, 303,  26,  26,  18,  18,  18,  18,  18,  18,  18,  18,
+    18,  18,  18,  18, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304,  26,
+     0,   0,   0,   0, 305,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+     2, 306,   2,   2,   2,   2,   2,   2,   2, 307, 308, 309,  26,  26, 310,   2,
+   311, 311, 311, 311, 311, 312,   0, 313, 314, 314, 314, 314, 314, 314, 314,  26,
+   315, 315, 315, 315, 315, 315, 315, 315, 316, 317, 315, 318,  53,  53,  53,  53,
+   319, 319, 319, 319, 319, 320, 321, 321, 321, 321, 322, 323, 168, 168, 168, 324,
+   325, 325, 325, 325, 325, 325, 325, 325, 325, 326, 325, 327, 163, 163, 163, 328,
+   329, 329, 329, 329, 329, 329, 330,  26, 329, 331, 329, 332, 163, 163, 163, 163,
+   333, 333, 333, 333, 333, 333, 333, 333, 334,  26,  26, 335, 336, 336, 337,  26,
+   338, 338, 338,  26, 171, 171,   2,   2,   2,   2,   2, 339, 340, 341, 175, 175,
+   175, 175, 175, 175, 175, 175, 175, 175, 336, 336, 336, 336, 336, 342, 336, 343,
+   168, 168, 168, 168, 344,  26, 168, 168, 295, 345, 168, 168, 168, 168, 168, 344,
     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-   596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 597,  26,  26,  26,  26,
-    26,  26,  26,  26,  26,  26,  26,  26, 598, 598, 598, 598, 598, 598, 598, 598,
-   598, 599, 598, 598, 598, 598, 598, 598, 598, 600, 598, 598,  26,  26,  26,  26,
-    26,  26,  26,  26, 601,  26, 347,  26, 602, 602, 602, 602, 602, 602, 602, 602,
-   602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602,
-   602, 602, 602, 602, 602, 602, 602,  26, 603, 603, 603, 603, 603, 603, 603, 603,
-   603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603,
-   603, 603, 604,  26,  26,  26,  26,  26, 602, 605,  26,  26,  26,  26,  26,  26,
-    26,  26,  26,  26,  26,  26,  26,  26, 606, 287, 287, 287, 287, 287, 287, 287,
-   287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287,
-   287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 288,  26,  26,  26,  26,
-    26,  26, 607,  26, 608,  26, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
-   609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609,
-   609, 609, 609, 609, 609, 609, 609, 610, 611, 611, 611, 611, 611, 611, 611, 611,
-   611, 611, 611, 611, 611, 612, 611, 613, 611, 614, 611, 615, 281,  26,  26,  26,
-    26,  26,  26,  26,  26,  26,  26,  26,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0, 616,  26,   0,   0,   0,   0, 260, 361,   0,   0,
-     0,   0,   0,   0, 617, 618,   0, 619, 620, 621,   0,   0,   0, 622,   0,   0,
-     0,   0,   0,   0,   0, 623,  26,  26,  14,  14,  14,  14,  14,  14,  14,  14,
-   249,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-    26,  26,  26,  26,   0,   0, 281,  26,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0, 260,  26,   0,   0,   0, 623,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0, 257,   0,   0,   0,   0,   0,   0,   0,   0, 257, 624, 625,   0, 626,
-   627,   0,   0,   0,   0,   0,   0,   0, 269, 628, 257, 257,   0,   0,   0, 629,
-   630, 631, 632,   0,   0,   0,   0,   0,   0,   0,   0,   0, 616,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0, 268,   0,   0,   0,   0,   0,   0, 633, 633, 633, 633, 633, 633, 633, 633,
-   633, 633, 633, 633, 633, 633, 633, 633, 633, 634,  26, 635, 636, 633,  26,  26,
-    26,  26,  26,  26,  26,  26,  26,  26, 271, 270, 270, 637, 638, 639,  26,  26,
-    26,  26,  26,  26,  26,  26,  26,  26, 640, 640, 640, 640, 640, 641, 640, 642,
-   640, 643,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-   644, 644, 644, 644, 644, 644, 644, 645, 646, 646, 646, 646, 646, 646, 646, 646,
-   646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646,
-   647, 646, 648,  26,  26,  26,  26,  26, 649, 649, 649, 649, 649, 649, 649, 649,
-   649, 650, 649, 651,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-    26,  26,  26,  26,  26,  26, 361,   0,   0,   0,   0,   0,   0,   0, 375,  26,
-    26,  26,  26,  26,  26,  26,  26,  26, 361,   0,   0,   0,   0,   0,   0, 616,
-    26,  26,  26,  26,  26,  26,  26,  26, 652,  31,  31,  31, 653, 654, 655, 656,
-   657, 658, 653, 659, 653, 655, 655, 660,  31, 661,  31, 662, 663, 661,  31, 662,
-    26,  26,  26,  26,  26,  26, 354,  26,   0,   0,   0,   0,   0, 281,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 281,  26,   0, 260, 361,   0,
-   361,   0, 361,   0,   0,   0, 616,  26,   0,   0,   0,   0,   0, 616,  26,  26,
-    26,  26,  26,  26, 664,   0,   0,   0, 665,  26,   0,   0,   0,   0,   0, 281,
-     0, 623, 314,  26, 616,  26,  26,  26,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,  26,   0, 375,   0, 375,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0, 281,  26,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0, 623,   0, 281,  26,  26,   0, 281,   0,   0,   0,   0,   0,   0,
-     0,  26,   0, 314,   0,   0,   0,   0,   0,  26,   0,   0,   0, 616, 314,  26,
-    26,  26,  26,  26,  26,  26,  26,  26,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0, 632,   0,   0,   0,   0,   0,   0,   0,   0,
-     0, 627,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0, 281,  26,   0, 616, 375, 266, 260,  26,   0,   0,   0, 623, 260,  26,
-   266,  26, 260,  26,  26,  26,  26,  26,   0,   0, 359,   0,   0,   0,   0,   0,
-     0, 266,  26,  26,  26,  26,   0, 314, 277, 277, 277, 277, 277, 277, 277, 277,
-   277, 277, 277, 280,  26,  26,  26,  26, 277, 277, 277, 277, 277, 277, 299,  26,
-   277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 280, 277, 277, 277, 277,
-   277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 347,  26, 277, 277,
-   277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
-   277, 277, 277, 277, 666,  26,  26,  26, 277, 277, 277, 280,  26,  26,  26,  26,
-    26,  26,  26,  26,  26,  26,  26,  26, 277, 277, 277, 277, 277, 277, 277, 277,
-   277, 667,  26,  26,  26,  26,  26,  26, 668,  26,  26,  26,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   9,   9,   9,   9,   9,   9,   9,   9,
+   276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 279, 276, 276,
+   276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 346,  26,  26,  26,  26,
+   347,  26, 348, 349,  25,  25, 350, 351, 352,  25,  31,  31,  31,  31,  31,  31,
+    31,  31,  31,  31,  31,  31,  31,  31, 353,  26, 354,  31,  31,  31,  31,  31,
+    31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
+    31,  31,  31,  31,  31,  31,  31, 355,  31,  31,  31,  31,  31,  31,  31,  31,
+    31,  31, 356,  31,  31,  31,  31,  31,  31, 357,  26,  26,  26,  26,  31,  31,
+     9,   9,   0, 313,   9, 358,   0,   0,   0,   0, 359,   0, 257, 280, 360,  31,
+    31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31, 361,
+   362,   0,   0,   0,   1,   2,   2,   3,   1,   2,   2,   3, 363, 290, 289, 290,
+   290, 290, 290, 364, 168, 168, 168, 295, 365, 365, 365, 366, 257, 257,  26, 367,
+   368, 369, 368, 368, 370, 368, 368, 371, 368, 372, 368, 372,  26,  26,  26,  26,
+   368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 373,
+   374,   0,   0,   0,   0,   0, 375,   0,  14,  14,  14,  14,  14,  14,  14,  14,
+    14, 252,   0, 376, 377,  26,  26,  26,  26,  26,   0,   0,   0,   0,   0, 378,
+   379, 379, 379, 380, 381, 381, 381, 381, 381, 381, 382,  26, 383,   0,   0, 280,
+   384, 384, 384, 384, 385, 386, 387, 387, 387, 388, 389, 389, 389, 389, 389, 390,
+   391, 391, 391, 392, 393, 393, 393, 393, 394, 393, 395,  26,  26,  26,  26,  26,
+   396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 397, 397, 397, 397, 397, 397,
+   398, 398, 398, 399, 398, 400, 401, 401, 401, 401, 402, 401, 401, 401, 401, 402,
+   403, 403, 403, 403, 403,  26, 404, 404, 404, 404, 404, 404, 405, 406, 407, 408,
+   407, 408, 409, 407, 410, 407, 410, 411,  26,  26,  26,  26,  26,  26,  26,  26,
+   412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412,
+   412, 412, 412, 412, 412, 412, 413,  26, 412, 412, 414,  26, 412,  26,  26,  26,
+   415,   2,   2,   2,   2,   2, 416, 307,  26,  26,  26,  26,  26,  26,  26,  26,
+   417, 418, 419, 419, 419, 419, 420, 421, 422, 422, 423, 422, 424, 424, 424, 424,
+   425, 425, 425, 426, 427, 425,  26,  26,  26,  26,  26,  26, 428, 428, 429, 430,
+   431, 431, 431, 432, 433, 433, 433, 434,  26,  26,  26,  26,  26,  26,  26,  26,
+   435, 435, 435, 435, 436, 436, 436, 437, 436, 436, 438, 436, 436, 436, 436, 436,
+   439, 440, 441, 442, 443, 443, 444, 445, 443, 446, 443, 446, 447, 447, 447, 447,
+   448, 448, 448, 448,  26,  26,  26,  26, 449, 449, 449, 449, 450, 451, 450,  26,
+   452, 452, 452, 452, 452, 452, 453, 454, 455, 455, 456, 455, 457, 457, 458, 457,
+   459, 459, 460, 461,  26, 462,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+   463, 463, 463, 463, 463, 463, 463, 463, 463, 464,  26,  26,  26,  26,  26,  26,
+   465, 465, 465, 465, 465, 465, 466,  26, 465, 465, 465, 465, 465, 465, 466, 467,
+   468, 468, 468, 468, 468,  26, 468, 469,  26,  26,  26,  26,  26,  26,  26,  26,
+    26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  31,  31,  31,  50,
+   470, 470, 470, 470, 470, 471, 472,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+   473, 473, 473, 473, 473,  26, 474, 474, 474, 474, 474, 475,  26,  26, 476, 476,
+   476, 477,  26,  26,  26,  26, 478, 478, 478, 479,  26,  26, 480, 480, 481,  26,
+   482, 482, 482, 482, 482, 482, 482, 482, 482, 483, 484, 482, 482, 482, 483, 485,
+   486, 486, 486, 486, 486, 486, 486, 486, 487, 488, 489, 489, 489, 490, 489, 491,
+   492, 492, 492, 492, 492, 492, 493, 492, 492,  26, 494, 494, 494, 494, 495,  26,
+   496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 497, 137, 498,  26,
+   499, 499, 500, 499, 499, 499, 499, 501,  26,  26,  26,  26,  26,  26,  26,  26,
+   502, 503, 504, 505, 504, 506, 507, 507, 507, 507, 507, 507, 507, 508, 507, 509,
+   510, 511, 512, 513, 513, 514, 515, 516, 511, 517, 518, 519, 520, 521, 521,  26,
+   522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 523, 524,  26,  26,  26,
+   525, 525, 525, 525, 525, 525, 525, 525, 525,  26, 525, 526,  26,  26,  26,  26,
+   527, 527, 527, 527, 527, 527, 528, 527, 527, 527, 527, 528,  26,  26,  26,  26,
+   529, 529, 529, 529, 529, 529, 529, 529, 530,  26, 529, 531, 197, 532,  26,  26,
+   533, 533, 533, 533, 533, 533, 533, 534, 533, 534,  26,  26,  26,  26,  26,  26,
+   535, 535, 535, 536, 535, 537, 535, 535, 538,  26,  26,  26,  26,  26,  26,  26,
+   539, 539, 539, 539, 539, 539, 539, 540,  26,  26,  26,  26,  26,  26,  26,  26,
+    26,  26,  26,  26, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 542, 543,
+   544, 545, 546, 547, 547, 547, 548, 549, 544,  26, 547, 550,  26,  26,  26,  26,
+    26,  26,  26,  26, 551, 552, 551, 551, 551, 551, 551, 552, 553,  26,  26,  26,
+   554, 554, 554, 554, 554, 554, 554, 554, 554,  26, 555, 555, 555, 555, 555, 555,
+   555, 555, 555, 555, 556,  26, 177, 177, 557, 557, 557, 557, 557, 557, 557, 558,
+   559, 560, 559, 559, 559, 559, 561, 559, 562,  26, 559, 559, 559, 563, 564, 564,
+   564, 564, 565, 564, 564, 566, 567,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+   568, 569, 570, 570, 570, 570, 568, 571, 570,  26, 570, 572, 573, 574, 575, 575,
+   575, 576, 577, 578, 575, 579,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+    26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26, 580, 580, 580, 581,
+    26,  26,  26,  26,  26,  26, 582,  26, 108, 108, 108, 108, 108, 108, 583, 584,
+   585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585,
+   585, 585, 585, 586,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+   585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 587, 588,  26,
+   585, 585, 585, 585, 585, 585, 585, 585, 589,  26,  26,  26,  26,  26,  26,  26,
+    26,  26, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 591,  26,
+   592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592,
+   592, 592, 592, 592, 592, 593, 592, 594,  26,  26,  26,  26,  26,  26,  26,  26,
+   595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595,
+   595, 595, 595, 595, 595, 595, 595, 595, 596,  26,  26,  26,  26,  26,  26,  26,
+   304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304,
+   304, 304, 304, 304, 304, 304, 304, 597, 598, 598, 598, 599, 598, 600, 601, 601,
+   601, 601, 601, 601, 601, 601, 601, 602, 601, 603, 604, 604, 604, 605, 605,  26,
+   606, 606, 606, 606, 606, 606, 606, 606, 607,  26, 606, 608, 608, 606, 606, 609,
+   606, 606,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+    26,  26,  26,  26,  26,  26,  26,  26, 610, 610, 610, 610, 610, 610, 610, 610,
+   610, 610, 610, 611,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+   612, 612, 612, 612, 612, 612, 612, 612, 612, 613, 612, 612, 612, 612, 612, 612,
+   612, 614, 612, 612,  26,  26,  26,  26,  26,  26,  26,  26, 615,  26, 346,  26,
+   616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616,
+   616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616,  26,
+   617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617,
+   617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 618,  26,  26,  26,  26,  26,
+   616, 619,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+    26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26, 620, 621,
+   622, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286,
+   286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286,
+   286, 286, 286, 286, 623,  26,  26,  26,  26,  26, 624,  26, 625,  26, 626, 626,
+   626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626,
+   626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 627,
+   628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 629, 628, 630,
+   628, 631, 628, 632, 280,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+     9,   9,   9,   9,   9, 633,   9,   9, 220,  26,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0, 280,  26,  26,  26,  26,  26,  26,  26,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 275,  26,
+     0,   0,   0,   0, 257, 362,   0,   0,   0,   0,   0,   0, 634, 635,   0, 636,
+   637, 638,   0,   0,   0, 639,   0,   0,   0,   0,   0,   0,   0, 265,  26,  26,
+    14,  14,  14,  14,  14,  14,  14,  14, 246,  26,  26,  26,  26,  26,  26,  26,
+    26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,   0,   0, 280,  26,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 257,  26,   0,   0,   0, 259,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 254,   0,   0,   0,   0,   0,
+     0,   0,   0, 254, 640, 641,   0, 642, 643,   0,   0,   0,   0,   0,   0,   0,
+   268, 644, 254, 254,   0,   0,   0, 645, 646, 647, 648,   0,   0,   0,   0,   0,
+     0,   0,   0,   0, 275,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0, 267,   0,   0,   0,   0,   0,   0,
+   649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649,
+   649, 650,  26, 651, 652, 649,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+     2,   2,   2, 347,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+   653, 269, 269, 654, 655, 656,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+   657, 657, 657, 657, 657, 658, 657, 659, 657, 660,  26,  26,  26,  26,  26,  26,
+    26,  26, 661, 661, 661, 662,  26,  26, 663, 663, 663, 663, 663, 663, 663, 664,
+    26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26, 171, 665, 169, 171,
+   666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666,
+   666, 666, 666, 666, 666, 666, 666, 666, 667, 666, 668,  26,  26,  26,  26,  26,
+   669, 669, 669, 669, 669, 669, 669, 669, 669, 670, 669, 671,  26,  26,  26,  26,
+    26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26, 362,   0,
+     0,   0,   0,   0,   0,   0, 376,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+   362,   0,   0,   0,   0,   0,   0, 275,  26,  26,  26,  26,  26,  26,  26,  26,
+   672,  31,  31,  31, 673, 674, 675, 676, 677, 678, 673, 679, 673, 675, 675, 680,
+    31, 681,  31, 682, 683, 681,  31, 682,  26,  26,  26,  26,  26,  26,  51,  26,
+     0,   0,   0,   0,   0, 280,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0, 280,  26,   0, 257, 362,   0, 362,   0, 362,   0,   0,   0, 275,  26,
+     0,   0,   0,   0,   0, 275,  26,  26,  26,  26,  26,  26, 684,   0,   0,   0,
+   685,  26,   0,   0,   0,   0,   0, 280,   0, 259, 313,  26, 275,  26,  26,  26,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 686,   0, 376,   0, 376,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 280,  26,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 259,   0, 280, 259,  26,
+     0, 280,   0,   0,   0,   0,   0,   0,   0,  26,   0, 313,   0,   0,   0,   0,
+     0,  26,   0,   0,   0, 275, 313,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 280,  26,   0, 275, 376, 376,
+   257,  26,   0,   0,   0, 376,   0, 265, 275,  26,   0, 313,   0,  26, 257,  26,
+     0,   0, 359,   0,   0,   0,   0,   0,   0, 265,  26,  26,  26,  26,   0, 313,
+   276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,  26,  26,  26,  26,
+   276, 276, 276, 276, 276, 276, 276, 687, 276, 276, 276, 276, 276, 276, 276, 276,
+   276, 276, 276, 279, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+   276, 276, 276, 276, 346,  26, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+   276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 687,  26,  26,  26,
+   276, 276, 276, 279,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+   276, 276, 276, 276, 276, 276, 276, 276, 276, 688,  26,  26,  26,  26,  26,  26,
+   689,  26,  26,  26,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-     9,   9,   9,   9,   9,   9,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0, 939, 940, 941, 942, 946, 948,   0, 962,
-   969, 970, 971, 976,1001,1002,1003,1008,   0,1033,1040,1041,1042,1043,1047,   0,
-     0,1080,1081,1082,1086,1110,   0,   0,1124,1125,1126,1127,1131,1133,   0,1147,
-  1154,1155,1156,1161,1187,1188,1189,1193,   0,1219,1226,1227,1228,1229,1233,   0,
-     0,1267,1268,1269,1273,1298,   0,1303, 943,1128, 944,1129, 954,1139, 958,1143,
-   959,1144, 960,1145, 961,1146, 964,1149,   0,   0, 973,1158, 974,1159, 975,1160,
-   983,1168, 978,1163, 988,1173, 990,1175, 991,1176, 993,1178, 994,1179,   0,   0,
-  1004,1190,1005,1191,1006,1192,1014,1199,1007,   0,   0,   0,1016,1201,1020,1206,
-     0,1022,1208,1025,1211,1023,1209,   0,   0,   0,   0,1032,1218,1037,1223,1035,
-  1221,   0,   0,   0,1044,1230,1045,1231,1049,1235,   0,   0,1058,1244,1064,1250,
-  1060,1246,1066,1252,1067,1253,1072,1258,1069,1255,1077,1264,1074,1261,   0,   0,
-  1083,1270,1084,1271,1085,1272,1088,1275,1089,1276,1096,1283,1103,1290,1111,1299,
-  1115,1118,1307,1120,1309,1121,1310,   0,1053,1239,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,1093,1280,   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, 949,1134,1010,1195,1050,1236,1090,1277,1341,1368,1340,
-  1367,1342,1369,1339,1366,   0,1320,1347,1418,1419,1323,1350,   0,   0, 992,1177,
-  1018,1204,1055,1241,1416,1417,1415,1424,1202,   0,   0,   0, 987,1172,   0,   0,
-  1031,1217,1321,1348,1322,1349,1338,1365, 950,1135, 951,1136, 979,1164, 980,1165,
-  1011,1196,1012,1197,1051,1237,1052,1238,1061,1247,1062,1248,1091,1278,1092,1279,
-  1071,1257,1076,1263,   0,   0, 997,1182,   0,   0,   0,   0,   0,   0, 945,1130,
-   982,1167,1337,1364,1335,1362,1046,1232,1422,1423,1113,1301,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   8,   9,   0,  10,1425,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   7,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,1314,1427,   5,
-  1434,1438,1443,   0,1450,   0,1455,1461,1514,   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,1446,1458,1468,1476,1480,1486,1517,   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,1489,1503,1494,1500,1508,   0,   0,   0,   0,1520,1521,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,1526,1528,   0,1525,   0,   0,   0,1522,
-     0,   0,   0,   0,1536,1532,1539,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,1534,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,1556,   0,   0,   0,   0,   0,   0,1548,1550,   0,1547,   0,   0,   0,1567,
-     0,   0,   0,   0,1558,1554,1561,   0,   0,   0,   0,   0,   0,   0,1568,1569,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,1529,1551,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,1523,1545,1524,1546,   0,   0,1527,1549,
-     0,   0,1570,1571,1530,1552,1531,1553,   0,   0,1533,1555,1535,1557,1537,1559,
-     0,   0,1572,1573,1544,1566,1538,1560,1540,1562,1541,1563,1542,1564,   0,   0,
-  1543,1565,   0,   0,   0,   0,   0,   0,   0,   0,1606,1607,1609,1608,1610,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,1613,   0,1611,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1612,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,1620,   0,   0,   0,   0,   0,   0,   0,1623,   0,   0,1624,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-  1614,1615,1616,1617,1618,1619,1621,1622,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,1628,1629,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,1625,1626,   0,1627,   0,   0,   0,1634,   0,   0,1635,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,1630,1631,1632,   0,   0,1633,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-  1639,   0,   0,1638,1640,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,1636,1637,   0,   0,   0,   0,   0,   0,1641,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,1642,1644,1643,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-  1645,   0,   0,   0,   0,   0,   0,   0,1646,   0,   0,   0,   0,   0,   0,1648,
-  1649,   0,1647,1650,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,1651,1653,1652,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,1654,   0,1655,1657,1656,   0,   0,   0,   0,1659,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,1660,   0,   0,   0,   0,1661,   0,   0,   0,   0,1662,
-     0,   0,   0,   0,1663,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,1658,   0,   0,   0,   0,   0,   0,   0,   0,   0,1664,   0,1665,1673,   0,
-  1674,   0,   0,   0,   0,   0,   0,   0,   0,1666,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1668,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,1669,   0,   0,   0,   0,1670,   0,   0,   0,   0,1671,
-     0,   0,   0,   0,1672,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,1667,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1675,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1676,   0,
-  1677,   0,1678,   0,1679,   0,1680,   0,   0,   0,1681,   0,   0,   0,   0,   0,
+     9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   0,   0,
      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,1682,   0,1683,   0,   0,1684,1685,   0,1686,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0, 953,1138, 955,1140, 956,1141, 957,1142,
-  1324,1351, 963,1148, 965,1150, 968,1153, 966,1151, 967,1152,1378,1380,1379,1381,
-   984,1169, 985,1170,1420,1421, 986,1171, 989,1174, 995,1180, 998,1183, 996,1181,
-   999,1184,1000,1185,1015,1200,1329,1356,1017,1203,1019,1205,1021,1207,1024,1210,
-  1687,1688,1027,1213,1026,1212,1028,1214,1029,1215,1030,1216,1034,1220,1036,1222,
-  1039,1225,1038,1224,1334,1361,1336,1363,1382,1384,1383,1385,1056,1242,1057,1243,
-  1059,1245,1063,1249,1689,1690,1065,1251,1068,1254,1070,1256,1386,1387,1388,1389,
-  1691,1692,1073,1259,1075,1262,1079,1266,1078,1265,1095,1282,1098,1285,1097,1284,
-  1390,1391,1392,1393,1099,1286,1100,1287,1101,1288,1102,1289,1105,1292,1104,1291,
-  1106,1294,1107,1295,1108,1296,1114,1302,1119,1308,1122,1311,1123,1312,1186,1260,
-  1293,1305,   0,1394,   0,   0,   0,   0, 952,1137, 947,1132,1317,1344,1316,1343,
-  1319,1346,1318,1345,1693,1695,1371,1375,1370,1374,1373,1377,1372,1376,1694,1696,
-   981,1166, 977,1162, 972,1157,1326,1353,1325,1352,1328,1355,1327,1354,1697,1698,
-  1009,1194,1013,1198,1054,1240,1048,1234,1331,1358,1330,1357,1333,1360,1332,1359,
-  1699,1700,1396,1401,1395,1400,1398,1403,1397,1402,1399,1404,1094,1281,1087,1274,
-  1406,1411,1405,1410,1408,1413,1407,1412,1409,1414,1109,1297,1117,1306,1116,1304,
-  1112,1300,   0,   0,   0,   0,   0,   0,1471,1472,1701,1705,1702,1706,1703,1707,
-  1430,1431,1715,1719,1716,1720,1717,1721,1477,1478,1729,1731,1730,1732,   0,   0,
-  1435,1436,1733,1735,1734,1736,   0,   0,1481,1482,1737,1741,1738,1742,1739,1743,
-  1439,1440,1751,1755,1752,1756,1753,1757,1490,1491,1765,1768,1766,1769,1767,1770,
-  1447,1448,1771,1774,1772,1775,1773,1776,1495,1496,1777,1779,1778,1780,   0,   0,
-  1451,1452,1781,1783,1782,1784,   0,   0,1504,1505,1785,1788,1786,1789,1787,1790,
-     0,1459,   0,1791,   0,1792,   0,1793,1509,1510,1794,1798,1795,1799,1796,1800,
-  1462,1463,1808,1812,1809,1813,1810,1814,1467,  21,1475,  22,1479,  23,1485,  24,
-  1493,  27,1499,  28,1507,  29,   0,   0,1704,1708,1709,1710,1711,1712,1713,1714,
-  1718,1722,1723,1724,1725,1726,1727,1728,1740,1744,1745,1746,1747,1748,1749,1750,
-  1754,1758,1759,1760,1761,1762,1763,1764,1797,1801,1802,1803,1804,1805,1806,1807,
-  1811,1815,1816,1817,1818,1819,1820,1821,1470,1469,1822,1474,1465,   0,1473,1825,
-  1429,1428,1426,  12,1432,   0,  26,   0,   0,1315,1823,1484,1466,   0,1483,1829,
-  1433,  13,1437,  14,1441,1826,1827,1828,1488,1487,1513,  19,   0,   0,1492,1515,
-  1445,1444,1442,  15,   0,1831,1832,1833,1502,1501,1516,  25,1497,1498,1506,1518,
-  1457,1456,1454,  17,1453,1313,  11,   3,   0,   0,1824,1512,1519,   0,1511,1830,
-  1449,  16,1460,  18,1464,   4,   0,   0,  30,  31,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  20,   0,
-     0,   0,   2,   6,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,1834,1835,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,1836,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,1837,1839,1838,   0,   0,   0,   0,1840,   0,   0,   0,
-     0,1841,   0,   0,1842,   0,   0,   0,   0,   0,   0,   0,1843,   0,1844,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,1845,   0,   0,1846,   0,   0,1847,
-     0,1848,   0,   0,   0,   0,   0,   0, 937,   0,1850,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,1849, 936, 938,1851,1852,   0,   0,1853,1854,   0,   0,
-  1855,1856,   0,   0,   0,   0,   0,   0,1857,1858,   0,   0,1861,1862,   0,   0,
-  1863,1864,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,1867,1868,1869,1870,1859,1860,1865,1866,   0,   0,   0,   0,
-     0,   0,1871,1872,1873,1874,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,  32,  33,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,1875,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,1877,   0,1878,   0,1879,   0,1880,   0,1881,   0,1882,   0,
-  1883,   0,1884,   0,1885,   0,1886,   0,1887,   0,1888,   0,   0,1889,   0,1890,
-     0,1891,   0,   0,   0,   0,   0,   0,1892,1893,   0,1894,1895,   0,1896,1897,
-     0,1898,1899,   0,1900,1901,   0,   0,   0,   0,   0,   0,1876,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,1902,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,1904,   0,1905,   0,1906,   0,1907,   0,1908,   0,1909,   0,
-  1910,   0,1911,   0,1912,   0,1913,   0,1914,   0,1915,   0,   0,1916,   0,1917,
-     0,1918,   0,   0,   0,   0,   0,   0,1919,1920,   0,1921,1922,   0,1923,1924,
-     0,1925,1926,   0,1927,1928,   0,   0,   0,   0,   0,   0,1903,   0,   0,1929,
-  1930,1931,1932,   0,   0,   0,1933,   0, 710, 385, 724, 715, 455, 103, 186, 825,
-   825, 242, 751, 205, 241, 336, 524, 601, 663, 676, 688, 738, 411, 434, 474, 500,
-   649, 746, 799, 108, 180, 416, 482, 662, 810, 275, 462, 658, 692, 344, 618, 679,
-   293, 388, 440, 492, 740, 116, 146, 168, 368, 414, 481, 527, 606, 660, 665, 722,
-   781, 803, 809, 538, 553, 588, 642, 758, 811, 701, 233, 299, 573, 612, 487, 540,
-   714, 779, 232, 267, 412, 445, 457, 585, 594, 766, 167, 613, 149, 148, 560, 589,
-   648, 768, 708, 345, 411, 704, 105, 259, 313, 496, 518, 174, 542, 120, 307, 101,
-   430, 372, 584, 183, 228, 529, 650, 697, 424, 732, 428, 349, 632, 355, 517, 110,
-   135, 147, 403, 580, 624, 700, 750, 170, 193, 245, 297, 374, 463, 543, 763, 801,
-   812, 815, 162, 384, 420, 730, 287, 330, 337, 366, 459, 476, 509, 558, 591, 610,
-   726, 652, 734, 759, 154, 163, 198, 473, 683, 697, 292, 311, 353, 423, 572, 494,
-   113, 217, 259, 280, 314, 499, 506, 603, 608, 752, 778, 782, 788, 117, 557, 748,
-   774, 320, 109, 126, 260, 265, 373, 411, 479, 523, 655, 737, 823, 380, 765, 161,
-   395, 398, 438, 451, 502, 516, 537, 583, 791, 136, 340, 769, 122, 273, 446, 727,
-   305, 322, 400, 496, 771, 155, 190, 269, 377, 391, 406, 432, 501, 519, 599, 684,
-   687, 749, 776, 175, 452, 191, 480, 510, 659, 772, 805, 813, 397, 444, 619, 566,
-   568, 575, 491, 471, 707, 111, 636, 156, 153, 288, 346, 578, 256, 435, 383, 729,
-   680, 767, 694, 295, 128, 210,   0,   0, 227,   0, 379,   0,   0, 150, 493, 525,
-   544, 551, 552, 556, 783, 576, 604,   0, 661,   0, 703,   0,   0, 735, 743,   0,
-     0,   0, 793, 794, 795, 808, 741, 773, 118, 127, 130, 166, 169, 177, 207, 213,
-   215, 226, 229, 268, 270, 317, 327, 329, 335, 369, 375, 381, 404, 441, 448, 458,
-   477, 484, 503, 539, 545, 547, 546, 548, 549, 550, 554, 555, 561, 564, 569, 591,
-   593, 595, 598, 607, 620, 625, 625, 651, 690, 695, 705, 706, 716, 717, 733, 735,
-   777, 786, 790, 315, 869, 623,   0,   0, 102, 145, 134, 115, 129, 138, 165, 171,
-   207, 202, 206, 212, 227, 231, 240, 243, 250, 254, 294, 296, 303, 308, 319, 325,
-   321, 329, 326, 335, 341, 357, 360, 362, 370, 379, 388, 389, 393, 421, 424, 438,
-   456, 454, 458, 465, 477, 535, 485, 490, 493, 507, 512, 514, 521, 522, 525, 526,
-   528, 533, 532, 541, 565, 569, 574, 586, 591, 597, 607, 637, 647, 674, 691, 693,
-   695, 698, 703, 699, 705, 704, 702, 706, 709, 717, 728, 736, 747, 754, 770, 777,
-   783, 784, 786, 787, 790, 802, 825, 848, 847, 857,  55,  65,  66, 883, 892, 916,
-   822, 824,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,1586,   0,1605,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,1602,1603,1934,1935,1574,1575,1576,1577,1579,1580,1581,1583,1584,   0,
-  1585,1587,1588,1589,1591,   0,1592,   0,1593,1594,   0,1595,1596,   0,1598,1599,
-  1600,1601,1604,1582,1578,1590,1597,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,1936,   0,1937,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,1938,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,1939,1940,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,1941,1942,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,1944,1943,   0,1945,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,1946,1947,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-  1948,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,1949,1950,1951,1952,1953,1954,1955,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,1956,1957,1958,1960,1959,1961,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0, 106, 104, 107, 826, 114, 118, 119, 121,
-   123, 124, 127, 125,  34, 830, 130, 131, 132, 137, 827,  35, 133, 139, 829, 142,
-   143, 112, 144, 145, 924, 151, 152,  37, 157, 158, 159, 160,  38, 165, 166, 169,
-   171, 172, 173, 174, 176, 177, 178, 179, 181, 182, 182, 182, 833, 468, 184, 185,
-   834, 187, 188, 189, 196, 192, 194, 195, 197, 199, 200, 201, 203, 204, 204, 206,
-   208, 209, 211, 218, 213, 219, 214, 216, 153, 234, 221, 222, 223, 220, 225, 224,
-   230, 835, 235, 236, 237, 238, 239, 244, 836, 837, 247, 248, 249, 246, 251,  39,
-    40, 253, 255, 255, 838, 257, 258, 259, 261, 839, 262, 263, 301, 264,  41, 266,
-   270, 272, 271, 841, 274, 842, 277, 276, 278, 281, 282,  42, 283, 284, 285, 286,
-    43, 843,  44, 289, 290, 291, 293, 934, 298, 845, 845, 621, 300, 300,  45, 852,
-   894, 302, 304,  46, 306, 309, 310, 312, 316,  48,  47, 317, 846, 318, 323, 324,
-   325, 324, 328, 329, 333, 331, 332, 334, 335, 336, 338, 339, 342, 343, 347, 351,
-   849, 350, 348, 352, 354, 359, 850, 361, 358, 356,  49, 363, 365, 367, 364,  50,
-   369, 371, 851, 376, 386, 378,  53, 381,  52,  51, 140, 141, 387, 382, 614,  78,
-   388, 389, 390, 394, 392, 856,  54, 399, 396, 402, 404, 858, 405, 401, 407,  55,
-   408, 409, 410, 413, 859, 415,  56, 417, 860, 418,  57, 419, 422, 424, 425, 861,
-   840, 862, 426, 863, 429, 431, 427, 433, 437, 441, 438, 439, 442, 443, 864, 436,
-   449, 450,  58, 454, 453, 865, 447, 460, 866, 867, 461, 466, 465, 464,  59, 467,
-   470, 469, 472, 828, 475, 868, 478, 870, 483, 485, 486, 871, 488, 489, 872, 873,
-   495, 497,  60, 498,  61,  61, 504, 505, 507, 508, 511,  62, 513, 874, 515, 875,
-   518, 844, 520, 876, 877, 878,  63,  64, 528, 880, 879, 881, 882, 530, 531, 531,
-   533,  66, 534,  67,  68, 884, 536, 538, 541,  69, 885, 549, 886, 887, 556, 559,
-    70, 561, 562, 563, 888, 889, 889, 567,  71, 890, 570, 571,  72, 891, 577,  73,
-   581, 579, 582, 893, 587,  74, 590, 592, 596,  75, 895, 896,  76, 897, 600, 898,
-   602, 605, 607, 899, 900, 609, 901, 611, 853,  77, 615, 616,  79, 617, 252, 902,
-   903, 854, 855, 621, 622, 731,  80, 627, 626, 628, 164, 629, 630, 631, 633, 904,
-   632, 634, 639, 640, 635, 641, 646, 651, 638, 643, 644, 645, 905, 907, 906,  81,
-   653, 654, 656, 911, 657, 908,  82,  83, 909, 910,  84, 664, 665, 666, 667, 669,
-   668, 671, 670, 674, 672, 673, 675,  85, 677, 678,  86, 681, 682, 912, 685, 686,
-    87, 689,  36, 913, 914,  88,  89, 696, 702, 709, 711, 915, 712, 713, 718, 719,
-   917, 831, 721, 720, 723, 832, 725, 728, 918, 919, 739, 742, 744, 920, 745, 753,
-   756, 757, 755, 760, 761, 921, 762,  90, 764, 922,  91, 775, 279, 780, 923, 925,
-    92,  93, 785, 926,  94, 927, 787, 787, 789, 928, 792,  95, 796, 797, 798, 800,
-    96, 929, 802, 804, 806,  97,  98, 807, 930,  99, 931, 932, 933, 814, 100, 816,
-   817, 818, 819, 820, 821, 935,   0,   0,
+   939, 940, 941, 942, 946, 948,   0, 962, 969, 970, 971, 976,1001,1002,1003,1008,
+     0,1033,1040,1041,1042,1043,1047,   0,   0,1080,1081,1082,1086,1110,   0,   0,
+  1124,1125,1126,1127,1131,1133,   0,1147,1154,1155,1156,1161,1187,1188,1189,1193,
+     0,1219,1226,1227,1228,1229,1233,   0,   0,1267,1268,1269,1273,1298,   0,1303,
+   943,1128, 944,1129, 954,1139, 958,1143, 959,1144, 960,1145, 961,1146, 964,1149,
+     0,   0, 973,1158, 974,1159, 975,1160, 983,1168, 978,1163, 988,1173, 990,1175,
+   991,1176, 993,1178, 994,1179,   0,   0,1004,1190,1005,1191,1006,1192,1014,1199,
+  1007,   0,   0,   0,1016,1201,1020,1206,   0,1022,1208,1025,1211,1023,1209,   0,
+     0,   0,   0,1032,1218,1037,1223,1035,1221,   0,   0,   0,1044,1230,1045,1231,
+  1049,1235,   0,   0,1058,1244,1064,1250,1060,1246,1066,1252,1067,1253,1072,1258,
+  1069,1255,1077,1264,1074,1261,   0,   0,1083,1270,1084,1271,1085,1272,1088,1275,
+  1089,1276,1096,1283,1103,1290,1111,1299,1115,1118,1307,1120,1309,1121,1310,   0,
+  1053,1239,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1093,
+  1280,   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, 949,1134,1010,
+  1195,1050,1236,1090,1277,1341,1368,1340,1367,1342,1369,1339,1366,   0,1320,1347,
+  1418,1419,1323,1350,   0,   0, 992,1177,1018,1204,1055,1241,1416,1417,1415,1424,
+  1202,   0,   0,   0, 987,1172,   0,   0,1031,1217,1321,1348,1322,1349,1338,1365,
+   950,1135, 951,1136, 979,1164, 980,1165,1011,1196,1012,1197,1051,1237,1052,1238,
+  1061,1247,1062,1248,1091,1278,1092,1279,1071,1257,1076,1263,   0,   0, 997,1182,
+     0,   0,   0,   0,   0,   0, 945,1130, 982,1167,1337,1364,1335,1362,1046,1232,
+  1422,1423,1113,1301,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     8,   9,   0,  10,1425,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   7,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+     0,   0,   0,   0,   0,1314,1427,   5,1434,1438,1443,   0,1450,   0,1455,1461,
+  1514,   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,1446,1458,1468,1476,1480,1486,
+  1517,   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,1489,1503,1494,1500,1508,   0,
+     0,   0,   0,1520,1521,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+  1526,1528,   0,1525,   0,   0,   0,1522,   0,   0,   0,   0,1536,1532,1539,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,1534,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,1556,   0,   0,   0,   0,   0,   0,
+  1548,1550,   0,1547,   0,   0,   0,1567,   0,   0,   0,   0,1558,1554,1561,   0,
+     0,   0,   0,   0,   0,   0,1568,1569,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,1529,1551,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+  1523,1545,1524,1546,   0,   0,1527,1549,   0,   0,1570,1571,1530,1552,1531,1553,
+     0,   0,1533,1555,1535,1557,1537,1559,   0,   0,1572,1573,1544,1566,1538,1560,
+  1540,1562,1541,1563,1542,1564,   0,   0,1543,1565,   0,   0,   0,   0,   0,   0,
+     0,   0,1606,1607,1609,1608,1610,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+  1613,   0,1611,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,1612,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,1620,   0,   0,   0,   0,   0,   0,
+     0,1623,   0,   0,1624,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,1614,1615,1616,1617,1618,1619,1621,1622,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1628,1629,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1625,1626,   0,1627,
+     0,   0,   0,1634,   0,   0,1635,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,1630,1631,1632,   0,   0,1633,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,1639,   0,   0,1638,1640,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1636,1637,   0,   0,
+     0,   0,   0,   0,1641,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1642,1644,1643,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,1645,   0,   0,   0,   0,   0,   0,   0,
+  1646,   0,   0,   0,   0,   0,   0,1648,1649,   0,1647,1650,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1651,1653,1652,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1654,   0,1655,1657,1656,   0,
+     0,   0,   0,1659,   0,   0,   0,   0,   0,   0,   0,   0,   0,1660,   0,   0,
+     0,   0,1661,   0,   0,   0,   0,1662,   0,   0,   0,   0,1663,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,1658,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,1664,   0,1665,1673,   0,1674,   0,   0,   0,   0,   0,   0,   0,
+     0,1666,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,1668,   0,   0,   0,   0,   0,   0,   0,   0,   0,1669,   0,   0,
+     0,   0,1670,   0,   0,   0,   0,1671,   0,   0,   0,   0,1672,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,1667,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,1675,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,1676,   0,1677,   0,1678,   0,1679,   0,1680,   0,
+     0,   0,1681,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1682,   0,1683,   0,   0,
+  1684,1685,   0,1686,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+   953,1138, 955,1140, 956,1141, 957,1142,1324,1351, 963,1148, 965,1150, 968,1153,
+   966,1151, 967,1152,1378,1380,1379,1381, 984,1169, 985,1170,1420,1421, 986,1171,
+   989,1174, 995,1180, 998,1183, 996,1181, 999,1184,1000,1185,1015,1200,1329,1356,
+  1017,1203,1019,1205,1021,1207,1024,1210,1687,1688,1027,1213,1026,1212,1028,1214,
+  1029,1215,1030,1216,1034,1220,1036,1222,1039,1225,1038,1224,1334,1361,1336,1363,
+  1382,1384,1383,1385,1056,1242,1057,1243,1059,1245,1063,1249,1689,1690,1065,1251,
+  1068,1254,1070,1256,1386,1387,1388,1389,1691,1692,1073,1259,1075,1262,1079,1266,
+  1078,1265,1095,1282,1098,1285,1097,1284,1390,1391,1392,1393,1099,1286,1100,1287,
+  1101,1288,1102,1289,1105,1292,1104,1291,1106,1294,1107,1295,1108,1296,1114,1302,
+  1119,1308,1122,1311,1123,1312,1186,1260,1293,1305,   0,1394,   0,   0,   0,   0,
+   952,1137, 947,1132,1317,1344,1316,1343,1319,1346,1318,1345,1693,1695,1371,1375,
+  1370,1374,1373,1377,1372,1376,1694,1696, 981,1166, 977,1162, 972,1157,1326,1353,
+  1325,1352,1328,1355,1327,1354,1697,1698,1009,1194,1013,1198,1054,1240,1048,1234,
+  1331,1358,1330,1357,1333,1360,1332,1359,1699,1700,1396,1401,1395,1400,1398,1403,
+  1397,1402,1399,1404,1094,1281,1087,1274,1406,1411,1405,1410,1408,1413,1407,1412,
+  1409,1414,1109,1297,1117,1306,1116,1304,1112,1300,   0,   0,   0,   0,   0,   0,
+  1471,1472,1701,1705,1702,1706,1703,1707,1430,1431,1715,1719,1716,1720,1717,1721,
+  1477,1478,1729,1731,1730,1732,   0,   0,1435,1436,1733,1735,1734,1736,   0,   0,
+  1481,1482,1737,1741,1738,1742,1739,1743,1439,1440,1751,1755,1752,1756,1753,1757,
+  1490,1491,1765,1768,1766,1769,1767,1770,1447,1448,1771,1774,1772,1775,1773,1776,
+  1495,1496,1777,1779,1778,1780,   0,   0,1451,1452,1781,1783,1782,1784,   0,   0,
+  1504,1505,1785,1788,1786,1789,1787,1790,   0,1459,   0,1791,   0,1792,   0,1793,
+  1509,1510,1794,1798,1795,1799,1796,1800,1462,1463,1808,1812,1809,1813,1810,1814,
+  1467,  21,1475,  22,1479,  23,1485,  24,1493,  27,1499,  28,1507,  29,   0,   0,
+  1704,1708,1709,1710,1711,1712,1713,1714,1718,1722,1723,1724,1725,1726,1727,1728,
+  1740,1744,1745,1746,1747,1748,1749,1750,1754,1758,1759,1760,1761,1762,1763,1764,
+  1797,1801,1802,1803,1804,1805,1806,1807,1811,1815,1816,1817,1818,1819,1820,1821,
+  1470,1469,1822,1474,1465,   0,1473,1825,1429,1428,1426,  12,1432,   0,  26,   0,
+     0,1315,1823,1484,1466,   0,1483,1829,1433,  13,1437,  14,1441,1826,1827,1828,
+  1488,1487,1513,  19,   0,   0,1492,1515,1445,1444,1442,  15,   0,1831,1832,1833,
+  1502,1501,1516,  25,1497,1498,1506,1518,1457,1456,1454,  17,1453,1313,  11,   3,
+     0,   0,1824,1512,1519,   0,1511,1830,1449,  16,1460,  18,1464,   4,   0,   0,
+    30,  31,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,  20,   0,   0,   0,   2,   6,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1834,1835,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1836,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1837,1839,1838,
+     0,   0,   0,   0,1840,   0,   0,   0,   0,1841,   0,   0,1842,   0,   0,   0,
+     0,   0,   0,   0,1843,   0,1844,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,1845,   0,   0,1846,   0,   0,1847,   0,1848,   0,   0,   0,   0,   0,   0,
+   937,   0,1850,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1849, 936, 938,
+  1851,1852,   0,   0,1853,1854,   0,   0,1855,1856,   0,   0,   0,   0,   0,   0,
+  1857,1858,   0,   0,1861,1862,   0,   0,1863,1864,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1867,1868,1869,1870,
+  1859,1860,1865,1866,   0,   0,   0,   0,   0,   0,1871,1872,1873,1874,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,  32,  33,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1875,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1877,   0,1878,   0,
+  1879,   0,1880,   0,1881,   0,1882,   0,1883,   0,1884,   0,1885,   0,1886,   0,
+  1887,   0,1888,   0,   0,1889,   0,1890,   0,1891,   0,   0,   0,   0,   0,   0,
+  1892,1893,   0,1894,1895,   0,1896,1897,   0,1898,1899,   0,1900,1901,   0,   0,
+     0,   0,   0,   0,1876,   0,   0,   0,   0,   0,   0,   0,   0,   0,1902,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1904,   0,1905,   0,
+  1906,   0,1907,   0,1908,   0,1909,   0,1910,   0,1911,   0,1912,   0,1913,   0,
+  1914,   0,1915,   0,   0,1916,   0,1917,   0,1918,   0,   0,   0,   0,   0,   0,
+  1919,1920,   0,1921,1922,   0,1923,1924,   0,1925,1926,   0,1927,1928,   0,   0,
+     0,   0,   0,   0,1903,   0,   0,1929,1930,1931,1932,   0,   0,   0,1933,   0,
+   710, 385, 724, 715, 455, 103, 186, 825, 825, 242, 751, 205, 241, 336, 524, 601,
+   663, 676, 688, 738, 411, 434, 474, 500, 649, 746, 799, 108, 180, 416, 482, 662,
+   810, 275, 462, 658, 692, 344, 618, 679, 293, 388, 440, 492, 740, 116, 146, 168,
+   368, 414, 481, 527, 606, 660, 665, 722, 781, 803, 809, 538, 553, 588, 642, 758,
+   811, 701, 233, 299, 573, 612, 487, 540, 714, 779, 232, 267, 412, 445, 457, 585,
+   594, 766, 167, 613, 149, 148, 560, 589, 648, 768, 708, 345, 411, 704, 105, 259,
+   313, 496, 518, 174, 542, 120, 307, 101, 430, 372, 584, 183, 228, 529, 650, 697,
+   424, 732, 428, 349, 632, 355, 517, 110, 135, 147, 403, 580, 624, 700, 750, 170,
+   193, 245, 297, 374, 463, 543, 763, 801, 812, 815, 162, 384, 420, 730, 287, 330,
+   337, 366, 459, 476, 509, 558, 591, 610, 726, 652, 734, 759, 154, 163, 198, 473,
+   683, 697, 292, 311, 353, 423, 572, 494, 113, 217, 259, 280, 314, 499, 506, 603,
+   608, 752, 778, 782, 788, 117, 557, 748, 774, 320, 109, 126, 260, 265, 373, 411,
+   479, 523, 655, 737, 823, 380, 765, 161, 395, 398, 438, 451, 502, 516, 537, 583,
+   791, 136, 340, 769, 122, 273, 446, 727, 305, 322, 400, 496, 771, 155, 190, 269,
+   377, 391, 406, 432, 501, 519, 599, 684, 687, 749, 776, 175, 452, 191, 480, 510,
+   659, 772, 805, 813, 397, 444, 619, 566, 568, 575, 491, 471, 707, 111, 636, 156,
+   153, 288, 346, 578, 256, 435, 383, 729, 680, 767, 694, 295, 128, 210,   0,   0,
+   227,   0, 379,   0,   0, 150, 493, 525, 544, 551, 552, 556, 783, 576, 604,   0,
+   661,   0, 703,   0,   0, 735, 743,   0,   0,   0, 793, 794, 795, 808, 741, 773,
+   118, 127, 130, 166, 169, 177, 207, 213, 215, 226, 229, 268, 270, 317, 327, 329,
+   335, 369, 375, 381, 404, 441, 448, 458, 477, 484, 503, 539, 545, 547, 546, 548,
+   549, 550, 554, 555, 561, 564, 569, 591, 593, 595, 598, 607, 620, 625, 625, 651,
+   690, 695, 705, 706, 716, 717, 733, 735, 777, 786, 790, 315, 869, 623,   0,   0,
+   102, 145, 134, 115, 129, 138, 165, 171, 207, 202, 206, 212, 227, 231, 240, 243,
+   250, 254, 294, 296, 303, 308, 319, 325, 321, 329, 326, 335, 341, 357, 360, 362,
+   370, 379, 388, 389, 393, 421, 424, 438, 456, 454, 458, 465, 477, 535, 485, 490,
+   493, 507, 512, 514, 521, 522, 525, 526, 528, 533, 532, 541, 565, 569, 574, 586,
+   591, 597, 607, 637, 647, 674, 691, 693, 695, 698, 703, 699, 705, 704, 702, 706,
+   709, 717, 728, 736, 747, 754, 770, 777, 783, 784, 786, 787, 790, 802, 825, 848,
+   847, 857,  55,  65,  66, 883, 892, 916, 822, 824,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1586,   0,1605,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1602,1603,1934,1935,1574,1575,
+  1576,1577,1579,1580,1581,1583,1584,   0,1585,1587,1588,1589,1591,   0,1592,   0,
+  1593,1594,   0,1595,1596,   0,1598,1599,1600,1601,1604,1582,1578,1590,1597,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1936,   0,1937,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1938,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1939,1940,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1941,1942,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1944,1943,   0,1945,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1946,1947,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,1948,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1949,1950,
+  1951,1952,1953,1954,1955,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1956,1957,1958,1960,1959,
+  1961,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+   106, 104, 107, 826, 114, 118, 119, 121, 123, 124, 127, 125,  34, 830, 130, 131,
+   132, 137, 827,  35, 133, 139, 829, 142, 143, 112, 144, 145, 924, 151, 152,  37,
+   157, 158, 159, 160,  38, 165, 166, 169, 171, 172, 173, 174, 176, 177, 178, 179,
+   181, 182, 182, 182, 833, 468, 184, 185, 834, 187, 188, 189, 196, 192, 194, 195,
+   197, 199, 200, 201, 203, 204, 204, 206, 208, 209, 211, 218, 213, 219, 214, 216,
+   153, 234, 221, 222, 223, 220, 225, 224, 230, 835, 235, 236, 237, 238, 239, 244,
+   836, 837, 247, 248, 249, 246, 251,  39,  40, 253, 255, 255, 838, 257, 258, 259,
+   261, 839, 262, 263, 301, 264,  41, 266, 270, 272, 271, 841, 274, 842, 277, 276,
+   278, 281, 282,  42, 283, 284, 285, 286,  43, 843,  44, 289, 290, 291, 293, 934,
+   298, 845, 845, 621, 300, 300,  45, 852, 894, 302, 304,  46, 306, 309, 310, 312,
+   316,  48,  47, 317, 846, 318, 323, 324, 325, 324, 328, 329, 333, 331, 332, 334,
+   335, 336, 338, 339, 342, 343, 347, 351, 849, 350, 348, 352, 354, 359, 850, 361,
+   358, 356,  49, 363, 365, 367, 364,  50, 369, 371, 851, 376, 386, 378,  53, 381,
+    52,  51, 140, 141, 387, 382, 614,  78, 388, 389, 390, 394, 392, 856,  54, 399,
+   396, 402, 404, 858, 405, 401, 407,  55, 408, 409, 410, 413, 859, 415,  56, 417,
+   860, 418,  57, 419, 422, 424, 425, 861, 840, 862, 426, 863, 429, 431, 427, 433,
+   437, 441, 438, 439, 442, 443, 864, 436, 449, 450,  58, 454, 453, 865, 447, 460,
+   866, 867, 461, 466, 465, 464,  59, 467, 470, 469, 472, 828, 475, 868, 478, 870,
+   483, 485, 486, 871, 488, 489, 872, 873, 495, 497,  60, 498,  61,  61, 504, 505,
+   507, 508, 511,  62, 513, 874, 515, 875, 518, 844, 520, 876, 877, 878,  63,  64,
+   528, 880, 879, 881, 882, 530, 531, 531, 533,  66, 534,  67,  68, 884, 536, 538,
+   541,  69, 885, 549, 886, 887, 556, 559,  70, 561, 562, 563, 888, 889, 889, 567,
+    71, 890, 570, 571,  72, 891, 577,  73, 581, 579, 582, 893, 587,  74, 590, 592,
+   596,  75, 895, 896,  76, 897, 600, 898, 602, 605, 607, 899, 900, 609, 901, 611,
+   853,  77, 615, 616,  79, 617, 252, 902, 903, 854, 855, 621, 622, 731,  80, 627,
+   626, 628, 164, 629, 630, 631, 633, 904, 632, 634, 639, 640, 635, 641, 646, 651,
+   638, 643, 644, 645, 905, 907, 906,  81, 653, 654, 656, 911, 657, 908,  82,  83,
+   909, 910,  84, 664, 665, 666, 667, 669, 668, 671, 670, 674, 672, 673, 675,  85,
+   677, 678,  86, 681, 682, 912, 685, 686,  87, 689,  36, 913, 914,  88,  89, 696,
+   702, 709, 711, 915, 712, 713, 718, 719, 917, 831, 721, 720, 723, 832, 725, 728,
+   918, 919, 739, 742, 744, 920, 745, 753, 756, 757, 755, 760, 761, 921, 762,  90,
+   764, 922,  91, 775, 279, 780, 923, 925,  92,  93, 785, 926,  94, 927, 787, 787,
+   789, 928, 792,  95, 796, 797, 798, 800,  96, 929, 802, 804, 806,  97,  98, 807,
+   930,  99, 931, 932, 933, 814, 100, 816, 817, 818, 819, 820, 821, 935,   0,   0,
 };
 static const int16_t
 _hb_ucd_i16[196] =
@@ -5554,12 +5645,12 @@ _hb_ucd_i16[196] =
 static inline uint_fast8_t
 _hb_ucd_gc (unsigned u)
 {
-  return u<1114110u?_hb_ucd_u8[6504+(((_hb_ucd_u8[1264+(((_hb_ucd_u16[((_hb_ucd_u8[544+(((_hb_ucd_u8[u>>1>>3>>3>>4])<<4)+((u>>1>>3>>3)&15u))])<<3)+((u>>1>>3)&7u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:2;
+  return u<1114110u?_hb_ucd_u8[6664+(((_hb_ucd_u8[1296+(((_hb_ucd_u16[((_hb_ucd_u8[544+(((_hb_ucd_u8[u>>1>>3>>3>>4])<<4)+((u>>1>>3>>3)&15u))])<<3)+((u>>1>>3)&7u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:2;
 }
 static inline uint_fast8_t
 _hb_ucd_ccc (unsigned u)
 {
-  return u<125259u?_hb_ucd_u8[8768+(((_hb_ucd_u8[7792+(((_hb_ucd_u8[7120+(((_hb_ucd_u8[6874+(u>>2>>3>>4)])<<4)+((u>>2>>3)&15u))])<<3)+((u>>2)&7u))])<<2)+((u)&3u))]:0;
+  return u<125259u?_hb_ucd_u8[8984+(((_hb_ucd_u8[7960+(((_hb_ucd_u8[7288+(((_hb_ucd_u8[7042+(u>>2>>3>>4)])<<4)+((u>>2>>3)&15u))])<<3)+((u>>2)&7u))])<<2)+((u)&3u))]:0;
 }
 static inline unsigned
 _hb_ucd_b4 (const uint8_t* a, unsigned i)
@@ -5569,42 +5660,59 @@ _hb_ucd_b4 (const uint8_t* a, unsigned i)
 static inline int_fast16_t
 _hb_ucd_bmg (unsigned u)
 {
-  return u<65380u?_hb_ucd_i16[((_hb_ucd_u8[9508+(((_hb_ucd_u8[9388+(((_hb_ucd_b4(9260+_hb_ucd_u8,u>>2>>3>>3))<<3)+((u>>2>>3)&7u))])<<3)+((u>>2)&7u))])<<2)+((u)&3u)]:0;
+  return u<65380u?_hb_ucd_i16[((_hb_ucd_u8[9728+(((_hb_ucd_u8[9608+(((_hb_ucd_b4(9480+_hb_ucd_u8,u>>2>>3>>3))<<3)+((u>>2>>3)&7u))])<<3)+((u>>2)&7u))])<<2)+((u)&3u)]:0;
 }
 static inline uint_fast8_t
 _hb_ucd_sc (unsigned u)
 {
-  return u<918000u?_hb_ucd_u8[10974+(((_hb_ucd_u16[1960+(((_hb_ucd_u8[10286+(((_hb_ucd_u8[9836+(u>>3>>4>>4)])<<4)+((u>>3>>4)&15u))])<<4)+((u>>3)&15u))])<<3)+((u)&7u))]:2;
+  return u<918000u?_hb_ucd_u8[11234+(((_hb_ucd_u16[2000+(((_hb_ucd_u8[10514+(((_hb_ucd_u8[10064+(u>>3>>4>>4)])<<4)+((u>>3>>4)&15u))])<<4)+((u>>3)&15u))])<<3)+((u)&7u))]:2;
 }
 static inline uint_fast16_t
 _hb_ucd_dm (unsigned u)
 {
-  return u<195102u?_hb_ucd_u16[5768+(((_hb_ucd_u8[16708+(((_hb_ucd_u8[16326+(u>>4>>5)])<<5)+((u>>4)&31u))])<<4)+((u)&15u))]:0;
+  return u<195102u?_hb_ucd_u16[5888+(((_hb_ucd_u8[17136+(((_hb_ucd_u8[16754+(u>>4>>5)])<<5)+((u>>4)&31u))])<<4)+((u)&15u))]:0;
 }
 
 
 #else
 
 static const uint8_t
-_hb_ucd_u8[13344] =
+_hb_ucd_u8[13602] =
 {
-    0,  1,  2,  3,  4,  5,  5,  5,  5,  5,  6,  5,  5,  7,  8,  9,
-   10, 11, 12, 13, 14, 15, 16,  5, 17, 15, 15, 18, 15, 19, 20, 21,
-    5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 22, 23,
-    5, 24, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-   15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-   15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-   15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-   15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-   15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-   15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-   15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-   15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-   15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-   15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-   25, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-    8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-    8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+    0,  1,  2,  3,  4,  5,  6,  7,  7,  8,  7,  7,  7,  7,  7,  7,
+    7,  7,  7,  7,  9, 10,  7,  7,  7,  7,  7, 11, 12, 12, 12, 13,
+   14, 15, 16, 17, 18, 19, 20, 21, 22, 21, 21, 21, 21, 23,  7,  7,
+    7, 24, 21, 21, 21, 25, 26, 27, 21, 28, 29, 30, 31, 32, 33, 34,
+    7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+    7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7, 35, 21, 36,
+    7,  7, 37, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+   21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+   21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+   21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+   21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+   21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+   21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+   21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+   21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+   21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+   21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+   21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+   21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+   21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+   21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+   21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+   21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+   21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+   21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+   21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+   21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+   21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+   38, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+   21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+   12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+   12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+   12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+   12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
    16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
    32, 33, 34, 34, 34, 34, 35, 36, 37, 34, 34, 34, 38, 39, 40, 41,
@@ -5613,50 +5721,37 @@ _hb_ucd_u8[13344] =
    67, 67, 62, 72, 62, 62, 73, 67, 74, 75, 76, 77, 78, 67, 67, 67,
    79, 80, 34, 81, 82, 83, 67, 67, 34, 34, 34, 34, 34, 34, 34, 34,
    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
-   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 84, 34, 34, 34, 34,
-   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
-   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
    85, 34, 34, 34, 34, 34, 34, 34, 34, 86, 34, 34, 87, 88, 89, 90,
    91, 92, 93, 94, 95, 96, 97, 98, 34, 34, 34, 34, 34, 34, 34, 34,
-   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
    99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
-  100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
-  100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
-  100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
-  100,100, 34, 34, 34, 34,101,102, 34, 34,103,104,105,106,107,108,
-   34, 34,109,110,111,112,113,114,115,116,117,111, 34, 34, 34,111,
-  118,119,120,121,122,123,124,125, 34,126,127,111,128,129,130,131,
-  132,133,134,135,136,137,138,111,139,140,111,141,142,143,144,111,
-  145,146,147,148,149,150,111,111,151,152,153,154,111,155,111,156,
-   34, 34, 34, 34, 34, 34, 34, 34,157, 34, 34,111,111,111,111,111,
-  111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,
-   34, 34, 34, 34, 34, 34, 34, 34,158,111,111,111,111,111,111,111,
-  111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,
-  111,111,111,111,111,111,111,111, 34, 34, 34, 34, 34,111,111,111,
-  111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,
-  111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,
-  111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,
+  100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+  100,100, 34, 34, 34, 34,101,102, 34, 34,103,104,105,106,107,108,
+   34, 34,109,110,111,112,113,114,115,116,117,118, 34, 34, 34,119,
+  120,121,122,123,124,125,126,127, 34,128,129,111,130,131,132,133,
+  134,135,136,137,138,139,140,111,141,142,111,143,144,145,146,111,
+  147,148,149,150,151,152,111,111,153,154,155,156,111,157,111,158,
+   34, 34, 34, 34, 34, 34, 34, 34,159, 34, 34,111,111,111,111,111,
+  111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,160,
+   34, 34, 34, 34, 34, 34, 34, 34,161,111,111,111,111,111,111,111,
   111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,
-   34, 34, 34, 34,159,160,161, 34,111,111,111,111,162,163,164,165,
-   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+  111,111,111,111,111,111,111,111, 34, 34, 34, 34, 34,111,111,111,
+   34, 34, 34, 34,162,163,164, 34,111,111,111,111,165,166,167,168,
    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,111,111,111,111,111,
+  111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,119,
    34, 34, 34, 34, 34, 34,111,111,111,111,111,111,111,111,111,111,
-  111,111,111,111,111,111,111,111, 34,166,111,111,111,111,111,111,
-   67, 67,167,168,169,128, 65,111,170,171,172,173,174,175,176,177,
-   67, 67, 67, 67,178,179,111,111,111,111,111,111,111,111,111,111,
-  180,111,181,111,111,182,111,111,111,111,111,111,111,111,111,111,
-   34,183,184,111,111,111,111,111,128,185,186,111, 34,187,111,111,
-   67, 67,188, 67, 67,111, 67,189, 67, 67, 67, 67, 67, 67, 67, 67,
-   67, 67, 67, 67, 67, 67, 67,190,111,111,111,111,111,111,111,111,
-   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+  111,111,111,111,111,111,111,111, 34,169,111,111,111,111,111,111,
+  111,111,111,111,111,111,111,111,111,111,111,111,111,111,170, 67,
+   67, 67,171,172,173,130, 65,111,174,175,176,177,178,179,180,181,
+   67, 67, 67, 67,182,183,111,111,111,111,111,111,111,111,184,111,
+  185,111,186,111,111,187,111,111,111,111,111,111,111,111,111, 34,
+   34,188,189,111,111,111,111,111,130,190,191,111, 34,192,111,111,
+   67, 67,193, 67, 67,111, 67,194, 67, 67, 67, 67, 67, 67, 67, 67,
+   67, 67, 67, 67, 67, 67, 67,195,111,111,111,111,111,111,111,111,
    34, 34, 34, 34, 34, 34, 34, 34,111,111,111,111,111,111,111,111,
-  111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,
    34, 34, 34, 34, 34,111,111,111,111,111,111,111,111,111,111,111,
    34, 34, 34, 34, 34, 34, 34,111,111,111,111,111,111,111,111,111,
-  111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,
-  191,111,180,180,111,111,111,111,111,111,111,111,111,111,111,111,
-  111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,
+  196,111,185,185,111,111,111,111,111,111,111,111,111,111,111,111,
     0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  3,  2,  4,  5,  6,  2,
     7,  7,  7,  7,  7,  2,  8,  9, 10, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16,
@@ -5682,413 +5777,418 @@ _hb_ucd_u8[13344] =
    54, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 55,
    56, 57, 43, 56, 43, 43, 43, 43, 36, 36, 36, 36, 36, 36, 36, 36,
    36, 58,  2,  2,  2,  2,  2,  2, 59, 59, 59,  8,  9, 60,  2, 61,
-   43, 43, 43, 43, 43, 57, 59,  2, 62, 36, 36, 36, 36, 63, 43, 43,
-    7,  7,  7,  7,  7,  2,  2, 36, 64, 36, 36, 36, 36, 36, 36, 36,
-   36, 36, 65, 43, 43, 43, 66, 47, 43, 43, 67, 68, 69, 43, 43, 36,
-    7,  7,  7,  7,  7, 36, 70, 71,  2,  2,  2,  2,  2,  2,  2, 72,
-   63, 36, 36, 36, 36, 36, 36, 36, 43, 43, 43, 43, 43, 43, 64, 36,
+   43, 43, 43, 43, 43, 57, 62,  2, 63, 36, 36, 36, 36, 64, 43, 43,
+    7,  7,  7,  7,  7,  2,  2, 36, 65, 36, 36, 36, 36, 36, 36, 36,
+   36, 36, 66, 43, 43, 43, 67, 47, 43, 43, 68, 69, 70, 43, 43, 36,
+    7,  7,  7,  7,  7, 36, 71, 72,  2,  2,  2,  2,  2,  2,  2, 73,
+   64, 36, 36, 36, 36, 36, 36, 36, 43, 43, 43, 43, 43, 43, 65, 36,
    36, 36, 36, 43, 43, 43, 43, 43,  7,  7,  7,  7,  7, 36, 36, 36,
-   36, 36, 36, 36, 36, 63, 43, 43, 43, 43, 40, 21,  2, 40, 68, 20,
-   36, 36, 36, 43, 43, 68, 43, 43, 43, 43, 68, 43, 68, 43, 43, 43,
-    2,  2,  2,  2,  2,  2,  2,  2, 36, 36, 36, 36, 63, 43, 43,  2,
-   36, 63, 43, 43, 43, 43, 43, 43, 43, 73, 43, 43, 43, 43, 43, 43,
-   43, 74, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 74, 64, 75,
-   76, 43, 43, 43, 74, 75, 76, 75, 63, 43, 43, 43, 36, 36, 36, 36,
-   36, 43,  2,  7,  7,  7,  7,  7, 77, 36, 36, 36, 36, 36, 36, 36,
-   63, 75, 78, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 64, 75,
-   76, 43, 43, 74, 75, 75, 76, 36, 36, 36, 36, 79, 75, 75, 36, 36,
+   36, 36, 36, 36, 36, 64, 43, 43, 43, 43, 40, 21,  2, 40, 69, 20,
+   36, 36, 36, 43, 43, 69, 43, 43, 43, 43, 69, 43, 69, 43, 43, 43,
+    2,  2,  2,  2,  2,  2,  2,  2, 36, 36, 36, 36, 64, 43, 43,  2,
+   36, 36, 36, 36, 74, 36, 36, 36, 59, 59, 59, 59, 43, 43, 43, 43,
+   36, 36, 36, 36, 75, 43, 43, 43, 43, 76, 43, 43, 43, 43, 43, 43,
+   43, 77, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 77, 65, 78,
+   79, 43, 43, 43, 77, 78, 79, 78, 64, 43, 43, 43, 36, 36, 36, 36,
+   36, 43,  2,  7,  7,  7,  7,  7, 80, 36, 36, 36, 36, 36, 36, 36,
+   64, 78, 81, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 65, 78,
+   79, 43, 43, 77, 78, 78, 79, 36, 36, 36, 36, 82, 78, 78, 36, 36,
    36, 43, 43,  7,  7,  7,  7,  7, 36, 20, 27, 27, 27, 53, 58, 43,
-   43, 74, 78, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 43, 75,
-   76, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 64, 36, 36, 36,
-   36, 36, 36,  7,  7,  7,  7,  7, 43, 36, 63,  2,  2,  2,  2,  2,
-   76, 43, 43, 43, 74, 75, 76, 43, 60, 20, 20, 20, 80, 43, 43, 43,
-   43, 75, 78, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 64, 76,
-   76, 43, 43, 74, 75, 75, 76, 43, 43, 43, 43, 74, 75, 75, 36, 36,
-   71, 27, 27, 27, 27, 27, 27, 27, 43, 64, 36, 36, 36, 36, 36, 36,
-   36, 36, 36, 36, 36, 36, 36, 75, 74, 75, 75, 75, 75, 75, 76, 43,
-   36, 36, 36, 79, 75, 75, 75, 75, 75, 75, 75,  7,  7,  7,  7,  7,
-   27, 81, 61, 61, 53, 61, 61, 61, 74, 75, 64, 36, 36, 36, 36, 36,
-   36, 36, 36, 36, 36, 36, 36, 43, 74, 75, 75, 43, 43, 43, 43, 43,
-   43, 43, 43, 43, 36, 36, 36, 36,  7,  7,  7, 82, 27, 27, 27, 81,
-   63, 75, 65, 36, 36, 36, 36, 36, 75, 75, 75, 74, 75, 75, 43, 43,
-   43, 43, 74, 75, 75, 75, 75, 36, 83, 36, 36, 36, 36, 36, 36, 36,
-   43, 75, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 63, 64, 75,
-   76, 43, 43, 75, 75, 75, 76, 70, 61, 61, 36, 79, 27, 27, 27, 84,
-   27, 27, 27, 27, 81, 36, 36, 36, 36, 36, 36, 36, 36, 43, 43, 74,
-   75, 43, 43, 43, 75, 75, 75, 75,  7, 75,  2,  2,  2,  2,  2,  2,
-   63, 36, 43, 43, 43, 43, 43, 85, 36, 36, 36, 68, 43, 43, 43, 57,
-    7,  7,  7,  7,  7,  2,  2,  2, 63, 36, 43, 43, 43, 43, 64, 36,
+   43, 77, 81, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 43, 78,
+   79, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 65, 36, 36, 36,
+   36, 36, 36,  7,  7,  7,  7,  7, 43, 36, 64,  2,  2,  2,  2,  2,
+   79, 43, 43, 43, 77, 78, 79, 43, 60, 20, 20, 20, 83, 43, 43, 43,
+   43, 78, 81, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 65, 79,
+   79, 43, 43, 77, 78, 78, 79, 43, 43, 43, 43, 77, 78, 78, 36, 36,
+   72, 27, 27, 27, 27, 27, 27, 27, 43, 65, 36, 36, 36, 36, 36, 36,
+   36, 36, 36, 36, 36, 36, 36, 78, 77, 78, 78, 78, 78, 78, 79, 43,
+   36, 36, 36, 82, 78, 78, 78, 78, 78, 78, 78,  7,  7,  7,  7,  7,
+   27, 84, 61, 61, 53, 61, 61, 61, 77, 78, 65, 36, 36, 36, 36, 36,
+   36, 36, 36, 36, 36, 36, 65, 43, 77, 78, 78, 43, 43, 43, 43, 43,
+   43, 43, 43, 43, 36, 36, 36, 36,  7,  7,  7, 85, 27, 27, 27, 84,
+   64, 78, 66, 36, 36, 36, 36, 36, 78, 78, 78, 77, 78, 78, 43, 43,
+   43, 43, 77, 78, 78, 78, 81, 36, 86, 36, 36, 36, 36, 36, 36, 36,
+   43, 78, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 64, 65, 78,
+   79, 43, 43, 78, 78, 78, 79, 71, 61, 61, 36, 82, 27, 27, 27, 87,
+   27, 27, 27, 27, 84, 36, 36, 36, 36, 36, 36, 36, 36, 43, 43, 77,
+   78, 43, 43, 43, 78, 78, 78, 78,  7, 78,  2,  2,  2,  2,  2,  2,
+   64, 36, 43, 43, 43, 43, 43, 88, 36, 36, 36, 69, 43, 43, 43, 57,
+    7,  7,  7,  7,  7,  2,  2,  2, 64, 36, 43, 43, 43, 43, 65, 36,
    36, 36, 36, 40, 43, 43, 43, 43,  7,  7,  7,  7,  7,  7, 36, 36,
-   70, 61,  2,  2,  2,  2,  2,  2,  2, 86, 86, 61, 43, 61, 61, 61,
-    7,  7,  7,  7,  7, 27, 27, 27, 27, 27, 47, 47, 47,  4,  4, 75,
-   63, 43, 43, 43, 43, 43, 43, 74, 43, 43, 57, 43, 36, 36, 63, 43,
-   43, 43, 43, 43, 43, 43, 43, 61, 61, 61, 61, 69, 61, 61, 61, 61,
-    2,  2, 86, 61, 21,  2,  2,  2, 36, 36, 36, 36, 36, 79, 76, 43,
-   74, 43, 43, 43, 76, 74, 76, 64, 36, 36, 36, 75, 43, 36, 36, 43,
-   64, 75, 78, 79, 75, 75, 75, 36, 63, 43, 64, 36, 36, 36, 36, 36,
-   36, 74, 76, 74, 75, 75, 76, 79,  7,  7,  7,  7,  7, 75, 76, 61,
-   16, 16, 16, 16, 16, 50, 44, 16, 36, 36, 36, 36, 36, 36, 63, 43,
-    2,  2,  2,  2, 87, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+   71, 61,  2,  2,  2,  2,  2,  2,  2, 89, 89, 61, 43, 61, 61, 61,
+    7,  7,  7,  7,  7, 27, 27, 27, 27, 27, 47, 47, 47,  4,  4, 78,
+   64, 43, 43, 43, 43, 43, 43, 77, 43, 43, 57, 43, 36, 36, 64, 43,
+   43, 43, 43, 43, 43, 43, 43, 61, 61, 61, 61, 70, 61, 61, 61, 61,
+    2,  2, 89, 61, 21,  2,  2,  2, 36, 36, 36, 36, 36, 82, 79, 43,
+   77, 43, 43, 43, 79, 77, 79, 65, 36, 36, 36, 78, 43, 36, 36, 43,
+   65, 78, 81, 82, 78, 78, 78, 36, 64, 43, 65, 36, 36, 36, 36, 36,
+   36, 77, 79, 77, 78, 78, 79, 82,  7,  7,  7,  7,  7, 78, 79, 61,
+   16, 16, 16, 16, 16, 50, 44, 16, 36, 36, 36, 36, 36, 36, 64, 43,
+    2,  2,  2,  2, 90, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
    61, 61, 61, 61, 61, 61, 61, 61, 11, 11, 11, 11, 16, 16, 16, 16,
-   88, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 70, 65,
-   89, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 90, 91, 91,
-   36, 36, 36, 36, 36, 58,  2, 92, 93, 36, 36, 36, 36, 36, 36, 36,
-   36, 43, 43, 43, 43, 43, 43, 43, 36, 43, 57,  2,  2,  2,  2,  2,
-   36, 36, 43, 76, 43, 43, 43, 75, 75, 75, 75, 74, 76, 43, 43, 43,
-   43, 43,  2, 77,  2, 60, 63, 43,  7,  7,  7,  7,  7,  7,  7,  7,
-    2,  2,  2, 94,  2, 56, 43, 59, 36, 95, 36, 36, 36, 36, 36, 36,
-   36, 36, 63, 64, 36, 36, 36, 36, 36, 36, 36, 36, 63, 36, 36, 36,
-   43, 74, 75, 76, 74, 75, 75, 75, 75, 74, 75, 75, 76, 43, 43, 43,
-   61, 61,  2,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7, 27, 27, 61,
-   36, 36, 36, 63, 74, 76, 43,  2, 36, 36, 79, 74, 43, 43, 43, 43,
-   74, 74, 76, 43, 43, 43, 74, 75, 75, 76, 43, 43, 43, 43, 43, 43,
-    2,  2,  2, 77,  2,  2,  2,  2, 43, 43, 43, 43, 43, 43, 43, 96,
-   43, 43, 78, 36, 36, 36, 36, 36, 36, 36, 74, 43, 43, 74, 74, 75,
-   75, 74, 78, 36, 36, 36, 36, 36, 86, 61, 61, 61, 61, 47, 43, 43,
-   43, 43, 61, 61, 61, 61, 61, 61, 43, 78, 36, 36, 36, 36, 36, 36,
-   79, 43, 43, 75, 43, 76, 43, 36, 36, 36, 36, 74, 43, 75, 76, 76,
-   43, 75, 75, 75, 75, 75,  2,  2, 36, 36, 75, 75, 75, 75, 43, 43,
-   43, 43, 75, 43, 43, 57,  2,  2,  7,  7,  7,  7,  7,  7, 83, 36,
-   36, 36, 36, 36, 40, 40, 40,  2, 43, 57, 43, 43, 43, 43, 43, 43,
-   74, 43, 43, 43, 64, 36, 63, 36, 36, 36, 64, 79, 43, 36, 36, 36,
-   16, 16, 16, 16, 16, 16, 40, 40, 40, 40, 40, 40, 40, 44, 16, 16,
-   16, 16, 16, 16, 44, 16, 16, 16, 16, 16, 16, 16, 16, 97, 40, 40,
-   32, 32, 32, 16, 16, 16, 16, 32, 16, 16, 16, 16, 11, 11, 11, 11,
-   16, 16, 16, 16, 34, 11, 11, 11, 16, 16, 16, 16, 98, 98, 98, 98,
-   16, 16, 16, 16, 11, 11, 99,100, 41, 16, 16, 16, 11, 11, 99, 41,
-   16, 16, 16, 16, 11, 11,101, 41,102,102,102,102,102,103, 59, 59,
-   51, 51, 51,  2,104,105,104,105,  2,  2,  2,  2,106, 59, 59,107,
-    2,  2,  2,  2,108,109,  2,110,111,  2,112,113,  2,  2,  2,  2,
-    2,  9,111,  2,  2,  2,  2,114, 59, 59, 59, 59, 59, 59, 59, 59,
-  115, 40, 27, 27, 27,  8,112,116, 27, 27, 27, 27, 27,  8,112, 91,
-   20, 20, 20, 20, 20, 20, 20, 20, 43, 43, 43, 43, 43, 43,117, 48,
-   96, 48, 96, 43, 43, 43, 43, 43, 61,118, 61,119, 61, 34, 11, 16,
-   11, 32,119, 61, 46, 11, 11, 61, 61, 61,118,118,118, 11, 11,120,
-   11, 11, 35, 36, 39, 61, 16, 11,  8,  8, 46, 16, 16, 26, 61,121,
-   92, 92, 92, 92, 92, 92, 92, 92, 92,122,123, 92,124, 61, 61, 61,
-    8,  8,125, 61, 61,  8, 61, 61,125, 26, 61,125, 61, 61, 61,125,
-   61, 61, 61, 61, 61, 61, 61,  8, 61,125,125, 61, 61, 61, 61, 61,
-   61, 61,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-   61, 61, 61, 61,  4,  4, 61, 61,  8, 61, 61, 61,126,127, 61, 61,
-   61, 61, 61, 61, 61, 61,125, 61, 61, 61, 61, 61, 61, 26,  8,  8,
-    8,  8, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,  8,  8,
-    8, 61, 61, 61, 61, 61, 61, 61, 27, 27, 27, 27, 27, 27, 61, 61,
-   61, 61, 61, 61, 61, 27, 27, 27, 61, 61, 61, 26, 61, 61, 61, 61,
-   26, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,  8,  8,  8,  8,
-   61, 61, 61, 61, 61, 61, 61, 26, 61, 61, 61, 61,  4,  4,  4,  4,
-    4,  4,  4, 27, 27, 27, 27, 27, 27, 27, 61, 61, 61, 61, 61, 61,
-    8,  8,112,128,  8,  8,  8,  8,  8,  8,  8,  4,  4,  4,  4,  4,
-    8,112,129,129,129,129,129,129,129,129,129,129,128,  8,  8,  8,
-    8,  8,  8,  8,  4,  4,  8,  8,  8,  8,  8,  8,  8,  8,  4,  8,
-    8,  8,125, 26,  8,  8,125, 61, 32, 11, 32, 34, 34, 34, 34, 11,
-   32, 32, 34, 16, 16, 16, 40, 11, 32, 32,121, 61, 61,119, 34,130,
-   43, 32, 16, 16, 50,  2, 87,  2, 36, 36, 36, 36, 36, 36, 36, 95,
-    2,  2,  2,  2,  2,  2,  2, 56,  2,104,104,  2,108,109,104,  2,
-    2,  2,  2,  6,  2, 94,104,  2,104,  4,  4,  4,  4,  2,  2, 77,
-    2,  2,  2,  2,  2, 51,  2,  2, 94,131,  2,  2,  2,  2,  2,  2,
-   61,  2,  2,  2,  2,  2,  2,  2,  1,  2,132,133,  4,  4,  4,  4,
-    4, 61,  4,  4,  4,  4,134, 91,135, 92, 92, 92, 92, 43, 43, 75,
-  136, 40, 40, 61, 92,137, 58, 61, 71, 36, 36, 36, 36, 36, 36, 36,
-   36, 36, 36, 36, 63,138,139, 62, 36, 36, 36, 36, 36, 58, 40, 62,
+   91, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 71, 66,
+   92, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 93, 94, 94,
+   36, 36, 36, 36, 36, 58,  2, 95, 96, 36, 36, 36, 36, 36, 36, 36,
+   36, 43, 77, 78, 78, 78, 78, 81, 36, 43, 97,  2,  2,  2,  2,  2,
+   36, 43, 43, 43, 43, 43, 43, 43, 36, 36, 43, 79, 43, 43, 43, 78,
+   78, 78, 78, 77, 79, 43, 43, 43, 43, 43,  2, 80,  2, 60, 64, 43,
+    7,  7,  7,  7,  7,  7,  7,  7,  2,  2,  2, 98,  2, 56, 43, 76,
+   36, 75, 36, 36, 36, 36, 36, 36, 36, 36, 64, 65, 36, 36, 36, 36,
+   36, 36, 36, 36, 64, 36, 36, 36, 43, 77, 78, 79, 77, 78, 78, 78,
+   78, 77, 78, 78, 79, 43, 43, 43, 61, 61,  2,  7,  7,  7,  7,  7,
+    7,  7,  7,  7,  7, 27, 27, 61, 36, 36, 36, 64, 77, 79, 43,  2,
+   36, 36, 82, 77, 43, 43, 43, 43, 77, 77, 79, 43, 43, 43, 77, 78,
+   78, 79, 43, 43, 43, 43, 43, 43,  2,  2,  2, 80,  2,  2,  2,  2,
+   43, 43, 43, 43, 43, 43, 43, 99, 43, 43, 81, 36, 36, 36, 36, 36,
+   36, 36, 77, 43, 43, 77, 77, 78, 78, 77, 81, 36, 36, 36, 36, 36,
+   89, 61, 61, 61, 61, 47, 43, 43, 43, 43, 61, 61, 61, 61, 21,  2,
+   43, 81, 36, 36, 36, 36, 36, 36, 82, 43, 43, 78, 43, 79, 43, 36,
+   36, 36, 36, 77, 43, 78, 79, 79, 43, 78, 78, 78, 78, 78,  2,  2,
+   36, 36, 78, 78, 78, 78, 43, 43, 43, 43, 78, 43, 43, 57,  2,  2,
+    7,  7,  7,  7,  7,  7, 86, 36, 36, 36, 36, 36, 40, 40, 40,  2,
+   43, 57, 43, 43, 43, 43, 43, 43, 77, 43, 43, 43, 65, 36, 64, 36,
+   36, 36, 65, 82, 43, 36, 36, 36, 16, 16, 16, 16, 16, 16, 40, 40,
+   40, 40, 40, 40, 40, 44, 16, 16, 16, 16, 16, 16, 44, 16, 16, 16,
+   16, 16, 16, 16, 16,100, 40, 40, 32, 32, 32, 16, 16, 16, 16, 32,
+   16, 16, 16, 16, 11, 11, 11, 11, 16, 16, 16, 16, 34, 11, 11, 11,
+   16, 16, 16, 16,101,101,101,101, 16, 16, 16, 16, 11, 11,102,103,
+   41, 16, 16, 16, 11, 11,102, 41, 16, 16, 16, 16, 11, 11,104, 41,
+  105,105,105,105,105,106, 59, 59, 51, 51, 51,  2,107,108,107,108,
+    2,  2,  2,  2,109, 59, 59,110,  2,  2,  2,  2,111,112,  2,113,
+  114,  2,115,116,  2,  2,  2,  2,  2,  9,114,  2,  2,  2,  2,117,
+   59, 59, 59, 59, 59, 59, 59, 59,118, 40, 27, 27, 27,  8,115,119,
+   27, 27, 27, 27, 27,  8,115, 94, 20, 20, 20, 20, 20, 20, 20, 20,
+   43, 43, 43, 43, 43, 43,120, 48, 99, 48, 99, 43, 43, 43, 43, 43,
+   61,121, 61,122, 61, 34, 11, 16, 11, 32,122, 61, 46, 11, 11, 61,
+   61, 61,121,121,121, 11, 11,123, 11, 11, 35, 36, 39, 61, 16, 11,
+    8,  8, 46, 16, 16, 26, 61,124, 95, 95, 95, 95, 95, 95, 95, 95,
+   95,125,126, 95,127, 61, 61, 61,  8,  8,128, 61, 61,  8, 61, 61,
+  128, 26, 61,128, 61, 61, 61,128, 61, 61, 61, 61, 61, 61, 61,  8,
+   61,128,128, 61, 61, 61, 61, 61, 61, 61,  8,  8,  8,  8,  8,  8,
+    8,  8,  8,  8,  8,  8,  8,  8, 61, 61, 61, 61,  4,  4, 61, 61,
+    8, 61, 61, 61,129,130, 61, 61, 61, 61, 61, 61, 61, 61,128, 61,
+   61, 61, 61, 61, 61, 26,  8,  8,  8,  8, 61, 61, 61, 61, 61, 61,
+   61, 61, 61, 61, 61, 61,  8,  8,  8, 61, 61, 61, 61, 61, 61, 61,
+   27, 27, 27, 27, 27, 27, 61, 61, 61, 61, 61, 61, 61, 27, 27, 27,
+   61, 61, 61, 26, 61, 61, 61, 61, 26, 61, 61, 61, 61, 61, 61, 61,
+   61, 61, 61, 61,  8,  8,  8,  8, 61, 61, 61, 61, 61, 61, 61, 26,
+   61, 61, 61, 61,  4,  4,  4,  4,  4,  4,  4, 27, 27, 27, 27, 27,
+   27, 27, 61, 61, 61, 61, 61, 61,  8,  8,115,131,  8,  8,  8,  8,
+    8,  8,  8,  4,  4,  4,  4,  4,  8,115,132,132,132,132,132,132,
+  132,132,132,132,131,  8,  8,  8,  8,  8,  8,  8,  4,  4,  8,  8,
+    8,  8,  8,  8,  8,  8,  4,  8,  8,  8,128, 26,  8,  8,128, 61,
+   32, 11, 32, 34, 34, 34, 34, 11, 32, 32, 34, 16, 16, 16, 40, 11,
+   32, 32,124, 61, 61,122, 34,133, 43, 32, 16, 16, 50,  2, 90,  2,
+   36, 36, 36, 36, 36, 36, 36, 75,  2,  2,  2,  2,  2,  2,  2, 56,
+    2,107,107,  2,111,112,107,  2,  2,  2,  2,  6,  2, 98,107,  2,
+  107,  4,  4,  4,  4,  2,  2, 80,  2,  2,  2,  2,  2, 51,  2,  2,
+   98,134,  2,  2,  2,  2,  2,  2, 61,  2,135,132,132,132,136, 51,
+   51, 51, 51, 51, 51, 51, 51, 51,  1,  2,137,138,  4,  4,  4,  4,
+    4, 61,  4,  4,  4,  4,139, 94,140, 95, 95, 95, 95, 43, 43, 78,
+  141, 40, 40, 61, 95,142, 58, 61, 72, 36, 36, 36, 36, 36, 36, 36,
+   36, 36, 36, 36, 64,143,144, 63, 36, 36, 36, 36, 36, 58, 40, 63,
    61, 27, 27, 61, 61, 61, 61, 61, 27, 27, 27, 27, 27, 61, 61, 61,
-   61, 61, 61, 61, 27, 27, 27, 27,140, 27, 27, 27, 27, 27, 27, 27,
-   36, 36, 95, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,141,  2,
-   32, 32, 32, 32, 32, 32, 32, 63, 48,142, 43, 43, 43, 43, 43, 77,
-   32, 32, 32, 32, 32, 32, 40, 43, 36, 36, 36, 92, 92, 92, 92, 92,
-   43,  2,  2,  2,  2,  2,  2,  2, 41, 41, 41,139, 40, 40, 40, 40,
+   61, 61, 61, 61, 27, 27, 27, 27,145, 27, 27, 27, 27, 27, 27, 27,
+   36, 36, 75, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,146,  2,
+   32, 32, 32, 32, 32, 32, 32, 64, 48,147, 43, 43, 43, 43, 43, 80,
+   32, 32, 32, 32, 32, 32, 40, 43, 36, 36, 36, 95, 95, 95, 95, 95,
+   43,  2,  2,  2,  2,  2,  2,  2, 41, 41, 41,144, 40, 40, 40, 40,
    41, 32, 32, 32, 32, 32, 32, 32, 16, 32, 32, 32, 32, 32, 32, 32,
-   44, 16, 16, 16, 34, 34, 34, 32, 32, 32, 32, 32, 42,143, 34, 35,
+   44, 16, 16, 16, 34, 34, 34, 32, 32, 32, 32, 32, 42,148, 34, 35,
    32, 32, 16, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 11, 11, 32,
-   11, 11, 32, 32, 32, 32, 32, 32, 16, 32, 11, 11, 34, 16, 16, 16,
-   16, 16, 34, 35, 40, 35, 36, 36, 36, 64, 36, 64, 36, 63, 36, 36,
-   36, 79, 76, 74, 61, 61, 43, 43, 27, 27, 27, 61,144, 61, 61, 61,
-   36, 36,  2,  2,  2,  2,  2,  2, 75, 36, 36, 36, 36, 36, 36, 36,
-   36, 36, 75, 75, 75, 75, 75, 75, 75, 75, 43, 43, 43, 43, 43,  2,
-   43, 36, 36, 36,  2, 65, 65, 63, 36, 36, 36, 43, 43, 43, 43,  2,
-   36, 36, 36, 63, 43, 43, 43, 43, 43, 75, 75, 75, 75, 75, 75,145,
-   36, 63, 75, 43, 43, 75, 43, 75,145,  2,  2,  2,  2,  2,  2, 77,
-    7,  7,  7,  7,  7,  7,  7,  2, 36, 36, 63, 62, 36, 36, 36, 36,
-   36, 36, 36, 36, 63, 43, 43, 74, 76, 74, 76, 43, 43, 43, 43, 43,
-   36, 63, 36, 36, 36, 36, 74, 75,  7,  7,  7,  7,  7,  7,  2,  2,
-   62, 36, 36, 70, 61, 79, 74, 36, 64, 43, 64, 63, 64, 36, 36, 43,
-   36, 36, 36, 36, 36, 36, 95,  2, 36, 36, 36, 36, 36, 79, 43, 75,
-    2, 95,146, 43, 43, 43, 43, 43, 16, 16, 16, 16, 16,100, 40, 40,
-   16, 16, 16, 16, 97, 41, 41, 41, 36, 79, 76, 75, 74,145, 76, 43,
-  147,147,147,147,147,147,147,147,148,148,148,148,148,148,148,148,
-   16, 16, 16, 16, 16, 16, 35, 64, 36, 36, 36, 36,149, 36, 36, 36,
-   36, 41, 41, 41, 41, 41, 41, 41, 41,150, 36, 36, 36, 36, 36, 36,
-   36, 36, 36, 36, 36, 36, 36,129,151,151,151,151,151,151,151,151,
-   36, 36, 36, 36, 36, 36,144, 61,  2,  2,  2,152,113,  2,  2,  2,
-    6,153,154,129,129,129,129,129,129,129,113,152,113,  2,110,155,
-    2,  2,  2,  2,134,129,129,113,  2,156,  8,  8, 60,  2,  2,  2,
-   36, 36, 36, 36, 36, 36, 36,157,  2,  2,  3,  2,  4,  5,  6,  2,
-   16, 16, 16, 16, 16, 17, 18,112,113,  4,  2, 36, 36, 36, 36, 36,
-   62, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 40,
-   20,158, 53, 20, 26,  8,125, 61, 61, 61, 61, 61,159, 59, 61, 61,
-    2,  2,  2, 87, 27, 27, 27, 27, 27, 27, 27, 81, 61, 61, 61, 61,
-   92, 92,124, 27, 81, 61, 61, 61, 61, 61, 61, 61, 61, 27, 61, 61,
-   61, 61, 61, 61, 61, 61, 47, 43,160,160,160,160,160,160,160,160,
-  161, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 84, 36,
-  133, 36, 36, 36, 36, 92, 92, 92, 36, 36, 36, 36, 36, 36, 36, 58,
-  162, 92, 92, 92, 92, 92, 92, 92, 36, 36, 36, 58, 27, 27, 27, 27,
-   36, 36, 36, 70,140, 27, 27, 27, 36, 36, 36,163, 27, 27, 27, 27,
-   36, 36, 36, 36, 36,163, 27, 27, 36, 36, 36, 27, 27, 27, 27, 30,
-   36, 36, 36, 36, 36, 36, 27, 36, 63, 43, 43, 43, 43, 43, 43, 43,
-   36, 36, 36, 36, 43, 43, 43, 43, 36, 36, 36, 36, 36, 36,163, 30,
-   36, 36, 36, 36, 36, 36,163, 27, 36, 36, 36, 36, 71, 36, 36, 36,
-   36, 36, 63, 43, 43,161, 27, 27, 36, 36, 36, 36, 58,  2,  2,  2,
+   11, 11, 32, 32, 32, 32, 32, 32, 32, 32, 11, 11, 34, 16, 16, 16,
+   32, 16, 16, 32, 32, 16, 16, 16, 16, 40,149, 35, 40, 35, 36, 36,
+   36, 65, 36, 65, 36, 64, 36, 36, 36, 82, 79, 77, 61, 61, 43, 43,
+   27, 27, 27, 61,150, 61, 61, 61, 36, 36,  2,  2,  2,  2,  2,  2,
+   78, 36, 36, 36, 36, 36, 36, 36, 36, 36, 78, 78, 78, 78, 78, 78,
+   78, 78, 43, 43, 43, 43, 43,  2, 43, 36, 36, 36,  2, 66, 66, 64,
+   36, 36, 36, 43, 43, 43, 43,  2, 36, 36, 36, 64, 43, 43, 43, 43,
+   43, 78, 78, 78, 78, 78, 78, 97, 36, 64, 78, 43, 43, 78, 43, 78,
+   97,  2,  2,  2,  2,  2,  2, 80,  7,  7,  7,  7,  7,  7,  7,  2,
+   36, 36, 64, 63, 36, 36, 36, 36, 36, 36, 36, 36, 64, 43, 43, 77,
+   79, 77, 79, 43, 43, 43, 43, 43, 36, 64, 36, 36, 36, 36, 77, 78,
+    7,  7,  7,  7,  7,  7,  2,  2, 63, 36, 36, 71, 61, 82, 77, 36,
+   65, 43, 65, 64, 65, 36, 36, 43, 36, 36, 36, 36, 36, 36, 75,  2,
+   36, 36, 36, 36, 36, 82, 43, 78,  2, 75,151, 43, 43, 43, 43, 43,
+   16, 16, 16, 16, 16,103, 40, 40, 16, 16, 16, 16,100, 41, 41, 41,
+   36, 82, 79, 78, 77, 97, 79, 43,152,152,152,152,152,152,152,152,
+  153,153,153,153,153,153,153,153, 16, 16, 16, 16, 16, 16, 35, 65,
+   36, 36, 36, 36,154, 36, 36, 36, 36, 41, 41, 41, 41, 41, 41, 41,
+   41, 74, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,132,
+   36, 36, 36, 36, 36, 36, 36, 71, 36, 36, 36, 36, 36, 36,150, 61,
+    2,  2,  2,135,116,  2,  2,  2,  6,155,156,132,132,132,132,132,
+  132,132,116,135,116,  2,113,157,  2,  2,  2,  2,139,132,132,116,
+    2,158,  8,  8, 60,  2,  2,  2, 36, 36, 36, 36, 36, 36, 36,159,
+    2,  2,  3,  2,  4,  5,  6,  2, 16, 16, 16, 16, 16, 17, 18,115,
+  116,  4,  2, 36, 36, 36, 36, 36, 63, 36, 36, 36, 36, 36, 36, 36,
+   36, 36, 36, 36, 36, 36, 36, 40, 20,160, 53, 20, 26,  8,128, 61,
+   61, 61, 61, 61,161, 59, 61, 61,  2,  2,  2, 90, 27, 27, 27, 27,
+   27, 27, 27, 84, 61, 61, 61, 61, 95, 95,127, 27, 84, 61, 61, 61,
+   61, 61, 61, 61, 61, 27, 61, 61, 61, 61, 61, 61, 61, 61, 47, 43,
+  162,162,162,162,162,162,162,162,163, 27, 27, 27, 27, 27, 27, 27,
+   27, 27, 27, 27, 27, 27, 87, 36,138, 36, 36, 36, 36, 95, 95, 95,
+   36, 36, 36, 36, 36, 36, 36, 58,164, 95, 95, 95, 95, 95, 95, 95,
+   11, 11, 11, 32, 16, 16, 16, 16, 36, 36, 36, 58, 27, 27, 27, 27,
+   36, 36, 36, 71,145, 27, 27, 27, 36, 36, 36,165, 27, 27, 27, 27,
+   36, 36, 36, 36, 36,165, 27, 27, 36, 36, 36, 27, 27, 27, 27, 30,
+   36, 36, 36, 36, 36, 36, 27, 36, 64, 43, 43, 43, 43, 43, 43, 43,
+   36, 36, 36, 36, 43, 43, 43, 43, 36, 36, 36, 36, 36, 36,165, 30,
+   36, 36, 36, 36, 36, 36,165, 27, 36, 36, 36, 36, 72, 36, 36, 36,
+   36, 36, 64, 43, 43,163, 27, 27, 36, 36, 36, 36, 58,  2,  2,  2,
    36, 36, 36, 36, 27, 27, 27, 27, 16, 16, 16, 16, 16, 27, 27, 27,
-   36, 36, 43, 43, 43, 43, 43, 43, 36, 36, 36, 36, 36, 63,164, 51,
-   27, 27, 27, 84, 36, 36, 36, 36,161, 27, 30,  2,  2,  2,  2,  2,
-   36, 36,163, 27, 27, 27, 27, 27, 76, 78, 36, 36, 36, 36, 36, 36,
-   43, 43, 43, 57,  2,  2,  2,  2,  2, 27, 27, 27, 27, 27, 27, 27,
-   27, 27, 27,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,165,
-   75, 76, 43, 74, 76, 57, 72,  2,  2,  2,  2,  2,  2,  2, 72, 59,
-   36, 36, 36, 63, 43, 43, 76, 43, 43, 43, 43,  7,  7,  7,  7,  7,
-    2,  2, 79, 78, 36, 36, 36, 36, 36, 63,  2, 36, 36, 36, 36, 36,
-   36, 79, 75, 43, 43, 43, 43, 74, 78, 36, 58,  2, 56, 43, 57, 76,
-    7,  7,  7,  7,  7, 58, 58,  2, 87, 27, 27, 27, 27, 27, 27, 27,
-   36, 36, 36, 36, 36, 36, 75, 76, 43, 75, 74, 43,  2,  2,  2, 43,
-   36, 36, 36, 36, 36, 36, 36, 63, 74, 75, 75, 75, 75, 75, 75, 75,
-   36, 36, 36, 79, 75, 75, 78, 36, 36, 75, 75, 43, 43, 43, 43, 43,
-   36, 36, 79, 75, 43, 43, 43, 43, 75, 43, 74, 64, 36, 58,  2,  2,
-    7,  7,  7,  7,  7,  2,  2, 64, 75, 76, 43, 43, 74, 74, 75, 76,
-   74, 43, 36, 65, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 79,
-   75, 43, 43, 43, 75, 75, 43, 76, 57,  2,  2,  2,  2,  2,  2,  2,
-    2,  2,  2,  2, 36, 36, 43, 43, 75, 76, 43, 43, 43, 74, 76, 76,
-   57,  2, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 63, 76, 75,
-   43, 43, 43, 76, 36, 36, 36, 36, 75, 43, 43, 76, 43, 43, 43, 43,
-    7,  7,  7,  7,  7, 27,  2, 86, 43, 43, 43, 43, 76, 57,  2,  2,
-   27, 27, 27, 27, 27, 27, 27, 84, 75, 75, 75, 75, 75, 76, 74, 64,
-   78, 76,  2,  2,  2,  2,  2,  2, 79, 75, 43, 43, 43, 43, 75, 75,
-   64, 65, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75,
-   63, 43, 43, 43, 43, 64, 36, 36, 36, 63, 43, 43, 74, 63, 43, 57,
-    2,  2,  2, 56, 43, 43, 43, 43, 63, 43, 43, 74, 76, 43, 36, 36,
-   36, 36, 36, 36, 36, 43, 43, 43, 43, 43, 43, 74, 43,  2, 65,  2,
-   43, 43, 43, 43, 43, 43, 43, 76, 58,  2,  2,  2,  2,  2,  2,  2,
-    2, 36, 36, 36, 36, 36, 36, 36, 43, 43, 43, 43, 74, 43, 43, 43,
-   74, 43, 76, 43, 43, 43, 43, 43, 43, 43, 43, 63, 43, 43, 43, 43,
-   36, 36, 36, 36, 36, 75, 75, 75, 43, 74, 76, 76, 36, 36, 36, 36,
-   36, 63, 74,145,  2,  2,  2,  2, 27, 27, 81, 61, 61, 61, 53, 20,
-  144, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 21,
-   43, 43, 57,  2,  2,  2,  2,  2, 43, 43, 43, 57,  2,  2, 61, 61,
-   40, 40, 86, 61, 61, 61, 61, 61,  7,  7,  7,  7,  7,166, 27, 27,
-   27, 84, 36, 36, 36, 36, 36, 36, 27, 27, 27, 30,  2,  2,  2,  2,
-   79, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 76,
-   43, 67, 40, 40, 40, 40, 40, 40, 40, 77, 43, 43, 43, 43, 43, 43,
-   36, 36, 36, 36, 36, 36, 47, 57, 61, 61,167, 76, 43, 61,167, 75,
-   75,168, 59, 59, 59, 73, 43, 43, 43, 69, 47, 43, 43, 43, 61, 61,
-   61, 61, 61, 61, 61, 43, 43, 61, 61, 43, 69, 61, 61, 61, 61, 61,
-   11, 11, 11, 11, 11, 16, 16, 16, 16, 16, 11, 11, 11, 11, 11, 11,
-   11, 11, 11, 11, 11, 11, 11, 16, 11, 16, 16, 16, 16, 16, 16, 16,
-   16, 16, 16, 16, 16, 16, 11, 11, 11, 11, 11, 16, 16, 16, 16, 16,
-   31, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 33, 16, 16,
-   16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 31, 16, 16,
-   16, 16, 33, 16, 16, 16, 11, 11, 11, 11, 31, 16, 16, 16, 16, 16,
-   16, 16, 16, 16, 16, 16, 16, 33, 16, 16, 16, 11, 11, 11, 11, 11,
-   11, 11, 11, 11, 11, 11, 11, 31, 16, 16, 16, 16, 33, 16, 16, 16,
-   11, 11, 11, 11, 31, 16, 16, 16, 16, 33, 16, 16, 16, 32, 16,  7,
-   43, 43, 43, 69, 61, 47, 43, 43, 43, 43, 43, 43, 43, 43, 69, 61,
-   61, 61, 47, 61, 61, 61, 61, 61, 61, 61, 69, 21,  2,  2,  2,  2,
-    2,  2,  2,  2,  2, 56, 43, 43, 43, 43, 43, 67, 40, 40, 40, 40,
-    7,  7,  7,  7,  7,  7,  7, 70, 36, 36, 36, 36, 36, 36, 43, 43,
-    7,  7,  7,  7,  7,  7,  7,169, 16, 16, 43, 43, 43, 67, 40, 40,
-   27, 27, 27, 27, 27, 27,140, 27,170, 27, 27, 27, 27, 27, 27, 27,
-   27, 27, 27, 27, 27, 27, 27,140, 27, 27, 27, 27, 27, 27, 81, 61,
-   61, 61, 61, 61, 61, 25, 41, 41,  0,  0, 29, 21, 21, 21, 23, 21,
-   22, 18, 21, 25, 21, 17, 13, 13, 25, 25, 25, 21, 21,  9,  9,  9,
-    9, 22, 21, 18, 24, 16, 24,  5,  5,  5,  5, 22, 25, 18, 25,  0,
-   23, 23, 26, 21, 24, 26,  7, 20, 25,  1, 26, 24, 26, 25, 15, 15,
-   24, 15,  7, 19, 15, 21,  9, 25,  9,  5,  5, 25,  5,  9,  5,  7,
-    7,  7,  9,  8,  8,  5,  7,  5,  6,  6, 24, 24,  6, 24, 12, 12,
-    6,  5,  9, 21, 25,  9, 26, 12, 11, 11,  9,  6,  5, 21, 17, 17,
-   17, 26, 26, 23, 23, 12, 17, 12, 21, 12, 12, 21,  7, 21,  1,  1,
-   21, 23, 26, 26,  6,  7,  7, 12, 12,  7, 21,  7, 12,  1, 12,  6,
-    6, 12, 12, 26,  7, 26, 26,  7, 21,  1,  1, 12, 12, 10, 10, 10,
-   10, 12, 21,  6, 10,  7,  7, 10, 23,  7, 15, 26, 13, 21, 13,  7,
-   15,  7, 12, 23, 21, 26, 21, 15, 17,  7, 29,  7,  7, 22, 18, 18,
-   14, 14, 14,  7, 17, 21,  7,  6, 11, 12,  5,  6,  8,  8,  8, 24,
-    5, 24,  9, 24, 29, 29, 29,  1, 20, 19, 22, 20, 27, 28,  1, 29,
-   21, 20, 19, 21, 21, 16, 16, 21, 25, 22, 18, 21, 21, 29, 15,  6,
-   18,  6, 12, 11,  9, 26, 26,  9, 26,  5,  5, 26, 14,  9,  5, 14,
-   14, 15, 25, 26, 26, 22, 18, 26, 18, 25, 18, 22,  5, 12, 22, 21,
-   26,  6,  7, 14, 17, 22, 26, 14, 17,  6, 14,  6, 12, 24, 24,  6,
-   26, 15,  6, 21, 11, 21, 24,  9, 23, 26, 10, 21,  6, 10,  4,  4,
-    3,  3,  7, 25, 24,  7, 22, 22, 21, 22, 17, 16, 16, 22, 16, 16,
-   25, 17,  7,  1, 25, 24, 26,  1,  2,  2, 12, 15, 21, 14,  7, 15,
-   12, 17, 13, 12, 13, 15, 26, 10, 10,  1, 13, 23, 23, 15,  0,  1,
-    2,  3,  4,  5,  6,  7,  8,  9,  0, 10, 11, 12, 13,  0, 14,  0,
-    0,  0,  0,  0, 15,  0, 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0, 17, 18, 19,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 20,  0, 21, 22, 23,
-    0,  0,  0, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0, 34,  0, 35,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 36,  0,  0,  0,
-    0,  0,  0,  0,  0,  0, 37, 38,  0,  0,  0,  0,  0,  0, 39, 40,
-    0,  0, 41,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    1,  2,  0,  0,  0,  0,  3,  0,  0,  0,  4,  5,  6,  7,  0,  8,
-    9, 10,  0, 11, 12, 13,  0, 14, 15, 16, 15, 17, 15, 18, 15, 18,
-   15, 18,  0, 18,  0, 19, 15, 18, 20, 18,  0, 21, 22, 23, 24, 25,
-   26, 27, 28, 29, 30,  0, 31,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0, 32,  0,  0,  0,  0,  0,  0, 33,  0,  0, 34,  0,  0, 35,  0,
-   36,  0,  0,  0, 37, 38, 39, 40, 41, 42, 43, 44, 45,  0,  0, 46,
-    0,  0,  0, 47,  0,  0,  0, 48,  0,  0,  0,  0,  0,  0,  0, 49,
-    0, 50,  0, 51, 52,  0, 53,  0,  0,  0,  0,  0,  0, 54, 55, 56,
-    0,  0,  0,  0, 57,  0,  0, 58, 59, 60, 61, 62,  0,  0, 63, 64,
-    0,  0,  0, 65,  0,  0,  0,  0, 66,  0,  0,  0, 67,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 68,  0,  0,  0, 69,
-    0, 70,  0,  0, 71,  0,  0, 72,  0,  0,  0,  0,  0,  0,  0,  0,
-   73,  0,  0,  0,  0,  0, 74,  0,  0, 75,  0,  0,  0, 76, 77,  0,
-   78, 61,  0, 79, 80,  0,  0, 81, 82, 83,  0,  0,  0, 84,  0, 85,
-    0,  0, 50, 86, 50,  0, 87,  0, 88,  0,  0,  0, 77,  0,  0,  0,
-   89, 90,  0, 91, 92, 93, 94,  0,  0,  0,  0,  0, 50,  0,  0,  0,
-    0, 95, 96,  0,  0,  0,  0, 97, 98,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0, 99,  0,  0,100,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,101,102,  0,  0,103,  0,  0,  0,  0,  0,  0,104,  0,  0,  0,
-   98,  0,  0,  0,  0,  0,  0,105,  0,  0,  0,  0,  0,  0,  0,106,
-    0,107,  0,  0,  0,  0,  0,  0,  1,  2,  3,  4,  5,  6,  7,  0,
-    8,  0,  0,  0,  0,  9, 10, 11, 12,  0,  0,  0,  0, 13,  0,  0,
-   14, 15,  0, 16,  0, 17, 18,  0,  0, 19,  0, 20, 21,  0,  0,  0,
-    0,  0, 22, 23,  0, 24, 25,  0,  0, 26,  0,  0,  0, 27, 28, 29,
-    0,  0,  0, 30, 31, 32,  0,  0, 31,  0,  0, 33, 31,  0,  0,  0,
-   31, 34,  0,  0,  0,  0,  0, 35, 36,  0,  0,  0,  0,  0,  0, 37,
-   38,  0,  0,  0,  0,  0,  0, 39, 40,  0,  0,  0,  0, 41,  0, 42,
-    0,  0,  0, 43, 44,  0,  0,  0, 45,  0,  0,  0,  0,  0,  0, 46,
-   47,  0,  0,  0,  0, 48,  0,  0,  0, 49,  0, 49,  0, 50,  0,  0,
-    0,  0, 51,  0,  0,  0,  0, 52,  0, 53,  0,  0,  0,  0, 54, 55,
-    0,  0,  0, 56, 57,  0,  0,  0,  0,  0,  0, 58, 49,  0, 59, 60,
-    0,  0, 61,  0,  0,  0, 62, 63,  0,  0,  0, 64,  0, 65, 66, 67,
-   68, 69,  1, 70,  0, 71, 72, 73,  0,  0, 74, 75,  0,  0,  0, 76,
-    0,  0,  1,  1,  0,  0, 77,  0,  0, 78,  0,  0,  0,  0, 74, 79,
-    0, 80,  0,  0,  0,  0,  0, 75, 81,  0, 82,  0, 49,  0,  1, 75,
-    0,  0, 83,  0,  0, 84,  0,  0,  0,  0,  0, 85, 54,  0,  0,  0,
-    0,  0,  0, 86, 87,  0,  0, 81,  0,  0, 31,  0,  0, 88,  0,  0,
-    0,  0, 89,  0,  0,  0,  0, 47,  0,  0, 57,  0,  0,  0,  0, 90,
-   91,  0,  0, 92,  0,  0, 93,  0,  0,  0, 94,  0,  0,  0, 95,  0,
-   96, 57,  0,  0, 81,  0,  0, 76,  0,  0,  0, 97, 98,  0,  0, 99,
-  100,  0,  0,  0,  0,  0,  0,101,  0,  0,102,  0,  0,  0,  0,103,
-   31,  0,104,105,106, 33,  0,  0,107,  0,  0,  0,108,  0,  0,  0,
-    0,  0,  0,109,  0,  0,110,  0,  0,  0,  0,111, 85,  0,  0,  0,
-    0,  0, 54,  0,  0,  0,  0, 49,112,  0,  0,  0,  0,113,  0,  0,
-  114,  0,  0,  0,  0,112,  0,  0,  0,  0,  0,115,  0,  0,  0,116,
-    0,  0,  0,117,  0,118,  0,  0,  0,  0,119,120,121,  0,122,  0,
-  123,  0,  0,  0,124,125,126,  0,  0,  0,127,  0,  0,128,  0,  0,
-  129,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  2,  3,  4,
-    5,  6,  7,  4,  4,  8,  9, 10,  1, 11, 12, 13, 14, 15, 16, 17,
-   18,  1,  1,  1, 19,  1,  0,  0, 20, 21, 22,  1, 23,  4, 21, 24,
-   25, 26, 27, 28, 29, 30,  0,  0,  1,  1, 31,  0,  0,  0, 32, 33,
-   34, 35,  1, 36, 37,  0,  0,  0,  0, 38,  1, 39, 14, 39, 40, 41,
-   42,  0,  0,  0, 43, 36, 44, 45, 21, 45, 46,  0,  0,  0, 19,  1,
-   21,  0,  0, 47,  0, 38, 48,  1,  1, 49, 49, 50,  0,  0, 51,  0,
-   52,  1,  1,  1, 53, 21, 43, 54, 55, 21, 35,  1,  0,  0,  0, 56,
-    0,  0,  0, 57, 58, 59,  0,  0,  0,  0,  0, 60,  0, 61,  0,  0,
-    0,  0, 62, 63,  0,  0, 64,  0,  0,  0, 65,  0,  0,  0, 66,  0,
-    0,  0, 67,  0,  0,  0, 68,  0,  0,  0, 69,  0,  0, 70, 71,  0,
-   72, 73, 74, 75, 76, 77,  0,  0,  0, 78,  0,  0,  0, 79, 80,  0,
-    0,  0,  0, 47,  0,  0,  0, 49,  0, 63,  0,  0, 64,  0,  0, 81,
-    0,  0, 82,  0,  0,  0, 83,  0,  0, 19, 84,  0, 63,  0,  0,  0,
-    0, 49,  1, 85,  1, 54, 15, 86, 84,  0,  0,  0,  0, 56,  0,  0,
-    0,  0, 19, 10,  1,  0,  0,  0,  0,  0, 87,  0,  0, 88,  0,  0,
-   87,  0,  0,  0,  0, 79,  0,  0, 89,  9, 12,  4, 90,  8, 91, 47,
-    0, 59, 50,  0, 21,  1, 21, 92, 93,  1,  1,  1,  1, 94, 95, 96,
-   97,  1, 98, 59, 81, 99,100,  4, 59,  0,  0,  0,  0,  0,  0, 19,
-   50,  0,  0,  0,  0,  0,  0, 62,  0,  0,101,102,  0,  0,103,  0,
-    0,  1,  1, 50,  0,  0,  0, 38,  0, 64,  0,  0,  0,  0,  0, 63,
-    0,  0, 52, 69, 62,  0,  0,  0, 79,  0,  0,  0,104,105, 59, 38,
-   81,  0,  0,  0,  0,  0,  0,106,  1, 14,  4, 12,  0, 38, 89,  0,
-    0,  0,  0,107,  0,  0,108, 62,  0,109,  0,  0,  0,  1,  0,  0,
-    0,  0, 19, 59,  0,110, 14, 54,  0,  0,111,  0, 89,  0,  0,  0,
-   62, 63,  0,  0, 63,  0, 88,  0,  0,111,  0,  0,  0,  0,112,  0,
-    0,  0, 79, 56,  0, 38,  1, 59,  1, 59,  0,  0, 64, 88,  0,  0,
-  113,  0,  0,  0, 56,  0,  0,  0,  0,113,  0,  0,  0,  0, 62,  0,
-    0,  0,  0, 80,  0, 62,  0,  0,  0,  0, 57,  0, 88,114,  0,  0,
-    8, 91,  0,  0,  1, 89,  0,  0,115,  0,  0,  0,  0,  0,  0,116,
-    0,117,118,119,120,  0, 52,  4,121, 49, 23,  0,  0,  0, 38, 50,
-   38, 59,  0,  0,  1, 89,  1,  1,  1,  1, 39,  1, 48,104, 89,  0,
-    0,  0,  0,  1,  4,121,  0,  0,  0,  1,122,  0,  0,  0,  0,  0,
-  230,230,230,230,230,232,220,220,220,220,232,216,220,220,220,220,
-  220,202,202,220,220,220,220,202,202,220,220,220,  1,  1,  1,  1,
-    1,220,220,220,220,230,230,230,230,240,230,220,220,220,230,230,
-  230,220,220,  0,230,230,230,220,220,220,220,230,232,220,220,230,
-  233,234,234,233,234,234,233,230,  0,  0,  0,230,  0,220,230,230,
-  230,230,220,230,230,230,222,220,230,230,220,220,230,222,228,230,
-   10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22,  0, 23,
-    0, 24, 25,  0,230,220,  0, 18, 30, 31, 32,  0,  0,  0,  0, 27,
-   28, 29, 30, 31, 32, 33, 34,230,230,220,220,230,220,230,230,220,
-   35,  0,  0,  0,  0,  0,230,230,230,  0,  0,230,230,  0,220,230,
-  230,220,  0,  0,  0, 36,  0,  0,230,220,230,230,220,220,230,220,
-  220,230,220,230,220,230,230,  0,  0,220,  0,  0,230,230,  0,230,
-    0,230,230,230,230,230,  0,  0,  0,220,220,220,  0,  0,  0,220,
-  230,230,  0,220,230,220,220,220, 27, 28, 29,230,  7,  0,  0,  0,
-    0,  9,  0,  0,  0,230,220,230,230,  0,  0,  0,  0,  0,230,  0,
-    0, 84, 91,  0,  0,  0,  0,  9,  9,  0,  0,  0,  0,  0,  9,  0,
-  103,103,  9,  0,107,107,107,107,118,118,  9,  0,122,122,122,122,
-  220,220,  0,  0,  0,220,  0,220,  0,216,  0,  0,  0,129,130,  0,
-  132,  0,  0,  0,  0,  0,130,130,130,130,  0,  0,130,  0,230,230,
-    9,  0,230,230,  0,  0,220,  0,  0,  0,  0,  7,  0,  9,  9,  0,
-    0,230,  0,  0,  0,228,  0,  0,  0,222,230,220,220,  0,  0,  0,
-  230,  0,  0,220,230,220,  0,220,  0,  0,  9,  9,  0,  0,  7,  0,
-  230,230,230,  0,230,  0,  1,  1,  1,  0,  0,  0,230,234,214,220,
-  202,230,230,230,230,230,232,228,228,220,  0,230,233,220,230,220,
-  230,230,  1,  1,  1,  1,  1,230,  0,  1,  1,230,220,230,  1,  1,
-    0,  0,218,228,232,222,224,224,  0,  8,  8,  0,230,  0,230,230,
-  220,  0,  0,230,  0,  0, 26,  0,  0,220,  0,230,230,  1,220,  0,
-    0,230,220,  0,  0,  0,220,220,  0,  9,  7,  0,  0,  7,  9,  0,
-    0,  0,  9,  7,  9,  9,  0,  0,  6,  6,  0,  0,  0,  0,  1,  0,
-    0,216,216,  1,  1,  1,  0,  0,  0,226,216,216,216,216,216,  0,
-  220,220,220,  0,230,230,  7,  0, 16, 17, 17, 33, 17, 49, 17, 17,
-   84, 97,135,145, 26, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+   36, 36, 43, 43, 43, 43, 43, 43, 36, 36, 36, 36, 36, 64,166, 51,
+   27, 27, 27, 87, 36, 36, 36, 36,163, 27, 30,  2,  2,  2,  2,  2,
+   36, 43, 43,  2,  2,  2,  2,  2, 36, 36,165, 27, 27, 27, 27, 27,
+   79, 81, 36, 36, 36, 36, 36, 36, 43, 43, 43, 57,  2,  2,  2,  2,
+    2, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,  7,  7,  7,  7,  7,
+   65, 64, 65, 36, 36, 36, 36, 64, 78, 79, 43, 77, 79, 57, 73,  2,
+    2, 43, 43, 43, 43, 43, 67, 59, 36, 36, 36, 64, 43, 43, 79, 43,
+   43, 43, 43,  7,  7,  7,  7,  7,  2,  2, 82, 81, 36, 36, 36, 36,
+   36, 64,  2, 36, 36, 36, 36, 36, 36, 82, 78, 43, 43, 43, 43, 77,
+   81, 36, 58,  2, 56, 43, 57, 79,  7,  7,  7,  7,  7, 58, 58,  2,
+   90, 27, 27, 27, 27, 27, 27, 27, 36, 36, 36, 36, 36, 36, 78, 79,
+   43, 78, 77, 43,  2,  2,  2, 43, 36, 36, 36, 36, 36, 36, 36, 64,
+   77, 78, 78, 78, 78, 78, 78, 78, 36, 36, 36, 82, 78, 78, 81, 36,
+   36, 78, 78, 43, 43, 43, 43, 43, 36, 36, 82, 78, 43, 43, 43, 43,
+   78, 43, 77, 65, 36, 58,  2,  2,  7,  7,  7,  7,  7,  2,  2, 65,
+   78, 79, 43, 43, 77, 77, 78, 79, 77, 43, 36, 66, 36, 36, 36, 36,
+   36, 36, 36, 36, 36, 36, 36, 82, 78, 43, 43, 43, 78, 78, 43, 79,
+   57,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 36, 36, 43, 43,
+   78, 79, 43, 43, 43, 77, 79, 79, 57,  2, 36, 36, 36, 36, 36, 36,
+   36, 36, 36, 36, 36, 64, 79, 78, 43, 43, 43, 79, 58,  2,  2,  2,
+   78, 43, 43, 79, 43, 43, 43, 43,  7,  7,  7,  7,  7, 27,  2, 89,
+   43, 43, 43, 43, 79, 57,  2,  2, 27, 27, 27, 27, 27, 27, 27, 87,
+   78, 78, 78, 78, 78, 79, 77, 65, 81, 79,  2,  2,  2,  2,  2,  2,
+   82, 78, 43, 43, 43, 43, 78, 78, 65, 66, 78, 78, 78, 78, 78, 78,
+   78, 78, 78, 78, 78, 78, 78, 78, 64, 43, 43, 43, 43, 65, 36, 36,
+   36, 64, 43, 43, 77, 64, 43, 57,  2,  2,  2, 56, 43, 43, 43, 43,
+   64, 43, 43, 77, 79, 43, 36, 36, 36, 36, 36, 36, 36, 43, 43, 43,
+   43, 43, 43, 77, 43,  2, 66,  2, 43, 43, 43, 43, 43, 43, 43, 79,
+   58,  2,  2,  2,  2,  2,  2,  2,  2, 36, 36, 36, 36, 36, 36, 36,
+   43, 43, 43, 43, 77, 43, 43, 43, 77, 43, 79, 43, 43, 43, 43, 43,
+   43, 43, 43, 64, 43, 43, 43, 43, 36, 36, 36, 36, 36, 78, 78, 78,
+   43, 77, 79, 79, 36, 36, 36, 36, 36, 64, 77, 97,  2,  2,  2,  2,
+   27, 27, 84, 61, 61, 61, 53, 20,150, 61, 61, 61, 61, 61, 61, 61,
+   61, 61, 61, 61, 61, 61, 61, 21, 43, 43, 57,  2,  2,  2,  2,  2,
+   43, 43, 43, 57,  2,  2, 61, 61, 40, 40, 89, 61, 61, 61, 61, 61,
+    7,  7,  7,  7,  7,167, 27, 27, 27, 87, 36, 36, 36, 36, 36, 36,
+   27, 27, 27, 30,  2,  2,  2,  2, 82, 78, 78, 78, 78, 78, 78, 78,
+   78, 78, 78, 78, 78, 78, 78, 79, 43, 68, 40, 40, 40, 40, 40, 40,
+   40, 80, 43, 43, 43, 43, 43, 43, 36, 36, 36, 36, 36, 36, 47, 57,
+   61, 61,168, 79, 43, 61,168, 78, 78,169, 59, 59, 59, 76, 43, 43,
+   43, 70, 47, 43, 43, 43, 61, 61, 61, 61, 61, 61, 61, 43, 43, 61,
+   61, 43, 70, 61, 61, 61, 61, 61, 11, 11, 11, 11, 11, 16, 16, 16,
+   16, 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 16,
+   11, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 11, 11,
+   11, 11, 11, 16, 16, 16, 16, 16, 31, 16, 16, 16, 16, 16, 16, 16,
+   16, 16, 16, 16, 16, 33, 16, 16, 16, 11, 11, 11, 11, 11, 11, 11,
+   11, 11, 11, 11, 11, 31, 16, 16, 16, 16, 33, 16, 16, 16, 11, 11,
+   11, 11, 31, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 33,
+   16, 16, 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 31,
+   16, 16, 16, 16, 33, 16, 16, 16, 11, 11, 11, 11, 31, 16, 16, 16,
+   16, 33, 16, 16, 16, 32, 16,  7, 43, 43, 43, 70, 61, 47, 43, 43,
+   43, 43, 43, 43, 43, 43, 70, 61, 61, 61, 47, 61, 61, 61, 61, 61,
+   61, 61, 70, 21,  2,  2,  2,  2,  2,  2,  2,  2,  2, 56, 43, 43,
+   16, 16, 16, 16, 16, 39, 16, 16, 43, 43, 43, 68, 40, 40, 40, 40,
+    7,  7,  7,  7,  7,  7,  7, 71, 36, 36, 36, 36, 36, 36, 36, 43,
+   36, 36, 36, 36, 36, 36, 43, 43,  7,  7,  7,  7,  7,  7,  7,170,
+   16, 16, 43, 43, 43, 68, 40, 40, 27, 27, 27, 27, 27, 27,145, 27,
+  171, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,145,
+   27, 27, 27, 27, 27, 27, 84, 61, 61, 61, 61, 61, 61, 25, 41, 41,
+    0,  0, 29, 21, 21, 21, 23, 21, 22, 18, 21, 25, 21, 17, 13, 13,
+   25, 25, 25, 21, 21,  9,  9,  9,  9, 22, 21, 18, 24, 16, 24,  5,
+    5,  5,  5, 22, 25, 18, 25,  0, 23, 23, 26, 21, 24, 26,  7, 20,
+   25,  1, 26, 24, 26, 25, 15, 15, 24, 15,  7, 19, 15, 21,  9, 25,
+    9,  5,  5, 25,  5,  9,  5,  7,  7,  7,  9,  8,  8,  5,  7,  5,
+    6,  6, 24, 24,  6, 24, 12, 12,  6,  5,  9, 21, 25,  9, 26, 12,
+   11, 11,  9,  6,  5, 21, 17, 17, 17, 26, 26, 23, 23, 12, 17, 12,
+   21, 12, 12, 21,  7, 21,  1,  1, 21, 23, 26, 26,  1, 21,  6,  7,
+    7, 12, 12,  7, 21,  7, 12,  1, 12,  6,  6, 12, 12, 26,  7, 26,
+   26,  7, 21,  1, 24,  7,  7,  6,  1, 12, 12, 10, 10, 10, 10, 12,
+   21,  6, 10,  7,  7, 10, 23,  7, 15, 26, 13, 21, 13,  7, 15,  7,
+   12, 23, 21, 26, 21, 15, 17,  7, 29,  7,  7, 22, 18, 18, 14, 14,
+   14,  7, 10, 21, 17, 21, 11, 12,  5,  6,  8,  8,  8, 24,  5, 24,
+    9, 24, 29, 29, 29,  1, 20, 19, 22, 20, 27, 28,  1, 29, 21, 20,
+   19, 21, 21, 16, 16, 21, 25, 22, 18, 21, 21, 29, 15,  6, 18,  6,
+   12, 11,  9, 26, 26,  9, 26,  5,  5, 26, 14,  9,  5, 14, 14, 15,
+   25, 26, 26, 22, 18, 26, 18, 25, 18, 22,  5, 12, 22, 21, 21, 22,
+   18, 17, 26,  6,  7, 14, 17, 22, 26, 14, 17,  6, 14,  6, 12, 24,
+   24,  6, 26, 15,  6, 21, 11, 21, 24,  9,  6,  9, 23, 26,  6, 10,
+    4,  4,  3,  3,  7, 25, 17, 16, 16, 22, 16, 16, 25, 17,  7,  1,
+   25, 24, 26,  1,  2,  2, 12, 15, 21, 14,  7, 15, 12, 17, 13, 15,
+   26, 10, 10,  1, 13, 23, 23, 15,  0,  1,  2,  3,  4,  5,  6,  7,
+    8,  9,  0, 10, 11, 12, 13,  0, 14,  0,  0,  0,  0,  0, 15,  0,
+   16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 17, 18, 19,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0, 20,  0, 21, 22, 23,  0,  0,  0, 24, 25, 26,
+   27, 28, 29, 30, 31, 32, 33,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 34,  0, 35,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0, 36,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+   37, 38,  0,  0,  0,  0,  0,  0, 39, 40,  0,  0, 41,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  0,  0,  0,  0,
+    3,  0,  0,  0,  4,  5,  6,  7,  0,  8,  9, 10,  0, 11, 12, 13,
+   14, 15, 16, 17, 16, 18, 16, 19, 16, 19, 16, 19,  0, 19, 16, 20,
+   16, 19, 21, 19,  0, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,  0,
+   32,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 33,  0,  0,  0,  0,
+    0,  0, 34,  0,  0, 35,  0,  0, 36,  0, 37,  0,  0,  0, 38, 39,
+   40, 41, 42, 43, 44, 45, 46,  0,  0, 47,  0,  0,  0, 48,  0,  0,
+    0, 49,  0,  0,  0,  0,  0,  0,  0, 50,  0, 51,  0, 52, 53,  0,
+   54,  0,  0,  0,  0,  0,  0, 55, 56, 57,  0,  0,  0,  0, 58,  0,
+    0, 59, 60, 61, 62, 63,  0,  0, 64, 65,  0,  0,  0, 66,  0,  0,
+    0,  0, 67,  0,  0,  0, 68,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0, 69,  0,  0,  0, 70,  0, 71,  0,  0, 72,  0,
+    0, 73,  0,  0,  0,  0,  0,  0,  0,  0, 74,  0,  0,  0,  0,  0,
+   75,  0,  0, 76, 77,  0,  0, 78, 79,  0, 80, 62,  0, 81, 82,  0,
+    0, 83, 84, 85,  0,  0,  0, 86,  0, 87,  0,  0, 51, 88, 51,  0,
+   89,  0, 90,  0,  0,  0, 79,  0,  0,  0, 91, 92,  0, 93, 94, 95,
+   96,  0,  0,  0,  0,  0, 51,  0,  0,  0,  0, 97, 98,  0,  0,  0,
+    0, 99,100,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,101,  0,  0,
+  102,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,103,104,  0,  0,105,
+    0,  0,  0,  0,  0,  0,106,  0,  0,  0,100,  0,  0,  0,  0,  0,
+  107,108,  0,  0,  0,  0,  0,  0,  0,109,  0,110,  0,  0,  0,  0,
+    0,  0,  1,  2,  3,  4,  5,  6,  7,  0,  8,  0,  0,  0,  0,  9,
+   10, 11, 12,  0,  0,  0,  0, 13,  0,  0, 14, 15,  0, 16,  0, 17,
+   18,  0,  0, 19,  0, 20, 21,  0,  0,  0,  0,  0, 22, 23,  0, 24,
+   25,  0,  0, 26,  0,  0,  0, 27,  0,  0, 28, 29, 30, 31,  0,  0,
+    0, 32, 33, 34,  0,  0, 33,  0,  0, 35, 33,  0,  0,  0, 33, 36,
+    0,  0,  0,  0,  0, 37, 38,  0,  0,  0,  0,  0,  0, 39, 40,  0,
+    0,  0,  0,  0,  0, 41, 42,  0,  0,  0,  0, 43,  0, 44,  0,  0,
+    0, 45, 46,  0,  0,  0, 47,  0,  0,  0,  0,  0,  0, 48, 49,  0,
+    0,  0,  0, 50,  0,  0,  0, 51,  0, 52,  0, 53,  0,  0,  0,  0,
+   54,  0,  0,  0,  0, 55,  0, 56,  0,  0,  0,  0, 57, 58,  0,  0,
+    0, 59, 60,  0,  0,  0,  0,  0,  0, 61, 52,  0, 62, 63,  0,  0,
+   64,  0,  0,  0, 65, 66,  0,  0,  0, 67,  0, 68, 69, 70, 71, 72,
+    1, 73,  0, 74, 75, 76,  0,  0, 77, 78,  0,  0,  0, 79,  0,  0,
+    1,  1,  0,  0, 80,  0,  0, 81,  0,  0,  0,  0, 77, 82,  0, 83,
+    0,  0,  0,  0,  0, 78, 84,  0, 85,  0, 52,  0,  1, 78,  0,  0,
+   86,  0,  0, 87,  0,  0,  0,  0,  0, 88, 57,  0,  0,  0,  0,  0,
+    0, 89, 90,  0,  0, 84,  0,  0, 33,  0,  0, 91,  0,  0,  0,  0,
+   92,  0,  0,  0,  0, 49,  0,  0, 93,  0,  0,  0,  0, 94, 95,  0,
+    0, 96,  0,  0, 97,  0,  0,  0, 98,  0,  0,  0, 99,  0,100, 93,
+    0,  0,101,  0,  0,  0, 84,  0,  0,102,  0,  0,  0,103,104,  0,
+    0,105,106,  0,  0,  0,  0,  0,  0,107,  0,  0,108,  0,  0,  0,
+    0,109, 33,  0,110,111,112, 35,  0,  0,113,  0,  0,  0,114,  0,
+    0,  0,  0,  0,  0,115,  0,  0,116,  0,  0,  0,  0,117, 88,  0,
+    0,  0,  0,  0, 57,  0,  0,  0,  0, 52,118,  0,  0,  0,  0,119,
+    0,  0,120,  0,  0,  0,  0,118,  0,  0,  0,  0,  0,121,  0,  0,
+    0,122,  0,  0,  0,123,  0,124,  0,  0,  0,  0,125,126,127,  0,
+  128,  0,129,  0,  0,  0,130,131,132,  0,  0,  0, 35,  0,  0,  0,
+  133,  0,  0,134,  0,  0,135,  0,  0,  0,  0,  0,  0,  0,  1,  1,
+    1,  1,  1,  2,  3,  4,  5,  6,  7,  4,  4,  8,  9, 10,  1, 11,
+   12, 13, 14, 15, 16, 17, 18,  1,  1,  1, 19,  1,  0,  0, 20, 21,
+   22,  1, 23,  4, 21, 24, 25, 26, 27, 28, 29, 30,  0,  0,  1,  1,
+   31,  0,  0,  0, 32, 33, 34, 35,  1, 36, 37,  0,  0,  0,  0, 38,
+    1, 39, 14, 39, 40, 41, 42,  0,  0,  0, 43, 36, 44, 45, 21, 45,
+   46,  0,  0,  0, 19,  1, 21,  0,  0, 47,  0, 38, 48,  1,  1, 49,
+   49, 50,  0,  0, 51,  0,  0,  0, 52,  1,  0,  0, 38, 14,  4,  1,
+    1,  1, 53, 21, 43, 52, 54, 21, 35,  1,  0,  0,  0, 55,  0,  0,
+    0, 56, 57, 58,  0,  0,  0,  0,  0, 59,  0, 60,  0,  0,  0,  0,
+   61, 62,  0,  0, 63,  0,  0,  0, 64,  0,  0,  0, 65,  0,  0,  0,
+   66,  0,  0,  0, 67,  0,  0,  0, 68,  0,  0, 69, 70,  0, 71, 72,
+   73, 74, 75, 76,  0,  0,  0, 77,  0,  0,  0, 78, 79,  0,  0,  0,
+    0, 47,  0,  0,  0, 49,  0, 80,  0,  0,  0, 62,  0,  0, 63,  0,
+    0, 81,  0,  0, 82,  0,  0,  0, 83,  0,  0, 19, 84,  0, 62,  0,
+    0,  0,  0, 49,  1, 85,  1, 52, 15, 86, 36, 10, 21, 87,  0, 55,
+    0,  0,  0,  0, 19, 10,  1,  0,  0,  0,  0,  0, 88,  0,  0, 89,
+    0,  0, 88,  0,  0,  0,  0, 78,  0,  0, 87,  9, 12,  4, 90,  8,
+   91, 47,  0, 58, 50,  0, 21,  1, 21, 92, 93,  1,  1,  1,  1, 94,
+   95, 96, 97,  1, 98, 58, 81, 99,100,  4, 58,  0,  0,  0,  0,  0,
+    0, 19, 50,  0,  0,  0,  0,  0,  0, 61,  0,  0,101,102,  0,  0,
+  103,  0,  0,  1,  1, 50,  0,  0,  0, 38,  0, 63,  0,  0,  0,  0,
+    0, 62,  0,  0,104, 68, 61,  0,  0,  0, 78,  0,  0,  0,105,106,
+   58, 38, 81,  0,  0,  0,  0,  0,  0,107,  1, 14,  4, 12, 84,  0,
+    0,  0,  0, 38, 87,  0,  0,  0,  0,108,  0,  0,109, 61,  0,110,
+    0,  0,  0,  1,  0,  0,  0,  0, 19, 58,  0,111, 14, 52,112, 41,
+    0,  0, 62,  0,  0, 61,  0,  0,113,  0, 87,  0,  0,  0, 61, 62,
+    0,  0, 62,  0, 89,  0,  0,113,  0,  0,  0,  0,114,  0,  0,  0,
+   78, 55,  0, 38,  1, 58,  1, 58,  0,  0, 63, 89,  0,  0,115,  0,
+    0,  0, 55,  0,  0,  0,  0,115,  0,  0,  0,  0, 61,  0,  0,  0,
+    0, 79,  0, 61,  0,  0,  0,  0, 56,  0, 89, 80,  0,  0,  8, 91,
+    0,  0,  1, 87,  0,  0,116,  0,  0,  0,  0,  0,  0,117,  0,118,
+  119,120,121,  0,104,  4,122, 49, 23,  0,  0,  0, 38, 50, 38, 58,
+    0,  0,  1, 87,  1,  1,  1,  1, 39,  1, 48,105, 87,  0,  0,  0,
+    0,  1,  4,122,  0,  0,  0,  1,123,  0,  0,  0,  0,  0,230,230,
+  230,230,230,232,220,220,220,220,232,216,220,220,220,220,220,202,
+  202,220,220,220,220,202,202,220,220,220,  1,  1,  1,  1,  1,220,
+  220,220,220,230,230,230,230,240,230,220,220,220,230,230,230,220,
+  220,  0,230,230,230,220,220,220,220,230,232,220,220,230,233,234,
+  234,233,234,234,233,230,  0,  0,  0,230,  0,220,230,230,230,230,
+  220,230,230,230,222,220,230,230,220,220,230,222,228,230, 10, 11,
+   12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22,  0, 23,  0, 24,
+   25,  0,230,220,  0, 18, 30, 31, 32,  0,  0,  0,  0, 27, 28, 29,
+   30, 31, 32, 33, 34,230,230,220,220,230,220,230,230,220, 35,  0,
+    0,  0,  0,  0,230,230,230,  0,  0,230,230,  0,220,230,230,220,
+    0,  0,  0, 36,  0,  0,230,220,230,230,220,220,230,220,220,230,
+  220,230,220,230,230,  0,  0,220,  0,  0,230,230,  0,230,  0,230,
+  230,230,230,230,  0,  0,  0,220,220,220,230,220,220,220,230,230,
+    0,220, 27, 28, 29,230,  7,  0,  0,  0,  0,  9,  0,  0,  0,230,
+  220,230,230,  0,  0,  0,  0,  0,230,  0,  0, 84, 91,  0,  0,  0,
+    0,  9,  9,  0,  0,  0,  0,  0,  9,  0,103,103,  9,  0,107,107,
+  107,107,118,118,  9,  0,122,122,122,122,220,220,  0,  0,  0,220,
+    0,220,  0,216,  0,  0,  0,129,130,  0,132,  0,  0,  0,  0,  0,
+  130,130,130,130,  0,  0,130,  0,230,230,  9,  0,230,230,  0,  0,
+  220,  0,  0,  0,  0,  7,  0,  9,  9,  0,  9,  9,  0,  0,  0,230,
+    0,  0,  0,228,  0,  0,  0,222,230,220,220,  0,  0,  0,230,  0,
+    0,220,230,220,  0,220,230,230,230,  0,  0,  0,  9,  9,  0,  0,
+    7,  0,230,  0,  1,  1,  1,  0,  0,  0,230,234,214,220,202,230,
+  230,230,230,230,232,228,228,220,218,230,233,220,230,220,230,230,
+    1,  1,  1,  1,  1,230,  0,  1,  1,230,220,230,  1,  1,  0,  0,
+  218,228,232,222,224,224,  0,  8,  8,  0,  0,  0,  0,220,230,  0,
+  230,230,220,  0,  0,230,  0,  0, 26,  0,  0,220,  0,230,230,  1,
+  220,  0,  0,230,220,  0,  0,  0,220,220,  0,  0,230,220,  0,  9,
+    7,  0,  0,  7,  9,  0,  0,  0,  9,  7,  6,  6,  0,  0,  0,  0,
+    1,  0,  0,216,216,  1,  1,  1,  0,  0,  0,226,216,216,216,216,
+  216,  0,220,220,220,  0,230,230,  7,  0, 16, 17, 17, 17, 17, 17,
+   17, 33, 17, 17, 17, 19, 17, 17, 17, 17, 20,101, 17,113,129,169,
+   17, 27, 28, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
-   17, 17, 17, 17, 17, 17, 17,177,  0,  1,  2,  3,  3,  3,  3,  3,
-    3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  4,  3,  3,  3,
-    3,  3,  5,  3,  3,  3,  3,  3,  6,  7,  8,  3,  3,  3,  3,  3,
-    9, 10, 11, 12, 13,  3,  3,  3,  3,  3,  3,  3,  3, 14,  3, 15,
-    3,  3,  3,  3,  3,  3, 16, 17, 18, 19, 20, 21,  3,  3,  3, 22,
-   23,  3,  3,  3,  3,  3,  3,  3, 24,  3,  3,  3,  3,  3,  3,  3,
-    3, 25,  3,  3, 26, 27,  0,  1,  0,  0,  0,  0,  0,  1,  0,  2,
-    0,  0,  0,  3,  0,  0,  0,  3,  0,  0,  0,  0,  0,  4,  0,  5,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  6,
-    0,  0,  0,  7,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  8,
-    9,  0,  0,  0,  0,  0,  0,  9,  0,  9,  0,  0,  0,  0,  0,  0,
-    0, 10, 11, 12, 13,  0,  0, 14, 15, 16,  6,  0, 17, 18, 19, 19,
-   19, 20, 21, 22, 23, 24, 19, 25,  0, 26, 27, 19, 19, 28, 29, 30,
-    0, 31,  0,  0,  0,  8,  0,  0,  0,  0,  0,  0,  0, 19, 28,  0,
-   32, 33,  9, 34, 35, 19,  0,  0, 36, 37, 38, 39, 40, 19,  0, 41,
-   42, 43, 44, 31,  0,  1, 45, 42,  0,  0,  0,  0,  0, 32, 14, 14,
-    0,  0,  0,  0, 14,  0,  0, 46, 47, 47, 47, 47, 48, 49, 47, 47,
-   47, 47, 50, 51, 52, 53, 43, 21,  0,  0,  0,  0,  0,  0,  0, 54,
-    6, 55,  0, 14, 19,  1,  0,  0,  0, 19, 56, 31,  0,  0,  0,  0,
-    0,  0,  0, 57, 14,  0,  0,  0,  0,  1,  0,  2,  0,  0,  0,  3,
-    0,  0,  0, 58, 59,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,
-    0,  0,  2,  3,  0,  4,  5,  0,  0,  6,  0,  0,  0,  7,  0,  0,
-    0,  1,  1,  0,  0,  8,  9,  0,  8,  9,  0,  0,  0,  0,  8,  9,
-   10, 11, 12,  0,  0,  0, 13,  0,  0,  0,  0, 14, 15, 16, 17,  0,
-    0,  0,  1,  0,  0, 18, 19,  0,  0,  0, 20,  0,  0,  0,  1,  1,
-    1,  1,  0,  1,  1,  1,  1,  1,  1,  1,  0,  8, 21,  9,  0,  0,
-   22,  0,  0,  0,  0,  1,  0, 23, 24, 25,  0,  0, 26,  0,  0,  0,
-    8, 21, 27,  0,  1,  0,  0,  1,  1,  1,  1,  0,  1, 28, 29, 30,
-    0, 31, 32, 20,  1,  1,  0,  0,  0,  8, 21,  9,  1,  4,  5,  0,
-    0,  0, 33,  9,  0,  1,  1,  1,  0,  8, 21, 21, 21, 21, 34,  1,
-   35, 21, 21, 21,  9, 36,  0,  0, 37, 38,  1,  0, 39,  0,  0,  0,
-    1,  0,  1,  0,  0,  0,  0,  8, 21,  9,  1,  0,  0,  0, 40,  0,
-    8, 21, 21, 21, 21, 21, 21, 21, 21,  9,  0,  1,  1,  1,  1,  8,
-   21, 21, 21,  9,  0,  0,  0, 41,  0, 42, 43,  0,  0,  0,  1, 44,
-    0,  0,  0, 45,  8,  9,  1,  0,  1,  0,  1,  1,  8, 21, 21,  9,
-    0,  4,  5,  8,  9,  1,  0,  0,  0,  1,  2,  3,  4,  5,  6,  7,
-    7,  8,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  9, 10, 11, 11,
-   11, 11, 11, 12, 12, 12, 12, 13, 14, 15, 16, 17, 18, 12, 19, 12,
-   20, 12, 12, 12, 12, 21, 22, 22, 22, 23, 12, 12, 12, 12, 24, 25,
-   12, 12, 26, 27, 28, 29, 30, 31,  7,  7,  7,  7,  7,  7,  7,  7,
-    7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-    7,  7,  7,  7,  7, 32, 12, 33,  7,  7, 34, 12, 12, 12, 12, 12,
+   17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+   17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+   17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+   17, 17, 17, 17, 17, 17, 17, 17, 17,237,  0,  1,  2,  2,  0,  3,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  5,  0,  0,  0,  0,  6,  7,  8,  9,  0,
+    0,  0, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,  0,  0,  0,  0,
+    0,  0,  0,  0,  0, 20,  0,  0, 21, 22,  0,  0,  0,  0, 23, 24,
+   25, 26,  0, 27,  0, 28, 29, 30, 31, 32,  0,  0,  0,  0,  0,  0,
+    0, 33, 34, 35, 36,  0,  0,  0,  0,  0, 37,  0,  0,  0,  0,  0,
+    0,  0,  0,  0, 38, 39,  0,  0,  0,  0,  1,  2, 40, 41,  0,  1,
+    2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,
+    0,  2,  0,  0,  0,  0,  0,  0,  3,  4,  0,  0,  5,  0,  0,  0,
+    6,  0,  0,  0,  0,  0,  0,  0,  7,  1,  0,  0,  0,  0,  0,  0,
+    8,  9,  0,  0,  0,  0,  0,  0, 10,  0,  0, 10,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0, 10,  0,  0,  0, 10,  0,  0,
+    0,  0,  0,  0, 11, 12,  0, 13,  0, 14, 15, 16,  0,  0,  0,  0,
+    0,  1, 17, 18,  0, 19,  7,  1,  0,  0,  0, 20, 20,  7, 20, 20,
+   20, 20, 20, 20, 20,  8, 21,  0, 22,  0,  7, 23, 24,  0, 20, 20,
+   25,  0,  0,  0, 26, 27,  1,  7, 20, 20, 20, 20, 20,  1, 28, 29,
+   30, 31,  0,  0, 20,  0,  0,  0,  0,  0,  0,  0, 10,  0,  0,  0,
+    0,  0,  0,  0, 20, 20, 20,  1,  0,  0,  8, 21, 32,  4,  0, 10,
+    0, 33,  7, 20, 20, 20,  0,  0,  0,  0,  8, 34, 34, 35, 36, 34,
+   37,  0, 38,  1, 20, 20,  0,  0, 39,  0,  1,  1,  0,  8, 21,  1,
+   20,  0,  0,  0,  1,  0,  0, 40,  1,  1,  0,  0,  8, 21,  0,  1,
+    0,  1,  0,  1,  0,  0,  0,  0, 26, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 21,  7, 20, 41, 34, 34, 34, 34, 34, 34, 34, 34, 34, 21,
+    0, 42, 43, 44,  0, 45,  0,  8, 21,  0,  0,  0,  0,  0,  0,  0,
+    0, 46,  7,  1, 10,  1,  0,  0,  0,  1, 20, 20,  1,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0, 26, 34,  9,  0,  0, 20, 20,  1, 20,
+   20,  0,  0,  0,  0,  0,  0,  0, 26, 21,  0,  1,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  3, 47, 48,  0,  0,  0,  0,  0,
+    0,  0,  0,  1,  2,  3,  4,  5,  6,  7,  7,  8,  7,  7,  7,  7,
+    7,  7,  7,  7,  7,  7,  9, 10, 11, 11, 11, 11, 11, 12, 12, 12,
+   12, 13, 14, 15, 16, 17, 18, 19, 20, 12, 21, 12, 12, 12, 12, 22,
+   23, 23, 23, 24, 12, 12, 12, 25, 26, 27, 12, 28, 29, 30, 31, 32,
+   33, 34,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+    7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7, 35,
+   12, 36,  7,  7, 37, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
@@ -6110,259 +6210,266 @@ _hb_ucd_u8[13344] =
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-   12, 12, 12, 12, 12, 12, 12, 12, 35,  0,  0,  1,  2,  2,  2,  3,
-    4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
-   20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 32, 33, 33,
-   33, 34, 35, 35, 35, 35, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44,
-   45, 46, 47, 48, 49, 50,  2,  2, 51, 51, 52, 53, 54, 55, 56, 56,
-   56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 57, 57, 56, 56, 56, 56,
-   56, 56, 58, 59, 60, 61, 56, 62, 62, 63, 64, 65, 66, 67, 68, 69,
-   70, 56, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+   12, 12, 38,  0,  0,  1,  2,  2,  2,  3,  4,  5,  6,  7,  8,  9,
+   10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
+   26, 27, 28, 29, 30, 31, 32, 32, 33, 33, 33, 34, 35, 35, 35, 35,
+   35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
+    2,  2, 51, 51, 52, 53, 54, 55, 56, 56, 56, 56, 56, 56, 56, 56,
+   56, 56, 56, 56, 57, 57, 56, 56, 56, 56, 56, 56, 58, 59, 60, 61,
+   56, 62, 62, 63, 64, 65, 66, 67, 68, 69, 70, 56, 62, 62, 62, 62,
    62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
-   62, 62, 62, 62, 62, 71, 62, 62, 62, 62, 72, 72, 72, 72, 72, 72,
-   72, 72, 72, 73, 74, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84,
-   85, 86, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
-   32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 87, 87, 87, 87, 87, 87,
-   87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 62, 62, 62, 62,
-   88, 89, 89, 89, 90, 89, 91, 92, 93, 94, 95, 95, 96, 97, 87, 98,
-   99,100,101,102,103, 87,104,104,104, 87,105,106,107,108,109,110,
-  111,112,113,114,115, 87, 89,116,117,118,119,120,121,122,123,124,
-  125, 87,126,127, 87,128,129,130,131, 87,132,133,134,135,136,137,
-   87, 87,138,139,140,141, 87,142, 87,143,144,144,144,144,144,144,
-  144,144,144,144,144, 87, 87, 87, 87, 87,145,145,145,145,145,145,
-  145,145,145, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
-   87, 87,146,146,146,146,146, 87, 87, 87,147,147,147,147,148,149,
-  150,150, 87, 87, 87, 87,151,151,152,153,154,154,154,154,154,154,
-  154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,
-  155,155,155,155,154, 87, 87, 87, 87, 87,156,157,158,159,159,159,
+   62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 71,
+   62, 62, 62, 62, 72, 72, 72, 72, 72, 72, 72, 72, 72, 73, 74, 74,
+   75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 32, 32, 32, 32,
+   32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+   32, 32, 32, 32, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+   87, 87, 87, 87, 87, 87, 62, 62, 62, 62, 88, 89, 89, 89, 90, 89,
+   91, 92, 93, 94, 95, 95, 96, 97, 87, 98, 99,100,101,102,103,104,
+  105,105,105,  2,106,107,108,109,110,111,112,113,114,115,116, 87,
+   89,117,118,119,120,121,122,123,124,125,126, 87,127,128, 87,129,
+  130,131,132, 87,133,134,135,136,137,138, 87, 87,139,140,141,142,
+   87,143, 87,144,145,145,145,145,145,145,145,145,145,145,145, 87,
    87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
-   87, 87,160,161, 87, 87, 87, 87, 87, 87, 56, 56,162,163, 51, 56,
-   56, 87, 56, 56, 56, 56, 56, 56, 56, 56,164,164,164,164,164,164,
-   87, 87, 87, 87, 87, 87, 87, 87, 87, 87,165, 87,166, 87, 87,167,
-   87, 87, 87, 87, 87, 87, 87, 87, 87, 87,168,168,169, 87, 87, 87,
-   87, 87, 56, 56, 56, 87, 89, 89, 87, 87, 56, 56, 56, 56,170, 87,
-   56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
-   56, 56, 87, 87, 87, 87, 87, 87, 87, 87, 62, 62, 62, 62, 62, 62,
-   62, 62, 87, 87, 87, 87, 87, 87, 87, 87, 62, 62, 62, 62, 62, 87,
-   87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 62, 62, 62, 62, 62, 62,
-   62, 87, 87, 87, 87, 87, 87, 87, 87, 87, 56, 87,171,171,  0,  1,
-    2,  2,  0,  1,  2,  2,  2,  3,  4,  5,  0,  0,  0,  0,  1,  2,
-    1,  2,  0,  0,  3,  3,  4,  5,  4,  5,  4,  4,  4,  4,  4,  4,
-    4,  4,  4,  4,  4,  6,  0,  0,  7,  0,  8,  8,  8,  8,  8,  8,
-    8,  9, 10, 11, 11, 11, 11, 11, 12, 11, 13, 13, 13, 13, 13, 13,
-   13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 15, 16, 16,
-   16, 16, 16, 17, 18, 18, 18, 18, 18, 18, 19, 20, 21, 21, 22, 23,
-   21, 24, 21, 21, 21, 21, 21, 25, 21, 21, 26, 26, 26, 26, 26, 21,
-   21, 21, 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30,
-   26, 26, 21, 21, 21, 21, 21, 21, 31, 21, 32, 32, 32, 32, 32, 33,
-   34, 32, 35, 35, 35, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 36,
-   36, 36, 37, 37, 37, 37, 37, 37, 37, 37, 38, 38, 38, 38, 38, 38,
-   38, 38, 39, 39, 39, 39, 39, 39, 39, 39, 40, 40, 40, 40, 40, 40,
-   40, 40, 41, 41, 41, 41, 41, 41, 41, 41, 42, 42, 42, 42, 42, 42,
-   42, 42, 43, 43, 43, 43, 43, 43, 43, 43, 44, 44, 44, 45, 44, 44,
-   44, 44, 46, 46, 46, 46, 46, 46, 46, 46, 47, 47, 47, 47, 47, 47,
-   47, 47, 47, 47, 47, 47, 47, 48, 47, 47, 49, 49, 49, 49, 49, 49,
-   49, 49, 49, 49, 50, 50, 50, 50, 50, 51, 52, 52, 52, 52, 52, 52,
-   52, 52, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 54, 54, 54, 54,
-   54, 54, 55, 55, 55, 55, 55, 55, 55, 55, 56, 56, 57, 57, 57, 57,
-   58, 57, 59, 59, 60, 61, 62, 62, 63, 63, 64, 64, 64, 64, 64, 64,
-   64, 64, 65, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 55, 55, 55,
-   55, 55, 67, 67, 67, 67, 67, 68, 68, 68, 69, 69, 69, 69, 69, 69,
-   64, 64, 70, 70, 71, 71, 71, 71, 71, 71, 71, 71, 71,  8,  8,  8,
-    8,  8, 72, 72, 72, 72, 72, 72, 72, 72, 73, 73, 73, 73, 74, 74,
-   74, 74, 75, 75, 75, 75, 75, 76, 76, 76, 13, 50, 50, 50, 73, 77,
-   78, 79,  4,  4, 80,  4,  4, 81, 82, 83,  4,  4,  4, 84,  8,  8,
-    8,  8, 11, 11, 11, 11, 11, 11, 11, 11, 85,  0,  0,  0,  0,  0,
-    0, 86,  0,  4,  0,  0,  0,  8,  8,  8,  0,  0, 87, 88, 89,  0,
-    4,  4,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0, 90, 90, 90, 90, 90, 90, 90, 90, 91, 91, 91, 91, 91, 91,
-    4,  4, 92, 92, 92, 92, 92, 92, 92, 92, 50, 50, 50, 93, 93, 93,
-   93, 93, 53, 53, 53, 53, 53, 53, 13, 13, 94, 94, 94, 94, 94, 94,
-   94, 94, 94, 94, 94, 94, 94, 94, 94,  0, 95,  0, 96, 97, 98, 99,
-   99, 99, 99,100,101,102,102,102,102,103,104,104,104,105, 52, 52,
-   52, 52, 52,  0,104,104,  0,  0,  0,102, 52, 52,  0,  0,  0,  0,
-   52,106,  0,  0,  0,  0,  0,102,102,107,102,102,102,102,102,108,
-    0,  0, 94, 94, 94, 94,  0,  0,  0,  0,109,109,109,109,109,109,
-  109,109,109,109,109,109,109,110,110,110,111,111,111,111,111,111,
-  111,111,111,111,111,111, 13, 13, 13, 13, 13, 13,112,112,112,112,
-  112,112,  0,  0,113,  4,  4,  4,  4,  4,114,  4,  4,  4,  4,  4,
-    4,  4,115,115,115,  0,116,116,116,116,117,117,117,117,117,117,
-   32, 32,118,118,119,120,120,120, 52, 52,121,121,121,121,122,121,
-   49, 49,123,123,123,123,123,123, 49, 49,124,124,124,124,124,124,
-  125,125, 53, 53, 53,  4,  4,126,127, 54, 54, 54, 54, 54,125,125,
-  125,125,128,128,128,128,128,128,128,128,  4,129, 18, 18, 18, 21,
-   21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,130,  0, 21,
-   21, 21,  8,  0,131,  0,  0,  0,  0, 21, 21, 21, 21, 21, 21, 21,
-   21,132,  0,  0,  1,  2,  1,  2,133,101,102,134, 52, 52, 52, 52,
-    0,  0,135,135,135,135,135,135,135,135,  0,  0,  0,  0, 11, 11,
-   11, 11, 11,  0, 11, 11, 11,  0,  0,136,137,137,138,138,138,138,
-  139,  0,140,140,140,141,141,142,142,142,143,143,144,144,144,144,
-  144,144,145,145,145,145,145,146,146,146,147,147,147,148,148,148,
-  148,148,149,149,149,150,150,150,150,150,151,151,151,151,151,151,
-  151,151,152,152,152,152,153,153,154,154,155,155,155,155,155,155,
-  156,156,157,157,158,158,158,158,158,158,159,159,160,160,160,160,
-  160,160,161,161,161,161,161,161,162,162,163,163,163,163,164,164,
-  164,164,165,165,165,165,166,166,167,167,168,168,168,168,168,168,
-  168,168,169,169,169,169,169,169,169,169,170,170,170,170,170,170,
-  170,170,171,171,171,171,171,171,171,171,172,172,172,172,172,172,
-  172,172,173,173,173,174,174,174,174,174,175,175,175,175,175,175,
-  176,176,177,177,177,177,177,177,177,177,178,178,178,178,178,179,
-  179,179,180,180,180,180,180,181,181,181,182,182,182,182,182,182,
-  183, 43,184,184,184,184,184,184,184,184,185,185,185,186,186,186,
-  186,186,187,187,187,188,187,187,187,187,189,189,189,189,189,189,
-  189,189,190,190,190,190,190,190,190,190,191,191,191,191,191,191,
-  191,191,192,192,192,192,192,192, 66, 66,193,193,193,193,193,193,
-  193,193,194,194,194,194,194,194,194,194,195,195,195,195,195,195,
-  195,195,196,196,196,196,196,196,196,196,197,197,197,197,197,197,
-  197,197,198,198,198,198,198,198,198,198,199,199,199,199,199,200,
-  200,200,200,200,200,200,201,201,201,201,202,202,202,202,202,202,
-  202,203,203,203,203,203,203,203,203,203,204,204,204,204,204,204,
-  205,205,205,205,205,205,205,205,205,205,206,206,206,206,206,206,
-  206,206,110,110,110,110, 39, 39, 39, 39,207,207,207,207,207,207,
-  207,207,208,208,208,208,208,208,208,208,209,209,209,209,209,209,
-  209,209,112,112,112,112,112,112,112,112,112,112,112,112,210,210,
-  210,210,211,211,211,211,211,211,211,211,212,212,212,212,212,212,
-  212,212,213,213,213,213,213,213,213,213,214,214,214,214,214,214,
-  214,214,214,214,214,214,214,214,215, 94,216,216,216,216,216,216,
-  216,216,217,217,217,217,217,217,217,217,218, 99, 99, 99, 99, 99,
-   99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
-  219,220,220,220,220,220,220,220,220,220,221,221,221,221,221,221,
-  221,221,221,221,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-  222,223,224,  0,225,  0,  0,  0,  0,  0,226,226,226,226,226,226,
-  226,226, 91, 91, 91, 91, 91, 91, 91, 91,227,227,227,227,227,227,
-  227,227,228,228,228,228,228,228,228,228,229,229,229,229,229,229,
-  229,229,230,230,230,230,230,230,230,230,231,  0,  0,  0,  0,  0,
-    0,  0,  8,  8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  1,  2,
-    2,  2,  2,  2,  3,  0,  0,  0,  4,  0,  2,  2,  2,  2,  2,  3,
-    2,  2,  2,  2,  5,  0,  2,  5,  6,  0,  7,  7,  7,  7,  8,  9,
-    8, 10,  8, 11,  8,  8,  8,  8,  8,  8, 12, 13, 13, 13, 14, 14,
-   14, 14, 14, 15, 14, 14, 16, 17, 17, 17, 17, 17, 17, 17, 18, 19,
-   19, 19, 19, 19, 19, 19, 20, 21, 20, 22, 20, 20, 23, 23, 20, 20,
-   20, 20, 22, 20, 24,  7,  7, 25, 20, 20, 26, 20, 20, 20, 20, 20,
-   20, 21, 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30,
-   30, 30, 31, 31, 31, 31, 32, 20, 20, 20, 33, 33, 33, 33, 34, 35,
-   33, 33, 33, 36, 33, 33, 37, 37, 37, 37, 38, 38, 38, 38, 39, 39,
-   39, 39, 40, 40, 40, 40, 41, 41, 41, 41, 42, 42, 42, 42, 43, 43,
-   43, 43, 44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 46, 46,
-   46, 47, 48, 48, 48, 48, 49, 49, 49, 49, 49, 50, 51, 49, 52, 52,
-   52, 52, 53, 53, 53, 53, 53, 53, 54, 53, 55, 55, 55, 55, 56, 56,
-   56, 56, 57, 57, 57, 57, 58, 58, 58, 58, 59, 59, 59, 59, 60, 60,
-   60, 60, 60, 60, 61, 62, 63, 63, 63, 63, 64, 64, 64, 64, 64, 65,
-    0,  0, 66, 66, 66, 66, 67, 67, 67, 67, 68, 68, 68, 68, 69, 70,
-   71, 71, 71, 71, 71, 71, 72, 72, 72, 72, 73, 73, 73, 73, 74, 74,
-   74, 74, 75, 75, 75, 75, 76, 76, 76, 76, 77, 77, 77, 77, 78, 78,
-   78, 78, 79, 79, 79, 79, 80, 80, 80, 80, 81, 81, 81, 81, 82,  7,
-    7,  7, 83,  7, 84, 85,  0, 84, 86,  0,  2, 87, 88,  2,  2,  2,
-    2, 89, 90, 87, 91,  2,  2,  2, 92,  2,  2,  2,  2, 93,  0,  0,
-    0, 86,  1,  0,  0, 94,  0, 95, 96,  0,  4,  0,  0,  0,  0,  0,
-    0,  4, 97, 97, 97, 97, 98, 98, 98, 98, 13, 13, 13, 13, 99, 99,
-   99, 99,100,100,100,100,  0,101,  0,  0,102,100,103,104,  0,  0,
-  100,  0,105,106,106,106,106,106,106,106,106,106,107,105,108,109,
-  109,109,109,109,109,109,109,109,110,108,111,111,111,111,112, 55,
-   55, 55, 55, 55, 55,113,109,109,109,110,109,109,  0,  0,114,114,
-  114,114,115,115,115,115,116,116,116,116,117,117,117,117, 96,  2,
-    2,  2,  2,  2, 94,  2,118,118,118,118,119,119,119,119,120,120,
-  120,120,121,121,121,121,121,121,121,122,123,123,123,123,124,124,
-  124,124,124,124,124,125,126,126,126,126,127,127,127,127,128,128,
-  128,128,  2,  2,  3,  2,  2,129,130,  0,131,131,131,131,132, 17,
-   17, 18, 20, 20, 20,133,  7,  7,  7,134, 20, 20, 20, 23,  0,135,
-  109,109,109,109,109,136,137,137,137,137,  0,  0,  0,138,139,139,
-  139,139,140,140,140,140, 84,  0,  0,  0,141,141,141,141,142,142,
-  142,142,143,143,143,143,144,144,144,144,145,145,145,145,146,146,
-  146,146,147,147,147,147,148,148,148,148,149,149,149,149,150,150,
-  150,150,151,151,151,151,152,152,152,152,153,153,153,153,154,154,
-  154,154,155,155,155,155,156,156,156,156,157,157,157,157,158,158,
-  158,158,159,159,159,159,160,160,160,160,161,161,161,161,162,162,
-  162,162,163,163,163,163,164,164,164,164,165,165,165,165,166,166,
-  166,166,167,167,167,167,168,168,168,168,169,169,169,169,170,170,
-  170,170,171,171,171,171,172,172,172,172,173,173,173,173,174,174,
-  174,174,175,175,175,175,176,176,176,176,177,177,177,177,178,178,
-  178,178,179,179,179,179,180,180,180,180,181,181,181,181,182,182,
-  182,182,183,183,183,183,184, 45, 45, 45,185,185,185,185,186,186,
-  186,186,187,187,187,187,188,188,188,188,188,188,189,188,190,190,
-  190,190,191,191,191,191,192,192,192,192,193,193,193,193,194,194,
-  194,194,195,195,195,195,196,196,196,196,197,197,197,197,198,198,
-  198,198,199,199,199,199,200,200,200,200,201,201,201,201,202,202,
-  202,202,203,203,203,203,204,204,204,204,205,205,205,205,206,206,
-  206,206,207,207,207,207,208,208,208,208,209,209,209,209,210,210,
-  210,210,211,211,211,211,212,212,212,212,213,213,213,213,214,214,
-  214,214,215,215,215,215,216,217,217,217,218,218,218,218,217,217,
-  217,217,219,106,106,106,106,109,109,109,220,220,220,220,221,221,
-  221,221,  0,222, 86,  0,  0,  0,222,  7, 82,138,  7,  0,  0,  0,
-  223, 86,224,224,224,224,225,225,225,225,226,226,226,226,227,227,
-  227,227,228,228,228,228,229,  0,  0,  0,  0,  0,  0,  0,  0, 19,
-   19, 19, 19, 19, 19, 19, 19, 19, 19,  0,  0,  0, 19,  0, 19,  0,
-    0,  0,  0,  0, 26, 26,  1,  1,  1,  1,  9,  9,  9,  9,  0,  9,
-    9,  9,  9,  9,  0,  9,  9,  0,  9,  0,  9,  9, 55, 55, 55, 55,
-   55, 55,  6,  6,  6,  6,  6,  1,  1,  6,  6,  4,  4,  4,  4,  4,
-    4,  4,  4, 14, 14, 14, 14, 14, 14, 14,  3,  3,  3,  3,  3,  0,
-    3,  3,  0,  3,  3,  3,  3,  3,  3,  0,  3,  3,  3,  1,  1,  1,
-    3,  3,  1,  3,  3,  3, 37, 37, 37, 37, 38, 38, 38, 38, 64, 64,
-   64, 64, 90, 90, 90, 90, 95, 95, 95, 95,  3,  3,  0,  3,  7,  7,
-    7,  7,  7,  1,  1,  1,  1,  7,  7,  7,  0,  0,  7,  7,  5,  5,
-    5,  5, 11, 11, 11, 11, 10, 10, 10, 10, 21, 21, 21, 21, 22, 22,
-   22, 22, 23, 23, 23, 23, 16, 16, 16, 16, 20, 20, 20, 20, 36, 36,
-   36, 36, 24, 24, 24, 24, 24, 24, 24,  0, 18, 18, 18, 18, 25, 25,
-   25, 25, 25,  0,  0,  0,  0, 25, 25, 25, 33, 33, 33, 33,  8,  8,
-    8,  8,  8,  8,  8,  0, 12, 12, 12, 12, 30, 30, 30, 30, 29, 29,
-   29, 29, 28, 28, 28, 28, 34, 34, 34, 34, 35, 35, 35, 35, 35, 35,
-   35,  0,  0,  0, 35, 35, 45, 45, 45, 45, 44, 44, 44, 44, 44,  0,
-    0,  0, 43, 43, 43, 43, 46, 46, 46, 46, 31, 31, 31, 31, 32, 32,
-    0,  0, 32,  0, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 52, 52,
-   52, 52, 58, 58, 58, 58, 54, 54, 54, 54, 91, 91, 91, 91, 62, 62,
-   62, 62, 76, 76, 76, 76, 93, 93, 93, 93, 70, 70, 70, 70, 73, 73,
-   73, 73,  1,  1,  1,  0,  1,  0,  1,  1,  1,  0,  0,  0,  0,  1,
-    0,  0,  1,  1,  0,  0, 19, 19,  9,  9,  9,  9,  9,  6, 19,  9,
-    9,  9,  9,  9, 19, 19,  9,  9,  9, 19,  6, 19, 19, 19, 19, 19,
-   19,  9,  0,  0,  0, 19,  0,  0,  9,  0,  0,  0, 19, 19, 27, 27,
-   27, 27, 56, 56, 56, 56, 61, 61, 61, 61, 13, 13, 13, 13,  0, 13,
-    0, 13,  0, 13, 13, 13, 13, 13,  1,  1,  1,  1, 12, 12,  0, 15,
-   15, 15, 15, 15, 15, 15, 15,  1,  1,  0,  0, 17, 17, 17, 17, 17,
-   17, 17, 17, 17, 17,  0, 26, 26, 26, 26, 26, 12, 12, 12, 12, 12,
-   12,  0, 39, 39, 39, 39, 86, 86, 86, 86, 77, 77, 77, 77, 79, 79,
-   79, 79, 60, 60, 60, 60, 65, 65, 65, 65, 75, 75, 75, 75, 69, 69,
-   69, 69, 69, 69,  0, 69, 74, 74, 74, 74, 84, 84, 84, 84, 84, 84,
-   84,  0, 68, 68, 68, 68, 92, 92, 92, 92, 87, 87, 87, 87, 19,  9,
-   19, 19, 19, 19,  0,  0,  2,  2,  2,  2, 19, 19, 19,  4,  3,  3,
-    0,  0,  1,  1,  6,  6,  0,  0, 17, 17, 17, 17,  0,  0, 49, 49,
-   49, 49,  0,  1,  1,  1, 71, 71, 71, 71, 67, 67, 67, 67, 42, 42,
-   42, 42, 41, 41, 41, 41,118,118,118,118, 53, 53, 53, 53, 59, 59,
-   59, 59, 40, 40, 40, 40, 51, 51, 51, 51, 50, 50, 50, 50,135,135,
-  135,135,106,106,106,106,104,104,104,104,110,110,110,110, 47, 47,
-   47, 47, 81, 81, 81, 81,120,120,120,120,116,116,116,116,128,128,
-  128,128, 66, 66, 66, 66, 72, 72, 72, 72, 98, 98, 98, 98, 97, 97,
-   97, 97, 57, 57, 57, 57, 88, 88, 88, 88,117,117,117,117,112,112,
-  112,112, 78, 78, 78, 78, 83, 83, 83, 83, 82, 82, 82, 82,122,122,
-  122,122, 89, 89, 89, 89,130,130,130,130,144,144,144,144,156,156,
-  156,156,147,147,147,147,148,148,148,148,153,153,153,153,149,149,
-  149,149, 94, 94, 94, 94, 85, 85, 85, 85,101,101,101,101, 96, 96,
-   96, 96,111,111,111,111,100,100,100,100,100, 36, 36, 36,108,108,
-  108,108,129,129,129,129,109,109,109,109,107,107,107,107,107,107,
-  107,  1,137,137,137,137,124,124,124,124,123,123,123,123,114,114,
-  114,114,102,102,102,102,126,126,126,126,142,142,142,142,125,125,
-  125,125,154,154,154,154,150,150,150,150,141,141,141,141,140,140,
-  140,140,121,121,121,121,133,133,133,133,134,134,134,134,138,138,
-  138,138,143,143,143,143,145,145,145,145, 63, 63, 63, 63, 80, 80,
-   80, 80,127,127,127,127,115,115,115,115,103,103,103,103,119,119,
-  119,119,146,146,146,146, 99, 99, 99, 99,136,139,  0,  0,155,155,
-  155,155,136,136,136,136, 17, 15, 15, 15,139,139,139,139,105,105,
-  105,105,  0,  0,  0,  1,  0,  0,  1,  1,131,131,131,131,151,151,
-  151,151,152,152,152,152,113,113,113,113,132,132,132,132, 15,  0,
-    0,  0,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  9,  9,  9, 10,
-    9, 11, 12, 13,  9,  9,  9, 14,  9,  9, 15,  9,  9,  9,  9,  9,
+   87, 87, 87,146,147,147,147,147,147,147,147,147,147, 87, 87, 87,
+   87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,148,148,148,148,
+  148, 87, 87, 87,149,149,149,149,150,151,152,152, 87, 87, 87, 87,
+  153,153,154,155,156,156,156,156,156,156,156,156,156,156,156,156,
+  156,156,156,156,156,156,156,156,156,156,157,157,157,157,156, 87,
+   87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+   87, 87, 87,158,159,160,161,162,162,162, 87, 87, 87, 87, 87, 87,
+   87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,163,164, 87, 87,
+   87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+   87, 87,165, 56, 56, 56,166,167, 51, 56, 56, 87, 56, 56, 56, 56,
+   56, 56, 56, 56,168,168,168,168,168,168, 87, 87, 87, 87, 87, 87,
+   87, 87,  2, 87,169, 87,170, 87, 87,171, 87, 87, 87, 87, 87, 87,
+   87, 87, 87, 33,172,172,173, 87, 87, 87, 87, 87, 56, 56, 56, 87,
+   89, 89, 87, 87, 56, 56, 56, 56,174, 87, 56, 56, 56, 56, 56, 56,
+   56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 87, 87, 87, 87,
+   87, 87, 87, 87, 62, 62, 62, 62, 62, 62, 62, 62, 87, 87, 87, 87,
+   87, 87, 87, 87, 62, 62, 62, 62, 62, 87, 87, 87, 87, 87, 87, 87,
+   87, 87, 87, 87, 62, 62, 62, 62, 62, 62, 62, 87, 87, 87, 87, 87,
+   87, 87, 87, 87, 56, 87,175,175,  0,  1,  2,  2,  0,  1,  2,  2,
+    2,  3,  4,  5,  0,  0,  0,  0,  1,  2,  1,  2,  0,  0,  3,  3,
+    4,  5,  4,  5,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  6,
+    0,  0,  7,  0,  8,  8,  8,  8,  8,  8,  8,  9, 10, 11, 11, 11,
+   11, 11, 12, 11, 13, 13, 13, 13, 13, 13, 13, 13, 14, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 15, 16, 16, 16, 16, 16, 17, 18, 18,
+   18, 18, 18, 18, 19, 20, 21, 21, 22, 23, 21, 24, 21, 21, 21, 21,
+   21, 25, 21, 21, 26, 26, 26, 26, 26, 21, 21, 21, 27, 27, 27, 27,
+   28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 26, 21, 21, 21, 21, 21,
+   21, 21, 31, 21, 32, 32, 32, 32, 32, 33, 34, 32, 35, 35, 35, 35,
+   35, 35, 35, 35, 36, 36, 36, 36, 36, 36, 36, 36, 37, 37, 37, 37,
+   37, 37, 37, 37, 38, 38, 38, 38, 38, 38, 38, 38, 39, 39, 39, 39,
+   39, 39, 39, 39, 40, 40, 40, 40, 40, 40, 40, 40, 41, 41, 41, 41,
+   41, 41, 41, 41, 42, 42, 42, 42, 42, 42, 42, 42, 43, 43, 43, 43,
+   43, 43, 43, 43, 44, 44, 44, 45, 44, 44, 44, 44, 46, 46, 46, 46,
+   46, 46, 46, 46, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+   47, 48, 47, 47, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 50, 50,
+   50, 50, 50, 51, 52, 52, 52, 52, 52, 52, 52, 52, 53, 53, 53, 53,
+   53, 53, 53, 53, 53, 53, 54, 54, 54, 54, 54, 54, 55, 55, 55, 55,
+   55, 55, 55, 55, 56, 56, 57, 57, 57, 57, 58, 57, 59, 59, 60, 61,
+   62, 62, 63, 63, 64, 64, 64, 64, 64, 64, 64, 64, 65, 66, 66, 66,
+   66, 66, 66, 66, 66, 66, 66, 55, 55, 55, 55, 55, 67, 67, 67, 67,
+   67, 68, 68, 68, 69, 69, 69, 69, 69, 69, 64, 64, 70, 70, 71, 71,
+   71, 71, 71, 71, 71, 71, 71,  8,  8,  8,  8,  8, 72, 72, 72, 72,
+   72, 72, 72, 72, 73, 73, 73, 73, 74, 74, 74, 74, 75, 75, 75, 75,
+   75, 76, 76, 76, 13, 50, 50, 50, 73, 77, 78, 79,  4,  4, 80,  4,
+    4, 81, 82, 83,  4,  4,  4, 84,  8,  8,  8,  8, 11, 11, 11, 11,
+   11, 11, 11, 11, 85,  0,  0,  0,  0,  0,  0, 86,  0,  4,  0,  0,
+    0,  8,  8,  8,  0,  0, 87, 88, 89,  0,  4,  4,  6,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 90, 90, 90, 90,
+   90, 90, 90, 90, 91, 91, 91, 91, 91, 91,  4,  4, 92, 92, 92, 92,
+   92, 92, 92, 92, 50, 50, 50, 93, 93, 93, 93, 93, 53, 53, 53, 53,
+   53, 53, 13, 13, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+   94, 94, 94,  0, 95,  0, 96, 97, 98, 99, 99, 99, 99,100,101,102,
+  102,102,102,103,104,104,104,105, 52, 52, 52, 52, 52,  0,104,104,
+    0,  0,  0,102, 52, 52,  0,  0,  0,  0, 52,106,  0,  0,  0,  0,
+    0,102,102,107,102,102,102,102,102,108,  0,  0, 94, 94, 94, 94,
+    0,  0,  0,  0,109,109,109,109,109,109,109,109,109,109,109,109,
+  109,110,110,110,111,111,111,111,111,111,111,111,111,111,111,111,
+   13, 13, 13, 13, 13, 13,112,112,112,112,112,112,  0,  0,113,  4,
+    4,  4,  4,  4,114,  4,  4,  4,  4,  4,  4,  4,115,115,115,  0,
+  116,116,116,116,117,117,117,117,117,117, 32, 32,118,118,119,120,
+  120,120, 52, 52,121,121,121,121,122,121, 49, 49,123,123,123,123,
+  123,123, 49, 49,124,124,124,124,124,124,125,125, 53, 53, 53,  4,
+    4,126,127, 54, 54, 54, 54, 54,125,125,125,125,128,128,128,128,
+  128,128,128,128,  4,129, 18, 18, 18, 21, 21, 21, 21, 21, 21, 21,
+   21, 21, 21, 21, 21, 21, 21,130, 21, 21, 21, 21,  8,  0,131,  0,
+    0,  0,  0, 21, 21, 21, 21, 21, 21, 21, 21,132,  0,  0,  1,  2,
+    1,  2,133,101,102,134, 52, 52, 52, 52,  0,  0,135,135,135,135,
+  135,135,135,135,  0,  0,  0,  0, 11, 11, 11, 11, 11,  0, 11, 11,
+   11,  0,  0,136,137,137,138,138,138,138,139,  0,140,140,140,141,
+  141,142,142,142,143,143,144,144,144,144,144,144,145,145,145,145,
+  145,146,146,146,147,147,147,148,148,148,148,148,149,149,149,150,
+  150,150,150,151,151,151,151,151,151,151,151,151,152,152,152,152,
+  152,152,152,152,153,153,153,153,154,154,155,155,156,156,156,156,
+  156,156,157,157,158,158,159,159,159,159,159,159,160,160,161,161,
+  161,161,161,161,162,162,162,162,162,162,163,163,164,164,164,164,
+  165,165,165,165,166,166,166,166,167,167,168,168,169,169,169,169,
+  169,169,169,169,170,170,170,170,170,170,170,170,171,171,171,171,
+  171,171,171,171,172,172,172,172,172,172,172,172,173,173,173,173,
+  173,173,173,173,174,174,174,175,175,175,175,176,176,176,176,177,
+  177,177,178,178,179,179,179,179,179,179,179,179,180,180,180,180,
+  180,181,181,181,182,182,182,182,182,183,183,183,184,184,184,184,
+  184,184,185, 43,186,186,186,186,186,186,186,186,187,187,187,188,
+  188,188,188,188,189,189,189,190,189,189,189,189,191,191,191,191,
+  191,191,191,191,192,192,192,192,192,192,192,192,193,193,193,193,
+  193,193,193,193,194,194,194,194,194,194, 66, 66,195,195,195,195,
+  195,195,195,195,196,196,196,196,196,196,196,196,197,197,197,197,
+  197,197,197,197,198,198,198,198,198,198,198,198,199,199,199,199,
+  199,199,199,199,200,200,200,200,200,200,200,200,201,201,201,201,
+  201,202,202,202,202,202,202, 55,203,203,203,203,204,204,204,204,
+  204,204,204,205,205,205,205,205,205,205,205,205,206,206,206,206,
+  206,206,207,207,207,207,207,207,207,207,207,207,208,208,208,208,
+  208,208,208,208,110,110,110,110, 39, 39, 39, 39,209,209,209,209,
+  209,209,209,209,210,210,210,210,210,210,210,210,211,211,211,211,
+  211,211,211,211,212,212,212,212,212,212,212,212,112,112,112,112,
+  112,112,112,112,112,112,112,112,213,213,213,214,214,214,214,214,
+  214,215,215,215,216,216,216,216,216,216,216,216,217,217,217,217,
+  217,217,217,217,218,218,218,218,218,218,218,218,218,218,218,218,
+  218,218,219, 94,220,220,220,220,220,220,220,220,221,221,221,221,
+  221,221,221,221,102,102,102,102,102,102,102,102,222, 99, 99, 99,
+   99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,102,102,
+  102, 99,223,224,224,224,224,224,224,224,224,224,225,225,225,225,
+  225,225,225,225,225,225,  0,  0,  0,  0,  0,  0,  8,  8,  8,  8,
+    8,  0,  0,  0,  0,  0,  0,  0,  0,  0,226,227,228,  0,229,  0,
+    0,  0,  0,  0,230,230,230,230,230,230,230,230, 91, 91, 91, 91,
+   91, 91, 91, 91,231,231,231,231,231,231,231,231,232,232,232,232,
+  233,233,233,233,234,234,234,234,234,234,234,234,235,235,235,235,
+  235,235,235,235,236,  0,  0,  0,  0,  0,  0,  0,  8,  8,  8,  8,
+    8,  8,  8,  8,  0,  0,  0,  0,  1,  2,  2,  2,  2,  2,  3,  0,
+    0,  0,  4,  0,  2,  2,  2,  2,  2,  3,  2,  2,  2,  2,  5,  0,
+    2,  5,  6,  0,  7,  7,  7,  7,  8,  9,  8, 10,  8, 11,  8,  8,
+    8,  8,  8,  8, 12, 13, 13, 13, 14, 14, 14, 14, 14, 15, 14, 14,
+   16, 17, 17, 17, 17, 17, 17, 17, 18, 19, 19, 19, 19, 19, 19, 19,
+   20, 21, 20, 22, 20, 20, 23, 23, 20, 20, 20, 20, 22, 20, 24,  7,
+    7, 25, 20, 20, 26, 20, 20, 20, 20, 20, 20, 21, 27, 27, 27, 27,
+   28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31,
+   32, 20, 20, 20, 33, 33, 33, 33, 34, 35, 33, 33, 33, 36, 33, 33,
+   37, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 39, 40, 40, 40, 40,
+   41, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 44,
+   45, 45, 45, 45, 46, 46, 46, 46, 46, 46, 46, 47, 48, 48, 48, 48,
+   49, 49, 49, 49, 49, 50, 51, 49, 52, 52, 52, 52, 53, 53, 53, 53,
+   53, 53, 54, 53, 55, 55, 55, 55, 56, 56, 56, 56, 57, 57, 57, 57,
+   58, 58, 58, 58, 59, 59, 59, 59, 60, 60, 60, 60, 60, 60, 61, 62,
+   63, 63, 63, 63, 64, 64, 64, 64, 64, 65,  0,  0, 66, 66, 66, 66,
+   67, 67, 67, 67, 68, 68, 68, 68, 69, 70, 71, 71, 71, 71, 71, 71,
+   72, 72, 72, 72, 73, 73, 73, 73, 74, 74, 74, 74, 75, 75, 75, 75,
+   76, 76, 76, 76, 77, 77, 77, 77, 78, 78, 78, 78, 79, 79, 79, 79,
+   80, 80, 80, 80, 81, 81, 81, 81, 82,  7,  7,  7, 83,  7, 84, 85,
+    0, 84, 86,  0,  2, 87, 88,  2,  2,  2,  2, 89, 90, 87, 91,  2,
+    2,  2, 92,  2,  2,  2,  2, 93,  0,  0,  0, 86,  1,  0,  0, 94,
+    0, 95, 96,  0,  4,  0,  0,  0,  0,  0,  0,  4, 97, 97, 97, 97,
+   98, 98, 98, 98, 13, 13, 13, 13, 99, 99, 99, 99,100,100,100,100,
+    0,101,  0,  0,102,100,103,104,  0,  0,100,  0,105,106,106,106,
+  106,106,106,106,106,106,107,105,108,109,109,109,109,109,109,109,
+  109,109,110,108,111,111,111,111,112, 55, 55, 55, 55, 55, 55,113,
+  109,109,109,110,109,109,  0,  0,114,114,114,114,115,115,115,115,
+  116,116,116,116,117,117,117,117, 96,  2,  2,  2,  2,  2, 94,  2,
+  118,118,118,118,119,119,119,119,120,120,120,120,121,121,121,121,
+  121,121,121,122,123,123,123,123,124,124,124,124,124,124,124,125,
+  126,126,126,126,127,127,127,127,128,128,128,128,  2,  2,  3,  2,
+    2,129,130,  0,131,131,131,131,132, 17, 17, 18, 20, 20, 20,133,
+    7,  7,  7,134, 20, 20, 20, 23,  0,135,109,109,109,109,109,136,
+  137,137,137,137,  0,  0,  0,138,139,139,139,139,140,140,140,140,
+   84,  0,  0,  0,141,141,141,141,142,142,142,142,143,143,143,143,
+  144,144,144,144,145,145,145,145,146,146,146,146,147,147,147,147,
+  148,148,148,148,149,149,149,149,150,150,150,150,151,151,151,151,
+  152,152,152,152,153,153,153,153,154,154,154,154,155,155,155,155,
+  156,156,156,156,157,157,157,157,158,158,158,158,159,159,159,159,
+  160,160,160,160,161,161,161,161,162,162,162,162,163,163,163,163,
+  164,164,164,164,165,165,165,165,166,166,166,166,167,167,167,167,
+  168,168,168,168,169,169,169,169,170,170,170,170,171,171,171,171,
+  172,172,172,172,173,173,173,173,174,174,174,174,175,175,175,175,
+  176,176,176,176,177,177,177,177,178,178,178,178,179,179,179,179,
+  180,180,180,180,181,181,181,181,182,182,182,182,183,183,183,183,
+  184,184,184,184,185,185,185,185,186, 45, 45, 45,187,187,187,187,
+  188,188,188,188,189,189,189,189,190,190,190,190,190,190,191,190,
+  192,192,192,192,193,193,193,193,194,194,194,194,195,195,195,195,
+  196,196,196,196,197,197,197,197,198,198,198,198,199,199,199,199,
+  200,200,200,200,201,201,201,201,202,202,202,202,203,203,203,203,
+  204,204,204,204,205,205,205,205,206,206,206,206,207,207,207,207,
+  208,208,208,208,209,209,209,209,210,210,210,210,211,211,211,211,
+  212,212,212,212,213,213,213,213,214,214,214,214,215,215,215,215,
+  216,216,216,216,217,217,217,217,218,218,218,218,219,219,219,219,
+  220,221,221,221,222,222,222,222,221,221,221,221,223,106,106,106,
+  106,109,109,109,224,224,224,224,225,225,225,225,  0,226, 86,  0,
+    0,  0,226,  7, 82,138,  7,  0,  0,  0,227, 86,228,228,228,228,
+  229,229,229,229,230,230,230,230,231,231,231,231,232,232,232,232,
+  233,233,233,233,234,  0,  0,  0,  0,  0,  0,  0,  0, 19, 19, 19,
+   19, 19, 19, 19, 19, 19, 19,  0,  0,  0, 19,  0, 19,  0,  0,  0,
+    0,  0, 26, 26,  1,  1,  1,  1,  9,  9,  9,  9,  0,  9,  9,  9,
+    9,  9,  0,  9,  9,  0,  9,  0,  9,  9, 55, 55, 55, 55, 55, 55,
+    6,  6,  6,  6,  6,  1,  1,  6,  6,  4,  4,  4,  4,  4,  4,  4,
+    4, 14, 14, 14, 14, 14, 14, 14,  3,  3,  3,  3,  3,  0,  3,  3,
+    0,  3,  3,  3,  3,  3,  3,  0,  3,  3,  3,  1,  1,  1,  3,  3,
+    1,  3,  3,  3, 37, 37, 37, 37, 38, 38, 38, 38, 64, 64, 64, 64,
+   90, 90, 90, 90, 95, 95, 95, 95,  3,  3,  0,  3,  7,  7,  7,  7,
+    7,  1,  1,  1,  1,  7,  7,  7,  0,  0,  7,  7,  5,  5,  5,  5,
+   11, 11, 11, 11, 10, 10, 10, 10, 21, 21, 21, 21, 22, 22, 22, 22,
+   23, 23, 23, 23, 16, 16, 16, 16, 20, 20, 20, 20, 36, 36, 36, 36,
+   24, 24, 24, 24, 24, 24, 24,  0, 18, 18, 18, 18, 25, 25, 25, 25,
+   25,  0,  0,  0,  0, 25, 25, 25, 33, 33, 33, 33,  8,  8,  8,  8,
+    8,  8,  8,  0, 12, 12, 12, 12, 30, 30, 30, 30, 29, 29, 29, 29,
+   28, 28, 28, 28, 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, 35,  0,
+    0,  0, 35, 35, 45, 45, 45, 45, 44, 44, 44, 44, 44,  0,  0,  0,
+   43, 43, 43, 43, 46, 46, 46, 46, 31, 31, 31, 31, 32, 32,  0,  0,
+   32,  0, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 52, 52, 52, 52,
+   58, 58, 58, 58, 54, 54, 54, 54, 91, 91, 91, 91, 62, 62, 62, 62,
+   76, 76, 76, 76, 93, 93, 93, 93, 70, 70, 70, 70, 73, 73, 73, 73,
+    1,  1,  1,  0,  1,  0,  1,  1,  1,  0,  0,  0,  0,  1,  0,  0,
+    1,  1,  0,  0, 19, 19,  9,  9,  9,  9,  9,  6, 19,  9,  9,  9,
+    9,  9, 19, 19,  9,  9,  9, 19,  6, 19, 19, 19, 19, 19, 19,  9,
+    0,  0,  0, 19,  0,  0,  9,  0,  0,  0, 19, 19, 27, 27, 27, 27,
+   56, 56, 56, 56, 61, 61, 61, 61, 13, 13, 13, 13,  0, 13,  0, 13,
+    0, 13, 13, 13, 13, 13,  1,  1,  1,  1, 12, 12,  0, 15, 15, 15,
+   15, 15, 15, 15, 15,  1,  1,  0,  0, 17, 17, 17, 17, 17, 17, 17,
+   17, 17, 17,  0, 26, 26, 26, 26, 26, 12, 12, 12, 12, 12, 12,  0,
+   39, 39, 39, 39, 86, 86, 86, 86, 77, 77, 77, 77, 79, 79, 79, 79,
+   60, 60, 60, 60, 65, 65, 65, 65, 75, 75, 75, 75, 69, 69, 69, 69,
+   69, 69,  0, 69, 74, 74, 74, 74, 84, 84, 84, 84, 84, 84, 84,  0,
+   68, 68, 68, 68, 92, 92, 92, 92, 87, 87, 87, 87, 19,  9, 19, 19,
+   19, 19,  0,  0,  2,  2,  2,  2, 19, 19, 19,  4,  3,  3,  0,  0,
+    1,  1,  6,  6,  0,  0, 17, 17, 17, 17,  0,  0, 49, 49, 49, 49,
+    0,  1,  1,  1, 71, 71, 71, 71, 67, 67, 67, 67, 42, 42, 42, 42,
+   41, 41, 41, 41,118,118,118,118, 53, 53, 53, 53, 59, 59, 59, 59,
+   40, 40, 40, 40, 51, 51, 51, 51, 50, 50, 50, 50,135,135,135,135,
+  106,106,106,106,104,104,104,104,161,161,161,161,110,110,110,110,
+   47, 47, 47, 47, 81, 81, 81, 81,120,120,120,120,116,116,116,116,
+  128,128,128,128, 66, 66, 66, 66, 72, 72, 72, 72, 98, 98, 98, 98,
+   97, 97, 97, 97, 57, 57, 57, 57, 88, 88, 88, 88,117,117,117,117,
+  112,112,112,112, 78, 78, 78, 78, 83, 83, 83, 83, 82, 82, 82, 82,
+  122,122,122,122, 89, 89, 89, 89,130,130,130,130,144,144,144,144,
+  156,156,156,156,147,147,147,147,148,148,148,148,158,158,158,158,
+  153,153,153,153,149,149,149,149, 94, 94, 94, 94, 85, 85, 85, 85,
+  101,101,101,101, 96, 96, 96, 96,111,111,111,111,100,100,100,100,
+  100, 36, 36, 36,108,108,108,108,129,129,129,129,109,109,109,109,
+  107,107,107,107,107,107,107,  1,137,137,137,137,124,124,124,124,
+  123,123,123,123,114,114,114,114,102,102,102,102,126,126,126,126,
+  142,142,142,142,125,125,125,125,154,154,154,154,150,150,150,150,
+  141,141,141,141,140,140,140,140,121,121,121,121,133,133,133,133,
+  134,134,134,134,138,138,138,138,143,143,143,143,145,145,145,145,
+   63, 63, 63, 63,157,157,157,157, 80, 80, 80, 80,127,127,127,127,
+  115,115,115,115,159,159,159,159,103,103,103,103,119,119,119,119,
+  146,146,146,146, 99, 99, 99, 99,136,139, 13, 13,155,155,155,155,
+  136,136,136,136, 17, 15, 15, 15,139,139,139,139,105,105,105,105,
+    0,  0,  0,  1,  0,  0,  1,  1,131,131,131,131,151,151,151,151,
+  160,160,160,160,152,152,152,152,113,113,113,113,132,132,132,132,
+   15,  0,  0,  0,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  9,  9,
+    9, 10,  9, 11, 12, 13,  9,  9,  9, 14,  9,  9, 15,  9,  9,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 16, 17,
-    9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 18, 19, 20,  9, 21,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+   16, 17,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 18, 19, 20,  9,
+   21,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 22,  9,  9,  9,  9,  9,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 22,  9,  9,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
@@ -6371,60 +6478,61 @@ _hb_ucd_u8[13344] =
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 23, 24,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  3,  4,
-    5,  6,  7,  8,  9, 10, 11, 12,  0,  0, 13, 14, 15, 16, 17, 18,
-   19, 20, 21, 22,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0, 23,  0,  0, 24, 25, 26, 27, 28, 29, 30,  0,  0,
-   31, 32,  0, 33,  0, 34,  0, 35,  0,  0,  0,  0, 36, 37, 38, 39,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0, 40,  0,  0,  0,  0,  0,  0,  0,  0,  0, 41, 42,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+   23, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,
+    3,  4,  5,  6,  7,  8,  9, 10, 11, 12,  0,  0, 13, 14, 15, 16,
+   17, 18, 19, 20, 21, 22,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0, 23,  0,  0, 24, 25, 26, 27, 28, 29, 30,
+    0,  0, 31, 32,  0, 33,  0, 34,  0, 35,  0,  0,  0,  0, 36, 37,
+   38, 39,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0, 40,  0,  0,  0,  0,  0,  0,  0,  0,  0, 41, 42,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0, 43, 44,  0, 45,  0,  0,  0,  0,  0,  0, 46, 47,  0,  0,
-    0,  0,  0, 48,  0, 49,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0, 50, 51,  0,  0,  0, 52,  0,  0, 53,  0,  0,  0,
-    0,  0,  0,  0, 54,  0,  0,  0,  0,  0,  0,  0, 55,  0,  0,  0,
-    0,  0,  0,  0, 56,  0,  0,  0,  0,  0,  0,  0,  0, 57,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0, 58, 59, 60, 61, 62, 63, 64, 65,  0,  0,  0,  0,
-    0,  0, 66,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0, 43, 44,  0, 45,  0,  0,  0,  0,  0,  0, 46, 47,
+    0,  0,  0,  0,  0, 48,  0, 49,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0, 50, 51,  0,  0,  0, 52,  0,  0, 53,  0,
+    0,  0,  0,  0,  0,  0, 54,  0,  0,  0,  0,  0,  0,  0, 55,  0,
+    0,  0,  0,  0,  0,  0, 56,  0,  0,  0,  0,  0,  0,  0,  0, 57,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0, 58, 59, 60, 61, 62, 63, 64, 65,  0,  0,
+    0,  0,  0,  0, 66,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-   67, 68,  0, 69, 70,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-   71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86,
-   87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,100,101,102,
-  103,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,104,  0,  0,  0,  0,  0,  0,105,106,  0,107,  0,  0,  0,
-  108,  0,109,  0,110,  0,111,112,113,  0,114,  0,  0,  0,115,  0,
-    0,  0,116,  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,117,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,118,119,120,121,  0,122,123,124,125,126,  0,127,
+    0,  0, 67, 68,  0, 69, 70,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84,
+   85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,100,
+  101,102,103,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,104,  0,  0,  0,  0,  0,  0,105,106,  0,107,  0,
+    0,  0,108,  0,109,  0,110,  0,111,112,113,  0,114,  0,  0,  0,
+  115,  0,  0,  0,116,  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,117,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,118,119,120,121,  0,122,123,124,125,126,
+    0,127,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-  128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
-  144,145,146,147,148,149,150,151,152,153,154,155,156,157,  0,  0,
-    0,158,159,160,161,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,162,163,  0,  0,  0,  0,  0,
-    0,  0,164,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,128,129,130,131,132,133,134,135,136,137,138,139,140,141,
+  142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,
+    0,  0,  0,158,159,160,161,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,162,163,  0,  0,  0,
+    0,  0,  0,  0,164,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,165,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,166,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,167,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,165,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,166,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,167,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,168,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,168,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,169,170,  0,  0,  0,  0,171,172,  0,  0,  0,
-  173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,
-  189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,
-  205,206,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  3,  4,
+    0,  0,  0,  0,  0,  0,  0,169,170,  0,  0,  0,  0,171,172,  0,
+    0,  0,173,174,175,176,177,178,179,180,181,182,183,184,185,186,
+  187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,
+  203,204,205,206,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,
+    3,  4,
 };
 static const uint16_t
-_hb_ucd_u16[4848] =
+_hb_ucd_u16[4888] =
 {
      0,   0,   1,   2,   3,   4,   5,   6,   0,   0,   7,   8,   9,  10,  11,  12,
     13,  13,  13,  14,  15,  13,  13,  16,  17,  18,  19,  20,  21,  22,  13,  23,
@@ -6434,322 +6542,332 @@ _hb_ucd_u16[4848] =
     13,  13,  13,  35,   9,  42,  11,  11,  43,  44,  32,  45,  46,  47,  47,  48,
     49,  50,  47,  47,  51,  32,  52,  53,  47,  47,  47,  47,  47,  54,  55,  56,
     57,  58,  47,  32,  59,  47,  47,  47,  47,  47,  60,  53,  61,  47,  62,  63,
-    47,  64,  65,  66,  47,  67,  47,  47,  47,  47,  47,  47,  47,  68,  69,  32,
-    70,  47,  47,  71,  72,  73,  74,  75,  76,  47,  47,  77,  78,  79,  80,  81,
-    82,  47,  47,  83,  84,  85,  86,  87,  82,  47,  47,  77,  88,  47,  80,  89,
-    90,  47,  47,  91,  92,  93,  80,  94,  95,  47,  47,  96,  97,  98,  99, 100,
-   101,  47,  47, 102, 103, 104,  80, 105, 106,  47,  47,  91, 107, 108,  80, 109,
-   110,  47,  47, 111, 112, 113,  80, 114,  90,  47,  47,  47, 115, 116,  99, 117,
-    47,  47,  47, 118, 119, 120,  66,  66,  47,  47,  47, 121, 122, 123,  47,  47,
-   124, 125, 126, 127,  47,  47,  47, 128, 129,  32,  32, 130, 131, 132,  66,  66,
-    47,  47, 133, 134, 120, 135, 136, 137, 138, 139,   9,   9,   9,  11,  11, 140,
-    47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47, 141, 142, 143,
-    47, 144,   9,   9,   9,   9,   9, 145, 146,  47,  47,  47,  47,  47,  47,  47,
-    47,  47,  47,  47,  47,  47, 147,  47, 148, 149,  47,  47,  47,  47, 150, 151,
-    47, 152,  47, 153,  47, 152,  47, 152,  47,  47,  47, 154, 155, 156, 157, 143,
-   158, 157,  47,  47, 159,  47,  47,  47, 160,  47, 161,  47,  47,  47,  47,  47,
-    47,  47, 162, 163, 164,  47,  47,  47,  47,  47,  47,  47,  47, 165, 144, 144,
-    47, 166,  47,  47,  47, 167, 168, 169, 157, 157, 170, 171,  32,  32,  32,  32,
-   172,  47,  47, 173, 174, 120, 175, 176, 177,  47, 178,  61,  47,  47, 179, 180,
-    47,  47, 181, 182, 183,  61,  47, 184,  11,   9,   9,   9,  66, 185, 186, 187,
-    11,  11, 188,  27,  27,  27, 189, 190,  11, 191,  27,  27,  32,  32,  32,  32,
-    13,  13,  13,  13,  13,  13,  13,  13,  13, 192,  13,  13,  13,  13,  13,  13,
-   193, 193, 193, 193, 193, 194, 193,  11, 195, 195, 195, 196, 197, 198, 198, 197,
-   199, 200, 201, 202, 203, 204, 205, 206, 207,  27, 208, 208, 208, 209, 210,  32,
-   211, 212, 213, 214, 215, 143, 216, 216, 217, 218, 219, 144, 220, 221, 144, 222,
-   223, 223, 223, 223, 223, 223, 223, 223, 224, 144, 225, 144, 144, 144, 144, 226,
-   144, 227, 223, 228, 144, 229, 230, 144, 144, 144, 144, 144, 144, 144, 143, 143,
-   143, 231, 144, 144, 144, 144, 232, 143, 144, 144, 144, 144, 144, 144, 144, 144,
-   144, 144, 144, 233, 234, 144, 144, 235, 144, 144, 144, 144, 144, 144, 236, 144,
-   144, 144, 144, 144, 144, 144, 237, 238, 143, 239, 144, 144, 240, 223, 241, 223,
-   242, 243, 223, 223, 223, 244, 223, 245, 144, 144, 144, 223, 246, 144, 144, 144,
-     9,   9,   9,  11,  11,  11, 247, 248,  13,  13,  13,  13,  13,  13, 249, 250,
-    11,  11,  11,  47,  47,  47, 251, 252,  47,  47,  47,  47,  47,  47,  32,  32,
-   253, 254, 255, 256, 257, 258,  66,  66, 259, 260, 261, 262, 263,  47,  47,  47,
-    47, 264, 146,  47,  47,  47,  47, 265,  47, 266,  47,  47, 144, 144, 144,  47,
-   144, 144, 267, 144, 268, 269, 144, 144, 267, 144, 144, 269, 144, 144, 144, 144,
-    47,  47,  47,  47, 144, 144, 144, 144,  47, 270,  47,  47,  47,  47,  47,  47,
-    47, 144, 144, 144, 144,  47,  47, 184, 271,  47,  61,  47,  13,  13, 272, 273,
-    13, 274,  47,  47,  47,  47, 275, 276,  31, 277, 278, 279,  13,  13,  13, 280,
-   281, 282, 283, 284, 285,  11,  11, 286, 287,  47, 288, 289,  47,  47,  47, 290,
-   291,  47,  47, 292, 293, 157,  32, 294,  61,  47, 295,  47, 296, 297,  47,  47,
-    70,  47,  47, 298, 299, 300, 301,  61,  47,  47, 302, 303, 304, 305,  47, 306,
-    47,  47,  47, 307,  58, 308, 309, 310,  47,  47,  47,  11,  11, 311, 312,  11,
-    11,  11,  11,  11,  47,  47, 313, 157, 314, 314, 314, 314, 314, 314, 314, 314,
-   315, 315, 315, 315, 315, 315, 315, 315,  11, 316, 317,  47,  47,  47,  47,  47,
-    47,  47,  47, 318,  31, 319,  47,  47,  47,  47,  47, 320, 321,  47,  47,  47,
-    47,  47,  47,  47,  47,  47,  47, 322,  32, 323,  32, 324, 325, 326, 327,  47,
-    47,  47,  47,  47,  47,  47,  47, 328, 329,   2,   3,   4,   5, 330, 331, 332,
-    47, 333,  47,  47,  47,  47, 334, 335, 336, 143, 143, 337, 216, 216, 216, 338,
-   339, 144, 144, 144, 144, 144, 144, 340, 341, 341, 341, 341, 341, 341, 341, 341,
-    47,  47,  47,  47,  47,  47, 342, 143,  47,  47, 343,  47, 344,  47,  47,  60,
-    47, 345,  47,  47,  47, 346, 216, 216,   9,   9, 145,  11,  11,  47,  47,  47,
-    47,  47, 157,   9,   9, 145,  11,  11,  47,  47,  47,  47,  47,  47, 345,  66,
-    47,  47,  47,  47,  47, 347,  47, 348,  47,  47, 349, 143, 143, 143,  47, 350,
-    47, 351,  47, 345,  66,  66,  66,  66,  47,  47,  47, 352, 143, 143, 143, 143,
-   353,  47,  47, 354, 143,  66,  47, 355,  47, 356, 143, 143, 357,  47, 358,  66,
-    47,  47,  47, 359,  47, 360,  47, 360,  47, 359, 142, 143, 143, 143, 143, 143,
-     9,   9,   9,   9,  11,  11,  11, 361,  47,  47, 362, 157, 157, 157, 157, 157,
-   143, 143, 143, 143, 143, 143, 143, 143,  47,  47, 363,  47,  47,  47,  47,  47,
-    47, 356, 364,  47,  60, 365,  66,  66,  47,  47,  47,  47, 366, 143,  47,  47,
-   367,  47,  47, 354, 368, 369, 370, 371, 177,  47,  47, 372, 373,  47,  47, 157,
-    95,  47, 374, 375, 376,  47,  47, 377, 177,  47,  47, 378, 379, 380, 381, 143,
-    47,  47, 382, 383,  32,  32,  32,  32,  47,  47, 359,  47,  47, 384, 169, 157,
-    90,  47,  47, 111, 385, 386, 387,  32,  47,  47,  47, 388, 389, 390,  47,  47,
-    47,  47,  47, 391, 392, 157, 157, 157,  47,  47, 393, 394, 395, 396,  32,  32,
-    47,  47,  47, 397, 398, 157,  66,  66,  47,  47, 399, 400, 157, 157, 157, 157,
-    47, 141, 401, 402, 144, 144, 144, 144,  47,  47, 382, 403,  66,  66,  66,  66,
-     9,   9,   9,   9,  11,  11, 126, 404,  47,  47,  47, 405, 406, 157, 157, 157,
-    47,  47,  47,  47,  47, 407, 408, 409, 410,  47,  47, 411, 412, 413,  47,  47,
-   414, 415,  66,  66,  47,  47,  47,  47,  47,  47, 393, 416, 417, 126, 143, 418,
-    47, 152, 419, 420,  32,  32,  32,  32,  47,  47,  47, 353, 421, 157,  47,  47,
-   422, 423, 157, 157, 157, 157, 157, 157,  47,  47,  47,  47,  47,  47,  47, 424,
-    47,  47,  47,  47, 143, 425, 426, 427, 216, 216, 216, 216, 216, 216, 216,  66,
-    47,  47,  47, 205, 205, 205, 205, 205,  47,  47,  47,  47,  47,  47, 300,  66,
-    47,  47,  47,  47,  47,  47,  47, 428,  47,  47,  47, 429, 430, 431, 432,  47,
-     9,   9,   9,   9,   9,   9,  11,  11, 143, 433,  66,  66,  66,  66,  66,  66,
-    47,  47,  47,  47, 384, 434, 409, 409, 435, 436,  27,  27,  27,  27, 437, 409,
-    47, 438, 205, 205, 205, 205, 205, 205, 144, 144, 144, 144, 144, 144, 439, 440,
-   441, 144, 442, 144, 144, 144, 144, 144, 144, 144, 144, 144, 443, 144, 144, 144,
-     9, 444,  11, 445, 446,  11, 193,   9, 447, 448,   9, 449,  11,   9, 444,  11,
-   445, 446,  11, 193,   9, 447, 448,   9, 449,  11,   9, 444,  11, 445, 446,  11,
-   193,   9, 447, 448,   9, 449,  11,   9, 444,  11, 193,   9, 450, 451, 452, 453,
-    11, 454,   9, 455, 456, 457, 458,  11, 459,   9, 460,  11, 461, 157, 157, 157,
-    32,  32,  32, 462,  32,  32, 463, 464, 465, 466,  32,  32,  32,  32,  32,  32,
-    32,  32,  32,  32,  32,  32,  32,  32,  47,  47,  47, 467, 468, 144, 144, 144,
-    47,  47,  47,  47,  47,  47, 469, 470,  47,  47,  47,  47, 349,  32,  32,  32,
-     9,   9, 447,  11, 471, 300,  66,  66, 143, 143, 472, 473, 143, 143, 143, 143,
-   143, 143, 474, 143, 143, 143, 143, 143,  47,  47,  47,  47,  47,  47,  47, 223,
-   475, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 476,
-   144, 144, 144, 144, 144, 144, 144, 157, 205, 205, 205, 205, 205, 205, 205, 205,
+    47,  64,  65,  66,  47,  67,  47,  47,  68,  69,  47,  47,  70,  32,  71,  32,
+    72,  47,  47,  73,  74,  75,  76,  77,  78,  47,  47,  79,  80,  81,  82,  83,
+    84,  47,  47,  85,  86,  87,  88,  89,  84,  47,  47,  79,  90,  47,  82,  91,
+    92,  47,  47,  93,  94,  95,  82,  96,  97,  47,  47,  98,  99, 100, 101, 102,
+   103,  47,  47, 104, 105, 106,  82, 107, 108,  47,  47,  93, 109, 110,  82, 111,
+   112,  47,  47, 113, 114, 115,  82, 116,  92,  47,  47,  47, 117, 118, 101, 119,
+    47,  47,  47, 120, 121, 122,  66,  66,  47,  47,  47, 123, 124, 125,  47,  47,
+   126, 127, 128, 129,  47,  47,  47, 130, 131,  32,  32, 132, 133, 134,  66,  66,
+    47,  47, 135, 136, 122, 137, 138, 139, 140, 141,   9,   9,   9,  11,  11, 142,
+    47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47, 143, 144, 145,
+    47, 146,   9,   9,   9,   9,   9, 147, 148,  47,  47,  47,  47,  47,  47,  47,
+    47,  47,  47,  47,  47,  47, 149,  47, 150, 151,  47,  47,  47,  47, 152, 153,
+    47, 154,  47, 155,  47, 156,  47, 156,  47,  47,  47, 157, 158, 159, 160, 145,
+   161, 160,  47,  47, 162,  47,  47,  47, 163,  47, 164,  47,  47,  47,  47,  47,
+    47,  47, 165, 166, 167,  47,  47,  47,  47,  47,  47,  47,  47, 168, 146, 146,
+    47, 169,  47,  47,  47, 170, 171, 172, 160, 160, 173, 174,  32,  32,  32,  32,
+   175,  47,  47, 176, 177, 122, 178, 179, 180,  47, 181,  61,  47,  47, 182, 183,
+    47,  47, 184, 185, 186,  61,  47, 187,  11,   9,   9,   9,  66, 188, 189, 190,
+    11,  11, 191,  27,  27,  27, 192, 193,  11, 194,  27,  27,  32,  32,  32,  32,
+    13,  13,  13,  13,  13,  13,  13,  13,  13, 195,  13,  13,  13,  13,  13,  13,
+   196, 196, 196, 196, 196, 197, 196,  11, 198, 198, 198, 199, 200, 201, 201, 200,
+   202, 203, 204, 205, 206, 207, 208, 209, 210,  27, 211, 211, 211, 212, 213,  32,
+   214, 215, 216, 217, 218, 145, 219, 219, 220, 221, 222, 146, 223, 224, 146, 225,
+   226, 226, 226, 226, 226, 226, 226, 226, 227, 146, 228, 146, 146, 146, 146, 229,
+   146, 230, 226, 231, 146, 232, 233, 146, 146, 146, 146, 146, 146, 146, 145, 145,
+   145, 234, 146, 146, 146, 146, 235, 145, 146, 146, 146, 146, 146, 146, 146, 146,
+   146, 146, 146, 236, 237, 146, 146, 238, 146, 146, 146, 146, 146, 146, 239, 146,
+   146, 146, 146, 146, 146, 146, 240, 241, 145, 242, 146, 146, 243, 226, 244, 226,
+   245, 246, 226, 226, 226, 247, 226, 248, 146, 146, 146, 226, 249, 146, 146, 146,
+     9,   9,   9,  11,  11,  11, 250, 251,  13,  13,  13,  13,  13,  13, 252, 253,
+    11,  11,  11,  47,  47,  47, 254, 255,  47,  47,  47,  47,  47,  47,  32,  32,
+   256, 257, 258, 259, 260, 261, 262, 262, 263, 264, 265, 266, 267,  47,  47,  47,
+    47, 268, 148,  47,  47,  47,  47, 269,  47, 270,  47,  47, 146, 146, 146,  47,
+   146, 146, 271, 146, 272, 273, 146, 146, 271, 146, 146, 273, 146, 146, 146, 146,
+    47,  47,  47,  47, 146, 146, 146, 146,  47, 274,  47,  47,  47,  47,  47,  47,
+    47, 146, 146, 146, 146,  47,  47, 187, 275,  47,  61,  47,  13,  13, 276, 277,
+    13, 278,  47,  47,  47,  47, 279, 280,  31, 281, 282, 283,  13,  13,  13, 284,
+   285, 286, 287, 288, 289, 290,  11, 291, 292,  47, 293, 294,  47,  47,  47, 295,
+   296,  47,  47, 297, 298, 160,  32, 299,  61,  47, 300,  47, 301, 302,  47,  47,
+    72,  47,  47, 303, 304, 305, 306,  61,  47,  47, 307, 308, 309, 310,  47, 311,
+    47,  47,  47, 312,  58, 313, 314, 315,  47,  47,  47,  11,  11, 316, 317,  11,
+    11,  11,  11,  11,  47,  47, 318, 160, 319, 319, 319, 319, 319, 319, 319, 319,
+   320, 320, 320, 320, 320, 320, 320, 320,  11, 321, 322,  47,  47,  47,  47,  47,
+    47,  47,  47, 323,  31, 324,  47,  47,  47,  47,  47, 325, 146,  47,  47,  47,
+    47,  47,  47,  47, 326, 146, 146, 327,  32, 328,  32, 329, 330, 331, 332,  47,
+    47,  47,  47,  47,  47,  47,  47, 333, 334,   2,   3,   4,   5, 335, 336, 337,
+    47, 338,  47,  47,  47,  47, 339, 340, 341, 145, 145, 342, 219, 219, 219, 343,
+   344, 146, 146, 146, 146, 146, 146, 345, 346, 346, 346, 346, 346, 346, 346, 346,
+    47,  47,  47,  47,  47,  47, 347, 145,  47,  47, 348,  47, 349,  47,  47,  60,
+    47, 350,  47,  47,  47, 351, 219, 219,   9,   9, 147,  11,  11,  47,  47,  47,
+    47,  47, 160,   9,   9, 147,  11,  11,  47,  47,  47,  47,  47,  47, 350,   9,
+     9, 352,  11,  11,  11,  11,  11,  11,  27,  27,  27,  27,  27,  27,  27,  27,
+    47,  47,  47,  47,  47, 353,  47, 354,  47,  47, 355, 145, 145, 145,  47, 356,
+    47, 357,  47, 350,  66,  66,  66,  66,  47,  47,  47, 358, 145, 145, 145, 145,
+   359,  47,  47, 360, 145,  66,  47, 361,  47, 362, 145, 145, 363,  47, 364,  66,
+    47,  47,  47, 365,  47, 366,  47, 366,  47, 365, 144, 145, 145, 145, 145, 145,
+     9,   9,   9,   9,  11,  11,  11, 367,  47,  47, 368, 160, 160, 160, 160, 160,
+   145, 145, 145, 145, 145, 145, 145, 145,  47,  47, 369,  47,  47,  47,  47,  47,
+    47, 362, 370,  47,  60, 371,  66,  47, 372,  66,  66,  47, 373, 145,  47,  47,
+   374,  47,  47, 360, 375, 376, 377, 378, 180,  47,  47, 379, 380,  47,  47, 160,
+    97,  47, 381, 382, 383,  47,  47, 384, 180,  47,  47, 385, 386, 387, 388, 145,
+    47,  47, 389, 390,  32,  32,  32,  32,  47,  47, 365,  47,  47, 391, 172, 160,
+    92,  47,  47, 113, 392, 393, 394,  32,  47,  47,  47, 395, 396, 397,  47,  47,
+    47,  47,  47, 398, 399, 160, 160, 160,  47,  47, 400, 401, 402, 403,  32,  32,
+    47,  47,  47, 404, 405, 160,  66,  66,  47,  47, 406, 407, 160, 160, 160, 160,
+    47, 143, 408, 409,  47,  47,  47,  47,  47,  47, 389, 410,  66,  66,  66,  66,
+     9,   9,   9,   9,  11,  11, 128, 411,  47,  47,  47, 412, 413, 160, 160, 160,
+    47,  47,  47,  47,  47, 414, 415, 416, 417,  47,  47, 418, 419, 420,  47,  47,
+   421, 422,  66,  47,  47,  47,  47,  47,  47,  47, 400, 423, 424, 128, 145, 425,
+    47, 156, 426, 427,  32,  32,  32,  32,  47,  47,  47, 359, 428, 160,  47,  47,
+   429, 430, 160, 160, 160, 160, 160, 160,  47,  47,  47,  47,  47,  47,  47, 431,
+    47,  47,  47,  47, 145, 432, 433, 434, 219, 219, 219, 219, 219, 219, 219,  66,
+    47,  47,  47,  47,  47,  47,  47, 424,  47,  47,  47, 208, 208, 208, 208, 208,
+    47,  47,  47,  47,  47,  47, 305,  47,  47,  47,  47,  47, 160,  47,  47, 435,
+    47,  47,  47, 436, 437, 438, 439,  47,   9,   9,   9,   9,   9,   9,  11,  11,
+   145, 440,  66,  66,  66,  66,  66,  66,  47,  47,  47,  47, 391, 441, 416, 416,
+   442, 443,  27,  27,  27,  27, 444, 416,  47, 445, 208, 208, 208, 208, 208, 208,
+    32,  32,  32,  32,  32, 146, 146, 146, 146, 146, 146, 146, 146, 146, 446, 447,
+   448, 146, 449, 146, 146, 146, 146, 146, 146, 146, 146, 146, 450, 146, 146, 146,
+     9, 451,  11, 452, 453,  11, 196,   9, 454, 455,   9, 456,  11,   9, 451,  11,
+   452, 453,  11, 196,   9, 454, 455,   9, 456,  11,   9, 451,  11, 452, 453,  11,
+   196,   9, 454, 455,   9, 456,  11,   9, 451,  11, 196,   9, 457, 458, 459, 460,
+    11, 461,   9, 462, 463, 464, 465,  11, 466,   9, 467,  11, 468, 160, 160, 160,
+    32,  32,  32, 469,  32,  32, 470, 471, 472, 473,  32,  32,  32,  32,  32,  32,
+   474,  11,  11,  11,  11,  11,  11,  11,  32,  32,  32,  32,  32,  32,  32,  32,
+    47,  47,  47, 475, 476, 146, 146, 146,  47,  47, 477,  32,  47,  47, 478, 479,
+    47,  47,  47,  47, 355,  32,  32,  32,   9,   9, 454,  11, 480, 305,  66,  66,
+   145, 145, 481, 482, 145, 145, 145, 145, 145, 145, 483, 145, 145, 145, 145, 145,
+    47,  47,  47,  47,  47,  47,  47, 226, 484, 146, 146, 146, 146, 146, 146, 146,
+   146, 146, 146, 146, 146, 146, 146, 485, 146, 146, 146, 146, 146, 146, 146, 160,
+   208, 208, 208, 208, 208, 208, 208, 208,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0, 939, 940, 941, 942, 946, 948,   0, 962,
+   969, 970, 971, 976,1001,1002,1003,1008,   0,1033,1040,1041,1042,1043,1047,   0,
+     0,1080,1081,1082,1086,1110,   0,   0,1124,1125,1126,1127,1131,1133,   0,1147,
+  1154,1155,1156,1161,1187,1188,1189,1193,   0,1219,1226,1227,1228,1229,1233,   0,
+     0,1267,1268,1269,1273,1298,   0,1303, 943,1128, 944,1129, 954,1139, 958,1143,
+   959,1144, 960,1145, 961,1146, 964,1149,   0,   0, 973,1158, 974,1159, 975,1160,
+   983,1168, 978,1163, 988,1173, 990,1175, 991,1176, 993,1178, 994,1179,   0,   0,
+  1004,1190,1005,1191,1006,1192,1014,1199,1007,   0,   0,   0,1016,1201,1020,1206,
+     0,1022,1208,1025,1211,1023,1209,   0,   0,   0,   0,1032,1218,1037,1223,1035,
+  1221,   0,   0,   0,1044,1230,1045,1231,1049,1235,   0,   0,1058,1244,1064,1250,
+  1060,1246,1066,1252,1067,1253,1072,1258,1069,1255,1077,1264,1074,1261,   0,   0,
+  1083,1270,1084,1271,1085,1272,1088,1275,1089,1276,1096,1283,1103,1290,1111,1299,
+  1115,1118,1307,1120,1309,1121,1310,   0,1053,1239,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,1093,1280,   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, 949,1134,1010,1195,1050,1236,1090,1277,1341,1368,1340,
+  1367,1342,1369,1339,1366,   0,1320,1347,1418,1419,1323,1350,   0,   0, 992,1177,
+  1018,1204,1055,1241,1416,1417,1415,1424,1202,   0,   0,   0, 987,1172,   0,   0,
+  1031,1217,1321,1348,1322,1349,1338,1365, 950,1135, 951,1136, 979,1164, 980,1165,
+  1011,1196,1012,1197,1051,1237,1052,1238,1061,1247,1062,1248,1091,1278,1092,1279,
+  1071,1257,1076,1263,   0,   0, 997,1182,   0,   0,   0,   0,   0,   0, 945,1130,
+   982,1167,1337,1364,1335,1362,1046,1232,1422,1423,1113,1301,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   8,   9,   0,  10,1425,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   7,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,1314,1427,   5,
+  1434,1438,1443,   0,1450,   0,1455,1461,1514,   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,1446,1458,1468,1476,1480,1486,1517,   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,1489,1503,1494,1500,1508,   0,   0,   0,   0,1520,1521,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,1526,1528,   0,1525,   0,   0,   0,1522,
+     0,   0,   0,   0,1536,1532,1539,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,1534,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,1556,   0,   0,   0,   0,   0,   0,1548,1550,   0,1547,   0,   0,   0,1567,
+     0,   0,   0,   0,1558,1554,1561,   0,   0,   0,   0,   0,   0,   0,1568,1569,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,1529,1551,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,1523,1545,1524,1546,   0,   0,1527,1549,
+     0,   0,1570,1571,1530,1552,1531,1553,   0,   0,1533,1555,1535,1557,1537,1559,
+     0,   0,1572,1573,1544,1566,1538,1560,1540,1562,1541,1563,1542,1564,   0,   0,
+  1543,1565,   0,   0,   0,   0,   0,   0,   0,   0,1606,1607,1609,1608,1610,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,1613,   0,1611,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1612,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,1620,   0,   0,   0,   0,   0,   0,   0,1623,   0,   0,1624,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+  1614,1615,1616,1617,1618,1619,1621,1622,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,1628,1629,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,1625,1626,   0,1627,   0,   0,   0,1634,   0,   0,1635,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,1630,1631,1632,   0,   0,1633,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+  1639,   0,   0,1638,1640,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,1636,1637,   0,   0,   0,   0,   0,   0,1641,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,1642,1644,1643,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+  1645,   0,   0,   0,   0,   0,   0,   0,1646,   0,   0,   0,   0,   0,   0,1648,
+  1649,   0,1647,1650,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,1651,1653,1652,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,1654,   0,1655,1657,1656,   0,   0,   0,   0,1659,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,1660,   0,   0,   0,   0,1661,   0,   0,   0,   0,1662,
+     0,   0,   0,   0,1663,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,1658,   0,   0,   0,   0,   0,   0,   0,   0,   0,1664,   0,1665,1673,   0,
+  1674,   0,   0,   0,   0,   0,   0,   0,   0,1666,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1668,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,1669,   0,   0,   0,   0,1670,   0,   0,   0,   0,1671,
+     0,   0,   0,   0,1672,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,1667,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1675,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1676,   0,
+  1677,   0,1678,   0,1679,   0,1680,   0,   0,   0,1681,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,1682,   0,1683,   0,   0,1684,1685,   0,1686,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0, 953,1138, 955,1140, 956,1141, 957,1142,
+  1324,1351, 963,1148, 965,1150, 968,1153, 966,1151, 967,1152,1378,1380,1379,1381,
+   984,1169, 985,1170,1420,1421, 986,1171, 989,1174, 995,1180, 998,1183, 996,1181,
+   999,1184,1000,1185,1015,1200,1329,1356,1017,1203,1019,1205,1021,1207,1024,1210,
+  1687,1688,1027,1213,1026,1212,1028,1214,1029,1215,1030,1216,1034,1220,1036,1222,
+  1039,1225,1038,1224,1334,1361,1336,1363,1382,1384,1383,1385,1056,1242,1057,1243,
+  1059,1245,1063,1249,1689,1690,1065,1251,1068,1254,1070,1256,1386,1387,1388,1389,
+  1691,1692,1073,1259,1075,1262,1079,1266,1078,1265,1095,1282,1098,1285,1097,1284,
+  1390,1391,1392,1393,1099,1286,1100,1287,1101,1288,1102,1289,1105,1292,1104,1291,
+  1106,1294,1107,1295,1108,1296,1114,1302,1119,1308,1122,1311,1123,1312,1186,1260,
+  1293,1305,   0,1394,   0,   0,   0,   0, 952,1137, 947,1132,1317,1344,1316,1343,
+  1319,1346,1318,1345,1693,1695,1371,1375,1370,1374,1373,1377,1372,1376,1694,1696,
+   981,1166, 977,1162, 972,1157,1326,1353,1325,1352,1328,1355,1327,1354,1697,1698,
+  1009,1194,1013,1198,1054,1240,1048,1234,1331,1358,1330,1357,1333,1360,1332,1359,
+  1699,1700,1396,1401,1395,1400,1398,1403,1397,1402,1399,1404,1094,1281,1087,1274,
+  1406,1411,1405,1410,1408,1413,1407,1412,1409,1414,1109,1297,1117,1306,1116,1304,
+  1112,1300,   0,   0,   0,   0,   0,   0,1471,1472,1701,1705,1702,1706,1703,1707,
+  1430,1431,1715,1719,1716,1720,1717,1721,1477,1478,1729,1731,1730,1732,   0,   0,
+  1435,1436,1733,1735,1734,1736,   0,   0,1481,1482,1737,1741,1738,1742,1739,1743,
+  1439,1440,1751,1755,1752,1756,1753,1757,1490,1491,1765,1768,1766,1769,1767,1770,
+  1447,1448,1771,1774,1772,1775,1773,1776,1495,1496,1777,1779,1778,1780,   0,   0,
+  1451,1452,1781,1783,1782,1784,   0,   0,1504,1505,1785,1788,1786,1789,1787,1790,
+     0,1459,   0,1791,   0,1792,   0,1793,1509,1510,1794,1798,1795,1799,1796,1800,
+  1462,1463,1808,1812,1809,1813,1810,1814,1467,  21,1475,  22,1479,  23,1485,  24,
+  1493,  27,1499,  28,1507,  29,   0,   0,1704,1708,1709,1710,1711,1712,1713,1714,
+  1718,1722,1723,1724,1725,1726,1727,1728,1740,1744,1745,1746,1747,1748,1749,1750,
+  1754,1758,1759,1760,1761,1762,1763,1764,1797,1801,1802,1803,1804,1805,1806,1807,
+  1811,1815,1816,1817,1818,1819,1820,1821,1470,1469,1822,1474,1465,   0,1473,1825,
+  1429,1428,1426,  12,1432,   0,  26,   0,   0,1315,1823,1484,1466,   0,1483,1829,
+  1433,  13,1437,  14,1441,1826,1827,1828,1488,1487,1513,  19,   0,   0,1492,1515,
+  1445,1444,1442,  15,   0,1831,1832,1833,1502,1501,1516,  25,1497,1498,1506,1518,
+  1457,1456,1454,  17,1453,1313,  11,   3,   0,   0,1824,1512,1519,   0,1511,1830,
+  1449,  16,1460,  18,1464,   4,   0,   0,  30,  31,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  20,   0,
+     0,   0,   2,   6,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,1834,1835,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,1836,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,1837,1839,1838,   0,   0,   0,   0,1840,   0,   0,   0,
+     0,1841,   0,   0,1842,   0,   0,   0,   0,   0,   0,   0,1843,   0,1844,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,1845,   0,   0,1846,   0,   0,1847,
+     0,1848,   0,   0,   0,   0,   0,   0, 937,   0,1850,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,1849, 936, 938,1851,1852,   0,   0,1853,1854,   0,   0,
+  1855,1856,   0,   0,   0,   0,   0,   0,1857,1858,   0,   0,1861,1862,   0,   0,
+  1863,1864,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,1867,1868,1869,1870,1859,1860,1865,1866,   0,   0,   0,   0,
+     0,   0,1871,1872,1873,1874,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,  32,  33,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,1875,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,1877,   0,1878,   0,1879,   0,1880,   0,1881,   0,1882,   0,
+  1883,   0,1884,   0,1885,   0,1886,   0,1887,   0,1888,   0,   0,1889,   0,1890,
+     0,1891,   0,   0,   0,   0,   0,   0,1892,1893,   0,1894,1895,   0,1896,1897,
+     0,1898,1899,   0,1900,1901,   0,   0,   0,   0,   0,   0,1876,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,1902,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,1904,   0,1905,   0,1906,   0,1907,   0,1908,   0,1909,   0,
+  1910,   0,1911,   0,1912,   0,1913,   0,1914,   0,1915,   0,   0,1916,   0,1917,
+     0,1918,   0,   0,   0,   0,   0,   0,1919,1920,   0,1921,1922,   0,1923,1924,
+     0,1925,1926,   0,1927,1928,   0,   0,   0,   0,   0,   0,1903,   0,   0,1929,
+  1930,1931,1932,   0,   0,   0,1933,   0, 710, 385, 724, 715, 455, 103, 186, 825,
+   825, 242, 751, 205, 241, 336, 524, 601, 663, 676, 688, 738, 411, 434, 474, 500,
+   649, 746, 799, 108, 180, 416, 482, 662, 810, 275, 462, 658, 692, 344, 618, 679,
+   293, 388, 440, 492, 740, 116, 146, 168, 368, 414, 481, 527, 606, 660, 665, 722,
+   781, 803, 809, 538, 553, 588, 642, 758, 811, 701, 233, 299, 573, 612, 487, 540,
+   714, 779, 232, 267, 412, 445, 457, 585, 594, 766, 167, 613, 149, 148, 560, 589,
+   648, 768, 708, 345, 411, 704, 105, 259, 313, 496, 518, 174, 542, 120, 307, 101,
+   430, 372, 584, 183, 228, 529, 650, 697, 424, 732, 428, 349, 632, 355, 517, 110,
+   135, 147, 403, 580, 624, 700, 750, 170, 193, 245, 297, 374, 463, 543, 763, 801,
+   812, 815, 162, 384, 420, 730, 287, 330, 337, 366, 459, 476, 509, 558, 591, 610,
+   726, 652, 734, 759, 154, 163, 198, 473, 683, 697, 292, 311, 353, 423, 572, 494,
+   113, 217, 259, 280, 314, 499, 506, 603, 608, 752, 778, 782, 788, 117, 557, 748,
+   774, 320, 109, 126, 260, 265, 373, 411, 479, 523, 655, 737, 823, 380, 765, 161,
+   395, 398, 438, 451, 502, 516, 537, 583, 791, 136, 340, 769, 122, 273, 446, 727,
+   305, 322, 400, 496, 771, 155, 190, 269, 377, 391, 406, 432, 501, 519, 599, 684,
+   687, 749, 776, 175, 452, 191, 480, 510, 659, 772, 805, 813, 397, 444, 619, 566,
+   568, 575, 491, 471, 707, 111, 636, 156, 153, 288, 346, 578, 256, 435, 383, 729,
+   680, 767, 694, 295, 128, 210,   0,   0, 227,   0, 379,   0,   0, 150, 493, 525,
+   544, 551, 552, 556, 783, 576, 604,   0, 661,   0, 703,   0,   0, 735, 743,   0,
+     0,   0, 793, 794, 795, 808, 741, 773, 118, 127, 130, 166, 169, 177, 207, 213,
+   215, 226, 229, 268, 270, 317, 327, 329, 335, 369, 375, 381, 404, 441, 448, 458,
+   477, 484, 503, 539, 545, 547, 546, 548, 549, 550, 554, 555, 561, 564, 569, 591,
+   593, 595, 598, 607, 620, 625, 625, 651, 690, 695, 705, 706, 716, 717, 733, 735,
+   777, 786, 790, 315, 869, 623,   0,   0, 102, 145, 134, 115, 129, 138, 165, 171,
+   207, 202, 206, 212, 227, 231, 240, 243, 250, 254, 294, 296, 303, 308, 319, 325,
+   321, 329, 326, 335, 341, 357, 360, 362, 370, 379, 388, 389, 393, 421, 424, 438,
+   456, 454, 458, 465, 477, 535, 485, 490, 493, 507, 512, 514, 521, 522, 525, 526,
+   528, 533, 532, 541, 565, 569, 574, 586, 591, 597, 607, 637, 647, 674, 691, 693,
+   695, 698, 703, 699, 705, 704, 702, 706, 709, 717, 728, 736, 747, 754, 770, 777,
+   783, 784, 786, 787, 790, 802, 825, 848, 847, 857,  55,  65,  66, 883, 892, 916,
+   822, 824,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,1586,   0,1605,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,1602,1603,1934,1935,1574,1575,1576,1577,1579,1580,1581,1583,1584,   0,
+  1585,1587,1588,1589,1591,   0,1592,   0,1593,1594,   0,1595,1596,   0,1598,1599,
+  1600,1601,1604,1582,1578,1590,1597,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,1936,   0,1937,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,1938,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,1939,1940,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,1941,1942,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,1944,1943,   0,1945,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,1946,1947,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+  1948,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,1949,1950,1951,1952,1953,1954,1955,   0,   0,   0,
      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-   939, 940, 941, 942, 946, 948,   0, 962, 969, 970, 971, 976,1001,1002,1003,1008,
-     0,1033,1040,1041,1042,1043,1047,   0,   0,1080,1081,1082,1086,1110,   0,   0,
-  1124,1125,1126,1127,1131,1133,   0,1147,1154,1155,1156,1161,1187,1188,1189,1193,
-     0,1219,1226,1227,1228,1229,1233,   0,   0,1267,1268,1269,1273,1298,   0,1303,
-   943,1128, 944,1129, 954,1139, 958,1143, 959,1144, 960,1145, 961,1146, 964,1149,
-     0,   0, 973,1158, 974,1159, 975,1160, 983,1168, 978,1163, 988,1173, 990,1175,
-   991,1176, 993,1178, 994,1179,   0,   0,1004,1190,1005,1191,1006,1192,1014,1199,
-  1007,   0,   0,   0,1016,1201,1020,1206,   0,1022,1208,1025,1211,1023,1209,   0,
-     0,   0,   0,1032,1218,1037,1223,1035,1221,   0,   0,   0,1044,1230,1045,1231,
-  1049,1235,   0,   0,1058,1244,1064,1250,1060,1246,1066,1252,1067,1253,1072,1258,
-  1069,1255,1077,1264,1074,1261,   0,   0,1083,1270,1084,1271,1085,1272,1088,1275,
-  1089,1276,1096,1283,1103,1290,1111,1299,1115,1118,1307,1120,1309,1121,1310,   0,
-  1053,1239,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1093,
-  1280,   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, 949,1134,1010,
-  1195,1050,1236,1090,1277,1341,1368,1340,1367,1342,1369,1339,1366,   0,1320,1347,
-  1418,1419,1323,1350,   0,   0, 992,1177,1018,1204,1055,1241,1416,1417,1415,1424,
-  1202,   0,   0,   0, 987,1172,   0,   0,1031,1217,1321,1348,1322,1349,1338,1365,
-   950,1135, 951,1136, 979,1164, 980,1165,1011,1196,1012,1197,1051,1237,1052,1238,
-  1061,1247,1062,1248,1091,1278,1092,1279,1071,1257,1076,1263,   0,   0, 997,1182,
-     0,   0,   0,   0,   0,   0, 945,1130, 982,1167,1337,1364,1335,1362,1046,1232,
-  1422,1423,1113,1301,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     8,   9,   0,  10,1425,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   7,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
-     0,   0,   0,   0,   0,1314,1427,   5,1434,1438,1443,   0,1450,   0,1455,1461,
-  1514,   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,1446,1458,1468,1476,1480,1486,
-  1517,   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,1489,1503,1494,1500,1508,   0,
-     0,   0,   0,1520,1521,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-  1526,1528,   0,1525,   0,   0,   0,1522,   0,   0,   0,   0,1536,1532,1539,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,1534,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,1556,   0,   0,   0,   0,   0,   0,
-  1548,1550,   0,1547,   0,   0,   0,1567,   0,   0,   0,   0,1558,1554,1561,   0,
-     0,   0,   0,   0,   0,   0,1568,1569,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,1529,1551,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-  1523,1545,1524,1546,   0,   0,1527,1549,   0,   0,1570,1571,1530,1552,1531,1553,
-     0,   0,1533,1555,1535,1557,1537,1559,   0,   0,1572,1573,1544,1566,1538,1560,
-  1540,1562,1541,1563,1542,1564,   0,   0,1543,1565,   0,   0,   0,   0,   0,   0,
-     0,   0,1606,1607,1609,1608,1610,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-  1613,   0,1611,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,1612,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,1620,   0,   0,   0,   0,   0,   0,
-     0,1623,   0,   0,1624,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,1614,1615,1616,1617,1618,1619,1621,1622,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1628,1629,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1625,1626,   0,1627,
-     0,   0,   0,1634,   0,   0,1635,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,1630,1631,1632,   0,   0,1633,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,1639,   0,   0,1638,1640,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1636,1637,   0,   0,
-     0,   0,   0,   0,1641,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1642,1644,1643,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,1645,   0,   0,   0,   0,   0,   0,   0,
-  1646,   0,   0,   0,   0,   0,   0,1648,1649,   0,1647,1650,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1651,1653,1652,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1654,   0,1655,1657,1656,   0,
-     0,   0,   0,1659,   0,   0,   0,   0,   0,   0,   0,   0,   0,1660,   0,   0,
-     0,   0,1661,   0,   0,   0,   0,1662,   0,   0,   0,   0,1663,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,1658,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,1664,   0,1665,1673,   0,1674,   0,   0,   0,   0,   0,   0,   0,
-     0,1666,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,1668,   0,   0,   0,   0,   0,   0,   0,   0,   0,1669,   0,   0,
-     0,   0,1670,   0,   0,   0,   0,1671,   0,   0,   0,   0,1672,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,1667,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,1675,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,1676,   0,1677,   0,1678,   0,1679,   0,1680,   0,
-     0,   0,1681,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1682,   0,1683,   0,   0,
-  1684,1685,   0,1686,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-   953,1138, 955,1140, 956,1141, 957,1142,1324,1351, 963,1148, 965,1150, 968,1153,
-   966,1151, 967,1152,1378,1380,1379,1381, 984,1169, 985,1170,1420,1421, 986,1171,
-   989,1174, 995,1180, 998,1183, 996,1181, 999,1184,1000,1185,1015,1200,1329,1356,
-  1017,1203,1019,1205,1021,1207,1024,1210,1687,1688,1027,1213,1026,1212,1028,1214,
-  1029,1215,1030,1216,1034,1220,1036,1222,1039,1225,1038,1224,1334,1361,1336,1363,
-  1382,1384,1383,1385,1056,1242,1057,1243,1059,1245,1063,1249,1689,1690,1065,1251,
-  1068,1254,1070,1256,1386,1387,1388,1389,1691,1692,1073,1259,1075,1262,1079,1266,
-  1078,1265,1095,1282,1098,1285,1097,1284,1390,1391,1392,1393,1099,1286,1100,1287,
-  1101,1288,1102,1289,1105,1292,1104,1291,1106,1294,1107,1295,1108,1296,1114,1302,
-  1119,1308,1122,1311,1123,1312,1186,1260,1293,1305,   0,1394,   0,   0,   0,   0,
-   952,1137, 947,1132,1317,1344,1316,1343,1319,1346,1318,1345,1693,1695,1371,1375,
-  1370,1374,1373,1377,1372,1376,1694,1696, 981,1166, 977,1162, 972,1157,1326,1353,
-  1325,1352,1328,1355,1327,1354,1697,1698,1009,1194,1013,1198,1054,1240,1048,1234,
-  1331,1358,1330,1357,1333,1360,1332,1359,1699,1700,1396,1401,1395,1400,1398,1403,
-  1397,1402,1399,1404,1094,1281,1087,1274,1406,1411,1405,1410,1408,1413,1407,1412,
-  1409,1414,1109,1297,1117,1306,1116,1304,1112,1300,   0,   0,   0,   0,   0,   0,
-  1471,1472,1701,1705,1702,1706,1703,1707,1430,1431,1715,1719,1716,1720,1717,1721,
-  1477,1478,1729,1731,1730,1732,   0,   0,1435,1436,1733,1735,1734,1736,   0,   0,
-  1481,1482,1737,1741,1738,1742,1739,1743,1439,1440,1751,1755,1752,1756,1753,1757,
-  1490,1491,1765,1768,1766,1769,1767,1770,1447,1448,1771,1774,1772,1775,1773,1776,
-  1495,1496,1777,1779,1778,1780,   0,   0,1451,1452,1781,1783,1782,1784,   0,   0,
-  1504,1505,1785,1788,1786,1789,1787,1790,   0,1459,   0,1791,   0,1792,   0,1793,
-  1509,1510,1794,1798,1795,1799,1796,1800,1462,1463,1808,1812,1809,1813,1810,1814,
-  1467,  21,1475,  22,1479,  23,1485,  24,1493,  27,1499,  28,1507,  29,   0,   0,
-  1704,1708,1709,1710,1711,1712,1713,1714,1718,1722,1723,1724,1725,1726,1727,1728,
-  1740,1744,1745,1746,1747,1748,1749,1750,1754,1758,1759,1760,1761,1762,1763,1764,
-  1797,1801,1802,1803,1804,1805,1806,1807,1811,1815,1816,1817,1818,1819,1820,1821,
-  1470,1469,1822,1474,1465,   0,1473,1825,1429,1428,1426,  12,1432,   0,  26,   0,
-     0,1315,1823,1484,1466,   0,1483,1829,1433,  13,1437,  14,1441,1826,1827,1828,
-  1488,1487,1513,  19,   0,   0,1492,1515,1445,1444,1442,  15,   0,1831,1832,1833,
-  1502,1501,1516,  25,1497,1498,1506,1518,1457,1456,1454,  17,1453,1313,  11,   3,
-     0,   0,1824,1512,1519,   0,1511,1830,1449,  16,1460,  18,1464,   4,   0,   0,
-    30,  31,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,  20,   0,   0,   0,   2,   6,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1834,1835,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1836,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1837,1839,1838,
-     0,   0,   0,   0,1840,   0,   0,   0,   0,1841,   0,   0,1842,   0,   0,   0,
-     0,   0,   0,   0,1843,   0,1844,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,1845,   0,   0,1846,   0,   0,1847,   0,1848,   0,   0,   0,   0,   0,   0,
-   937,   0,1850,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1849, 936, 938,
-  1851,1852,   0,   0,1853,1854,   0,   0,1855,1856,   0,   0,   0,   0,   0,   0,
-  1857,1858,   0,   0,1861,1862,   0,   0,1863,1864,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1867,1868,1869,1870,
-  1859,1860,1865,1866,   0,   0,   0,   0,   0,   0,1871,1872,1873,1874,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,  32,  33,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1875,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1877,   0,1878,   0,
-  1879,   0,1880,   0,1881,   0,1882,   0,1883,   0,1884,   0,1885,   0,1886,   0,
-  1887,   0,1888,   0,   0,1889,   0,1890,   0,1891,   0,   0,   0,   0,   0,   0,
-  1892,1893,   0,1894,1895,   0,1896,1897,   0,1898,1899,   0,1900,1901,   0,   0,
-     0,   0,   0,   0,1876,   0,   0,   0,   0,   0,   0,   0,   0,   0,1902,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1904,   0,1905,   0,
-  1906,   0,1907,   0,1908,   0,1909,   0,1910,   0,1911,   0,1912,   0,1913,   0,
-  1914,   0,1915,   0,   0,1916,   0,1917,   0,1918,   0,   0,   0,   0,   0,   0,
-  1919,1920,   0,1921,1922,   0,1923,1924,   0,1925,1926,   0,1927,1928,   0,   0,
-     0,   0,   0,   0,1903,   0,   0,1929,1930,1931,1932,   0,   0,   0,1933,   0,
-   710, 385, 724, 715, 455, 103, 186, 825, 825, 242, 751, 205, 241, 336, 524, 601,
-   663, 676, 688, 738, 411, 434, 474, 500, 649, 746, 799, 108, 180, 416, 482, 662,
-   810, 275, 462, 658, 692, 344, 618, 679, 293, 388, 440, 492, 740, 116, 146, 168,
-   368, 414, 481, 527, 606, 660, 665, 722, 781, 803, 809, 538, 553, 588, 642, 758,
-   811, 701, 233, 299, 573, 612, 487, 540, 714, 779, 232, 267, 412, 445, 457, 585,
-   594, 766, 167, 613, 149, 148, 560, 589, 648, 768, 708, 345, 411, 704, 105, 259,
-   313, 496, 518, 174, 542, 120, 307, 101, 430, 372, 584, 183, 228, 529, 650, 697,
-   424, 732, 428, 349, 632, 355, 517, 110, 135, 147, 403, 580, 624, 700, 750, 170,
-   193, 245, 297, 374, 463, 543, 763, 801, 812, 815, 162, 384, 420, 730, 287, 330,
-   337, 366, 459, 476, 509, 558, 591, 610, 726, 652, 734, 759, 154, 163, 198, 473,
-   683, 697, 292, 311, 353, 423, 572, 494, 113, 217, 259, 280, 314, 499, 506, 603,
-   608, 752, 778, 782, 788, 117, 557, 748, 774, 320, 109, 126, 260, 265, 373, 411,
-   479, 523, 655, 737, 823, 380, 765, 161, 395, 398, 438, 451, 502, 516, 537, 583,
-   791, 136, 340, 769, 122, 273, 446, 727, 305, 322, 400, 496, 771, 155, 190, 269,
-   377, 391, 406, 432, 501, 519, 599, 684, 687, 749, 776, 175, 452, 191, 480, 510,
-   659, 772, 805, 813, 397, 444, 619, 566, 568, 575, 491, 471, 707, 111, 636, 156,
-   153, 288, 346, 578, 256, 435, 383, 729, 680, 767, 694, 295, 128, 210,   0,   0,
-   227,   0, 379,   0,   0, 150, 493, 525, 544, 551, 552, 556, 783, 576, 604,   0,
-   661,   0, 703,   0,   0, 735, 743,   0,   0,   0, 793, 794, 795, 808, 741, 773,
-   118, 127, 130, 166, 169, 177, 207, 213, 215, 226, 229, 268, 270, 317, 327, 329,
-   335, 369, 375, 381, 404, 441, 448, 458, 477, 484, 503, 539, 545, 547, 546, 548,
-   549, 550, 554, 555, 561, 564, 569, 591, 593, 595, 598, 607, 620, 625, 625, 651,
-   690, 695, 705, 706, 716, 717, 733, 735, 777, 786, 790, 315, 869, 623,   0,   0,
-   102, 145, 134, 115, 129, 138, 165, 171, 207, 202, 206, 212, 227, 231, 240, 243,
-   250, 254, 294, 296, 303, 308, 319, 325, 321, 329, 326, 335, 341, 357, 360, 362,
-   370, 379, 388, 389, 393, 421, 424, 438, 456, 454, 458, 465, 477, 535, 485, 490,
-   493, 507, 512, 514, 521, 522, 525, 526, 528, 533, 532, 541, 565, 569, 574, 586,
-   591, 597, 607, 637, 647, 674, 691, 693, 695, 698, 703, 699, 705, 704, 702, 706,
-   709, 717, 728, 736, 747, 754, 770, 777, 783, 784, 786, 787, 790, 802, 825, 848,
-   847, 857,  55,  65,  66, 883, 892, 916, 822, 824,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1586,   0,1605,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1602,1603,1934,1935,1574,1575,
-  1576,1577,1579,1580,1581,1583,1584,   0,1585,1587,1588,1589,1591,   0,1592,   0,
-  1593,1594,   0,1595,1596,   0,1598,1599,1600,1601,1604,1582,1578,1590,1597,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1936,   0,1937,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1938,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1939,1940,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1941,1942,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1944,1943,   0,1945,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1946,1947,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,1948,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1949,1950,
-  1951,1952,1953,1954,1955,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1956,1957,1958,1960,1959,
-  1961,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-   106, 104, 107, 826, 114, 118, 119, 121, 123, 124, 127, 125,  34, 830, 130, 131,
-   132, 137, 827,  35, 133, 139, 829, 142, 143, 112, 144, 145, 924, 151, 152,  37,
-   157, 158, 159, 160,  38, 165, 166, 169, 171, 172, 173, 174, 176, 177, 178, 179,
-   181, 182, 182, 182, 833, 468, 184, 185, 834, 187, 188, 189, 196, 192, 194, 195,
-   197, 199, 200, 201, 203, 204, 204, 206, 208, 209, 211, 218, 213, 219, 214, 216,
-   153, 234, 221, 222, 223, 220, 225, 224, 230, 835, 235, 236, 237, 238, 239, 244,
-   836, 837, 247, 248, 249, 246, 251,  39,  40, 253, 255, 255, 838, 257, 258, 259,
-   261, 839, 262, 263, 301, 264,  41, 266, 270, 272, 271, 841, 274, 842, 277, 276,
-   278, 281, 282,  42, 283, 284, 285, 286,  43, 843,  44, 289, 290, 291, 293, 934,
-   298, 845, 845, 621, 300, 300,  45, 852, 894, 302, 304,  46, 306, 309, 310, 312,
-   316,  48,  47, 317, 846, 318, 323, 324, 325, 324, 328, 329, 333, 331, 332, 334,
-   335, 336, 338, 339, 342, 343, 347, 351, 849, 350, 348, 352, 354, 359, 850, 361,
-   358, 356,  49, 363, 365, 367, 364,  50, 369, 371, 851, 376, 386, 378,  53, 381,
-    52,  51, 140, 141, 387, 382, 614,  78, 388, 389, 390, 394, 392, 856,  54, 399,
-   396, 402, 404, 858, 405, 401, 407,  55, 408, 409, 410, 413, 859, 415,  56, 417,
-   860, 418,  57, 419, 422, 424, 425, 861, 840, 862, 426, 863, 429, 431, 427, 433,
-   437, 441, 438, 439, 442, 443, 864, 436, 449, 450,  58, 454, 453, 865, 447, 460,
-   866, 867, 461, 466, 465, 464,  59, 467, 470, 469, 472, 828, 475, 868, 478, 870,
-   483, 485, 486, 871, 488, 489, 872, 873, 495, 497,  60, 498,  61,  61, 504, 505,
-   507, 508, 511,  62, 513, 874, 515, 875, 518, 844, 520, 876, 877, 878,  63,  64,
-   528, 880, 879, 881, 882, 530, 531, 531, 533,  66, 534,  67,  68, 884, 536, 538,
-   541,  69, 885, 549, 886, 887, 556, 559,  70, 561, 562, 563, 888, 889, 889, 567,
-    71, 890, 570, 571,  72, 891, 577,  73, 581, 579, 582, 893, 587,  74, 590, 592,
-   596,  75, 895, 896,  76, 897, 600, 898, 602, 605, 607, 899, 900, 609, 901, 611,
-   853,  77, 615, 616,  79, 617, 252, 902, 903, 854, 855, 621, 622, 731,  80, 627,
-   626, 628, 164, 629, 630, 631, 633, 904, 632, 634, 639, 640, 635, 641, 646, 651,
-   638, 643, 644, 645, 905, 907, 906,  81, 653, 654, 656, 911, 657, 908,  82,  83,
-   909, 910,  84, 664, 665, 666, 667, 669, 668, 671, 670, 674, 672, 673, 675,  85,
-   677, 678,  86, 681, 682, 912, 685, 686,  87, 689,  36, 913, 914,  88,  89, 696,
-   702, 709, 711, 915, 712, 713, 718, 719, 917, 831, 721, 720, 723, 832, 725, 728,
-   918, 919, 739, 742, 744, 920, 745, 753, 756, 757, 755, 760, 761, 921, 762,  90,
-   764, 922,  91, 775, 279, 780, 923, 925,  92,  93, 785, 926,  94, 927, 787, 787,
-   789, 928, 792,  95, 796, 797, 798, 800,  96, 929, 802, 804, 806,  97,  98, 807,
-   930,  99, 931, 932, 933, 814, 100, 816, 817, 818, 819, 820, 821, 935,   0,   0,
+     0,   0,   0,1956,1957,1958,1960,1959,1961,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0, 106, 104, 107, 826, 114, 118, 119, 121,
+   123, 124, 127, 125,  34, 830, 130, 131, 132, 137, 827,  35, 133, 139, 829, 142,
+   143, 112, 144, 145, 924, 151, 152,  37, 157, 158, 159, 160,  38, 165, 166, 169,
+   171, 172, 173, 174, 176, 177, 178, 179, 181, 182, 182, 182, 833, 468, 184, 185,
+   834, 187, 188, 189, 196, 192, 194, 195, 197, 199, 200, 201, 203, 204, 204, 206,
+   208, 209, 211, 218, 213, 219, 214, 216, 153, 234, 221, 222, 223, 220, 225, 224,
+   230, 835, 235, 236, 237, 238, 239, 244, 836, 837, 247, 248, 249, 246, 251,  39,
+    40, 253, 255, 255, 838, 257, 258, 259, 261, 839, 262, 263, 301, 264,  41, 266,
+   270, 272, 271, 841, 274, 842, 277, 276, 278, 281, 282,  42, 283, 284, 285, 286,
+    43, 843,  44, 289, 290, 291, 293, 934, 298, 845, 845, 621, 300, 300,  45, 852,
+   894, 302, 304,  46, 306, 309, 310, 312, 316,  48,  47, 317, 846, 318, 323, 324,
+   325, 324, 328, 329, 333, 331, 332, 334, 335, 336, 338, 339, 342, 343, 347, 351,
+   849, 350, 348, 352, 354, 359, 850, 361, 358, 356,  49, 363, 365, 367, 364,  50,
+   369, 371, 851, 376, 386, 378,  53, 381,  52,  51, 140, 141, 387, 382, 614,  78,
+   388, 389, 390, 394, 392, 856,  54, 399, 396, 402, 404, 858, 405, 401, 407,  55,
+   408, 409, 410, 413, 859, 415,  56, 417, 860, 418,  57, 419, 422, 424, 425, 861,
+   840, 862, 426, 863, 429, 431, 427, 433, 437, 441, 438, 439, 442, 443, 864, 436,
+   449, 450,  58, 454, 453, 865, 447, 460, 866, 867, 461, 466, 465, 464,  59, 467,
+   470, 469, 472, 828, 475, 868, 478, 870, 483, 485, 486, 871, 488, 489, 872, 873,
+   495, 497,  60, 498,  61,  61, 504, 505, 507, 508, 511,  62, 513, 874, 515, 875,
+   518, 844, 520, 876, 877, 878,  63,  64, 528, 880, 879, 881, 882, 530, 531, 531,
+   533,  66, 534,  67,  68, 884, 536, 538, 541,  69, 885, 549, 886, 887, 556, 559,
+    70, 561, 562, 563, 888, 889, 889, 567,  71, 890, 570, 571,  72, 891, 577,  73,
+   581, 579, 582, 893, 587,  74, 590, 592, 596,  75, 895, 896,  76, 897, 600, 898,
+   602, 605, 607, 899, 900, 609, 901, 611, 853,  77, 615, 616,  79, 617, 252, 902,
+   903, 854, 855, 621, 622, 731,  80, 627, 626, 628, 164, 629, 630, 631, 633, 904,
+   632, 634, 639, 640, 635, 641, 646, 651, 638, 643, 644, 645, 905, 907, 906,  81,
+   653, 654, 656, 911, 657, 908,  82,  83, 909, 910,  84, 664, 665, 666, 667, 669,
+   668, 671, 670, 674, 672, 673, 675,  85, 677, 678,  86, 681, 682, 912, 685, 686,
+    87, 689,  36, 913, 914,  88,  89, 696, 702, 709, 711, 915, 712, 713, 718, 719,
+   917, 831, 721, 720, 723, 832, 725, 728, 918, 919, 739, 742, 744, 920, 745, 753,
+   756, 757, 755, 760, 761, 921, 762,  90, 764, 922,  91, 775, 279, 780, 923, 925,
+    92,  93, 785, 926,  94, 927, 787, 787, 789, 928, 792,  95, 796, 797, 798, 800,
+    96, 929, 802, 804, 806,  97,  98, 807, 930,  99, 931, 932, 933, 814, 100, 816,
+   817, 818, 819, 820, 821, 935,   0,   0,
 };
 static const int16_t
-_hb_ucd_i16[92] =
+_hb_ucd_i16[196] =
 {
-      0,    0,    1,   -1,    2,    0,   -2,    0,    0,    2,    0,   -2,    0,   16,    0,  -16,
-      0,    1,   -1,    0,    3,    3,    3,   -3,   -3,   -3,    0, 2016,    0, 2527, 1923, 1914,
-   1918,    0, 2250,    0,    0,  138,    0,    7,   -7,    0,   -1,    1, 1824,    0, 2104,    0,
-   2108, 2106,    0, 2106, 1316,    0,   -1, -138,    8,    8,    8,    0,    7,    7,   -8,   -8,
-     -8,   -7,-1316,    1,   -1,    3,   -3,    1,    0,-1914,-1918,    0,    0,-1923,-1824,    0,
-      0,-2016,-2104,    0,    0,-2106,-2108,-2106,-2250,    0,-2527,    0,
+      0,    0,    0,    0,    1,   -1,    0,    0,    2,    0,   -2,    0,    0,    0,    0,    2,
+      0,   -2,    0,    0,    0,    0,    0,   16,    0,    0,    0,  -16,    0,    0,    1,   -1,
+      0,    0,    0,    1,   -1,    0,    0,    0,    0,    1,   -1,    0,    3,    3,    3,   -3,
+     -3,   -3,    0,    0,    0, 2016,    0,    0,    0,    0,    0, 2527, 1923, 1914, 1918,    0,
+   2250,    0,    0,    0,    0,    0,    0,  138,    0,    7,    0,    0,   -7,    0,    0,    0,
+      1,   -1,    1,   -1,   -1,    1,   -1,    0, 1824,    0,    0,    0,    0,    0, 2104,    0,
+   2108, 2106,    0, 2106, 1316,    0,    0,    0,    0,    1,   -1,    1,   -1, -138,    0,    0,
+      1,   -1,    8,    8,    8,    0,    7,    7,    0,    0,   -8,   -8,   -8,   -7,   -7,    0,
+      1,   -1,    0,    2,-1316,    1,   -1,    0,   -1,    1,   -1,    1,   -1,    3,    1,   -1,
+     -3,    1,   -1,    1,   -1,    0,    0,-1914,-1918,    0,    0,-1923,-1824,    0,    0,    0,
+      0,-2016,    0,    0,    1,   -1,    0,    1,    0,    0,-2104,    0,    0,    0,    0,-2106,
+  -2108,-2106,    0,    0,    1,   -1,-2250,    0,    0,    0,-2527,    0,    0,   -2,    0,    1,
+     -1,    0,    1,   -1,
 };
 
 static inline uint_fast8_t
 _hb_ucd_gc (unsigned u)
 {
-  return u<1114112u?_hb_ucd_u8[4920+(((_hb_ucd_u8[1104+(((_hb_ucd_u16[((_hb_ucd_u8[272+(((_hb_ucd_u8[u>>1>>3>>3>>5])<<5)+((u>>1>>3>>3)&31u))])<<3)+((u>>1>>3)&7u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:2;
+  return u<1114112u?_hb_ucd_u8[5056+(((_hb_ucd_u8[1168+(((_hb_ucd_u16[((_hb_ucd_u8[544+(((_hb_ucd_u8[u>>1>>3>>3>>4])<<4)+((u>>1>>3>>3)&15u))])<<3)+((u>>1>>3)&7u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:2;
 }
 static inline uint_fast8_t
 _hb_ucd_ccc (unsigned u)
 {
-  return u<125259u?_hb_ucd_u8[6796+(((_hb_ucd_u8[6276+(((_hb_ucd_u8[5844+(((_hb_ucd_u8[5508+(((_hb_ucd_u8[5262+(u>>2>>2>>2>>3)])<<3)+((u>>2>>2>>2)&7u))])<<2)+((u>>2>>2)&3u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:0;
+  return u<125259u?_hb_ucd_u8[6970+(((_hb_ucd_u8[6426+(((_hb_ucd_u8[5982+(((_hb_ucd_u8[5646+(((_hb_ucd_u8[5400+(u>>2>>2>>2>>3)])<<3)+((u>>2>>2>>2)&7u))])<<2)+((u>>2>>2)&3u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:0;
 }
 static inline unsigned
 _hb_ucd_b4 (const uint8_t* a, unsigned i)
@@ -6759,17 +6877,17 @@ _hb_ucd_b4 (const uint8_t* a, unsigned i)
 static inline int_fast16_t
 _hb_ucd_bmg (unsigned u)
 {
-  return u<65380u?_hb_ucd_i16[((_hb_ucd_u8[7672+(((_hb_ucd_u8[7448+(((_hb_ucd_u8[7352+(((_hb_ucd_b4(7288+_hb_ucd_u8,u>>1>>2>>3>>3))<<3)+((u>>1>>2>>3)&7u))])<<3)+((u>>1>>2)&7u))])<<2)+((u>>1)&3u))])<<1)+((u)&1u)]:0;
+  return u<65380u?_hb_ucd_i16[((_hb_ucd_u8[7714+(((_hb_ucd_u8[7594+(((_hb_ucd_b4(7466+_hb_ucd_u8,u>>2>>3>>3))<<3)+((u>>2>>3)&7u))])<<3)+((u>>2)&7u))])<<2)+((u)&3u)]:0;
 }
 static inline uint_fast8_t
 _hb_ucd_sc (unsigned u)
 {
-  return u<918016u?_hb_ucd_u8[11242+(((_hb_ucd_u8[10314+(((_hb_ucd_u8[8938+(((_hb_ucd_u8[8362+(((_hb_ucd_u8[7912+(u>>2>>2>>3>>4)])<<4)+((u>>2>>2>>3)&15u))])<<3)+((u>>2>>2)&7u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:2;
+  return u<918016u?_hb_ucd_u8[11480+(((_hb_ucd_u8[10532+(((_hb_ucd_u8[9124+(((_hb_ucd_u8[8500+(((_hb_ucd_u8[8050+(u>>2>>2>>3>>4)])<<4)+((u>>2>>2>>3)&15u))])<<3)+((u>>2>>2)&7u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:2;
 }
 static inline uint_fast16_t
 _hb_ucd_dm (unsigned u)
 {
-  return u<195102u?_hb_ucd_u16[1536+(((_hb_ucd_u8[12544+(((_hb_ucd_u8[12162+(u>>4>>5)])<<5)+((u>>4)&31u))])<<4)+((u)&15u))]:0;
+  return u<195102u?_hb_ucd_u16[1576+(((_hb_ucd_u8[12802+(((_hb_ucd_u8[12420+(u>>4>>5)])<<5)+((u>>4)&31u))])<<4)+((u)&15u))]:0;
 }
 
 #endif
index ad72a26..baea224 100644 (file)
@@ -203,9 +203,7 @@ hb_ucd_decompose (hb_unicode_funcs_t *ufuncs HB_UNUSED,
 }
 
 
-#if HB_USE_ATEXIT
 static void free_static_ucd_funcs ();
-#endif
 
 static struct hb_ucd_unicode_funcs_lazy_loader_t : hb_unicode_funcs_lazy_loader_t<hb_ucd_unicode_funcs_lazy_loader_t>
 {
@@ -222,21 +220,17 @@ static struct hb_ucd_unicode_funcs_lazy_loader_t : hb_unicode_funcs_lazy_loader_
 
     hb_unicode_funcs_make_immutable (funcs);
 
-#if HB_USE_ATEXIT
-    atexit (free_static_ucd_funcs);
-#endif
+    hb_atexit (free_static_ucd_funcs);
 
     return funcs;
   }
 } static_ucd_funcs;
 
-#if HB_USE_ATEXIT
-static
+static inline
 void free_static_ucd_funcs ()
 {
   static_ucd_funcs.free_instance ();
 }
-#endif
 
 hb_unicode_funcs_t *
 hb_ucd_get_unicode_funcs ()
index eb7776e..c216379 100644 (file)
@@ -6,14 +6,14 @@
  *
  * on file with this header:
  *
- * # emoji-data.txt
- * # Date: 2020-01-28, 20:52:38 GMT
- * # © 2020 Unicode®, Inc.
+ * # emoji-data-14.0.0.txt
+ * # Date: 2021-08-26, 17:22:22 GMT
+ * # © 2021 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: 13.0
+ * # Used with Emoji Version 14.0 and subsequent minor revisions (if any)
  * #
  * # For documentation and usage, see http://www.unicode.org/reports/tr51
  */
 #include "hb-unicode.hh"
 
 static const uint8_t
-_hb_emoji_u8[448] =
+_hb_emoji_u8[544] =
 {
-    0,  0,  0,  0, 33,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+   16, 17, 17, 17, 50, 20, 21, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+   17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+   17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+   17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,118,152,
+    0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  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, 84,118,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  2,  0,  0,  3,
-    0,  0,  0,  0,  0,  0,  4,  5,  6,  7,  8,  7,  9, 10, 11,  0,
-    0,  0,  0,  0, 12,  0,  0,  0,  0,  0,  0,  0, 13,  0,  0,  0,
-    7,  7,  7, 14, 15, 16, 17, 18, 19, 20,  7,  7,  7,  7,  7, 21,
-    7,  7,  7,  7, 22, 23,  7,  7,  7, 24,  7, 14,  0, 25,  0, 26,
-   27, 28, 29, 14, 30, 31,  7,  7,  7,  7,  7, 14,  0,  0,  0,  0,
-    7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7, 22,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,240,  1,  0,  2,  0,  0,
-    0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,254,  7,  3,
-    0,  0,  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0, 56,
-  159,255,243,255,255,255,255,255,255,255,255,255,255,255,255,255,
-   31,  0,255,255,255,255,255,255, 31,255,  3,  0,  0,  0,  8,  0,
-    0,  0, 24,  0,120,  0,  0,  0,  0,  0, 96,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0, 16,  0, 96,  0,  0,  8,  0,  0,  0,  0,
-  255,255,255,255,255,255,255,127,  0, 96,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,240,  1, 64,  0,  0,254,  3,  0,224,255,255,
-  255,255,255,255, 31,  0,  0,  0,254,127,  0,  0,  0,  0,252,115,
-    0,254,255,255,255,255,255,255,255,255,255,255,255,255,255,  3,
-  255,255,255,255,255,255,255, 31,192,255,255,255,255,255,255,255,
-  255,127,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,240,127,
-    0,  0,224,255,255,255,255,127,  0,112,  0,  0,  0,  0,  0,  0,
-    0,127,  0,124,  0,  0,  0,  0,  0,127,  0,  0,  0,192,255,255,
-    0,240,255,255,255,255,255,243,159,255,255,255,255,255,255,255,
+    2,  3,  0,  0,  4,  0,  5,  0,  0,  0,  0,  0,  6,  0,  7,  8,
+    0,  0,  0,  9,  0,  0, 10, 11, 12, 13, 14, 13, 15, 16, 17,  0,
+    0,  0,  0,  0, 18,  0,  0,  0,  0,  0,  0,  0, 19, 20,  0,  0,
+   21,  0,  0,  0,  0,  0,  0,  0,  0,  0, 22,  0,  0,  0,  0,  0,
+   13, 13, 13, 13, 23, 24, 25, 26, 27, 28, 13, 13, 13, 13, 13, 29,
+   13, 13, 13, 13, 30, 31, 13, 13, 13, 32, 13, 13,  0, 33,  0, 34,
+   35, 36, 37, 13, 38, 39, 13, 13, 13, 13, 13, 13,  0,  0,  0,  0,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 30,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 66,  0,  0,
+    0,  0,  0,  0,  0,  0,  0, 16,  0,  2,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  4,  0,  0,  2,  0,  0,240,  3,  0,  6,  0,  0,
+    0,  0,  0, 12,  0,  1,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,
+    0,128,  0,  0,  0,254, 15,  7,  4,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0, 12, 64,  0,  1,  0,  0,  0,  0,  0,  0,120,
+  191,255,247,255,255,255,255,255,255,255,255,255,255,255,255,255,
+   63,  0,255,255,255,255,255,255, 63,255, 87, 32,  2,  1, 24,  0,
+  144, 80,184,  0,248,  0,  0,  0,  0,  0,224,  0,  2,  0,  1,128,
+    0,  0,  0,  0,  0,  0, 48,  0,224,  0,  0, 24,  0,  0,  0,  0,
+    0,  0, 33,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1, 32,
+    0,  0,128,  2,  0,  0,  0,  0,  0,224,  0,  0,  0,128,  0,  0,
+    0,  0,  0,  0,  0,240,  3,192,  0, 64,254,  7,  0,224,255,255,
+  255,255,255,255, 63,  0,  0,  0,254,255,  0,  4,  0,128,252,247,
+    0,254,255,255,255,255,255,255,255,255,255,255,255,255,255,  7,
+  255,255,255,255,255,255,255, 63,192,255,255,255,255,255,255,255,
+  255,255,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,240,255,
+    0,  0,224,255,255,255,255,255,  0,240,  0,  0,  0,  0,  0,  0,
+    0,255,  0,252,  0,  0,  0,  0,  0,255,  0,  0,  0,192,255,255,
+    0,240,255,255,255,255,255,247,191,255,255,255,255,255,255,255,
 };
 
 static inline unsigned
@@ -69,7 +75,7 @@ _hb_emoji_b1 (const uint8_t* a, unsigned i)
 static inline uint_fast8_t
 _hb_emoji_is_Extended_Pictographic (unsigned u)
 {
-  return u<131069u?_hb_emoji_b1(192+_hb_emoji_u8,((_hb_emoji_u8[64+(((_hb_emoji_b4(_hb_emoji_u8,u>>6>>4))<<4)+((u>>6)&15u))])<<6)+((u)&63u)):0;
+  return u<131070u?_hb_emoji_b1(224+_hb_emoji_u8,((_hb_emoji_u8[64+(((_hb_emoji_b4(_hb_emoji_u8,u>>6>>4))<<4)+((u>>6)&15u))])<<6)+((u)&63u)):0;
 }
 
 
index 36070a7..83ead63 100644 (file)
  * @include: hb.h
  *
  * Unicode functions are used to access Unicode character properties.
- * Client can pass its own Unicode functions to HarfBuzz, or access
- * the built-in Unicode functions that come with HarfBuzz.
+ * With these functions, client programs can query various properties from
+ * the Unicode Character Database for any code point, such as General
+ * Category (gc), Script (sc), Canonical Combining Class (ccc), etc.
  *
- * With the Unicode functions, one can query variour Unicode character
- * properties, such as General Category, Script, Combining Class, etc.
+ * Client programs can optionally pass in their own Unicode functions
+ * that implement the same queries. The set of functions available is
+ * defined by the virtual methods in #hb_unicode_funcs_t.
+ *
+ * HarfBuzz provides built-in default functions for each method in
+ * #hb_unicode_funcs_t.
  **/
 
 
@@ -133,6 +138,16 @@ hb_unicode_decompose_compatibility_nil (hb_unicode_funcs_t *ufuncs     HB_UNUSED
 #include "hb-icu.h"
 #endif
 
+/**
+ * hb_unicode_funcs_get_default:
+ *
+ * Fetches a pointer to the default Unicode-functions structure that is used
+ * when no functions are explicitly set on #hb_buffer_t.
+ *
+ * Return value: (transfer none): a pointer to the #hb_unicode_funcs_t Unicode-functions structure
+ *
+ * Since: 0.9.2
+ **/
 hb_unicode_funcs_t *
 hb_unicode_funcs_get_default ()
 {
@@ -155,11 +170,11 @@ hb_unicode_funcs_get_default ()
 
 /**
  * hb_unicode_funcs_create: (Xconstructor)
- * @parent: (nullable):
+ * @parent: (nullable): Parent Unicode-functions structure
  *
+ * Creates a new #hb_unicode_funcs_t structure of Unicode functions.
  *
- *
- * Return value: (transfer full):
+ * Return value: (transfer full): The Unicode-functions structure
  *
  * Since: 0.9.2
  **/
@@ -203,9 +218,9 @@ DEFINE_NULL_INSTANCE (hb_unicode_funcs_t) =
 /**
  * hb_unicode_funcs_get_empty:
  *
+ * Fetches the singleton empty Unicode-functions structure.
  *
- *
- * Return value: (transfer full):
+ * Return value: (transfer full): The empty Unicode-functions structure
  *
  * Since: 0.9.2
  **/
@@ -217,11 +232,11 @@ hb_unicode_funcs_get_empty ()
 
 /**
  * hb_unicode_funcs_reference: (skip)
- * @ufuncs: Unicode functions.
+ * @ufuncs: The Unicode-functions structure
  *
+ * Increases the reference count on a Unicode-functions structure.
  *
- *
- * Return value: (transfer full):
+ * Return value: (transfer full): The Unicode-functions structure
  *
  * Since: 0.9.2
  **/
@@ -233,9 +248,11 @@ hb_unicode_funcs_reference (hb_unicode_funcs_t *ufuncs)
 
 /**
  * hb_unicode_funcs_destroy: (skip)
- * @ufuncs: Unicode functions.
- *
+ * @ufuncs: The Unicode-functions structure
  *
+ * Decreases the reference count on a Unicode-functions structure. When
+ * the reference count reaches zero, the Unicode-functions structure is
+ * destroyed, freeing all memory.
  *
  * Since: 0.9.2
  **/
@@ -251,20 +268,20 @@ hb_unicode_funcs_destroy (hb_unicode_funcs_t *ufuncs)
 
   hb_unicode_funcs_destroy (ufuncs->parent);
 
-  free (ufuncs);
+  hb_free (ufuncs);
 }
 
 /**
  * hb_unicode_funcs_set_user_data: (skip)
- * @ufuncs: Unicode functions.
- * @key:
- * @data:
- * @destroy:
- * @replace:
+ * @ufuncs: The Unicode-functions structure
+ * @key: The user-data key
+ * @data: A pointer to the user data
+ * @destroy: (nullable): A callback to call when @data is not needed anymore
+ * @replace: Whether to replace an existing data with the same key
  *
+ * Attaches a user-data key/data pair to the specified Unicode-functions structure. 
  *
- *
- * Return value:
+ * Return value: %true if success, %false otherwise
  *
  * Since: 0.9.2
  **/
@@ -280,12 +297,13 @@ hb_unicode_funcs_set_user_data (hb_unicode_funcs_t *ufuncs,
 
 /**
  * hb_unicode_funcs_get_user_data: (skip)
- * @ufuncs: Unicode functions.
- * @key:
- *
+ * @ufuncs: The Unicode-functions structure
+ * @key: The user-data key to query
  *
+ * Fetches the user-data associated with the specified key,
+ * attached to the specified Unicode-functions structure.
  *
- * Return value: (transfer none):
+ * Return value: (transfer none): A pointer to the user data
  *
  * Since: 0.9.2
  **/
@@ -299,9 +317,10 @@ hb_unicode_funcs_get_user_data (hb_unicode_funcs_t *ufuncs,
 
 /**
  * hb_unicode_funcs_make_immutable:
- * @ufuncs: Unicode functions.
- *
+ * @ufuncs: The Unicode-functions structure
  *
+ * Makes the specified Unicode-functions structure
+ * immutable.
  *
  * Since: 0.9.2
  **/
@@ -316,11 +335,12 @@ hb_unicode_funcs_make_immutable (hb_unicode_funcs_t *ufuncs)
 
 /**
  * hb_unicode_funcs_is_immutable:
- * @ufuncs: Unicode functions.
- *
+ * @ufuncs: The Unicode-functions structure
  *
+ * Tests whether the specified Unicode-functions structure
+ * is immutable.
  *
- * Return value:
+ * Return value: %true if @ufuncs is immutable, %false otherwise
  *
  * Since: 0.9.2
  **/
@@ -332,11 +352,12 @@ hb_unicode_funcs_is_immutable (hb_unicode_funcs_t *ufuncs)
 
 /**
  * hb_unicode_funcs_get_parent:
- * @ufuncs: Unicode functions.
+ * @ufuncs: The Unicode-functions structure
  *
+ * Fetches the parent of the Unicode-functions structure
+ * @ufuncs.
  *
- *
- * Return value:
+ * Return value: The parent Unicode-functions structure
  *
  * Since: 0.9.2
  **/
@@ -389,14 +410,18 @@ HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE
 
 /**
  * hb_unicode_compose:
- * @ufuncs: Unicode functions.
- * @a:
- * @b:
- * @ab: (out):
+ * @ufuncs: The Unicode-functions structure
+ * @a: The first Unicode code point to compose
+ * @b: The second Unicode code point to compose
+ * @ab: (out): The composition of @a, @b
  *
+ * Fetches the composition of a sequence of two Unicode
+ * code points.
  *
+ * Calls the composition function of the specified
+ * Unicode-functions structure @ufuncs.
  *
- * Return value:
+ * Return value: %true if @a and @b composed, %false otherwise
  *
  * Since: 0.9.2
  **/
@@ -411,14 +436,17 @@ hb_unicode_compose (hb_unicode_funcs_t *ufuncs,
 
 /**
  * hb_unicode_decompose:
- * @ufuncs: Unicode functions.
- * @ab:
- * @a: (out):
- * @b: (out):
+ * @ufuncs: The Unicode-functions structure
+ * @ab: Unicode code point to decompose
+ * @a: (out): The first code point of the decomposition of @ab
+ * @b: (out): The second code point of the decomposition of @ab
  *
+ * Fetches the decomposition of a Unicode code point. 
  *
+ * Calls the decomposition function of the specified
+ * Unicode-functions structure @ufuncs.
  *
- * Return value:
+ * Return value: %true if @ab was decomposed, %false otherwise
  *
  * Since: 0.9.2
  **/
@@ -434,13 +462,14 @@ hb_unicode_decompose (hb_unicode_funcs_t *ufuncs,
 #ifndef HB_DISABLE_DEPRECATED
 /**
  * hb_unicode_decompose_compatibility:
- * @ufuncs: Unicode functions.
- * @u:
- * @decomposed: (out):
- *
+ * @ufuncs: The Unicode-functions structure
+ * @u: Code point to decompose
+ * @decomposed: (out): Compatibility decomposition of @u
  *
+ * Fetches the compatibility decomposition of a Unicode
+ * code point. Deprecated.
  *
- * Return value:
+ * Return value: length of @decomposed.
  *
  * Since: 0.9.2
  * Deprecated: 2.0.0
index 61b1b0b..c04ee15 100644 (file)
@@ -28,7 +28,7 @@
  * Google Author(s): Behdad Esfahbod
  */
 
-#ifndef HB_H_IN
+#if !defined(HB_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb.h> instead."
 #endif
 
@@ -41,14 +41,51 @@ HB_BEGIN_DECLS
 
 
 /**
- * HB_UNICODE_MAX
+ * HB_UNICODE_MAX:
+ *
+ * Maximum valid Unicode code point.
  *
  * Since: 1.9.0
  **/
 #define HB_UNICODE_MAX 0x10FFFFu
 
 
-/* hb_unicode_general_category_t */
+/**
+ * hb_unicode_general_category_t:
+ * @HB_UNICODE_GENERAL_CATEGORY_CONTROL:              [Cc]
+ * @HB_UNICODE_GENERAL_CATEGORY_FORMAT:                      [Cf]
+ * @HB_UNICODE_GENERAL_CATEGORY_UNASSIGNED:          [Cn]
+ * @HB_UNICODE_GENERAL_CATEGORY_PRIVATE_USE:         [Co]
+ * @HB_UNICODE_GENERAL_CATEGORY_SURROGATE:           [Cs]
+ * @HB_UNICODE_GENERAL_CATEGORY_LOWERCASE_LETTER:     [Ll]
+ * @HB_UNICODE_GENERAL_CATEGORY_MODIFIER_LETTER:      [Lm]
+ * @HB_UNICODE_GENERAL_CATEGORY_OTHER_LETTER:        [Lo]
+ * @HB_UNICODE_GENERAL_CATEGORY_TITLECASE_LETTER:     [Lt]
+ * @HB_UNICODE_GENERAL_CATEGORY_UPPERCASE_LETTER:     [Lu]
+ * @HB_UNICODE_GENERAL_CATEGORY_SPACING_MARK:        [Mc]
+ * @HB_UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK:              [Me]
+ * @HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK:     [Mn]
+ * @HB_UNICODE_GENERAL_CATEGORY_DECIMAL_NUMBER:              [Nd]
+ * @HB_UNICODE_GENERAL_CATEGORY_LETTER_NUMBER:       [Nl]
+ * @HB_UNICODE_GENERAL_CATEGORY_OTHER_NUMBER:        [No]
+ * @HB_UNICODE_GENERAL_CATEGORY_CONNECT_PUNCTUATION:  [Pc]
+ * @HB_UNICODE_GENERAL_CATEGORY_DASH_PUNCTUATION:     [Pd]
+ * @HB_UNICODE_GENERAL_CATEGORY_CLOSE_PUNCTUATION:    [Pe]
+ * @HB_UNICODE_GENERAL_CATEGORY_FINAL_PUNCTUATION:    [Pf]
+ * @HB_UNICODE_GENERAL_CATEGORY_INITIAL_PUNCTUATION:  [Pi]
+ * @HB_UNICODE_GENERAL_CATEGORY_OTHER_PUNCTUATION:    [Po]
+ * @HB_UNICODE_GENERAL_CATEGORY_OPEN_PUNCTUATION:     [Ps]
+ * @HB_UNICODE_GENERAL_CATEGORY_CURRENCY_SYMBOL:      [Sc]
+ * @HB_UNICODE_GENERAL_CATEGORY_MODIFIER_SYMBOL:      [Sk]
+ * @HB_UNICODE_GENERAL_CATEGORY_MATH_SYMBOL:         [Sm]
+ * @HB_UNICODE_GENERAL_CATEGORY_OTHER_SYMBOL:        [So]
+ * @HB_UNICODE_GENERAL_CATEGORY_LINE_SEPARATOR:              [Zl]
+ * @HB_UNICODE_GENERAL_CATEGORY_PARAGRAPH_SEPARATOR:  [Zp]
+ * @HB_UNICODE_GENERAL_CATEGORY_SPACE_SEPARATOR:      [Zs]
+ *
+ * Data type for the "General_Category" (gc) property from
+ * the Unicode Character Database.
+ **/
 
 /* Unicode Character Database property: General_Category (gc) */
 typedef enum
@@ -85,13 +122,74 @@ typedef enum
   HB_UNICODE_GENERAL_CATEGORY_SPACE_SEPARATOR          /* Zs */
 } hb_unicode_general_category_t;
 
-/* hb_unicode_combining_class_t */
-
-/* Note: newer versions of Unicode may add new values.  Clients should be ready to handle
- * any value in the 0..254 range being returned from hb_unicode_combining_class().
- */
-
-/* Unicode Character Database property: Canonical_Combining_Class (ccc) */
+/**
+ * hb_unicode_combining_class_t:
+ * @HB_UNICODE_COMBINING_CLASS_NOT_REORDERED: Spacing and enclosing marks; also many vowel and consonant signs, even if nonspacing
+ * @HB_UNICODE_COMBINING_CLASS_OVERLAY: Marks which overlay a base letter or symbol
+ * @HB_UNICODE_COMBINING_CLASS_NUKTA: Diacritic nukta marks in Brahmi-derived scripts
+ * @HB_UNICODE_COMBINING_CLASS_KANA_VOICING: Hiragana/Katakana voicing marks
+ * @HB_UNICODE_COMBINING_CLASS_VIRAMA: Viramas
+ * @HB_UNICODE_COMBINING_CLASS_CCC10: [Hebrew]
+ * @HB_UNICODE_COMBINING_CLASS_CCC11: [Hebrew]
+ * @HB_UNICODE_COMBINING_CLASS_CCC12: [Hebrew]
+ * @HB_UNICODE_COMBINING_CLASS_CCC13: [Hebrew]
+ * @HB_UNICODE_COMBINING_CLASS_CCC14: [Hebrew]
+ * @HB_UNICODE_COMBINING_CLASS_CCC15: [Hebrew]
+ * @HB_UNICODE_COMBINING_CLASS_CCC16: [Hebrew]
+ * @HB_UNICODE_COMBINING_CLASS_CCC17: [Hebrew]
+ * @HB_UNICODE_COMBINING_CLASS_CCC18: [Hebrew]
+ * @HB_UNICODE_COMBINING_CLASS_CCC19: [Hebrew]
+ * @HB_UNICODE_COMBINING_CLASS_CCC20: [Hebrew]
+ * @HB_UNICODE_COMBINING_CLASS_CCC21: [Hebrew]
+ * @HB_UNICODE_COMBINING_CLASS_CCC22: [Hebrew]
+ * @HB_UNICODE_COMBINING_CLASS_CCC23: [Hebrew]
+ * @HB_UNICODE_COMBINING_CLASS_CCC24: [Hebrew]
+ * @HB_UNICODE_COMBINING_CLASS_CCC25: [Hebrew]
+ * @HB_UNICODE_COMBINING_CLASS_CCC26: [Hebrew]
+ * @HB_UNICODE_COMBINING_CLASS_CCC27: [Arabic]
+ * @HB_UNICODE_COMBINING_CLASS_CCC28: [Arabic]
+ * @HB_UNICODE_COMBINING_CLASS_CCC29: [Arabic]
+ * @HB_UNICODE_COMBINING_CLASS_CCC30: [Arabic]
+ * @HB_UNICODE_COMBINING_CLASS_CCC31: [Arabic]
+ * @HB_UNICODE_COMBINING_CLASS_CCC32: [Arabic]
+ * @HB_UNICODE_COMBINING_CLASS_CCC33: [Arabic]
+ * @HB_UNICODE_COMBINING_CLASS_CCC34: [Arabic]
+ * @HB_UNICODE_COMBINING_CLASS_CCC35: [Arabic]
+ * @HB_UNICODE_COMBINING_CLASS_CCC36: [Syriac]
+ * @HB_UNICODE_COMBINING_CLASS_CCC84: [Telugu]
+ * @HB_UNICODE_COMBINING_CLASS_CCC91: [Telugu]
+ * @HB_UNICODE_COMBINING_CLASS_CCC103: [Thai]
+ * @HB_UNICODE_COMBINING_CLASS_CCC107: [Thai]
+ * @HB_UNICODE_COMBINING_CLASS_CCC118: [Lao]
+ * @HB_UNICODE_COMBINING_CLASS_CCC122: [Lao]
+ * @HB_UNICODE_COMBINING_CLASS_CCC129: [Tibetan]
+ * @HB_UNICODE_COMBINING_CLASS_CCC130: [Tibetan]
+ * @HB_UNICODE_COMBINING_CLASS_CCC133: [Tibetan]
+ * @HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW_LEFT: Marks attached at the bottom left
+ * @HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW: Marks attached directly below
+ * @HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE: Marks attached directly above
+ * @HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE_RIGHT: Marks attached at the top right
+ * @HB_UNICODE_COMBINING_CLASS_BELOW_LEFT: Distinct marks at the bottom left
+ * @HB_UNICODE_COMBINING_CLASS_BELOW: Distinct marks directly below
+ * @HB_UNICODE_COMBINING_CLASS_BELOW_RIGHT: Distinct marks at the bottom right
+ * @HB_UNICODE_COMBINING_CLASS_LEFT: Distinct marks to the left
+ * @HB_UNICODE_COMBINING_CLASS_RIGHT: Distinct marks to the right
+ * @HB_UNICODE_COMBINING_CLASS_ABOVE_LEFT: Distinct marks at the top left
+ * @HB_UNICODE_COMBINING_CLASS_ABOVE: Distinct marks directly above
+ * @HB_UNICODE_COMBINING_CLASS_ABOVE_RIGHT: Distinct marks at the top right
+ * @HB_UNICODE_COMBINING_CLASS_DOUBLE_BELOW: Distinct marks subtending two bases
+ * @HB_UNICODE_COMBINING_CLASS_DOUBLE_ABOVE: Distinct marks extending above two bases
+ * @HB_UNICODE_COMBINING_CLASS_IOTA_SUBSCRIPT: Greek iota subscript only
+ * @HB_UNICODE_COMBINING_CLASS_INVALID: Invalid combining class
+ *
+ * Data type for the Canonical_Combining_Class (ccc) property
+ * from the Unicode Character Database.
+ *
+ * <note>Note: newer versions of Unicode may add new values.
+ * Client programs should be ready to handle any value in the 0..254 range
+ * being returned from hb_unicode_combining_class().</note>
+ *
+ **/
 typedef enum
 {
   HB_UNICODE_COMBINING_CLASS_NOT_REORDERED     = 0,
@@ -176,6 +274,18 @@ typedef enum
  * hb_unicode_funcs_t
  */
 
+/**
+ * hb_unicode_funcs_t:
+ *
+ * Data type containing a set of virtual methods used for
+ * accessing various Unicode character properties.
+ *
+ * HarfBuzz provides a default function for each of the
+ * methods in #hb_unicode_funcs_t. Client programs can implement
+ * their own replacements for the individual Unicode functions, as
+ * needed, and replace the default by calling the setter for a
+ * method.
+ **/
 typedef struct hb_unicode_funcs_t hb_unicode_funcs_t;
 
 
@@ -227,40 +337,141 @@ hb_unicode_funcs_get_parent (hb_unicode_funcs_t *ufuncs);
 
 /* typedefs */
 
+/**
+ * hb_unicode_combining_class_func_t:
+ * @ufuncs: A Unicode-functions structure
+ * @unicode: The code point to query
+ * @user_data: User data pointer passed by the caller
+ *
+ * A virtual method for the #hb_unicode_funcs_t structure.
+ *
+ * This method should retrieve the Canonical Combining Class (ccc)
+ * property for a specified Unicode code point. 
+ *
+ * Return value: The #hb_unicode_combining_class_t of @unicode
+ * 
+ **/
 typedef hb_unicode_combining_class_t   (*hb_unicode_combining_class_func_t)    (hb_unicode_funcs_t *ufuncs,
                                                                                 hb_codepoint_t      unicode,
                                                                                 void               *user_data);
+
+/**
+ * hb_unicode_general_category_func_t:
+ * @ufuncs: A Unicode-functions structure
+ * @unicode: The code point to query
+ * @user_data: User data pointer passed by the caller
+ *
+ * A virtual method for the #hb_unicode_funcs_t structure.
+ *
+ * This method should retrieve the General Category property for
+ * a specified Unicode code point.
+ * 
+ * Return value: The #hb_unicode_general_category_t of @unicode
+ *
+ **/
 typedef hb_unicode_general_category_t  (*hb_unicode_general_category_func_t)   (hb_unicode_funcs_t *ufuncs,
                                                                                 hb_codepoint_t      unicode,
                                                                                 void               *user_data);
+
+/**
+ * hb_unicode_mirroring_func_t:
+ * @ufuncs: A Unicode-functions structure
+ * @unicode: The code point to query
+ * @user_data: User data pointer passed by the caller
+ *
+ * A virtual method for the #hb_unicode_funcs_t structure.
+ *
+ * This method should retrieve the Bi-Directional Mirroring Glyph
+ * code point for a specified Unicode code point.
+ *
+ * <note>Note: If a code point does not have a specified
+ * Bi-Directional Mirroring Glyph defined, the method should
+ * return the original code point.</note>
+ * 
+ * Return value: The #hb_codepoint_t of the Mirroring Glyph for @unicode
+ *
+ **/
 typedef hb_codepoint_t                 (*hb_unicode_mirroring_func_t)          (hb_unicode_funcs_t *ufuncs,
                                                                                 hb_codepoint_t      unicode,
                                                                                 void               *user_data);
+
+/**
+ * hb_unicode_script_func_t:
+ * @ufuncs: A Unicode-functions structure
+ * @unicode: The code point to query
+ * @user_data: User data pointer passed by the caller
+ *
+ * A virtual method for the #hb_unicode_funcs_t structure.
+ *
+ * This method should retrieve the Script property for a 
+ * specified Unicode code point.
+ *
+ * Return value: The #hb_script_t of @unicode
+ * 
+ **/
 typedef hb_script_t                    (*hb_unicode_script_func_t)             (hb_unicode_funcs_t *ufuncs,
                                                                                 hb_codepoint_t      unicode,
                                                                                 void               *user_data);
 
+/**
+ * hb_unicode_compose_func_t:
+ * @ufuncs: A Unicode-functions structure
+ * @a: The first code point to compose
+ * @b: The second code point to compose
+ * @ab: (out): The composed code point
+ * @user_data: user data pointer passed by the caller
+ *
+ * A virtual method for the #hb_unicode_funcs_t structure.
+ *
+ * This method should compose a sequence of two input Unicode code
+ * points by canonical equivalence, returning the composed code
+ * point in a #hb_codepoint_t output parameter (if successful).
+ * The method must return an #hb_bool_t indicating the success
+ * of the composition.
+ * 
+ * Return value: %true is @a,@b composed, %false otherwise
+ *
+ **/
 typedef hb_bool_t                      (*hb_unicode_compose_func_t)            (hb_unicode_funcs_t *ufuncs,
                                                                                 hb_codepoint_t      a,
                                                                                 hb_codepoint_t      b,
                                                                                 hb_codepoint_t     *ab,
                                                                                 void               *user_data);
+
+/**
+ * hb_unicode_decompose_func_t:
+ * @ufuncs: A Unicode-functions structure
+ * @ab: The code point to decompose
+ * @a: (out): The first decomposed code point
+ * @b: (out): The second decomposed code point
+ * @user_data: user data pointer passed by the caller
+ *
+ * A virtual method for the #hb_unicode_funcs_t structure.
+ *
+ * This method should decompose an input Unicode code point,
+ * returning the two decomposed code points in #hb_codepoint_t
+ * output parameters (if successful). The method must return an
+ * #hb_bool_t indicating the success of the composition.
+ * 
+ * Return value: %true if @ab decomposed, %false otherwise
+ *
+ **/
 typedef hb_bool_t                      (*hb_unicode_decompose_func_t)          (hb_unicode_funcs_t *ufuncs,
                                                                                 hb_codepoint_t      ab,
                                                                                 hb_codepoint_t     *a,
                                                                                 hb_codepoint_t     *b,
                                                                                 void               *user_data);
 
-/* setters */
+/* func setters */
 
 /**
  * hb_unicode_funcs_set_combining_class_func:
- * @ufuncs: a Unicode function structure
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
- *
+ * @ufuncs: A Unicode-functions structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
+ * @user_data: Data to pass to @func
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
  *
+ * Sets the implementation function for #hb_unicode_combining_class_func_t.
  *
  * Since: 0.9.2
  **/
@@ -271,12 +482,12 @@ hb_unicode_funcs_set_combining_class_func (hb_unicode_funcs_t *ufuncs,
 
 /**
  * hb_unicode_funcs_set_general_category_func:
- * @ufuncs: a Unicode function structure
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
- *
+ * @ufuncs: A Unicode-functions structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
+ * @user_data: Data to pass to @func
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
  *
+ * Sets the implementation function for #hb_unicode_general_category_func_t.
  *
  * Since: 0.9.2
  **/
@@ -287,12 +498,12 @@ hb_unicode_funcs_set_general_category_func (hb_unicode_funcs_t *ufuncs,
 
 /**
  * hb_unicode_funcs_set_mirroring_func:
- * @ufuncs: a Unicode function structure
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
- *
+ * @ufuncs: A Unicode-functions structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
+ * @user_data: Data to pass to @func
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
  *
+ * Sets the implementation function for #hb_unicode_mirroring_func_t.
  *
  * Since: 0.9.2
  **/
@@ -303,12 +514,12 @@ hb_unicode_funcs_set_mirroring_func (hb_unicode_funcs_t *ufuncs,
 
 /**
  * hb_unicode_funcs_set_script_func:
- * @ufuncs: a Unicode function structure
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
- *
+ * @ufuncs: A Unicode-functions structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
+ * @user_data: Data to pass to @func
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
  *
+ * Sets the implementation function for #hb_unicode_script_func_t.
  *
  * Since: 0.9.2
  **/
@@ -319,12 +530,12 @@ hb_unicode_funcs_set_script_func (hb_unicode_funcs_t *ufuncs,
 
 /**
  * hb_unicode_funcs_set_compose_func:
- * @ufuncs: a Unicode function structure
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
- *
+ * @ufuncs: A Unicode-functions structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
+ * @user_data: Data to pass to @func
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
  *
+ * Sets the implementation function for #hb_unicode_compose_func_t.
  *
  * Since: 0.9.2
  **/
@@ -335,12 +546,12 @@ hb_unicode_funcs_set_compose_func (hb_unicode_funcs_t *ufuncs,
 
 /**
  * hb_unicode_funcs_set_decompose_func:
- * @ufuncs: a Unicode function structure
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
- *
+ * @ufuncs: A Unicode-functions structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
+ * @user_data: Data to pass to @func
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
  *
+ * Sets the implementation function for #hb_unicode_decompose_func_t.
  *
  * Since: 0.9.2
  **/
@@ -353,6 +564,13 @@ hb_unicode_funcs_set_decompose_func (hb_unicode_funcs_t *ufuncs,
 
 /**
  * hb_unicode_combining_class:
+ * @ufuncs: The Unicode-functions structure
+ * @unicode: The code point to query
+ *
+ * Retrieves the Canonical Combining Class (ccc) property
+ * of code point @unicode.
+ *
+ * Return value: The #hb_unicode_combining_class_t of @unicode
  *
  * Since: 0.9.2
  **/
@@ -362,6 +580,13 @@ hb_unicode_combining_class (hb_unicode_funcs_t *ufuncs,
 
 /**
  * hb_unicode_general_category:
+ * @ufuncs: The Unicode-functions structure
+ * @unicode: The code point to query
+ *
+ * Retrieves the General Category (gc) property
+ * of code point @unicode.
+ *
+ * Return value: The #hb_unicode_general_category_t of @unicode
  *
  * Since: 0.9.2
  **/
@@ -371,6 +596,13 @@ hb_unicode_general_category (hb_unicode_funcs_t *ufuncs,
 
 /**
  * hb_unicode_mirroring:
+ * @ufuncs: The Unicode-functions structure
+ * @unicode: The code point to query
+ *
+ * Retrieves the Bi-directional Mirroring Glyph code
+ * point defined for code point @unicode.
+ *
+ * Return value: The #hb_codepoint_t of the Mirroring Glyph for @unicode
  *
  * Since: 0.9.2
  **/
@@ -380,6 +612,13 @@ hb_unicode_mirroring (hb_unicode_funcs_t *ufuncs,
 
 /**
  * hb_unicode_script:
+ * @ufuncs: The Unicode-functions structure
+ * @unicode: The code point to query
+ *
+ * Retrieves the #hb_script_t script to which code
+ * point @unicode belongs.
+ *
+ * Return value: The #hb_script_t of @unicode
  *
  * Since: 0.9.2
  **/
index 34d66d7..4c28bb0 100644 (file)
@@ -121,7 +121,7 @@ HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE
   static hb_bool_t
   is_variation_selector (hb_codepoint_t unicode)
   {
-    /* U+180B..180D MONGOLIAN FREE VARIATION SELECTORs are handled in the
+    /* U+180B..180D, U+180F MONGOLIAN FREE VARIATION SELECTORs are handled in the
      * Arabic shaper.  No need to match them here. */
     return unlikely (hb_in_ranges<hb_codepoint_t> (unicode,
                                                   0xFE00u, 0xFE0Fu, /* VARIATION SELECTOR-1..16 */
@@ -136,7 +136,7 @@ HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE
    * As such, we make exceptions for those four.
    * Also ignoring U+1BCA0..1BCA3. https://github.com/harfbuzz/harfbuzz/issues/503
    *
-   * Unicode 7.0:
+   * Unicode 14.0:
    * $ grep '; Default_Ignorable_Code_Point ' DerivedCoreProperties.txt | sed 's/;.*#/#/'
    * 00AD          # Cf       SOFT HYPHEN
    * 034F          # Mn       COMBINING GRAPHEME JOINER
@@ -145,6 +145,7 @@ HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE
    * 17B4..17B5    # Mn   [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA
    * 180B..180D    # Mn   [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE
    * 180E          # Cf       MONGOLIAN VOWEL SEPARATOR
+   * 180F          # Mn       MONGOLIAN FREE VARIATION SELECTOR FOUR
    * 200B..200F    # Cf   [5] ZERO WIDTH SPACE..RIGHT-TO-LEFT MARK
    * 202A..202E    # Cf   [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE
    * 2060..2064    # Cf   [5] WORD JOINER..INVISIBLE PLUS
@@ -289,8 +290,8 @@ DECLARE_NULL_INSTANCE (hb_unicode_funcs_t);
 #define HB_MODIFIED_COMBINING_CLASS_CCC15 18 /* tsere */
 #define HB_MODIFIED_COMBINING_CLASS_CCC16 19 /* segol */
 #define HB_MODIFIED_COMBINING_CLASS_CCC17 20 /* patah */
-#define HB_MODIFIED_COMBINING_CLASS_CCC18 21 /* qamats */
-#define HB_MODIFIED_COMBINING_CLASS_CCC19 14 /* holam */
+#define HB_MODIFIED_COMBINING_CLASS_CCC18 21 /* qamats & qamats qatan */
+#define HB_MODIFIED_COMBINING_CLASS_CCC19 14 /* holam & holam haser for vav*/
 #define HB_MODIFIED_COMBINING_CLASS_CCC20 24 /* qubuts */
 #define HB_MODIFIED_COMBINING_CLASS_CCC21 12 /* dagesh */
 #define HB_MODIFIED_COMBINING_CLASS_CCC22 25 /* meteg */
@@ -359,6 +360,13 @@ DECLARE_NULL_INSTANCE (hb_unicode_funcs_t);
          FLAG (HB_UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK) | \
          FLAG (HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK)))
 
+#define HB_UNICODE_GENERAL_CATEGORY_IS_LETTER(gen_cat) \
+       (FLAG_UNSAFE (gen_cat) & \
+        (FLAG (HB_UNICODE_GENERAL_CATEGORY_LOWERCASE_LETTER) | \
+         FLAG (HB_UNICODE_GENERAL_CATEGORY_MODIFIER_LETTER) | \
+         FLAG (HB_UNICODE_GENERAL_CATEGORY_OTHER_LETTER) | \
+         FLAG (HB_UNICODE_GENERAL_CATEGORY_TITLECASE_LETTER) | \
+         FLAG (HB_UNICODE_GENERAL_CATEGORY_UPPERCASE_LETTER)))
 
 /*
  * Ranges, used for bsearch tables.
index 48a5dc5..50f71ce 100644 (file)
@@ -44,6 +44,7 @@
 
 #include "hb-uniscribe.h"
 
+#include "hb-ms-feature-ranges.hh"
 #include "hb-open-file.hh"
 #include "hb-ot-name-table.hh"
 #include "hb-ot-layout.h"
@@ -238,30 +239,26 @@ struct hb_uniscribe_shaper_funcs_t
   }
 };
 
-#if HB_USE_ATEXIT
-static void free_static_uniscribe_shaper_funcs ();
-#endif
+static inline void free_static_uniscribe_shaper_funcs ();
 
 static struct hb_uniscribe_shaper_funcs_lazy_loader_t : hb_lazy_loader_t<hb_uniscribe_shaper_funcs_t,
                                                                         hb_uniscribe_shaper_funcs_lazy_loader_t>
 {
   static hb_uniscribe_shaper_funcs_t *create ()
   {
-    hb_uniscribe_shaper_funcs_t *funcs = (hb_uniscribe_shaper_funcs_t *) calloc (1, sizeof (hb_uniscribe_shaper_funcs_t));
+    hb_uniscribe_shaper_funcs_t *funcs = (hb_uniscribe_shaper_funcs_t *) hb_calloc (1, sizeof (hb_uniscribe_shaper_funcs_t));
     if (unlikely (!funcs))
       return nullptr;
 
     funcs->init ();
 
-#if HB_USE_ATEXIT
-    atexit (free_static_uniscribe_shaper_funcs);
-#endif
+    hb_atexit (free_static_uniscribe_shaper_funcs);
 
     return funcs;
   }
   static void destroy (hb_uniscribe_shaper_funcs_t *p)
   {
-    free ((void *) p);
+    hb_free ((void *) p);
   }
   static hb_uniscribe_shaper_funcs_t *get_null ()
   {
@@ -269,13 +266,11 @@ static struct hb_uniscribe_shaper_funcs_lazy_loader_t : hb_lazy_loader_t<hb_unis
   }
 } static_uniscribe_shaper_funcs;
 
-#if HB_USE_ATEXIT
-static
+static inline
 void free_static_uniscribe_shaper_funcs ()
 {
   static_uniscribe_shaper_funcs.free_instance ();
 }
-#endif
 
 static hb_uniscribe_shaper_funcs_t *
 hb_uniscribe_shaper_get_funcs ()
@@ -284,44 +279,6 @@ hb_uniscribe_shaper_get_funcs ()
 }
 
 
-struct active_feature_t {
-  OPENTYPE_FEATURE_RECORD rec;
-  unsigned int order;
-
-  HB_INTERNAL static int cmp (const void *pa, const void *pb) {
-    const active_feature_t *a = (const active_feature_t *) pa;
-    const active_feature_t *b = (const active_feature_t *) pb;
-    return a->rec.tagFeature < b->rec.tagFeature ? -1 : a->rec.tagFeature > b->rec.tagFeature ? 1 :
-          a->order < b->order ? -1 : a->order > b->order ? 1 :
-          a->rec.lParameter < b->rec.lParameter ? -1 : a->rec.lParameter > b->rec.lParameter ? 1 :
-          0;
-  }
-  bool operator== (const active_feature_t *f)
-  { return cmp (this, f) == 0; }
-};
-
-struct feature_event_t {
-  unsigned int index;
-  bool start;
-  active_feature_t feature;
-
-  HB_INTERNAL static int cmp (const void *pa, const void *pb)
-  {
-    const feature_event_t *a = (const feature_event_t *) pa;
-    const feature_event_t *b = (const feature_event_t *) pb;
-    return a->index < b->index ? -1 : a->index > b->index ? 1 :
-          a->start < b->start ? -1 : a->start > b->start ? 1 :
-          active_feature_t::cmp (&a->feature, &b->feature);
-  }
-};
-
-struct range_record_t {
-  TEXTRANGE_PROPERTIES props;
-  unsigned int index_first; /* == start */
-  unsigned int index_last;  /* == end - 1 */
-};
-
-
 /*
  * shaper face data
  */
@@ -391,7 +348,7 @@ _hb_rename_font (hb_blob_t *blob, wchar_t *new_name)
   unsigned int name_table_offset = (length + 3) & ~3;
 
   new_length = name_table_offset + padded_name_table_length;
-  void *new_sfnt_data = calloc (1, new_length);
+  void *new_sfnt_data = hb_calloc (1, new_length);
   if (!new_sfnt_data)
   {
     hb_blob_destroy (blob);
@@ -441,7 +398,7 @@ _hb_rename_font (hb_blob_t *blob, wchar_t *new_name)
     }
     else if (face_index == 0) /* Fail if first face doesn't have 'name' table. */
     {
-      free (new_sfnt_data);
+      hb_free (new_sfnt_data);
       hb_blob_destroy (blob);
       return nullptr;
     }
@@ -453,20 +410,20 @@ _hb_rename_font (hb_blob_t *blob, wchar_t *new_name)
 
   hb_blob_destroy (blob);
   return hb_blob_create ((const char *) new_sfnt_data, new_length,
-                        HB_MEMORY_MODE_WRITABLE, new_sfnt_data, free);
+                        HB_MEMORY_MODE_WRITABLE, new_sfnt_data, hb_free);
 }
 
 hb_uniscribe_face_data_t *
 _hb_uniscribe_shaper_face_data_create (hb_face_t *face)
 {
-  hb_uniscribe_face_data_t *data = (hb_uniscribe_face_data_t *) calloc (1, sizeof (hb_uniscribe_face_data_t));
+  hb_uniscribe_face_data_t *data = (hb_uniscribe_face_data_t *) hb_calloc (1, sizeof (hb_uniscribe_face_data_t));
   if (unlikely (!data))
     return nullptr;
 
   data->funcs = hb_uniscribe_shaper_get_funcs ();
   if (unlikely (!data->funcs))
   {
-    free (data);
+    hb_free (data);
     return nullptr;
   }
 
@@ -477,7 +434,7 @@ _hb_uniscribe_shaper_face_data_create (hb_face_t *face)
   blob = _hb_rename_font (blob, data->face_name);
   if (unlikely (!blob))
   {
-    free (data);
+    hb_free (data);
     return nullptr;
   }
 
@@ -488,7 +445,7 @@ _hb_uniscribe_shaper_face_data_create (hb_face_t *face)
   if (unlikely (!data->fh))
   {
     DEBUG_MSG (UNISCRIBE, face, "Face AddFontMemResourceEx() failed");
-    free (data);
+    hb_free (data);
     return nullptr;
   }
 
@@ -499,7 +456,7 @@ void
 _hb_uniscribe_shaper_face_data_destroy (hb_uniscribe_face_data_t *data)
 {
   RemoveFontMemResourceEx (data->fh);
-  free (data);
+  hb_free (data);
 }
 
 
@@ -533,7 +490,7 @@ populate_log_font (LOGFONTW  *lf,
 hb_uniscribe_font_data_t *
 _hb_uniscribe_shaper_font_data_create (hb_font_t *font)
 {
-  hb_uniscribe_font_data_t *data = (hb_uniscribe_font_data_t *) calloc (1, sizeof (hb_uniscribe_font_data_t));
+  hb_uniscribe_font_data_t *data = (hb_uniscribe_font_data_t *) hb_calloc (1, sizeof (hb_uniscribe_font_data_t));
   if (unlikely (!data))
     return nullptr;
 
@@ -580,7 +537,7 @@ _hb_uniscribe_shaper_font_data_destroy (hb_uniscribe_font_data_t *data)
     DeleteObject (data->hfont);
   if (data->script_cache)
     ScriptFreeCache (&data->script_cache);
-  free (data);
+  hb_free (data);
 }
 
 /**
@@ -635,109 +592,6 @@ _hb_uniscribe_shape (hb_shape_plan_t    *shape_plan,
   const hb_uniscribe_font_data_t *font_data = font->data.uniscribe;
   hb_uniscribe_shaper_funcs_t *funcs = face_data->funcs;
 
-  /*
-   * Set up features.
-   */
-  hb_vector_t<OPENTYPE_FEATURE_RECORD> feature_records;
-  hb_vector_t<range_record_t> range_records;
-  if (num_features)
-  {
-    /* Sort features by start/end events. */
-    hb_vector_t<feature_event_t> feature_events;
-    for (unsigned int i = 0; i < num_features; i++)
-    {
-      active_feature_t feature;
-      feature.rec.tagFeature = hb_uint32_swap (features[i].tag);
-      feature.rec.lParameter = features[i].value;
-      feature.order = i;
-
-      feature_event_t *event;
-
-      event = feature_events.push ();
-      event->index = features[i].start;
-      event->start = true;
-      event->feature = feature;
-
-      event = feature_events.push ();
-      event->index = features[i].end;
-      event->start = false;
-      event->feature = feature;
-    }
-    feature_events.qsort ();
-    /* Add a strategic final event. */
-    {
-      active_feature_t feature;
-      feature.rec.tagFeature = 0;
-      feature.rec.lParameter = 0;
-      feature.order = num_features + 1;
-
-      feature_event_t *event = feature_events.push ();
-      event->index = 0; /* This value does magic. */
-      event->start = false;
-      event->feature = feature;
-    }
-
-    /* Scan events and save features for each range. */
-    hb_vector_t<active_feature_t> active_features;
-    unsigned int last_index = 0;
-    for (unsigned int i = 0; i < feature_events.length; i++)
-    {
-      feature_event_t *event = &feature_events[i];
-
-      if (event->index != last_index)
-      {
-       /* Save a snapshot of active features and the range. */
-       range_record_t *range = range_records.push ();
-
-       unsigned int offset = feature_records.length;
-
-       active_features.qsort ();
-       for (unsigned int j = 0; j < active_features.length; j++)
-       {
-         if (!j || active_features[j].rec.tagFeature != feature_records[feature_records.length - 1].tagFeature)
-         {
-           feature_records.push (active_features[j].rec);
-         }
-         else
-         {
-           /* Overrides value for existing feature. */
-           feature_records[feature_records.length - 1].lParameter = active_features[j].rec.lParameter;
-         }
-       }
-
-       /* Will convert to pointer after all is ready, since feature_records.array
-        * may move as we grow it. */
-       range->props.potfRecords = reinterpret_cast<OPENTYPE_FEATURE_RECORD *> (offset);
-       range->props.cotfRecords = feature_records.length - offset;
-       range->index_first = last_index;
-       range->index_last  = event->index - 1;
-
-       last_index = event->index;
-      }
-
-      if (event->start)
-      {
-       active_features.push (event->feature);
-      }
-      else
-      {
-       active_feature_t *feature = active_features.find (&event->feature);
-       if (feature)
-         active_features.remove (feature - active_features.arrayZ);
-      }
-    }
-
-    if (!range_records.length) /* No active feature found. */
-      num_features = 0;
-
-    /* Fixup the pointers. */
-    for (unsigned int i = 0; i < range_records.length; i++)
-    {
-      range_record_t *range = &range_records[i];
-      range->props.potfRecords = (OPENTYPE_FEATURE_RECORD *) feature_records + reinterpret_cast<uintptr_t> (range->props.potfRecords);
-    }
-  }
-
 #define FAIL(...) \
   HB_STMT_START { \
     DEBUG_MSG (UNISCRIBE, nullptr, __VA_ARGS__); \
@@ -856,8 +710,23 @@ retry:
                                       nullptr, nullptr,
                                       &lang_count, &lang_tag);
   OPENTYPE_TAG language_tag = hb_uint32_swap (lang_count ? lang_tag : HB_TAG_NONE);
-  hb_vector_t<TEXTRANGE_PROPERTIES*> range_properties;
-  hb_vector_t<int> range_char_counts;
+
+  /*
+   * Set up features.
+   */
+  static_assert ((sizeof (TEXTRANGE_PROPERTIES) == sizeof (hb_ms_features_t)), "");
+  static_assert ((sizeof (OPENTYPE_FEATURE_RECORD) == sizeof (hb_ms_feature_t)), "");
+  hb_vector_t<hb_ms_feature_t> feature_records;
+  hb_vector_t<hb_ms_range_record_t> range_records;
+  bool has_features = false;
+  if (num_features)
+    has_features = hb_ms_setup_features (features,
+                                        num_features,
+                                        feature_records,
+                                        range_records);
+
+  hb_vector_t<hb_ms_features_t*> range_properties;
+  hb_vector_t<uint32_t> range_char_counts;
 
   unsigned int glyphs_offset = 0;
   unsigned int glyphs_len;
@@ -867,42 +736,14 @@ retry:
     unsigned int chars_offset = items[i].iCharPos;
     unsigned int item_chars_len = items[i + 1].iCharPos - chars_offset;
 
-    if (num_features)
-    {
-      range_properties.shrink (0);
-      range_char_counts.shrink (0);
-
-      range_record_t *last_range = &range_records[0];
-
-      for (unsigned int k = chars_offset; k < chars_offset + item_chars_len; k++)
-      {
-       range_record_t *range = last_range;
-       while (log_clusters[k] < range->index_first)
-         range--;
-       while (log_clusters[k] > range->index_last)
-         range++;
-       if (!range_properties.length ||
-           &range->props != range_properties[range_properties.length - 1])
-       {
-         TEXTRANGE_PROPERTIES **props = range_properties.push ();
-         int *c = range_char_counts.push ();
-         if (unlikely (!props || !c))
-         {
-           range_properties.shrink (0);
-           range_char_counts.shrink (0);
-           break;
-         }
-         *props = &range->props;
-         *c = 1;
-       }
-       else
-       {
-         range_char_counts[range_char_counts.length - 1]++;
-       }
-
-       last_range = range;
-      }
-    }
+    if (has_features)
+      hb_ms_make_feature_ranges (feature_records,
+                                range_records,
+                                item_chars_len,
+                                chars_offset,
+                                log_clusters,
+                                range_properties,
+                                range_char_counts);
 
     /* Asking for glyphs in logical order circumvents at least
      * one bug in Uniscribe. */
@@ -914,8 +755,8 @@ retry:
                                     &items[i].a,
                                     script_tags[i],
                                     language_tag,
-                                    range_char_counts.arrayZ,
-                                    range_properties.arrayZ,
+                                    (int *) range_char_counts.arrayZ,
+                                    (TEXTRANGE_PROPERTIES**) range_properties.arrayZ,
                                     range_properties.length,
                                     pchars + chars_offset,
                                     item_chars_len,
@@ -955,8 +796,8 @@ retry:
                                     &items[i].a,
                                     script_tags[i],
                                     language_tag,
-                                    range_char_counts.arrayZ,
-                                    range_properties.arrayZ,
+                                    (int *) range_char_counts.arrayZ,
+                                    (TEXTRANGE_PROPERTIES**) range_properties.arrayZ,
                                     range_properties.length,
                                     pchars + chars_offset,
                                     log_clusters + chars_offset,
@@ -1037,7 +878,8 @@ retry:
   if (backward)
     hb_buffer_reverse (buffer);
 
-  buffer->unsafe_to_break_all ();
+  buffer->clear_glyph_flags ();
+  buffer->unsafe_to_break ();
 
   /* Wow, done! */
   return true;
index d979169..6c7d32e 100644 (file)
 #include "hb-null.hh"
 
 
-template <typename Type>
-struct hb_vector_t
+template <typename Type,
+         bool sorted=false>
+struct hb_vector_t : std::conditional<sorted, hb_vector_t<Type, false>, hb_empty_t>::type
 {
   typedef Type item_t;
   static constexpr unsigned item_size = hb_static_size (Type);
+  using array_t = typename std::conditional<sorted, hb_sorted_array_t<Type>, hb_array_t<Type>>::type;
+  using c_array_t = typename std::conditional<sorted, hb_sorted_array_t<const Type>, hb_array_t<const Type>>::type;
 
-  hb_vector_t ()  { init (); }
-  hb_vector_t (const hb_vector_t &o)
+  hb_vector_t () = default;
+  hb_vector_t (std::initializer_list<Type> lst) : hb_vector_t ()
+  {
+    alloc (lst.size ());
+    for (auto&& item : lst)
+      push (item);
+  }
+  template <typename Iterable,
+           hb_requires (hb_is_iterable (Iterable))>
+  hb_vector_t (const Iterable &o) : hb_vector_t ()
+  {
+    if (hb_iter (o).is_random_access_iterator)
+      alloc (hb_len (hb_iter (o)));
+    hb_copy (o, *this);
+  }
+  hb_vector_t (const hb_vector_t &o) : hb_vector_t ()
   {
-    init ();
     alloc (o.length);
     hb_copy (o, *this);
   }
@@ -55,11 +71,11 @@ struct hb_vector_t
   ~hb_vector_t () { fini (); }
 
   private:
-  int allocated; /* == -1 means allocation failed. */
+  int allocated = 0; /* == -1 means allocation failed. */
   public:
-  unsigned int length;
+  unsigned int length = 0;
   public:
-  Type *arrayZ;
+  Type *arrayZ = nullptr;
 
   void init ()
   {
@@ -69,18 +85,24 @@ struct hb_vector_t
 
   void fini ()
   {
-    free (arrayZ);
+    shrink_vector (0);
+    hb_free (arrayZ);
     init ();
   }
-  void fini_deep ()
+
+  void reset ()
   {
-    unsigned int count = length;
-    for (unsigned int i = 0; i < count; i++)
-      arrayZ[i].fini ();
-    fini ();
+    if (unlikely (in_error ()))
+      allocated = length; // Big hack!
+    resize (0);
   }
 
-  void reset () { resize (0); }
+  friend void swap (hb_vector_t& a, hb_vector_t& b)
+  {
+    hb_swap (a.allocated, b.allocated);
+    hb_swap (a.length, b.length);
+    hb_swap (a.arrayZ, b.arrayZ);
+  }
 
   hb_vector_t& operator = (const hb_vector_t &o)
   {
@@ -91,11 +113,7 @@ struct hb_vector_t
   }
   hb_vector_t& operator = (hb_vector_t &&o)
   {
-    fini ();
-    allocated = o.allocated;
-    length = o.length;
-    arrayZ = o.arrayZ;
-    o.init ();
+    hb_swap (*this, o);
     return *this;
   }
 
@@ -129,26 +147,26 @@ struct hb_vector_t
 
   /* Sink interface. */
   template <typename T>
-  hb_vector_t& operator << (T&& v) { push (hb_forward<T> (v)); return *this; }
+  hb_vector_t& operator << (T&& v) { push (std::forward<T> (v)); return *this; }
 
-  hb_array_t<      Type> as_array ()       { return hb_array (arrayZ, length); }
-  hb_array_t<const Type> as_array () const { return hb_array (arrayZ, length); }
+  array_t   as_array ()       { return hb_array (arrayZ, length); }
+  c_array_t as_array () const { return hb_array (arrayZ, length); }
 
   /* Iterator. */
-  typedef hb_array_t<const Type>   iter_t;
-  typedef hb_array_t<      Type> writer_t;
+  typedef c_array_t   iter_t;
+  typedef array_t   writer_t;
     iter_t   iter () const { return as_array (); }
   writer_t writer ()       { return as_array (); }
   operator   iter_t () const { return   iter (); }
   operator writer_t ()       { return writer (); }
 
-  hb_array_t<const Type> sub_array (unsigned int start_offset, unsigned int count) const
+  c_array_t sub_array (unsigned int start_offset, unsigned int count) const
   { return as_array ().sub_array (start_offset, count); }
-  hb_array_t<const Type> sub_array (unsigned int start_offset, unsigned int *count = nullptr /* IN/OUT */) const
+  c_array_t sub_array (unsigned int start_offset, unsigned int *count = nullptr /* IN/OUT */) const
   { return as_array ().sub_array (start_offset, count); }
-  hb_array_t<Type> sub_array (unsigned int start_offset, unsigned int count)
+  array_t sub_array (unsigned int start_offset, unsigned int count)
   { return as_array ().sub_array (start_offset, count); }
-  hb_array_t<Type> sub_array (unsigned int start_offset, unsigned int *count = nullptr /* IN/OUT */)
+  array_t sub_array (unsigned int start_offset, unsigned int *count = nullptr /* IN/OUT */)
   { return as_array ().sub_array (start_offset, count); }
 
   hb_sorted_array_t<Type> as_sorted_array ()
@@ -171,17 +189,109 @@ struct hb_vector_t
   template <typename T>
   Type *push (T&& v)
   {
+    /* TODO Emplace? */
     Type *p = push ();
-    *p = hb_forward<T> (v);
+    if (p == &Crap (Type))
+      // If push failed to allocate then don't copy v, since this may cause
+      // the created copy to leak memory since we won't have stored a
+      // reference to it.
+      return p;
+    *p = std::forward<T> (v);
     return p;
   }
 
   bool in_error () const { return allocated < 0; }
 
+  template <typename T = Type,
+           hb_enable_if (std::is_trivially_copy_assignable<T>::value)>
+  Type *
+  realloc_vector (unsigned new_allocated)
+  {
+    return (Type *) hb_realloc (arrayZ, new_allocated * sizeof (Type));
+  }
+  template <typename T = Type,
+           hb_enable_if (!std::is_trivially_copy_assignable<T>::value)>
+  Type *
+  realloc_vector (unsigned new_allocated)
+  {
+    Type *new_array = (Type *) hb_malloc (new_allocated * sizeof (Type));
+    if (likely (new_array))
+    {
+      for (unsigned i = 0; i < length; i++)
+       new (std::addressof (new_array[i])) Type ();
+      for (unsigned i = 0; i < (unsigned) length; i++)
+       new_array[i] = std::move (arrayZ[i]);
+      unsigned old_length = length;
+      shrink_vector (0);
+      length = old_length;
+      hb_free (arrayZ);
+    }
+    return new_array;
+  }
+
+  template <typename T = Type,
+           hb_enable_if (std::is_trivially_constructible<T>::value ||
+                         !std::is_default_constructible<T>::value)>
+  void
+  grow_vector (unsigned size)
+  {
+    memset (arrayZ + length, 0, (size - length) * sizeof (*arrayZ));
+    length = size;
+  }
+  template <typename T = Type,
+           hb_enable_if (!std::is_trivially_constructible<T>::value &&
+                          std::is_default_constructible<T>::value)>
+  void
+  grow_vector (unsigned size)
+  {
+    while (length < size)
+    {
+      length++;
+      new (std::addressof (arrayZ[length - 1])) Type ();
+    }
+  }
+
+  template <typename T = Type,
+           hb_enable_if (std::is_trivially_destructible<T>::value)>
+  void
+  shrink_vector (unsigned size)
+  {
+    length = size;
+  }
+  template <typename T = Type,
+           hb_enable_if (!std::is_trivially_destructible<T>::value)>
+  void
+  shrink_vector (unsigned size)
+  {
+    while ((unsigned) length > size)
+    {
+      arrayZ[(unsigned) length - 1].~Type ();
+      length--;
+    }
+  }
+
+  template <typename T = Type,
+           hb_enable_if (std::is_trivially_copy_assignable<T>::value)>
+  void
+  shift_down_vector (unsigned i)
+  {
+    memmove (static_cast<void *> (&arrayZ[i - 1]),
+            static_cast<void *> (&arrayZ[i]),
+            (length - i) * sizeof (Type));
+  }
+  template <typename T = Type,
+           hb_enable_if (!std::is_trivially_copy_assignable<T>::value)>
+  void
+  shift_down_vector (unsigned i)
+  {
+    for (; i < length; i++)
+      arrayZ[i - 1] = std::move (arrayZ[i]);
+  }
+
   /* Allocate for size but don't adjust length. */
   bool alloc (unsigned int size)
   {
-    if (unlikely (allocated < 0))
+    if (unlikely (in_error ()))
       return false;
 
     if (likely (size <= (unsigned) allocated))
@@ -195,11 +305,11 @@ struct hb_vector_t
 
     Type *new_array = nullptr;
     bool overflows =
-      (int) new_allocated < 0 ||
+      (int) in_error () ||
       (new_allocated < (unsigned) allocated) ||
       hb_unsigned_mul_overflows (new_allocated, sizeof (Type));
     if (likely (!overflows))
-      new_array = (Type *) realloc (arrayZ, new_allocated * sizeof (Type));
+      new_array = realloc_vector (new_allocated);
 
     if (unlikely (!new_array))
     {
@@ -220,7 +330,9 @@ struct hb_vector_t
       return false;
 
     if (size > length)
-      memset (arrayZ + length, 0, (size - length) * sizeof (*arrayZ));
+      grow_vector (size);
+    else if (size < length)
+      shrink_vector (size);
 
     length = size;
     return true;
@@ -229,82 +341,66 @@ struct hb_vector_t
   Type pop ()
   {
     if (!length) return Null (Type);
-    return hb_move (arrayZ[--length]); /* Does this move actually work? */
+    Type v = std::move (arrayZ[length - 1]);
+    arrayZ[length - 1].~Type ();
+    length--;
+    return v;
   }
 
   void remove (unsigned int i)
   {
     if (unlikely (i >= length))
       return;
-    memmove (static_cast<void *> (&arrayZ[i]),
-            static_cast<void *> (&arrayZ[i + 1]),
-            (length - i - 1) * sizeof (Type));
+    arrayZ[i].~Type ();
+    shift_down_vector (i + 1);
     length--;
   }
 
   void shrink (int size_)
   {
     unsigned int size = size_ < 0 ? 0u : (unsigned int) size_;
-     if (size < length)
-       length = size;
-  }
+    if (size >= length)
+      return;
 
-  template <typename T>
-  Type *find (T v)
-  {
-    for (unsigned int i = 0; i < length; i++)
-      if (arrayZ[i] == v)
-       return &arrayZ[i];
-    return nullptr;
-  }
-  template <typename T>
-  const Type *find (T v) const
-  {
-    for (unsigned int i = 0; i < length; i++)
-      if (arrayZ[i] == v)
-       return &arrayZ[i];
-    return nullptr;
+    shrink_vector (size);
   }
 
+
+  /* Sorting API. */
   void qsort (int (*cmp)(const void*, const void*))
   { as_array ().qsort (cmp); }
   void qsort (unsigned int start = 0, unsigned int end = (unsigned int) -1)
   { as_array ().qsort (start, end); }
 
+  /* Unsorted search API. */
   template <typename T>
   Type *lsearch (const T &x, Type *not_found = nullptr)
   { return as_array ().lsearch (x, not_found); }
   template <typename T>
   const Type *lsearch (const T &x, const Type *not_found = nullptr) const
   { return as_array ().lsearch (x, not_found); }
-};
-
-template <typename Type>
-struct hb_sorted_vector_t : hb_vector_t<Type>
-{
-  hb_sorted_array_t<      Type> as_array ()       { return hb_sorted_array (this->arrayZ, this->length); }
-  hb_sorted_array_t<const Type> as_array () const { return hb_sorted_array (this->arrayZ, this->length); }
-
-  /* Iterator. */
-  typedef hb_sorted_array_t<const Type> const_iter_t;
-  typedef hb_sorted_array_t<      Type>       iter_t;
-  const_iter_t  iter () const { return as_array (); }
-  const_iter_t citer () const { return as_array (); }
-       iter_t  iter ()       { return as_array (); }
-  operator       iter_t ()       { return iter (); }
-  operator const_iter_t () const { return iter (); }
-
   template <typename T>
+  bool lfind (const T &x, unsigned *pos = nullptr) const
+  { return as_array ().lfind (x, pos); }
+
+  /* Sorted search API. */
+  template <typename T,
+           bool Sorted=sorted, hb_enable_if (Sorted)>
   Type *bsearch (const T &x, Type *not_found = nullptr)
   { return as_array ().bsearch (x, not_found); }
-  template <typename T>
+  template <typename T,
+           bool Sorted=sorted, hb_enable_if (Sorted)>
   const Type *bsearch (const T &x, const Type *not_found = nullptr) const
   { return as_array ().bsearch (x, not_found); }
-  template <typename T>
+  template <typename T,
+           bool Sorted=sorted, hb_enable_if (Sorted)>
   bool bfind (const T &x, unsigned int *i = nullptr,
-             hb_bfind_not_found_t not_found = HB_BFIND_NOT_FOUND_DONT_STORE,
+             hb_not_found_t not_found = HB_NOT_FOUND_DONT_STORE,
              unsigned int to_store = (unsigned int) -1) const
   { return as_array ().bfind (x, i, not_found, to_store); }
 };
 
+template <typename Type>
+using hb_sorted_vector_t = hb_vector_t<Type, true>;
+
 #endif /* HB_VECTOR_HH */
index f3ac9b0..1f52d92 100644 (file)
@@ -24,7 +24,7 @@
  * Google Author(s): Behdad Esfahbod
  */
 
-#ifndef HB_H_IN
+#if !defined(HB_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb.h> instead."
 #endif
 
 HB_BEGIN_DECLS
 
 
-#define HB_VERSION_MAJOR 2
-#define HB_VERSION_MINOR 6
-#define HB_VERSION_MICRO 7
+/**
+ * HB_VERSION_MAJOR:
+ *
+ * The major component of the library version available at compile-time.
+ */
+#define HB_VERSION_MAJOR 3
+/**
+ * HB_VERSION_MINOR:
+ *
+ * The minor component of the library version available at compile-time.
+ */
+#define HB_VERSION_MINOR 4
+/**
+ * HB_VERSION_MICRO:
+ *
+ * The micro component of the library version available at compile-time.
+ */
+#define HB_VERSION_MICRO 0
 
-#define HB_VERSION_STRING "2.6.7"
+/**
+ * HB_VERSION_STRING:
+ *
+ * A string literal containing the library version available at compile-time.
+ */
+#define HB_VERSION_STRING "3.4.0"
 
+/**
+ * HB_VERSION_ATLEAST:
+ * @major: the major component of the version number
+ * @minor: the minor component of the version number
+ * @micro: the micro component of the version number
+ *
+ * Tests the library version at compile-time against a minimum value,
+ * as three integer components.
+ */
 #define HB_VERSION_ATLEAST(major,minor,micro) \
        ((major)*10000+(minor)*100+(micro) <= \
         HB_VERSION_MAJOR*10000+HB_VERSION_MINOR*100+HB_VERSION_MICRO)
index 0ffd889..abcb73f 100644 (file)
@@ -24,7 +24,7 @@
  * Google Author(s): Behdad Esfahbod
  */
 
-#ifndef HB_H_IN
+#if !defined(HB_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb.h> instead."
 #endif
 
 HB_BEGIN_DECLS
 
 
+/**
+ * HB_VERSION_MAJOR:
+ *
+ * The major component of the library version available at compile-time.
+ */
 #define HB_VERSION_MAJOR @HB_VERSION_MAJOR@
+/**
+ * HB_VERSION_MINOR:
+ *
+ * The minor component of the library version available at compile-time.
+ */
 #define HB_VERSION_MINOR @HB_VERSION_MINOR@
+/**
+ * HB_VERSION_MICRO:
+ *
+ * The micro component of the library version available at compile-time.
+ */
 #define HB_VERSION_MICRO @HB_VERSION_MICRO@
 
+/**
+ * HB_VERSION_STRING:
+ *
+ * A string literal containing the library version available at compile-time.
+ */
 #define HB_VERSION_STRING "@HB_VERSION@"
 
+/**
+ * HB_VERSION_ATLEAST:
+ * @major: the major component of the version number
+ * @minor: the minor component of the version number
+ * @micro: the micro component of the version number
+ *
+ * Tests the library version at compile-time against a minimum value,
+ * as three integer components.
+ */
 #define HB_VERSION_ATLEAST(major,minor,micro) \
        ((major)*10000+(minor)*100+(micro) <= \
         HB_VERSION_MAJOR*10000+HB_VERSION_MINOR*100+HB_VERSION_MICRO)
index b0cc06c..360686c 100644 (file)
--- a/src/hb.h
+++ b/src/hb.h
@@ -39,6 +39,7 @@
 #include "hb-set.h"
 #include "hb-shape.h"
 #include "hb-shape-plan.h"
+#include "hb-style.h"
 #include "hb-unicode.h"
 #include "hb-version.h"
 
index 3adca88..b9f5f71 100644 (file)
--- a/src/hb.hh
+++ b/src/hb.hh
@@ -62,7 +62,7 @@
 
 /* Error.  Should never happen. */
 #ifndef HB_NO_PRAGMA_GCC_DIAGNOSTIC_ERROR
-#pragma GCC diagnostic error   "-Wc++11-narrowing"
+#pragma GCC diagnostic error   "-Wbitwise-instead-of-logical"
 #pragma GCC diagnostic error   "-Wcast-align"
 #pragma GCC diagnostic error   "-Wcast-function-type"
 #pragma GCC diagnostic error   "-Wdelete-non-virtual-dtor"
@@ -75,6 +75,7 @@
 #pragma GCC diagnostic error   "-Wmissing-braces"
 #pragma GCC diagnostic error   "-Wmissing-declarations"
 #pragma GCC diagnostic error   "-Wmissing-prototypes"
+#pragma GCC diagnostic error   "-Wnarrowing"
 #pragma GCC diagnostic error   "-Wnested-externs"
 #pragma GCC diagnostic error   "-Wold-style-definition"
 #pragma GCC diagnostic error   "-Wpointer-arith"
 #pragma GCC diagnostic warning "-Wmaybe-uninitialized"
 #pragma GCC diagnostic warning "-Wmissing-format-attribute"
 #pragma GCC diagnostic warning "-Wundef"
+#pragma GCC diagnostic warning "-Wunused-but-set-variable"
 #endif
 
 /* Ignored currently, but should be fixed at some point. */
 #pragma GCC diagnostic ignored "-Wshadow"                      // TODO fix
 #pragma GCC diagnostic ignored "-Wunsafe-loop-optimizations"   // TODO fix
 #pragma GCC diagnostic ignored "-Wunused-parameter"            // TODO fix
+#if defined(__GNUC__) && !defined(__clang__)
+#pragma GCC diagnostic ignored "-Wunused-result"               // TODO fix
+#endif
 #endif
 
 /* Ignored intentionally. */
 #pragma GCC diagnostic ignored "-Wformat-zero-length"
 #pragma GCC diagnostic ignored "-Wmissing-field-initializers"
 #pragma GCC diagnostic ignored "-Wpacked" // Erratic impl in clang
+#pragma GCC diagnostic ignored "-Wrange-loop-analysis" // https://github.com/harfbuzz/harfbuzz/issues/2834
 #pragma GCC diagnostic ignored "-Wstrict-aliasing"
 #pragma GCC diagnostic ignored "-Wtype-limits"
 #pragma GCC diagnostic ignored "-Wc++11-compat" // only gcc raises it
 #include "hb-aat.h"
 #define HB_AAT_H_IN
 
-#include <limits.h>
-#include <math.h>
-#include <float.h>
-#include <stdlib.h>
-#include <stddef.h>
-#include <string.h>
-#include <assert.h>
-#include <stdio.h>
-#include <stdarg.h>
+#include <cassert>
+#include <cfloat>
+#include <climits>
+#ifdef _MSC_VER
+# define _USE_MATH_DEFINES
+#endif
+#include <cmath>
+#include <cstdarg>
+#include <cstddef>
+#include <cstdio>
+#include <cstdlib>
+#include <cstring>
 
 #if (defined(_MSC_VER) && _MSC_VER >= 1500) || defined(__MINGW32__)
 #ifdef __MINGW32_VERSION
 #ifndef WIN32_LEAN_AND_MEAN
 #define WIN32_LEAN_AND_MEAN 1
 #endif
-#include <windows.h>
 #else
 #include <intrin.h>
 #endif
 #endif
 
+#ifdef _WIN32
+#include <windows.h>
+#include <winapifamily.h>
+#endif
+
 #define HB_PASTE1(a,b) a##b
 #define HB_PASTE(a,b) HB_PASTE1(a,b)
 
 
 /* Compile-time custom allocator support. */
 
-#if defined(hb_malloc_impl) \
- && defined(hb_calloc_impl) \
- && defined(hb_realloc_impl) \
- && defined(hb_free_impl)
+#if !defined(HB_CUSTOM_MALLOC) \
+  && defined(hb_malloc_impl) \
+  && defined(hb_calloc_impl) \
+  && defined(hb_realloc_impl) \
+  && defined(hb_free_impl)
+#define HB_CUSTOM_MALLOC
+#endif
+
+#ifdef HB_CUSTOM_MALLOC
 extern "C" void* hb_malloc_impl(size_t size);
 extern "C" void* hb_calloc_impl(size_t nmemb, size_t size);
 extern "C" void* hb_realloc_impl(void *ptr, size_t size);
 extern "C" void  hb_free_impl(void *ptr);
-#define malloc hb_malloc_impl
-#define calloc hb_calloc_impl
-#define realloc hb_realloc_impl
-#define free hb_free_impl
+#define hb_malloc hb_malloc_impl
+#define hb_calloc hb_calloc_impl
+#define hb_realloc hb_realloc_impl
+#define hb_free hb_free_impl
+#else
+#define hb_malloc malloc
+#define hb_calloc calloc
+#define hb_realloc realloc
+#define hb_free free
 #endif
 
 
@@ -234,12 +257,8 @@ extern "C" void  hb_free_impl(void *ptr);
 #endif
 
 #if defined(__GNUC__) && (__GNUC__ >= 3)
-#define HB_PURE_FUNC   __attribute__((pure))
-#define HB_CONST_FUNC  __attribute__((const))
 #define HB_PRINTF_FUNC(format_idx, arg_idx) __attribute__((__format__ (__printf__, format_idx, arg_idx)))
 #else
-#define HB_PURE_FUNC
-#define HB_CONST_FUNC
 #define HB_PRINTF_FUNC(format_idx, arg_idx)
 #endif
 #if defined(__GNUC__) && (__GNUC__ >= 4) || (__clang__)
@@ -328,7 +347,6 @@ extern "C" void  hb_free_impl(void *ptr);
 #else
 #  define HB_NODISCARD
 #endif
-#define hb_success_t HB_NODISCARD bool
 
 /* https://github.com/harfbuzz/harfbuzz/issues/1852 */
 #if defined(__clang__) && !(defined(_AIX) && (defined(__IBMCPP__) || defined(__ibmxl__)))
@@ -348,7 +366,7 @@ extern "C" void  hb_free_impl(void *ptr);
 #    undef _WIN32_WINNT
 #  endif
 #  ifndef _WIN32_WINNT
-#    if !defined(WINAPI_FAMILY) || !(WINAPI_FAMILY==WINAPI_FAMILY_PC_APP || WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP)
+#    if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
 #      define _WIN32_WINNT 0x0600
 #    endif
 #  endif
@@ -369,7 +387,7 @@ extern "C" void  hb_free_impl(void *ptr);
 #      define HB_NO_SETLOCALE
 #      define HB_NO_ERRNO
 #    endif
-#  elif defined(WINAPI_FAMILY) && (WINAPI_FAMILY==WINAPI_FAMILY_PC_APP || WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP)
+#  elif !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
 #    ifndef HB_NO_GETENV
 #      define HB_NO_GETENV
 #    endif
@@ -384,13 +402,16 @@ extern "C" void  hb_free_impl(void *ptr);
 #endif
 
 #ifndef HB_NO_ERRNO
-#  include <errno.h>
+#  include <cerrno>
 #else
 static int HB_UNUSED _hb_errno = 0;
 #  undef errno
 #  define errno _hb_errno
 #endif
 
+#define HB_STMT_START do
+#define HB_STMT_END   while (0)
+
 #if defined(HAVE_ATEXIT) && !defined(HB_USE_ATEXIT)
 /* atexit() is only safe to be called from shared libraries on certain
  * platforms.  Whitelist.
@@ -419,197 +440,32 @@ static int HB_UNUSED _hb_errno = 0;
  */
 #    define HB_USE_ATEXIT 1
 #  endif
-#endif
+#endif /* defined(HAVE_ATEXIT) && !defined(HB_USE_ATEXIT) */
 #ifdef HB_NO_ATEXIT
 #  undef HB_USE_ATEXIT
 #endif
 #ifndef HB_USE_ATEXIT
 #  define HB_USE_ATEXIT 0
 #endif
-
-#define HB_STMT_START do
-#define HB_STMT_END   while (0)
-
-/* Static-assert as expression. */
-template <unsigned int cond> class hb_assert_constant_t;
-template <> class hb_assert_constant_t<1> {};
-#define ASSERT_STATIC_EXPR_ZERO(_cond) (0 * (unsigned int) sizeof (hb_assert_constant_t<_cond>))
+#ifndef hb_atexit
+#if !HB_USE_ATEXIT
+#  define hb_atexit(_) HB_STMT_START { if (0) (_) (); } HB_STMT_END
+#else /* HB_USE_ATEXIT */
+#  ifdef HAVE_ATEXIT
+#    define hb_atexit atexit
+#  else
+     template <void (*function) (void)> struct hb_atexit_t { ~hb_atexit_t () { function (); } };
+#    define hb_atexit(f) static hb_atexit_t<f> _hb_atexit_##__LINE__;
+#  endif
+#endif
+#endif
 
 /* Lets assert int types.  Saves trouble down the road. */
-static_assert ((sizeof (int8_t) == 1), "");
-static_assert ((sizeof (uint8_t) == 1), "");
-static_assert ((sizeof (int16_t) == 2), "");
-static_assert ((sizeof (uint16_t) == 2), "");
-static_assert ((sizeof (int32_t) == 4), "");
-static_assert ((sizeof (uint32_t) == 4), "");
-static_assert ((sizeof (int64_t) == 8), "");
-static_assert ((sizeof (uint64_t) == 8), "");
 static_assert ((sizeof (hb_codepoint_t) == 4), "");
 static_assert ((sizeof (hb_position_t) == 4), "");
 static_assert ((sizeof (hb_mask_t) == 4), "");
 static_assert ((sizeof (hb_var_int_t) == 4), "");
 
-#define HB_DELETE_COPY_ASSIGN(TypeName) \
-  TypeName(const TypeName&) = delete; \
-  void operator=(const TypeName&) = delete
-#define HB_DELETE_CREATE_COPY_ASSIGN(TypeName) \
-  TypeName() = delete; \
-  TypeName(const TypeName&) = delete; \
-  void operator=(const TypeName&) = delete
-
-
-/* Flags */
-
-/* Enable bitwise ops on enums marked as flags_t */
-/* To my surprise, looks like the function resolver is happy to silently cast
- * one enum to another...  So this doesn't provide the type-checking that I
- * originally had in mind... :(.
- *
- * For MSVC warnings, see: https://github.com/harfbuzz/harfbuzz/pull/163
- */
-#ifdef _MSC_VER
-# pragma warning(disable:4200)
-# pragma warning(disable:4800)
-#endif
-#define HB_MARK_AS_FLAG_T(T) \
-       extern "C++" { \
-         static inline T operator | (T l, T r) { return T ((unsigned) l | (unsigned) r); } \
-         static inline T operator & (T l, T r) { return T ((unsigned) l & (unsigned) r); } \
-         static inline T operator ^ (T l, T r) { return T ((unsigned) l ^ (unsigned) r); } \
-         static inline T operator ~ (T r) { return T (~(unsigned int) r); } \
-         static inline T& operator |= (T &l, T r) { l = l | r; return l; } \
-         static inline T& operator &= (T& l, T r) { l = l & r; return l; } \
-         static inline T& operator ^= (T& l, T r) { l = l ^ r; return l; } \
-       } \
-       static_assert (true, "")
-
-/* Useful for set-operations on small enums.
- * For example, for testing "x ∈ {x1, x2, x3}" use:
- * (FLAG_UNSAFE(x) & (FLAG(x1) | FLAG(x2) | FLAG(x3)))
- */
-#define FLAG(x) (ASSERT_STATIC_EXPR_ZERO ((unsigned)(x) < 32) + (((uint32_t) 1U) << (unsigned)(x)))
-#define FLAG_UNSAFE(x) ((unsigned)(x) < 32 ? (((uint32_t) 1U) << (unsigned)(x)) : 0)
-#define FLAG_RANGE(x,y) (ASSERT_STATIC_EXPR_ZERO ((x) < (y)) + FLAG(y+1) - FLAG(x))
-#define FLAG64(x) (ASSERT_STATIC_EXPR_ZERO ((unsigned)(x) < 64) + (((uint64_t) 1ULL) << (unsigned)(x)))
-#define FLAG64_UNSAFE(x) ((unsigned)(x) < 64 ? (((uint64_t) 1ULL) << (unsigned)(x)) : 0)
-
-
-/* Size signifying variable-sized array */
-#ifndef HB_VAR_ARRAY
-#define HB_VAR_ARRAY 1
-#endif
-
-static inline double
-_hb_roundf (float x)
-{
-  return x >= 0 ? floor ((double) x + .5) : ceil ((double) x - .5);
-}
-#ifndef HAVE_ROUNDF
-#define roundf(x) _hb_roundf(x)
-#endif
-
-/* Endian swap, used in Windows related backends */
-static inline uint16_t hb_uint16_swap (const uint16_t v)
-{ return (v >> 8) | (v << 8); }
-static inline uint32_t hb_uint32_swap (const uint32_t v)
-{ return (hb_uint16_swap (v) << 16) | hb_uint16_swap (v >> 16); }
-
-/*
- * Big-endian integers.  Here because fundamental.
- */
-
-template <typename Type, int Bytes> struct BEInt;
-
-template <typename Type>
-struct BEInt<Type, 1>
-{
-  public:
-  BEInt<Type, 1>& operator = (Type V)
-  {
-    v = V;
-    return *this;
-  }
-  operator Type () const { return v; }
-  private: uint8_t v;
-};
-template <typename Type>
-struct BEInt<Type, 2>
-{
-  public:
-  BEInt<Type, 2>& operator = (Type V)
-  {
-    v[0] = (V >>  8) & 0xFF;
-    v[1] = (V      ) & 0xFF;
-    return *this;
-  }
-  operator Type () const
-  {
-#if ((defined(__GNUC__) && __GNUC__ >= 5) || defined(__clang__)) && \
-    defined(__BYTE_ORDER) && \
-    (__BYTE_ORDER == __LITTLE_ENDIAN || __BYTE_ORDER == __BIG_ENDIAN)
-    /* Spoon-feed the compiler a big-endian integer with alignment 1.
-     * https://github.com/harfbuzz/harfbuzz/pull/1398 */
-    struct __attribute__((packed)) packed_uint16_t { uint16_t v; };
-#if __BYTE_ORDER == __LITTLE_ENDIAN
-    return __builtin_bswap16 (((packed_uint16_t *) this)->v);
-#else /* __BYTE_ORDER == __BIG_ENDIAN */
-    return ((packed_uint16_t *) this)->v;
-#endif
-#endif
-    return (v[0] <<  8)
-        + (v[1]      );
-  }
-  private: uint8_t v[2];
-};
-template <typename Type>
-struct BEInt<Type, 3>
-{
-  public:
-  BEInt<Type, 3>& operator = (Type V)
-  {
-    v[0] = (V >> 16) & 0xFF;
-    v[1] = (V >>  8) & 0xFF;
-    v[2] = (V      ) & 0xFF;
-    return *this;
-  }
-  operator Type () const
-  {
-    return (v[0] << 16)
-        + (v[1] <<  8)
-        + (v[2]      );
-  }
-  private: uint8_t v[3];
-};
-template <typename Type>
-struct BEInt<Type, 4>
-{
-  public:
-  BEInt<Type, 4>& operator = (Type V)
-  {
-    v[0] = (V >> 24) & 0xFF;
-    v[1] = (V >> 16) & 0xFF;
-    v[2] = (V >>  8) & 0xFF;
-    v[3] = (V      ) & 0xFF;
-    return *this;
-  }
-  operator Type () const
-  {
-    return (v[0] << 24)
-        + (v[1] << 16)
-        + (v[2] <<  8)
-        + (v[3]      );
-  }
-  private: uint8_t v[4];
-};
-
-
-/*
- * For lack of a better place, put Zawgyi script hack here.
- * https://github.com/harfbuzz/harfbuzz/issues/1162
- */
-
-#define HB_SCRIPT_MYANMAR_ZAWGYI       ((hb_script_t) HB_TAG ('Q','a','a','g'))
-
 
 /* Headers we include for everyone.  Keep topologically sorted by dependency.
  * They express dependency amongst themselves, but no other file should include
index e898e6e..1ab013c 100644 (file)
 #include "hb.h"
 #include "hb-ot.h"
 
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
+#include <cassert>
+#include <cstdlib>
+#include <cstdio>
+#include <cstring>
 
 #ifdef HB_NO_OPEN
-#define hb_blob_create_from_file(x)  hb_blob_get_empty ()
+#define hb_blob_create_from_file_or_fail(x)  hb_blob_get_empty ()
 #endif
 
 #if !defined(HB_NO_COLOR) && !defined(HB_NO_DRAW) && defined(HB_EXPERIMENTAL_API)
@@ -505,7 +506,8 @@ main (int argc, char **argv)
     exit (1);
   }
 
-  hb_blob_t *blob = hb_blob_create_from_file (argv[1]);
+  hb_blob_t *blob = hb_blob_create_from_file_or_fail (argv[1]);
+  assert (blob);
   printf ("Opened font file %s: %d bytes long\n", argv[1], hb_blob_get_length (blob));
 #ifndef MAIN_CC_NO_PRIVATE_API
   print_layout_info_using_private_api (blob);
index a156e10..c9d3f17 100644 (file)
@@ -1,13 +1,18 @@
+hb_version_h = configure_file(
+               command: [find_program('gen-hb-version.py'), meson.project_version(), '@OUTPUT@', '@INPUT@'],
+               input: 'hb-version.h.in',
+               output: 'hb-version.h',
+               install: true,
+               install_dir: get_option('includedir') / meson.project_name())
+
 # Base and default-included sources and headers
-hb_base_sources = [
-  'hb-aat-fdsc-table.hh',
+hb_base_sources = files(
   'hb-aat-layout-ankr-table.hh',
   'hb-aat-layout-bsln-table.hh',
   'hb-aat-layout-common.hh',
   'hb-aat-layout-feat-table.hh',
   'hb-aat-layout-just-table.hh',
   'hb-aat-layout-kerx-table.hh',
-  'hb-aat-layout-lcar-table.hh',
   'hb-aat-layout-morx-table.hh',
   'hb-aat-layout-opbd-table.hh',
   'hb-aat-layout-trak-table.hh',
@@ -19,9 +24,12 @@ hb_base_sources = [
   'hb-algs.hh',
   'hb-array.hh',
   'hb-atomic.hh',
+  'hb-bimap.hh',
+  'hb-bit-page.hh',
   'hb-blob.cc',
   'hb-blob.hh',
   'hb-buffer-serialize.cc',
+  'hb-buffer-verify.cc',
   'hb-buffer.cc',
   'hb-buffer.hh',
   'hb-cache.hh',
@@ -46,8 +54,8 @@ hb_base_sources = [
   'hb-machinery.hh',
   'hb-map.cc',
   'hb-map.hh',
-  'hb-bimap.hh',
   'hb-meta.hh',
+  'hb-ms-feature-ranges.hh',
   'hb-mutex.hh',
   'hb-null.hh',
   'hb-number.cc',
@@ -56,9 +64,9 @@ hb_base_sources = [
   'hb-open-file.hh',
   'hb-open-type.hh',
   'hb-ot-cff-common.hh',
+  'hb-ot-cff1-std-str.hh',
   'hb-ot-cff1-table.cc',
   'hb-ot-cff1-table.hh',
-  'hb-ot-cff1-std-str.hh',
   'hb-ot-cff2-table.cc',
   'hb-ot-cff2-table.hh',
   'hb-ot-cmap-table.hh',
@@ -68,9 +76,9 @@ hb_base_sources = [
   'hb-ot-color-sbix-table.hh',
   'hb-ot-color-svg-table.hh',
   'hb-ot-color.cc',
+  'hb-ot-face-table-list.hh',
   'hb-ot-face.cc',
   'hb-ot-face.hh',
-  'hb-ot-face-table-list.hh',
   'hb-ot-font.cc',
   'hb-ot-gasp-table.hh',
   'hb-ot-glyf-table.hh',
@@ -106,6 +114,7 @@ hb_base_sources = [
   'hb-ot-post-macroman.hh',
   'hb-ot-post-table.hh',
   'hb-ot-shape-complex-arabic-fallback.hh',
+  'hb-ot-shape-complex-arabic-joining-list.hh',
   'hb-ot-shape-complex-arabic-table.hh',
   'hb-ot-shape-complex-arabic-win1256.hh',
   'hb-ot-shape-complex-arabic.cc',
@@ -120,10 +129,11 @@ hb_base_sources = [
   'hb-ot-shape-complex-khmer.hh',
   'hb-ot-shape-complex-myanmar.cc',
   'hb-ot-shape-complex-myanmar.hh',
+  'hb-ot-shape-complex-syllabic.cc',
+  'hb-ot-shape-complex-syllabic.hh',
   'hb-ot-shape-complex-thai.cc',
-  'hb-ot-shape-complex-use-table.cc',
+  'hb-ot-shape-complex-use-table.hh',
   'hb-ot-shape-complex-use.cc',
-  'hb-ot-shape-complex-use.hh',
   'hb-ot-shape-complex-vowel-constraints.cc',
   'hb-ot-shape-complex-vowel-constraints.hh',
   'hb-ot-shape-complex.hh',
@@ -137,6 +147,7 @@ hb_base_sources = [
   'hb-ot-tag-table.hh',
   'hb-ot-tag.cc',
   'hb-ot-var-avar-table.hh',
+  'hb-ot-var-common.hh',
   'hb-ot-var-fvar-table.hh',
   'hb-ot-var-gvar-table.hh',
   'hb-ot-var-hvar-table.hh',
@@ -158,6 +169,7 @@ hb_base_sources = [
   'hb-shaper.hh',
   'hb-static.cc',
   'hb-string-array.hh',
+  'hb-style.cc',
   'hb-ucd-table.hh',
   'hb-ucd.cc',
   'hb-unicode-emoji-table.hh',
@@ -166,9 +178,9 @@ hb_base_sources = [
   'hb-utf.hh',
   'hb-vector.hh',
   'hb.hh',
-]
+)
 
-hb_base_ragel_generated_sources = [
+hb_base_ragel_generated_sources = files(
   'hb-buffer-deserialize-json.hh',
   'hb-buffer-deserialize-text.hh',
   'hb-number-parser.hh',
@@ -176,7 +188,7 @@ hb_base_ragel_generated_sources = [
   'hb-ot-shape-complex-khmer-machine.hh',
   'hb-ot-shape-complex-myanmar-machine.hh',
   'hb-ot-shape-complex-use-machine.hh',
-]
+)
 hb_base_ragel_sources = [
   'hb-buffer-deserialize-json.rl',
   'hb-buffer-deserialize-text.rl',
@@ -187,7 +199,7 @@ hb_base_ragel_sources = [
   'hb-ot-shape-complex-use-machine.rl',
 ]
 
-hb_base_headers = [
+hb_base_headers = files(
   'hb-aat-layout.h',
   'hb-aat.h',
   'hb-blob.h',
@@ -212,42 +224,43 @@ hb_base_headers = [
   'hb-set.h',
   'hb-shape-plan.h',
   'hb-shape.h',
+  'hb-style.h',
   'hb-unicode.h',
-  'hb-version.h',
   'hb.h',
-]
+)
+hb_base_headers += hb_version_h
 
 # Optional Sources and Headers with external deps
 
-hb_ft_sources = ['hb-ft.cc']
-hb_ft_headers = ['hb-ft.h']
+hb_ft_sources = files('hb-ft.cc')
+hb_ft_headers = files('hb-ft.h')
 
-hb_glib_sources = ['hb-glib.cc']
-hb_glib_headers = ['hb-glib.h']
+hb_glib_sources = files('hb-glib.cc')
+hb_glib_headers = files('hb-glib.h')
 
-hb_graphite2_sources = ['hb-graphite2.cc']
-hb_graphite2_headers = ['hb-graphite2.h']
+hb_graphite2_sources = files('hb-graphite2.cc')
+hb_graphite2_headers = files('hb-graphite2.h')
 
 # System-dependent sources and headers
 
-hb_coretext_sources = ['hb-coretext.cc']
-hb_coretext_headers = ['hb-coretext.h']
+hb_coretext_sources = files('hb-coretext.cc')
+hb_coretext_headers = files('hb-coretext.h')
 
-hb_directwrite_sources = ['hb-directwrite.cc']
-hb_directwrite_headers = ['hb-directwrite.h']
+hb_directwrite_sources = files('hb-directwrite.cc')
+hb_directwrite_headers = files('hb-directwrite.h')
 
-hb_gdi_sources = ['hb-gdi.cc']
-hb_gdi_headers = ['hb-gdi.h']
+hb_gdi_sources = files('hb-gdi.cc')
+hb_gdi_headers = files('hb-gdi.h')
 
-hb_uniscribe_sources = ['hb-uniscribe.cc']
-hb_uniscribe_headers = ['hb-uniscribe.h']
+hb_uniscribe_sources = files('hb-uniscribe.cc')
+hb_uniscribe_headers = files('hb-uniscribe.h')
 
 # Sources for libharfbuzz-gobject and libharfbuzz-icu
-hb_icu_sources = ['hb-icu.cc']
-hb_icu_headers = ['hb-icu.h']
+hb_icu_sources = files('hb-icu.cc')
+hb_icu_headers = files('hb-icu.h')
 
 # Sources for libharfbuzz-subset
-hb_subset_sources = [
+hb_subset_sources = files(
   'hb-number.cc',
   'hb-number.hh',
   'hb-ot-cff1-table.cc',
@@ -263,73 +276,83 @@ hb_subset_sources = [
   'hb-subset-input.hh',
   'hb-subset-plan.cc',
   'hb-subset-plan.hh',
-  'hb-subset-plan.hh',
   'hb-subset.cc',
   'hb-subset.hh',
-  'hb-subset.hh',
-]
+)
 
-hb_subset_headers = ['hb-subset.h']
+hb_subset_headers = files('hb-subset.h')
 
-hb_gobject_sources = [
+hb_gobject_sources = files(
   'hb-gobject-structs.cc'
-]
+)
 
-hb_gobject_headers = [
+hb_gobject_headers = files(
   'hb-gobject.h',
   'hb-gobject-structs.h',
-]
-
-custom_target('hb-version.h',
-  build_by_default: true,
-  input: 'hb-version.h.in',
-  output: 'hb-version.h',
-  command: [find_program('gen-hb-version.py'), meson.project_version(),
-            '@INPUT@', meson.current_source_dir() / 'hb-version.h'])
+)
 
-ragel = find_program('ragel', required: false)
-if not ragel.found()
+ragel = find_program('ragel', version: '6.10', required: false)
+has_ragel = ragel.found()
+if not has_ragel and get_option('ragel_subproject')
+    ragel = subproject('ragel').get_variable('ragel')
+    has_ragel = true
+endif
+if not has_ragel
   warning('You have to install ragel if you are going to develop HarfBuzz itself')
 else
-  custom_target('ragel header files',
-    build_by_default: true,
-    input: hb_base_ragel_sources,
-    output: '.ragel-artifacts',
-    command: [find_program('gen-ragel-artifacts.py')] + hb_base_ragel_sources)
+  ragel_helper = find_program('gen-ragel-artifacts.py')
+  foreach rl : hb_base_ragel_sources
+    hh = rl.split('.')[0] + '.hh'
+    custom_target('@0@'.format(hh),
+      build_by_default: true,
+      input: rl,
+      output: hh,
+      command: [ragel_helper, ragel, '@OUTPUT@', meson.current_source_dir(), '@INPUT@'],
+    )
+  endforeach
 endif
 
 custom_target('harfbuzz.cc',
   build_by_default: true,
   output: 'harfbuzz.cc',
+  input: hb_base_sources + hb_glib_sources + hb_ft_sources +
+         hb_graphite2_sources + hb_uniscribe_sources + hb_gdi_sources +
+         hb_directwrite_sources + hb_coretext_sources,
   command: [find_program('gen-harfbuzzcc.py'),
-            meson.source_root() / '@OUTPUT@'] +
-            hb_base_sources + hb_glib_sources + hb_ft_sources +
-            hb_graphite2_sources + hb_uniscribe_sources + hb_gdi_sources +
-            hb_directwrite_sources + hb_coretext_sources)
+            '@OUTPUT@', meson.current_source_dir(), '@INPUT@'],
+)
 
 incsrc = include_directories('.')
 
 hb_sources = hb_base_sources + hb_base_ragel_generated_sources
 hb_headers = hb_base_headers
 
+harfbuzz_deps = [thread_dep, m_dep] + harfbuzz_extra_deps
+
+libharfbuzz_link_language = 'c'
+
 if conf.get('HAVE_FREETYPE', 0) == 1
   hb_sources += hb_ft_sources
   hb_headers += hb_ft_headers
+  harfbuzz_deps += [freetype_dep]
 endif
 
 if conf.get('HAVE_GDI', 0) == 1
   hb_sources += hb_gdi_sources
   hb_headers += hb_gdi_headers
+  harfbuzz_deps += gdi_uniscribe_deps
 endif
 
 if conf.get('HAVE_GRAPHITE2', 0) == 1
   hb_sources += hb_graphite2_sources
   hb_headers += hb_graphite2_headers
+  harfbuzz_deps += [graphite2_dep, graphite_dep]
 endif
 
 if conf.get('HAVE_GLIB', 0) == 1
   hb_sources += hb_glib_sources
   hb_headers += hb_glib_headers
+  harfbuzz_deps += [glib_dep]
 endif
 
 if conf.get('HAVE_UNISCRIBE', 0) == 1
@@ -340,16 +363,15 @@ endif
 if conf.get('HAVE_DIRECTWRITE', 0) == 1
   hb_sources += hb_directwrite_sources
   hb_headers += hb_directwrite_headers
+  harfbuzz_deps += directwrite_dep
+  # hb-directwrite needs a C++ linker
+  libharfbuzz_link_language = 'cpp'
 endif
 
 if conf.get('HAVE_CORETEXT', 0) == 1
   hb_sources += hb_coretext_sources
   hb_headers += hb_coretext_headers
-endif
-
-if get_option('amalgam')
-  # replace the array if is amalgam build
-  hb_sources = ['harfbuzz.cc']
+  harfbuzz_deps += coretext_deps
 endif
 
 have_icu = conf.get('HAVE_ICU', 0) == 1
@@ -358,14 +380,7 @@ have_icu_builtin = conf.get('HAVE_ICU_BUILTIN', 0) == 1
 if have_icu and have_icu_builtin
   hb_sources += hb_icu_sources
   hb_headers += hb_icu_headers
-  deps += [icu_dep]
-endif
-
-if not get_option('with_libstdcxx')
-  chosen_linker = 'cpp'
-else
-  # Use a C linker, not C++; Don't link to libstdc++
-  chosen_linker = 'c'
+  harfbuzz_deps += [icu_dep]
 endif
 
 # harfbuzz
@@ -382,11 +397,11 @@ harfbuzz_def = custom_target('harfbuzz.def',
     output: 'harfbuzz.def')
 defs_list = [harfbuzz_def]
 
-version = '0.' + '0'.join(meson.project_version().split('.')) + '.0'
+version = '0.@0@.0'.format(hb_version_int)
 
 extra_hb_cpp_args = []
 if cpp.get_id() == 'msvc'
-  if get_option('default_library') == 'shared'
+  if get_option('default_library') != 'static'
     extra_hb_cpp_args += '-DHB_DLL_EXPORT'
   endif
   hb_so_version = ''
@@ -394,20 +409,31 @@ else
   hb_so_version = '0'
 endif
 
+if get_option('fuzzer_ldflags') != ''
+  extra_hb_cpp_args += ['-DHB_CUSTOM_MALLOC']
+  hb_sources += 'failing-alloc.c'
+  hb_subset_sources += 'failing-alloc.c'
+  hb_icu_sources += 'failing-alloc.c'
+  hb_gobject_sources += 'failing-alloc.c'
+endif
+
+darwin_versions = [hb_version_int, '@0@.0.0'.format(hb_version_int)]
+
 libharfbuzz = library('harfbuzz', hb_sources,
   include_directories: incconfig,
-  dependencies: deps,
+  dependencies: harfbuzz_deps,
   cpp_args: cpp_args + extra_hb_cpp_args,
   soversion: hb_so_version,
   version: version,
   install: true,
-  link_language: chosen_linker,
+  darwin_versions: darwin_versions,
+  link_language: libharfbuzz_link_language,
 )
 
 libharfbuzz_dep = declare_dependency(
   link_with: libharfbuzz,
   include_directories: incsrc,
-  dependencies: deps)
+  dependencies: harfbuzz_deps)
 
 # harfbuzz-subset
 harfbuzz_subset_def = custom_target('harfbuzz-subset.def',
@@ -418,19 +444,20 @@ defs_list += [harfbuzz_subset_def]
 
 libharfbuzz_subset = library('harfbuzz-subset', hb_subset_sources,
   include_directories: incconfig,
-  dependencies: deps,
+  dependencies: [m_dep],
   link_with: [libharfbuzz],
   cpp_args: cpp_args + extra_hb_cpp_args,
   soversion: hb_so_version,
   version: version,
   install: true,
-  link_language: chosen_linker,
+  darwin_versions: darwin_versions,
+  link_language: 'c',
 )
 
 libharfbuzz_subset_dep = declare_dependency(
   link_with: libharfbuzz_subset,
   include_directories: incsrc,
-  dependencies: deps)
+  dependencies: [m_dep])
 
 if get_option('tests').enabled()
   # TODO: MSVC gives the following,
@@ -456,37 +483,27 @@ if get_option('tests').enabled()
     endforeach
   endif
 
-  check_programs = {
-    'dump-indic-data': ['dump-indic-data.cc', 'hb-ot-shape-complex-indic-table.cc'],
-    'dump-khmer-data': ['dump-khmer-data.cc', 'hb-ot-shape-complex-indic-table.cc'],
-    'dump-myanmar-data': ['dump-myanmar-data.cc', 'hb-ot-shape-complex-indic-table.cc'],
-    'dump-use-data': ['dump-use-data.cc', 'hb-ot-shape-complex-use-table.cc'],
-  }
-  foreach name, source : check_programs
-    executable(name, source,
-      include_directories: incconfig,
-      cpp_args: cpp_args,
-      dependencies: libharfbuzz_dep,
-      install: false,
-    )
-  endforeach
-
   compiled_tests = {
-    'test-array': 'test-array.cc',
+    'test-algs': ['test-algs.cc', 'hb-static.cc'],
+    'test-array': ['test-array.cc'],
+    'test-iter': ['test-iter.cc', 'hb-static.cc'],
+    'test-machinery': ['test-machinery.cc', 'hb-static.cc'],
+    'test-map': ['test-map.cc', 'hb-static.cc'],
     'test-number': ['test-number.cc', 'hb-number.cc'],
-    'test-ot-tag': 'hb-ot-tag.cc',
-    'test-unicode-ranges': 'test-unicode-ranges.cc',
+    'test-ot-tag': ['hb-ot-tag.cc'],
+    'test-priority-queue': ['test-priority-queue.cc', 'hb-static.cc'],
+    'test-repacker': ['test-repacker.cc', 'hb-static.cc'],
+    'test-set': ['test-set.cc', 'hb-static.cc'],
+    'test-serialize': ['test-serialize.cc', 'hb-static.cc'],
+    'test-unicode-ranges': ['test-unicode-ranges.cc'],
+    'test-vector': ['test-vector.cc', 'hb-static.cc'],
+    'test-bimap': ['test-bimap.cc', 'hb-static.cc'],
   }
-  if cpp.get_id() != 'msvc'
-    # TODO: MSVC doesn't like these, fix them
-    compiled_tests += {
-      'test-algs': ['test-algs.cc', 'hb-static.cc'],
-      'test-bimap': ['test-bimap.cc', 'hb-static.cc'],
-      'test-iter': ['test-iter.cc', 'hb-static.cc'],
-      'test-meta': ['test-meta.cc', 'hb-static.cc'],
-    }
-  endif
   foreach name, source : compiled_tests
+    if cpp.get_id() == 'msvc' and source.contains('hb-static.cc')
+      # TODO: MSVC doesn't like tests having hb-static.cc, fix them
+      continue
+    endif
     test(name, executable(name, source,
       include_directories: incconfig,
       cpp_args: cpp_args + ['-DMAIN', '-UNDEBUG'],
@@ -504,10 +521,12 @@ pkgmod.generate(libharfbuzz,
 
 pkgmod.generate(libharfbuzz_subset,
   description: 'HarfBuzz font subsetter',
+  requires: ['harfbuzz = @0@'.format(meson.project_version())],
   subdirs: [meson.project_name()],
   version: meson.project_version(),
 )
 
+libharfbuzz_icu_dep = null_dep
 if have_icu and not have_icu_builtin
   harfbuzz_icu_def = custom_target('harfbuzz-icu.def',
     command: [gen_def, '@OUTPUT@', '@INPUT@'],
@@ -523,24 +542,24 @@ if have_icu and not have_icu_builtin
     soversion: hb_so_version,
     version: version,
     install: true,
+    darwin_versions: darwin_versions,
     # ICU links to stdc++ anyway so the default linker is good
-    # link_language: chosen_linker,
+    # link_language: 'c',
   )
 
   libharfbuzz_icu_dep = declare_dependency(
     link_with: libharfbuzz_icu,
     include_directories: incsrc,
-    dependencies: deps)
+    dependencies: icu_dep)
 
   pkgmod.generate(libharfbuzz_icu,
     description: 'HarfBuzz text shaping library ICU integration',
+    requires: ['harfbuzz = @0@'.format(meson.project_version())],
     subdirs: [meson.project_name()],
     version: meson.project_version(),
   )
 
   install_headers(hb_icu_headers, subdir: meson.project_name())
-else
-  libharfbuzz_icu_dep = dependency('', required: false)
 endif
 
 have_gobject = conf.get('HAVE_GOBJECT', 0) == 1
@@ -549,26 +568,26 @@ cmake_config = configuration_data()
 cmake_config.set('libdir', '${prefix}/@0@'.format(get_option('libdir')))
 cmake_config.set('includedir', '${prefix}/@0@'.format(get_option('includedir')))
 cmake_config.set('HB_LIBTOOL_VERSION_INFO', hb_libtool_version_info)
-cmake_config.set('have_gobject', have_gobject ? 'true' : 'false')
+cmake_config.set('have_gobject', '@0@'.format(have_gobject))
 configure_file(input: 'harfbuzz-config.cmake.in',
   output: 'harfbuzz-config.cmake',
   configuration: cmake_config,
-  install_dir: get_option('libdir') / 'cmake' / 'harfbuzz')
+  install_dir: get_option('libdir') / 'cmake' / 'harfbuzz',
+)
 
+libharfbuzz_gobject_dep = null_dep
 if have_gobject
   gnome = import('gnome')
 
   h_templ = configure_file(
     input: 'hb-gobject-enums.h.tmpl',
     output: 'hb-gobject-enums-tmp.h.tmpl',
-    configuration: configuration_data(),
-    format: 'cmake')
+    copy: true)
 
   cc_templ = configure_file(
     input: 'hb-gobject-enums.cc.tmpl',
     output: 'hb-gobject-enums-tmp.cc.tmpl',
-    configuration: configuration_data(),
-    format: 'cmake')
+    copy: true)
 
   enums = gnome.mkenums('hb-gobject',
     sources: hb_headers,
@@ -602,22 +621,29 @@ if have_gobject
 
   libharfbuzz_gobject = library('harfbuzz-gobject', [hb_gobject_sources, enum_c, enum_h],
     include_directories: incconfig,
-    dependencies: deps,
+    dependencies: [glib_dep, gobject_dep],
     link_with: [libharfbuzz],
     cpp_args: cpp_args + extra_hb_cpp_args,
     soversion: hb_so_version,
     version: version,
     install: true,
-    link_language: chosen_linker,
+    darwin_versions: darwin_versions,
+    link_language: 'c',
   )
 
   gir = find_program('g-ir-scanner', required: get_option('introspection'))
-  build_gir = gir.found() and not meson.is_cross_build()
+  build_gir = gir.found() and (not meson.is_cross_build() or get_option('introspection').enabled())
+
+  build_gir = build_gir and get_option('default_library') != 'static'
+  if not build_gir and get_option('introspection').enabled()
+    error('Introspection support is requested but the default library option should be shared or both')
+  endif
 
   if build_gir
     conf.set('HAVE_INTROSPECTION', 1)
-    hb_gen_files_gir = gnome.generate_gir(libharfbuzz, libharfbuzz_gobject,
+    hb_gen_files_gir = gnome.generate_gir(libharfbuzz_gobject,
       sources: [hb_headers, hb_sources, hb_gobject_headers, hb_gobject_sources, enum_h],
+      dependencies: libharfbuzz_dep,
       namespace: 'HarfBuzz',
       nsversion: '0.0',
       identifier_prefix: 'hb_',
@@ -627,14 +653,8 @@ if have_gobject
       header: 'hb-gobject.h',
       install: true,
       extra_args:  ['--cflags-begin',
-                    '-DHB_H',
-                    '-DHB_H_IN',
-                    '-DHB_OT_H',
-                    '-DHB_OT_H_IN',
-                    '-DHB_AAT_H',
-                    '-DHB_AAT_H_IN',
-                    '-DHB_GOBJECT_H',
-                    '-DHB_GOBJECT_H_IN',
+                    '-DHB_NO_SINGLE_HEADER_ERROR',
+                    '-DHAVE_GOBJECT',
                     '-DHB_EXTERN=',
                     '--cflags-end'])
   endif
@@ -643,10 +663,11 @@ if have_gobject
     link_with: libharfbuzz_gobject,
     include_directories: incsrc,
     sources: build_gir ? hb_gen_files_gir : hb_gobject_sources,
-    dependencies: deps)
+    dependencies: [glib_dep, gobject_dep])
 
   pkgmod.generate(libharfbuzz_gobject,
     description: 'HarfBuzz text shaping library GObject integration',
+    requires: ['harfbuzz = @0@'.format(meson.project_version()), 'glib-2.0', 'gobject-2.0'],
     subdirs: [meson.project_name()],
     version: meson.project_version(),
   )
@@ -656,8 +677,6 @@ else
   if get_option('introspection').enabled()
     error('introspection requires gobject to be enabled')
   endif
-
-  libharfbuzz_gobject_dep = dependency('', required: false)
 endif
 
 if get_option('tests').enabled()
@@ -672,17 +691,19 @@ if get_option('tests').enabled()
   env.set('srcdir', meson.current_source_dir())
   env.set('builddir', meson.current_build_dir())
   env.set('libs', meson.current_build_dir()) # TODO: Merge this with builddir after autotools removal
-  if not get_option('amalgam')
-    env.set('HBSOURCES', ' '.join(hb_sources))
-  endif
-  env.set('HBHEADERS', ' '.join(hb_headers))
+  HBSOURCES = []
+  foreach f : hb_sources
+    HBSOURCES += '@0@'.format(f)
+  endforeach
+  env.set('HBSOURCES', ' '.join(HBSOURCES))
+  HBHEADERS = []
+  foreach f : hb_headers
+    HBHEADERS += '@0@'.format(f)
+  endforeach
+  env.set('HBHEADERS', ' '.join(HBHEADERS))
 
   if cpp.get_id() != 'msvc' and not meson.is_cross_build() # ensure the local tools are usable
-    # See https://github.com/mesonbuild/meson/pull/6838
-    if meson.version().version_compare('>=0.54.999') and not get_option('with_libstdcxx')
-      dist_check_script += 'check-libstdc++'
-    endif
-    dist_check_script += ['check-static-inits', 'check-symbols']
+    dist_check_script += ['check-libstdc++', 'check-static-inits', 'check-symbols']
   endif
 
   foreach name : dist_check_script
index 0e78099..8d5a694 100644 (file)
 #include "hb-ft.h"
 #endif
 
-#include <stdio.h>
-
 #ifdef HB_NO_OPEN
-#define hb_blob_create_from_file(x)  hb_blob_get_empty ()
+#define hb_blob_create_from_file_or_fail(x)  hb_blob_get_empty ()
 #endif
 
 int
@@ -50,7 +48,8 @@ main (int argc, char **argv)
     exit (1);
   }
 
-  hb_blob_t *blob = hb_blob_create_from_file (argv[1]);
+  hb_blob_t *blob = hb_blob_create_from_file_or_fail (argv[1]);
+  assert (blob);
   hb_face_t *face = hb_face_create (blob, 0 /* first face */);
   hb_blob_destroy (blob);
   blob = nullptr;
index ad10ed4..b96381d 100644 (file)
 #include "hb.h"
 #include "hb-ot.h"
 
-#include <stdio.h>
-
 #ifdef HB_NO_OPEN
-#define hb_blob_create_from_file(x)  hb_blob_get_empty ()
+#define hb_blob_create_from_file_or_fail(x)  hb_blob_get_empty ()
 #endif
 
 int
@@ -44,7 +42,8 @@ main (int argc, char **argv)
   }
 
   /* Create the face */
-  hb_blob_t *blob = hb_blob_create_from_file (argv[1]);
+  hb_blob_t *blob = hb_blob_create_from_file_or_fail (argv[1]);
+  assert (blob);
   hb_face_t *face = hb_face_create (blob, 0 /* first face */);
   hb_blob_destroy (blob);
   blob = nullptr;
index 7ad9e08..8712303 100644 (file)
 #include "hb.h"
 #include "hb-ot.h"
 
-#include <stdio.h>
-
 #ifdef HAVE_FREETYPE
 #include "hb-ft.h"
 #endif
 
 #ifdef HB_NO_OPEN
-#define hb_blob_create_from_file(x)  hb_blob_get_empty ()
+#define hb_blob_create_from_file_or_fail(x)  hb_blob_get_empty ()
 #endif
 
 int
@@ -48,7 +46,8 @@ main (int argc, char **argv)
   }
 
   /* Create the face */
-  hb_blob_t *blob = hb_blob_create_from_file (argv[1]);
+  hb_blob_t *blob = hb_blob_create_from_file_or_fail (argv[1]);
+  assert (blob);
   hb_face_t *face = hb_face_create (blob, 0 /* first face */);
   hb_blob_destroy (blob);
   blob = nullptr;
index fd201c8..dc85b72 100644 (file)
@@ -114,6 +114,78 @@ test_iterable (const Iterable &lst = Null (Iterable))
   test_iterator (lst.iter ());
 }
 
+template <typename It>
+static void check_sequential (It it)
+{
+  int i = 1;
+  for (int v : +it) {
+    assert (v == i++);
+  }
+}
+
+static void test_concat ()
+{
+  hb_vector_t<int> a = {1, 2, 3};
+  hb_vector_t<int> b = {4, 5};
+
+  hb_vector_t<int> c = {};
+  hb_vector_t<int> d = {1, 2, 3, 4, 5};
+
+  auto it1 = hb_concat (a, b);
+  assert (it1.len () == 5);
+  assert (it1.is_random_access_iterator);
+  auto it2 = hb_concat (c, d);
+  assert (it2.len () == 5);
+  auto it3 = hb_concat (d, c);
+  assert (it3.len () == 5);
+  for (int i = 0; i < 5; i++) {
+    assert(it1[i] == i + 1);
+    assert(it2[i] == i + 1);
+    assert(it3[i] == i + 1);
+  }
+
+  check_sequential (it1);
+  check_sequential (it2);
+  check_sequential (it3);
+
+  auto it4 = +it1;
+  it4 += 0;
+  assert (*it4 == 1);
+
+  it4 += 2;
+  assert (*it4 == 3);
+  assert (it4);
+  assert (it4.len () == 3);
+
+  it4 += 2;
+  assert (*it4 == 5);
+  assert (it4);
+  assert (it4.len () == 1);
+
+  it4++;
+  assert (!it4);
+  assert (it4.len () == 0);
+
+  auto it5 = +it1;
+  it5 += 3;
+  assert (*it5 == 4);
+
+  hb_set_t s_a = {1, 2, 3};
+  hb_set_t s_b = {4, 5};
+  auto it6 = hb_concat (s_a, s_b);
+  assert (!it6.is_random_access_iterator);
+  check_sequential (it6);
+  assert (it6.len () == 5);
+
+  it6 += 0;
+  assert (*it6 == 1);
+
+  it6 += 3;
+  assert (*it6 == 4);
+  assert (it6);
+  assert (it6.len () == 2);
+}
+
 int
 main (int argc, char **argv)
 {
@@ -282,5 +354,7 @@ main (int argc, char **argv)
   assert (hb_range (-2, -8, -3).len () == 2);
   assert (hb_range (-2, -7, -3).len () == 2);
 
+  test_concat ();
+
   return 0;
 }
diff --git a/src/test-machinery.cc b/src/test-machinery.cc
new file mode 100644 (file)
index 0000000..7fc9c24
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * Copyright © 2022  Behdad Esfahbod
+ *
+ *  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.
+ */
+
+#include "hb.hh"
+#include "hb-machinery.hh"
+
+struct hb_intp_lazy_loader_t : hb_lazy_loader_t<int, hb_intp_lazy_loader_t>
+{
+  static int* create () { return nullptr; }
+  static void destroy (int* l) {}
+  static int* get_null () { return nullptr; }
+};
+
+struct hb_void_lazy_loader_t : hb_lazy_loader_t<void, hb_void_lazy_loader_t>
+{
+  static void* create () { return nullptr; }
+  static void destroy (void* l) {}
+  static void* get_null () { return nullptr; }
+};
+
+int
+main (int argc, char **argv)
+{
+  return 0;
+}
diff --git a/src/test-map.cc b/src/test-map.cc
new file mode 100644 (file)
index 0000000..fd2b2f0
--- /dev/null
@@ -0,0 +1,139 @@
+/*
+ * Copyright © 2021  Behdad Esfahbod
+ *
+ *  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.
+ *
+ */
+
+#include "hb.hh"
+#include "hb-map.hh"
+#include <string>
+
+static const std::string invalid{"invalid"};
+
+int
+main (int argc, char **argv)
+{
+
+  /* Test copy constructor. */
+  {
+    hb_map_t v1;
+    v1.set (1, 2);
+    hb_map_t v2 {v1};
+    assert (v1.get_population () == 1);
+    assert (v2.get_population () == 1);
+    assert (v1[1] == 2);
+    assert (v2[1] == 2);
+  }
+
+  /* Test copy assignment. */
+  {
+    hb_map_t v1;
+    v1.set (1, 2);
+    hb_map_t v2 = v1;
+    assert (v1.get_population () == 1);
+    assert (v2.get_population () == 1);
+    assert (v1[1] == 2);
+    assert (v2[1] == 2);
+  }
+
+  /* Test move constructor. */
+  {
+    hb_map_t v {hb_map_t {}};
+  }
+
+  /* Test move assignment. */
+  {
+    hb_map_t v;
+    v = hb_map_t {};
+  }
+
+  /* Test initializing from iterable. */
+  {
+    hb_map_t s;
+
+    s.set (1, 2);
+    s.set (3, 4);
+
+    hb_map_t v (s);
+
+    assert (v.get_population () == 2);
+  }
+
+  /* Test call fini() twice. */
+  {
+    hb_map_t s;
+    for (int i = 0; i < 16; i++)
+      s.set(i, i+1);
+    s.fini();
+  }
+
+  /* Test initializing from iterator. */
+  {
+    hb_map_t s;
+
+    s.set (1, 2);
+    s.set (3, 4);
+
+    hb_map_t v (hb_iter (s));
+
+    assert (v.get_population () == 2);
+  }
+
+  /* Test initializing from initializer list and swapping. */
+  {
+    using pair_t = hb_pair_t<hb_codepoint_t, hb_codepoint_t>;
+    hb_map_t v1 {pair_t{1,2}, pair_t{4,5}};
+    hb_map_t v2 {pair_t{3,4}};
+    hb_swap (v1, v2);
+    assert (v1.get_population () == 1);
+    assert (v2.get_population () == 2);
+  }
+
+  /* Test class key / value types. */
+  {
+    hb_hashmap_t<hb_bytes_t, int, std::nullptr_t, int, nullptr, 0> m1;
+    hb_hashmap_t<int, hb_bytes_t, int, std::nullptr_t, 0, nullptr> m2;
+    hb_hashmap_t<hb_bytes_t, hb_bytes_t, std::nullptr_t, std::nullptr_t, nullptr, nullptr> m3;
+    assert (m1.get_population () == 0);
+    assert (m2.get_population () == 0);
+    assert (m3.get_population () == 0);
+  }
+
+  {
+    hb_hashmap_t<int, int, int, int, 0, 0> m0;
+    hb_hashmap_t<std::string, int, const std::string*, int, &invalid, 0> m1;
+    hb_hashmap_t<int, std::string, int, const std::string*, 0, &invalid> m2;
+    hb_hashmap_t<std::string, std::string, const std::string*, const std::string*, &invalid, &invalid> m3;
+
+    std::string s;
+    for (unsigned i = 1; i < 1000; i++)
+    {
+      s += "x";
+      m0.set (i, i);
+      m1.set (s, i);
+      m2.set (i, s);
+      m3.set (s, s);
+    }
+  }
+
+  return 0;
+}
diff --git a/src/test-meta.cc b/src/test-meta.cc
deleted file mode 100644 (file)
index 9436b90..0000000
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Copyright © 2019  Facebook, 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.
- *
- * Facebook Author(s): Behdad Esfahbod
- */
-
-#include "hb.hh"
-#include "hb-meta.hh"
-
-#include <type_traits>
-
-template <typename T> struct U { typedef T type; };
-
-int
-main (int argc, char **argv)
-{
-  static_assert (hb_is_convertible (void, void), "");
-  static_assert (hb_is_convertible (void, const void), "");
-  static_assert (hb_is_convertible (const void, void), "");
-
-  static_assert (hb_is_convertible (int,  int), "");
-  static_assert (hb_is_convertible (char, int), "");
-  static_assert (hb_is_convertible (long, int), "");
-
-  static_assert (hb_is_convertible (int, int), "");
-
-  static_assert (hb_is_convertible (const int, int), "");
-  static_assert (hb_is_convertible (int, const int), "");
-  static_assert (hb_is_convertible (const int, const int), "");
-
-  static_assert (hb_is_convertible (int&, int), "");
-  static_assert (!hb_is_convertible (int, int&), "");
-
-  static_assert (hb_is_convertible (int, const int&), "");
-  static_assert (!hb_is_convertible (const int, int&), "");
-  static_assert (hb_is_convertible (const int, const int&), "");
-  static_assert (hb_is_convertible (int&, const int), "");
-  static_assert (hb_is_convertible (const int&, int), "");
-  static_assert (hb_is_convertible (const int&, const int), "");
-  static_assert (hb_is_convertible (const int&, const int), "");
-
-  struct X {};
-  struct Y : X {};
-
-  static_assert (hb_is_convertible (const X &, const X), "");
-  static_assert (hb_is_convertible (X &, const X), "");
-  static_assert (hb_is_convertible (X &, const X &), "");
-  static_assert (hb_is_convertible (X, const X &), "");
-  static_assert (hb_is_convertible (const X, const X &), "");
-  static_assert (!hb_is_convertible (const X, X &), "");
-  static_assert (!hb_is_convertible (X, X &), "");
-  static_assert (hb_is_convertible (X &, X &), "");
-
-  static_assert (hb_is_convertible (int&, long), "");
-  static_assert (!hb_is_convertible (int&, long&), "");
-
-  static_assert (hb_is_convertible (int *, int *), "");
-  static_assert (hb_is_convertible (int *, const int *), "");
-  static_assert (!hb_is_convertible (const int *, int *), "");
-  static_assert (!hb_is_convertible (int *, long *), "");
-  static_assert (hb_is_convertible (int *, void *), "");
-  static_assert (!hb_is_convertible (void *, int *), "");
-
-  static_assert (hb_is_base_of (void, void), "");
-  static_assert (hb_is_base_of (void, int), "");
-  static_assert (!hb_is_base_of (int, void), "");
-
-  static_assert (hb_is_base_of (int, int), "");
-  static_assert (hb_is_base_of (const int, int), "");
-  static_assert (hb_is_base_of (int, const int), "");
-
-  static_assert (hb_is_base_of (X, X), "");
-  static_assert (hb_is_base_of (X, Y), "");
-  static_assert (hb_is_base_of (const X, Y), "");
-  static_assert (hb_is_base_of (X, const Y), "");
-  static_assert (!hb_is_base_of (Y, X), "");
-
-  static_assert (hb_is_constructible (int), "");
-  static_assert (hb_is_constructible (int, int), "");
-  static_assert (hb_is_constructible (int, char), "");
-  static_assert (hb_is_constructible (int, long), "");
-  static_assert (!hb_is_constructible (int, X), "");
-  static_assert (!hb_is_constructible (int, int, int), "");
-  static_assert (hb_is_constructible (X), "");
-  static_assert (!hb_is_constructible (X, int), "");
-  static_assert (hb_is_constructible (X, X), "");
-  static_assert (!hb_is_constructible (X, X, X), "");
-  static_assert (hb_is_constructible (X, Y), "");
-  static_assert (!hb_is_constructible (Y, X), "");
-
-  static_assert (hb_is_trivially_default_constructible (X), "");
-  static_assert (hb_is_trivially_default_constructible (Y), "");
-  static_assert (hb_is_trivially_copy_constructible (X), "");
-  static_assert (hb_is_trivially_copy_constructible (Y), "");
-  static_assert (hb_is_trivially_move_constructible (X), "");
-  static_assert (hb_is_trivially_move_constructible (Y), "");
-  static_assert (hb_is_trivially_destructible (Y), "");
-
-  static_assert (hb_is_trivially_copyable (int), "");
-  static_assert (hb_is_trivially_copyable (X), "");
-  static_assert (hb_is_trivially_copyable (Y), "");
-
-  static_assert (hb_is_trivial (int), "");
-  static_assert (hb_is_trivial (X), "");
-  static_assert (hb_is_trivial (Y), "");
-
-  static_assert (hb_is_signed (hb_unwrap_type (U<U<U<int>>>)), "");
-  static_assert (hb_is_unsigned (hb_unwrap_type (U<U<U<U<unsigned>>>>)), "");
-
-  /* TODO Add more meaningful tests. */
-
-  return 0;
-}
index dffc62b..50d0231 100644 (file)
 #include "hb.hh"
 #include "hb-ot.h"
 
-#include <stdlib.h>
-#include <stdio.h>
-
 #ifdef HB_NO_OPEN
-#define hb_blob_create_from_file(x)  hb_blob_get_empty ()
+#define hb_blob_create_from_file_or_fail(x)  hb_blob_get_empty ()
 #endif
 
 int
@@ -42,7 +39,8 @@ main (int argc, char **argv)
     exit (1);
   }
 
-  hb_blob_t *blob = hb_blob_create_from_file (argv[1]);
+  hb_blob_t *blob = hb_blob_create_from_file_or_fail (argv[1]);
+  assert (blob);
   hb_face_t *face = hb_face_create (blob, 0 /* first face */);
   hb_font_t *font = hb_font_create (face);
   hb_blob_destroy (blob);
index 1045007..7cf69db 100644 (file)
 #include "hb.hh"
 #include "hb-ot.h"
 
-#include <stdlib.h>
-#include <stdio.h>
-
 #ifdef HB_NO_OPEN
-#define hb_blob_create_from_file(x)  hb_blob_get_empty ()
+#define hb_blob_create_from_file_or_fail(x)  hb_blob_get_empty ()
 #endif
 
 int
@@ -40,7 +37,8 @@ main (int argc, char **argv)
     exit (1);
   }
 
-  hb_blob_t *blob = hb_blob_create_from_file (argv[1]);
+  hb_blob_t *blob = hb_blob_create_from_file_or_fail (argv[1]);
+  assert (blob);
   hb_face_t *face = hb_face_create (blob, 0 /* first face */);
   hb_blob_destroy (blob);
   blob = nullptr;
index 4a484c6..bfa654a 100644 (file)
 #include "hb.hh"
 #include "hb-ot.h"
 
-#include <stdlib.h>
-#include <stdio.h>
-
 #ifdef HB_NO_OPEN
-#define hb_blob_create_from_file(x)  hb_blob_get_empty ()
+#define hb_blob_create_from_file_or_fail(x)  hb_blob_get_empty ()
 #endif
 
 int
@@ -42,7 +39,8 @@ main (int argc, char **argv)
     exit (1);
   }
 
-  hb_blob_t *blob = hb_blob_create_from_file (argv[1]);
+  hb_blob_t *blob = hb_blob_create_from_file_or_fail (argv[1]);
+  assert (blob);
   hb_face_t *face = hb_face_create (blob, 0 /* first face */);
   hb_blob_destroy (blob);
   blob = nullptr;
diff --git a/src/test-priority-queue.cc b/src/test-priority-queue.cc
new file mode 100644 (file)
index 0000000..fab63ac
--- /dev/null
@@ -0,0 +1,89 @@
+/*
+ * Copyright © 2020  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): Garret Rieger
+ */
+
+#include "hb.hh"
+#include "hb-priority-queue.hh"
+
+static void
+test_insert ()
+{
+  hb_priority_queue_t queue;
+  assert (queue.is_empty ());
+
+  queue.insert (10, 0);
+  assert (!queue.is_empty ());
+  assert (queue.minimum () == hb_pair (10, 0));
+
+  queue.insert (20, 1);
+  assert (queue.minimum () == hb_pair (10, 0));
+
+  queue.insert (5, 2);
+  assert (queue.minimum () == hb_pair (5, 2));
+
+  queue.insert (15, 3);
+  assert (queue.minimum () == hb_pair (5, 2));
+
+  queue.insert (1, 4);
+  assert (queue.minimum () == hb_pair (1, 4));
+}
+
+static void
+test_extract ()
+{
+  hb_priority_queue_t queue;
+  queue.insert (0, 0);
+  queue.insert (60, 6);
+  queue.insert (30, 3);
+  queue.insert (40 ,4);
+  queue.insert (20, 2);
+  queue.insert (50, 5);
+  queue.insert (70, 7);
+  queue.insert (10, 1);
+
+  for (int i = 0; i < 8; i++)
+  {
+    assert (!queue.is_empty ());
+    assert (queue.minimum () == hb_pair (i * 10, i));
+    assert (queue.pop_minimum () == hb_pair (i * 10, i));
+  }
+
+  assert (queue.is_empty ());
+}
+
+static void
+test_extract_empty ()
+{
+  hb_priority_queue_t queue;
+  assert (queue.pop_minimum () == hb_pair (0, 0));
+}
+
+int
+main (int argc, char **argv)
+{
+  test_insert ();
+  test_extract ();
+  test_extract_empty ();
+}
diff --git a/src/test-repacker.cc b/src/test-repacker.cc
new file mode 100644 (file)
index 0000000..3a2536a
--- /dev/null
@@ -0,0 +1,1360 @@
+/*
+ * Copyright © 2020  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): Garret Rieger
+ */
+
+#include <string>
+
+#include "hb-repacker.hh"
+#include "hb-open-type.hh"
+
+static void start_object(const char* tag,
+                         unsigned len,
+                         hb_serialize_context_t* c)
+{
+  c->push ();
+  char* obj = c->allocate_size<char> (len);
+  strncpy (obj, tag, len);
+}
+
+
+static unsigned add_object(const char* tag,
+                           unsigned len,
+                           hb_serialize_context_t* c)
+{
+  start_object (tag, len, c);
+  return c->pop_pack (false);
+}
+
+
+static void add_offset (unsigned id,
+                        hb_serialize_context_t* c)
+{
+  OT::Offset16* offset = c->start_embed<OT::Offset16> ();
+  c->extend_min (offset);
+  c->add_link (*offset, id);
+}
+
+static void add_wide_offset (unsigned id,
+                             hb_serialize_context_t* c)
+{
+  OT::Offset32* offset = c->start_embed<OT::Offset32> ();
+  c->extend_min (offset);
+  c->add_link (*offset, id);
+}
+
+static void run_resolve_overflow_test (const char* name,
+                                       hb_serialize_context_t& overflowing,
+                                       hb_serialize_context_t& expected,
+                                       unsigned num_iterations = 0)
+{
+  printf (">>> Testing overflowing resolution for %s\n",
+          name);
+
+  graph_t graph (overflowing.object_graph ());
+
+
+  assert (overflowing.offset_overflow ());
+  hb_blob_t* out = hb_resolve_overflows (overflowing.object_graph (),
+                                         HB_TAG ('G', 'S', 'U', 'B'), num_iterations);
+  assert (out);
+
+  hb_bytes_t result = out->as_bytes ();
+
+  assert (!expected.offset_overflow ());
+  hb_bytes_t expected_result = expected.copy_bytes ();
+
+  assert (result.length == expected_result.length);
+  for (unsigned i = 0; i < expected_result.length; i++)
+  {
+    assert (result[i] == expected_result[i]);
+  }
+
+  expected_result.fini ();
+  hb_blob_destroy (out);
+}
+
+static void add_virtual_offset (unsigned id,
+                                hb_serialize_context_t* c)
+{
+  c->add_virtual_link (id);
+}
+
+static void
+populate_serializer_simple (hb_serialize_context_t* c)
+{
+  c->start_serialize<char> ();
+
+  unsigned obj_1 = add_object ("ghi", 3, c);
+  unsigned obj_2 = add_object ("def", 3, c);
+
+  start_object ("abc", 3, c);
+  add_offset (obj_2, c);
+  add_offset (obj_1, c);
+  c->pop_pack (false);
+
+  c->end_serialize();
+}
+
+static void
+populate_serializer_with_overflow (hb_serialize_context_t* c)
+{
+  std::string large_string(50000, 'a');
+  c->start_serialize<char> ();
+
+  unsigned obj_1 = add_object (large_string.c_str(), 10000, c);
+  unsigned obj_2 = add_object (large_string.c_str(), 20000, c);
+  unsigned obj_3 = add_object (large_string.c_str(), 50000, c);
+
+  start_object ("abc", 3, c);
+  add_offset (obj_3, c);
+  add_offset (obj_2, c);
+  add_offset (obj_1, c);
+  c->pop_pack (false);
+
+  c->end_serialize();
+}
+
+static void
+populate_serializer_with_priority_overflow (hb_serialize_context_t* c)
+{
+  std::string large_string(50000, 'a');
+  c->start_serialize<char> ();
+
+  unsigned obj_e = add_object ("e", 1, c);
+  unsigned obj_d = add_object ("d", 1, c);
+
+  start_object (large_string.c_str (), 50000, c);
+  add_offset (obj_e, c);
+  unsigned obj_c = c->pop_pack (false);
+
+  start_object (large_string.c_str (), 20000, c);
+  add_offset (obj_d, c);
+  unsigned obj_b = c->pop_pack (false);
+
+  start_object ("a", 1, c);
+  add_offset (obj_b, c);
+  add_offset (obj_c, c);
+  c->pop_pack (false);
+
+  c->end_serialize();
+}
+
+static void
+populate_serializer_with_priority_overflow_expected (hb_serialize_context_t* c)
+{
+  std::string large_string(50000, 'a');
+  c->start_serialize<char> ();
+
+  unsigned obj_e = add_object ("e", 1, c);
+
+  start_object (large_string.c_str (), 50000, c);
+  add_offset (obj_e, c);
+  unsigned obj_c = c->pop_pack (false);
+
+  unsigned obj_d = add_object ("d", 1, c);
+
+  start_object (large_string.c_str (), 20000, c);
+  add_offset (obj_d, c);
+  unsigned obj_b = c->pop_pack (false);
+
+  start_object ("a", 1, c);
+  add_offset (obj_b, c);
+  add_offset (obj_c, c);
+  c->pop_pack (false);
+
+  c->end_serialize();
+}
+
+
+static void
+populate_serializer_with_dedup_overflow (hb_serialize_context_t* c)
+{
+  std::string large_string(70000, 'a');
+  c->start_serialize<char> ();
+
+  unsigned obj_1 = add_object ("def", 3, c);
+
+  start_object (large_string.c_str(), 60000, c);
+  add_offset (obj_1, c);
+  unsigned obj_2 = c->pop_pack (false);
+
+  start_object (large_string.c_str(), 10000, c);
+  add_offset (obj_2, c);
+  add_offset (obj_1, c);
+  c->pop_pack (false);
+
+  c->end_serialize();
+}
+
+static void
+populate_serializer_with_isolation_overflow (hb_serialize_context_t* c)
+{
+  std::string large_string(70000, 'a');
+  c->start_serialize<char> ();
+
+  unsigned obj_4 = add_object ("4", 1, c);
+
+  start_object (large_string.c_str(), 60000, c);
+  add_offset (obj_4, c);
+  unsigned obj_3 = c->pop_pack (false);
+
+  start_object (large_string.c_str(), 10000, c);
+  add_offset (obj_4, c);
+  unsigned obj_2 = c->pop_pack (false);
+
+  start_object ("1", 1, c);
+  add_wide_offset (obj_3, c);
+  add_offset (obj_2, c);
+  c->pop_pack (false);
+
+  c->end_serialize();
+}
+
+static void
+populate_serializer_with_isolation_overflow_complex (hb_serialize_context_t* c)
+{
+  std::string large_string(70000, 'a');
+  c->start_serialize<char> ();
+
+  unsigned obj_f = add_object ("f", 1, c);
+
+  start_object ("e", 1, c);
+  add_offset (obj_f, c);
+  unsigned obj_e = c->pop_pack (false);
+
+  start_object ("c", 1, c);
+  add_offset (obj_e, c);
+  unsigned obj_c = c->pop_pack (false);
+
+  start_object ("d", 1, c);
+  add_offset (obj_e, c);
+  unsigned obj_d = c->pop_pack (false);
+
+  start_object (large_string.c_str(), 60000, c);
+  add_offset (obj_d, c);
+  unsigned obj_h = c->pop_pack (false);
+
+  start_object (large_string.c_str(), 60000, c);
+  add_offset (obj_c, c);
+  add_offset (obj_h, c);
+  unsigned obj_b = c->pop_pack (false);
+
+  start_object (large_string.c_str(), 10000, c);
+  add_offset (obj_d, c);
+  unsigned obj_g = c->pop_pack (false);
+
+  start_object (large_string.c_str(), 11000, c);
+  add_offset (obj_d, c);
+  unsigned obj_i = c->pop_pack (false);
+
+  start_object ("a", 1, c);
+  add_wide_offset (obj_b, c);
+  add_offset (obj_g, c);
+  add_offset (obj_i, c);
+  c->pop_pack (false);
+
+  c->end_serialize();
+}
+
+static void
+populate_serializer_with_isolation_overflow_complex_expected (hb_serialize_context_t* c)
+{
+  std::string large_string(70000, 'a');
+  c->start_serialize<char> ();
+
+
+  // space 1
+
+  unsigned obj_f_prime = add_object ("f", 1, c);
+
+  start_object ("e", 1, c);
+  add_offset (obj_f_prime, c);
+  unsigned obj_e_prime = c->pop_pack (false);
+
+  start_object ("d", 1, c);
+  add_offset (obj_e_prime, c);
+  unsigned obj_d_prime = c->pop_pack (false);
+
+  start_object (large_string.c_str(), 60000, c);
+  add_offset (obj_d_prime, c);
+  unsigned obj_h = c->pop_pack (false);
+
+  start_object ("c", 1, c);
+  add_offset (obj_e_prime, c);
+  unsigned obj_c = c->pop_pack (false);
+
+  start_object (large_string.c_str(), 60000, c);
+  add_offset (obj_c, c);
+  add_offset (obj_h, c);
+  unsigned obj_b = c->pop_pack (false);
+
+  // space 0
+
+  unsigned obj_f = add_object ("f", 1, c);
+
+  start_object ("e", 1, c);
+  add_offset (obj_f, c);
+  unsigned obj_e = c->pop_pack (false);
+
+
+  start_object ("d", 1, c);
+  add_offset (obj_e, c);
+  unsigned obj_d = c->pop_pack (false);
+
+  start_object (large_string.c_str(), 11000, c);
+  add_offset (obj_d, c);
+  unsigned obj_i = c->pop_pack (false);
+
+  start_object (large_string.c_str(), 10000, c);
+  add_offset (obj_d, c);
+  unsigned obj_g = c->pop_pack (false);
+
+  start_object ("a", 1, c);
+  add_wide_offset (obj_b, c);
+  add_offset (obj_g, c);
+  add_offset (obj_i, c);
+  c->pop_pack (false);
+
+  c->end_serialize();
+}
+
+static void
+populate_serializer_with_isolation_overflow_spaces (hb_serialize_context_t* c)
+{
+  std::string large_string(70000, 'a');
+  c->start_serialize<char> ();
+
+  unsigned obj_d = add_object ("f", 1, c);
+  unsigned obj_e = add_object ("f", 1, c);
+
+  start_object (large_string.c_str(), 60000, c);
+  add_offset (obj_d, c);
+  unsigned obj_b = c->pop_pack ();
+
+  start_object (large_string.c_str(), 60000, c);
+  add_offset (obj_e, c);
+  unsigned obj_c = c->pop_pack ();
+
+
+  start_object ("a", 1, c);
+  add_wide_offset (obj_b, c);
+  add_wide_offset (obj_c, c);
+  c->pop_pack ();
+
+  c->end_serialize();
+}
+
+static void
+populate_serializer_spaces (hb_serialize_context_t* c, bool with_overflow)
+{
+  std::string large_string(70000, 'a');
+  c->start_serialize<char> ();
+
+  unsigned obj_i;
+
+  if (with_overflow)
+    obj_i = add_object ("i", 1, c);
+
+  // Space 2
+  unsigned obj_h = add_object ("h", 1, c);
+
+  start_object (large_string.c_str(), 30000, c);
+  add_offset (obj_h, c);
+  unsigned obj_e = c->pop_pack (false);
+
+  start_object ("b", 1, c);
+  add_offset (obj_e, c);
+  unsigned obj_b = c->pop_pack (false);
+
+  // Space 1
+  if (!with_overflow)
+    obj_i = add_object ("i", 1, c);
+
+  start_object (large_string.c_str(), 30000, c);
+  add_offset (obj_i, c);
+  unsigned obj_g = c->pop_pack (false);
+
+  start_object (large_string.c_str(), 30000, c);
+  add_offset (obj_i, c);
+  unsigned obj_f = c->pop_pack (false);
+
+  start_object ("d", 1, c);
+  add_offset (obj_g, c);
+  unsigned obj_d = c->pop_pack (false);
+
+  start_object ("c", 1, c);
+  add_offset (obj_f, c);
+  unsigned obj_c = c->pop_pack (false);
+
+  start_object ("a", 1, c);
+  add_wide_offset (obj_b, c);
+  add_wide_offset (obj_c, c);
+  add_wide_offset (obj_d, c);
+  c->pop_pack (false);
+
+  c->end_serialize();
+}
+
+static void
+populate_serializer_spaces_16bit_connection (hb_serialize_context_t* c)
+{
+  std::string large_string(70000, 'a');
+  c->start_serialize<char> ();
+
+  unsigned obj_g = add_object ("g", 1, c);
+  unsigned obj_h = add_object ("h", 1, c);
+
+  start_object (large_string.c_str (), 40000, c);
+  add_offset (obj_g, c);
+  unsigned obj_e = c->pop_pack (false);
+
+  start_object (large_string.c_str (), 40000, c);
+  add_offset (obj_h, c);
+  unsigned obj_f = c->pop_pack (false);
+
+  start_object ("c", 1, c);
+  add_offset (obj_e, c);
+  unsigned obj_c = c->pop_pack (false);
+
+  start_object ("d", 1, c);
+  add_offset (obj_f, c);
+  unsigned obj_d = c->pop_pack (false);
+
+  start_object ("b", 1, c);
+  add_offset (obj_e, c);
+  add_offset (obj_h, c);
+  unsigned obj_b = c->pop_pack (false);
+
+  start_object ("a", 1, c);
+  add_offset (obj_b, c);
+  add_wide_offset (obj_c, c);
+  add_wide_offset (obj_d, c);
+  c->pop_pack (false);
+
+  c->end_serialize();
+}
+
+static void
+populate_serializer_spaces_16bit_connection_expected (hb_serialize_context_t* c)
+{
+  std::string large_string(70000, 'a');
+  c->start_serialize<char> ();
+
+  unsigned obj_g_prime = add_object ("g", 1, c);
+
+  start_object (large_string.c_str (), 40000, c);
+  add_offset (obj_g_prime, c);
+  unsigned obj_e_prime = c->pop_pack (false);
+
+  start_object ("c", 1, c);
+  add_offset (obj_e_prime, c);
+  unsigned obj_c = c->pop_pack (false);
+
+  unsigned obj_h_prime = add_object ("h", 1, c);
+
+  start_object (large_string.c_str (), 40000, c);
+  add_offset (obj_h_prime, c);
+  unsigned obj_f = c->pop_pack (false);
+
+  start_object ("d", 1, c);
+  add_offset (obj_f, c);
+  unsigned obj_d = c->pop_pack (false);
+
+  unsigned obj_g = add_object ("g", 1, c);
+
+  start_object (large_string.c_str (), 40000, c);
+  add_offset (obj_g, c);
+  unsigned obj_e = c->pop_pack (false);
+
+  unsigned obj_h = add_object ("h", 1, c);
+
+  start_object ("b", 1, c);
+  add_offset (obj_e, c);
+  add_offset (obj_h, c);
+  unsigned obj_b = c->pop_pack (false);
+
+  start_object ("a", 1, c);
+  add_offset (obj_b, c);
+  add_wide_offset (obj_c, c);
+  add_wide_offset (obj_d, c);
+  c->pop_pack (false);
+
+  c->end_serialize ();
+}
+
+static void
+populate_serializer_short_and_wide_subgraph_root (hb_serialize_context_t* c)
+{
+  std::string large_string(70000, 'a');
+  c->start_serialize<char> ();
+
+  unsigned obj_e = add_object ("e", 1, c);
+
+  start_object (large_string.c_str (), 40000, c);
+  add_offset (obj_e, c);
+  unsigned obj_c = c->pop_pack (false);
+
+  start_object (large_string.c_str (), 40000, c);
+  add_offset (obj_c, c);
+  unsigned obj_d = c->pop_pack (false);
+
+  start_object ("b", 1, c);
+  add_offset (obj_c, c);
+  add_offset (obj_e, c);
+  unsigned obj_b = c->pop_pack (false);
+
+  start_object ("a", 1, c);
+  add_offset (obj_b, c);
+  add_wide_offset (obj_c, c);
+  add_wide_offset (obj_d, c);
+  c->pop_pack (false);
+
+  c->end_serialize();
+}
+
+static void
+populate_serializer_short_and_wide_subgraph_root_expected (hb_serialize_context_t* c)
+{
+  std::string large_string(70000, 'a');
+  c->start_serialize<char> ();
+
+  unsigned obj_e_prime = add_object ("e", 1, c);
+
+  start_object (large_string.c_str (), 40000, c);
+  add_offset (obj_e_prime, c);
+  unsigned obj_c_prime = c->pop_pack (false);
+
+  start_object (large_string.c_str (), 40000, c);
+  add_offset (obj_c_prime, c);
+  unsigned obj_d = c->pop_pack (false);
+
+  unsigned obj_e = add_object ("e", 1, c);
+
+  start_object (large_string.c_str (), 40000, c);
+  add_offset (obj_e, c);
+  unsigned obj_c = c->pop_pack (false);
+
+
+  start_object ("b", 1, c);
+  add_offset (obj_c, c);
+  add_offset (obj_e, c);
+  unsigned obj_b = c->pop_pack (false);
+
+  start_object ("a", 1, c);
+  add_offset (obj_b, c);
+  add_wide_offset (obj_c_prime, c);
+  add_wide_offset (obj_d, c);
+  c->pop_pack (false);
+
+  c->end_serialize();
+}
+
+static void
+populate_serializer_with_split_spaces (hb_serialize_context_t* c)
+{
+  // Overflow needs to be resolved by splitting the single space
+  std::string large_string(70000, 'a');
+  c->start_serialize<char> ();
+
+  unsigned obj_f = add_object ("f", 1, c);
+
+  start_object (large_string.c_str(), 40000, c);
+  add_offset (obj_f, c);
+  unsigned obj_d = c->pop_pack (false);
+
+  start_object (large_string.c_str(), 40000, c);
+  add_offset (obj_f, c);
+  unsigned obj_e = c->pop_pack (false);
+
+  start_object ("b", 1, c);
+  add_offset (obj_d, c);
+  unsigned obj_b = c->pop_pack (false);
+
+  start_object ("c", 1, c);
+  add_offset (obj_e, c);
+  unsigned obj_c = c->pop_pack (false);
+
+  start_object ("a", 1, c);
+  add_wide_offset (obj_b, c);
+  add_wide_offset (obj_c, c);
+  c->pop_pack (false);
+
+  c->end_serialize();
+}
+
+static void
+populate_serializer_with_split_spaces_2 (hb_serialize_context_t* c)
+{
+  // Overflow needs to be resolved by splitting the single space
+  std::string large_string(70000, 'a');
+  c->start_serialize<char> ();
+
+  unsigned obj_f = add_object ("f", 1, c);
+
+  start_object (large_string.c_str(), 40000, c);
+  add_offset (obj_f, c);
+  unsigned obj_d = c->pop_pack (false);
+
+  start_object (large_string.c_str(), 40000, c);
+  add_offset (obj_f, c);
+  unsigned obj_e = c->pop_pack (false);
+
+  start_object ("b", 1, c);
+  add_offset (obj_d, c);
+  unsigned obj_b = c->pop_pack (false);
+
+  start_object ("c", 1, c);
+  add_offset (obj_e, c);
+  unsigned obj_c = c->pop_pack (false);
+
+  start_object ("a", 1, c);
+  add_offset (obj_b, c);
+  add_wide_offset (obj_b, c);
+  add_wide_offset (obj_c, c);
+  c->pop_pack (false);
+
+  c->end_serialize();
+}
+
+static void
+populate_serializer_with_split_spaces_expected (hb_serialize_context_t* c)
+{
+  // Overflow needs to be resolved by splitting the single space
+
+  std::string large_string(70000, 'a');
+  c->start_serialize<char> ();
+
+  unsigned obj_f_prime = add_object ("f", 1, c);
+
+  start_object (large_string.c_str(), 40000, c);
+  add_offset (obj_f_prime, c);
+  unsigned obj_d = c->pop_pack (false);
+
+  start_object ("b", 1, c);
+  add_offset (obj_d, c);
+  unsigned obj_b = c->pop_pack (false);
+
+  unsigned obj_f = add_object ("f", 1, c);
+
+  start_object (large_string.c_str(), 40000, c);
+  add_offset (obj_f, c);
+  unsigned obj_e = c->pop_pack (false);
+
+  start_object ("c", 1, c);
+  add_offset (obj_e, c);
+  unsigned obj_c = c->pop_pack (false);
+
+  start_object ("a", 1, c);
+  add_wide_offset (obj_b, c);
+  add_wide_offset (obj_c, c);
+  c->pop_pack (false);
+
+  c->end_serialize();
+}
+
+static void
+populate_serializer_with_split_spaces_expected_2 (hb_serialize_context_t* c)
+{
+  // Overflow needs to be resolved by splitting the single space
+
+  std::string large_string(70000, 'a');
+  c->start_serialize<char> ();
+
+  // Space 2
+
+  unsigned obj_f_double_prime = add_object ("f", 1, c);
+
+  start_object (large_string.c_str(), 40000, c);
+  add_offset (obj_f_double_prime, c);
+  unsigned obj_d_prime = c->pop_pack (false);
+
+  start_object ("b", 1, c);
+  add_offset (obj_d_prime, c);
+  unsigned obj_b_prime = c->pop_pack (false);
+
+  // Space 1
+
+  unsigned obj_f_prime = add_object ("f", 1, c);
+
+  start_object (large_string.c_str(), 40000, c);
+  add_offset (obj_f_prime, c);
+  unsigned obj_e = c->pop_pack (false);
+
+  start_object ("c", 1, c);
+  add_offset (obj_e, c);
+  unsigned obj_c = c->pop_pack (false);
+
+  // Space 0
+
+  unsigned obj_f = add_object ("f", 1, c);
+
+  start_object (large_string.c_str(), 40000, c);
+  add_offset (obj_f, c);
+  unsigned obj_d = c->pop_pack (false);
+
+  start_object ("b", 1, c);
+  add_offset (obj_d, c);
+  unsigned obj_b = c->pop_pack (false);
+
+  // Root
+  start_object ("a", 1, c);
+  add_offset (obj_b, c);
+  add_wide_offset (obj_b_prime, c);
+  add_wide_offset (obj_c, c);
+  c->pop_pack (false);
+
+  c->end_serialize();
+}
+
+static void
+populate_serializer_complex_1 (hb_serialize_context_t* c)
+{
+  c->start_serialize<char> ();
+
+  unsigned obj_4 = add_object ("jkl", 3, c);
+  unsigned obj_3 = add_object ("ghi", 3, c);
+
+  start_object ("def", 3, c);
+  add_offset (obj_3, c);
+  unsigned obj_2 = c->pop_pack (false);
+
+  start_object ("abc", 3, c);
+  add_offset (obj_2, c);
+  add_offset (obj_4, c);
+  c->pop_pack (false);
+
+  c->end_serialize();
+}
+
+static void
+populate_serializer_complex_2 (hb_serialize_context_t* c)
+{
+  c->start_serialize<char> ();
+
+  unsigned obj_5 = add_object ("mn", 2, c);
+
+  unsigned obj_4 = add_object ("jkl", 3, c);
+
+  start_object ("ghi", 3, c);
+  add_offset (obj_4, c);
+  unsigned obj_3 = c->pop_pack (false);
+
+  start_object ("def", 3, c);
+  add_offset (obj_3, c);
+  unsigned obj_2 = c->pop_pack (false);
+
+  start_object ("abc", 3, c);
+  add_offset (obj_2, c);
+  add_offset (obj_4, c);
+  add_offset (obj_5, c);
+  c->pop_pack (false);
+
+  c->end_serialize();
+}
+
+static void
+populate_serializer_complex_3 (hb_serialize_context_t* c)
+{
+  c->start_serialize<char> ();
+
+  unsigned obj_6 = add_object ("opqrst", 6, c);
+
+  unsigned obj_5 = add_object ("mn", 2, c);
+
+  start_object ("jkl", 3, c);
+  add_offset (obj_6, c);
+  unsigned obj_4 = c->pop_pack (false);
+
+  start_object ("ghi", 3, c);
+  add_offset (obj_4, c);
+  unsigned obj_3 = c->pop_pack (false);
+
+  start_object ("def", 3, c);
+  add_offset (obj_3, c);
+  unsigned obj_2 = c->pop_pack (false);
+
+  start_object ("abc", 3, c);
+  add_offset (obj_2, c);
+  add_offset (obj_4, c);
+  add_offset (obj_5, c);
+  c->pop_pack (false);
+
+  c->end_serialize();
+}
+
+static void
+populate_serializer_virtual_link (hb_serialize_context_t* c)
+{
+  c->start_serialize<char> ();
+
+  unsigned obj_d = add_object ("d", 1, c);
+
+  start_object ("b", 1, c);
+  add_offset (obj_d, c);
+  unsigned obj_b = c->pop_pack (false);
+
+  start_object ("e", 1, c);
+  add_virtual_offset (obj_b, c);
+  unsigned obj_e = c->pop_pack (false);
+
+  start_object ("c", 1, c);
+  add_offset (obj_e, c);
+  unsigned obj_c = c->pop_pack (false);
+
+  start_object ("a", 1, c);
+  add_offset (obj_b, c);
+  add_offset (obj_c, c);
+  c->pop_pack (false);
+
+  c->end_serialize();
+}
+
+static void test_sort_kahn_1 ()
+{
+  size_t buffer_size = 100;
+  void* buffer = malloc (buffer_size);
+  hb_serialize_context_t c (buffer, buffer_size);
+  populate_serializer_complex_1 (&c);
+
+  graph_t graph (c.object_graph ());
+  graph.sort_kahn ();
+
+  assert(strncmp (graph.object (3).head, "abc", 3) == 0);
+  assert(graph.object (3).real_links.length == 2);
+  assert(graph.object (3).real_links[0].objidx == 2);
+  assert(graph.object (3).real_links[1].objidx == 1);
+
+  assert(strncmp (graph.object (2).head, "def", 3) == 0);
+  assert(graph.object (2).real_links.length == 1);
+  assert(graph.object (2).real_links[0].objidx == 0);
+
+  assert(strncmp (graph.object (1).head, "jkl", 3) == 0);
+  assert(graph.object (1).real_links.length == 0);
+
+  assert(strncmp (graph.object (0).head, "ghi", 3) == 0);
+  assert(graph.object (0).real_links.length == 0);
+
+  free (buffer);
+}
+
+static void test_sort_kahn_2 ()
+{
+  size_t buffer_size = 100;
+  void* buffer = malloc (buffer_size);
+  hb_serialize_context_t c (buffer, buffer_size);
+  populate_serializer_complex_2 (&c);
+
+  graph_t graph (c.object_graph ());
+  graph.sort_kahn ();
+
+
+  assert(strncmp (graph.object (4).head, "abc", 3) == 0);
+  assert(graph.object (4).real_links.length == 3);
+  assert(graph.object (4).real_links[0].objidx == 3);
+    assert(graph.object (4).real_links[1].objidx == 0);
+  assert(graph.object (4).real_links[2].objidx == 2);
+
+  assert(strncmp (graph.object (3).head, "def", 3) == 0);
+  assert(graph.object (3).real_links.length == 1);
+  assert(graph.object (3).real_links[0].objidx == 1);
+
+  assert(strncmp (graph.object (2).head, "mn", 2) == 0);
+  assert(graph.object (2).real_links.length == 0);
+
+  assert(strncmp (graph.object (1).head, "ghi", 3) == 0);
+  assert(graph.object (1).real_links.length == 1);
+  assert(graph.object (1).real_links[0].objidx == 0);
+
+  assert(strncmp (graph.object (0).head, "jkl", 3) == 0);
+  assert(graph.object (0).real_links.length == 0);
+
+  free (buffer);
+}
+
+static void test_sort_shortest ()
+{
+  size_t buffer_size = 100;
+  void* buffer = malloc (buffer_size);
+  hb_serialize_context_t c (buffer, buffer_size);
+  populate_serializer_complex_2 (&c);
+
+  graph_t graph (c.object_graph ());
+  graph.sort_shortest_distance ();
+
+  assert(strncmp (graph.object (4).head, "abc", 3) == 0);
+  assert(graph.object (4).real_links.length == 3);
+  assert(graph.object (4).real_links[0].objidx == 2);
+  assert(graph.object (4).real_links[1].objidx == 0);
+  assert(graph.object (4).real_links[2].objidx == 3);
+
+  assert(strncmp (graph.object (3).head, "mn", 2) == 0);
+  assert(graph.object (3).real_links.length == 0);
+
+  assert(strncmp (graph.object (2).head, "def", 3) == 0);
+  assert(graph.object (2).real_links.length == 1);
+  assert(graph.object (2).real_links[0].objidx == 1);
+
+  assert(strncmp (graph.object (1).head, "ghi", 3) == 0);
+  assert(graph.object (1).real_links.length == 1);
+  assert(graph.object (1).real_links[0].objidx == 0);
+
+  assert(strncmp (graph.object (0).head, "jkl", 3) == 0);
+  assert(graph.object (0).real_links.length == 0);
+
+  free (buffer);
+}
+
+static void test_duplicate_leaf ()
+{
+  size_t buffer_size = 100;
+  void* buffer = malloc (buffer_size);
+  hb_serialize_context_t c (buffer, buffer_size);
+  populate_serializer_complex_2 (&c);
+
+  graph_t graph (c.object_graph ());
+  graph.duplicate (4, 1);
+
+  assert(strncmp (graph.object (5).head, "abc", 3) == 0);
+  assert(graph.object (5).real_links.length == 3);
+  assert(graph.object (5).real_links[0].objidx == 3);
+  assert(graph.object (5).real_links[1].objidx == 4);
+  assert(graph.object (5).real_links[2].objidx == 0);
+
+  assert(strncmp (graph.object (4).head, "jkl", 3) == 0);
+  assert(graph.object (4).real_links.length == 0);
+
+  assert(strncmp (graph.object (3).head, "def", 3) == 0);
+  assert(graph.object (3).real_links.length == 1);
+  assert(graph.object (3).real_links[0].objidx == 2);
+
+  assert(strncmp (graph.object (2).head, "ghi", 3) == 0);
+  assert(graph.object (2).real_links.length == 1);
+  assert(graph.object (2).real_links[0].objidx == 1);
+
+  assert(strncmp (graph.object (1).head, "jkl", 3) == 0);
+  assert(graph.object (1).real_links.length == 0);
+
+  assert(strncmp (graph.object (0).head, "mn", 2) == 0);
+  assert(graph.object (0).real_links.length == 0);
+
+  free (buffer);
+}
+
+static void test_duplicate_interior ()
+{
+  size_t buffer_size = 100;
+  void* buffer = malloc (buffer_size);
+  hb_serialize_context_t c (buffer, buffer_size);
+  populate_serializer_complex_3 (&c);
+
+  graph_t graph (c.object_graph ());
+  graph.duplicate (3, 2);
+
+  assert(strncmp (graph.object (6).head, "abc", 3) == 0);
+  assert(graph.object (6).real_links.length == 3);
+  assert(graph.object (6).real_links[0].objidx == 4);
+  assert(graph.object (6).real_links[1].objidx == 2);
+  assert(graph.object (6).real_links[2].objidx == 1);
+
+  assert(strncmp (graph.object (5).head, "jkl", 3) == 0);
+  assert(graph.object (5).real_links.length == 1);
+  assert(graph.object (5).real_links[0].objidx == 0);
+
+  assert(strncmp (graph.object (4).head, "def", 3) == 0);
+  assert(graph.object (4).real_links.length == 1);
+  assert(graph.object (4).real_links[0].objidx == 3);
+
+  assert(strncmp (graph.object (3).head, "ghi", 3) == 0);
+  assert(graph.object (3).real_links.length == 1);
+  assert(graph.object (3).real_links[0].objidx == 5);
+
+  assert(strncmp (graph.object (2).head, "jkl", 3) == 0);
+  assert(graph.object (2).real_links.length == 1);
+  assert(graph.object (2).real_links[0].objidx == 0);
+
+  assert(strncmp (graph.object (1).head, "mn", 2) == 0);
+  assert(graph.object (1).real_links.length == 0);
+
+  assert(strncmp (graph.object (0).head, "opqrst", 6) == 0);
+  assert(graph.object (0).real_links.length == 0);
+
+  free (buffer);
+}
+
+static void
+test_serialize ()
+{
+  size_t buffer_size = 100;
+  void* buffer_1 = malloc (buffer_size);
+  hb_serialize_context_t c1 (buffer_1, buffer_size);
+  populate_serializer_simple (&c1);
+  hb_bytes_t expected = c1.copy_bytes ();
+
+  graph_t graph (c1.object_graph ());
+  hb_blob_t* out = graph.serialize ();
+  free (buffer_1);
+
+  hb_bytes_t actual = out->as_bytes ();
+  assert (actual == expected);
+  expected.fini ();
+  hb_blob_destroy (out);
+}
+
+static void test_will_overflow_1 ()
+{
+  size_t buffer_size = 100;
+  void* buffer = malloc (buffer_size);
+  hb_serialize_context_t c (buffer, buffer_size);
+  populate_serializer_complex_2 (&c);
+  graph_t graph (c.object_graph ());
+
+  assert (!graph.will_overflow (nullptr));
+
+  free (buffer);
+}
+
+static void test_will_overflow_2 ()
+{
+  size_t buffer_size = 160000;
+  void* buffer = malloc (buffer_size);
+  hb_serialize_context_t c (buffer, buffer_size);
+  populate_serializer_with_overflow (&c);
+  graph_t graph (c.object_graph ());
+
+  assert (graph.will_overflow (nullptr));
+
+  free (buffer);
+}
+
+static void test_will_overflow_3 ()
+{
+  size_t buffer_size = 160000;
+  void* buffer = malloc (buffer_size);
+  hb_serialize_context_t c (buffer, buffer_size);
+  populate_serializer_with_dedup_overflow (&c);
+  graph_t graph (c.object_graph ());
+
+  assert (graph.will_overflow (nullptr));
+
+  free (buffer);
+}
+
+static void test_resolve_overflows_via_sort ()
+{
+  size_t buffer_size = 160000;
+  void* buffer = malloc (buffer_size);
+  hb_serialize_context_t c (buffer, buffer_size);
+  populate_serializer_with_overflow (&c);
+  graph_t graph (c.object_graph ());
+
+  hb_blob_t* out = hb_resolve_overflows (c.object_graph (), HB_TAG_NONE);
+  assert (out);
+  hb_bytes_t result = out->as_bytes ();
+  assert (result.length == (80000 + 3 + 3 * 2));
+
+  free (buffer);
+  hb_blob_destroy (out);
+}
+
+static void test_resolve_overflows_via_duplication ()
+{
+  size_t buffer_size = 160000;
+  void* buffer = malloc (buffer_size);
+  hb_serialize_context_t c (buffer, buffer_size);
+  populate_serializer_with_dedup_overflow (&c);
+  graph_t graph (c.object_graph ());
+
+  hb_blob_t* out = hb_resolve_overflows (c.object_graph (), HB_TAG_NONE);
+  assert (out);
+  hb_bytes_t result = out->as_bytes ();
+  assert (result.length == (10000 + 2 * 2 + 60000 + 2 + 3 * 2));
+
+  free (buffer);
+  hb_blob_destroy (out);
+}
+
+static void test_resolve_overflows_via_space_assignment ()
+{
+  size_t buffer_size = 160000;
+  void* buffer = malloc (buffer_size);
+  hb_serialize_context_t c (buffer, buffer_size);
+  populate_serializer_spaces (&c, true);
+
+  void* expected_buffer = malloc (buffer_size);
+  hb_serialize_context_t e (expected_buffer, buffer_size);
+  populate_serializer_spaces (&e, false);
+
+  run_resolve_overflow_test ("test_resolve_overflows_via_space_assignment",
+                             c,
+                             e);
+
+  free (buffer);
+  free (expected_buffer);
+}
+
+static void test_resolve_overflows_via_isolation ()
+{
+  size_t buffer_size = 160000;
+  void* buffer = malloc (buffer_size);
+  hb_serialize_context_t c (buffer, buffer_size);
+  populate_serializer_with_isolation_overflow (&c);
+  graph_t graph (c.object_graph ());
+
+  assert (c.offset_overflow ());
+  hb_blob_t* out = hb_resolve_overflows (c.object_graph (), HB_TAG ('G', 'S', 'U', 'B'), 0);
+  assert (out);
+  hb_bytes_t result = out->as_bytes ();
+  assert (result.length == (1 + 10000 + 60000 + 1 + 1
+                            + 4 + 3 * 2));
+
+  free (buffer);
+  hb_blob_destroy (out);
+}
+
+static void test_resolve_overflows_via_isolation_with_recursive_duplication ()
+{
+  size_t buffer_size = 160000;
+  void* buffer = malloc (buffer_size);
+  hb_serialize_context_t c (buffer, buffer_size);
+  populate_serializer_with_isolation_overflow_complex (&c);
+
+  void* expected_buffer = malloc (buffer_size);
+  hb_serialize_context_t e (expected_buffer, buffer_size);
+  populate_serializer_with_isolation_overflow_complex_expected (&e);
+
+  run_resolve_overflow_test ("test_resolve_overflows_via_isolation_with_recursive_duplication",
+                             c,
+                             e);
+  free (buffer);
+  free (expected_buffer);
+}
+
+static void test_resolve_overflows_via_isolating_16bit_space ()
+{
+  size_t buffer_size = 160000;
+  void* buffer = malloc (buffer_size);
+  hb_serialize_context_t c (buffer, buffer_size);
+  populate_serializer_spaces_16bit_connection (&c);
+
+  void* expected_buffer = malloc (buffer_size);
+  hb_serialize_context_t e (expected_buffer, buffer_size);
+  populate_serializer_spaces_16bit_connection_expected (&e);
+
+  run_resolve_overflow_test ("test_resolve_overflows_via_isolating_16bit_space",
+                             c,
+                             e);
+
+  free (buffer);
+  free (expected_buffer);
+}
+
+static void test_resolve_overflows_via_isolating_16bit_space_2 ()
+{
+  size_t buffer_size = 160000;
+  void* buffer = malloc (buffer_size);
+  hb_serialize_context_t c (buffer, buffer_size);
+  populate_serializer_short_and_wide_subgraph_root (&c);
+
+  void* expected_buffer = malloc (buffer_size);
+  hb_serialize_context_t e (expected_buffer, buffer_size);
+  populate_serializer_short_and_wide_subgraph_root_expected (&e);
+
+  run_resolve_overflow_test ("test_resolve_overflows_via_isolating_16bit_space_2",
+                             c,
+                             e);
+
+  free (buffer);
+  free (expected_buffer);
+}
+
+static void test_resolve_overflows_via_isolation_spaces ()
+{
+  size_t buffer_size = 160000;
+  void* buffer = malloc (buffer_size);
+  hb_serialize_context_t c (buffer, buffer_size);
+  populate_serializer_with_isolation_overflow_spaces (&c);
+  graph_t graph (c.object_graph ());
+
+  assert (c.offset_overflow ());
+  hb_blob_t* out = hb_resolve_overflows (c.object_graph (), HB_TAG ('G', 'S', 'U', 'B'), 0);
+  assert (out);
+  hb_bytes_t result = out->as_bytes ();
+
+  unsigned expected_length = 3 + 2 * 60000; // objects
+  expected_length += 2 * 4 + 2 * 2; // links
+  assert (result.length == expected_length);
+
+  free (buffer);
+  hb_blob_destroy (out);
+}
+
+static void test_resolve_overflows_via_splitting_spaces ()
+{
+  size_t buffer_size = 160000;
+  void* buffer = malloc (buffer_size);
+  hb_serialize_context_t c (buffer, buffer_size);
+  populate_serializer_with_split_spaces (&c);
+
+  void* expected_buffer = malloc (buffer_size);
+  hb_serialize_context_t e (expected_buffer, buffer_size);
+  populate_serializer_with_split_spaces_expected (&e);
+
+  run_resolve_overflow_test ("test_resolve_overflows_via_splitting_spaces",
+                             c,
+                             e,
+                             1);
+
+  free (buffer);
+  free (expected_buffer);
+
+}
+
+static void test_resolve_overflows_via_splitting_spaces_2 ()
+{
+  size_t buffer_size = 160000;
+  void* buffer = malloc (buffer_size);
+  hb_serialize_context_t c (buffer, buffer_size);
+  populate_serializer_with_split_spaces_2 (&c);
+
+  void* expected_buffer = malloc (buffer_size);
+  hb_serialize_context_t e (expected_buffer, buffer_size);
+  populate_serializer_with_split_spaces_expected_2 (&e);
+
+  run_resolve_overflow_test ("test_resolve_overflows_via_splitting_spaces_2",
+                             c,
+                             e,
+                             1);
+  free (buffer);
+  free (expected_buffer);
+}
+
+static void test_resolve_overflows_via_priority ()
+{
+  size_t buffer_size = 160000;
+  void* buffer = malloc (buffer_size);
+  hb_serialize_context_t c (buffer, buffer_size);
+  populate_serializer_with_priority_overflow (&c);
+
+  void* expected_buffer = malloc (buffer_size);
+  hb_serialize_context_t e (expected_buffer, buffer_size);
+  populate_serializer_with_priority_overflow_expected (&e);
+
+  run_resolve_overflow_test ("test_resolve_overflows_via_priority",
+                             c,
+                             e,
+                             3);
+  free (buffer);
+  free (expected_buffer);
+}
+
+
+static void test_virtual_link ()
+{
+  size_t buffer_size = 100;
+  void* buffer = malloc (buffer_size);
+  hb_serialize_context_t c (buffer, buffer_size);
+  populate_serializer_virtual_link (&c);
+
+  hb_blob_t* out = hb_resolve_overflows (c.object_graph (), HB_TAG_NONE);
+  assert (out);
+
+  hb_bytes_t result = out->as_bytes ();
+  assert (result.length == 5 + 4 * 2);
+  assert (result[0]  == 'a');
+  assert (result[5]  == 'c');
+  assert (result[8]  == 'e');
+  assert (result[9]  == 'b');
+  assert (result[12] == 'd');
+
+  free (buffer);
+  hb_blob_destroy (out);
+}
+
+static void
+test_shared_node_with_virtual_links ()
+{
+  size_t buffer_size = 100;
+  void* buffer = malloc (buffer_size);
+  hb_serialize_context_t c (buffer, buffer_size);
+
+  c.start_serialize<char> ();
+
+  unsigned obj_b = add_object ("b", 1, &c);
+  unsigned obj_c = add_object ("c", 1, &c);
+
+  start_object ("d", 1, &c);
+  add_virtual_offset (obj_b, &c);
+  unsigned obj_d_1 = c.pop_pack ();
+
+  start_object ("d", 1, &c);
+  add_virtual_offset (obj_c, &c);
+  unsigned obj_d_2 = c.pop_pack ();
+
+  assert (obj_d_1 == obj_d_2);
+
+  start_object ("a", 1, &c);
+  add_offset (obj_b, &c);
+  add_offset (obj_c, &c);
+  add_offset (obj_d_1, &c);
+  add_offset (obj_d_2, &c);
+  c.pop_pack ();
+  c.end_serialize ();
+
+  assert(c.object_graph() [obj_d_1]->virtual_links.length == 2);
+  assert(c.object_graph() [obj_d_1]->virtual_links[0].objidx == obj_b);
+  assert(c.object_graph() [obj_d_1]->virtual_links[1].objidx == obj_c);
+  free(buffer);
+}
+
+
+// TODO(garretrieger): update will_overflow tests to check the overflows array.
+// TODO(garretrieger): add tests for priority raising.
+
+int
+main (int argc, char **argv)
+{
+  test_serialize ();
+  test_sort_kahn_1 ();
+  test_sort_kahn_2 ();
+  test_sort_shortest ();
+  test_will_overflow_1 ();
+  test_will_overflow_2 ();
+  test_will_overflow_3 ();
+  test_resolve_overflows_via_sort ();
+  test_resolve_overflows_via_duplication ();
+  test_resolve_overflows_via_priority ();
+  test_resolve_overflows_via_space_assignment ();
+  test_resolve_overflows_via_isolation ();
+  test_resolve_overflows_via_isolation_with_recursive_duplication ();
+  test_resolve_overflows_via_isolation_spaces ();
+  test_resolve_overflows_via_isolating_16bit_space ();
+  test_resolve_overflows_via_isolating_16bit_space_2 ();
+  test_resolve_overflows_via_splitting_spaces ();
+  test_resolve_overflows_via_splitting_spaces_2 ();
+  test_duplicate_leaf ();
+  test_duplicate_interior ();
+  test_virtual_link ();
+  test_shared_node_with_virtual_links ();
+}
diff --git a/src/test-serialize.cc b/src/test-serialize.cc
new file mode 100644 (file)
index 0000000..44a2e0f
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ * Copyright © 2022  Behdad Esfahbod
+ *
+ *  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.
+ *
+ */
+
+#include "hb.hh"
+#include "hb-serialize.hh"
+#include "hb-ot-layout-common.hh"
+
+
+int
+main (int argc, char **argv)
+{
+  char buf[16384];
+
+  hb_serialize_context_t s (buf, sizeof (buf));
+
+  hb_sorted_vector_t<hb_codepoint_t> v{1, 2, 5};
+
+  auto c = s.start_serialize<OT::Coverage> ();
+
+  c->serialize (&s, hb_iter (v));
+
+  s.end_serialize ();
+
+  hb_bytes_t bytes = s.copy_bytes ();
+  assert (bytes.length == 10);
+  bytes.fini ();
+
+  return 0;
+}
diff --git a/src/test-set.cc b/src/test-set.cc
new file mode 100644 (file)
index 0000000..286f1a9
--- /dev/null
@@ -0,0 +1,97 @@
+/*
+ * Copyright © 2021  Behdad Esfahbod
+ *
+ *  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.
+ *
+ */
+
+#include "hb.hh"
+#include "hb-set.hh"
+
+
+int
+main (int argc, char **argv)
+{
+
+  /* Test copy constructor. */
+  {
+    hb_set_t v1 {1, 2};
+    hb_set_t v2 {v1};
+    assert (v1.get_population () == 2);
+    assert (v2.get_population () == 2);
+  }
+
+  /* Test copy assignment. */
+  {
+    hb_set_t v1 {1, 2};
+    hb_set_t v2 = v1;
+    assert (v1.get_population () == 2);
+    assert (v2.get_population () == 2);
+  }
+
+  /* Test move constructor. */
+  {
+    hb_set_t v {hb_set_t {1, 2}};
+    assert (v.get_population () == 2);
+  }
+
+  /* Test move assignment. */
+  {
+    hb_set_t v;
+    v = hb_set_t {1, 2};
+    assert (v.get_population () == 2);
+  }
+
+  /* Test initializing from iterable. */
+  {
+    hb_set_t s;
+
+    s.add (18);
+    s.add (12);
+
+    hb_set_t v (s);
+
+    assert (v.get_population () == 2);
+  }
+
+  /* Test initializing from iterator. */
+  {
+    hb_set_t s;
+
+    s.add (18);
+    s.add (12);
+
+    hb_set_t v (hb_iter (s));
+
+    assert (v.get_population () == 2);
+  }
+
+  /* Test initializing from initializer list and swapping. */
+  {
+    hb_set_t v1 {1, 2, 3};
+    hb_set_t v2 {4, 5};
+    hb_swap (v1, v2);
+    assert (v1.get_population () == 2);
+    assert (v2.get_population () == 3);
+  }
+
+  return 0;
+}
diff --git a/src/test-vector.cc b/src/test-vector.cc
new file mode 100644 (file)
index 0000000..521f2a1
--- /dev/null
@@ -0,0 +1,154 @@
+/*
+ * Copyright © 2021  Behdad Esfahbod
+ *
+ *  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.
+ *
+ */
+
+#include "hb.hh"
+#include "hb-vector.hh"
+#include "hb-set.hh"
+#include <string>
+
+
+int
+main (int argc, char **argv)
+{
+
+  /* Test copy constructor. */
+  {
+    hb_vector_t<int> v1 {1, 2};
+    hb_vector_t<int> v2 {v1};
+    hb_vector_t<int> V2 {v1};
+    assert (v1.length == 2);
+    assert (v1[0] == 1);
+    assert (v1[1] == 2);
+    assert (v2.length == 2);
+    assert (v2[0] == 1);
+    assert (v2[1] == 2);
+  }
+
+  /* Test copy assignment. */
+  {
+    hb_vector_t<int> v1 {1, 2};
+    hb_vector_t<int> v2 = v1;
+    hb_vector_t<int> V2 = v1;
+    assert (v1.length == 2);
+    assert (v1[0] == 1);
+    assert (v1[1] == 2);
+    assert (v2.length == 2);
+    assert (v2[0] == 1);
+    assert (v2[1] == 2);
+  }
+
+  /* Test move constructor. */
+  {
+    hb_vector_t<int> v {hb_vector_t<int> {1, 2}};
+    hb_vector_t<int> V {hb_vector_t<int> {1, 2}};
+    assert (v.length == 2);
+    assert (v[0] == 1);
+    assert (v[1] == 2);
+  }
+
+  /* Test move assignment. */
+  {
+    hb_vector_t<int> v;
+    hb_sorted_vector_t<int> V;
+    v = hb_vector_t<int> {1, 2};
+    V = hb_sorted_vector_t<int> {1, 2};
+    assert (v.length == 2);
+    assert (v[0] == 1);
+    assert (v[1] == 2);
+  }
+
+  /* Test initializing from iterable. */
+  {
+    hb_set_t s;
+
+    s.add (18);
+    s.add (12);
+
+    hb_vector_t<int> v (s);
+    hb_sorted_vector_t<int> V (s);
+
+    assert (v.length == 2);
+    assert (V.length == 2);
+    assert (v[0] == 12);
+    assert (V[0] == 12);
+    assert (v[1] == 18);
+    assert (V[1] == 18);
+  }
+
+  /* Test initializing from iterator. */
+  {
+    hb_set_t s;
+
+    s.add (18);
+    s.add (12);
+
+    hb_vector_t<int> v (hb_iter (s));
+    hb_vector_t<int> V (hb_iter (s));
+
+    assert (v.length == 2);
+    assert (V.length == 2);
+    assert (v[0] == 12);
+    assert (V[0] == 12);
+    assert (v[1] == 18);
+    assert (V[1] == 18);
+  }
+
+  /* Test initializing from initializer list and swapping. */
+  {
+    hb_vector_t<int> v1 {1, 2, 3};
+    hb_vector_t<int> v2 {4, 5};
+    hb_swap (v1, v2);
+    assert (v1.length == 2);
+    assert (v1[0] == 4);
+    assert (v2.length == 3);
+    assert (v2[2] == 3);
+  }
+
+  /* Test initializing sorted-vector from initializer list and swapping. */
+  {
+    hb_sorted_vector_t<int> v1 {1, 2, 3};
+    hb_sorted_vector_t<int> v2 {4, 5};
+    hb_swap (v1, v2);
+    assert (v1.length == 2);
+    assert (v1[0] == 4);
+    assert (v2.length == 3);
+    assert (v2[2] == 3);
+  }
+
+#if 0
+  {
+    hb_vector_t<std::string> v;
+
+    std::string s;
+    for (unsigned i = 1; i < 100; i++)
+    {
+      s += "x";
+      v.push (s);
+    }
+  }
+#endif
+
+  return 0;
+}
index 65b469f..d848cf1 100644 (file)
 
 #include "hb.hh"
 
-#include "hb.h"
-
-#include <stdio.h>
-
 #ifdef HAVE_FREETYPE
 #include "hb-ft.h"
 #endif
 
 #ifdef HB_NO_OPEN
-#define hb_blob_create_from_file(x)  hb_blob_get_empty ()
+#define hb_blob_create_from_file_or_fail(x)  hb_blob_get_empty ()
 #endif
 
 int
@@ -46,7 +42,8 @@ main (int argc, char **argv)
     exit (1);
   }
 
-  hb_blob_t *blob = hb_blob_create_from_file (argv[1]);
+  hb_blob_t *blob = hb_blob_create_from_file_or_fail (argv[1]);
+  assert (blob);
   printf ("Opened font file %s: %u bytes long\n", argv[1], hb_blob_get_length (blob));
 
   /* Create the face */
diff --git a/subprojects/cairo.wrap b/subprojects/cairo.wrap
new file mode 100644 (file)
index 0000000..7a7d18c
--- /dev/null
@@ -0,0 +1,8 @@
+[wrap-git]
+directory=cairo
+url=https://gitlab.freedesktop.org/cairo/cairo.git
+depth=1
+revision=1.17.4
+
+[provide]
+dependency_names = cairo, cairo-ft
diff --git a/subprojects/expat.wrap b/subprojects/expat.wrap
deleted file mode 100644 (file)
index 0b7c53e..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-[wrap-file]
-directory = expat-2.2.5
-
-source_url = https://github.com/libexpat/libexpat/releases/download/R_2_2_5/expat-2.2.5.tar.bz2
-source_filename = expat-2.2.5.tar.bz2
-source_hash = d9dc32efba7e74f788fcc4f212a43216fc37cf5f23f4c2339664d473353aedf6
-
-patch_url = https://wrapdb.mesonbuild.com/v1/projects/expat/2.2.5/4/get_zip
-patch_filename = expat-2.2.5-4-wrap.zip
-patch_hash = 25748839be2bbdd2ff586d1a05aa6fc37aeada75c78416df6e8347a6321abaac
diff --git a/subprojects/fontconfig.wrap b/subprojects/fontconfig.wrap
deleted file mode 100644 (file)
index 6b18b2b..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-[wrap-git]
-directory=fontconfig
-url=https://github.com/centricular/fontconfig.git
-depth=1
-push-url=git@github.com:centricular/fontconfig.git
-revision=meson
index 7c88f89..cf8f307 100644 (file)
@@ -1,6 +1,7 @@
 [wrap-git]
-directory=freetype2
-url=https://github.com/centricular/freetype2.git
-depth=1
-push-url=git@github.com:centricular/freetype2.git
-revision=meson
+directory=freetype
+url=https://gitlab.freedesktop.org/freetype/freetype.git
+revision=VER-2-11-0
+
+[provide]
+freetype2 = freetype_dep
index 7a4eae1..9143090 100644 (file)
@@ -4,3 +4,7 @@ url=https://gitlab.gnome.org/GNOME/glib.git
 depth=1
 push-url=git@gitlab.gnome.org:GNOME/glib.git
 revision=2.58.1
+
+[provide]
+glib-2.0 = libglib_dep
+gobject-2.0 = libgobject_dep
diff --git a/subprojects/google-benchmark.wrap b/subprojects/google-benchmark.wrap
new file mode 100644 (file)
index 0000000..876927d
--- /dev/null
@@ -0,0 +1,9 @@
+[wrap-file]
+directory = benchmark-1.5.2
+source_url = https://github.com/google/benchmark/archive/v1.5.2.zip
+source_filename = benchmark-1.5.2.zip
+source_hash = 21e6e096c9a9a88076b46bd38c33660f565fa050ca427125f64c4a8bf60f336b
+patch_url = https://wrapdb.mesonbuild.com/v1/projects/google-benchmark/1.5.2/1/get_zip
+patch_filename = google-benchmark-1.5.2-1-wrap.zip
+patch_hash = 49f41e4a7e68ac258b6509b9de9857441903be4fb473454c4cba8be885f0c6c3
+
diff --git a/subprojects/libffi.wrap b/subprojects/libffi.wrap
deleted file mode 100644 (file)
index 466ca81..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-[wrap-git]
-directory=libffi
-url=https://gitlab.freedesktop.org/gstreamer/meson-ports/libffi.git
-depth=1
-revision=meson
diff --git a/subprojects/packagefiles/ragel/meson.build b/subprojects/packagefiles/ragel/meson.build
new file mode 100644 (file)
index 0000000..cd317c2
--- /dev/null
@@ -0,0 +1,58 @@
+project('ragel', 'c', 'cpp',
+  version : '6.10'
+)
+
+conf = configuration_data()
+conf.set_quoted('PACKAGE', meson.project_name())
+conf.set_quoted('VERSION', meson.project_version())
+configure_file(
+  output : 'config.h',
+  configuration : conf
+)
+
+ragel_sources = files(
+  'ragel/buffer.h', 'ragel/cdcodegen.cpp', 'ragel/cdcodegen.h',
+  'ragel/cdfflat.cpp', 'ragel/cdfflat.h', 'ragel/cdfgoto.cpp',
+  'ragel/cdfgoto.h', 'ragel/cdflat.cpp', 'ragel/cdflat.h',
+  'ragel/cdftable.cpp', 'ragel/cdftable.h', 'ragel/cdgoto.cpp',
+  'ragel/cdgoto.h', 'ragel/cdipgoto.cpp', 'ragel/cdipgoto.h',
+  'ragel/cdsplit.cpp', 'ragel/cdsplit.h', 'ragel/cdtable.cpp',
+  'ragel/cdtable.h', 'ragel/common.cpp', 'ragel/common.h',
+  'ragel/cscodegen.cpp', 'ragel/cscodegen.h', 'ragel/csfflat.cpp',
+  'ragel/csfflat.h', 'ragel/csfgoto.cpp', 'ragel/csfgoto.h',
+  'ragel/csflat.cpp', 'ragel/csflat.h', 'ragel/csftable.cpp',
+  'ragel/csftable.h', 'ragel/csgoto.cpp', 'ragel/csgoto.h',
+  'ragel/csipgoto.cpp', 'ragel/csipgoto.h', 'ragel/cssplit.cpp',
+  'ragel/cssplit.h', 'ragel/cstable.cpp', 'ragel/cstable.h',
+  'ragel/dotcodegen.cpp', 'ragel/dotcodegen.h', 'ragel/fsmap.cpp',
+  'ragel/fsmattach.cpp', 'ragel/fsmbase.cpp', 'ragel/fsmgraph.cpp',
+  'ragel/fsmgraph.h', 'ragel/fsmmin.cpp', 'ragel/fsmstate.cpp',
+  'ragel/gendata.cpp', 'ragel/gendata.h', 'ragel/gocodegen.cpp',
+  'ragel/gocodegen.h', 'ragel/gofflat.cpp', 'ragel/gofflat.h',
+  'ragel/gofgoto.cpp', 'ragel/gofgoto.h', 'ragel/goflat.cpp', 'ragel/goflat.h',
+  'ragel/goftable.cpp', 'ragel/goftable.h', 'ragel/gogoto.cpp',
+  'ragel/gogoto.h', 'ragel/goipgoto.cpp', 'ragel/goipgoto.h',
+  'ragel/gotable.cpp', 'ragel/gotable.h', 'ragel/gotablish.cpp',
+  'ragel/gotablish.h', 'ragel/inputdata.cpp', 'ragel/inputdata.h',
+  'ragel/javacodegen.cpp', 'ragel/javacodegen.h', 'ragel/main.cpp',
+  'ragel/mlcodegen.cpp', 'ragel/mlcodegen.h', 'ragel/mlfflat.cpp',
+  'ragel/mlfflat.h', 'ragel/mlfgoto.cpp', 'ragel/mlfgoto.h',
+  'ragel/mlflat.cpp', 'ragel/mlflat.h', 'ragel/mlftable.cpp',
+  'ragel/mlftable.h', 'ragel/mlgoto.cpp', 'ragel/mlgoto.h',
+  'ragel/mltable.cpp', 'ragel/mltable.h', 'ragel/parsedata.cpp',
+  'ragel/parsedata.h', 'ragel/parsetree.cpp', 'ragel/parsetree.h',
+  'ragel/pcheck.h', 'ragel/ragel.h', 'ragel/rbxgoto.cpp', 'ragel/rbxgoto.h',
+  'ragel/redfsm.cpp', 'ragel/redfsm.h', 'ragel/rlparse.cpp', 'ragel/rlparse.h',
+  'ragel/rlscan.cpp', 'ragel/rlscan.h', 'ragel/rubycodegen.cpp',
+  'ragel/rubycodegen.h', 'ragel/rubyfflat.cpp', 'ragel/rubyfflat.h',
+  'ragel/rubyflat.cpp', 'ragel/rubyflat.h', 'ragel/rubyftable.cpp',
+  'ragel/rubyftable.h', 'ragel/rubytable.cpp', 'ragel/rubytable.h',
+  'ragel/version.h', 'ragel/xmlcodegen.cpp', 'ragel/xmlcodegen.h',
+)
+
+ragel = executable(
+  meson.project_name(),
+  ragel_sources,
+  include_directories : ['aapl', 'ragel'],
+  install : true,
+)
diff --git a/subprojects/proxy-libintl.wrap b/subprojects/proxy-libintl.wrap
deleted file mode 100644 (file)
index 5e1e19a..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-[wrap-git]
-directory=proxy-libintl
-url=https://github.com/frida/proxy-libintl.git
-depth=1
-revision=0.1
diff --git a/subprojects/ragel.wrap b/subprojects/ragel.wrap
new file mode 100644 (file)
index 0000000..1dabcbc
--- /dev/null
@@ -0,0 +1,11 @@
+[wrap-file]
+directory = ragel-6.10
+source_url = https://www.colm.net/files/ragel/ragel-6.10.tar.gz
+source_filename = ragel-6.10.tar.gz
+source_hash = 5f156edb65d20b856d638dd9ee2dfb43285914d9aa2b6ec779dac0270cd56c3f
+patch_directory = ragel
+
+[provide]
+ragel = ragel
+
+
diff --git a/subprojects/ttf-parser.wrap b/subprojects/ttf-parser.wrap
new file mode 100644 (file)
index 0000000..11cda54
--- /dev/null
@@ -0,0 +1,5 @@
+[wrap-git]
+directory=ttf-parser
+url=https://github.com/RazrFalcon/ttf-parser.git
+depth=1
+revision=master
diff --git a/subprojects/zlib.wrap b/subprojects/zlib.wrap
deleted file mode 100644 (file)
index b62b63a..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-[wrap-git]
-directory=zlib
-url=https://github.com/centricular/zlib.git
-depth=1
-revision=meson
index 89dba1e..b8521a4 100755 (executable)
@@ -3,7 +3,7 @@
 
 scriptversion=2018-03-07.03; # UTC
 
-# Copyright (C) 2011-2020 Free Software Foundation, Inc.
+# Copyright (C) 2011-2018 Free Software Foundation, Inc.
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
index b67d707..01d542a 100644 (file)
@@ -2,7 +2,7 @@
 
 NULL =
 EXTRA_DIST =
-SUBDIRS = api shaping fuzzing subset
+SUBDIRS = api shape subset fuzzing
 
 EXTRA_DIST += \
        meson.build \
index 8f0ee9e..b3e97a2 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.16.2 from Makefile.am.
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2020 Free Software Foundation, Inc.
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -202,6 +202,8 @@ CAIRO_LIBS = @CAIRO_LIBS@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
+CHAFA_CFLAGS = @CHAFA_CFLAGS@
+CHAFA_LIBS = @CHAFA_LIBS@
 CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
 CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
 CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
@@ -230,8 +232,6 @@ ECHO_T = @ECHO_T@
 EGREP = @EGREP@
 EXEEXT = @EXEEXT@
 FGREP = @FGREP@
-FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@
-FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
 FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
 FREETYPE_DEPS = @FREETYPE_DEPS@
 FREETYPE_LIBS = @FREETYPE_LIBS@
@@ -264,7 +264,6 @@ HB_VERSION_MICRO = @HB_VERSION_MICRO@
 HB_VERSION_MINOR = @HB_VERSION_MINOR@
 HTML_DIR = @HTML_DIR@
 ICU_CFLAGS = @ICU_CFLAGS@
-ICU_CONFIG = @ICU_CONFIG@
 ICU_LIBS = @ICU_LIBS@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
@@ -370,6 +369,7 @@ pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -380,7 +380,7 @@ top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 NULL = 
 EXTRA_DIST = meson.build $(NULL)
-SUBDIRS = api shaping fuzzing subset
+SUBDIRS = api shape subset fuzzing
 all: all-recursive
 
 .SUFFIXES:
index 0170b68..883464c 100644 (file)
@@ -38,12 +38,16 @@ TEST_PROGS = \
        test-common \
        test-draw \
        test-font \
+       test-font-scale \
        test-map \
        test-object \
+       test-ot-alternates \
        test-ot-color \
+       test-ot-collect-glyphs \
        test-ot-face \
        test-ot-glyphname \
        test-ot-ligature-carets \
+       test-ot-layout \
        test-ot-name \
        test-ot-meta \
        test-ot-metrics \
@@ -52,6 +56,7 @@ TEST_PROGS = \
        test-ot-metrics-tt-var \
        test-set \
        test-shape \
+       test-style \
        test-subset \
        test-subset-cmap \
        test-subset-drop-tables \
index 35bb394..b02077f 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.16.2 from Makefile.am.
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2020 Free Software Foundation, Inc.
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -136,16 +136,22 @@ am__EXEEXT_1 =
 @HAVE_GLIB_TRUE@       test-collect-unicodes$(EXEEXT) \
 @HAVE_GLIB_TRUE@       test-cplusplus$(EXEEXT) test-common$(EXEEXT) \
 @HAVE_GLIB_TRUE@       test-draw$(EXEEXT) test-font$(EXEEXT) \
-@HAVE_GLIB_TRUE@       test-map$(EXEEXT) test-object$(EXEEXT) \
-@HAVE_GLIB_TRUE@       test-ot-color$(EXEEXT) test-ot-face$(EXEEXT) \
+@HAVE_GLIB_TRUE@       test-font-scale$(EXEEXT) test-map$(EXEEXT) \
+@HAVE_GLIB_TRUE@       test-object$(EXEEXT) \
+@HAVE_GLIB_TRUE@       test-ot-alternates$(EXEEXT) \
+@HAVE_GLIB_TRUE@       test-ot-color$(EXEEXT) \
+@HAVE_GLIB_TRUE@       test-ot-collect-glyphs$(EXEEXT) \
+@HAVE_GLIB_TRUE@       test-ot-face$(EXEEXT) \
 @HAVE_GLIB_TRUE@       test-ot-glyphname$(EXEEXT) \
 @HAVE_GLIB_TRUE@       test-ot-ligature-carets$(EXEEXT) \
-@HAVE_GLIB_TRUE@       test-ot-name$(EXEEXT) test-ot-meta$(EXEEXT) \
-@HAVE_GLIB_TRUE@       test-ot-metrics$(EXEEXT) test-ot-tag$(EXEEXT) \
+@HAVE_GLIB_TRUE@       test-ot-layout$(EXEEXT) test-ot-name$(EXEEXT) \
+@HAVE_GLIB_TRUE@       test-ot-meta$(EXEEXT) test-ot-metrics$(EXEEXT) \
+@HAVE_GLIB_TRUE@       test-ot-tag$(EXEEXT) \
 @HAVE_GLIB_TRUE@       test-ot-extents-cff$(EXEEXT) \
 @HAVE_GLIB_TRUE@       test-ot-metrics-tt-var$(EXEEXT) \
 @HAVE_GLIB_TRUE@       test-set$(EXEEXT) test-shape$(EXEEXT) \
-@HAVE_GLIB_TRUE@       test-subset$(EXEEXT) test-subset-cmap$(EXEEXT) \
+@HAVE_GLIB_TRUE@       test-style$(EXEEXT) test-subset$(EXEEXT) \
+@HAVE_GLIB_TRUE@       test-subset-cmap$(EXEEXT) \
 @HAVE_GLIB_TRUE@       test-subset-drop-tables$(EXEEXT) \
 @HAVE_GLIB_TRUE@       test-subset-glyf$(EXEEXT) \
 @HAVE_GLIB_TRUE@       test-subset-hdmx$(EXEEXT) \
@@ -234,6 +240,12 @@ test_font_LDADD = $(LDADD)
 @HAVE_GLIB_TRUE@test_font_DEPENDENCIES =  \
 @HAVE_GLIB_TRUE@       $(top_builddir)/src/libharfbuzz.la \
 @HAVE_GLIB_TRUE@       $(am__DEPENDENCIES_1)
+test_font_scale_SOURCES = test-font-scale.c
+test_font_scale_OBJECTS = test-font-scale.$(OBJEXT)
+test_font_scale_LDADD = $(LDADD)
+@HAVE_GLIB_TRUE@test_font_scale_DEPENDENCIES =  \
+@HAVE_GLIB_TRUE@       $(top_builddir)/src/libharfbuzz.la \
+@HAVE_GLIB_TRUE@       $(am__DEPENDENCIES_1)
 test_map_SOURCES = test-map.c
 test_map_OBJECTS = test-map.$(OBJEXT)
 test_map_LDADD = $(LDADD)
@@ -255,6 +267,18 @@ test_object_LDADD = $(LDADD)
 @HAVE_GLIB_TRUE@test_object_DEPENDENCIES =  \
 @HAVE_GLIB_TRUE@       $(top_builddir)/src/libharfbuzz.la \
 @HAVE_GLIB_TRUE@       $(am__DEPENDENCIES_1)
+test_ot_alternates_SOURCES = test-ot-alternates.c
+test_ot_alternates_OBJECTS = test-ot-alternates.$(OBJEXT)
+test_ot_alternates_LDADD = $(LDADD)
+@HAVE_GLIB_TRUE@test_ot_alternates_DEPENDENCIES =  \
+@HAVE_GLIB_TRUE@       $(top_builddir)/src/libharfbuzz.la \
+@HAVE_GLIB_TRUE@       $(am__DEPENDENCIES_1)
+test_ot_collect_glyphs_SOURCES = test-ot-collect-glyphs.c
+test_ot_collect_glyphs_OBJECTS = test-ot-collect-glyphs.$(OBJEXT)
+test_ot_collect_glyphs_LDADD = $(LDADD)
+@HAVE_GLIB_TRUE@test_ot_collect_glyphs_DEPENDENCIES =  \
+@HAVE_GLIB_TRUE@       $(top_builddir)/src/libharfbuzz.la \
+@HAVE_GLIB_TRUE@       $(am__DEPENDENCIES_1)
 test_ot_color_SOURCES = test-ot-color.c
 test_ot_color_OBJECTS = test-ot-color.$(OBJEXT)
 test_ot_color_LDADD = $(LDADD)
@@ -279,6 +303,12 @@ test_ot_glyphname_LDADD = $(LDADD)
 @HAVE_GLIB_TRUE@test_ot_glyphname_DEPENDENCIES =  \
 @HAVE_GLIB_TRUE@       $(top_builddir)/src/libharfbuzz.la \
 @HAVE_GLIB_TRUE@       $(am__DEPENDENCIES_1)
+test_ot_layout_SOURCES = test-ot-layout.c
+test_ot_layout_OBJECTS = test-ot-layout.$(OBJEXT)
+test_ot_layout_LDADD = $(LDADD)
+@HAVE_GLIB_TRUE@test_ot_layout_DEPENDENCIES =  \
+@HAVE_GLIB_TRUE@       $(top_builddir)/src/libharfbuzz.la \
+@HAVE_GLIB_TRUE@       $(am__DEPENDENCIES_1)
 test_ot_ligature_carets_SOURCES = test-ot-ligature-carets.c
 test_ot_ligature_carets_OBJECTS = test-ot-ligature-carets.$(OBJEXT)
 test_ot_ligature_carets_LDADD = $(LDADD)
@@ -332,6 +362,12 @@ test_shape_LDADD = $(LDADD)
 @HAVE_GLIB_TRUE@test_shape_DEPENDENCIES =  \
 @HAVE_GLIB_TRUE@       $(top_builddir)/src/libharfbuzz.la \
 @HAVE_GLIB_TRUE@       $(am__DEPENDENCIES_1)
+test_style_SOURCES = test-style.c
+test_style_OBJECTS = test-style.$(OBJEXT)
+test_style_LDADD = $(LDADD)
+@HAVE_GLIB_TRUE@test_style_DEPENDENCIES =  \
+@HAVE_GLIB_TRUE@       $(top_builddir)/src/libharfbuzz.la \
+@HAVE_GLIB_TRUE@       $(am__DEPENDENCIES_1)
 test_subset_SOURCES = test-subset.c
 test_subset_OBJECTS = test-subset.$(OBJEXT)
 @HAVE_GLIB_TRUE@test_subset_DEPENDENCIES = $(am__DEPENDENCIES_2) \
@@ -448,16 +484,20 @@ am__depfiles_remade = ./$(DEPDIR)/test-aat-layout.Po \
        ./$(DEPDIR)/test-buffer.Po \
        ./$(DEPDIR)/test-collect-unicodes.Po \
        ./$(DEPDIR)/test-common.Po ./$(DEPDIR)/test-draw.Po \
-       ./$(DEPDIR)/test-font.Po ./$(DEPDIR)/test-map.Po \
-       ./$(DEPDIR)/test-object.Po ./$(DEPDIR)/test-ot-color.Po \
+       ./$(DEPDIR)/test-font-scale.Po ./$(DEPDIR)/test-font.Po \
+       ./$(DEPDIR)/test-map.Po ./$(DEPDIR)/test-object.Po \
+       ./$(DEPDIR)/test-ot-alternates.Po \
+       ./$(DEPDIR)/test-ot-collect-glyphs.Po \
+       ./$(DEPDIR)/test-ot-color.Po \
        ./$(DEPDIR)/test-ot-extents-cff.Po ./$(DEPDIR)/test-ot-face.Po \
-       ./$(DEPDIR)/test-ot-glyphname.Po \
+       ./$(DEPDIR)/test-ot-glyphname.Po ./$(DEPDIR)/test-ot-layout.Po \
        ./$(DEPDIR)/test-ot-ligature-carets.Po \
        ./$(DEPDIR)/test-ot-meta.Po \
        ./$(DEPDIR)/test-ot-metrics-tt-var.Po \
        ./$(DEPDIR)/test-ot-metrics.Po ./$(DEPDIR)/test-ot-name.Po \
        ./$(DEPDIR)/test-ot-tag.Po ./$(DEPDIR)/test-set.Po \
-       ./$(DEPDIR)/test-shape.Po ./$(DEPDIR)/test-subset-cbdt.Po \
+       ./$(DEPDIR)/test-shape.Po ./$(DEPDIR)/test-style.Po \
+       ./$(DEPDIR)/test-subset-cbdt.Po \
        ./$(DEPDIR)/test-subset-cff1.Po \
        ./$(DEPDIR)/test-subset-cff2.Po \
        ./$(DEPDIR)/test-subset-cmap.Po \
@@ -516,36 +556,38 @@ am__v_CXXLD_0 = @echo "  CXXLD   " $@;
 am__v_CXXLD_1 = 
 SOURCES = test-aat-layout.c test-baseline.c test-blob.c test-buffer.c \
        test-c.c test-collect-unicodes.c test-common.c \
-       $(test_cplusplus_SOURCES) test-draw.c test-font.c test-map.c \
-       test-multithread.c test-object.c test-ot-color.c \
+       $(test_cplusplus_SOURCES) test-draw.c test-font.c \
+       test-font-scale.c test-map.c test-multithread.c test-object.c \
+       test-ot-alternates.c test-ot-collect-glyphs.c test-ot-color.c \
        test-ot-extents-cff.c test-ot-face.c test-ot-glyphname.c \
-       test-ot-ligature-carets.c test-ot-math.c test-ot-meta.c \
-       test-ot-metrics.c test-ot-metrics-tt-var.c test-ot-name.c \
-       test-ot-tag.c test-set.c test-shape.c test-subset.c \
-       test-subset-cbdt.c test-subset-cff1.c test-subset-cff2.c \
-       test-subset-cmap.c test-subset-colr.c \
-       test-subset-drop-tables.c test-subset-glyf.c \
-       test-subset-gpos.c test-subset-gvar.c test-subset-hdmx.c \
-       test-subset-hmtx.c test-subset-hvar.c test-subset-nameids.c \
-       test-subset-os2.c test-subset-post.c test-subset-sbix.c \
-       test-subset-vmtx.c test-subset-vvar.c test-unicode.c \
-       test-var-coords.c test-version.c
+       test-ot-layout.c test-ot-ligature-carets.c test-ot-math.c \
+       test-ot-meta.c test-ot-metrics.c test-ot-metrics-tt-var.c \
+       test-ot-name.c test-ot-tag.c test-set.c test-shape.c \
+       test-style.c test-subset.c test-subset-cbdt.c \
+       test-subset-cff1.c test-subset-cff2.c test-subset-cmap.c \
+       test-subset-colr.c test-subset-drop-tables.c \
+       test-subset-glyf.c test-subset-gpos.c test-subset-gvar.c \
+       test-subset-hdmx.c test-subset-hmtx.c test-subset-hvar.c \
+       test-subset-nameids.c test-subset-os2.c test-subset-post.c \
+       test-subset-sbix.c test-subset-vmtx.c test-subset-vvar.c \
+       test-unicode.c test-var-coords.c test-version.c
 DIST_SOURCES = test-aat-layout.c test-baseline.c test-blob.c \
        test-buffer.c test-c.c test-collect-unicodes.c test-common.c \
        $(am__test_cplusplus_SOURCES_DIST) test-draw.c test-font.c \
-       test-map.c test-multithread.c test-object.c test-ot-color.c \
+       test-font-scale.c test-map.c test-multithread.c test-object.c \
+       test-ot-alternates.c test-ot-collect-glyphs.c test-ot-color.c \
        test-ot-extents-cff.c test-ot-face.c test-ot-glyphname.c \
-       test-ot-ligature-carets.c test-ot-math.c test-ot-meta.c \
-       test-ot-metrics.c test-ot-metrics-tt-var.c test-ot-name.c \
-       test-ot-tag.c test-set.c test-shape.c test-subset.c \
-       test-subset-cbdt.c test-subset-cff1.c test-subset-cff2.c \
-       test-subset-cmap.c test-subset-colr.c \
-       test-subset-drop-tables.c test-subset-glyf.c \
-       test-subset-gpos.c test-subset-gvar.c test-subset-hdmx.c \
-       test-subset-hmtx.c test-subset-hvar.c test-subset-nameids.c \
-       test-subset-os2.c test-subset-post.c test-subset-sbix.c \
-       test-subset-vmtx.c test-subset-vvar.c test-unicode.c \
-       test-var-coords.c test-version.c
+       test-ot-layout.c test-ot-ligature-carets.c test-ot-math.c \
+       test-ot-meta.c test-ot-metrics.c test-ot-metrics-tt-var.c \
+       test-ot-name.c test-ot-tag.c test-set.c test-shape.c \
+       test-style.c test-subset.c test-subset-cbdt.c \
+       test-subset-cff1.c test-subset-cff2.c test-subset-cmap.c \
+       test-subset-colr.c test-subset-drop-tables.c \
+       test-subset-glyf.c test-subset-gpos.c test-subset-gvar.c \
+       test-subset-hdmx.c test-subset-hmtx.c test-subset-hvar.c \
+       test-subset-nameids.c test-subset-os2.c test-subset-post.c \
+       test-subset-sbix.c test-subset-vmtx.c test-subset-vvar.c \
+       test-unicode.c test-var-coords.c test-version.c
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
     n|no|NO) false;; \
@@ -792,6 +834,8 @@ CAIRO_LIBS = @CAIRO_LIBS@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
+CHAFA_CFLAGS = @CHAFA_CFLAGS@
+CHAFA_LIBS = @CHAFA_LIBS@
 CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
 CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
 CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
@@ -820,8 +864,6 @@ ECHO_T = @ECHO_T@
 EGREP = @EGREP@
 EXEEXT = @EXEEXT@
 FGREP = @FGREP@
-FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@
-FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
 FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
 FREETYPE_DEPS = @FREETYPE_DEPS@
 FREETYPE_LIBS = @FREETYPE_LIBS@
@@ -854,7 +896,6 @@ HB_VERSION_MICRO = @HB_VERSION_MICRO@
 HB_VERSION_MINOR = @HB_VERSION_MINOR@
 HTML_DIR = @HTML_DIR@
 ICU_CFLAGS = @ICU_CFLAGS@
-ICU_CONFIG = @ICU_CONFIG@
 ICU_LIBS = @ICU_LIBS@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
@@ -960,6 +1001,7 @@ pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -979,12 +1021,14 @@ LINK = $(CXXLINK)
 @HAVE_GLIB_TRUE@TEST_PROGS = test-aat-layout test-baseline test-blob \
 @HAVE_GLIB_TRUE@       test-buffer test-c test-collect-unicodes \
 @HAVE_GLIB_TRUE@       test-cplusplus test-common test-draw test-font \
-@HAVE_GLIB_TRUE@       test-map test-object test-ot-color \
-@HAVE_GLIB_TRUE@       test-ot-face test-ot-glyphname \
-@HAVE_GLIB_TRUE@       test-ot-ligature-carets test-ot-name \
-@HAVE_GLIB_TRUE@       test-ot-meta test-ot-metrics test-ot-tag \
+@HAVE_GLIB_TRUE@       test-font-scale test-map test-object \
+@HAVE_GLIB_TRUE@       test-ot-alternates test-ot-color \
+@HAVE_GLIB_TRUE@       test-ot-collect-glyphs test-ot-face \
+@HAVE_GLIB_TRUE@       test-ot-glyphname test-ot-ligature-carets \
+@HAVE_GLIB_TRUE@       test-ot-layout test-ot-name test-ot-meta \
+@HAVE_GLIB_TRUE@       test-ot-metrics test-ot-tag \
 @HAVE_GLIB_TRUE@       test-ot-extents-cff test-ot-metrics-tt-var \
-@HAVE_GLIB_TRUE@       test-set test-shape test-subset \
+@HAVE_GLIB_TRUE@       test-set test-shape test-style test-subset \
 @HAVE_GLIB_TRUE@       test-subset-cmap test-subset-drop-tables \
 @HAVE_GLIB_TRUE@       test-subset-glyf test-subset-hdmx \
 @HAVE_GLIB_TRUE@       test-subset-hmtx test-subset-nameids \
@@ -1150,6 +1194,10 @@ test-font$(EXEEXT): $(test_font_OBJECTS) $(test_font_DEPENDENCIES) $(EXTRA_test_
        @rm -f test-font$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(test_font_OBJECTS) $(test_font_LDADD) $(LIBS)
 
+test-font-scale$(EXEEXT): $(test_font_scale_OBJECTS) $(test_font_scale_DEPENDENCIES) $(EXTRA_test_font_scale_DEPENDENCIES) 
+       @rm -f test-font-scale$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(test_font_scale_OBJECTS) $(test_font_scale_LDADD) $(LIBS)
+
 test-map$(EXEEXT): $(test_map_OBJECTS) $(test_map_DEPENDENCIES) $(EXTRA_test_map_DEPENDENCIES) 
        @rm -f test-map$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(test_map_OBJECTS) $(test_map_LDADD) $(LIBS)
@@ -1162,6 +1210,14 @@ test-object$(EXEEXT): $(test_object_OBJECTS) $(test_object_DEPENDENCIES) $(EXTRA
        @rm -f test-object$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(test_object_OBJECTS) $(test_object_LDADD) $(LIBS)
 
+test-ot-alternates$(EXEEXT): $(test_ot_alternates_OBJECTS) $(test_ot_alternates_DEPENDENCIES) $(EXTRA_test_ot_alternates_DEPENDENCIES) 
+       @rm -f test-ot-alternates$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(test_ot_alternates_OBJECTS) $(test_ot_alternates_LDADD) $(LIBS)
+
+test-ot-collect-glyphs$(EXEEXT): $(test_ot_collect_glyphs_OBJECTS) $(test_ot_collect_glyphs_DEPENDENCIES) $(EXTRA_test_ot_collect_glyphs_DEPENDENCIES) 
+       @rm -f test-ot-collect-glyphs$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(test_ot_collect_glyphs_OBJECTS) $(test_ot_collect_glyphs_LDADD) $(LIBS)
+
 test-ot-color$(EXEEXT): $(test_ot_color_OBJECTS) $(test_ot_color_DEPENDENCIES) $(EXTRA_test_ot_color_DEPENDENCIES) 
        @rm -f test-ot-color$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(test_ot_color_OBJECTS) $(test_ot_color_LDADD) $(LIBS)
@@ -1178,6 +1234,10 @@ test-ot-glyphname$(EXEEXT): $(test_ot_glyphname_OBJECTS) $(test_ot_glyphname_DEP
        @rm -f test-ot-glyphname$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(test_ot_glyphname_OBJECTS) $(test_ot_glyphname_LDADD) $(LIBS)
 
+test-ot-layout$(EXEEXT): $(test_ot_layout_OBJECTS) $(test_ot_layout_DEPENDENCIES) $(EXTRA_test_ot_layout_DEPENDENCIES) 
+       @rm -f test-ot-layout$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(test_ot_layout_OBJECTS) $(test_ot_layout_LDADD) $(LIBS)
+
 test-ot-ligature-carets$(EXEEXT): $(test_ot_ligature_carets_OBJECTS) $(test_ot_ligature_carets_DEPENDENCIES) $(EXTRA_test_ot_ligature_carets_DEPENDENCIES) 
        @rm -f test-ot-ligature-carets$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(test_ot_ligature_carets_OBJECTS) $(test_ot_ligature_carets_LDADD) $(LIBS)
@@ -1214,6 +1274,10 @@ test-shape$(EXEEXT): $(test_shape_OBJECTS) $(test_shape_DEPENDENCIES) $(EXTRA_te
        @rm -f test-shape$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(test_shape_OBJECTS) $(test_shape_LDADD) $(LIBS)
 
+test-style$(EXEEXT): $(test_style_OBJECTS) $(test_style_DEPENDENCIES) $(EXTRA_test_style_DEPENDENCIES) 
+       @rm -f test-style$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(test_style_OBJECTS) $(test_style_LDADD) $(LIBS)
+
 test-subset$(EXEEXT): $(test_subset_OBJECTS) $(test_subset_DEPENDENCIES) $(EXTRA_test_subset_DEPENDENCIES) 
        @rm -f test-subset$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(test_subset_OBJECTS) $(test_subset_LDADD) $(LIBS)
@@ -1315,13 +1379,17 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-collect-unicodes.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-common.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-draw.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-font-scale.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-font.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-map.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-object.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-ot-alternates.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-ot-collect-glyphs.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-ot-color.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-ot-extents-cff.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-ot-face.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-ot-glyphname.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-ot-layout.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-ot-ligature-carets.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-ot-meta.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-ot-metrics-tt-var.Po@am__quote@ # am--include-marker
@@ -1330,6 +1398,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-ot-tag.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-set.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-shape.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-style.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-subset-cbdt.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-subset-cff1.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-subset-cff2.Po@am__quote@ # am--include-marker
@@ -1744,6 +1813,13 @@ test-font.log: test-font$(EXEEXT)
        --log-file $$b.log --trs-file $$b.trs \
        $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
        "$$tst" $(AM_TESTS_FD_REDIRECT)
+test-font-scale.log: test-font-scale$(EXEEXT)
+       @p='test-font-scale$(EXEEXT)'; \
+       b='test-font-scale'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
 test-map.log: test-map$(EXEEXT)
        @p='test-map$(EXEEXT)'; \
        b='test-map'; \
@@ -1758,6 +1834,13 @@ test-object.log: test-object$(EXEEXT)
        --log-file $$b.log --trs-file $$b.trs \
        $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
        "$$tst" $(AM_TESTS_FD_REDIRECT)
+test-ot-alternates.log: test-ot-alternates$(EXEEXT)
+       @p='test-ot-alternates$(EXEEXT)'; \
+       b='test-ot-alternates'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
 test-ot-color.log: test-ot-color$(EXEEXT)
        @p='test-ot-color$(EXEEXT)'; \
        b='test-ot-color'; \
@@ -1765,6 +1848,13 @@ test-ot-color.log: test-ot-color$(EXEEXT)
        --log-file $$b.log --trs-file $$b.trs \
        $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
        "$$tst" $(AM_TESTS_FD_REDIRECT)
+test-ot-collect-glyphs.log: test-ot-collect-glyphs$(EXEEXT)
+       @p='test-ot-collect-glyphs$(EXEEXT)'; \
+       b='test-ot-collect-glyphs'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
 test-ot-face.log: test-ot-face$(EXEEXT)
        @p='test-ot-face$(EXEEXT)'; \
        b='test-ot-face'; \
@@ -1786,6 +1876,13 @@ test-ot-ligature-carets.log: test-ot-ligature-carets$(EXEEXT)
        --log-file $$b.log --trs-file $$b.trs \
        $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
        "$$tst" $(AM_TESTS_FD_REDIRECT)
+test-ot-layout.log: test-ot-layout$(EXEEXT)
+       @p='test-ot-layout$(EXEEXT)'; \
+       b='test-ot-layout'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
 test-ot-name.log: test-ot-name$(EXEEXT)
        @p='test-ot-name$(EXEEXT)'; \
        b='test-ot-name'; \
@@ -1842,6 +1939,13 @@ test-shape.log: test-shape$(EXEEXT)
        --log-file $$b.log --trs-file $$b.trs \
        $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
        "$$tst" $(AM_TESTS_FD_REDIRECT)
+test-style.log: test-style$(EXEEXT)
+       @p='test-style$(EXEEXT)'; \
+       b='test-style'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
 test-subset.log: test-subset$(EXEEXT)
        @p='test-subset$(EXEEXT)'; \
        b='test-subset'; \
@@ -2113,13 +2217,17 @@ distclean: distclean-am
        -rm -f ./$(DEPDIR)/test-collect-unicodes.Po
        -rm -f ./$(DEPDIR)/test-common.Po
        -rm -f ./$(DEPDIR)/test-draw.Po
+       -rm -f ./$(DEPDIR)/test-font-scale.Po
        -rm -f ./$(DEPDIR)/test-font.Po
        -rm -f ./$(DEPDIR)/test-map.Po
        -rm -f ./$(DEPDIR)/test-object.Po
+       -rm -f ./$(DEPDIR)/test-ot-alternates.Po
+       -rm -f ./$(DEPDIR)/test-ot-collect-glyphs.Po
        -rm -f ./$(DEPDIR)/test-ot-color.Po
        -rm -f ./$(DEPDIR)/test-ot-extents-cff.Po
        -rm -f ./$(DEPDIR)/test-ot-face.Po
        -rm -f ./$(DEPDIR)/test-ot-glyphname.Po
+       -rm -f ./$(DEPDIR)/test-ot-layout.Po
        -rm -f ./$(DEPDIR)/test-ot-ligature-carets.Po
        -rm -f ./$(DEPDIR)/test-ot-meta.Po
        -rm -f ./$(DEPDIR)/test-ot-metrics-tt-var.Po
@@ -2128,6 +2236,7 @@ distclean: distclean-am
        -rm -f ./$(DEPDIR)/test-ot-tag.Po
        -rm -f ./$(DEPDIR)/test-set.Po
        -rm -f ./$(DEPDIR)/test-shape.Po
+       -rm -f ./$(DEPDIR)/test-style.Po
        -rm -f ./$(DEPDIR)/test-subset-cbdt.Po
        -rm -f ./$(DEPDIR)/test-subset-cff1.Po
        -rm -f ./$(DEPDIR)/test-subset-cff2.Po
@@ -2206,13 +2315,17 @@ maintainer-clean: maintainer-clean-am
        -rm -f ./$(DEPDIR)/test-collect-unicodes.Po
        -rm -f ./$(DEPDIR)/test-common.Po
        -rm -f ./$(DEPDIR)/test-draw.Po
+       -rm -f ./$(DEPDIR)/test-font-scale.Po
        -rm -f ./$(DEPDIR)/test-font.Po
        -rm -f ./$(DEPDIR)/test-map.Po
        -rm -f ./$(DEPDIR)/test-object.Po
+       -rm -f ./$(DEPDIR)/test-ot-alternates.Po
+       -rm -f ./$(DEPDIR)/test-ot-collect-glyphs.Po
        -rm -f ./$(DEPDIR)/test-ot-color.Po
        -rm -f ./$(DEPDIR)/test-ot-extents-cff.Po
        -rm -f ./$(DEPDIR)/test-ot-face.Po
        -rm -f ./$(DEPDIR)/test-ot-glyphname.Po
+       -rm -f ./$(DEPDIR)/test-ot-layout.Po
        -rm -f ./$(DEPDIR)/test-ot-ligature-carets.Po
        -rm -f ./$(DEPDIR)/test-ot-meta.Po
        -rm -f ./$(DEPDIR)/test-ot-metrics-tt-var.Po
@@ -2221,6 +2334,7 @@ maintainer-clean: maintainer-clean-am
        -rm -f ./$(DEPDIR)/test-ot-tag.Po
        -rm -f ./$(DEPDIR)/test-set.Po
        -rm -f ./$(DEPDIR)/test-shape.Po
+       -rm -f ./$(DEPDIR)/test-style.Po
        -rm -f ./$(DEPDIR)/test-subset-cbdt.Po
        -rm -f ./$(DEPDIR)/test-subset-cff1.Po
        -rm -f ./$(DEPDIR)/test-subset-cff2.Po
index 967ef25..7dd6fb5 100644 (file)
Binary files a/test/api/fonts/AdobeVFPrototype.WA.gpos.otf and b/test/api/fonts/AdobeVFPrototype.WA.gpos.otf differ
index 5e6a928..0e403a6 100644 (file)
Binary files a/test/api/fonts/AdobeVFPrototype.abc.otf and b/test/api/fonts/AdobeVFPrototype.abc.otf differ
index 19b7897..55ab495 100644 (file)
Binary files a/test/api/fonts/AdobeVFPrototype.ac.nohints.otf and b/test/api/fonts/AdobeVFPrototype.ac.nohints.otf differ
index 73ff879..5533baa 100644 (file)
Binary files a/test/api/fonts/AdobeVFPrototype.ac.nosubrs.nohints.otf and b/test/api/fonts/AdobeVFPrototype.ac.nosubrs.nohints.otf differ
index 7d2f79a..d90f3ef 100644 (file)
Binary files a/test/api/fonts/AdobeVFPrototype.ac.nosubrs.otf and b/test/api/fonts/AdobeVFPrototype.ac.nosubrs.otf differ
index 193404f..96eb2eb 100644 (file)
Binary files a/test/api/fonts/AdobeVFPrototype.ac.otf and b/test/api/fonts/AdobeVFPrototype.ac.otf differ
index 15419b0..8ff99c6 100644 (file)
Binary files a/test/api/fonts/AdobeVFPrototype.ac.retaingids.otf and b/test/api/fonts/AdobeVFPrototype.ac.retaingids.otf differ
diff --git a/test/api/fonts/Cantarell.A.otf b/test/api/fonts/Cantarell.A.otf
new file mode 100644 (file)
index 0000000..da06ff7
Binary files /dev/null and b/test/api/fonts/Cantarell.A.otf differ
diff --git a/test/api/fonts/Qahiri-Regular.ttf b/test/api/fonts/Qahiri-Regular.ttf
new file mode 100644 (file)
index 0000000..d97cbcb
Binary files /dev/null and b/test/api/fonts/Qahiri-Regular.ttf differ
index 1b34d05..2d03cc3 100644 (file)
Binary files a/test/api/fonts/Roboto-Regular-gpos-aw.ttf and b/test/api/fonts/Roboto-Regular-gpos-aw.ttf differ
index 7860f2f..073d461 100644 (file)
Binary files a/test/api/fonts/Roboto-Regular.D7,D8,D9,DA,DE.ttf and b/test/api/fonts/Roboto-Regular.D7,D8,D9,DA,DE.ttf differ
index 705ec69..3d481e7 100644 (file)
Binary files a/test/api/fonts/Roboto-Regular.abc.ttf and b/test/api/fonts/Roboto-Regular.abc.ttf differ
diff --git a/test/api/fonts/Roboto-Regular.abcAE.ttf b/test/api/fonts/Roboto-Regular.abcAE.ttf
new file mode 100644 (file)
index 0000000..b3aae5b
Binary files /dev/null and b/test/api/fonts/Roboto-Regular.abcAE.ttf differ
index 5a5e68e..b735a46 100644 (file)
Binary files a/test/api/fonts/Roboto-Regular.ac.ttf and b/test/api/fonts/Roboto-Regular.ac.ttf differ
diff --git a/test/api/fonts/Roboto-Regular.bAE.ttf b/test/api/fonts/Roboto-Regular.bAE.ttf
new file mode 100644 (file)
index 0000000..c7d1b3a
Binary files /dev/null and b/test/api/fonts/Roboto-Regular.bAE.ttf differ
index 397e7a5..09b13c5 100644 (file)
Binary files a/test/api/fonts/SourceSansVariable-Roman-modHVAR.abc.ttf and b/test/api/fonts/SourceSansVariable-Roman-modHVAR.abc.ttf differ
index cfdbe1d..7065045 100644 (file)
Binary files a/test/api/fonts/SourceSansVariable-Roman-modHVAR.ac.ttf and b/test/api/fonts/SourceSansVariable-Roman-modHVAR.ac.ttf differ
index 690d7d5..dbbc388 100644 (file)
Binary files a/test/api/fonts/SourceSansVariable-Roman.abc.ttf and b/test/api/fonts/SourceSansVariable-Roman.abc.ttf differ
index b2e744d..9f9ecd6 100644 (file)
Binary files a/test/api/fonts/SourceSansVariable-Roman.ac.retaingids.ttf and b/test/api/fonts/SourceSansVariable-Roman.ac.retaingids.ttf differ
index 2387ea7..c12daf2 100644 (file)
Binary files a/test/api/fonts/SourceSansVariable-Roman.ac.ttf and b/test/api/fonts/SourceSansVariable-Roman.ac.ttf differ
index 7d94abc..7ad8a8c 100644 (file)
Binary files a/test/api/fonts/SourceSerifVariable-Roman-VVAR.abc.ttf and b/test/api/fonts/SourceSerifVariable-Roman-VVAR.abc.ttf differ
index 734f6e8..a535734 100644 (file)
Binary files a/test/api/fonts/SourceSerifVariable-Roman-VVAR.ac.retaingids.ttf and b/test/api/fonts/SourceSerifVariable-Roman-VVAR.ac.retaingids.ttf differ
index b6b9e97..8326bec 100644 (file)
Binary files a/test/api/fonts/SourceSerifVariable-Roman-VVAR.ac.ttf and b/test/api/fonts/SourceSerifVariable-Roman-VVAR.ac.ttf differ
index be3a53d..ea7411a 100644 (file)
Binary files a/test/api/fonts/TwemojiMozilla.subset.default.32,3299.ttf and b/test/api/fonts/TwemojiMozilla.subset.default.32,3299.ttf differ
index b7d70ad..9ac8407 100644 (file)
Binary files a/test/api/fonts/TwemojiMozilla.subset.default.32.ttf and b/test/api/fonts/TwemojiMozilla.subset.default.32.ttf differ
index 09e5056..7119a37 100644 (file)
Binary files a/test/api/fonts/TwemojiMozilla.subset.default.3297.ttf and b/test/api/fonts/TwemojiMozilla.subset.default.3297.ttf differ
index 357dda3..5045cb3 100644 (file)
Binary files a/test/api/fonts/TwemojiMozilla.subset.ttf and b/test/api/fonts/TwemojiMozilla.subset.ttf differ
diff --git a/test/api/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5753845452636160 b/test/api/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5753845452636160
new file mode 100644 (file)
index 0000000..b36f5b1
Binary files /dev/null and b/test/api/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5753845452636160 differ
diff --git a/test/api/fonts/lcar.ttf b/test/api/fonts/lcar.ttf
deleted file mode 100644 (file)
index 4d17663..0000000
Binary files a/test/api/fonts/lcar.ttf and /dev/null differ
index cdd41ed..61a9260 100644 (file)
@@ -69,13 +69,14 @@ static inline hb_subset_input_t *
 hb_subset_test_create_input_from_nameids (const hb_set_t *name_ids)
 {
   hb_subset_input_t *input = hb_subset_input_create_or_fail ();
-  hb_set_t * input_name_ids  = hb_subset_input_nameid_set (input);
+  hb_set_t * input_name_ids  = hb_subset_input_set (input, HB_SUBSET_SETS_NAME_ID);
   hb_set_set (input_name_ids, name_ids);
 
-  hb_set_t *name_langids = hb_subset_input_namelangid_set (input);
+  hb_set_t *name_langids = hb_subset_input_set (input, HB_SUBSET_SETS_NAME_LANG_ID);
   hb_set_add_range (name_langids, 0, 0x5FFF);
 
-  hb_subset_input_set_name_legacy (input, true);
+  hb_subset_input_set_flags (input,
+                             HB_SUBSET_FLAGS_NAME_LEGACY);
   return input;
 }
 
@@ -83,7 +84,7 @@ static inline hb_face_t *
 hb_subset_test_create_subset (hb_face_t *source,
                              hb_subset_input_t *input)
 {
-  hb_face_t *subset = hb_subset (source, input);
+  hb_face_t *subset = hb_subset_or_fail (source, input);
   g_assert (subset);
 
   hb_subset_input_destroy (input);
index c5eb870..7390e57 100644 (file)
@@ -296,9 +296,9 @@ hb_test_open_font_file (const char *font_path)
   char *path = g_strdup (font_path);
 #endif
 
-  hb_blob_t *blob = hb_blob_create_from_file (path);
+  hb_blob_t *blob = hb_blob_create_from_file_or_fail (path);
   hb_face_t *face;
-  if (hb_blob_get_length (blob) == 0)
+  if (!blob)
     g_error ("Font %s not found.", path);
 
   face = hb_face_create (blob, 0);
index 6951773..7ea2954 100644 (file)
@@ -14,11 +14,15 @@ tests = [
   'test-common.c',
   'test-draw.c',
   'test-font.c',
+  'test-font-scale.c',
   'test-map.c',
   'test-object.c',
+  'test-ot-alternates.c',
+  'test-ot-collect-glyphs.c',
   'test-ot-color.c',
   'test-ot-face.c',
   'test-ot-glyphname.c',
+  'test-ot-layout.c',
   'test-ot-ligature-carets.c',
   'test-ot-name.c',
   'test-ot-meta.c',
@@ -28,6 +32,7 @@ tests = [
   'test-ot-metrics-tt-var.c',
   'test-set.c',
   'test-shape.c',
+  'test-style.c',
   'test-subset.c',
   'test-subset-cmap.c',
   'test-subset-drop-tables.c',
@@ -71,17 +76,16 @@ env.set('G_TEST_BUILDDIR', meson.current_build_dir())
 foreach source : tests
   test_name = source.split('.')[0]
 
-  link_withs = libharfbuzz
+  deps = [glib_dep, freetype_dep, thread_dep, libharfbuzz_dep, libharfbuzz_icu_dep]
+  suite = ['api']
   if test_name.contains('-subset')
-    link_withs = [libharfbuzz, libharfbuzz_subset]
-  elif test_name == 'test-unicode' and have_icu and not have_icu_builtin
-    link_withs = [libharfbuzz, libharfbuzz_icu]
+    deps += libharfbuzz_subset_dep
+    suite += 'subset'
   endif
 
   test(test_name, executable(test_name, source,
-    include_directories: [incconfig, incsrc],
+    include_directories: [incconfig],
     dependencies: deps,
-    link_with: link_withs,
     install: false,
-  ), env: env, suite: ['api'] + (test_name.contains('-subset') ? ['subset'] : []))
+  ), env: env, suite: suite)
 endforeach
index 228f0f3..4b48d5c 100644 (file)
@@ -71,7 +71,7 @@ fixture_init (fixture_t *fixture, gconstpointer user_data)
 
     case BUFFER_ONE_BY_ONE:
       for (i = 1; i < G_N_ELEMENTS (utf32) - 1; i++)
-       hb_buffer_add (b, utf32[i], i);
+      hb_buffer_add (b, utf32[i], i);
       break;
 
     case BUFFER_UTF32:
@@ -856,6 +856,74 @@ test_buffer_empty (void)
   g_assert (!hb_buffer_allocation_successful (b));
 }
 
+typedef struct {
+  const char *contents;
+  hb_buffer_serialize_format_t format;
+  unsigned int num_items;
+  hb_bool_t success;
+} serialization_test_t;
+
+static const serialization_test_t serialization_tests[] = {
+  { "<U+0640=0|U+0635=1>", HB_BUFFER_SERIALIZE_FORMAT_TEXT, 2, 1 },
+  { "[{\"u\":1600,\"cl\":0},{\"u\":1589,\"cl\":1}]", HB_BUFFER_SERIALIZE_FORMAT_JSON, 2, 1 },
+
+  /* Mixed glyphs/Unicodes -> parse fail */
+  { "[{\"u\":1600,\"cl\":0},{\"g\":1589,\"cl\":1}]", HB_BUFFER_SERIALIZE_FORMAT_JSON, 0, 0 },
+  { "<U+0640=0|uni0635=1>", HB_BUFFER_SERIALIZE_FORMAT_TEXT, 0, 0 },
+};
+
+static void
+test_buffer_serialize_deserialize (void)
+{
+  hb_buffer_t *b;
+  unsigned int i;
+
+  for (i = 0; i < G_N_ELEMENTS (serialization_tests); i++)
+  {
+    unsigned int consumed;
+    char round_trip[1024];
+
+    b = hb_buffer_create ();
+    hb_buffer_set_replacement_codepoint (b, (hb_codepoint_t) -1);
+
+    const serialization_test_t *test = &serialization_tests[i];
+    g_test_message ("serialize test #%d", i);
+
+    (void) hb_buffer_deserialize_unicode (b, test->contents, -1, NULL, test->format);
+
+    // Expected parse failure, got one, don't round-trip
+    if (test->success != 0)
+    {
+      unsigned int num_glyphs = hb_buffer_get_length (b);
+      g_assert_cmpint (num_glyphs, ==, test->num_items);
+
+      hb_buffer_serialize_unicode (b, 0, num_glyphs, round_trip,
+                                  sizeof(round_trip), &consumed, test->format,
+                                  HB_BUFFER_SERIALIZE_FLAG_DEFAULT);
+      g_assert_cmpstr (round_trip, ==, test->contents);
+    }
+
+    hb_buffer_destroy (b);
+
+  }
+
+  char test[1024];
+  unsigned int consumed;
+  hb_buffer_t *indeterminate = hb_buffer_get_empty ();
+  hb_buffer_serialize (indeterminate, 0, (unsigned) -1,
+                      test, sizeof(test), &consumed, NULL,
+                      HB_BUFFER_SERIALIZE_FORMAT_JSON,
+                      HB_BUFFER_SERIALIZE_FLAG_DEFAULT);
+  g_assert_cmpstr ( test, ==, "[]");
+
+  hb_buffer_serialize (indeterminate, 0, (unsigned) - 1,
+                      test, sizeof(test), &consumed, NULL,
+                      HB_BUFFER_SERIALIZE_FORMAT_TEXT,
+                      HB_BUFFER_SERIALIZE_FLAG_DEFAULT);
+  g_assert_cmpstr ( test, ==, "!!");
+
+}
+
 int
 main (int argc, char **argv)
 {
@@ -880,6 +948,7 @@ main (int argc, char **argv)
   hb_test_add (test_buffer_utf16_conversion);
   hb_test_add (test_buffer_utf32_conversion);
   hb_test_add (test_buffer_empty);
+  hb_test_add (test_buffer_serialize_deserialize);
 
   return hb_test_run();
 }
index 9cca99e..c502f7d 100644 (file)
@@ -218,13 +218,13 @@ test_hb_draw_glyf (void)
 
   user_data.consumed = 0;
   g_assert (hb_font_draw_glyph (font, 3, funcs, &user_data));
-  char expected3[] = "M323,448Q297,448 271,430Q244,412 227,371Q209,330 209,261"
-                    "Q209,204 226,166Q242,127 273,107Q303,86 344,86Q378,86 404,101"
+  char expected3[] = "M323,448Q297,448 271,430Q244,412 226,371Q209,330 209,261"
+                    "Q209,204 225,166Q242,127 272,107Q303,86 344,86Q378,86 404,101"
                     "Q430,115 451,137L488,103Q458,42 404,13Q350,-16 279,-16"
-                    "Q211,-16 153,13Q95,41 60,99Q25,156 25,241Q25,323 62,382"
-                    "Q99,440 163,471Q226,501 303,501Q357,501 399,481Q440,460 464,426"
-                    "Q488,392 492,352Q475,297 420,297Q390,297 366,320Q342,342 339,401"
-                    "L333,469L411,427Q387,438 368,443Q348,448 323,448Z";
+                    "Q211,-16 153,13Q95,41 60,98Q25,156 25,241Q25,323 62,382"
+                    "Q99,440 163,470Q226,501 303,501Q357,501 399,480Q440,460 464,426"
+                    "Q488,392 492,352Q475,297 420,297Q390,297 366,319Q342,342 339,401"
+                    "L333,469L411,427Q387,438 367,443Q348,448 323,448Z";
   g_assert_cmpmem (str, user_data.consumed, expected3, sizeof (expected3) - 1);
 
   hb_font_destroy (font);
@@ -433,14 +433,12 @@ test_hb_draw_font_kit_glyphs_tests (void)
     /* should get a path for the glyph */
     user_data.consumed = 0;
     g_assert (hb_font_draw_glyph (font, 171, funcs, &user_data));
-    char expected2[] = "M639,-20Q396,-20 256,128Q115,276 115,539Q115,804 246,960"
-                      "Q376,1116 596,1116Q802,1116 922,981Q1042,845 1042,623"
-                      "L1042,518L287,518Q292,325 385,225Q477,125 645,125"
-                      "Q822,125 995,199L995,51Q907,13 829,-4Q750,-20 639,-20Z"
-                      "M594,977Q462,977 384,891Q305,805 291,653L864,653"
-                      "Q864,810 794,894Q724,977 594,977ZM471,1266Q519,1328 575,1416"
-                      "Q630,1504 662,1569L864,1569L864,1548Q820,1483 733,1388"
-                      "Q646,1293 582,1241L471,1241L471,1266Z";
+    char expected2[] = "M639,-20Q396,-20 256,128Q115,276 115,539Q115,804 246,960Q376,1116 596,1116"
+                      "Q802,1116 922,981Q1042,845 1042,623L1042,518L287,518Q292,325 385,225"
+                      "Q477,125 645,125Q822,125 995,199L995,51Q907,13 829,-3Q750,-20 639,-20Z"
+                      "M594,977Q462,977 384,891Q305,805 291,653L864,653Q864,810 794,894"
+                      "Q724,977 594,977ZM471,1266Q519,1328 575,1416Q630,1504 662,1569"
+                      "L864,1569L864,1548Q820,1483 733,1388Q646,1293 582,1241L471,1241L471,1266Z";
     g_assert_cmpmem (str, user_data.consumed, expected2, sizeof (expected2) - 1);
 
     hb_font_destroy (font);
@@ -462,17 +460,16 @@ test_hb_draw_font_kit_glyphs_tests (void)
     user_data.consumed = 0;
     g_assert (hb_font_draw_glyph (font, codepoint, funcs, &user_data));
     char expected[] = "M581,274L443,274Q409,274 384,259Q359,243 348,219Q336,194 340,166"
-                     "Q343,138 365,111L468,-13Q470,-10 473,-7Q475,-3 477,0L253,0"
-                     "Q225,0 203,8Q180,15 168,32Q155,48 155,73L155,269L50,269L50,73"
-                     "Q50,24 69,-10Q88,-44 118,-65Q147,-85 181,-95Q214,-104 243,-104"
-                     "L473,-104Q501,-104 525,-91Q549,-78 564,-56Q578,-34 578,-8"
-                     "Q578,18 557,43L442,182Q439,179 437,176Q435,173 432,170"
-                     "L581,170L581,274ZM184,-194Q184,-216 199,-231Q214,-246 236,-246"
-                     "Q258,-246 273,-231Q288,-216 288,-194Q288,-172 273,-157"
-                     "Q258,-142 236,-142Q214,-142 199,-157Q184,-172 184,-194Z"
-                     "M360,-194Q360,-216 375,-231Q390,-246 412,-246"
-                     "Q434,-246 449,-231Q464,-216 464,-194Q464,-172 449,-157"
-                     "Q434,-142 412,-142Q390,-142 375,-157Q360,-172 360,-194Z";
+                     "Q343,138 365,111L468,-13Q470,-10 473,-6Q475,-3 477,0L253,0Q225,0 203,8"
+                     "Q180,15 168,32Q155,48 155,73L155,269L50,269L50,73Q50,24 69,-10"
+                     "Q88,-44 118,-64Q147,-85 181,-94Q214,-104 243,-104L473,-104"
+                     "Q501,-104 525,-91Q549,-78 564,-56Q578,-34 578,-8Q578,18 557,43"
+                     "L442,182Q439,179 437,176Q435,173 432,170L581,170L581,274ZM184,-194"
+                     "Q184,-216 199,-231Q214,-246 236,-246Q258,-246 273,-231Q288,-216 288,-194"
+                     "Q288,-172 273,-157Q258,-142 236,-142Q214,-142 199,-157Q184,-172 184,-194Z"
+                     "M360,-194Q360,-216 375,-231Q390,-246 412,-246Q434,-246 449,-231"
+                     "Q464,-216 464,-194Q464,-172 449,-157Q434,-142 412,-142"
+                     "Q390,-142 375,-157Q360,-172 360,-194Z";
     g_assert_cmpmem (str, user_data.consumed, expected, sizeof (expected) - 1);
 
     /* should transform points of a composite glyph */
@@ -554,15 +551,16 @@ test_hb_draw_font_kit_variations_tests (void)
 
     user_data.consumed = 0;
     g_assert (hb_font_draw_glyph (font, codepoint, funcs, &user_data));
-    char expected[] = "M371,-102L371,539L914,539L914,-27Q914,-102 840,-102Q796,-102 755,-98"
-                     "L742,-59Q790,-66 836,-66Q871,-66 871,-31L871,504L414,504L414,-102"
-                     "L371,-102ZM203,-94Q138,-94 86,-90L74,-52Q137,-59 188,-59Q211,-59 222,-47"
-                     "Q233,-34 236,12Q238,58 240,135Q242,211 242,262L74,262L94,527L242,527"
-                     "L242,719L63,719L63,754L285,754L285,492L133,492L117,297L285,297"
-                     "Q285,241 284,185Q284,104 281,46Q278,-20 269,-49Q260,-78 242,-86"
-                     "Q223,-94 203,-94ZM461,12L434,43Q473,73 503,115Q478,150 441,188L469,211"
-                     "Q501,179 525,147Q538,172 559,230L594,211Q571,152 551,117Q577,84 602,43"
-                     "L566,20Q544,64 528,86Q500,44 461,12ZM465,258L438,285Q474,316 501,351"
+    char expected[] = "M371,-102L371,539L914,539L914,-27Q914,-102 840,-102"
+                     "Q796,-102 755,-98L742,-59Q790,-66 836,-66Q871,-66 871,-31L871,504"
+                     "L414,504L414,-102L371,-102ZM203,-94Q138,-94 86,-90L74,-52"
+                     "Q137,-59 188,-59Q211,-59 222,-46Q233,-34 236,12Q238,58 240,135"
+                     "Q242,211 242,262L74,262L94,527L242,527L242,719L63,719L63,754"
+                     "L285,754L285,492L133,492L117,297L285,297Q285,241 284,185"
+                     "Q284,104 281,46Q278,-20 269,-49Q260,-78 242,-86Q223,-94 203,-94Z"
+                     "M461,12L434,43Q473,73 503,115Q478,150 441,188L469,211Q501,179 525,147"
+                     "Q538,172 559,230L594,211Q571,152 551,117Q577,84 602,43L566,20"
+                     "Q544,64 528,86Q500,44 461,12ZM465,258L438,285Q474,316 501,351"
                      "Q474,388 445,418L473,441Q500,414 523,381Q546,413 563,453L598,434"
                      "Q571,382 549,352Q576,320 598,285L563,262Q546,294 525,322Q491,280 465,258Z"
                      "M707,12L680,43Q717,68 753,115Q731,147 691,188L719,211Q739,190 754,172"
@@ -600,23 +598,23 @@ test_hb_draw_font_kit_variations_tests (void)
     g_assert (hb_font_draw_glyph (font, codepoint, funcs, &user_data));
     char expected[] = "M371,-102L371,539L914,539L914,-27Q914,-102 840,-102Q796,-102 755,-98"
                      "L742,-59Q790,-66 836,-66Q871,-66 871,-31L871,504L414,504L414,-102"
-                     "L371,-102ZM203,-94Q138,-94 86,-90L74,-52Q137,-59 188,-59Q211,-59 222,-47"
+                     "L371,-102ZM203,-94Q138,-94 86,-90L74,-52Q137,-59 188,-59Q211,-59 222,-46"
                      "Q233,-34 236,12Q238,58 240,135Q242,211 242,262L74,262L94,527L242,527"
                      "L242,719L63,719L63,754L285,754L285,492L133,492L117,297L285,297"
-                     "Q285,241 284,185Q284,104 281,46Q278,-20 269,-49Q260,-78 242,-86"
-                     "Q223,-94 203,-94ZM461,12L434,43Q473,73 503,115Q478,150 441,188"
-                     "L469,211Q501,179 525,147Q538,172 559,230L594,211Q571,152 551,117"
-                     "Q577,84 602,43L566,20Q544,64 528,86Q500,44 461,12ZM465,258L438,285"
-                     "Q474,316 501,351Q474,388 445,418L473,441Q500,414 523,381Q546,413 563,453"
-                     "L598,434Q571,382 549,352Q576,320 598,285L563,262Q546,294 525,322"
-                     "Q491,280 465,258ZM707,12L680,43Q717,68 753,115Q731,147 691,188L719,211"
-                     "Q739,190 754,172Q769,154 774,147Q793,185 809,230L844,211Q822,155 801,117"
-                     "Q828,82 852,43L820,20Q798,58 778,87Q747,43 707,12ZM621,-94L621,730L664,730"
-                     "L664,-94L621,-94ZM348,570L324,605Q425,629 527,688L555,656Q491,621 439,601"
-                     "Q386,581 348,570ZM715,258L688,285Q727,318 753,351Q733,378 695,418L723,441"
-                     "Q754,410 775,381Q794,407 813,453L848,434Q826,387 801,352Q823,321 848,281"
-                     "L813,262Q791,301 775,323Q749,288 715,258ZM348,719L348,754L941,754L941,719"
-                     "L348,719ZM936,570Q870,602 817,622Q764,641 727,652L749,688Q852,655 957,605L936,570Z";
+                     "Q285,241 284,185Q284,104 281,46Q278,-20 269,-49Q260,-78 242,-86Q223,-94 203,-94Z"
+                     "M461,12L434,43Q473,73 503,115Q478,150 441,188L469,211Q501,179 525,147"
+                     "Q538,172 559,230L594,211Q571,152 551,117Q577,84 602,43L566,20"
+                     "Q544,64 528,86Q500,44 461,12ZM465,258L438,285Q474,316 501,351"
+                     "Q474,388 445,418L473,441Q500,414 523,381Q546,413 563,453L598,434"
+                     "Q571,382 549,352Q576,320 598,285L563,262Q546,294 525,322Q491,280 465,258Z"
+                     "M707,12L680,43Q717,68 753,115Q731,147 691,188L719,211Q739,190 754,172"
+                     "Q769,154 774,147Q793,185 809,230L844,211Q822,155 801,117Q828,82 852,43L820,20"
+                     "Q798,58 778,87Q747,43 707,12ZM621,-94L621,730L664,730L664,-94L621,-94ZM348,570"
+                     "L324,605Q425,629 527,688L555,656Q491,621 439,601Q386,581 348,570ZM715,258L688,285"
+                     "Q727,318 753,351Q733,378 695,418L723,441Q754,410 775,381Q794,407 813,453"
+                     "L848,434Q826,387 801,352Q823,321 848,281L813,262Q791,301 775,323Q749,288 715,258Z"
+                     "M348,719L348,754L941,754L941,719L348,719ZM936,570Q870,602 817,622"
+                     "Q764,641 727,652L749,688Q852,655 957,605L936,570Z";
     g_assert_cmpmem (str, user_data.consumed, expected, sizeof (expected) - 1);
 
     hb_font_destroy (font);
@@ -644,23 +642,23 @@ test_hb_draw_font_kit_variations_tests (void)
     g_assert (hb_font_draw_glyph (font, codepoint, funcs, &user_data));
     char expected[] = "M371,-102L371,539L914,539L914,-27Q914,-102 840,-102Q796,-102 755,-98"
                      "L742,-59Q790,-66 836,-66Q871,-66 871,-31L871,504L414,504L414,-102"
-                     "L371,-102ZM203,-94Q138,-94 86,-90L74,-52Q137,-59 188,-59Q211,-59 222,-47"
-                     "Q233,-34 236,12Q238,58 240,135Q242,211 242,262L74,262L94,527L242,527"
-                     "L242,719L63,719L63,754L285,754L285,492L133,492L117,297L285,297"
-                     "Q285,241 284,185Q284,104 281,46Q278,-20 269,-49Q260,-78 242,-86"
-                     "Q223,-94 203,-94ZM461,12L434,43Q473,73 503,115Q478,150 441,188"
-                     "L469,211Q501,179 525,147Q538,172 559,230L594,211Q571,152 551,117"
-                     "Q577,84 602,43L566,20Q544,64 528,86Q500,44 461,12ZM465,258L438,285"
-                     "Q474,316 501,351Q474,388 445,418L473,441Q500,414 523,381Q546,413 563,453"
-                     "L598,434Q571,382 549,352Q576,320 598,285L563,262Q546,294 525,322"
-                     "Q491,280 465,258ZM707,12L680,43Q717,68 753,115Q731,147 691,188L719,211"
-                     "Q739,190 754,172Q769,154 774,147Q793,185 809,230L844,211Q822,155 801,117"
-                     "Q828,82 852,43L820,20Q798,58 778,87Q747,43 707,12ZM621,-94L621,730L664,730"
-                     "L664,-94L621,-94ZM348,570L324,605Q425,629 527,688L555,656Q491,621 439,601"
-                     "Q386,581 348,570ZM715,258L688,285Q727,318 753,351Q733,378 695,418L723,441"
-                     "Q754,410 775,381Q794,407 813,453L848,434Q826,387 801,352Q823,321 848,281"
-                     "L813,262Q791,301 775,323Q749,288 715,258ZM348,719L348,754L941,754L941,719"
-                     "L348,719ZM936,570Q870,602 817,622Q764,641 727,652L749,688Q852,655 957,605L936,570Z";
+                     "L371,-102ZM203,-94Q138,-94 86,-90L74,-52Q137,-59 188,-59Q211,-59 222,-46"
+                     "Q233,-34 236,12Q238,58 240,135Q242,211 242,262L74,262L94,527L242,527L242,719"
+                     "L63,719L63,754L285,754L285,492L133,492L117,297L285,297Q285,241 284,185"
+                     "Q284,104 281,46Q278,-20 269,-49Q260,-78 242,-86Q223,-94 203,-94ZM461,12"
+                     "L434,43Q473,73 503,115Q478,150 441,188L469,211Q501,179 525,147"
+                     "Q538,172 559,230L594,211Q571,152 551,117Q577,84 602,43L566,20Q544,64 528,86"
+                     "Q500,44 461,12ZM465,258L438,285Q474,316 501,351Q474,388 445,418L473,441"
+                     "Q500,414 523,381Q546,413 563,453L598,434Q571,382 549,352Q576,320 598,285"
+                     "L563,262Q546,294 525,322Q491,280 465,258ZM707,12L680,43Q717,68 753,115"
+                     "Q731,147 691,188L719,211Q739,190 754,172Q769,154 774,147Q793,185 809,230"
+                     "L844,211Q822,155 801,117Q828,82 852,43L820,20Q798,58 778,87Q747,43 707,12Z"
+                     "M621,-94L621,730L664,730L664,-94L621,-94ZM348,570L324,605Q425,629 527,688"
+                     "L555,656Q491,621 439,601Q386,581 348,570ZM715,258L688,285Q727,318 753,351"
+                     "Q733,378 695,418L723,441Q754,410 775,381Q794,407 813,453L848,434Q826,387 801,352"
+                     "Q823,321 848,281L813,262Q791,301 775,323Q749,288 715,258ZM348,719L348,754"
+                     "L941,754L941,719L348,719ZM936,570Q870,602 817,622"
+                     "Q764,641 727,652L749,688Q852,655 957,605L936,570Z";
     g_assert_cmpmem (str, user_data.consumed, expected, sizeof (expected) - 1);
 
     hb_font_destroy (font);
@@ -784,18 +782,21 @@ test_hb_draw_estedad_vf (void)
     user_data.consumed = 0;
     g_assert (hb_font_draw_glyph (font, 180, funcs, &user_data));
     /* Skip empty path where all the points of a path are equal */
-    char expected2[] = "M120,693Q120,545 177,414Q233,282 333,182Q433,81 567,24Q701,-33 855,-33"
-                      "Q1010,-33 1144,24Q1277,81 1377,182Q1477,282 1534,414Q1590,545 1590,693"
-                      "Q1590,842 1534,973Q1477,1104 1377,1205Q1277,1305 1144,1362Q1010,1419 855,1419"
-                      "Q701,1419 567,1362Q433,1305 333,1205Q233,1104 177,973Q120,842 120,693ZM220,693"
-                      "Q220,828 270,945Q320,1061 409,1148Q497,1235 612,1284Q726,1333 855,1333"
-                      "Q984,1333 1099,1284Q1213,1235 1302,1148Q1390,1061 1440,945Q1490,828 1490,693"
-                      "Q1490,558 1440,442Q1390,325 1302,237Q1213,149 1099,100Q984,51 855,51"
-                      "Q726,51 612,100Q497,149 409,237Q320,325 270,442Q220,558 220,693ZM690,643"
-                      "L690,997L886,997Q970,997 1029,949Q1087,901 1087,819Q1087,737 1028,690"
-                      "Q969,643 886,643L690,643ZM1165,334L973,568Q1065,591 1126,658Q1187,725 1187,819"
-                      "Q1187,896 1147,956Q1106,1015 1038,1049Q969,1083 886,1083L590,1083L590,310"
-                      "L690,310L690,557L860,557L1083,286L1165,334Z";
+    char expected2[] = "M120,693Q120,545 177,414Q233,282 333,182Q433,81 567,24"
+                      "Q701,-33 856,-33Q1010,-33 1144,24Q1277,81 1377,182Q1477,282 1534,414"
+                      "Q1590,545 1590,693Q1590,842 1534,973Q1477,1104 1377,1205"
+                      "Q1277,1305 1144,1362Q1010,1419 856,1419Q701,1419 567,1362"
+                      "Q433,1305 333,1205Q233,1104 177,973Q120,842 120,693Z"
+                      "M220,693Q220,828 270,945Q320,1061 409,1148Q497,1235 612,1284"
+                      "Q726,1333 855,1333Q984,1333 1099,1284Q1213,1235 1302,1148"
+                      "Q1390,1061 1440,945Q1490,828 1490,693Q1490,558 1440,442"
+                      "Q1390,325 1302,237Q1213,149 1099,100Q984,51 855,51"
+                      "Q726,51 611,100Q497,149 408,237Q320,325 270,442"
+                      "Q220,558 220,693ZM690,643L690,997L886,997Q970,997 1029,949"
+                      "Q1087,901 1087,819Q1087,737 1028,690Q969,643 886,643L690,643Z"
+                      "M1165,334L973,568Q1065,591 1126,658Q1187,725 1187,819"
+                      "Q1187,896 1147,956Q1106,1015 1037,1049Q969,1083 886,1083"
+                      "L590,1083L590,310L690,310L690,557L860,557L1083,286L1165,334Z";
     g_assert_cmpmem (str, user_data.consumed, expected2, sizeof (expected2) - 1);
 
     user_data.consumed = 0;
@@ -804,8 +805,8 @@ test_hb_draw_estedad_vf (void)
     char expected3[] = "M422,598Q495,598 545,548Q595,498 595,426Q595,353 545,303Q494,252 422,252"
                       "Q350,252 300,303Q250,353 250,426Q250,499 300,549Q349,598 422,598ZM422,698"
                       "Q347,698 285,662Q223,625 187,564Q150,502 150,426Q150,351 187,289"
-                      "Q223,226 285,189Q346,152 422,152Q498,152 560,189Q622,226 659,289"
-                      "Q695,351 695,426Q695,502 658,564Q621,625 560,662Q498,698 422,698Z";
+                      "Q223,226 285,189Q346,152 422,152Q498,152 560,189Q622,226 658,288"
+                      "Q695,351 695,426Q695,502 658,563Q621,625 559,661Q498,698 422,698Z";
     g_assert_cmpmem (str, user_data.consumed, expected3, sizeof (expected3) - 1);
 
     hb_font_destroy (font);
diff --git a/test/api/test-font-scale.c b/test/api/test-font-scale.c
new file mode 100644 (file)
index 0000000..6949e70
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2021 Red Hat, 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.
+ *
+ * Author(s): Matthias Clasen
+ */
+
+#include "hb-test.h"
+
+#include <hb.h>
+
+/* test for https://github.com/harfbuzz/harfbuzz/issues/3274 */
+
+static void
+test_hb_scale (void)
+{
+  hb_face_t *face = hb_test_open_font_file ("fonts/Cantarell.A.otf");
+  hb_font_t *font1 = hb_font_create (face);
+  hb_font_t *font2 = hb_font_create (face);
+
+  double scale = 64 * 1024 * 96./72.;
+  hb_font_set_scale (font1, scale, scale);
+  hb_font_set_scale (font2, - scale, - scale);
+
+  g_assert_cmpint (hb_font_get_glyph_h_advance (font1, 1), ==, - hb_font_get_glyph_h_advance (font2, 1));
+
+  hb_font_destroy (font1);
+  hb_font_destroy (font2);
+  hb_face_destroy (face);
+}
+
+int
+main (int argc, char **argv)
+{
+  hb_test_init (&argc, &argv);
+  hb_test_add (test_hb_scale);
+  return hb_test_run ();
+}
index 0911991..02df8b9 100644 (file)
@@ -104,6 +104,33 @@ test_map_refcount (void)
   /* Now you can't access them anymore */
 }
 
+static void
+test_map_get_population (void)
+{
+  hb_map_t *m = hb_map_create ();
+
+  hb_map_set (m, 12, 21);
+  g_assert_cmpint (hb_map_get_population (m), ==, 1);
+  hb_map_set (m, 78, 87);
+  g_assert_cmpint (hb_map_get_population (m), ==, 2);
+
+  hb_map_set (m, 78, 87);
+  g_assert_cmpint (hb_map_get_population (m), ==, 2);
+  hb_map_set (m, 78, 13);
+  g_assert_cmpint (hb_map_get_population (m), ==, 2);
+
+  hb_map_set (m, 95, 56);
+  g_assert_cmpint (hb_map_get_population (m), ==, 3);
+
+  hb_map_del (m, 78);
+  g_assert_cmpint (hb_map_get_population (m), ==, 2);
+
+  hb_map_del (m, 103);
+  g_assert_cmpint (hb_map_get_population (m), ==, 2);
+
+  hb_map_destroy (m);
+}
+
 int
 main (int argc, char **argv)
 {
@@ -112,6 +139,7 @@ main (int argc, char **argv)
   hb_test_add (test_map_basic);
   hb_test_add (test_map_userdata);
   hb_test_add (test_map_refcount);
+  hb_test_add (test_map_get_population);
 
   return hb_test_run();
 }
diff --git a/test/api/test-ot-alternates.c b/test/api/test-ot-alternates.c
new file mode 100644 (file)
index 0000000..4db6b15
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * Copyright © 2020  Ebrahim Byagowi
+ *
+ *  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.
+ */
+
+#include "hb-test.h"
+
+#include <hb.h>
+#include <hb-ot.h>
+
+static void
+test_ot_layout_lookup_get_glyph_alternates (void)
+{
+  hb_face_t *face = hb_test_open_font_file ("fonts/SourceSansPro-Regular.otf");
+
+  hb_codepoint_t alternates[3];
+  unsigned alternates_count = 3;
+  g_assert_cmpuint (7, ==, hb_ot_layout_lookup_get_glyph_alternates (face, 1, 1091, 2, &alternates_count, alternates));
+
+  g_assert_cmpuint (3, ==, alternates_count);
+  g_assert_cmpuint (1606, ==, alternates[0]);
+  g_assert_cmpuint (1578, ==, alternates[1]);
+  g_assert_cmpuint (1592, ==, alternates[2]);
+
+  hb_face_destroy (face);
+}
+
+int
+main (int argc, char **argv)
+{
+  hb_test_init (&argc, &argv);
+  hb_test_add (test_ot_layout_lookup_get_glyph_alternates);
+  return hb_test_run ();
+}
diff --git a/test/api/test-ot-collect-glyphs.c b/test/api/test-ot-collect-glyphs.c
new file mode 100644 (file)
index 0000000..3b3b643
--- /dev/null
@@ -0,0 +1,492 @@
+/*
+ * Copyright © 2021  Khaled Hosny
+ *
+ *  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.
+ */
+
+#include "hb-test.h"
+
+#include <hb.h>
+#include <hb-ot.h>
+
+#define BEGIN(tag, idx) \
+  hb_ot_layout_lookup_collect_glyphs (face, tag, idx, before, input, after, output) \
+
+#define END() \
+  hb_set_clear (before); \
+  hb_set_clear (input); \
+  hb_set_clear (after); \
+  hb_set_clear (output)
+
+static void
+test_ot_layout_lookup_collect_glyphs_source_sans (void)
+{
+  hb_face_t *face = hb_test_open_font_file ("fonts/SourceSansPro-Regular.otf");
+
+  hb_set_t *before = hb_set_create();
+  hb_set_t *input = hb_set_create();
+  hb_set_t *after = hb_set_create();
+  hb_set_t *output = hb_set_create();
+  hb_codepoint_t g = HB_SET_VALUE_INVALID;
+
+  /* SingleSubst */
+  BEGIN(HB_OT_TAG_GSUB, 0);
+  g_assert_cmpuint (0, ==, hb_set_get_population (before));
+  g_assert_cmpuint (684, ==, hb_set_get_population (input));
+  g = HB_SET_VALUE_INVALID;
+  g_assert (hb_set_next (input, &g));
+  g_assert_cmpuint (54, ==, g);
+  g_assert_cmpuint (0, ==, hb_set_get_population (after));
+  g_assert_cmpuint (372, ==, hb_set_get_population (output));
+  g = HB_SET_VALUE_INVALID;
+  g_assert (hb_set_next (output, &g));
+  g_assert_cmpuint (574, ==, g);
+  END();
+
+  /* AlternateSubst */
+  BEGIN(HB_OT_TAG_GSUB, 1);
+  g_assert_cmpuint (0, ==, hb_set_get_population (before));
+
+  g_assert_cmpuint (143, ==, hb_set_get_population (input));
+  g = HB_SET_VALUE_INVALID;
+  g_assert (hb_set_next (input, &g));
+  g_assert_cmpuint (2, ==, g);
+
+  g_assert_cmpuint (0, ==, hb_set_get_population (after));
+
+  g_assert_cmpuint (319, ==, hb_set_get_population (output));
+  g = HB_SET_VALUE_INVALID;
+  g_assert (hb_set_next (output, &g));
+  g_assert_cmpuint (519, ==, g);
+  END();
+
+  /* MultipleSubst */
+  BEGIN(HB_OT_TAG_GSUB, 7);
+  g_assert_cmpuint (0, ==, hb_set_get_population (before));
+
+  g_assert_cmpuint (10, ==, hb_set_get_population (input));
+  g = HB_SET_VALUE_INVALID;
+  g_assert (hb_set_next (input, &g));
+  g_assert_cmpuint (92, ==, g);
+
+  g_assert_cmpuint (0, ==, hb_set_get_population (after));
+
+  g_assert_cmpuint (9, ==, hb_set_get_population (output));
+  g = HB_SET_VALUE_INVALID;
+  g_assert (hb_set_next (output, &g));
+  g_assert_cmpuint (6, ==, g);
+  END();
+
+  /* LigatureSubst */
+  BEGIN(HB_OT_TAG_GSUB, 10);
+  g_assert_cmpuint (0, ==, hb_set_get_population (before));
+
+  g_assert_cmpuint (14, ==, hb_set_get_population (input));
+  g = HB_SET_VALUE_INVALID;
+  g_assert (hb_set_next (input, &g));
+  g_assert_cmpuint (1823, ==, g);
+
+  g_assert_cmpuint (0, ==, hb_set_get_population (after));
+
+  g_assert_cmpuint (22, ==, hb_set_get_population (output));
+  g = HB_SET_VALUE_INVALID;
+  g_assert (hb_set_next (output, &g));
+  g_assert_cmpuint (1897, ==, g);
+  END();
+
+  /* ChainContextSubstFormat3 */
+  BEGIN(HB_OT_TAG_GSUB, 8);
+  g_assert_cmpuint (0, ==, hb_set_get_population (before));
+
+  g_assert_cmpuint (10, ==, hb_set_get_population (input));
+  g = HB_SET_VALUE_INVALID;
+  g_assert (hb_set_next (input, &g));
+  g_assert_cmpuint (92, ==, g);
+
+  g_assert_cmpuint (2, ==, hb_set_get_population (after));
+  g = HB_SET_VALUE_INVALID;
+  g_assert (hb_set_next (after, &g));
+  g_assert_cmpuint (1826, ==, g);
+  g_assert (hb_set_next (after, &g));
+  g_assert_cmpuint (1837, ==, g);
+
+  g_assert_cmpuint (9, ==, hb_set_get_population (output));
+  g = HB_SET_VALUE_INVALID;
+  g_assert (hb_set_next (output, &g));
+  g_assert_cmpuint (6, ==, g);
+  END();
+
+  /* ChainContextSubstFormat3 */
+  BEGIN(HB_OT_TAG_GSUB, 13);
+  g_assert_cmpuint (771, ==, hb_set_get_population (before));
+  g = HB_SET_VALUE_INVALID;
+  g_assert (hb_set_next (before, &g));
+  g_assert_cmpuint (2, ==, g);
+
+  g_assert_cmpuint (28, ==, hb_set_get_population (input));
+  g = HB_SET_VALUE_INVALID;
+  g_assert (hb_set_next (input, &g));
+  g_assert_cmpuint (1823, ==, g);
+
+  g_assert_cmpuint (0, ==, hb_set_get_population (after));
+
+  g_assert_cmpuint (48, ==, hb_set_get_population (output));
+  g = HB_SET_VALUE_INVALID;
+  g_assert (hb_set_next (output, &g));
+  g_assert_cmpuint (325, ==, g);
+  END();
+
+  /* MarkBasePos */
+  BEGIN(HB_OT_TAG_GPOS, 0);
+  g_assert_cmpuint (0, ==, hb_set_get_population (before));
+
+  g_assert_cmpuint (179, ==, hb_set_get_population (input));
+  g = HB_SET_VALUE_INVALID;
+  g_assert (hb_set_next (input, &g));
+  g_assert_cmpuint (28, ==, g);
+
+  g_assert_cmpuint (0, ==, hb_set_get_population (after));
+  g_assert_cmpuint (0, ==, hb_set_get_population (output));
+  END();
+
+  /* MarkMarkPos */
+  BEGIN(HB_OT_TAG_GPOS, 9);
+  g_assert_cmpuint (0, ==, hb_set_get_population (before));
+
+  g_assert_cmpuint (48, ==, hb_set_get_population (input));
+  g = HB_SET_VALUE_INVALID;
+  g_assert (hb_set_next (input, &g));
+  g_assert_cmpuint (1823, ==, g);
+
+  g_assert_cmpuint (0, ==, hb_set_get_population (after));
+  g_assert_cmpuint (0, ==, hb_set_get_population (output));
+  END();
+
+  /* PairPos */
+  BEGIN(HB_OT_TAG_GPOS, 10);
+  g_assert_cmpuint (0, ==, hb_set_get_population (before));
+
+  g_assert_cmpuint (1426, ==, hb_set_get_population (input));
+  g = HB_SET_VALUE_INVALID;
+  g_assert (hb_set_next (input, &g));
+  g_assert_cmpuint (2, ==, g);
+
+  g_assert_cmpuint (0, ==, hb_set_get_population (after));
+  g_assert_cmpuint (0, ==, hb_set_get_population (output));
+  END();
+
+  hb_face_destroy (face);
+  face = hb_test_open_font_file ("fonts/SourceHanSans-Regular.41,3041,4C2E.otf");
+
+  /* SinglePosFormat2 */
+  BEGIN(HB_OT_TAG_GPOS, 1);
+  g_assert_cmpuint (0, ==, hb_set_get_population (before));
+
+  g_assert_cmpuint (1, ==, hb_set_get_population (input));
+  g = HB_SET_VALUE_INVALID;
+  g_assert (hb_set_next (input, &g));
+  g_assert_cmpuint (4, ==, g);
+
+  g_assert_cmpuint (0, ==, hb_set_get_population (after));
+  g_assert_cmpuint (0, ==, hb_set_get_population (output));
+  END();
+
+  hb_face_destroy (face);
+  hb_set_destroy (before);
+  hb_set_destroy (input);
+  hb_set_destroy (after);
+  hb_set_destroy (output);
+}
+
+static void
+test_ot_layout_lookup_collect_glyphs_noto_nastaliq (void)
+{
+  hb_face_t *face = hb_test_open_font_file ("fonts/NotoNastaliqUrdu-Regular.ttf");
+
+  hb_set_t *before = hb_set_create();
+  hb_set_t *input = hb_set_create();
+  hb_set_t *after = hb_set_create();
+  hb_set_t *output = hb_set_create();
+  hb_codepoint_t g = HB_SET_VALUE_INVALID;
+
+  /* ExtensionSubst -> ContextSubstFormat1 */
+  BEGIN(HB_OT_TAG_GSUB, 9);
+  g_assert_cmpuint (0, ==, hb_set_get_population (before));
+
+  g_assert_cmpuint (3, ==, hb_set_get_population (input));
+  g = HB_SET_VALUE_INVALID;
+  g_assert (hb_set_next (input, &g));
+  g_assert_cmpuint (228, ==, g);
+  g_assert (hb_set_next (input, &g));
+  g_assert_cmpuint (416, ==, g);
+  g_assert (hb_set_next (input, &g));
+  g_assert_cmpuint (441, ==, g);
+
+  g_assert_cmpuint (0, ==, hb_set_get_population (after));
+
+  g_assert_cmpuint (3, ==, hb_set_get_population (output));
+  g = HB_SET_VALUE_INVALID;
+  g_assert (hb_set_next (output, &g));
+  g_assert_cmpuint (267, ==, g);
+  g_assert (hb_set_next (output, &g));
+  g_assert_cmpuint (268, ==, g);
+  g_assert (hb_set_next (output, &g));
+  g_assert_cmpuint (279, ==, g);
+  END();
+
+  /* ExtensionSubst -> SingleSubst */
+  BEGIN(HB_OT_TAG_GSUB, 10);
+  g_assert_cmpuint (0, ==, hb_set_get_population (before));
+
+  g_assert_cmpuint (3, ==, hb_set_get_population (input));
+  g = HB_SET_VALUE_INVALID;
+  g_assert (hb_set_next (input, &g));
+  g_assert_cmpuint (228, ==, g);
+  g_assert (hb_set_next (input, &g));
+  g_assert_cmpuint (416, ==, g);
+  g_assert (hb_set_next (input, &g));
+  g_assert_cmpuint (441, ==, g);
+
+  g_assert_cmpuint (0, ==, hb_set_get_population (after));
+
+  g_assert_cmpuint (3, ==, hb_set_get_population (output));
+  g = HB_SET_VALUE_INVALID;
+  g_assert (hb_set_next (output, &g));
+  g_assert_cmpuint (267, ==, g);
+  g_assert (hb_set_next (output, &g));
+  g_assert_cmpuint (268, ==, g);
+  g_assert (hb_set_next (output, &g));
+  g_assert_cmpuint (279, ==, g);
+  END();
+
+  /* ExtensionSubst -> ChainContextSubstFormat2 */
+  BEGIN(HB_OT_TAG_GSUB, 16);
+  g_assert_cmpuint (16, ==, hb_set_get_population (before));
+  g = HB_SET_VALUE_INVALID;
+  g_assert (hb_set_next (before, &g));
+  g_assert_cmpuint (74, ==, g);
+
+  g_assert_cmpuint (27, ==, hb_set_get_population (input));
+  g = HB_SET_VALUE_INVALID;
+  g_assert (hb_set_next (input, &g));
+  g_assert_cmpuint (276, ==, g);
+
+  g_assert_cmpuint (14, ==, hb_set_get_population (after));
+  g = HB_SET_VALUE_INVALID;
+  g_assert (hb_set_next (after, &g));
+  g_assert_cmpuint (252, ==, g);
+
+  g_assert_cmpuint (43, ==, hb_set_get_population (output));
+  g = HB_SET_VALUE_INVALID;
+  g_assert (hb_set_next (output, &g));
+  g_assert_cmpuint (74, ==, g);
+  END();
+
+  /* ExtensionSubst -> ContextSubstFormat2 */
+  BEGIN(HB_OT_TAG_GSUB, 39);
+  g_assert_cmpuint (0, ==, hb_set_get_population (before));
+
+  g_assert_cmpuint (246, ==, hb_set_get_population (input));
+  g = HB_SET_VALUE_INVALID;
+  g_assert (hb_set_next (input, &g));
+  g_assert_cmpuint (252, ==, g);
+
+  g_assert_cmpuint (0, ==, hb_set_get_population (after));
+
+  g_assert_cmpuint (258, ==, hb_set_get_population (output));
+  g = HB_SET_VALUE_INVALID;
+  g_assert (hb_set_next (output, &g));
+  g_assert_cmpuint (74, ==, g);
+  END();
+
+
+  /* CursivePos */
+  BEGIN(HB_OT_TAG_GPOS, 0);
+  g_assert_cmpuint (0, ==, hb_set_get_population (before));
+
+  g_assert_cmpuint (616, ==, hb_set_get_population (input));
+  g = HB_SET_VALUE_INVALID;
+  g_assert (hb_set_next (input, &g));
+  g_assert_cmpuint (228, ==, g);
+
+  g_assert_cmpuint (0, ==, hb_set_get_population (after));
+  g_assert_cmpuint (0, ==, hb_set_get_population (output));
+  END();
+
+  /* ExtensionSubst -> MarkLigPos */
+  BEGIN(HB_OT_TAG_GPOS, 13);
+  g_assert_cmpuint (0, ==, hb_set_get_population (before));
+
+  g_assert_cmpuint (46, ==, hb_set_get_population (input));
+  g = HB_SET_VALUE_INVALID;
+  g_assert (hb_set_next (input, &g));
+  g_assert_cmpuint (1004, ==, g);
+
+  g_assert_cmpuint (0, ==, hb_set_get_population (after));
+  g_assert_cmpuint (0, ==, hb_set_get_population (output));
+  END();
+
+  /* ExtensionSubst -> SinglePosFormat1 */
+  BEGIN(HB_OT_TAG_GPOS, 17);
+  g_assert_cmpuint (0, ==, hb_set_get_population (before));
+
+  g_assert_cmpuint (242, ==, hb_set_get_population (input));
+  g = HB_SET_VALUE_INVALID;
+  g_assert (hb_set_next (input, &g));
+  g_assert_cmpuint (257, ==, g);
+
+  g_assert_cmpuint (0, ==, hb_set_get_population (after));
+  g_assert_cmpuint (0, ==, hb_set_get_population (output));
+  END();
+
+  hb_face_destroy (face);
+  hb_set_destroy (before);
+  hb_set_destroy (input);
+  hb_set_destroy (after);
+  hb_set_destroy (output);
+}
+
+static void
+test_ot_layout_lookup_collect_glyphs_qahiri (void)
+{
+  hb_face_t *face = hb_test_open_font_file ("fonts/Qahiri-Regular.ttf");
+
+  hb_set_t *before = hb_set_create();
+  hb_set_t *input = hb_set_create();
+  hb_set_t *after = hb_set_create();
+  hb_set_t *output = hb_set_create();
+  hb_codepoint_t g = HB_SET_VALUE_INVALID;
+
+  /* SingleSubstFormat1 */
+  BEGIN(HB_OT_TAG_GSUB, 0);
+  g_assert_cmpuint (0, ==, hb_set_get_population (before));
+
+  g_assert_cmpuint (4, ==, hb_set_get_population (input));
+  g = HB_SET_VALUE_INVALID;
+  g_assert (hb_set_next (input, &g));
+  g_assert_cmpuint (52, ==, g);
+  g_assert (hb_set_next (input, &g));
+  g_assert_cmpuint (60, ==, g);
+  g_assert (hb_set_next (input, &g));
+  g_assert_cmpuint (62, ==, g);
+  g_assert (hb_set_next (input, &g));
+  g_assert_cmpuint (159, ==, g);
+
+  g_assert_cmpuint (0, ==, hb_set_get_population (after));
+
+  g_assert_cmpuint (4, ==, hb_set_get_population (output));
+  g = HB_SET_VALUE_INVALID;
+  g_assert (hb_set_next (output, &g));
+  g_assert_cmpuint (53, ==, g);
+  g_assert (hb_set_next (output, &g));
+  g_assert_cmpuint (61, ==, g);
+  g_assert (hb_set_next (output, &g));
+  g_assert_cmpuint (63, ==, g);
+  g_assert (hb_set_next (output, &g));
+  g_assert_cmpuint (160, ==, g);
+  END();
+
+  /* ChainContextSubstFormat1 */
+  BEGIN(HB_OT_TAG_GSUB, 11);
+  g_assert_cmpuint (1, ==, hb_set_get_population (before));
+  g = HB_SET_VALUE_INVALID;
+  g_assert (hb_set_next (before, &g));
+  g_assert_cmpuint (39, ==, g);
+
+  g_assert_cmpuint (2, ==, hb_set_get_population (input));
+  g = HB_SET_VALUE_INVALID;
+  g_assert (hb_set_next (input, &g));
+  g_assert_cmpuint (154, ==, g);
+  g_assert (hb_set_next (input, &g));
+  g_assert_cmpuint (159, ==, g);
+
+  g_assert_cmpuint (1, ==, hb_set_get_population (after));
+  g = HB_SET_VALUE_INVALID;
+  g_assert (hb_set_next (after, &g));
+  g_assert_cmpuint (179, ==, g);
+
+  g_assert_cmpuint (2, ==, hb_set_get_population (output));
+  g = HB_SET_VALUE_INVALID;
+  g_assert (hb_set_next (output, &g));
+  g_assert_cmpuint (155, ==, g);
+  g_assert (hb_set_next (output, &g));
+  g_assert_cmpuint (162, ==, g);
+  END();
+
+  /* ContextSubstFormat3 */
+  BEGIN(HB_OT_TAG_GSUB, 31);
+  g_assert_cmpuint (0, ==, hb_set_get_population (before));
+
+  g_assert_cmpuint (4, ==, hb_set_get_population (input));
+  g = HB_SET_VALUE_INVALID;
+  g_assert (hb_set_next (input, &g));
+  g_assert_cmpuint (53, ==, g);
+
+  g_assert_cmpuint (0, ==, hb_set_get_population (after));
+
+  g_assert_cmpuint (4, ==, hb_set_get_population (output));
+  g = HB_SET_VALUE_INVALID;
+  g_assert (hb_set_next (output, &g));
+  g_assert_cmpuint (52, ==, g);
+  g_assert (hb_set_next (output, &g));
+  g_assert_cmpuint (60, ==, g);
+  g_assert (hb_set_next (output, &g));
+  g_assert_cmpuint (62, ==, g);
+  g_assert (hb_set_next (output, &g));
+  g_assert_cmpuint (159, ==, g);
+  END();
+
+  /* ReverseChainSingleSubst */
+  BEGIN(HB_OT_TAG_GSUB, 32);
+  g_assert_cmpuint (0, ==, hb_set_get_population (before));
+
+  g_assert_cmpuint (42, ==, hb_set_get_population (input));
+  g = HB_SET_VALUE_INVALID;
+  g_assert (hb_set_next (input, &g));
+  g_assert_cmpuint (47, ==, g);
+
+  g_assert_cmpuint (46, ==, hb_set_get_population (after));
+  g = HB_SET_VALUE_INVALID;
+  g_assert (hb_set_next (after, &g));
+  g_assert_cmpuint (61, ==, g);
+
+  g_assert_cmpuint (42, ==, hb_set_get_population (output));
+  g = HB_SET_VALUE_INVALID;
+  g_assert (hb_set_next (output, &g));
+  g_assert_cmpuint (463, ==, g);
+  END();
+
+  hb_face_destroy (face);
+  hb_set_destroy (before);
+  hb_set_destroy (input);
+  hb_set_destroy (after);
+  hb_set_destroy (output);
+}
+
+int
+main (int argc, char **argv)
+{
+  hb_test_init (&argc, &argv);
+  hb_test_add (test_ot_layout_lookup_collect_glyphs_source_sans);
+  hb_test_add (test_ot_layout_lookup_collect_glyphs_noto_nastaliq);
+  hb_test_add (test_ot_layout_lookup_collect_glyphs_qahiri);
+  return hb_test_run ();
+}
index 7109e30..e6aeb0d 100644 (file)
@@ -170,7 +170,7 @@ test_extents_cff2_vsindex (void)
 
   g_assert_cmpint (extents.x_bearing, ==, 12);
   g_assert_cmpint (extents.y_bearing, ==, 655);
-  g_assert_cmpint (extents.width, ==, 652);
+  g_assert_cmpint (extents.width, ==, 651);
   g_assert_cmpint (extents.height, ==, -655);
 
   result = hb_font_get_glyph_extents (font, 2, &extents);
@@ -178,7 +178,7 @@ test_extents_cff2_vsindex (void)
 
   g_assert_cmpint (extents.x_bearing, ==, 8);
   g_assert_cmpint (extents.y_bearing, ==, 669);
-  g_assert_cmpint (extents.width, ==, 649);
+  g_assert_cmpint (extents.width, ==, 648);
   g_assert_cmpint (extents.height, ==, -669);
 
   hb_font_destroy (font);
@@ -201,7 +201,7 @@ test_extents_cff2_vsindex_named_instance (void)
 
   g_assert_cmpint (extents.x_bearing, ==, 13);
   g_assert_cmpint (extents.y_bearing, ==, 652);
-  g_assert_cmpint (extents.width, ==, 653);
+  g_assert_cmpint (extents.width, ==, 652);
   g_assert_cmpint (extents.height, ==, -652);
 
   result = hb_font_get_glyph_extents (font, 2, &extents);
index 0e86123..e5c9b86 100644 (file)
 
 /* Unit tests for hb-ot-*.h */
 
-
-static void
+/* Return some dummy result so that compiler won't just optimize things */
+static long long
 test_font (hb_font_t *font, hb_codepoint_t cp)
 {
+  long long result = 0;
+
   hb_face_t *face = hb_font_get_face (font);
   hb_set_t *set;
-  hb_codepoint_t g;
-  hb_position_t x, y;
+  hb_codepoint_t g = 0;
+  hb_position_t x = 0, y = 0;
   char buf[5] = {0};
-  unsigned int len;
-  hb_glyph_extents_t extents;
+  unsigned int len = 0;
+  hb_glyph_extents_t extents = {0};
   hb_ot_font_set_funcs (font);
 
   set = hb_set_create ();
@@ -74,27 +76,24 @@ test_font (hb_font_t *font, hb_codepoint_t cp)
   hb_ot_color_has_png (face);
   hb_blob_destroy (hb_ot_color_glyph_reference_png (font, cp));
 
-  hb_aat_layout_feature_type_t feature;
-  unsigned count = 1;
-  hb_aat_layout_get_feature_types (face, 0, &count, &feature);
-  hb_aat_layout_feature_type_get_name_id (face, HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE);
-  hb_aat_layout_feature_selector_info_t setting = {0};
-  unsigned default_index;
-  count = 1;
-  hb_aat_layout_feature_type_get_selector_infos (face, HB_AAT_LAYOUT_FEATURE_TYPE_DESIGN_COMPLEXITY_TYPE, 0, &count, &setting, &default_index);
+  {
+    hb_aat_layout_feature_type_t feature = HB_AAT_LAYOUT_FEATURE_TYPE_ALL_TYPOGRAPHIC;
+    unsigned count = 1;
+    hb_aat_layout_get_feature_types (face, 0, &count, &feature);
+    hb_aat_layout_feature_type_get_name_id (face, HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE);
+    hb_aat_layout_feature_selector_info_t setting = {0};
+    unsigned default_index;
+    count = 1;
+    hb_aat_layout_feature_type_get_selector_infos (face, HB_AAT_LAYOUT_FEATURE_TYPE_DESIGN_COMPLEXITY_TYPE, 0, &count, &setting, &default_index);
+    result += count + feature + setting.disable + setting.disable + setting.name_id + setting.reserved + default_index;
+  }
 
   hb_set_t *lookup_indexes = hb_set_create ();
   hb_set_add (lookup_indexes, 0);
-#ifdef HB_EXPERIMENTAL_API
-  hb_ot_layout_closure_lookups (face, HB_OT_TAG_GSUB, set, lookup_indexes);
-#endif
 
   hb_map_t *lookup_mapping = hb_map_create ();
   hb_map_set (lookup_mapping, 0, 0);
   hb_set_t *feature_indices = hb_set_create ();
-#ifdef HB_EXPERIMENTAL_API
-  hb_ot_layout_closure_features (face, HB_OT_TAG_GSUB, lookup_mapping, feature_indices);
-#endif
   hb_set_destroy (lookup_indexes);
   hb_set_destroy (feature_indices);
   hb_map_destroy (lookup_mapping);
@@ -107,12 +106,32 @@ test_font (hb_font_t *font, hb_codepoint_t cp)
 
   hb_ot_layout_get_ligature_carets (font, HB_DIRECTION_LTR, cp, 0, NULL, NULL);
 
+  {
+    unsigned temp = 0, temp2 = 0;
+    hb_ot_name_id_t name = HB_OT_NAME_ID_FULL_NAME;
+    hb_ot_layout_get_size_params (face, &temp, &temp, &name, &temp, &temp);
+    hb_tag_t cv01 = HB_TAG ('c','v','0','1');
+    unsigned feature_index = 0;
+    hb_ot_layout_language_find_feature (face, HB_OT_TAG_GSUB, 0,
+                                       HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX,
+                                       cv01, &feature_index);
+    hb_ot_layout_feature_get_name_ids (face, HB_OT_TAG_GSUB, feature_index,
+                                      &name, &name, &name, &temp, &name);
+    temp = 1;
+    hb_ot_layout_feature_get_characters (face, HB_OT_TAG_GSUB, feature_index, 0, &temp, &g);
+    temp = 1;
+    hb_ot_layout_language_get_feature_indexes (face, HB_OT_TAG_GSUB, 0, 0, 0, &temp, &temp2);
+
+    result += temp + name + feature_index + temp2;
+  }
+
   hb_ot_math_has_data (face);
   hb_ot_math_get_constant (font, HB_OT_MATH_CONSTANT_MATH_LEADING);
   hb_ot_math_get_glyph_italics_correction (font, cp);
   hb_ot_math_get_glyph_top_accent_attachment (font, cp);
   hb_ot_math_is_glyph_extended_shape (face, cp);
   hb_ot_math_get_glyph_kerning (font, cp, HB_OT_MATH_KERN_BOTTOM_RIGHT, 0);
+  hb_ot_math_get_glyph_kernings (font, cp, HB_OT_MATH_KERN_BOTTOM_RIGHT, 0, NULL, NULL);
   hb_ot_math_get_glyph_variants (font, cp, HB_DIRECTION_TTB, 0, NULL, NULL);
   hb_ot_math_get_min_connector_overlap (font, HB_DIRECTION_RTL);
   hb_ot_math_get_glyph_assembly (font, cp, HB_DIRECTION_BTT, 0, NULL, NULL, NULL);
@@ -131,6 +150,14 @@ test_font (hb_font_t *font, hb_codepoint_t cp)
   hb_ot_name_get_utf16 (face, cp, NULL, NULL, NULL);
   hb_ot_name_get_utf32 (face, cp, NULL, NULL, NULL);
 
+#if 0
+  hb_style_get_value (font, HB_STYLE_TAG_ITALIC);
+  hb_style_get_value (font, HB_STYLE_TAG_OPTICAL_SIZE);
+  hb_style_get_value (font, HB_STYLE_TAG_SLANT);
+  hb_style_get_value (font, HB_STYLE_TAG_WIDTH);
+  hb_style_get_value (font, HB_STYLE_TAG_WEIGHT);
+#endif
+
   hb_ot_var_get_axis_count (face);
   hb_ot_var_get_axis_infos (face, 0, NULL, NULL);
   hb_ot_var_normalize_variations (face, NULL, 0, NULL, 0);
@@ -143,6 +170,9 @@ test_font (hb_font_t *font, hb_codepoint_t cp)
 #endif
 
   hb_set_destroy (set);
+
+  return result + g + x + y + buf[0] + buf[1] + buf[2] + buf[3] + buf[4] + len +
+        extents.height + extents.width + extents.x_bearing + extents.y_bearing;
 }
 
 #ifndef TEST_OT_FACE_NO_MAIN
diff --git a/test/api/test-ot-layout.c b/test/api/test-ot-layout.c
new file mode 100644 (file)
index 0000000..5c6ccce
--- /dev/null
@@ -0,0 +1,228 @@
+/*
+ * Copyright © 2021  Khaled Hosny
+ *
+ *  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.
+ */
+
+#include "hb-test.h"
+
+#include <hb.h>
+#include <hb-ot.h>
+
+#define STATIC_ARRAY_SIZE 255
+
+static void
+test_ot_layout_table_get_script_tags (void)
+{
+  hb_face_t *face = hb_test_open_font_file ("fonts/NotoNastaliqUrdu-Regular.ttf");
+
+  unsigned int total = 0;
+  unsigned int count = STATIC_ARRAY_SIZE;
+  unsigned int offset = 0;
+  hb_tag_t tags[STATIC_ARRAY_SIZE];
+  while (count == STATIC_ARRAY_SIZE)
+  {
+    total = hb_ot_layout_table_get_script_tags (face, HB_OT_TAG_GSUB, offset, &count, tags);
+    g_assert_cmpuint (3, ==, total);
+    offset += count;
+    if (count)
+    {
+      g_assert_cmpuint (3, ==, count);
+      g_assert_cmpuint (HB_TAG ('a','r','a','b'), ==, tags[0]);
+      g_assert_cmpuint (HB_TAG ('d','f','l','t'), ==, tags[1]);
+      g_assert_cmpuint (HB_TAG ('l','a','t','n'), ==, tags[2]);
+    }
+  }
+  count = STATIC_ARRAY_SIZE;
+  offset = 0;
+  while (count == STATIC_ARRAY_SIZE)
+  {
+    total = hb_ot_layout_table_get_script_tags (face, HB_OT_TAG_GPOS, offset, &count, tags);
+    g_assert_cmpuint (1, ==, total);
+    offset += count;
+    if (count)
+    {
+      g_assert_cmpuint (1, ==, count);
+      g_assert_cmpuint (HB_TAG ('a','r','a','b'), ==, tags[0]);
+    }
+  }
+
+  hb_face_destroy (face);
+}
+
+static void
+test_ot_layout_table_find_script (void)
+{
+  hb_face_t *face = hb_test_open_font_file ("fonts/NotoNastaliqUrdu-Regular.ttf");
+  unsigned int index;
+
+  g_assert (hb_ot_layout_table_find_script (face, HB_OT_TAG_GSUB, HB_TAG ('a','r','a','b'), &index));
+  g_assert_cmpuint (0, ==, index);
+  g_assert (hb_ot_layout_table_find_script (face, HB_OT_TAG_GSUB, HB_TAG ('d','f','l','t'), &index));
+  g_assert_cmpuint (1, ==, index);
+  g_assert (hb_ot_layout_table_find_script (face, HB_OT_TAG_GSUB, HB_TAG ('l','a','t','n'), &index));
+  g_assert_cmpuint (2, ==, index);
+
+  g_assert (hb_ot_layout_table_find_script (face, HB_OT_TAG_GPOS, HB_TAG ('a','r','a','b'), &index));
+  g_assert_cmpuint (0, ==, index);
+  g_assert (!hb_ot_layout_table_find_script (face, HB_OT_TAG_GPOS, HB_TAG ('d','f','l','t'), &index));
+  g_assert_cmpuint (0xFFFF, ==, index);
+  g_assert (!hb_ot_layout_table_find_script (face, HB_OT_TAG_GPOS, HB_TAG ('l','a','t','n'), &index));
+  g_assert_cmpuint (0xFFFF, ==, index);
+
+  hb_face_destroy (face);
+}
+
+static void
+test_ot_layout_table_get_feature_tags (void)
+{
+  hb_face_t *face = hb_test_open_font_file ("fonts/NotoNastaliqUrdu-Regular.ttf");
+
+  unsigned int total = 0;
+  unsigned int count = STATIC_ARRAY_SIZE;
+  unsigned int offset = 0;
+  hb_tag_t tags[STATIC_ARRAY_SIZE];
+  while (count == STATIC_ARRAY_SIZE)
+  {
+    total = hb_ot_layout_table_get_feature_tags (face, HB_OT_TAG_GSUB, offset, &count, tags);
+    g_assert_cmpuint (14, ==, total);
+    offset += count;
+    if (count)
+    {
+      g_assert_cmpuint (14, ==, count);
+      g_assert_cmpuint (HB_TAG ('c','c','m','p'), ==, tags[0]);
+      g_assert_cmpuint (HB_TAG ('i','s','o','l'), ==, tags[10]);
+      g_assert_cmpuint (HB_TAG ('r','l','i','g'), ==, tags[13]);
+    }
+  }
+  count = STATIC_ARRAY_SIZE;
+  offset = 0;
+  while (count == STATIC_ARRAY_SIZE)
+  {
+    total = hb_ot_layout_table_get_feature_tags (face, HB_OT_TAG_GPOS, offset, &count, tags);
+    g_assert_cmpuint (3, ==, total);
+    offset += count;
+    if (count)
+    {
+      g_assert_cmpuint (3, ==, count);
+      g_assert_cmpuint (HB_TAG ('c','u','r','s'), ==, tags[0]);
+      g_assert_cmpuint (HB_TAG ('m','a','r','k'), ==, tags[1]);
+      g_assert_cmpuint (HB_TAG ('m','k','m','k'), ==, tags[2]);
+    }
+  }
+
+  hb_face_destroy (face);
+}
+
+static void
+test_ot_layout_script_get_language_tags (void)
+{
+  hb_face_t *face = hb_test_open_font_file ("fonts/Estedad-VF.ttf");
+
+  unsigned int total = 0;
+  unsigned int count = STATIC_ARRAY_SIZE;
+  unsigned int offset = 0;
+  hb_tag_t tags[STATIC_ARRAY_SIZE];
+  while (count == STATIC_ARRAY_SIZE)
+  {
+    total = hb_ot_layout_script_get_language_tags (face, HB_OT_TAG_GSUB, 0, offset, &count, tags);
+    g_assert_cmpuint (2, ==, total);
+    offset += count;
+    if (count)
+    {
+      g_assert_cmpuint (2, ==, count);
+      g_assert_cmpuint (HB_TAG ('F','A','R',' '), ==, tags[0]);
+      g_assert_cmpuint (HB_TAG ('K','U','R',' '), ==, tags[1]);
+    }
+  }
+  count = STATIC_ARRAY_SIZE;
+  offset = 0;
+  while (count == STATIC_ARRAY_SIZE)
+  {
+    total = hb_ot_layout_script_get_language_tags (face, HB_OT_TAG_GPOS, 1, offset, &count, tags);
+    g_assert_cmpuint (2, ==, total);
+    offset += count;
+    if (count)
+    {
+      g_assert_cmpuint (2, ==, count);
+      g_assert_cmpuint (HB_TAG ('F','A','R',' '), ==, tags[0]);
+      g_assert_cmpuint (HB_TAG ('K','U','R',' '), ==, tags[1]);
+    }
+  }
+
+  hb_face_destroy (face);
+}
+
+static void
+test_ot_layout_language_get_feature_tags (void)
+{
+  hb_face_t *face = hb_test_open_font_file ("fonts/Estedad-VF.ttf");
+
+  unsigned int total = 0;
+  unsigned int count = STATIC_ARRAY_SIZE;
+  unsigned int offset = 0;
+  hb_tag_t tags[STATIC_ARRAY_SIZE];
+  while (count == STATIC_ARRAY_SIZE)
+  {
+    total = hb_ot_layout_language_get_feature_tags (face, HB_OT_TAG_GSUB, 0, 0, offset, &count, tags);
+    g_assert_cmpuint (6, ==, total);
+    offset += count;
+    if (count)
+    {
+      g_assert_cmpuint (6, ==, count);
+      g_assert_cmpuint (HB_TAG ('c','a','l','t'), ==, tags[0]);
+      g_assert_cmpuint (HB_TAG ('f','i','n','a'), ==, tags[1]);
+      g_assert_cmpuint (HB_TAG ('i','n','i','t'), ==, tags[2]);
+      g_assert_cmpuint (HB_TAG ('l','i','g','a'), ==, tags[3]);
+      g_assert_cmpuint (HB_TAG ('m','e','d','i'), ==, tags[4]);
+      g_assert_cmpuint (HB_TAG ('r','l','i','g'), ==, tags[5]);
+    }
+  }
+  count = STATIC_ARRAY_SIZE;
+  offset = 0;
+  while (count == STATIC_ARRAY_SIZE)
+  {
+    total = hb_ot_layout_language_get_feature_tags (face, HB_OT_TAG_GPOS, 1, 0, offset, &count, tags);
+    g_assert_cmpuint (3, ==, total);
+    offset += count;
+    if (count)
+    {
+      g_assert_cmpuint (3, ==, count);
+      g_assert_cmpuint (HB_TAG ('k','e','r','n'), ==, tags[0]);
+      g_assert_cmpuint (HB_TAG ('m','a','r','k'), ==, tags[1]);
+      g_assert_cmpuint (HB_TAG ('m','k','m','k'), ==, tags[2]);
+    }
+  }
+
+  hb_face_destroy (face);
+}
+
+int
+main (int argc, char **argv)
+{
+  hb_test_init (&argc, &argv);
+  hb_test_add (test_ot_layout_table_get_script_tags);
+  hb_test_add (test_ot_layout_table_find_script);
+  hb_test_add (test_ot_layout_script_get_language_tags);
+  hb_test_add (test_ot_layout_table_get_feature_tags);
+  hb_test_add (test_ot_layout_language_get_feature_tags);
+  return hb_test_run ();
+}
index 4a91643..7e2d91b 100644 (file)
 #include <hb-ot.h>
 
 static void
-test_ot_layout_get_ligature_carets_aat_lcar (void)
-{
-  hb_face_t *face = hb_test_open_font_file ("fonts/lcar.ttf");
-  hb_font_t *font = hb_font_create (face);
-  hb_font_set_scale (font, hb_face_get_upem (face) * 2, hb_face_get_upem (face) * 4);
-
-  hb_position_t caret_array[16];
-
-  /* a normal call */
-  {
-    unsigned caret_count = 16;
-    g_assert_cmpuint (2, ==, hb_ot_layout_get_ligature_carets (font, HB_DIRECTION_LTR,
-                                                              98, 0, &caret_count,
-                                                              caret_array));
-
-    g_assert_cmpuint (2, ==, caret_count);
-    g_assert_cmpuint (1130, ==, caret_array[0]);
-    g_assert_cmpuint (2344, ==, caret_array[1]);
-  }
-
-  /* RTL, maybe needs to be tweaked however */
-  {
-    unsigned caret_count = 16;
-    g_assert_cmpuint (2, ==, hb_ot_layout_get_ligature_carets (font, HB_DIRECTION_RTL,
-                                                              98, 0, &caret_count,
-                                                              caret_array));
-
-    g_assert_cmpuint (2, ==, caret_count);
-    g_assert_cmpuint (1130, ==, caret_array[0]);
-    g_assert_cmpuint (2344, ==, caret_array[1]);
-  }
-
-  /* bottom to top call, bigger caret positions as the specified scaling */
-  {
-    unsigned caret_count = 16;
-    g_assert_cmpuint (2, ==, hb_ot_layout_get_ligature_carets (font, HB_DIRECTION_BTT,
-                                                              98, 0, &caret_count,
-                                                              caret_array));
-
-    g_assert_cmpuint (2, ==, caret_count);
-    g_assert_cmpuint (2260, ==, caret_array[0]);
-    g_assert_cmpuint (4688, ==, caret_array[1]);
-  }
-
-  /* the same glyph as above but with offset */
-  {
-    caret_array[1] = 123;
-
-    unsigned caret_count = 16;
-    g_assert_cmpuint (2, ==, hb_ot_layout_get_ligature_carets (font, HB_DIRECTION_BTT,
-                                                              98, 1, &caret_count,
-                                                              caret_array));
-
-    g_assert_cmpuint (1, ==, caret_count);
-    g_assert_cmpuint (4688, ==, caret_array[0]);
-
-    g_assert_cmpuint (123, ==, caret_array[1]);
-  }
-
-  /* empty carets */
-  {
-    unsigned caret_count = 16;
-    g_assert_cmpuint (0, ==, hb_ot_layout_get_ligature_carets (font, HB_DIRECTION_LTR,
-                                                              97, 0, &caret_count,
-                                                              caret_array));
-
-    g_assert_cmpuint (0, ==, caret_count);
-  }
-
-  hb_font_destroy (font);
-  hb_face_destroy (face);
-}
-
-static void
-test_ot_layout_get_ligature_carets_ot_gsub (void)
+test_ot_layout_get_ligature_carets_ot_gdef (void)
 {
   hb_face_t *face = hb_test_open_font_file ("fonts/NotoNastaliqUrdu-Regular.ttf");
   hb_font_t *font = hb_font_create (face);
@@ -241,8 +167,7 @@ main (int argc, char **argv)
 {
   g_test_init (&argc, &argv, NULL);
 
-  hb_test_add (test_ot_layout_get_ligature_carets_aat_lcar);
-  hb_test_add (test_ot_layout_get_ligature_carets_ot_gsub);
+  hb_test_add (test_ot_layout_get_ligature_carets_ot_gdef);
   hb_test_add (test_ot_layout_get_ligature_carets_empty);
 
   return hb_test_run ();
index 73b1a25..6d87396 100644 (file)
@@ -312,7 +312,7 @@ test_get_glyph_kerning (void)
   openFont("fonts/MathTestFontFull.otf");
   g_assert(hb_font_get_glyph_from_name (hb_font, "I", -1, &glyph));
 
-  g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_TOP_RIGHT, 7), ==, 62); // lower than min heigth
+  g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_TOP_RIGHT, 7), ==, 62); // lower than min height
   g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_TOP_RIGHT, 14), ==, 62); // equal to min height
   g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_TOP_RIGHT, 20), ==, 104);
   g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_TOP_RIGHT, 23), ==, 104);
@@ -332,6 +332,87 @@ test_get_glyph_kerning (void)
   cleanupFreeType();
 }
 
+static void
+test_get_glyph_kernings (void)
+{
+  hb_codepoint_t glyph;
+  hb_ot_math_kern_entry_t entries[20];
+  const unsigned entries_size = sizeof (entries) / sizeof (entries[0]);
+  unsigned int count;
+
+  initFreeType();
+
+  openFont("fonts/MathTestFontEmpty.otf");
+  g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
+  g_assert_cmpint(hb_ot_math_get_glyph_kernings (hb_font, glyph, HB_OT_MATH_KERN_TOP_RIGHT, 0, NULL, NULL), ==, 0); // MathGlyphInfo not available
+  g_assert_cmpint(hb_ot_math_get_glyph_kernings (hb_font, glyph, HB_OT_MATH_KERN_TOP_LEFT, 0, NULL, NULL), ==, 0); // MathGlyphInfo not available
+  g_assert_cmpint(hb_ot_math_get_glyph_kernings (hb_font, glyph, HB_OT_MATH_KERN_BOTTOM_RIGHT, 0, NULL, NULL), ==, 0); // MathGlyphInfo not available
+  g_assert_cmpint(hb_ot_math_get_glyph_kernings (hb_font, glyph, HB_OT_MATH_KERN_BOTTOM_LEFT, 0, NULL, NULL), ==, 0); // MathGlyphInfo not available
+  closeFont();
+
+  openFont("fonts/MathTestFontPartial2.otf");
+  g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
+  g_assert_cmpint(hb_ot_math_get_glyph_kernings (hb_font, glyph, HB_OT_MATH_KERN_TOP_RIGHT, 0, NULL, NULL), ==, 0); // MathKernInfo empty
+  g_assert_cmpint(hb_ot_math_get_glyph_kernings (hb_font, glyph, HB_OT_MATH_KERN_TOP_LEFT, 0, NULL, NULL), ==, 0); // MathKernInfo empty
+  g_assert_cmpint(hb_ot_math_get_glyph_kernings (hb_font, glyph, HB_OT_MATH_KERN_BOTTOM_RIGHT, 0, NULL, NULL), ==, 0); // MathKernInfo empty
+  g_assert_cmpint(hb_ot_math_get_glyph_kernings (hb_font, glyph, HB_OT_MATH_KERN_BOTTOM_LEFT, 0, NULL, NULL), ==, 0); // MathKernInfo empty
+  closeFont();
+
+  openFont("fonts/MathTestFontPartial3.otf");
+  g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
+  g_assert_cmpint(hb_ot_math_get_glyph_kernings (hb_font, glyph, HB_OT_MATH_KERN_TOP_RIGHT, 0, NULL, NULL), ==, 0); // MathKernInfoRecords empty
+  g_assert_cmpint(hb_ot_math_get_glyph_kernings (hb_font, glyph, HB_OT_MATH_KERN_TOP_LEFT, 0, NULL, NULL), ==, 0); // MathKernInfoRecords empty
+  g_assert_cmpint(hb_ot_math_get_glyph_kernings (hb_font, glyph, HB_OT_MATH_KERN_BOTTOM_RIGHT, 0, NULL, NULL), ==, 0); // MathKernInfoRecords empty
+  g_assert_cmpint(hb_ot_math_get_glyph_kernings (hb_font, glyph, HB_OT_MATH_KERN_BOTTOM_LEFT, 0, NULL, NULL), ==, 0); // MathKernInfoRecords empty
+  closeFont();
+
+  openFont("fonts/MathTestFontFull.otf");
+  g_assert(hb_font_get_glyph_from_name (hb_font, "I", -1, &glyph));
+
+  g_assert_cmpint(hb_ot_math_get_glyph_kernings (hb_font, glyph, HB_OT_MATH_KERN_TOP_RIGHT, 0, NULL, NULL), ==, 10);
+  g_assert_cmpint(hb_ot_math_get_glyph_kernings (hb_font, glyph, HB_OT_MATH_KERN_TOP_LEFT, 0, NULL, NULL), ==, 3);
+  g_assert_cmpint(hb_ot_math_get_glyph_kernings (hb_font, glyph, HB_OT_MATH_KERN_BOTTOM_RIGHT, 0, NULL, NULL), ==, 9);
+  g_assert_cmpint(hb_ot_math_get_glyph_kernings (hb_font, glyph, HB_OT_MATH_KERN_BOTTOM_LEFT, 0, NULL, NULL), ==, 7);
+
+  count = entries_size;
+  g_assert_cmpint(hb_ot_math_get_glyph_kernings (hb_font, glyph, HB_OT_MATH_KERN_TOP_RIGHT, 0, &count, entries), ==, 10);
+  g_assert_cmpint(count, ==, 10);
+  g_assert_cmpint(entries[0].max_correction_height, ==, 14);
+  g_assert_cmpint(entries[0].kern_value, ==, 62);
+  g_assert_cmpint(entries[1].max_correction_height, ==, 23);
+  g_assert_cmpint(entries[1].kern_value, ==, 104);
+  g_assert_cmpint(entries[2].max_correction_height, ==, 32);
+  g_assert_cmpint(entries[2].kern_value, ==, 146);
+  g_assert_cmpint(entries[3].max_correction_height, ==, 41);
+  g_assert_cmpint(entries[3].kern_value, ==, 188);
+  g_assert_cmpint(entries[4].max_correction_height, ==, 50);
+  g_assert_cmpint(entries[4].kern_value, ==, 230);
+  g_assert_cmpint(entries[5].max_correction_height, ==, 59);
+  g_assert_cmpint(entries[5].kern_value, ==, 272);
+  g_assert_cmpint(entries[6].max_correction_height, ==, 68);
+  g_assert_cmpint(entries[6].kern_value, ==, 314);
+  g_assert_cmpint(entries[7].max_correction_height, ==, 77);
+  g_assert_cmpint(entries[7].kern_value, ==, 356);
+  g_assert_cmpint(entries[8].max_correction_height, ==, 86);
+  g_assert_cmpint(entries[8].kern_value, ==, 398);
+  g_assert_cmpint(entries[9].max_correction_height, ==, INT32_MAX);
+  g_assert_cmpint(entries[9].kern_value, ==, 440);
+
+  count = entries_size;
+  g_assert_cmpint(hb_ot_math_get_glyph_kernings (hb_font, glyph, HB_OT_MATH_KERN_TOP_LEFT, 0, &count, entries), ==, 3);
+  g_assert_cmpint(count, ==, 3);
+  g_assert_cmpint(entries[0].max_correction_height, ==, 20);
+  g_assert_cmpint(entries[0].kern_value, ==, 50);
+  g_assert_cmpint(entries[1].max_correction_height, ==, 35);
+  g_assert_cmpint(entries[1].kern_value, ==, 80);
+  g_assert_cmpint(entries[2].max_correction_height, ==, INT32_MAX);
+  g_assert_cmpint(entries[2].kern_value, ==, 110);
+
+  closeFont();
+
+  cleanupFreeType();
+}
+
 
 static hb_position_t
 get_glyph_assembly_italics_correction (hb_font_t *font,
@@ -707,6 +788,7 @@ main (int argc, char **argv)
   hb_test_add (test_get_glyph_top_accent_attachment);
   hb_test_add (test_is_glyph_extended_shape);
   hb_test_add (test_get_glyph_kerning);
+  hb_test_add (test_get_glyph_kernings);
   hb_test_add (test_get_glyph_assembly_italics_correction);
   hb_test_add (test_get_min_connector_overlap);
   hb_test_add (test_get_glyph_variants);
index cffdeb7..9871c08 100644 (file)
@@ -159,7 +159,7 @@ test_advance_tt_var_anchor (void)
 
   g_assert_cmpint (extents.x_bearing, ==, 50);
   g_assert_cmpint (extents.y_bearing, ==, 667);
-  g_assert_cmpint (extents.width, ==, 593);
+  g_assert_cmpint (extents.width, ==, 592);
   g_assert_cmpint (extents.height, ==, -679);
 
   hb_font_destroy (font);
index c2ae4fd..d688eb3 100644 (file)
@@ -68,6 +68,15 @@ test_ot_layout_feature_get_name_ids_and_characters (void)
   g_assert_cmpint (char_count, ==, 2);
   g_assert_cmpint (characters[0], ==, 10);
   g_assert_cmpint (characters[1], ==, 24030);
+
+  char_count = 100;
+  characters[1] = 1234;
+  all_chars = hb_ot_layout_feature_get_characters (face, HB_OT_TAG_GSUB, feature_index,
+                                                  1, &char_count, characters);
+  g_assert_cmpint (all_chars, ==, 2);
+  g_assert_cmpint (char_count, ==, 1);
+  g_assert_cmpint (characters[0], ==, 24030);
+  g_assert_cmpint (characters[1], ==, 1234);
 }
 
 static void
index 78ebc03..14928e0 100644 (file)
@@ -140,6 +140,8 @@ test_ot_tag_script_simple (void)
   test_simple_tags ("kana", HB_SCRIPT_KATAKANA);
   test_simple_tags ("latn", HB_SCRIPT_LATIN);
 
+  test_simple_tags ("math", HB_SCRIPT_MATH);
+
   /* These are trickier since their OT script tags have space. */
   test_simple_tags ("lao ", HB_SCRIPT_LAO);
   test_simple_tags ("yi  ", HB_SCRIPT_YI);
@@ -306,6 +308,9 @@ test_ot_tag_language (void)
   test_language_two_way ("HAL", "cfm"); /* BCP47 and current ISO639-3 code for Halam/Falam Chin */
   test_tag_from_language ("HAL", "flm"); /* Retired ISO639-3 code for Halam/Falam Chin */
 
+  test_language_two_way ("HYE0", "hy");
+  test_language_two_way ("HYE", "hyw");
+
   test_tag_from_language ("QIN", "bgr"); /* Bawm Chin */
   test_tag_from_language ("QIN", "cbl"); /* Bualkhaw Chin */
   test_tag_from_language ("QIN", "cka"); /* Khumi Awa Chin */
@@ -332,6 +337,8 @@ test_ot_tag_language (void)
   test_language_two_way ("FAR", "fa");
   test_tag_from_language ("FAR", "fa_IR");
 
+  test_language_two_way ("MNK", "man"); /* Mandingo [macrolanguage] */
+
   test_language_two_way ("SWA", "aii"); /* Swadaya Aramaic */
 
   test_language_two_way ("SYR", "syr"); /* Syriac [macrolanguage] */
@@ -344,10 +351,12 @@ test_ot_tag_language (void)
   test_tag_from_language ("ZHS", "zh"); /* Chinese */
   test_tag_from_language ("ZHS", "zh-cn"); /* Chinese (China) */
   test_tag_from_language ("ZHS", "zh-sg"); /* Chinese (Singapore) */
-  test_tag_from_language ("ZHH", "zh-mo"); /* Chinese (Macao) */
-  test_tag_from_language ("ZHH", "zh-hant-mo"); /* Chinese (Macao) */
+  test_tag_from_language ("ZHTM", "zh-mo"); /* Chinese (Macao) */
+  test_tag_from_language ("ZHTM", "zh-hant-mo"); /* Chinese (Macao) */
+  test_tag_from_language ("ZHS", "zh-hans-mo"); /* Chinese (Simplified, Macao) */
   test_language_two_way ("ZHH", "zh-HK"); /* Chinese (Hong Kong) */
   test_tag_from_language ("ZHH", "zH-HanT-hK"); /* Chinese (Hong Kong) */
+  test_tag_from_language ("ZHS", "zH-HanS-hK"); /* Chinese (Simplified, Hong Kong) */
   test_tag_from_language ("ZHT", "zh-tw"); /* Chinese (Taiwan) */
   test_language_two_way ("ZHS", "zh-Hans"); /* Chinese (Simplified) */
   test_language_two_way ("ZHT", "zh-Hant"); /* Chinese (Traditional) */
@@ -476,6 +485,10 @@ test_ot_tag_language (void)
   test_tag_from_language ("ZHS", "zh-min-nan");
   test_tag_from_language ("ZHS", "zh-xiang");
 
+  /* BCP 47 tags that look similar to unrelated language system tags */
+  test_tag_from_language ("SQI", "als");
+  test_tag_from_language ("dflt", "far");
+
   /* A UN M.49 region code, not an extended language subtag */
   test_tag_from_language ("ARA", "ar-001");
 
index eb690b8..f2f9419 100644 (file)
@@ -121,6 +121,11 @@ test_set_basic (void)
   hb_set_del (s, 800);
   g_assert (!hb_set_has (s, 800));
 
+  g_assert_cmpint (hb_set_get_max (s), ==, 799);
+
+  hb_set_del_range (s, 0, 799);
+  g_assert_cmpint (hb_set_get_max (s), ==, HB_SET_VALUE_INVALID);
+
   hb_set_destroy (s);
 }
 
@@ -211,6 +216,58 @@ static void test_set_union (void)
 }
 
 static void
+test_set_subsets (void)
+{
+  hb_set_t *s = hb_set_create ();
+  hb_set_t *l = hb_set_create ();
+
+  hb_set_add (l, 0x0FFFF);
+  hb_set_add (s, 0x1FFFF);
+  g_assert (!hb_set_is_subset (s, l));
+  hb_set_clear (s);
+
+  hb_set_add (s, 0x0FFF0);
+  g_assert (!hb_set_is_subset (s, l));
+  hb_set_clear (s);
+
+  hb_set_add (s, 0x0AFFF);
+  g_assert (!hb_set_is_subset (s, l));
+
+  hb_set_clear (s);
+  g_assert (hb_set_is_subset (s, l));
+
+  hb_set_clear (l);
+  g_assert (hb_set_is_subset (s, l));
+
+  hb_set_add (s, 0x1FFFF);
+  g_assert (!hb_set_is_subset (s, l));
+  hb_set_clear (s);
+
+  hb_set_add (s, 0xFF);
+  hb_set_add (s, 0x1FFFF);
+  hb_set_add (s, 0x2FFFF);
+
+  hb_set_add (l, 0xFF);
+  hb_set_add (l, 0x1FFFF);
+  hb_set_add (l, 0x2FFFF);
+
+  g_assert (hb_set_is_subset (s, l));
+  hb_set_del (l, 0xFF);
+  g_assert (!hb_set_is_subset (s, l));
+  hb_set_add (l, 0xFF);
+
+  hb_set_del (l, 0x2FFFF);
+  g_assert (!hb_set_is_subset (s, l));
+  hb_set_add (l, 0x2FFFF);
+
+  hb_set_del (l, 0x1FFFF);
+  g_assert (!hb_set_is_subset (s, l));
+
+  hb_set_destroy (s);
+  hb_set_destroy (l);
+}
+
+static void
 test_set_algebra (void)
 {
   hb_set_t *s = hb_set_create ();
@@ -501,7 +558,7 @@ test_set_delrange (void)
 
   for (unsigned i = 0; i < n; i++)
     hb_set_del_range (s, ranges[i].b, ranges[i].e);
-    
+
   hb_set_del_range (s, P*13+5, P*15-10);       /* Deletion from deleted pages. */
 
   for (unsigned i = 0; i < n; i++)
@@ -517,12 +574,506 @@ test_set_delrange (void)
   hb_set_destroy (s);
 }
 
+static const unsigned max_set_elements = -1;
+
+static void
+test_set_inverted_basics (void)
+{
+  // Tests:
+  // add, del, has, get_population, is_empty, get_min, get_max
+  // for inverted sets.
+  hb_set_t *s = hb_set_create ();
+  hb_set_invert (s);
+
+  g_assert_cmpint (hb_set_get_population (s), ==, max_set_elements);
+  g_assert (hb_set_has (s, 0));
+  g_assert (hb_set_has (s, 13));
+  g_assert (hb_set_has (s, max_set_elements - 1));
+  g_assert (!hb_set_is_empty (s));
+  g_assert_cmpint (hb_set_get_min (s), ==, 0);
+  g_assert_cmpint (hb_set_get_max (s), ==, max_set_elements - 1);
+
+  hb_set_del (s, 13);
+  g_assert (!hb_set_has (s, 13));
+  g_assert_cmpint (hb_set_get_population (s), ==, max_set_elements - 1);
+  g_assert_cmpint (hb_set_get_min (s), ==, 0);
+  g_assert_cmpint (hb_set_get_max (s), ==, max_set_elements - 1);
+
+  hb_set_add (s, 13);
+  g_assert (hb_set_has (s, 13));
+  g_assert_cmpint (hb_set_get_population (s), ==, max_set_elements);
+
+  hb_set_del (s, 0);
+  hb_set_del (s, max_set_elements - 1);
+  g_assert (!hb_set_has (s, 0));
+  g_assert (hb_set_has (s, 13));
+  g_assert (!hb_set_has (s, max_set_elements - 1));
+  g_assert (!hb_set_is_empty (s));
+  g_assert_cmpint (hb_set_get_population (s), ==, max_set_elements - 2);
+  g_assert_cmpint (hb_set_get_min (s), ==, 1);
+  g_assert_cmpint (hb_set_get_max (s), ==, max_set_elements - 2);
+
+  hb_set_destroy (s);
+}
+
+static void
+test_set_inverted_ranges (void)
+{
+  // Tests:
+  // add_range, del_range, has, get_population, is_empty, get_min, get_max
+  // for inverted sets.
+  hb_set_t *s = hb_set_create ();
+  hb_set_invert (s);
+
+  hb_set_del_range (s, 41, 4000);
+  hb_set_add_range (s, 78, 601);
+
+  g_assert (hb_set_has (s, 40));
+  g_assert (!hb_set_has (s, 41));
+  g_assert (!hb_set_has (s, 64));
+  g_assert (!hb_set_has (s, 77));
+  g_assert (hb_set_has (s, 78));
+  g_assert (hb_set_has (s, 300));
+  g_assert (hb_set_has (s, 601));
+  g_assert (!hb_set_has (s, 602));
+  g_assert (!hb_set_has (s, 3000));
+  g_assert (!hb_set_has (s, 4000));
+  g_assert (hb_set_has (s, 4001));
+
+  g_assert (!hb_set_is_empty (s));
+  g_assert_cmpint (hb_set_get_population (s), ==, max_set_elements - 3436);
+  g_assert_cmpint (hb_set_get_min (s), ==, 0);
+  g_assert_cmpint (hb_set_get_max (s), ==, max_set_elements - 1);
+
+  hb_set_del_range (s, 0, 37);
+  g_assert (!hb_set_has (s, 0));
+  g_assert (!hb_set_has (s, 37));
+  g_assert (hb_set_has (s, 38));
+  g_assert (!hb_set_is_empty (s));
+  g_assert_cmpint (hb_set_get_population (s), ==,
+                   max_set_elements - 3436 - 38);
+  g_assert_cmpint (hb_set_get_min (s), ==, 38);
+  g_assert_cmpint (hb_set_get_max (s), ==, max_set_elements - 1);
+
+  hb_set_del_range (s, max_set_elements - 13, max_set_elements - 1);
+  g_assert (!hb_set_has (s, max_set_elements - 1));
+  g_assert (!hb_set_has (s, max_set_elements - 13));
+  g_assert (hb_set_has (s, max_set_elements - 14));
+
+  g_assert (!hb_set_is_empty (s));
+  g_assert_cmpint (hb_set_get_population (s), ==,
+                   max_set_elements - 3436 - 38 - 13);
+  g_assert_cmpint (hb_set_get_min (s), ==, 38);
+  g_assert_cmpint (hb_set_get_max (s), ==, max_set_elements - 14);
+
+  hb_set_destroy (s);
+}
+
+static void
+test_set_inverted_iteration_next (void)
+{
+  // Tests:
+  // next, next_range
+  hb_set_t *s = hb_set_create ();
+  hb_set_invert (s);
+
+  hb_set_del_range (s, 41, 4000);
+  hb_set_add_range (s, 78, 601);
+
+  hb_codepoint_t cp = HB_SET_VALUE_INVALID;
+  hb_codepoint_t start = 0;
+  hb_codepoint_t end = 0;
+  g_assert (hb_set_next (s, &cp));
+  g_assert_cmpint (cp, ==, 0);
+  g_assert (hb_set_next (s, &cp));
+  g_assert_cmpint (cp, ==, 1);
+
+  g_assert (hb_set_next_range (s, &start, &end));
+  g_assert_cmpint (start, ==, 1);
+  g_assert_cmpint (end, ==, 40);
+
+  start = 40;
+  end = 40;
+  g_assert (hb_set_next_range (s, &start, &end));
+  g_assert_cmpint (start, ==, 78);
+  g_assert_cmpint (end, ==, 601);
+
+  start = 40;
+  end = 57;
+  g_assert (hb_set_next_range (s, &start, &end));
+  g_assert_cmpint (start, ==, 78);
+  g_assert_cmpint (end, ==, 601);
+
+  cp = 39;
+  g_assert (hb_set_next (s, &cp));
+  g_assert_cmpint (cp, ==, 40);
+
+  g_assert (hb_set_next (s, &cp));
+  g_assert_cmpint (cp, ==, 78);
+
+  cp = 56;
+  g_assert (hb_set_next (s, &cp));
+  g_assert_cmpint (cp, ==, 78);
+
+  cp = 78;
+  g_assert (hb_set_next (s, &cp));
+  g_assert_cmpint (cp, ==, 79);
+
+  cp = 601;
+  g_assert (hb_set_next (s, &cp));
+  g_assert_cmpint (cp, ==, 4001);
+
+  cp = HB_SET_VALUE_INVALID;
+  hb_set_del (s, 0);
+  g_assert (hb_set_next (s, &cp));
+  g_assert_cmpint (cp, ==, 1);
+
+  start = 0;
+  end = 0;
+  g_assert (hb_set_next_range (s, &start, &end));
+  g_assert_cmpint (start, ==, 1);
+  g_assert_cmpint (end, ==, 40);
+
+  cp = max_set_elements - 1;
+  g_assert (!hb_set_next (s, &cp));
+  g_assert_cmpint (cp, ==, HB_SET_VALUE_INVALID);
+
+  start = 4000;
+  end = 4000;
+  g_assert (hb_set_next_range (s, &start, &end));
+  g_assert_cmpint (start, ==, 4001);
+  g_assert_cmpint (end, ==, max_set_elements - 1);
+
+  start = max_set_elements - 1;
+  end = max_set_elements - 1;
+  g_assert (!hb_set_next_range (s, &start, &end));
+  g_assert_cmpint (start, ==, HB_SET_VALUE_INVALID);
+  g_assert_cmpint (end, ==, HB_SET_VALUE_INVALID);
+
+  cp = max_set_elements - 3;
+  hb_set_del (s, max_set_elements - 1);
+  g_assert (hb_set_next (s, &cp));
+  g_assert_cmpint (cp, ==, max_set_elements - 2);
+  g_assert (!hb_set_next (s, &cp));
+  g_assert_cmpint (cp, ==, HB_SET_VALUE_INVALID);
+
+
+  start = max_set_elements - 2;
+  end = max_set_elements - 2;
+  g_assert (!hb_set_next_range (s, &start, &end));
+  g_assert_cmpint (start, ==, HB_SET_VALUE_INVALID);
+  g_assert_cmpint (end, ==, HB_SET_VALUE_INVALID);
+
+  start = max_set_elements - 3;
+  end = max_set_elements - 3;
+  g_assert (hb_set_next_range (s, &start, &end));
+  g_assert_cmpint (start, ==, max_set_elements - 2);
+  g_assert_cmpint (end, ==, max_set_elements - 2);
+
+  hb_set_destroy (s);
+}
+
+static void
+test_set_inverted_iteration_prev (void)
+{
+  // Tests:
+  // previous, previous_range
+  hb_set_t *s = hb_set_create ();
+  hb_set_invert (s);
+
+  hb_set_del_range (s, 41, 4000);
+  hb_set_add_range (s, 78, 601);
+
+  hb_codepoint_t cp = HB_SET_VALUE_INVALID;
+  hb_codepoint_t start = max_set_elements - 1;
+  hb_codepoint_t end = max_set_elements - 1;
+  g_assert (hb_set_previous (s, &cp));
+  g_assert_cmpint (cp, ==, max_set_elements - 1);
+  g_assert (hb_set_previous (s, &cp));
+  g_assert_cmpint (cp, ==, max_set_elements - 2);
+
+  g_assert (hb_set_previous_range (s, &start, &end));
+  g_assert_cmpint (start, ==, 4001);
+  g_assert_cmpint (end, ==, max_set_elements - 2);
+
+  start = 4001;
+  end = 4001;
+  g_assert (hb_set_previous_range (s, &start, &end));
+  g_assert_cmpint (start, ==, 78);
+  g_assert_cmpint (end, ==, 601);
+
+  start = 2500;
+  end = 3000;
+  g_assert (hb_set_previous_range (s, &start, &end));
+  g_assert_cmpint (start, ==, 78);
+  g_assert_cmpint (end, ==, 601);
+
+  cp = 4002;
+  g_assert (hb_set_previous (s, &cp));
+  g_assert_cmpint (cp, ==, 4001);
+
+  g_assert (hb_set_previous (s, &cp));
+  g_assert_cmpint (cp, ==, 601);
+
+  cp = 3500;
+  g_assert (hb_set_previous (s, &cp));
+  g_assert_cmpint (cp, ==, 601);
+
+  cp = 601;
+  g_assert (hb_set_previous (s, &cp));
+  g_assert_cmpint (cp, ==, 600);
+
+  cp = 78;
+  g_assert (hb_set_previous (s, &cp));
+  g_assert_cmpint (cp, ==, 40);
+
+  cp = HB_SET_VALUE_INVALID;
+  hb_set_del (s, max_set_elements - 1);
+  g_assert (hb_set_previous (s, &cp));
+  g_assert_cmpint (cp, ==, max_set_elements - 2);
+
+  start = max_set_elements - 1;
+  end = max_set_elements - 1;
+  g_assert (hb_set_previous_range (s, &start, &end));
+  g_assert_cmpint (start, ==, 4001);
+  g_assert_cmpint (end, ==, max_set_elements - 2);
+
+  cp = 0;
+  g_assert (!hb_set_previous (s, &cp));
+  g_assert_cmpint (cp, ==, HB_SET_VALUE_INVALID);
+
+  cp = 40;
+  g_assert (hb_set_previous (s, &cp));
+  g_assert_cmpint (cp, ==, 39);
+
+  start = 40;
+  end = 40;
+  g_assert (hb_set_previous_range (s, &start, &end));
+  g_assert_cmpint (start, ==, 0);
+  g_assert_cmpint (end, ==, 39);
+
+  start = 0;
+  end = 0;
+  g_assert (!hb_set_previous_range (s, &start, &end));
+  g_assert_cmpint (start, ==, HB_SET_VALUE_INVALID);
+  g_assert_cmpint (end, ==, HB_SET_VALUE_INVALID);
+
+
+  cp = 2;
+  hb_set_del (s, 0);
+  g_assert (hb_set_previous (s, &cp));
+  g_assert_cmpint (cp, ==, 1);
+  g_assert (!hb_set_previous (s, &cp));
+  g_assert_cmpint (cp, ==, HB_SET_VALUE_INVALID);
+
+  start = 1;
+  end = 1;
+  g_assert (!hb_set_previous_range (s, &start, &end));
+  g_assert_cmpint (start, ==, HB_SET_VALUE_INVALID);
+  g_assert_cmpint (end, ==, HB_SET_VALUE_INVALID);
+
+  start = 2;
+  end = 2;
+  g_assert (hb_set_previous_range (s, &start, &end));
+  g_assert_cmpint (start, ==, 1);
+  g_assert_cmpint (end, ==, 1);
+
+  hb_set_destroy (s);
+}
+
+
+static void
+test_set_inverted_equality (void)
+{
+  hb_set_t *a = hb_set_create ();
+  hb_set_t *b = hb_set_create ();
+  hb_set_invert (a);
+  hb_set_invert (b);
+
+  g_assert (hb_set_is_equal (a, b));
+  g_assert (hb_set_is_equal (b, a));
+
+  hb_set_add (a, 10);
+  g_assert (hb_set_is_equal (a, b));
+  g_assert (hb_set_is_equal (b, a));
+
+  hb_set_del (a, 42);
+  g_assert (!hb_set_is_equal (a, b));
+  g_assert (!hb_set_is_equal (b, a));
+
+  hb_set_del (b, 42);
+  g_assert (hb_set_is_equal (a, b));
+  g_assert (hb_set_is_equal (b, a));
+
+  hb_set_del_range (a, 43, 50);
+  hb_set_del_range (a, 51, 76);
+  hb_set_del_range (b, 43, 76);
+  g_assert (hb_set_is_equal (a, b));
+  g_assert (hb_set_is_equal (b, a));
+
+  hb_set_del (a, 0);
+  g_assert (!hb_set_is_equal (a, b));
+  g_assert (!hb_set_is_equal (b, a));
+
+  hb_set_del (b, 0);
+  g_assert (hb_set_is_equal (a, b));
+  g_assert (hb_set_is_equal (b, a));
+
+  hb_set_del (a, max_set_elements - 1);
+  g_assert (!hb_set_is_equal (a, b));
+  g_assert (!hb_set_is_equal (b, a));
+
+  hb_set_del (b, max_set_elements - 1);
+  g_assert (hb_set_is_equal (a, b));
+  g_assert (hb_set_is_equal (b, a));
+
+  hb_set_invert (a);
+  g_assert (!hb_set_is_equal (a, b));
+  g_assert (!hb_set_is_equal (b, a));
+
+  hb_set_invert (b);
+  g_assert (hb_set_is_equal (a, b));
+  g_assert (hb_set_is_equal (b, a));
+
+  hb_set_destroy (a);
+  hb_set_destroy (b);
+}
+
+typedef enum {
+  UNION = 0,
+  INTERSECT,
+  SUBTRACT,
+  SYM_DIFF,
+  LAST,
+} set_operation;
+
+static hb_set_t* prepare_set(hb_bool_t has_x,
+                             hb_bool_t inverted,
+                             hb_bool_t has_page,
+                             hb_bool_t is_null)
+{
+  static const hb_codepoint_t x = 13;
+  if (is_null)
+    return hb_set_get_empty ();
+
+  hb_set_t* s = hb_set_create ();
+  if (inverted) hb_set_invert (s);
+  if (has_page)
+  {
+    // Ensure a page exists for x.
+    inverted ? hb_set_del (s, x) : hb_set_add (s, x);
+  }
+  if (has_x)
+    hb_set_add (s, x);
+  else
+    hb_set_del (s, x);
+
+  return s;
+}
+
+static hb_bool_t
+check_set_operations(hb_bool_t a_has_x,
+                     hb_bool_t a_inverted,
+                     hb_bool_t a_has_page,
+                     hb_bool_t a_is_null,
+                     hb_bool_t b_has_x,
+                     hb_bool_t b_inverted,
+                     hb_bool_t b_has_page,
+                     hb_bool_t b_is_null,
+                     set_operation op)
+{
+  hb_codepoint_t x = 13;
+  hb_set_t* a = prepare_set (a_has_x, a_inverted, a_has_page, a_is_null);
+  hb_set_t* b = prepare_set (b_has_x, b_inverted, b_has_page, b_is_null);
+
+  const char* op_name;
+  hb_bool_t has_expected;
+  hb_bool_t should_have_x;
+  switch (op) {
+  default:
+  case LAST:
+  case UNION:
+    op_name = "union";
+    should_have_x = (a_has_x || b_has_x) && !a_is_null;
+    hb_set_union (a, b);
+    has_expected = (hb_set_has (a, x) == should_have_x);
+    break;
+  case INTERSECT:
+    op_name = "intersect";
+    should_have_x = (a_has_x && b_has_x) && !a_is_null;
+    hb_set_intersect (a, b);
+    has_expected = (hb_set_has (a, x) == should_have_x);
+    break;
+  case SUBTRACT:
+    op_name = "subtract";
+    should_have_x = (a_has_x && !b_has_x) && !a_is_null;
+    hb_set_subtract (a, b);
+    has_expected = (hb_set_has (a, x) == should_have_x);
+    break;
+  case SYM_DIFF:
+    op_name = "sym_diff";
+    should_have_x = (a_has_x ^ b_has_x) && !a_is_null;
+    hb_set_symmetric_difference (a, b);
+    has_expected = (hb_set_has (a, x) == should_have_x);
+    break;
+  }
+
+  printf ("%s%s%s%s %-9s %s%s%s%s == %s  [%s]\n",
+          a_inverted ? "i" : " ",
+          a_has_page ? "p" : " ",
+          a_is_null ? "n" : " ",
+          a_has_x ? "{13}" : "{}  ",
+          op_name,
+          b_inverted ? "i" : " ",
+          b_has_page ? "p" : " ",
+          b_is_null ? "n" : " ",
+          b_has_x ? "{13}" : "{}  ",
+          should_have_x ? "{13}" : "{}  ",
+          has_expected ? "succeeded" : "failed");
+
+  hb_set_destroy (a);
+  hb_set_destroy (b);
+
+  return has_expected;
+}
+
+static void
+test_set_inverted_operations (void)
+{
+  hb_bool_t all_succeeded = 1;
+  for (hb_bool_t a_has_x = 0; a_has_x <= 1; a_has_x++) {
+    for (hb_bool_t a_inverted = 0; a_inverted <= 1; a_inverted++) {
+      for (hb_bool_t b_has_x = 0; b_has_x <= 1; b_has_x++) {
+        for (hb_bool_t b_inverted = 0; b_inverted <= 1; b_inverted++) {
+          for (hb_bool_t a_has_page = 0; a_has_page <= !(a_has_x ^ a_inverted); a_has_page++) {
+            for (hb_bool_t b_has_page = 0; b_has_page <= !(b_has_x ^ b_inverted); b_has_page++) {
+              for (hb_bool_t a_is_null = 0; a_is_null <= (!a_has_x && !a_has_page && !a_inverted); a_is_null++) {
+                for (hb_bool_t b_is_null = 0; b_is_null <= (!b_has_x && !b_has_page && !b_inverted); b_is_null++) {
+                  for (set_operation op = UNION; op < LAST; op++) {
+                    all_succeeded = check_set_operations (a_has_x, a_inverted, a_has_page, a_is_null,
+                                                          b_has_x, b_inverted, b_has_page, b_is_null,
+                                                          op)
+                                    && all_succeeded;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+
+  g_assert (all_succeeded);
+}
+
 int
 main (int argc, char **argv)
 {
   hb_test_init (&argc, &argv);
 
   hb_test_add (test_set_basic);
+  hb_test_add (test_set_subsets);
   hb_test_add (test_set_algebra);
   hb_test_add (test_set_iter);
   hb_test_add (test_set_empty);
@@ -532,5 +1083,12 @@ main (int argc, char **argv)
   hb_test_add (test_set_intersect_page_reduction);
   hb_test_add (test_set_union);
 
+  hb_test_add (test_set_inverted_basics);
+  hb_test_add (test_set_inverted_ranges);
+  hb_test_add (test_set_inverted_iteration_next);
+  hb_test_add (test_set_inverted_iteration_prev);
+  hb_test_add (test_set_inverted_equality);
+  hb_test_add (test_set_inverted_operations);
+
   return hb_test_run();
 }
diff --git a/test/api/test-style.c b/test/api/test-style.c
new file mode 100644 (file)
index 0000000..73accfb
--- /dev/null
@@ -0,0 +1,160 @@
+/*
+ * Copyright © 2019  Ebrahim Byagowi
+ *
+ *  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.
+ */
+
+#include "hb-test.h"
+
+#include <hb.h>
+
+/* Unit tests for hb-style.h */
+
+#define assert_cmpfloat(n1, n2) g_assert_cmpint ((int) (n1 * 100.f), ==, (int) (n2 * 100.f))
+
+static void
+test_empty_face (void)
+{
+  hb_font_t *empty = hb_font_get_empty ();
+
+  assert_cmpfloat (hb_style_get_value (empty, HB_STYLE_TAG_ITALIC), 0);
+  assert_cmpfloat (hb_style_get_value (empty, HB_STYLE_TAG_OPTICAL_SIZE), 12);
+  assert_cmpfloat (hb_style_get_value (empty, HB_STYLE_TAG_SLANT_ANGLE), 0);
+  assert_cmpfloat (hb_style_get_value (empty, HB_STYLE_TAG_WIDTH), 100);
+  assert_cmpfloat (hb_style_get_value (empty, HB_STYLE_TAG_WEIGHT), 400);
+}
+
+static void
+test_regular_face (void)
+{
+  hb_face_t *face = hb_test_open_font_file ("fonts/Roboto-Regular.abc.ttf");
+  hb_font_t *font = hb_font_create (face);
+
+  assert_cmpfloat (hb_style_get_value (font, HB_STYLE_TAG_ITALIC), 0);
+  assert_cmpfloat (hb_style_get_value (font, HB_STYLE_TAG_OPTICAL_SIZE), 12);
+  assert_cmpfloat (hb_style_get_value (font, HB_STYLE_TAG_SLANT_ANGLE), 0);
+  assert_cmpfloat (hb_style_get_value (font, HB_STYLE_TAG_WIDTH), 100);
+  assert_cmpfloat (hb_style_get_value (font, HB_STYLE_TAG_WEIGHT), 400);
+
+  hb_font_destroy (font);
+  hb_face_destroy (face);
+}
+
+static void
+test_face_user_setting (void)
+{
+  hb_face_t *face = hb_test_open_font_file ("fonts/AdobeVFPrototype_vsindex.otf");
+  hb_font_t *font = hb_font_create (face);
+
+  assert_cmpfloat (hb_style_get_value (font, HB_STYLE_TAG_ITALIC), 0);
+  assert_cmpfloat (hb_style_get_value (font, HB_STYLE_TAG_OPTICAL_SIZE), 12);
+  assert_cmpfloat (hb_style_get_value (font, HB_STYLE_TAG_SLANT_ANGLE), 0);
+  assert_cmpfloat (hb_style_get_value (font, HB_STYLE_TAG_WIDTH), 100);
+  assert_cmpfloat (hb_style_get_value (font, HB_STYLE_TAG_WEIGHT), 389.34f); /* its default weight */
+  assert_cmpfloat (hb_style_get_value (font, (hb_style_tag_t) HB_TAG ('C','N','T','R')), 0);
+
+  hb_font_set_var_named_instance (font, 0);
+
+  assert_cmpfloat (hb_style_get_value (font, HB_STYLE_TAG_ITALIC), 0);
+  assert_cmpfloat (hb_style_get_value (font, HB_STYLE_TAG_OPTICAL_SIZE), 12);
+  assert_cmpfloat (hb_style_get_value (font, HB_STYLE_TAG_SLANT_ANGLE), 0);
+  assert_cmpfloat (hb_style_get_value (font, HB_STYLE_TAG_WIDTH), 100);
+  assert_cmpfloat (hb_style_get_value (font, HB_STYLE_TAG_WEIGHT), 200);
+  assert_cmpfloat (hb_style_get_value (font, (hb_style_tag_t) HB_TAG ('C','N','T','R')), 0);
+
+  hb_font_set_var_named_instance (font, 1);
+
+  assert_cmpfloat (hb_style_get_value (font, HB_STYLE_TAG_ITALIC), 0);
+  assert_cmpfloat (hb_style_get_value (font, HB_STYLE_TAG_OPTICAL_SIZE), 12);
+  assert_cmpfloat (hb_style_get_value (font, HB_STYLE_TAG_SLANT_ANGLE), 0);
+  assert_cmpfloat (hb_style_get_value (font, HB_STYLE_TAG_WIDTH), 100);
+  assert_cmpfloat (hb_style_get_value (font, HB_STYLE_TAG_WEIGHT), 300);
+  assert_cmpfloat (hb_style_get_value (font, (hb_style_tag_t) HB_TAG ('C','N','T','R')), 0);
+
+  hb_font_set_var_named_instance (font, 2);
+
+  assert_cmpfloat (hb_style_get_value (font, HB_STYLE_TAG_ITALIC), 0);
+  assert_cmpfloat (hb_style_get_value (font, HB_STYLE_TAG_OPTICAL_SIZE), 12);
+  assert_cmpfloat (hb_style_get_value (font, HB_STYLE_TAG_SLANT_ANGLE), 0);
+  assert_cmpfloat (hb_style_get_value (font, HB_STYLE_TAG_WIDTH), 100);
+  assert_cmpfloat (hb_style_get_value (font, HB_STYLE_TAG_WEIGHT), 400);
+  assert_cmpfloat (hb_style_get_value (font, (hb_style_tag_t) HB_TAG ('C','N','T','R')), 0);
+
+  hb_font_set_var_named_instance (font, 3);
+
+  assert_cmpfloat (hb_style_get_value (font, HB_STYLE_TAG_ITALIC), 0);
+  assert_cmpfloat (hb_style_get_value (font, HB_STYLE_TAG_OPTICAL_SIZE), 12);
+  assert_cmpfloat (hb_style_get_value (font, HB_STYLE_TAG_SLANT_ANGLE), 0);
+  assert_cmpfloat (hb_style_get_value (font, HB_STYLE_TAG_WIDTH), 100);
+  assert_cmpfloat (hb_style_get_value (font, HB_STYLE_TAG_WEIGHT),600);
+  assert_cmpfloat (hb_style_get_value (font, (hb_style_tag_t) HB_TAG ('C','N','T','R')), 0);
+
+  hb_font_set_var_named_instance (font, 4);
+
+  assert_cmpfloat (hb_style_get_value (font, HB_STYLE_TAG_ITALIC), 0);
+  assert_cmpfloat (hb_style_get_value (font, HB_STYLE_TAG_OPTICAL_SIZE), 12);
+  assert_cmpfloat (hb_style_get_value (font, HB_STYLE_TAG_SLANT_ANGLE), 0);
+  assert_cmpfloat (hb_style_get_value (font, HB_STYLE_TAG_WIDTH), 100);
+  assert_cmpfloat (hb_style_get_value (font, HB_STYLE_TAG_WEIGHT), 700);
+  assert_cmpfloat (hb_style_get_value (font, (hb_style_tag_t) HB_TAG ('C','N','T','R')), 0);
+
+  hb_font_set_var_named_instance (font, 5);
+
+  assert_cmpfloat (hb_style_get_value (font, HB_STYLE_TAG_ITALIC), 0);
+  assert_cmpfloat (hb_style_get_value (font, HB_STYLE_TAG_OPTICAL_SIZE), 12);
+  assert_cmpfloat (hb_style_get_value (font, HB_STYLE_TAG_SLANT_ANGLE), 0);
+  assert_cmpfloat (hb_style_get_value (font, HB_STYLE_TAG_WIDTH), 100);
+  assert_cmpfloat (hb_style_get_value (font, HB_STYLE_TAG_WEIGHT), 900);
+  assert_cmpfloat (hb_style_get_value (font, (hb_style_tag_t) HB_TAG ('C','N','T','R')), 0);
+
+  hb_font_set_var_named_instance (font, 6);
+
+  assert_cmpfloat (hb_style_get_value (font, HB_STYLE_TAG_ITALIC), 0);
+  assert_cmpfloat (hb_style_get_value (font, HB_STYLE_TAG_OPTICAL_SIZE), 12);
+  assert_cmpfloat (hb_style_get_value (font, HB_STYLE_TAG_SLANT_ANGLE), 0);
+  assert_cmpfloat (hb_style_get_value (font, HB_STYLE_TAG_WIDTH), 100);
+  assert_cmpfloat (hb_style_get_value (font, HB_STYLE_TAG_WEIGHT), 900);
+  assert_cmpfloat (hb_style_get_value (font, (hb_style_tag_t) HB_TAG ('C','N','T','R')), 50);
+
+  hb_font_set_var_named_instance (font, 7);
+
+  assert_cmpfloat (hb_style_get_value (font, HB_STYLE_TAG_ITALIC), 0);
+  assert_cmpfloat (hb_style_get_value (font, HB_STYLE_TAG_OPTICAL_SIZE), 12);
+  assert_cmpfloat (hb_style_get_value (font, HB_STYLE_TAG_SLANT_ANGLE), 0);
+  assert_cmpfloat (hb_style_get_value (font, HB_STYLE_TAG_WIDTH), 100);
+  assert_cmpfloat (hb_style_get_value (font, HB_STYLE_TAG_WEIGHT), 900);
+  assert_cmpfloat (hb_style_get_value (font, (hb_style_tag_t) HB_TAG ('C','N','T','R')), 100);
+
+  hb_font_destroy (font);
+  hb_face_destroy (face);
+}
+
+int
+main (int argc, char **argv)
+{
+  hb_test_init (&argc, &argv);
+
+  hb_test_add (test_empty_face);
+  hb_test_add (test_regular_face);
+  hb_test_add (test_face_user_setting);
+
+  return hb_test_run ();
+}
index 8b4025d..7c68a49 100644 (file)
@@ -80,7 +80,7 @@ test_subset_cff1_strip_hints (void)
   hb_set_add (codepoints, 'a');
   hb_set_add (codepoints, 'c');
   input = hb_subset_test_create_input (codepoints);
-  hb_subset_input_set_drop_hints (input, true);
+  hb_subset_input_set_flags (input, HB_SUBSET_FLAGS_NO_HINTING);
   face_abc_subset = hb_subset_test_create_subset (face_abc, input);
   hb_set_destroy (codepoints);
 
@@ -103,7 +103,7 @@ test_subset_cff1_desubr (void)
   hb_set_add (codepoints, 'a');
   hb_set_add (codepoints, 'c');
   input = hb_subset_test_create_input (codepoints);
-  hb_subset_input_set_desubroutinize (input, true);
+  hb_subset_input_set_flags (input, HB_SUBSET_FLAGS_DESUBROUTINIZE);
   face_abc_subset = hb_subset_test_create_subset (face_abc, input);
   hb_set_destroy (codepoints);
 
@@ -126,8 +126,8 @@ test_subset_cff1_desubr_strip_hints (void)
   hb_set_add (codepoints, 'a');
   hb_set_add (codepoints, 'c');
   input = hb_subset_test_create_input (codepoints);
-  hb_subset_input_set_drop_hints (input, true);
-  hb_subset_input_set_desubroutinize (input, true);
+  hb_subset_input_set_flags (input,
+                             HB_SUBSET_FLAGS_NO_HINTING | HB_SUBSET_FLAGS_DESUBROUTINIZE);
   face_abc_subset = hb_subset_test_create_subset (face_abc, input);
   hb_set_destroy (codepoints);
 
@@ -170,7 +170,7 @@ test_subset_cff1_j_strip_hints (void)
   hb_set_add (codepoints, 0x41);
   hb_set_add (codepoints, 0x4C2E);
   input = hb_subset_test_create_input (codepoints);
-  hb_subset_input_set_drop_hints (input, true);
+  hb_subset_input_set_flags (input, HB_SUBSET_FLAGS_NO_HINTING);
   face_41_3041_4c2e_subset = hb_subset_test_create_subset (face_41_3041_4c2e, input);
   hb_set_destroy (codepoints);
 
@@ -193,7 +193,7 @@ test_subset_cff1_j_desubr (void)
   hb_set_add (codepoints, 0x41);
   hb_set_add (codepoints, 0x4C2E);
   input = hb_subset_test_create_input (codepoints);
-  hb_subset_input_set_desubroutinize (input, true);
+  hb_subset_input_set_flags (input, HB_SUBSET_FLAGS_DESUBROUTINIZE);
   face_41_3041_4c2e_subset = hb_subset_test_create_subset (face_41_3041_4c2e, input);
   hb_set_destroy (codepoints);
 
@@ -216,8 +216,8 @@ test_subset_cff1_j_desubr_strip_hints (void)
   hb_set_add (codepoints, 0x41);
   hb_set_add (codepoints, 0x4C2E);
   input = hb_subset_test_create_input (codepoints);
-  hb_subset_input_set_drop_hints (input, true);
-  hb_subset_input_set_desubroutinize (input, true);
+  hb_subset_input_set_flags (input,
+                             HB_SUBSET_FLAGS_NO_HINTING | HB_SUBSET_FLAGS_DESUBROUTINIZE);
   face_41_3041_4c2e_subset = hb_subset_test_create_subset (face_41_3041_4c2e, input);
   hb_set_destroy (codepoints);
 
@@ -279,7 +279,7 @@ test_subset_cff1_dotsection (void)
   hb_face_t *face_test;
   hb_set_add (codepoints, 0x69);  /* i */
   input = hb_subset_test_create_input (codepoints);
-  hb_subset_input_set_drop_hints (input, true);
+  hb_subset_input_set_flags (input, HB_SUBSET_FLAGS_NO_HINTING);
   face_test = hb_subset_test_create_subset (face, input);
   hb_set_destroy (codepoints);
 
@@ -302,7 +302,7 @@ test_subset_cff1_retaingids (void)
   hb_set_add (codepoints, 'a');
   hb_set_add (codepoints, 'c');
   input = hb_subset_test_create_input (codepoints);
-  hb_subset_input_set_retain_gids (input, true);
+  hb_subset_input_set_flags (input, HB_SUBSET_FLAGS_RETAIN_GIDS);
   face_abc_subset = hb_subset_test_create_subset (face_abc, input);
   hb_set_destroy (codepoints);
 
@@ -325,7 +325,7 @@ test_subset_cff1_j_retaingids (void)
   hb_set_add (codepoints, 0x41);
   hb_set_add (codepoints, 0x4C2E);
   input = hb_subset_test_create_input (codepoints);
-  hb_subset_input_set_retain_gids (input, true);
+  hb_subset_input_set_flags (input, HB_SUBSET_FLAGS_RETAIN_GIDS);
   face_41_3041_4c2e_subset = hb_subset_test_create_subset (face_41_3041_4c2e, input);
   hb_set_destroy (codepoints);
 
index 7ffcf5e..a5dde42 100644 (file)
@@ -80,7 +80,7 @@ test_subset_cff2_strip_hints (void)
   hb_set_add (codepoints, 'a');
   hb_set_add (codepoints, 'c');
   input = hb_subset_test_create_input (codepoints);
-  hb_subset_input_set_drop_hints (input, true);
+  hb_subset_input_set_flags (input, HB_SUBSET_FLAGS_NO_HINTING);
   face_abc_subset = hb_subset_test_create_subset (face_abc, input);
   hb_set_destroy (codepoints);
 
@@ -103,7 +103,7 @@ test_subset_cff2_desubr (void)
   hb_set_add (codepoints, 'a');
   hb_set_add (codepoints, 'c');
   input = hb_subset_test_create_input (codepoints);
-  hb_subset_input_set_desubroutinize (input, true);
+  hb_subset_input_set_flags (input, HB_SUBSET_FLAGS_DESUBROUTINIZE);
   face_abc_subset = hb_subset_test_create_subset (face_abc, input);
   hb_set_destroy (codepoints);
 
@@ -126,8 +126,8 @@ test_subset_cff2_desubr_strip_hints (void)
   hb_set_add (codepoints, 'a');
   hb_set_add (codepoints, 'c');
   input = hb_subset_test_create_input (codepoints);
-  hb_subset_input_set_desubroutinize (input, true);
-  hb_subset_input_set_drop_hints (input, true);
+  hb_subset_input_set_flags (input,
+                             HB_SUBSET_FLAGS_DESUBROUTINIZE | HB_SUBSET_FLAGS_NO_HINTING);
   face_abc_subset = hb_subset_test_create_subset (face_abc, input);
   hb_set_destroy (codepoints);
 
@@ -150,7 +150,7 @@ test_subset_cff2_retaingids (void)
   hb_set_add (codepoints, 'a');
   hb_set_add (codepoints, 'c');
   input = hb_subset_test_create_input (codepoints);
-  hb_subset_input_set_retain_gids (input, true);
+  hb_subset_input_set_flags (input, HB_SUBSET_FLAGS_RETAIN_GIDS);
   face_abc_subset = hb_subset_test_create_subset (face_abc, input);
   hb_set_destroy (codepoints);
 
index e234080..327b17b 100644 (file)
@@ -38,11 +38,12 @@ test_subset_drop_tables (void)
   hb_set_add (codepoints, 97);
   hb_set_add (codepoints, 99);
   hb_subset_input_t *input = hb_subset_test_create_input (codepoints);
-  hb_set_add (hb_subset_input_drop_tables_set (input), HB_TAG ('h', 'd', 'm', 'x'));
-  hb_set_add (hb_subset_input_drop_tables_set (input), HB_TAG ('h', 'm', 't', 'x'));
+  hb_set_add (hb_subset_input_set (input, HB_SUBSET_SETS_DROP_TABLE_TAG), HB_TAG ('h', 'd', 'm', 'x'));
+  hb_set_add (hb_subset_input_set (input, HB_SUBSET_SETS_DROP_TABLE_TAG), HB_TAG ('h', 'm', 't', 'x'));
   hb_set_destroy (codepoints);
 
-  hb_face_t* subset = hb_subset (face, input);
+  hb_face_t* subset = hb_subset_or_fail (face, input);
+  g_assert (subset);
 
   hb_blob_t *hdmx = hb_face_reference_table (subset, HB_TAG ('h', 'd', 'm', 'x'));
   hb_blob_t *hmtx = hb_face_reference_table (subset, HB_TAG ('h', 'm', 't', 'x'));
index 2b330ce..94670be 100644 (file)
@@ -80,6 +80,31 @@ test_subset_glyf (void)
 }
 
 static void
+test_subset_glyf_set_overlaps_flag (void)
+{
+  hb_face_t *face_abcAE = hb_test_open_font_file ("fonts/Roboto-Regular.abcAE.ttf");
+  hb_face_t *face_bAE = hb_test_open_font_file ("fonts/Roboto-Regular.bAE.ttf");
+
+  hb_set_t *codepoints = hb_set_create();
+  hb_face_t *face_abcAE_subset;
+  hb_set_add (codepoints, 32);
+  hb_set_add (codepoints, 98);
+  hb_set_add (codepoints, 508);
+
+  hb_subset_input_t* input = hb_subset_test_create_input (codepoints);
+  hb_subset_input_set_flags (input, HB_SUBSET_FLAGS_SET_OVERLAPS_FLAG);
+  face_abcAE_subset = hb_subset_test_create_subset (face_abcAE, input);
+  hb_set_destroy (codepoints);
+
+  hb_subset_test_check (face_bAE, face_abcAE_subset, HB_TAG ('l','o','c', 'a'));
+  hb_subset_test_check (face_bAE, face_abcAE_subset, HB_TAG ('g','l','y','f'));
+
+  hb_face_destroy (face_abcAE_subset);
+  hb_face_destroy (face_abcAE);
+  hb_face_destroy (face_bAE);
+}
+
+static void
 test_subset_glyf_with_input_glyphs (void)
 {
   hb_face_t *face_abc = hb_test_open_font_file ("fonts/Roboto-Regular.abc.ttf");
@@ -137,9 +162,9 @@ test_subset_glyf_with_gsub (void)
 
   input = hb_subset_test_create_input (codepoints);
   hb_set_destroy (codepoints);
-  hb_set_del (hb_subset_input_drop_tables_set (input), HB_TAG('G', 'S', 'U', 'B'));
-  hb_set_del (hb_subset_input_drop_tables_set (input), HB_TAG('G', 'P', 'O', 'S'));
-  hb_set_del (hb_subset_input_drop_tables_set (input), HB_TAG('G', 'D', 'E', 'F'));
+  hb_set_del (hb_subset_input_set (input, HB_SUBSET_SETS_DROP_TABLE_TAG), HB_TAG('G', 'S', 'U', 'B'));
+  hb_set_del (hb_subset_input_set (input, HB_SUBSET_SETS_DROP_TABLE_TAG), HB_TAG('G', 'P', 'O', 'S'));
+  hb_set_del (hb_subset_input_set (input, HB_SUBSET_SETS_DROP_TABLE_TAG), HB_TAG('G', 'D', 'E', 'F'));
 
   face_subset = hb_subset_test_create_subset (face_fil, input);
 
@@ -166,9 +191,9 @@ test_subset_glyf_without_gsub (void)
 
   input = hb_subset_test_create_input (codepoints);
   hb_set_destroy (codepoints);
-  hb_set_add (hb_subset_input_drop_tables_set (input), HB_TAG('G', 'S', 'U', 'B'));
-  hb_set_add (hb_subset_input_drop_tables_set (input), HB_TAG('G', 'P', 'O', 'S'));
-  hb_set_add (hb_subset_input_drop_tables_set (input), HB_TAG('G', 'D', 'E', 'F'));
+  hb_set_add (hb_subset_input_set (input, HB_SUBSET_SETS_DROP_TABLE_TAG), HB_TAG('G', 'S', 'U', 'B'));
+  hb_set_add (hb_subset_input_set (input, HB_SUBSET_SETS_DROP_TABLE_TAG), HB_TAG('G', 'P', 'O', 'S'));
+  hb_set_add (hb_subset_input_set (input, HB_SUBSET_SETS_DROP_TABLE_TAG), HB_TAG('G', 'D', 'E', 'F'));
 
   face_subset = hb_subset_test_create_subset (face_fil, input);
 
@@ -214,7 +239,7 @@ test_subset_glyf_strip_hints_simple (void)
   hb_set_add (codepoints, 'a');
   hb_set_add (codepoints, 'c');
   input = hb_subset_test_create_input (codepoints);
-  hb_subset_input_set_drop_hints (input, true);
+  hb_subset_input_set_flags (input, HB_SUBSET_FLAGS_NO_HINTING);
   face_abc_subset = hb_subset_test_create_subset (face_abc, input);
   hb_set_destroy (codepoints);
 
@@ -238,7 +263,7 @@ test_subset_glyf_strip_hints_composite (void)
   hb_face_t *face_generated_subset;
   hb_set_add (codepoints, 0x1fc);
   input = hb_subset_test_create_input (codepoints);
-  hb_subset_input_set_drop_hints (input, true);
+  hb_subset_input_set_flags (input, HB_SUBSET_FLAGS_NO_HINTING);
 
   face_generated_subset = hb_subset_test_create_subset (face_components, input);
   hb_set_destroy (codepoints);
@@ -273,14 +298,13 @@ test_subset_glyf_strip_hints_invalid (void)
   }
 
   input = hb_subset_test_create_input (codepoints);
-  hb_subset_input_set_drop_hints (input, true);
+  hb_subset_input_set_flags (input, HB_SUBSET_FLAGS_NO_HINTING);
   hb_set_destroy (codepoints);
 
-  face_subset = hb_subset_test_create_subset (face, input);
-  g_assert (face_subset);
-  g_assert (face_subset == hb_face_get_empty ());
+  face_subset = hb_subset_or_fail (face, input);
+  g_assert (!face_subset);
 
-  hb_face_destroy (face_subset);
+  hb_subset_input_destroy (input);
   hb_face_destroy (face);
 }
 
@@ -296,7 +320,7 @@ test_subset_glyf_retain_gids (void)
   hb_set_add (codepoints, 99);
 
   hb_subset_input_t *input = hb_subset_test_create_input (codepoints);
-  hb_subset_input_set_retain_gids (input, true);
+  hb_subset_input_set_flags (input, HB_SUBSET_FLAGS_RETAIN_GIDS);
   face_abc_subset = hb_subset_test_create_subset (face_abc, input);
   hb_set_destroy (codepoints);
 
@@ -320,7 +344,7 @@ test_subset_glyf_retain_gids_truncates (void)
   hb_set_add (codepoints, 97);
 
   hb_subset_input_t *input = hb_subset_test_create_input (codepoints);
-  hb_subset_input_set_retain_gids (input, true);
+  hb_subset_input_set_flags (input, HB_SUBSET_FLAGS_RETAIN_GIDS);
   face_abc_subset = hb_subset_test_create_subset (face_abc, input);
   hb_set_destroy (codepoints);
 
@@ -342,6 +366,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_set_overlaps_flag);
   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);
index 5c2fe2e..ff7defb 100644 (file)
@@ -32,7 +32,6 @@
 static void
 test_subset_gpos_lookup_subtable (void)
 {
-#ifdef HB_EXPERIMENTAL_API
   hb_face_t *face_pwa = hb_test_open_font_file ("fonts/Roboto-Regular-gpos-.aw.ttf");
   hb_face_t *face_wa = hb_test_open_font_file ("fonts/Roboto-Regular-gpos-aw.ttf");
 
@@ -43,7 +42,8 @@ test_subset_gpos_lookup_subtable (void)
 
   hb_subset_input_t *input = hb_subset_test_create_input (codepoints);
 
-  hb_set_del (hb_subset_input_drop_tables_set (input), HB_TAG ('G', 'P', 'O', 'S'));
+  hb_set_del (hb_subset_input_set (input, HB_SUBSET_SETS_DROP_TABLE_TAG),
+              HB_TAG ('G', 'P', 'O', 'S'));
 
   face_pwa_subset = hb_subset_test_create_subset (face_pwa, input);
   hb_set_destroy (codepoints);
@@ -53,14 +53,11 @@ test_subset_gpos_lookup_subtable (void)
   hb_face_destroy (face_pwa_subset);
   hb_face_destroy (face_pwa);
   hb_face_destroy (face_wa);
-#endif
 }
 
-/* TODO: Once GDEF subsetting is implemented, this test may fail & expected result need update. */
 static void
 test_subset_gpos_pairpos1_vf (void)
 {
-#ifdef HB_EXPERIMENTAL_API
   hb_face_t *face_wav = hb_test_open_font_file ("fonts/AdobeVFPrototype.WAV.gpos.otf");
   hb_face_t *face_wa = hb_test_open_font_file ("fonts/AdobeVFPrototype.WA.gpos.otf");
 
@@ -71,7 +68,8 @@ test_subset_gpos_pairpos1_vf (void)
 
   hb_subset_input_t *input = hb_subset_test_create_input (codepoints);
 
-  hb_set_del (hb_subset_input_drop_tables_set (input), HB_TAG ('G', 'P', 'O', 'S'));
+  hb_set_del (hb_subset_input_set (input, HB_SUBSET_SETS_DROP_TABLE_TAG),
+              HB_TAG ('G', 'P', 'O', 'S'));
 
   face_wav_subset = hb_subset_test_create_subset (face_wav, input);
   hb_set_destroy (codepoints);
@@ -81,7 +79,6 @@ test_subset_gpos_pairpos1_vf (void)
   hb_face_destroy (face_wav_subset);
   hb_face_destroy (face_wav);
   hb_face_destroy (face_wa);
-#endif
 }
 
 int
index 991be8f..5ffc02d 100644 (file)
@@ -79,7 +79,7 @@ test_subset_gvar_retaingids (void)
   hb_set_add (codepoints, 'a');
   hb_set_add (codepoints, 'c');
   hb_subset_input_t *input = hb_subset_test_create_input (codepoints);
-  hb_subset_input_set_retain_gids (input, true);
+  hb_subset_input_set_flags (input, HB_SUBSET_FLAGS_RETAIN_GIDS);
   face_abc_subset = hb_subset_test_create_subset (face_abc, input);
   hb_set_destroy (codepoints);
 
index 7178833..c41a121 100644 (file)
@@ -82,9 +82,8 @@ test_subset_hdmx_invalid (void)
   hb_set_add (codepoints, 'b');
   hb_set_add (codepoints, 'c');
 
-  subset = hb_subset (face, input);
-  g_assert (subset);
-  g_assert (subset == hb_face_get_empty ());
+  subset = hb_subset_or_fail (face, input);
+  g_assert (!subset);
 
   hb_subset_input_destroy (input);
   hb_face_destroy (subset);
index 1b51dc2..28cca00 100644 (file)
@@ -162,9 +162,8 @@ test_subset_invalid_hmtx (void)
   hb_set_add (codepoints, 'b');
   hb_set_add (codepoints, 'c');
 
-  subset = hb_subset (face, input);
-  g_assert (subset);
-  g_assert (subset == hb_face_get_empty ());
+  subset = hb_subset_or_fail (face, input);
+  g_assert (!subset);
 
   hb_subset_input_destroy (input);
   hb_face_destroy (subset);
index 2a6c2a9..925b743 100644 (file)
@@ -79,7 +79,7 @@ test_subset_map_HVAR_retaingids (void)
   hb_set_add (codepoints, 'a');
   hb_set_add (codepoints, 'c');
   hb_subset_input_t *input = hb_subset_test_create_input (codepoints);
-  hb_subset_input_set_retain_gids (input, true);
+  hb_subset_input_set_flags (input, HB_SUBSET_FLAGS_RETAIN_GIDS);
   face_abc_subset = hb_subset_test_create_subset (face_abc, input);
   hb_set_destroy (codepoints);
 
@@ -160,7 +160,7 @@ test_subset_identity_HVAR_retaingids (void)
   hb_set_add (codepoints, 'a');
   hb_set_add (codepoints, 'c');
   hb_subset_input_t *input = hb_subset_test_create_input (codepoints);
-  hb_subset_input_set_retain_gids (input, true);
+  hb_subset_input_set_flags (input, HB_SUBSET_FLAGS_RETAIN_GIDS);
   face_abc_subset = hb_subset_test_create_subset (face_abc, input);
   hb_set_destroy (codepoints);
 
index 2b829a3..7b526d9 100644 (file)
@@ -79,7 +79,7 @@ test_subset_VVAR_retaingids (void)
   hb_set_add (codepoints, 'a');
   hb_set_add (codepoints, 'c');
   hb_subset_input_t *input = hb_subset_test_create_input (codepoints);
-  hb_subset_input_set_retain_gids (input, true);
+  hb_subset_input_set_flags (input, HB_SUBSET_FLAGS_RETAIN_GIDS);
   face_abc_subset = hb_subset_test_create_subset (face_abc, input);
   hb_set_destroy (codepoints);
 
index 85e4fdf..27bf73c 100644 (file)
@@ -42,7 +42,7 @@ test_subset_32_tables (void)
   hb_set_add (codepoints, 'b');
   hb_set_add (codepoints, 'c');
 
-  subset = hb_subset (face, input);
+  subset = hb_subset_or_fail (face, input);
   g_assert (subset);
   g_assert (subset != hb_face_get_empty ());
 
@@ -64,9 +64,8 @@ test_subset_no_inf_loop (void)
   hb_set_add (codepoints, 'b');
   hb_set_add (codepoints, 'c');
 
-  subset = hb_subset (face, input);
-  g_assert (subset);
-  g_assert (subset == hb_face_get_empty ());
+  subset = hb_subset_or_fail (face, input);
+  g_assert (!subset);
 
   hb_subset_input_destroy (input);
   hb_face_destroy (subset);
@@ -86,15 +85,76 @@ test_subset_crash (void)
   hb_set_add (codepoints, 'b');
   hb_set_add (codepoints, 'c');
 
-  subset = hb_subset (face, input);
-  g_assert (subset);
-  g_assert (subset == hb_face_get_empty ());
+  subset = hb_subset_or_fail (face, input);
+  g_assert (!subset);
 
   hb_subset_input_destroy (input);
   hb_face_destroy (subset);
   hb_face_destroy (face);
 }
 
+static void
+test_subset_set_flags (void)
+{
+  hb_subset_input_t *input = hb_subset_input_create_or_fail ();
+
+  g_assert (hb_subset_input_get_flags (input) == HB_SUBSET_FLAGS_DEFAULT);
+
+  hb_subset_input_set_flags (input,
+                             HB_SUBSET_FLAGS_NAME_LEGACY |
+                             HB_SUBSET_FLAGS_NOTDEF_OUTLINE |
+                             HB_SUBSET_FLAGS_GLYPH_NAMES);
+
+  g_assert (hb_subset_input_get_flags (input) ==
+            (hb_subset_flags_t) (
+            HB_SUBSET_FLAGS_NAME_LEGACY |
+            HB_SUBSET_FLAGS_NOTDEF_OUTLINE |
+            HB_SUBSET_FLAGS_GLYPH_NAMES));
+
+  hb_subset_input_set_flags (input,
+                             HB_SUBSET_FLAGS_NAME_LEGACY |
+                             HB_SUBSET_FLAGS_NOTDEF_OUTLINE |
+                             HB_SUBSET_FLAGS_NO_PRUNE_UNICODE_RANGES);
+
+  g_assert (hb_subset_input_get_flags (input) ==
+            (hb_subset_flags_t) (
+            HB_SUBSET_FLAGS_NAME_LEGACY |
+            HB_SUBSET_FLAGS_NOTDEF_OUTLINE |
+            HB_SUBSET_FLAGS_NO_PRUNE_UNICODE_RANGES));
+
+
+  hb_subset_input_destroy (input);
+}
+
+
+static void
+test_subset_sets (void)
+{
+  hb_subset_input_t *input = hb_subset_input_create_or_fail ();
+  hb_set_t* set = hb_set_create ();
+
+  hb_set_add (hb_subset_input_set (input, HB_SUBSET_SETS_GLYPH_INDEX), 83);
+  hb_set_add (hb_subset_input_set (input, HB_SUBSET_SETS_UNICODE), 85);
+
+  hb_set_clear (hb_subset_input_set (input, HB_SUBSET_SETS_LAYOUT_FEATURE_TAG));
+  hb_set_add (hb_subset_input_set (input, HB_SUBSET_SETS_LAYOUT_FEATURE_TAG), 87);
+
+  hb_set_add (set, 83);
+  g_assert (hb_set_is_equal (hb_subset_input_glyph_set (input), set));
+  hb_set_clear (set);
+
+  hb_set_add (set, 85);
+  g_assert (hb_set_is_equal (hb_subset_input_unicode_set (input), set));
+  hb_set_clear (set);
+
+  hb_set_add (set, 87);
+  g_assert (hb_set_is_equal (hb_subset_input_set (input, HB_SUBSET_SETS_LAYOUT_FEATURE_TAG), set));
+  hb_set_clear (set);
+
+  hb_set_destroy (set);
+  hb_subset_input_destroy (input);
+}
+
 int
 main (int argc, char **argv)
 {
@@ -103,6 +163,8 @@ main (int argc, char **argv)
   hb_test_add (test_subset_32_tables);
   hb_test_add (test_subset_no_inf_loop);
   hb_test_add (test_subset_crash);
+  hb_test_add (test_subset_set_flags);
+  hb_test_add (test_subset_sets);
 
   return hb_test_run();
 }
index 5c1bcb1..dd1e3d0 100644 (file)
@@ -181,6 +181,9 @@ static const test_pair_t combining_class_tests_more[] =
   /* Unicode-13.0 character additions */
   {   0x1ABF, 220 },
 
+  /* Unicode-14.0 character additions */
+  {   0x1DFA, 218 },
+
   { 0x111111, 0 }
 };
 
@@ -261,6 +264,9 @@ static const test_pair_t general_category_tests_more[] =
   /* Unicode-13.0 character additions */
   {   0x08BE, HB_UNICODE_GENERAL_CATEGORY_OTHER_LETTER },
 
+  /* Unicode-14.0 character additions */
+  {   0x20C0, HB_UNICODE_GENERAL_CATEGORY_CURRENCY_SYMBOL },
+
   { 0x111111, HB_UNICODE_GENERAL_CATEGORY_UNASSIGNED }
 };
 
@@ -511,6 +517,13 @@ static const test_pair_t script_tests_more[] =
   {   0x11900, HB_SCRIPT_DIVES_AKURU },
   {   0x18B00, HB_SCRIPT_KHITAN_SMALL_SCRIPT },
 
+  /* Unicode-14.0 additions */
+  {  0x10570, HB_SCRIPT_VITHKUQI },
+  {  0x10F70, HB_SCRIPT_OLD_UYGHUR },
+  {  0x12F90, HB_SCRIPT_CYPRO_MINOAN },
+  {  0x16A70, HB_SCRIPT_TANGSA },
+  {  0x1E290, HB_SCRIPT_TOTO },
+
   { 0x111111, HB_SCRIPT_UNKNOWN }
 };
 
@@ -549,6 +562,8 @@ typedef struct {
     G_N_ELEMENTS (name##_tests_more), \
     DEFAULT \
   }
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wcast-function-type"
 static const property_t properties[] =
 {
   PROPERTY (combining_class, 0),
@@ -556,6 +571,7 @@ static const property_t properties[] =
   PROPERTY (mirroring, RETURNS_UNICODE_ITSELF),
   PROPERTY (script, (unsigned int) HB_SCRIPT_UNKNOWN)
 };
+#pragma GCC diagnostic pop
 #undef PROPERTY
 
 static void
index eab136b..f15e22c 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.16.2 from Makefile.am.
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2020 Free Software Foundation, Inc.
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -232,6 +232,8 @@ CAIRO_LIBS = @CAIRO_LIBS@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
+CHAFA_CFLAGS = @CHAFA_CFLAGS@
+CHAFA_LIBS = @CHAFA_LIBS@
 CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
 CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
 CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
@@ -260,8 +262,6 @@ ECHO_T = @ECHO_T@
 EGREP = @EGREP@
 EXEEXT = @EXEEXT@
 FGREP = @FGREP@
-FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@
-FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
 FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
 FREETYPE_DEPS = @FREETYPE_DEPS@
 FREETYPE_LIBS = @FREETYPE_LIBS@
@@ -294,7 +294,6 @@ HB_VERSION_MICRO = @HB_VERSION_MICRO@
 HB_VERSION_MINOR = @HB_VERSION_MINOR@
 HTML_DIR = @HTML_DIR@
 ICU_CFLAGS = @ICU_CFLAGS@
-ICU_CONFIG = @ICU_CONFIG@
 ICU_LIBS = @ICU_LIBS@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
@@ -400,6 +399,7 @@ pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5754958982021120 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5754958982021120
new file mode 100644 (file)
index 0000000..bc9a1c4
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5754958982021120 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-draw-fuzzer-4856957815619584 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-draw-fuzzer-4856957815619584
new file mode 100644 (file)
index 0000000..9adb779
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-draw-fuzzer-4856957815619584 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-draw-fuzzer-5103082208493568 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-draw-fuzzer-5103082208493568
new file mode 100644 (file)
index 0000000..dc419f0
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-draw-fuzzer-5103082208493568 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-draw-fuzzer-5641612227772416 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-draw-fuzzer-5641612227772416
new file mode 100644 (file)
index 0000000..094f7d3
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-draw-fuzzer-5641612227772416 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-draw-fuzzer-6231698648596480 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-draw-fuzzer-6231698648596480
new file mode 100644 (file)
index 0000000..f27e995
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-draw-fuzzer-6231698648596480 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5061207689134080 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5061207689134080
new file mode 100644 (file)
index 0000000..85ed043
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5061207689134080 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5138182937772032 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5138182937772032
new file mode 100644 (file)
index 0000000..2f2f7b8
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5138182937772032 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-4681956043390976 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-4681956043390976
new file mode 100644 (file)
index 0000000..56bc941
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-4681956043390976 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-4880059756969984 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-4880059756969984
new file mode 100644 (file)
index 0000000..0a0f649
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-4880059756969984 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-4901143794810880 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-4901143794810880
new file mode 100644 (file)
index 0000000..d6624f3
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-4901143794810880 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-4961171477233664 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-4961171477233664
new file mode 100644 (file)
index 0000000..013a859
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-4961171477233664 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-4979711393005568 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-4979711393005568
new file mode 100644 (file)
index 0000000..1d32c3b
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-4979711393005568 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5001604901240832 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5001604901240832
new file mode 100644 (file)
index 0000000..198be09
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5001604901240832 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5041767803125760 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5041767803125760
new file mode 100644 (file)
index 0000000..d23fa57
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5041767803125760 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5072358514753536 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5072358514753536
new file mode 100644 (file)
index 0000000..d3cf859
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5072358514753536 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5127321313476608 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5127321313476608
new file mode 100644 (file)
index 0000000..476e251
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5127321313476608 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5137462782066688 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5137462782066688
new file mode 100644 (file)
index 0000000..7b049ba
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5137462782066688 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5141317848530944.fuzz b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5141317848530944.fuzz
new file mode 100644 (file)
index 0000000..df578c7
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5141317848530944.fuzz differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5179935334465536 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5179935334465536
new file mode 100644 (file)
index 0000000..61e7fa1
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5179935334465536 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5181909018345472 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5181909018345472
new file mode 100644 (file)
index 0000000..250710b
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5181909018345472 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5205038086094848 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5205038086094848
new file mode 100644 (file)
index 0000000..db84504
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5205038086094848 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5229304507138048 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5229304507138048
new file mode 100644 (file)
index 0000000..d04f7d8
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5229304507138048 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5241922561114112 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5241922561114112
new file mode 100644 (file)
index 0000000..122a968
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5241922561114112 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5250795600740352 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5250795600740352
new file mode 100644 (file)
index 0000000..1c1919f
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5250795600740352 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5269686781607936 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5269686781607936
new file mode 100644 (file)
index 0000000..5c0ad79
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5269686781607936 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5345734743031808 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5345734743031808
new file mode 100644 (file)
index 0000000..193cf89
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5345734743031808 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5362189182566400 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5362189182566400
new file mode 100644 (file)
index 0000000..fb1b226
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5362189182566400 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5363902507515904 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5363902507515904
new file mode 100644 (file)
index 0000000..1ad7971
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5363902507515904 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5416421032067072 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5416421032067072
new file mode 100644 (file)
index 0000000..6b245f3
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5416421032067072 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5417934246772736 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5417934246772736
new file mode 100644 (file)
index 0000000..03ba8eb
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5417934246772736 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5422577634377728 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5422577634377728
new file mode 100644 (file)
index 0000000..aba40f1
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5422577634377728 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5443213648330752 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5443213648330752
new file mode 100644 (file)
index 0000000..0d38d6d
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5443213648330752 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5522792714993664 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5522792714993664
new file mode 100644 (file)
index 0000000..4f714f3
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5522792714993664 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5549945449480192 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5549945449480192
new file mode 100644 (file)
index 0000000..62072f1
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5549945449480192 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5609112151916544 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5609112151916544
new file mode 100644 (file)
index 0000000..0a9ce89
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5609112151916544 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5616763250278400 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5616763250278400
new file mode 100644 (file)
index 0000000..d58d3f6
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5616763250278400 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5617065093365760 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5617065093365760
new file mode 100644 (file)
index 0000000..590e6fc
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5617065093365760 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5641892164009984 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5641892164009984
new file mode 100644 (file)
index 0000000..dbf5f8c
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5641892164009984 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5661567174311936 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5661567174311936
new file mode 100644 (file)
index 0000000..fbc3f52
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5661567174311936 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5684542900535296 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5684542900535296
new file mode 100644 (file)
index 0000000..fc238c2
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5684542900535296 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5689082504806400 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5689082504806400
new file mode 100644 (file)
index 0000000..9df6922
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5689082504806400 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5707809174585344 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5707809174585344
new file mode 100644 (file)
index 0000000..fba50e5
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5707809174585344 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5708623339323392 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5708623339323392
new file mode 100644 (file)
index 0000000..4356547
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5708623339323392 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5715464591376384 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5715464591376384
new file mode 100644 (file)
index 0000000..63faabe
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5715464591376384 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5741295280848896 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5741295280848896
deleted file mode 100644 (file)
index 0c5c734..0000000
Binary files a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5741295280848896 and /dev/null differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5741735372914688 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5741735372914688
new file mode 100644 (file)
index 0000000..31ea527
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5741735372914688 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5858518134554624 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5858518134554624
new file mode 100644 (file)
index 0000000..90a743b
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5858518134554624 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5887968763052032 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5887968763052032
new file mode 100644 (file)
index 0000000..028e4b2
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5887968763052032 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5927551890096128 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5927551890096128
new file mode 100644 (file)
index 0000000..a5f5af8
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5927551890096128 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5965777994907648 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5965777994907648
new file mode 100644 (file)
index 0000000..a302c10
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5965777994907648 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5991762219892736 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5991762219892736
new file mode 100644 (file)
index 0000000..de5d90e
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5991762219892736 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6173520787800064 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6173520787800064
new file mode 100644 (file)
index 0000000..035dd72
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6173520787800064 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6231212713312256 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6231212713312256
new file mode 100644 (file)
index 0000000..3f0f045
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6231212713312256 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6241118484955136 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6241118484955136
new file mode 100644 (file)
index 0000000..6419459
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6241118484955136 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6246465148813312 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6246465148813312
new file mode 100644 (file)
index 0000000..750700f
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6246465148813312 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6254792024915968 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6254792024915968
new file mode 100644 (file)
index 0000000..9debc1d
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6254792024915968 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6315334756335616 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6315334756335616
new file mode 100644 (file)
index 0000000..a7d8dda
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6315334756335616 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6316256152780800 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6316256152780800
new file mode 100644 (file)
index 0000000..b01eb8d
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6316256152780800 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6372147008241664 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6372147008241664
new file mode 100644 (file)
index 0000000..696bd6e
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6372147008241664 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6382598554255360 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6382598554255360
new file mode 100644 (file)
index 0000000..b6aab7b
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6382598554255360 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6421315436281856 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6421315436281856
new file mode 100644 (file)
index 0000000..3d883bd
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6421315436281856 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6616166961905664 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6616166961905664
new file mode 100644 (file)
index 0000000..35b6479
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6616166961905664 differ
diff --git a/test/fuzzing/fonts/crash-d223bc42a8226c4d655c417d63d9a76760d05985 b/test/fuzzing/fonts/crash-d223bc42a8226c4d655c417d63d9a76760d05985
new file mode 100644 (file)
index 0000000..8795db1
Binary files /dev/null and b/test/fuzzing/fonts/crash-d223bc42a8226c4d655c417d63d9a76760d05985 differ
diff --git a/test/fuzzing/fonts/leak-34f1798a142fd0dfdd71a96fb6aa7de19a62865e b/test/fuzzing/fonts/leak-34f1798a142fd0dfdd71a96fb6aa7de19a62865e
new file mode 100644 (file)
index 0000000..0726b93
Binary files /dev/null and b/test/fuzzing/fonts/leak-34f1798a142fd0dfdd71a96fb6aa7de19a62865e differ
index 1baefda..772a358 100644 (file)
@@ -113,8 +113,10 @@ static void misc_calls_for_gid (hb_face_t *face, hb_font_t *font, hb_set_t *set,
   hb_ot_math_get_glyph_assembly (font, cp, HB_DIRECTION_BTT, 0, nullptr, nullptr, nullptr);
 }
 
-extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
+extern "C" int LLVMFuzzerTestOneInput (const uint8_t *data, size_t size)
 {
+  alloc_state = size; /* see src/failing-alloc.c */
+
   hb_blob_t *blob = hb_blob_create ((const char *) data, size,
                                    HB_MEMORY_MODE_READONLY, nullptr, nullptr);
   hb_face_t *face = hb_face_create (blob, 0);
index d0c617e..52e00dd 100644 (file)
@@ -1,4 +1,18 @@
 #include <hb.h>
 #include <stddef.h>
 
-extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size);
+extern "C" int LLVMFuzzerTestOneInput (const uint8_t *data, size_t size);
+
+#if defined(__GNUC__) && (__GNUC__ >= 4) || (__clang__)
+#define HB_UNUSED      __attribute__((unused))
+#else
+#define HB_UNUSED
+#endif
+
+#ifdef HB_IS_IN_FUZZER
+/* See src/failing-alloc.c */
+extern "C" int alloc_state;
+#else
+/* Just a dummy global variable */
+static int HB_UNUSED alloc_state = 0;
+#endif
index d5e5d0e..613699f 100644 (file)
@@ -7,6 +7,12 @@
 
 #include "hb.h"
 
+// Only allow ~5,000 set values between the two input sets.
+// Arbitrarily long input sets do not trigger any meaningful
+// differences in behaviour so there's no benefit from allowing
+// the fuzzer to create super large sets.
+#define MAX_INPUT_SIZE 20000
+
 enum set_operation_t : uint8_t
 {
   INTERSECT = 0,
@@ -32,10 +38,18 @@ static hb_set_t *create_set (const uint32_t *value_array, int count)
 
 extern "C" int LLVMFuzzerTestOneInput (const uint8_t *data, size_t size)
 {
+  alloc_state = size; /* see src/failing-alloc.c */
+
   if (size < sizeof (instructions_t))
     return 0;
 
+  if (size > MAX_INPUT_SIZE)
+    return 0;
+
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wstrict-aliasing"
   const instructions_t &instructions = reinterpret_cast<const instructions_t &> (data);
+#pragma GCC diagnostic pop
   data += sizeof (instructions_t);
   size -= sizeof (instructions_t);
 
index eb03132..0022a89 100644 (file)
@@ -9,8 +9,10 @@
 #include "../api/test-ot-face.c"
 #undef TEST_OT_FACE_NO_MAIN
 
-extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
+extern "C" int LLVMFuzzerTestOneInput (const uint8_t *data, size_t size)
 {
+  alloc_state = size; /* see src/failing-alloc.c */
+
   hb_blob_t *blob = hb_blob_create ((const char *)data, size,
                                    HB_MEMORY_MODE_READONLY, nullptr, nullptr);
   hb_face_t *face = hb_face_create (blob, 0);
@@ -31,6 +33,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
   {
     const char text[] = "ABCDEXYZ123@_%&)*$!";
     hb_buffer_t *buffer = hb_buffer_create ();
+ //   hb_buffer_set_flags (buffer, HB_BUFFER_FLAG_VERIFY);
     hb_buffer_add_utf8 (buffer, text, -1, 0, -1);
     hb_buffer_guess_segment_properties (buffer);
     hb_shape (font, buffer, nullptr, 0);
@@ -42,17 +45,18 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
   if (size < len)
     len = size;
   if (len)
-    memcpy(text32, data + size - len, len);
+    memcpy (text32, data + size - len, len);
+
+  /* Misc calls on font. */
+  text32[10] = test_font (font, text32[15]) % 256;
 
   hb_buffer_t *buffer = hb_buffer_create ();
+//  hb_buffer_set_flags (buffer, HB_BUFFER_FLAG_VERIFY);
   hb_buffer_add_utf32 (buffer, text32, sizeof (text32) / sizeof (text32[0]), 0, -1);
   hb_buffer_guess_segment_properties (buffer);
   hb_shape (font, buffer, nullptr, 0);
   hb_buffer_destroy (buffer);
 
-  /* Misc calls on font. */
-  test_font (font, text32[15]);
-
   hb_font_destroy (font);
   hb_face_destroy (face);
   hb_blob_destroy (blob);
index 428765e..fa95c87 100644 (file)
@@ -11,28 +11,20 @@ static void
 trySubset (hb_face_t *face,
           const hb_codepoint_t text[],
           int text_length,
-          bool drop_hints,
-          bool drop_layout,
-          bool retain_gids)
+           unsigned flag_bits)
 {
   hb_subset_input_t *input = hb_subset_input_create_or_fail ();
-  hb_subset_input_set_drop_hints (input, drop_hints);
-  hb_subset_input_set_retain_gids (input, retain_gids);
-  hb_set_t *codepoints = hb_subset_input_unicode_set (input);
+  if (!input) return;
 
-  if (!drop_layout)
-  {
-    hb_set_del (hb_subset_input_drop_tables_set (input), HB_TAG ('G', 'S', 'U', 'B'));
-    hb_set_del (hb_subset_input_drop_tables_set (input), HB_TAG ('G', 'P', 'O', 'S'));
-    hb_set_del (hb_subset_input_drop_tables_set (input), HB_TAG ('G', 'D', 'E', 'F'));
-  }
+  hb_subset_input_set_flags (input, (hb_subset_flags_t) flag_bits);
+
+  hb_set_t *codepoints = hb_subset_input_unicode_set (input);
 
   for (int i = 0; i < text_length; i++)
-  {
     hb_set_add (codepoints, text[i]);
-  }
 
-  hb_face_t *result = hb_subset (face, input);
+  hb_face_t *result = hb_subset_or_fail (face, input);
+  if (result)
   {
     hb_blob_t *blob = hb_face_reference_blob (result);
     unsigned int length;
@@ -51,31 +43,20 @@ trySubset (hb_face_t *face,
   hb_subset_input_destroy (input);
 }
 
-static void
-trySubset (hb_face_t *face,
-          const hb_codepoint_t text[],
-          int text_length,
-          const uint8_t flags[1])
+extern "C" int LLVMFuzzerTestOneInput (const uint8_t *data, size_t size)
 {
-  bool drop_hints =  flags[0] & (1 << 0);
-  bool drop_layout = flags[0] & (1 << 1);
-  bool retain_gids = flags[0] & (1 << 2);
-  trySubset (face, text, text_length,
-            drop_hints, drop_layout, retain_gids);
-}
+  alloc_state = size; /* see src/failing-alloc.c */
 
-extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
-{
-  hb_blob_t *blob = hb_blob_create ((const char *)data, size,
+  hb_blob_t *blob = hb_blob_create ((const char *) data, size,
                                    HB_MEMORY_MODE_READONLY, nullptr, nullptr);
   hb_face_t *face = hb_face_create (blob, 0);
 
   /* Just test this API here quickly. */
-  hb_set_t *output = hb_set_create();
+  hb_set_t *output = hb_set_create ();
   hb_face_collect_unicodes (face, output);
   hb_set_destroy (output);
 
-  uint8_t flags[1] = {0};
+  unsigned flags = HB_SUBSET_FLAGS_DEFAULT;
   const hb_codepoint_t text[] =
       {
        'A', 'B', 'C', 'D', 'E', 'X', 'Y', 'Z', '1', '2',
@@ -85,14 +66,14 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
   trySubset (face, text, sizeof (text) / sizeof (hb_codepoint_t), flags);
 
   hb_codepoint_t text_from_data[16];
-  if (size > sizeof(text_from_data) + sizeof(flags)) {
+  if (size > sizeof (text_from_data) + sizeof (flags)) {
     memcpy (text_from_data,
-           data + size - sizeof(text_from_data),
-           sizeof(text_from_data));
+           data + size - sizeof (text_from_data),
+           sizeof (text_from_data));
 
-    memcpy (flags,
-           data + size - sizeof(text_from_data) - sizeof(flags),
-           sizeof(flags));
+    memcpy (&flags,
+           data + size - sizeof (text_from_data) - sizeof (flags),
+           sizeof (flags));
     unsigned int text_size = sizeof (text_from_data) / sizeof (hb_codepoint_t);
 
     trySubset (face, text_from_data, text_size, flags);
index 9e892eb..3024eb5 100644 (file)
@@ -1,16 +1,18 @@
 #include "hb-fuzzer.hh"
 
-#include <stdio.h>
+#include <cassert>
+#include <cstdio>
 
 int main (int argc, char **argv)
 {
   for (int i = 1; i < argc; i++)
   {
-    hb_blob_t *blob = hb_blob_create_from_file (argv[i]);
+    hb_blob_t *blob = hb_blob_create_from_file_or_fail (argv[i]);
+    assert (blob);
 
-    unsigned int len;
+    unsigned len = 0;
     const char *font_data = hb_blob_get_data (blob, &len);
-    printf ("%s%s\n", argv[i], len ? "" : " (note: not found or was empty)");
+    printf ("%s (%u bytes)\n", argv[i], len);
 
     LLVMFuzzerTestOneInput ((const uint8_t *) font_data, len);
 
index 712b97d..3aba9eb 100644 (file)
@@ -6,12 +6,23 @@ tests = [
 ]
 
 foreach file_name : tests
-  test_name = file_name.split('.')[0].underscorify()
+  test_name = file_name.split('.')[0]
 
-  exe = executable(test_name, [file_name, 'main.cc'],
-    cpp_args: cpp_args,
+  sources = [file_name]
+  fuzzer_ldflags = []
+  extra_cpp_args = []
+
+  if get_option('fuzzer_ldflags') == ''
+    sources += 'main.cc'
+  else
+    fuzzer_ldflags += get_option('fuzzer_ldflags').split()
+    extra_cpp_args += '-DHB_IS_IN_FUZZER'
+  endif
+
+  exe = executable(test_name, sources,
+    cpp_args: cpp_args + extra_cpp_args,
     include_directories: [incconfig, incsrc],
-    dependencies: deps,
+    link_args: fuzzer_ldflags,
     link_with: [libharfbuzz, libharfbuzz_subset],
     install: false,
   )
@@ -20,16 +31,16 @@ endforeach
 
 env = environment()
 env.set('srcdir', meson.current_source_dir())
-env.set('HB_TEST_SUBSET_FUZZER_TIMEOUT', '36')
 
 test('shape_fuzzer', find_program('run-shape-fuzzer-tests.py'),
   args: [
     hb_shape_fuzzer_exe,
   ],
+  timeout: 300,
   depends: [hb_shape_fuzzer_exe, libharfbuzz, libharfbuzz_subset],
   workdir: meson.current_build_dir() / '..' / '..',
   env: env,
-  suite: ['fuzzing'],
+  suite: ['fuzzing', 'slow'],
 )
 
 test('subset_fuzzer', find_program('run-subset-fuzzer-tests.py'),
@@ -41,7 +52,7 @@ test('subset_fuzzer', find_program('run-subset-fuzzer-tests.py'),
   timeout: 300,
   workdir: meson.current_build_dir() / '..' / '..',
   env: env,
-  suite: ['fuzzing'],
+  suite: ['fuzzing', 'slow'],
 )
 
 test('draw_fuzzer', find_program('run-draw-fuzzer-tests.py'),
index 7f40cf8..8b5a2e8 100755 (executable)
@@ -9,7 +9,7 @@ def cmd (command):
                p = subprocess.Popen (command, stderr=tempf)
 
                try:
-                       p.wait (timeout=int (os.environ.get ("HB_TEST_SHAPE_FUZZER_TIMEOUT", "2")))
+                       p.wait ()
                        tempf.seek (0)
                        text = tempf.read ()
 
@@ -21,9 +21,9 @@ def cmd (command):
                        return 'error: timeout, ' + ' '.join (command), 1
 
 
-srcdir = os.environ.get ("srcdir", ".")
-EXEEXT = os.environ.get ("EXEEXT", "")
-top_builddir = os.environ.get ("top_builddir", ".")
+srcdir = os.getenv ("srcdir", ".")
+EXEEXT = os.getenv ("EXEEXT", "")
+top_builddir = os.getenv ("top_builddir", ".")
 hb_draw_fuzzer = os.path.join (top_builddir, "hb-draw-fuzzer" + EXEEXT)
 
 if not os.path.exists (hb_draw_fuzzer):
@@ -36,15 +36,11 @@ please provide it as the first argument to the tool""")
 print ('hb_draw_fuzzer:', hb_draw_fuzzer)
 fails = 0
 
-libtool = os.environ.get ('LIBTOOL')
 valgrind = None
-if os.environ.get ('RUN_VALGRIND', ''):
+if os.getenv ('RUN_VALGRIND', ''):
        valgrind = shutil.which ('valgrind')
        if valgrind is None:
                sys.exit ("""Valgrind requested but not found.""")
-       if libtool is None:
-               print ("""Valgrind support is currently autotools only and needs libtool but not found.""")
-
 
 parent_path = os.path.join (srcdir, "fonts")
 for file in os.listdir (parent_path):
@@ -52,7 +48,7 @@ for file in os.listdir (parent_path):
        path = os.path.join (parent_path, file)
 
        if valgrind:
-               text, returncode = cmd (libtool.split(' ') + ['--mode=execute', valgrind + ' --leak-check=full --error-exitcode=1', '--', hb_draw_fuzzer, path])
+               text, returncode = cmd ([valgrind, '--leak-check=full', '--error-exitcode=1', hb_draw_fuzzer, path])
        else:
                text, returncode = cmd ([hb_draw_fuzzer, path])
                if 'error' in text:
index 7e2ef22..382f609 100755 (executable)
@@ -9,7 +9,7 @@ def cmd (command):
                p = subprocess.Popen (command, stderr=tempf)
 
                try:
-                       p.wait (timeout=int (os.environ.get ("HB_TEST_SHAPE_FUZZER_TIMEOUT", "2")))
+                       p.wait ()
                        tempf.seek (0)
                        text = tempf.read ()
 
@@ -21,9 +21,9 @@ def cmd (command):
                        return 'error: timeout, ' + ' '.join (command), 1
 
 
-srcdir = os.environ.get ("srcdir", ".")
-EXEEXT = os.environ.get ("EXEEXT", "")
-top_builddir = os.environ.get ("top_builddir", ".")
+srcdir = os.getenv ("srcdir", ".")
+EXEEXT = os.getenv ("EXEEXT", "")
+top_builddir = os.getenv ("top_builddir", ".")
 hb_shape_fuzzer = os.path.join (top_builddir, "hb-shape-fuzzer" + EXEEXT)
 
 if not os.path.exists (hb_shape_fuzzer):
@@ -36,22 +36,18 @@ please provide it as the first argument to the tool""")
 print ('hb_shape_fuzzer:', hb_shape_fuzzer)
 fails = 0
 
-libtool = os.environ.get ('LIBTOOL')
 valgrind = None
-if os.environ.get ('RUN_VALGRIND', ''):
+if os.getenv ('RUN_VALGRIND', ''):
        valgrind = shutil.which ('valgrind')
        if valgrind is None:
                sys.exit ("""Valgrind requested but not found.""")
-       if libtool is None:
-               print ("""Valgrind support is currently autotools only and needs libtool but not found.""")
-
 
 parent_path = os.path.join (srcdir, "fonts")
 for file in os.listdir (parent_path):
        path = os.path.join (parent_path, file)
 
        if valgrind:
-               text, returncode = cmd (libtool.split(' ') + ['--mode=execute', valgrind + ' --leak-check=full --error-exitcode=1', '--', hb_shape_fuzzer, path])
+               text, returncode = cmd ([valgrind, '--leak-check=full', '--error-exitcode=1', hb_shape_fuzzer, path])
        else:
                text, returncode = cmd ([hb_shape_fuzzer, path])
                if 'error' in text:
index 5fd547d..da7d1e5 100755 (executable)
@@ -9,7 +9,7 @@ def cmd (command):
                p = subprocess.Popen (command, stderr=tempf)
 
                try:
-                       p.wait (timeout=int (os.environ.get ("HB_TEST_SUBSET_FUZZER_TIMEOUT", "12")))
+                       p.wait ()
                        tempf.seek (0)
                        text = tempf.read ()
 
@@ -21,9 +21,9 @@ def cmd (command):
                        return 'error: timeout, ' + ' '.join (command), 1
 
 
-srcdir = os.environ.get ("srcdir", ".")
-EXEEXT = os.environ.get ("EXEEXT", "")
-top_builddir = os.environ.get ("top_builddir", ".")
+srcdir = os.getenv ("srcdir", ".")
+EXEEXT = os.getenv ("EXEEXT", "")
+top_builddir = os.getenv ("top_builddir", ".")
 hb_subset_fuzzer = os.path.join (top_builddir, "hb-subset-fuzzer" + EXEEXT)
 
 if not os.path.exists (hb_subset_fuzzer):
@@ -36,15 +36,11 @@ please provide it as the first argument to the tool""")
 print ('hb_subset_fuzzer:', hb_subset_fuzzer)
 fails = 0
 
-libtool = os.environ.get('LIBTOOL')
 valgrind = None
-if os.environ.get('RUN_VALGRIND', ''):
+if os.getenv ('RUN_VALGRIND', ''):
        valgrind = shutil.which ('valgrind')
        if valgrind is None:
                sys.exit ("""Valgrind requested but not found.""")
-       if libtool is None:
-               print ("""Valgrind support is currently autotools only and needs libtool but not found.""")
-
 
 def run_dir (parent_path):
        global fails
@@ -55,7 +51,7 @@ def run_dir (parent_path):
 
                print ("running subset fuzzer against %s" % path)
                if valgrind:
-                       text, returncode = cmd (libtool.split(' ') + ['--mode=execute', valgrind + ' --leak-check=full --show-leak-kinds=all --error-exitcode=1', '--', hb_subset_fuzzer, path])
+                       text, returncode = cmd ([valgrind, '--leak-check=full', '--error-exitcode=1', hb_subset_fuzzer, path])
                else:
                        text, returncode = cmd ([hb_subset_fuzzer, path])
                        if 'error' in text:
index c3a2002..8b4b83f 100644 (file)
@@ -1,4 +1,4 @@
 subdir('api')
-subdir('fuzzing')
-subdir('shaping')
+subdir('shape')
 subdir('subset')
+subdir('fuzzing')
diff --git a/test/shape/Makefile.in b/test/shape/Makefile.in
new file mode 100644 (file)
index 0000000..463e19f
--- /dev/null
@@ -0,0 +1,720 @@
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Process this file with automake to produce Makefile.in
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = test/shape
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_link_flag.m4 \
+       $(top_srcdir)/m4/ax_code_coverage.m4 \
+       $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \
+       $(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/gtk-doc.m4 \
+       $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
+       $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+       $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+       ctags-recursive dvi-recursive html-recursive info-recursive \
+       install-data-recursive install-dvi-recursive \
+       install-exec-recursive install-html-recursive \
+       install-info-recursive install-pdf-recursive \
+       install-ps-recursive install-recursive installcheck-recursive \
+       installdirs-recursive pdf-recursive ps-recursive \
+       tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive        \
+  distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+  $(RECURSIVE_TARGETS) \
+  $(RECURSIVE_CLEAN_TARGETS) \
+  $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+       distdir distdir-am
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+am__DIST_COMMON = $(srcdir)/Makefile.in
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CAIRO_CFLAGS = @CAIRO_CFLAGS@
+CAIRO_FT_CFLAGS = @CAIRO_FT_CFLAGS@
+CAIRO_FT_LIBS = @CAIRO_FT_LIBS@
+CAIRO_LIBS = @CAIRO_LIBS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHAFA_CFLAGS = @CHAFA_CFLAGS@
+CHAFA_LIBS = @CHAFA_LIBS@
+CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
+CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
+CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
+CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
+CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
+CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
+CORETEXT_CFLAGS = @CORETEXT_CFLAGS@
+CORETEXT_LIBS = @CORETEXT_LIBS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DIRECTWRITE_CXXFLAGS = @DIRECTWRITE_CXXFLAGS@
+DIRECTWRITE_LIBS = @DIRECTWRITE_LIBS@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
+FREETYPE_DEPS = @FREETYPE_DEPS@
+FREETYPE_LIBS = @FREETYPE_LIBS@
+GCOV = @GCOV@
+GDI_CFLAGS = @GDI_CFLAGS@
+GDI_LIBS = @GDI_LIBS@
+GENHTML = @GENHTML@
+GIT = @GIT@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_DEPS = @GLIB_DEPS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GOBJECT_CFLAGS = @GOBJECT_CFLAGS@
+GOBJECT_LIBS = @GOBJECT_LIBS@
+GRAPHITE2_CFLAGS = @GRAPHITE2_CFLAGS@
+GRAPHITE2_DEPS = @GRAPHITE2_DEPS@
+GRAPHITE2_LIBS = @GRAPHITE2_LIBS@
+GREP = @GREP@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@
+GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
+GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
+GTKDOC_MKPDF = @GTKDOC_MKPDF@
+GTKDOC_REBASE = @GTKDOC_REBASE@
+HAVE_CXX11 = @HAVE_CXX11@
+HB_LIBTOOL_VERSION_INFO = @HB_LIBTOOL_VERSION_INFO@
+HB_VERSION = @HB_VERSION@
+HB_VERSION_MAJOR = @HB_VERSION_MAJOR@
+HB_VERSION_MICRO = @HB_VERSION_MICRO@
+HB_VERSION_MINOR = @HB_VERSION_MINOR@
+HTML_DIR = @HTML_DIR@
+ICU_CFLAGS = @ICU_CFLAGS@
+ICU_LIBS = @ICU_LIBS@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+LCOV = @LCOV@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
+RAGEL = @RAGEL@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+UNISCRIBE_CFLAGS = @UNISCRIBE_CFLAGS@
+UNISCRIBE_LIBS = @UNISCRIBE_LIBS@
+VERSION = @VERSION@
+_GI_EXP_DATADIR = @_GI_EXP_DATADIR@
+_GI_EXP_LIBDIR = @_GI_EXP_LIBDIR@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+have_gobject = @have_gobject@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+NULL = 
+
+# TODO Figure out Python stuff
+EXTRA_DIST = README.md meson.build hb-diff hb-diff-colorize \
+       hb-diff-filter-failures hb-diff-stat hb-unicode-decode \
+       hb-unicode-encode hb-unicode-prettyname record-test.sh \
+       run-tests.py texts/in-house $(NULL) hb_test_tools.py $(NULL)
+CLEANFILES = hb_test_tools.py[co] $(NULL)
+DISTCLEANFILES = 
+MAINTAINERCLEANFILES = 
+SUBDIRS = data
+all: all-recursive
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+               && { if test -f $@; then exit 0; else break; fi; }; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits test/shape/Makefile'; \
+       $(am__cd) $(top_srcdir) && \
+         $(AUTOMAKE) --gnits test/shape/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+       esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+       -rm -f *.lo
+
+clean-libtool:
+       -rm -rf .libs _libs
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+#     (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+       @fail=; \
+       if $(am__make_keepgoing); then \
+         failcom='fail=yes'; \
+       else \
+         failcom='exit 1'; \
+       fi; \
+       dot_seen=no; \
+       target=`echo $@ | sed s/-recursive//`; \
+       case "$@" in \
+         distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+         *) list='$(SUBDIRS)' ;; \
+       esac; \
+       for subdir in $$list; do \
+         echo "Making $$target in $$subdir"; \
+         if test "$$subdir" = "."; then \
+           dot_seen=yes; \
+           local_target="$$target-am"; \
+         else \
+           local_target="$$target"; \
+         fi; \
+         ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+         || eval $$failcom; \
+       done; \
+       if test "$$dot_seen" = "no"; then \
+         $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+       fi; test -z "$$fail"
+
+ID: $(am__tagged_files)
+       $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+       set x; \
+       here=`pwd`; \
+       if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+         include_option=--etags-include; \
+         empty_fix=.; \
+       else \
+         include_option=--include; \
+         empty_fix=; \
+       fi; \
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         if test "$$subdir" = .; then :; else \
+           test ! -f $$subdir/TAGS || \
+             set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+         fi; \
+       done; \
+       $(am__define_uniq_tagged_files); \
+       shift; \
+       if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+         test -n "$$unique" || unique=$$empty_fix; \
+         if test $$# -gt 0; then \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             "$$@" $$unique; \
+         else \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             $$unique; \
+         fi; \
+       fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+       $(am__define_uniq_tagged_files); \
+       test -z "$(CTAGS_ARGS)$$unique" \
+         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+            $$unique
+
+GTAGS:
+       here=`$(am__cd) $(top_builddir) && pwd` \
+         && $(am__cd) $(top_srcdir) \
+         && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+       list='$(am__tagged_files)'; \
+       case "$(srcdir)" in \
+         [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+         *) sdir=$(subdir)/$(srcdir) ;; \
+       esac; \
+       for i in $$list; do \
+         if test -f "$$i"; then \
+           echo "$(subdir)/$$i"; \
+         else \
+           echo "$$sdir/$$i"; \
+         fi; \
+       done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       list='$(DISTFILES)'; \
+         dist_files=`for file in $$list; do echo $$file; done | \
+         sed -e "s|^$$srcdirstrip/||;t" \
+             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+       case $$dist_files in \
+         */*) $(MKDIR_P) `echo "$$dist_files" | \
+                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+                          sort -u` ;; \
+       esac; \
+       for file in $$dist_files; do \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         if test -d $$d/$$file; then \
+           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+           if test -d "$(distdir)/$$file"; then \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+         else \
+           test -f "$(distdir)/$$file" \
+           || cp -p $$d/$$file "$(distdir)/$$file" \
+           || exit 1; \
+         fi; \
+       done
+       @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+         if test "$$subdir" = .; then :; else \
+           $(am__make_dryrun) \
+             || test -d "$(distdir)/$$subdir" \
+             || $(MKDIR_P) "$(distdir)/$$subdir" \
+             || exit 1; \
+           dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+           $(am__relativize); \
+           new_distdir=$$reldir; \
+           dir1=$$subdir; dir2="$(top_distdir)"; \
+           $(am__relativize); \
+           new_top_distdir=$$reldir; \
+           echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+           echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+           ($(am__cd) $$subdir && \
+             $(MAKE) $(AM_MAKEFLAGS) \
+               top_distdir="$$new_top_distdir" \
+               distdir="$$new_distdir" \
+               am__remove_distdir=: \
+               am__skip_length_check=: \
+               am__skip_mode_fix=: \
+               distdir) \
+             || exit 1; \
+         fi; \
+       done
+check-am: all-am
+check: check-recursive
+all-am: Makefile
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
+mostlyclean-generic:
+
+clean-generic:
+       -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+       -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+       -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+clean: clean-recursive
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+       -rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: $(am__recursive_targets) install-am install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
+       check-am clean clean-generic clean-libtool cscopelist-am ctags \
+       ctags-am distclean distclean-generic distclean-libtool \
+       distclean-tags distdir dvi dvi-am html html-am info info-am \
+       install install-am install-data install-data-am install-dvi \
+       install-dvi-am install-exec install-exec-am install-html \
+       install-html-am install-info install-info-am install-man \
+       install-pdf install-pdf-am install-ps install-ps-am \
+       install-strip installcheck installcheck-am installdirs \
+       installdirs-am maintainer-clean maintainer-clean-generic \
+       mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
+       ps ps-am tags tags-am uninstall uninstall-am
+
+.PRECIOUS: Makefile
+
+
+# Convenience targets:
+lib:
+       @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
+libs:
+       @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libs
+
+-include $(top_srcdir)/git.mk
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
similarity index 100%
rename from test/shaping/README.md
rename to test/shape/README.md
diff --git a/test/shape/data/Makefile.in b/test/shape/data/Makefile.in
new file mode 100644 (file)
index 0000000..28fade0
--- /dev/null
@@ -0,0 +1,711 @@
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Process this file with automake to produce Makefile.in
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = test/shape/data
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_link_flag.m4 \
+       $(top_srcdir)/m4/ax_code_coverage.m4 \
+       $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \
+       $(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/gtk-doc.m4 \
+       $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
+       $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+       $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+       ctags-recursive dvi-recursive html-recursive info-recursive \
+       install-data-recursive install-dvi-recursive \
+       install-exec-recursive install-html-recursive \
+       install-info-recursive install-pdf-recursive \
+       install-ps-recursive install-recursive installcheck-recursive \
+       installdirs-recursive pdf-recursive ps-recursive \
+       tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive        \
+  distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+  $(RECURSIVE_TARGETS) \
+  $(RECURSIVE_CLEAN_TARGETS) \
+  $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+       distdir distdir-am
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+am__DIST_COMMON = $(srcdir)/Makefile.in
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CAIRO_CFLAGS = @CAIRO_CFLAGS@
+CAIRO_FT_CFLAGS = @CAIRO_FT_CFLAGS@
+CAIRO_FT_LIBS = @CAIRO_FT_LIBS@
+CAIRO_LIBS = @CAIRO_LIBS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHAFA_CFLAGS = @CHAFA_CFLAGS@
+CHAFA_LIBS = @CHAFA_LIBS@
+CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
+CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
+CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
+CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
+CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
+CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
+CORETEXT_CFLAGS = @CORETEXT_CFLAGS@
+CORETEXT_LIBS = @CORETEXT_LIBS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DIRECTWRITE_CXXFLAGS = @DIRECTWRITE_CXXFLAGS@
+DIRECTWRITE_LIBS = @DIRECTWRITE_LIBS@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
+FREETYPE_DEPS = @FREETYPE_DEPS@
+FREETYPE_LIBS = @FREETYPE_LIBS@
+GCOV = @GCOV@
+GDI_CFLAGS = @GDI_CFLAGS@
+GDI_LIBS = @GDI_LIBS@
+GENHTML = @GENHTML@
+GIT = @GIT@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_DEPS = @GLIB_DEPS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GOBJECT_CFLAGS = @GOBJECT_CFLAGS@
+GOBJECT_LIBS = @GOBJECT_LIBS@
+GRAPHITE2_CFLAGS = @GRAPHITE2_CFLAGS@
+GRAPHITE2_DEPS = @GRAPHITE2_DEPS@
+GRAPHITE2_LIBS = @GRAPHITE2_LIBS@
+GREP = @GREP@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@
+GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
+GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
+GTKDOC_MKPDF = @GTKDOC_MKPDF@
+GTKDOC_REBASE = @GTKDOC_REBASE@
+HAVE_CXX11 = @HAVE_CXX11@
+HB_LIBTOOL_VERSION_INFO = @HB_LIBTOOL_VERSION_INFO@
+HB_VERSION = @HB_VERSION@
+HB_VERSION_MAJOR = @HB_VERSION_MAJOR@
+HB_VERSION_MICRO = @HB_VERSION_MICRO@
+HB_VERSION_MINOR = @HB_VERSION_MINOR@
+HTML_DIR = @HTML_DIR@
+ICU_CFLAGS = @ICU_CFLAGS@
+ICU_LIBS = @ICU_LIBS@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+LCOV = @LCOV@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
+RAGEL = @RAGEL@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+UNISCRIBE_CFLAGS = @UNISCRIBE_CFLAGS@
+UNISCRIBE_LIBS = @UNISCRIBE_LIBS@
+VERSION = @VERSION@
+_GI_EXP_DATADIR = @_GI_EXP_DATADIR@
+_GI_EXP_LIBDIR = @_GI_EXP_LIBDIR@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+have_gobject = @have_gobject@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+NULL = 
+SUBDIRS = \
+       in-house \
+       text-rendering-tests \
+       aots \
+       $(NULL)
+
+all: all-recursive
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+               && { if test -f $@; then exit 0; else break; fi; }; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits test/shape/data/Makefile'; \
+       $(am__cd) $(top_srcdir) && \
+         $(AUTOMAKE) --gnits test/shape/data/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+       esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+       -rm -f *.lo
+
+clean-libtool:
+       -rm -rf .libs _libs
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+#     (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+       @fail=; \
+       if $(am__make_keepgoing); then \
+         failcom='fail=yes'; \
+       else \
+         failcom='exit 1'; \
+       fi; \
+       dot_seen=no; \
+       target=`echo $@ | sed s/-recursive//`; \
+       case "$@" in \
+         distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+         *) list='$(SUBDIRS)' ;; \
+       esac; \
+       for subdir in $$list; do \
+         echo "Making $$target in $$subdir"; \
+         if test "$$subdir" = "."; then \
+           dot_seen=yes; \
+           local_target="$$target-am"; \
+         else \
+           local_target="$$target"; \
+         fi; \
+         ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+         || eval $$failcom; \
+       done; \
+       if test "$$dot_seen" = "no"; then \
+         $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+       fi; test -z "$$fail"
+
+ID: $(am__tagged_files)
+       $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+       set x; \
+       here=`pwd`; \
+       if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+         include_option=--etags-include; \
+         empty_fix=.; \
+       else \
+         include_option=--include; \
+         empty_fix=; \
+       fi; \
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         if test "$$subdir" = .; then :; else \
+           test ! -f $$subdir/TAGS || \
+             set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+         fi; \
+       done; \
+       $(am__define_uniq_tagged_files); \
+       shift; \
+       if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+         test -n "$$unique" || unique=$$empty_fix; \
+         if test $$# -gt 0; then \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             "$$@" $$unique; \
+         else \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             $$unique; \
+         fi; \
+       fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+       $(am__define_uniq_tagged_files); \
+       test -z "$(CTAGS_ARGS)$$unique" \
+         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+            $$unique
+
+GTAGS:
+       here=`$(am__cd) $(top_builddir) && pwd` \
+         && $(am__cd) $(top_srcdir) \
+         && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+       list='$(am__tagged_files)'; \
+       case "$(srcdir)" in \
+         [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+         *) sdir=$(subdir)/$(srcdir) ;; \
+       esac; \
+       for i in $$list; do \
+         if test -f "$$i"; then \
+           echo "$(subdir)/$$i"; \
+         else \
+           echo "$$sdir/$$i"; \
+         fi; \
+       done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       list='$(DISTFILES)'; \
+         dist_files=`for file in $$list; do echo $$file; done | \
+         sed -e "s|^$$srcdirstrip/||;t" \
+             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+       case $$dist_files in \
+         */*) $(MKDIR_P) `echo "$$dist_files" | \
+                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+                          sort -u` ;; \
+       esac; \
+       for file in $$dist_files; do \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         if test -d $$d/$$file; then \
+           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+           if test -d "$(distdir)/$$file"; then \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+         else \
+           test -f "$(distdir)/$$file" \
+           || cp -p $$d/$$file "$(distdir)/$$file" \
+           || exit 1; \
+         fi; \
+       done
+       @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+         if test "$$subdir" = .; then :; else \
+           $(am__make_dryrun) \
+             || test -d "$(distdir)/$$subdir" \
+             || $(MKDIR_P) "$(distdir)/$$subdir" \
+             || exit 1; \
+           dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+           $(am__relativize); \
+           new_distdir=$$reldir; \
+           dir1=$$subdir; dir2="$(top_distdir)"; \
+           $(am__relativize); \
+           new_top_distdir=$$reldir; \
+           echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+           echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+           ($(am__cd) $$subdir && \
+             $(MAKE) $(AM_MAKEFLAGS) \
+               top_distdir="$$new_top_distdir" \
+               distdir="$$new_distdir" \
+               am__remove_distdir=: \
+               am__skip_length_check=: \
+               am__skip_mode_fix=: \
+               distdir) \
+             || exit 1; \
+         fi; \
+       done
+check-am: all-am
+check: check-recursive
+all-am: Makefile
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+       -rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: $(am__recursive_targets) install-am install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
+       check-am clean clean-generic clean-libtool cscopelist-am ctags \
+       ctags-am distclean distclean-generic distclean-libtool \
+       distclean-tags distdir dvi dvi-am html html-am info info-am \
+       install install-am install-data install-data-am install-dvi \
+       install-dvi-am install-exec install-exec-am install-html \
+       install-html-am install-info install-info-am install-man \
+       install-pdf install-pdf-am install-ps install-ps-am \
+       install-strip installcheck installcheck-am installdirs \
+       installdirs-am maintainer-clean maintainer-clean-generic \
+       mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
+       ps ps-am tags tags-am uninstall uninstall-am
+
+.PRECIOUS: Makefile
+
+
+# Convenience targets:
+lib:
+       @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
+
+-include $(top_srcdir)/git.mk
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/test/shape/data/aots/Makefile.am b/test/shape/data/aots/Makefile.am
new file mode 100644 (file)
index 0000000..6b71d89
--- /dev/null
@@ -0,0 +1,27 @@
+# Process this file with automake to produce Makefile.in
+
+NULL =
+
+# Convenience targets:
+lib:
+       @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
+
+EXTRA_DIST = \
+       COPYING \
+       fonts \
+       update.py \
+       meson.build \
+       $(TESTS) \
+       $(NULL)
+
+TEST_EXTENSIONS = .tests
+if HAVE_FREETYPE
+TESTS_ENVIRONMENT = HAVE_FREETYPE=1
+else
+TESTS_ENVIRONMENT = HAVE_FREETYPE=0
+endif
+TESTS_LOG_COMPILER = $(srcdir)/../../run-tests.py $(top_builddir)/util/hb-shape$(EXEEXT)
+
+include Makefile.sources
+
+-include $(top_srcdir)/git.mk
diff --git a/test/shape/data/aots/Makefile.in b/test/shape/data/aots/Makefile.in
new file mode 100644 (file)
index 0000000..27e8731
--- /dev/null
@@ -0,0 +1,1006 @@
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Process this file with automake to produce Makefile.in
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+TESTS = tests/classdef1_empty.tests tests/classdef1_multiple.tests \
+       tests/classdef1_single.tests tests/classdef1.tests \
+       tests/classdef2_empty.tests tests/classdef2_multiple.tests \
+       tests/classdef2_single.tests tests/classdef2.tests \
+       tests/cmap0.tests tests/cmap10.tests tests/cmap12.tests \
+       tests/cmap2.tests tests/cmap4.tests tests/cmap6.tests \
+       tests/cmap8.tests tests/gpos_chaining1_boundary.tests \
+       tests/gpos_chaining1_lookupflag.tests \
+       tests/gpos_chaining1_multiple_subrules.tests \
+       tests/gpos_chaining1_next_glyph.tests \
+       tests/gpos_chaining1_simple.tests \
+       tests/gpos_chaining1_successive.tests \
+       tests/gpos_chaining2_boundary.tests \
+       tests/gpos_chaining2_lookupflag.tests \
+       tests/gpos_chaining2_multiple_subrules.tests \
+       tests/gpos_chaining2_next_glyph.tests \
+       tests/gpos_chaining2_simple.tests \
+       tests/gpos_chaining2_successive.tests \
+       tests/gpos_chaining3_boundary.tests \
+       tests/gpos_chaining3_lookupflag.tests \
+       tests/gpos_chaining3_next_glyph.tests \
+       tests/gpos_chaining3_simple.tests \
+       tests/gpos_chaining3_successive.tests \
+       tests/gpos_context1_boundary.tests \
+       tests/gpos_context1_expansion.tests \
+       tests/gpos_context1_lookupflag.tests \
+       tests/gpos_context1_multiple_subrules.tests \
+       tests/gpos_context1_next_glyph.tests \
+       tests/gpos_context1_simple.tests \
+       tests/gpos_context1_successive.tests \
+       tests/gpos_context2_boundary.tests \
+       tests/gpos_context2_classes.tests \
+       tests/gpos_context2_expansion.tests \
+       tests/gpos_context2_lookupflag.tests \
+       tests/gpos_context2_multiple_subrules.tests \
+       tests/gpos_context2_next_glyph.tests \
+       tests/gpos_context2_simple.tests \
+       tests/gpos_context2_successive.tests \
+       tests/gpos_context3_boundary.tests \
+       tests/gpos_context3_lookupflag.tests \
+       tests/gpos_context3_next_glyph.tests \
+       tests/gpos_context3_simple.tests \
+       tests/gpos_context3_successive.tests \
+       tests/gpos1_1_lookupflag.tests tests/gpos1_1_simple.tests \
+       tests/gpos1_2_lookupflag.tests tests/gpos1_2.tests \
+       tests/gpos2_1_lookupflag.tests tests/gpos2_1_next_glyph.tests \
+       tests/gpos2_1_simple.tests tests/gpos2_1.tests \
+       tests/gpos2_2.tests tests/gpos3_lookupflag.tests \
+       tests/gpos3.tests tests/gpos4_lookupflag.tests \
+       tests/gpos4_multiple_anchors.tests tests/gpos4_simple.tests \
+       tests/gpos5.tests tests/gpos6.tests tests/gpos7_1.tests \
+       tests/gpos9.tests tests/gsub_chaining1_boundary.tests \
+       tests/gsub_chaining1_lookupflag.tests \
+       tests/gsub_chaining1_multiple_subrules.tests \
+       tests/gsub_chaining1_next_glyph.tests \
+       tests/gsub_chaining1_simple.tests \
+       tests/gsub_chaining1_successive.tests \
+       tests/gsub_chaining2_boundary.tests \
+       tests/gsub_chaining2_lookupflag.tests \
+       tests/gsub_chaining2_multiple_subrules.tests \
+       tests/gsub_chaining2_next_glyph.tests \
+       tests/gsub_chaining2_simple.tests \
+       tests/gsub_chaining2_successive.tests \
+       tests/gsub_chaining3_boundary.tests \
+       tests/gsub_chaining3_lookupflag.tests \
+       tests/gsub_chaining3_next_glyph.tests \
+       tests/gsub_chaining3_simple.tests \
+       tests/gsub_chaining3_successive.tests \
+       tests/gsub_context1_boundary.tests \
+       tests/gsub_context1_expansion.tests \
+       tests/gsub_context1_lookupflag.tests \
+       tests/gsub_context1_multiple_subrules.tests \
+       tests/gsub_context1_next_glyph.tests \
+       tests/gsub_context1_simple.tests \
+       tests/gsub_context1_successive.tests \
+       tests/gsub_context2_boundary.tests \
+       tests/gsub_context2_classes.tests \
+       tests/gsub_context2_expansion.tests \
+       tests/gsub_context2_lookupflag.tests \
+       tests/gsub_context2_multiple_subrules.tests \
+       tests/gsub_context2_next_glyph.tests \
+       tests/gsub_context2_simple.tests \
+       tests/gsub_context2_successive.tests \
+       tests/gsub_context3_boundary.tests \
+       tests/gsub_context3_lookupflag.tests \
+       tests/gsub_context3_next_glyph.tests \
+       tests/gsub_context3_simple.tests \
+       tests/gsub_context3_successive.tests \
+       tests/gsub1_1_lookupflag.tests tests/gsub1_1_modulo.tests \
+       tests/gsub1_1_simple.tests tests/gsub1_2_lookupflag.tests \
+       tests/gsub1_2_simple.tests tests/gsub2_1_lookupflag.tests \
+       tests/gsub2_1_multiple_sequences.tests \
+       tests/gsub2_1_simple.tests tests/gsub3_1_lookupflag.tests \
+       tests/gsub3_1_multiple.tests tests/gsub3_1_simple.tests \
+       tests/gsub4_1_lookupflag.tests \
+       tests/gsub4_1_multiple_ligatures.tests \
+       tests/gsub4_1_multiple_ligsets.tests \
+       tests/gsub4_1_simple.tests tests/gsub7.tests \
+       tests/lookupflag_ignore_attach.tests \
+       tests/lookupflag_ignore_base.tests \
+       tests/lookupflag_ignore_combination.tests \
+       tests/lookupflag_ignore_ligatures.tests \
+       tests/lookupflag_ignore_marks.tests $(am__EXEEXT_1)
+subdir = test/shape/data/aots
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_link_flag.m4 \
+       $(top_srcdir)/m4/ax_code_coverage.m4 \
+       $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \
+       $(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/gtk-doc.m4 \
+       $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
+       $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+       $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+am__tty_colors_dummy = \
+  mgn= red= grn= lgn= blu= brg= std=; \
+  am__color_tests=no
+am__tty_colors = { \
+  $(am__tty_colors_dummy); \
+  if test "X$(AM_COLOR_TESTS)" = Xno; then \
+    am__color_tests=no; \
+  elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+    am__color_tests=yes; \
+  elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+    am__color_tests=yes; \
+  fi; \
+  if test $$am__color_tests = yes; then \
+    red='\e[0;31m'; \
+    grn='\e[0;32m'; \
+    lgn='\e[1;32m'; \
+    blu='\e[1;34m'; \
+    mgn='\e[0;35m'; \
+    brg='\e[1m'; \
+    std='\e[m'; \
+  fi; \
+}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__recheck_rx = ^[    ]*:recheck:[    ]*
+am__global_test_result_rx = ^[         ]*:global-test-result:[         ]*
+am__copy_in_global_log_rx = ^[         ]*:copy-in-global-log:[         ]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+  recheck = 1; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+        { \
+          if ((getline line2 < ($$0 ".log")) < 0) \
+           recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+        { \
+          recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+        { \
+          break; \
+        } \
+    }; \
+  if (recheck) \
+    print $$0; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+  print "fatal: making $@: " msg | "cat >&2"; \
+  exit 1; \
+} \
+function rst_section(header) \
+{ \
+  print header; \
+  len = length(header); \
+  for (i = 1; i <= len; i = i + 1) \
+    printf "="; \
+  printf "\n\n"; \
+} \
+{ \
+  copy_in_global_log = 1; \
+  global_test_result = "RUN"; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+         fatal("failed to read from " $$0 ".trs"); \
+      if (line ~ /$(am__global_test_result_rx)/) \
+        { \
+          sub("$(am__global_test_result_rx)", "", line); \
+          sub("[       ]*$$", "", line); \
+          global_test_result = line; \
+        } \
+      else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+        copy_in_global_log = 0; \
+    }; \
+  if (copy_in_global_log) \
+    { \
+      rst_section(global_test_result ": " $$0); \
+      while ((rc = (getline line < ($$0 ".log"))) != 0) \
+      { \
+        if (rc < 0) \
+          fatal("failed to read from " $$0 ".log"); \
+        print line; \
+      }; \
+      printf "\n"; \
+    }; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/   &   /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this.  Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+  --color-tests "$$am__color_tests" \
+  --enable-hard-errors "$$am__enable_hard_errors" \
+  --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test.  Creates the
+# directory for the log if needed.  Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log.  Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT.  Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup);                                     \
+$(am__vpath_adj_setup) $(am__vpath_adj)                        \
+$(am__tty_colors);                                     \
+srcdir=$(srcdir); export srcdir;                       \
+case "$@" in                                           \
+  */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;;   \
+    *) am__odir=.;;                                    \
+esac;                                                  \
+test "x$$am__odir" = x"." || test -d "$$am__odir"      \
+  || $(MKDIR_P) "$$am__odir" || exit $$?;              \
+if test -f "./$$f"; then dir=./;                       \
+elif test -f "$$f"; then dir=;                         \
+else dir="$(srcdir)/"; fi;                             \
+tst=$$dir$$f; log='$@';                                \
+if test -n '$(DISABLE_HARD_ERRORS)'; then              \
+  am__enable_hard_errors=no;                           \
+else                                                   \
+  am__enable_hard_errors=yes;                          \
+fi;                                                    \
+case " $(XFAIL_TESTS) " in                             \
+  *[\ \        ]$$f[\ \        ]* | *[\ \      ]$$dir$$f[\ \   ]*) \
+    am__expect_failure=yes;;                           \
+  *)                                                   \
+    am__expect_failure=no;;                            \
+esac;                                                  \
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed).  The result is saved in the shell variable
+# '$bases'.  This honors runtime overriding of TESTS and TEST_LOGS.  Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+  bases='$(TEST_LOGS)'; \
+  bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+  bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+am__EXEEXT_1 =
+TEST_SUITE_LOG = test-suite.log
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
+TEST_LOGS = $(am__test_logs2:.tests.log=.log)
+TESTS_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+TESTS_LOG_COMPILE = $(TESTS_LOG_COMPILER) $(AM_TESTS_LOG_FLAGS) \
+       $(TESTS_LOG_FLAGS)
+am__set_b = \
+  case '$@' in \
+    */*) \
+      case '$*' in \
+        */*) b='$*';; \
+          *) b=`echo '$@' | sed 's/\.log$$//'`; \
+       esac;; \
+    *) \
+      b='$*';; \
+  esac
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.sources \
+       $(top_srcdir)/test-driver COPYING
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CAIRO_CFLAGS = @CAIRO_CFLAGS@
+CAIRO_FT_CFLAGS = @CAIRO_FT_CFLAGS@
+CAIRO_FT_LIBS = @CAIRO_FT_LIBS@
+CAIRO_LIBS = @CAIRO_LIBS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHAFA_CFLAGS = @CHAFA_CFLAGS@
+CHAFA_LIBS = @CHAFA_LIBS@
+CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
+CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
+CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
+CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
+CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
+CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
+CORETEXT_CFLAGS = @CORETEXT_CFLAGS@
+CORETEXT_LIBS = @CORETEXT_LIBS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DIRECTWRITE_CXXFLAGS = @DIRECTWRITE_CXXFLAGS@
+DIRECTWRITE_LIBS = @DIRECTWRITE_LIBS@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
+FREETYPE_DEPS = @FREETYPE_DEPS@
+FREETYPE_LIBS = @FREETYPE_LIBS@
+GCOV = @GCOV@
+GDI_CFLAGS = @GDI_CFLAGS@
+GDI_LIBS = @GDI_LIBS@
+GENHTML = @GENHTML@
+GIT = @GIT@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_DEPS = @GLIB_DEPS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GOBJECT_CFLAGS = @GOBJECT_CFLAGS@
+GOBJECT_LIBS = @GOBJECT_LIBS@
+GRAPHITE2_CFLAGS = @GRAPHITE2_CFLAGS@
+GRAPHITE2_DEPS = @GRAPHITE2_DEPS@
+GRAPHITE2_LIBS = @GRAPHITE2_LIBS@
+GREP = @GREP@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@
+GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
+GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
+GTKDOC_MKPDF = @GTKDOC_MKPDF@
+GTKDOC_REBASE = @GTKDOC_REBASE@
+HAVE_CXX11 = @HAVE_CXX11@
+HB_LIBTOOL_VERSION_INFO = @HB_LIBTOOL_VERSION_INFO@
+HB_VERSION = @HB_VERSION@
+HB_VERSION_MAJOR = @HB_VERSION_MAJOR@
+HB_VERSION_MICRO = @HB_VERSION_MICRO@
+HB_VERSION_MINOR = @HB_VERSION_MINOR@
+HTML_DIR = @HTML_DIR@
+ICU_CFLAGS = @ICU_CFLAGS@
+ICU_LIBS = @ICU_LIBS@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+LCOV = @LCOV@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
+RAGEL = @RAGEL@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+UNISCRIBE_CFLAGS = @UNISCRIBE_CFLAGS@
+UNISCRIBE_LIBS = @UNISCRIBE_LIBS@
+VERSION = @VERSION@
+_GI_EXP_DATADIR = @_GI_EXP_DATADIR@
+_GI_EXP_LIBDIR = @_GI_EXP_LIBDIR@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+have_gobject = @have_gobject@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+NULL = 
+EXTRA_DIST = \
+       COPYING \
+       fonts \
+       update.py \
+       meson.build \
+       $(TESTS) \
+       $(NULL)
+
+TEST_EXTENSIONS = .tests
+@HAVE_FREETYPE_FALSE@TESTS_ENVIRONMENT = HAVE_FREETYPE=0
+@HAVE_FREETYPE_TRUE@TESTS_ENVIRONMENT = HAVE_FREETYPE=1
+TESTS_LOG_COMPILER = $(srcdir)/../../run-tests.py $(top_builddir)/util/hb-shape$(EXEEXT)
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .log .tests .tests$(EXEEXT) .trs
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am $(srcdir)/Makefile.sources $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+               && { if test -f $@; then exit 0; else break; fi; }; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits test/shape/data/aots/Makefile'; \
+       $(am__cd) $(top_srcdir) && \
+         $(AUTOMAKE) --gnits test/shape/data/aots/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+       esac;
+$(srcdir)/Makefile.sources $(am__empty):
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+       -rm -f *.lo
+
+clean-libtool:
+       -rm -rf .libs _libs
+tags TAGS:
+
+ctags CTAGS:
+
+cscope cscopelist:
+
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'.  Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+       rm -f $< $@
+       $(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+       @:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+       @$(am__set_TESTS_bases); \
+       am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+       redo_bases=`for i in $$bases; do \
+                     am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+                   done`; \
+       if test -n "$$redo_bases"; then \
+         redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+         redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+         if $(am__make_dryrun); then :; else \
+           rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+         fi; \
+       fi; \
+       if test -n "$$am__remaking_logs"; then \
+         echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+              "recursion detected" >&2; \
+       elif test -n "$$redo_logs"; then \
+         am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+       fi; \
+       if $(am__make_dryrun); then :; else \
+         st=0;  \
+         errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+         for i in $$redo_bases; do \
+           test -f $$i.trs && test -r $$i.trs \
+             || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+           test -f $$i.log && test -r $$i.log \
+             || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+         done; \
+         test $$st -eq 0 || exit 1; \
+       fi
+       @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+       ws='[   ]'; \
+       results=`for b in $$bases; do echo $$b.trs; done`; \
+       test -n "$$results" || results=/dev/null; \
+       all=`  grep "^$$ws*:test-result:"           $$results | wc -l`; \
+       pass=` grep "^$$ws*:test-result:$$ws*PASS"  $$results | wc -l`; \
+       fail=` grep "^$$ws*:test-result:$$ws*FAIL"  $$results | wc -l`; \
+       skip=` grep "^$$ws*:test-result:$$ws*SKIP"  $$results | wc -l`; \
+       xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+       xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+       error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+       if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+         success=true; \
+       else \
+         success=false; \
+       fi; \
+       br='==================='; br=$$br$$br$$br$$br; \
+       result_count () \
+       { \
+           if test x"$$1" = x"--maybe-color"; then \
+             maybe_colorize=yes; \
+           elif test x"$$1" = x"--no-color"; then \
+             maybe_colorize=no; \
+           else \
+             echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+           fi; \
+           shift; \
+           desc=$$1 count=$$2; \
+           if test $$maybe_colorize = yes && test $$count -gt 0; then \
+             color_start=$$3 color_end=$$std; \
+           else \
+             color_start= color_end=; \
+           fi; \
+           echo "$${color_start}# $$desc $$count$${color_end}"; \
+       }; \
+       create_testsuite_report () \
+       { \
+         result_count $$1 "TOTAL:" $$all   "$$brg"; \
+         result_count $$1 "PASS: " $$pass  "$$grn"; \
+         result_count $$1 "SKIP: " $$skip  "$$blu"; \
+         result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+         result_count $$1 "FAIL: " $$fail  "$$red"; \
+         result_count $$1 "XPASS:" $$xpass "$$red"; \
+         result_count $$1 "ERROR:" $$error "$$mgn"; \
+       }; \
+       {                                                               \
+         echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" |       \
+           $(am__rst_title);                                           \
+         create_testsuite_report --no-color;                           \
+         echo;                                                         \
+         echo ".. contents:: :depth: 2";                               \
+         echo;                                                         \
+         for b in $$bases; do echo $$b; done                           \
+           | $(am__create_global_log);                                 \
+       } >$(TEST_SUITE_LOG).tmp || exit 1;                             \
+       mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG);                     \
+       if $$success; then                                              \
+         col="$$grn";                                                  \
+        else                                                           \
+         col="$$red";                                                  \
+         test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG);               \
+       fi;                                                             \
+       echo "$${col}$$br$${std}";                                      \
+       echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}";   \
+       echo "$${col}$$br$${std}";                                      \
+       create_testsuite_report --maybe-color;                          \
+       echo "$$col$$br$$std";                                          \
+       if $$success; then :; else                                      \
+         echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}";         \
+         if test -n "$(PACKAGE_BUGREPORT)"; then                       \
+           echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
+         fi;                                                           \
+         echo "$$col$$br$$std";                                        \
+       fi;                                                             \
+       $$success || exit 1
+
+check-TESTS: 
+       @list='$(RECHECK_LOGS)';           test -z "$$list" || rm -f $$list
+       @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+       @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+       @set +e; $(am__set_TESTS_bases); \
+       log_list=`for i in $$bases; do echo $$i.log; done`; \
+       trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+       log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+       $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+       exit $$?;
+recheck: all 
+       @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+       @set +e; $(am__set_TESTS_bases); \
+       bases=`for i in $$bases; do echo $$i; done \
+                | $(am__list_recheck_tests)` || exit 1; \
+       log_list=`for i in $$bases; do echo $$i.log; done`; \
+       log_list=`echo $$log_list`; \
+       $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+               am__force_recheck=am--force-recheck \
+               TEST_LOGS="$$log_list"; \
+       exit $$?
+.tests.log:
+       @p='$<'; \
+       $(am__set_b); \
+       $(am__check_pre) $(TESTS_LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_TESTS_LOG_DRIVER_FLAGS) $(TESTS_LOG_DRIVER_FLAGS) -- $(TESTS_LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+@am__EXEEXT_TRUE@.tests$(EXEEXT).log:
+@am__EXEEXT_TRUE@      @p='$<'; \
+@am__EXEEXT_TRUE@      $(am__set_b); \
+@am__EXEEXT_TRUE@      $(am__check_pre) $(TESTS_LOG_DRIVER) --test-name "$$f" \
+@am__EXEEXT_TRUE@      --log-file $$b.log --trs-file $$b.trs \
+@am__EXEEXT_TRUE@      $(am__common_driver_flags) $(AM_TESTS_LOG_DRIVER_FLAGS) $(TESTS_LOG_DRIVER_FLAGS) -- $(TESTS_LOG_COMPILE) \
+@am__EXEEXT_TRUE@      "$$tst" $(AM_TESTS_FD_REDIRECT)
+
+distdir: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       list='$(DISTFILES)'; \
+         dist_files=`for file in $$list; do echo $$file; done | \
+         sed -e "s|^$$srcdirstrip/||;t" \
+             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+       case $$dist_files in \
+         */*) $(MKDIR_P) `echo "$$dist_files" | \
+                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+                          sort -u` ;; \
+       esac; \
+       for file in $$dist_files; do \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         if test -d $$d/$$file; then \
+           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+           if test -d "$(distdir)/$$file"; then \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+         else \
+           test -f "$(distdir)/$$file" \
+           || cp -p $$d/$$file "$(distdir)/$$file" \
+           || exit 1; \
+         fi; \
+       done
+check-am: all-am
+       $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
+mostlyclean-generic:
+       -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+       -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+       -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+
+clean-generic:
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+       -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: all all-am check check-TESTS check-am clean clean-generic \
+       clean-libtool cscopelist-am ctags-am distclean \
+       distclean-generic distclean-libtool distdir dvi dvi-am html \
+       html-am info info-am install install-am install-data \
+       install-data-am install-dvi install-dvi-am install-exec \
+       install-exec-am install-html install-html-am install-info \
+       install-info-am install-man install-pdf install-pdf-am \
+       install-ps install-ps-am install-strip installcheck \
+       installcheck-am installdirs maintainer-clean \
+       maintainer-clean-generic mostlyclean mostlyclean-generic \
+       mostlyclean-libtool pdf pdf-am ps ps-am recheck tags-am \
+       uninstall uninstall-am
+
+.PRECIOUS: Makefile
+
+
+# Convenience targets:
+lib:
+       @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
+
+-include $(top_srcdir)/git.mk
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/test/shape/data/aots/Makefile.sources b/test/shape/data/aots/Makefile.sources
new file mode 100644 (file)
index 0000000..fcbea61
--- /dev/null
@@ -0,0 +1,130 @@
+TESTS = \
+       tests/classdef1_empty.tests \
+       tests/classdef1_multiple.tests \
+       tests/classdef1_single.tests \
+       tests/classdef1.tests \
+       tests/classdef2_empty.tests \
+       tests/classdef2_multiple.tests \
+       tests/classdef2_single.tests \
+       tests/classdef2.tests \
+       tests/cmap0.tests \
+       tests/cmap10.tests \
+       tests/cmap12.tests \
+       tests/cmap2.tests \
+       tests/cmap4.tests \
+       tests/cmap6.tests \
+       tests/cmap8.tests \
+       tests/gpos_chaining1_boundary.tests \
+       tests/gpos_chaining1_lookupflag.tests \
+       tests/gpos_chaining1_multiple_subrules.tests \
+       tests/gpos_chaining1_next_glyph.tests \
+       tests/gpos_chaining1_simple.tests \
+       tests/gpos_chaining1_successive.tests \
+       tests/gpos_chaining2_boundary.tests \
+       tests/gpos_chaining2_lookupflag.tests \
+       tests/gpos_chaining2_multiple_subrules.tests \
+       tests/gpos_chaining2_next_glyph.tests \
+       tests/gpos_chaining2_simple.tests \
+       tests/gpos_chaining2_successive.tests \
+       tests/gpos_chaining3_boundary.tests \
+       tests/gpos_chaining3_lookupflag.tests \
+       tests/gpos_chaining3_next_glyph.tests \
+       tests/gpos_chaining3_simple.tests \
+       tests/gpos_chaining3_successive.tests \
+       tests/gpos_context1_boundary.tests \
+       tests/gpos_context1_expansion.tests \
+       tests/gpos_context1_lookupflag.tests \
+       tests/gpos_context1_multiple_subrules.tests \
+       tests/gpos_context1_next_glyph.tests \
+       tests/gpos_context1_simple.tests \
+       tests/gpos_context1_successive.tests \
+       tests/gpos_context2_boundary.tests \
+       tests/gpos_context2_classes.tests \
+       tests/gpos_context2_expansion.tests \
+       tests/gpos_context2_lookupflag.tests \
+       tests/gpos_context2_multiple_subrules.tests \
+       tests/gpos_context2_next_glyph.tests \
+       tests/gpos_context2_simple.tests \
+       tests/gpos_context2_successive.tests \
+       tests/gpos_context3_boundary.tests \
+       tests/gpos_context3_lookupflag.tests \
+       tests/gpos_context3_next_glyph.tests \
+       tests/gpos_context3_simple.tests \
+       tests/gpos_context3_successive.tests \
+       tests/gpos1_1_lookupflag.tests \
+       tests/gpos1_1_simple.tests \
+       tests/gpos1_2_lookupflag.tests \
+       tests/gpos1_2.tests \
+       tests/gpos2_1_lookupflag.tests \
+       tests/gpos2_1_next_glyph.tests \
+       tests/gpos2_1_simple.tests \
+       tests/gpos2_1.tests \
+       tests/gpos2_2.tests \
+       tests/gpos3_lookupflag.tests \
+       tests/gpos3.tests \
+       tests/gpos4_lookupflag.tests \
+       tests/gpos4_multiple_anchors.tests \
+       tests/gpos4_simple.tests \
+       tests/gpos5.tests \
+       tests/gpos6.tests \
+       tests/gpos7_1.tests \
+       tests/gpos9.tests \
+       tests/gsub_chaining1_boundary.tests \
+       tests/gsub_chaining1_lookupflag.tests \
+       tests/gsub_chaining1_multiple_subrules.tests \
+       tests/gsub_chaining1_next_glyph.tests \
+       tests/gsub_chaining1_simple.tests \
+       tests/gsub_chaining1_successive.tests \
+       tests/gsub_chaining2_boundary.tests \
+       tests/gsub_chaining2_lookupflag.tests \
+       tests/gsub_chaining2_multiple_subrules.tests \
+       tests/gsub_chaining2_next_glyph.tests \
+       tests/gsub_chaining2_simple.tests \
+       tests/gsub_chaining2_successive.tests \
+       tests/gsub_chaining3_boundary.tests \
+       tests/gsub_chaining3_lookupflag.tests \
+       tests/gsub_chaining3_next_glyph.tests \
+       tests/gsub_chaining3_simple.tests \
+       tests/gsub_chaining3_successive.tests \
+       tests/gsub_context1_boundary.tests \
+       tests/gsub_context1_expansion.tests \
+       tests/gsub_context1_lookupflag.tests \
+       tests/gsub_context1_multiple_subrules.tests \
+       tests/gsub_context1_next_glyph.tests \
+       tests/gsub_context1_simple.tests \
+       tests/gsub_context1_successive.tests \
+       tests/gsub_context2_boundary.tests \
+       tests/gsub_context2_classes.tests \
+       tests/gsub_context2_expansion.tests \
+       tests/gsub_context2_lookupflag.tests \
+       tests/gsub_context2_multiple_subrules.tests \
+       tests/gsub_context2_next_glyph.tests \
+       tests/gsub_context2_simple.tests \
+       tests/gsub_context2_successive.tests \
+       tests/gsub_context3_boundary.tests \
+       tests/gsub_context3_lookupflag.tests \
+       tests/gsub_context3_next_glyph.tests \
+       tests/gsub_context3_simple.tests \
+       tests/gsub_context3_successive.tests \
+       tests/gsub1_1_lookupflag.tests \
+       tests/gsub1_1_modulo.tests \
+       tests/gsub1_1_simple.tests \
+       tests/gsub1_2_lookupflag.tests \
+       tests/gsub1_2_simple.tests \
+       tests/gsub2_1_lookupflag.tests \
+       tests/gsub2_1_multiple_sequences.tests \
+       tests/gsub2_1_simple.tests \
+       tests/gsub3_1_lookupflag.tests \
+       tests/gsub3_1_multiple.tests \
+       tests/gsub3_1_simple.tests \
+       tests/gsub4_1_lookupflag.tests \
+       tests/gsub4_1_multiple_ligatures.tests \
+       tests/gsub4_1_multiple_ligsets.tests \
+       tests/gsub4_1_simple.tests \
+       tests/gsub7.tests \
+       tests/lookupflag_ignore_attach.tests \
+       tests/lookupflag_ignore_base.tests \
+       tests/lookupflag_ignore_combination.tests \
+       tests/lookupflag_ignore_ligatures.tests \
+       tests/lookupflag_ignore_marks.tests \
+       $(NULL)
diff --git a/test/shape/data/aots/meson.build b/test/shape/data/aots/meson.build
new file mode 100644 (file)
index 0000000..bda2711
--- /dev/null
@@ -0,0 +1,130 @@
+aots_tests = [
+  'classdef1_empty.tests',
+  'classdef1_multiple.tests',
+  'classdef1_single.tests',
+  'classdef1.tests',
+  'classdef2_empty.tests',
+  'classdef2_multiple.tests',
+  'classdef2_single.tests',
+  'classdef2.tests',
+  'cmap0.tests',
+  'cmap10.tests',
+  'cmap12.tests',
+  'cmap2.tests',
+  'cmap4.tests',
+  'cmap6.tests',
+  'cmap8.tests',
+  'gpos_chaining1_boundary.tests',
+  'gpos_chaining1_lookupflag.tests',
+  'gpos_chaining1_multiple_subrules.tests',
+  'gpos_chaining1_next_glyph.tests',
+  'gpos_chaining1_simple.tests',
+  'gpos_chaining1_successive.tests',
+  'gpos_chaining2_boundary.tests',
+  'gpos_chaining2_lookupflag.tests',
+  'gpos_chaining2_multiple_subrules.tests',
+  'gpos_chaining2_next_glyph.tests',
+  'gpos_chaining2_simple.tests',
+  'gpos_chaining2_successive.tests',
+  'gpos_chaining3_boundary.tests',
+  'gpos_chaining3_lookupflag.tests',
+  'gpos_chaining3_next_glyph.tests',
+  'gpos_chaining3_simple.tests',
+  'gpos_chaining3_successive.tests',
+  'gpos_context1_boundary.tests',
+  'gpos_context1_expansion.tests',
+  'gpos_context1_lookupflag.tests',
+  'gpos_context1_multiple_subrules.tests',
+  'gpos_context1_next_glyph.tests',
+  'gpos_context1_simple.tests',
+  'gpos_context1_successive.tests',
+  'gpos_context2_boundary.tests',
+  'gpos_context2_classes.tests',
+  'gpos_context2_expansion.tests',
+  'gpos_context2_lookupflag.tests',
+  'gpos_context2_multiple_subrules.tests',
+  'gpos_context2_next_glyph.tests',
+  'gpos_context2_simple.tests',
+  'gpos_context2_successive.tests',
+  'gpos_context3_boundary.tests',
+  'gpos_context3_lookupflag.tests',
+  'gpos_context3_next_glyph.tests',
+  'gpos_context3_simple.tests',
+  'gpos_context3_successive.tests',
+  'gpos1_1_lookupflag.tests',
+  'gpos1_1_simple.tests',
+  'gpos1_2_lookupflag.tests',
+  'gpos1_2.tests',
+  'gpos2_1_lookupflag.tests',
+  'gpos2_1_next_glyph.tests',
+  'gpos2_1_simple.tests',
+  'gpos2_1.tests',
+  'gpos2_2.tests',
+  'gpos3_lookupflag.tests',
+  'gpos3.tests',
+  'gpos4_lookupflag.tests',
+  'gpos4_multiple_anchors.tests',
+  'gpos4_simple.tests',
+  'gpos5.tests',
+  'gpos6.tests',
+  'gpos7_1.tests',
+  'gpos9.tests',
+  'gsub_chaining1_boundary.tests',
+  'gsub_chaining1_lookupflag.tests',
+  'gsub_chaining1_multiple_subrules.tests',
+  'gsub_chaining1_next_glyph.tests',
+  'gsub_chaining1_simple.tests',
+  'gsub_chaining1_successive.tests',
+  'gsub_chaining2_boundary.tests',
+  'gsub_chaining2_lookupflag.tests',
+  'gsub_chaining2_multiple_subrules.tests',
+  'gsub_chaining2_next_glyph.tests',
+  'gsub_chaining2_simple.tests',
+  'gsub_chaining2_successive.tests',
+  'gsub_chaining3_boundary.tests',
+  'gsub_chaining3_lookupflag.tests',
+  'gsub_chaining3_next_glyph.tests',
+  'gsub_chaining3_simple.tests',
+  'gsub_chaining3_successive.tests',
+  'gsub_context1_boundary.tests',
+  'gsub_context1_expansion.tests',
+  'gsub_context1_lookupflag.tests',
+  'gsub_context1_multiple_subrules.tests',
+  'gsub_context1_next_glyph.tests',
+  'gsub_context1_simple.tests',
+  'gsub_context1_successive.tests',
+  'gsub_context2_boundary.tests',
+  'gsub_context2_classes.tests',
+  'gsub_context2_expansion.tests',
+  'gsub_context2_lookupflag.tests',
+  'gsub_context2_multiple_subrules.tests',
+  'gsub_context2_next_glyph.tests',
+  'gsub_context2_simple.tests',
+  'gsub_context2_successive.tests',
+  'gsub_context3_boundary.tests',
+  'gsub_context3_lookupflag.tests',
+  'gsub_context3_next_glyph.tests',
+  'gsub_context3_simple.tests',
+  'gsub_context3_successive.tests',
+  'gsub1_1_lookupflag.tests',
+  'gsub1_1_modulo.tests',
+  'gsub1_1_simple.tests',
+  'gsub1_2_lookupflag.tests',
+  'gsub1_2_simple.tests',
+  'gsub2_1_lookupflag.tests',
+  'gsub2_1_multiple_sequences.tests',
+  'gsub2_1_simple.tests',
+  'gsub3_1_lookupflag.tests',
+  'gsub3_1_multiple.tests',
+  'gsub3_1_simple.tests',
+  'gsub4_1_lookupflag.tests',
+  'gsub4_1_multiple_ligatures.tests',
+  'gsub4_1_multiple_ligsets.tests',
+  'gsub4_1_simple.tests',
+  'gsub7.tests',
+  'lookupflag_ignore_attach.tests',
+  'lookupflag_ignore_base.tests',
+  'lookupflag_ignore_combination.tests',
+  'lookupflag_ignore_ligatures.tests',
+  'lookupflag_ignore_marks.tests',
+]
diff --git a/test/shape/data/aots/tests/classdef1.tests b/test/shape/data/aots/tests/classdef1.tests
new file mode 100644 (file)
index 0000000..00b41b9
--- /dev/null
@@ -0,0 +1 @@
+../fonts/classdef1_font4.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0011,U+0012,U+0013,U+0014,U+0015;[17|18|19|20|21]
diff --git a/test/shape/data/aots/tests/classdef1_empty.tests b/test/shape/data/aots/tests/classdef1_empty.tests
new file mode 100644 (file)
index 0000000..3167411
--- /dev/null
@@ -0,0 +1 @@
+../fonts/classdef1_font2.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0011,U+0012,U+0013,U+0014,U+0015;[17|23|24|25|21]
diff --git a/test/shape/data/aots/tests/classdef1_multiple.tests b/test/shape/data/aots/tests/classdef1_multiple.tests
new file mode 100644 (file)
index 0000000..3bbe704
--- /dev/null
@@ -0,0 +1 @@
+../fonts/classdef1_font3.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0011,U+0012,U+0013,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+001B,U+001C,U+001D,U+001E,U+001F,U+0020,U+0021,U+0022,U+0023,U+0024;[20|23|24|25|24|26|27|28|28|29|30|31|34|33|34|35|37|38|38|39]
diff --git a/test/shape/data/aots/tests/classdef1_single.tests b/test/shape/data/aots/tests/classdef1_single.tests
new file mode 100644 (file)
index 0000000..d15673c
--- /dev/null
@@ -0,0 +1 @@
+../fonts/classdef2_font1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0011,U+0012,U+0013,U+0014,U+0015;[17|23|24|25|21]
diff --git a/test/shape/data/aots/tests/classdef2.tests b/test/shape/data/aots/tests/classdef2.tests
new file mode 100644 (file)
index 0000000..4fec839
--- /dev/null
@@ -0,0 +1 @@
+../fonts/classdef2_font4.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0011,U+0012,U+0013,U+0014,U+0015;[17|18|19|20|21]
diff --git a/test/shape/data/aots/tests/classdef2_empty.tests b/test/shape/data/aots/tests/classdef2_empty.tests
new file mode 100644 (file)
index 0000000..717636a
--- /dev/null
@@ -0,0 +1 @@
+../fonts/classdef2_font2.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0011,U+0012,U+0013,U+0014,U+0015;[17|23|24|25|21]
diff --git a/test/shape/data/aots/tests/classdef2_multiple.tests b/test/shape/data/aots/tests/classdef2_multiple.tests
new file mode 100644 (file)
index 0000000..a69d613
--- /dev/null
@@ -0,0 +1 @@
+../fonts/classdef2_font3.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0011,U+0012,U+0013,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+001B,U+001C,U+001D,U+001E,U+001F,U+0020,U+0021,U+0022,U+0023,U+0024;[20|23|24|25|24|26|27|28|28|29|30|31|34|33|34|35|37|38|38|39]
diff --git a/test/shape/data/aots/tests/classdef2_single.tests b/test/shape/data/aots/tests/classdef2_single.tests
new file mode 100644 (file)
index 0000000..d15673c
--- /dev/null
@@ -0,0 +1 @@
+../fonts/classdef2_font1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0011,U+0012,U+0013,U+0014,U+0015;[17|23|24|25|21]
diff --git a/test/shape/data/aots/tests/cmap0.tests b/test/shape/data/aots/tests/cmap0.tests
new file mode 100644 (file)
index 0000000..83ae1d7
--- /dev/null
@@ -0,0 +1 @@
+../fonts/cmap0_font1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions --font-funcs=ot;U+0000,U+0001,U+0033,U+0034,U+0035,U+0036,U+0037,U+FFFF;[0|0|0|17|56|12|0|0]
diff --git a/test/shape/data/aots/tests/cmap10.tests b/test/shape/data/aots/tests/cmap10.tests
new file mode 100644 (file)
index 0000000..9388c05
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/cmap10_font1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions --font-funcs=ot;U+0000,U+0001,U+9232,U+109422,U+109423,U+109424,U+109425,U+FFFF;[0|0|0|0|26|27|32|0]
+../fonts/cmap10_font2.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions --font-funcs=ot;U+0000,U+0001,U+0021,U+0022,U+0023,U+0024,U+0025,U+FFFF;[0|0|0|0|0|0|0|0]
diff --git a/test/shape/data/aots/tests/cmap12.tests b/test/shape/data/aots/tests/cmap12.tests
new file mode 100644 (file)
index 0000000..9d9cf14
--- /dev/null
@@ -0,0 +1 @@
+../fonts/cmap12_font1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions --font-funcs=ot;U+0000,U+0001,U+0010,U+101723,U+101724,U+101727,U+101728,U+102522,U+102523,U+102527,U+102528,U+FFFF;[0|0|0|23|24|27|0|0|53|57|0|0]
diff --git a/test/shape/data/aots/tests/cmap2.tests b/test/shape/data/aots/tests/cmap2.tests
new file mode 100644 (file)
index 0000000..2ffc351
--- /dev/null
@@ -0,0 +1 @@
+#../fonts/cmap2_font1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions --font-funcs=ot;U+0000,U+0001,U+0033,U+0034,U+0035,U+0036,U+0037,U+8431,U+8432,U+8434,U+9232,U+FFFF;[0|0|0|17|56|12|0|0|20|22|23|0]
diff --git a/test/shape/data/aots/tests/cmap4.tests b/test/shape/data/aots/tests/cmap4.tests
new file mode 100644 (file)
index 0000000..2416afc
--- /dev/null
@@ -0,0 +1,6 @@
+../fonts/cmap4_font1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions --font-funcs=ot;U+0000,U+0001,U+0010,U+0011,U+0012,U+001E,U+001F,U+00C7,U+00C8,U+00CD,U+00D2,U+00D3,U+FFFF;[0|0|0|40|41|53|0|0|256|261|266|0|0]
+../fonts/cmap4_font2.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions --font-funcs=ot;U+0000,U+0001,U+0010,U+0011,U+0012,U+001E,U+001F,U+00C7,U+00C8,U+00CD,U+00D2,U+00D3,U+FFFF;[0|0|0|0|0|0|0|0|0|0|0|0|0]
+../fonts/cmap4_font3.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions --font-funcs=ot;U+0000,U+0001,U+0010,U+0011,U+0012,U+001E,U+001F,U+00C7,U+00C8,U+00CD,U+00D2,U+00D3,U+FFFF;[0|0|0|0|0|0|0|0|0|0|0|0|65534]
+../fonts/cmap4_font4.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions --font-funcs=ot;U+0000,U+AFC7,U+AFC8,U+AFC9,U+B02B,U+B02C,U+B02D;[0|0|44500|44501|44599|44600|0]
+#../fonts/cmap4_font4.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions --font-funcs=ot;U+0000,U+FDE7,U+FDE8,U+FDE9,U+FE0B,U+FE0C,U+FE0D,U+FE4C,U+FE4D;[0|0|65500|65501|65535|0]
+../fonts/cmap4_font4.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions --font-funcs=ot;U+0000,U+0063,U+0064,U+01F3,U+01F4,U+01F5,U+03E8,U+03E9;[0|0|65136|65535|0|1|500|0]
diff --git a/test/shape/data/aots/tests/cmap6.tests b/test/shape/data/aots/tests/cmap6.tests
new file mode 100644 (file)
index 0000000..c79d4d8
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/cmap6_font1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions --font-funcs=ot;U+0000,U+0001,U+0021,U+0022,U+0023,U+0024,U+0025,U+FFFF;[0|0|0|17|56|12|0|0]
+../fonts/cmap6_font2.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions --font-funcs=ot;U+0000,U+0001,U+0021,U+0022,U+0023,U+0024,U+0025,U+FFFF;[0|0|0|0|0|0|0|0]
diff --git a/test/shape/data/aots/tests/cmap8.tests b/test/shape/data/aots/tests/cmap8.tests
new file mode 100644 (file)
index 0000000..62cd941
--- /dev/null
@@ -0,0 +1 @@
+#../fonts/cmap8_font1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions --font-funcs=ot;U+0000,U+0001,U+0033,U+0034,U+0035,U+0036,U+0037,U+8431,U+8432,U+8434,U+9232,U+109422,U+109423,U+109424,U+109425,U+FFFF;[0|0|0|17|56|12|0|0|20|22|23|0|26|27|32|0]
diff --git a/test/shape/data/aots/tests/gpos1_1_lookupflag.tests b/test/shape/data/aots/tests/gpos1_1_lookupflag.tests
new file mode 100644 (file)
index 0000000..790d9df
--- /dev/null
@@ -0,0 +1 @@
+../fonts/gpos1_1_lookupflag_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0011,U+0012,U+0013,U+0014,U+0015;[17|18@1500,0|19@3000,0|20@4200,0|21@6000,0]
diff --git a/test/shape/data/aots/tests/gpos1_1_simple.tests b/test/shape/data/aots/tests/gpos1_1_simple.tests
new file mode 100644 (file)
index 0000000..0137962
--- /dev/null
@@ -0,0 +1,4 @@
+../fonts/gpos1_1_simple_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0011,U+0012,U+0013,U+0014,U+0015;[17|18@1300,0|19@3000,0|20@4300,0|21@6000,0]
+../fonts/gpos1_1_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0011,U+0012,U+0013,U+0014,U+0015;[17|18@1500,-200|19@3000,0|20@4500,-200|21@6000,0]
+../fonts/gpos1_1_simple_f3.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0011,U+0012,U+0013,U+0014,U+0015;[17|18@1500,0|19@2800,0|20@4300,0|21@5600,0]
+#../fonts/gpos1_1_simple_f4.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0011,U+0012,U+0013,U+0014,U+0015;[17|18@1500,0|19@3000,-200|20@4500,-200|21@6000,-400]
diff --git a/test/shape/data/aots/tests/gpos1_2.tests b/test/shape/data/aots/tests/gpos1_2.tests
new file mode 100644 (file)
index 0000000..6dbb577
--- /dev/null
@@ -0,0 +1 @@
+../fonts/gpos1_2_font1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0011,U+0012,U+0013,U+0014,U+0015;[17|18@1300,0|19@3000,0|20@4200,0|21@6000,0]
diff --git a/test/shape/data/aots/tests/gpos1_2_lookupflag.tests b/test/shape/data/aots/tests/gpos1_2_lookupflag.tests
new file mode 100644 (file)
index 0000000..41579a7
--- /dev/null
@@ -0,0 +1 @@
+../fonts/gpos1_2_font2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0011,U+0012,U+0013,U+0014,U+0015;[17|18@1500,0|19@3000,0|20@4200,0|21@6000,0]
diff --git a/test/shape/data/aots/tests/gpos2_1.tests b/test/shape/data/aots/tests/gpos2_1.tests
new file mode 100644 (file)
index 0000000..bafdc85
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/gpos2_1_font6.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0011,U+0012,U+0013,U+0011,U+0012,U+0014,U+0011;[17|18@1300,0|19@3000,-100|17@4500,0|18@5700,0|20@7500,-400|17@9000,0]
+../fonts/gpos2_1_font7.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0011,U+0012,U+0013,U+0011,U+0012,U+0014,U+0011,U+0015,U+0016,U+0011;[17|18@1300,0|19@3000,-100|17@4500,0|18@5700,0|20@7500,-400|17@9000,0|21@10000,0|22@12000,-600|17@13500,0]
diff --git a/test/shape/data/aots/tests/gpos2_1_lookupflag.tests b/test/shape/data/aots/tests/gpos2_1_lookupflag.tests
new file mode 100644 (file)
index 0000000..e9d1bab
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/gpos2_1_lookupflag_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0011,U+0013,U+0014,U+0011,U+0013,U+0012,U+0014,U+0011;[17|19@1300,0|20@3000,-100|17@4500,0|19@5800,0|18@7500,0|20@9000,-100|17@10500,0]
+../fonts/gpos2_1_lookupflag_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0011,U+0013,U+0014,U+0011,U+0013,U+0012,U+0014,U+0011;[17|19@1500,0|20@2800,-100|17@4300,0|19@5800,0|18@7100,0|20@8600,-100|17@10100,0]
diff --git a/test/shape/data/aots/tests/gpos2_1_next_glyph.tests b/test/shape/data/aots/tests/gpos2_1_next_glyph.tests
new file mode 100644 (file)
index 0000000..09b368f
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/gpos2_1_next_glyph_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0012,U+0012,U+0012,U+0012;[18@-100,0|18@1500,-100|18@2900,0|18@4500,-100]
+../fonts/gpos2_1_next_glyph_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0012,U+0012,U+0012,U+0012;[18@-100,0|18@1400,0|18@2900,0|18@4500,0]
diff --git a/test/shape/data/aots/tests/gpos2_1_simple.tests b/test/shape/data/aots/tests/gpos2_1_simple.tests
new file mode 100644 (file)
index 0000000..6c69a94
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/gpos2_1_simple_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0011,U+0012,U+0013,U+0011,U+0012,U+0014;[17|18@1300,0|19@3000,-100|17@4500,0|18@6000,0|20@7500,0]
+../fonts/gpos2_1_simple_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0011,U+0012;[17|18@1500,0]
diff --git a/test/shape/data/aots/tests/gpos2_2.tests b/test/shape/data/aots/tests/gpos2_2.tests
new file mode 100644 (file)
index 0000000..6a3084c
--- /dev/null
@@ -0,0 +1,5 @@
+../fonts/gpos2_2_font1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0011,U+0012,U+0013,U+0011,U+0012,U+0014;[17|18@1300,0|19@3000,-100|17@4500,0|18@6000,0|20@7500,0]
+../fonts/gpos2_2_font2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0011,U+0013,U+0014,U+0011,U+0013,U+0012,U+0014,U+0011;[17|19@1300,0|20@3000,-100|17@4500,0|19@5800,0|18@7500,0|20@9000,-100|17@10500,0]
+../fonts/gpos2_2_font3.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0011,U+0013,U+0014,U+0011,U+0013,U+0012,U+0014,U+0011;[17|19@1500,0|20@2800,-100|17@4300,0|19@5800,0|18@7100,0|20@8600,-100|17@10100,0]
+../fonts/gpos2_2_font4.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0012,U+0012,U+0012,U+0012;[18@-100,0|18@1500,-100|18@2900,0|18@4500,-100]
+../fonts/gpos2_2_font5.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0012,U+0012,U+0012,U+0012;[18@-100,0|18@1400,0|18@2900,0|18@4500,0]
diff --git a/test/shape/data/aots/tests/gpos3.tests b/test/shape/data/aots/tests/gpos3.tests
new file mode 100644 (file)
index 0000000..b7cb579
--- /dev/null
@@ -0,0 +1,11 @@
+#../fonts/gpos3_font1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0011,U+0012,U+0013,U+0011;[17|18@1500,0|19@1599,99|17@4500,0]
+../fonts/gpos3_font1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0011,U+0012,U+0011,U+0013,U+0011;[17|18@1500,0|17@3000,0|19@4500,0|17@6000,0]
+#../fonts/gpos3_font3.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0011,U+0012,U+0012,U+0011;[17|18@1500,0|18@1600,100|17@4500,0]
+#../fonts/gpos3_font3.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0011,U+0012,U+0013,U+0011;[17|18@1500,0|19@1599,99|17@4500,0]
+#../fonts/gpos3_font3.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0011,U+0014,U+0012,U+0011;[17|20@1500,0|18@1602,102|17@4500,0]
+#../fonts/gpos3_font3.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0011,U+0014,U+0013,U+0011;[17|20@1500,0|19@1601,101|17@4500,0]
+../fonts/gpos3_font3.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0011,U+0012,U+0014,U+0011;[17|18@1500,0|20@3000,0|17@4500,0]
+../fonts/gpos3_font3.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0011,U+0013,U+0012,U+0011;[17|19@1500,0|18@3000,0|17@4500,0]
+../fonts/gpos3_font3.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0011,U+0013,U+0014,U+0011;[17|19@1500,0|20@3000,0|17@4500,0]
+../fonts/gpos3_font3.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0011,U+0012;[17|18@1500,0]
+../fonts/gpos3_font3.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0011,U+0012,U+0015,U+0015,U+0015;[17|18@1500,0|21@3000,0|21@4500,0|21@6000,0]
diff --git a/test/shape/data/aots/tests/gpos3_lookupflag.tests b/test/shape/data/aots/tests/gpos3_lookupflag.tests
new file mode 100644 (file)
index 0000000..936d936
--- /dev/null
@@ -0,0 +1,2 @@
+#../fonts/gpos3_font2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0011,U+0012,U+0015,U+0013,U+0011;[17|18@1500,0|21@3000,0|19@1599,99|17@6000,0]
+#../fonts/gpos3_font2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0011,U+0012,U+0015,U+0015,U+0015,U+0013,U+0011;[17|18@1500,0|21@3000,0|21@4500,0|21@6000,0|19@1599,99|17@9000,0]
diff --git a/test/shape/data/aots/tests/gpos4_lookupflag.tests b/test/shape/data/aots/tests/gpos4_lookupflag.tests
new file mode 100644 (file)
index 0000000..5ca6e1a
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/gpos4_lookupflag_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0011,U+0012,U+0011,U+0013,U+0011;[17|18@1500,0|17@3000,0|19@4500,0|17@4500,0]
+../fonts/gpos4_lookupflag_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0011,U+0012,U+0013,U+0011;[17|18@1500,0|19@3000,0|17@3000,0]
diff --git a/test/shape/data/aots/tests/gpos4_multiple_anchors.tests b/test/shape/data/aots/tests/gpos4_multiple_anchors.tests
new file mode 100644 (file)
index 0000000..9eddc02
--- /dev/null
@@ -0,0 +1 @@
+#../fonts/gpos4_multiple_anchors_1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0011,U+0013,U+0014,U+0015,U+0016,U+0012,U+0013,U+0014,U+0015,U+0016;[17|19@-100,-80|20@-1591,-71|21@-3102,-82|22@-4593,-73|18@1500,0|19@1420,-60|20@-71,-51|21@-1582,-62|22@-3073,-53]
diff --git a/test/shape/data/aots/tests/gpos4_simple.tests b/test/shape/data/aots/tests/gpos4_simple.tests
new file mode 100644 (file)
index 0000000..37a63f0
--- /dev/null
@@ -0,0 +1,5 @@
+../fonts/gpos4_simple_1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0011,U+0012,U+0013,U+0011;[17|18@1500,0|19@1400,-80|17@3000,0]
+../fonts/gpos4_simple_1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0011,U+0011,U+0013,U+0011;[17|17@1500,0|19@3000,0|17@3000,0]
+../fonts/gpos4_simple_1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0019,U+0019,U+0013,U+0011;[25|25@1500,0|19@3000,0|17@3000,0]
+#../fonts/gpos4_simple_1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0011,U+0012,U+0013,U+0013,U+0011;[17|18@1500,0|19@1400,-80|19@-100,-80|17@3000,0]
+#../fonts/gpos4_simple_1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0011,U+0012,U+0014,U+0013,U+0011;[17|18@1500,0|20@3000,0|19@-100,-80|17@3000,0]
diff --git a/test/shape/data/aots/tests/gpos5.tests b/test/shape/data/aots/tests/gpos5.tests
new file mode 100644 (file)
index 0000000..8590954
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/gpos5_font1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0011,U+001E,U+0013,U+001F,U+0011;[17|18@1500,0|19@1400,-80|17@3000,0]
+../fonts/gpos5_font1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0011,U+001E,U+001F,U+0013,U+0011;[17|18@1500,0|19@1401,-79|17@3000,0]
diff --git a/test/shape/data/aots/tests/gpos6.tests b/test/shape/data/aots/tests/gpos6.tests
new file mode 100644 (file)
index 0000000..27a2afa
--- /dev/null
@@ -0,0 +1,3 @@
+#../fonts/gpos6_font1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0011,U+0012,U+0013,U+0011;[17|18@1500,0|19@-100,-80|17@1500,0]
+../fonts/gpos6_font1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0011,U+0011,U+0013,U+0011;[17|17@1500,0|19@3000,0|17@3000,0]
+../fonts/gpos6_font1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0014,U+0014,U+0013,U+0011;[20|20|19|17]
diff --git a/test/shape/data/aots/tests/gpos7_1.tests b/test/shape/data/aots/tests/gpos7_1.tests
new file mode 100644 (file)
index 0000000..3fb28d8
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/gpos7_1_font1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0011,U+0012,U+0013,U+0014,U+0015;[17|18@1600,0|19@3200,0|20@4800,0|21@6000,0]
+../fonts/gpos7_1_font1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0011,U+0012,U+0011,U+0012,U+0013,U+0011;[17|18@1500,0|17@3000,0|18@4500,0|19@6000,0|17@7500,0]
diff --git a/test/shape/data/aots/tests/gpos9.tests b/test/shape/data/aots/tests/gpos9.tests
new file mode 100644 (file)
index 0000000..84c2d42
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/gpos9_font1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0011,U+0012,U+0013,U+0014,U+0015;[17|18@1300,0|19@3000,0|20@4300,0|21@6000,0]
+../fonts/gpos9_font2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0011,U+0012,U+0013,U+0014,U+0015,U+0011;[17|18@1300,0|19@2700,0|20@4300,0|21@5700,0|17@7500,0]
diff --git a/test/shape/data/aots/tests/gpos_chaining1_boundary.tests b/test/shape/data/aots/tests/gpos_chaining1_boundary.tests
new file mode 100644 (file)
index 0000000..2841c31
--- /dev/null
@@ -0,0 +1,4 @@
+../fonts/gpos_chaining1_boundary_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016,U+0017,U+0000;[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|0@7500,0]
+../fonts/gpos_chaining1_boundary_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016,U+0017,U+0000;[0|20@1500,0|21@3020,0|22@4500,0|23@6000,0|0@7500,0]
+../fonts/gpos_chaining1_boundary_f3.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016,U+0017,U+0000;[0|20@1500,0|21@3020,0|22@4500,0|23@6000,0|0@7500,0]
+../fonts/gpos_chaining1_boundary_f4.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016,U+0017,U+0000;[0|20@1500,0|21@3000,0|22@4520,0|23@6000,0|0@7500,0]
diff --git a/test/shape/data/aots/tests/gpos_chaining1_lookupflag.tests b/test/shape/data/aots/tests/gpos_chaining1_lookupflag.tests
new file mode 100644 (file)
index 0000000..96db43f
--- /dev/null
@@ -0,0 +1 @@
+../fonts/gpos_chaining1_lookupflag_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+005A,U+0015,U+005B,U+0016,U+005C,U+0017,U+005D,U+005E,U+0018,U+005A,U+0019,U+005B,U+001A,U+0000;[0|20@1500,0|90@3000,0|21@3000,0|91@4500,0|22@4500,0|92@6000,0|23@6020,0|93@7500,0|94@7500,0|24@7500,0|90@9000,0|25@9000,0|91@10500,0|26@10500,0|0@12000,0]
diff --git a/test/shape/data/aots/tests/gpos_chaining1_multiple_subrules.tests b/test/shape/data/aots/tests/gpos_chaining1_multiple_subrules.tests
new file mode 100644 (file)
index 0000000..e9e747e
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/gpos_chaining1_multiple_subrules_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000,U+0014,U+0015,U+0016,U+0017,U+0000;[0|20@1500,0|21@3020,0|22@4500,0|23@6000,0|24@7500,0|0@9000,0|20@10500,0|21@12000,0|22@13520,0|23@15000,0|0@16500,0]
+../fonts/gpos_chaining1_multiple_subrules_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000,U+0014,U+0015,U+0016,U+0017,U+0000;[0|20@1500,0|21@3000,0|22@4520,0|23@6000,0|24@7500,0|0@9000,0|20@10500,0|21@12000,0|22@13520,0|23@15000,0|0@16500,0]
diff --git a/test/shape/data/aots/tests/gpos_chaining1_next_glyph.tests b/test/shape/data/aots/tests/gpos_chaining1_next_glyph.tests
new file mode 100644 (file)
index 0000000..c11060b
--- /dev/null
@@ -0,0 +1 @@
+../fonts/gpos_chaining1_next_glyph_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016,U+0017,U+0000;[0|20@1500,0|21@3020,0|22@4520,0|23@6020,0|0@7500,0]
diff --git a/test/shape/data/aots/tests/gpos_chaining1_simple.tests b/test/shape/data/aots/tests/gpos_chaining1_simple.tests
new file mode 100644 (file)
index 0000000..03b037b
--- /dev/null
@@ -0,0 +1,11 @@
+../fonts/gpos_chaining1_simple_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016,U+0017,U+0000;[0|20@1500,0|21@3020,0|22@4520,0|23@6000,0|0@7500,0]
+../fonts/gpos_chaining1_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000;[0|20@1500,0|21@3000,0|22@4520,0|23@6000,0|24@7500,0|25@9000,0|26@10500,0|0@12000,0]
+../fonts/gpos_chaining1_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+0000,U+0000;[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0|25@9000,0|0@10500,0|0@12000,0]
+../fonts/gpos_chaining1_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019;[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0|25@9000,0]
+../fonts/gpos_chaining1_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016,U+0017,U+0018;[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0]
+../fonts/gpos_chaining1_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0000,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000;[0|0@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0|25@9000,0|26@10500,0|0@12000,0]
+../fonts/gpos_chaining1_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000;[21|22@1500,0|23@3000,0|24@4500,0|25@6000,0|26@7500,0|0@9000,0]
+../fonts/gpos_chaining1_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0016,U+0017,U+0018,U+0019,U+001A,U+0000;[22|23@1500,0|24@3000,0|25@4500,0|26@6000,0|0@7500,0]
+../fonts/gpos_chaining1_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016,U+0000,U+0018,U+0019,U+001A,U+0000;[0|20@1500,0|21@3000,0|22@4500,0|0@6000,0|24@7500,0|25@9000,0|26@10500,0|0@12000,0]
+../fonts/gpos_chaining1_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016,U+0017;[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0]
+../fonts/gpos_chaining1_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016;[0|20@1500,0|21@3000,0|22@4500,0]
diff --git a/test/shape/data/aots/tests/gpos_chaining1_successive.tests b/test/shape/data/aots/tests/gpos_chaining1_successive.tests
new file mode 100644 (file)
index 0000000..a869247
--- /dev/null
@@ -0,0 +1 @@
+../fonts/gpos_chaining1_successive_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0019,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000;[0|25@1500,0|20@3000,0|21@4520,0|22@6020,0|23@7500,0|24@9000,0|0@10500,0]
diff --git a/test/shape/data/aots/tests/gpos_chaining2_boundary.tests b/test/shape/data/aots/tests/gpos_chaining2_boundary.tests
new file mode 100644 (file)
index 0000000..78195fb
--- /dev/null
@@ -0,0 +1,4 @@
+../fonts/gpos_chaining2_boundary_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016,U+0017,U+0000;[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|0@7500,0]
+../fonts/gpos_chaining2_boundary_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016,U+0017,U+0000;[0|20@1500,0|21@3020,0|22@4500,0|23@6000,0|0@7500,0]
+../fonts/gpos_chaining2_boundary_f3.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016,U+0017,U+0000;[0|20@1500,0|21@3020,0|22@4500,0|23@6000,0|0@7500,0]
+../fonts/gpos_chaining2_boundary_f4.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016,U+0017,U+0000;[0|20@1500,0|21@3000,0|22@4520,0|23@6000,0|0@7500,0]
diff --git a/test/shape/data/aots/tests/gpos_chaining2_lookupflag.tests b/test/shape/data/aots/tests/gpos_chaining2_lookupflag.tests
new file mode 100644 (file)
index 0000000..3f25512
--- /dev/null
@@ -0,0 +1 @@
+../fonts/gpos_chaining2_lookupflag_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+005A,U+0015,U+005B,U+0016,U+005C,U+0017,U+005D,U+005E,U+0018,U+005A,U+0019,U+005B,U+001A,U+0000;[0|20@1500,0|90@3000,0|21@3000,0|91@4500,0|22@4500,0|92@6000,0|23@6020,0|93@7500,0|94@7500,0|24@7500,0|90@9000,0|25@9000,0|91@10500,0|26@10500,0|0@12000,0]
diff --git a/test/shape/data/aots/tests/gpos_chaining2_multiple_subrules.tests b/test/shape/data/aots/tests/gpos_chaining2_multiple_subrules.tests
new file mode 100644 (file)
index 0000000..066f53f
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/gpos_chaining2_multiple_subrules_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000,U+0014,U+0015,U+0016,U+0017,U+0000;[0|20@1500,0|21@3020,0|22@4500,0|23@6000,0|24@7500,0|0@9000,0|20@10500,0|21@12000,0|22@13520,0|23@15000,0|0@16500,0]
+../fonts/gpos_chaining2_multiple_subrules_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000,U+0014,U+0015,U+0016,U+0017,U+0000;[0|20@1500,0|21@3000,0|22@4520,0|23@6000,0|24@7500,0|0@9000,0|20@10500,0|21@12000,0|22@13520,0|23@15000,0|0@16500,0]
diff --git a/test/shape/data/aots/tests/gpos_chaining2_next_glyph.tests b/test/shape/data/aots/tests/gpos_chaining2_next_glyph.tests
new file mode 100644 (file)
index 0000000..dbb353c
--- /dev/null
@@ -0,0 +1 @@
+../fonts/gpos_chaining2_next_glyph_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016,U+0017,U+0000;[0|20@1500,0|21@3020,0|22@4520,0|23@6020,0|0@7500,0]
diff --git a/test/shape/data/aots/tests/gpos_chaining2_simple.tests b/test/shape/data/aots/tests/gpos_chaining2_simple.tests
new file mode 100644 (file)
index 0000000..41303d4
--- /dev/null
@@ -0,0 +1,11 @@
+../fonts/gpos_chaining2_simple_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016,U+0017,U+0000;[0|20@1500,0|21@3020,0|22@4520,0|23@6000,0|0@7500,0]
+../fonts/gpos_chaining2_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000;[0|20@1500,0|21@3000,0|22@4520,0|23@6000,0|24@7500,0|25@9000,0|26@10500,0|0@12000,0]
+../fonts/gpos_chaining2_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+0000,U+0000;[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0|25@9000,0|0@10500,0|0@12000,0]
+../fonts/gpos_chaining2_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019;[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0|25@9000,0]
+../fonts/gpos_chaining2_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016,U+0017,U+0018;[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0]
+../fonts/gpos_chaining2_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0000,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000;[0|0@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0|25@9000,0|26@10500,0|0@12000,0]
+../fonts/gpos_chaining2_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000;[21|22@1500,0|23@3000,0|24@4500,0|25@6000,0|26@7500,0|0@9000,0]
+../fonts/gpos_chaining2_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0016,U+0017,U+0018,U+0019,U+001A,U+0000;[22|23@1500,0|24@3000,0|25@4500,0|26@6000,0|0@7500,0]
+../fonts/gpos_chaining2_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016,U+0000,U+0018,U+0019,U+001A,U+0000;[0|20@1500,0|21@3000,0|22@4500,0|0@6000,0|24@7500,0|25@9000,0|26@10500,0|0@12000,0]
+../fonts/gpos_chaining2_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016,U+0017;[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0]
+../fonts/gpos_chaining2_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016;[0|20@1500,0|21@3000,0|22@4500,0]
diff --git a/test/shape/data/aots/tests/gpos_chaining2_successive.tests b/test/shape/data/aots/tests/gpos_chaining2_successive.tests
new file mode 100644 (file)
index 0000000..df30a0e
--- /dev/null
@@ -0,0 +1 @@
+../fonts/gpos_chaining2_successive_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0019,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000;[0|25@1500,0|20@3000,0|21@4520,0|22@6020,0|23@7500,0|24@9000,0|0@10500,0]
diff --git a/test/shape/data/aots/tests/gpos_chaining3_boundary.tests b/test/shape/data/aots/tests/gpos_chaining3_boundary.tests
new file mode 100644 (file)
index 0000000..f93e2e6
--- /dev/null
@@ -0,0 +1,4 @@
+../fonts/gpos_chaining3_boundary_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016,U+0017,U+0000;[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|0@7500,0]
+../fonts/gpos_chaining3_boundary_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016,U+0017,U+0000;[0|20@1500,0|21@3020,0|22@4500,0|23@6000,0|0@7500,0]
+../fonts/gpos_chaining3_boundary_f3.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016,U+0017,U+0000;[0|20@1500,0|21@3020,0|22@4500,0|23@6000,0|0@7500,0]
+../fonts/gpos_chaining3_boundary_f4.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016,U+0017,U+0000;[0|20@1500,0|21@3000,0|22@4520,0|23@6000,0|0@7500,0]
diff --git a/test/shape/data/aots/tests/gpos_chaining3_lookupflag.tests b/test/shape/data/aots/tests/gpos_chaining3_lookupflag.tests
new file mode 100644 (file)
index 0000000..ea0f57e
--- /dev/null
@@ -0,0 +1 @@
+../fonts/gpos_chaining3_lookupflag_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+005A,U+0015,U+005B,U+0016,U+005C,U+0017,U+005D,U+005E,U+0018,U+005A,U+0019,U+005B,U+001A,U+0000;[0|20@1500,0|90@3000,0|21@3000,0|91@4500,0|22@4500,0|92@6000,0|23@6020,0|93@7500,0|94@7500,0|24@7500,0|90@9000,0|25@9000,0|91@10500,0|26@10500,0|0@12000,0]
diff --git a/test/shape/data/aots/tests/gpos_chaining3_next_glyph.tests b/test/shape/data/aots/tests/gpos_chaining3_next_glyph.tests
new file mode 100644 (file)
index 0000000..ea985a6
--- /dev/null
@@ -0,0 +1 @@
+../fonts/gpos_chaining3_next_glyph_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0016,U+0015,U+0016,U+0015,U+0016,U+0015,U+0000;[0|22@1500,0|21@3020,0|22@4500,0|21@6020,0|22@7500,0|21@9000,0|0@10500,0]
diff --git a/test/shape/data/aots/tests/gpos_chaining3_simple.tests b/test/shape/data/aots/tests/gpos_chaining3_simple.tests
new file mode 100644 (file)
index 0000000..648a4d5
--- /dev/null
@@ -0,0 +1,11 @@
+../fonts/gpos_chaining3_simple_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016,U+0017,U+0000;[0|20@1500,0|21@3020,0|22@4520,0|23@6000,0|0@7500,0]
+../fonts/gpos_chaining3_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000;[0|20@1500,0|21@3000,0|22@4520,0|23@6000,0|24@7500,0|25@9000,0|26@10500,0|0@12000,0]
+../fonts/gpos_chaining3_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+0000,U+0000;[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0|25@9000,0|0@10500,0|0@12000,0]
+../fonts/gpos_chaining3_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019;[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0|25@9000,0]
+../fonts/gpos_chaining3_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016,U+0017,U+0018;[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0]
+../fonts/gpos_chaining3_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0000,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000;[0|0@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0|25@9000,0|26@10500,0|0@12000,0]
+../fonts/gpos_chaining3_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000;[21|22@1500,0|23@3000,0|24@4500,0|25@6000,0|26@7500,0|0@9000,0]
+../fonts/gpos_chaining3_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0016,U+0017,U+0018,U+0019,U+001A,U+0000;[22|23@1500,0|24@3000,0|25@4500,0|26@6000,0|0@7500,0]
+../fonts/gpos_chaining3_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016,U+0000,U+0018,U+0019,U+001A,U+0000;[0|20@1500,0|21@3000,0|22@4500,0|0@6000,0|24@7500,0|25@9000,0|26@10500,0|0@12000,0]
+../fonts/gpos_chaining3_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016,U+0017;[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0]
+../fonts/gpos_chaining3_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016;[0|20@1500,0|21@3000,0|22@4500,0]
diff --git a/test/shape/data/aots/tests/gpos_chaining3_successive.tests b/test/shape/data/aots/tests/gpos_chaining3_successive.tests
new file mode 100644 (file)
index 0000000..d98d6fe
--- /dev/null
@@ -0,0 +1 @@
+../fonts/gpos_chaining3_successive_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0019,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000;[0|25@1500,0|20@3000,0|21@4520,0|22@6020,0|23@7500,0|24@9000,0|0@10500,0]
diff --git a/test/shape/data/aots/tests/gpos_context1_boundary.tests b/test/shape/data/aots/tests/gpos_context1_boundary.tests
new file mode 100644 (file)
index 0000000..ea4c351
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/gpos_context1_boundary_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000;[0|20@1500,0|20@3000,0|20@4500,0|20@6000,0|20@7500,0|0@9000,0]
+../fonts/gpos_context1_boundary_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000;[0|20@1520,0|20@3020,0|20@4520,0|20@6020,0|20@7520,0|0@9000,0]
diff --git a/test/shape/data/aots/tests/gpos_context1_expansion.tests b/test/shape/data/aots/tests/gpos_context1_expansion.tests
new file mode 100644 (file)
index 0000000..63681e9
--- /dev/null
@@ -0,0 +1 @@
+../fonts/gpos_context1_expansion_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016,U+0000;[0|20@1500,0|21@3000,0|22@4500,0|0@6000,0]
diff --git a/test/shape/data/aots/tests/gpos_context1_lookupflag.tests b/test/shape/data/aots/tests/gpos_context1_lookupflag.tests
new file mode 100644 (file)
index 0000000..4082840
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/gpos_context1_lookupflag_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+005A,U+0015,U+005B,U+005C,U+0016,U+0000;[0|20@1520,0|90@3000,0|21@3020,0|91@4500,0|92@4500,0|22@4520,0|0@6000,0]
+../fonts/gpos_context1_lookupflag_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+005A,U+0015,U+005B,U+005C,U+0016,U+0000;[0|20@1500,0|90@3000,0|21@3020,0|91@4500,0|92@4500,0|22@4500,0|0@6000,0]
diff --git a/test/shape/data/aots/tests/gpos_context1_multiple_subrules.tests b/test/shape/data/aots/tests/gpos_context1_multiple_subrules.tests
new file mode 100644 (file)
index 0000000..551997b
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/gpos_context1_multiple_subrules_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016,U+0000,U+0014,U+0015,U+0000;[0|20@1520,0|21@3000,0|22@4500,0|0@6000,0|20@7500,0|21@9020,0|0@10500,0]
+../fonts/gpos_context1_multiple_subrules_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016,U+0000,U+0014,U+0015,U+0000;[0|20@1500,0|21@3020,0|22@4500,0|0@6000,0|20@7500,0|21@9020,0|0@10500,0]
diff --git a/test/shape/data/aots/tests/gpos_context1_next_glyph.tests b/test/shape/data/aots/tests/gpos_context1_next_glyph.tests
new file mode 100644 (file)
index 0000000..b3d7cf2
--- /dev/null
@@ -0,0 +1 @@
+../fonts/gpos_context1_next_glyph_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000;[0|20@1520,0|20@3000,0|20@4520,0|20@6000,0|20@7500,0|0@9000,0]
diff --git a/test/shape/data/aots/tests/gpos_context1_simple.tests b/test/shape/data/aots/tests/gpos_context1_simple.tests
new file mode 100644 (file)
index 0000000..9b3c28b
--- /dev/null
@@ -0,0 +1,3 @@
+../fonts/gpos_context1_simple_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016,U+0000;[0|20@1520,0|21@3020,0|22@4520,0|0@6000,0]
+../fonts/gpos_context1_simple_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0000,U+0014,U+0015,U+0000;[0|20@1500,0|0@3000,0|20@4500,0|21@6000,0|0@7500,0]
+../fonts/gpos_context1_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000;[0|20@1500,0|20@3020,0|20@4500,0|20@6000,0|20@7500,0|0@9000,0]
diff --git a/test/shape/data/aots/tests/gpos_context1_successive.tests b/test/shape/data/aots/tests/gpos_context1_successive.tests
new file mode 100644 (file)
index 0000000..33a8c80
--- /dev/null
@@ -0,0 +1 @@
+../fonts/gpos_context1_successive_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016,U+0017,U+0000;[0|20@1500,0|21@3020,0|22@4520,0|23@6000,0|0@7500,0]
diff --git a/test/shape/data/aots/tests/gpos_context2_boundary.tests b/test/shape/data/aots/tests/gpos_context2_boundary.tests
new file mode 100644 (file)
index 0000000..d46d963
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/gpos_context2_boundary_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000;[0|20@1500,0|20@3000,0|20@4500,0|20@6000,0|20@7500,0|0@9000,0]
+../fonts/gpos_context2_boundary_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000;[0|20@1520,0|20@3020,0|20@4520,0|20@6020,0|20@7520,0|0@9000,0]
diff --git a/test/shape/data/aots/tests/gpos_context2_classes.tests b/test/shape/data/aots/tests/gpos_context2_classes.tests
new file mode 100644 (file)
index 0000000..77884ed
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/gpos_context2_classes_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+001A,U+001C,U+0018,U+0000,U+0015,U+001B,U+001A,U+0018,U+0000,U+0016,U+001B,U+001A,U+0018;[0|20@1500,0|26@3020,0|28@4500,0|24@6000,0|0@7500,0|21@9000,0|27@10520,0|26@12000,0|24@13500,0|0@15000,0|22@16500,0|27@18000,0|26@19500,0|24@21000,0]
+../fonts/gpos_context2_classes_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0016,U+001B,U+001A,U+0018,U+0000,U+0018,U+0018,U+001D,U+0016,U+0000,U+0016,U+001B,U+001A,U+0018;[0|22@1500,0|27@3020,0|26@4500,0|24@6000,0|0@7500,0|24@9000,0|24@10500,0|29@12020,0|22@13500,0|0@15000,0|22@16500,0|27@18020,0|26@19500,0|24@21000,0]
diff --git a/test/shape/data/aots/tests/gpos_context2_expansion.tests b/test/shape/data/aots/tests/gpos_context2_expansion.tests
new file mode 100644 (file)
index 0000000..10ef83e
--- /dev/null
@@ -0,0 +1 @@
+../fonts/gpos_context2_expansion_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016,U+0000;[0|20@1500,0|21@3000,0|22@4500,0|0@6000,0]
diff --git a/test/shape/data/aots/tests/gpos_context2_lookupflag.tests b/test/shape/data/aots/tests/gpos_context2_lookupflag.tests
new file mode 100644 (file)
index 0000000..be7c1f3
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/gpos_context2_lookupflag_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+005A,U+0015,U+005B,U+005C,U+0016,U+0000;[0|20@1520,0|90@3000,0|21@3020,0|91@4500,0|92@4500,0|22@4520,0|0@6000,0]
+../fonts/gpos_context2_lookupflag_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+005A,U+0015,U+005B,U+005C,U+0016,U+0000;[0|20@1500,0|90@3000,0|21@3020,0|91@4500,0|92@4500,0|22@4500,0|0@6000,0]
diff --git a/test/shape/data/aots/tests/gpos_context2_multiple_subrules.tests b/test/shape/data/aots/tests/gpos_context2_multiple_subrules.tests
new file mode 100644 (file)
index 0000000..4df79f5
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/gpos_context2_multiple_subrules_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016,U+0000,U+0014,U+0015,U+0000;[0|20@1520,0|21@3000,0|22@4500,0|0@6000,0|20@7500,0|21@9020,0|0@10500,0]
+../fonts/gpos_context2_multiple_subrules_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016,U+0000,U+0014,U+0015,U+0000;[0|20@1500,0|21@3020,0|22@4500,0|0@6000,0|20@7500,0|21@9020,0|0@10500,0]
diff --git a/test/shape/data/aots/tests/gpos_context2_next_glyph.tests b/test/shape/data/aots/tests/gpos_context2_next_glyph.tests
new file mode 100644 (file)
index 0000000..501fa81
--- /dev/null
@@ -0,0 +1 @@
+../fonts/gpos_context2_next_glyph_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000;[0|20@1520,0|20@3000,0|20@4520,0|20@6000,0|20@7500,0|0@9000,0]
diff --git a/test/shape/data/aots/tests/gpos_context2_simple.tests b/test/shape/data/aots/tests/gpos_context2_simple.tests
new file mode 100644 (file)
index 0000000..4922d3e
--- /dev/null
@@ -0,0 +1,3 @@
+../fonts/gpos_context2_simple_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016,U+0000;[0|20@1520,0|21@3020,0|22@4520,0|0@6000,0]
+../fonts/gpos_context2_simple_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0000,U+0014,U+0015,U+0000;[0|20@1500,0|0@3000,0|20@4500,0|21@6000,0|0@7500,0]
+../fonts/gpos_context2_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000;[0|20@1500,0|20@3020,0|20@4500,0|20@6000,0|20@7500,0|0@9000,0]
diff --git a/test/shape/data/aots/tests/gpos_context2_successive.tests b/test/shape/data/aots/tests/gpos_context2_successive.tests
new file mode 100644 (file)
index 0000000..75478b4
--- /dev/null
@@ -0,0 +1 @@
+../fonts/gpos_context2_successive_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016,U+0017,U+0000;[0|20@1500,0|21@3020,0|22@4520,0|23@6000,0|0@7500,0]
diff --git a/test/shape/data/aots/tests/gpos_context3_boundary.tests b/test/shape/data/aots/tests/gpos_context3_boundary.tests
new file mode 100644 (file)
index 0000000..02fa351
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/gpos_context3_boundary_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000;[0|20@1500,0|20@3000,0|20@4500,0|20@6000,0|20@7500,0|0@9000,0]
+../fonts/gpos_context3_boundary_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000;[0|20@1520,0|20@3020,0|20@4520,0|20@6020,0|20@7520,0|0@9000,0]
diff --git a/test/shape/data/aots/tests/gpos_context3_lookupflag.tests b/test/shape/data/aots/tests/gpos_context3_lookupflag.tests
new file mode 100644 (file)
index 0000000..39144b0
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/gpos_context3_lookupflag_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+005A,U+0015,U+005B,U+005C,U+0016,U+0000;[0|20@1520,0|90@3000,0|21@3020,0|91@4500,0|92@4500,0|22@4520,0|0@6000,0]
+../fonts/gpos_context3_lookupflag_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+005A,U+0015,U+005B,U+005C,U+0016,U+0000;[0|20@1500,0|90@3000,0|21@3020,0|91@4500,0|92@4500,0|22@4500,0|0@6000,0]
diff --git a/test/shape/data/aots/tests/gpos_context3_next_glyph.tests b/test/shape/data/aots/tests/gpos_context3_next_glyph.tests
new file mode 100644 (file)
index 0000000..98b40a8
--- /dev/null
@@ -0,0 +1 @@
+../fonts/gpos_context3_next_glyph_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000;[0|20@1520,0|20@3000,0|20@4520,0|20@6000,0|20@7500,0|0@9000,0]
diff --git a/test/shape/data/aots/tests/gpos_context3_simple.tests b/test/shape/data/aots/tests/gpos_context3_simple.tests
new file mode 100644 (file)
index 0000000..4ac7be6
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/gpos_context3_simple_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016,U+0000;[0|20@1520,0|21@3020,0|22@4520,0|0@6000,0]
+../fonts/gpos_context3_simple_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0000,U+0014,U+0015,U+0000,U+0014,U+0015,U+0016,U+0000;[0|20@1500,0|0@3000,0|20@4500,0|21@6000,0|0@7500,0|20@9020,0|21@10520,0|22@12020,0|0@13500,0]
diff --git a/test/shape/data/aots/tests/gpos_context3_successive.tests b/test/shape/data/aots/tests/gpos_context3_successive.tests
new file mode 100644 (file)
index 0000000..a761f3c
--- /dev/null
@@ -0,0 +1 @@
+../fonts/gpos_context3_successive_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --ned;U+0000,U+0014,U+0015,U+0016,U+0017,U+0000;[0|20@1500,0|21@3020,0|22@4520,0|23@6000,0|0@7500,0]
diff --git a/test/shape/data/aots/tests/gsub1_1_lookupflag.tests b/test/shape/data/aots/tests/gsub1_1_lookupflag.tests
new file mode 100644 (file)
index 0000000..bdb0775
--- /dev/null
@@ -0,0 +1 @@
+../fonts/gsub1_1_lookupflag_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0011,U+0012,U+0013,U+0014,U+0015;[17|18|24|20|21]
diff --git a/test/shape/data/aots/tests/gsub1_1_modulo.tests b/test/shape/data/aots/tests/gsub1_1_modulo.tests
new file mode 100644 (file)
index 0000000..933a16f
--- /dev/null
@@ -0,0 +1 @@
+../fonts/gsub1_1_modulo_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0011,U+0012,U+0013,U+0014,U+0015,U+0016,U+0017,U+0018;[17|18|17|24|23|18|23|24]
diff --git a/test/shape/data/aots/tests/gsub1_1_simple.tests b/test/shape/data/aots/tests/gsub1_1_simple.tests
new file mode 100644 (file)
index 0000000..038bffc
--- /dev/null
@@ -0,0 +1 @@
+../fonts/gsub1_1_simple_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0011,U+0012,U+0013,U+0014,U+0015;[17|23|24|20|21]
diff --git a/test/shape/data/aots/tests/gsub1_2_lookupflag.tests b/test/shape/data/aots/tests/gsub1_2_lookupflag.tests
new file mode 100644 (file)
index 0000000..1ec5169
--- /dev/null
@@ -0,0 +1 @@
+../fonts/gsub1_2_lookupflag_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0011,U+0012,U+0013,U+0014,U+0015;[17|18|19|25|21]
diff --git a/test/shape/data/aots/tests/gsub1_2_simple.tests b/test/shape/data/aots/tests/gsub1_2_simple.tests
new file mode 100644 (file)
index 0000000..1b64506
--- /dev/null
@@ -0,0 +1 @@
+../fonts/gsub1_2_simple_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0011,U+0012,U+0013,U+0014,U+0015;[17|22|19|25|21]
diff --git a/test/shape/data/aots/tests/gsub2_1_lookupflag.tests b/test/shape/data/aots/tests/gsub2_1_lookupflag.tests
new file mode 100644 (file)
index 0000000..30a9888
--- /dev/null
@@ -0,0 +1 @@
+../fonts/gsub2_1_lookupflag_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0011,U+0012,U+0013,U+0011;[17|18|22|23|17]
diff --git a/test/shape/data/aots/tests/gsub2_1_multiple_sequences.tests b/test/shape/data/aots/tests/gsub2_1_multiple_sequences.tests
new file mode 100644 (file)
index 0000000..e14e8be
--- /dev/null
@@ -0,0 +1 @@
+../fonts/gsub2_1_multiple_sequences_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0011,U+0012,U+0013,U+0011;[17|20|21|22|23|17]
diff --git a/test/shape/data/aots/tests/gsub2_1_simple.tests b/test/shape/data/aots/tests/gsub2_1_simple.tests
new file mode 100644 (file)
index 0000000..ca9b85c
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/gsub2_1_simple_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0011,U+0012,U+0013;[17|20|21|22|19]
+../fonts/gsub2_1_simple_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0011,U+0012,U+0013,U+0012;[17|20|21|22|19|20|21|22]
diff --git a/test/shape/data/aots/tests/gsub3_1_lookupflag.tests b/test/shape/data/aots/tests/gsub3_1_lookupflag.tests
new file mode 100644 (file)
index 0000000..4789bb7
--- /dev/null
@@ -0,0 +1 @@
+../fonts/gsub3_1_lookupflag_f1.otf;--features="-test[4],test[5],test[6]=2,-test[7]" --single-par --no-clusters --no-glyph-names --no-positions;U+0011,U+0012,U+0012,U+0012,U+0013,U+0013,U+0013,U+0013,U+0011;[17|18|18|18|19|22|23|19|17]
diff --git a/test/shape/data/aots/tests/gsub3_1_multiple.tests b/test/shape/data/aots/tests/gsub3_1_multiple.tests
new file mode 100644 (file)
index 0000000..5f82cce
--- /dev/null
@@ -0,0 +1 @@
+../fonts/gsub3_1_multiple_f1.otf;--features="-test[1],test[2],test[3]=2,-test[4],-test[5],test[6],test[7]=2,-test[8]" --single-par --no-clusters --no-glyph-names --no-positions;U+0011,U+0012,U+0012,U+0012,U+0012,U+0013,U+0013,U+0013,U+0013,U+0011;[17|18|20|21|18|19|22|23|19|17]
diff --git a/test/shape/data/aots/tests/gsub3_1_simple.tests b/test/shape/data/aots/tests/gsub3_1_simple.tests
new file mode 100644 (file)
index 0000000..ee92051
--- /dev/null
@@ -0,0 +1 @@
+../fonts/gsub3_1_simple_f1.otf;--features="-test[1],test[3],test[5]=2,test[7]=3,-test[9],test[11]" --single-par --no-clusters --no-glyph-names --no-positions;U+0011,U+0012,U+0011,U+0012,U+0011,U+0012,U+0011,U+0012,U+0011,U+0012,U+0011,U+0012,U+0011;[17|18|17|20|17|21|17|22|17|18|17|20|17]
diff --git a/test/shape/data/aots/tests/gsub4_1_lookupflag.tests b/test/shape/data/aots/tests/gsub4_1_lookupflag.tests
new file mode 100644 (file)
index 0000000..e54d9fb
--- /dev/null
@@ -0,0 +1 @@
+../fonts/gsub4_1_lookupflag_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0011,U+0018,U+0012,U+0018,U+0013,U+0018,U+0018,U+0014,U+0018,U+0011,U+0012,U+0013,U+0016,U+0014;[17|24|23|24|24|24|24|17|18|19|22|20]
diff --git a/test/shape/data/aots/tests/gsub4_1_multiple_ligatures.tests b/test/shape/data/aots/tests/gsub4_1_multiple_ligatures.tests
new file mode 100644 (file)
index 0000000..c1a82a7
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/gsub4_1_multiple_ligatures_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0011,U+0012,U+0013,U+0014,U+0011,U+0012,U+0013,U+0016,U+0014;[17|23|17|24|22|20]
+../fonts/gsub4_1_multiple_ligatures_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0011,U+0012,U+0013,U+0014,U+0011,U+0012,U+0013,U+0016,U+0014;[17|24|20|17|24|22|20]
diff --git a/test/shape/data/aots/tests/gsub4_1_multiple_ligsets.tests b/test/shape/data/aots/tests/gsub4_1_multiple_ligsets.tests
new file mode 100644 (file)
index 0000000..58a874f
--- /dev/null
@@ -0,0 +1 @@
+../fonts/gsub4_1_multiple_ligsets_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0011,U+0012,U+0013,U+0015,U+0014,U+0013,U+0016;[17|23|21|24|22]
diff --git a/test/shape/data/aots/tests/gsub4_1_simple.tests b/test/shape/data/aots/tests/gsub4_1_simple.tests
new file mode 100644 (file)
index 0000000..c5d6e90
--- /dev/null
@@ -0,0 +1 @@
+../fonts/gsub4_1_simple_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0011,U+0012,U+0013,U+0014,U+0011,U+0012,U+0013,U+0016,U+0014;[17|23|17|18|19|22|20]
diff --git a/test/shape/data/aots/tests/gsub7.tests b/test/shape/data/aots/tests/gsub7.tests
new file mode 100644 (file)
index 0000000..c40c3af
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/gsub7_font1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0011,U+0012,U+0013,U+0014,U+0015;[17|23|24|20|21]
+../fonts/gsub7_font2.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0011,U+0012,U+0013,U+0014,U+0015;[17|23|29|20|21]
diff --git a/test/shape/data/aots/tests/gsub_chaining1_boundary.tests b/test/shape/data/aots/tests/gsub_chaining1_boundary.tests
new file mode 100644 (file)
index 0000000..34408ef
--- /dev/null
@@ -0,0 +1,4 @@
+../fonts/gsub_chaining1_boundary_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016,U+0017,U+0000;[0|20|21|22|23|0]
+../fonts/gsub_chaining1_boundary_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016,U+0017,U+0000;[0|20|61|22|23|0]
+../fonts/gsub_chaining1_boundary_f3.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016,U+0017,U+0000;[0|20|61|22|23|0]
+../fonts/gsub_chaining1_boundary_f4.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016,U+0017,U+0000;[0|20|21|62|23|0]
diff --git a/test/shape/data/aots/tests/gsub_chaining1_lookupflag.tests b/test/shape/data/aots/tests/gsub_chaining1_lookupflag.tests
new file mode 100644 (file)
index 0000000..a999517
--- /dev/null
@@ -0,0 +1 @@
+../fonts/gsub_chaining1_lookupflag_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+005A,U+0015,U+005B,U+0016,U+005C,U+0017,U+005D,U+005E,U+0018,U+005A,U+0019,U+005B,U+001A,U+0000;[0|20|90|21|91|22|92|63|93|94|24|90|25|91|26|0]
diff --git a/test/shape/data/aots/tests/gsub_chaining1_multiple_subrules.tests b/test/shape/data/aots/tests/gsub_chaining1_multiple_subrules.tests
new file mode 100644 (file)
index 0000000..39a1564
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/gsub_chaining1_multiple_subrules_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000,U+0014,U+0015,U+0016,U+0017,U+0000;[0|20|61|22|23|24|0|20|21|62|23|0]
+../fonts/gsub_chaining1_multiple_subrules_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000,U+0014,U+0015,U+0016,U+0017,U+0000;[0|20|21|62|23|24|0|20|21|62|23|0]
diff --git a/test/shape/data/aots/tests/gsub_chaining1_next_glyph.tests b/test/shape/data/aots/tests/gsub_chaining1_next_glyph.tests
new file mode 100644 (file)
index 0000000..859acba
--- /dev/null
@@ -0,0 +1 @@
+../fonts/gsub_chaining1_next_glyph_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016,U+0017,U+0000;[0|20|61|62|63|0]
diff --git a/test/shape/data/aots/tests/gsub_chaining1_simple.tests b/test/shape/data/aots/tests/gsub_chaining1_simple.tests
new file mode 100644 (file)
index 0000000..757845d
--- /dev/null
@@ -0,0 +1,11 @@
+../fonts/gsub_chaining1_simple_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016,U+0017,U+0000;[0|20|61|62|23|0]
+../fonts/gsub_chaining1_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000;[0|20|21|62|23|24|25|26|0]
+../fonts/gsub_chaining1_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+0000,U+0000;[0|20|21|22|23|24|25|0|0]
+../fonts/gsub_chaining1_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019;[0|20|21|22|23|24|25]
+../fonts/gsub_chaining1_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016,U+0017,U+0018;[0|20|21|22|23|24]
+../fonts/gsub_chaining1_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0000,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000;[0|0|21|22|23|24|25|26|0]
+../fonts/gsub_chaining1_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000;[21|22|23|24|25|26|0]
+../fonts/gsub_chaining1_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0016,U+0017,U+0018,U+0019,U+001A,U+0000;[22|23|24|25|26|0]
+../fonts/gsub_chaining1_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016,U+0000,U+0018,U+0019,U+001A,U+0000;[0|20|21|22|0|24|25|26|0]
+../fonts/gsub_chaining1_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016,U+0017;[0|20|21|22|23]
+../fonts/gsub_chaining1_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016;[0|20|21|22]
diff --git a/test/shape/data/aots/tests/gsub_chaining1_successive.tests b/test/shape/data/aots/tests/gsub_chaining1_successive.tests
new file mode 100644 (file)
index 0000000..80650e2
--- /dev/null
@@ -0,0 +1 @@
+../fonts/gsub_chaining1_successive_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0019,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000;[0|25|20|61|63|24|0]
diff --git a/test/shape/data/aots/tests/gsub_chaining2_boundary.tests b/test/shape/data/aots/tests/gsub_chaining2_boundary.tests
new file mode 100644 (file)
index 0000000..f7796d8
--- /dev/null
@@ -0,0 +1,4 @@
+../fonts/gsub_chaining2_boundary_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016,U+0017,U+0000;[0|20|21|22|23|0]
+../fonts/gsub_chaining2_boundary_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016,U+0017,U+0000;[0|20|61|22|23|0]
+../fonts/gsub_chaining2_boundary_f3.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016,U+0017,U+0000;[0|20|61|22|23|0]
+../fonts/gsub_chaining2_boundary_f4.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016,U+0017,U+0000;[0|20|21|62|23|0]
diff --git a/test/shape/data/aots/tests/gsub_chaining2_lookupflag.tests b/test/shape/data/aots/tests/gsub_chaining2_lookupflag.tests
new file mode 100644 (file)
index 0000000..4296f8f
--- /dev/null
@@ -0,0 +1 @@
+../fonts/gsub_chaining2_lookupflag_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+005A,U+0015,U+005B,U+0016,U+005C,U+0017,U+005D,U+005E,U+0018,U+005A,U+0019,U+005B,U+001A,U+0000;[0|20|90|21|91|22|92|63|93|94|24|90|25|91|26|0]
diff --git a/test/shape/data/aots/tests/gsub_chaining2_multiple_subrules.tests b/test/shape/data/aots/tests/gsub_chaining2_multiple_subrules.tests
new file mode 100644 (file)
index 0000000..47a725c
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/gsub_chaining2_multiple_subrules_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000,U+0014,U+0015,U+0016,U+0017,U+0000;[0|20|61|22|23|24|0|20|21|62|23|0]
+../fonts/gsub_chaining2_multiple_subrules_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000,U+0014,U+0015,U+0016,U+0017,U+0000;[0|20|21|62|23|24|0|20|21|62|23|0]
diff --git a/test/shape/data/aots/tests/gsub_chaining2_next_glyph.tests b/test/shape/data/aots/tests/gsub_chaining2_next_glyph.tests
new file mode 100644 (file)
index 0000000..f986b46
--- /dev/null
@@ -0,0 +1 @@
+../fonts/gsub_chaining2_next_glyph_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016,U+0017,U+0000;[0|20|61|62|63|0]
diff --git a/test/shape/data/aots/tests/gsub_chaining2_simple.tests b/test/shape/data/aots/tests/gsub_chaining2_simple.tests
new file mode 100644 (file)
index 0000000..a3c392b
--- /dev/null
@@ -0,0 +1,11 @@
+../fonts/gsub_chaining2_simple_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016,U+0017,U+0000;[0|20|61|62|23|0]
+../fonts/gsub_chaining2_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000;[0|20|21|62|23|24|25|26|0]
+../fonts/gsub_chaining2_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+0000,U+0000;[0|20|21|22|23|24|25|0|0]
+../fonts/gsub_chaining2_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019;[0|20|21|22|23|24|25]
+../fonts/gsub_chaining2_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016,U+0017,U+0018;[0|20|21|22|23|24]
+../fonts/gsub_chaining2_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0000,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000;[0|0|21|22|23|24|25|26|0]
+../fonts/gsub_chaining2_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000;[21|22|23|24|25|26|0]
+../fonts/gsub_chaining2_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0016,U+0017,U+0018,U+0019,U+001A,U+0000;[22|23|24|25|26|0]
+../fonts/gsub_chaining2_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016,U+0000,U+0018,U+0019,U+001A,U+0000;[0|20|21|22|0|24|25|26|0]
+../fonts/gsub_chaining2_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016,U+0017;[0|20|21|22|23]
+../fonts/gsub_chaining2_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016;[0|20|21|22]
diff --git a/test/shape/data/aots/tests/gsub_chaining2_successive.tests b/test/shape/data/aots/tests/gsub_chaining2_successive.tests
new file mode 100644 (file)
index 0000000..609b2fc
--- /dev/null
@@ -0,0 +1 @@
+../fonts/gsub_chaining2_successive_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0019,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000;[0|25|20|61|63|24|0]
diff --git a/test/shape/data/aots/tests/gsub_chaining3_boundary.tests b/test/shape/data/aots/tests/gsub_chaining3_boundary.tests
new file mode 100644 (file)
index 0000000..ec12f5e
--- /dev/null
@@ -0,0 +1,4 @@
+../fonts/gsub_chaining3_boundary_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016,U+0017,U+0000;[0|20|21|22|23|0]
+../fonts/gsub_chaining3_boundary_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016,U+0017,U+0000;[0|20|61|22|23|0]
+../fonts/gsub_chaining3_boundary_f3.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016,U+0017,U+0000;[0|20|61|22|23|0]
+../fonts/gsub_chaining3_boundary_f4.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016,U+0017,U+0000;[0|20|21|62|23|0]
diff --git a/test/shape/data/aots/tests/gsub_chaining3_lookupflag.tests b/test/shape/data/aots/tests/gsub_chaining3_lookupflag.tests
new file mode 100644 (file)
index 0000000..12632f7
--- /dev/null
@@ -0,0 +1 @@
+../fonts/gsub_chaining3_lookupflag_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+005A,U+0015,U+005B,U+0016,U+005C,U+0017,U+005D,U+005E,U+0018,U+005A,U+0019,U+005B,U+001A,U+0000;[0|20|90|21|91|22|92|63|93|94|24|90|25|91|26|0]
diff --git a/test/shape/data/aots/tests/gsub_chaining3_next_glyph.tests b/test/shape/data/aots/tests/gsub_chaining3_next_glyph.tests
new file mode 100644 (file)
index 0000000..22f7fde
--- /dev/null
@@ -0,0 +1 @@
+../fonts/gsub_chaining3_next_glyph_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0016,U+0015,U+0016,U+0015,U+0016,U+0015,U+0000;[0|22|61|22|61|22|21|0]
diff --git a/test/shape/data/aots/tests/gsub_chaining3_simple.tests b/test/shape/data/aots/tests/gsub_chaining3_simple.tests
new file mode 100644 (file)
index 0000000..8201338
--- /dev/null
@@ -0,0 +1,11 @@
+../fonts/gsub_chaining3_simple_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016,U+0017,U+0000;[0|20|61|62|23|0]
+../fonts/gsub_chaining3_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000;[0|20|21|62|23|24|25|26|0]
+../fonts/gsub_chaining3_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+0000,U+0000;[0|20|21|22|23|24|25|0|0]
+../fonts/gsub_chaining3_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019;[0|20|21|22|23|24|25]
+../fonts/gsub_chaining3_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016,U+0017,U+0018;[0|20|21|22|23|24]
+../fonts/gsub_chaining3_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0000,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000;[0|0|21|22|23|24|25|26|0]
+../fonts/gsub_chaining3_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000;[21|22|23|24|25|26|0]
+../fonts/gsub_chaining3_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0016,U+0017,U+0018,U+0019,U+001A,U+0000;[22|23|24|25|26|0]
+../fonts/gsub_chaining3_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016,U+0000,U+0018,U+0019,U+001A,U+0000;[0|20|21|22|0|24|25|26|0]
+../fonts/gsub_chaining3_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016,U+0017;[0|20|21|22|23]
+../fonts/gsub_chaining3_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016;[0|20|21|22]
diff --git a/test/shape/data/aots/tests/gsub_chaining3_successive.tests b/test/shape/data/aots/tests/gsub_chaining3_successive.tests
new file mode 100644 (file)
index 0000000..1776858
--- /dev/null
@@ -0,0 +1 @@
+../fonts/gsub_chaining3_successive_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0019,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000;[0|25|20|61|63|24|0]
diff --git a/test/shape/data/aots/tests/gsub_context1_boundary.tests b/test/shape/data/aots/tests/gsub_context1_boundary.tests
new file mode 100644 (file)
index 0000000..2244b91
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/gsub_context1_boundary_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000;[0|20|20|20|20|20|0]
+../fonts/gsub_context1_boundary_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000;[0|60|60|60|60|60|0]
diff --git a/test/shape/data/aots/tests/gsub_context1_expansion.tests b/test/shape/data/aots/tests/gsub_context1_expansion.tests
new file mode 100644 (file)
index 0000000..98d6f1f
--- /dev/null
@@ -0,0 +1 @@
+../fonts/gsub_context1_expansion_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016,U+0000;[0|20|61|62|63|22|0]
diff --git a/test/shape/data/aots/tests/gsub_context1_lookupflag.tests b/test/shape/data/aots/tests/gsub_context1_lookupflag.tests
new file mode 100644 (file)
index 0000000..2795b9d
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/gsub_context1_lookupflag_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+005A,U+0015,U+005B,U+005C,U+0016,U+0000;[0|60|90|61|91|92|62|0]
+../fonts/gsub_context1_lookupflag_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+005A,U+0015,U+005B,U+005C,U+0016,U+0000;[0|20|90|61|91|92|0]
diff --git a/test/shape/data/aots/tests/gsub_context1_multiple_subrules.tests b/test/shape/data/aots/tests/gsub_context1_multiple_subrules.tests
new file mode 100644 (file)
index 0000000..0c3b06d
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/gsub_context1_multiple_subrules_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016,U+0000,U+0014,U+0015,U+0000;[0|60|21|22|0|20|61|0]
+../fonts/gsub_context1_multiple_subrules_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016,U+0000,U+0014,U+0015,U+0000;[0|20|61|22|0|20|61|0]
diff --git a/test/shape/data/aots/tests/gsub_context1_next_glyph.tests b/test/shape/data/aots/tests/gsub_context1_next_glyph.tests
new file mode 100644 (file)
index 0000000..2b97147
--- /dev/null
@@ -0,0 +1 @@
+../fonts/gsub_context1_next_glyph_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000;[0|60|20|60|20|20|0]
diff --git a/test/shape/data/aots/tests/gsub_context1_simple.tests b/test/shape/data/aots/tests/gsub_context1_simple.tests
new file mode 100644 (file)
index 0000000..55ae682
--- /dev/null
@@ -0,0 +1,3 @@
+../fonts/gsub_context1_simple_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016,U+0000;[0|60|61|62|0]
+../fonts/gsub_context1_simple_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0000,U+0014,U+0015,U+0000;[0|20|0|20|21|0]
+../fonts/gsub_context1_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000;[0|20|60|20|20|20|0]
diff --git a/test/shape/data/aots/tests/gsub_context1_successive.tests b/test/shape/data/aots/tests/gsub_context1_successive.tests
new file mode 100644 (file)
index 0000000..9e8793a
--- /dev/null
@@ -0,0 +1 @@
+../fonts/gsub_context1_successive_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016,U+0017,U+0000;[0|20|61|63|0]
diff --git a/test/shape/data/aots/tests/gsub_context2_boundary.tests b/test/shape/data/aots/tests/gsub_context2_boundary.tests
new file mode 100644 (file)
index 0000000..cd6319b
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/gsub_context2_boundary_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000;[0|20|20|20|20|20|0]
+../fonts/gsub_context2_boundary_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000;[0|60|60|60|60|60|0]
diff --git a/test/shape/data/aots/tests/gsub_context2_classes.tests b/test/shape/data/aots/tests/gsub_context2_classes.tests
new file mode 100644 (file)
index 0000000..b392a8c
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/gsub_context2_classes_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+001A,U+001C,U+0018,U+0000,U+0015,U+001B,U+001A,U+0018,U+0000,U+0016,U+001B,U+001A,U+0018;[0|20|66|28|24|0|21|67|26|24|0|22|27|26|24]
+../fonts/gsub_context2_classes_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0016,U+001B,U+001A,U+0018,U+0000,U+0018,U+0018,U+001D,U+0016,U+0000,U+0016,U+001B,U+001A,U+0018;[0|22|67|26|24|0|24|24|69|22|0|22|67|26|24]
diff --git a/test/shape/data/aots/tests/gsub_context2_expansion.tests b/test/shape/data/aots/tests/gsub_context2_expansion.tests
new file mode 100644 (file)
index 0000000..b95ee0a
--- /dev/null
@@ -0,0 +1 @@
+../fonts/gsub_context2_expansion_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016,U+0000;[0|20|61|62|63|22|0]
diff --git a/test/shape/data/aots/tests/gsub_context2_lookupflag.tests b/test/shape/data/aots/tests/gsub_context2_lookupflag.tests
new file mode 100644 (file)
index 0000000..8c4bbb1
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/gsub_context2_lookupflag_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+005A,U+0015,U+005B,U+005C,U+0016,U+0000;[0|60|90|61|91|92|62|0]
+../fonts/gsub_context2_lookupflag_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+005A,U+0015,U+005B,U+005C,U+0016,U+0000;[0|20|90|61|91|92|0]
diff --git a/test/shape/data/aots/tests/gsub_context2_multiple_subrules.tests b/test/shape/data/aots/tests/gsub_context2_multiple_subrules.tests
new file mode 100644 (file)
index 0000000..74d248f
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/gsub_context2_multiple_subrules_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016,U+0000,U+0014,U+0015,U+0000;[0|60|21|22|0|20|61|0]
+../fonts/gsub_context2_multiple_subrules_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016,U+0000,U+0014,U+0015,U+0000;[0|20|61|22|0|20|61|0]
diff --git a/test/shape/data/aots/tests/gsub_context2_next_glyph.tests b/test/shape/data/aots/tests/gsub_context2_next_glyph.tests
new file mode 100644 (file)
index 0000000..dbd6f7a
--- /dev/null
@@ -0,0 +1 @@
+../fonts/gsub_context2_next_glyph_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000;[0|60|20|60|20|20|0]
diff --git a/test/shape/data/aots/tests/gsub_context2_simple.tests b/test/shape/data/aots/tests/gsub_context2_simple.tests
new file mode 100644 (file)
index 0000000..f7d6e10
--- /dev/null
@@ -0,0 +1,3 @@
+../fonts/gsub_context2_simple_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016,U+0000;[0|60|61|62|0]
+../fonts/gsub_context2_simple_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0000,U+0014,U+0015,U+0000;[0|20|0|20|21|0]
+../fonts/gsub_context2_simple_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000;[0|20|60|20|20|20|0]
diff --git a/test/shape/data/aots/tests/gsub_context2_successive.tests b/test/shape/data/aots/tests/gsub_context2_successive.tests
new file mode 100644 (file)
index 0000000..7b19b53
--- /dev/null
@@ -0,0 +1 @@
+../fonts/gsub_context2_successive_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016,U+0017,U+0000;[0|20|61|63|0]
diff --git a/test/shape/data/aots/tests/gsub_context3_boundary.tests b/test/shape/data/aots/tests/gsub_context3_boundary.tests
new file mode 100644 (file)
index 0000000..4a14b13
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/gsub_context3_boundary_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000;[0|20|20|20|20|20|0]
+../fonts/gsub_context3_boundary_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000;[0|60|60|60|60|60|0]
diff --git a/test/shape/data/aots/tests/gsub_context3_lookupflag.tests b/test/shape/data/aots/tests/gsub_context3_lookupflag.tests
new file mode 100644 (file)
index 0000000..c47ace9
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/gsub_context3_lookupflag_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+005A,U+0015,U+005B,U+005C,U+0016,U+0000;[0|60|90|61|91|92|62|0]
+../fonts/gsub_context3_lookupflag_f2.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+005A,U+0015,U+005B,U+005C,U+0016,U+0000;[0|20|90|61|91|92|0]
diff --git a/test/shape/data/aots/tests/gsub_context3_next_glyph.tests b/test/shape/data/aots/tests/gsub_context3_next_glyph.tests
new file mode 100644 (file)
index 0000000..15b10fc
--- /dev/null
@@ -0,0 +1 @@
+../fonts/gsub_context3_next_glyph_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000;[0|60|20|60|20|20|0]
diff --git a/test/shape/data/aots/tests/gsub_context3_simple.tests b/test/shape/data/aots/tests/gsub_context3_simple.tests
new file mode 100644 (file)
index 0000000..7b9ee74
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/gsub_context3_simple_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016,U+0000;[0|60|61|62|0]
+../fonts/gsub_context3_simple_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0000,U+0014,U+0015,U+0000,U+0014,U+0015,U+0016,U+0000;[0|20|0|20|21|0|60|61|62|0]
diff --git a/test/shape/data/aots/tests/gsub_context3_successive.tests b/test/shape/data/aots/tests/gsub_context3_successive.tests
new file mode 100644 (file)
index 0000000..f10a22d
--- /dev/null
@@ -0,0 +1 @@
+../fonts/gsub_context3_successive_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0000,U+0014,U+0015,U+0016,U+0017,U+0000;[0|20|61|63|0]
diff --git a/test/shape/data/aots/tests/lookupflag_ignore_attach.tests b/test/shape/data/aots/tests/lookupflag_ignore_attach.tests
new file mode 100644 (file)
index 0000000..8544114
--- /dev/null
@@ -0,0 +1,5 @@
+../fonts/lookupflag_ignore_attach_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+000A,U+000B,U+000D,U+001A,U+000A;[10|15|10]
+../fonts/lookupflag_ignore_attach_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+000A,U+000B,U+0015,U+000D,U+0016,U+0017,U+001D,U+001A,U+000A;[10|15|21|22|23|29|10]
+../fonts/lookupflag_ignore_attach_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+000A,U+000B,U+0015,U+000D,U+0016,U+001B,U+001A,U+000A;[10|11|21|13|22|27|26|10]
+../fonts/lookupflag_ignore_attach_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+000A,U+000B,U+001B,U+000D,U+0016,U+0017,U+001A,U+000A;[10|11|27|13|22|23|26|10]
+../fonts/lookupflag_ignore_attach_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+000A,U+000B,U+001B,U+000D,U+000E,U+0017,U+001A,U+000A;[10|11|27|13|14|23|26|10]
diff --git a/test/shape/data/aots/tests/lookupflag_ignore_base.tests b/test/shape/data/aots/tests/lookupflag_ignore_base.tests
new file mode 100644 (file)
index 0000000..bf4c5cd
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/lookupflag_ignore_base_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0011,U+0012,U+0013,U+0014,U+0015;[17|23|21]
+../fonts/lookupflag_ignore_base_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0011,U+0012,U+0018,U+0018,U+0013,U+0019,U+0014,U+0015;[17|23|24|24|25|21]
diff --git a/test/shape/data/aots/tests/lookupflag_ignore_combination.tests b/test/shape/data/aots/tests/lookupflag_ignore_combination.tests
new file mode 100644 (file)
index 0000000..062618d
--- /dev/null
@@ -0,0 +1,3 @@
+../fonts/lookupflag_ignore_combination_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0011,U+0012,U+001A,U+0013,U+0014,U+0015;[17|23|26|21]
+../fonts/lookupflag_ignore_combination_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0011,U+0012,U+001A,U+0013,U+0018,U+001E,U+001F,U+0014,U+0015;[17|23|26|24|30|31|21]
+../fonts/lookupflag_ignore_combination_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0011,U+0012,U+001A,U+0013,U+0018,U+001E,U+0020,U+0014,U+0015;[17|18|26|19|24|30|32|20|21]
diff --git a/test/shape/data/aots/tests/lookupflag_ignore_ligatures.tests b/test/shape/data/aots/tests/lookupflag_ignore_ligatures.tests
new file mode 100644 (file)
index 0000000..ef7e377
--- /dev/null
@@ -0,0 +1,3 @@
+../fonts/lookupflag_ignore_ligatures_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0011,U+0012,U+001A,U+001B,U+0013,U+001B,U+0014,U+0015;[17|23|26|27|27|21]
+../fonts/lookupflag_ignore_ligatures_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0011,U+0012,U+001A,U+0018,U+0013,U+001B,U+0014,U+0015;[17|18|26|24|19|27|20|21]
+../fonts/lookupflag_ignore_ligatures_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0011,U+0012,U+001A,U+002A,U+0013,U+001B,U+0014,U+0015;[17|18|26|42|19|27|20|21]
diff --git a/test/shape/data/aots/tests/lookupflag_ignore_marks.tests b/test/shape/data/aots/tests/lookupflag_ignore_marks.tests
new file mode 100644 (file)
index 0000000..df7faa4
--- /dev/null
@@ -0,0 +1 @@
+../fonts/lookupflag_ignore_marks_f1.otf;--features="test" --single-par --no-clusters --no-glyph-names --no-positions;U+0011,U+0012,U+001C,U+001D,U+0013,U+001D,U+0014,U+0015;[17|23|28|29|29|21]
diff --git a/test/shape/data/aots/update.py b/test/shape/data/aots/update.py
new file mode 100755 (executable)
index 0000000..d3b5455
--- /dev/null
@@ -0,0 +1,29 @@
+#!/usr/bin/env python3
+
+import sys, os, subprocess, shutil
+
+os.chdir (os.getenv ('srcdir', os.path.dirname (__file__)))
+
+git = shutil.which ('git'); assert git
+make = shutil.which ('make'); assert make
+java = shutil.which ('java'); assert java
+cxx = shutil.which ('c++'); assert cxx
+
+pull = False
+if not os.path.exists ('aots'):
+       subprocess.run ([git, 'clone', 'https://github.com/adobe-type-tools/aots'], check=True)
+       pull = True
+
+if pull or 'pull' in sys.argv:
+       subprocess.run ([git, 'pull'], cwd='aots', check=True)
+       subprocess.run ([make, '-C', 'aots'], check=True)
+       subprocess.run ([make, '-C', 'aots/harfbuzz'], check=True)
+
+shutil.copy ('hb-aots-tester.cpp', 'aots/harfbuzz')
+# TODO: remove *nix assumptions
+subprocess.run ([cxx, '-std=c++11', '-Wno-narrowing', 'aots/harfbuzz/hb-aots-tester.cpp',
+       '../../../../src/harfbuzz.cc', '-DHB_NO_MT', '-fno-exceptions', '-lm',
+       '-I../../../../src', '-o', 'aots/harfbuzz/aots'], check=True)
+shutil.rmtree ('tests')
+os.mkdir ('tests')
+subprocess.run (['./aots'], cwd='aots/harfbuzz', check=True)
diff --git a/test/shape/data/in-house/Makefile.am b/test/shape/data/in-house/Makefile.am
new file mode 100644 (file)
index 0000000..a284578
--- /dev/null
@@ -0,0 +1,26 @@
+# Process this file with automake to produce Makefile.in
+
+NULL =
+
+# Convenience targets:
+lib:
+       @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
+
+EXTRA_DIST = \
+       COPYING \
+       fonts \
+       meson.build \
+       $(TESTS) \
+       $(NULL)
+
+TEST_EXTENSIONS = .tests
+if HAVE_FREETYPE
+TESTS_ENVIRONMENT = HAVE_FREETYPE=1
+else
+TESTS_ENVIRONMENT = HAVE_FREETYPE=0
+endif
+TESTS_LOG_COMPILER = $(srcdir)/../../run-tests.py $(top_builddir)/util/hb-shape$(EXEEXT)
+
+include Makefile.sources
+
+-include $(top_srcdir)/git.mk
diff --git a/test/shape/data/in-house/Makefile.in b/test/shape/data/in-house/Makefile.in
new file mode 100644 (file)
index 0000000..8b05d38
--- /dev/null
@@ -0,0 +1,944 @@
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Process this file with automake to produce Makefile.in
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+TESTS = tests/aat-morx.tests tests/aat-trak.tests \
+       tests/arabic-fallback-shaping.tests \
+       tests/arabic-feature-order.tests \
+       tests/arabic-like-joining.tests tests/arabic-mark-attach.tests \
+       tests/arabic-mark-order.tests tests/arabic-normalization.tests \
+       tests/arabic-stch.tests tests/automatic-fractions.tests \
+       tests/cluster.tests tests/collections.tests \
+       tests/color-fonts.tests tests/context-matching.tests \
+       tests/cursive-positioning.tests tests/default-ignorables.tests \
+       tests/digits.tests tests/emoji.tests \
+       tests/emoji-clusters.tests tests/fallback-positioning.tests \
+       tests/glyph-props-no-gdef.tests tests/hangul-jamo.tests \
+       tests/hyphens.tests tests/indic-consonant-with-stacker.tests \
+       tests/indic-decompose.tests tests/indic-init.tests \
+       tests/indic-joiner-candrabindu.tests tests/indic-joiners.tests \
+       tests/indic-old-spec.tests tests/indic-pref-blocking.tests \
+       tests/indic-script-extensions.tests \
+       tests/indic-special-cases.tests tests/indic-syllable.tests \
+       tests/indic-vowel-letter-spoofing.tests \
+       tests/item-context.tests tests/kern-format2.tests \
+       tests/khmer-mark-order.tests tests/khmer-misc.tests \
+       tests/language-tags.tests tests/ligature-id.tests \
+       tests/macos.tests tests/mark-attachment.tests \
+       tests/mark-filtering-sets.tests \
+       tests/mongolian-variation-selector.tests \
+       tests/myanmar-misc.tests tests/myanmar-syllable.tests \
+       tests/myanmar-zawgyi.tests \
+       tests/nested-mark-filtering-sets.tests \
+       tests/none-directional.tests tests/positioning-features.tests \
+       tests/rand.tests tests/reverse-sub.tests tests/rotation.tests \
+       tests/simple.tests tests/sinhala.tests tests/spaces.tests \
+       tests/tibetan-contractions-1.tests \
+       tests/tibetan-contractions-2.tests tests/tibetan-vowels.tests \
+       tests/tt-kern-gpos.tests tests/unsafe-to-concat.tests \
+       tests/use-indic3.tests tests/use-marchen.tests \
+       tests/use-syllable.tests tests/use-vowel-letter-spoofing.tests \
+       tests/use.tests tests/variations.tests \
+       tests/variations-rvrn.tests tests/vertical.tests \
+       tests/zero-width-marks.tests $(am__EXEEXT_1)
+subdir = test/shape/data/in-house
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_link_flag.m4 \
+       $(top_srcdir)/m4/ax_code_coverage.m4 \
+       $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \
+       $(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/gtk-doc.m4 \
+       $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
+       $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+       $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+am__tty_colors_dummy = \
+  mgn= red= grn= lgn= blu= brg= std=; \
+  am__color_tests=no
+am__tty_colors = { \
+  $(am__tty_colors_dummy); \
+  if test "X$(AM_COLOR_TESTS)" = Xno; then \
+    am__color_tests=no; \
+  elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+    am__color_tests=yes; \
+  elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+    am__color_tests=yes; \
+  fi; \
+  if test $$am__color_tests = yes; then \
+    red='\e[0;31m'; \
+    grn='\e[0;32m'; \
+    lgn='\e[1;32m'; \
+    blu='\e[1;34m'; \
+    mgn='\e[0;35m'; \
+    brg='\e[1m'; \
+    std='\e[m'; \
+  fi; \
+}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__recheck_rx = ^[    ]*:recheck:[    ]*
+am__global_test_result_rx = ^[         ]*:global-test-result:[         ]*
+am__copy_in_global_log_rx = ^[         ]*:copy-in-global-log:[         ]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+  recheck = 1; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+        { \
+          if ((getline line2 < ($$0 ".log")) < 0) \
+           recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+        { \
+          recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+        { \
+          break; \
+        } \
+    }; \
+  if (recheck) \
+    print $$0; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+  print "fatal: making $@: " msg | "cat >&2"; \
+  exit 1; \
+} \
+function rst_section(header) \
+{ \
+  print header; \
+  len = length(header); \
+  for (i = 1; i <= len; i = i + 1) \
+    printf "="; \
+  printf "\n\n"; \
+} \
+{ \
+  copy_in_global_log = 1; \
+  global_test_result = "RUN"; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+         fatal("failed to read from " $$0 ".trs"); \
+      if (line ~ /$(am__global_test_result_rx)/) \
+        { \
+          sub("$(am__global_test_result_rx)", "", line); \
+          sub("[       ]*$$", "", line); \
+          global_test_result = line; \
+        } \
+      else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+        copy_in_global_log = 0; \
+    }; \
+  if (copy_in_global_log) \
+    { \
+      rst_section(global_test_result ": " $$0); \
+      while ((rc = (getline line < ($$0 ".log"))) != 0) \
+      { \
+        if (rc < 0) \
+          fatal("failed to read from " $$0 ".log"); \
+        print line; \
+      }; \
+      printf "\n"; \
+    }; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/   &   /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this.  Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+  --color-tests "$$am__color_tests" \
+  --enable-hard-errors "$$am__enable_hard_errors" \
+  --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test.  Creates the
+# directory for the log if needed.  Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log.  Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT.  Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup);                                     \
+$(am__vpath_adj_setup) $(am__vpath_adj)                        \
+$(am__tty_colors);                                     \
+srcdir=$(srcdir); export srcdir;                       \
+case "$@" in                                           \
+  */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;;   \
+    *) am__odir=.;;                                    \
+esac;                                                  \
+test "x$$am__odir" = x"." || test -d "$$am__odir"      \
+  || $(MKDIR_P) "$$am__odir" || exit $$?;              \
+if test -f "./$$f"; then dir=./;                       \
+elif test -f "$$f"; then dir=;                         \
+else dir="$(srcdir)/"; fi;                             \
+tst=$$dir$$f; log='$@';                                \
+if test -n '$(DISABLE_HARD_ERRORS)'; then              \
+  am__enable_hard_errors=no;                           \
+else                                                   \
+  am__enable_hard_errors=yes;                          \
+fi;                                                    \
+case " $(XFAIL_TESTS) " in                             \
+  *[\ \        ]$$f[\ \        ]* | *[\ \      ]$$dir$$f[\ \   ]*) \
+    am__expect_failure=yes;;                           \
+  *)                                                   \
+    am__expect_failure=no;;                            \
+esac;                                                  \
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed).  The result is saved in the shell variable
+# '$bases'.  This honors runtime overriding of TESTS and TEST_LOGS.  Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+  bases='$(TEST_LOGS)'; \
+  bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+  bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+am__EXEEXT_1 =
+TEST_SUITE_LOG = test-suite.log
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
+TEST_LOGS = $(am__test_logs2:.tests.log=.log)
+TESTS_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+TESTS_LOG_COMPILE = $(TESTS_LOG_COMPILER) $(AM_TESTS_LOG_FLAGS) \
+       $(TESTS_LOG_FLAGS)
+am__set_b = \
+  case '$@' in \
+    */*) \
+      case '$*' in \
+        */*) b='$*';; \
+          *) b=`echo '$@' | sed 's/\.log$$//'`; \
+       esac;; \
+    *) \
+      b='$*';; \
+  esac
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.sources \
+       $(top_srcdir)/test-driver COPYING
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CAIRO_CFLAGS = @CAIRO_CFLAGS@
+CAIRO_FT_CFLAGS = @CAIRO_FT_CFLAGS@
+CAIRO_FT_LIBS = @CAIRO_FT_LIBS@
+CAIRO_LIBS = @CAIRO_LIBS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHAFA_CFLAGS = @CHAFA_CFLAGS@
+CHAFA_LIBS = @CHAFA_LIBS@
+CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
+CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
+CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
+CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
+CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
+CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
+CORETEXT_CFLAGS = @CORETEXT_CFLAGS@
+CORETEXT_LIBS = @CORETEXT_LIBS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DIRECTWRITE_CXXFLAGS = @DIRECTWRITE_CXXFLAGS@
+DIRECTWRITE_LIBS = @DIRECTWRITE_LIBS@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
+FREETYPE_DEPS = @FREETYPE_DEPS@
+FREETYPE_LIBS = @FREETYPE_LIBS@
+GCOV = @GCOV@
+GDI_CFLAGS = @GDI_CFLAGS@
+GDI_LIBS = @GDI_LIBS@
+GENHTML = @GENHTML@
+GIT = @GIT@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_DEPS = @GLIB_DEPS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GOBJECT_CFLAGS = @GOBJECT_CFLAGS@
+GOBJECT_LIBS = @GOBJECT_LIBS@
+GRAPHITE2_CFLAGS = @GRAPHITE2_CFLAGS@
+GRAPHITE2_DEPS = @GRAPHITE2_DEPS@
+GRAPHITE2_LIBS = @GRAPHITE2_LIBS@
+GREP = @GREP@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@
+GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
+GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
+GTKDOC_MKPDF = @GTKDOC_MKPDF@
+GTKDOC_REBASE = @GTKDOC_REBASE@
+HAVE_CXX11 = @HAVE_CXX11@
+HB_LIBTOOL_VERSION_INFO = @HB_LIBTOOL_VERSION_INFO@
+HB_VERSION = @HB_VERSION@
+HB_VERSION_MAJOR = @HB_VERSION_MAJOR@
+HB_VERSION_MICRO = @HB_VERSION_MICRO@
+HB_VERSION_MINOR = @HB_VERSION_MINOR@
+HTML_DIR = @HTML_DIR@
+ICU_CFLAGS = @ICU_CFLAGS@
+ICU_LIBS = @ICU_LIBS@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+LCOV = @LCOV@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
+RAGEL = @RAGEL@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+UNISCRIBE_CFLAGS = @UNISCRIBE_CFLAGS@
+UNISCRIBE_LIBS = @UNISCRIBE_LIBS@
+VERSION = @VERSION@
+_GI_EXP_DATADIR = @_GI_EXP_DATADIR@
+_GI_EXP_LIBDIR = @_GI_EXP_LIBDIR@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+have_gobject = @have_gobject@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+NULL = 
+EXTRA_DIST = \
+       COPYING \
+       fonts \
+       meson.build \
+       $(TESTS) \
+       $(NULL)
+
+TEST_EXTENSIONS = .tests
+@HAVE_FREETYPE_FALSE@TESTS_ENVIRONMENT = HAVE_FREETYPE=0
+@HAVE_FREETYPE_TRUE@TESTS_ENVIRONMENT = HAVE_FREETYPE=1
+TESTS_LOG_COMPILER = $(srcdir)/../../run-tests.py $(top_builddir)/util/hb-shape$(EXEEXT)
+DISABLED_TESTS = \
+       $(NULL)
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .log .tests .tests$(EXEEXT) .trs
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am $(srcdir)/Makefile.sources $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+               && { if test -f $@; then exit 0; else break; fi; }; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits test/shape/data/in-house/Makefile'; \
+       $(am__cd) $(top_srcdir) && \
+         $(AUTOMAKE) --gnits test/shape/data/in-house/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+       esac;
+$(srcdir)/Makefile.sources $(am__empty):
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+       -rm -f *.lo
+
+clean-libtool:
+       -rm -rf .libs _libs
+tags TAGS:
+
+ctags CTAGS:
+
+cscope cscopelist:
+
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'.  Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+       rm -f $< $@
+       $(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+       @:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+       @$(am__set_TESTS_bases); \
+       am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+       redo_bases=`for i in $$bases; do \
+                     am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+                   done`; \
+       if test -n "$$redo_bases"; then \
+         redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+         redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+         if $(am__make_dryrun); then :; else \
+           rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+         fi; \
+       fi; \
+       if test -n "$$am__remaking_logs"; then \
+         echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+              "recursion detected" >&2; \
+       elif test -n "$$redo_logs"; then \
+         am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+       fi; \
+       if $(am__make_dryrun); then :; else \
+         st=0;  \
+         errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+         for i in $$redo_bases; do \
+           test -f $$i.trs && test -r $$i.trs \
+             || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+           test -f $$i.log && test -r $$i.log \
+             || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+         done; \
+         test $$st -eq 0 || exit 1; \
+       fi
+       @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+       ws='[   ]'; \
+       results=`for b in $$bases; do echo $$b.trs; done`; \
+       test -n "$$results" || results=/dev/null; \
+       all=`  grep "^$$ws*:test-result:"           $$results | wc -l`; \
+       pass=` grep "^$$ws*:test-result:$$ws*PASS"  $$results | wc -l`; \
+       fail=` grep "^$$ws*:test-result:$$ws*FAIL"  $$results | wc -l`; \
+       skip=` grep "^$$ws*:test-result:$$ws*SKIP"  $$results | wc -l`; \
+       xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+       xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+       error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+       if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+         success=true; \
+       else \
+         success=false; \
+       fi; \
+       br='==================='; br=$$br$$br$$br$$br; \
+       result_count () \
+       { \
+           if test x"$$1" = x"--maybe-color"; then \
+             maybe_colorize=yes; \
+           elif test x"$$1" = x"--no-color"; then \
+             maybe_colorize=no; \
+           else \
+             echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+           fi; \
+           shift; \
+           desc=$$1 count=$$2; \
+           if test $$maybe_colorize = yes && test $$count -gt 0; then \
+             color_start=$$3 color_end=$$std; \
+           else \
+             color_start= color_end=; \
+           fi; \
+           echo "$${color_start}# $$desc $$count$${color_end}"; \
+       }; \
+       create_testsuite_report () \
+       { \
+         result_count $$1 "TOTAL:" $$all   "$$brg"; \
+         result_count $$1 "PASS: " $$pass  "$$grn"; \
+         result_count $$1 "SKIP: " $$skip  "$$blu"; \
+         result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+         result_count $$1 "FAIL: " $$fail  "$$red"; \
+         result_count $$1 "XPASS:" $$xpass "$$red"; \
+         result_count $$1 "ERROR:" $$error "$$mgn"; \
+       }; \
+       {                                                               \
+         echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" |       \
+           $(am__rst_title);                                           \
+         create_testsuite_report --no-color;                           \
+         echo;                                                         \
+         echo ".. contents:: :depth: 2";                               \
+         echo;                                                         \
+         for b in $$bases; do echo $$b; done                           \
+           | $(am__create_global_log);                                 \
+       } >$(TEST_SUITE_LOG).tmp || exit 1;                             \
+       mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG);                     \
+       if $$success; then                                              \
+         col="$$grn";                                                  \
+        else                                                           \
+         col="$$red";                                                  \
+         test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG);               \
+       fi;                                                             \
+       echo "$${col}$$br$${std}";                                      \
+       echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}";   \
+       echo "$${col}$$br$${std}";                                      \
+       create_testsuite_report --maybe-color;                          \
+       echo "$$col$$br$$std";                                          \
+       if $$success; then :; else                                      \
+         echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}";         \
+         if test -n "$(PACKAGE_BUGREPORT)"; then                       \
+           echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
+         fi;                                                           \
+         echo "$$col$$br$$std";                                        \
+       fi;                                                             \
+       $$success || exit 1
+
+check-TESTS: 
+       @list='$(RECHECK_LOGS)';           test -z "$$list" || rm -f $$list
+       @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+       @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+       @set +e; $(am__set_TESTS_bases); \
+       log_list=`for i in $$bases; do echo $$i.log; done`; \
+       trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+       log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+       $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+       exit $$?;
+recheck: all 
+       @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+       @set +e; $(am__set_TESTS_bases); \
+       bases=`for i in $$bases; do echo $$i; done \
+                | $(am__list_recheck_tests)` || exit 1; \
+       log_list=`for i in $$bases; do echo $$i.log; done`; \
+       log_list=`echo $$log_list`; \
+       $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+               am__force_recheck=am--force-recheck \
+               TEST_LOGS="$$log_list"; \
+       exit $$?
+.tests.log:
+       @p='$<'; \
+       $(am__set_b); \
+       $(am__check_pre) $(TESTS_LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_TESTS_LOG_DRIVER_FLAGS) $(TESTS_LOG_DRIVER_FLAGS) -- $(TESTS_LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+@am__EXEEXT_TRUE@.tests$(EXEEXT).log:
+@am__EXEEXT_TRUE@      @p='$<'; \
+@am__EXEEXT_TRUE@      $(am__set_b); \
+@am__EXEEXT_TRUE@      $(am__check_pre) $(TESTS_LOG_DRIVER) --test-name "$$f" \
+@am__EXEEXT_TRUE@      --log-file $$b.log --trs-file $$b.trs \
+@am__EXEEXT_TRUE@      $(am__common_driver_flags) $(AM_TESTS_LOG_DRIVER_FLAGS) $(TESTS_LOG_DRIVER_FLAGS) -- $(TESTS_LOG_COMPILE) \
+@am__EXEEXT_TRUE@      "$$tst" $(AM_TESTS_FD_REDIRECT)
+
+distdir: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       list='$(DISTFILES)'; \
+         dist_files=`for file in $$list; do echo $$file; done | \
+         sed -e "s|^$$srcdirstrip/||;t" \
+             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+       case $$dist_files in \
+         */*) $(MKDIR_P) `echo "$$dist_files" | \
+                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+                          sort -u` ;; \
+       esac; \
+       for file in $$dist_files; do \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         if test -d $$d/$$file; then \
+           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+           if test -d "$(distdir)/$$file"; then \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+         else \
+           test -f "$(distdir)/$$file" \
+           || cp -p $$d/$$file "$(distdir)/$$file" \
+           || exit 1; \
+         fi; \
+       done
+check-am: all-am
+       $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
+mostlyclean-generic:
+       -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+       -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+       -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+
+clean-generic:
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+       -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: all all-am check check-TESTS check-am clean clean-generic \
+       clean-libtool cscopelist-am ctags-am distclean \
+       distclean-generic distclean-libtool distdir dvi dvi-am html \
+       html-am info info-am install install-am install-data \
+       install-data-am install-dvi install-dvi-am install-exec \
+       install-exec-am install-html install-html-am install-info \
+       install-info-am install-man install-pdf install-pdf-am \
+       install-ps install-ps-am install-strip installcheck \
+       installcheck-am installdirs maintainer-clean \
+       maintainer-clean-generic mostlyclean mostlyclean-generic \
+       mostlyclean-libtool pdf pdf-am ps ps-am recheck tags-am \
+       uninstall uninstall-am
+
+.PRECIOUS: Makefile
+
+
+# Convenience targets:
+lib:
+       @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
+
+-include $(top_srcdir)/git.mk
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/test/shape/data/in-house/Makefile.sources b/test/shape/data/in-house/Makefile.sources
new file mode 100644 (file)
index 0000000..02c9e91
--- /dev/null
@@ -0,0 +1,75 @@
+TESTS = \
+       tests/aat-morx.tests \
+       tests/aat-trak.tests \
+       tests/arabic-fallback-shaping.tests \
+       tests/arabic-feature-order.tests \
+       tests/arabic-like-joining.tests \
+       tests/arabic-mark-attach.tests \
+       tests/arabic-mark-order.tests \
+       tests/arabic-normalization.tests \
+       tests/arabic-stch.tests \
+       tests/automatic-fractions.tests \
+       tests/cluster.tests \
+       tests/collections.tests \
+       tests/color-fonts.tests \
+       tests/context-matching.tests \
+       tests/cursive-positioning.tests \
+       tests/default-ignorables.tests \
+       tests/digits.tests \
+       tests/emoji.tests \
+       tests/emoji-clusters.tests \
+       tests/fallback-positioning.tests \
+       tests/glyph-props-no-gdef.tests \
+       tests/hangul-jamo.tests \
+       tests/hyphens.tests \
+       tests/indic-consonant-with-stacker.tests \
+       tests/indic-decompose.tests \
+       tests/indic-init.tests \
+       tests/indic-joiner-candrabindu.tests \
+       tests/indic-joiners.tests \
+       tests/indic-old-spec.tests \
+       tests/indic-pref-blocking.tests \
+       tests/indic-script-extensions.tests \
+       tests/indic-special-cases.tests \
+       tests/indic-syllable.tests \
+       tests/indic-vowel-letter-spoofing.tests \
+       tests/item-context.tests \
+       tests/kern-format2.tests \
+       tests/khmer-mark-order.tests \
+       tests/khmer-misc.tests \
+       tests/language-tags.tests \
+       tests/ligature-id.tests \
+       tests/macos.tests \
+       tests/mark-attachment.tests \
+       tests/mark-filtering-sets.tests \
+       tests/mongolian-variation-selector.tests \
+       tests/myanmar-misc.tests \
+       tests/myanmar-syllable.tests \
+       tests/myanmar-zawgyi.tests \
+       tests/nested-mark-filtering-sets.tests \
+       tests/none-directional.tests \
+       tests/positioning-features.tests \
+       tests/rand.tests \
+       tests/reverse-sub.tests \
+       tests/rotation.tests \
+       tests/simple.tests \
+       tests/sinhala.tests \
+       tests/spaces.tests \
+       tests/tibetan-contractions-1.tests \
+       tests/tibetan-contractions-2.tests \
+       tests/tibetan-vowels.tests \
+       tests/tt-kern-gpos.tests \
+       tests/unsafe-to-concat.tests \
+       tests/use-indic3.tests \
+       tests/use-marchen.tests \
+       tests/use-syllable.tests \
+       tests/use-vowel-letter-spoofing.tests \
+       tests/use.tests \
+       tests/variations.tests \
+       tests/variations-rvrn.tests \
+       tests/vertical.tests \
+       tests/zero-width-marks.tests \
+       $(NULL)
+
+DISABLED_TESTS = \
+       $(NULL)
diff --git a/test/shape/data/in-house/fonts/065b01e54f35f0d849fd43bd5b936212739a50cb.ttf b/test/shape/data/in-house/fonts/065b01e54f35f0d849fd43bd5b936212739a50cb.ttf
new file mode 100644 (file)
index 0000000..46ebee8
Binary files /dev/null and b/test/shape/data/in-house/fonts/065b01e54f35f0d849fd43bd5b936212739a50cb.ttf differ
diff --git a/test/shape/data/in-house/fonts/08b4b136f418add748dc641eb4a83033476f1170.ttf b/test/shape/data/in-house/fonts/08b4b136f418add748dc641eb4a83033476f1170.ttf
new file mode 100644 (file)
index 0000000..4d0f52a
Binary files /dev/null and b/test/shape/data/in-house/fonts/08b4b136f418add748dc641eb4a83033476f1170.ttf differ
diff --git a/test/shape/data/in-house/fonts/1b66a1f4b076b734caa6397b3e57231af1feaafb.ttf b/test/shape/data/in-house/fonts/1b66a1f4b076b734caa6397b3e57231af1feaafb.ttf
new file mode 100644 (file)
index 0000000..906f5bf
Binary files /dev/null and b/test/shape/data/in-house/fonts/1b66a1f4b076b734caa6397b3e57231af1feaafb.ttf differ
diff --git a/test/shape/data/in-house/fonts/3105b51976b879032c66aa93a634b3b3672cd344.ttf b/test/shape/data/in-house/fonts/3105b51976b879032c66aa93a634b3b3672cd344.ttf
new file mode 100644 (file)
index 0000000..de14336
Binary files /dev/null and b/test/shape/data/in-house/fonts/3105b51976b879032c66aa93a634b3b3672cd344.ttf differ
diff --git a/test/shape/data/in-house/fonts/34da9aab7bee86c4dfc3b85e423435822fdf4b62.ttf b/test/shape/data/in-house/fonts/34da9aab7bee86c4dfc3b85e423435822fdf4b62.ttf
new file mode 100644 (file)
index 0000000..8508fbe
Binary files /dev/null and b/test/shape/data/in-house/fonts/34da9aab7bee86c4dfc3b85e423435822fdf4b62.ttf differ
diff --git a/test/shape/data/in-house/fonts/3b791518a9ba89675df02f1eefbc9026a50648a6.ttf b/test/shape/data/in-house/fonts/3b791518a9ba89675df02f1eefbc9026a50648a6.ttf
new file mode 100644 (file)
index 0000000..76855be
Binary files /dev/null and b/test/shape/data/in-house/fonts/3b791518a9ba89675df02f1eefbc9026a50648a6.ttf differ
diff --git a/test/shape/data/in-house/fonts/3e46c3b84c1370a06594736c7f8acebf810bbb3b.ttf b/test/shape/data/in-house/fonts/3e46c3b84c1370a06594736c7f8acebf810bbb3b.ttf
new file mode 100644 (file)
index 0000000..7312779
Binary files /dev/null and b/test/shape/data/in-house/fonts/3e46c3b84c1370a06594736c7f8acebf810bbb3b.ttf differ
diff --git a/test/shape/data/in-house/fonts/3f24aff8b768e586162e9b9d03b15c36508dd2ae.ttf b/test/shape/data/in-house/fonts/3f24aff8b768e586162e9b9d03b15c36508dd2ae.ttf
new file mode 100644 (file)
index 0000000..7449e48
Binary files /dev/null and b/test/shape/data/in-house/fonts/3f24aff8b768e586162e9b9d03b15c36508dd2ae.ttf differ
diff --git a/test/shape/data/in-house/fonts/65984dfce552a785f564422aadf4715fa07795ad.ttf b/test/shape/data/in-house/fonts/65984dfce552a785f564422aadf4715fa07795ad.ttf
new file mode 100644 (file)
index 0000000..64ab1c6
Binary files /dev/null and b/test/shape/data/in-house/fonts/65984dfce552a785f564422aadf4715fa07795ad.ttf differ
diff --git a/test/shape/data/in-house/fonts/6677074106f94a2644da6aaaacd5bbd48cbdc7de.ttf b/test/shape/data/in-house/fonts/6677074106f94a2644da6aaaacd5bbd48cbdc7de.ttf
new file mode 100644 (file)
index 0000000..f1e07f2
Binary files /dev/null and b/test/shape/data/in-house/fonts/6677074106f94a2644da6aaaacd5bbd48cbdc7de.ttf differ
diff --git a/test/shape/data/in-house/fonts/6f36d056bad6d478fc0bf7397bd52dc3bd197d5f.ttf b/test/shape/data/in-house/fonts/6f36d056bad6d478fc0bf7397bd52dc3bd197d5f.ttf
new file mode 100644 (file)
index 0000000..395f423
Binary files /dev/null and b/test/shape/data/in-house/fonts/6f36d056bad6d478fc0bf7397bd52dc3bd197d5f.ttf differ
diff --git a/test/shape/data/in-house/fonts/872d2955d326bd6676a06f66b8238ebbaabc212f.ttf b/test/shape/data/in-house/fonts/872d2955d326bd6676a06f66b8238ebbaabc212f.ttf
new file mode 100644 (file)
index 0000000..21b2dca
Binary files /dev/null and b/test/shape/data/in-house/fonts/872d2955d326bd6676a06f66b8238ebbaabc212f.ttf differ
diff --git a/test/shape/data/in-house/fonts/AdobeBlank2.ttf b/test/shape/data/in-house/fonts/AdobeBlank2.ttf
new file mode 100644 (file)
index 0000000..8a4fb00
Binary files /dev/null and b/test/shape/data/in-house/fonts/AdobeBlank2.ttf differ
diff --git a/test/shape/data/in-house/fonts/FallbackPlus-Javanese-no-GDEF.otf b/test/shape/data/in-house/fonts/FallbackPlus-Javanese-no-GDEF.otf
new file mode 100644 (file)
index 0000000..45896c1
Binary files /dev/null and b/test/shape/data/in-house/fonts/FallbackPlus-Javanese-no-GDEF.otf differ
diff --git a/test/shape/data/in-house/fonts/HBTest-VF.ttf b/test/shape/data/in-house/fonts/HBTest-VF.ttf
new file mode 100644 (file)
index 0000000..01c2230
Binary files /dev/null and b/test/shape/data/in-house/fonts/HBTest-VF.ttf differ
diff --git a/test/shape/data/in-house/fonts/NotoNastaliqUrdu-Regular.ttf b/test/shape/data/in-house/fonts/NotoNastaliqUrdu-Regular.ttf
new file mode 100644 (file)
index 0000000..cd01de0
Binary files /dev/null and b/test/shape/data/in-house/fonts/NotoNastaliqUrdu-Regular.ttf differ
diff --git a/test/shape/data/in-house/fonts/a6b17da98b9f1565ba428719777bbf94a66403c1.ttf b/test/shape/data/in-house/fonts/a6b17da98b9f1565ba428719777bbf94a66403c1.ttf
new file mode 100644 (file)
index 0000000..84e8a59
Binary files /dev/null and b/test/shape/data/in-house/fonts/a6b17da98b9f1565ba428719777bbf94a66403c1.ttf differ
diff --git a/test/shape/data/in-house/fonts/a706511c65fb278fda87eaf2180ca6684a80f423.ttf b/test/shape/data/in-house/fonts/a706511c65fb278fda87eaf2180ca6684a80f423.ttf
new file mode 100644 (file)
index 0000000..7d217ba
Binary files /dev/null and b/test/shape/data/in-house/fonts/a706511c65fb278fda87eaf2180ca6684a80f423.ttf differ
diff --git a/test/shape/data/in-house/fonts/ab40c89624a6104e5d0a2308e448a989302f515b.ttf b/test/shape/data/in-house/fonts/ab40c89624a6104e5d0a2308e448a989302f515b.ttf
new file mode 100644 (file)
index 0000000..a82aa21
Binary files /dev/null and b/test/shape/data/in-house/fonts/ab40c89624a6104e5d0a2308e448a989302f515b.ttf differ
diff --git a/test/shape/data/in-house/fonts/b082211be29a3e2cf91f0fd43497e40b2a27b344.ttf b/test/shape/data/in-house/fonts/b082211be29a3e2cf91f0fd43497e40b2a27b344.ttf
new file mode 100644 (file)
index 0000000..6e59fd4
Binary files /dev/null and b/test/shape/data/in-house/fonts/b082211be29a3e2cf91f0fd43497e40b2a27b344.ttf differ
diff --git a/test/shape/data/in-house/fonts/b121d4306b2e3add5abbaad21d95fcf04aacbd64.ttf b/test/shape/data/in-house/fonts/b121d4306b2e3add5abbaad21d95fcf04aacbd64.ttf
new file mode 100644 (file)
index 0000000..7075592
Binary files /dev/null and b/test/shape/data/in-house/fonts/b121d4306b2e3add5abbaad21d95fcf04aacbd64.ttf differ
diff --git a/test/shape/data/in-house/fonts/b3075ca42b27dde7341c2d0ae16703c5b6640df0.ttf b/test/shape/data/in-house/fonts/b3075ca42b27dde7341c2d0ae16703c5b6640df0.ttf
new file mode 100644 (file)
index 0000000..4d0b3cd
Binary files /dev/null and b/test/shape/data/in-house/fonts/b3075ca42b27dde7341c2d0ae16703c5b6640df0.ttf differ
diff --git a/test/shape/data/in-house/fonts/b31e6c52a31edadc16f1bec9efe6019e2d59824a.ttf b/test/shape/data/in-house/fonts/b31e6c52a31edadc16f1bec9efe6019e2d59824a.ttf
new file mode 100644 (file)
index 0000000..3a17b92
Binary files /dev/null and b/test/shape/data/in-house/fonts/b31e6c52a31edadc16f1bec9efe6019e2d59824a.ttf differ
diff --git a/test/shape/data/in-house/fonts/e2b17207c4b7ad78d843e1b0c4d00b09398a1137.ttf b/test/shape/data/in-house/fonts/e2b17207c4b7ad78d843e1b0c4d00b09398a1137.ttf
new file mode 100644 (file)
index 0000000..b499ce0
Binary files /dev/null and b/test/shape/data/in-house/fonts/e2b17207c4b7ad78d843e1b0c4d00b09398a1137.ttf differ
diff --git a/test/shape/data/in-house/fonts/e5ff44940364c2247abed50bdda30d2ef5aedfe4.ttf b/test/shape/data/in-house/fonts/e5ff44940364c2247abed50bdda30d2ef5aedfe4.ttf
new file mode 100644 (file)
index 0000000..a7c569f
Binary files /dev/null and b/test/shape/data/in-house/fonts/e5ff44940364c2247abed50bdda30d2ef5aedfe4.ttf differ
diff --git a/test/shape/data/in-house/fonts/e6185e88b04432fbf373594d5971686bb7dd698d.ttf b/test/shape/data/in-house/fonts/e6185e88b04432fbf373594d5971686bb7dd698d.ttf
new file mode 100644 (file)
index 0000000..5234b06
Binary files /dev/null and b/test/shape/data/in-house/fonts/e6185e88b04432fbf373594d5971686bb7dd698d.ttf differ
diff --git a/test/shape/data/in-house/fonts/e8691822f6a705e3e9fb48a0405c645b1a036590.ttf b/test/shape/data/in-house/fonts/e8691822f6a705e3e9fb48a0405c645b1a036590.ttf
new file mode 100644 (file)
index 0000000..7c3a5b1
Binary files /dev/null and b/test/shape/data/in-house/fonts/e8691822f6a705e3e9fb48a0405c645b1a036590.ttf differ
diff --git a/test/shape/data/in-house/fonts/fcea341ba6489536390384d8403ce5287ba71a4a.ttf b/test/shape/data/in-house/fonts/fcea341ba6489536390384d8403ce5287ba71a4a.ttf
new file mode 100644 (file)
index 0000000..c867877
Binary files /dev/null and b/test/shape/data/in-house/fonts/fcea341ba6489536390384d8403ce5287ba71a4a.ttf differ
diff --git a/test/shape/data/in-house/fonts/fd07ea46e4d8368ada1776208c07fd596f727852.ttf b/test/shape/data/in-house/fonts/fd07ea46e4d8368ada1776208c07fd596f727852.ttf
new file mode 100644 (file)
index 0000000..21e2246
Binary files /dev/null and b/test/shape/data/in-house/fonts/fd07ea46e4d8368ada1776208c07fd596f727852.ttf differ
diff --git a/test/shape/data/in-house/meson.build b/test/shape/data/in-house/meson.build
new file mode 100644 (file)
index 0000000..2da9dab
--- /dev/null
@@ -0,0 +1,84 @@
+in_house_tests_base = [
+  'aat-morx.tests',
+  'aat-trak.tests',
+  'arabic-fallback-shaping.tests',
+  'arabic-feature-order.tests',
+  'arabic-like-joining.tests',
+  'arabic-mark-attach.tests',
+  'arabic-mark-order.tests',
+  'arabic-normalization.tests',
+  'arabic-stch.tests',
+  'automatic-fractions.tests',
+  'cluster.tests',
+  'collections.tests',
+  'color-fonts.tests',
+  'context-matching.tests',
+  'cursive-positioning.tests',
+  'default-ignorables.tests',
+  'digits.tests',
+  'emoji.tests',
+  'emoji-clusters.tests',
+  'fallback-positioning.tests',
+  'glyph-props-no-gdef.tests',
+  'hangul-jamo.tests',
+  'hyphens.tests',
+  'indic-consonant-with-stacker.tests',
+  'indic-decompose.tests',
+  'indic-init.tests',
+  'indic-joiner-candrabindu.tests',
+  'indic-joiners.tests',
+  'indic-old-spec.tests',
+  'indic-pref-blocking.tests',
+  'indic-script-extensions.tests',
+  'indic-special-cases.tests',
+  'indic-syllable.tests',
+  'indic-vowel-letter-spoofing.tests',
+  'item-context.tests',
+  'kern-format2.tests',
+  'khmer-mark-order.tests',
+  'khmer-misc.tests',
+  'language-tags.tests',
+  'ligature-id.tests',
+  'macos.tests',
+  'mark-attachment.tests',
+  'mark-filtering-sets.tests',
+  'mongolian-variation-selector.tests',
+  'myanmar-misc.tests',
+  'myanmar-syllable.tests',
+  'myanmar-zawgyi.tests',
+  'nested-mark-filtering-sets.tests',
+  'none-directional.tests',
+  'positioning-features.tests',
+  'rand.tests',
+  'reverse-sub.tests',
+  'rotation.tests',
+  'simple.tests',
+  'sinhala.tests',
+  'spaces.tests',
+  'tibetan-contractions-1.tests',
+  'tibetan-contractions-2.tests',
+  'tibetan-vowels.tests',
+  'tt-kern-gpos.tests',
+  'unsafe-to-concat.tests',
+  'use-indic3.tests',
+  'use-marchen.tests',
+  'use-syllable.tests',
+  'use-vowel-letter-spoofing.tests',
+  'use.tests',
+  'variations.tests',
+  'variations-rvrn.tests',
+  'vertical.tests',
+  'zero-width-marks.tests',
+]
+
+in_house_tests_coretext = [
+  'coretext.tests',
+]
+
+in_house_tests_uniscribe = [
+  'uniscribe.tests',
+]
+
+in_house_tests_directwrite = [
+  'directwrite.tests',
+]
diff --git a/test/shape/data/in-house/tests/aat-morx.tests b/test/shape/data/in-house/tests/aat-morx.tests
new file mode 100644 (file)
index 0000000..b1b5079
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/MORXTwentyeight.ttf;;U+0041,U+0078,U+0045,U+0079,U+0044,U+0079,U+0079;[A_E_D=0+1394|x=0+529|y=0+510|y=5+510|y=6+510]
+../fonts/e6185e88b04432fbf373594d5971686bb7dd698d.ttf;;U+0B95,U+0BCD,U+0020,U+0B9A,U+0BCD;[ka-tamil=0+825|pulli-tamil=0@-392,0+0|space=2+260|ca-tamil=3+723|pulli-tamil=3@-320,0+0]
diff --git a/test/shape/data/in-house/tests/aat-trak.tests b/test/shape/data/in-house/tests/aat-trak.tests
new file mode 100644 (file)
index 0000000..75c8704
--- /dev/null
@@ -0,0 +1,11 @@
+../fonts/TRAK.ttf;;U+0041,U+0042,U+0043;[A.alt=0+1000|B=1+1000|C.alt=2+1000]
+../fonts/TRAK.ttf;--font-ptem=.5;U+0041,U+0042,U+0043;[A.alt=0@100,0+1200|B=1@100,0+1200|C.alt=2@100,0+1200]
+../fonts/TRAK.ttf;--font-ptem=1;U+0041,U+0042,U+0043;[A.alt=0@100,0+1200|B=1@100,0+1200|C.alt=2@100,0+1200]
+../fonts/TRAK.ttf;--font-ptem=2;U+0041,U+0042,U+0043;[A.alt=0@100,0+1200|B=1@100,0+1200|C.alt=2@100,0+1200]
+../fonts/TRAK.ttf;--font-ptem=9;U+0041,U+0042,U+0043;[A.alt=0@30,0+1060|B=1@30,0+1060|C.alt=2@30,0+1060]
+../fonts/TRAK.ttf;--font-ptem=24;U+0041,U+0042,U+0043;[A.alt=0@-7,0+986|B=1@-7,0+986|C.alt=2@-7,0+986]
+../fonts/TRAK.ttf;--font-ptem=72;U+0041,U+0042,U+0043;[A.alt=0@-35,0+929|B=1@-35,0+929|C.alt=2@-35,0+929]
+../fonts/TRAK.ttf;--font-ptem=144;U+0041,U+0042,U+0043;[A.alt=0@-78,0+843|B=1@-78,0+843|C.alt=2@-78,0+843]
+../fonts/TRAK.ttf;--font-ptem=144;U+0041,U+0042,U+0043;[A.alt=0@-78,0+843|B=1@-78,0+843|C.alt=2@-78,0+843]
+../fonts/TRAK.ttf;--font-ptem=144 --features=-trak;U+0041,U+0042,U+0043;[A.alt=0+1000|B=1+1000|C.alt=2+1000]
+../fonts/TRAK.ttf;--font-ptem=144 --features=-trak[1:3];U+0041,U+0042,U+0043,U+0041,U+0042,U+0043;[A.alt=0@-78,0+843|B=1+1000|C.alt=2+1000|A.alt=3@-78,0+843|B=4@-78,0+843|C.alt=5@-78,0+843]
diff --git a/test/shape/data/in-house/tests/arabic-fallback-shaping.tests b/test/shape/data/in-house/tests/arabic-fallback-shaping.tests
new file mode 100644 (file)
index 0000000..14f8919
--- /dev/null
@@ -0,0 +1 @@
+../fonts/df768b9c257e0c9c35786c47cae15c46571d56be.ttf;;U+0633,U+064F,U+0644,U+064E,U+0651,U+0627,U+0651,U+0650,U+0645,U+062A,U+06CC;[uni06CC.fina=10+1655|uni062A.medi=9+868|uni0645.init=8+1098|uni0650=2@148,0+0|uni0651=2@187,736+0|uni064E=2@883,1259+0|uni0651=2@922,736+0|uni06440627.fina=2+1470|uni064F=0@629,-10+0|uni0633.init=0+1585]
diff --git a/test/shape/data/in-house/tests/arabic-feature-order.tests b/test/shape/data/in-house/tests/arabic-feature-order.tests
new file mode 100644 (file)
index 0000000..8d7a094
--- /dev/null
@@ -0,0 +1,4 @@
+../fonts/813c2f8e5512187fd982417a7fb4286728e6f4a8.ttf;;U+1820,U+180B;[uni2048.E81A=0+1550]
+../fonts/8a9fea2a7384f2116e5b84a9b31f83be7850ce21.ttf;;U+1820,U+180B;[uni2048.E81A=0+1550]
+../fonts/a919b33197965846f21074b24e30250d67277bce.ttf;;U+0644,U+0644,U+0647;[Lellah=0+1503]
+../fonts/bf39b0e91ef9807f15a9e283a21a14a209fd2cfc.ttf;;U+0644,U+064E,U+0670,U+0653,U+0626;[afii57414.zz04=4+1202|uni0670_uni0653=0@50,350+0|afii57454=0@550,1425+0|afii57444.calt=0+1065]
diff --git a/test/shape/data/in-house/tests/arabic-like-joining.tests b/test/shape/data/in-house/tests/arabic-like-joining.tests
new file mode 100644 (file)
index 0000000..9e69457
--- /dev/null
@@ -0,0 +1 @@
+../fonts/5dfad7735c6a67085f1b90d4d497e32907db4c78.ttf;;U+1E922,U+1E923,U+1E924,U+1E925,U+1E926,U+1E927,U+1E928,U+1E929,U+1E92A,U+1E92B,U+1E92C,U+1E92D,U+1E92E,U+1E92F,U+1E930,U+1E931,U+1E932,U+1E933,U+1E934,U+1E935,U+1E936,U+1E937,U+1E938,U+1E939,U+1E93A,U+1E93B,U+1E93C,U+1E93D,U+1E93E,U+1E93F,U+1E940,U+1E941,U+1E942,U+1E943;[sha_adlam.fina=33+711|kpo_adlam.medi=32+573|zal_adlam.medi=31+773|gbe_adlam.medi=30+594|kha_adlam.medi=29+686|va_adlam.medi=28+621|nha_adlam.medi=27+587|tu_adlam.medi=26+772|nya_adlam.medi=25+577|ga_adlam.medi=24+552|qaaf_adlam.medi=23+694|ha_adlam.medi=22+600|chi_adlam.medi=21+662|jiim_adlam.medi=20+781|u_adlam.medi=19+678|ya_adlam.medi=18+553|kaf_adlam.medi=17+808|nun_adlam.medi=16+561|waw_adlam.medi=15+651|yhe_adlam.medi=14+674|dha_adlam.medi=13+674|o_adlam.medi=12+640|i_adlam.medi=11+657|fa_adlam.medi=10+590|e_adlam.medi=9+628|ra_adlam.medi=8+599|bhe_adlam.medi=7+594|pe_adlam.medi=6+492|sinnyiiyhe_adlam.medi=5+777|ba_adlam.medi=4+655|miim_adlam.medi=3+525|laam_adlam.medi=2+554|daali_adlam.medi=1+600|alif_adlam.init=0+597]
diff --git a/test/shape/data/in-house/tests/arabic-mark-attach.tests b/test/shape/data/in-house/tests/arabic-mark-attach.tests
new file mode 100644 (file)
index 0000000..906fbf6
--- /dev/null
@@ -0,0 +1 @@
+../fonts/641ca9d7808b01cafa9a666c13811c9b56eb9c52.ttf;;U+064A,U+0633,U+06E1,U+200D,U+0654,U+064E,U+0644;[afii57444.zz04=6+1091|afii57454=1@75,925+0|uni0654=1+0|space=1+0|uni06E1=1@950,1115+0|afii57427.zz03_calt=1+1847|afii57450.zz21=0+345]
diff --git a/test/shape/data/in-house/tests/arabic-mark-order.tests b/test/shape/data/in-house/tests/arabic-mark-order.tests
new file mode 100644 (file)
index 0000000..c089eb3
--- /dev/null
@@ -0,0 +1,6 @@
+../fonts/94a5d6fb15a27521fba9ea4aee9cb39b2d03322a.ttf;;U+064A,U+064E,U+0670,U+0653,U+0640,U+0654,U+064E,U+0627;[afii57415.zz04=7+481|afii57454=4@25,975+0|uni0654=4@-50,50+0|afii57440=4+650|uni0670_uni0653=0@75,400+0|afii57454=0@750,1125+0|afii57450.calt=0+1331]
+../fonts/24b8d24d00ae86f49791b746da4c9d3f717a51a8.ttf;;U+0628,U+0618,U+0619,U+064E,U+064F,U+0654,U+0658,U+0653,U+0654,U+0651,U+0656,U+0651,U+065C,U+0655,U+0650;[uni0653.small=0@266,2508+0|uni0654=0@308,2151+0|uni0655=0@518,-1544+0|uni065C=0@501,-1453+0|uni0656=0@573,-659+0|uni0650=0@500,133+0|uni0619=0@300,1807+0|uni0618=0@357,1674+0|uni0651064E=0@387,1178+0|uni0651=0@402,764+0|uni0658=0@424,404+0|uni0654064F=0@540,-435+0|uni0628=0+1352]
+../fonts/21b7fb9c1eeae260473809fbc1fe330f66a507cd.ttf;;U+0649,U+0655,U+034F,U+0650;[uni0650.small2=0@727,-774+0|space=0+0|uni0655=0@727,-209+0|uni0649=0+1566]
+../fonts/21b7fb9c1eeae260473809fbc1fe330f66a507cd.ttf;;U+0649,U+0655,U+0650;[uni0650.small2=0@727,-774+0|uni0655=0@727,-209+0|uni0649=0+1566]
+../fonts/21b7fb9c1eeae260473809fbc1fe330f66a507cd.ttf;;U+0649,U+0650,U+0655;[uni0650.small2=0@727,-774+0|uni0655=0@727,-209+0|uni0649=0+1566]
+../fonts/21b7fb9c1eeae260473809fbc1fe330f66a507cd.ttf;;U+0649,U+0650,U+034F,U+0655;[uni0655=0+0|space=0+0|uni0650=0@166,0+0|uni0649=0+1566]
diff --git a/test/shape/data/in-house/tests/arabic-normalization.tests b/test/shape/data/in-house/tests/arabic-normalization.tests
new file mode 100644 (file)
index 0000000..35e3a65
--- /dev/null
@@ -0,0 +1,64 @@
+../fonts/872d2955d326bd6676a06f66b8238ebbaabc212f.ttf;;U+0622;[uni0622=0+217]
+../fonts/872d2955d326bd6676a06f66b8238ebbaabc212f.ttf;;U+0627,U+0653;[uni0622=0+217]
+../fonts/872d2955d326bd6676a06f66b8238ebbaabc212f.ttf;;U+0628,U+0622;[uni0622.fina=1+327|uni0628.init=0+190]
+../fonts/872d2955d326bd6676a06f66b8238ebbaabc212f.ttf;;U+0628,U+0627,U+0653;[uni0622.fina=1+327|uni0628.init=0+190]
+../fonts/872d2955d326bd6676a06f66b8238ebbaabc212f.ttf;;U+0623;[uni0623=0+234]
+../fonts/872d2955d326bd6676a06f66b8238ebbaabc212f.ttf;;U+0627,U+0654;[uni0623=0+234]
+../fonts/872d2955d326bd6676a06f66b8238ebbaabc212f.ttf;;U+0628,U+0623;[uni0623.fina=1+289|uni0628.init=0+190]
+../fonts/872d2955d326bd6676a06f66b8238ebbaabc212f.ttf;;U+0628,U+0627,U+0654;[uni0623.fina=1+289|uni0628.init=0+190]
+../fonts/872d2955d326bd6676a06f66b8238ebbaabc212f.ttf;;U+0624;[uni0624=0+400]
+../fonts/872d2955d326bd6676a06f66b8238ebbaabc212f.ttf;;U+0648,U+0654;[uni0624=0+400]
+../fonts/872d2955d326bd6676a06f66b8238ebbaabc212f.ttf;;U+0628,U+0624;[uni0624.fina=1+345|uni0628.init=0+190]
+../fonts/872d2955d326bd6676a06f66b8238ebbaabc212f.ttf;;U+0628,U+0648,U+0654;[uni0624.fina=1+345|uni0628.init=0+190]
+../fonts/872d2955d326bd6676a06f66b8238ebbaabc212f.ttf;;U+0625;[uni0625=0+217]
+../fonts/872d2955d326bd6676a06f66b8238ebbaabc212f.ttf;;U+0627,U+0655;[uni0625=0+217]
+../fonts/872d2955d326bd6676a06f66b8238ebbaabc212f.ttf;;U+0628,U+0625;[uni0625.fina=1+229|uni0628.init_Wide=0+285]
+../fonts/872d2955d326bd6676a06f66b8238ebbaabc212f.ttf;;U+0628,U+0627,U+0655;[uni0625.fina=1+229|uni0628.init_Wide=0+285]
+../fonts/872d2955d326bd6676a06f66b8238ebbaabc212f.ttf;;U+0626;[uni0626=0+764]
+../fonts/872d2955d326bd6676a06f66b8238ebbaabc212f.ttf;;U+064A,U+0654;[uni0626=0+764]
+../fonts/872d2955d326bd6676a06f66b8238ebbaabc212f.ttf;;U+0626,U+0626,U+0626;[uni0626.fina_BaaBaaYaa=2+457|uni0626.medi_BaaBaaYaa=1+357|uni0626.init_BaaBaaYaa=0+203]
+../fonts/872d2955d326bd6676a06f66b8238ebbaabc212f.ttf;;U+064A,U+0654,U+064A,U+0654,U+064A,U+0654;[uni0626.fina_BaaBaaYaa=4+457|uni0626.medi_BaaBaaYaa=2+357|uni0626.init_BaaBaaYaa=0+203]
+../fonts/872d2955d326bd6676a06f66b8238ebbaabc212f.ttf;;U+06C0;[uni06C0=0+369]
+../fonts/872d2955d326bd6676a06f66b8238ebbaabc212f.ttf;;U+06D5,U+0654;[uni06C0=0+369]
+../fonts/872d2955d326bd6676a06f66b8238ebbaabc212f.ttf;;U+0628,U+06C0;[hamza.above=1@195,73+0|uni06D5.fina=1+379|uni0628.init=0+190]
+../fonts/872d2955d326bd6676a06f66b8238ebbaabc212f.ttf;;U+0628,U+06D5,U+0654;[hamza.above=1@195,73+0|uni06D5.fina=1+379|uni0628.init=0+190]
+../fonts/872d2955d326bd6676a06f66b8238ebbaabc212f.ttf;;U+06C2;[uni06C2=0+369]
+../fonts/872d2955d326bd6676a06f66b8238ebbaabc212f.ttf;;U+06C1,U+0654;[uni06C2=0+369]
+../fonts/872d2955d326bd6676a06f66b8238ebbaabc212f.ttf;;U+0628,U+06C2;[hamza.above=1@171,-130+0|uni06C1.fina=1+408|uni0628.init=0+190]
+../fonts/872d2955d326bd6676a06f66b8238ebbaabc212f.ttf;;U+0628,U+06C1,U+0654;[hamza.above=1@171,-130+0|uni06C1.fina=1+408|uni0628.init=0+190]
+../fonts/872d2955d326bd6676a06f66b8238ebbaabc212f.ttf;;U+06D3;[uni06D3=0+1159]
+../fonts/872d2955d326bd6676a06f66b8238ebbaabc212f.ttf;;U+06D2,U+0654;[uni06D3=0+1159]
+../fonts/872d2955d326bd6676a06f66b8238ebbaabc212f.ttf;;U+0628,U+06D3;[uni06D2.fina_PostToothFina=1+312|uni0626.medi_YaaBari=1+205|uni0628.init_BaaBaaYaaBari=0+642]
+../fonts/872d2955d326bd6676a06f66b8238ebbaabc212f.ttf;;U+0628,U+06D2,U+0654;[uni06D2.fina_PostToothFina=1+312|uni0626.medi_YaaBari=1+205|uni0628.init_BaaBaaYaaBari=0+642]
+../fonts/3e46c3b84c1370a06594736c7f8acebf810bbb3b.ttf;;U+0622;[MaddaNS=0@211,18+0|AlefSep=0+330]
+../fonts/3e46c3b84c1370a06594736c7f8acebf810bbb3b.ttf;;U+0628,U+0622;[MaddaNS=1@208,-13+0|AlefFin.narrow=1+239|OneDotBelowNS=0@73,-165+0|sp0=0+0|BehxIni.A=0+236]
+../fonts/3e46c3b84c1370a06594736c7f8acebf810bbb3b.ttf;;U+0623;[HamzaAboveNS=0@211,57+0|AlefSep=0+330]
+../fonts/3e46c3b84c1370a06594736c7f8acebf810bbb3b.ttf;;U+0628,U+0623;[HamzaAboveNS=1@208,26+0|AlefFin.narrow=1+239|OneDotBelowNS=0@73,-165+0|sp0=0+0|BehxIni.A=0+236]
+../fonts/3e46c3b84c1370a06594736c7f8acebf810bbb3b.ttf;;U+0624;[HamzaAboveNS=0@216,-309+0|WawSep=0+422]
+../fonts/3e46c3b84c1370a06594736c7f8acebf810bbb3b.ttf;;U+0628,U+0624;[HamzaAboveNS=1@191,-309+0|WawFin.inD2=1+371|OneDotBelowNS=0@108,-97+0|sp0=0+0|BehxIni.outD2WQ=0@0,323+158]
+../fonts/3e46c3b84c1370a06594736c7f8acebf810bbb3b.ttf;;U+0625;[HamzaBelowNS=0@103,102+0|AlefSep=0+330]
+../fonts/3e46c3b84c1370a06594736c7f8acebf810bbb3b.ttf;;U+0628,U+0625;[HamzaBelowAltNS=1@116,-235+0|AlefFin.narrow=1+239|OneDotBelowAltNS=0@118,-77+0|sp0=0+0|BehxIni.A=0+236]
+../fonts/3e46c3b84c1370a06594736c7f8acebf810bbb3b.ttf;;U+0626;[HamzaAboveNS=0@274,-374+0|YehxSep=0+860]
+../fonts/3e46c3b84c1370a06594736c7f8acebf810bbb3b.ttf;;U+0626,U+0626,U+0626;[HamzaAboveNS=2@274,-375+0|YehxFin=2+520|HamzaAboveAltNS=1@65,-45+0|BehxMed.inT2outD2Y=1@0,379+294|HamzaAboveNS=0@101,-111+0|sp0=0+0|BehxIni.outT2=0@0,429+156]
+../fonts/3e46c3b84c1370a06594736c7f8acebf810bbb3b.ttf;;U+06C0;[HamzaAboveNS=0@159,-266+0|HehSep=0+314]
+../fonts/3e46c3b84c1370a06594736c7f8acebf810bbb3b.ttf;;U+0628,U+06C0;[HamzaAboveNS=1@91,-587+0|HehFin=1+230|OneDotBelowNS=0@151,-188+0|sp0=0+0|BehxIni.outS1=0@0,-34+235]
+../fonts/3e46c3b84c1370a06594736c7f8acebf810bbb3b.ttf;;U+06C2;[HamzaAboveNS=0@159,-266+0|HehSep=0+314]
+../fonts/3e46c3b84c1370a06594736c7f8acebf810bbb3b.ttf;;U+0628,U+06C2;[HamzaAboveNS=1@91,-587+0|HehFin=1+230|OneDotBelowNS=0@151,-188+0|sp0=0+0|BehxIni.outS1=0@0,-34+235]
+../fonts/3e46c3b84c1370a06594736c7f8acebf810bbb3b.ttf;;U+06D3;[HamzaAboveNS=0@144,-395+0|YehBarreeSep=0+1409]
+../fonts/3e46c3b84c1370a06594736c7f8acebf810bbb3b.ttf;;U+0628,U+06D3;[HamzaAboveNS=1@118,-477+0|YehBarreeFin=1+355|OneDotBelowNS=0@116,-151+0|BehxIni.outD2YB=0@0,419+984]
+../fonts/3e46c3b84c1370a06594736c7f8acebf810bbb3b.ttf;;U+0627,U+0653;[MaddaNS=0@211,18+0|AlefSep=0+330]
+../fonts/3e46c3b84c1370a06594736c7f8acebf810bbb3b.ttf;;U+0628,U+0627,U+0653;[MaddaNS=1@208,-13+0|AlefFin.narrow=1+239|OneDotBelowNS=0@73,-165+0|sp0=0+0|BehxIni.A=0+236]
+../fonts/3e46c3b84c1370a06594736c7f8acebf810bbb3b.ttf;;U+0627,U+0654;[HamzaAboveNS=0@211,57+0|AlefSep=0+330]
+../fonts/3e46c3b84c1370a06594736c7f8acebf810bbb3b.ttf;;U+0628,U+0627,U+0654;[HamzaAboveNS=1@208,26+0|AlefFin.narrow=1+239|OneDotBelowNS=0@73,-165+0|sp0=0+0|BehxIni.A=0+236]
+../fonts/3e46c3b84c1370a06594736c7f8acebf810bbb3b.ttf;;U+0648,U+0654;[HamzaAboveNS=0@216,-309+0|WawSep=0+422]
+../fonts/3e46c3b84c1370a06594736c7f8acebf810bbb3b.ttf;;U+0628,U+0648,U+0654;[HamzaAboveNS=1@191,-309+0|WawFin.inD2=1+371|OneDotBelowNS=0@108,-97+0|sp0=0+0|BehxIni.outD2WQ=0@0,323+158]
+../fonts/3e46c3b84c1370a06594736c7f8acebf810bbb3b.ttf;;U+0627,U+0655;[HamzaBelowNS=0@103,102+0|AlefSep=0+330]
+../fonts/3e46c3b84c1370a06594736c7f8acebf810bbb3b.ttf;;U+0628,U+0627,U+0655;[HamzaBelowAltNS=1@116,-235+0|AlefFin.narrow=1+239|OneDotBelowAltNS=0@118,-77+0|sp0=0+0|BehxIni.A=0+236]
+../fonts/3e46c3b84c1370a06594736c7f8acebf810bbb3b.ttf;;U+064A,U+0654;[HamzaAboveNS=0@274,-374+0|YehxSep=0+860]
+../fonts/3e46c3b84c1370a06594736c7f8acebf810bbb3b.ttf;;U+064A,U+0654,U+064A,U+0654,U+064A,U+0654;[HamzaAboveNS=4@274,-375+0|YehxFin=4+520|HamzaAboveAltNS=2@65,-45+0|BehxMed.inT2outD2Y=2@0,379+294|HamzaAboveNS=0@101,-111+0|sp0=0+0|BehxIni.outT2=0@0,429+156]
+../fonts/3e46c3b84c1370a06594736c7f8acebf810bbb3b.ttf;;U+06D5,U+0654;[HamzaAboveNS=0@159,-266+0|HehSep=0+314]
+../fonts/3e46c3b84c1370a06594736c7f8acebf810bbb3b.ttf;;U+0628,U+06D5,U+0654;[HamzaAboveNS=1@91,-587+0|HehFin=1+230|OneDotBelowNS=0@151,-188+0|sp0=0+0|BehxIni.outS1=0@0,-34+235]
+../fonts/3e46c3b84c1370a06594736c7f8acebf810bbb3b.ttf;;U+06C1,U+0654;[HamzaAboveNS=0@159,-266+0|HehSep=0+314]
+../fonts/3e46c3b84c1370a06594736c7f8acebf810bbb3b.ttf;;U+0628,U+06C1,U+0654;[HamzaAboveNS=1@91,-587+0|HehFin=1+230|OneDotBelowNS=0@151,-188+0|sp0=0+0|BehxIni.outS1=0@0,-34+235]
+../fonts/3e46c3b84c1370a06594736c7f8acebf810bbb3b.ttf;;U+06D2,U+0654;[HamzaAboveNS=0@144,-395+0|YehBarreeSep=0+1409]
+../fonts/3e46c3b84c1370a06594736c7f8acebf810bbb3b.ttf;;U+0628,U+06D2,U+0654;[HamzaAboveNS=1@118,-477+0|YehBarreeFin=1+355|OneDotBelowNS=0@116,-151+0|BehxIni.outD2YB=0@0,419+984]
diff --git a/test/shape/data/in-house/tests/arabic-stch.tests b/test/shape/data/in-house/tests/arabic-stch.tests
new file mode 100644 (file)
index 0000000..491b242
--- /dev/null
@@ -0,0 +1 @@
+../fonts/d9b8bc10985f24796826c29f7ccba3d0ae11ec02.ttf;--no-glyph-names;U+0718,U+070F,U+0718,U+0718,U+002E;[1=4+168|3=3+502|3=2+502|4=1@-1004,0+0|5=1@-876,0+0|5=1@-799,0+0|5=1@-722,0+0|5=1@-645,0+0|4=1@-566,0+0|5=1@-438,0+0|5=1@-361,0+0|5=1@-284,0+0|5=1@-207,0+0|4=1@-128,0+0|3=0+502]
diff --git a/test/shape/data/in-house/tests/automatic-fractions.tests b/test/shape/data/in-house/tests/automatic-fractions.tests
new file mode 100644 (file)
index 0000000..36f5796
--- /dev/null
@@ -0,0 +1,3 @@
+../fonts/15dfc433a135a658b9f4b1a861b5cdd9658ccbb9.ttf;;U+0031,U+0032,U+0033,U+2044,U+0034,U+0035,U+0036;[one.numr=0+600|two.numr=1+600|three.numr=2+600|fraction=3+252|four.small=4+600|five.small=5+600|six.small=6+600]
+../fonts/15dfc433a135a658b9f4b1a861b5cdd9658ccbb9.ttf;--direction=l --script=arab;U+0031,U+0032,U+0033,U+2044,U+0034,U+0035,U+0036;[one.numr=0+600|two.numr=1+600|three.numr=2+600|fraction=3+252|four.small=4+600|five.small=5+600|six.small=6+600]
+../fonts/15dfc433a135a658b9f4b1a861b5cdd9658ccbb9.ttf;--direction=l;U+0661,U+0662,U+0663,U+2044,U+0664,U+0665,U+0666;[uni0661.numr=0+600|uni0662.numr=1+600|uni0663.numr=2+600|fraction=3+252|uni0664.small=4+600|uni0665.small=5+600|uni0666.small=6+600]
diff --git a/test/shape/data/in-house/tests/cluster.tests b/test/shape/data/in-house/tests/cluster.tests
new file mode 100644 (file)
index 0000000..2663e23
--- /dev/null
@@ -0,0 +1,4 @@
+../fonts/4fac3929fc3332834e93673780ec0fe94342d193.ttf;--cluster-level=2;U+0078,U+030A,U+0058,U+030A;[gid2=0+1083|gid3=1@-1132,-8+0|gid1=2+1200|gid3=3@-1190,349+0]
+../fonts/43ef465752be9af900745f72fe29cb853a1401a5.ttf;--cluster-level=1;U+05D4,U+05B7,U+05E9,U+05BC,U+05C1,U+05B8,U+05DE,U+05B4,U+05DD;[uni05DD=8+1359|uni05B4=7@111,0+0|uni05DE=6+1391|uni05B8=5+0|uni05BC=3+0|uni05C1=3+0|uni05E9=2+1451|uni05B7=1@28,0+0|uni05D4=0+1338]
+../fonts/6f36d056bad6d478fc0bf7397bd52dc3bd197d5f.ttf;--cluster-level=1;U+099B,U+09CB,U+09C8,U+09C2,U+09CB,U+098C;[evowelsigninibeng=0+346|aivowelsignbeng=0+346|evowelsignbeng=0+346|chabeng=0+687|uuvowelsignlongbeng=0@-96,0+0|aavowelsignbeng=0+266|aavowelsignbeng=4+266|lvocalicbeng=5+639]
+../fonts/fd07ea46e4d8368ada1776208c07fd596f727852.ttf;--cluster-level=1;U+0D4E,U+0D4D,U+200D;[uni0D4E=0+0|uni25CC=0+418|uni0D4D=0+0|space=0+0]
diff --git a/test/shape/data/in-house/tests/collections.tests b/test/shape/data/in-house/tests/collections.tests
new file mode 100644 (file)
index 0000000..50d6d92
--- /dev/null
@@ -0,0 +1,6 @@
+../fonts/DFONT.dfont;--face-index=0 --font-funcs=ot;U+2026,U+0020,U+002E;[ellipsis=0+723|space=1+250|period=2+241]
+../fonts/DFONT.dfont;--face-index=1 --font-funcs=ot;U+2026,U+0020,U+002E;[gid0=0+1000|gid0=1+1000|gid0=2+1000]
+../fonts/DFONT.dfont;--face-index=2 --font-funcs=ot;U+2026,U+0020,U+002E;[gid0=0+1000|gid0=1+1000|gid0=2+1000]
+../fonts/TTC.ttc;--face-index=0 --font-funcs=ot;U+2026,U+0020,U+002E;[ellipsis=0+723|space=1+250|period=2+241]
+../fonts/TTC.ttc;--face-index=1 --font-funcs=ot;U+2026,U+0020,U+002E;[ellipsis=0+723|space=1+250|period=2+241]
+../fonts/TTC.ttc;--face-index=2 --font-funcs=ot;U+2026,U+0020,U+002E;[gid0=0+1000|gid0=1+1000|gid0=2+1000]
diff --git a/test/shape/data/in-house/tests/color-fonts.tests b/test/shape/data/in-house/tests/color-fonts.tests
new file mode 100644 (file)
index 0000000..42636ed
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/ee39587d13b2afa5499cc79e45780aa79293bbd4.ttf;--font-funcs=ot --show-extents;U+1F42F;[gid1=0+2963<0,2179,2963,-2789>]
+../fonts/fcbaa518d3cce441ed37ae3b1fed6a19e9b54efd.ttf;--font-funcs=ot --show-extents;U+1F600;[gid4=0+2550<0,1898,2555,-2405>]
diff --git a/test/shape/data/in-house/tests/context-matching.tests b/test/shape/data/in-house/tests/context-matching.tests
new file mode 100644 (file)
index 0000000..ad71721
--- /dev/null
@@ -0,0 +1,3 @@
+../fonts/4cce528e99f600ed9c25a2b69e32eb94a03b4ae8.ttf;;U+1A48,U+1A58,U+1A25,U+1A48,U+1A58,U+1A25,U+1A6E,U+1A63;[uni1A48=0+1212|uni1A25=0+1912|uni1A58=0+0|uni1A48=3+1212|uni1A6E=3+0|uni1A25=3+1912|uni1A58=3+0|uni1A63=3+1212]
+../fonts/d629e7fedc0b350222d7987345fe61613fa3929a.ttf;;U+0915,U+093F,U+0915,U+093F;[ivowelsign03deva=0+530|kadeva=0+1561|ivowelsign03deva=2+530|kadeva=2+1561]
+../fonts/f499fbc23865022234775c43503bba2e63978fe1.ttf;;U+09B0,U+09CD,U+09A5,U+09CD,U+09AF,U+09C0;[gid1=0+1320|gid13=0+523|gid18=0+545]
diff --git a/test/shape/data/in-house/tests/cursive-positioning.tests b/test/shape/data/in-house/tests/cursive-positioning.tests
new file mode 100644 (file)
index 0000000..aca4fba
--- /dev/null
@@ -0,0 +1,5 @@
+../fonts/c4e48b0886ef460f532fb49f00047ec92c432ec0.ttf;;U+0643,U+0645,U+0645,U+062B,U+0644;[gid8=4+738|gid5=3@441,1197+0|gid6=3@0,432+405|gid9=2@0,477+452|gid9=1@0,977+452|gid10=0@20,1577+207]
+../fonts/298c9e1d955f10f6f72c6915c3c6ff9bf9695cec.ttf;;U+0643,U+0645,U+0645,U+062B,U+0644;[gid8=4+738|gid5=3@441,1197+0|gid6=3@0,432+405|gid9=2@0,477+500|gid9=1@0,577+452|gid10=0@20,1177+207]
+#../fonts/706c5d7b625f207bc0d874c67237aad6f1e9cd6f.ttf;;U+0B1F,U+0B4D,U+0B1A,U+0B4D,U+0B1A;[ttaorya=0+1307|casubscriptorya=0@-242,104+-231|casubscriptnarroworya=0@20,104+507]
+../fonts/07f054357ff8638bac3711b422a1e31180bba863.ttf;--font-funcs=ot --no-glyph-names;U+0606,U+06E1;[2=0@40,502+0|1=0+1000]
+../fonts/9fc3e6960b3520e5304033ef5fd540285f72f14d.ttf;;U+16F0A,U+16F57,U+16F8F;[u16F0A=0+422|u16F57=0@0,209+338|u16F8F=0+0]
diff --git a/test/shape/data/in-house/tests/default-ignorables.tests b/test/shape/data/in-house/tests/default-ignorables.tests
new file mode 100644 (file)
index 0000000..68659b2
--- /dev/null
@@ -0,0 +1,5 @@
+../fonts/051d92f8bc6ff724511b296c27623f824de256e9.ttf;;U+0075,U+0361,U+034F,U+0301,U+0069;[gid2=0+1266|gid7=0@-617,442+0|gid5=0@-7,0+0|gid1=4+528]
+../fonts/bf962d3202883a820aed019d9b5c1838c2ff69c6.ttf;;U+0020,U+06CC,U+064E,U+034F,U+0651;[uni0651=1+0|space=1+0|uni064E=1@236,-432+0|uni06CC=1+1266|space=0+452]
+../fonts/6677074106f94a2644da6aaaacd5bbd48cbdc7de.ttf;;U+0647,U+200D;[terminal=0+0|uni0647.init=0+702]
+../fonts/fcea341ba6489536390384d8403ce5287ba71a4a.ttf;;U+0647,U+200D;[uni0647200D=0+702]
+../fonts/08b4b136f418add748dc641eb4a83033476f1170.ttf;;U+0647,U+200D;[terminal=0+0|terminal=0+0|uni0647.init=0+702]
diff --git a/test/shape/data/in-house/tests/digits.tests b/test/shape/data/in-house/tests/digits.tests
new file mode 100644 (file)
index 0000000..e19ca62
--- /dev/null
@@ -0,0 +1,5 @@
+../fonts/a6b17da98b9f1565ba428719777bbf94a66403c1.ttf;--direction=ltr --script=arab;U+06DD,U+0661,U+0662,U+0663;[uni06DD=0+1279|uni0661.small=1@-1079,0+0|uni0662.small=2@-786,0+0|uni0663.small=3@-493,0+0]
+../fonts/e5ff44940364c2247abed50bdda30d2ef5aedfe4.ttf;--direction=ltr --script=arab --features=pnum;U+0661,U+0662,U+0668,U+0663,U+0667;[uni0661.prop=0+361|uni0662.prop=1+436|uni0668.prop=2+478|uni0663.prop=3+597|uni0667.prop=4+527]
+../fonts/b082211be29a3e2cf91f0fd43497e40b2a27b344.ttf;--direction=ltr --script=arab;U+06DD,U+0661,U+0662,U+0628;[uni06DD=0+1279|uni0661=1+585|uni0662=2+585|uni0628=3+926]
+../fonts/3b791518a9ba89675df02f1eefbc9026a50648a6.ttf;--direction=ltr --script=arab;U+06DD,U+0661,U+0662,U+0663;[AyahEnd.alt3=0+1724|OneArabic.encl=0@-1143,444+0|TwoArabic.encl=0@-864,444+0|ThreeArabic.encl=0@-584,444+0]
+../fonts/3b791518a9ba89675df02f1eefbc9026a50648a6.ttf;--direction=rtl --script=arab;U+06DD,U+0661,U+0662,U+0663;[ThreeArabic.encl=0@1140,444+0|TwoArabic.encl=0@860,444+0|OneArabic.encl=0@581,444+0|AyahEnd.alt3=0+1724]
diff --git a/test/shape/data/in-house/tests/emoji-clusters.tests b/test/shape/data/in-house/tests/emoji-clusters.tests
new file mode 100644 (file)
index 0000000..be6a4e1
--- /dev/null
@@ -0,0 +1,3261 @@
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;263A,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F636,200D,1F32B,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F636,200D,1F32B;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F62E,200D,1F4A8;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F635,200D,1F4AB;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2639,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2620,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2763,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2764,FE0F,200D,1F525;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2764,200D,1F525;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2764,FE0F,200D,1FA79;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2764,200D,1FA79;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2764,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F573,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F441,FE0F,200D,1F5E8,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F441,200D,1F5E8,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F441,FE0F,200D,1F5E8;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F441,200D,1F5E8;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F5E8,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F5EF,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F44B,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F44B,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F44B,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F44B,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F44B,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F91A,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F91A,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F91A,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F91A,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F91A,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F590,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F590,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F590,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F590,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F590,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F590,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;270B,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;270B,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;270B,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;270B,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;270B,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F596,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F596,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F596,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F596,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F596,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F44C,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F44C,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F44C,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F44C,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F44C,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F90C,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F90C,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F90C,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F90C,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F90C,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F90F,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F90F,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F90F,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F90F,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F90F,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;270C,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;270C,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;270C,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;270C,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;270C,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;270C,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F91E,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F91E,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F91E,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F91E,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F91E,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F91F,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F91F,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F91F,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F91F,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F91F,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F918,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F918,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F918,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F918,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F918,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F919,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F919,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F919,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F919,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F919,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F448,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F448,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F448,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F448,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F448,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F449,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F449,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F449,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F449,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F449,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F446,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F446,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F446,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F446,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F446,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F595,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F595,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F595,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F595,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F595,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F447,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F447,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F447,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F447,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F447,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;261D,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;261D,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;261D,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;261D,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;261D,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;261D,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F44D,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F44D,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F44D,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F44D,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F44D,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F44E,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F44E,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F44E,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F44E,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F44E,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;270A,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;270A,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;270A,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;270A,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;270A,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F44A,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F44A,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F44A,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F44A,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F44A,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F91B,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F91B,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F91B,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F91B,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F91B,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F91C,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F91C,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F91C,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F91C,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F91C,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F44F,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F44F,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F44F,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F44F,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F44F,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64C,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64C,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64C,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64C,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64C,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F450,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F450,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F450,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F450,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F450,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F932,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F932,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F932,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F932,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F932,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64F,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64F,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64F,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64F,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64F,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;270D,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;270D,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;270D,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;270D,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;270D,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;270D,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F485,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F485,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F485,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F485,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F485,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F933,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F933,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F933,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F933,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F933,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F4AA,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F4AA,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F4AA,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F4AA,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F4AA,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B5,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B5,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B5,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B5,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B5,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B6,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B6,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B6,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B6,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B6,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F442,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F442,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F442,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F442,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F442,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9BB,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9BB,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9BB,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9BB,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9BB,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F443,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F443,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F443,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F443,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F443,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F441,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F476,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F476,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F476,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F476,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F476,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D2,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D2,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D2,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D2,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D2,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F466,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F466,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F466,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F466,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F466,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F467,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F467,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F467,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F467,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F467,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F471,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F471,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F471,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F471,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F471,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D4,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D4,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D4,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D4,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D4,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D4,200D,2642,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D4,200D,2642;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D4,1F3FB,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D4,1F3FB,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D4,1F3FC,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D4,1F3FC,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D4,1F3FD,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D4,1F3FD,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D4,1F3FE,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D4,1F3FE,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D4,1F3FF,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D4,1F3FF,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D4,200D,2640,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D4,200D,2640;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D4,1F3FB,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D4,1F3FB,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D4,1F3FC,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D4,1F3FC,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D4,1F3FD,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D4,1F3FD,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D4,1F3FE,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D4,1F3FE,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D4,1F3FF,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D4,1F3FF,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,1F9B0;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,1F9B0;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,1F9B0;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,1F9B0;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,1F9B0;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,1F9B0;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,1F9B1;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,1F9B1;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,1F9B1;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,1F9B1;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,1F9B1;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,1F9B1;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,1F9B3;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,1F9B3;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,1F9B3;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,1F9B3;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,1F9B3;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,1F9B3;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,1F9B2;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,1F9B2;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,1F9B2;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,1F9B2;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,1F9B2;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,1F9B2;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,1F9B0;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,1F9B0;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,1F9B0;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,1F9B0;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,1F9B0;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,1F9B0;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,200D,1F9B0;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,1F9B0;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,1F9B0;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,1F9B0;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,1F9B0;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,1F9B0;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,1F9B1;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,1F9B1;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,1F9B1;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,1F9B1;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,1F9B1;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,1F9B1;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,200D,1F9B1;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,1F9B1;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,1F9B1;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,1F9B1;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,1F9B1;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,1F9B1;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,1F9B3;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,1F9B3;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,1F9B3;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,1F9B3;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,1F9B3;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,1F9B3;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,200D,1F9B3;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,1F9B3;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,1F9B3;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,1F9B3;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,1F9B3;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,1F9B3;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,1F9B2;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,1F9B2;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,1F9B2;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,1F9B2;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,1F9B2;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,1F9B2;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,200D,1F9B2;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,1F9B2;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,1F9B2;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,1F9B2;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,1F9B2;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,1F9B2;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F471,200D,2640,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F471,200D,2640;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F471,1F3FB,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F471,1F3FB,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F471,1F3FC,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F471,1F3FC,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F471,1F3FD,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F471,1F3FD,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F471,1F3FE,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F471,1F3FE,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F471,1F3FF,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F471,1F3FF,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F471,200D,2642,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F471,200D,2642;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F471,1F3FB,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F471,1F3FB,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F471,1F3FC,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F471,1F3FC,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F471,1F3FD,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F471,1F3FD,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F471,1F3FE,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F471,1F3FE,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F471,1F3FF,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F471,1F3FF,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D3,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D3,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D3,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D3,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D3,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F474,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F474,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F474,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F474,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F474,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F475,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F475,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F475,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F475,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F475,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64D,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64D,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64D,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64D,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64D,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64D,200D,2642,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64D,200D,2642;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64D,1F3FB,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64D,1F3FB,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64D,1F3FC,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64D,1F3FC,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64D,1F3FD,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64D,1F3FD,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64D,1F3FE,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64D,1F3FE,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64D,1F3FF,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64D,1F3FF,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64D,200D,2640,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64D,200D,2640;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64D,1F3FB,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64D,1F3FB,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64D,1F3FC,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64D,1F3FC,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64D,1F3FD,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64D,1F3FD,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64D,1F3FE,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64D,1F3FE,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64D,1F3FF,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64D,1F3FF,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64E,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64E,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64E,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64E,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64E,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64E,200D,2642,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64E,200D,2642;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64E,1F3FB,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64E,1F3FB,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64E,1F3FC,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64E,1F3FC,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64E,1F3FD,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64E,1F3FD,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64E,1F3FE,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64E,1F3FE,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64E,1F3FF,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64E,1F3FF,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64E,200D,2640,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64E,200D,2640;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64E,1F3FB,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64E,1F3FB,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64E,1F3FC,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64E,1F3FC,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64E,1F3FD,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64E,1F3FD,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64E,1F3FE,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64E,1F3FE,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64E,1F3FF,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64E,1F3FF,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F645,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F645,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F645,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F645,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F645,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F645,200D,2642,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F645,200D,2642;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F645,1F3FB,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F645,1F3FB,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F645,1F3FC,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F645,1F3FC,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F645,1F3FD,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F645,1F3FD,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F645,1F3FE,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F645,1F3FE,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F645,1F3FF,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F645,1F3FF,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F645,200D,2640,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F645,200D,2640;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F645,1F3FB,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F645,1F3FB,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F645,1F3FC,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F645,1F3FC,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F645,1F3FD,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F645,1F3FD,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F645,1F3FE,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F645,1F3FE,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F645,1F3FF,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F645,1F3FF,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F646,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F646,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F646,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F646,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F646,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F646,200D,2642,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F646,200D,2642;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F646,1F3FB,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F646,1F3FB,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F646,1F3FC,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F646,1F3FC,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F646,1F3FD,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F646,1F3FD,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F646,1F3FE,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F646,1F3FE,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F646,1F3FF,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F646,1F3FF,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F646,200D,2640,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F646,200D,2640;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F646,1F3FB,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F646,1F3FB,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F646,1F3FC,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F646,1F3FC,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F646,1F3FD,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F646,1F3FD,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F646,1F3FE,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F646,1F3FE,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F646,1F3FF,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F646,1F3FF,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F481,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F481,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F481,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F481,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F481,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F481,200D,2642,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F481,200D,2642;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F481,1F3FB,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F481,1F3FB,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F481,1F3FC,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F481,1F3FC,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F481,1F3FD,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F481,1F3FD,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F481,1F3FE,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F481,1F3FE,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F481,1F3FF,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F481,1F3FF,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F481,200D,2640,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F481,200D,2640;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F481,1F3FB,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F481,1F3FB,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F481,1F3FC,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F481,1F3FC,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F481,1F3FD,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F481,1F3FD,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F481,1F3FE,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F481,1F3FE,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F481,1F3FF,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F481,1F3FF,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64B,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64B,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64B,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64B,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64B,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64B,200D,2642,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64B,200D,2642;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64B,1F3FB,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64B,1F3FB,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64B,1F3FC,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64B,1F3FC,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64B,1F3FD,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64B,1F3FD,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64B,1F3FE,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64B,1F3FE,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64B,1F3FF,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64B,1F3FF,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64B,200D,2640,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64B,200D,2640;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64B,1F3FB,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64B,1F3FB,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64B,1F3FC,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64B,1F3FC,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64B,1F3FD,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64B,1F3FD,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64B,1F3FE,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64B,1F3FE,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64B,1F3FF,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F64B,1F3FF,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CF,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CF,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CF,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CF,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CF,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CF,200D,2642,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CF,200D,2642;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CF,1F3FB,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CF,1F3FB,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CF,1F3FC,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CF,1F3FC,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CF,1F3FD,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CF,1F3FD,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CF,1F3FE,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CF,1F3FE,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CF,1F3FF,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CF,1F3FF,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CF,200D,2640,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CF,200D,2640;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CF,1F3FB,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CF,1F3FB,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CF,1F3FC,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CF,1F3FC,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CF,1F3FD,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CF,1F3FD,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CF,1F3FE,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CF,1F3FE,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CF,1F3FF,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CF,1F3FF,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F647,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F647,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F647,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F647,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F647,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F647,200D,2642,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F647,200D,2642;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F647,1F3FB,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F647,1F3FB,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F647,1F3FC,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F647,1F3FC,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F647,1F3FD,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F647,1F3FD,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F647,1F3FE,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F647,1F3FE,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F647,1F3FF,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F647,1F3FF,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F647,200D,2640,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F647,200D,2640;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F647,1F3FB,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F647,1F3FB,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F647,1F3FC,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F647,1F3FC,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F647,1F3FD,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F647,1F3FD,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F647,1F3FE,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F647,1F3FE,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F647,1F3FF,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F647,1F3FF,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F926,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F926,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F926,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F926,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F926,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F926,200D,2642,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F926,200D,2642;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F926,1F3FB,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F926,1F3FB,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F926,1F3FC,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F926,1F3FC,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F926,1F3FD,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F926,1F3FD,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F926,1F3FE,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F926,1F3FE,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F926,1F3FF,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F926,1F3FF,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F926,200D,2640,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F926,200D,2640;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F926,1F3FB,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F926,1F3FB,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F926,1F3FC,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F926,1F3FC,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F926,1F3FD,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F926,1F3FD,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F926,1F3FE,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F926,1F3FE,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F926,1F3FF,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F926,1F3FF,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F937,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F937,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F937,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F937,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F937,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F937,200D,2642,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F937,200D,2642;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F937,1F3FB,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F937,1F3FB,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F937,1F3FC,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F937,1F3FC,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F937,1F3FD,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F937,1F3FD,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F937,1F3FE,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F937,1F3FE,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F937,1F3FF,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F937,1F3FF,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F937,200D,2640,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F937,200D,2640;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F937,1F3FB,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F937,1F3FB,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F937,1F3FC,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F937,1F3FC,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F937,1F3FD,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F937,1F3FD,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F937,1F3FE,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F937,1F3FE,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F937,1F3FF,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F937,1F3FF,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,200D,2695,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,200D,2695;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,2695,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,2695;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,2695,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,2695;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,2695,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,2695;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,2695,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,2695;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,2695,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,2695;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,2695,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,2695;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,2695,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,2695;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,2695,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,2695;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,2695,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,2695;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,2695,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,2695;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,2695,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,2695;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,2695,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,2695;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,2695,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,2695;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,2695,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,2695;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,2695,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,2695;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,2695,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,2695;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,2695,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,2695;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,200D,1F393;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,1F393;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,1F393;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,1F393;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,1F393;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,1F393;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,1F393;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,1F393;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,1F393;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,1F393;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,1F393;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,1F393;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,1F393;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,1F393;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,1F393;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,1F393;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,1F393;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,1F393;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,200D,1F3EB;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,1F3EB;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,1F3EB;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,1F3EB;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,1F3EB;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,1F3EB;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,1F3EB;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,1F3EB;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,1F3EB;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,1F3EB;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,1F3EB;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,1F3EB;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,1F3EB;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,1F3EB;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,1F3EB;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,1F3EB;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,1F3EB;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,1F3EB;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,200D,2696,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,200D,2696;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,2696,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,2696;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,2696,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,2696;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,2696,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,2696;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,2696,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,2696;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,2696,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,2696;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,2696,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,2696;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,2696,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,2696;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,2696,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,2696;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,2696,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,2696;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,2696,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,2696;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,2696,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,2696;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,2696,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,2696;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,2696,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,2696;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,2696,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,2696;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,2696,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,2696;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,2696,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,2696;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,2696,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,2696;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,200D,1F33E;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,1F33E;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,1F33E;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,1F33E;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,1F33E;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,1F33E;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,1F33E;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,1F33E;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,1F33E;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,1F33E;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,1F33E;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,1F33E;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,1F33E;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,1F33E;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,1F33E;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,1F33E;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,1F33E;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,1F33E;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,200D,1F373;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,1F373;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,1F373;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,1F373;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,1F373;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,1F373;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,1F373;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,1F373;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,1F373;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,1F373;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,1F373;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,1F373;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,1F373;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,1F373;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,1F373;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,1F373;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,1F373;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,1F373;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,200D,1F527;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,1F527;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,1F527;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,1F527;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,1F527;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,1F527;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,1F527;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,1F527;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,1F527;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,1F527;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,1F527;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,1F527;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,1F527;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,1F527;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,1F527;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,1F527;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,1F527;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,1F527;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,200D,1F3ED;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,1F3ED;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,1F3ED;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,1F3ED;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,1F3ED;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,1F3ED;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,1F3ED;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,1F3ED;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,1F3ED;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,1F3ED;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,1F3ED;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,1F3ED;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,1F3ED;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,1F3ED;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,1F3ED;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,1F3ED;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,1F3ED;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,1F3ED;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,200D,1F4BC;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,1F4BC;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,1F4BC;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,1F4BC;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,1F4BC;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,1F4BC;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,1F4BC;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,1F4BC;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,1F4BC;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,1F4BC;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,1F4BC;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,1F4BC;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,1F4BC;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,1F4BC;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,1F4BC;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,1F4BC;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,1F4BC;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,1F4BC;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,200D,1F52C;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,1F52C;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,1F52C;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,1F52C;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,1F52C;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,1F52C;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,1F52C;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,1F52C;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,1F52C;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,1F52C;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,1F52C;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,1F52C;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,1F52C;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,1F52C;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,1F52C;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,1F52C;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,1F52C;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,1F52C;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,200D,1F4BB;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,1F4BB;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,1F4BB;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,1F4BB;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,1F4BB;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,1F4BB;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,1F4BB;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,1F4BB;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,1F4BB;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,1F4BB;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,1F4BB;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,1F4BB;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,1F4BB;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,1F4BB;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,1F4BB;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,1F4BB;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,1F4BB;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,1F4BB;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,200D,1F3A4;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,1F3A4;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,1F3A4;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,1F3A4;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,1F3A4;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,1F3A4;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,1F3A4;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,1F3A4;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,1F3A4;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,1F3A4;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,1F3A4;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,1F3A4;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,1F3A4;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,1F3A4;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,1F3A4;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,1F3A4;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,1F3A4;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,1F3A4;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,200D,1F3A8;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,1F3A8;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,1F3A8;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,1F3A8;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,1F3A8;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,1F3A8;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,1F3A8;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,1F3A8;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,1F3A8;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,1F3A8;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,1F3A8;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,1F3A8;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,1F3A8;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,1F3A8;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,1F3A8;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,1F3A8;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,1F3A8;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,1F3A8;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,200D,2708,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,200D,2708;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,2708,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,2708;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,2708,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,2708;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,2708,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,2708;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,2708,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,2708;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,2708,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,2708;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,2708,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,2708;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,2708,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,2708;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,2708,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,2708;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,2708,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,2708;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,2708,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,2708;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,2708,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,2708;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,2708,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,2708;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,2708,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,2708;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,2708,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,2708;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,2708,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,2708;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,2708,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,2708;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,2708,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,2708;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,200D,1F680;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,1F680;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,1F680;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,1F680;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,1F680;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,1F680;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,1F680;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,1F680;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,1F680;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,1F680;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,1F680;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,1F680;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,1F680;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,1F680;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,1F680;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,1F680;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,1F680;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,1F680;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,200D,1F692;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,1F692;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,1F692;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,1F692;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,1F692;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,1F692;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,1F692;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,1F692;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,1F692;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,1F692;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,1F692;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,1F692;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,1F692;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,1F692;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,1F692;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,1F692;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,1F692;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,1F692;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F46E,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F46E,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F46E,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F46E,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F46E,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F46E,200D,2642,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F46E,200D,2642;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F46E,1F3FB,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F46E,1F3FB,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F46E,1F3FC,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F46E,1F3FC,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F46E,1F3FD,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F46E,1F3FD,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F46E,1F3FE,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F46E,1F3FE,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F46E,1F3FF,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F46E,1F3FF,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F46E,200D,2640,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F46E,200D,2640;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F46E,1F3FB,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F46E,1F3FB,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F46E,1F3FC,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F46E,1F3FC,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F46E,1F3FD,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F46E,1F3FD,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F46E,1F3FE,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F46E,1F3FE,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F46E,1F3FF,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F46E,1F3FF,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F575,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F575,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F575,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F575,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F575,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F575,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F575,FE0F,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F575,200D,2642,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F575,FE0F,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F575,200D,2642;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F575,1F3FB,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F575,1F3FB,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F575,1F3FC,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F575,1F3FC,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F575,1F3FD,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F575,1F3FD,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F575,1F3FE,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F575,1F3FE,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F575,1F3FF,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F575,1F3FF,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F575,FE0F,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F575,200D,2640,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F575,FE0F,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F575,200D,2640;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F575,1F3FB,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F575,1F3FB,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F575,1F3FC,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F575,1F3FC,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F575,1F3FD,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F575,1F3FD,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F575,1F3FE,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F575,1F3FE,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F575,1F3FF,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F575,1F3FF,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F482,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F482,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F482,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F482,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F482,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F482,200D,2642,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F482,200D,2642;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F482,1F3FB,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F482,1F3FB,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F482,1F3FC,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F482,1F3FC,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F482,1F3FD,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F482,1F3FD,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F482,1F3FE,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F482,1F3FE,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F482,1F3FF,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F482,1F3FF,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F482,200D,2640,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F482,200D,2640;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F482,1F3FB,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F482,1F3FB,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F482,1F3FC,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F482,1F3FC,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F482,1F3FD,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F482,1F3FD,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F482,1F3FE,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F482,1F3FE,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F482,1F3FF,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F482,1F3FF,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F977,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F977,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F977,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F977,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F977,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F477,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F477,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F477,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F477,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F477,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F477,200D,2642,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F477,200D,2642;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F477,1F3FB,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F477,1F3FB,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F477,1F3FC,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F477,1F3FC,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F477,1F3FD,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F477,1F3FD,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F477,1F3FE,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F477,1F3FE,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F477,1F3FF,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F477,1F3FF,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F477,200D,2640,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F477,200D,2640;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F477,1F3FB,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F477,1F3FB,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F477,1F3FC,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F477,1F3FC,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F477,1F3FD,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F477,1F3FD,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F477,1F3FE,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F477,1F3FE,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F477,1F3FF,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F477,1F3FF,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F934,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F934,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F934,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F934,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F934,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F478,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F478,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F478,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F478,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F478,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F473,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F473,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F473,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F473,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F473,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F473,200D,2642,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F473,200D,2642;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F473,1F3FB,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F473,1F3FB,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F473,1F3FC,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F473,1F3FC,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F473,1F3FD,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F473,1F3FD,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F473,1F3FE,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F473,1F3FE,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F473,1F3FF,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F473,1F3FF,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F473,200D,2640,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F473,200D,2640;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F473,1F3FB,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F473,1F3FB,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F473,1F3FC,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F473,1F3FC,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F473,1F3FD,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F473,1F3FD,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F473,1F3FE,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F473,1F3FE,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F473,1F3FF,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F473,1F3FF,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F472,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F472,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F472,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F472,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F472,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D5,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D5,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D5,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D5,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D5,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F935,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F935,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F935,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F935,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F935,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F935,200D,2642,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F935,200D,2642;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F935,1F3FB,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F935,1F3FB,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F935,1F3FC,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F935,1F3FC,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F935,1F3FD,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F935,1F3FD,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F935,1F3FE,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F935,1F3FE,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F935,1F3FF,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F935,1F3FF,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F935,200D,2640,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F935,200D,2640;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F935,1F3FB,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F935,1F3FB,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F935,1F3FC,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F935,1F3FC,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F935,1F3FD,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F935,1F3FD,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F935,1F3FE,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F935,1F3FE,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F935,1F3FF,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F935,1F3FF,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F470,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F470,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F470,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F470,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F470,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F470,200D,2642,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F470,200D,2642;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F470,1F3FB,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F470,1F3FB,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F470,1F3FC,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F470,1F3FC,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F470,1F3FD,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F470,1F3FD,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F470,1F3FE,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F470,1F3FE,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F470,1F3FF,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F470,1F3FF,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F470,200D,2640,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F470,200D,2640;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F470,1F3FB,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F470,1F3FB,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F470,1F3FC,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F470,1F3FC,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F470,1F3FD,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F470,1F3FD,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F470,1F3FE,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F470,1F3FE,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F470,1F3FF,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F470,1F3FF,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F930,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F930,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F930,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F930,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F930,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F931,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F931,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F931,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F931,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F931,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,1F37C;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,1F37C;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,1F37C;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,1F37C;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,1F37C;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,1F37C;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,1F37C;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,1F37C;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,1F37C;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,1F37C;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,1F37C;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,1F37C;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,200D,1F37C;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,1F37C;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,1F37C;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,1F37C;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,1F37C;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,1F37C;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F47C,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F47C,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F47C,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F47C,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F47C,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F385,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F385,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F385,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F385,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F385,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F936,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F936,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F936,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F936,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F936,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,200D,1F384;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,1F384;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,1F384;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,1F384;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,1F384;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,1F384;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B8,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B8,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B8,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B8,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B8,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B8,200D,2642,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B8,200D,2642;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B8,1F3FB,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B8,1F3FB,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B8,1F3FC,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B8,1F3FC,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B8,1F3FD,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B8,1F3FD,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B8,1F3FE,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B8,1F3FE,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B8,1F3FF,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B8,1F3FF,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B8,200D,2640,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B8,200D,2640;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B8,1F3FB,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B8,1F3FB,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B8,1F3FC,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B8,1F3FC,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B8,1F3FD,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B8,1F3FD,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B8,1F3FE,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B8,1F3FE,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B8,1F3FF,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B8,1F3FF,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B9,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B9,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B9,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B9,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B9,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B9,200D,2642,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B9,200D,2642;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B9,1F3FB,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B9,1F3FB,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B9,1F3FC,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B9,1F3FC,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B9,1F3FD,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B9,1F3FD,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B9,1F3FE,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B9,1F3FE,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B9,1F3FF,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B9,1F3FF,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B9,200D,2640,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B9,200D,2640;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B9,1F3FB,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B9,1F3FB,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B9,1F3FC,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B9,1F3FC,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B9,1F3FD,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B9,1F3FD,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B9,1F3FE,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B9,1F3FE,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B9,1F3FF,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9B9,1F3FF,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D9,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D9,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D9,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D9,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D9,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D9,200D,2642,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D9,200D,2642;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D9,1F3FB,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D9,1F3FB,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D9,1F3FC,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D9,1F3FC,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D9,1F3FD,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D9,1F3FD,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D9,1F3FE,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D9,1F3FE,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D9,1F3FF,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D9,1F3FF,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D9,200D,2640,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D9,200D,2640;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D9,1F3FB,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D9,1F3FB,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D9,1F3FC,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D9,1F3FC,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D9,1F3FD,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D9,1F3FD,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D9,1F3FE,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D9,1F3FE,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D9,1F3FF,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D9,1F3FF,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DA,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DA,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DA,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DA,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DA,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DA,200D,2642,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DA,200D,2642;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DA,1F3FB,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DA,1F3FB,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DA,1F3FC,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DA,1F3FC,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DA,1F3FD,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DA,1F3FD,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DA,1F3FE,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DA,1F3FE,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DA,1F3FF,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DA,1F3FF,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DA,200D,2640,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DA,200D,2640;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DA,1F3FB,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DA,1F3FB,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DA,1F3FC,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DA,1F3FC,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DA,1F3FD,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DA,1F3FD,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DA,1F3FE,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DA,1F3FE,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DA,1F3FF,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DA,1F3FF,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DB,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DB,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DB,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DB,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DB,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DB,200D,2642,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DB,200D,2642;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DB,1F3FB,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DB,1F3FB,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DB,1F3FC,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DB,1F3FC,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DB,1F3FD,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DB,1F3FD,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DB,1F3FE,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DB,1F3FE,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DB,1F3FF,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DB,1F3FF,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DB,200D,2640,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DB,200D,2640;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DB,1F3FB,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DB,1F3FB,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DB,1F3FC,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DB,1F3FC,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DB,1F3FD,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DB,1F3FD,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DB,1F3FE,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DB,1F3FE,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DB,1F3FF,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DB,1F3FF,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DC,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DC,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DC,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DC,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DC,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DC,200D,2642,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DC,200D,2642;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DC,1F3FB,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DC,1F3FB,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DC,1F3FC,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DC,1F3FC,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DC,1F3FD,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DC,1F3FD,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DC,1F3FE,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DC,1F3FE,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DC,1F3FF,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DC,1F3FF,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DC,200D,2640,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DC,200D,2640;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DC,1F3FB,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DC,1F3FB,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DC,1F3FC,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DC,1F3FC,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DC,1F3FD,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DC,1F3FD,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DC,1F3FE,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DC,1F3FE,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DC,1F3FF,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DC,1F3FF,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DD,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DD,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DD,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DD,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DD,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DD,200D,2642,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DD,200D,2642;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DD,1F3FB,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DD,1F3FB,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DD,1F3FC,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DD,1F3FC,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DD,1F3FD,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DD,1F3FD,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DD,1F3FE,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DD,1F3FE,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DD,1F3FF,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DD,1F3FF,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DD,200D,2640,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DD,200D,2640;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DD,1F3FB,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DD,1F3FB,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DD,1F3FC,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DD,1F3FC,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DD,1F3FD,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DD,1F3FD,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DD,1F3FE,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DD,1F3FE,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DD,1F3FF,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DD,1F3FF,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DE,200D,2642,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DE,200D,2642;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DE,200D,2640,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DE,200D,2640;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DF,200D,2642,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DF,200D,2642;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DF,200D,2640,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9DF,200D,2640;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F486,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F486,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F486,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F486,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F486,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F486,200D,2642,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F486,200D,2642;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F486,1F3FB,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F486,1F3FB,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F486,1F3FC,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F486,1F3FC,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F486,1F3FD,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F486,1F3FD,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F486,1F3FE,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F486,1F3FE,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F486,1F3FF,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F486,1F3FF,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F486,200D,2640,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F486,200D,2640;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F486,1F3FB,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F486,1F3FB,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F486,1F3FC,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F486,1F3FC,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F486,1F3FD,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F486,1F3FD,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F486,1F3FE,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F486,1F3FE,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F486,1F3FF,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F486,1F3FF,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F487,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F487,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F487,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F487,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F487,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F487,200D,2642,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F487,200D,2642;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F487,1F3FB,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F487,1F3FB,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F487,1F3FC,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F487,1F3FC,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F487,1F3FD,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F487,1F3FD,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F487,1F3FE,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F487,1F3FE,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F487,1F3FF,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F487,1F3FF,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F487,200D,2640,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F487,200D,2640;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F487,1F3FB,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F487,1F3FB,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F487,1F3FC,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F487,1F3FC,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F487,1F3FD,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F487,1F3FD,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F487,1F3FE,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F487,1F3FE,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F487,1F3FF,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F487,1F3FF,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,200D,2642,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,200D,2642;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FB,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FB,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FC,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FC,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FD,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FD,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FE,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FE,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FF,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FF,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,200D,2640,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,200D,2640;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FB,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FB,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FC,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FC,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FD,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FD,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FE,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FE,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FF,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FF,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CD,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CD,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CD,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CD,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CD,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CD,200D,2642,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CD,200D,2642;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CD,1F3FB,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CD,1F3FB,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CD,1F3FC,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CD,1F3FC,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CD,1F3FD,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CD,1F3FD,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CD,1F3FE,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CD,1F3FE,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CD,1F3FF,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CD,1F3FF,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CD,200D,2640,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CD,200D,2640;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CD,1F3FB,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CD,1F3FB,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CD,1F3FC,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CD,1F3FC,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CD,1F3FD,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CD,1F3FD,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CD,1F3FE,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CD,1F3FE,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CD,1F3FF,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CD,1F3FF,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,200D,2642,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,200D,2642;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FB,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FB,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FC,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FC,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FD,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FD,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FE,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FE,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FF,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FF,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,200D,2640,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,200D,2640;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FB,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FB,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FC,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FC,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FD,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FD,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FE,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FE,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FF,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FF,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,200D,1F9AF;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,1F9AF;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,1F9AF;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,1F9AF;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,1F9AF;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,1F9AF;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,1F9AF;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,1F9AF;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,1F9AF;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,1F9AF;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,1F9AF;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,1F9AF;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,1F9AF;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,1F9AF;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,1F9AF;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,1F9AF;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,1F9AF;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,1F9AF;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,200D,1F9BC;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,1F9BC;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,1F9BC;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,1F9BC;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,1F9BC;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,1F9BC;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,1F9BC;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,1F9BC;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,1F9BC;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,1F9BC;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,1F9BC;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,1F9BC;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,1F9BC;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,1F9BC;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,1F9BC;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,1F9BC;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,1F9BC;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,1F9BC;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,200D,1F9BD;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,1F9BD;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,1F9BD;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,1F9BD;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,1F9BD;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,1F9BD;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,1F9BD;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,1F9BD;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,1F9BD;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,1F9BD;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,1F9BD;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,1F9BD;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,1F9BD;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,1F9BD;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,1F9BD;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,1F9BD;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,1F9BD;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,1F9BD;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,200D,2642,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,200D,2642;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FB,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FB,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FC,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FC,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FD,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FD,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FE,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FE,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FF,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FF,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,200D,2640,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,200D,2640;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FB,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FB,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FC,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FC,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FD,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FD,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FE,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FE,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FF,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FF,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F483,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F483,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F483,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F483,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F483,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F57A,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F57A,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F57A,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F57A,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F57A,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F574,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F574,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F574,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F574,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F574,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F574,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F46F,200D,2642,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F46F,200D,2642;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F46F,200D,2640,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F46F,200D,2640;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D6,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D6,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D6,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D6,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D6,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D6,200D,2642,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D6,200D,2642;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D6,1F3FB,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D6,1F3FB,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D6,1F3FC,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D6,1F3FC,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D6,1F3FD,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D6,1F3FD,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D6,1F3FE,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D6,1F3FE,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D6,1F3FF,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D6,1F3FF,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D6,200D,2640,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D6,200D,2640;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D6,1F3FB,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D6,1F3FB,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D6,1F3FC,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D6,1F3FC,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D6,1F3FD,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D6,1F3FD,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D6,1F3FE,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D6,1F3FE,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D6,1F3FF,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D6,1F3FF,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D7,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D7,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D7,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D7,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D7,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D7,200D,2642,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D7,200D,2642;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D7,1F3FB,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D7,1F3FB,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D7,1F3FC,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D7,1F3FC,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D7,1F3FD,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D7,1F3FD,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D7,1F3FE,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D7,1F3FE,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D7,1F3FF,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D7,1F3FF,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D7,200D,2640,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D7,200D,2640;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D7,1F3FB,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D7,1F3FB,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D7,1F3FC,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D7,1F3FC,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D7,1F3FD,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D7,1F3FD,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D7,1F3FE,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D7,1F3FE,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D7,1F3FF,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D7,1F3FF,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C7,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C7,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C7,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C7,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C7,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;26F7,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C2,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C2,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C2,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C2,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C2,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CC,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CC,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CC,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CC,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CC,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CC,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CC,FE0F,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CC,200D,2642,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CC,FE0F,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CC,200D,2642;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CC,1F3FB,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CC,1F3FB,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CC,1F3FC,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CC,1F3FC,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CC,1F3FD,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CC,1F3FD,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CC,1F3FE,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CC,1F3FE,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CC,1F3FF,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CC,1F3FF,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CC,FE0F,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CC,200D,2640,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CC,FE0F,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CC,200D,2640;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CC,1F3FB,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CC,1F3FB,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CC,1F3FC,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CC,1F3FC,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CC,1F3FD,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CC,1F3FD,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CC,1F3FE,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CC,1F3FE,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CC,1F3FF,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CC,1F3FF,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C4,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C4,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C4,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C4,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C4,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C4,200D,2642,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C4,200D,2642;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C4,1F3FB,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C4,1F3FB,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C4,1F3FC,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C4,1F3FC,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C4,1F3FD,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C4,1F3FD,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C4,1F3FE,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C4,1F3FE,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C4,1F3FF,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C4,1F3FF,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C4,200D,2640,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C4,200D,2640;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C4,1F3FB,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C4,1F3FB,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C4,1F3FC,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C4,1F3FC,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C4,1F3FD,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C4,1F3FD,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C4,1F3FE,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C4,1F3FE,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C4,1F3FF,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C4,1F3FF,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6A3,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6A3,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6A3,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6A3,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6A3,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6A3,200D,2642,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6A3,200D,2642;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6A3,1F3FB,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6A3,1F3FB,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6A3,1F3FC,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6A3,1F3FC,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6A3,1F3FD,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6A3,1F3FD,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6A3,1F3FE,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6A3,1F3FE,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6A3,1F3FF,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6A3,1F3FF,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6A3,200D,2640,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6A3,200D,2640;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6A3,1F3FB,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6A3,1F3FB,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6A3,1F3FC,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6A3,1F3FC,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6A3,1F3FD,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6A3,1F3FD,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6A3,1F3FE,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6A3,1F3FE,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6A3,1F3FF,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6A3,1F3FF,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CA,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CA,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CA,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CA,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CA,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CA,200D,2642,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CA,200D,2642;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CA,1F3FB,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CA,1F3FB,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CA,1F3FC,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CA,1F3FC,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CA,1F3FD,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CA,1F3FD,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CA,1F3FE,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CA,1F3FE,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CA,1F3FF,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CA,1F3FF,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CA,200D,2640,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CA,200D,2640;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CA,1F3FB,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CA,1F3FB,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CA,1F3FC,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CA,1F3FC,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CA,1F3FD,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CA,1F3FD,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CA,1F3FE,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CA,1F3FE,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CA,1F3FF,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CA,1F3FF,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;26F9,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;26F9,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;26F9,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;26F9,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;26F9,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;26F9,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;26F9,FE0F,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;26F9,200D,2642,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;26F9,FE0F,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;26F9,200D,2642;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;26F9,1F3FB,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;26F9,1F3FB,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;26F9,1F3FC,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;26F9,1F3FC,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;26F9,1F3FD,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;26F9,1F3FD,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;26F9,1F3FE,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;26F9,1F3FE,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;26F9,1F3FF,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;26F9,1F3FF,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;26F9,FE0F,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;26F9,200D,2640,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;26F9,FE0F,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;26F9,200D,2640;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;26F9,1F3FB,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;26F9,1F3FB,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;26F9,1F3FC,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;26F9,1F3FC,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;26F9,1F3FD,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;26F9,1F3FD,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;26F9,1F3FE,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;26F9,1F3FE,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;26F9,1F3FF,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;26F9,1F3FF,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CB,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CB,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CB,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CB,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CB,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CB,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CB,FE0F,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CB,200D,2642,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CB,FE0F,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CB,200D,2642;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CB,1F3FB,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CB,1F3FB,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CB,1F3FC,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CB,1F3FC,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CB,1F3FD,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CB,1F3FD,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CB,1F3FE,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CB,1F3FE,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CB,1F3FF,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CB,1F3FF,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CB,FE0F,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CB,200D,2640,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CB,FE0F,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CB,200D,2640;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CB,1F3FB,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CB,1F3FB,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CB,1F3FC,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CB,1F3FC,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CB,1F3FD,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CB,1F3FD,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CB,1F3FE,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CB,1F3FE,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CB,1F3FF,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CB,1F3FF,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B4,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B4,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B4,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B4,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B4,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B4,200D,2642,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B4,200D,2642;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B4,1F3FB,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B4,1F3FB,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B4,1F3FC,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B4,1F3FC,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B4,1F3FD,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B4,1F3FD,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B4,1F3FE,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B4,1F3FE,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B4,1F3FF,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B4,1F3FF,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B4,200D,2640,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B4,200D,2640;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B4,1F3FB,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B4,1F3FB,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B4,1F3FC,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B4,1F3FC,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B4,1F3FD,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B4,1F3FD,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B4,1F3FE,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B4,1F3FE,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B4,1F3FF,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B4,1F3FF,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B5,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B5,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B5,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B5,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B5,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B5,200D,2642,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B5,200D,2642;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B5,1F3FB,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B5,1F3FB,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B5,1F3FC,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B5,1F3FC,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B5,1F3FD,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B5,1F3FD,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B5,1F3FE,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B5,1F3FE,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B5,1F3FF,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B5,1F3FF,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B5,200D,2640,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B5,200D,2640;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B5,1F3FB,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B5,1F3FB,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B5,1F3FC,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B5,1F3FC,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B5,1F3FD,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B5,1F3FD,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B5,1F3FE,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B5,1F3FE,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B5,1F3FF,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B5,1F3FF,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F938,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F938,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F938,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F938,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F938,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F938,200D,2642,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F938,200D,2642;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F938,1F3FB,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F938,1F3FB,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F938,1F3FC,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F938,1F3FC,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F938,1F3FD,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F938,1F3FD,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F938,1F3FE,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F938,1F3FE,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F938,1F3FF,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F938,1F3FF,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F938,200D,2640,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F938,200D,2640;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F938,1F3FB,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F938,1F3FB,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F938,1F3FC,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F938,1F3FC,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F938,1F3FD,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F938,1F3FD,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F938,1F3FE,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F938,1F3FE,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F938,1F3FF,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F938,1F3FF,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93C,200D,2642,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93C,200D,2642;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93C,200D,2640,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93C,200D,2640;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93D,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93D,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93D,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93D,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93D,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93D,200D,2642,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93D,200D,2642;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93D,1F3FB,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93D,1F3FB,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93D,1F3FC,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93D,1F3FC,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93D,1F3FD,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93D,1F3FD,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93D,1F3FE,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93D,1F3FE,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93D,1F3FF,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93D,1F3FF,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93D,200D,2640,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93D,200D,2640;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93D,1F3FB,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93D,1F3FB,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93D,1F3FC,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93D,1F3FC,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93D,1F3FD,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93D,1F3FD,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93D,1F3FE,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93D,1F3FE,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93D,1F3FF,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93D,1F3FF,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93E,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93E,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93E,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93E,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93E,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93E,200D,2642,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93E,200D,2642;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93E,1F3FB,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93E,1F3FB,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93E,1F3FC,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93E,1F3FC,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93E,1F3FD,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93E,1F3FD,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93E,1F3FE,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93E,1F3FE,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93E,1F3FF,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93E,1F3FF,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93E,200D,2640,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93E,200D,2640;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93E,1F3FB,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93E,1F3FB,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93E,1F3FC,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93E,1F3FC,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93E,1F3FD,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93E,1F3FD,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93E,1F3FE,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93E,1F3FE,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93E,1F3FF,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F93E,1F3FF,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F939,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F939,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F939,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F939,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F939,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F939,200D,2642,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F939,200D,2642;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F939,1F3FB,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F939,1F3FB,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F939,1F3FC,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F939,1F3FC,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F939,1F3FD,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F939,1F3FD,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F939,1F3FE,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F939,1F3FE,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F939,1F3FF,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F939,1F3FF,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F939,200D,2640,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F939,200D,2640;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F939,1F3FB,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F939,1F3FB,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F939,1F3FC,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F939,1F3FC,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F939,1F3FD,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F939,1F3FD,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F939,1F3FE,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F939,1F3FE,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F939,1F3FF,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F939,1F3FF,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D8,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D8,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D8,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D8,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D8,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D8,200D,2642,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D8,200D,2642;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D8,1F3FB,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D8,1F3FB,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D8,1F3FC,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D8,1F3FC,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D8,1F3FD,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D8,1F3FD,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D8,1F3FE,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D8,1F3FE,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D8,1F3FF,200D,2642,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D8,1F3FF,200D,2642;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D8,200D,2640,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D8,200D,2640;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D8,1F3FB,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D8,1F3FB,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D8,1F3FC,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D8,1F3FC,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D8,1F3FD,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D8,1F3FD,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D8,1F3FE,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D8,1F3FE,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D8,1F3FF,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D8,1F3FF,200D,2640;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6C0,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6C0,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6C0,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6C0,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6C0,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6CC,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6CC,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6CC,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6CC,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6CC,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,200D,1F91D,200D,1F9D1;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,1F91D,200D,1F9D1,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,1F91D,200D,1F9D1,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,1F91D,200D,1F9D1,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,1F91D,200D,1F9D1,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,1F91D,200D,1F9D1,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,1F91D,200D,1F9D1,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,1F91D,200D,1F9D1,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,1F91D,200D,1F9D1,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,1F91D,200D,1F9D1,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,1F91D,200D,1F9D1,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,1F91D,200D,1F9D1,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,1F91D,200D,1F9D1,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,1F91D,200D,1F9D1,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,1F91D,200D,1F9D1,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,1F91D,200D,1F9D1,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,1F91D,200D,1F9D1,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,1F91D,200D,1F9D1,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,1F91D,200D,1F9D1,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,1F91D,200D,1F9D1,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,1F91D,200D,1F9D1,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,1F91D,200D,1F9D1,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,1F91D,200D,1F9D1,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,1F91D,200D,1F9D1,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,1F91D,200D,1F9D1,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,1F91D,200D,1F9D1,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F46D,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,1F91D,200D,1F469,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,1F91D,200D,1F469,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,1F91D,200D,1F469,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,1F91D,200D,1F469,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,1F91D,200D,1F469,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F46D,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,1F91D,200D,1F469,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,1F91D,200D,1F469,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,1F91D,200D,1F469,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,1F91D,200D,1F469,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,1F91D,200D,1F469,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F46D,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,1F91D,200D,1F469,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,1F91D,200D,1F469,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,1F91D,200D,1F469,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,1F91D,200D,1F469,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,1F91D,200D,1F469,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F46D,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,1F91D,200D,1F469,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,1F91D,200D,1F469,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,1F91D,200D,1F469,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,1F91D,200D,1F469,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,1F91D,200D,1F469,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F46D,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F46B,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,1F91D,200D,1F468,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,1F91D,200D,1F468,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,1F91D,200D,1F468,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,1F91D,200D,1F468,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,1F91D,200D,1F468,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F46B,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,1F91D,200D,1F468,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,1F91D,200D,1F468,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,1F91D,200D,1F468,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,1F91D,200D,1F468,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,1F91D,200D,1F468,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F46B,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,1F91D,200D,1F468,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,1F91D,200D,1F468,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,1F91D,200D,1F468,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,1F91D,200D,1F468,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,1F91D,200D,1F468,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F46B,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,1F91D,200D,1F468,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,1F91D,200D,1F468,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,1F91D,200D,1F468,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,1F91D,200D,1F468,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,1F91D,200D,1F468,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F46B,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F46C,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,1F91D,200D,1F468,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,1F91D,200D,1F468,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,1F91D,200D,1F468,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,1F91D,200D,1F468,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,1F91D,200D,1F468,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F46C,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,1F91D,200D,1F468,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,1F91D,200D,1F468,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,1F91D,200D,1F468,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,1F91D,200D,1F468,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,1F91D,200D,1F468,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F46C,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,1F91D,200D,1F468,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,1F91D,200D,1F468,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,1F91D,200D,1F468,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,1F91D,200D,1F468,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,1F91D,200D,1F468,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F46C,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,1F91D,200D,1F468,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,1F91D,200D,1F468,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,1F91D,200D,1F468,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,1F91D,200D,1F468,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,1F91D,200D,1F468,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F46C,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F48F,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F48F,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F48F,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F48F,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F48F,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,2764,FE0F,200D,1F48B,200D,1F9D1,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,2764,200D,1F48B,200D,1F9D1,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,2764,FE0F,200D,1F48B,200D,1F9D1,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,2764,200D,1F48B,200D,1F9D1,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,2764,FE0F,200D,1F48B,200D,1F9D1,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,2764,200D,1F48B,200D,1F9D1,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,2764,FE0F,200D,1F48B,200D,1F9D1,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,2764,200D,1F48B,200D,1F9D1,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,2764,FE0F,200D,1F48B,200D,1F9D1,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,2764,200D,1F48B,200D,1F9D1,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,2764,FE0F,200D,1F48B,200D,1F9D1,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,2764,200D,1F48B,200D,1F9D1,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,2764,FE0F,200D,1F48B,200D,1F9D1,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,2764,200D,1F48B,200D,1F9D1,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,2764,FE0F,200D,1F48B,200D,1F9D1,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,2764,200D,1F48B,200D,1F9D1,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,2764,FE0F,200D,1F48B,200D,1F9D1,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,2764,200D,1F48B,200D,1F9D1,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,2764,FE0F,200D,1F48B,200D,1F9D1,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,2764,200D,1F48B,200D,1F9D1,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,2764,FE0F,200D,1F48B,200D,1F9D1,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,2764,200D,1F48B,200D,1F9D1,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,2764,FE0F,200D,1F48B,200D,1F9D1,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,2764,200D,1F48B,200D,1F9D1,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,2764,FE0F,200D,1F48B,200D,1F9D1,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,2764,200D,1F48B,200D,1F9D1,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,2764,FE0F,200D,1F48B,200D,1F9D1,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,2764,200D,1F48B,200D,1F9D1,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,2764,FE0F,200D,1F48B,200D,1F9D1,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,2764,200D,1F48B,200D,1F9D1,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,2764,FE0F,200D,1F48B,200D,1F9D1,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,2764,200D,1F48B,200D,1F9D1,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,2764,FE0F,200D,1F48B,200D,1F9D1,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,2764,200D,1F48B,200D,1F9D1,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,2764,FE0F,200D,1F48B,200D,1F9D1,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,2764,200D,1F48B,200D,1F9D1,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,2764,FE0F,200D,1F48B,200D,1F9D1,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,2764,200D,1F48B,200D,1F9D1,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,2764,FE0F,200D,1F48B,200D,1F9D1,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,2764,200D,1F48B,200D,1F9D1,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,2764,FE0F,200D,1F48B,200D,1F468;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,2764,200D,1F48B,200D,1F468;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,2764,FE0F,200D,1F48B,200D,1F468,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,2764,200D,1F48B,200D,1F468,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,2764,FE0F,200D,1F48B,200D,1F468,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,2764,200D,1F48B,200D,1F468,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,2764,FE0F,200D,1F48B,200D,1F468,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,2764,200D,1F48B,200D,1F468,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,2764,FE0F,200D,1F48B,200D,1F468,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,2764,200D,1F48B,200D,1F468,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,2764,FE0F,200D,1F48B,200D,1F468,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,2764,200D,1F48B,200D,1F468,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,2764,FE0F,200D,1F48B,200D,1F468,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,2764,200D,1F48B,200D,1F468,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,2764,FE0F,200D,1F48B,200D,1F468,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,2764,200D,1F48B,200D,1F468,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,2764,FE0F,200D,1F48B,200D,1F468,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,2764,200D,1F48B,200D,1F468,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,2764,FE0F,200D,1F48B,200D,1F468,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,2764,200D,1F48B,200D,1F468,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,2764,FE0F,200D,1F48B,200D,1F468,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,2764,200D,1F48B,200D,1F468,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,2764,FE0F,200D,1F48B,200D,1F468,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,2764,200D,1F48B,200D,1F468,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,2764,FE0F,200D,1F48B,200D,1F468,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,2764,200D,1F48B,200D,1F468,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,2764,FE0F,200D,1F48B,200D,1F468,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,2764,200D,1F48B,200D,1F468,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,2764,FE0F,200D,1F48B,200D,1F468,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,2764,200D,1F48B,200D,1F468,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,2764,FE0F,200D,1F48B,200D,1F468,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,2764,200D,1F48B,200D,1F468,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,2764,FE0F,200D,1F48B,200D,1F468,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,2764,200D,1F48B,200D,1F468,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,2764,FE0F,200D,1F48B,200D,1F468,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,2764,200D,1F48B,200D,1F468,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,2764,FE0F,200D,1F48B,200D,1F468,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,2764,200D,1F48B,200D,1F468,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,2764,FE0F,200D,1F48B,200D,1F468,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,2764,200D,1F48B,200D,1F468,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,2764,FE0F,200D,1F48B,200D,1F468,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,2764,200D,1F48B,200D,1F468,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,2764,FE0F,200D,1F48B,200D,1F468,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,2764,200D,1F48B,200D,1F468,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,2764,FE0F,200D,1F48B,200D,1F468,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,2764,200D,1F48B,200D,1F468,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,2764,FE0F,200D,1F48B,200D,1F468,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,2764,200D,1F48B,200D,1F468,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,2764,FE0F,200D,1F48B,200D,1F468,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,2764,200D,1F48B,200D,1F468,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,2764,FE0F,200D,1F48B,200D,1F468,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,2764,200D,1F48B,200D,1F468,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,2764,FE0F,200D,1F48B,200D,1F468;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,2764,200D,1F48B,200D,1F468;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,2764,FE0F,200D,1F48B,200D,1F468,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,2764,200D,1F48B,200D,1F468,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,2764,FE0F,200D,1F48B,200D,1F468,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,2764,200D,1F48B,200D,1F468,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,2764,FE0F,200D,1F48B,200D,1F468,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,2764,200D,1F48B,200D,1F468,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,2764,FE0F,200D,1F48B,200D,1F468,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,2764,200D,1F48B,200D,1F468,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,2764,FE0F,200D,1F48B,200D,1F468,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,2764,200D,1F48B,200D,1F468,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,2764,FE0F,200D,1F48B,200D,1F468,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,2764,200D,1F48B,200D,1F468,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,2764,FE0F,200D,1F48B,200D,1F468,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,2764,200D,1F48B,200D,1F468,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,2764,FE0F,200D,1F48B,200D,1F468,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,2764,200D,1F48B,200D,1F468,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,2764,FE0F,200D,1F48B,200D,1F468,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,2764,200D,1F48B,200D,1F468,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,2764,FE0F,200D,1F48B,200D,1F468,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,2764,200D,1F48B,200D,1F468,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,2764,FE0F,200D,1F48B,200D,1F468,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,2764,200D,1F48B,200D,1F468,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,2764,FE0F,200D,1F48B,200D,1F468,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,2764,200D,1F48B,200D,1F468,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,2764,FE0F,200D,1F48B,200D,1F468,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,2764,200D,1F48B,200D,1F468,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,2764,FE0F,200D,1F48B,200D,1F468,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,2764,200D,1F48B,200D,1F468,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,2764,FE0F,200D,1F48B,200D,1F468,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,2764,200D,1F48B,200D,1F468,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,2764,FE0F,200D,1F48B,200D,1F468,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,2764,200D,1F48B,200D,1F468,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,2764,FE0F,200D,1F48B,200D,1F468,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,2764,200D,1F48B,200D,1F468,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,2764,FE0F,200D,1F48B,200D,1F468,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,2764,200D,1F48B,200D,1F468,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,2764,FE0F,200D,1F48B,200D,1F468,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,2764,200D,1F48B,200D,1F468,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,2764,FE0F,200D,1F48B,200D,1F468,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,2764,200D,1F48B,200D,1F468,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,2764,FE0F,200D,1F48B,200D,1F468,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,2764,200D,1F48B,200D,1F468,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,2764,FE0F,200D,1F48B,200D,1F468,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,2764,200D,1F48B,200D,1F468,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,2764,FE0F,200D,1F48B,200D,1F468,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,2764,200D,1F48B,200D,1F468,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,2764,FE0F,200D,1F48B,200D,1F468,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,2764,200D,1F48B,200D,1F468,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,2764,FE0F,200D,1F48B,200D,1F468,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,2764,200D,1F48B,200D,1F468,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,2764,FE0F,200D,1F48B,200D,1F469;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,2764,200D,1F48B,200D,1F469;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,2764,FE0F,200D,1F48B,200D,1F469,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,2764,200D,1F48B,200D,1F469,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,2764,FE0F,200D,1F48B,200D,1F469,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,2764,200D,1F48B,200D,1F469,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,2764,FE0F,200D,1F48B,200D,1F469,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,2764,200D,1F48B,200D,1F469,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,2764,FE0F,200D,1F48B,200D,1F469,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,2764,200D,1F48B,200D,1F469,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,2764,FE0F,200D,1F48B,200D,1F469,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,2764,200D,1F48B,200D,1F469,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,2764,FE0F,200D,1F48B,200D,1F469,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,2764,200D,1F48B,200D,1F469,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,2764,FE0F,200D,1F48B,200D,1F469,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,2764,200D,1F48B,200D,1F469,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,2764,FE0F,200D,1F48B,200D,1F469,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,2764,200D,1F48B,200D,1F469,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,2764,FE0F,200D,1F48B,200D,1F469,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,2764,200D,1F48B,200D,1F469,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,2764,FE0F,200D,1F48B,200D,1F469,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,2764,200D,1F48B,200D,1F469,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,2764,FE0F,200D,1F48B,200D,1F469,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,2764,200D,1F48B,200D,1F469,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,2764,FE0F,200D,1F48B,200D,1F469,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,2764,200D,1F48B,200D,1F469,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,2764,FE0F,200D,1F48B,200D,1F469,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,2764,200D,1F48B,200D,1F469,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,2764,FE0F,200D,1F48B,200D,1F469,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,2764,200D,1F48B,200D,1F469,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,2764,FE0F,200D,1F48B,200D,1F469,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,2764,200D,1F48B,200D,1F469,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,2764,FE0F,200D,1F48B,200D,1F469,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,2764,200D,1F48B,200D,1F469,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,2764,FE0F,200D,1F48B,200D,1F469,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,2764,200D,1F48B,200D,1F469,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,2764,FE0F,200D,1F48B,200D,1F469,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,2764,200D,1F48B,200D,1F469,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,2764,FE0F,200D,1F48B,200D,1F469,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,2764,200D,1F48B,200D,1F469,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,2764,FE0F,200D,1F48B,200D,1F469,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,2764,200D,1F48B,200D,1F469,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,2764,FE0F,200D,1F48B,200D,1F469,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,2764,200D,1F48B,200D,1F469,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,2764,FE0F,200D,1F48B,200D,1F469,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,2764,200D,1F48B,200D,1F469,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,2764,FE0F,200D,1F48B,200D,1F469,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,2764,200D,1F48B,200D,1F469,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,2764,FE0F,200D,1F48B,200D,1F469,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,2764,200D,1F48B,200D,1F469,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,2764,FE0F,200D,1F48B,200D,1F469,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,2764,200D,1F48B,200D,1F469,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F491,1F3FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F491,1F3FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F491,1F3FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F491,1F3FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F491,1F3FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,2764,FE0F,200D,1F9D1,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,2764,200D,1F9D1,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,2764,FE0F,200D,1F9D1,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,2764,200D,1F9D1,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,2764,FE0F,200D,1F9D1,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,2764,200D,1F9D1,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,2764,FE0F,200D,1F9D1,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,2764,200D,1F9D1,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,2764,FE0F,200D,1F9D1,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,2764,200D,1F9D1,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,2764,FE0F,200D,1F9D1,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,2764,200D,1F9D1,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,2764,FE0F,200D,1F9D1,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,2764,200D,1F9D1,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,2764,FE0F,200D,1F9D1,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,2764,200D,1F9D1,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,2764,FE0F,200D,1F9D1,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,2764,200D,1F9D1,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,2764,FE0F,200D,1F9D1,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,2764,200D,1F9D1,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,2764,FE0F,200D,1F9D1,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,2764,200D,1F9D1,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,2764,FE0F,200D,1F9D1,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,2764,200D,1F9D1,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,2764,FE0F,200D,1F9D1,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,2764,200D,1F9D1,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,2764,FE0F,200D,1F9D1,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,2764,200D,1F9D1,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,2764,FE0F,200D,1F9D1,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,2764,200D,1F9D1,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,2764,FE0F,200D,1F9D1,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,2764,200D,1F9D1,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,2764,FE0F,200D,1F9D1,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,2764,200D,1F9D1,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,2764,FE0F,200D,1F9D1,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,2764,200D,1F9D1,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,2764,FE0F,200D,1F9D1,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,2764,200D,1F9D1,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,2764,FE0F,200D,1F9D1,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,2764,200D,1F9D1,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,2764,FE0F,200D,1F468;[1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,2764,200D,1F468;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,2764,FE0F,200D,1F468,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,2764,200D,1F468,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,2764,FE0F,200D,1F468,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,2764,200D,1F468,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,2764,FE0F,200D,1F468,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,2764,200D,1F468,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,2764,FE0F,200D,1F468,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,2764,200D,1F468,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,2764,FE0F,200D,1F468,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,2764,200D,1F468,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,2764,FE0F,200D,1F468,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,2764,200D,1F468,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,2764,FE0F,200D,1F468,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,2764,200D,1F468,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,2764,FE0F,200D,1F468,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,2764,200D,1F468,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,2764,FE0F,200D,1F468,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,2764,200D,1F468,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,2764,FE0F,200D,1F468,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,2764,200D,1F468,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,2764,FE0F,200D,1F468,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,2764,200D,1F468,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,2764,FE0F,200D,1F468,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,2764,200D,1F468,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,2764,FE0F,200D,1F468,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,2764,200D,1F468,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,2764,FE0F,200D,1F468,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,2764,200D,1F468,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,2764,FE0F,200D,1F468,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,2764,200D,1F468,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,2764,FE0F,200D,1F468,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,2764,200D,1F468,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,2764,FE0F,200D,1F468,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,2764,200D,1F468,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,2764,FE0F,200D,1F468,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,2764,200D,1F468,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,2764,FE0F,200D,1F468,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,2764,200D,1F468,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,2764,FE0F,200D,1F468,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,2764,200D,1F468,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,2764,FE0F,200D,1F468,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,2764,200D,1F468,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,2764,FE0F,200D,1F468,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,2764,200D,1F468,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,2764,FE0F,200D,1F468,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,2764,200D,1F468,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,2764,FE0F,200D,1F468,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,2764,200D,1F468,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,2764,FE0F,200D,1F468,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,2764,200D,1F468,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,2764,FE0F,200D,1F468;[1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,2764,200D,1F468;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,2764,FE0F,200D,1F468,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,2764,200D,1F468,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,2764,FE0F,200D,1F468,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,2764,200D,1F468,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,2764,FE0F,200D,1F468,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,2764,200D,1F468,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,2764,FE0F,200D,1F468,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,2764,200D,1F468,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,2764,FE0F,200D,1F468,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,2764,200D,1F468,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,2764,FE0F,200D,1F468,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,2764,200D,1F468,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,2764,FE0F,200D,1F468,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,2764,200D,1F468,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,2764,FE0F,200D,1F468,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,2764,200D,1F468,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,2764,FE0F,200D,1F468,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,2764,200D,1F468,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,2764,FE0F,200D,1F468,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,2764,200D,1F468,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,2764,FE0F,200D,1F468,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,2764,200D,1F468,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,2764,FE0F,200D,1F468,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,2764,200D,1F468,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,2764,FE0F,200D,1F468,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,2764,200D,1F468,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,2764,FE0F,200D,1F468,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,2764,200D,1F468,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,2764,FE0F,200D,1F468,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,2764,200D,1F468,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,2764,FE0F,200D,1F468,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,2764,200D,1F468,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,2764,FE0F,200D,1F468,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,2764,200D,1F468,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,2764,FE0F,200D,1F468,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,2764,200D,1F468,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,2764,FE0F,200D,1F468,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,2764,200D,1F468,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,2764,FE0F,200D,1F468,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,2764,200D,1F468,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,2764,FE0F,200D,1F468,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,2764,200D,1F468,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,2764,FE0F,200D,1F468,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,2764,200D,1F468,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,2764,FE0F,200D,1F468,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,2764,200D,1F468,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,2764,FE0F,200D,1F468,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,2764,200D,1F468,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,2764,FE0F,200D,1F468,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,2764,200D,1F468,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,2764,FE0F,200D,1F469;[1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,2764,200D,1F469;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,2764,FE0F,200D,1F469,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,2764,200D,1F469,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,2764,FE0F,200D,1F469,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,2764,200D,1F469,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,2764,FE0F,200D,1F469,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,2764,200D,1F469,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,2764,FE0F,200D,1F469,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,2764,200D,1F469,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,2764,FE0F,200D,1F469,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,2764,200D,1F469,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,2764,FE0F,200D,1F469,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,2764,200D,1F469,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,2764,FE0F,200D,1F469,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,2764,200D,1F469,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,2764,FE0F,200D,1F469,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,2764,200D,1F469,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,2764,FE0F,200D,1F469,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,2764,200D,1F469,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,2764,FE0F,200D,1F469,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,2764,200D,1F469,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,2764,FE0F,200D,1F469,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,2764,200D,1F469,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,2764,FE0F,200D,1F469,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,2764,200D,1F469,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,2764,FE0F,200D,1F469,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,2764,200D,1F469,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,2764,FE0F,200D,1F469,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,2764,200D,1F469,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,2764,FE0F,200D,1F469,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,2764,200D,1F469,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,2764,FE0F,200D,1F469,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,2764,200D,1F469,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,2764,FE0F,200D,1F469,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,2764,200D,1F469,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,2764,FE0F,200D,1F469,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,2764,200D,1F469,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,2764,FE0F,200D,1F469,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,2764,200D,1F469,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,2764,FE0F,200D,1F469,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,2764,200D,1F469,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,2764,FE0F,200D,1F469,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,2764,200D,1F469,1F3FB;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,2764,FE0F,200D,1F469,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,2764,200D,1F469,1F3FC;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,2764,FE0F,200D,1F469,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,2764,200D,1F469,1F3FD;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,2764,FE0F,200D,1F469,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,2764,200D,1F469,1F3FE;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,2764,FE0F,200D,1F469,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,2764,200D,1F469,1F3FF;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,1F469,200D,1F466;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,1F469,200D,1F467;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,1F469,200D,1F467,200D,1F466;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,1F469,200D,1F466,200D,1F466;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,1F469,200D,1F467,200D,1F467;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,1F468,200D,1F466;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,1F468,200D,1F467;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,1F468,200D,1F467,200D,1F466;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,1F468,200D,1F466,200D,1F466;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,1F468,200D,1F467,200D,1F467;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,1F469,200D,1F466;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,1F469,200D,1F467;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,1F469,200D,1F467,200D,1F466;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,1F469,200D,1F466,200D,1F466;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,1F469,200D,1F467,200D,1F467;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,1F466;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,1F466,200D,1F466;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,1F467;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,1F467,200D,1F466;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,1F467,200D,1F467;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,1F466;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,1F466,200D,1F466;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,1F467;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,1F467,200D,1F466;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,1F467,200D,1F467;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F5E3,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F415,200D,1F9BA;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F408,200D,2B1B;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F43F,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F43B,200D,2744,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F43B,200D,2744;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F54A,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F577,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F578,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3F5,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2618,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F336,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F37D,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F5FA,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3D4,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;26F0,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3D5,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3D6,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3DC,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3DD,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3DE,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3DF,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3DB,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3D7,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3D8,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3DA,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;26E9,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3D9,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2668,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CE,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3CD,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6E3,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6E4,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6E2,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6F3,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;26F4,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6E5,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2708,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6E9,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6F0,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6CE,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;23F1,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;23F2,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F570,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F321,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2600,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2601,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;26C8,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F324,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F325,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F326,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F327,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F328,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F329,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F32A,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F32B,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F32C,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2602,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;26F1,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2744,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2603,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2604,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F397,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F39F,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F396,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;26F8,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F579,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2660,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2665,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2666,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2663,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;265F,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F5BC,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F576,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6CD,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;26D1,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F399,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F39A,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F39B,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;260E,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F5A5,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F5A8,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2328,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F5B1,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F5B2,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F39E,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F4FD,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F56F,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F5DE,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3F7,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2709,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F5F3,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;270F,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2712,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F58B,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F58A,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F58C,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F58D,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F5C2,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F5D2,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F5D3,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F587,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2702,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F5C3,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F5C4,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F5D1,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F5DD,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;26CF,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2692,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6E0,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F5E1,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2694,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6E1,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2699,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F5DC,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2696,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;26D3,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2697,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6CF,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6CB,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;26B0,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;26B1,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;26A0,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2622,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2623,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2B06,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2197,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;27A1,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2198,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2B07,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2199,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2B05,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2196,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2195,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2194,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;21A9,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;21AA,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2934,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2935,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;269B,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F549,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2721,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2638,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;262F,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;271D,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2626,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;262A,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;262E,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;25B6,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;23ED,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;23EF,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;25C0,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;23EE,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;23F8,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;23F9,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;23FA,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;23CF,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2640,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2642,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;26A7,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2716,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;267E,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;203C,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2049,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;3030,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2695,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;267B,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;269C,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2611,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2714,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;303D,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2733,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2734,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2747,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;00A9,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;00AE,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2122,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;0023,FE0F,20E3;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;0023,20E3;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;002A,FE0F,20E3;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;002A,20E3;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;0030,FE0F,20E3;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;0030,20E3;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;0031,FE0F,20E3;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;0031,20E3;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;0032,FE0F,20E3;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;0032,20E3;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;0033,FE0F,20E3;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;0033,20E3;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;0034,FE0F,20E3;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;0034,20E3;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;0035,FE0F,20E3;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;0035,20E3;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;0036,FE0F,20E3;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;0036,20E3;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;0037,FE0F,20E3;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;0037,20E3;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;0038,FE0F,20E3;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;0038,20E3;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;0039,FE0F,20E3;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;0039,20E3;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F170,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F171,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2139,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;24C2,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F17E,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F17F,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F202,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F237,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;3297,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;3299,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;25FC,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;25FB,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;25AA,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;25AB,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3F3,FE0F;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3F3,FE0F,200D,1F308;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3F3,200D,1F308;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3F3,FE0F,200D,26A7,FE0F;[1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3F3,200D,26A7,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3F3,FE0F,200D,26A7;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3F3,200D,26A7;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3F4,200D,2620,FE0F;[1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3F4,200D,2620;[1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E6,1F1E8;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E6,1F1E9;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E6,1F1EA;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E6,1F1EB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E6,1F1EC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E6,1F1EE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E6,1F1F1;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E6,1F1F2;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E6,1F1F4;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E6,1F1F6;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E6,1F1F7;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E6,1F1F8;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E6,1F1F9;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E6,1F1FA;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E6,1F1FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E6,1F1FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E6,1F1FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E7,1F1E6;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E7,1F1E7;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E7,1F1E9;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E7,1F1EA;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E7,1F1EB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E7,1F1EC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E7,1F1ED;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E7,1F1EE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E7,1F1EF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E7,1F1F1;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E7,1F1F2;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E7,1F1F3;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E7,1F1F4;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E7,1F1F6;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E7,1F1F7;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E7,1F1F8;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E7,1F1F9;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E7,1F1FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E7,1F1FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E7,1F1FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E7,1F1FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E8,1F1E6;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E8,1F1E8;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E8,1F1E9;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E8,1F1EB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E8,1F1EC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E8,1F1ED;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E8,1F1EE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E8,1F1F0;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E8,1F1F1;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E8,1F1F2;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E8,1F1F3;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E8,1F1F4;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E8,1F1F5;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E8,1F1F7;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E8,1F1FA;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E8,1F1FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E8,1F1FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E8,1F1FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E8,1F1FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E8,1F1FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E9,1F1EA;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E9,1F1EC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E9,1F1EF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E9,1F1F0;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E9,1F1F2;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E9,1F1F4;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1E9,1F1FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1EA,1F1E6;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1EA,1F1E8;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1EA,1F1EA;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1EA,1F1EC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1EA,1F1ED;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1EA,1F1F7;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1EA,1F1F8;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1EA,1F1F9;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1EA,1F1FA;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1EB,1F1EE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1EB,1F1EF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1EB,1F1F0;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1EB,1F1F2;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1EB,1F1F4;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1EB,1F1F7;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1EC,1F1E6;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1EC,1F1E7;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1EC,1F1E9;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1EC,1F1EA;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1EC,1F1EB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1EC,1F1EC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1EC,1F1ED;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1EC,1F1EE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1EC,1F1F1;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1EC,1F1F2;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1EC,1F1F3;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1EC,1F1F5;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1EC,1F1F6;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1EC,1F1F7;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1EC,1F1F8;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1EC,1F1F9;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1EC,1F1FA;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1EC,1F1FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1EC,1F1FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1ED,1F1F0;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1ED,1F1F2;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1ED,1F1F3;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1ED,1F1F7;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1ED,1F1F9;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1ED,1F1FA;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1EE,1F1E8;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1EE,1F1E9;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1EE,1F1EA;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1EE,1F1F1;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1EE,1F1F2;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1EE,1F1F3;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1EE,1F1F4;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1EE,1F1F6;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1EE,1F1F7;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1EE,1F1F8;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1EE,1F1F9;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1EF,1F1EA;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1EF,1F1F2;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1EF,1F1F4;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1EF,1F1F5;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F0,1F1EA;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F0,1F1EC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F0,1F1ED;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F0,1F1EE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F0,1F1F2;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F0,1F1F3;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F0,1F1F5;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F0,1F1F7;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F0,1F1FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F0,1F1FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F0,1F1FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F1,1F1E6;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F1,1F1E7;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F1,1F1E8;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F1,1F1EE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F1,1F1F0;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F1,1F1F7;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F1,1F1F8;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F1,1F1F9;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F1,1F1FA;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F1,1F1FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F1,1F1FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F2,1F1E6;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F2,1F1E8;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F2,1F1E9;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F2,1F1EA;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F2,1F1EB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F2,1F1EC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F2,1F1ED;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F2,1F1F0;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F2,1F1F1;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F2,1F1F2;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F2,1F1F3;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F2,1F1F4;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F2,1F1F5;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F2,1F1F6;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F2,1F1F7;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F2,1F1F8;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F2,1F1F9;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F2,1F1FA;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F2,1F1FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F2,1F1FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F2,1F1FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F2,1F1FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F2,1F1FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F3,1F1E6;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F3,1F1E8;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F3,1F1EA;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F3,1F1EB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F3,1F1EC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F3,1F1EE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F3,1F1F1;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F3,1F1F4;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F3,1F1F5;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F3,1F1F7;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F3,1F1FA;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F3,1F1FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F4,1F1F2;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F5,1F1E6;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F5,1F1EA;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F5,1F1EB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F5,1F1EC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F5,1F1ED;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F5,1F1F0;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F5,1F1F1;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F5,1F1F2;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F5,1F1F3;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F5,1F1F7;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F5,1F1F8;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F5,1F1F9;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F5,1F1FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F5,1F1FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F6,1F1E6;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F7,1F1EA;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F7,1F1F4;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F7,1F1F8;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F7,1F1FA;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F7,1F1FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F8,1F1E6;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F8,1F1E7;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F8,1F1E8;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F8,1F1E9;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F8,1F1EA;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F8,1F1EC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F8,1F1ED;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F8,1F1EE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F8,1F1EF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F8,1F1F0;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F8,1F1F1;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F8,1F1F2;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F8,1F1F3;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F8,1F1F4;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F8,1F1F7;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F8,1F1F8;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F8,1F1F9;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F8,1F1FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F8,1F1FD;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F8,1F1FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F8,1F1FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F9,1F1E6;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F9,1F1E8;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F9,1F1E9;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F9,1F1EB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F9,1F1EC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F9,1F1ED;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F9,1F1EF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F9,1F1F0;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F9,1F1F1;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F9,1F1F2;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F9,1F1F3;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F9,1F1F4;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F9,1F1F7;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F9,1F1F9;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F9,1F1FB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F9,1F1FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1F9,1F1FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1FA,1F1E6;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1FA,1F1EC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1FA,1F1F2;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1FA,1F1F3;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1FA,1F1F8;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1FA,1F1FE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1FA,1F1FF;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1FB,1F1E6;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1FB,1F1E8;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1FB,1F1EA;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1FB,1F1EC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1FB,1F1EE;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1FB,1F1F3;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1FB,1F1FA;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1FC,1F1EB;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1FC,1F1F8;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1FD,1F1F0;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1FE,1F1EA;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1FE,1F1F9;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1FF,1F1E6;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1FF,1F1F2;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F1FF,1F1FC;[1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3F4,E0067,E0062,E0065,E006E,E0067,E007F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3F4,E0067,E0062,E0073,E0063,E0074,E007F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
+../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3F4,E0067,E0062,E0077,E006C,E0073,E007F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0]
diff --git a/test/shape/data/in-house/tests/emoji.tests b/test/shape/data/in-house/tests/emoji.tests
new file mode 100644 (file)
index 0000000..557b65f
--- /dev/null
@@ -0,0 +1,5 @@
+../fonts/53374c7ca3657be37efde7ed02ae34229a56ae1f.ttf;;U+1F3F4,U+E0055,U+E0053,U+E0064,U+E0065,U+E007F;[u1F3F4=0+2126|space=0+0|space=0+0|space=0+0|space=0+0|space=0+0]
+../fonts/53374c7ca3657be37efde7ed02ae34229a56ae1f.ttf;;U+1F3F4,U+E0064,U+E0065,U+E007F;[de=0+3200]
+../fonts/3cf6f8ac6d647473a43a3100e7494b202b2cfafe.ttf;--font-funcs=ot --direction=l;U+1F481,U+1F3FB,U+200D,U+2642,U+FE0F;[gid7=0+2550]
+../fonts/3cf6f8ac6d647473a43a3100e7494b202b2cfafe.ttf;--font-funcs=ot --direction=r;U+1F481,U+1F3FB,U+200D,U+2642,U+FE0F;[gid7=0+2550]
+../fonts/8d9c4b193808b8bde94389ba7831c1fc6f9e794e.ttf;;U+1F3F4,U+E0067,U+E0062,U+E0077,U+E006C,U+E0073,U+E007F;[.notdef=0+1229|space=0+0|space=0+0|space=0+0|space=0+0|space=0+0|space=0+0]
diff --git a/test/shape/data/in-house/tests/fallback-positioning.tests b/test/shape/data/in-house/tests/fallback-positioning.tests
new file mode 100644 (file)
index 0000000..4c52d53
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/8228d035fcd65d62ec9728fb34f42c63be93a5d3.ttf;;U+0078,U+0301,U+0058,U+0301;[x=0+1030|acutecomb=0@-19,-27+0|X=2+1295|acutecomb=2@-151,320+0]
+../fonts/856ff9562451293cbeff6f396d4e3877c4f0a436.ttf;;U+0061,U+035C,U+0062;[uni0061=0+512|uni035C=0@0,-128+0|uni0062=2+512]
diff --git a/test/shape/data/in-house/tests/glyph-props-no-gdef.tests b/test/shape/data/in-house/tests/glyph-props-no-gdef.tests
new file mode 100644 (file)
index 0000000..27bcbd5
--- /dev/null
@@ -0,0 +1 @@
+../fonts/FallbackPlus-Javanese-no-GDEF.otf;;U+A995,U+A9BF;[glyph01=0+600|uniA995=0+600]
diff --git a/test/shape/data/in-house/tests/hangul-jamo.tests b/test/shape/data/in-house/tests/hangul-jamo.tests
new file mode 100644 (file)
index 0000000..69b34a5
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/757ebd573617a24aa9dfbf0b885c54875c6fe06b.ttf;;U+115F,U+11A2;[gid3=0+920|gid4=0+0]
+../fonts/7e14e7883ed152baa158b80e207b66114c823a8b.ttf;;U+11A2;[gid1=0+920]
diff --git a/test/shape/data/in-house/tests/hyphens.tests b/test/shape/data/in-house/tests/hyphens.tests
new file mode 100644 (file)
index 0000000..e2b255a
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/1c04a16f32a39c26c851b7fc014d2e8d298ba2b8.ttf;;U+2010;[gid1=0+739]
+../fonts/1c04a16f32a39c26c851b7fc014d2e8d298ba2b8.ttf;;U+2011;[gid1=0+739]
diff --git a/test/shape/data/in-house/tests/indic-consonant-with-stacker.tests b/test/shape/data/in-house/tests/indic-consonant-with-stacker.tests
new file mode 100644 (file)
index 0000000..d6baca4
--- /dev/null
@@ -0,0 +1,4 @@
+../fonts/a014549f766436cf55b2ceb40e462038938ee899.ttf;--no-glyph-names;U+0CF1,U+0C95;[2=0+1129|3=1+358]
+../fonts/55c88ebbe938680b08f92c3de20713183e0c7481.ttf;--no-glyph-names;U+0CF2,U+0CAA;[2=0+1539|3=1+245]
+../fonts/341421e629668b1a1242245d39238ca48432d35d.ttf;--no-glyph-names;U+0CF1;[1=0+1129]
+../fonts/663aef6b019dbf45ffd74089e2b5f2496ceceb18.ttf;--no-glyph-names;U+0CF2;[1=0+1539]
diff --git a/test/shape/data/in-house/tests/indic-decompose.tests b/test/shape/data/in-house/tests/indic-decompose.tests
new file mode 100644 (file)
index 0000000..132011f
--- /dev/null
@@ -0,0 +1 @@
+../fonts/932ad5132c2761297c74e9976fe25b08e5ffa10b.ttf;--font-funcs=ot;U+09DC,U+0020,U+09DD,U+0020,U+09A1,U+09BC,U+0020,U+09A2,U+09BC;[bn_rha=0+1024|space=1+1024|bn_yya=2+1024|space=3+1024|bn_dda=4+1024|bn_nukta=4+1024|space=6+1024|bn_ddha=7+1024|bn_nukta=7+1024]
diff --git a/test/shape/data/in-house/tests/indic-init.tests b/test/shape/data/in-house/tests/indic-init.tests
new file mode 100644 (file)
index 0000000..8be43fb
--- /dev/null
@@ -0,0 +1 @@
+../fonts/1a3d8f381387dd29be1e897e4b5100ac8b4829e1.ttf;--no-glyph-names;U+09AC,U+09C7,U+09AC,U+09C7;[3=0+273|1=0+460|2=2+307|1=2+460]
diff --git a/test/shape/data/in-house/tests/indic-joiner-candrabindu.tests b/test/shape/data/in-house/tests/indic-joiner-candrabindu.tests
new file mode 100644 (file)
index 0000000..fcc24ad
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/5028afb650b1bb718ed2131e872fbcce57828fff.ttf;;U+0B13,U+200D,U+0B01;[omorya=0+1450]
+../fonts/5028afb650b1bb718ed2131e872fbcce57828fff.ttf;;U+0B13,U+200C,U+0B01;[oorya=0+1309|space=1+0|candrabinduorya=1+0]
diff --git a/test/shape/data/in-house/tests/indic-joiners.tests b/test/shape/data/in-house/tests/indic-joiners.tests
new file mode 100644 (file)
index 0000000..047876b
--- /dev/null
@@ -0,0 +1,6 @@
+../fonts/f443753e8ffe8e8aae606cfba158e00334b6efb1.ttf;;U+179A,U+1784,U+17D2,U+179F,U+200C,U+17CA,U+17B8,U+0020;[uni179a=0+775|uni1784=1+1550|uni179f.sub=1+775|space=4+0|uni17ca=4+0|uni17b8=4@0,300+0|space=7+600]
+../fonts/f443753e8ffe8e8aae606cfba158e00334b6efb1.ttf;;U+179A,U+1784,U+17D2,U+179F,U+17CA,U+17B8;[uni179a=0+775|uni1784=1+1550|uni179f.sub=1+775|uni17bb=1@-75,-700+0|uni17b8=1+0]
+../fonts/8116e5d8fedfbec74e45dc350d2416d810bed8c4.ttf;;U+091F,U+094D,U+200C,U+092F,U+093F;[uni091F=0+876|uni094D=0@4,0+0|space=2+0|uni093F.750=3+397|uni092F=3+924]
+../fonts/8116e5d8fedfbec74e45dc350d2416d810bed8c4.ttf;;U+091F,U+094D,U+200D,U+092F,U+093F;[uni093F=0+398|uni091F=0+876|uni094D=0@4,0+0|space=0+0|uni092F=0+924]
+../fonts/8116e5d8fedfbec74e45dc350d2416d810bed8c4.ttf;;U+091F,U+094D,U+200D,U+091F,U+094D,U+200C,U+091F,U+094D,U+200D,U+092F,U+093F;[uni091F=0+876|uni094D=0@4,0+0|space=0+0|uni091F=3+876|uni094D=3@4,0+0|space=5+0|uni093F=6+398|uni091F=6+876|uni094D=6@4,0+0|space=6+0|uni092F=6+924]
+../fonts/8116e5d8fedfbec74e45dc350d2416d810bed8c4.ttf;;U+091F,U+094D,U+200D,U+091F,U+094D,U+200D,U+091F,U+094D,U+200D,U+092F,U+093F;[uni093F=0+398|uni091F=0+876|uni094D=0@4,0+0|space=0+0|uni091F=0+876|uni094D=0@4,0+0|space=0+0|uni091F=0+876|uni094D=0@4,0+0|space=0+0|uni092F=0+924]
diff --git a/test/shape/data/in-house/tests/indic-old-spec.tests b/test/shape/data/in-house/tests/indic-old-spec.tests
new file mode 100644 (file)
index 0000000..38a0054
--- /dev/null
@@ -0,0 +1,4 @@
+../fonts/57a9d9f83020155cbb1d2be1f43d82388cbecc88.ttf;;U+0C9A,U+0CCD,U+0C9A,U+0CCD;[U0C9A_U0CCD.haln=0+1066|U0C9A_0CCD.blwf=0+0]
+../fonts/270b89df543a7e48e206a2d830c0e10e5265c630.ttf;;U+0D38,U+0D4D,U+0D31,U+0D4D,U+0D31,U+0D4D;[glyph201=0+1183|U0D4D=0+0]
+../fonts/b722a7d09e60421f3efbc706ad348ab47b88567b.ttf;;U+091F,U+094D,U+0930,U+094D,U+0020;[Tra=0+550|virAma=0@-73,-110+0|space=4+500]
+../fonts/b722a7d09e60421f3efbc706ad348ab47b88567b.ttf;;U+091F,U+094D,U+0930,U+0942;[Tra=0+550|UT=0@42,-150+0]
diff --git a/test/shape/data/in-house/tests/indic-pref-blocking.tests b/test/shape/data/in-house/tests/indic-pref-blocking.tests
new file mode 100644 (file)
index 0000000..d477214
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/226bc2deab3846f1a682085f70c67d0421014144.ttf;;U+0D2F,U+0D4D,U+0D30,U+0D46;[evowelsignmlym=0+1465|rapostmlym=0+499|yamlym=0+2120]
+../fonts/e207635780b42f898d58654b65098763e340f5c7.ttf;;U+0D2F,U+0D4D,U+0D30,U+0D46;[yamlym=0+2120|viramamlym=0+0|evowelsignmlym=0+1465|ramlym=0+1507]
diff --git a/test/shape/data/in-house/tests/indic-script-extensions.tests b/test/shape/data/in-house/tests/indic-script-extensions.tests
new file mode 100644 (file)
index 0000000..8e07eaa
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/3493e92eaded2661cadde752a39f9d58b11f0326.ttf;;U+0BA4,U+0BC6,U+1133C,U+0BAA,U+1133C,U+0BC6,U+1133C;[u0BC6=0+2093|u1133C=0+0|u0BA4=0+1863|u0BC6=3+2093|u1133C=3+0|u0BAA=3+1706|u1133C=3+0]
+../fonts/b151cfcdaa77585d77f17a42158e0873fc8e2633.ttf;--no-glyph-names;U+0BAA,U+11301,U+11303;[1=0+535|2=0+0|3=0+310]
diff --git a/test/shape/data/in-house/tests/indic-special-cases.tests b/test/shape/data/in-house/tests/indic-special-cases.tests
new file mode 100644 (file)
index 0000000..8610658
--- /dev/null
@@ -0,0 +1,3 @@
+../fonts/3cae6bfe5b57c07ba81ddbd54c02fe4f3a1e3bf6.ttf;;U+0CB0,U+0CCD,U+0C95;[gid1=0+1176|gid5=0+1161]
+../fonts/3cae6bfe5b57c07ba81ddbd54c02fe4f3a1e3bf6.ttf;;U+0CB0,U+200D,U+0CCD,U+0C95;[gid2=0+1334|gid6=0+358]
+../fonts/3cae6bfe5b57c07ba81ddbd54c02fe4f3a1e3bf6.ttf;;U+0CB0,U+0CCD,U+200D,U+0C95;[gid2=0+1334|gid6=0+358]
diff --git a/test/shape/data/in-house/tests/indic-syllable.tests b/test/shape/data/in-house/tests/indic-syllable.tests
new file mode 100644 (file)
index 0000000..275fb13
--- /dev/null
@@ -0,0 +1,13 @@
+../fonts/54674a3111d209fb6be0ed31745314b7a8d2c244.ttf;;U+0BA4,U+0BCD,U+00B3;[taprehalftamil=0+1509|uni00B3=2+674]
+../fonts/3d0b77a2360aa6faa1385aaa510509ab70dfbeff.ttf;;U+0CF1;[gid1=0+1129]
+../fonts/3d0b77a2360aa6faa1385aaa510509ab70dfbeff.ttf;;U+0CF2;[gid2=0+1539]
+../fonts/87f85d17d26f1fe9ad28d7365101958edaefb967.ttf;--font-funcs=ot;U+0980,U+0981;[anjibeng=0+520|candrabindubeng=0+0]
+../fonts/85fe0be440c64ac77699e21c2f1bd933a919167e.ttf;;U+0A15,U+0A51,U+0A47;[kaguru=0+1273|udaatguru=0@75,0+0|eematraguru=0@-40,0+0]
+../fonts/1735326da89f0818cd8c51a0600e9789812c0f94.ttf;;U+0A51;[uni25CC=0+1044|udaatguru=0+0]
+../fonts/1735326da89f0818cd8c51a0600e9789812c0f94.ttf;;U+25CC,U+0A51;[uni25CC=0+1044|udaatguru=0+0]
+../fonts/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]
+../fonts/b3075ca42b27dde7341c2d0ae16703c5b6640df0.ttf;;U+0B2C,U+0B55,U+0B3E;[uni0B2C=0+641|uni0B55=0+0|uni0B3E=0+253]
+../fonts/b3075ca42b27dde7341c2d0ae16703c5b6640df0.ttf;;U+0B2C,U+0B3E,U+0B55;[uni0B2C=0+641|uni0B3E=0+253|uni0B55=0+0]
+../fonts/e2b17207c4b7ad78d843e1b0c4d00b09398a1137.ttf;;U+0BAA,U+0BAA,U+0BCD;[pa-tamil=0+778|pa-tamil.001=1+778|pulli-tamil=1@-385,0+0]
diff --git a/test/shape/data/in-house/tests/indic-vowel-letter-spoofing.tests b/test/shape/data/in-house/tests/indic-vowel-letter-spoofing.tests
new file mode 100644 (file)
index 0000000..c53d4be
--- /dev/null
@@ -0,0 +1,53 @@
+../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf;;U+0904,U+0020,U+0905,U+0946;[ashortdeva=0+764|space=1+260|adeva=2+764|uni25CC=2+510|eshortvowelsigndeva=2+0]
+../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf;;U+0906,U+0020,U+0905,U+093E;[aadeva=0+1023|space=1+260|adeva=2+764|uni25CC=2+510|aavowelsigndeva=2+259]
+../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf;;U+0908,U+0020,U+0930,U+094D,U+0907;[iideva=0+491|space=1+260|uni25CC=2+510|rephdeva=2+0|ideva=2+491]
+../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf;;U+090A,U+0020,U+0909,U+0941;[uudeva=0+765|space=1+260|udeva=2+548|uni25CC=2+510|uvowelsigndeva=2+0]
+../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf;;U+090D,U+0020,U+090F,U+0945;[ecandradeva=0+553|space=1+260|edeva=2+553|uni25CC=2+510|ecandravowelsigndeva=2+0]
+../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf;;U+090E,U+0020,U+090F,U+0946;[eshortdeva=0+553|space=1+260|edeva=2+553|uni25CC=2+510|eshortvowelsigndeva=2+0]
+../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf;;U+0910,U+0020,U+090F,U+0947;[aideva=0+553|space=1+260|edeva=2+553|uni25CC=2+510|evowelsigndeva=2+0]
+../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf;;U+0911,U+0020,U+0905,U+0949,U+0020,U+0906,U+0945;[ocandradeva=0+1023|space=1+260|adeva=2+764|uni25CC=2+510|ocandravowelsigndeva=2+259|space=4+260|aadeva=5+1023|uni25CC=5+510|ecandravowelsigndeva=5+0]
+../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf;;U+0912,U+0020,U+0905,U+094A,U+0020,U+0906,U+0946;[oshortdeva=0+1023|space=1+260|adeva=2+764|uni25CC=2+510|oshortvowelsigndeva=2+259|space=4+260|aadeva=5+1023|uni25CC=5+510|eshortvowelsigndeva=5+0]
+../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf;;U+0913,U+0020,U+0905,U+094B,U+0020,U+0906,U+0947;[odeva=0+1023|space=1+260|adeva=2+764|uni25CC=2+510|ovowelsigndeva=2+259|space=4+260|aadeva=5+1023|uni25CC=5+510|evowelsigndeva=5+0]
+../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf;;U+0914,U+0020,U+0905,U+094C,U+0020,U+0906,U+0948;[audeva=0+1023|space=1+260|adeva=2+764|uni25CC=2+510|auvowelsigndeva=2+259|space=4+260|aadeva=5+1023|uni25CC=5+510|aivowelsigndeva=5+0]
+../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf;;U+0972,U+0020,U+0905,U+0945;[acandradeva=0+764|space=1+260|adeva=2+764|uni25CC=2+510|ecandravowelsigndeva=2+0]
+../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf;;U+0973,U+0020,U+0905,U+093A;[oedeva=0+764|space=1+260|adeva=2+764|uni25CC=2+510|oevowelsigndeva=2+0]
+../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf;;U+0974,U+0020,U+0905,U+093B,U+0020,U+0906,U+093A;[ooedeva=0+1023|space=1+260|adeva=2+764|uni25CC=2+510|ooevowelsigndeva=2+259|space=4+260|aadeva=5+1023|uni25CC=5+510|oevowelsigndeva=5+0]
+../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf;;U+0975,U+0020,U+0905,U+094F;[awdeva=0+1023|space=1+260|adeva=2+764|uni25CC=2+510|awvowelsigndeva=2+259]
+../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf;;U+0976,U+0020,U+0905,U+0956;[uedeva=0+764|space=1+260|adeva=2+764|uni25CC=2+510|uevowelsigndeva=2@50,0+0]
+../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf;;U+0977,U+0020,U+0905,U+0957;[uuedeva=0+764|space=1+260|adeva=2+764|uni25CC=2+510|uuevowelsigndeva=2@50,0+0]
+../fonts/881642af1667ae30a54e58de8be904566d00508f.ttf;;U+0986,U+0020,U+0985,U+09BE;[aabeng=0+1158|space=1+260|abeng=2+893|uni25CC=2+510|aavowelsignbeng=2+266]
+../fonts/881642af1667ae30a54e58de8be904566d00508f.ttf;;U+09E0,U+0020,U+098B,U+09C3;[rrvocalicbeng=0+853|space=1+260|rvocalicbeng=2+853|uni25CC=2+510|rvocalicvowelsignbeng=2+0]
+../fonts/881642af1667ae30a54e58de8be904566d00508f.ttf;;U+09E1,U+0020,U+098C,U+09E2;[llvocalicbeng=0+639|space=1+260|lvocalicbeng=2+639|uni25CC=2+510|lvocalicvowelsignbeng=2+0]
+../fonts/604026ae5aaca83c49cd8416909d71ba3e1c1194.ttf;;U+0A06,U+0020,U+0A05,U+0A3E;[aaguru=0+2001|space=1+532|aguru=2+1520|uni25CC=2+1044|aamatraguru=2+481]
+../fonts/604026ae5aaca83c49cd8416909d71ba3e1c1194.ttf;;U+0A07,U+0020,U+0A72,U+0A3F;[iguru=0+1671|space=1+532|iriguru=2+1141|imatraguru=2+530|uni25CC=2+1044]
+../fonts/604026ae5aaca83c49cd8416909d71ba3e1c1194.ttf;;U+0A08,U+0020,U+0A72,U+0A40;[iiguru=0+1671|space=1+532|iriguru=2+1141|uni25CC=2+1044|iimatraguru=2+530]
+../fonts/604026ae5aaca83c49cd8416909d71ba3e1c1194.ttf;;U+0A09,U+0020,U+0A73,U+0A41;[uguru=0+1356|space=1+532|uraguru=2+1356|uni25CC=2+1044|umatraguru=2@102,0+0]
+../fonts/604026ae5aaca83c49cd8416909d71ba3e1c1194.ttf;;U+0A0A,U+0020,U+0A73,U+0A42;[uuguru=0+1356|space=1+532|uraguru=2+1356|uni25CC=2+1044|uumatraguru=2@102,0+0]
+../fonts/604026ae5aaca83c49cd8416909d71ba3e1c1194.ttf;;U+0A0F,U+0020,U+0A72,U+0A47;[eeguru=0+1141|space=1+532|iriguru=2+1141|uni25CC=2+1044|eematraguru=2+0]
+../fonts/604026ae5aaca83c49cd8416909d71ba3e1c1194.ttf;;U+0A10,U+0020,U+0A05,U+0A48;[aiguru=0+1520|space=1+532|aguru=2+1520|uni25CC=2+1044|aimatraguru=2+0]
+../fonts/604026ae5aaca83c49cd8416909d71ba3e1c1194.ttf;;U+0A13,U+0020,U+0A73,U+0A4B;[ooguru=0+1356|space=1+532|uraguru=2+1356|uni25CC=2+1044|oomatraguru=2+0]
+../fonts/604026ae5aaca83c49cd8416909d71ba3e1c1194.ttf;;U+0A14,U+0020,U+0A05,U+0A4C;[auguru=0+1520|space=1+532|aguru=2+1520|uni25CC=2+1044|aumatraguru=2+0]
+../fonts/738d9f3b8c2dfd03875bf35a61d28fd78faf17c8.ttf;;U+0A86,U+0020,U+0A85,U+0ABE;[gid3=0+2351|gid1=1+612|gid2=2+1808|gid17=2+1044|gid10=2+543]
+../fonts/738d9f3b8c2dfd03875bf35a61d28fd78faf17c8.ttf;;U+0A8D,U+0020,U+0A85,U+0AC5;[gid4=0+1808|gid1=1+612|gid2=2+1808|gid17=2+1044|gid11=2+0]
+../fonts/738d9f3b8c2dfd03875bf35a61d28fd78faf17c8.ttf;;U+0A8F,U+0020,U+0A85,U+0AC7;[gid5=0+1808|gid1=1+612|gid2=2+1808|gid17=2+1044|gid12=2+0]
+../fonts/738d9f3b8c2dfd03875bf35a61d28fd78faf17c8.ttf;;U+0A90,U+0020,U+0A85,U+0AC8;[gid6=0+1808|gid1=1+612|gid2=2+1808|gid17=2+1044|gid13=2+0]
+../fonts/738d9f3b8c2dfd03875bf35a61d28fd78faf17c8.ttf;;U+0A91,U+0020,U+0A85,U+0AC9;[gid7=0+2351|gid1=1+612|gid2=2+1808|gid17=2+1044|gid14=2+543]
+../fonts/738d9f3b8c2dfd03875bf35a61d28fd78faf17c8.ttf;;U+0A93,U+0020,U+0A85,U+0ACB,U+0020,U+0A85,U+0ABE,U+0AC5;[gid8=0+2351|gid1=1+612|gid2=2+1808|gid17=2+1044|gid15=2+543|gid1=4+612|gid2=5+1808|gid17=5+1044|gid11=5+0|gid10=5+543]
+../fonts/738d9f3b8c2dfd03875bf35a61d28fd78faf17c8.ttf;;U+0A94,U+0020,U+0A85,U+0ACC,U+0020,U+0A85,U+0ABE,U+0AC8;[gid9=0+2351|gid1=1+612|gid2=2+1808|gid17=2+1044|gid16=2+543|gid1=4+612|gid2=5+1808|gid17=5+1044|gid13=5+0|gid10=5+543]
+../fonts/738d9f3b8c2dfd03875bf35a61d28fd78faf17c8.ttf;;U+0AC9,U+0020,U+0AC5,U+0ABE;[gid17=0+1044|gid14=0+543|gid1=1+612|gid17=1+1044|gid11=1+0|gid17=1+1044|gid10=1+543]
+../fonts/2c25beb56d9c556622d56b0b5d02b4670c034f89.ttf;;U+0B06,U+0020,U+0B05,U+0B3E;[aaorya=0+1681|space=1+881|aorya=2+1284|uni25CC=2+1044|aavowelsignorya=2+387]
+../fonts/2c25beb56d9c556622d56b0b5d02b4670c034f89.ttf;;U+0B10,U+0020,U+0B0F,U+0B57;[aiorya=0+1681|space=1+881|eorya=2+1315|uni25CC=2+1044|aulengthmarkorya=2+387]
+../fonts/2c25beb56d9c556622d56b0b5d02b4670c034f89.ttf;;U+0B14,U+0020,U+0B13,U+0B57;[auorya=0+1679|space=1+881|oorya=2+1309|uni25CC=2+1044|aulengthmarkorya=2+387]
+../fonts/03e3f463c3a985bc42096620cc415342818454fb.ttf;;U+0C13,U+0020,U+0C12,U+0C55;[gid3=0+1497|gid1=1+580|gid2=2+1497|gid13=2+1184|gid12=2+0]
+../fonts/03e3f463c3a985bc42096620cc415342818454fb.ttf;;U+0C14,U+0020,U+0C12,U+0C4C;[gid4=0+1497|gid1=1+580|gid2=2+1497|gid13=2+1184|gid11=2+634]
+../fonts/03e3f463c3a985bc42096620cc415342818454fb.ttf;;U+0C40,U+0020,U+0C3F,U+0C55;[gid13=0+1184|gid6=0+0|gid1=1+580|gid13=1+1184|gid5=1+0|gid13=1+1184|gid12=1+0]
+../fonts/03e3f463c3a985bc42096620cc415342818454fb.ttf;;U+0C47,U+0020,U+0C46,U+0C55;[gid13=0+1184|gid8=0+0|gid1=1+580|gid13=1+1184|gid7=1+0|gid13=1+1184|gid12=1+0]
+../fonts/03e3f463c3a985bc42096620cc415342818454fb.ttf;;U+0C4B,U+0020,U+0C4A,U+0C55;[gid13=0+1184|gid10=0+634|gid1=1+580|gid13=1+1184|gid9=1+634|gid13=1+1184|gid12=1+0]
+../fonts/7d18685e1529e4ceaad5b6095dfab2f9789e5bce.ttf;;U+0C8A,U+0020,U+0C89,U+0CBE;[gid3=0+3269|gid1=1+590|gid2=2+2502|gid10=2+1184|gid7=2+919]
+../fonts/7d18685e1529e4ceaad5b6095dfab2f9789e5bce.ttf;;U+0C94,U+0020,U+0C92,U+0CCC;[gid6=0+1596|gid1=1+590|gid5=2+1590|gid10=2+1184|gid8=2+880]
+../fonts/7d18685e1529e4ceaad5b6095dfab2f9789e5bce.ttf;;U+0CE0,U+0020,U+0C8B,U+0CBE;[gid9=0+3214|gid1=1+590|gid4=2+2440|gid10=2+1184|gid7=2+919]
+../fonts/af85624080af5627fb050f570d148a62f04fda74.ttf;;U+0D08,U+0020,U+0D07,U+0D57;[gid3=0+3574|gid1=1+632|gid2=2+2019|gid14=2+1184|gid13=2+1555]
+../fonts/af85624080af5627fb050f570d148a62f04fda74.ttf;;U+0D0A,U+0020,U+0D09,U+0D57;[gid5=0+2972|gid1=1+632|gid4=2+1417|gid14=2+1184|gid13=2+1555]
+../fonts/af85624080af5627fb050f570d148a62f04fda74.ttf;;U+0D10,U+0020,U+0D0E,U+0D46;[gid7=0+4073|gid1=1+632|gid6=2+2608|gid12=2+1465|gid14=2+1184]
+../fonts/af85624080af5627fb050f570d148a62f04fda74.ttf;;U+0D13,U+0020,U+0D12,U+0D3E;[gid9=0+2557|gid1=1+632|gid8=2+1524|gid14=2+1184|gid11=2+1033]
+../fonts/af85624080af5627fb050f570d148a62f04fda74.ttf;;U+0D14,U+0020,U+0D12,U+0D57;[gid10=0+3073|gid1=1+632|gid8=2+1524|gid14=2+1184|gid13=2+1555]
diff --git a/test/shape/data/in-house/tests/item-context.tests b/test/shape/data/in-house/tests/item-context.tests
new file mode 100644 (file)
index 0000000..b9f1b1f
--- /dev/null
@@ -0,0 +1,11 @@
+../fonts/65984dfce552a785f564422aadf4715fa07795ad.ttf;;U+0643,U+0650,U+062A,U+064E,U+0627,U+0628,U+064F,U+0646,U+064E,U+0627;[uniFE8E=9+316|uni064E=7@169,-24+0|uniFEE8=7+341|uni064F=5@167,-222+0|uniFE91=5+301|uniFE8E=4+316|uni064E=2@196,-28+0|uniFE98=2+391|uni0650=0@288,44+0|uniFEDB=0+576]
+../fonts/65984dfce552a785f564422aadf4715fa07795ad.ttf;--unicodes-before=U+0643,U+0650;U+062A,U+064E,U+0627,U+0628,U+064F,U+0646,U+064E,U+0627;[uniFE8E=7+316|uni064E=5@169,-24+0|uniFEE8=5+341|uni064F=3@167,-222+0|uniFE91=3+301|uniFE8E=2+316|uni064E=0@196,-28+0|uniFE98=0+391]
+../fonts/65984dfce552a785f564422aadf4715fa07795ad.ttf;--unicodes-before=U+0643;U+062A,U+064E,U+0627,U+0628,U+064F,U+0646,U+064E,U+0627;[uniFE8E=7+316|uni064E=5@169,-24+0|uniFEE8=5+341|uni064F=3@167,-222+0|uniFE91=3+301|uniFE8E=2+316|uni064E=0@196,-28+0|uniFE98=0+391]
+../fonts/65984dfce552a785f564422aadf4715fa07795ad.ttf;--unicodes-after=U+0646,U+064E,U+0627;U+0643,U+0650,U+062A,U+064E,U+0627,U+0628,U+064F;[uni064F=5@167,-222+0|uniFE91=5+301|uniFE8E=4+316|uni064E=2@196,-28+0|uniFE98=2+391|uni0650=0@288,44+0|uniFEDB=0+576]
+../fonts/65984dfce552a785f564422aadf4715fa07795ad.ttf;--unicodes-after=U+0646;U+0643,U+0650,U+062A,U+064E,U+0627,U+0628,U+064F;[uni064F=5@167,-222+0|uniFE91=5+301|uniFE8E=4+316|uni064E=2@196,-28+0|uniFE98=2+391|uni0650=0@288,44+0|uniFEDB=0+576]
+../fonts/65984dfce552a785f564422aadf4715fa07795ad.ttf;--unicodes-before=U+0643,U+0650 --unicodes-after=U+0646,U+064E,U+0627;U+062A,U+064E,U+0627,U+0628,U+064F;[uni064F=3@167,-222+0|uniFE91=3+301|uniFE8E=2+316|uni064E=0@196,-28+0|uniFE98=0+391]
+../fonts/65984dfce552a785f564422aadf4715fa07795ad.ttf;--unicodes-before=U+0643 --unicodes-after=U+0646;U+062A,U+064E,U+0627,U+0628,U+064F;[uni064F=3@167,-222+0|uniFE91=3+301|uniFE8E=2+316|uni064E=0@196,-28+0|uniFE98=0+391]
+../fonts/65984dfce552a785f564422aadf4715fa07795ad.ttf;--unicodes-before=U+0627;U+0643,U+062A,U+0628;[uniFE90=2+821|uniFE98=1+391|uniFEDB=0+576]
+../fonts/65984dfce552a785f564422aadf4715fa07795ad.ttf;--unicodes-after=U+0627;U+0643,U+062A,U+0628,U+0627;[uniFE8E=3+316|uniFE92=2+341|uniFE98=1+391|uniFEDB=0+576]
+../fonts/3105b51976b879032c66aa93a634b3b3672cd344.ttf;--bot;U+064E;[uni25CC=0+679|uni064E=0@-607,-210+0]
+../fonts/3105b51976b879032c66aa93a634b3b3672cd344.ttf;--bot --unicodes-before=0627;U+064E;[uni064E=0+0]
diff --git a/test/shape/data/in-house/tests/kern-format2.tests b/test/shape/data/in-house/tests/kern-format2.tests
new file mode 100644 (file)
index 0000000..ad85cd7
--- /dev/null
@@ -0,0 +1,3 @@
+../fonts/e39391c77a6321c2ac7a2d644de0396470cd4bfe.ttf;;U+0061,U+0062,U+0063,U+0064,U+0065,U+0066,U+0067,U+0068,U+0069,U+006A,U+006B,U+006C,U+006D,U+006E,U+006F,U+0070;[a=0+626|b=1+672|c=2+564|d=3@-15,0+657|e=4+621|f=5+403|g=6@-10,0+662|h=7+666|i=8+316|j=9+316|k=10+591|l=11+316|m=12+1021|n=13+666|o=14+644|p=15+672]
+../fonts/e39391c77a6321c2ac7a2d644de0396470cd4bfe.ttf;;U+0063,U+006B,U+0063,U+006B,U+0063,U+006B;[c=0+579|k=1+591|c=2+579|k=3+591|c=4+579|k=5+591]
+../fonts/e39391c77a6321c2ac7a2d644de0396470cd4bfe.ttf;;U+0041,U+0056;[A=0+701|V=1@-40,0+703]
diff --git a/test/shape/data/in-house/tests/khmer-mark-order.tests b/test/shape/data/in-house/tests/khmer-mark-order.tests
new file mode 100644 (file)
index 0000000..6108265
--- /dev/null
@@ -0,0 +1,25 @@
+../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf;;U+179F,U+17CA,U+17BE,U+1794;[uni17C1=0+288|uni179F=0+928|uni17BB=0@-6,-26+0|uni17B8=0@-32,-29+0|uni1794=3+635]
+../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf;;U+179F,U+17C9,U+17BE,U+17BB,U+1794;[uni17C1=0+288|uni179F=0+928|uni17C9=0@-32,-29+0|uni17B8=0@-32,237+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=4+635]
+../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf;;U+179F,U+17C9,U+17C1,U+17B8,U+17BB,U+1794;[uni17C1=0+288|uni179F=0+928|uni17C9=0@-32,-29+0|uni17B8=0@-32,237+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=5+635]
+../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf;;U+179F,U+17C9,U+17B8,U+17C1,U+17BB,U+1794;[uni179F=0+928|uni17C9=0@-32,-29+0|uni17B8=0@-32,237+0|uni17C1=0+288|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=5+635]
+../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf;;U+179F,U+17C9,U+17BE,U+17BB,U+17BB,U+1794;[uni17C1=0+288|uni179F=0+928|uni17C9=0@-32,-29+0|uni17B8=0@-32,237+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=5+635]
+../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf;;U+179F,U+17C9,U+17C1,U+17B8,U+17BB,U+17BB,U+1794;[uni17C1=0+288|uni179F=0+928|uni17C9=0@-32,-29+0|uni17B8=0@-32,237+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=6+635]
+../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf;;U+179F,U+17C9,U+17B8,U+17C1,U+17BB,U+17BB,U+1794;[uni179F=0+928|uni17C9=0@-32,-29+0|uni17B8=0@-32,237+0|uni17C1=0+288|uni25CC=0+635|uni17BB=0@-20,-26+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=6+635]
+../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf;;U+179F,U+17CA,U+17BE,U+17BB,U+1794;[uni17C1=0+288|uni179F=0+928|uni17BB=0@-6,-26+0|uni17B8=0@-32,-29+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=4+635]
+../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf;;U+179F,U+17CA,U+17C1,U+17B8,U+17BB,U+1794;[uni17C1=0+288|uni179F=0+928|uni17BB=0@-6,-26+0|uni17B8=0@-32,-29+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=5+635]
+../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf;;U+179F,U+17CA,U+17B8,U+17C1,U+17BB,U+1794;[uni179F=0+928|uni17BB=0@-6,-26+0|uni17B8=0@-32,-29+0|uni17C1=0+288|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=5+635]
+../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf;;U+179F,U+17CA,U+17BE,U+17BB,U+17BB,U+1794;[uni17C1=0+288|uni179F=0+928|uni17BB=0@-6,-26+0|uni17B8=0@-32,-29+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=5+635]
+../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf;;U+179F,U+17CA,U+17C1,U+17B8,U+17BB,U+17BB,U+1794;[uni17C1=0+288|uni179F=0+928|uni17BB=0@-6,-26+0|uni17B8=0@-32,-29+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=6+635]
+../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf;;U+179F,U+17CA,U+17B8,U+17C1,U+17BB,U+17BB,U+1794;[uni179F=0+928|uni17BB=0@-6,-26+0|uni17B8=0@-32,-29+0|uni17C1=0+288|uni25CC=0+635|uni17BB=0@-20,-26+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=6+635]
+../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf;;U+179F,U+17C9,U+17BE,U+17B8,U+1794;[uni17C1=0+288|uni179F=0+928|uni17C9=0@-32,-29+0|uni17B8=0@-32,237+0|uni25CC=0+635|uni17B8=0@-20,-84+0|uni1794=4+635]
+../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf;;U+179F,U+17C9,U+17B8,U+17BE,U+1794;[uni179F=0+928|uni17C9=0@-32,-29+0|uni17B8=0@-32,237+0|uni17C1=0+288|uni25CC=0+635|uni17B8=0@-20,-84+0|uni1794=4+635]
+../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf;;U+179F,U+17C9,U+17BE,U+17B8,U+17BB,U+1794;[uni17C1=0+288|uni179F=0+928|uni17C9=0@-32,-29+0|uni17B8=0@-32,237+0|uni25CC=0+635|uni17B8=0@-20,-84+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=5+635]
+../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf;;U+179F,U+17C9,U+17B8,U+17BE,U+17BB,U+1794;[uni179F=0+928|uni17C9=0@-32,-29+0|uni17B8=0@-32,237+0|uni17C1=0+288|uni25CC=0+635|uni17B8=0@-20,-84+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=5+635]
+../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf;;U+179F,U+17CA,U+17BE,U+17B8,U+1794;[uni17C1=0+288|uni179F=0+928|uni17BB=0@-6,-26+0|uni17B8=0@-32,-29+0|uni25CC=0+635|uni17B8=0@-20,-84+0|uni1794=4+635]
+../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf;;U+179F,U+17CA,U+17B8,U+17BE,U+1794;[uni179F=0+928|uni17BB=0@-6,-26+0|uni17B8=0@-32,-29+0|uni17C1=0+288|uni25CC=0+635|uni17B8=0@-20,-84+0|uni1794=4+635]
+../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf;;U+179F,U+17CA,U+17BE,U+17B8,U+17BB,U+1794;[uni17C1=0+288|uni179F=0+928|uni17BB=0@-6,-26+0|uni17B8=0@-32,-29+0|uni25CC=0+635|uni17B8=0@-20,-84+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=5+635]
+../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf;;U+179F,U+17CA,U+17B8,U+17BE,U+17BB,U+1794;[uni179F=0+928|uni17BB=0@-6,-26+0|uni17B8=0@-32,-29+0|uni17C1=0+288|uni25CC=0+635|uni17B8=0@-20,-84+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=5+635]
+../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf;;U+179F,U+17BE,U+17B8,U+17BB,U+1794;[uni17C1=0+288|uni179F=0+928|uni17B8=0@-32,-29+0|uni25CC=0+635|uni17B8=0@-20,-84+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=4+635]
+../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf;;U+179F,U+17BE,U+17BB,U+17B8,U+1794;[uni17C1=0+288|uni179F=0+928|uni17B8=0@-32,-29+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni17B8=0@-20,-84+0|uni1794=4+635]
+../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf;;U+179F,U+17B8,U+17BE,U+17BB,U+1794;[uni179F=0+928|uni17B8=0@-32,-29+0|uni17C1=0+288|uni25CC=0+635|uni17B8=0@-20,-84+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=4+635]
+../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf;;U+179F,U+17B8,U+17BB,U+17BE,U+1794;[uni179F=0+928|uni17B8=0@-32,-29+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni17C1=0+288|uni25CC=0+635|uni17B8=0@-20,-84+0|uni1794=4+635]
diff --git a/test/shape/data/in-house/tests/khmer-misc.tests b/test/shape/data/in-house/tests/khmer-misc.tests
new file mode 100644 (file)
index 0000000..dff4fc1
--- /dev/null
@@ -0,0 +1,90 @@
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+1781,U+17D2,U+1798,U+17C2;[uni17C2=0+288|uni1781=0+635|uni17D21798=0@22,-26+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+1787,U+17B6;[uni178717B6=0+923]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+1790,U+17D2,U+1784,U+17C3;[uni17C3=0+288|uni1790=0+635|uni17D21784=0@-1,-26+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+1798,U+17B6;[uni179817B6=0+923]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+1798,U+17D2,U+1796,U+17BB;[uni1798=0+635|uni17D21796=0@-1,-26+0|uni17BB=0@-22,-296+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+179A;[uni179A=0+288]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+179A,U+17B8;[uni179A=0+288|uni17B8.r=0@76,-29+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+179A,U+17CD;[uni179A=0+288|uni17CD.r=0@18,-29+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+179F,U+17C5;[uni17C1=0+288|uni179F17C5=0+1216]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+179A,U+17D2,U+17A5;[uni179A=0+288|uni17D2=0+0|uni17A5=2+635]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+1784,U+17B9,U+17D2,U+1788;[uni1784=0+635|uni17B9=0@-46,30+0|uni17D21788=0+234]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+1784,U+17D2,U+1788,U+17B9;[uni1784=0+635|uni17D21788=0+234|uni17B9=0@8,30+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+1784,U+17D2,U+1782,U+17D2,U+179A;[uni17D2179A.low=0+287|uni1784=0+635|uni17D21782=0@0,-26+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+1784,U+17D2,U+179A,U+17D2,U+1782;[uni17D2179A.low=0+287|uni1784=0+635|uni17D21782=0@0,-26+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+1798,U+17C9,U+17D2,U+179B,U+17C1,U+17C7;[uni17C1=0+288|uni1798=0+635|uni17C9=0@-46,-29+0|uni17D2179B=0@-1,-26+0|uni17C7=0+386]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+1798,U+200C,U+17C9,U+17D2,U+179B,U+17C1,U+17C7;[uni17C1=0+288|uni1798=0+635|space=0+0|uni17C9=0@-46,-29+0|uni17D2179B=0@-1,-26+0|uni17C7=0+386]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+1794,U+17CA,U+17D0;[uni1794=0+635|uni17CA=0@-46,-29+0|uni17D0=0@-46,113+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+1793,U+17C2,U+17CE;[uni17C2=0+288|uni1793=0+635|uni17CE=0@-36,-29+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+1780,U+17C1,U+17D2,U+179A;[uni17D2179A=0+287|uni17C1=0+288|uni1780=0+636]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+1780,U+17C0,U+17D2,U+179A;[uni17D2179A=0+287|uni17C1=0+288|uni1780=0+636|uni17C0.right1=0+288]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+1780,U+17C4,U+17D2,U+179A;[uni17D2179A=0+287|uni17C1=0+288|uni178017B6=0+924]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+1780,U+17C5,U+17D2,U+179A;[uni17D2179A=0+287|uni17C1=0+288|uni178017C5=0+924]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+1796,U+17D1,U+17B6;[uni179617B6=0+923|uni17D1=0@-311,-19+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+1780,U+1793,U+17D2,U+178F,U+17D2,U+179A,U+17B6,U+1780,U+17CB;[uni1780=0+636|uni17D2179A.low=1+287|uni179317B6=1+924|uni17D2178F=1@-290,-26+0|uni1780=7+636|uni17CB=7@-23,-29+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+1780,U+1793,U+17D2,U+179A,U+17D2,U+179F,U+17B7,U+1780,U+17CB;[uni1780=0+636|uni17D2179A=1+287|uni1793=1+635|uni17D2179F=1+302|uni17B7=1@-4,30+0|uni1780=7+636|uni17CB=7@-23,-29+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+1780,U+1793,U+17D2,U+179A,U+17D2,U+179F,U+17B8,U+1780,U+17CB;[uni1780=0+636|uni17D2179A=1+287|uni1793=1+635|uni17D2179F=1+302|uni17B8=1@-4,30+0|uni1780=7+636|uni17CB=7@-23,-29+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+1780,U+17D2,U+179F,U+17B6,U+1793,U+17D2,U+178F;[uni1780=0+636|uni17D2179F17B6=0+584|uni1793=4+635|uni17D2178F=4@-1,-26+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+1780,U+17D2,U+179F,U+17B7,U+1793,U+17D2,U+178F;[uni1780=0+636|uni17D2179F=0+302|uni17B7=0@-4,30+0|uni1793=4+635|uni17D2178F=4@-1,-26+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+1780,U+17D2,U+179F,U+17B8,U+1793,U+17D2,U+178F;[uni1780=0+636|uni17D2179F=0+302|uni17B8=0@-4,30+0|uni1793=4+635|uni17D2178F=4@-1,-26+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+1780,U+17D2,U+179F,U+17B9,U+1793,U+17D2,U+178F;[uni1780=0+636|uni17D2179F=0+302|uni17B9=0@-4,30+0|uni1793=4+635|uni17D2178F=4@-1,-26+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+1780,U+17D2,U+179F,U+17BA,U+1793,U+17D2,U+178F;[uni1780=0+636|uni17D2179F=0+302|uni17BA=0@-4,30+0|uni1793=4+635|uni17D2178F=4@-1,-26+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+1780,U+17D2,U+179F,U+17BB,U+1793,U+17D2,U+178F;[uni1780=0+636|uni17D2179F=0+302|uni17BB=0@1,-260+0|uni1793=4+635|uni17D2178F=4@-1,-26+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+1780,U+17D2,U+179F,U+17BC,U+1793,U+17D2,U+178F;[uni1780=0+636|uni17D2179F=0+302|uni17BC=0@1,-260+0|uni1793=4+635|uni17D2178F=4@-1,-26+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+1780,U+17D2,U+179F,U+17BD,U+1793,U+17D2,U+178F;[uni1780=0+636|uni17D2179F=0+302|uni17BD=0@1,-260+0|uni1793=4+635|uni17D2178F=4@-1,-26+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+1780,U+17D2,U+179F,U+17BF,U+1793,U+17D2,U+178F;[uni17C1=0+288|uni1780=0+636|uni17D2179F=0+302|uni17BF.right2=0+288|uni1793=4+635|uni17D2178F=4@-1,-26+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+1783,U+17D2,U+179B,U+17D2,U+179F,U+17B6,U+17C6;[uni1783=0+928|uni17D2179B=0@15,-26+0|uni17D2179F17B6.low=0+584|uni17C6=0@39,-29+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+1783,U+17D2,U+179B,U+17D2,U+179F,U+17B7,U+17C7;[uni1783=0+928|uni17D2179B=0@15,-26+0|uni17D2179F.low=0+302|uni17B7=0@-4,30+0|uni17C7=0+386]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+1783,U+17D2,U+179B,U+17D2,U+179F,U+17BB,U+17C6;[uni1783=0+928|uni17D2179B=0@15,-26+0|uni17D2179F.low=0+302|uni17BB=0+0|uni17C6=0@-4,30+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+1783,U+17D2,U+179B,U+17D2,U+179F,U+17BB,U+17C7;[uni1783=0+928|uni17D2179B=0@15,-26+0|uni17D2179F.low=0+302|uni17BB=0+0|uni17C7=0+386]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+1783,U+17D2,U+179B,U+17D2,U+179F,U+17C1,U+17C7;[uni17C1=0+288|uni1783=0+928|uni17D2179B=0@15,-26+0|uni17D2179F.low=0+302|uni17C7=0+386]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+1783,U+17D2,U+179B,U+17D2,U+179F,U+17C4,U+17C7;[uni17C1=0+288|uni1783=0+928|uni17D2179B=0@15,-26+0|uni17D2179F17B6.low=0+584|uni17C7=0+386]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+1783,U+17D2,U+179B,U+17D2,U+179F,U+17C6;[uni1783=0+928|uni17D2179B=0@15,-26+0|uni17D2179F.low=0+302|uni17C6=0@-4,30+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+1783,U+17D2,U+179B,U+17D2,U+179F,U+17C7;[uni1783=0+928|uni17D2179B=0@15,-26+0|uni17D2179F.low=0+302|uni17C7=0+386]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+1789,U+17BC;[uni1789=0+952|uni17BC=0@-173,-260+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+1789,U+17D2,U+1789;[uni1789.a=0+952|uni17D21789.a=0@19,-22+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+1789,U+17D2,U+1789,U+17BB;[uni1789.a=0+952|uni17D21789.a=0@19,-22+0|uni17BB=0@-160,-296+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+1789,U+17D2,U+1789,U+17BC;[uni1789.a=0+952|uni17D21789.a=0@19,-22+0|uni17BC=0@-160,-296+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+1789,U+17D2,U+1789,U+17BD;[uni1789.a=0+952|uni17D21789.a=0@19,-22+0|uni17BD=0@-160,-296+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+178F,U+17D2,U+179A,U+17D2,U+179F,U+17C0;[uni17C1=0+288|uni17D2179A=0+287|uni178F=0+635|uni17D2179F=0+302|uni17C0.right2=0+288]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+178F,U+17D2,U+179A,U+17D2,U+179F,U+17C1;[uni17C1=0+288|uni17D2179A=0+287|uni178F=0+635|uni17D2179F=0+302]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+178F,U+17D2,U+179A,U+17D2,U+179F,U+17C2;[uni17C2=0+288|uni17D2179A=0+287|uni178F=0+635|uni17D2179F=0+302]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+178F,U+17D2,U+179A,U+17D2,U+179F,U+17C3;[uni17C3=0+288|uni17D2179A=0+287|uni178F=0+635|uni17D2179F=0+302]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+178F,U+17D2,U+179A,U+17D2,U+179F,U+17C4;[uni17C1=0+288|uni17D2179A=0+287|uni178F=0+635|uni17D2179F17B6=0+584]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+178F,U+17D2,U+179A,U+17D2,U+179F,U+17C5;[uni17C1=0+288|uni17D2179A=0+287|uni178F=0+635|uni17D2179F17C5=0+584]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+1792,U+17D2,U+179B,U+17BB,U+17C6,U+1780,U+17CB;[uni1792=0+635|uni17D2179B=0@-2,-26+0|uni17BB=0@-19,-296+0|uni17C6=0@-46,-29+0|uni1780=5+636|uni17CB=5@-23,-29+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+1792,U+17D2,U+179B,U+17C4,U+1780,U+17CB;[uni17C1=0+288|uni179217B6=0+923|uni17D2179B=0@-290,-26+0|uni1780=4+636|uni17CB=4@-23,-29+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+1792,U+17D2,U+179B,U+17C5,U+1780,U+17CB;[uni17C1=0+288|uni179217C5=0+923|uni17D2179B=0@-290,-26+0|uni1780=4+636|uni17CB=4@-23,-29+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+1792,U+17D2,U+179B,U+17C6,U+1780,U+17CB;[uni1792=0+635|uni17D2179B=0@-2,-26+0|uni17C6=0@-46,-29+0|uni1780=4+636|uni17CB=4@-23,-29+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+1798,U+17D2,U+178F,U+17D2,U+179B,U+17C9,U+17B6;[uni179817B6=0+923|uni17D2178F=0@-289,-26+0|uni17D2179B=0@-289,-296+0|uni17C9=0@-334,-29+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+1798,U+17D2,U+178F,U+17D2,U+179B,U+17C9,U+17BB;[uni1798=0+635|uni17D2178F=0@-1,-26+0|uni17D2179B=0@-1,-296+0|uni17C9=0@-46,-29+0|uni17BB=0@-18,-566+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+1798,U+17D2,U+178F,U+17D2,U+179B,U+17C9,U+17BF;[uni17C1=0+288|uni1798=0+635|uni17D2178F=0@-1,-26+0|uni17D2179B=0@-1,-296+0|uni17C9=0@-46,-29+0|uni17BF.right1=0+288]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+1798,U+17D2,U+178F,U+17D2,U+179B,U+17C9,U+17C0;[uni17C1=0+288|uni1798=0+635|uni17D2178F=0@-1,-26+0|uni17D2179B=0@-1,-296+0|uni17C9=0@-46,-29+0|uni17C0.right1=0+288]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+1799,U+17D2,U+1799,U+17BE,U+17A0,U+17D2,U+179C,U+17D2,U+179B,U+17C3;[uni17C1=0+288|uni1799=0+953|uni17D21799=0+298|uni17B8=0@1,30+0|uni17C3=4+288|uni17A0=4+928|uni17D2179C=4@20,-26+0|uni17D2179B=4@19,-296+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+179A,U+17D2,U+179A;[uni17D2179A=0+287|uni179A=0+288]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+179F,U+17B6,U+179F,U+17D2,U+178F,U+17D2,U+179A,U+1783,U+17D2,U+1788,U+1784,U+17B6;[uni179F17B6=0+1216|uni17D2179A=2+287|uni179F=2+928|uni17D2178F=2@14,-26+0|uni1783=7+928|uni17D21788=7+234|uni178417B6=10+923]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+179F,U+17B6,U+179F,U+17D2,U+178F,U+17D2,U+179A,U+1783,U+17D2,U+1788,U+1784,U+17B7;[uni179F17B6=0+1216|uni17D2179A=2+287|uni179F=2+928|uni17D2178F=2@14,-26+0|uni1783=7+928|uni17D21788=7+234|uni1784=10+635|uni17B7=10@-46,30+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+179F,U+17B6,U+179F,U+17D2,U+178F,U+17D2,U+179A,U+1783,U+17D2,U+1788,U+1784,U+17B8;[uni179F17B6=0+1216|uni17D2179A=2+287|uni179F=2+928|uni17D2178F=2@14,-26+0|uni1783=7+928|uni17D21788=7+234|uni1784=10+635|uni17B8=10@-46,30+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+179F,U+17D2,U+178F,U+17D2,U+179A,U+17B8,U+179C,U+17D0,U+1781,U+17D2,U+1789,U+17D2,U+179F,U+17B6;[uni17D2179A=0+287|uni179F=0+928|uni17D2178F=0@14,-26+0|uni17B8=0@-32,-29+0|uni179C=6+326|uni17D0=6@139,40+0|uni1781=8+635|uni17D21789=8@-4,-26+0|uni17D2179F17B6.low=8+584]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+179F,U+17D2,U+179A,U+17D2,U+178F,U+17B6;[uni17D2179A=0+287|uni179F17B6=0+1216|uni17D2178F=0@-274,-26+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+179F,U+17D2,U+179A,U+17D2,U+178F,U+17B7;[uni17D2179A=0+287|uni179F=0+928|uni17D2178F=0@14,-26+0|uni17B7=0@-32,-29+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+179F,U+17D2,U+179A,U+17D2,U+178F,U+17B8;[uni17D2179A=0+287|uni179F=0+928|uni17D2178F=0@14,-26+0|uni17B8=0@-32,-29+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+179F,U+17D2,U+179A,U+17D2,U+178F,U+17B9;[uni17D2179A=0+287|uni179F=0+928|uni17D2178F=0@14,-26+0|uni17B9=0@-32,-29+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+179F,U+17D2,U+179A,U+17D2,U+178F,U+17BA;[uni17D2179A=0+287|uni179F=0+928|uni17D2178F=0@14,-26+0|uni17BA=0@-32,-29+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+179F,U+17D2,U+179A,U+17D2,U+178F,U+17BB;[uni17D2179A=0+287|uni179F=0+928|uni17D2178F=0@14,-26+0|uni17BB=0@-6,-296+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+179F,U+17D2,U+179A,U+17D2,U+178F,U+17BC;[uni17D2179A=0+287|uni179F=0+928|uni17D2178F=0@14,-26+0|uni17BC=0@-6,-296+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+179F,U+17D2,U+179A,U+17D2,U+178F,U+17BD;[uni17D2179A=0+287|uni179F=0+928|uni17D2178F=0@14,-26+0|uni17BD=0@-6,-296+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+179F,U+17D2,U+179A,U+17D2,U+178F,U+17BE;[uni17C1=0+288|uni17D2179A=0+287|uni179F=0+928|uni17D2178F=0@14,-26+0|uni17B8=0@-32,-29+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+179F,U+17D2,U+179A,U+17D2,U+178F,U+17BF;[uni17C1=0+288|uni17D2179A=0+287|uni179F=0+928|uni17D2178F=0@14,-26+0|uni17BF.right2=0+288]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+179F,U+17D2,U+179A,U+17D2,U+178F,U+17CA,U+17BF;[uni17C1=0+288|uni17D2179A=0+287|uni179F=0+928|uni17D2178F=0@14,-26+0|uni17CA=0@-32,-29+0|uni17BF.right1=0+288]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+179F,U+17D2,U+179A,U+17D2,U+178F,U+17CA,U+17C0;[uni17C1=0+288|uni17D2179A=0+287|uni179F=0+928|uni17D2178F=0@14,-26+0|uni17CA=0@-32,-29+0|uni17C0.right1.high=0+288]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+179F,U+17D2,U+179A,U+17D2,U+178F,U+17CA,U+17C1;[uni17C1=0+288|uni17D2179A=0+287|uni179F=0+928|uni17D2178F=0@14,-26+0|uni17CA=0@-32,-29+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+179F,U+17D2,U+179A,U+17D2,U+178F,U+17CA,U+17C2;[uni17C2=0+288|uni17D2179A=0+287|uni179F=0+928|uni17D2178F=0@14,-26+0|uni17CA=0@-32,-29+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+179F,U+17D2,U+179A,U+17D2,U+178F,U+17CA,U+17C3;[uni17C3=0+288|uni17D2179A=0+287|uni179F=0+928|uni17D2178F=0@14,-26+0|uni17CA=0@-32,-29+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+179F,U+17D2,U+179A,U+17D2,U+178F,U+17CA,U+17C6;[uni17D2179A=0+287|uni179F=0+928|uni17D2178F=0@14,-26+0|uni17CA=0@-32,-29+0|uni17C6=0@-32,113+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+17A0,U+17D2,U+1782,U+17D2,U+179F,U+17CA,U+17BE;[uni17C1=0+288|uni17A0=0+928|uni17D21782=0@20,-26+0|uni17D2179F.low=0+302|uni17BB=0+0|uni17B8=0@-4,30+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+17A0,U+17D2,U+1782,U+17D2,U+179F,U+17CA,U+17BF;[uni17C1=0+288|uni17A0=0+928|uni17D21782=0@20,-26+0|uni17D2179F.low=0+302|uni17CA=0@-4,30+0|uni17BF.right1=0+288]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+17A0,U+17D2,U+1782,U+17D2,U+179F,U+17CA,U+17C0;[uni17C1=0+288|uni17A0=0+928|uni17D21782=0@20,-26+0|uni17D2179F.low=0+302|uni17CA=0@-4,30+0|uni17C0.right1.high=0+288]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+17A0,U+17D2,U+179A,U+17D2,U+179C,U+1784,U+17D2,U+1780;[uni17D2179A=0+287|uni17A0=0+928|uni17D2179C=0@20,-26+0|uni1784=5+635|uni17D21780=5@0,-26+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf;;U+17A0,U+17D2,U+179A,U+17D2,U+179C,U+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]
diff --git a/test/shape/data/in-house/tests/language-tags.tests b/test/shape/data/in-house/tests/language-tags.tests
new file mode 100644 (file)
index 0000000..9fb3faf
--- /dev/null
@@ -0,0 +1,13 @@
+../fonts/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf;--language=fa;U+004A;[gid2=0+1000]
+../fonts/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf;--language=ja;U+004A;[gid2=0+1000]
+../fonts/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf;--language=zh;U+004A;[gid4=0+1000]
+../fonts/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf;--language=zh-cn;U+004A;[gid4=0+1000]
+../fonts/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf;--language=zh-sg;U+004A;[gid4=0+1000]
+../fonts/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf;--language=zh-tw;U+004A;[gid5=0+1000]
+../fonts/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf;--language=zh-hans;U+004A;[gid4=0+1000]
+../fonts/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf;--language=zh-hant;U+004A;[gid5=0+1000]
+../fonts/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf;--language=zh-hant-hk;U+004A;[gid6=0+1000]
+../fonts/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf;--language=zh-HK;U+004A;[gid6=0+1000]
+../fonts/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf;--language=zh-mo;U+004A;[gid6=0+1000]
+../fonts/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf;--language=zh-Hant-mo;U+004A;[gid6=0+1000]
+../fonts/d3129450fafe5e5c98cfc25a4e71809b1b4d2855.ttf;--language=dv --no-glyph-names;U+007C;[2=0+156]
diff --git a/test/shape/data/in-house/tests/ligature-id.tests b/test/shape/data/in-house/tests/ligature-id.tests
new file mode 100644 (file)
index 0000000..5fd5825
--- /dev/null
@@ -0,0 +1,37 @@
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf;;U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2;[u0995_u09CD.half_u0995.pres=0+566|space=3+213|u0995_u09B0_u09CD.blwf.vatu=4+643|u0995_u09CD.half_u09B2.pres=7+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf;;U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2;[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|space=6+213|u0995_u09B0_u09CD.blwf.vatu=7+643|u0995_u09CD.half_u09B2.pres=10+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf;;U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2;[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|space=9+213|u0995_u09B0_u09CD.blwf.vatu=10+643|u0995_u09CD.half_u09B2.pres=13+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf;;U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2;[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|space=12+213|u0995_u09B0_u09CD.blwf.vatu=13+643|u0995_u09CD.half_u09B2.pres=16+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf;;U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2;[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|space=15+213|u0995_u09B0_u09CD.blwf.vatu=16+643|u0995_u09CD.half_u09B2.pres=19+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf;;U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2;[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|space=18+213|u0995_u09B0_u09CD.blwf.vatu=19+643|u0995_u09CD.half_u09B2.pres=22+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf;;U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2;[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|space=21+213|u0995_u09B0_u09CD.blwf.vatu=22+643|u0995_u09CD.half_u09B2.pres=25+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf;;U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2;[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|space=24+213|u0995_u09B0_u09CD.blwf.vatu=25+643|u0995_u09CD.half_u09B2.pres=28+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf;;U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2;[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|space=27+213|u0995_u09B0_u09CD.blwf.vatu=28+643|u0995_u09CD.half_u09B2.pres=31+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf;;U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2;[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|space=30+213|u0995_u09B0_u09CD.blwf.vatu=31+643|u0995_u09CD.half_u09B2.pres=34+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf;;U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2;[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|space=33+213|u0995_u09B0_u09CD.blwf.vatu=34+643|u0995_u09CD.half_u09B2.pres=37+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf;;U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2;[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|space=36+213|u0995_u09B0_u09CD.blwf.vatu=37+643|u0995_u09CD.half_u09B2.pres=40+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf;;U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2;[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|space=39+213|u0995_u09B0_u09CD.blwf.vatu=40+643|u0995_u09CD.half_u09B2.pres=43+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf;;U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2;[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|space=42+213|u0995_u09B0_u09CD.blwf.vatu=43+643|u0995_u09CD.half_u09B2.pres=46+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf;;U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2;[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|space=45+213|u0995_u09B0_u09CD.blwf.vatu=46+643|u0995_u09CD.half_u09B2.pres=49+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf;;U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2;[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|space=48+213|u0995_u09B0_u09CD.blwf.vatu=49+643|u0995_u09CD.half_u09B2.pres=52+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf;;U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2;[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|space=51+213|u0995_u09B0_u09CD.blwf.vatu=52+643|u0995_u09CD.half_u09B2.pres=55+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf;;U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2;[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|space=54+213|u0995_u09B0_u09CD.blwf.vatu=55+643|u0995_u09CD.half_u09B2.pres=58+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf;;U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2;[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|space=57+213|u0995_u09B0_u09CD.blwf.vatu=58+643|u0995_u09CD.half_u09B2.pres=61+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf;;U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2;[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|space=60+213|u0995_u09B0_u09CD.blwf.vatu=61+643|u0995_u09CD.half_u09B2.pres=64+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf;;U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2;[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|space=63+213|u0995_u09B0_u09CD.blwf.vatu=64+643|u0995_u09CD.half_u09B2.pres=67+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf;;U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2;[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|space=66+213|u0995_u09B0_u09CD.blwf.vatu=67+643|u0995_u09CD.half_u09B2.pres=70+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf;;U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2;[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|u0995_u09CD.half_u0995.pres=66+566|space=69+213|u0995_u09B0_u09CD.blwf.vatu=70+643|u0995_u09CD.half_u09B2.pres=73+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf;;U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2;[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|u0995_u09CD.half_u0995.pres=66+566|u0995_u09CD.half_u0995.pres=69+566|space=72+213|u0995_u09B0_u09CD.blwf.vatu=73+643|u0995_u09CD.half_u09B2.pres=76+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf;;U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2;[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|u0995_u09CD.half_u0995.pres=66+566|u0995_u09CD.half_u0995.pres=69+566|u0995_u09CD.half_u0995.pres=72+566|space=75+213|u0995_u09B0_u09CD.blwf.vatu=76+643|u0995_u09CD.half_u09B2.pres=79+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf;;U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2;[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|u0995_u09CD.half_u0995.pres=66+566|u0995_u09CD.half_u0995.pres=69+566|u0995_u09CD.half_u0995.pres=72+566|u0995_u09CD.half_u0995.pres=75+566|space=78+213|u0995_u09B0_u09CD.blwf.vatu=79+643|u0995_u09CD.half_u09B2.pres=82+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf;;U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2;[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|u0995_u09CD.half_u0995.pres=66+566|u0995_u09CD.half_u0995.pres=69+566|u0995_u09CD.half_u0995.pres=72+566|u0995_u09CD.half_u0995.pres=75+566|u0995_u09CD.half_u0995.pres=78+566|space=81+213|u0995_u09B0_u09CD.blwf.vatu=82+643|u0995_u09CD.half_u09B2.pres=85+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf;;U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2;[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|u0995_u09CD.half_u0995.pres=66+566|u0995_u09CD.half_u0995.pres=69+566|u0995_u09CD.half_u0995.pres=72+566|u0995_u09CD.half_u0995.pres=75+566|u0995_u09CD.half_u0995.pres=78+566|u0995_u09CD.half_u0995.pres=81+566|space=84+213|u0995_u09B0_u09CD.blwf.vatu=85+643|u0995_u09CD.half_u09B2.pres=88+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf;;U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2;[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|u0995_u09CD.half_u0995.pres=66+566|u0995_u09CD.half_u0995.pres=69+566|u0995_u09CD.half_u0995.pres=72+566|u0995_u09CD.half_u0995.pres=75+566|u0995_u09CD.half_u0995.pres=78+566|u0995_u09CD.half_u0995.pres=81+566|u0995_u09CD.half_u0995.pres=84+566|space=87+213|u0995_u09B0_u09CD.blwf.vatu=88+643|u0995_u09CD.half_u09B2.pres=91+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf;;U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2;[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|u0995_u09CD.half_u0995.pres=66+566|u0995_u09CD.half_u0995.pres=69+566|u0995_u09CD.half_u0995.pres=72+566|u0995_u09CD.half_u0995.pres=75+566|u0995_u09CD.half_u0995.pres=78+566|u0995_u09CD.half_u0995.pres=81+566|u0995_u09CD.half_u0995.pres=84+566|u0995_u09CD.half_u0995.pres=87+566|space=90+213|u0995_u09B0_u09CD.blwf.vatu=91+643|u0995_u09CD.half_u09B2.pres=94+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf;;U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2;[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|u0995_u09CD.half_u0995.pres=66+566|u0995_u09CD.half_u0995.pres=69+566|u0995_u09CD.half_u0995.pres=72+566|u0995_u09CD.half_u0995.pres=75+566|u0995_u09CD.half_u0995.pres=78+566|u0995_u09CD.half_u0995.pres=81+566|u0995_u09CD.half_u0995.pres=84+566|u0995_u09CD.half_u0995.pres=87+566|u0995_u09CD.half_u0995.pres=90+566|space=93+213|u0995_u09B0_u09CD.blwf.vatu=94+643|u0995_u09CD.half_u09B2.pres=97+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf;;U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2;[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|u0995_u09CD.half_u0995.pres=66+566|u0995_u09CD.half_u0995.pres=69+566|u0995_u09CD.half_u0995.pres=72+566|u0995_u09CD.half_u0995.pres=75+566|u0995_u09CD.half_u0995.pres=78+566|u0995_u09CD.half_u0995.pres=81+566|u0995_u09CD.half_u0995.pres=84+566|u0995_u09CD.half_u0995.pres=87+566|u0995_u09CD.half_u0995.pres=90+566|u0995_u09CD.half_u0995.pres=93+566|space=96+213|u0995_u09B0_u09CD.blwf.vatu=97+643|u0995_u09CD.half_u09B2.pres=100+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf;;U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2;[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|u0995_u09CD.half_u0995.pres=66+566|u0995_u09CD.half_u0995.pres=69+566|u0995_u09CD.half_u0995.pres=72+566|u0995_u09CD.half_u0995.pres=75+566|u0995_u09CD.half_u0995.pres=78+566|u0995_u09CD.half_u0995.pres=81+566|u0995_u09CD.half_u0995.pres=84+566|u0995_u09CD.half_u0995.pres=87+566|u0995_u09CD.half_u0995.pres=90+566|u0995_u09CD.half_u0995.pres=93+566|u0995_u09CD.half_u0995.pres=96+566|space=99+213|u0995_u09B0_u09CD.blwf.vatu=100+643|u0995_u09CD.half_u09B2.pres=103+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf;;U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2;[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|u0995_u09CD.half_u0995.pres=66+566|u0995_u09CD.half_u0995.pres=69+566|u0995_u09CD.half_u0995.pres=72+566|u0995_u09CD.half_u0995.pres=75+566|u0995_u09CD.half_u0995.pres=78+566|u0995_u09CD.half_u0995.pres=81+566|u0995_u09CD.half_u0995.pres=84+566|u0995_u09CD.half_u0995.pres=87+566|u0995_u09CD.half_u0995.pres=90+566|u0995_u09CD.half_u0995.pres=93+566|u0995_u09CD.half_u0995.pres=96+566|u0995_u09CD.half_u0995.pres=99+566|space=102+213|u0995_u09B0_u09CD.blwf.vatu=103+643|u0995_u09CD.half_u09B2.pres=106+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf;;U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2;[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|u0995_u09CD.half_u0995.pres=66+566|u0995_u09CD.half_u0995.pres=69+566|u0995_u09CD.half_u0995.pres=72+566|u0995_u09CD.half_u0995.pres=75+566|u0995_u09CD.half_u0995.pres=78+566|u0995_u09CD.half_u0995.pres=81+566|u0995_u09CD.half_u0995.pres=84+566|u0995_u09CD.half_u0995.pres=87+566|u0995_u09CD.half_u0995.pres=90+566|u0995_u09CD.half_u0995.pres=93+566|u0995_u09CD.half_u0995.pres=96+566|u0995_u09CD.half_u0995.pres=99+566|u0995_u09CD.half_u0995.pres=102+566|space=105+213|u0995_u09B0_u09CD.blwf.vatu=106+643|u0995_u09CD.half_u09B2.pres=109+602]
+../fonts/a6c76d1bafde4a0b1026ebcc932d2e5c6fd02442.ttf;;U+1004,U+103A,U+1039,U+101B,U+103D,U+102D;[uni101B103D=0+450|uni1004103A1039102D=0@-50,0+0]
+../fonts/b31e6c52a31edadc16f1bec9efe6019e2d59824a.ttf;;U+0644,U+064E,U+0644,U+064F,U+0647;[LIG=0+1200|uni064F=0@-216,196+0|uni064E=0@233,46+0|lam_lam_hehar=0+1200]
diff --git a/test/shape/data/in-house/tests/macos.tests b/test/shape/data/in-house/tests/macos.tests
new file mode 100644 (file)
index 0000000..2bf221a
--- /dev/null
@@ -0,0 +1,143 @@
+# https://github.com/harfbuzz/harfbuzz/issues/3314
+/System/Library/Fonts/Apple\ Color\ Emoji.ttc;;U+05D0,U+1F1FA,U+1F1F8,U+1F1EE,U+1F1F1;[u1F1EE_u1F1F1=3+800|u1F1FA_u1F1F8=1+800|.notdef=0+800]
+
+# https;//github.com/harfbuzz/harfbuzz/issues/3008
+/System/Library/Fonts/ヒラギノ丸ゴ\ ProN\ W4.ttc;--features=palt;U+FF11;[gid781=0@-78,0+842]
+
+# https;//github.com/harfbuzz/harfbuzz/pull/2871
+/System/Library/Fonts/LucidaGrande.ttc;--font-funcs ot --show-flags;U+0041,U+0042,U+0043,U+0044;[A=0+1413|B=1+1178|C=2+1417|D=3+1534]
+
+# 10.12.6 https;//gist.github.com/ebraminio/1704341fa16b06979e605aafd88198cf
+/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;--font-funcs ot;U+006D,U+0300;[mgrave=0+1912]
+/System/Library/Fonts/Times.dfont@39c954614d3f3317b28564db06d5b7b7a6ff0e39;--font-funcs ot;U+0066,U+0069;[fi=0+1139]
+/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;--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;--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@d89a9d7e57767bfe3b5a4cfd22bb1e9dbe03a062;--font-funcs ot;U+05E1,U+05B0;[shevahebrew=0@51,0+0|samekhhebrew=0+1361]
+/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]
+/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;--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@-372,120+-372|u0644_u0623.isolated.lamHamzaOnAlef=1@120,0+1282|u0627.alef=0+647]
+/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;--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+064F;[u064f.damma=0@250,-250+250|u0628.beh=0@-250,0+1165]
+/System/Library/Fonts/GeezaPro.ttc@f43ee7151c2e9f1dddfbc26cfc148609eb5c5820;--font-funcs ot;U+0644,U+064E,U+0645,U+064E,U+0651,U+0627;[u0627.final.alef=5+647|u064e.fatha=0@-80,160+-80|u064e_u0651.shaddaFatha=0@490,250+490|u0644_u0645.initial.lamMeem=0@-410,0+415]
+/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@65,0+1235|gid584=1@-40,0+1109|gid3=2@65,0+620|gid4=3@65,0+1357|gid265=4+1357|gid3=5@65,0+620|gid225=6@65,0+1260|gid728=7@-15,0+699|gid3=8@65,0+620|gid265=9@65,0+1357|gid505=10+1127|gid3=11@65,0+620|gid728=12@65,0+739|gid225=13@25,0+1300|gid3=14@65,0+620|gid584=15@65,0+1134|gid225=16@-15,0+1260|gid3=17@65,0+620|gid225=18@65,0+1235|gid576=19@-40,0+1198]
+/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]
+/Library/Fonts/Zapfino.ttf@9ee799ffb09516ead6b0cf6f2ca807276e150748;--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]
+# https;//github.com/harfbuzz/harfbuzz/pull/2130
+/System/Library/Fonts/ヒラギノ明朝 ProN W3.ttc@e3bd65c7209ceab2c70ef22d3ebe0967ab319ed3;--font-funcs ot --direction=ttb;U+005B,U+0048,U+0065,U+006C,U+006C,U+006F,U+0034,U+005D;[gid60=0@-157,-880+0,-1000|gid41=1@-398,-880+0,-1000|gid70=2@-267,-880+0,-1000|gid77=3@-148,-880+0,-1000|gid77=4@-148,-880+0,-1000|gid80=5@-291,-880+0,-1000|gid21=6@-294,-880+0,-1000|gid62=7@-157,-880+0,-1000]
+/System/Library/Fonts/Times.dfont@39c954614d3f3317b28564db06d5b7b7a6ff0e39;--font-funcs ot;U+0066,U+0069,U+006e,U+0065;[fi=0+1139|n=2+1024|e=3+909]
+/System/Library/Fonts/Times.dfont@39c954614d3f3317b28564db06d5b7b7a6ff0e39;--font-funcs ot --features liga=0;U+0066,U+0069,U+006e,U+0065;[f=0+682|i=1+569|n=2+1024|e=3+909]
+/Library/Fonts/Kokonor.ttf@fe9d518bb4e20e77f7a0444c82f4d41467dd714d;--font-funcs ot;U+0F62,U+0F92,U+0FB1,U+0F74;[r_g_y_u=0+1579]
+/Library/Fonts/Kokonor.ttf@fe9d518bb4e20e77f7a0444c82f4d41467dd714d;--font-funcs ot --features liga=0;U+0F62,U+0F92,U+0FB1,U+0F74;[r_g_y_u=0+1579]
+/Library/Fonts/Apple Chancery.ttf@5fc49ae9bce39e2105864323183b68ea34c9e562;--font-funcs ot;U+0066,U+0069,U+0072,U+0073,U+0074;[f_i=0+1097|r=2+853|s=3+728|t=4+725]
+/Library/Fonts/Apple Chancery.ttf@5fc49ae9bce39e2105864323183b68ea34c9e562;--font-funcs ot --features dlig=1;U+0066,U+0069,U+0072,U+0073,U+0074;[f_i=0+1097|r=2+853|s_t=3+1438]
+/Library/Fonts/Apple Chancery.ttf@5fc49ae9bce39e2105864323183b68ea34c9e562;--font-funcs ot --features liga=0;U+0066,U+0069,U+0072,U+0073,U+0074;[f=0+639|i=1+606|r=2+853|s=3+728|t=4+725]
+/Library/Fonts/Apple Chancery.ttf@5fc49ae9bce39e2105864323183b68ea34c9e562;--font-funcs ot --features dlig=1,sups=0,tnum=0;U+0066,U+0069,U+0072,U+0073,U+0074;[f_i=0+1097|r=2+853|s_t=3+1438]
+/Library/Fonts/Apple Chancery.ttf@5fc49ae9bce39e2105864323183b68ea34c9e562;--font-funcs ot --features liga=0,sups=0,tnum=0;U+0066,U+0069,U+0072,U+0073,U+0074;[f=0+639|i=1+606|r=2+853|s=3+728|t=4+725]
+/Library/Fonts/Apple Chancery.ttf@5fc49ae9bce39e2105864323183b68ea34c9e562;--font-funcs ot --features smcp=1;U+0066,U+0069,U+0072,U+0073,U+0074;[F.small=0+903|I.small=1+634|R.small=2+1113|S.small=3+911|T.small=4+1075]
+/Library/Fonts/Apple Chancery.ttf@5fc49ae9bce39e2105864323183b68ea34c9e562;--font-funcs ot --features liga=0,dlig=1;U+0066,U+0069,U+0072,U+0073,U+0074;[f=0+639|i=1+606|r=2+853|s_t=3+1438]
+
+# 10.13.6 https;//gist.github.com/ebraminio/d432e831b3f7ebe30245dde5775e1c7e
+/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;--font-funcs ot;U+006D,U+0300;[mgrave=0+1912]
+/System/Library/Fonts/Times.ttc@896098b6979306ad84355025459f7c68b029139c;--font-funcs ot;U+0066,U+0069;[fi=0+1139]
+/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;--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;--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@-372,120+-372|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/GeezaPro.ttc@ab26ea45dcaa5e1c5a958e42af10e10d330e7334;--font-funcs ot;U+0644,U+064E,U+0645,U+064E,U+0651,U+0627;[u0627.final.alef=5+647|u064e.fatha=0@-80,160+-80|u064e_u0651.shaddaFatha=0@490,250+490|u0644_u0645.initial.lamMeem=0@-410,0+415]
+/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@65,0+1185|gid658=1@-70,0+1044|gid3=2@65,0+550|gid4=3@65,0+1357|gid332=4+1357|gid3=5@65,0+550|gid282=6@65,0+1205|gid813=7@-50,0+646|gid3=8@65,0+550|gid332=9@65,0+1347|gid572=10@-10,0+1083|gid3=11@65,0+550|gid813=12@65,0+676|gid282=13@-20,0+1235|gid3=14@65,0+550|gid658=15@65,0+1044|gid282=16@-70,0+1185|gid3=17@65,0+550|gid282=18@65,0+1185|gid649=19@-70,0+1129]
+/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]
+/System/Library/Fonts/Thonburi.ttc@bb080e01e45f7f6699d2df09a03b3b6d13804897;--font-funcs ot;U+0E17,U+0E35,U+0E48,U+0E4A;[thothahanthai_saraiithai_maiekthai=0+1616|maitrithai.key=0+1300]
+/System/Library/Fonts/Times.ttc@896098b6979306ad84355025459f7c68b029139c;--font-funcs ot;U+0066,U+0069,U+006e,U+0065;[fi=0+1139|n=2+1024|e=3+909]
+/System/Library/Fonts/Times.ttc@896098b6979306ad84355025459f7c68b029139c;--font-funcs ot --features liga=0;U+0066,U+0069,U+006e,U+0065;[f=0+682|i=1+569|n=2+1024|e=3+909]
+/Library/Fonts/Kokonor.ttf@14a5c850ba917d9ec9f6bb9b1fc59b1d95512da4;--font-funcs ot;U+0F62,U+0F92,U+0FB1,U+0F74;[r_g_y_u=0+1579]
+/Library/Fonts/Kokonor.ttf@14a5c850ba917d9ec9f6bb9b1fc59b1d95512da4;--font-funcs ot --features liga=0;U+0F62,U+0F92,U+0FB1,U+0F74;[r_g_y_u=0+1579]
+/Library/Fonts/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac;--font-funcs ot;U+0066,U+0069,U+0072,U+0073,U+0074;[f_i=0+1097|r=2+853|s=3+728|t=4+725]
+/Library/Fonts/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac;--font-funcs ot --features dlig=1;U+0066,U+0069,U+0072,U+0073,U+0074;[f_i=0+1097|r=2+853|s_t=3+1438]
+/Library/Fonts/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac;--font-funcs ot --features liga=0;U+0066,U+0069,U+0072,U+0073,U+0074;[f=0+639|i=1+606|r=2+853|s=3+728|t=4+725]
+/Library/Fonts/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac;--font-funcs ot --features dlig=1,sups=0,tnum=0;U+0066,U+0069,U+0072,U+0073,U+0074;[f_i=0+1097|r=2+853|s_t=3+1438]
+/Library/Fonts/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac;--font-funcs ot --features liga=0,sups=0,tnum=0;U+0066,U+0069,U+0072,U+0073,U+0074;[f=0+639|i=1+606|r=2+853|s=3+728|t=4+725]
+/Library/Fonts/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac;--font-funcs ot --features smcp=1;U+0066,U+0069,U+0072,U+0073,U+0074;[F.small=0+903|I.small=1+634|R.small=2+1113|S.small=3+911|T.small=4+1075]
+/Library/Fonts/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac;--font-funcs ot --features liga=0,dlig=1;U+0066,U+0069,U+0072,U+0073,U+0074;[f=0+639|i=1+606|r=2+853|s_t=3+1438]
+
+# 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@-372,120+-372|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/GeezaPro.ttc@ab26ea45dcaa5e1c5a958e42af10e10d330e7334;--font-funcs ot;U+0644,U+064E,U+0645,U+064E,U+0651,U+0627;[u0627.final.alef=5+647|u064e.fatha=0@-80,160+-80|u064e_u0651.shaddaFatha=0@490,250+490|u0644_u0645.initial.lamMeem=0@-410,0+415]
+/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@65,0+1185|gid659=1@-70,0+1044|gid3=2@65,0+550|gid4=3@65,0+1357|gid333=4+1357|gid3=5@65,0+550|gid283=6@65,0+1205|gid815=7@-50,0+646|gid3=8@65,0+550|gid333=9@65,0+1347|gid573=10@-10,0+1083|gid3=11@65,0+550|gid815=12@65,0+676|gid283=13@-20,0+1235|gid3=14@65,0+550|gid659=15@65,0+1044|gid283=16@-70,0+1185|gid3=17@65,0+550|gid283=18@65,0+1185|gid650=19@-70,0+1129]
+/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]
+/System/Library/Fonts/Thonburi.ttc@bb080e01e45f7f6699d2df09a03b3b6d13804897;--font-funcs ot;U+0E17,U+0E35,U+0E48,U+0E4A;[thothahanthai_saraiithai_maiekthai=0+1616|maitrithai.key=0+1300]
+/System/Library/Fonts/Times.ttc@ebb050e4fcaaebe9992efbc7b5660b60ba18b518;--font-funcs ot;U+0066,U+0069,U+006e,U+0065;[fi=0+1139|n=2+1024|e=3+909]
+/System/Library/Fonts/Times.ttc@ebb050e4fcaaebe9992efbc7b5660b60ba18b518;--font-funcs ot --features liga=0;U+0066,U+0069,U+006e,U+0065;[f=0+682|i=1+569|n=2+1024|e=3+909]
+/Library/Fonts/Kokonor.ttf@14a5c850ba917d9ec9f6bb9b1fc59b1d95512da4;--font-funcs ot;U+0F62,U+0F92,U+0FB1,U+0F74;[r_g_y_u=0+1579]
+/Library/Fonts/Kokonor.ttf@14a5c850ba917d9ec9f6bb9b1fc59b1d95512da4;--font-funcs ot --features liga=0;U+0F62,U+0F92,U+0FB1,U+0F74;[r_g_y_u=0+1579]
+/Library/Fonts/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac;--font-funcs ot;U+0066,U+0069,U+0072,U+0073,U+0074;[f_i=0+1097|r=2+853|s=3+728|t=4+725]
+/Library/Fonts/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac;--font-funcs ot --features dlig=1;U+0066,U+0069,U+0072,U+0073,U+0074;[f_i=0+1097|r=2+853|s_t=3+1438]
+/Library/Fonts/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac;--font-funcs ot --features liga=0;U+0066,U+0069,U+0072,U+0073,U+0074;[f=0+639|i=1+606|r=2+853|s=3+728|t=4+725]
+/Library/Fonts/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac;--font-funcs ot --features dlig=1,sups=0,tnum=0;U+0066,U+0069,U+0072,U+0073,U+0074;[f_i=0+1097|r=2+853|s_t=3+1438]
+/Library/Fonts/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac;--font-funcs ot --features liga=0,sups=0,tnum=0;U+0066,U+0069,U+0072,U+0073,U+0074;[f=0+639|i=1+606|r=2+853|s=3+728|t=4+725]
+/Library/Fonts/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac;--font-funcs ot --features smcp=1;U+0066,U+0069,U+0072,U+0073,U+0074;[F.small=0+903|I.small=1+634|R.small=2+1113|S.small=3+911|T.small=4+1075]
+/Library/Fonts/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac;--font-funcs ot --features liga=0,dlig=1;U+0066,U+0069,U+0072,U+0073,U+0074;[f=0+639|i=1+606|r=2+853|s_t=3+1438]
+
+# 10.15 https;//gist.github.com/ebraminio/d52dd780fec59f8e2dfffe8e1a841823
+/System/Library/Fonts/Helvetica.ttc@98c12f0d63168b20635fb51d638929753b4e6aed;--font-funcs ot;U+006D,U+0300;[m=0+1706|gravecmb=0@-284,10+0]
+/System/Library/Fonts/LucidaGrande.ttc@b2b9aa73d0d9ddabbe73549949fc7444b8528cc2;--font-funcs ot;U+006D,U+0300;[mgrave=0+1912]
+/System/Library/Fonts/Times.ttc@e9b4f626133de3b22787ee025218c6c799cc3ceb;--font-funcs ot;U+0066,U+0069;[fi=0+1139]
+/System/Library/Fonts/Supplemental/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]
+/System/Library/Fonts/Supplemental/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@e9b4f626133de3b22787ee025218c6c799cc3ceb;--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@b2b9aa73d0d9ddabbe73549949fc7444b8528cc2;--font-funcs ot;U+05E1,U+05B0;[shevahebrew=0@51,0+0|samekhhebrew=0+1361]
+/System/Library/Fonts/Supplemental/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/Supplemental/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@-372,120+-372|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/GeezaPro.ttc@ab26ea45dcaa5e1c5a958e42af10e10d330e7334;--font-funcs ot;U+0644,U+064E,U+0645,U+064E,U+0651,U+0627;[u0627.final.alef=5+647|u064e.fatha=0@-80,160+-80|u064e_u0651.shaddaFatha=0@490,250+490|u0644_u0645.initial.lamMeem=0@-410,0+415]
+# SFNS uses opsz variation axis which isn't invoked here, see https;//crbug.com/1005969#c37
+/System/Library/Fonts/SFNS.ttf@253b4b28662acc1de4a86350fd2b26d620ea213c;--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+920|e=1+1049|space=2+420|A=3+1162|V=4+1292|space=5+420|T=6+960|r=7+631|space=8+420|V=9+1142|a=10+1028|space=11+420|r=12+461|T=13+1190|space=14+420|e=15+779|T=16+1190|space=17+420|T=18+920|d=19+1134]
+/System/Library/Fonts/SFNS.ttf@253b4b28662acc1de4a86350fd2b26d620ea213c;--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;[T=0@19,0+958|e=1@19,0+1087|space=2@19,0+458|A=3@19,0+1200|V=4@19,0+1330|space=5@19,0+458|T=6@19,0+998|r=7@19,0+669|space=8@19,0+458|V=9@19,0+1180|a=10@19,0+1066|space=11@19,0+458|r=12@19,0+499|T=13@19,0+1228|space=14@19,0+458|e=15@19,0+817|T=16@19,0+1228|space=17@19,0+458|T=18@19,0+958|d=19@19,0+1172]
+/System/Library/Fonts/Apple Color Emoji.ttc@ef22d55c551e2af0193d75105346c6e7e21af389;--remove-default-ignorables --font-funcs ot;U+1F468,U+200D,U+1F469,U+200D,U+1F467,U+200D,U+1F466;[u1F46A.MWGB=0+800]
+/System/Library/Fonts/Supplemental/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]
+/System/Library/Fonts/Thonburi.ttc@bb080e01e45f7f6699d2df09a03b3b6d13804897;--font-funcs ot;U+0E17,U+0E35,U+0E48,U+0E4A;[thothahanthai_saraiithai_maiekthai=0+1616|maitrithai.key=0+1300]
+/System/Library/Fonts/Times.ttc@e9b4f626133de3b22787ee025218c6c799cc3ceb;--font-funcs ot;U+0066,U+0069,U+006e,U+0065;[fi=0+1139|n=2+1024|e=3+909]
+/System/Library/Fonts/Times.ttc@e9b4f626133de3b22787ee025218c6c799cc3ceb;--font-funcs ot --features liga=0;U+0066,U+0069,U+006e,U+0065;[f=0+682|i=1+569|n=2+1024|e=3+909]
+/System/Library/Fonts/Supplemental/Kokonor.ttf@14a5c850ba917d9ec9f6bb9b1fc59b1d95512da4;--font-funcs ot;U+0F62,U+0F92,U+0FB1,U+0F74;[r_g_y_u=0+1579]
+/System/Library/Fonts/Supplemental/Kokonor.ttf@14a5c850ba917d9ec9f6bb9b1fc59b1d95512da4;--font-funcs ot --features liga=0;U+0F62,U+0F92,U+0FB1,U+0F74;[r_g_y_u=0+1579]
+/System/Library/Fonts/Supplemental/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac;--font-funcs ot;U+0066,U+0069,U+0072,U+0073,U+0074;[f_i=0+1097|r=2+853|s=3+728|t=4+725]
+/System/Library/Fonts/Supplemental/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac;--font-funcs ot --features dlig=1;U+0066,U+0069,U+0072,U+0073,U+0074;[f_i=0+1097|r=2+853|s_t=3+1438]
+/System/Library/Fonts/Supplemental/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac;--font-funcs ot --features liga=0;U+0066,U+0069,U+0072,U+0073,U+0074;[f=0+639|i=1+606|r=2+853|s=3+728|t=4+725]
+/System/Library/Fonts/Supplemental/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac;--font-funcs ot --features dlig=1,sups=0,tnum=0;U+0066,U+0069,U+0072,U+0073,U+0074;[f_i=0+1097|r=2+853|s_t=3+1438]
+/System/Library/Fonts/Supplemental/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac;--font-funcs ot --features liga=0,sups=0,tnum=0;U+0066,U+0069,U+0072,U+0073,U+0074;[f=0+639|i=1+606|r=2+853|s=3+728|t=4+725]
+/System/Library/Fonts/Supplemental/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac;--font-funcs ot --features smcp=1;U+0066,U+0069,U+0072,U+0073,U+0074;[F.small=0+903|I.small=1+634|R.small=2+1113|S.small=3+911|T.small=4+1075]
+/System/Library/Fonts/Supplemental/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac;--font-funcs ot --features liga=0,dlig=1;U+0066,U+0069,U+0072,U+0073,U+0074;[f=0+639|i=1+606|r=2+853|s_t=3+1438]
+/System/Library/Fonts/Supplemental/Skia.ttf@caee56fc4085009c1a29a863500908050ea6248f;--font-funcs ot;U+0041,U+0056;[A=0+1345|V=1@-12,0+1346]
+/System/Library/Fonts/Supplemental/Devanagari Sangam MN.ttc@214b7ffa672bc936745df5a72644f2b705b24b4b;--font-funcs ot;U+092D,U+0941;[dn_bha=0+1339|dn_u_matra.mrk=0@-296,11+0]
+
+# 11.1
+/System/Library/Fonts/Apple Color Emoji.ttc@6b0fa4926a1c8a32267e93e18c5eff21558de83a;--font-funcs ot;U+1F469,U+1F3FD,U+200D,U+1F91D,U+200D,U+1F468,U+1F3FE;[u1F469.3.L=0+0|space=0+0|space=0+0|u1F468.4.RA=0+800]
diff --git a/test/shape/data/in-house/tests/mark-attachment.tests b/test/shape/data/in-house/tests/mark-attachment.tests
new file mode 100644 (file)
index 0000000..315684e
--- /dev/null
@@ -0,0 +1 @@
+../fonts/98b7887cff91f722b92a8ff800120954606354f9.ttf;;U+100F,U+103C,U+102F,U+1036;[uni103C102F=0+150|uni100F=0+550|uni1036=0@-150,0+0]
diff --git a/test/shape/data/in-house/tests/mark-filtering-sets.tests b/test/shape/data/in-house/tests/mark-filtering-sets.tests
new file mode 100644 (file)
index 0000000..a64e9c7
--- /dev/null
@@ -0,0 +1,5 @@
+../fonts/f22416c692720a7d46fadf4af99f4c9e094f00b9.ttf;;U+062A,U+062E,U+062A,U+0629;[glyph837=3@299,1170+0|uni06C1.1=3+502|glyph837=2@149,690+0|uni0628.8=2+532|glyph836=1@-51,1259+0|glyph514=1+196|glyph837=0@655,1751+0|glyph112=0@0,-358+905]
+../fonts/f22416c692720a7d46fadf4af99f4c9e094f00b9.ttf;;U+062A,U+062E,U+0646,U+0629;[glyph837=3@299,1170+0|uni06C1.1=3+502|glyph836=2@149,690+0|uni0628.8=2+532|glyph836=1@-51,1259+0|glyph514=1+196|glyph837=0@655,1751+0|glyph112=0@0,-358+905]
+../fonts/f22416c692720a7d46fadf4af99f4c9e094f00b9.ttf;;U+062A,U+062E,U+0626,U+0629;[glyph837=3@299,1170+0|uni06C1.1=3+502|glyph847=2@149,690+0|uni0628.8=2+532|glyph836=1@-51,1259+0|glyph514=1+196|glyph837=0@655,1751+0|glyph112=0@0,-358+905]
+../fonts/f22416c692720a7d46fadf4af99f4c9e094f00b9.ttf;;U+062A,U+062E,U+062B,U+0629;[glyph837=3@299,1520+0|uni06C1.1=3+502|glyph838=2@149,690+0|uni0628.8=2+532|glyph836=1@-51,1259+0|glyph514=1+196|glyph837=0@655,1751+0|glyph112=0@0,-358+905]
+../fonts/f22416c692720a7d46fadf4af99f4c9e094f00b9.ttf;;U+062A,U+062E,U+0679,U+0629;[glyph837=3@299,1520+0|uni06C1.1=3+502|glyph842=2@149,690+0|uni0628.8=2+532|glyph836=1@-51,1259+0|glyph514=1+196|glyph837=0@655,1751+0|glyph112=0@0,-358+905]
diff --git a/test/shape/data/in-house/tests/mongolian-variation-selector.tests b/test/shape/data/in-house/tests/mongolian-variation-selector.tests
new file mode 100644 (file)
index 0000000..35b4701
--- /dev/null
@@ -0,0 +1,19 @@
+../fonts/37033cc5cf37bb223d7355153016b6ccece93b28.ttf;;U+1826,U+180B,U+1826;[uni1826.E85E_ue.init1=0+599|uni1826.E856_ue.fina=2+750]
+../fonts/ef86fe710cfea877bbe0dbb6946a1f88d0661031.ttf;;U+1820,U+180B;[uni1820.E821_a.isol1=0+1199]
+../fonts/a34a7b00f22ffb5fd7eef6933b81c7e71bc2cdfb.ttf;;U+180A,U+1868,U+180A,U+1868,U+180B,U+180A,U+1868,U+180C,U+180A,U+1868,U+180D,U+180A;[gid1=0+268|gid10=1+778|gid1=2+268|gid9=3+575|gid1=5+268|gid10=6+778|gid1=8+268|gid8=9+575|gid1=11+268]
+../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf;;U+183A,U+1823,U+182E,U+182B,U+1822,U+1826,U+180B,U+1832,U+180B,U+1827,U+1837;[uni183A1823.E971_ko.init=0+950|uni182E.E904_m.medi=2+400|uni182B1822.E8A6_pi.medi=3+1150|uni1826.E854_ue.medi1=5+1100|uni1832.E916_t.medi1=7+1000|uni1827.E85C_ee.medi=9+750|uni1837.E931_r.fina=10+750]
+../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf;;U+182D,U+182D,U+180B;[uni182D.E8E2_g.init=0+1000|uni182D.E8E8_g.fina1=1+1250]
+../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf;;U+182D,U+180C;[uni182D.EA1B_g.isol2=0+1000]
+../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf;;U+182D,U+180D,U+200D;[uni182D.EA1E_g.init3=0+650|space=0+0]
+../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf;;U+182D,U+200D,U+182D,U+180B,U+200D;[uni182D.E8E2_g.init=0+1000|space=0+0|uni182D.E8E5_g.medi1=2+800|space=2+0]
+../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf;;U+182D,U+180C,U+200D;[uni182D.EA1D_g.init2=0+950|space=0+0]
+../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf;;U+182D,U+180D,U+200D;[uni182D.EA1E_g.init3=0+650|space=0+0]
+../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf;;U+200D,U+182D,U+200D,U+200D,U+182D,U+180B,U+200D;[space=0+0|uni182D.E8E4_g.medi=1+800|space=1+0|space=1+0|uni182D.E8E5_g.medi1=4+800|space=4+0]
+../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf;;U+200D,U+182D,U+180C,U+200D;[space=0+0|uni182D.E8E6_g.medi2=1+650|space=1+0]
+../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf;;U+200D,U+182D,U+180D,U+200D;[space=0+0|uni182D.E8E6_g.medi2=1+650|space=1+0]
+../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf;;U+200D,U+182D,U+200D,U+182D,U+180B;[space=0+0|uni182D.E8E4_g.medi=1+800|space=1+0|uni182D.E8E8_g.fina1=3+1250]
+../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf;;U+200D,U+182D,U+180C;[space=0+0|uni182D.E8E9_g.fina2=1+1050]
+../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf;;U+1820,U+200C,U+182D,U+1820,U+1837;[uni1820.E820_a.isol=0+1550|space=1+0|uni182D.E8E2_g.init=2+1000|uni1820.E823_a.medi=3+400|uni1837.E931_r.fina=4+750]
+../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf;;U+1830,U+1824,U+1837,U+200D,U+200D,U+182D,U+1820,U+200D;[uni1830.E90B_s.init=0+850|uni1824.E844_u.medi=1+600|uni1837.E930_r.medi=2+600|space=2+0|space=2+0|uni182D.E8E5_g.medi1=5+800|uni1820.E823_a.medi=6+400|space=6+0]
+../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf;;U+200D,U+182D,U+1824,U+182F,U+1822;[space=0+0|uni182D.E8E5_g.medi1=1+800|uni1824.E844_u.medi=2+600|uni182F.E908_l.medi=3+400|uni1822.E837_i.fina=4+600]
+../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf;;U+182A,U+1820,U+1822,U+182D,U+180E,U+1820,U+202F,U+1836,U+1822,U+1828;[uni182A1820.E875_ba.init=0+1000|uni1822.E836_i.medi2=2+1000|uni182D.E8E8_g.fina1=3+1250|uni180E.E80E_mvs=4+0|uni1820.E827_a.fina2=5+600|uni202F.nobreak=6+500|uni1836.E92B_y.init1=7+500|uni1822.E834_i.medi=8+500|uni1828.E866_n.fina=9+850]
diff --git a/test/shape/data/in-house/tests/myanmar-misc.tests b/test/shape/data/in-house/tests/myanmar-misc.tests
new file mode 100644 (file)
index 0000000..5273863
--- /dev/null
@@ -0,0 +1 @@
+../fonts/065b01e54f35f0d849fd43bd5b936212739a50cb.ttf;;U+101A,U+1035;[ya_e_above=0+1000]
diff --git a/test/shape/data/in-house/tests/myanmar-syllable.tests b/test/shape/data/in-house/tests/myanmar-syllable.tests
new file mode 100644 (file)
index 0000000..65a4b0b
--- /dev/null
@@ -0,0 +1 @@
+../fonts/af3086380b743099c54a3b11b96766039ea62fcd.ttf;--no-glyph-names;U+101D,U+FE00,U+1031,U+FE00,U+1031,U+FE00;[6=0+465|6=0+465|5=0+502]
diff --git a/test/shape/data/in-house/tests/myanmar-zawgyi.tests b/test/shape/data/in-house/tests/myanmar-zawgyi.tests
new file mode 100644 (file)
index 0000000..b31435f
--- /dev/null
@@ -0,0 +1 @@
+../fonts/ab14b4eb9d7a67e293f51d30d719add06c9d6e06.ttf;--script=Qaag;U+1000,U+103A,U+1004,U+1037,U+1039,U+1041;[Ka=0+2217|Ya-Semivowel=0+286|Nga=2+1247|Dot Below=2+0|Virama-Killer=2+0|One-Myanmar=5+1247]
diff --git a/test/shape/data/in-house/tests/nested-mark-filtering-sets.tests b/test/shape/data/in-house/tests/nested-mark-filtering-sets.tests
new file mode 100644 (file)
index 0000000..7de9382
--- /dev/null
@@ -0,0 +1,4 @@
+../fonts/NotoNastaliqUrdu-Regular.ttf;;U+0628,U+0628,U+6D2;[OneDotBelowYB=2@764,-183+0|YBc1=2@764,-282+0|YehBarreeFin_3=2+355|OneDotBelowNS=1@20,-120+0|BehxMed.inT2outD2YB=1@0,349+182|NullMk=0+0|sp10=0+0|BehxIni.outT2=0@0,406+766]
+../fonts/NotoNastaliqUrdu-Regular.ttf;;U+0628,U+0628,U+0628,U+6D2;[OneDotBelowYB=3@764,-183+0|YBc1=3@764,-282+0|OneDotBelowYB=3@1098,-60+0|YBc2=3@1098,-159+0|YehBarreeFin_4=3+355|OneDotBelowNS=2@20,-120+0|BehxMed.inT2outD2YB=2@0,349+182|NullMk=1+0|BehxMed.inT1outT2=1@0,406+184|NullMk=0+0|sp5=0+0|BehxIni=0@0,471+541]
+../fonts/NotoNastaliqUrdu-Regular.ttf;;U+0628,U+0628,U+0628,U+0628,U+6D2;[OneDotBelowYB=4@659,-192+0|YBc1=4@659,-291+0|OneDotBelowYB=4@966,-55+0|YBc2=4@966,-154+0|OneDotBelowYB=4@1274,-148+0|YBc3=4@1274,-247+0|YehBarreeFin_5=4+355|OneDotBelowNS=3@20,-120+0|BehxMed.inT2outD2YB=3@0,349+182|NullMk=2+0|BehxMed.inT1outT2=2@0,406+184|NullMk=1+0|BehxMed.inT2outT1=1@0,471+267|NullMk=0+0|sp0=0+0|BehxIni.outT2=0@0,616+156]
+../fonts/NotoNastaliqUrdu-Regular.ttf;;U+0628,U+0628,U+0628,U+0628,U+0628,U+6D2;[OneDotBelowYB=5@659,-192+0|YBc1=5@659,-291+0|OneDotBelowYB=5@966,-55+0|YBc2=5@966,-154+0|OneDotBelowYB=5@1274,-148+0|YBc3=5@1274,-247+0|YehBarreeFin_5=5+355|OneDotBelowNS=4@20,-120+0|BehxMed.inT2outD2YB=4@0,349+182|NullMk=3+0|BehxMed.inT1outT2=3@0,406+184|NullMk=2+0|BehxMed.inT2outT1=2@0,471+267|NullMk=1+0|BehxMed.inT1outT2=1@0,616+184|OneDotBelowNS=0@73,516+0|sp0=0+0|BehxIni=0@0,681+236]
diff --git a/test/shape/data/in-house/tests/none-directional.tests b/test/shape/data/in-house/tests/none-directional.tests
new file mode 100644 (file)
index 0000000..e1c5657
--- /dev/null
@@ -0,0 +1,3 @@
+../fonts/73e84dac2fc6a2d1bc9250d1414353661088937d.ttf;;U+10300,U+10301;[u10300=0+1470|u10301=1+1284]
+../fonts/73e84dac2fc6a2d1bc9250d1414353661088937d.ttf;--direction=ltr;U+10300,U+10301;[u10300=0+1470|u10301=1+1284]
+../fonts/73e84dac2fc6a2d1bc9250d1414353661088937d.ttf;--direction=rtl;U+10300,U+10301;[u10301_r=1+1284|u10300_r=0+1470]
diff --git a/test/shape/data/in-house/tests/positioning-features.tests b/test/shape/data/in-house/tests/positioning-features.tests
new file mode 100644 (file)
index 0000000..1021a45
--- /dev/null
@@ -0,0 +1,3 @@
+../fonts/53a91c20e33a596f2be17fb68b382d6b7eb85d5c.ttf;;U+0041,U+0056;[A=0+625|V=1+675]
+../fonts/f79eb71df4e4c9c273b67b89a06e5ff9e3c1f834.ttf;;U+006D,U+0315;[m=0+945|uni0315=0@32,-178+0]
+../fonts/ea3f63620511b2097200d23774ffef197e829e69.ttf;;U+0079,U+0325;[y=0+565|uni0325=0@-422,-240+0]
diff --git a/test/shape/data/in-house/tests/rand.tests b/test/shape/data/in-house/tests/rand.tests
new file mode 100644 (file)
index 0000000..6111828
--- /dev/null
@@ -0,0 +1,3 @@
+../fonts/5bb74492f5e0ffa1fbb72e4c881be035120b6513.ttf;--no-glyph-names --features=-rand;U+0054,U+0055,U+0056;[1=0+560|2=1+602|3=2+602]
+../fonts/5bb74492f5e0ffa1fbb72e4c881be035120b6513.ttf;--no-glyph-names --features=rand=2;U+0054,U+0055,U+0056;[5=0+560|8=1+602|11=2+602]
+../fonts/5bb74492f5e0ffa1fbb72e4c881be035120b6513.ttf;--no-glyph-names;U+0054,U+0055,U+0056,U+0054,U+0055,U+0056,U+0054,U+0055,U+0056,U+0054,U+0055,U+0056;[5=0+560|7=1+602|10=2+602|4=3+560|7=4+602|10=5+602|6=6+560|9=7+602|10=8+602|5=9+560|8=10+602|12=11+602]
diff --git a/test/shape/data/in-house/tests/reverse-sub.tests b/test/shape/data/in-house/tests/reverse-sub.tests
new file mode 100644 (file)
index 0000000..60a5369
--- /dev/null
@@ -0,0 +1,3 @@
+../fonts/a706511c65fb278fda87eaf2180ca6684a80f423.ttf;;U+0041,U+0020,U+0041,U+0042;[A.alt1=0+1000|space=1+1000|A.alt1=2+1000|B=3+1000]
+../fonts/3f24aff8b768e586162e9b9d03b15c36508dd2ae.ttf;--features=salt=2;U+0635,U+0644,U+0637,U+062E,U+0644,U+0637,U+062C;[gid43=6@143,-124+0|gid8=6+178|gid25=5@0,110+670|gid33=4@0,110+120|gid41=3@-8,343+0|gid10=3@0,110+88|gid26=2@0,220+670|gid34=1@0,220+120|gid21=0@0,220+670]
+../fonts/1b66a1f4b076b734caa6397b3e57231af1feaafb.ttf;;U+0031,U+0032,U+0033,U+0034,U+0035,U+0036,U+0037,U+0038,U+0039,U+0030,U+2044,U+0031,U+0032,U+0033,U+0034,U+0035,U+0036,U+0037,U+0038,U+0039,U+0030;[one.numr=0+350|two.numr=1+350|three.numr=2+350|four.numr=3+350|five.numr=4+350|six.numr=5+350|seven.numr=6+350|eight.numr=7+350|nine.numr=8+350|zero.numr=9+350|fraction=10+130|one.dnom=11+350|two.dnom=12+350|three.dnom=13+350|four.dnom=14+350|five.dnom=15+350|six.dnom=16+350|seven.dnom=17+350|eight.dnom=18+350|nine.dnom=19+350|zero.dnom=20+350]
diff --git a/test/shape/data/in-house/tests/rotation.tests b/test/shape/data/in-house/tests/rotation.tests
new file mode 100644 (file)
index 0000000..66cbc09
--- /dev/null
@@ -0,0 +1,4 @@
+../fonts/2681c1c72d6484ed3410417f521b1b819b4e2392.ttf;--no-clusters --no-positions --direction=l;U+3008;[uni3008]
+../fonts/2681c1c72d6484ed3410417f521b1b819b4e2392.ttf;--no-clusters --no-positions --direction=r;U+3008;[uni3009]
+../fonts/2681c1c72d6484ed3410417f521b1b819b4e2392.ttf;--no-clusters --no-positions --direction=t;U+3008;[uniFE3F]
+../fonts/2681c1c72d6484ed3410417f521b1b819b4e2392.ttf;--no-clusters --no-positions --direction=b;U+3008;[uniFE40]
diff --git a/test/shape/data/in-house/tests/simple.tests b/test/shape/data/in-house/tests/simple.tests
new file mode 100644 (file)
index 0000000..e88ed6b
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/49c9f7485c1392fa09a1b801bc2ffea79275f22e.ttf;--shaper=ot;U+0056,U+0041,U+0042,U+0045,U+0061,U+0062,U+0063,U+0064;[V=0+1142|A=1+1295|B=2+1295|E=3+1123|a=4+1126|b=5+1164|c=6+1072|d=7+1164]
+../fonts/49c9f7485c1392fa09a1b801bc2ffea79275f22e.ttf;--shaper=fallback;U+0056,U+0041,U+0042,U+0045,U+0061,U+0062,U+0063,U+0064;[V=0+1295|A=1+1295|B=2+1295|E=3+1123|a=4+1126|b=5+1164|c=6+1072|d=7+1164]
diff --git a/test/shape/data/in-house/tests/sinhala.tests b/test/shape/data/in-house/tests/sinhala.tests
new file mode 100644 (file)
index 0000000..4748c1d
--- /dev/null
@@ -0,0 +1 @@
+../fonts/5af5361ed4d1e8305780b100e1730cb09132f8d1.ttf;;U+0DBB,U+0DCA,U+200D,U+0DBA,U+0DCA,U+200D,U+0DBA;[gid8=0+1343|gid4=0+1130]
diff --git a/test/shape/data/in-house/tests/spaces.tests b/test/shape/data/in-house/tests/spaces.tests
new file mode 100644 (file)
index 0000000..36cfc0f
--- /dev/null
@@ -0,0 +1,34 @@
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf;--font-funcs=ot;U+0020;[gid1=0+560]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf;--font-funcs=ot;U+00A0;[gid1=0+560]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf;--font-funcs=ot;U+1680;[gid0=0+692]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf;--font-funcs=ot;U+2000;[gid1=0+1024]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf;--font-funcs=ot;U+2001;[gid1=0+2048]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf;--font-funcs=ot;U+2002;[gid1=0+1024]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf;--font-funcs=ot;U+2003;[gid1=0+2048]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf;--font-funcs=ot;U+2004;[gid1=0+683]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf;--font-funcs=ot;U+2005;[gid1=0+512]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf;--font-funcs=ot;U+2006;[gid1=0+341]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf;--font-funcs=ot;U+2007;[gid1=0+560]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf;--font-funcs=ot;U+2008;[gid1=0+560]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf;--font-funcs=ot;U+2009;[gid1=0+410]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf;--font-funcs=ot;U+200A;[gid1=0+128]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf;--font-funcs=ot;U+202F;[gid1=0+280]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf;--font-funcs=ot;U+205F;[gid1=0+455]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf;--font-funcs=ot;U+3000;[gid1=0+2048]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf;--font-funcs=ot --direction=ttb;U+0020;[gid1=0@-280,0+0,-2048]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf;--font-funcs=ot --direction=ttb;U+00A0;[gid1=0@-280,0+0,-2048]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf;--font-funcs=ot --direction=ttb;U+1680;[gid0=0@-346,0+0,-2048]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf;--font-funcs=ot --direction=ttb;U+2000;[gid1=0@-280,0+0,-1024]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf;--font-funcs=ot --direction=ttb;U+2001;[gid1=0@-280,0+0,-2048]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf;--font-funcs=ot --direction=ttb;U+2002;[gid1=0@-280,0+0,-1024]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf;--font-funcs=ot --direction=ttb;U+2003;[gid1=0@-280,0+0,-2048]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf;--font-funcs=ot --direction=ttb;U+2004;[gid1=0@-280,0+0,-683]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf;--font-funcs=ot --direction=ttb;U+2005;[gid1=0@-280,0+0,-512]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf;--font-funcs=ot --direction=ttb;U+2006;[gid1=0@-280,0+0,-341]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf;--font-funcs=ot --direction=ttb;U+2007;[gid1=0@-280,0+0,-2048]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf;--font-funcs=ot --direction=ttb;U+2008;[gid1=0@-280,0+0,-2048]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf;--font-funcs=ot --direction=ttb;U+2009;[gid1=0@-280,0+0,-410]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf;--font-funcs=ot --direction=ttb;U+200A;[gid1=0@-280,0+0,-128]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf;--font-funcs=ot --direction=ttb;U+202F;[gid1=0@-280,0+0,-1024]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf;--font-funcs=ot --direction=ttb;U+205F;[gid1=0@-280,0+0,-455]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf;--font-funcs=ot --direction=ttb;U+3000;[gid1=0@-280,0+0,-2048]
diff --git a/test/shape/data/in-house/tests/tibetan-contractions-1.tests b/test/shape/data/in-house/tests/tibetan-contractions-1.tests
new file mode 100644 (file)
index 0000000..6e1eed5
--- /dev/null
@@ -0,0 +1,60 @@
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+FEFF,U+0F40,U+0F72,U+0F72,U+0F0B,U+0F66,U+0FAD,U+0F7C,U+0F7C,U+0F0B;[uni0F40=0+680|uni0F720F72=0+0|uni0F0B=4+190|uni0F660FAD=5+680|uni0F7D=5+0|uni0F0B=9+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F40,U+0F74,U+0F72,U+0F66,U+0F0B;[uni0F400F740F72=0+680|uni0F66=3+680|uni0F0B=4+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F40,U+0F74,U+0F7A,U+0F53,U+0F0B;[uni0F400F74=0+680|uni0F7A=0+0|uni0F53=3+590|uni0F0B=4@-30,0+160]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F40,U+0F74,U+0F7C,U+0F56,U+0F39,U+0F0B;[uni0F400F74=0+680|uni0F7C=0+0|uni0F56=3+610|uni0F39=3+0|uni0F0B=5+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F40,U+0F74,U+0F72,U+0F42,U+0F66,U+0F0B;[uni0F400F740F72=0+680|uni0F42=3+680|uni0F66=4+680|uni0F0B=5+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F40,U+0F74,U+0F7A,U+0F66,U+0F0B;[uni0F400F74=0+680|uni0F7A=0+0|uni0F66=3+680|uni0F0B=4+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F40,U+0FB3,U+0F74,U+0F7A,U+0F56,U+0F66,U+0F0B;[uni0F400FB30F740F7A=0+660|uni0F56=4+610|uni0F66=5+680|uni0F0B=6+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F40,U+0FB3,U+0F74,U+0F7C,U+0F42,U+0F0B;[uni0F400FB30F74=0+660|uni0F7C=0+0|uni0F42=4+680|uni0F0B=5+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F51,U+0F40,U+0F7C,U+0F7C,U+0F42,U+0F0B;[uni0F51=0+600|uni0F400F7D=1+680|uni0F42=4+680|uni0F0B=5+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F51,U+0F40,U+0F7C,U+0F7C,U+0F62,U+0F0B;[uni0F51=0+600|uni0F400F7D=1+680|uni0F62=4+620|uni0F0B=5@-65,0+130]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F51,U+0F40,U+0FB1,U+0F7C,U+0F72,U+0F62,U+0F0B;[uni0F51=0+600|uni0F400FB10F7C0F72=1+660|uni0F62=5+620|uni0F0B=6@-65,0+130]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F66,U+0F90,U+0FB1,U+0F74,U+0F7A,U+0F0B;[uni0F660F900FB10F74=0+680|uni0F7A=0+0|uni0F0B=5+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F56,U+0F66,U+0F90,U+0FB1,U+0F7A,U+0F7A,U+0F51,U+0F0B;[uni0F56=0+610|uni0F660F900FB1=1+660|uni0F7B=1+0|uni0F51=6+600|uni0F0B=7@-70,0+106]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F56,U+0F66,U+0F90,U+0FB1,U+0F7A,U+0F7A,U+0F7A,U+0F51,U+0F0B;[uni0F56=0+610|uni0F660F900FB1=1+660|uni0F7B0F7A=1+0|uni0F51=7+600|uni0F0B=8@-70,0+106]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F41,U+0F58,U+0F66,U+0F74,U+0F7E,U+0F0B;[uni0F41=0+660|uni0F58=1+660|uni0F660F740F7E=2+680|uni0F0B=5+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F41,U+0F74,U+0F7C,U+0F66,U+0F39,U+0F0B;[uni0F410F74=0+680|uni0F7C=0+0|uni0F66=3+680|uni0F39=3+0|uni0F0B=5+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F41,U+0FB1,U+0F74,U+0F7C,U+0F42,U+0F0B;[uni0F410FB10F74=0+670|uni0F7C=0+0|uni0F42=4+680|uni0F0B=5+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F41,U+0FB2,U+0F74,U+0F7A,U+0F51,U+0F0B;[uni0F410FB20F74=0+660|uni0F7A=0+0|uni0F51=4+600|uni0F0B=5@-70,0+106]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F41,U+0FB2,U+0F74,U+0F72,U+0F44,U+0F0B;[uni0F410FB20F74=0+660|uni0F72=0+0|uni0F44=4+560|uni0F0B=5@-20,0+110]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F41,U+0FB2,U+0F74,U+0F7C,U+0F51,U+0F0B;[uni0F410FB20F74=0+660|uni0F7C=0+0|uni0F51=4+600|uni0F0B=5@-70,0+106]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F41,U+0FB2,U+0F74,U+0F7E,U+0F51,U+0F0B;[uni0F410FB20F740F7E=0+660|uni0F51=4+600|uni0F0B=5@-70,0+106]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F58,U+0F41,U+0FB1,U+0F7A,U+0F7A,U+0F7A,U+0F53,U+0F0B;[uni0F58=0+660|uni0F410FB1=1+680|uni0F7B0F7A=1+0|uni0F53=6+590|uni0F0B=7@-30,0+160]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F60,U+0F41,U+0F7C,U+0F7C,U+0F62,U+0F0B;[uni0F60=0+600|uni0F410F7D=1+660|uni0F62=4+620|uni0F0B=5@-65,0+130]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F42,U+0F74,U+0F7C,U+0F42,U+0F0B;[uni0F420F74=0+680|uni0F7C=0+0|uni0F42=3+680|uni0F0B=4+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F42,U+0FB1,U+0F74,U+0F72,U+0F42,U+0F0B;[uni0F420FB10F74=0+700|uni0F72=0+0|uni0F42=4+680|uni0F0B=5+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F42,U+0FB2,U+0F74,U+0F72,U+0F53,U+0F0B;[uni0F420FB20F74=0+680|uni0F72=0+0|uni0F53=4+590|uni0F0B=5@-30,0+160]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F42,U+0FB2,U+0F74,U+0F72,U+0F0B;[uni0F420FB20F74=0+680|uni0F72=0+0|uni0F0B=4+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F42,U+0FB2,U+0F74,U+0F7C,U+0F53,U+0F0B;[uni0F420FB20F74=0+680|uni0F7C=0+0|uni0F53=4+590|uni0F0B=5@-30,0+160]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F42,U+0FB2,U+0F74,U+0F7C,U+0F56,U+0F0B;[uni0F420FB20F74=0+680|uni0F7C=0+0|uni0F56=4+610|uni0F0B=5+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F42,U+0FB2,U+0F7C,U+0F72,U+0F53,U+0F0B;[uni0F420FB2=0+680|uni0F7C0F72=0+0|uni0F53=4+590|uni0F0B=5@-30,0+160]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F42,U+0FB2,U+0F7C,U+0F7A,U+0F62,U+0F0B;[uni0F420FB2=0+680|uni0F7C0F7A=0+0|uni0F62=4+620|uni0F0B=5@-65,0+130]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F51,U+0F42,U+0F74,U+0F72,U+0F42,U+0F0B;[uni0F51=0+600|uni0F420F740F72=1+680|uni0F42=4+680|uni0F0B=5+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F51,U+0F42,U+0F74,U+0F7A,U+0F53,U+0F0B;[uni0F51=0+600|uni0F420F74=1+680|uni0F7A=1+0|uni0F53=4+590|uni0F0B=5@-30,0+160]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F51,U+0F42,U+0F74,U+0F7A,U+0F42,U+0F66,U+0F0B;[uni0F51=0+600|uni0F420F74=1+680|uni0F7A=1+0|uni0F42=4+680|uni0F66=5+680|uni0F0B=6+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F51,U+0F42,U+0FB3,U+0F7C,U+0F7A,U+0F44,U+0F0B;[uni0F51=0+600|uni0F420FB3=1+680|uni0F7C0F7A=1+0|uni0F44=5+560|uni0F0B=6@-20,0+110]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F58,U+0F42,U+0F7C,U+0F7C,U+0F53,U+0F0B;[uni0F58=0+660|uni0F420F7D=1+680|uni0F53=4+590|uni0F0B=5@-30,0+160]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F44,U+0F74,U+0F72,U+0F42,U+0F0B;[uni0F440F74=0+610|uni0F72=0+0|uni0F42=3+680|uni0F0B=4+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F51,U+0F42,U+0FB2,U+0F74,U+0F7C,U+0F56,U+0F0B;[uni0F51=0+600|uni0F420FB20F74=1+680|uni0F7C=1+0|uni0F56=5+610|uni0F0B=6+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F56,U+0F45,U+0F74,U+0F72,U+0F42,U+0F0B;[uni0F56=0+610|uni0F450F740F72=1+630|uni0F42=4+680|uni0F0B=5+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F56,U+0F45,U+0F74,U+0F72,U+0F66,U+0F0B;[uni0F56=0+610|uni0F450F740F72=1+630|uni0F66=4+680|uni0F0B=5+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F56,U+0F45,U+0FB2,U+0F74,U+0F42,U+0F0B;[uni0F56=0+610|uni0F450FB20F74=1+640|uni0F42=4+680|uni0F0B=5+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F56,U+0F45,U+0F74,U+0F72,U+0F0B;[uni0F56=0+610|uni0F450F740F72=1+630|uni0F0B=4+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F56,U+0F45,U+0F74,U+0F7E,U+0F0B;[uni0F56=0+610|uni0F450F740F7E=1+630|uni0F0B=4+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F46,U+0F74,U+0F72,U+0F63,U+0F0B;[uni0F460F74=0+650|uni0F72=0+0|uni0F63=3+700|uni0F0B=4+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F46,U+0F74,U+0F7C,U+0F51,U+0F0B;[uni0F460F74=0+650|uni0F7C=0+0|uni0F51=3+600|uni0F0B=4@-70,0+106]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F46,U+0F74,U+0F7C,U+0F51,U+0F0B;[uni0F460F74=0+650|uni0F7C=0+0|uni0F51=3+600|uni0F0B=4@-70,0+106]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F46,U+0F74,U+0F7E,U+0F51,U+0F0B;[uni0F460F740F7E=0+650|uni0F51=3+600|uni0F0B=4@-70,0+106]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F46,U+0F39,U+0F74,U+0F7C,U+0F51,U+0F0B;[uni0F46=0+620|uni0F39=0+0|uni0F74=0+0|uni0F7C=0+0|uni0F51=4+600|uni0F0B=5@-70,0+106]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F46,U+0FB2,U+0F74,U+0F72,U+0F53,U+0F0B;[uni0F460FB20F740F72=0+660|uni0F53=4+590|uni0F0B=5@-30,0+160]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F46,U+0FB2,U+0F74,U+0F7C,U+0F63,U+0F0B;[uni0F460FB20F74=0+660|uni0F7C=0+0|uni0F63=4+700|uni0F0B=5+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F58,U+0F46,U+0F7C,U+0F7A,U+0F53,U+0F0B;[uni0F58=0+660|uni0F46=1+620|uni0F7C0F7A=1+0|uni0F53=4+590|uni0F0B=5@-30,0+160]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F60,U+0F46,U+0FB1,U+0F7C,U+0F72,U+0F62,U+0F0B;[uni0F60=0+600|uni0F460FB10F7C0F72=1+660|uni0F62=5+620|uni0F0B=6@-65,0+130]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F47,U+0F7C,U+0F7C,U+0F0B;[uni0F470F7D=0+570|uni0F0B=3+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F62,U+0F97,U+0F74,U+0F7A,U+0F53,U+0F39,U+0F0B;[uni0F620F970F74=0+600|uni0F7A=0+0|uni0F53=4+590|uni0F39=4+0|uni0F0B=6+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F49,U+0F74,U+0F72,U+0F0B;[uni0F490F74=0+580|uni0F72=0+0|uni0F0B=3+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F49,U+0F74,U+0F72,U+0F44,U+0F0B;[uni0F490F74=0+580|uni0F72=0+0|uni0F44=3+560|uni0F0B=4@-20,0+110]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F58,U+0F49,U+0F72,U+0F7E,U+0F51,U+0F0B;[uni0F58=0+660|uni0F49=1+580|uni0F720F7E=1+0|uni0F51=4+600|uni0F0B=5@-70,0+106]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F42,U+0F4F,U+0F74,U+0F72,U+0F42,U+0F0B;[uni0F42=0+680|uni0F4F0F740F72=1+600|uni0F42=4+680|uni0F0B=5+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F56,U+0F4F,U+0F44,U+0F7C,U+0F7E,U+0F66,U+0F0B;[uni0F56=0+610|uni0F4F=1+560|uni0F44=2+560|uni0F7C0F7E=2+0|uni0F66=5+680|uni0F0B=6+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf;;U+0F50,U+0F39,U+0F74,U+0F7A,U+0F4A,U+0F0B;[uni0F50=0+600|uni0F39=0+0|uni0F74=0+0|uni0F7A=0+0|uni0F4A=4+590|uni0F0B=5+190]
diff --git a/test/shape/data/in-house/tests/tibetan-contractions-2.tests b/test/shape/data/in-house/tests/tibetan-contractions-2.tests
new file mode 100644 (file)
index 0000000..495a8df
--- /dev/null
@@ -0,0 +1,53 @@
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf;;U+0F50,U+0F74,U+0F72,U+0F53,U+0F0B;[uni0F500F74=0+600|uni0F72=0+0|uni0F53=3+590|uni0F0B=4@-30,0+160]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf;;U+0F58,U+0F50,U+0F74,U+0F7C,U+0F44,U+0F0B;[uni0F58=0+660|uni0F500F74=1+600|uni0F7C=1+0|uni0F44=4+560|uni0F0B=5@-20,0+110]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf;;U+0F58,U+0F50,U+0F7C,U+0F7A,U+0F44,U+0F0B;[uni0F58=0+660|uni0F50=1+600|uni0F7C0F7A=1+0|uni0F44=4+560|uni0F0B=5@-20,0+110]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf;;U+0F58,U+0F50,U+0F7C,U+0F72,U+0F66,U+0F0B;[uni0F58=0+660|uni0F50=1+600|uni0F7C0F72=1+0|uni0F66=4+680|uni0F0B=5+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf;;U+0F51,U+0F74,U+0F62,U+0FB2,U+0F7C,U+0F51,U+0F0B;[uni0F510F74=0+600|uni0F620FB2=2+600|uni0F7C=2+0|uni0F51=5+600|uni0F0B=6@-70,0+106]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf;;U+0F51,U+0FB2,U+0F74,U+0F72,U+0F42,U+0F0B;[uni0F510FB20F74=0+600|uni0F72=0+0|uni0F42=4+680|uni0F0B=5+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf;;U+0F42,U+0F51,U+0F74,U+0F7A,U+0F53,U+0F0B;[uni0F42=0+680|uni0F510F740F7A=1+600|uni0F53=4+590|uni0F0B=5@-30,0+160]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf;;U+0F56,U+0F51,U+0F7B,U+0F42,U+0F66,U+0F0B;[uni0F56=0+610|uni0F510F7B=1+579|uni0F42=3+680|uni0F66=4+680|uni0F0B=5+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf;;U+0F60,U+0F51,U+0F74,U+0F7A,U+0F51,U+0F0B;[uni0F60=0+600|uni0F510F740F7A=1+600|uni0F51=4+600|uni0F0B=5@-70,0+106]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf;;U+0F62,U+0FA1,U+0F7C,U+0F7A,U+0F0B;[uni0F620FA10F7C0F7A=0+580|uni0F0B=4+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf;;U+0F66,U+0FA1,U+0F74,U+0F72,U+0F56,U+0F0B;[uni0F660FA10F74=0+680|uni0F72=0+0|uni0F56=4+610|uni0F0B=5+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf;;U+0F53,U+0F74,U+0F7C,U+0F42,U+0F66,U+0F0B;[uni0F530F74=0+600|uni0F7C=0+0|uni0F42=3+680|uni0F66=4+680|uni0F0B=5+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf;;U+0F53,U+0F74,U+0F7C,U+0F62,U+0F0B;[uni0F530F74=0+600|uni0F7C=0+0|uni0F62=3+620|uni0F0B=4@-65,0+130]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf;;U+0F42,U+0F53,U+0FB1,U+0F7C,U+0F7E,U+0F62,U+0F0B;[uni0F42=0+680|uni0F530FB1=1+600|uni0F7C0F7E=1+0|uni0F62=5+620|uni0F0B=6@-65,0+130]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf;;U+0F51,U+0F54,U+0F74,U+0F7C,U+0F42,U+0F66,U+0F0B;[uni0F51=0+600|uni0F540F74=1+610|uni0F7C=1+0|uni0F42=4+680|uni0F66=5+680|uni0F0B=6+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf;;U+0F56,U+0FB1,U+0F74,U+0F7E,U+0F56,U+0F0B;[uni0F560FB10F74=0+620|uni0F7E=0+0|uni0F56=4+610|uni0F0B=5+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf;;U+0F56,U+0FB3,U+0F74,U+0F7C,U+0F53,U+0F0B;[uni0F560FB30F74=0+650|uni0F7C=0+0|uni0F53=4+590|uni0F0B=5@-30,0+160]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf;;U+0F56,U+0FB3,U+0F7C,U+0F7C,U+0F53,U+0F0B;[uni0F560FB3=0+650|uni0F7D=0+0|uni0F53=4+590|uni0F0B=5@-30,0+160]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf;;U+0F51,U+0F56,U+0F74,U+0F7C,U+0F51,U+0F0B;[uni0F51=0+600|uni0F560F74=1+610|uni0F7C=1+0|uni0F51=4+600|uni0F0B=5@-70,0+106]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf;;U+0F51,U+0F56,U+0F74,U+0F7C,U+0F56,U+0F66,U+0F0B;[uni0F51=0+600|uni0F560F74=1+610|uni0F7C=1+0|uni0F56=4+610|uni0F66=5+680|uni0F0B=6+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf;;U+0F58,U+0F74,U+0F7A,U+0F42,U+0F66,U+0F0B;[uni0F580F74=0+680|uni0F7A=0+0|uni0F42=3+680|uni0F66=4+680|uni0F0B=5+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf;;U+0F58,U+0F74,U+0F72,U+0F42,U+0F0B;[uni0F580F74=0+680|uni0F72=0+0|uni0F42=3+680|uni0F0B=4+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf;;U+0F58,U+0F74,U+0F7A,U+0F42,U+0F66,U+0F0B;[uni0F580F74=0+680|uni0F7A=0+0|uni0F42=3+680|uni0F66=4+680|uni0F0B=5+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf;;U+0F58,U+0F74,U+0F7A,U+0F53,U+0F0B;[uni0F580F74=0+680|uni0F7A=0+0|uni0F53=3+590|uni0F0B=4@-30,0+160]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf;;U+0F58,U+0F9F,U+0F7C,U+0F7A,U+0F42,U+0F0B;[uni0F580F9F0F7C0F7A=0+660|uni0F42=4+680|uni0F0B=5+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf;;U+0F58,U+0F7C,U+0F7A,U+0F44,U+0F0B;[uni0F58=0+660|uni0F7C0F7A=0+0|uni0F44=3+560|uni0F0B=4@-20,0+110]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf;;U+0F42,U+0F59,U+0F74,U+0F7C,U+0F62,U+0F0B;[uni0F42=0+680|uni0F590F74=1+620|uni0F7C=1+0|uni0F62=4+620|uni0F0B=5@-65,0+130]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf;;U+0F58,U+0F5A,U+0FAE,U+0F74,U+0F7E,U+0F66,U+0F0B;[uni0F58=0+660|uni0F5A0FAE0F740F7E=1+620|uni0F66=5+680|uni0F0B=6+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf;;U+0F62,U+0FAB,U+0F74,U+0F7A,U+0F66,U+0F0B;[uni0F620FAB0F74=0+660|uni0F7A=0+0|uni0F66=4+680|uni0F0B=5+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf;;U+0F62,U+0FAB,U+0F74,U+0F7A,U+0F53,U+0F0B;[uni0F620FAB0F74=0+660|uni0F7A=0+0|uni0F53=4+590|uni0F0B=5@-30,0+160]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf;;U+0F5E,U+0F74,U+0F7C,U+0F63,U+0F0B;[uni0F5E0F74=0+660|uni0F7C=0+0|uni0F63=3+700|uni0F0B=4+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf;;U+0F42,U+0F5E,U+0F74,U+0F7C,U+0F42,U+0F0B;[uni0F42=0+680|uni0F5E0F74=1+660|uni0F7C=1+0|uni0F42=4+680|uni0F0B=5+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf;;U+0F42,U+0F5E,U+0F74,U+0F7C,U+0F58,U+0F66,U+0F0B;[uni0F42=0+680|uni0F5E0F74=1+660|uni0F7C=1+0|uni0F58=4+660|uni0F66=5+680|uni0F0B=6+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf;;U+0F42,U+0F5F,U+0F74,U+0F7C,U+0F0B;[uni0F42=0+680|uni0F5F0F74=1+610|uni0F7C=1+0|uni0F0B=4+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf;;U+0F42,U+0F5F,U+0F74,U+0F72,U+0F44,U+0F0B;[uni0F42=0+680|uni0F5F0F740F72=1+610|uni0F44=4+560|uni0F0B=5@-20,0+110]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf;;U+0F42,U+0F5F,U+0F74,U+0F7A,U+0F62,U+0F0B;[uni0F42=0+680|uni0F5F0F74=1+610|uni0F7A=1+0|uni0F62=4+620|uni0F0B=5@-65,0+130]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf;;U+0F42,U+0F5F,U+0F74,U+0F7A,U+0F62,U+0F0B;[uni0F42=0+680|uni0F5F0F74=1+610|uni0F7A=1+0|uni0F62=4+620|uni0F0B=5@-65,0+130]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf;;U+0F42,U+0F5F,U+0F74,U+0F7A,U+0F51,U+0F0B;[uni0F42=0+680|uni0F5F0F74=1+610|uni0F7A=1+0|uni0F51=4+600|uni0F0B=5@-70,0+106]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf;;U+0F60,U+0F7C,U+0F7A,U+0F62,U+0F0B;[uni0F60=0+600|uni0F7C0F7A=0+0|uni0F62=3+620|uni0F0B=4@-65,0+130]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf;;U+0F61,U+0F72,U+0F7A,U+0F0B;[uni0F61=0+700|uni0F720F7A=0+0|uni0F0B=3+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf;;U+0F61,U+0F7A,U+0F7A,U+0F66,U+0F0B;[uni0F61=0+700|uni0F7B=0+0|uni0F66=3+680|uni0F0B=4+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf;;U+0F62,U+0F72,U+0F53,U+0F7C,U+0F7A,U+0F0B;[uni0F620F72=0+620|uni0F530F7C0F7A=2+590|uni0F0B=5+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf;;U+0F62,U+0F74,U+0F7C,U+0F63,U+0F0B;[uni0F620F74=0+601|uni0F7C=0+0|uni0F63=3+700|uni0F0B=4+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf;;U+0F66,U+0F7A,U+0F7E,U+0F53,U+0F0B;[uni0F66=0+680|uni0F7A0F7E=0+0|uni0F53=3+590|uni0F0B=4@-30,0+160]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf;;U+0F66,U+0F7A,U+0F7E,U+0F51,U+0F60,U+0F0B;[uni0F66=0+680|uni0F7A0F7E=0+0|uni0F51=3+600|uni0F60=4+600|uni0F0B=5@-40,0+150]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf;;U+0F66,U+0F7C,U+0F7C,U+0F56,U+0F0B;[uni0F660F7D=0+680|uni0F56=3+610|uni0F0B=4+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf;;U+0F66,U+0F7C,U+0F7C,U+0F62,U+0F0B;[uni0F660F7D=0+680|uni0F62=3+620|uni0F0B=4@-65,0+130]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf;;U+0F66,U+0FB2,U+0F7C,U+0F7A,U+0F66,U+0F0B;[uni0F660FB2=0+680|uni0F7C0F7A=0+0|uni0F66=4+680|uni0F0B=5+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf;;U+0F66,U+0FB3,U+0F7C,U+0F7C,U+0F51,U+0F0B;[uni0F660FB3=0+680|uni0F7D=0+0|uni0F51=4+600|uni0F0B=5@-70,0+106]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf;;U+0F66,U+0FB3,U+0F7C,U+0F7C,U+0F53,U+0F0B;[uni0F660FB3=0+680|uni0F7D=0+0|uni0F53=4+590|uni0F0B=5@-30,0+160]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf;;U+0F56,U+0F66,U+0F99,U+0F7C,U+0F7E,U+0F51,U+0F66,U+0F0B;[uni0F56=0+610|uni0F660F99=1+670|uni0F7C0F7E=1+0|uni0F51=5+600|uni0F66=6+680|uni0F0B=7+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf;;U+0F63,U+0FB7,U+0FB1,U+0F7C,U+0F42,U+0F66,U+0F0B;[uni0F630FB70FB1=0+680|uni0F7C=0+0|uni0F42=4+680|uni0F66=5+680|uni0F0B=6+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf;;U+0F68,U+0FB1,U+0F7C,U+0F53,U+0F0B;[uni0F680FB1=0+740|uni0F7C=0+0|uni0F53=3+590|uni0F0B=4@-30,0+160]
diff --git a/test/shape/data/in-house/tests/tibetan-vowels.tests b/test/shape/data/in-house/tests/tibetan-vowels.tests
new file mode 100644 (file)
index 0000000..bc0e32d
--- /dev/null
@@ -0,0 +1,11 @@
+../fonts/82f4f3b57bb55344e72e70231380202a52af5805.ttf;;U+0F68,U+0F72;[uni0F680F72=0+730]
+../fonts/82f4f3b57bb55344e72e70231380202a52af5805.ttf;;U+0F68,U+0F74;[uni0F680F74=0+730]
+../fonts/82f4f3b57bb55344e72e70231380202a52af5805.ttf;;U+0F68,U+0F7A;[uni0F680F7A=0+730]
+../fonts/82f4f3b57bb55344e72e70231380202a52af5805.ttf;;U+0F68,U+0F7C;[uni0F680F7C=0+730]
+../fonts/82f4f3b57bb55344e72e70231380202a52af5805.ttf;;U+0F68,U+0F71,U+0F72;[uni0F680F710F72=0+720]
+../fonts/82f4f3b57bb55344e72e70231380202a52af5805.ttf;;U+0F68,U+0F71,U+0F74;[uni0F680F75=0+720]
+../fonts/82f4f3b57bb55344e72e70231380202a52af5805.ttf;;U+0F68,U+0F7B;[uni0F680F7B=0+720]
+../fonts/82f4f3b57bb55344e72e70231380202a52af5805.ttf;;U+0F68,U+0F7D;[uni0F680F7D=0+730]
+../fonts/82f4f3b57bb55344e72e70231380202a52af5805.ttf;;U+0F68,U+0F7E;[uni0F680F7E=0+730]
+../fonts/82f4f3b57bb55344e72e70231380202a52af5805.ttf;;U+0F68,U+0F7F;[uni0F68=0+730|uni0F7F=0+408]
+../fonts/82f4f3b57bb55344e72e70231380202a52af5805.ttf;;U+0F00;[uni0F00=0+730]
diff --git a/test/shape/data/in-house/tests/tt-kern-gpos.tests b/test/shape/data/in-house/tests/tt-kern-gpos.tests
new file mode 100644 (file)
index 0000000..756e9e0
--- /dev/null
@@ -0,0 +1 @@
+../fonts/b121d4306b2e3add5abbaad21d95fcf04aacbd64.ttf;;U+0041,U+0043,U+0041,U+0042;[A=0+1275|C=1@-20,0+1272|A=2+1296|B=3+1327]
diff --git a/test/shape/data/in-house/tests/unsafe-to-concat.tests b/test/shape/data/in-house/tests/unsafe-to-concat.tests
new file mode 100644 (file)
index 0000000..24906fa
--- /dev/null
@@ -0,0 +1 @@
+../fonts/34da9aab7bee86c4dfc3b85e423435822fdf4b62.ttf;--show-flags;U+0628,U+200C,U+0628;[uni0628=1+993#2|uni0628=0+993#2]
diff --git a/test/shape/data/in-house/tests/use-indic3.tests b/test/shape/data/in-house/tests/use-indic3.tests
new file mode 100644 (file)
index 0000000..d3d010e
--- /dev/null
@@ -0,0 +1 @@
+../fonts/3c96e7a303c58475a8c750bf4289bbe73784f37d.ttf;;U+0C95,U+0CCD,U+0CB0;[uni0C95=0+1176|uni0CB0_uni0CCD.blwf=0+275]
diff --git a/test/shape/data/in-house/tests/use-marchen.tests b/test/shape/data/in-house/tests/use-marchen.tests
new file mode 100644 (file)
index 0000000..8eeeaaa
--- /dev/null
@@ -0,0 +1,35 @@
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf;;U+11C8F;[u11C8F=0+3000]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf;;U+11C71;[u11C71=0+1600]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf;;U+11C8A,U+11CB5;[u11C8A=0+2000|u11CB5=0@-2000,0+0]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf;;U+11C84,U+11C71;[u11C84=0+2200|u11C71=1+1600]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf;;U+11C7E,U+11C8A;[u11C7E=0+2600|u11C8A=1+2000]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf;;U+11C8A,U+11C92,U+11CA9;[u11C8A.11C92.11CA9=0+2600]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf;;U+11C8A,U+11C94,U+11CA9;[u11C8A.11C94.11CA9=0+2600]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf;;U+11C8D,U+11C92,U+11CA9;[u11C8D.11C92.11CA9=0+2600]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf;;U+11C8D,U+11C94,U+11CA9;[u11C8D.11C94.11CA9=0+2600]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf;;U+11C8D,U+11C9E,U+11CA9;[u11C8D.11C9E.11CA9=0+3200]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf;;U+11C8D,U+11CA0,U+11CA9;[u11C8D.11CA0.11CA9=0+3000]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf;;U+11C8D,U+11C92,U+11CAA;[u11C8D.11C92.11CAA=0+2000]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf;;U+11C8D,U+11C94,U+11CAA;[u11C8D.11C94.11CAA=0+2000]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf;;U+11C8D,U+11C9D,U+11CAA;[u11C8D.11C9D.11CAA=0+2000]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf;;U+11C8D,U+11C9E,U+11CAA;[u11C8D.11C9E.11CAA=0+2600]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf;;U+11C8D,U+11CA0,U+11CAA;[u11C8D.11CA0.11CAA=0+2400]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf;;U+11C80,U+11C72,U+11CAA;[u11C80=0+2400|u11C72.11CAA=1+2000]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf;;U+11C8C,U+11CB1,U+11C8D;[u11C8C.11CB1=0+2793|u11C8D=2+2000]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf;;U+11C80,U+11C7C,U+11CB3;[u11C80=0+2400|u11C7C.11CB3=1+2200]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf;;U+11C7F,U+11CB2,U+11C7D;[u11C7F.11CB2=0+2400|u11C7D=2+2000]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf;;U+11C8D,U+11CB2,U+11C81;[u11C8D.11CB2=0+2000|u11C81=2+2400]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf;;U+11C8C,U+11CB4,U+11C74;[u11C8C.11CB4=0+2800|u11C74=2+2000]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf;;U+11C8A,U+11CA1,U+11CA9,U+11C71;[u11C8A.11CA1.11CA9=0+3000|u11C71=3+1600]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf;;U+11C8D,U+11CA1,U+11CA9,U+11C71;[u11C8D.11CA1.11CA9=0+3000|u11C71=3+1600]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf;;U+11C8D,U+11CA1,U+11CAA,U+11C71;[u11C8D.11CA1.11CAA=0+2400|u11C71=3+1600]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf;;U+11C8F,U+11CB0,U+11CB4,U+11CB6;[u11C8F.11CB0.11CB4=0+3600|u11CB6=0@-3200,0+0]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf;;U+11C8E,U+11CB0,U+11CB2,U+11CB5;[u11C8E.11CB0.11CB2=0+2000|u11CB5=0@-2000,0+0]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf;;U+11C74,U+11C89,U+11CB2,U+11C75;[u11C74=0+2000|u11C89.11CB2=1+2000|u11C75=3+2000]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf;;U+11C7C,U+11CAA,U+11CB2,U+11C75;[u11C7C.11CAA.11CB2=0+2200|u11C75=3+2000]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf;;U+11C81,U+11C74,U+11CB2,U+11C8B;[u11C81=0+2400|u11C74.11CB2=1+2000|u11C8B=3+2400]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf;;U+11C8B,U+11CB3,U+11C74,U+11C8D;[u11C8B.11CB3=0+2400|u11C74=2+2000|u11C8D=3+2000]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf;;U+11C83,U+11CB4,U+11C74,U+11C8D;[u11C83.11CB4=0+2800|u11C74=2+2000|u11C8D=3+2000]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf;;U+11C8B,U+11CB3,U+11C74,U+11C8D,U+11C71;[u11C8B.11CB3=0+2400|u11C74=2+2000|u11C8D=3+2000|u11C71=4+1600]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf;;U+11C80,U+11C76,U+11CB1,U+11C75,U+11C8D;[u11C80=0+2400|u11C76.11CB1=1+3200|u11C75=3+2000|u11C8D=4+2000]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf;;U+11C80,U+11C8D,U+11C94,U+11CAA,U+11CB1,U+11C74,U+11C8D;[u11C80=0+2400|u11C8D.11C94.11CAA.11CB1.shorti=1+2600|u11C74=5+2000|u11C8D=6+2000]
diff --git a/test/shape/data/in-house/tests/use-syllable.tests b/test/shape/data/in-house/tests/use-syllable.tests
new file mode 100644 (file)
index 0000000..1cc52fd
--- /dev/null
@@ -0,0 +1,22 @@
+../fonts/96490dd2ff81233b335a650e7eb660e0e7b2eeea.ttf;;U+AA00,U+AA2D,U+AA29;[a_cham=0+1121|uSign_cham=0@14,0+0|.notdef=0+600]
+../fonts/e68a88939e0f06e34d2bc911f09b70890289c8fd.ttf;;U+AA00,U+AA34,U+AA36;[raMedial_cham_pre=0+400|a_cham=0+1121|waMedial_cham=0@-32,0+0]
+../fonts/e68a88939e0f06e34d2bc911f09b70890289c8fd.ttf;;U+AA00,U+AA35,U+AA33;[a_cham=0+1121|laMedial_cham=0@-32,0+0|yaMedial_cham=0+542]
+../fonts/e68a88939e0f06e34d2bc911f09b70890289c8fd.ttf;;U+AA00,U+AA35,U+AA36;[a_cham=0+1121|laMedial_waMedial_cham=0@43,0+0]
+../fonts/074a5ae6b19de8f29772fdd5df2d3d833f81f5e6.ttf;--no-glyph-names;U+11320,U+20F0,U+11367;[3=0+502|1=0@33,0+0|4=0@300,8+0]
+../fonts/373e67bf41ca264e260a9716162b71a23549e885.ttf;--no-glyph-names;U+A8AC,U+A8B4,U+A8B5;[2=0+377|3=0+242|4=0+210]
+../fonts/59a585a63b3df608fbeef00956c8c108deec7de6.ttf;--no-glyph-names;U+1BC7,U+1BEA,U+1BF3;[1=0+749|2=0+402|4=0+535|3=0+401]
+../fonts/1ed7e9064f008f62de6ff0207bb4dd29409597a5.ttf;;U+11064,U+1107F,U+11052,U+11065,U+1107F,U+11053;[brm_num100.1=0+2224|brm_num1000.2=3+1834]
+../fonts/28f497629c04ceb15546c9a70e0730125ed6698d.ttf;;U+11013,U+11042,U+11046;[brm_KA=0+754|brm_vowelEE=0@-383,0+0|brm_virama=0@-524,0+0]
+../fonts/28f497629c04ceb15546c9a70e0730125ed6698d.ttf;;U+11013,U+11044,U+11046;[brm_KA=0+754|brm_vowelOO=0@-647,0+0|brm_virama=0@-524,0+0]
+../fonts/28f497629c04ceb15546c9a70e0730125ed6698d.ttf;;U+11013,U+1103C;[brm_KA=0+754|brm_vowelU=0@-403,0+0]
+../fonts/86cdd983c4e4c4d7f27dd405d6ceb7d4b9ed3d35.ttf;;U+111C8,U+111C9,U+111C9;[u111C8=0+500|u111C9=0@-500,0+0|u111C9=0@-500,0+0]
+../fonts/3cc01fede4debd4b7794ccb1b16cdb9987ea7571.ttf;;U+1A3D,U+1A5A,U+1A63;[uni1A3D=0+250|uni1A5A=0+0|uni1A63=0+250]
+../fonts/3cc01fede4debd4b7794ccb1b16cdb9987ea7571.ttf;;U+1A3D,U+1A60,U+1A3D,U+1A63,U+1A60,U+1A3D,U+1A59;[uni1A3D=0+250|uni1A60=0+0|uni1A3D=2+250|uni1A63=2+250|uni1A60=2+0|uni1A3D=5+250|uni1A59=5+0]
+../fonts/3cc01fede4debd4b7794ccb1b16cdb9987ea7571.ttf;;U+1A3D,U+1A60,U+1A3D,U+1A63,U+1A60,U+1A3D,U+1A5A;[uni1A3D=0+250|uni1A60=0+0|uni1A3D=2+250|uni1A63=2+250|uni1A60=2+0|uni1A3D=5+250|uni25CC=5+250|uni1A5A=5+0]
+../fonts/3cc01fede4debd4b7794ccb1b16cdb9987ea7571.ttf;;U+1A3D,U+1A60,U+1A3D,U+1A63,U+1A60,U+1A3D,U+1A60;[uni1A3D=0+250|uni1A60=0+0|uni1A3D=2+250|uni1A63=2+250|uni1A60=2+0|uni1A3D=5+250|uni1A60=5+0]
+../fonts/573d3a3177c9a8646e94c8a0d7b224334340946a.ttf;--font-funcs=ft;U+11410,U+11442,U+200C,U+11411;[Ga=0+576|Virama=0@70,70+0|Gha=3+566]
+../fonts/573d3a3177c9a8646e94c8a0d7b224334340946a.ttf;--font-funcs=ft;U+11410,U+11442,U+200C,U+034F,U+11411;[Ga=0+576|Virama=0@70,70+0|Gha=4+566]
+../fonts/573d3a3177c9a8646e94c8a0d7b224334340946a.ttf;--font-funcs=ft;U+11410,U+200C,U+11442,U+034F,U+11411;[Ga.icd=0+367|Gha.diag=1@100,0+386]
+../fonts/e68a88939e0f06e34d2bc911f09b70890289c8fd.ttf;;U+AA00,U+200C,U+AA34;[raMedial_cham_pre=0+400|a_cham=0+1121]
+../fonts/2a670df15b73a5dc75a5cc491bde5ac93c5077dc.ttf;;U+11124,U+200D,U+11127;[u11124=0+514|u11127=0+0]
+../fonts/2a670df15b73a5dc75a5cc491bde5ac93c5077dc.ttf;;U+11124,U+2060,U+11127;[u11124=0+514|uni25CC=1+547|u11127=1+0]
diff --git a/test/shape/data/in-house/tests/use-vowel-letter-spoofing.tests b/test/shape/data/in-house/tests/use-vowel-letter-spoofing.tests
new file mode 100644 (file)
index 0000000..03b6bef
--- /dev/null
@@ -0,0 +1,94 @@
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0905,U+093A;[uni0905=0+500|uni25CC=0+500|uni093A=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0905,U+093B;[uni0905=0+500|uni25CC=0+500|uni093B=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0905,U+093E;[uni0905=0+500|uni25CC=0+500|uni093E=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0905,U+0945;[uni0905=0+500|uni25CC=0+500|uni0945=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0905,U+0946;[uni0905=0+500|uni25CC=0+500|uni0946=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0905,U+0949;[uni0905=0+500|uni25CC=0+500|uni0949=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0905,U+094A;[uni0905=0+500|uni25CC=0+500|uni094A=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0905,U+094B;[uni0905=0+500|uni25CC=0+500|uni094B=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0905,U+094C;[uni0905=0+500|uni25CC=0+500|uni094C=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0905,U+094F;[uni0905=0+500|uni25CC=0+500|uni094F=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0905,U+0956;[uni0905=0+500|uni25CC=0+500|uni0956=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0905,U+0957;[uni0905=0+500|uni25CC=0+500|uni0957=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0906,U+093A;[uni0906=0+500|uni25CC=0+500|uni093A=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0906,U+0945;[uni0906=0+500|uni25CC=0+500|uni0945=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0906,U+0946;[uni0906=0+500|uni25CC=0+500|uni0946=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0906,U+0947;[uni0906=0+500|uni25CC=0+500|uni0947=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0906,U+0948;[uni0906=0+500|uni25CC=0+500|uni0948=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0909,U+0941;[uni0909=0+500|uni25CC=0+500|uni0941=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+090F,U+0945;[uni090F=0+500|uni25CC=0+500|uni0945=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+090F,U+0946;[uni090F=0+500|uni25CC=0+500|uni0946=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+090F,U+0947;[uni090F=0+500|uni25CC=0+500|uni0947=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0930,U+094D,U+0907;[uni0930=0+500|uni094D=0+500|uni25CC=2+500|uni0907=2+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0985,U+09BE;[uni0985=0+500|uni25CC=0+500|.notdef=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+098B,U+09C3;[uni098B=0+500|uni25CC=0+500|uni09C3=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+098C,U+09E2;[uni098C=0+500|uni25CC=0+500|uni09E2=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0A05,U+0A3E;[uni0A05=0+500|uni25CC=0+500|uni0A3E=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0A05,U+0A48;[uni0A05=0+500|uni25CC=0+500|uni0A48=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0A05,U+0A4C;[uni0A05=0+500|uni25CC=0+500|uni0A4C=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0A72,U+0A3F;[uni0A72=0+500|uni0A3F=0+500|uni25CC=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0A72,U+0A40;[uni0A72=0+500|uni25CC=0+500|uni0A40=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0A72,U+0A47;[uni0A72=0+500|uni25CC=0+500|uni0A47=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0A73,U+0A41;[uni0A73=0+500|uni25CC=0+500|uni0A41=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0A73,U+0A42;[uni0A73=0+500|uni25CC=0+500|uni0A42=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0A73,U+0A4B;[uni0A73=0+500|uni25CC=0+500|uni0A4B=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0A85,U+0ABE,U+0AC5;[uni0A85=0+500|uni25CC=0+500|uni0ABE=0+500|uni25CC=0+500|uni0AC5=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0A85,U+0ABE,U+0AC8;[uni0A85=0+500|uni25CC=0+500|uni0ABE=0+500|uni25CC=0+500|uni0AC8=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0A85,U+0ABE;[uni0A85=0+500|uni25CC=0+500|uni0ABE=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0A85,U+0AC5;[uni0A85=0+500|uni25CC=0+500|uni0AC5=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0A85,U+0AC7;[uni0A85=0+500|uni25CC=0+500|uni0AC7=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0A85,U+0AC8;[uni0A85=0+500|uni25CC=0+500|uni0AC8=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0A85,U+0AC9;[uni0A85=0+500|uni25CC=0+500|uni0AC9=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0A85,U+0ACB;[uni0A85=0+500|uni25CC=0+500|uni0ACB=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0A85,U+0ACC;[uni0A85=0+500|uni25CC=0+500|uni0ACC=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0AC5,U+0ABE;[uni25CC=0+500|uni0AC5=0+500|uni25CC=0+500|uni0ABE=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0B05,U+0B3E;[uni0B05=0+500|uni25CC=0+500|uni0B3E=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0B0F,U+0B57;[uni0B0F=0+500|uni25CC=0+500|uni0B57=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0B13,U+0B57;[uni0B13=0+500|uni25CC=0+500|uni0B57=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0C12,U+0C4C;[uni0C12=0+500|uni25CC=0+500|uni0C4C=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0C12,U+0C55;[uni0C12=0+500|uni25CC=0+500|uni0C55=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0C3F,U+0C55;[uni25CC=0+500|uni0C3F=0+500|uni25CC=0+500|uni0C55=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0C46,U+0C55;[uni25CC=0+500|uni0C46=0+500|uni25CC=0+500|uni0C55=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0C4A,U+0C55;[uni25CC=0+500|uni0C4A=0+500|uni25CC=0+500|uni0C55=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0C89,U+0CBE;[uni0C89=0+500|uni25CC=0+500|uni0CBE=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0C8B,U+0CBE;[uni0C8B=0+500|uni25CC=0+500|uni0CBE=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0C92,U+0CCC;[uni0C92=0+500|uni25CC=0+500|uni0CCC=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0D07,U+0D57;[uni0D07=0+500|uni25CC=0+500|uni0D57=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0D09,U+0D57;[uni0D09=0+500|uni25CC=0+500|uni0D57=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0D0E,U+0D46;[uni0D0E=0+500|uni0D46=0+500|uni25CC=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0D12,U+0D3E;[uni0D12=0+500|uni25CC=0+500|uni0D3E=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0D12,U+0D57;[uni0D12=0+500|uni25CC=0+500|uni0D57=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0D85,U+0DCF;[uni0D85=0+500|uni25CC=0+500|uni0DCF=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0D85,U+0DD0;[uni0D85=0+500|uni25CC=0+500|uni0DD0=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0D85,U+0DD1;[uni0D85=0+500|uni25CC=0+500|uni0DD1=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0D8B,U+0DDF;[uni0D8B=0+500|uni25CC=0+500|uni0DDF=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0D8D,U+0DD8;[uni0D8D=0+500|uni25CC=0+500|uni0DD8=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0D8F,U+0DDF;[uni0D8F=0+500|uni25CC=0+500|uni0DDF=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0D91,U+0DCA;[uni0D91=0+500|uni25CC=0+500|uni0DCA=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0D91,U+0DD9;[uni0D91=0+500|uni0DD9=0+500|uni25CC=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0D91,U+0DDA;[uni0D91=0+500|uni0DD9=0+500|uni25CC=0+500|uni0DCA=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0D91,U+0DDC;[uni0D91=0+500|uni0DD9=0+500|uni25CC=0+500|uni0DCF=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0D91,U+0DDD;[uni0D91=0+500|uni0DD9=0+500|uni25CC=0+500|uni0DCF=0+500|uni0DCA=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0D91,U+0DDD;[uni0D91=0+500|uni0DD9=0+500|uni25CC=0+500|uni0DCF=0+500|uni0DCA=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+0D94,U+0DDF;[uni0D94=0+500|uni25CC=0+500|uni0DDF=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+11005,U+11038;[u11005=0+500|uni25CC=0+500|u11038=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+1100B,U+1103E;[u1100B=0+500|uni25CC=0+500|u1103E=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+1100F,U+11042;[u1100F=0+500|uni25CC=0+500|u11042=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+112B0,U+112E0;[u112B0=0+500|uni25CC=0+500|u112E0=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+112B0,U+112E5;[u112B0=0+500|uni25CC=0+500|u112E5=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+112B0,U+112E6;[u112B0=0+500|uni25CC=0+500|u112E6=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+112B0,U+112E7;[u112B0=0+500|uni25CC=0+500|u112E7=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+112B0,U+112E8;[u112B0=0+500|uni25CC=0+500|u112E8=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+11481,U+114B0;[u11481=0+500|uni25CC=0+500|u114B0=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+1148B,U+114BA;[u1148B=0+500|uni25CC=0+500|u114BA=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+1148D,U+114BA;[u1148D=0+500|uni25CC=0+500|u114BA=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+114AA,U+114B5;[u114AA=0+500|uni25CC=0+500|u114B5=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+114AA,U+114B6;[u114AA=0+500|uni25CC=0+500|u114B6=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+11600,U+11639;[u11600=0+500|uni25CC=0+500|u11639=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+11600,U+1163A;[u11600=0+500|uni25CC=0+500|u1163A=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+11601,U+11639;[u11601=0+500|uni25CC=0+500|u11639=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+11601,U+1163A;[u11601=0+500|uni25CC=0+500|u1163A=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+11680,U+116AD;[u11680=0+500|uni25CC=0+500|u116AD=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+11680,U+116B4;[u11680=0+500|uni25CC=0+500|u116B4=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+11680,U+116B5;[u11680=0+500|uni25CC=0+500|u116B5=0+500]
+../fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf;;U+11686,U+116B2;[u11686=0+500|uni25CC=0+500|u116B2=0+500]
diff --git a/test/shape/data/in-house/tests/use.tests b/test/shape/data/in-house/tests/use.tests
new file mode 100644 (file)
index 0000000..ebeda47
--- /dev/null
@@ -0,0 +1,15 @@
+../fonts/fbb6c84c9e1fe0c39e152fbe845e51fd81f6748e.ttf;;U+1B1B,U+1B44,U+1B13,U+1B3E;[gid3=0+990|gid7=0+2473|gid5=0@-293,-400+0]
+../fonts/4cce528e99f600ed9c25a2b69e32eb94a03b4ae8.ttf;;U+1A48,U+1A58,U+1A25,U+1A48,U+1A58,U+1A25,U+1A6E,U+1A63;[uni1A48=0+1212|uni1A25=0+1912|uni1A58=0+0|uni1A48=3+1212|uni1A6E=3+0|uni1A25=3+1912|uni1A58=3+0|uni1A63=3+1212]
+../fonts/f518eb6f6b5eec2946c9fbbbde44e45d46f5e2ac.ttf;;U+1A48,U+1A58,U+1A25,U+1A48,U+1A58,U+1A25,U+1A6E,U+1A63;[uni1A48=0+1212|uni1A25=0+1912|uni1A58=0+0|uni1A48=3+1212|uni1A6E=3+1211|uni1A25=3+1912|uni1A58=3+0|uni1A63=3+1212]
+../fonts/6ff0fbead4462d9f229167b4e6839eceb8465058.ttf;--font-funcs=ot;U+11103,U+11128;[u11103=0+837|u11128=0+0]
+../fonts/2a670df15b73a5dc75a5cc491bde5ac93c5077dc.ttf;;U+11124,U+1112E;[u11124=0+514|u11131=0+0|u11127=0+0]
+../fonts/2a670df15b73a5dc75a5cc491bde5ac93c5077dc.ttf;;U+11124,U+11131,U+11127;[u11124=0+514|u11131=0+0|u11127=0+0]
+../fonts/2a670df15b73a5dc75a5cc491bde5ac93c5077dc.ttf;;U+11124,U+11127,U+11131;[u11124=0+514|u11127=0+0|uni25CC=0+547|u11131=0+0]
+../fonts/2a670df15b73a5dc75a5cc491bde5ac93c5077dc.ttf;;U+11124,U+11134,U+11131;[u11124=0+514|u11134=0+0|u11131=0+0]
+../fonts/2a670df15b73a5dc75a5cc491bde5ac93c5077dc.ttf;;U+11124,U+11131,U+11134;[u11124=0+514|u11131=0+0|uni25CC=0+547|u11134=0+0]
+../fonts/573d3a3177c9a8646e94c8a0d7b224334340946a.ttf;;U+11410,U+11442,U+11411,U+11440,U+11443,U+11410,U+11442,U+11411,U+11441,U+11443;[E_dv.alt=0+275|Ga.icd=0+367|Gha.diag=0@100,0+386|AA_dv.alt=0+208|Candrabindu=0@17,-8+0|E_dv.alt=5+275|Ga.icd=5+367|Gha.diag=5@100,0+386|AU_dv_part.alt=5+213|Candrabindu.sm=5@-52,179+0]
+../fonts/dcf774ca21062e7439f98658b18974ea8b956d0c.ttf;;U+11328,U+1134D,U+1CF4;[gid1=0+793|gid2=0+0|gid3=0+0]
+../fonts/4afb0e8b9a86bb9bd73a1247de4e33fbe3c1fd93.ttf;;U+1C00,U+1C27,U+1C28,U+1C34,U+1C35;[uni1C35=0+500|uni1C34=0+500|uni1C28=0+500|uni1C27=0+500|uni1C00=0+500]
+../fonts/4afb0e8b9a86bb9bd73a1247de4e33fbe3c1fd93.ttf;;U+0D4E,U+0D15,U+0D4D,U+0D15,U+0D46;[uni0D15=0+500|uni0D4E=0+500|uni0D4D=0+500|uni0D46=3+500|uni0D15=3+500]
+../fonts/4afb0e8b9a86bb9bd73a1247de4e33fbe3c1fd93.ttf;;U+1102D,U+11046,U+11013,U+11046,U+11013,U+11046;[u11013=0+500|u11046_u11013=0+500|u1102D_u11046=0+500|u11046=0+500]
+../fonts/4afb0e8b9a86bb9bd73a1247de4e33fbe3c1fd93.ttf;;U+11083;[.notdef=0+500]
diff --git a/test/shape/data/in-house/tests/variations-rvrn.tests b/test/shape/data/in-house/tests/variations-rvrn.tests
new file mode 100644 (file)
index 0000000..3efcc93
--- /dev/null
@@ -0,0 +1,100 @@
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=1;U+0072;[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=11;U+0072;[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=21;U+0072;[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=31;U+0072;[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=41;U+0072;[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=51;U+0072;[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=61;U+0072;[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=71;U+0072;[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=81;U+0072;[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=91;U+0072;[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=101;U+0072;[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=111;U+0072;[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=121;U+0072;[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=131;U+0072;[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=141;U+0072;[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=151;U+0072;[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=161;U+0072;[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=171;U+0072;[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=181;U+0072;[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=191;U+0072;[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=201;U+0072;[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=211;U+0072;[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=221;U+0072;[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=231;U+0072;[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=241;U+0072;[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=251;U+0072;[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=261;U+0072;[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=271;U+0072;[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=281;U+0072;[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=291;U+0072;[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=301;U+0072;[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=311;U+0072;[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=321;U+0072;[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=331;U+0072;[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=341;U+0072;[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=351;U+0072;[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=361;U+0072;[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=371;U+0072;[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=381;U+0072;[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=391;U+0072;[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=401;U+0072;[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=411;U+0072;[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=421;U+0072;[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=431;U+0072;[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=441;U+0072;[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=451;U+0072;[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=461;U+0072;[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=471;U+0072;[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=481;U+0072;[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=491;U+0072;[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=501;U+0072;[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=511;U+0072;[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=521;U+0072;[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=531;U+0072;[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=541;U+0072;[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=551;U+0072;[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=561;U+0072;[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=571;U+0072;[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=581;U+0072;[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=591;U+0072;[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=601;U+0072;[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=611;U+0072;[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=621;U+0072;[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=631;U+0072;[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=641;U+0072;[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=651;U+0072;[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=661;U+0072;[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=671;U+0072;[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=681;U+0072;[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=691;U+0072;[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=701;U+0072;[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=711;U+0072;[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=721;U+0072;[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=731;U+0072;[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=741;U+0072;[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=751;U+0072;[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=761;U+0072;[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=771;U+0072;[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=781;U+0072;[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=791;U+0072;[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=801;U+0072;[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=811;U+0072;[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=821;U+0072;[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=831;U+0072;[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=841;U+0072;[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=851;U+0072;[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=861;U+0072;[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=871;U+0072;[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=881;U+0072;[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=891;U+0072;[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=901;U+0072;[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=911;U+0072;[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=921;U+0072;[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=931;U+0072;[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=941;U+0072;[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=951;U+0072;[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=961;U+0072;[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=971;U+0072;[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=981;U+0072;[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf;--variations=FVTT=991;U+0072;[rvrn_subst=0+1825]
diff --git a/test/shape/data/in-house/tests/variations.tests b/test/shape/data/in-house/tests/variations.tests
new file mode 100644 (file)
index 0000000..52f74f2
--- /dev/null
@@ -0,0 +1,5 @@
+../fonts/HBTest-VF.ttf;--variations=TEST=491;U+0041;[A=0+496]
+../fonts/HBTest-VF.ttf;--variations=TEST=509;U+0041;[A=0+505]
+../fonts/ab40c89624a6104e5d0a2308e448a989302f515b.ttf;--variations=wdth=60;U+0020;[space=0+266]
+../fonts/ab40c89624a6104e5d0a2308e448a989302f515b.ttf;--variations=wdth=402;U+0020;[space=0+639]
+../fonts/e8691822f6a705e3e9fb48a0405c645b1a036590.ttf;--variations=0001=500;U+002E,U+0065;[period=0+681|e=1+650]
diff --git a/test/shape/data/in-house/tests/vertical.tests b/test/shape/data/in-house/tests/vertical.tests
new file mode 100644 (file)
index 0000000..22bf266
--- /dev/null
@@ -0,0 +1,4 @@
+../fonts/191826b9643e3f124d865d617ae609db6a2ce203.ttf;--direction=t --font-funcs=ft;U+300C;[uni300C.vert=0@-512,-578+0,-1024]
+../fonts/f9b1dd4dcb515e757789a22cb4241107746fd3d0.ttf;--direction=t --font-funcs=ft;U+0041,U+0042;[gid1=0@-654,-2128+0,-2789|gid2=1@-665,-2125+0,-2789]
+../fonts/f9b1dd4dcb515e757789a22cb4241107746fd3d0.ttf;--direction=t --font-funcs=ot;U+0041,U+0042;[gid1=0@-654,-1468+0,-2048|gid2=1@-665,-1462+0,-2048]
+../fonts/4cbbc461be066fccc611dcc634af6e8cb2705537.ttf;--direction=t --font-funcs=ot;U+FF38;[gid2=0@-500,-867+0,-1000]
diff --git a/test/shape/data/in-house/tests/zero-width-marks.tests b/test/shape/data/in-house/tests/zero-width-marks.tests
new file mode 100644 (file)
index 0000000..ef7a66e
--- /dev/null
@@ -0,0 +1,11 @@
+../fonts/bb9473d2403488714043bcfb946c9f78b86ad627.ttf;;U+1030;[circledash=0+636|u1030.med=0@-162,0+0]
+../fonts/8454d22037f892e76614e1645d066689a0200e61.ttf;;U+05E0,U+05B8,U+0591,U+05DA,U+05B0;[uni05DA05B0=3+991|uni2009=0+200|uni0591=0@75,0+0|uni05B8=0@495,0+0|uni05E0=0+683]
+../fonts/45855bc8d46332b39c4ab9e2ee1a26b1f896da6b.ttf;;U+0E01,U+0E34,U+0E01;[gid1=0+1264|gid2=0@20,0+0|gid1=2+1264]
+../fonts/7a37dc4d5bf018456aea291cee06daf004c0221c.ttf;;U+0E01,U+0E34,U+0E01;[gid1=0+1264|gid2=0@20,0+1000|gid1=2+1264]
+../fonts/8099955657a54e9ee38a6ba1d6f950ce58e3cc25.ttf;;U+0E01,U+0E34,U+0E01;[gid1=0+1264|gid2=0+0|gid1=2+1264]
+../fonts/bb0c53752e85c3d28973ebc913287b8987d3dfe8.ttf;;U+0E01,U+0E34,U+0E01;[gid1=0+1264|gid2=0+0|gid1=2+1264]
+../fonts/ffa0f5d2d9025486d8469d8b1fdd983e7632499b.ttf;;U+0058,U+0303,U+0078,U+0303,U+006A,U+006A,U+006A,U+0303,U+006A,U+0303,U+006A,U+006A;[gid1=0+1200|gid6=0@-1029,340+0|gid3=2+1083|gid6=2@-992,0+0|gid2=4+528|gid2=5+528|gid5=6+528|gid6=6@-693,0+0|gid5=8+528|gid6=8@-693,0+0|gid2=10+528|gid2=11+528]
+../fonts/cc5f3d2d717fb6bd4dfae1c16d48a2cb8e12233b.ttf;;U+0058,U+0303,U+0078,U+0303,U+006A,U+006A,U+006A,U+0303,U+006A,U+0303,U+006A,U+006A;[gid1=0+1200|gid6=0@-1029,340+1200|gid3=2+1083|gid6=2@-992,0+1200|gid2=4+528|gid2=5+528|gid5=6+528|gid6=6@-693,0+1200|gid5=8+528|gid6=8@-693,0+1200|gid2=10+528|gid2=11+528]
+../fonts/fcdcffbdf1c4c97c05308d7600e4c283eb47dbca.ttf;;U+0058,U+0303,U+0078,U+0303,U+006A,U+006A,U+006A,U+0303,U+006A,U+0303,U+006A,U+006A;[gid1=0+1200|gid6=0+0|gid3=2+1083|gid6=2+0|gid2=4+528|gid2=5+528|gid5=6+528|gid6=6+0|gid5=8+528|gid6=8+0|gid2=10+528|gid2=11+528]
+../fonts/56cfd0e18d07f41c38e9598545a6d369127fc6f9.ttf;;U+0058,U+0303,U+0078,U+0303,U+006A,U+006A,U+006A,U+0303,U+006A,U+0303,U+006A,U+006A;[gid1=0+1200|gid6=0@-1029,340+0|gid3=2+1083|gid6=2@-992,0+0|gid2=4+528|gid2=5+528|gid5=6+528|gid6=6@-693,0+0|gid5=8+528|gid6=8@-693,0+0|gid2=10+528|gid2=11+528]
+../fonts/a98e908e2ed21b22228ea59ebcc0f05034c86f2e.ttf;;U+0041,U+0042,U+0041;[A=0+1368|B=1+0|A=2+1368]
diff --git a/test/shape/data/text-rendering-tests/Makefile.am b/test/shape/data/text-rendering-tests/Makefile.am
new file mode 100644 (file)
index 0000000..19ac3b3
--- /dev/null
@@ -0,0 +1,32 @@
+# Process this file with automake to produce Makefile.in
+
+NULL =
+
+# Convenience targets:
+lib:
+       @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
+
+update:
+       (cd $(srcdir) && ./update.sh)
+
+EXTRA_DIST = \
+       README \
+       COPYING \
+       DISABLED \
+       update.py \
+       meson.build \
+       fonts \
+       $(TESTS) \
+       $(NULL)
+
+TEST_EXTENSIONS = .tests
+if HAVE_FREETYPE
+TESTS_ENVIRONMENT = HAVE_FREETYPE=1
+else
+TESTS_ENVIRONMENT = HAVE_FREETYPE=0
+endif
+TESTS_LOG_COMPILER = $(srcdir)/../../run-tests.py $(top_builddir)/util/hb-shape$(EXEEXT)
+
+include Makefile.sources
+
+-include $(top_srcdir)/git.mk
diff --git a/test/shape/data/text-rendering-tests/Makefile.in b/test/shape/data/text-rendering-tests/Makefile.in
new file mode 100644 (file)
index 0000000..6b3acc3
--- /dev/null
@@ -0,0 +1,952 @@
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Process this file with automake to produce Makefile.in
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+TESTS = tests/AVAR-1.tests tests/CFF-1.tests tests/CFF-2.tests \
+       tests/CFF2-1.tests tests/CMAP-1.tests tests/CMAP-2.tests \
+       tests/CVAR-1.tests tests/CVAR-2.tests tests/GLYF-1.tests \
+       tests/GPOS-1.tests tests/GPOS-2.tests tests/GPOS-3.tests \
+       tests/GPOS-4.tests tests/GPOS-5.tests tests/GSUB-1.tests \
+       tests/GSUB-2.tests tests/GSUB-3.tests tests/GVAR-1.tests \
+       tests/GVAR-2.tests tests/GVAR-3.tests tests/GVAR-4.tests \
+       tests/GVAR-5.tests tests/GVAR-6.tests tests/GVAR-7.tests \
+       tests/GVAR-8.tests tests/GVAR-9.tests tests/HVAR-1.tests \
+       tests/HVAR-2.tests tests/KERN-1.tests tests/KERN-2.tests \
+       tests/MORX-1.tests tests/MORX-10.tests tests/MORX-11.tests \
+       tests/MORX-12.tests tests/MORX-13.tests tests/MORX-14.tests \
+       tests/MORX-16.tests tests/MORX-17.tests tests/MORX-18.tests \
+       tests/MORX-19.tests tests/MORX-2.tests tests/MORX-20.tests \
+       tests/MORX-21.tests tests/MORX-22.tests tests/MORX-23.tests \
+       tests/MORX-24.tests tests/MORX-25.tests tests/MORX-26.tests \
+       tests/MORX-27.tests tests/MORX-28.tests tests/MORX-29.tests \
+       tests/MORX-3.tests tests/MORX-30.tests tests/MORX-31.tests \
+       tests/MORX-32.tests tests/MORX-33.tests tests/MORX-34.tests \
+       tests/MORX-35.tests tests/MORX-36.tests tests/MORX-37.tests \
+       tests/MORX-38.tests tests/MORX-39.tests tests/MORX-4.tests \
+       tests/MORX-40.tests tests/MORX-41.tests tests/MORX-5.tests \
+       tests/MORX-6.tests tests/MORX-7.tests tests/MORX-8.tests \
+       tests/MORX-9.tests tests/SFNT-1.tests tests/SFNT-2.tests \
+       tests/SHBALI-3.tests tests/SHKNDA-1.tests $(am__EXEEXT_1)
+subdir = test/shape/data/text-rendering-tests
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_link_flag.m4 \
+       $(top_srcdir)/m4/ax_code_coverage.m4 \
+       $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \
+       $(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/gtk-doc.m4 \
+       $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
+       $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+       $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+am__tty_colors_dummy = \
+  mgn= red= grn= lgn= blu= brg= std=; \
+  am__color_tests=no
+am__tty_colors = { \
+  $(am__tty_colors_dummy); \
+  if test "X$(AM_COLOR_TESTS)" = Xno; then \
+    am__color_tests=no; \
+  elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+    am__color_tests=yes; \
+  elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+    am__color_tests=yes; \
+  fi; \
+  if test $$am__color_tests = yes; then \
+    red='\e[0;31m'; \
+    grn='\e[0;32m'; \
+    lgn='\e[1;32m'; \
+    blu='\e[1;34m'; \
+    mgn='\e[0;35m'; \
+    brg='\e[1m'; \
+    std='\e[m'; \
+  fi; \
+}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__recheck_rx = ^[    ]*:recheck:[    ]*
+am__global_test_result_rx = ^[         ]*:global-test-result:[         ]*
+am__copy_in_global_log_rx = ^[         ]*:copy-in-global-log:[         ]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+  recheck = 1; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+        { \
+          if ((getline line2 < ($$0 ".log")) < 0) \
+           recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+        { \
+          recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+        { \
+          break; \
+        } \
+    }; \
+  if (recheck) \
+    print $$0; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+  print "fatal: making $@: " msg | "cat >&2"; \
+  exit 1; \
+} \
+function rst_section(header) \
+{ \
+  print header; \
+  len = length(header); \
+  for (i = 1; i <= len; i = i + 1) \
+    printf "="; \
+  printf "\n\n"; \
+} \
+{ \
+  copy_in_global_log = 1; \
+  global_test_result = "RUN"; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+         fatal("failed to read from " $$0 ".trs"); \
+      if (line ~ /$(am__global_test_result_rx)/) \
+        { \
+          sub("$(am__global_test_result_rx)", "", line); \
+          sub("[       ]*$$", "", line); \
+          global_test_result = line; \
+        } \
+      else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+        copy_in_global_log = 0; \
+    }; \
+  if (copy_in_global_log) \
+    { \
+      rst_section(global_test_result ": " $$0); \
+      while ((rc = (getline line < ($$0 ".log"))) != 0) \
+      { \
+        if (rc < 0) \
+          fatal("failed to read from " $$0 ".log"); \
+        print line; \
+      }; \
+      printf "\n"; \
+    }; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/   &   /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this.  Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+  --color-tests "$$am__color_tests" \
+  --enable-hard-errors "$$am__enable_hard_errors" \
+  --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test.  Creates the
+# directory for the log if needed.  Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log.  Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT.  Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup);                                     \
+$(am__vpath_adj_setup) $(am__vpath_adj)                        \
+$(am__tty_colors);                                     \
+srcdir=$(srcdir); export srcdir;                       \
+case "$@" in                                           \
+  */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;;   \
+    *) am__odir=.;;                                    \
+esac;                                                  \
+test "x$$am__odir" = x"." || test -d "$$am__odir"      \
+  || $(MKDIR_P) "$$am__odir" || exit $$?;              \
+if test -f "./$$f"; then dir=./;                       \
+elif test -f "$$f"; then dir=;                         \
+else dir="$(srcdir)/"; fi;                             \
+tst=$$dir$$f; log='$@';                                \
+if test -n '$(DISABLE_HARD_ERRORS)'; then              \
+  am__enable_hard_errors=no;                           \
+else                                                   \
+  am__enable_hard_errors=yes;                          \
+fi;                                                    \
+case " $(XFAIL_TESTS) " in                             \
+  *[\ \        ]$$f[\ \        ]* | *[\ \      ]$$dir$$f[\ \   ]*) \
+    am__expect_failure=yes;;                           \
+  *)                                                   \
+    am__expect_failure=no;;                            \
+esac;                                                  \
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed).  The result is saved in the shell variable
+# '$bases'.  This honors runtime overriding of TESTS and TEST_LOGS.  Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+  bases='$(TEST_LOGS)'; \
+  bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+  bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+am__EXEEXT_1 =
+TEST_SUITE_LOG = test-suite.log
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
+TEST_LOGS = $(am__test_logs2:.tests.log=.log)
+TESTS_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+TESTS_LOG_COMPILE = $(TESTS_LOG_COMPILER) $(AM_TESTS_LOG_FLAGS) \
+       $(TESTS_LOG_FLAGS)
+am__set_b = \
+  case '$@' in \
+    */*) \
+      case '$*' in \
+        */*) b='$*';; \
+          *) b=`echo '$@' | sed 's/\.log$$//'`; \
+       esac;; \
+    *) \
+      b='$*';; \
+  esac
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.sources \
+       $(top_srcdir)/test-driver COPYING README
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CAIRO_CFLAGS = @CAIRO_CFLAGS@
+CAIRO_FT_CFLAGS = @CAIRO_FT_CFLAGS@
+CAIRO_FT_LIBS = @CAIRO_FT_LIBS@
+CAIRO_LIBS = @CAIRO_LIBS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHAFA_CFLAGS = @CHAFA_CFLAGS@
+CHAFA_LIBS = @CHAFA_LIBS@
+CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
+CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
+CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
+CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
+CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
+CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
+CORETEXT_CFLAGS = @CORETEXT_CFLAGS@
+CORETEXT_LIBS = @CORETEXT_LIBS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DIRECTWRITE_CXXFLAGS = @DIRECTWRITE_CXXFLAGS@
+DIRECTWRITE_LIBS = @DIRECTWRITE_LIBS@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
+FREETYPE_DEPS = @FREETYPE_DEPS@
+FREETYPE_LIBS = @FREETYPE_LIBS@
+GCOV = @GCOV@
+GDI_CFLAGS = @GDI_CFLAGS@
+GDI_LIBS = @GDI_LIBS@
+GENHTML = @GENHTML@
+GIT = @GIT@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_DEPS = @GLIB_DEPS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GOBJECT_CFLAGS = @GOBJECT_CFLAGS@
+GOBJECT_LIBS = @GOBJECT_LIBS@
+GRAPHITE2_CFLAGS = @GRAPHITE2_CFLAGS@
+GRAPHITE2_DEPS = @GRAPHITE2_DEPS@
+GRAPHITE2_LIBS = @GRAPHITE2_LIBS@
+GREP = @GREP@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@
+GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
+GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
+GTKDOC_MKPDF = @GTKDOC_MKPDF@
+GTKDOC_REBASE = @GTKDOC_REBASE@
+HAVE_CXX11 = @HAVE_CXX11@
+HB_LIBTOOL_VERSION_INFO = @HB_LIBTOOL_VERSION_INFO@
+HB_VERSION = @HB_VERSION@
+HB_VERSION_MAJOR = @HB_VERSION_MAJOR@
+HB_VERSION_MICRO = @HB_VERSION_MICRO@
+HB_VERSION_MINOR = @HB_VERSION_MINOR@
+HTML_DIR = @HTML_DIR@
+ICU_CFLAGS = @ICU_CFLAGS@
+ICU_LIBS = @ICU_LIBS@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+LCOV = @LCOV@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
+RAGEL = @RAGEL@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+UNISCRIBE_CFLAGS = @UNISCRIBE_CFLAGS@
+UNISCRIBE_LIBS = @UNISCRIBE_LIBS@
+VERSION = @VERSION@
+_GI_EXP_DATADIR = @_GI_EXP_DATADIR@
+_GI_EXP_LIBDIR = @_GI_EXP_LIBDIR@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+have_gobject = @have_gobject@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+NULL = 
+EXTRA_DIST = \
+       README \
+       COPYING \
+       DISABLED \
+       update.py \
+       meson.build \
+       fonts \
+       $(TESTS) \
+       $(NULL)
+
+TEST_EXTENSIONS = .tests
+@HAVE_FREETYPE_FALSE@TESTS_ENVIRONMENT = HAVE_FREETYPE=0
+@HAVE_FREETYPE_TRUE@TESTS_ENVIRONMENT = HAVE_FREETYPE=1
+TESTS_LOG_COMPILER = $(srcdir)/../../run-tests.py $(top_builddir)/util/hb-shape$(EXEEXT)
+DISBALED_TESTS = \
+       tests/CMAP-3.tests \
+       tests/SHARAN-1.tests \
+       tests/SHBALI-1.tests \
+       tests/SHBALI-2.tests \
+       tests/SHKNDA-2.tests \
+       tests/SHKNDA-3.tests \
+       tests/SHLANA-1.tests \
+       tests/SHLANA-10.tests \
+       tests/SHLANA-2.tests \
+       tests/SHLANA-3.tests \
+       tests/SHLANA-4.tests \
+       tests/SHLANA-5.tests \
+       tests/SHLANA-6.tests \
+       tests/SHLANA-7.tests \
+       tests/SHLANA-8.tests \
+       tests/SHLANA-9.tests \
+       $(NULL)
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .log .tests .tests$(EXEEXT) .trs
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am $(srcdir)/Makefile.sources $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+               && { if test -f $@; then exit 0; else break; fi; }; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits test/shape/data/text-rendering-tests/Makefile'; \
+       $(am__cd) $(top_srcdir) && \
+         $(AUTOMAKE) --gnits test/shape/data/text-rendering-tests/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+       esac;
+$(srcdir)/Makefile.sources $(am__empty):
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+       -rm -f *.lo
+
+clean-libtool:
+       -rm -rf .libs _libs
+tags TAGS:
+
+ctags CTAGS:
+
+cscope cscopelist:
+
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'.  Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+       rm -f $< $@
+       $(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+       @:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+       @$(am__set_TESTS_bases); \
+       am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+       redo_bases=`for i in $$bases; do \
+                     am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+                   done`; \
+       if test -n "$$redo_bases"; then \
+         redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+         redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+         if $(am__make_dryrun); then :; else \
+           rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+         fi; \
+       fi; \
+       if test -n "$$am__remaking_logs"; then \
+         echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+              "recursion detected" >&2; \
+       elif test -n "$$redo_logs"; then \
+         am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+       fi; \
+       if $(am__make_dryrun); then :; else \
+         st=0;  \
+         errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+         for i in $$redo_bases; do \
+           test -f $$i.trs && test -r $$i.trs \
+             || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+           test -f $$i.log && test -r $$i.log \
+             || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+         done; \
+         test $$st -eq 0 || exit 1; \
+       fi
+       @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+       ws='[   ]'; \
+       results=`for b in $$bases; do echo $$b.trs; done`; \
+       test -n "$$results" || results=/dev/null; \
+       all=`  grep "^$$ws*:test-result:"           $$results | wc -l`; \
+       pass=` grep "^$$ws*:test-result:$$ws*PASS"  $$results | wc -l`; \
+       fail=` grep "^$$ws*:test-result:$$ws*FAIL"  $$results | wc -l`; \
+       skip=` grep "^$$ws*:test-result:$$ws*SKIP"  $$results | wc -l`; \
+       xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+       xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+       error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+       if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+         success=true; \
+       else \
+         success=false; \
+       fi; \
+       br='==================='; br=$$br$$br$$br$$br; \
+       result_count () \
+       { \
+           if test x"$$1" = x"--maybe-color"; then \
+             maybe_colorize=yes; \
+           elif test x"$$1" = x"--no-color"; then \
+             maybe_colorize=no; \
+           else \
+             echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+           fi; \
+           shift; \
+           desc=$$1 count=$$2; \
+           if test $$maybe_colorize = yes && test $$count -gt 0; then \
+             color_start=$$3 color_end=$$std; \
+           else \
+             color_start= color_end=; \
+           fi; \
+           echo "$${color_start}# $$desc $$count$${color_end}"; \
+       }; \
+       create_testsuite_report () \
+       { \
+         result_count $$1 "TOTAL:" $$all   "$$brg"; \
+         result_count $$1 "PASS: " $$pass  "$$grn"; \
+         result_count $$1 "SKIP: " $$skip  "$$blu"; \
+         result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+         result_count $$1 "FAIL: " $$fail  "$$red"; \
+         result_count $$1 "XPASS:" $$xpass "$$red"; \
+         result_count $$1 "ERROR:" $$error "$$mgn"; \
+       }; \
+       {                                                               \
+         echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" |       \
+           $(am__rst_title);                                           \
+         create_testsuite_report --no-color;                           \
+         echo;                                                         \
+         echo ".. contents:: :depth: 2";                               \
+         echo;                                                         \
+         for b in $$bases; do echo $$b; done                           \
+           | $(am__create_global_log);                                 \
+       } >$(TEST_SUITE_LOG).tmp || exit 1;                             \
+       mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG);                     \
+       if $$success; then                                              \
+         col="$$grn";                                                  \
+        else                                                           \
+         col="$$red";                                                  \
+         test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG);               \
+       fi;                                                             \
+       echo "$${col}$$br$${std}";                                      \
+       echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}";   \
+       echo "$${col}$$br$${std}";                                      \
+       create_testsuite_report --maybe-color;                          \
+       echo "$$col$$br$$std";                                          \
+       if $$success; then :; else                                      \
+         echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}";         \
+         if test -n "$(PACKAGE_BUGREPORT)"; then                       \
+           echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
+         fi;                                                           \
+         echo "$$col$$br$$std";                                        \
+       fi;                                                             \
+       $$success || exit 1
+
+check-TESTS: 
+       @list='$(RECHECK_LOGS)';           test -z "$$list" || rm -f $$list
+       @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+       @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+       @set +e; $(am__set_TESTS_bases); \
+       log_list=`for i in $$bases; do echo $$i.log; done`; \
+       trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+       log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+       $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+       exit $$?;
+recheck: all 
+       @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+       @set +e; $(am__set_TESTS_bases); \
+       bases=`for i in $$bases; do echo $$i; done \
+                | $(am__list_recheck_tests)` || exit 1; \
+       log_list=`for i in $$bases; do echo $$i.log; done`; \
+       log_list=`echo $$log_list`; \
+       $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+               am__force_recheck=am--force-recheck \
+               TEST_LOGS="$$log_list"; \
+       exit $$?
+.tests.log:
+       @p='$<'; \
+       $(am__set_b); \
+       $(am__check_pre) $(TESTS_LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_TESTS_LOG_DRIVER_FLAGS) $(TESTS_LOG_DRIVER_FLAGS) -- $(TESTS_LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+@am__EXEEXT_TRUE@.tests$(EXEEXT).log:
+@am__EXEEXT_TRUE@      @p='$<'; \
+@am__EXEEXT_TRUE@      $(am__set_b); \
+@am__EXEEXT_TRUE@      $(am__check_pre) $(TESTS_LOG_DRIVER) --test-name "$$f" \
+@am__EXEEXT_TRUE@      --log-file $$b.log --trs-file $$b.trs \
+@am__EXEEXT_TRUE@      $(am__common_driver_flags) $(AM_TESTS_LOG_DRIVER_FLAGS) $(TESTS_LOG_DRIVER_FLAGS) -- $(TESTS_LOG_COMPILE) \
+@am__EXEEXT_TRUE@      "$$tst" $(AM_TESTS_FD_REDIRECT)
+
+distdir: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       list='$(DISTFILES)'; \
+         dist_files=`for file in $$list; do echo $$file; done | \
+         sed -e "s|^$$srcdirstrip/||;t" \
+             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+       case $$dist_files in \
+         */*) $(MKDIR_P) `echo "$$dist_files" | \
+                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+                          sort -u` ;; \
+       esac; \
+       for file in $$dist_files; do \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         if test -d $$d/$$file; then \
+           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+           if test -d "$(distdir)/$$file"; then \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+         else \
+           test -f "$(distdir)/$$file" \
+           || cp -p $$d/$$file "$(distdir)/$$file" \
+           || exit 1; \
+         fi; \
+       done
+check-am: all-am
+       $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
+mostlyclean-generic:
+       -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+       -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+       -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+
+clean-generic:
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+       -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: all all-am check check-TESTS check-am clean clean-generic \
+       clean-libtool cscopelist-am ctags-am distclean \
+       distclean-generic distclean-libtool distdir dvi dvi-am html \
+       html-am info info-am install install-am install-data \
+       install-data-am install-dvi install-dvi-am install-exec \
+       install-exec-am install-html install-html-am install-info \
+       install-info-am install-man install-pdf install-pdf-am \
+       install-ps install-ps-am install-strip installcheck \
+       installcheck-am installdirs maintainer-clean \
+       maintainer-clean-generic mostlyclean mostlyclean-generic \
+       mostlyclean-libtool pdf pdf-am ps ps-am recheck tags-am \
+       uninstall uninstall-am
+
+.PRECIOUS: Makefile
+
+
+# Convenience targets:
+lib:
+       @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
+
+update:
+       (cd $(srcdir) && ./update.sh)
+
+-include $(top_srcdir)/git.mk
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/test/shape/data/text-rendering-tests/tests/AVAR-1.tests b/test/shape/data/text-rendering-tests/tests/AVAR-1.tests
new file mode 100644 (file)
index 0000000..b6203c0
--- /dev/null
@@ -0,0 +1,17 @@
+../fonts/TestAVAR.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=100;U+2A01;[gid1]
+../fonts/TestAVAR.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=150;U+2A01;[gid1]
+../fonts/TestAVAR.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=200;U+2A01;[gid1]
+../fonts/TestAVAR.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=250;U+2A01;[gid1]
+../fonts/TestAVAR.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=300;U+2A01;[gid1]
+../fonts/TestAVAR.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=350;U+2A01;[gid1]
+../fonts/TestAVAR.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=400;U+2A01;[gid1]
+../fonts/TestAVAR.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=450;U+2A01;[gid1]
+../fonts/TestAVAR.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=500;U+2A01;[gid1]
+../fonts/TestAVAR.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=550;U+2A01;[gid1]
+../fonts/TestAVAR.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=600;U+2A01;[gid1]
+../fonts/TestAVAR.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=650;U+2A01;[gid1]
+../fonts/TestAVAR.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=700;U+2A01;[gid1]
+../fonts/TestAVAR.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=750;U+2A01;[gid1]
+../fonts/TestAVAR.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=800;U+2A01;[gid1]
+../fonts/TestAVAR.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=850;U+2A01;[gid1]
+../fonts/TestAVAR.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=900;U+2A01;[gid1]
diff --git a/test/shape/data/text-rendering-tests/tests/CFF-1.tests b/test/shape/data/text-rendering-tests/tests/CFF-1.tests
new file mode 100644 (file)
index 0000000..0d0d252
--- /dev/null
@@ -0,0 +1,13 @@
+../fonts/FDArrayTest257.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041;[gid66]
+../fonts/FDArrayTest257.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+211D;[gid30]
+../fonts/FDArrayTest257.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+24EA;[gid235]
+../fonts/FDArrayTest257.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+2460;[gid97]
+../fonts/FDArrayTest257.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+2461;[gid98]
+../fonts/FDArrayTest257.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+4EFF;[gid256]
+../fonts/FDArrayTest257.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+FF21;[gid34]
+../fonts/FDArrayTest257.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+10133;[gid52]
+../fonts/FDArrayTest257.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+1D4D0;[gid209]
+../fonts/FDArrayTest257.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+1F33A;[gid59]
+../fonts/FDArrayTest257.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+1F33B;[gid60]
+../fonts/FDArrayTest257.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+1F4A7;[gid168]
+../fonts/FDArrayTest257.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+1F95D;[gid94]
diff --git a/test/shape/data/text-rendering-tests/tests/CFF-2.tests b/test/shape/data/text-rendering-tests/tests/CFF-2.tests
new file mode 100644 (file)
index 0000000..3893b14
--- /dev/null
@@ -0,0 +1,13 @@
+../fonts/FDArrayTest65535.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041;[gid66]
+../fonts/FDArrayTest65535.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+211D;[gid8478]
+../fonts/FDArrayTest65535.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+24EA;[gid9451]
+../fonts/FDArrayTest65535.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+2460;[gid9313]
+../fonts/FDArrayTest65535.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+2461;[gid9314]
+../fonts/FDArrayTest65535.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+4EFF;[gid20224]
+../fonts/FDArrayTest65535.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+FF21;[gid65314]
+../fonts/FDArrayTest65535.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+10133;[gid308]
+../fonts/FDArrayTest65535.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+1D4D0;[gid54481]
+../fonts/FDArrayTest65535.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+1F33A;[gid62267]
+../fonts/FDArrayTest65535.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+1F33B;[gid62268]
+../fonts/FDArrayTest65535.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+1F4A7;[gid62632]
+../fonts/FDArrayTest65535.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+1F95D;[gid63838]
diff --git a/test/shape/data/text-rendering-tests/tests/CFF2-1.tests b/test/shape/data/text-rendering-tests/tests/CFF2-1.tests
new file mode 100644 (file)
index 0000000..97ead22
--- /dev/null
@@ -0,0 +1,9 @@
+../fonts/AdobeVFPrototype-Subset.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=100;U+0024;[dollar]
+../fonts/AdobeVFPrototype-Subset.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=200;U+0024;[dollar]
+../fonts/AdobeVFPrototype-Subset.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=300;U+0024;[dollar]
+../fonts/AdobeVFPrototype-Subset.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=400;U+0024;[dollar]
+../fonts/AdobeVFPrototype-Subset.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=500;U+0024;[dollar]
+../fonts/AdobeVFPrototype-Subset.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=600;U+0024;[dollar]
+../fonts/AdobeVFPrototype-Subset.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=700;U+0024;[dollar]
+../fonts/AdobeVFPrototype-Subset.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=800;U+0024;[dollar.nostroke]
+../fonts/AdobeVFPrototype-Subset.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=900;U+0024;[dollar.nostroke]
diff --git a/test/shape/data/text-rendering-tests/tests/CMAP-1.tests b/test/shape/data/text-rendering-tests/tests/CMAP-1.tests
new file mode 100644 (file)
index 0000000..708c0be
--- /dev/null
@@ -0,0 +1,4 @@
+../fonts/TestCMAP14.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+82A6;[uni82A6_uE0100]
+../fonts/TestCMAP14.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+82A6,U+E0100;[uni82A6_uE0100]
+../fonts/TestCMAP14.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+82A6,U+E0101;[uni82A6_uE0101]
+../fonts/TestCMAP14.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+82A6,U+E0102;[uni82A6_uE0100]
diff --git a/test/shape/data/text-rendering-tests/tests/CMAP-2.tests b/test/shape/data/text-rendering-tests/tests/CMAP-2.tests
new file mode 100644 (file)
index 0000000..d035f7c
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/TestCMAP14.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+2269;[uni2269]
+../fonts/TestCMAP14.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+2269,U+FE00;[uni2269FE00]
diff --git a/test/shape/data/text-rendering-tests/tests/CVAR-1.tests b/test/shape/data/text-rendering-tests/tests/CVAR-1.tests
new file mode 100644 (file)
index 0000000..a4dd2a5
--- /dev/null
@@ -0,0 +1,3 @@
+../fonts/TestCVARGVARTwo.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=28,wdth=100,opsz=72;U+0068,U+006F,U+006E;[uni0068|uni006F@595,0|uni006E@1126,0]
+../fonts/TestCVARGVARTwo.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=94,wdth=100,opsz=72;U+0068,U+006F,U+006E;[uni0068|uni006F@635,0|uni006E@1212,0]
+../fonts/TestCVARGVARTwo.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=194,wdth=100,opsz=72;U+0068,U+006F,U+006E;[uni0068|uni006F@691,0|uni006E@1331,0]
diff --git a/test/shape/data/text-rendering-tests/tests/CVAR-2.tests b/test/shape/data/text-rendering-tests/tests/CVAR-2.tests
new file mode 100644 (file)
index 0000000..f797c94
--- /dev/null
@@ -0,0 +1,3 @@
+../fonts/TestCVARGVAROne.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=28,wdth=100,opsz=72;U+0068,U+006F,U+006E;[uni0068|uni006F@595,0|uni006E@1126,0]
+../fonts/TestCVARGVAROne.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=94,wdth=100,opsz=72;U+0068,U+006F,U+006E;[uni0068|uni006F@635,0|uni006E@1212,0]
+../fonts/TestCVARGVAROne.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=194,wdth=100,opsz=72;U+0068,U+006F,U+006E;[uni0068|uni006F@691,0|uni006E@1331,0]
diff --git a/test/shape/data/text-rendering-tests/tests/GLYF-1.tests b/test/shape/data/text-rendering-tests/tests/GLYF-1.tests
new file mode 100644 (file)
index 0000000..6b49191
--- /dev/null
@@ -0,0 +1 @@
+../fonts/TestGLYFOne.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0123;[gcommaabove]
diff --git a/test/shape/data/text-rendering-tests/tests/GPOS-1.tests b/test/shape/data/text-rendering-tests/tests/GPOS-1.tests
new file mode 100644 (file)
index 0000000..dfdf0b4
--- /dev/null
@@ -0,0 +1,19 @@
+../fonts/TestGPOSOne.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0104,U+004A;[Aogonek|J@732,0]
+../fonts/TestGPOSOne.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0104,U+0067;[Aogonek|g@692,0]
+../fonts/TestGPOSOne.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0104,U+0123;[Aogonek|gcommaabove@692,0]
+../fonts/TestGPOSOne.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0104,U+006A;[Aogonek|j@752,0]
+../fonts/TestGPOSOne.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0104,U+0237;[Aogonek|dotlessj@752,0]
+../fonts/TestGPOSOne.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0051,U+0237;[Q|dotlessj@734,0]
+../fonts/TestGPOSOne.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0105,U+006A;[aogonek|j@588,0]
+../fonts/TestGPOSOne.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0105,U+0237;[aogonek|dotlessj@588,0]
+../fonts/TestGPOSOne.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0067,U+0237;[g|dotlessj@563,0]
+../fonts/TestGPOSOne.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0123,U+0237;[gcommaabove|dotlessj@563,0]
+../fonts/TestGPOSOne.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0131,U+0237;[dotlessi|dotlessj@334,0]
+../fonts/TestGPOSOne.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0173,U+0237;[uogonek|dotlessj@656,0]
+../fonts/TestGPOSOne.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0076,U+0237;[v|dotlessj@587,0]
+../fonts/TestGPOSOne.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0056,U+0061;[V|a@594,0]
+../fonts/TestGPOSOne.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0056,U+00E1;[V|aacute@594,0]
+../fonts/TestGPOSOne.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0056,U+0105;[V|aogonek@594,0]
+../fonts/TestGPOSOne.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0056,U+0066;[V|f@634,0]
+../fonts/TestGPOSOne.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0056,U+FB02;[V|fl@634,0]
+../fonts/TestGPOSOne.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0056,U+002E;[V|period@504,0]
diff --git a/test/shape/data/text-rendering-tests/tests/GPOS-2.tests b/test/shape/data/text-rendering-tests/tests/GPOS-2.tests
new file mode 100644 (file)
index 0000000..3784c40
--- /dev/null
@@ -0,0 +1,3 @@
+../fonts/TestGPOSTwo.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+25EF;[uni25EF]
+../fonts/TestGPOSTwo.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+263C;[sun]
+../fonts/TestGPOSTwo.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+25EF,U+263C;[uni25EF|sun]
diff --git a/test/shape/data/text-rendering-tests/tests/GPOS-3.tests b/test/shape/data/text-rendering-tests/tests/GPOS-3.tests
new file mode 100644 (file)
index 0000000..e72d82b
--- /dev/null
@@ -0,0 +1,4 @@
+../fonts/TestShapeEthi.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+1208;[uni1208]
+../fonts/TestShapeEthi.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+1208,U+135E;[uni1208|uni135E@303,0]
+../fonts/TestShapeEthi.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+1208,U+135F;[uni1208|uni135F@303,0]
+../fonts/TestShapeEthi.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+1208,U+135D;[uni1208|uni135D@303,0]
diff --git a/test/shape/data/text-rendering-tests/tests/GPOS-4.tests b/test/shape/data/text-rendering-tests/tests/GPOS-4.tests
new file mode 100644 (file)
index 0000000..7596c50
--- /dev/null
@@ -0,0 +1,4 @@
+../fonts/TestGPOSThree.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0075,U+0308,U+0301;[u|uni0308@529,-31|acutecomb@537,138]
+../fonts/TestGPOSThree.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0075,U+0308,U+0304;[u|uni0308@529,-31|uni0304@526,138]
+../fonts/TestGPOSThree.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0075,U+0308,U+0308;[u|uni0308@529,-31|uni0308@529,138]
+../fonts/TestGPOSThree.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0075,U+0308,U+0308,U+0308;[u|uni0308@529,-31|uni0308@529,138|uni0308@529,307]
diff --git a/test/shape/data/text-rendering-tests/tests/GPOS-5.tests b/test/shape/data/text-rendering-tests/tests/GPOS-5.tests
new file mode 100644 (file)
index 0000000..821a19b
--- /dev/null
@@ -0,0 +1,5 @@
+../fonts/TestGPOSFour.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=100;U+0634,U+0652;[uni0652@663,144|uni0634]
+../fonts/TestGPOSFour.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=300;U+0634,U+0652;[uni0652@680,165|uni0634]
+../fonts/TestGPOSFour.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=600;U+0634,U+0652;[uni0652@730,246|uni0634]
+../fonts/TestGPOSFour.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=700;U+0634,U+0652;[uni0652@750,282|uni0634]
+../fonts/TestGPOSFour.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=900;U+0634,U+0652;[uni0652@784,351|uni0634]
diff --git a/test/shape/data/text-rendering-tests/tests/GSUB-1.tests b/test/shape/data/text-rendering-tests/tests/GSUB-1.tests
new file mode 100644 (file)
index 0000000..7e185f7
--- /dev/null
@@ -0,0 +1 @@
+../fonts/TestGSUBOne.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0061,U+0020,U+0061;[a.alt|space@500,0|a@1000,0]
diff --git a/test/shape/data/text-rendering-tests/tests/GSUB-2.tests b/test/shape/data/text-rendering-tests/tests/GSUB-2.tests
new file mode 100644 (file)
index 0000000..ef418c2
--- /dev/null
@@ -0,0 +1,11 @@
+../fonts/TestShapeEthi.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+1373;[uni1373]
+../fonts/TestShapeEthi.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+136B;[uni136B]
+../fonts/TestShapeEthi.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+1375;[uni1375]
+../fonts/TestShapeEthi.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+136D;[uni136D]
+../fonts/TestShapeEthi.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+1373,U+136B;[uni1373.init|uni136B.fina@621,0]
+../fonts/TestShapeEthi.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+1375,U+136D;[uni1375.init|uni136D.fina@662,0]
+../fonts/TestShapeEthi.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+137B;[uni137B]
+../fonts/TestShapeEthi.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+1373,U+136B,U+137B;[uni1373.init|uni136B.medi@621,0|uni137B.fina@1102,0]
+../fonts/TestShapeEthi.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+1373,U+136B,U+137B,U+1373,U+136B;[uni1373.init|uni136B.medi@621,0|uni137B.medi@1102,0|uni1373.medi@1489,0|uni136B.fina@2110,0]
+../fonts/TestShapeEthi.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+1373,U+136B,U+137B,U+1375,U+136D;[uni1373.init|uni136B.medi@621,0|uni137B.medi@1102,0|uni1375.medi@1489,0|uni136D.fina@2157,0]
+../fonts/TestShapeEthi.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+1375,U+136D,U+137B,U+1373,U+136B;[uni1375.init|uni136D.medi@662,0|uni137B.medi@1203,0|uni1373.medi@1590,0|uni136B.fina@2211,0]
diff --git a/test/shape/data/text-rendering-tests/tests/GSUB-3.tests b/test/shape/data/text-rendering-tests/tests/GSUB-3.tests
new file mode 100644 (file)
index 0000000..6fcc09c
--- /dev/null
@@ -0,0 +1 @@
+../fonts/TestGSUBThree.ttf;;U+006C,U+006F,U+006C;*
diff --git a/test/shape/data/text-rendering-tests/tests/GVAR-1.tests b/test/shape/data/text-rendering-tests/tests/GVAR-1.tests
new file mode 100644 (file)
index 0000000..8c36b36
--- /dev/null
@@ -0,0 +1,9 @@
+../fonts/TestGVAROne.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=300;U+5F4C;[gid2]
+../fonts/TestGVAROne.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=350;U+5F4C;[gid2]
+../fonts/TestGVAROne.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=400;U+5F4C;[gid2]
+../fonts/TestGVAROne.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=450;U+5F4C;[gid2]
+../fonts/TestGVAROne.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=500;U+5F4C;[gid2]
+../fonts/TestGVAROne.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=550;U+5F4C;[gid2]
+../fonts/TestGVAROne.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=600;U+5F4C;[gid2]
+../fonts/TestGVAROne.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=650;U+5F4C;[gid2]
+../fonts/TestGVAROne.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=700;U+5F4C;[gid2]
diff --git a/test/shape/data/text-rendering-tests/tests/GVAR-2.tests b/test/shape/data/text-rendering-tests/tests/GVAR-2.tests
new file mode 100644 (file)
index 0000000..414eca5
--- /dev/null
@@ -0,0 +1,9 @@
+../fonts/TestGVARTwo.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=300;U+5F4C;[gid2]
+../fonts/TestGVARTwo.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=350;U+5F4C;[gid2]
+../fonts/TestGVARTwo.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=400;U+5F4C;[gid2]
+../fonts/TestGVARTwo.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=450;U+5F4C;[gid2]
+../fonts/TestGVARTwo.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=500;U+5F4C;[gid2]
+../fonts/TestGVARTwo.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=550;U+5F4C;[gid2]
+../fonts/TestGVARTwo.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=600;U+5F4C;[gid2]
+../fonts/TestGVARTwo.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=650;U+5F4C;[gid2]
+../fonts/TestGVARTwo.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=700;U+5F4C;[gid2]
diff --git a/test/shape/data/text-rendering-tests/tests/GVAR-3.tests b/test/shape/data/text-rendering-tests/tests/GVAR-3.tests
new file mode 100644 (file)
index 0000000..e9ba906
--- /dev/null
@@ -0,0 +1,9 @@
+../fonts/TestGVARThree.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=300;U+5F4C;[gid2]
+../fonts/TestGVARThree.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=350;U+5F4C;[gid2]
+../fonts/TestGVARThree.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=400;U+5F4C;[gid2]
+../fonts/TestGVARThree.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=450;U+5F4C;[gid2]
+../fonts/TestGVARThree.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=500;U+5F4C;[gid2]
+../fonts/TestGVARThree.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=550;U+5F4C;[gid2]
+../fonts/TestGVARThree.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=600;U+5F4C;[gid2]
+../fonts/TestGVARThree.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=650;U+5F4C;[gid2]
+../fonts/TestGVARThree.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=700;U+5F4C;[gid2]
diff --git a/test/shape/data/text-rendering-tests/tests/GVAR-4.tests b/test/shape/data/text-rendering-tests/tests/GVAR-4.tests
new file mode 100644 (file)
index 0000000..2fc216f
--- /dev/null
@@ -0,0 +1,11 @@
+../fonts/Zycon.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=-1.0,T1=0.0;U+1F98E;[gid5]
+../fonts/Zycon.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=-0.8,T1=0.1;U+1F98E;[gid5]
+../fonts/Zycon.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=-0.6,T1=0.2;U+1F98E;[gid5]
+../fonts/Zycon.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=-0.4,T1=0.3;U+1F98E;[gid5]
+../fonts/Zycon.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=-0.2,T1=0.4;U+1F98E;[gid5]
+../fonts/Zycon.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=0.0,T1=0.5;U+1F98E;[gid5]
+../fonts/Zycon.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=0.2,T1=0.6;U+1F98E;[gid5]
+../fonts/Zycon.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=0.4,T1=0.7;U+1F98E;[gid5]
+../fonts/Zycon.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=0.6,T1=0.8;U+1F98E;[gid5]
+../fonts/Zycon.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=0.8,T1=0.9;U+1F98E;[gid5]
+../fonts/Zycon.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=1.0,T1=1.0;U+1F98E;[gid5]
diff --git a/test/shape/data/text-rendering-tests/tests/GVAR-5.tests b/test/shape/data/text-rendering-tests/tests/GVAR-5.tests
new file mode 100644 (file)
index 0000000..4df737d
--- /dev/null
@@ -0,0 +1,11 @@
+../fonts/Zycon.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=-1.0;U+1F31D;[gid15]
+../fonts/Zycon.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=-0.8;U+1F31D;[gid15]
+../fonts/Zycon.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=-0.6;U+1F31D;[gid15]
+../fonts/Zycon.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=-0.4;U+1F31D;[gid15]
+../fonts/Zycon.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=-0.2;U+1F31D;[gid15]
+../fonts/Zycon.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=0.0;U+1F31D;[gid15]
+../fonts/Zycon.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=0.2;U+1F31D;[gid15]
+../fonts/Zycon.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=0.4;U+1F31D;[gid15]
+../fonts/Zycon.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=0.6;U+1F31D;[gid15]
+../fonts/Zycon.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=0.8;U+1F31D;[gid15]
+../fonts/Zycon.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=1.0;U+1F31D;[gid15]
diff --git a/test/shape/data/text-rendering-tests/tests/GVAR-6.tests b/test/shape/data/text-rendering-tests/tests/GVAR-6.tests
new file mode 100644 (file)
index 0000000..500337b
--- /dev/null
@@ -0,0 +1,11 @@
+../fonts/Zycon.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=T1=0.0;U+1F422;[gid12]
+../fonts/Zycon.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=T1=0.1;U+1F422;[gid12]
+../fonts/Zycon.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=T1=0.2;U+1F422;[gid12]
+../fonts/Zycon.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=T1=0.3;U+1F422;[gid12]
+../fonts/Zycon.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=T1=0.4;U+1F422;[gid12]
+../fonts/Zycon.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=T1=0.5;U+1F422;[gid12]
+../fonts/Zycon.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=T1=0.6;U+1F422;[gid12]
+../fonts/Zycon.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=T1=0.7;U+1F422;[gid12]
+../fonts/Zycon.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=T1=0.8;U+1F422;[gid12]
+../fonts/Zycon.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=T1=0.9;U+1F422;[gid12]
+../fonts/Zycon.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=T1=1.0;U+1F422;[gid12]
diff --git a/test/shape/data/text-rendering-tests/tests/GVAR-7.tests b/test/shape/data/text-rendering-tests/tests/GVAR-7.tests
new file mode 100644 (file)
index 0000000..a246ec3
--- /dev/null
@@ -0,0 +1,7 @@
+../fonts/TestGVARFour.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=150;U+004F,U+0049,U+004F;[uni004F|uni0049@706,0|uni004F@1072,0]
+../fonts/TestGVARFour.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=200;U+004F,U+0049,U+004F;[uni004F|uni0049@707,0|uni004F@1074,0]
+../fonts/TestGVARFour.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=250;U+004F,U+0049,U+004F;[uni004F|uni0049@707,0|uni004F@1075,0]
+../fonts/TestGVARFour.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=300;U+004F,U+0049,U+004F;[uni004F|uni0049@707,0|uni004F@1076,0]
+../fonts/TestGVARFour.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=350;U+004F,U+0049,U+004F;[uni004F|uni0049@707,0|uni004F@1077,0]
+../fonts/TestGVARFour.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=400;U+004F,U+0049,U+004F;[uni004F|uni0049@707,0|uni004F@1078,0]
+../fonts/TestGVARFour.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=450;U+004F,U+0049,U+004F;[uni004F|uni0049@706,0|uni004F@1079,0]
diff --git a/test/shape/data/text-rendering-tests/tests/GVAR-8.tests b/test/shape/data/text-rendering-tests/tests/GVAR-8.tests
new file mode 100644 (file)
index 0000000..4b4b54d
--- /dev/null
@@ -0,0 +1,6 @@
+../fonts/TestGVAREight.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=HV=0.0;U+0048;[H]
+../fonts/TestGVAREight.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=HV=-0.2;U+0048;[H]
+../fonts/TestGVAREight.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=HV=-0.4;U+0048;[H]
+../fonts/TestGVAREight.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=HV=-0.6;U+0048;[H]
+../fonts/TestGVAREight.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=HV=-0.8;U+0048;[H]
+../fonts/TestGVAREight.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=HV=-1.0;U+0048;[H]
diff --git a/test/shape/data/text-rendering-tests/tests/GVAR-9.tests b/test/shape/data/text-rendering-tests/tests/GVAR-9.tests
new file mode 100644 (file)
index 0000000..bf0f3e5
--- /dev/null
@@ -0,0 +1,10 @@
+../fonts/TestGVARNine.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=-1.0;U+0041;[A]
+../fonts/TestGVARNine.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=-0.5;U+0041;[A]
+../fonts/TestGVARNine.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=0.0;U+0041;[A]
+../fonts/TestGVARNine.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=0.5;U+0041;[A]
+../fonts/TestGVARNine.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=0.6;U+0041;[A]
+../fonts/TestGVARNine.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=0.7;U+0041;[A]
+../fonts/TestGVARNine.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=0.8;U+0041;[A]
+../fonts/TestGVARNine.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=0.9;U+0041;[A]
+../fonts/TestGVARNine.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=0.944444;U+0041;[A]
+../fonts/TestGVARNine.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=1.0;U+0041;[A]
diff --git a/test/shape/data/text-rendering-tests/tests/HVAR-1.tests b/test/shape/data/text-rendering-tests/tests/HVAR-1.tests
new file mode 100644 (file)
index 0000000..dbc4ba1
--- /dev/null
@@ -0,0 +1,6 @@
+../fonts/TestHVAROne.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=0;U+0041,U+0042,U+0043;[A|B@520,0|C@1094,0]
+../fonts/TestHVAROne.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=200;U+0041,U+0042,U+0043;[A|B@533,0|C@1115,0]
+../fonts/TestHVAROne.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=400;U+0041,U+0042,U+0043;[A|B@546,0|C@1135,0]
+../fonts/TestHVAROne.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=600;U+0041,U+0042,U+0043;[A|B@558,0|C@1155,0]
+../fonts/TestHVAROne.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=800;U+0041,U+0042,U+0043;[A|B@571,0|C@1175,0]
+../fonts/TestHVAROne.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=1000;U+0041,U+0042,U+0043;[A|B@584,0|C@1196,0]
diff --git a/test/shape/data/text-rendering-tests/tests/HVAR-2.tests b/test/shape/data/text-rendering-tests/tests/HVAR-2.tests
new file mode 100644 (file)
index 0000000..aa086e3
--- /dev/null
@@ -0,0 +1,6 @@
+../fonts/TestHVARTwo.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=0;U+0041,U+0042;[uni0041|uni0042@450,0]
+../fonts/TestHVARTwo.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=200;U+0041,U+0042;[uni0041|uni0042@515,0]
+../fonts/TestHVARTwo.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=400;U+0041,U+0042;[uni0041|uni0042@584,0]
+../fonts/TestHVARTwo.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=600;U+0041,U+0042;[uni0041|uni0042@673,0]
+../fonts/TestHVARTwo.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=800;U+0041,U+0042;[uni0041|uni0042@761,0]
+../fonts/TestHVARTwo.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=1000;U+0041,U+0042;[uni0041|uni0042@850,0]
diff --git a/test/shape/data/text-rendering-tests/tests/KERN-1.tests b/test/shape/data/text-rendering-tests/tests/KERN-1.tests
new file mode 100644 (file)
index 0000000..e72beff
--- /dev/null
@@ -0,0 +1 @@
+../fonts/TestKERNOne.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0131,U+0054,U+0075,U+0054,U+0075,U+0054,U+0131;[dotlessi|T|u@400,0|T@600,0|u@1000,0|T@1200,0|dotlessi@1600,0]
diff --git a/test/shape/data/text-rendering-tests/tests/KERN-2.tests b/test/shape/data/text-rendering-tests/tests/KERN-2.tests
new file mode 100644 (file)
index 0000000..1601eef
--- /dev/null
@@ -0,0 +1 @@
+../fonts/TestKERNOne.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0075,U+0131,U+0131,U+0054,U+0131,U+0131,U+0054,U+0131,U+0131,U+0075;[u|dotlessi@400,0|dotlessi@1100,0|T@1100,0|dotlessi@1500,0|dotlessi@2200,0|T@2200,0|dotlessi@2600,0|dotlessi@3300,0|u@3500,0]
diff --git a/test/shape/data/text-rendering-tests/tests/MORX-1.tests b/test/shape/data/text-rendering-tests/tests/MORX-1.tests
new file mode 100644 (file)
index 0000000..175fd73
--- /dev/null
@@ -0,0 +1 @@
+../fonts/TestMORXOne.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041,U+0042,U+0043;[A.alt|B@1000,0|C.alt@2000,0]
diff --git a/test/shape/data/text-rendering-tests/tests/MORX-10.tests b/test/shape/data/text-rendering-tests/tests/MORX-10.tests
new file mode 100644 (file)
index 0000000..ea9a6d5
--- /dev/null
@@ -0,0 +1 @@
+../fonts/TestMORXTen.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041,U+0042,U+0041,U+0042,U+0041,U+0042;[A|B@638,0|A@1288,0|B@1926,0|B@2576,0|A@3226,0]
diff --git a/test/shape/data/text-rendering-tests/tests/MORX-11.tests b/test/shape/data/text-rendering-tests/tests/MORX-11.tests
new file mode 100644 (file)
index 0000000..adbad2a
--- /dev/null
@@ -0,0 +1 @@
+../fonts/TestMORXEleven.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0042,U+0041,U+0042,U+0042,U+0041,U+0041,U+0042,U+0058;[B|A@650,0|B@1288,0|B@1938,0|A@2588,0|X@3226,0|A@3812,0|B@4450,0]
diff --git a/test/shape/data/text-rendering-tests/tests/MORX-12.tests b/test/shape/data/text-rendering-tests/tests/MORX-12.tests
new file mode 100644 (file)
index 0000000..a37aa72
--- /dev/null
@@ -0,0 +1,3 @@
+../fonts/TestMORXTwelve.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0058,U+0041,U+0042,U+0043,U+0058,U+0031;[X|C@598,0|A@1230,0|B@1868,0|X@2518,0|one@3116,0]
+../fonts/TestMORXTwelve.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0058,U+0041,U+0042,U+0043,U+0058,U+0032;[X|C@598,0|A@1230,0|B@1868,0|X@2518,0|two@3116,0]
+../fonts/TestMORXTwelve.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0058,U+0041,U+0042,U+0043,U+0058,U+0033;[X|B@598,0|C@1248,0|A@1880,0|X@2518,0|three@3116,0]
diff --git a/test/shape/data/text-rendering-tests/tests/MORX-13.tests b/test/shape/data/text-rendering-tests/tests/MORX-13.tests
new file mode 100644 (file)
index 0000000..3273b57
--- /dev/null
@@ -0,0 +1 @@
+../fonts/TestMORXThirteen.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041,U+0042,U+0043,U+0044,U+0045;[B|C@626,0|D@1222,0|E@1896,0|A@2452,0]
diff --git a/test/shape/data/text-rendering-tests/tests/MORX-14.tests b/test/shape/data/text-rendering-tests/tests/MORX-14.tests
new file mode 100644 (file)
index 0000000..9526005
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/TestMORXFourteen.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041,U+0042,U+0043,U+0044,U+0045;[B|C@626,0|D@1222,0|E@1896,0|A@2452,0]
+../fonts/TestMORXFourteen.ttf;;U+0041,U+0042,U+0042,U+0042,U+0043,U+0043,U+0043,U+0044,U+0044,U+0044,U+0042,U+0043,U+0044,U+0043,U+0045;*
diff --git a/test/shape/data/text-rendering-tests/tests/MORX-16.tests b/test/shape/data/text-rendering-tests/tests/MORX-16.tests
new file mode 100644 (file)
index 0000000..a87e84b
--- /dev/null
@@ -0,0 +1 @@
+../fonts/TestMORXSixteen.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041,U+0042,U+0043,U+0044,U+0045;[B|C@626,0|D@1222,0|E@1896,0|A@2452,0]
diff --git a/test/shape/data/text-rendering-tests/tests/MORX-17.tests b/test/shape/data/text-rendering-tests/tests/MORX-17.tests
new file mode 100644 (file)
index 0000000..066137f
--- /dev/null
@@ -0,0 +1 @@
+../fonts/TestMORXSeventeen.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041,U+0042;[B|A@626,0]
diff --git a/test/shape/data/text-rendering-tests/tests/MORX-18.tests b/test/shape/data/text-rendering-tests/tests/MORX-18.tests
new file mode 100644 (file)
index 0000000..c065439
--- /dev/null
@@ -0,0 +1,4 @@
+../fonts/TestMORXEighteen.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041,U+0042,U+0043,U+0044,U+0045;[A|B.alt@639,0|C@1639,0|D.alt1@2235,0|E@3235,0]
+../fonts/TestMORXEighteen.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041,U+0042,U+0042,U+0042,U+0044,U+0045;[A|B@639,0|B@1265,0|B.alt@1891,0|D.alt1@2891,0|E@3891,0]
+../fonts/TestMORXEighteen.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041,U+0042,U+0044,U+0045;[A|B.alt@639,0|D.alt1@1639,0|E@2639,0]
+../fonts/TestMORXEighteen.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041,U+0042,U+0045;[A|B@639,0|E@1265,0]
diff --git a/test/shape/data/text-rendering-tests/tests/MORX-19.tests b/test/shape/data/text-rendering-tests/tests/MORX-19.tests
new file mode 100644 (file)
index 0000000..ccc03ac
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/TestMORXEighteen.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041,U+0043,U+0044,U+0045;[A.alt|C@1000,0|D.alt1@1596,0|E@2596,0]
+../fonts/TestMORXEighteen.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0044;[D.alt]
diff --git a/test/shape/data/text-rendering-tests/tests/MORX-2.tests b/test/shape/data/text-rendering-tests/tests/MORX-2.tests
new file mode 100644 (file)
index 0000000..a1ff184
--- /dev/null
@@ -0,0 +1,16 @@
+../fonts/TestMORXTwo.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+004F,U+004F,U+004F,U+0041,U+0042,U+0058,U+0059,U+005A,U+0043,U+0044,U+004F,U+004F,U+004F,U+24FF;[O|O@418,0|O@836,0|A@1254,0|B@2084,0|X@2914,0|Y@3744,0|Z@4574,0|C@5404,0|D@6234,0|O@7064,0|O@7482,0|O@7900,0|zero@8318,0]
+../fonts/TestMORXTwo.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+004F,U+004F,U+004F,U+0041,U+0042,U+0058,U+0059,U+005A,U+0043,U+0044,U+004F,U+004F,U+004F,U+278A;[O|O@418,0|O@836,0|B@1254,0|X@2084,0|Y@2914,0|Z@3744,0|C@4574,0|D@5404,0|A@6234,0|O@7064,0|O@7482,0|O@7900,0|one@8318,0]
+../fonts/TestMORXTwo.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+004F,U+004F,U+004F,U+0041,U+0042,U+0058,U+0059,U+005A,U+0043,U+0044,U+004F,U+004F,U+004F,U+278B;[O|O@418,0|O@836,0|D@1254,0|A@2084,0|B@2914,0|X@3744,0|Y@4574,0|Z@5404,0|C@6234,0|O@7064,0|O@7482,0|O@7900,0|two@8318,0]
+../fonts/TestMORXTwo.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+004F,U+004F,U+004F,U+0041,U+0042,U+0058,U+0059,U+005A,U+0043,U+0044,U+004F,U+004F,U+004F,U+0033;[O|O@418,0|O@836,0|D@1254,0|B@2084,0|X@2914,0|Y@3744,0|Z@4574,0|C@5404,0|A@6234,0|O@7064,0|O@7482,0|O@7900,0|three@8318,0]
+../fonts/TestMORXTwo.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+004F,U+004F,U+004F,U+0041,U+0042,U+0058,U+0059,U+005A,U+0043,U+0044,U+004F,U+004F,U+004F,U+0034;[O|O@418,0|O@836,0|X@1254,0|Y@2084,0|Z@2914,0|C@3744,0|D@4574,0|A@5404,0|B@6234,0|O@7064,0|O@7482,0|O@7900,0|four@8318,0]
+../fonts/TestMORXTwo.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+004F,U+004F,U+004F,U+0041,U+0042,U+0058,U+0059,U+005A,U+0043,U+0044,U+004F,U+004F,U+004F,U+0035;[O|O@418,0|O@836,0|X@1254,0|Y@2084,0|Z@2914,0|C@3744,0|D@4574,0|B@5404,0|A@6234,0|O@7064,0|O@7482,0|O@7900,0|five@8318,0]
+../fonts/TestMORXTwo.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+004F,U+004F,U+004F,U+0041,U+0042,U+0058,U+0059,U+005A,U+0043,U+0044,U+004F,U+004F,U+004F,U+0036;[O|O@418,0|O@836,0|C@1254,0|D@2084,0|A@2914,0|B@3744,0|X@4574,0|Y@5404,0|Z@6234,0|O@7064,0|O@7482,0|O@7900,0|six@8318,0]
+../fonts/TestMORXTwo.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+004F,U+004F,U+004F,U+0041,U+0042,U+0058,U+0059,U+005A,U+0043,U+0044,U+004F,U+004F,U+004F,U+0037;[O|O@418,0|O@836,0|D@1254,0|C@2084,0|A@2914,0|B@3744,0|X@4574,0|Y@5404,0|Z@6234,0|O@7064,0|O@7482,0|O@7900,0|seven@8318,0]
+../fonts/TestMORXTwo.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+004F,U+004F,U+004F,U+0041,U+0042,U+0058,U+0059,U+005A,U+0043,U+0044,U+004F,U+004F,U+004F,U+0038;[O|O@418,0|O@836,0|C@1254,0|D@2084,0|B@2914,0|X@3744,0|Y@4574,0|Z@5404,0|A@6234,0|O@7064,0|O@7482,0|O@7900,0|eight@8318,0]
+../fonts/TestMORXTwo.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+004F,U+004F,U+004F,U+0041,U+0042,U+0058,U+0059,U+005A,U+0043,U+0044,U+004F,U+004F,U+004F,U+0039;[O|O@418,0|O@836,0|D@1254,0|C@2084,0|B@2914,0|X@3744,0|Y@4574,0|Z@5404,0|A@6234,0|O@7064,0|O@7482,0|O@7900,0|nine@8318,0]
+../fonts/TestMORXTwo.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+004F,U+004F,U+004F,U+0041,U+0042,U+0058,U+0059,U+005A,U+0043,U+0044,U+004F,U+004F,U+004F,U+2793;[O|O@418,0|O@836,0|D@1254,0|X@2084,0|Y@2914,0|Z@3744,0|C@4574,0|A@5404,0|B@6234,0|O@7064,0|O@7482,0|O@7900,0|one_zero@8318,0]
+../fonts/TestMORXTwo.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+004F,U+004F,U+004F,U+0041,U+0042,U+0058,U+0059,U+005A,U+0043,U+0044,U+004F,U+004F,U+004F,U+24EB;[O|O@418,0|O@836,0|D@1254,0|X@2084,0|Y@2914,0|Z@3744,0|C@4574,0|B@5404,0|A@6234,0|O@7064,0|O@7482,0|O@7900,0|one_one@8318,0]
+../fonts/TestMORXTwo.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+004F,U+004F,U+004F,U+0041,U+0042,U+0058,U+0059,U+005A,U+0043,U+0044,U+004F,U+004F,U+004F,U+24EC;[O|O@418,0|O@836,0|C@1254,0|D@2084,0|X@2914,0|Y@3744,0|Z@4574,0|A@5404,0|B@6234,0|O@7064,0|O@7482,0|O@7900,0|one_two@8318,0]
+../fonts/TestMORXTwo.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+004F,U+004F,U+004F,U+0041,U+0042,U+0058,U+0059,U+005A,U+0043,U+0044,U+004F,U+004F,U+004F,U+24ED;[O|O@418,0|O@836,0|C@1254,0|D@2084,0|X@2914,0|Y@3744,0|Z@4574,0|B@5404,0|A@6234,0|O@7064,0|O@7482,0|O@7900,0|one_three@8318,0]
+../fonts/TestMORXTwo.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+004F,U+004F,U+004F,U+0041,U+0042,U+0058,U+0059,U+005A,U+0043,U+0044,U+004F,U+004F,U+004F,U+24EE;[O|O@418,0|O@836,0|D@1254,0|C@2084,0|X@2914,0|Y@3744,0|Z@4574,0|A@5404,0|B@6234,0|O@7064,0|O@7482,0|O@7900,0|one_four@8318,0]
+../fonts/TestMORXTwo.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+004F,U+004F,U+004F,U+0041,U+0042,U+0058,U+0059,U+005A,U+0043,U+0044,U+004F,U+004F,U+004F,U+24EF;[O|O@418,0|O@836,0|D@1254,0|C@2084,0|X@2914,0|Y@3744,0|Z@4574,0|B@5404,0|A@6234,0|O@7064,0|O@7482,0|O@7900,0|one_five@8318,0]
diff --git a/test/shape/data/text-rendering-tests/tests/MORX-20.tests b/test/shape/data/text-rendering-tests/tests/MORX-20.tests
new file mode 100644 (file)
index 0000000..1f599a1
--- /dev/null
@@ -0,0 +1,7 @@
+../fonts/TestMORXTwenty.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041,U+0042,U+0043,U+0044,U+0045;[A|B@639,0|C.alt@1265,0|D@2265,0|E.alt1@2939,0]
+../fonts/TestMORXTwenty.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041,U+0042,U+0043;[A|B@639,0|C.alt@1265,0]
+../fonts/TestMORXTwenty.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041,U+0042,U+0045;[A|B.alt@639,0|E.alt1@1639,0]
+../fonts/TestMORXTwenty.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041,U+0045;[A.alt|E.alt1@1000,0]
+../fonts/TestMORXTwenty.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0045,U+0045;[E|E@556,0]
+../fonts/TestMORXTwenty.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041;[A.alt]
+../fonts/TestMORXTwenty.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0045;[E]
diff --git a/test/shape/data/text-rendering-tests/tests/MORX-21.tests b/test/shape/data/text-rendering-tests/tests/MORX-21.tests
new file mode 100644 (file)
index 0000000..0014de7
--- /dev/null
@@ -0,0 +1 @@
+../fonts/TestMORXTwentyone.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041,U+0042,U+0043,U+0044,U+0045;[A|B.alt@639,0|C@1639,0|D@2235,0|E@2909,0]
diff --git a/test/shape/data/text-rendering-tests/tests/MORX-22.tests b/test/shape/data/text-rendering-tests/tests/MORX-22.tests
new file mode 100644 (file)
index 0000000..76136d6
--- /dev/null
@@ -0,0 +1 @@
+../fonts/TestMORXTwentytwo.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041;[C]
diff --git a/test/shape/data/text-rendering-tests/tests/MORX-23.tests b/test/shape/data/text-rendering-tests/tests/MORX-23.tests
new file mode 100644 (file)
index 0000000..3ae018f
--- /dev/null
@@ -0,0 +1 @@
+../fonts/TestMORXTwentythree.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041,U+0042,U+0043,U+0044,U+0045;[E|E@556,0|E@1112,0|E@1668,0|E@2224,0]
diff --git a/test/shape/data/text-rendering-tests/tests/MORX-24.tests b/test/shape/data/text-rendering-tests/tests/MORX-24.tests
new file mode 100644 (file)
index 0000000..9c1af89
--- /dev/null
@@ -0,0 +1 @@
+../fonts/TestMORXTwentyfour.ttf;;U+0041,U+0042,U+0043,U+0044,U+0045;*
diff --git a/test/shape/data/text-rendering-tests/tests/MORX-25.tests b/test/shape/data/text-rendering-tests/tests/MORX-25.tests
new file mode 100644 (file)
index 0000000..cec3be4
--- /dev/null
@@ -0,0 +1,9 @@
+../fonts/TestMORXTwentyfive.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041,U+0042,U+0043,U+0044,U+0045;[A.alt|B.alt@1000,0|C.alt@2000,0|D.alt@3000,0|E.alt@4000,0]
+../fonts/TestMORXTwentyfive.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0045,U+0042,U+0043,U+0044,U+0041;[E|B@556,0|C@1182,0|D@1778,0|A@2452,0]
+../fonts/TestMORXTwentyfive.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0043,U+0042,U+0041,U+0042,U+0043;[C|B@596,0|A.alt@1222,0|B.alt@2222,0|C.alt@3222,0]
+../fonts/TestMORXTwentyfive.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041,U+0042,U+0043;[A.alt|B.alt@1000,0|C.alt@2000,0]
+../fonts/TestMORXTwentyfive.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0043,U+0042,U+0041;[C|B@596,0|A@1222,0]
+../fonts/TestMORXTwentyfive.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041,U+0042;[A.alt|B.alt@1000,0]
+../fonts/TestMORXTwentyfive.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0042,U+0041;[B|A@626,0]
+../fonts/TestMORXTwentyfive.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041;[A]
+../fonts/TestMORXTwentyfive.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0042;[B]
diff --git a/test/shape/data/text-rendering-tests/tests/MORX-26.tests b/test/shape/data/text-rendering-tests/tests/MORX-26.tests
new file mode 100644 (file)
index 0000000..18683e9
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/TestMORXTwentysix.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041,U+0042;[A|B@639,0]
+../fonts/TestMORXTwentysix.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0042;[B.alt]
diff --git a/test/shape/data/text-rendering-tests/tests/MORX-27.tests b/test/shape/data/text-rendering-tests/tests/MORX-27.tests
new file mode 100644 (file)
index 0000000..b830f75
--- /dev/null
@@ -0,0 +1,3 @@
+../fonts/TestMORXTwentyseven.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041,U+0045,U+0042;[A_E_B]
+../fonts/TestMORXTwentyseven.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041,U+0045,U+0043;[A_E_C]
+../fonts/TestMORXTwentyseven.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041,U+0045,U+0044;[A_E_D]
diff --git a/test/shape/data/text-rendering-tests/tests/MORX-28.tests b/test/shape/data/text-rendering-tests/tests/MORX-28.tests
new file mode 100644 (file)
index 0000000..19d930c
--- /dev/null
@@ -0,0 +1,5 @@
+../fonts/TestMORXTwentyeight.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041,U+0045,U+0044;[A_E_D]
+../fonts/TestMORXTwentyeight.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041,U+0078,U+0045,U+0044;[A_E_D|x@1394,0]
+../fonts/TestMORXTwentyeight.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041,U+0045,U+0079,U+0044;[A_E_D|y@1394,0]
+../fonts/TestMORXTwentyeight.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041,U+0078,U+0045,U+0079,U+0044;[A_E_D|x@1394,0|y@1923,0]
+../fonts/TestMORXTwentyeight.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041,U+0078,U+0078,U+0078,U+0045,U+0079,U+0079,U+0079,U+0044;[A_E_D|x@1394,0|x@1923,0|x@2452,0|y@2981,0|y@3491,0|y@4001,0]
diff --git a/test/shape/data/text-rendering-tests/tests/MORX-29.tests b/test/shape/data/text-rendering-tests/tests/MORX-29.tests
new file mode 100644 (file)
index 0000000..7ef9112
--- /dev/null
@@ -0,0 +1,4 @@
+../fonts/TestMORXTwentynine.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0050,U+0051,U+0052,U+004D,U+004D,U+0058,U+0058,U+004D,U+004D,U+0059,U+0059,U+0041,U+005A,U+005A;[P|Q@333,0|R@699,0|M@1050,0|M@1880,0|X@2710,0|X@3074,0|M@3438,0|I@4268,0|N@5098,0|S@5928,0|M@6758,0|Y@7588,0|Y@7920,0|A@8252,0|Z@9082,0|Z@9404,0]
+../fonts/TestMORXTwentynine.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0050,U+0051,U+0052,U+004D,U+004D,U+0058,U+0058,U+004D,U+004D,U+0059,U+0059,U+0042,U+005A,U+005A;[P|Q@333,0|R@699,0|M@1050,0|M@1880,0|X@2710,0|X@3074,0|M@3438,0|M@4268,0|I@5098,0|N@5928,0|S@6758,0|Y@7588,0|Y@7920,0|B@8252,0|Z@9082,0|Z@9404,0]
+../fonts/TestMORXTwentynine.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0050,U+0051,U+0052,U+004D,U+004D,U+0058,U+0058,U+004D,U+004D,U+0059,U+0059,U+0043,U+005A,U+005A;[P|Q@333,0|R@699,0|M@1050,0|M@1880,0|X@2710,0|X@3074,0|M@3438,0|M@4268,0|Y@5098,0|Y@5430,0|I@5762,0|N@6592,0|S@7422,0|C@8252,0|Z@9082,0|Z@9404,0]
+../fonts/TestMORXTwentynine.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0050,U+0051,U+0052,U+004D,U+004D,U+0058,U+0058,U+004D,U+004D,U+0059,U+0059,U+0044,U+005A,U+005A;[P|Q@333,0|R@699,0|M@1050,0|M@1880,0|X@2710,0|X@3074,0|M@3438,0|M@4268,0|Y@5098,0|Y@5430,0|D@5762,0|I@6592,0|N@7422,0|S@8252,0|Z@9082,0|Z@9404,0]
diff --git a/test/shape/data/text-rendering-tests/tests/MORX-3.tests b/test/shape/data/text-rendering-tests/tests/MORX-3.tests
new file mode 100644 (file)
index 0000000..cbb8c15
--- /dev/null
@@ -0,0 +1,16 @@
+../fonts/TestMORXThree.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041,U+0042,U+0058,U+0043,U+0044,U+0030;[A|B@363,0|X@722,0|C@1086,0|D@1402,0|zero@1793,0]
+../fonts/TestMORXThree.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041,U+0042,U+0058,U+0043,U+0044,U+0031;[A|B@363,0|X@722,0|C@1086,0|D@1402,0|one@1793,0]
+../fonts/TestMORXThree.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041,U+0042,U+0058,U+0043,U+0044,U+0032;[A|B@363,0|X@722,0|C@1086,0|D@1402,0|two@1793,0]
+../fonts/TestMORXThree.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041,U+0042,U+0058,U+0043,U+0044,U+0033;[A|B@363,0|X@722,0|C@1086,0|D@1402,0|three@1793,0]
+../fonts/TestMORXThree.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041,U+0042,U+0058,U+0043,U+0044,U+0034;[A|B@363,0|X@722,0|C@1086,0|D@1402,0|four@1793,0]
+../fonts/TestMORXThree.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041,U+0042,U+0058,U+0043,U+0044,U+0035;[A|B@363,0|X@722,0|C@1086,0|D@1402,0|five@1793,0]
+../fonts/TestMORXThree.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041,U+0042,U+0058,U+0043,U+0044,U+0036;[A|B@363,0|X@722,0|C@1086,0|D@1402,0|six@1793,0]
+../fonts/TestMORXThree.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041,U+0042,U+0058,U+0043,U+0044,U+0037;[A|B@363,0|X@722,0|C@1086,0|D@1402,0|seven@1793,0]
+../fonts/TestMORXThree.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041,U+0042,U+0058,U+0043,U+0044,U+0038;[A|B@363,0|X@722,0|C@1086,0|D@1402,0|eight@1793,0]
+../fonts/TestMORXThree.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041,U+0042,U+0058,U+0043,U+0044,U+0039;[A|B@363,0|X@722,0|C@1086,0|D@1402,0|nine@1793,0]
+../fonts/TestMORXThree.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041,U+0042,U+0058,U+0043,U+0044,U+2793;[A|B@363,0|X@722,0|C@1086,0|D@1402,0|one_zero@1793,0]
+../fonts/TestMORXThree.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041,U+0042,U+0058,U+0043,U+0044,U+24EB;[A|B@363,0|X@722,0|C@1086,0|D@1402,0|one_one@1793,0]
+../fonts/TestMORXThree.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041,U+0042,U+0058,U+0043,U+0044,U+24EC;[A|B@363,0|X@722,0|C@1086,0|D@1402,0|one_two@1793,0]
+../fonts/TestMORXThree.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041,U+0042,U+0058,U+0043,U+0044,U+24ED;[A|B@363,0|X@722,0|C@1086,0|D@1402,0|one_three@1793,0]
+../fonts/TestMORXThree.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041,U+0042,U+0058,U+0043,U+0044,U+24EE;[A|B@363,0|X@722,0|C@1086,0|D@1402,0|one_four@1793,0]
+../fonts/TestMORXThree.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041,U+0042,U+0058,U+0043,U+0044,U+24EF;[A|B@363,0|X@722,0|C@1086,0|D@1402,0|one_five@1793,0]
diff --git a/test/shape/data/text-rendering-tests/tests/MORX-30.tests b/test/shape/data/text-rendering-tests/tests/MORX-30.tests
new file mode 100644 (file)
index 0000000..aa0f3a7
--- /dev/null
@@ -0,0 +1,4 @@
+../fonts/TestMORXTwentynine.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0050,U+0051,U+0052,U+004D,U+004D,U+0058,U+0058,U+0058,U+0041,U+0059,U+0059,U+0041,U+005A,U+005A;[P|Q@333,0|R@699,0|M@1050,0|I@1880,0|N@2710,0|S@3540,0|I@4370,0|N@5200,0|S@6030,0|M@6860,0|X@7690,0|X@8054,0|X@8418,0|A@8782,0|Y@9612,0|Y@9944,0|A@10276,0|Z@11106,0|Z@11428,0]
+../fonts/TestMORXTwentynine.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0050,U+0051,U+0052,U+004D,U+004D,U+0058,U+0058,U+0058,U+0041,U+0059,U+0059,U+0042,U+005A,U+005A;[P|Q@333,0|R@699,0|M@1050,0|I@1880,0|I@2710,0|N@3540,0|S@4370,0|N@5200,0|S@6030,0|M@6860,0|X@7690,0|X@8054,0|X@8418,0|A@8782,0|Y@9612,0|Y@9944,0|B@10276,0|Z@11106,0|Z@11428,0]
+../fonts/TestMORXTwentynine.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0050,U+0051,U+0052,U+004D,U+004D,U+0058,U+0058,U+0058,U+0042,U+0059,U+0059,U+0041,U+005A,U+005A;[P|Q@333,0|R@699,0|M@1050,0|I@1880,0|N@2710,0|S@3540,0|M@4370,0|I@5200,0|N@6030,0|S@6860,0|X@7690,0|X@8054,0|X@8418,0|B@8782,0|Y@9612,0|Y@9944,0|A@10276,0|Z@11106,0|Z@11428,0]
+../fonts/TestMORXTwentynine.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0050,U+0051,U+0052,U+004D,U+004D,U+0058,U+0058,U+0058,U+0042,U+0059,U+0059,U+0042,U+005A,U+005A;[P|Q@333,0|R@699,0|M@1050,0|M@1880,0|I@2710,0|N@3540,0|S@4370,0|I@5200,0|N@6030,0|S@6860,0|X@7690,0|X@8054,0|X@8418,0|B@8782,0|Y@9612,0|Y@9944,0|B@10276,0|Z@11106,0|Z@11428,0]
diff --git a/test/shape/data/text-rendering-tests/tests/MORX-31.tests b/test/shape/data/text-rendering-tests/tests/MORX-31.tests
new file mode 100644 (file)
index 0000000..e6a3014
--- /dev/null
@@ -0,0 +1,8 @@
+../fonts/TestMORXThirtyone.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0058,U+0058,U+0041,U+0059,U+0059,U+0041,U+005A,U+005A;[I|N@830,0|I@1660,0|N@2490,0|S@3320,0|S@4150,0|X@4980,0|X@5344,0|A@5708,0|Y@6538,0|Y@6870,0|A@7202,0|Z@8032,0|Z@8354,0]
+../fonts/TestMORXThirtyone.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0058,U+0058,U+0041,U+0059,U+0059,U+0042,U+0059,U+0059;[I|N@830,0|S@1660,0|I@2490,0|N@3320,0|S@4150,0|X@4980,0|X@5344,0|A@5708,0|Y@6538,0|Y@6870,0|B@7202,0|Y@8032,0|Y@8364,0]
+../fonts/TestMORXThirtyone.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0058,U+0058,U+0042,U+0059,U+0059,U+0041,U+005A,U+005A;[X|I@364,0|I@1194,0|N@2024,0|S@2854,0|N@3684,0|S@4514,0|X@5344,0|B@5708,0|Y@6538,0|Y@6870,0|A@7202,0|Z@8032,0|Z@8354,0]
+../fonts/TestMORXThirtyone.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0058,U+0058,U+0042,U+0059,U+0059,U+0042,U+005A,U+005A;[X|I@364,0|N@1194,0|I@2024,0|N@2854,0|S@3684,0|S@4514,0|X@5344,0|B@5708,0|Y@6538,0|Y@6870,0|B@7202,0|Z@8032,0|Z@8354,0]
+../fonts/TestMORXThirtyone.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+004D,U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+0041;[I|N@830,0|S@1660,0|M@2490,0|I@3320,0|N@4150,0|S@4980,0|P@5810,0|Q@6143,0|R@6509,0|A@6860,0|X@7690,0|Y@8054,0|Z@8386,0|A@8708,0]
+../fonts/TestMORXThirtyone.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+004D,U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+0042;[I|N@830,0|S@1660,0|M@2490,0|P@3320,0|I@3653,0|N@4483,0|S@5313,0|Q@6143,0|R@6509,0|A@6860,0|X@7690,0|Y@8054,0|Z@8386,0|B@8708,0]
+../fonts/TestMORXThirtyone.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+004D,U+0050,U+0051,U+0052,U+0042,U+0058,U+0059,U+005A,U+0041;[M|I@830,0|N@1660,0|S@2490,0|I@3320,0|N@4150,0|S@4980,0|P@5810,0|Q@6143,0|R@6509,0|B@6860,0|X@7690,0|Y@8054,0|Z@8386,0|A@8708,0]
+../fonts/TestMORXThirtyone.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+004D,U+0050,U+0051,U+0052,U+0042,U+0058,U+0059,U+005A,U+0042;[M|I@830,0|N@1660,0|S@2490,0|P@3320,0|I@3653,0|N@4483,0|S@5313,0|Q@6143,0|R@6509,0|B@6860,0|X@7690,0|Y@8054,0|Z@8386,0|B@8708,0]
diff --git a/test/shape/data/text-rendering-tests/tests/MORX-32.tests b/test/shape/data/text-rendering-tests/tests/MORX-32.tests
new file mode 100644 (file)
index 0000000..4419135
--- /dev/null
@@ -0,0 +1,4 @@
+../fonts/TestMORXThirtytwo.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041;[I|N@830,0|S@1660,0|A@2490,0]
+../fonts/TestMORXThirtytwo.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0058,U+0041,U+0059;[I|N@830,0|S@1660,0|X@2490,0|A@2854,0|Y@3684,0]
+../fonts/TestMORXThirtytwo.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0042;[B|I@830,0|N@1660,0|S@2490,0]
+../fonts/TestMORXThirtytwo.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0058,U+0042,U+0059;[X|I@364,0|N@1194,0|S@2024,0|B@2854,0|Y@3684,0]
diff --git a/test/shape/data/text-rendering-tests/tests/MORX-33.tests b/test/shape/data/text-rendering-tests/tests/MORX-33.tests
new file mode 100644 (file)
index 0000000..ddff193
--- /dev/null
@@ -0,0 +1,3 @@
+../fonts/TestMORXThirtythree.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0068,U+0061;[h|a@618,0|h@1179,0|a@1797,0]
+../fonts/TestMORXThirtythree.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0068,U+0061,U+0068,U+0061;[h|a@618,0|h@1179,0|a@1797,0|h@2358,0|a@2976,0|h@3537,0|a@4155,0]
+../fonts/TestMORXThirtythree.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0061,U+0068;[a|h@561,0]
diff --git a/test/shape/data/text-rendering-tests/tests/MORX-34.tests b/test/shape/data/text-rendering-tests/tests/MORX-34.tests
new file mode 100644 (file)
index 0000000..cb89ba8
--- /dev/null
@@ -0,0 +1 @@
+../fonts/TestMORXThirtyfour.ttf;;U+0068,U+0061;*
diff --git a/test/shape/data/text-rendering-tests/tests/MORX-35.tests b/test/shape/data/text-rendering-tests/tests/MORX-35.tests
new file mode 100644 (file)
index 0000000..f804943
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/TestMORXThirtyfive.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041;[A|B@639,0|C@1265,0|E@1861,0]
+../fonts/TestMORXThirtyfive.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0058,U+0041,U+0059;[X|A@586,0|B@1225,0|C@1851,0|E@2447,0|Y@3003,0]
diff --git a/test/shape/data/text-rendering-tests/tests/MORX-36.tests b/test/shape/data/text-rendering-tests/tests/MORX-36.tests
new file mode 100644 (file)
index 0000000..7739c03
--- /dev/null
@@ -0,0 +1 @@
+../fonts/TestMORXThirtysix.ttf;;U+0041;*
diff --git a/test/shape/data/text-rendering-tests/tests/MORX-37.tests b/test/shape/data/text-rendering-tests/tests/MORX-37.tests
new file mode 100644 (file)
index 0000000..1105e1c
--- /dev/null
@@ -0,0 +1,4 @@
+../fonts/TestMORXThirtyseven.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041,U+0042;[A.alt|B.alt@1000,0]
+../fonts/TestMORXThirtyseven.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0042,U+0041;[B|A@650,0]
+../fonts/TestMORXThirtyseven.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+05D0,U+05D1;[uni05D1|uni05D0@542,0]
+../fonts/TestMORXThirtyseven.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+05D1,U+05D0;[uni05D0.alt|uni05D1.alt@1000,0]
diff --git a/test/shape/data/text-rendering-tests/tests/MORX-38.tests b/test/shape/data/text-rendering-tests/tests/MORX-38.tests
new file mode 100644 (file)
index 0000000..c2cd147
--- /dev/null
@@ -0,0 +1,4 @@
+../fonts/TestMORXThirtyeight.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041,U+0042;[A.alt|B.alt@1000,0]
+../fonts/TestMORXThirtyeight.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0042,U+0041;[B|A@650,0]
+../fonts/TestMORXThirtyeight.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+05D0,U+05D1;[uni05D1.alt|uni05D0.alt@1000,0]
+../fonts/TestMORXThirtyeight.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+05D1,U+05D0;[uni05D0|uni05D1@606,0]
diff --git a/test/shape/data/text-rendering-tests/tests/MORX-39.tests b/test/shape/data/text-rendering-tests/tests/MORX-39.tests
new file mode 100644 (file)
index 0000000..1eaba46
--- /dev/null
@@ -0,0 +1,4 @@
+../fonts/TestMORXThirtynine.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041,U+0042;[A|B@639,0]
+../fonts/TestMORXThirtynine.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0042,U+0041;[B.alt|A.alt@1000,0]
+../fonts/TestMORXThirtynine.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+05D0,U+05D1;[uni05D1.alt|uni05D0.alt@1000,0]
+../fonts/TestMORXThirtynine.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+05D1,U+05D0;[uni05D0|uni05D1@606,0]
diff --git a/test/shape/data/text-rendering-tests/tests/MORX-4.tests b/test/shape/data/text-rendering-tests/tests/MORX-4.tests
new file mode 100644 (file)
index 0000000..12e0d98
--- /dev/null
@@ -0,0 +1,15 @@
+../fonts/TestMORXFour.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+0031;[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|one@2898,0]
+../fonts/TestMORXFour.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+0032;[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|two@2898,0]
+../fonts/TestMORXFour.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0050,U+0051,U+0052,U+0041,U+0044,U+0058,U+0059,U+005A,U+0033;[P|Q@333,0|R@699,0|D@1050,0|A@1880,0|X@2710,0|Y@3074,0|Z@3406,0|three@3728,0]
+../fonts/TestMORXFour.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0050,U+0051,U+0052,U+0041,U+0042,U+0058,U+0059,U+005A,U+0034;[P|Q@333,0|R@699,0|A@1050,0|B@1880,0|X@2710,0|Y@3074,0|Z@3406,0|four@3728,0]
+../fonts/TestMORXFour.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0050,U+0051,U+0052,U+0041,U+0042,U+0058,U+0059,U+005A,U+0035;[P|Q@333,0|R@699,0|B@1050,0|A@1880,0|X@2710,0|Y@3074,0|Z@3406,0|five@3728,0]
+../fonts/TestMORXFour.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0050,U+0051,U+0052,U+0041,U+0042,U+0058,U+0059,U+005A,U+0036;[P|Q@333,0|R@699,0|A@1050,0|B@1880,0|X@2710,0|Y@3074,0|Z@3406,0|six@3728,0]
+../fonts/TestMORXFour.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0050,U+0051,U+0052,U+0041,U+0042,U+0058,U+0059,U+005A,U+0037;[P|Q@333,0|R@699,0|B@1050,0|A@1880,0|X@2710,0|Y@3074,0|Z@3406,0|seven@3728,0]
+../fonts/TestMORXFour.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0050,U+0051,U+0052,U+0041,U+0043,U+0044,U+0058,U+0059,U+005A,U+0038;[P|Q@333,0|R@699,0|C@1050,0|D@1880,0|A@2710,0|X@3540,0|Y@3904,0|Z@4236,0|eight@4558,0]
+../fonts/TestMORXFour.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0050,U+0051,U+0052,U+0041,U+0043,U+0044,U+0058,U+0059,U+005A,U+0039;[P|Q@333,0|R@699,0|D@1050,0|C@1880,0|A@2710,0|X@3540,0|Y@3904,0|Z@4236,0|nine@4558,0]
+../fonts/TestMORXFour.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0050,U+0051,U+0052,U+0041,U+0042,U+0044,U+0058,U+0059,U+005A,U+2793;[P|Q@333,0|R@699,0|D@1050,0|A@1880,0|B@2710,0|X@3540,0|Y@3904,0|Z@4236,0|one_zero@4558,0]
+../fonts/TestMORXFour.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0050,U+0051,U+0052,U+0041,U+0042,U+0044,U+0058,U+0059,U+005A,U+24EB;[P|Q@333,0|R@699,0|D@1050,0|B@1880,0|A@2710,0|X@3540,0|Y@3904,0|Z@4236,0|one_one@4558,0]
+../fonts/TestMORXFour.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0050,U+0051,U+0052,U+0041,U+0042,U+0043,U+0044,U+0058,U+0059,U+005A,U+24EC;[P|Q@333,0|R@699,0|C@1050,0|D@1880,0|A@2710,0|B@3540,0|X@4370,0|Y@4734,0|Z@5066,0|one_two@5388,0]
+../fonts/TestMORXFour.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0050,U+0051,U+0052,U+0041,U+0042,U+0043,U+0044,U+0058,U+0059,U+005A,U+24ED;[P|Q@333,0|R@699,0|C@1050,0|D@1880,0|B@2710,0|A@3540,0|X@4370,0|Y@4734,0|Z@5066,0|one_three@5388,0]
+../fonts/TestMORXFour.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0050,U+0051,U+0052,U+0041,U+0042,U+0043,U+0044,U+0058,U+0059,U+005A,U+24EE;[P|Q@333,0|R@699,0|D@1050,0|C@1880,0|A@2710,0|B@3540,0|X@4370,0|Y@4734,0|Z@5066,0|one_four@5388,0]
+../fonts/TestMORXFour.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0050,U+0051,U+0052,U+0041,U+0042,U+0043,U+0044,U+0058,U+0059,U+005A,U+24EF;[P|Q@333,0|R@699,0|D@1050,0|C@1880,0|B@2710,0|A@3540,0|X@4370,0|Y@4734,0|Z@5066,0|one_five@5388,0]
diff --git a/test/shape/data/text-rendering-tests/tests/MORX-40.tests b/test/shape/data/text-rendering-tests/tests/MORX-40.tests
new file mode 100644 (file)
index 0000000..a25fafd
--- /dev/null
@@ -0,0 +1,4 @@
+../fonts/TestMORXForty.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041,U+0042;[A|B@639,0]
+../fonts/TestMORXForty.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0042,U+0041;[B.alt|A.alt@1000,0]
+../fonts/TestMORXForty.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+05D0,U+05D1;[uni05D1|uni05D0@542,0]
+../fonts/TestMORXForty.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+05D1,U+05D0;[uni05D0.alt|uni05D1.alt@1000,0]
diff --git a/test/shape/data/text-rendering-tests/tests/MORX-41.tests b/test/shape/data/text-rendering-tests/tests/MORX-41.tests
new file mode 100644 (file)
index 0000000..2e75e71
--- /dev/null
@@ -0,0 +1,4 @@
+../fonts/TestMORXFourtyone.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0061,U+0063;[a_c]
+../fonts/TestMORXFourtyone.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0062,U+0063;[b_c]
+../fonts/TestMORXFourtyone.ttf;;U+0063,U+0063;*
+../fonts/TestMORXFourtyone.ttf;;U+0061,U+0062,U+0063,U+0063;*
diff --git a/test/shape/data/text-rendering-tests/tests/MORX-5.tests b/test/shape/data/text-rendering-tests/tests/MORX-5.tests
new file mode 100644 (file)
index 0000000..f46172f
--- /dev/null
@@ -0,0 +1,25 @@
+../fonts/TestMORXFour.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+0033;[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|three@2898,0]
+../fonts/TestMORXFour.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+0034;[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|four@2898,0]
+../fonts/TestMORXFour.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+0035;[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|five@2898,0]
+../fonts/TestMORXFour.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+0036;[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|six@2898,0]
+../fonts/TestMORXFour.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+0037;[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|seven@2898,0]
+../fonts/TestMORXFour.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+0038;[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|eight@2898,0]
+../fonts/TestMORXFour.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0050,U+0051,U+0052,U+0041,U+0042,U+0058,U+0059,U+005A,U+0038;[P|Q@333,0|R@699,0|A@1050,0|B@1880,0|X@2710,0|Y@3074,0|Z@3406,0|eight@3728,0]
+../fonts/TestMORXFour.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+0039;[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|nine@2898,0]
+../fonts/TestMORXFour.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0050,U+0051,U+0052,U+0041,U+0042,U+0058,U+0059,U+005A,U+0039;[P|Q@333,0|R@699,0|A@1050,0|B@1880,0|X@2710,0|Y@3074,0|Z@3406,0|nine@3728,0]
+../fonts/TestMORXFour.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+2793;[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|one_zero@2898,0]
+../fonts/TestMORXFour.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0050,U+0051,U+0052,U+0041,U+0042,U+0058,U+0059,U+005A,U+2793;[P|Q@333,0|R@699,0|A@1050,0|B@1880,0|X@2710,0|Y@3074,0|Z@3406,0|one_zero@3728,0]
+../fonts/TestMORXFour.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+24EB;[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|one_one@2898,0]
+../fonts/TestMORXFour.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0050,U+0051,U+0052,U+0041,U+0042,U+0058,U+0059,U+005A,U+24EB;[P|Q@333,0|R@699,0|A@1050,0|B@1880,0|X@2710,0|Y@3074,0|Z@3406,0|one_one@3728,0]
+../fonts/TestMORXFour.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+24EC;[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|one_two@2898,0]
+../fonts/TestMORXFour.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0050,U+0051,U+0052,U+0041,U+0042,U+0058,U+0059,U+005A,U+24EC;[P|Q@333,0|R@699,0|A@1050,0|B@1880,0|X@2710,0|Y@3074,0|Z@3406,0|one_two@3728,0]
+../fonts/TestMORXFour.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0050,U+0051,U+0052,U+0041,U+0042,U+0043,U+0058,U+0059,U+005A,U+24EC;[P|Q@333,0|R@699,0|A@1050,0|B@1880,0|C@2710,0|X@3540,0|Y@3904,0|Z@4236,0|one_two@4558,0]
+../fonts/TestMORXFour.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+24ED;[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|one_three@2898,0]
+../fonts/TestMORXFour.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0050,U+0051,U+0052,U+0041,U+0042,U+0058,U+0059,U+005A,U+24ED;[P|Q@333,0|R@699,0|A@1050,0|B@1880,0|X@2710,0|Y@3074,0|Z@3406,0|one_three@3728,0]
+../fonts/TestMORXFour.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0050,U+0051,U+0052,U+0041,U+0042,U+0043,U+0058,U+0059,U+005A,U+24ED;[P|Q@333,0|R@699,0|A@1050,0|B@1880,0|C@2710,0|X@3540,0|Y@3904,0|Z@4236,0|one_three@4558,0]
+../fonts/TestMORXFour.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+24EE;[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|one_four@2898,0]
+../fonts/TestMORXFour.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0050,U+0051,U+0052,U+0041,U+0042,U+0058,U+0059,U+005A,U+24EE;[P|Q@333,0|R@699,0|A@1050,0|B@1880,0|X@2710,0|Y@3074,0|Z@3406,0|one_four@3728,0]
+../fonts/TestMORXFour.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0050,U+0051,U+0052,U+0041,U+0042,U+0043,U+0058,U+0059,U+005A,U+24EE;[P|Q@333,0|R@699,0|A@1050,0|B@1880,0|C@2710,0|X@3540,0|Y@3904,0|Z@4236,0|one_four@4558,0]
+../fonts/TestMORXFour.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+24EF;[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|one_five@2898,0]
+../fonts/TestMORXFour.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0050,U+0051,U+0052,U+0041,U+0042,U+0058,U+0059,U+005A,U+24EF;[P|Q@333,0|R@699,0|A@1050,0|B@1880,0|X@2710,0|Y@3074,0|Z@3406,0|one_five@3728,0]
+../fonts/TestMORXFour.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0050,U+0051,U+0052,U+0041,U+0042,U+0043,U+0058,U+0059,U+005A,U+24EF;[P|Q@333,0|R@699,0|A@1050,0|B@1880,0|C@2710,0|X@3540,0|Y@3904,0|Z@4236,0|one_five@4558,0]
diff --git a/test/shape/data/text-rendering-tests/tests/MORX-6.tests b/test/shape/data/text-rendering-tests/tests/MORX-6.tests
new file mode 100644 (file)
index 0000000..c5b1841
--- /dev/null
@@ -0,0 +1 @@
+../fonts/TestMORXTwo.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+004F,U+004F,U+004F,U+0041,U+0042,U+0043,U+0044,U+0045,U+0046,U+0047,U+004F,U+004F,U+004F,U+0033,U+0031,U+0034,U+0031;[O|O@418,0|O@836,0|E@1254,0|F@2084,0|A@2914,0|G@3744,0|B@4574,0|C@5404,0|D@6234,0|O@7064,0|O@7482,0|O@7900,0|three@8318,0|one@9168,0|four@10018,0|one@10868,0]
diff --git a/test/shape/data/text-rendering-tests/tests/MORX-7.tests b/test/shape/data/text-rendering-tests/tests/MORX-7.tests
new file mode 100644 (file)
index 0000000..05e6bdc
--- /dev/null
@@ -0,0 +1 @@
+../fonts/TestMORXTwo.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+004F,U+0042,U+0043,U+0044,U+0031;[B|C@830,0|D@1660,0|O@2490,0|one@2908,0]
diff --git a/test/shape/data/text-rendering-tests/tests/MORX-8.tests b/test/shape/data/text-rendering-tests/tests/MORX-8.tests
new file mode 100644 (file)
index 0000000..68323c5
--- /dev/null
@@ -0,0 +1,3 @@
+../fonts/TestMORXEight.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0030,U+0041,U+0042,U+0043;[zero|A@914,0|B@1552,0|C@2202,0]
+../fonts/TestMORXEight.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0031,U+0041,U+0042,U+0043;[one|B@914,0|C@1564,0|A@2196,0]
+../fonts/TestMORXEight.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0032,U+0041,U+0042,U+0043;[two|C@914,0|A@1546,0|B@2184,0]
diff --git a/test/shape/data/text-rendering-tests/tests/MORX-9.tests b/test/shape/data/text-rendering-tests/tests/MORX-9.tests
new file mode 100644 (file)
index 0000000..1eed22b
--- /dev/null
@@ -0,0 +1 @@
+../fonts/TestMORXNine.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041,U+0042,U+0058,U+0041,U+0042;[B|A@650,0|X@1288,0|A@1874,0|B@2512,0]
diff --git a/test/shape/data/text-rendering-tests/tests/SFNT-1.tests b/test/shape/data/text-rendering-tests/tests/SFNT-1.tests
new file mode 100644 (file)
index 0000000..b069cf6
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/TestSFNTOne.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041;[A]
+../fonts/TestSFNTOne.otf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0042;[B]
diff --git a/test/shape/data/text-rendering-tests/tests/SFNT-2.tests b/test/shape/data/text-rendering-tests/tests/SFNT-2.tests
new file mode 100644 (file)
index 0000000..28efff1
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/TestSFNTTwo.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0041;[A]
+../fonts/TestSFNTTwo.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0042;[B]
diff --git a/test/shape/data/text-rendering-tests/tests/SHBALI-3.tests b/test/shape/data/text-rendering-tests/tests/SHBALI-3.tests
new file mode 100644 (file)
index 0000000..2e73dca
--- /dev/null
@@ -0,0 +1,9 @@
+../fonts/NotoSansBalinese-Regular.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+1B66,U+1B6B;[gid102|gid107@560,-10]
+../fonts/NotoSansBalinese-Regular.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+1B66,U+1B6C;[gid102|gid108@573,49]
+../fonts/NotoSansBalinese-Regular.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+1B66,U+1B6D;[gid102|gid109@652,-10]
+../fonts/NotoSansBalinese-Regular.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+1B66,U+1B6E;[gid102|gid110@652,-98]
+../fonts/NotoSansBalinese-Regular.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+1B66,U+1B6F;[gid102|gid111@667,-10]
+../fonts/NotoSansBalinese-Regular.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+1B66,U+1B70;[gid102|gid112@667,-10]
+../fonts/NotoSansBalinese-Regular.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+1B66,U+1B71;[gid102|gid113@667,-10]
+../fonts/NotoSansBalinese-Regular.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+1B66,U+1B72;[gid102|gid114@667,-10]
+../fonts/NotoSansBalinese-Regular.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+1B66,U+1B73;[gid102|gid115@599,-10]
diff --git a/test/shape/data/text-rendering-tests/tests/SHKNDA-1.tests b/test/shape/data/text-rendering-tests/tests/SHKNDA-1.tests
new file mode 100644 (file)
index 0000000..cb8dc85
--- /dev/null
@@ -0,0 +1,34 @@
+../fonts/NotoSerifKannada-Regular.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0CB2,U+0CCD,U+0CB2,U+0CBF;[knLI|knLAc2@757,0]
+../fonts/NotoSerifKannada-Regular.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0C9F,U+0CCD,U+0CB8,U+0CCD;[knTT|knSAc2@1021,0]
+../fonts/NotoSerifKannada-Regular.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0CB3,U+0CBF;[knLLI]
+../fonts/NotoSerifKannada-Regular.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0CA1,U+0CBF;[knDDI]
+../fonts/NotoSerifKannada-Regular.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0CAE,U+0CC6;[knME]
+../fonts/NotoSerifKannada-Regular.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0CB0,U+0CBF;[knRI]
+../fonts/NotoSerifKannada-Regular.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0C96,U+0CCD,U+0CAF,U+0CC6;[knKHE|knYAc2@846,0]
+../fonts/NotoSerifKannada-Regular.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0CAB,U+0CCD,U+0CB0,U+0CBF;[knPHI|knRAc2@735,0]
+../fonts/NotoSerifKannada-Regular.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0CA8,U+0CC6;[knNE]
+../fonts/NotoSerifKannada-Regular.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0C97,U+0CBF;[knGI]
+../fonts/NotoSerifKannada-Regular.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0CB7,U+0CCD,U+0C9F,U+0CBF;[knSSI|knTTAc2@746,0]
+../fonts/NotoSerifKannada-Regular.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0CAF,U+0CBF,U+0C82;[knYI|knAnusvara@1252,0]
+../fonts/NotoSerifKannada-Regular.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0C9A,U+0CC0;[knCI|knLengthmark@766,0]
+../fonts/NotoSerifKannada-Regular.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0CA8,U+0CBF;[knNI]
+../fonts/NotoSerifKannada-Regular.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0C97,U+0CCD,U+0CB2,U+0CBF;[knGI|knLAc2@621,0]
+../fonts/NotoSerifKannada-Regular.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0CB7,U+0CBF;[knSSI]
+../fonts/NotoSerifKannada-Regular.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0C97,U+0CC6;[knGE]
+../fonts/NotoSerifKannada-Regular.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0CA6,U+0CCD,U+0CB5,U+0CBF;[knDI|knVAc2@740,0]
+../fonts/NotoSerifKannada-Regular.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0CA4,U+0CC0;[knTI|knLengthmark@613,0]
+../fonts/NotoSerifKannada-Regular.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0CAE,U+0CBF;[knMI]
+../fonts/NotoSerifKannada-Regular.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0CB2,U+0CBF;[knLI]
+../fonts/NotoSerifKannada-Regular.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0C97,U+0CBF;[knGI]
+../fonts/NotoSerifKannada-Regular.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0CA8,U+0CCD;[knN]
+../fonts/NotoSerifKannada-Regular.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0CAC,U+0CBF;[knBI]
+../fonts/NotoSerifKannada-Regular.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0CB2,U+0CBF;[knLI]
+../fonts/NotoSerifKannada-Regular.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0CA8,U+0CCD,U+0CA8,U+0CBF,U+0C82;[knNI|knNAc2@678,0|knAnusvara@755,0]
+../fonts/NotoSerifKannada-Regular.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0CB2,U+0CCD,U+0CB2,U+0CBF;[knLI|knLAc2@757,0]
+../fonts/NotoSerifKannada-Regular.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0CA7,U+0CBF;[knDHI]
+../fonts/NotoSerifKannada-Regular.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0CAA,U+0CCC;[knPA.base|knmAU@739,0]
+../fonts/NotoSerifKannada-Regular.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0CB5,U+0CBF,U+0C82;[knVI|knAnusvara@749,0]
+../fonts/NotoSerifKannada-Regular.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0CA1,U+0CBF;[knDDI]
+../fonts/NotoSerifKannada-Regular.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0C9F,U+0CBF;[knTTI]
+../fonts/NotoSerifKannada-Regular.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0CA8,U+0CBF;[knNI]
+../fonts/NotoSerifKannada-Regular.ttf;--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft;U+0CA7,U+0CBF;[knDHI]
diff --git a/test/shape/data/text-rendering-tests/update.py b/test/shape/data/text-rendering-tests/update.py
new file mode 100755 (executable)
index 0000000..cf119be
--- /dev/null
@@ -0,0 +1,120 @@
+#!/usr/bin/env python3
+
+import sys, os, subprocess, shutil, glob
+import xml.etree.ElementTree as ET
+
+# Can we extract this from HTML element itself? I couldn't.
+namespaces = {
+       'ft': 'https://github.com/OpenType/fonttest',
+       'xlink': 'http://www.w3.org/1999/xlink',
+}
+def ns (s):
+       ns,s = s.split(':')
+       return '{%s}%s' % (namespaces[ns], s)
+
+def unistr (s):
+       return ','.join('U+%04X' % ord(c) for c in s)
+
+def glyphstr (glyphs):
+       out = []
+       for glyphname, x, y in glyphs:
+               if x or y:
+                       out.append ('%s@%d,%d' % (glyphname, x, y))
+               else:
+                       out.append (glyphname)
+       return '[' + '|'.join (out) + ']'
+
+def extract_tests (input):
+       html = ET.fromstring (input)
+       found = False
+
+       result = []
+
+       for elt in html.findall (".//*[@class='expected'][@ft:id]", namespaces):
+               found = True
+               name = elt.get (ns ('ft:id'))
+               text = elt.get (ns ('ft:render'))
+               font = elt.get (ns ('ft:font'))
+               variations = elt.get (ns ('ft:var'), '').replace (':', '=').replace (';', ',')
+               glyphs = []
+               for use in elt.findall (".//use"):
+                       x = int (use.get ('x'))
+                       y = int (use.get ('y'))
+                       href = use.get (ns ('xlink:href'))
+                       assert href[0] == '#'
+                       glyphname = '.'.join (href[1:].split ('/')[1].split ('.')[1:])
+                       glyphs.append ((glyphname, x, y))
+               opts = '--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft'
+               if variations:
+                       opts = opts + ' --variations=%s' % variations
+               result.append ("../fonts/%s:%s:%s:%s" % (font, opts, unistr(text), glyphstr(glyphs)))
+
+       for elt in html.findall (".//*[@class='expected-no-crash'][@ft:id]", namespaces):
+               found = True
+               name = elt.get (ns ('ft:id'))
+               text = elt.get (ns ('ft:render'))
+               font = elt.get (ns ('ft:font'))
+               variations = elt.get (ns ('ft:var'), '').replace (':', '=').replace (';', ',')
+               opts = ''
+               if variations:
+                       opts = '--variations=%s' % variations
+               result.append ("../fonts/%s:%s:%s:*" % (font, opts, unistr (text)))
+
+       assert found
+       return '\n'.join (result) + '\n'
+
+os.chdir (os.getenv ('srcdir', os.path.dirname (__file__)))
+
+git = shutil.which ('git')
+assert git
+
+if os.path.isdir ('./text-rendering-tests'):
+       subprocess.run ([git, 'pull'], cwd='text-rendering-tests', check=True)
+else:
+       subprocess.run ([git, 'clone', 'https://github.com/unicode-org/text-rendering-tests'], check=True)
+
+shutil.rmtree ('fonts', ignore_errors=True)
+assert not os.path.exists ('fonts')
+shutil.copytree ('text-rendering-tests/fonts', 'fonts')
+subprocess.run([git, 'add', 'fonts'], check=True)
+
+shutil.rmtree ('tests', ignore_errors=True)
+assert not os.path.isdir('tests')
+os.mkdir ('tests')
+
+with open ('DISABLED', 'r') as f: disabled = f.read ()
+
+tests = []
+disabled_tests = []
+
+for x in sorted (os.listdir ('text-rendering-tests/testcases')):
+       if not x.endswith ('.html') or x == 'index.html': continue
+       out = 'tests/%s.tests' % x.split('.html')[0]
+       with open ('text-rendering-tests/testcases/' + x, 'r') as f: content = f.read ()
+       with open (out, 'w') as f: f.write (extract_tests (content))
+       if out in disabled:
+               disabled_tests.append (out)
+       else:
+               tests.append (out)
+
+subprocess.run([git, 'add', 'tests'], check=True)
+
+with open ('meson.build', 'w') as f: f.write ('\n'.join (
+       ['text_rendering_tests = ['] +
+       ['  \'%s\',' % x.split('tests/')[1] for x in tests] +
+       [']', '', 'disabled_text_rendering_tests = ['] +
+       ['  \'%s\',' % x.split('tests/')[1] for x in disabled_tests] +
+       [']', '']
+))
+
+with open ('Makefile.sources', 'w') as f: f.write ('\n'.join (
+       ['TESTS = \\'] +
+       ['      %s \\' % x for x in tests] +
+       ['      $(NULL)', '', 'DISBALED_TESTS = \\'] +
+       ['      %s \\' % x for x in disabled_tests] +
+       ['      $(NULL)', '']
+))
+
+subprocess.run([git, 'add', 'Makefile.sources'], check=True)
+
+print ('Updated the testsuit, now run `git commit -e -m "[test/text-rendering-tests] Update from upstream"`')
similarity index 100%
rename from test/shaping/hb-diff
rename to test/shape/hb-diff
diff --git a/test/shape/hb_test_tools.py b/test/shape/hb_test_tools.py
new file mode 100644 (file)
index 0000000..682b919
--- /dev/null
@@ -0,0 +1,491 @@
+#!/usr/bin/env python3
+
+import sys, os, re, difflib, unicodedata, errno, cgi, itertools
+from itertools import *
+
+diff_symbols = "-+=*&^%$#@!~/"
+diff_colors = ['red', 'green', 'blue']
+
+def codepoints(s):
+       return (ord (u) for u in s)
+
+class ColorFormatter:
+
+       class Null:
+               @staticmethod
+               def start_color (c): return ''
+               @staticmethod
+               def end_color (): return ''
+               @staticmethod
+               def escape (s): return s
+               @staticmethod
+               def newline (): return '\n'
+
+       class ANSI:
+               @staticmethod
+               def start_color (c):
+                       return {
+                               'red': '\033[41;37;1m',
+                               'green': '\033[42;37;1m',
+                               'blue': '\033[44;37;1m',
+                       }[c]
+               @staticmethod
+               def end_color ():
+                       return '\033[m'
+               @staticmethod
+               def escape (s): return s
+               @staticmethod
+               def newline (): return '\n'
+
+       class HTML:
+               @staticmethod
+               def start_color (c):
+                       return '<span style="background:%s">' % c
+               @staticmethod
+               def end_color ():
+                       return '</span>'
+               @staticmethod
+               def escape (s): return cgi.escape (s)
+               @staticmethod
+               def newline (): return '<br/>\n'
+
+       @staticmethod
+       def Auto (argv = [], out = sys.stdout):
+               format = ColorFormatter.ANSI
+               if "--format" in argv:
+                       argv.remove ("--format")
+                       format = ColorFormatter.ANSI
+               if "--format=ansi" in argv:
+                       argv.remove ("--format=ansi")
+                       format = ColorFormatter.ANSI
+               if "--format=html" in argv:
+                       argv.remove ("--format=html")
+                       format = ColorFormatter.HTML
+               if "--no-format" in argv:
+                       argv.remove ("--no-format")
+                       format = ColorFormatter.Null
+               return format
+
+
+class DiffColorizer:
+
+       diff_regex = re.compile ('([a-za-z0-9_]*)([^a-za-z0-9_]?)')
+
+       def __init__ (self, formatter, colors=diff_colors, symbols=diff_symbols):
+               self.formatter = formatter
+               self.colors = colors
+               self.symbols = symbols
+
+       def colorize_lines (self, lines):
+               lines = (l if l else '' for l in lines)
+               ss = [self.diff_regex.sub (r'\1\n\2\n', l).splitlines (True) for l in lines]
+               oo = ["",""]
+               st = [False, False]
+               for l in difflib.Differ().compare (*ss):
+                       if l[0] == '?':
+                               continue
+                       if l[0] == ' ':
+                               for i in range(2):
+                                       if st[i]:
+                                               oo[i] += self.formatter.end_color ()
+                                               st[i] = False
+                               oo = [o + self.formatter.escape (l[2:]) for o in oo]
+                               continue
+                       if l[0] in self.symbols:
+                               i = self.symbols.index (l[0])
+                               if not st[i]:
+                                       oo[i] += self.formatter.start_color (self.colors[i])
+                                       st[i] = True
+                               oo[i] += self.formatter.escape (l[2:])
+                               continue
+               for i in range(2):
+                       if st[i]:
+                               oo[i] += self.formatter.end_color ()
+                               st[i] = False
+               oo = [o.replace ('\n', '') for o in oo]
+               return [s1+s2+self.formatter.newline () for (s1,s2) in zip (self.symbols, oo) if s2]
+
+       def colorize_diff (self, f):
+               lines = [None, None]
+               for l in f:
+                       if l[0] not in self.symbols:
+                               yield self.formatter.escape (l).replace ('\n', self.formatter.newline ())
+                               continue
+                       i = self.symbols.index (l[0])
+                       if lines[i]:
+                               # Flush
+                               for line in self.colorize_lines (lines):
+                                       yield line
+                               lines = [None, None]
+                       lines[i] = l[1:]
+                       if (all (lines)):
+                               # Flush
+                               for line in self.colorize_lines (lines):
+                                       yield line
+                               lines = [None, None]
+               if (any (lines)):
+                       # Flush
+                       for line in self.colorize_lines (lines):
+                               yield line
+
+
+class ZipDiffer:
+
+       @staticmethod
+       def diff_files (files, symbols=diff_symbols):
+               files = tuple (files) # in case it's a generator, copy it
+               try:
+                       for lines in itertools.zip_longest (*files):
+                               if all (lines[0] == line for line in lines[1:]):
+                                       sys.stdout.writelines ([" ", lines[0]])
+                                       continue
+
+                               for i, l in enumerate (lines):
+                                       if l:
+                                               sys.stdout.writelines ([symbols[i], l])
+               except IOError as e:
+                       if e.errno != errno.EPIPE:
+                               sys.exit ("%s: %s: %s" % (sys.argv[0], e.filename, e.strerror))
+
+
+class DiffFilters:
+
+       @staticmethod
+       def filter_failures (f):
+               for key, lines in DiffHelpers.separate_test_cases (f):
+                       lines = list (lines)
+                       if not DiffHelpers.test_passed (lines):
+                               for l in lines: yield l
+
+class Stat:
+
+       def __init__ (self):
+               self.count = 0
+               self.freq = 0
+
+       def add (self, test):
+               self.count += 1
+               self.freq += test.freq
+
+class Stats:
+
+       def __init__ (self):
+               self.passed = Stat ()
+               self.failed = Stat ()
+               self.total  = Stat ()
+
+       def add (self, test):
+               self.total.add (test)
+               if test.passed:
+                       self.passed.add (test)
+               else:
+                       self.failed.add (test)
+
+       def mean (self):
+               return float (self.passed.count) / self.total.count
+
+       def variance (self):
+               return (float (self.passed.count) / self.total.count) * \
+                      (float (self.failed.count) / self.total.count)
+
+       def stddev (self):
+               return self.variance () ** .5
+
+       def zscore (self, population):
+               """Calculate the standard score.
+                  Population is the Stats for population.
+                  Self is Stats for sample.
+                  Returns larger absolute value if sample is highly unlikely to be random.
+                  Anything outside of -3..+3 is very unlikely to be random.
+                  See: https://en.wikipedia.org/wiki/Standard_score"""
+
+               return (self.mean () - population.mean ()) / population.stddev ()
+
+
+
+
+class DiffSinks:
+
+       @staticmethod
+       def print_stat (f):
+               passed = 0
+               failed = 0
+               # XXX port to Stats, but that would really slow us down here
+               for key, lines in DiffHelpers.separate_test_cases (f):
+                       if DiffHelpers.test_passed (lines):
+                               passed += 1
+                       else:
+                               failed += 1
+               total = passed + failed
+               print ("%d out of %d tests passed.  %d failed (%g%%)" % (passed, total, failed, 100. * failed / total))
+
+
+class Test:
+
+       def __init__ (self, lines):
+               self.freq = 1
+               self.passed = True
+               self.identifier = None
+               self.text = None
+               self.unicodes = None
+               self.glyphs = None
+               for l in lines:
+                       symbol = l[0]
+                       if symbol != ' ':
+                               self.passed = False
+                       i = 1
+                       if ':' in l:
+                               i = l.index (':')
+                               if not self.identifier:
+                                       self.identifier = l[1:i]
+                               i = i + 2 # Skip colon and space
+                       j = -1
+                       if l[j] == '\n':
+                               j -= 1
+                       brackets = l[i] + l[j]
+                       l = l[i+1:-2]
+                       if brackets == '()':
+                               self.text = l
+                       elif brackets == '<>':
+                               self.unicodes = Unicode.parse (l)
+                       elif brackets == '[]':
+                               # XXX we don't handle failed tests here
+                               self.glyphs = l
+
+
+class DiffHelpers:
+
+       @staticmethod
+       def separate_test_cases (f):
+               '''Reads lines from f, and if the lines have identifiers, ie.
+                  have a colon character, groups them by identifier,
+                  yielding lists of all lines with the same identifier.'''
+
+               def identifier (l):
+                       if ':' in l[1:]:
+                               return l[1:l.index (':')]
+                       return l
+               return groupby (f, key=identifier)
+
+       @staticmethod
+       def test_passed (lines):
+               lines = list (lines)
+               # XXX This is a hack, but does the job for now.
+               if any (l.find("space+0|space+0") >= 0 for l in lines if l[0] == '+'): return True
+               if any (l.find("uni25CC") >= 0 for l in lines if l[0] == '+'): return True
+               if any (l.find("dottedcircle") >= 0 for l in lines if l[0] == '+'): return True
+               if any (l.find("glyph0") >= 0 for l in lines if l[0] == '+'): return True
+               if any (l.find("gid0") >= 0 for l in lines if l[0] == '+'): return True
+               if any (l.find("notdef") >= 0 for l in lines if l[0] == '+'): return True
+               return all (l[0] == ' ' for l in lines)
+
+
+class FilterHelpers:
+
+       @staticmethod
+       def filter_printer_function (filter_callback):
+               def printer (f):
+                       for line in filter_callback (f):
+                               print (line)
+               return printer
+
+       @staticmethod
+       def filter_printer_function_no_newline (filter_callback):
+               def printer (f):
+                       for line in filter_callback (f):
+                               sys.stdout.writelines ([line])
+               return printer
+
+
+class Ngram:
+
+       @staticmethod
+       def generator (n):
+
+               def gen (f):
+                       l = []
+                       for x in f:
+                               l.append (x)
+                               if len (l) == n:
+                                       yield tuple (l)
+                                       l[:1] = []
+
+               gen.n = n
+               return gen
+
+
+class UtilMains:
+
+       @staticmethod
+       def process_multiple_files (callback, mnemonic = "FILE"):
+
+               if "--help" in sys.argv:
+                       sys.exit ("Usage: %s %s..." % (sys.argv[0], mnemonic))
+
+               try:
+                       files = sys.argv[1:] if len (sys.argv) > 1 else ['-']
+                       for s in files:
+                               callback (FileHelpers.open_file_or_stdin (s))
+               except IOError as e:
+                       if e.errno != errno.EPIPE:
+                               sys.exit ("%s: %s: %s" % (sys.argv[0], e.filename, e.strerror))
+
+       @staticmethod
+       def process_multiple_args (callback, mnemonic):
+
+               if len (sys.argv) == 1 or "--help" in sys.argv:
+                       sys.exit ("Usage: %s %s..." % (sys.argv[0], mnemonic))
+
+               try:
+                       for s in sys.argv[1:]:
+                               callback (s)
+               except IOError as e:
+                       if e.errno != errno.EPIPE:
+                               sys.exit ("%s: %s: %s" % (sys.argv[0], e.filename, e.strerror))
+
+       @staticmethod
+       def filter_multiple_strings_or_stdin (callback, mnemonic, \
+                                             separator = " ", \
+                                             concat_separator = False):
+
+               if "--help" in sys.argv:
+                       sys.exit ("""Usage:
+  %s %s...
+or:
+  %s
+When called with no arguments, input is read from standard input.
+""" % (sys.argv[0], mnemonic, sys.argv[0]))
+
+               try:
+                       if len (sys.argv) == 1:
+                               while (1):
+                                       line = sys.stdin.readline ()
+                                       if not len (line):
+                                               break
+                                       if line[-1] == '\n':
+                                               line = line[:-1]
+                                       print (callback (line))
+                       else:
+                               args = sys.argv[1:]
+                               if concat_separator != False:
+                                       args = [concat_separator.join (args)]
+                               print (separator.join (callback (x) for x in (args)))
+               except IOError as e:
+                       if e.errno != errno.EPIPE:
+                               sys.exit ("%s: %s: %s" % (sys.argv[0], e.filename, e.strerror))
+
+
+class Unicode:
+
+       @staticmethod
+       def decode (s):
+               return ','.join ("U+%04X" % cp for cp in codepoints (s))
+
+       @staticmethod
+       def parse (s):
+               s = re.sub (r"0[xX]", " ", s)
+               s = re.sub (r"[<+\->{},;&#\\xXuUnNiI\n\t]", " ", s)
+               return [int (x, 16) for x in s.split ()]
+
+       @staticmethod
+       def encode (s):
+               return ''.join (chr (x) for x in Unicode.parse (s))
+
+       shorthands = {
+               "ZERO WIDTH NON-JOINER": "ZWNJ",
+               "ZERO WIDTH JOINER": "ZWJ",
+               "NARROW NO-BREAK SPACE": "NNBSP",
+               "COMBINING GRAPHEME JOINER": "CGJ",
+               "LEFT-TO-RIGHT MARK": "LRM",
+               "RIGHT-TO-LEFT MARK": "RLM",
+               "LEFT-TO-RIGHT EMBEDDING": "LRE",
+               "RIGHT-TO-LEFT EMBEDDING": "RLE",
+               "POP DIRECTIONAL FORMATTING": "PDF",
+               "LEFT-TO-RIGHT OVERRIDE": "LRO",
+               "RIGHT-TO-LEFT OVERRIDE": "RLO",
+       }
+
+       @staticmethod
+       def pretty_name (u):
+               try:
+                       s = unicodedata.name (u)
+               except ValueError:
+                       return "XXX"
+               s = re.sub (".* LETTER ", "", s)
+               s = re.sub (".* VOWEL SIGN (.*)", r"\1-MATRA", s)
+               s = re.sub (".* SIGN ", "", s)
+               s = re.sub (".* COMBINING ", "", s)
+               if re.match (".* VIRAMA", s):
+                       s = "HALANT"
+               if s in Unicode.shorthands:
+                       s = Unicode.shorthands[s]
+               return s
+
+       @staticmethod
+       def pretty_names (s):
+               s = re.sub (r"[<+>\\uU]", " ", s)
+               s = re.sub (r"0[xX]", " ", s)
+               s = [chr (int (x, 16)) for x in re.split ('[, \n]', s) if len (x)]
+               return ' + '.join (Unicode.pretty_name (x) for x in s)
+
+
+class FileHelpers:
+
+       @staticmethod
+       def open_file_or_stdin (f):
+               if f == '-':
+                       return sys.stdin
+               return open (f)
+
+
+class Manifest:
+
+       @staticmethod
+       def read (s, strict = True):
+
+               if not os.path.exists (s):
+                       if strict:
+                               sys.exit ("%s: %s does not exist" % (sys.argv[0], s))
+                       return
+
+               s = os.path.normpath (s)
+
+               if os.path.isdir (s):
+
+                       try:
+                               m = open (os.path.join (s, "MANIFEST"))
+                               items = [x.strip () for x in m.readlines ()]
+                               for f in items:
+                                       for p in Manifest.read (os.path.join (s, f)):
+                                               yield p
+                       except IOError:
+                               if strict:
+                                       sys.exit ("%s: %s does not exist" % (sys.argv[0], os.path.join (s, "MANIFEST")))
+                               return
+               else:
+                       yield s
+
+       @staticmethod
+       def update_recursive (s):
+
+               for dirpath, dirnames, filenames in os.walk (s, followlinks=True):
+
+                       for f in ["MANIFEST", "README", "LICENSE", "COPYING", "AUTHORS", "SOURCES", "ChangeLog"]:
+                               if f in dirnames:
+                                       dirnames.remove (f)
+                               if f in filenames:
+                                       filenames.remove (f)
+                       dirnames.sort ()
+                       filenames.sort ()
+                       ms = os.path.join (dirpath, "MANIFEST")
+                       print ("  GEN    %s" % ms)
+                       m = open (ms, "w")
+                       for f in filenames:
+                               print (f, file=m)
+                       for f in dirnames:
+                               print (f, file=m)
+                       for f in dirnames:
+                               Manifest.update_recursive (os.path.join (dirpath, f))
+
+if __name__ == '__main__':
+       pass
diff --git a/test/shape/meson.build b/test/shape/meson.build
new file mode 100644 (file)
index 0000000..2409eec
--- /dev/null
@@ -0,0 +1,62 @@
+
+subdir('data/in-house') # in_house_tests
+subdir('data/aots') # aots_tests
+subdir('data/text-rendering-tests') # text_rendering_tests
+
+shaping_run_tests_py = find_program('run-tests.py')
+
+env = environment()
+env.set('HAVE_FREETYPE', '@0@'.format(conf.get('HAVE_FREETYPE', 0)))
+
+in_house_tests = in_house_tests_base
+if conf.get('HAVE_CORETEXT', 0) == 1
+  in_house_tests += in_house_tests_coretext
+endif
+if conf.get('HAVE_UNISCRIBE', 0) == 1
+  in_house_tests += in_house_tests_uniscribe
+endif
+if conf.get('HAVE_DIRECTWRITE', 0) == 1
+  in_house_tests += in_house_tests_directwrite
+endif
+
+foreach file_name : in_house_tests
+  test_name = file_name.split('.')[0]
+
+  test(test_name, shaping_run_tests_py,
+    args: [
+      hb_shape,
+      meson.current_source_dir() / 'data' / 'in-house' / 'tests' / file_name,
+    ],
+    env: env,
+    workdir: meson.current_build_dir() / '..' / '..',
+    suite: ['shaping', 'in-house'],
+  )
+endforeach
+
+foreach file_name : aots_tests
+  test_name = file_name.split('.')[0]
+
+  test(test_name, shaping_run_tests_py,
+    args: [
+      hb_shape,
+      meson.current_source_dir() / 'data' / 'aots' / 'tests' / file_name,
+    ],
+    env: env,
+    workdir: meson.current_build_dir() / '..' / '..',
+    suite: ['shaping', 'aots'],
+  )
+endforeach
+
+foreach file_name : text_rendering_tests
+  test_name = file_name.split('.')[0]
+
+  test(test_name, shaping_run_tests_py,
+    args: [
+      hb_shape,
+      meson.current_source_dir() / 'data' / 'text-rendering-tests' / 'tests' / file_name,
+    ],
+    env: env,
+    workdir: meson.current_build_dir() / '..' / '..',
+    suite: ['shaping', 'text-rendering-tests'],
+  )
+endforeach
diff --git a/test/shape/record-test.sh b/test/shape/record-test.sh
new file mode 100755 (executable)
index 0000000..41e13c3
--- /dev/null
@@ -0,0 +1,128 @@
+#!/bin/bash
+
+dir=`mktemp -d`
+
+if which sha1sum 2>/dev/null >/dev/null; then
+       SHA1SUM=sha1sum
+elif which shasum 2>/dev/null >/dev/null; then
+       SHA1SUM='shasum -a 1'
+elif which digest 2>/dev/null >/dev/null; then
+       SHA1SUM='digest -a sha1'
+else
+       echo "'sha1sum' not found"
+       exit 2
+fi
+
+out=/dev/stdout
+if test "x$1" == 'x-o'; then
+       shift
+       out=$1
+       shift
+fi
+hb_shape=$1
+shift
+fontfile=$1
+if test "x${fontfile:0:1}" == 'x-'; then
+       echo "Specify font file before other options." >&2
+       exit 1
+fi
+shift
+if ! echo "$hb_shape" | grep -q 'hb-shape'; then
+       echo "Specify hb-shape (not hb-view, etc): got "$hb_shape"." >&2
+       exit 1
+fi
+options=
+have_text=false
+for arg in "$@"; do
+       if test "x${arg:0:1}" == 'x-'; then
+               if echo "$arg" | grep -q ' '; then
+                       echo "Space in argument is not supported: '$arg'." >&2
+                       exit 1
+               fi
+               options="$options${options:+ }$arg"
+               continue
+       fi
+       if $have_text; then
+               echo "Too many arguments found...  Use '=' notation for options: '$arg'" >&2
+               exit 1;
+       fi
+       text="$arg"
+       have_text=true
+done
+if ! $have_text; then
+       text=`cat`
+fi
+unicodes=`echo "$text" | ./hb-unicode-decode`
+glyphs=`echo "$text" | $hb_shape $options "$fontfile"`
+if test $? != 0; then
+       echo "hb-shape failed." >&2
+       exit 2
+fi
+glyph_ids=`echo "$text" | $hb_shape $options --no-glyph-names --no-clusters --no-positions "$fontfile" | sed 's/[][]//g; s/|/,/g'`
+
+cp "$fontfile" "$dir/font.ttf"
+echo fonttools subset \
+       --glyph-names \
+       --no-hinting \
+       --layout-features='*' \
+       --gids="$glyph_ids" \
+       --text="$text" \
+       --output-file="$dir/font.subset.ttf" \
+       "$dir/font.ttf"
+fonttools subset \
+       --glyph-names \
+       --no-hinting \
+       --layout-features='*' \
+       --gids="$glyph_ids" \
+       --text="$text" \
+       --output-file="$dir/font.subset.ttf" \
+       "$dir/font.ttf"
+if ! test -s "$dir/font.subset.ttf"; then
+       echo "Subsetter didn't produce nonempty subset font in $dir/font.subset.ttf" >&2
+       exit 2
+fi
+
+# Verify that subset font produces same glyphs!
+glyphs_subset=`echo "$text" | $hb_shape $options "$dir/font.subset.ttf"`
+
+if ! test "x$glyphs" = "x$glyphs_subset"; then
+       echo "Subset font produced different glyphs!" >&2
+       echo "Perhaps font doesn't have glyph names; checking visually..." >&2
+       hb_view=${hb_shape/shape/view}
+       echo "$text" | $hb_view $options "$dir/font.ttf" --output-format=png --output-file="$dir/orig.png"
+       echo "$text" | $hb_view $options "$dir/font.subset.ttf" --output-format=png --output-file="$dir/subset.png"
+       if ! cmp "$dir/orig.png" "$dir/subset.png"; then
+               echo "Images differ.  Please inspect $dir/*.png." >&2
+               echo "$glyphs" >> "$out"
+               echo "$glyphs_subset" >> "$out"
+               exit 2
+       fi
+       echo "Yep; all good." >&2
+       rm -f "$dir/orig.png"
+       rm -f "$dir/subset.png"
+       glyphs=$glyphs_subset
+fi
+
+sha1sum=`$SHA1SUM "$dir/font.subset.ttf" | cut -d' ' -f1`
+subset="data/in-house/fonts/$sha1sum.ttf"
+mv "$dir/font.subset.ttf" "$subset"
+
+# There ought to be an easier way to do this, but it escapes me...
+unicodes_file=`mktemp`
+glyphs_file=`mktemp`
+echo "$unicodes" > "$unicodes_file"
+echo "$glyphs" > "$glyphs_file"
+# Open the "file"s
+exec 3<"$unicodes_file"
+exec 4<"$glyphs_file"
+relative_subset="$subset"
+if test "$out" != "/dev/stdout"; then
+       relative_subset="$(/usr/bin/env python3 -c 'import os, sys; print (os.path.relpath (sys.argv[1], sys.argv[2]))' "$subset" "$(dirname "$out")")"
+fi
+while read uline <&3 && read gline <&4; do
+       echo "$relative_subset;$options;$uline;$gline" >> "$out"
+done
+
+
+rm -f "$dir/font.ttf"
+rmdir "$dir"
diff --git a/test/shape/run-tests.py b/test/shape/run-tests.py
new file mode 100755 (executable)
index 0000000..83f1fec
--- /dev/null
@@ -0,0 +1,125 @@
+#!/usr/bin/env python3
+
+import sys, os, subprocess, hashlib
+
+def shape_cmd(command):
+       global hb_shape, process
+       print (hb_shape + ' ' + " ".join(command))
+       process.stdin.write ((';'.join (command) + '\n').encode ("utf-8"))
+       process.stdin.flush ()
+       return process.stdout.readline().decode ("utf-8").strip ()
+
+args = sys.argv[1:]
+
+have_freetype = bool(int(os.getenv ('HAVE_FREETYPE', '1')))
+
+if not args or args[0].find('hb-shape') == -1 or not os.path.exists (args[0]):
+       sys.exit ("""First argument does not seem to point to usable hb-shape.""")
+hb_shape, args = args[0], args[1:]
+
+process = subprocess.Popen ([hb_shape, '--batch'],
+                           stdin=subprocess.PIPE,
+                           stdout=subprocess.PIPE,
+                           stderr=sys.stdout)
+
+passes = 0
+fails = 0
+skips = 0
+
+if not len (args):
+       args = ['-']
+
+for filename in args:
+       if filename == '-':
+               print ("Running tests from standard input")
+       else:
+               print ("Running tests in " + filename)
+
+       if filename == '-':
+               f = sys.stdin
+       else:
+               f = open (filename, encoding='utf8')
+
+       for line in f:
+               comment = False
+               if line.startswith ("#"):
+                       comment = True
+                       line = line[1:]
+
+                       if line.startswith (' '):
+                               print ("#%s" % line)
+                               continue
+
+               line = line.strip ()
+               if not line:
+                       continue
+
+               fontfile, options, unicodes, glyphs_expected = line.split (';')
+               options = options.split ()
+               if fontfile.startswith ('/') or fontfile.startswith ('"/'):
+                       if os.name == 'nt': # Skip on Windows
+                               continue
+
+                       fontfile, expected_hash = (fontfile.split('@') + [''])[:2]
+
+                       try:
+                               with open (fontfile, 'rb') as ff:
+                                       if expected_hash:
+                                               actual_hash = hashlib.sha1 (ff.read()).hexdigest ().strip ()
+                                               if actual_hash != expected_hash:
+                                                       print ('different version of %s found; Expected hash %s, got %s; skipping.' %
+                                                                  (fontfile, expected_hash, actual_hash))
+                                                       skips += 1
+                                                       continue
+                       except IOError:
+                               print ('%s not found, skip.' % fontfile)
+                               skips += 1
+                               continue
+               else:
+                       cwd = os.path.dirname(filename)
+                       fontfile = os.path.normpath (os.path.join (cwd, fontfile))
+
+               extra_options = ["--shaper=ot"]
+               if glyphs_expected != '*':
+                       extra_options.append("--verify")
+
+               if comment:
+                       print ('# %s "%s" --unicodes %s' % (hb_shape, fontfile, unicodes))
+                       continue
+
+               if "--font-funcs=ft" in options and not have_freetype:
+                       skips += 1
+                       continue
+
+               if "--font-funcs=ot" in options or not have_freetype:
+                       glyphs1 = shape_cmd ([fontfile, "--font-funcs=ot"] + extra_options + ["--unicodes", unicodes] + options)
+               else:
+                       glyphs1 = shape_cmd ([fontfile, "--font-funcs=ft"] + extra_options + ["--unicodes", unicodes] + options)
+                       glyphs2 = shape_cmd ([fontfile, "--font-funcs=ot"] + extra_options + ["--unicodes", unicodes] + options)
+
+                       if glyphs1 != glyphs2 and glyphs_expected != '*':
+                               print ("FT funcs: " + glyphs1, file=sys.stderr)
+                               print ("OT funcs: " + glyphs2, file=sys.stderr)
+                               fails += 1
+                       else:
+                               passes += 1
+
+               if glyphs1.strip() != glyphs_expected and glyphs_expected != '*':
+                       print ("Actual:   " + glyphs1, file=sys.stderr)
+                       print ("Expected: " + glyphs_expected, file=sys.stderr)
+                       fails += 1
+               else:
+                       passes += 1
+
+print ("%d tests passed; %d failed; %d skipped." % (passes, fails, skips), file=sys.stderr)
+if not (fails + passes):
+       print ("No tests ran.")
+elif not (fails + skips):
+       print ("All tests passed.")
+
+if fails:
+       sys.exit (1)
+elif passes:
+       sys.exit (0)
+else:
+       sys.exit (77)
diff --git a/test/shaping/Makefile.in b/test/shaping/Makefile.in
deleted file mode 100644 (file)
index 07e2bd5..0000000
+++ /dev/null
@@ -1,720 +0,0 @@
-# Makefile.in generated by automake 1.16.2 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994-2020 Free Software Foundation, Inc.
-
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-# Process this file with automake to produce Makefile.in
-VPATH = @srcdir@
-am__is_gnu_make = { \
-  if test -z '$(MAKELEVEL)'; then \
-    false; \
-  elif test -n '$(MAKE_HOST)'; then \
-    true; \
-  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
-    true; \
-  else \
-    false; \
-  fi; \
-}
-am__make_running_with_option = \
-  case $${target_option-} in \
-      ?) ;; \
-      *) echo "am__make_running_with_option: internal error: invalid" \
-              "target option '$${target_option-}' specified" >&2; \
-         exit 1;; \
-  esac; \
-  has_opt=no; \
-  sane_makeflags=$$MAKEFLAGS; \
-  if $(am__is_gnu_make); then \
-    sane_makeflags=$$MFLAGS; \
-  else \
-    case $$MAKEFLAGS in \
-      *\\[\ \  ]*) \
-        bs=\\; \
-        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
-          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
-    esac; \
-  fi; \
-  skip_next=no; \
-  strip_trailopt () \
-  { \
-    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
-  }; \
-  for flg in $$sane_makeflags; do \
-    test $$skip_next = yes && { skip_next=no; continue; }; \
-    case $$flg in \
-      *=*|--*) continue;; \
-        -*I) strip_trailopt 'I'; skip_next=yes;; \
-      -*I?*) strip_trailopt 'I';; \
-        -*O) strip_trailopt 'O'; skip_next=yes;; \
-      -*O?*) strip_trailopt 'O';; \
-        -*l) strip_trailopt 'l'; skip_next=yes;; \
-      -*l?*) strip_trailopt 'l';; \
-      -[dEDm]) skip_next=yes;; \
-      -[JT]) skip_next=yes;; \
-    esac; \
-    case $$flg in \
-      *$$target_option*) has_opt=yes; break;; \
-    esac; \
-  done; \
-  test $$has_opt = yes
-am__make_dryrun = (target_option=n; $(am__make_running_with_option))
-am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = test/shaping
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_link_flag.m4 \
-       $(top_srcdir)/m4/ax_code_coverage.m4 \
-       $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \
-       $(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/gtk-doc.m4 \
-       $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
-       $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
-       $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-       $(ACLOCAL_M4)
-DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-AM_V_P = $(am__v_P_@AM_V@)
-am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
-am__v_P_0 = false
-am__v_P_1 = :
-AM_V_GEN = $(am__v_GEN_@AM_V@)
-am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
-am__v_GEN_0 = @echo "  GEN     " $@;
-am__v_GEN_1 = 
-AM_V_at = $(am__v_at_@AM_V@)
-am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
-am__v_at_0 = @
-am__v_at_1 = 
-SOURCES =
-DIST_SOURCES =
-RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
-       ctags-recursive dvi-recursive html-recursive info-recursive \
-       install-data-recursive install-dvi-recursive \
-       install-exec-recursive install-html-recursive \
-       install-info-recursive install-pdf-recursive \
-       install-ps-recursive install-recursive installcheck-recursive \
-       installdirs-recursive pdf-recursive ps-recursive \
-       tags-recursive uninstall-recursive
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive        \
-  distclean-recursive maintainer-clean-recursive
-am__recursive_targets = \
-  $(RECURSIVE_TARGETS) \
-  $(RECURSIVE_CLEAN_TARGETS) \
-  $(am__extra_recursive_targets)
-AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
-       distdir distdir-am
-am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
-# Read a list of newline-separated strings from the standard input,
-# and print each of them once, without duplicates.  Input order is
-# *not* preserved.
-am__uniquify_input = $(AWK) '\
-  BEGIN { nonempty = 0; } \
-  { items[$$0] = 1; nonempty = 1; } \
-  END { if (nonempty) { for (i in items) print i; }; } \
-'
-# Make sure the list of sources is unique.  This is necessary because,
-# e.g., the same source file might be shared among _SOURCES variables
-# for different programs/libraries.
-am__define_uniq_tagged_files = \
-  list='$(am__tagged_files)'; \
-  unique=`for i in $$list; do \
-    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-  done | $(am__uniquify_input)`
-ETAGS = etags
-CTAGS = ctags
-DIST_SUBDIRS = $(SUBDIRS)
-am__DIST_COMMON = $(srcdir)/Makefile.in
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-am__relativize = \
-  dir0=`pwd`; \
-  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
-  sed_rest='s,^[^/]*/*,,'; \
-  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
-  sed_butlast='s,/*[^/]*$$,,'; \
-  while test -n "$$dir1"; do \
-    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
-    if test "$$first" != "."; then \
-      if test "$$first" = ".."; then \
-        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
-        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
-      else \
-        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
-        if test "$$first2" = "$$first"; then \
-          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
-        else \
-          dir2="../$$dir2"; \
-        fi; \
-        dir0="$$dir0"/"$$first"; \
-      fi; \
-    fi; \
-    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
-  done; \
-  reldir="$$dir2"
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CAIRO_CFLAGS = @CAIRO_CFLAGS@
-CAIRO_FT_CFLAGS = @CAIRO_FT_CFLAGS@
-CAIRO_FT_LIBS = @CAIRO_FT_LIBS@
-CAIRO_LIBS = @CAIRO_LIBS@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
-CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
-CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
-CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
-CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
-CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
-CORETEXT_CFLAGS = @CORETEXT_CFLAGS@
-CORETEXT_LIBS = @CORETEXT_LIBS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DIRECTWRITE_CXXFLAGS = @DIRECTWRITE_CXXFLAGS@
-DIRECTWRITE_LIBS = @DIRECTWRITE_LIBS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-FGREP = @FGREP@
-FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@
-FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
-FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
-FREETYPE_DEPS = @FREETYPE_DEPS@
-FREETYPE_LIBS = @FREETYPE_LIBS@
-GCOV = @GCOV@
-GDI_CFLAGS = @GDI_CFLAGS@
-GDI_LIBS = @GDI_LIBS@
-GENHTML = @GENHTML@
-GIT = @GIT@
-GLIB_CFLAGS = @GLIB_CFLAGS@
-GLIB_DEPS = @GLIB_DEPS@
-GLIB_LIBS = @GLIB_LIBS@
-GLIB_MKENUMS = @GLIB_MKENUMS@
-GOBJECT_CFLAGS = @GOBJECT_CFLAGS@
-GOBJECT_LIBS = @GOBJECT_LIBS@
-GRAPHITE2_CFLAGS = @GRAPHITE2_CFLAGS@
-GRAPHITE2_DEPS = @GRAPHITE2_DEPS@
-GRAPHITE2_LIBS = @GRAPHITE2_LIBS@
-GREP = @GREP@
-GTKDOC_CHECK = @GTKDOC_CHECK@
-GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@
-GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
-GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
-GTKDOC_MKPDF = @GTKDOC_MKPDF@
-GTKDOC_REBASE = @GTKDOC_REBASE@
-HAVE_CXX11 = @HAVE_CXX11@
-HB_LIBTOOL_VERSION_INFO = @HB_LIBTOOL_VERSION_INFO@
-HB_VERSION = @HB_VERSION@
-HB_VERSION_MAJOR = @HB_VERSION_MAJOR@
-HB_VERSION_MICRO = @HB_VERSION_MICRO@
-HB_VERSION_MINOR = @HB_VERSION_MINOR@
-HTML_DIR = @HTML_DIR@
-ICU_CFLAGS = @ICU_CFLAGS@
-ICU_CONFIG = @ICU_CONFIG@
-ICU_LIBS = @ICU_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
-INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
-INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
-INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
-INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
-INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
-INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
-INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
-LCOV = @LCOV@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MKDIR_P = @MKDIR_P@
-NM = @NM@
-NMEDIT = @NMEDIT@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PKG_CONFIG = @PKG_CONFIG@
-PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
-PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
-PTHREAD_CC = @PTHREAD_CC@
-PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
-PTHREAD_LIBS = @PTHREAD_LIBS@
-RAGEL = @RAGEL@
-RANLIB = @RANLIB@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-UNISCRIBE_CFLAGS = @UNISCRIBE_CFLAGS@
-UNISCRIBE_LIBS = @UNISCRIBE_LIBS@
-VERSION = @VERSION@
-_GI_EXP_DATADIR = @_GI_EXP_DATADIR@
-_GI_EXP_LIBDIR = @_GI_EXP_LIBDIR@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-ax_pthread_config = @ax_pthread_config@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-have_gobject = @have_gobject@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-NULL = 
-
-# TODO Figure out Python stuff
-EXTRA_DIST = README.md meson.build hb-diff hb-diff-colorize \
-       hb-diff-filter-failures hb-diff-stat hb-unicode-decode \
-       hb-unicode-encode hb-unicode-prettyname record-test.sh \
-       run-tests.py texts/in-house $(NULL) hb_test_tools.py $(NULL)
-CLEANFILES = hb_test_tools.py[co] $(NULL)
-DISTCLEANFILES = 
-MAINTAINERCLEANFILES = 
-SUBDIRS = data
-all: all-recursive
-
-.SUFFIXES:
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-       @for dep in $?; do \
-         case '$(am__configure_deps)' in \
-           *$$dep*) \
-             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-               && { if test -f $@; then exit 0; else break; fi; }; \
-             exit 1;; \
-         esac; \
-       done; \
-       echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits test/shaping/Makefile'; \
-       $(am__cd) $(top_srcdir) && \
-         $(AUTOMAKE) --gnits test/shaping/Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-       @case '$?' in \
-         *config.status*) \
-           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-         *) \
-           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
-           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
-       esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
-       -rm -f *.lo
-
-clean-libtool:
-       -rm -rf .libs _libs
-
-# This directory's subdirectories are mostly independent; you can cd
-# into them and run 'make' without going through this Makefile.
-# To change the values of 'make' variables: instead of editing Makefiles,
-# (1) if the variable is set in 'config.status', edit 'config.status'
-#     (which will cause the Makefiles to be regenerated when you run 'make');
-# (2) otherwise, pass the desired values on the 'make' command line.
-$(am__recursive_targets):
-       @fail=; \
-       if $(am__make_keepgoing); then \
-         failcom='fail=yes'; \
-       else \
-         failcom='exit 1'; \
-       fi; \
-       dot_seen=no; \
-       target=`echo $@ | sed s/-recursive//`; \
-       case "$@" in \
-         distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
-         *) list='$(SUBDIRS)' ;; \
-       esac; \
-       for subdir in $$list; do \
-         echo "Making $$target in $$subdir"; \
-         if test "$$subdir" = "."; then \
-           dot_seen=yes; \
-           local_target="$$target-am"; \
-         else \
-           local_target="$$target"; \
-         fi; \
-         ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-         || eval $$failcom; \
-       done; \
-       if test "$$dot_seen" = "no"; then \
-         $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
-       fi; test -z "$$fail"
-
-ID: $(am__tagged_files)
-       $(am__define_uniq_tagged_files); mkid -fID $$unique
-tags: tags-recursive
-TAGS: tags
-
-tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
-       set x; \
-       here=`pwd`; \
-       if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
-         include_option=--etags-include; \
-         empty_fix=.; \
-       else \
-         include_option=--include; \
-         empty_fix=; \
-       fi; \
-       list='$(SUBDIRS)'; for subdir in $$list; do \
-         if test "$$subdir" = .; then :; else \
-           test ! -f $$subdir/TAGS || \
-             set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
-         fi; \
-       done; \
-       $(am__define_uniq_tagged_files); \
-       shift; \
-       if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-         test -n "$$unique" || unique=$$empty_fix; \
-         if test $$# -gt 0; then \
-           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-             "$$@" $$unique; \
-         else \
-           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-             $$unique; \
-         fi; \
-       fi
-ctags: ctags-recursive
-
-CTAGS: ctags
-ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
-       $(am__define_uniq_tagged_files); \
-       test -z "$(CTAGS_ARGS)$$unique" \
-         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-            $$unique
-
-GTAGS:
-       here=`$(am__cd) $(top_builddir) && pwd` \
-         && $(am__cd) $(top_srcdir) \
-         && gtags -i $(GTAGS_ARGS) "$$here"
-cscopelist: cscopelist-recursive
-
-cscopelist-am: $(am__tagged_files)
-       list='$(am__tagged_files)'; \
-       case "$(srcdir)" in \
-         [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
-         *) sdir=$(subdir)/$(srcdir) ;; \
-       esac; \
-       for i in $$list; do \
-         if test -f "$$i"; then \
-           echo "$(subdir)/$$i"; \
-         else \
-           echo "$$sdir/$$i"; \
-         fi; \
-       done >> $(top_builddir)/cscope.files
-
-distclean-tags:
-       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(BUILT_SOURCES)
-       $(MAKE) $(AM_MAKEFLAGS) distdir-am
-
-distdir-am: $(DISTFILES)
-       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-       list='$(DISTFILES)'; \
-         dist_files=`for file in $$list; do echo $$file; done | \
-         sed -e "s|^$$srcdirstrip/||;t" \
-             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-       case $$dist_files in \
-         */*) $(MKDIR_P) `echo "$$dist_files" | \
-                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-                          sort -u` ;; \
-       esac; \
-       for file in $$dist_files; do \
-         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-         if test -d $$d/$$file; then \
-           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-           if test -d "$(distdir)/$$file"; then \
-             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-           fi; \
-           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-           fi; \
-           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-         else \
-           test -f "$(distdir)/$$file" \
-           || cp -p $$d/$$file "$(distdir)/$$file" \
-           || exit 1; \
-         fi; \
-       done
-       @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
-         if test "$$subdir" = .; then :; else \
-           $(am__make_dryrun) \
-             || test -d "$(distdir)/$$subdir" \
-             || $(MKDIR_P) "$(distdir)/$$subdir" \
-             || exit 1; \
-           dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
-           $(am__relativize); \
-           new_distdir=$$reldir; \
-           dir1=$$subdir; dir2="$(top_distdir)"; \
-           $(am__relativize); \
-           new_top_distdir=$$reldir; \
-           echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
-           echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
-           ($(am__cd) $$subdir && \
-             $(MAKE) $(AM_MAKEFLAGS) \
-               top_distdir="$$new_top_distdir" \
-               distdir="$$new_distdir" \
-               am__remove_distdir=: \
-               am__skip_length_check=: \
-               am__skip_mode_fix=: \
-               distdir) \
-             || exit 1; \
-         fi; \
-       done
-check-am: all-am
-check: check-recursive
-all-am: Makefile
-installdirs: installdirs-recursive
-installdirs-am:
-install: install-recursive
-install-exec: install-exec-recursive
-install-data: install-data-recursive
-uninstall: uninstall-recursive
-
-install-am: all-am
-       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-recursive
-install-strip:
-       if test -z '$(STRIP)'; then \
-         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-             install; \
-       else \
-         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-       fi
-mostlyclean-generic:
-
-clean-generic:
-       -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
-
-distclean-generic:
-       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-       -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
-
-maintainer-clean-generic:
-       @echo "This command is intended for maintainers to use"
-       @echo "it deletes files that may require special tools to rebuild."
-       -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
-clean: clean-recursive
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-recursive
-       -rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-tags
-
-dvi: dvi-recursive
-
-dvi-am:
-
-html: html-recursive
-
-html-am:
-
-info: info-recursive
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-recursive
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-recursive
-
-install-html-am:
-
-install-info: install-info-recursive
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-recursive
-
-install-pdf-am:
-
-install-ps: install-ps-recursive
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-recursive
-       -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-recursive
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-recursive
-
-pdf-am:
-
-ps: ps-recursive
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: $(am__recursive_targets) install-am install-strip
-
-.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
-       check-am clean clean-generic clean-libtool cscopelist-am ctags \
-       ctags-am distclean distclean-generic distclean-libtool \
-       distclean-tags distdir dvi dvi-am html html-am info info-am \
-       install install-am install-data install-data-am install-dvi \
-       install-dvi-am install-exec install-exec-am install-html \
-       install-html-am install-info install-info-am install-man \
-       install-pdf install-pdf-am install-ps install-ps-am \
-       install-strip installcheck installcheck-am installdirs \
-       installdirs-am maintainer-clean maintainer-clean-generic \
-       mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
-       ps ps-am tags tags-am uninstall uninstall-am
-
-.PRECIOUS: Makefile
-
-
-# Convenience targets:
-lib:
-       @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
-libs:
-       @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libs
-
--include $(top_srcdir)/git.mk
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/test/shaping/data/Makefile.in b/test/shaping/data/Makefile.in
deleted file mode 100644 (file)
index baad3cc..0000000
+++ /dev/null
@@ -1,711 +0,0 @@
-# Makefile.in generated by automake 1.16.2 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994-2020 Free Software Foundation, Inc.
-
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-# Process this file with automake to produce Makefile.in
-VPATH = @srcdir@
-am__is_gnu_make = { \
-  if test -z '$(MAKELEVEL)'; then \
-    false; \
-  elif test -n '$(MAKE_HOST)'; then \
-    true; \
-  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
-    true; \
-  else \
-    false; \
-  fi; \
-}
-am__make_running_with_option = \
-  case $${target_option-} in \
-      ?) ;; \
-      *) echo "am__make_running_with_option: internal error: invalid" \
-              "target option '$${target_option-}' specified" >&2; \
-         exit 1;; \
-  esac; \
-  has_opt=no; \
-  sane_makeflags=$$MAKEFLAGS; \
-  if $(am__is_gnu_make); then \
-    sane_makeflags=$$MFLAGS; \
-  else \
-    case $$MAKEFLAGS in \
-      *\\[\ \  ]*) \
-        bs=\\; \
-        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
-          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
-    esac; \
-  fi; \
-  skip_next=no; \
-  strip_trailopt () \
-  { \
-    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
-  }; \
-  for flg in $$sane_makeflags; do \
-    test $$skip_next = yes && { skip_next=no; continue; }; \
-    case $$flg in \
-      *=*|--*) continue;; \
-        -*I) strip_trailopt 'I'; skip_next=yes;; \
-      -*I?*) strip_trailopt 'I';; \
-        -*O) strip_trailopt 'O'; skip_next=yes;; \
-      -*O?*) strip_trailopt 'O';; \
-        -*l) strip_trailopt 'l'; skip_next=yes;; \
-      -*l?*) strip_trailopt 'l';; \
-      -[dEDm]) skip_next=yes;; \
-      -[JT]) skip_next=yes;; \
-    esac; \
-    case $$flg in \
-      *$$target_option*) has_opt=yes; break;; \
-    esac; \
-  done; \
-  test $$has_opt = yes
-am__make_dryrun = (target_option=n; $(am__make_running_with_option))
-am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = test/shaping/data
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_link_flag.m4 \
-       $(top_srcdir)/m4/ax_code_coverage.m4 \
-       $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \
-       $(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/gtk-doc.m4 \
-       $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
-       $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
-       $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-       $(ACLOCAL_M4)
-DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-AM_V_P = $(am__v_P_@AM_V@)
-am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
-am__v_P_0 = false
-am__v_P_1 = :
-AM_V_GEN = $(am__v_GEN_@AM_V@)
-am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
-am__v_GEN_0 = @echo "  GEN     " $@;
-am__v_GEN_1 = 
-AM_V_at = $(am__v_at_@AM_V@)
-am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
-am__v_at_0 = @
-am__v_at_1 = 
-SOURCES =
-DIST_SOURCES =
-RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
-       ctags-recursive dvi-recursive html-recursive info-recursive \
-       install-data-recursive install-dvi-recursive \
-       install-exec-recursive install-html-recursive \
-       install-info-recursive install-pdf-recursive \
-       install-ps-recursive install-recursive installcheck-recursive \
-       installdirs-recursive pdf-recursive ps-recursive \
-       tags-recursive uninstall-recursive
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive        \
-  distclean-recursive maintainer-clean-recursive
-am__recursive_targets = \
-  $(RECURSIVE_TARGETS) \
-  $(RECURSIVE_CLEAN_TARGETS) \
-  $(am__extra_recursive_targets)
-AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
-       distdir distdir-am
-am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
-# Read a list of newline-separated strings from the standard input,
-# and print each of them once, without duplicates.  Input order is
-# *not* preserved.
-am__uniquify_input = $(AWK) '\
-  BEGIN { nonempty = 0; } \
-  { items[$$0] = 1; nonempty = 1; } \
-  END { if (nonempty) { for (i in items) print i; }; } \
-'
-# Make sure the list of sources is unique.  This is necessary because,
-# e.g., the same source file might be shared among _SOURCES variables
-# for different programs/libraries.
-am__define_uniq_tagged_files = \
-  list='$(am__tagged_files)'; \
-  unique=`for i in $$list; do \
-    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-  done | $(am__uniquify_input)`
-ETAGS = etags
-CTAGS = ctags
-DIST_SUBDIRS = $(SUBDIRS)
-am__DIST_COMMON = $(srcdir)/Makefile.in
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-am__relativize = \
-  dir0=`pwd`; \
-  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
-  sed_rest='s,^[^/]*/*,,'; \
-  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
-  sed_butlast='s,/*[^/]*$$,,'; \
-  while test -n "$$dir1"; do \
-    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
-    if test "$$first" != "."; then \
-      if test "$$first" = ".."; then \
-        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
-        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
-      else \
-        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
-        if test "$$first2" = "$$first"; then \
-          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
-        else \
-          dir2="../$$dir2"; \
-        fi; \
-        dir0="$$dir0"/"$$first"; \
-      fi; \
-    fi; \
-    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
-  done; \
-  reldir="$$dir2"
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CAIRO_CFLAGS = @CAIRO_CFLAGS@
-CAIRO_FT_CFLAGS = @CAIRO_FT_CFLAGS@
-CAIRO_FT_LIBS = @CAIRO_FT_LIBS@
-CAIRO_LIBS = @CAIRO_LIBS@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
-CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
-CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
-CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
-CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
-CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
-CORETEXT_CFLAGS = @CORETEXT_CFLAGS@
-CORETEXT_LIBS = @CORETEXT_LIBS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DIRECTWRITE_CXXFLAGS = @DIRECTWRITE_CXXFLAGS@
-DIRECTWRITE_LIBS = @DIRECTWRITE_LIBS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-FGREP = @FGREP@
-FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@
-FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
-FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
-FREETYPE_DEPS = @FREETYPE_DEPS@
-FREETYPE_LIBS = @FREETYPE_LIBS@
-GCOV = @GCOV@
-GDI_CFLAGS = @GDI_CFLAGS@
-GDI_LIBS = @GDI_LIBS@
-GENHTML = @GENHTML@
-GIT = @GIT@
-GLIB_CFLAGS = @GLIB_CFLAGS@
-GLIB_DEPS = @GLIB_DEPS@
-GLIB_LIBS = @GLIB_LIBS@
-GLIB_MKENUMS = @GLIB_MKENUMS@
-GOBJECT_CFLAGS = @GOBJECT_CFLAGS@
-GOBJECT_LIBS = @GOBJECT_LIBS@
-GRAPHITE2_CFLAGS = @GRAPHITE2_CFLAGS@
-GRAPHITE2_DEPS = @GRAPHITE2_DEPS@
-GRAPHITE2_LIBS = @GRAPHITE2_LIBS@
-GREP = @GREP@
-GTKDOC_CHECK = @GTKDOC_CHECK@
-GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@
-GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
-GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
-GTKDOC_MKPDF = @GTKDOC_MKPDF@
-GTKDOC_REBASE = @GTKDOC_REBASE@
-HAVE_CXX11 = @HAVE_CXX11@
-HB_LIBTOOL_VERSION_INFO = @HB_LIBTOOL_VERSION_INFO@
-HB_VERSION = @HB_VERSION@
-HB_VERSION_MAJOR = @HB_VERSION_MAJOR@
-HB_VERSION_MICRO = @HB_VERSION_MICRO@
-HB_VERSION_MINOR = @HB_VERSION_MINOR@
-HTML_DIR = @HTML_DIR@
-ICU_CFLAGS = @ICU_CFLAGS@
-ICU_CONFIG = @ICU_CONFIG@
-ICU_LIBS = @ICU_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
-INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
-INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
-INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
-INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
-INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
-INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
-INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
-LCOV = @LCOV@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MKDIR_P = @MKDIR_P@
-NM = @NM@
-NMEDIT = @NMEDIT@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PKG_CONFIG = @PKG_CONFIG@
-PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
-PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
-PTHREAD_CC = @PTHREAD_CC@
-PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
-PTHREAD_LIBS = @PTHREAD_LIBS@
-RAGEL = @RAGEL@
-RANLIB = @RANLIB@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-UNISCRIBE_CFLAGS = @UNISCRIBE_CFLAGS@
-UNISCRIBE_LIBS = @UNISCRIBE_LIBS@
-VERSION = @VERSION@
-_GI_EXP_DATADIR = @_GI_EXP_DATADIR@
-_GI_EXP_LIBDIR = @_GI_EXP_LIBDIR@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-ax_pthread_config = @ax_pthread_config@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-have_gobject = @have_gobject@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-NULL = 
-SUBDIRS = \
-       in-house \
-       text-rendering-tests \
-       aots \
-       $(NULL)
-
-all: all-recursive
-
-.SUFFIXES:
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-       @for dep in $?; do \
-         case '$(am__configure_deps)' in \
-           *$$dep*) \
-             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-               && { if test -f $@; then exit 0; else break; fi; }; \
-             exit 1;; \
-         esac; \
-       done; \
-       echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits test/shaping/data/Makefile'; \
-       $(am__cd) $(top_srcdir) && \
-         $(AUTOMAKE) --gnits test/shaping/data/Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-       @case '$?' in \
-         *config.status*) \
-           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-         *) \
-           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
-           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
-       esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
-       -rm -f *.lo
-
-clean-libtool:
-       -rm -rf .libs _libs
-
-# This directory's subdirectories are mostly independent; you can cd
-# into them and run 'make' without going through this Makefile.
-# To change the values of 'make' variables: instead of editing Makefiles,
-# (1) if the variable is set in 'config.status', edit 'config.status'
-#     (which will cause the Makefiles to be regenerated when you run 'make');
-# (2) otherwise, pass the desired values on the 'make' command line.
-$(am__recursive_targets):
-       @fail=; \
-       if $(am__make_keepgoing); then \
-         failcom='fail=yes'; \
-       else \
-         failcom='exit 1'; \
-       fi; \
-       dot_seen=no; \
-       target=`echo $@ | sed s/-recursive//`; \
-       case "$@" in \
-         distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
-         *) list='$(SUBDIRS)' ;; \
-       esac; \
-       for subdir in $$list; do \
-         echo "Making $$target in $$subdir"; \
-         if test "$$subdir" = "."; then \
-           dot_seen=yes; \
-           local_target="$$target-am"; \
-         else \
-           local_target="$$target"; \
-         fi; \
-         ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-         || eval $$failcom; \
-       done; \
-       if test "$$dot_seen" = "no"; then \
-         $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
-       fi; test -z "$$fail"
-
-ID: $(am__tagged_files)
-       $(am__define_uniq_tagged_files); mkid -fID $$unique
-tags: tags-recursive
-TAGS: tags
-
-tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
-       set x; \
-       here=`pwd`; \
-       if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
-         include_option=--etags-include; \
-         empty_fix=.; \
-       else \
-         include_option=--include; \
-         empty_fix=; \
-       fi; \
-       list='$(SUBDIRS)'; for subdir in $$list; do \
-         if test "$$subdir" = .; then :; else \
-           test ! -f $$subdir/TAGS || \
-             set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
-         fi; \
-       done; \
-       $(am__define_uniq_tagged_files); \
-       shift; \
-       if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-         test -n "$$unique" || unique=$$empty_fix; \
-         if test $$# -gt 0; then \
-           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-             "$$@" $$unique; \
-         else \
-           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-             $$unique; \
-         fi; \
-       fi
-ctags: ctags-recursive
-
-CTAGS: ctags
-ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
-       $(am__define_uniq_tagged_files); \
-       test -z "$(CTAGS_ARGS)$$unique" \
-         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-            $$unique
-
-GTAGS:
-       here=`$(am__cd) $(top_builddir) && pwd` \
-         && $(am__cd) $(top_srcdir) \
-         && gtags -i $(GTAGS_ARGS) "$$here"
-cscopelist: cscopelist-recursive
-
-cscopelist-am: $(am__tagged_files)
-       list='$(am__tagged_files)'; \
-       case "$(srcdir)" in \
-         [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
-         *) sdir=$(subdir)/$(srcdir) ;; \
-       esac; \
-       for i in $$list; do \
-         if test -f "$$i"; then \
-           echo "$(subdir)/$$i"; \
-         else \
-           echo "$$sdir/$$i"; \
-         fi; \
-       done >> $(top_builddir)/cscope.files
-
-distclean-tags:
-       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(BUILT_SOURCES)
-       $(MAKE) $(AM_MAKEFLAGS) distdir-am
-
-distdir-am: $(DISTFILES)
-       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-       list='$(DISTFILES)'; \
-         dist_files=`for file in $$list; do echo $$file; done | \
-         sed -e "s|^$$srcdirstrip/||;t" \
-             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-       case $$dist_files in \
-         */*) $(MKDIR_P) `echo "$$dist_files" | \
-                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-                          sort -u` ;; \
-       esac; \
-       for file in $$dist_files; do \
-         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-         if test -d $$d/$$file; then \
-           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-           if test -d "$(distdir)/$$file"; then \
-             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-           fi; \
-           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-           fi; \
-           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-         else \
-           test -f "$(distdir)/$$file" \
-           || cp -p $$d/$$file "$(distdir)/$$file" \
-           || exit 1; \
-         fi; \
-       done
-       @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
-         if test "$$subdir" = .; then :; else \
-           $(am__make_dryrun) \
-             || test -d "$(distdir)/$$subdir" \
-             || $(MKDIR_P) "$(distdir)/$$subdir" \
-             || exit 1; \
-           dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
-           $(am__relativize); \
-           new_distdir=$$reldir; \
-           dir1=$$subdir; dir2="$(top_distdir)"; \
-           $(am__relativize); \
-           new_top_distdir=$$reldir; \
-           echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
-           echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
-           ($(am__cd) $$subdir && \
-             $(MAKE) $(AM_MAKEFLAGS) \
-               top_distdir="$$new_top_distdir" \
-               distdir="$$new_distdir" \
-               am__remove_distdir=: \
-               am__skip_length_check=: \
-               am__skip_mode_fix=: \
-               distdir) \
-             || exit 1; \
-         fi; \
-       done
-check-am: all-am
-check: check-recursive
-all-am: Makefile
-installdirs: installdirs-recursive
-installdirs-am:
-install: install-recursive
-install-exec: install-exec-recursive
-install-data: install-data-recursive
-uninstall: uninstall-recursive
-
-install-am: all-am
-       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-recursive
-install-strip:
-       if test -z '$(STRIP)'; then \
-         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-             install; \
-       else \
-         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-       fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-       @echo "This command is intended for maintainers to use"
-       @echo "it deletes files that may require special tools to rebuild."
-clean: clean-recursive
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-recursive
-       -rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-tags
-
-dvi: dvi-recursive
-
-dvi-am:
-
-html: html-recursive
-
-html-am:
-
-info: info-recursive
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-recursive
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-recursive
-
-install-html-am:
-
-install-info: install-info-recursive
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-recursive
-
-install-pdf-am:
-
-install-ps: install-ps-recursive
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-recursive
-       -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-recursive
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-recursive
-
-pdf-am:
-
-ps: ps-recursive
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: $(am__recursive_targets) install-am install-strip
-
-.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
-       check-am clean clean-generic clean-libtool cscopelist-am ctags \
-       ctags-am distclean distclean-generic distclean-libtool \
-       distclean-tags distdir dvi dvi-am html html-am info info-am \
-       install install-am install-data install-data-am install-dvi \
-       install-dvi-am install-exec install-exec-am install-html \
-       install-html-am install-info install-info-am install-man \
-       install-pdf install-pdf-am install-ps install-ps-am \
-       install-strip installcheck installcheck-am installdirs \
-       installdirs-am maintainer-clean maintainer-clean-generic \
-       mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
-       ps ps-am tags tags-am uninstall uninstall-am
-
-.PRECIOUS: Makefile
-
-
-# Convenience targets:
-lib:
-       @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
-
--include $(top_srcdir)/git.mk
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/test/shaping/data/aots/Makefile.am b/test/shaping/data/aots/Makefile.am
deleted file mode 100644 (file)
index a2a009b..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-# Process this file with automake to produce Makefile.in
-
-NULL =
-
-# Convenience targets:
-lib:
-       @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
-
-EXTRA_DIST = \
-       COPYING \
-       fonts \
-       update.py \
-       $(TESTS) \
-       $(NULL)
-
-TEST_EXTENSIONS = .tests
-TESTS_LOG_COMPILER = $(srcdir)/../../run-tests.py $(top_builddir)/util/hb-shape$(EXEEXT)
-
-include Makefile.sources
-
--include $(top_srcdir)/git.mk
diff --git a/test/shaping/data/aots/Makefile.in b/test/shaping/data/aots/Makefile.in
deleted file mode 100644 (file)
index 3acea22..0000000
+++ /dev/null
@@ -1,1004 +0,0 @@
-# Makefile.in generated by automake 1.16.2 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994-2020 Free Software Foundation, Inc.
-
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-# Process this file with automake to produce Makefile.in
-VPATH = @srcdir@
-am__is_gnu_make = { \
-  if test -z '$(MAKELEVEL)'; then \
-    false; \
-  elif test -n '$(MAKE_HOST)'; then \
-    true; \
-  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
-    true; \
-  else \
-    false; \
-  fi; \
-}
-am__make_running_with_option = \
-  case $${target_option-} in \
-      ?) ;; \
-      *) echo "am__make_running_with_option: internal error: invalid" \
-              "target option '$${target_option-}' specified" >&2; \
-         exit 1;; \
-  esac; \
-  has_opt=no; \
-  sane_makeflags=$$MAKEFLAGS; \
-  if $(am__is_gnu_make); then \
-    sane_makeflags=$$MFLAGS; \
-  else \
-    case $$MAKEFLAGS in \
-      *\\[\ \  ]*) \
-        bs=\\; \
-        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
-          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
-    esac; \
-  fi; \
-  skip_next=no; \
-  strip_trailopt () \
-  { \
-    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
-  }; \
-  for flg in $$sane_makeflags; do \
-    test $$skip_next = yes && { skip_next=no; continue; }; \
-    case $$flg in \
-      *=*|--*) continue;; \
-        -*I) strip_trailopt 'I'; skip_next=yes;; \
-      -*I?*) strip_trailopt 'I';; \
-        -*O) strip_trailopt 'O'; skip_next=yes;; \
-      -*O?*) strip_trailopt 'O';; \
-        -*l) strip_trailopt 'l'; skip_next=yes;; \
-      -*l?*) strip_trailopt 'l';; \
-      -[dEDm]) skip_next=yes;; \
-      -[JT]) skip_next=yes;; \
-    esac; \
-    case $$flg in \
-      *$$target_option*) has_opt=yes; break;; \
-    esac; \
-  done; \
-  test $$has_opt = yes
-am__make_dryrun = (target_option=n; $(am__make_running_with_option))
-am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-TESTS = tests/classdef1_empty.tests tests/classdef1_multiple.tests \
-       tests/classdef1_single.tests tests/classdef1.tests \
-       tests/classdef2_empty.tests tests/classdef2_multiple.tests \
-       tests/classdef2_single.tests tests/classdef2.tests \
-       tests/gpos_chaining1_boundary.tests \
-       tests/gpos_chaining1_lookupflag.tests \
-       tests/gpos_chaining1_multiple_subrules.tests \
-       tests/gpos_chaining1_next_glyph.tests \
-       tests/gpos_chaining1_simple.tests \
-       tests/gpos_chaining1_successive.tests \
-       tests/gpos_chaining2_boundary.tests \
-       tests/gpos_chaining2_lookupflag.tests \
-       tests/gpos_chaining2_multiple_subrules.tests \
-       tests/gpos_chaining2_next_glyph.tests \
-       tests/gpos_chaining2_simple.tests \
-       tests/gpos_chaining2_successive.tests \
-       tests/gpos_chaining3_boundary.tests \
-       tests/gpos_chaining3_lookupflag.tests \
-       tests/gpos_chaining3_next_glyph.tests \
-       tests/gpos_chaining3_simple.tests \
-       tests/gpos_chaining3_successive.tests \
-       tests/gpos_context1_boundary.tests \
-       tests/gpos_context1_expansion.tests \
-       tests/gpos_context1_lookupflag.tests \
-       tests/gpos_context1_multiple_subrules.tests \
-       tests/gpos_context1_next_glyph.tests \
-       tests/gpos_context1_simple.tests \
-       tests/gpos_context1_successive.tests \
-       tests/gpos_context2_boundary.tests \
-       tests/gpos_context2_classes.tests \
-       tests/gpos_context2_expansion.tests \
-       tests/gpos_context2_lookupflag.tests \
-       tests/gpos_context2_multiple_subrules.tests \
-       tests/gpos_context2_next_glyph.tests \
-       tests/gpos_context2_simple.tests \
-       tests/gpos_context2_successive.tests \
-       tests/gpos_context3_boundary.tests \
-       tests/gpos_context3_lookupflag.tests \
-       tests/gpos_context3_next_glyph.tests \
-       tests/gpos_context3_simple.tests \
-       tests/gpos_context3_successive.tests \
-       tests/gpos1_1_lookupflag.tests tests/gpos1_1_simple.tests \
-       tests/gpos1_2_lookupflag.tests tests/gpos1_2.tests \
-       tests/gpos2_1_lookupflag.tests tests/gpos2_1_next_glyph.tests \
-       tests/gpos2_1_simple.tests tests/gpos2_1.tests \
-       tests/gpos2_2.tests tests/gpos3_lookupflag.tests \
-       tests/gpos3.tests tests/gpos4_lookupflag.tests \
-       tests/gpos4_multiple_anchors.tests tests/gpos4_simple.tests \
-       tests/gpos5.tests tests/gpos6.tests tests/gpos7_1.tests \
-       tests/gpos9.tests tests/gsub_chaining1_boundary.tests \
-       tests/gsub_chaining1_lookupflag.tests \
-       tests/gsub_chaining1_multiple_subrules.tests \
-       tests/gsub_chaining1_next_glyph.tests \
-       tests/gsub_chaining1_simple.tests \
-       tests/gsub_chaining1_successive.tests \
-       tests/gsub_chaining2_boundary.tests \
-       tests/gsub_chaining2_lookupflag.tests \
-       tests/gsub_chaining2_multiple_subrules.tests \
-       tests/gsub_chaining2_next_glyph.tests \
-       tests/gsub_chaining2_simple.tests \
-       tests/gsub_chaining2_successive.tests \
-       tests/gsub_chaining3_boundary.tests \
-       tests/gsub_chaining3_lookupflag.tests \
-       tests/gsub_chaining3_next_glyph.tests \
-       tests/gsub_chaining3_simple.tests \
-       tests/gsub_chaining3_successive.tests \
-       tests/gsub_context1_boundary.tests \
-       tests/gsub_context1_expansion.tests \
-       tests/gsub_context1_lookupflag.tests \
-       tests/gsub_context1_multiple_subrules.tests \
-       tests/gsub_context1_next_glyph.tests \
-       tests/gsub_context1_simple.tests \
-       tests/gsub_context1_successive.tests \
-       tests/gsub_context2_boundary.tests \
-       tests/gsub_context2_classes.tests \
-       tests/gsub_context2_expansion.tests \
-       tests/gsub_context2_lookupflag.tests \
-       tests/gsub_context2_multiple_subrules.tests \
-       tests/gsub_context2_next_glyph.tests \
-       tests/gsub_context2_simple.tests \
-       tests/gsub_context2_successive.tests \
-       tests/gsub_context3_boundary.tests \
-       tests/gsub_context3_lookupflag.tests \
-       tests/gsub_context3_next_glyph.tests \
-       tests/gsub_context3_simple.tests \
-       tests/gsub_context3_successive.tests \
-       tests/gsub1_1_lookupflag.tests tests/gsub1_1_modulo.tests \
-       tests/gsub1_1_simple.tests tests/gsub1_2_lookupflag.tests \
-       tests/gsub1_2_simple.tests tests/gsub2_1_lookupflag.tests \
-       tests/gsub2_1_multiple_sequences.tests \
-       tests/gsub2_1_simple.tests tests/gsub3_1_lookupflag.tests \
-       tests/gsub3_1_multiple.tests tests/gsub3_1_simple.tests \
-       tests/gsub4_1_lookupflag.tests \
-       tests/gsub4_1_multiple_ligatures.tests \
-       tests/gsub4_1_multiple_ligsets.tests \
-       tests/gsub4_1_simple.tests tests/gsub7.tests \
-       tests/lookupflag_ignore_attach.tests \
-       tests/lookupflag_ignore_base.tests \
-       tests/lookupflag_ignore_combination.tests \
-       tests/lookupflag_ignore_ligatures.tests \
-       tests/lookupflag_ignore_marks.tests $(am__EXEEXT_1)
-subdir = test/shaping/data/aots
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_link_flag.m4 \
-       $(top_srcdir)/m4/ax_code_coverage.m4 \
-       $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \
-       $(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/gtk-doc.m4 \
-       $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
-       $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
-       $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-       $(ACLOCAL_M4)
-DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-AM_V_P = $(am__v_P_@AM_V@)
-am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
-am__v_P_0 = false
-am__v_P_1 = :
-AM_V_GEN = $(am__v_GEN_@AM_V@)
-am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
-am__v_GEN_0 = @echo "  GEN     " $@;
-am__v_GEN_1 = 
-AM_V_at = $(am__v_at_@AM_V@)
-am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
-am__v_at_0 = @
-am__v_at_1 = 
-SOURCES =
-DIST_SOURCES =
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
-am__tty_colors_dummy = \
-  mgn= red= grn= lgn= blu= brg= std=; \
-  am__color_tests=no
-am__tty_colors = { \
-  $(am__tty_colors_dummy); \
-  if test "X$(AM_COLOR_TESTS)" = Xno; then \
-    am__color_tests=no; \
-  elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
-    am__color_tests=yes; \
-  elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
-    am__color_tests=yes; \
-  fi; \
-  if test $$am__color_tests = yes; then \
-    red='\e[0;31m'; \
-    grn='\e[0;32m'; \
-    lgn='\e[1;32m'; \
-    blu='\e[1;34m'; \
-    mgn='\e[0;35m'; \
-    brg='\e[1m'; \
-    std='\e[m'; \
-  fi; \
-}
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
-  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
-  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
-  for p in $$list; do echo "$$p $$p"; done | \
-  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
-  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
-    if (++n[$$2] == $(am__install_max)) \
-      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
-    END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
-  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
-  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
-  test -z "$$files" \
-    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
-    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
-         $(am__cd) "$$dir" && rm -f $$files; }; \
-  }
-am__recheck_rx = ^[    ]*:recheck:[    ]*
-am__global_test_result_rx = ^[         ]*:global-test-result:[         ]*
-am__copy_in_global_log_rx = ^[         ]*:copy-in-global-log:[         ]*
-# A command that, given a newline-separated list of test names on the
-# standard input, print the name of the tests that are to be re-run
-# upon "make recheck".
-am__list_recheck_tests = $(AWK) '{ \
-  recheck = 1; \
-  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
-    { \
-      if (rc < 0) \
-        { \
-          if ((getline line2 < ($$0 ".log")) < 0) \
-           recheck = 0; \
-          break; \
-        } \
-      else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
-        { \
-          recheck = 0; \
-          break; \
-        } \
-      else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
-        { \
-          break; \
-        } \
-    }; \
-  if (recheck) \
-    print $$0; \
-  close ($$0 ".trs"); \
-  close ($$0 ".log"); \
-}'
-# A command that, given a newline-separated list of test names on the
-# standard input, create the global log from their .trs and .log files.
-am__create_global_log = $(AWK) ' \
-function fatal(msg) \
-{ \
-  print "fatal: making $@: " msg | "cat >&2"; \
-  exit 1; \
-} \
-function rst_section(header) \
-{ \
-  print header; \
-  len = length(header); \
-  for (i = 1; i <= len; i = i + 1) \
-    printf "="; \
-  printf "\n\n"; \
-} \
-{ \
-  copy_in_global_log = 1; \
-  global_test_result = "RUN"; \
-  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
-    { \
-      if (rc < 0) \
-         fatal("failed to read from " $$0 ".trs"); \
-      if (line ~ /$(am__global_test_result_rx)/) \
-        { \
-          sub("$(am__global_test_result_rx)", "", line); \
-          sub("[       ]*$$", "", line); \
-          global_test_result = line; \
-        } \
-      else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
-        copy_in_global_log = 0; \
-    }; \
-  if (copy_in_global_log) \
-    { \
-      rst_section(global_test_result ": " $$0); \
-      while ((rc = (getline line < ($$0 ".log"))) != 0) \
-      { \
-        if (rc < 0) \
-          fatal("failed to read from " $$0 ".log"); \
-        print line; \
-      }; \
-      printf "\n"; \
-    }; \
-  close ($$0 ".trs"); \
-  close ($$0 ".log"); \
-}'
-# Restructured Text title.
-am__rst_title = { sed 's/.*/   &   /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
-# Solaris 10 'make', and several other traditional 'make' implementations,
-# pass "-e" to $(SHELL), and POSIX 2008 even requires this.  Work around it
-# by disabling -e (using the XSI extension "set +e") if it's set.
-am__sh_e_setup = case $$- in *e*) set +e;; esac
-# Default flags passed to test drivers.
-am__common_driver_flags = \
-  --color-tests "$$am__color_tests" \
-  --enable-hard-errors "$$am__enable_hard_errors" \
-  --expect-failure "$$am__expect_failure"
-# To be inserted before the command running the test.  Creates the
-# directory for the log if needed.  Stores in $dir the directory
-# containing $f, in $tst the test, in $log the log.  Executes the
-# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
-# passes TESTS_ENVIRONMENT.  Set up options for the wrapper that
-# will run the test scripts (or their associated LOG_COMPILER, if
-# thy have one).
-am__check_pre = \
-$(am__sh_e_setup);                                     \
-$(am__vpath_adj_setup) $(am__vpath_adj)                        \
-$(am__tty_colors);                                     \
-srcdir=$(srcdir); export srcdir;                       \
-case "$@" in                                           \
-  */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;;   \
-    *) am__odir=.;;                                    \
-esac;                                                  \
-test "x$$am__odir" = x"." || test -d "$$am__odir"      \
-  || $(MKDIR_P) "$$am__odir" || exit $$?;              \
-if test -f "./$$f"; then dir=./;                       \
-elif test -f "$$f"; then dir=;                         \
-else dir="$(srcdir)/"; fi;                             \
-tst=$$dir$$f; log='$@';                                \
-if test -n '$(DISABLE_HARD_ERRORS)'; then              \
-  am__enable_hard_errors=no;                           \
-else                                                   \
-  am__enable_hard_errors=yes;                          \
-fi;                                                    \
-case " $(XFAIL_TESTS) " in                             \
-  *[\ \        ]$$f[\ \        ]* | *[\ \      ]$$dir$$f[\ \   ]*) \
-    am__expect_failure=yes;;                           \
-  *)                                                   \
-    am__expect_failure=no;;                            \
-esac;                                                  \
-$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
-# A shell command to get the names of the tests scripts with any registered
-# extension removed (i.e., equivalently, the names of the test logs, with
-# the '.log' extension removed).  The result is saved in the shell variable
-# '$bases'.  This honors runtime overriding of TESTS and TEST_LOGS.  Sadly,
-# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
-# since that might cause problem with VPATH rewrites for suffix-less tests.
-# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
-am__set_TESTS_bases = \
-  bases='$(TEST_LOGS)'; \
-  bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
-  bases=`echo $$bases`
-RECHECK_LOGS = $(TEST_LOGS)
-AM_RECURSIVE_TARGETS = check recheck
-am__EXEEXT_1 =
-TEST_SUITE_LOG = test-suite.log
-am__test_logs1 = $(TESTS:=.log)
-am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
-TEST_LOGS = $(am__test_logs2:.tests.log=.log)
-TESTS_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
-TESTS_LOG_COMPILE = $(TESTS_LOG_COMPILER) $(AM_TESTS_LOG_FLAGS) \
-       $(TESTS_LOG_FLAGS)
-am__set_b = \
-  case '$@' in \
-    */*) \
-      case '$*' in \
-        */*) b='$*';; \
-          *) b=`echo '$@' | sed 's/\.log$$//'`; \
-       esac;; \
-    *) \
-      b='$*';; \
-  esac
-am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.sources \
-       $(top_srcdir)/test-driver COPYING
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CAIRO_CFLAGS = @CAIRO_CFLAGS@
-CAIRO_FT_CFLAGS = @CAIRO_FT_CFLAGS@
-CAIRO_FT_LIBS = @CAIRO_FT_LIBS@
-CAIRO_LIBS = @CAIRO_LIBS@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
-CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
-CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
-CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
-CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
-CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
-CORETEXT_CFLAGS = @CORETEXT_CFLAGS@
-CORETEXT_LIBS = @CORETEXT_LIBS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DIRECTWRITE_CXXFLAGS = @DIRECTWRITE_CXXFLAGS@
-DIRECTWRITE_LIBS = @DIRECTWRITE_LIBS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-FGREP = @FGREP@
-FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@
-FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
-FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
-FREETYPE_DEPS = @FREETYPE_DEPS@
-FREETYPE_LIBS = @FREETYPE_LIBS@
-GCOV = @GCOV@
-GDI_CFLAGS = @GDI_CFLAGS@
-GDI_LIBS = @GDI_LIBS@
-GENHTML = @GENHTML@
-GIT = @GIT@
-GLIB_CFLAGS = @GLIB_CFLAGS@
-GLIB_DEPS = @GLIB_DEPS@
-GLIB_LIBS = @GLIB_LIBS@
-GLIB_MKENUMS = @GLIB_MKENUMS@
-GOBJECT_CFLAGS = @GOBJECT_CFLAGS@
-GOBJECT_LIBS = @GOBJECT_LIBS@
-GRAPHITE2_CFLAGS = @GRAPHITE2_CFLAGS@
-GRAPHITE2_DEPS = @GRAPHITE2_DEPS@
-GRAPHITE2_LIBS = @GRAPHITE2_LIBS@
-GREP = @GREP@
-GTKDOC_CHECK = @GTKDOC_CHECK@
-GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@
-GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
-GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
-GTKDOC_MKPDF = @GTKDOC_MKPDF@
-GTKDOC_REBASE = @GTKDOC_REBASE@
-HAVE_CXX11 = @HAVE_CXX11@
-HB_LIBTOOL_VERSION_INFO = @HB_LIBTOOL_VERSION_INFO@
-HB_VERSION = @HB_VERSION@
-HB_VERSION_MAJOR = @HB_VERSION_MAJOR@
-HB_VERSION_MICRO = @HB_VERSION_MICRO@
-HB_VERSION_MINOR = @HB_VERSION_MINOR@
-HTML_DIR = @HTML_DIR@
-ICU_CFLAGS = @ICU_CFLAGS@
-ICU_CONFIG = @ICU_CONFIG@
-ICU_LIBS = @ICU_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
-INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
-INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
-INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
-INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
-INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
-INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
-INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
-LCOV = @LCOV@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MKDIR_P = @MKDIR_P@
-NM = @NM@
-NMEDIT = @NMEDIT@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PKG_CONFIG = @PKG_CONFIG@
-PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
-PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
-PTHREAD_CC = @PTHREAD_CC@
-PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
-PTHREAD_LIBS = @PTHREAD_LIBS@
-RAGEL = @RAGEL@
-RANLIB = @RANLIB@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-UNISCRIBE_CFLAGS = @UNISCRIBE_CFLAGS@
-UNISCRIBE_LIBS = @UNISCRIBE_LIBS@
-VERSION = @VERSION@
-_GI_EXP_DATADIR = @_GI_EXP_DATADIR@
-_GI_EXP_LIBDIR = @_GI_EXP_LIBDIR@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-ax_pthread_config = @ax_pthread_config@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-have_gobject = @have_gobject@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-NULL = 
-EXTRA_DIST = \
-       COPYING \
-       fonts \
-       update.py \
-       $(TESTS) \
-       $(NULL)
-
-TEST_EXTENSIONS = .tests
-TESTS_LOG_COMPILER = $(srcdir)/../../run-tests.py $(top_builddir)/util/hb-shape$(EXEEXT)
-DISABLED_TESTS = \
-       $(NULL)
-
-all: all-am
-
-.SUFFIXES:
-.SUFFIXES: .log .tests .tests$(EXEEXT) .trs
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am $(srcdir)/Makefile.sources $(am__configure_deps)
-       @for dep in $?; do \
-         case '$(am__configure_deps)' in \
-           *$$dep*) \
-             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-               && { if test -f $@; then exit 0; else break; fi; }; \
-             exit 1;; \
-         esac; \
-       done; \
-       echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits test/shaping/data/aots/Makefile'; \
-       $(am__cd) $(top_srcdir) && \
-         $(AUTOMAKE) --gnits test/shaping/data/aots/Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-       @case '$?' in \
-         *config.status*) \
-           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-         *) \
-           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
-           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
-       esac;
-$(srcdir)/Makefile.sources $(am__empty):
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
-       -rm -f *.lo
-
-clean-libtool:
-       -rm -rf .libs _libs
-tags TAGS:
-
-ctags CTAGS:
-
-cscope cscopelist:
-
-
-# Recover from deleted '.trs' file; this should ensure that
-# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
-# both 'foo.log' and 'foo.trs'.  Break the recipe in two subshells
-# to avoid problems with "make -n".
-.log.trs:
-       rm -f $< $@
-       $(MAKE) $(AM_MAKEFLAGS) $<
-
-# Leading 'am--fnord' is there to ensure the list of targets does not
-# expand to empty, as could happen e.g. with make check TESTS=''.
-am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
-am--force-recheck:
-       @:
-
-$(TEST_SUITE_LOG): $(TEST_LOGS)
-       @$(am__set_TESTS_bases); \
-       am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
-       redo_bases=`for i in $$bases; do \
-                     am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
-                   done`; \
-       if test -n "$$redo_bases"; then \
-         redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
-         redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
-         if $(am__make_dryrun); then :; else \
-           rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
-         fi; \
-       fi; \
-       if test -n "$$am__remaking_logs"; then \
-         echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
-              "recursion detected" >&2; \
-       elif test -n "$$redo_logs"; then \
-         am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
-       fi; \
-       if $(am__make_dryrun); then :; else \
-         st=0;  \
-         errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
-         for i in $$redo_bases; do \
-           test -f $$i.trs && test -r $$i.trs \
-             || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
-           test -f $$i.log && test -r $$i.log \
-             || { echo "$$errmsg $$i.log" >&2; st=1; }; \
-         done; \
-         test $$st -eq 0 || exit 1; \
-       fi
-       @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
-       ws='[   ]'; \
-       results=`for b in $$bases; do echo $$b.trs; done`; \
-       test -n "$$results" || results=/dev/null; \
-       all=`  grep "^$$ws*:test-result:"           $$results | wc -l`; \
-       pass=` grep "^$$ws*:test-result:$$ws*PASS"  $$results | wc -l`; \
-       fail=` grep "^$$ws*:test-result:$$ws*FAIL"  $$results | wc -l`; \
-       skip=` grep "^$$ws*:test-result:$$ws*SKIP"  $$results | wc -l`; \
-       xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
-       xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
-       error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
-       if test `expr $$fail + $$xpass + $$error` -eq 0; then \
-         success=true; \
-       else \
-         success=false; \
-       fi; \
-       br='==================='; br=$$br$$br$$br$$br; \
-       result_count () \
-       { \
-           if test x"$$1" = x"--maybe-color"; then \
-             maybe_colorize=yes; \
-           elif test x"$$1" = x"--no-color"; then \
-             maybe_colorize=no; \
-           else \
-             echo "$@: invalid 'result_count' usage" >&2; exit 4; \
-           fi; \
-           shift; \
-           desc=$$1 count=$$2; \
-           if test $$maybe_colorize = yes && test $$count -gt 0; then \
-             color_start=$$3 color_end=$$std; \
-           else \
-             color_start= color_end=; \
-           fi; \
-           echo "$${color_start}# $$desc $$count$${color_end}"; \
-       }; \
-       create_testsuite_report () \
-       { \
-         result_count $$1 "TOTAL:" $$all   "$$brg"; \
-         result_count $$1 "PASS: " $$pass  "$$grn"; \
-         result_count $$1 "SKIP: " $$skip  "$$blu"; \
-         result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
-         result_count $$1 "FAIL: " $$fail  "$$red"; \
-         result_count $$1 "XPASS:" $$xpass "$$red"; \
-         result_count $$1 "ERROR:" $$error "$$mgn"; \
-       }; \
-       {                                                               \
-         echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" |       \
-           $(am__rst_title);                                           \
-         create_testsuite_report --no-color;                           \
-         echo;                                                         \
-         echo ".. contents:: :depth: 2";                               \
-         echo;                                                         \
-         for b in $$bases; do echo $$b; done                           \
-           | $(am__create_global_log);                                 \
-       } >$(TEST_SUITE_LOG).tmp || exit 1;                             \
-       mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG);                     \
-       if $$success; then                                              \
-         col="$$grn";                                                  \
-        else                                                           \
-         col="$$red";                                                  \
-         test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG);               \
-       fi;                                                             \
-       echo "$${col}$$br$${std}";                                      \
-       echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}";   \
-       echo "$${col}$$br$${std}";                                      \
-       create_testsuite_report --maybe-color;                          \
-       echo "$$col$$br$$std";                                          \
-       if $$success; then :; else                                      \
-         echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}";         \
-         if test -n "$(PACKAGE_BUGREPORT)"; then                       \
-           echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
-         fi;                                                           \
-         echo "$$col$$br$$std";                                        \
-       fi;                                                             \
-       $$success || exit 1
-
-check-TESTS: 
-       @list='$(RECHECK_LOGS)';           test -z "$$list" || rm -f $$list
-       @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
-       @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
-       @set +e; $(am__set_TESTS_bases); \
-       log_list=`for i in $$bases; do echo $$i.log; done`; \
-       trs_list=`for i in $$bases; do echo $$i.trs; done`; \
-       log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
-       $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
-       exit $$?;
-recheck: all 
-       @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
-       @set +e; $(am__set_TESTS_bases); \
-       bases=`for i in $$bases; do echo $$i; done \
-                | $(am__list_recheck_tests)` || exit 1; \
-       log_list=`for i in $$bases; do echo $$i.log; done`; \
-       log_list=`echo $$log_list`; \
-       $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
-               am__force_recheck=am--force-recheck \
-               TEST_LOGS="$$log_list"; \
-       exit $$?
-.tests.log:
-       @p='$<'; \
-       $(am__set_b); \
-       $(am__check_pre) $(TESTS_LOG_DRIVER) --test-name "$$f" \
-       --log-file $$b.log --trs-file $$b.trs \
-       $(am__common_driver_flags) $(AM_TESTS_LOG_DRIVER_FLAGS) $(TESTS_LOG_DRIVER_FLAGS) -- $(TESTS_LOG_COMPILE) \
-       "$$tst" $(AM_TESTS_FD_REDIRECT)
-@am__EXEEXT_TRUE@.tests$(EXEEXT).log:
-@am__EXEEXT_TRUE@      @p='$<'; \
-@am__EXEEXT_TRUE@      $(am__set_b); \
-@am__EXEEXT_TRUE@      $(am__check_pre) $(TESTS_LOG_DRIVER) --test-name "$$f" \
-@am__EXEEXT_TRUE@      --log-file $$b.log --trs-file $$b.trs \
-@am__EXEEXT_TRUE@      $(am__common_driver_flags) $(AM_TESTS_LOG_DRIVER_FLAGS) $(TESTS_LOG_DRIVER_FLAGS) -- $(TESTS_LOG_COMPILE) \
-@am__EXEEXT_TRUE@      "$$tst" $(AM_TESTS_FD_REDIRECT)
-
-distdir: $(BUILT_SOURCES)
-       $(MAKE) $(AM_MAKEFLAGS) distdir-am
-
-distdir-am: $(DISTFILES)
-       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-       list='$(DISTFILES)'; \
-         dist_files=`for file in $$list; do echo $$file; done | \
-         sed -e "s|^$$srcdirstrip/||;t" \
-             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-       case $$dist_files in \
-         */*) $(MKDIR_P) `echo "$$dist_files" | \
-                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-                          sort -u` ;; \
-       esac; \
-       for file in $$dist_files; do \
-         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-         if test -d $$d/$$file; then \
-           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-           if test -d "$(distdir)/$$file"; then \
-             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-           fi; \
-           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-           fi; \
-           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-         else \
-           test -f "$(distdir)/$$file" \
-           || cp -p $$d/$$file "$(distdir)/$$file" \
-           || exit 1; \
-         fi; \
-       done
-check-am: all-am
-       $(MAKE) $(AM_MAKEFLAGS) check-TESTS
-check: check-am
-all-am: Makefile
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-       if test -z '$(STRIP)'; then \
-         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-             install; \
-       else \
-         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-       fi
-mostlyclean-generic:
-       -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
-       -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
-       -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
-
-clean-generic:
-
-distclean-generic:
-       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-       @echo "This command is intended for maintainers to use"
-       @echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
-       -rm -f Makefile
-distclean-am: clean-am distclean-generic
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-       -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: check-am install-am install-strip
-
-.PHONY: all all-am check check-TESTS check-am clean clean-generic \
-       clean-libtool cscopelist-am ctags-am distclean \
-       distclean-generic distclean-libtool distdir dvi dvi-am html \
-       html-am info info-am install install-am install-data \
-       install-data-am install-dvi install-dvi-am install-exec \
-       install-exec-am install-html install-html-am install-info \
-       install-info-am install-man install-pdf install-pdf-am \
-       install-ps install-ps-am install-strip installcheck \
-       installcheck-am installdirs maintainer-clean \
-       maintainer-clean-generic mostlyclean mostlyclean-generic \
-       mostlyclean-libtool pdf pdf-am ps ps-am recheck tags-am \
-       uninstall uninstall-am
-
-.PRECIOUS: Makefile
-
-
-# Convenience targets:
-lib:
-       @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
-
--include $(top_srcdir)/git.mk
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/test/shaping/data/aots/Makefile.sources b/test/shaping/data/aots/Makefile.sources
deleted file mode 100644 (file)
index 9339682..0000000
+++ /dev/null
@@ -1,126 +0,0 @@
-TESTS = \
-       tests/classdef1_empty.tests \
-       tests/classdef1_multiple.tests \
-       tests/classdef1_single.tests \
-       tests/classdef1.tests \
-       tests/classdef2_empty.tests \
-       tests/classdef2_multiple.tests \
-       tests/classdef2_single.tests \
-       tests/classdef2.tests \
-       tests/gpos_chaining1_boundary.tests \
-       tests/gpos_chaining1_lookupflag.tests \
-       tests/gpos_chaining1_multiple_subrules.tests \
-       tests/gpos_chaining1_next_glyph.tests \
-       tests/gpos_chaining1_simple.tests \
-       tests/gpos_chaining1_successive.tests \
-       tests/gpos_chaining2_boundary.tests \
-       tests/gpos_chaining2_lookupflag.tests \
-       tests/gpos_chaining2_multiple_subrules.tests \
-       tests/gpos_chaining2_next_glyph.tests \
-       tests/gpos_chaining2_simple.tests \
-       tests/gpos_chaining2_successive.tests \
-       tests/gpos_chaining3_boundary.tests \
-       tests/gpos_chaining3_lookupflag.tests \
-       tests/gpos_chaining3_next_glyph.tests \
-       tests/gpos_chaining3_simple.tests \
-       tests/gpos_chaining3_successive.tests \
-       tests/gpos_context1_boundary.tests \
-       tests/gpos_context1_expansion.tests \
-       tests/gpos_context1_lookupflag.tests \
-       tests/gpos_context1_multiple_subrules.tests \
-       tests/gpos_context1_next_glyph.tests \
-       tests/gpos_context1_simple.tests \
-       tests/gpos_context1_successive.tests \
-       tests/gpos_context2_boundary.tests \
-       tests/gpos_context2_classes.tests \
-       tests/gpos_context2_expansion.tests \
-       tests/gpos_context2_lookupflag.tests \
-       tests/gpos_context2_multiple_subrules.tests \
-       tests/gpos_context2_next_glyph.tests \
-       tests/gpos_context2_simple.tests \
-       tests/gpos_context2_successive.tests \
-       tests/gpos_context3_boundary.tests \
-       tests/gpos_context3_lookupflag.tests \
-       tests/gpos_context3_next_glyph.tests \
-       tests/gpos_context3_simple.tests \
-       tests/gpos_context3_successive.tests \
-       tests/gpos1_1_lookupflag.tests \
-       tests/gpos1_1_simple.tests \
-       tests/gpos1_2_lookupflag.tests \
-       tests/gpos1_2.tests \
-       tests/gpos2_1_lookupflag.tests \
-       tests/gpos2_1_next_glyph.tests \
-       tests/gpos2_1_simple.tests \
-       tests/gpos2_1.tests \
-       tests/gpos2_2.tests \
-       tests/gpos3_lookupflag.tests \
-       tests/gpos3.tests \
-       tests/gpos4_lookupflag.tests \
-       tests/gpos4_multiple_anchors.tests \
-       tests/gpos4_simple.tests \
-       tests/gpos5.tests \
-       tests/gpos6.tests \
-       tests/gpos7_1.tests \
-       tests/gpos9.tests \
-       tests/gsub_chaining1_boundary.tests \
-       tests/gsub_chaining1_lookupflag.tests \
-       tests/gsub_chaining1_multiple_subrules.tests \
-       tests/gsub_chaining1_next_glyph.tests \
-       tests/gsub_chaining1_simple.tests \
-       tests/gsub_chaining1_successive.tests \
-       tests/gsub_chaining2_boundary.tests \
-       tests/gsub_chaining2_lookupflag.tests \
-       tests/gsub_chaining2_multiple_subrules.tests \
-       tests/gsub_chaining2_next_glyph.tests \
-       tests/gsub_chaining2_simple.tests \
-       tests/gsub_chaining2_successive.tests \
-       tests/gsub_chaining3_boundary.tests \
-       tests/gsub_chaining3_lookupflag.tests \
-       tests/gsub_chaining3_next_glyph.tests \
-       tests/gsub_chaining3_simple.tests \
-       tests/gsub_chaining3_successive.tests \
-       tests/gsub_context1_boundary.tests \
-       tests/gsub_context1_expansion.tests \
-       tests/gsub_context1_lookupflag.tests \
-       tests/gsub_context1_multiple_subrules.tests \
-       tests/gsub_context1_next_glyph.tests \
-       tests/gsub_context1_simple.tests \
-       tests/gsub_context1_successive.tests \
-       tests/gsub_context2_boundary.tests \
-       tests/gsub_context2_classes.tests \
-       tests/gsub_context2_expansion.tests \
-       tests/gsub_context2_lookupflag.tests \
-       tests/gsub_context2_multiple_subrules.tests \
-       tests/gsub_context2_next_glyph.tests \
-       tests/gsub_context2_simple.tests \
-       tests/gsub_context2_successive.tests \
-       tests/gsub_context3_boundary.tests \
-       tests/gsub_context3_lookupflag.tests \
-       tests/gsub_context3_next_glyph.tests \
-       tests/gsub_context3_simple.tests \
-       tests/gsub_context3_successive.tests \
-       tests/gsub1_1_lookupflag.tests \
-       tests/gsub1_1_modulo.tests \
-       tests/gsub1_1_simple.tests \
-       tests/gsub1_2_lookupflag.tests \
-       tests/gsub1_2_simple.tests \
-       tests/gsub2_1_lookupflag.tests \
-       tests/gsub2_1_multiple_sequences.tests \
-       tests/gsub2_1_simple.tests \
-       tests/gsub3_1_lookupflag.tests \
-       tests/gsub3_1_multiple.tests \
-       tests/gsub3_1_simple.tests \
-       tests/gsub4_1_lookupflag.tests \
-       tests/gsub4_1_multiple_ligatures.tests \
-       tests/gsub4_1_multiple_ligsets.tests \
-       tests/gsub4_1_simple.tests \
-       tests/gsub7.tests \
-       tests/lookupflag_ignore_attach.tests \
-       tests/lookupflag_ignore_base.tests \
-       tests/lookupflag_ignore_combination.tests \
-       tests/lookupflag_ignore_ligatures.tests \
-       tests/lookupflag_ignore_marks.tests \
-       $(NULL)
-
-DISABLED_TESTS = \
-       $(NULL)
diff --git a/test/shaping/data/aots/tests/classdef1.tests b/test/shaping/data/aots/tests/classdef1.tests
deleted file mode 100644 (file)
index 40ded45..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/classdef1_font4.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0015:[17|18|19|20|21]
diff --git a/test/shaping/data/aots/tests/classdef1_empty.tests b/test/shaping/data/aots/tests/classdef1_empty.tests
deleted file mode 100644 (file)
index 71d87f1..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/classdef1_font2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0015:[17|23|24|25|21]
diff --git a/test/shaping/data/aots/tests/classdef1_multiple.tests b/test/shaping/data/aots/tests/classdef1_multiple.tests
deleted file mode 100644 (file)
index c813f49..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/classdef1_font3.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+001B,U+001C,U+001D,U+001E,U+001F,U+0020,U+0021,U+0022,U+0023,U+0024:[20|23|24|25|24|26|27|28|28|29|30|31|34|33|34|35|37|38|38|39]
diff --git a/test/shaping/data/aots/tests/classdef1_single.tests b/test/shaping/data/aots/tests/classdef1_single.tests
deleted file mode 100644 (file)
index b0196d3..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/classdef2_font1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0015:[17|23|24|25|21]
diff --git a/test/shaping/data/aots/tests/classdef2.tests b/test/shaping/data/aots/tests/classdef2.tests
deleted file mode 100644 (file)
index d8c7b14..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/classdef2_font4.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0015:[17|18|19|20|21]
diff --git a/test/shaping/data/aots/tests/classdef2_empty.tests b/test/shaping/data/aots/tests/classdef2_empty.tests
deleted file mode 100644 (file)
index a8fd629..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/classdef2_font2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0015:[17|23|24|25|21]
diff --git a/test/shaping/data/aots/tests/classdef2_multiple.tests b/test/shaping/data/aots/tests/classdef2_multiple.tests
deleted file mode 100644 (file)
index 39e6835..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/classdef2_font3.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+001B,U+001C,U+001D,U+001E,U+001F,U+0020,U+0021,U+0022,U+0023,U+0024:[20|23|24|25|24|26|27|28|28|29|30|31|34|33|34|35|37|38|38|39]
diff --git a/test/shaping/data/aots/tests/classdef2_single.tests b/test/shaping/data/aots/tests/classdef2_single.tests
deleted file mode 100644 (file)
index b0196d3..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/classdef2_font1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0015:[17|23|24|25|21]
diff --git a/test/shaping/data/aots/tests/gpos1_1_lookupflag.tests b/test/shaping/data/aots/tests/gpos1_1_lookupflag.tests
deleted file mode 100644 (file)
index 88d7dd7..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/gpos1_1_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0014,U+0015:[17|18@1500,0|19@3000,0|20@4200,0|21@6000,0]
diff --git a/test/shaping/data/aots/tests/gpos1_1_simple.tests b/test/shaping/data/aots/tests/gpos1_1_simple.tests
deleted file mode 100644 (file)
index 101da9c..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-../fonts/gpos1_1_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0014,U+0015:[17|18@1300,0|19@3000,0|20@4300,0|21@6000,0]
-../fonts/gpos1_1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0014,U+0015:[17|18@1500,-200|19@3000,0|20@4500,-200|21@6000,0]
-../fonts/gpos1_1_simple_f3.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0014,U+0015:[17|18@1500,0|19@2800,0|20@4300,0|21@5600,0]
-#../fonts/gpos1_1_simple_f4.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0014,U+0015:[17|18@1500,0|19@3000,-200|20@4500,-200|21@6000,-400]
diff --git a/test/shaping/data/aots/tests/gpos1_2.tests b/test/shaping/data/aots/tests/gpos1_2.tests
deleted file mode 100644 (file)
index 3ddfa44..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/gpos1_2_font1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0014,U+0015:[17|18@1300,0|19@3000,0|20@4200,0|21@6000,0]
diff --git a/test/shaping/data/aots/tests/gpos1_2_lookupflag.tests b/test/shaping/data/aots/tests/gpos1_2_lookupflag.tests
deleted file mode 100644 (file)
index 82bcc43..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/gpos1_2_font2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0014,U+0015:[17|18@1500,0|19@3000,0|20@4200,0|21@6000,0]
diff --git a/test/shaping/data/aots/tests/gpos2_1.tests b/test/shaping/data/aots/tests/gpos2_1.tests
deleted file mode 100644 (file)
index 4d8b5e9..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-../fonts/gpos2_1_font6.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0011,U+0012,U+0014,U+0011:[17|18@1300,0|19@3000,-100|17@4500,0|18@5700,0|20@7500,-400|17@9000,0]
-../fonts/gpos2_1_font7.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0011,U+0012,U+0014,U+0011,U+0015,U+0016,U+0011:[17|18@1300,0|19@3000,-100|17@4500,0|18@5700,0|20@7500,-400|17@9000,0|21@10000,0|22@12000,-600|17@13500,0]
diff --git a/test/shaping/data/aots/tests/gpos2_1_lookupflag.tests b/test/shaping/data/aots/tests/gpos2_1_lookupflag.tests
deleted file mode 100644 (file)
index ce445a1..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-../fonts/gpos2_1_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0013,U+0014,U+0011,U+0013,U+0012,U+0014,U+0011:[17|19@1300,0|20@3000,-100|17@4500,0|19@5800,0|18@7500,0|20@9000,-100|17@10500,0]
-../fonts/gpos2_1_lookupflag_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0013,U+0014,U+0011,U+0013,U+0012,U+0014,U+0011:[17|19@1500,0|20@2800,-100|17@4300,0|19@5800,0|18@7100,0|20@8600,-100|17@10100,0]
diff --git a/test/shaping/data/aots/tests/gpos2_1_next_glyph.tests b/test/shaping/data/aots/tests/gpos2_1_next_glyph.tests
deleted file mode 100644 (file)
index 7f27eee..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-../fonts/gpos2_1_next_glyph_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0012,U+0012,U+0012,U+0012:[18@-100,0|18@1500,-100|18@2900,0|18@4500,-100]
-../fonts/gpos2_1_next_glyph_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0012,U+0012,U+0012,U+0012:[18@-100,0|18@1400,0|18@2900,0|18@4500,0]
diff --git a/test/shaping/data/aots/tests/gpos2_1_simple.tests b/test/shaping/data/aots/tests/gpos2_1_simple.tests
deleted file mode 100644 (file)
index 71e8c81..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-../fonts/gpos2_1_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0011,U+0012,U+0014:[17|18@1300,0|19@3000,-100|17@4500,0|18@6000,0|20@7500,0]
-../fonts/gpos2_1_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012:[17|18@1500,0]
diff --git a/test/shaping/data/aots/tests/gpos2_2.tests b/test/shaping/data/aots/tests/gpos2_2.tests
deleted file mode 100644 (file)
index 7be07f7..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-../fonts/gpos2_2_font1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0011,U+0012,U+0014:[17|18@1300,0|19@3000,-100|17@4500,0|18@6000,0|20@7500,0]
-../fonts/gpos2_2_font2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0013,U+0014,U+0011,U+0013,U+0012,U+0014,U+0011:[17|19@1300,0|20@3000,-100|17@4500,0|19@5800,0|18@7500,0|20@9000,-100|17@10500,0]
-../fonts/gpos2_2_font3.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0013,U+0014,U+0011,U+0013,U+0012,U+0014,U+0011:[17|19@1500,0|20@2800,-100|17@4300,0|19@5800,0|18@7100,0|20@8600,-100|17@10100,0]
-../fonts/gpos2_2_font4.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0012,U+0012,U+0012,U+0012:[18@-100,0|18@1500,-100|18@2900,0|18@4500,-100]
-../fonts/gpos2_2_font5.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0012,U+0012,U+0012,U+0012:[18@-100,0|18@1400,0|18@2900,0|18@4500,0]
diff --git a/test/shaping/data/aots/tests/gpos3.tests b/test/shaping/data/aots/tests/gpos3.tests
deleted file mode 100644 (file)
index d6f37bf..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-#../fonts/gpos3_font1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0011:[17|18@1500,0|19@1599,99|17@4500,0]
-../fonts/gpos3_font1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0011,U+0013,U+0011:[17|18@1500,0|17@3000,0|19@4500,0|17@6000,0]
-#../fonts/gpos3_font3.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0012,U+0011:[17|18@1500,0|18@1600,100|17@4500,0]
-#../fonts/gpos3_font3.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0011:[17|18@1500,0|19@1599,99|17@4500,0]
-#../fonts/gpos3_font3.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0014,U+0012,U+0011:[17|20@1500,0|18@1602,102|17@4500,0]
-#../fonts/gpos3_font3.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0014,U+0013,U+0011:[17|20@1500,0|19@1601,101|17@4500,0]
-../fonts/gpos3_font3.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0014,U+0011:[17|18@1500,0|20@3000,0|17@4500,0]
-../fonts/gpos3_font3.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0013,U+0012,U+0011:[17|19@1500,0|18@3000,0|17@4500,0]
-../fonts/gpos3_font3.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0013,U+0014,U+0011:[17|19@1500,0|20@3000,0|17@4500,0]
-../fonts/gpos3_font3.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012:[17|18@1500,0]
-../fonts/gpos3_font3.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0015,U+0015,U+0015:[17|18@1500,0|21@3000,0|21@4500,0|21@6000,0]
diff --git a/test/shaping/data/aots/tests/gpos3_lookupflag.tests b/test/shaping/data/aots/tests/gpos3_lookupflag.tests
deleted file mode 100644 (file)
index 13d593c..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-#../fonts/gpos3_font2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0015,U+0013,U+0011:[17|18@1500,0|21@3000,0|19@1599,99|17@6000,0]
-#../fonts/gpos3_font2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0015,U+0015,U+0015,U+0013,U+0011:[17|18@1500,0|21@3000,0|21@4500,0|21@6000,0|19@1599,99|17@9000,0]
diff --git a/test/shaping/data/aots/tests/gpos4_lookupflag.tests b/test/shaping/data/aots/tests/gpos4_lookupflag.tests
deleted file mode 100644 (file)
index 9d041bf..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-#../fonts/gpos4_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0011,U+0013,U+0011:[17|18@1500,0|17@3000,0|19@4500,0|17@6000,0]
-#../fonts/gpos4_lookupflag_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0011:[17|18@1500,0|19@3000,0|17@4500,0]
diff --git a/test/shaping/data/aots/tests/gpos4_multiple_anchors.tests b/test/shaping/data/aots/tests/gpos4_multiple_anchors.tests
deleted file mode 100644 (file)
index af9a1f5..0000000
+++ /dev/null
@@ -1 +0,0 @@
-#../fonts/gpos4_multiple_anchors_1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0013,U+0014,U+0015,U+0016,U+0012,U+0013,U+0014,U+0015,U+0016:[17|19@-100,-80|20@-91,-71|21@-102,-82|22@-93,-73|18@7500,0|19@7420,-60|20@7429,-51|21@7418,-62|22@7427,-53]
diff --git a/test/shaping/data/aots/tests/gpos4_simple.tests b/test/shaping/data/aots/tests/gpos4_simple.tests
deleted file mode 100644 (file)
index 5d60507..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-#../fonts/gpos4_simple_1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0011:[17|18@1500,0|19@1400,-80|17@4500,0]
-#../fonts/gpos4_simple_1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0011,U+0013,U+0011:[17|17@1500,0|19@3000,0|17@4500,0]
-#../fonts/gpos4_simple_1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0019,U+0019,U+0013,U+0011:[25|25@1500,0|19@3000,0|17@4500,0]
-#../fonts/gpos4_simple_1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0013,U+0011:[17|18@1500,0|19@1400,-80|19@1400,-80|17@6000,0]
-#../fonts/gpos4_simple_1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0014,U+0013,U+0011:[17|18@1500,0|20@3000,0|19@1400,-80|17@6000,0]
diff --git a/test/shaping/data/aots/tests/gpos5.tests b/test/shaping/data/aots/tests/gpos5.tests
deleted file mode 100644 (file)
index a20a0b9..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-#../fonts/gpos5_font1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+001E,U+0013,U+001F,U+0011:[17|18@1500,0|19@1400,-80|17@4500,0]
-#../fonts/gpos5_font1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+001E,U+001F,U+0013,U+0011:[17|18@1500,0|19@1401,-79|17@4500,0]
diff --git a/test/shaping/data/aots/tests/gpos6.tests b/test/shaping/data/aots/tests/gpos6.tests
deleted file mode 100644 (file)
index e5f9b3c..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-#../fonts/gpos6_font1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0011:[17|18@1500,0|19@1400,-80|17@4500,0]
-#../fonts/gpos6_font1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0011,U+0013,U+0011:[17|17@1500,0|19@3000,0|17@4500,0]
-#../fonts/gpos6_font1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0014,U+0014,U+0013,U+0011:[20|20@1500,0|19@3000,0|17@4500,0]
diff --git a/test/shaping/data/aots/tests/gpos7_1.tests b/test/shaping/data/aots/tests/gpos7_1.tests
deleted file mode 100644 (file)
index 954c8cb..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-../fonts/gpos7_1_font1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0014,U+0015:[17|18@1600,0|19@3200,0|20@4800,0|21@6000,0]
-../fonts/gpos7_1_font1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0011,U+0012,U+0013,U+0011:[17|18@1500,0|17@3000,0|18@4500,0|19@6000,0|17@7500,0]
diff --git a/test/shaping/data/aots/tests/gpos9.tests b/test/shaping/data/aots/tests/gpos9.tests
deleted file mode 100644 (file)
index cb20333..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-../fonts/gpos9_font1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0014,U+0015:[17|18@1300,0|19@3000,0|20@4300,0|21@6000,0]
-../fonts/gpos9_font2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0014,U+0015,U+0011:[17|18@1300,0|19@2700,0|20@4300,0|21@5700,0|17@7500,0]
diff --git a/test/shaping/data/aots/tests/gpos_chaining1_boundary.tests b/test/shaping/data/aots/tests/gpos_chaining1_boundary.tests
deleted file mode 100644 (file)
index 646ff2c..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-../fonts/gpos_chaining1_boundary_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|0@7500,0]
-../fonts/gpos_chaining1_boundary_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3020,0|22@4500,0|23@6000,0|0@7500,0]
-../fonts/gpos_chaining1_boundary_f3.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3020,0|22@4500,0|23@6000,0|0@7500,0]
-../fonts/gpos_chaining1_boundary_f4.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3000,0|22@4520,0|23@6000,0|0@7500,0]
diff --git a/test/shaping/data/aots/tests/gpos_chaining1_lookupflag.tests b/test/shaping/data/aots/tests/gpos_chaining1_lookupflag.tests
deleted file mode 100644 (file)
index d0e6e2e..0000000
+++ /dev/null
@@ -1 +0,0 @@
-#../fonts/gpos_chaining1_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+005A,U+0015,U+005B,U+0016,U+005C,U+0017,U+005D,U+005E,U+0018,U+005A,U+0019,U+005B,U+001A,U+0000:[0|20@1500,0|90@3000,0|21@4500,0|91@6000,0|22@7500,0|92@9000,0|23@10520,0|93@12000,0|94@13500,0|24@15000,0|90@16500,0|25@18000,0|91@19500,0|26@21000,0|0@22500,0]
diff --git a/test/shaping/data/aots/tests/gpos_chaining1_multiple_subrules.tests b/test/shaping/data/aots/tests/gpos_chaining1_multiple_subrules.tests
deleted file mode 100644 (file)
index 51bbe03..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-../fonts/gpos_chaining1_multiple_subrules_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3020,0|22@4500,0|23@6000,0|24@7500,0|0@9000,0|20@10500,0|21@12000,0|22@13520,0|23@15000,0|0@16500,0]
-../fonts/gpos_chaining1_multiple_subrules_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3000,0|22@4520,0|23@6000,0|24@7500,0|0@9000,0|20@10500,0|21@12000,0|22@13520,0|23@15000,0|0@16500,0]
diff --git a/test/shaping/data/aots/tests/gpos_chaining1_next_glyph.tests b/test/shaping/data/aots/tests/gpos_chaining1_next_glyph.tests
deleted file mode 100644 (file)
index f8be404..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/gpos_chaining1_next_glyph_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3020,0|22@4520,0|23@6020,0|0@7500,0]
diff --git a/test/shaping/data/aots/tests/gpos_chaining1_simple.tests b/test/shaping/data/aots/tests/gpos_chaining1_simple.tests
deleted file mode 100644 (file)
index 37efa11..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-../fonts/gpos_chaining1_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3020,0|22@4520,0|23@6000,0|0@7500,0]
-../fonts/gpos_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[0|20@1500,0|21@3000,0|22@4520,0|23@6000,0|24@7500,0|25@9000,0|26@10500,0|0@12000,0]
-../fonts/gpos_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+0000,U+0000:[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0|25@9000,0|0@10500,0|0@12000,0]
-../fonts/gpos_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019:[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0|25@9000,0]
-../fonts/gpos_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018:[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0]
-../fonts/gpos_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0000,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[0|0@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0|25@9000,0|26@10500,0|0@12000,0]
-../fonts/gpos_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[21|22@1500,0|23@3000,0|24@4500,0|25@6000,0|26@7500,0|0@9000,0]
-../fonts/gpos_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[22|23@1500,0|24@3000,0|25@4500,0|26@6000,0|0@7500,0]
-../fonts/gpos_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0000,U+0018,U+0019,U+001A,U+0000:[0|20@1500,0|21@3000,0|22@4500,0|0@6000,0|24@7500,0|25@9000,0|26@10500,0|0@12000,0]
-../fonts/gpos_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017:[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0]
-../fonts/gpos_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016:[0|20@1500,0|21@3000,0|22@4500,0]
diff --git a/test/shaping/data/aots/tests/gpos_chaining1_successive.tests b/test/shaping/data/aots/tests/gpos_chaining1_successive.tests
deleted file mode 100644 (file)
index 7a829cf..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/gpos_chaining1_successive_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0019,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000:[0|25@1500,0|20@3000,0|21@4520,0|22@6020,0|23@7500,0|24@9000,0|0@10500,0]
diff --git a/test/shaping/data/aots/tests/gpos_chaining2_boundary.tests b/test/shaping/data/aots/tests/gpos_chaining2_boundary.tests
deleted file mode 100644 (file)
index c35b8c7..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-../fonts/gpos_chaining2_boundary_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|0@7500,0]
-../fonts/gpos_chaining2_boundary_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3020,0|22@4500,0|23@6000,0|0@7500,0]
-../fonts/gpos_chaining2_boundary_f3.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3020,0|22@4500,0|23@6000,0|0@7500,0]
-../fonts/gpos_chaining2_boundary_f4.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3000,0|22@4520,0|23@6000,0|0@7500,0]
diff --git a/test/shaping/data/aots/tests/gpos_chaining2_lookupflag.tests b/test/shaping/data/aots/tests/gpos_chaining2_lookupflag.tests
deleted file mode 100644 (file)
index 8b50e14..0000000
+++ /dev/null
@@ -1 +0,0 @@
-#../fonts/gpos_chaining2_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+005A,U+0015,U+005B,U+0016,U+005C,U+0017,U+005D,U+005E,U+0018,U+005A,U+0019,U+005B,U+001A,U+0000:[0|20@1500,0|90@3000,0|21@4500,0|91@6000,0|22@7500,0|92@9000,0|23@10520,0|93@12000,0|94@13500,0|24@15000,0|90@16500,0|25@18000,0|91@19500,0|26@21000,0|0@22500,0]
diff --git a/test/shaping/data/aots/tests/gpos_chaining2_multiple_subrules.tests b/test/shaping/data/aots/tests/gpos_chaining2_multiple_subrules.tests
deleted file mode 100644 (file)
index 8ddc8b2..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-../fonts/gpos_chaining2_multiple_subrules_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3020,0|22@4500,0|23@6000,0|24@7500,0|0@9000,0|20@10500,0|21@12000,0|22@13520,0|23@15000,0|0@16500,0]
-../fonts/gpos_chaining2_multiple_subrules_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3000,0|22@4520,0|23@6000,0|24@7500,0|0@9000,0|20@10500,0|21@12000,0|22@13520,0|23@15000,0|0@16500,0]
diff --git a/test/shaping/data/aots/tests/gpos_chaining2_next_glyph.tests b/test/shaping/data/aots/tests/gpos_chaining2_next_glyph.tests
deleted file mode 100644 (file)
index 34170f2..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/gpos_chaining2_next_glyph_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3020,0|22@4520,0|23@6020,0|0@7500,0]
diff --git a/test/shaping/data/aots/tests/gpos_chaining2_simple.tests b/test/shaping/data/aots/tests/gpos_chaining2_simple.tests
deleted file mode 100644 (file)
index 32fda1b..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-../fonts/gpos_chaining2_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3020,0|22@4520,0|23@6000,0|0@7500,0]
-../fonts/gpos_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[0|20@1500,0|21@3000,0|22@4520,0|23@6000,0|24@7500,0|25@9000,0|26@10500,0|0@12000,0]
-../fonts/gpos_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+0000,U+0000:[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0|25@9000,0|0@10500,0|0@12000,0]
-../fonts/gpos_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019:[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0|25@9000,0]
-../fonts/gpos_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018:[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0]
-../fonts/gpos_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0000,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[0|0@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0|25@9000,0|26@10500,0|0@12000,0]
-../fonts/gpos_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[21|22@1500,0|23@3000,0|24@4500,0|25@6000,0|26@7500,0|0@9000,0]
-../fonts/gpos_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[22|23@1500,0|24@3000,0|25@4500,0|26@6000,0|0@7500,0]
-../fonts/gpos_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0000,U+0018,U+0019,U+001A,U+0000:[0|20@1500,0|21@3000,0|22@4500,0|0@6000,0|24@7500,0|25@9000,0|26@10500,0|0@12000,0]
-../fonts/gpos_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017:[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0]
-../fonts/gpos_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016:[0|20@1500,0|21@3000,0|22@4500,0]
diff --git a/test/shaping/data/aots/tests/gpos_chaining2_successive.tests b/test/shaping/data/aots/tests/gpos_chaining2_successive.tests
deleted file mode 100644 (file)
index e930863..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/gpos_chaining2_successive_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0019,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000:[0|25@1500,0|20@3000,0|21@4520,0|22@6020,0|23@7500,0|24@9000,0|0@10500,0]
diff --git a/test/shaping/data/aots/tests/gpos_chaining3_boundary.tests b/test/shaping/data/aots/tests/gpos_chaining3_boundary.tests
deleted file mode 100644 (file)
index f74dedf..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-../fonts/gpos_chaining3_boundary_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|0@7500,0]
-../fonts/gpos_chaining3_boundary_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3020,0|22@4500,0|23@6000,0|0@7500,0]
-../fonts/gpos_chaining3_boundary_f3.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3020,0|22@4500,0|23@6000,0|0@7500,0]
-../fonts/gpos_chaining3_boundary_f4.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3000,0|22@4520,0|23@6000,0|0@7500,0]
diff --git a/test/shaping/data/aots/tests/gpos_chaining3_lookupflag.tests b/test/shaping/data/aots/tests/gpos_chaining3_lookupflag.tests
deleted file mode 100644 (file)
index 0165fb5..0000000
+++ /dev/null
@@ -1 +0,0 @@
-#../fonts/gpos_chaining3_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+005A,U+0015,U+005B,U+0016,U+005C,U+0017,U+005D,U+005E,U+0018,U+005A,U+0019,U+005B,U+001A,U+0000:[0|20@1500,0|90@3000,0|21@4500,0|91@6000,0|22@7500,0|92@9000,0|23@10520,0|93@12000,0|94@13500,0|24@15000,0|90@16500,0|25@18000,0|91@19500,0|26@21000,0|0@22500,0]
diff --git a/test/shaping/data/aots/tests/gpos_chaining3_next_glyph.tests b/test/shaping/data/aots/tests/gpos_chaining3_next_glyph.tests
deleted file mode 100644 (file)
index 614bc2e..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/gpos_chaining3_next_glyph_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0016,U+0015,U+0016,U+0015,U+0016,U+0015,U+0000:[0|22@1500,0|21@3020,0|22@4500,0|21@6020,0|22@7500,0|21@9000,0|0@10500,0]
diff --git a/test/shaping/data/aots/tests/gpos_chaining3_simple.tests b/test/shaping/data/aots/tests/gpos_chaining3_simple.tests
deleted file mode 100644 (file)
index f5977c2..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-../fonts/gpos_chaining3_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3020,0|22@4520,0|23@6000,0|0@7500,0]
-../fonts/gpos_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[0|20@1500,0|21@3000,0|22@4520,0|23@6000,0|24@7500,0|25@9000,0|26@10500,0|0@12000,0]
-../fonts/gpos_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+0000,U+0000:[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0|25@9000,0|0@10500,0|0@12000,0]
-../fonts/gpos_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019:[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0|25@9000,0]
-../fonts/gpos_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018:[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0]
-../fonts/gpos_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0000,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[0|0@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0|25@9000,0|26@10500,0|0@12000,0]
-../fonts/gpos_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[21|22@1500,0|23@3000,0|24@4500,0|25@6000,0|26@7500,0|0@9000,0]
-../fonts/gpos_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[22|23@1500,0|24@3000,0|25@4500,0|26@6000,0|0@7500,0]
-../fonts/gpos_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0000,U+0018,U+0019,U+001A,U+0000:[0|20@1500,0|21@3000,0|22@4500,0|0@6000,0|24@7500,0|25@9000,0|26@10500,0|0@12000,0]
-../fonts/gpos_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017:[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0]
-../fonts/gpos_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016:[0|20@1500,0|21@3000,0|22@4500,0]
diff --git a/test/shaping/data/aots/tests/gpos_chaining3_successive.tests b/test/shaping/data/aots/tests/gpos_chaining3_successive.tests
deleted file mode 100644 (file)
index fa5a50c..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/gpos_chaining3_successive_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0019,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000:[0|25@1500,0|20@3000,0|21@4520,0|22@6020,0|23@7500,0|24@9000,0|0@10500,0]
diff --git a/test/shaping/data/aots/tests/gpos_context1_boundary.tests b/test/shaping/data/aots/tests/gpos_context1_boundary.tests
deleted file mode 100644 (file)
index 1db8fef..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-../fonts/gpos_context1_boundary_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|20@1500,0|20@3000,0|20@4500,0|20@6000,0|20@7500,0|0@9000,0]
-../fonts/gpos_context1_boundary_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|20@1520,0|20@3020,0|20@4520,0|20@6020,0|20@7520,0|0@9000,0]
diff --git a/test/shaping/data/aots/tests/gpos_context1_expansion.tests b/test/shaping/data/aots/tests/gpos_context1_expansion.tests
deleted file mode 100644 (file)
index 2fc54d5..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/gpos_context1_expansion_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0000:[0|20@1500,0|21@3000,0|22@4500,0|0@6000,0]
diff --git a/test/shaping/data/aots/tests/gpos_context1_lookupflag.tests b/test/shaping/data/aots/tests/gpos_context1_lookupflag.tests
deleted file mode 100644 (file)
index 9e8fcd6..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-#../fonts/gpos_context1_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+005A,U+0015,U+005B,U+005C,U+0016,U+0000:[0|20@1520,0|90@3000,0|21@4520,0|91@6000,0|92@7500,0|22@9020,0|0@10500,0]
-#../fonts/gpos_context1_lookupflag_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+005A,U+0015,U+005B,U+005C,U+0016,U+0000:[0|20@1500,0|90@3000,0|21@4520,0|91@6000,0|92@7500,0|22@9000,0|0@10500,0]
diff --git a/test/shaping/data/aots/tests/gpos_context1_multiple_subrules.tests b/test/shaping/data/aots/tests/gpos_context1_multiple_subrules.tests
deleted file mode 100644 (file)
index b994f04..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-../fonts/gpos_context1_multiple_subrules_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0000,U+0014,U+0015,U+0000:[0|20@1520,0|21@3000,0|22@4500,0|0@6000,0|20@7500,0|21@9020,0|0@10500,0]
-../fonts/gpos_context1_multiple_subrules_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0000,U+0014,U+0015,U+0000:[0|20@1500,0|21@3020,0|22@4500,0|0@6000,0|20@7500,0|21@9020,0|0@10500,0]
diff --git a/test/shaping/data/aots/tests/gpos_context1_next_glyph.tests b/test/shaping/data/aots/tests/gpos_context1_next_glyph.tests
deleted file mode 100644 (file)
index e67d635..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/gpos_context1_next_glyph_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|20@1520,0|20@3000,0|20@4520,0|20@6000,0|20@7500,0|0@9000,0]
diff --git a/test/shaping/data/aots/tests/gpos_context1_simple.tests b/test/shaping/data/aots/tests/gpos_context1_simple.tests
deleted file mode 100644 (file)
index 4a88e0a..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-../fonts/gpos_context1_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0000:[0|20@1520,0|21@3020,0|22@4520,0|0@6000,0]
-../fonts/gpos_context1_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0000,U+0014,U+0015,U+0000:[0|20@1500,0|0@3000,0|20@4500,0|21@6000,0|0@7500,0]
-../fonts/gpos_context1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|20@1500,0|20@3020,0|20@4500,0|20@6000,0|20@7500,0|0@9000,0]
diff --git a/test/shaping/data/aots/tests/gpos_context1_successive.tests b/test/shaping/data/aots/tests/gpos_context1_successive.tests
deleted file mode 100644 (file)
index 172d350..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/gpos_context1_successive_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3020,0|22@4520,0|23@6000,0|0@7500,0]
diff --git a/test/shaping/data/aots/tests/gpos_context2_boundary.tests b/test/shaping/data/aots/tests/gpos_context2_boundary.tests
deleted file mode 100644 (file)
index ef63fbb..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-../fonts/gpos_context2_boundary_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|20@1500,0|20@3000,0|20@4500,0|20@6000,0|20@7500,0|0@9000,0]
-../fonts/gpos_context2_boundary_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|20@1520,0|20@3020,0|20@4520,0|20@6020,0|20@7520,0|0@9000,0]
diff --git a/test/shaping/data/aots/tests/gpos_context2_classes.tests b/test/shaping/data/aots/tests/gpos_context2_classes.tests
deleted file mode 100644 (file)
index 5a3d008..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-../fonts/gpos_context2_classes_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+001A,U+001C,U+0018,U+0000,U+0015,U+001B,U+001A,U+0018,U+0000,U+0016,U+001B,U+001A,U+0018:[0|20@1500,0|26@3020,0|28@4500,0|24@6000,0|0@7500,0|21@9000,0|27@10520,0|26@12000,0|24@13500,0|0@15000,0|22@16500,0|27@18000,0|26@19500,0|24@21000,0]
-../fonts/gpos_context2_classes_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0016,U+001B,U+001A,U+0018,U+0000,U+0018,U+0018,U+001D,U+0016,U+0000,U+0016,U+001B,U+001A,U+0018:[0|22@1500,0|27@3020,0|26@4500,0|24@6000,0|0@7500,0|24@9000,0|24@10500,0|29@12020,0|22@13500,0|0@15000,0|22@16500,0|27@18020,0|26@19500,0|24@21000,0]
diff --git a/test/shaping/data/aots/tests/gpos_context2_expansion.tests b/test/shaping/data/aots/tests/gpos_context2_expansion.tests
deleted file mode 100644 (file)
index 67ed978..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/gpos_context2_expansion_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0000:[0|20@1500,0|21@3000,0|22@4500,0|0@6000,0]
diff --git a/test/shaping/data/aots/tests/gpos_context2_lookupflag.tests b/test/shaping/data/aots/tests/gpos_context2_lookupflag.tests
deleted file mode 100644 (file)
index f48e825..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-#../fonts/gpos_context2_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+005A,U+0015,U+005B,U+005C,U+0016,U+0000:[0|20@1520,0|90@3000,0|21@4520,0|91@6000,0|92@7500,0|22@9020,0|0@10500,0]
-#../fonts/gpos_context2_lookupflag_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+005A,U+0015,U+005B,U+005C,U+0016,U+0000:[0|20@1500,0|90@3000,0|21@4520,0|91@6000,0|92@7500,0|22@9000,0|0@10500,0]
diff --git a/test/shaping/data/aots/tests/gpos_context2_multiple_subrules.tests b/test/shaping/data/aots/tests/gpos_context2_multiple_subrules.tests
deleted file mode 100644 (file)
index 4489372..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-../fonts/gpos_context2_multiple_subrules_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0000,U+0014,U+0015,U+0000:[0|20@1520,0|21@3000,0|22@4500,0|0@6000,0|20@7500,0|21@9020,0|0@10500,0]
-../fonts/gpos_context2_multiple_subrules_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0000,U+0014,U+0015,U+0000:[0|20@1500,0|21@3020,0|22@4500,0|0@6000,0|20@7500,0|21@9020,0|0@10500,0]
diff --git a/test/shaping/data/aots/tests/gpos_context2_next_glyph.tests b/test/shaping/data/aots/tests/gpos_context2_next_glyph.tests
deleted file mode 100644 (file)
index e736b3b..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/gpos_context2_next_glyph_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|20@1520,0|20@3000,0|20@4520,0|20@6000,0|20@7500,0|0@9000,0]
diff --git a/test/shaping/data/aots/tests/gpos_context2_simple.tests b/test/shaping/data/aots/tests/gpos_context2_simple.tests
deleted file mode 100644 (file)
index edbc0be..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-../fonts/gpos_context2_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0000:[0|20@1520,0|21@3020,0|22@4520,0|0@6000,0]
-../fonts/gpos_context2_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0000,U+0014,U+0015,U+0000:[0|20@1500,0|0@3000,0|20@4500,0|21@6000,0|0@7500,0]
-../fonts/gpos_context2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|20@1500,0|20@3020,0|20@4500,0|20@6000,0|20@7500,0|0@9000,0]
diff --git a/test/shaping/data/aots/tests/gpos_context2_successive.tests b/test/shaping/data/aots/tests/gpos_context2_successive.tests
deleted file mode 100644 (file)
index 8b098d5..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/gpos_context2_successive_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3020,0|22@4520,0|23@6000,0|0@7500,0]
diff --git a/test/shaping/data/aots/tests/gpos_context3_boundary.tests b/test/shaping/data/aots/tests/gpos_context3_boundary.tests
deleted file mode 100644 (file)
index de3c057..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-../fonts/gpos_context3_boundary_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|20@1500,0|20@3000,0|20@4500,0|20@6000,0|20@7500,0|0@9000,0]
-../fonts/gpos_context3_boundary_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|20@1520,0|20@3020,0|20@4520,0|20@6020,0|20@7520,0|0@9000,0]
diff --git a/test/shaping/data/aots/tests/gpos_context3_lookupflag.tests b/test/shaping/data/aots/tests/gpos_context3_lookupflag.tests
deleted file mode 100644 (file)
index 21f851b..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-#../fonts/gpos_context3_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+005A,U+0015,U+005B,U+005C,U+0016,U+0000:[0|20@1520,0|90@3000,0|21@4520,0|91@6000,0|92@7500,0|22@9020,0|0@10500,0]
-#../fonts/gpos_context3_lookupflag_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+005A,U+0015,U+005B,U+005C,U+0016,U+0000:[0|20@1500,0|90@3000,0|21@4520,0|91@6000,0|92@7500,0|22@9000,0|0@10500,0]
diff --git a/test/shaping/data/aots/tests/gpos_context3_next_glyph.tests b/test/shaping/data/aots/tests/gpos_context3_next_glyph.tests
deleted file mode 100644 (file)
index 049b156..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/gpos_context3_next_glyph_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|20@1520,0|20@3000,0|20@4520,0|20@6000,0|20@7500,0|0@9000,0]
diff --git a/test/shaping/data/aots/tests/gpos_context3_simple.tests b/test/shaping/data/aots/tests/gpos_context3_simple.tests
deleted file mode 100644 (file)
index 3e544f0..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-../fonts/gpos_context3_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0000:[0|20@1520,0|21@3020,0|22@4520,0|0@6000,0]
-../fonts/gpos_context3_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0000,U+0014,U+0015,U+0000,U+0014,U+0015,U+0016,U+0000:[0|20@1500,0|0@3000,0|20@4500,0|21@6000,0|0@7500,0|20@9020,0|21@10520,0|22@12020,0|0@13500,0]
diff --git a/test/shaping/data/aots/tests/gpos_context3_successive.tests b/test/shaping/data/aots/tests/gpos_context3_successive.tests
deleted file mode 100644 (file)
index bfcf24a..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/gpos_context3_successive_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3020,0|22@4520,0|23@6000,0|0@7500,0]
diff --git a/test/shaping/data/aots/tests/gsub1_1_lookupflag.tests b/test/shaping/data/aots/tests/gsub1_1_lookupflag.tests
deleted file mode 100644 (file)
index 8865af8..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/gsub1_1_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0015:[17|18|24|20|21]
diff --git a/test/shaping/data/aots/tests/gsub1_1_modulo.tests b/test/shaping/data/aots/tests/gsub1_1_modulo.tests
deleted file mode 100644 (file)
index bbfff5e..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/gsub1_1_modulo_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0015,U+0016,U+0017,U+0018:[17|18|17|24|23|18|23|24]
diff --git a/test/shaping/data/aots/tests/gsub1_1_simple.tests b/test/shaping/data/aots/tests/gsub1_1_simple.tests
deleted file mode 100644 (file)
index a3a1385..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/gsub1_1_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0015:[17|23|24|20|21]
diff --git a/test/shaping/data/aots/tests/gsub1_2_lookupflag.tests b/test/shaping/data/aots/tests/gsub1_2_lookupflag.tests
deleted file mode 100644 (file)
index 887e047..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/gsub1_2_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0015:[17|18|19|25|21]
diff --git a/test/shaping/data/aots/tests/gsub1_2_simple.tests b/test/shaping/data/aots/tests/gsub1_2_simple.tests
deleted file mode 100644 (file)
index d657897..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/gsub1_2_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0015:[17|22|19|25|21]
diff --git a/test/shaping/data/aots/tests/gsub2_1_lookupflag.tests b/test/shaping/data/aots/tests/gsub2_1_lookupflag.tests
deleted file mode 100644 (file)
index e28e59c..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/gsub2_1_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0011:[17|18|22|23|17]
diff --git a/test/shaping/data/aots/tests/gsub2_1_multiple_sequences.tests b/test/shaping/data/aots/tests/gsub2_1_multiple_sequences.tests
deleted file mode 100644 (file)
index 12cbbf6..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/gsub2_1_multiple_sequences_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0011:[17|20|21|22|23|17]
diff --git a/test/shaping/data/aots/tests/gsub2_1_simple.tests b/test/shaping/data/aots/tests/gsub2_1_simple.tests
deleted file mode 100644 (file)
index d1d0969..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-../fonts/gsub2_1_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013:[17|20|21|22|19]
-../fonts/gsub2_1_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0012:[17|20|21|22|19|20|21|22]
diff --git a/test/shaping/data/aots/tests/gsub3_1_lookupflag.tests b/test/shaping/data/aots/tests/gsub3_1_lookupflag.tests
deleted file mode 100644 (file)
index 193c5c4..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/gsub3_1_lookupflag_f1.otf:--features="-test[4],test[5],test[6]=2,-test[7]" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0012,U+0012,U+0013,U+0013,U+0013,U+0013,U+0011:[17|18|18|18|19|22|23|19|17]
diff --git a/test/shaping/data/aots/tests/gsub3_1_multiple.tests b/test/shaping/data/aots/tests/gsub3_1_multiple.tests
deleted file mode 100644 (file)
index 7b1c032..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/gsub3_1_multiple_f1.otf:--features="-test[1],test[2],test[3]=2,-test[4],-test[5],test[6],test[7]=2,-test[8]" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0012,U+0012,U+0012,U+0013,U+0013,U+0013,U+0013,U+0011:[17|18|20|21|18|19|22|23|19|17]
diff --git a/test/shaping/data/aots/tests/gsub3_1_simple.tests b/test/shaping/data/aots/tests/gsub3_1_simple.tests
deleted file mode 100644 (file)
index b8a28d1..0000000
+++ /dev/null
@@ -1 +0,0 @@
-#../fonts/gsub3_1_simple_f1.otf:--features="-test[1],test[3],test[5]=2,test[7]=3,-test[9],test[11]" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0011,U+0012,U+0011,U+0012,U+0011,U+0012,U+0011,U+0012,U+0011,U+0012,U+0011:[17|18|17|20|17|21|17|22|17|18|17|20|17]
diff --git a/test/shaping/data/aots/tests/gsub4_1_lookupflag.tests b/test/shaping/data/aots/tests/gsub4_1_lookupflag.tests
deleted file mode 100644 (file)
index c2c5242..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/gsub4_1_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0018,U+0012,U+0018,U+0013,U+0018,U+0018,U+0014,U+0018,U+0011,U+0012,U+0013,U+0016,U+0014:[17|24|23|24|24|24|24|17|18|19|22|20]
diff --git a/test/shaping/data/aots/tests/gsub4_1_multiple_ligatures.tests b/test/shaping/data/aots/tests/gsub4_1_multiple_ligatures.tests
deleted file mode 100644 (file)
index 33c1a09..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-../fonts/gsub4_1_multiple_ligatures_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0011,U+0012,U+0013,U+0016,U+0014:[17|23|17|24|22|20]
-../fonts/gsub4_1_multiple_ligatures_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0011,U+0012,U+0013,U+0016,U+0014:[17|24|20|17|24|22|20]
diff --git a/test/shaping/data/aots/tests/gsub4_1_multiple_ligsets.tests b/test/shaping/data/aots/tests/gsub4_1_multiple_ligsets.tests
deleted file mode 100644 (file)
index a63aeed..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/gsub4_1_multiple_ligsets_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0015,U+0014,U+0013,U+0016:[17|23|21|24|22]
diff --git a/test/shaping/data/aots/tests/gsub4_1_simple.tests b/test/shaping/data/aots/tests/gsub4_1_simple.tests
deleted file mode 100644 (file)
index aa4bb4b..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/gsub4_1_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0011,U+0012,U+0013,U+0016,U+0014:[17|23|17|18|19|22|20]
diff --git a/test/shaping/data/aots/tests/gsub7.tests b/test/shaping/data/aots/tests/gsub7.tests
deleted file mode 100644 (file)
index e95b1c7..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-../fonts/gsub7_font1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0015:[17|23|24|20|21]
-../fonts/gsub7_font2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0015:[17|23|29|20|21]
diff --git a/test/shaping/data/aots/tests/gsub_chaining1_boundary.tests b/test/shaping/data/aots/tests/gsub_chaining1_boundary.tests
deleted file mode 100644 (file)
index 6d99d97..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-../fonts/gsub_chaining1_boundary_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|21|22|23|0]
-../fonts/gsub_chaining1_boundary_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|61|22|23|0]
-../fonts/gsub_chaining1_boundary_f3.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|61|22|23|0]
-../fonts/gsub_chaining1_boundary_f4.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|21|62|23|0]
diff --git a/test/shaping/data/aots/tests/gsub_chaining1_lookupflag.tests b/test/shaping/data/aots/tests/gsub_chaining1_lookupflag.tests
deleted file mode 100644 (file)
index 7883c0a..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/gsub_chaining1_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+005A,U+0015,U+005B,U+0016,U+005C,U+0017,U+005D,U+005E,U+0018,U+005A,U+0019,U+005B,U+001A,U+0000:[0|20|90|21|91|22|92|63|93|94|24|90|25|91|26|0]
diff --git a/test/shaping/data/aots/tests/gsub_chaining1_multiple_subrules.tests b/test/shaping/data/aots/tests/gsub_chaining1_multiple_subrules.tests
deleted file mode 100644 (file)
index 28a5225..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-../fonts/gsub_chaining1_multiple_subrules_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|61|22|23|24|0|20|21|62|23|0]
-../fonts/gsub_chaining1_multiple_subrules_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|21|62|23|24|0|20|21|62|23|0]
diff --git a/test/shaping/data/aots/tests/gsub_chaining1_next_glyph.tests b/test/shaping/data/aots/tests/gsub_chaining1_next_glyph.tests
deleted file mode 100644 (file)
index 82f9d95..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/gsub_chaining1_next_glyph_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|61|62|63|0]
diff --git a/test/shaping/data/aots/tests/gsub_chaining1_simple.tests b/test/shaping/data/aots/tests/gsub_chaining1_simple.tests
deleted file mode 100644 (file)
index 23e091f..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-../fonts/gsub_chaining1_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|61|62|23|0]
-../fonts/gsub_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[0|20|21|62|23|24|25|26|0]
-../fonts/gsub_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+0000,U+0000:[0|20|21|22|23|24|25|0|0]
-../fonts/gsub_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019:[0|20|21|22|23|24|25]
-../fonts/gsub_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018:[0|20|21|22|23|24]
-../fonts/gsub_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0000,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[0|0|21|22|23|24|25|26|0]
-../fonts/gsub_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[21|22|23|24|25|26|0]
-../fonts/gsub_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[22|23|24|25|26|0]
-../fonts/gsub_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0000,U+0018,U+0019,U+001A,U+0000:[0|20|21|22|0|24|25|26|0]
-../fonts/gsub_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017:[0|20|21|22|23]
-../fonts/gsub_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016:[0|20|21|22]
diff --git a/test/shaping/data/aots/tests/gsub_chaining1_successive.tests b/test/shaping/data/aots/tests/gsub_chaining1_successive.tests
deleted file mode 100644 (file)
index ab3cfb1..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/gsub_chaining1_successive_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0019,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000:[0|25|20|61|63|24|0]
diff --git a/test/shaping/data/aots/tests/gsub_chaining2_boundary.tests b/test/shaping/data/aots/tests/gsub_chaining2_boundary.tests
deleted file mode 100644 (file)
index b06c620..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-../fonts/gsub_chaining2_boundary_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|21|22|23|0]
-../fonts/gsub_chaining2_boundary_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|61|22|23|0]
-../fonts/gsub_chaining2_boundary_f3.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|61|22|23|0]
-../fonts/gsub_chaining2_boundary_f4.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|21|62|23|0]
diff --git a/test/shaping/data/aots/tests/gsub_chaining2_lookupflag.tests b/test/shaping/data/aots/tests/gsub_chaining2_lookupflag.tests
deleted file mode 100644 (file)
index 372b343..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/gsub_chaining2_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+005A,U+0015,U+005B,U+0016,U+005C,U+0017,U+005D,U+005E,U+0018,U+005A,U+0019,U+005B,U+001A,U+0000:[0|20|90|21|91|22|92|63|93|94|24|90|25|91|26|0]
diff --git a/test/shaping/data/aots/tests/gsub_chaining2_multiple_subrules.tests b/test/shaping/data/aots/tests/gsub_chaining2_multiple_subrules.tests
deleted file mode 100644 (file)
index e2fbb5c..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-../fonts/gsub_chaining2_multiple_subrules_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|61|22|23|24|0|20|21|62|23|0]
-../fonts/gsub_chaining2_multiple_subrules_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|21|62|23|24|0|20|21|62|23|0]
diff --git a/test/shaping/data/aots/tests/gsub_chaining2_next_glyph.tests b/test/shaping/data/aots/tests/gsub_chaining2_next_glyph.tests
deleted file mode 100644 (file)
index 84c8252..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/gsub_chaining2_next_glyph_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|61|62|63|0]
diff --git a/test/shaping/data/aots/tests/gsub_chaining2_simple.tests b/test/shaping/data/aots/tests/gsub_chaining2_simple.tests
deleted file mode 100644 (file)
index 53fa7e8..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-../fonts/gsub_chaining2_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|61|62|23|0]
-../fonts/gsub_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[0|20|21|62|23|24|25|26|0]
-../fonts/gsub_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+0000,U+0000:[0|20|21|22|23|24|25|0|0]
-../fonts/gsub_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019:[0|20|21|22|23|24|25]
-../fonts/gsub_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018:[0|20|21|22|23|24]
-../fonts/gsub_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0000,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[0|0|21|22|23|24|25|26|0]
-../fonts/gsub_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[21|22|23|24|25|26|0]
-../fonts/gsub_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[22|23|24|25|26|0]
-../fonts/gsub_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0000,U+0018,U+0019,U+001A,U+0000:[0|20|21|22|0|24|25|26|0]
-../fonts/gsub_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017:[0|20|21|22|23]
-../fonts/gsub_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016:[0|20|21|22]
diff --git a/test/shaping/data/aots/tests/gsub_chaining2_successive.tests b/test/shaping/data/aots/tests/gsub_chaining2_successive.tests
deleted file mode 100644 (file)
index 71cbe0d..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/gsub_chaining2_successive_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0019,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000:[0|25|20|61|63|24|0]
diff --git a/test/shaping/data/aots/tests/gsub_chaining3_boundary.tests b/test/shaping/data/aots/tests/gsub_chaining3_boundary.tests
deleted file mode 100644 (file)
index c01dc4b..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-../fonts/gsub_chaining3_boundary_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|21|22|23|0]
-../fonts/gsub_chaining3_boundary_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|61|22|23|0]
-../fonts/gsub_chaining3_boundary_f3.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|61|22|23|0]
-../fonts/gsub_chaining3_boundary_f4.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|21|62|23|0]
diff --git a/test/shaping/data/aots/tests/gsub_chaining3_lookupflag.tests b/test/shaping/data/aots/tests/gsub_chaining3_lookupflag.tests
deleted file mode 100644 (file)
index be2147b..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/gsub_chaining3_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+005A,U+0015,U+005B,U+0016,U+005C,U+0017,U+005D,U+005E,U+0018,U+005A,U+0019,U+005B,U+001A,U+0000:[0|20|90|21|91|22|92|63|93|94|24|90|25|91|26|0]
diff --git a/test/shaping/data/aots/tests/gsub_chaining3_next_glyph.tests b/test/shaping/data/aots/tests/gsub_chaining3_next_glyph.tests
deleted file mode 100644 (file)
index 2493c1e..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/gsub_chaining3_next_glyph_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0016,U+0015,U+0016,U+0015,U+0016,U+0015,U+0000:[0|22|61|22|61|22|21|0]
diff --git a/test/shaping/data/aots/tests/gsub_chaining3_simple.tests b/test/shaping/data/aots/tests/gsub_chaining3_simple.tests
deleted file mode 100644 (file)
index eb24167..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-../fonts/gsub_chaining3_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|61|62|23|0]
-../fonts/gsub_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[0|20|21|62|23|24|25|26|0]
-../fonts/gsub_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+0000,U+0000:[0|20|21|22|23|24|25|0|0]
-../fonts/gsub_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019:[0|20|21|22|23|24|25]
-../fonts/gsub_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018:[0|20|21|22|23|24]
-../fonts/gsub_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0000,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[0|0|21|22|23|24|25|26|0]
-../fonts/gsub_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[21|22|23|24|25|26|0]
-../fonts/gsub_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[22|23|24|25|26|0]
-../fonts/gsub_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0000,U+0018,U+0019,U+001A,U+0000:[0|20|21|22|0|24|25|26|0]
-../fonts/gsub_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017:[0|20|21|22|23]
-../fonts/gsub_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016:[0|20|21|22]
diff --git a/test/shaping/data/aots/tests/gsub_chaining3_successive.tests b/test/shaping/data/aots/tests/gsub_chaining3_successive.tests
deleted file mode 100644 (file)
index edcade1..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/gsub_chaining3_successive_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0019,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000:[0|25|20|61|63|24|0]
diff --git a/test/shaping/data/aots/tests/gsub_context1_boundary.tests b/test/shaping/data/aots/tests/gsub_context1_boundary.tests
deleted file mode 100644 (file)
index 9b11892..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-../fonts/gsub_context1_boundary_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|20|20|20|20|20|0]
-../fonts/gsub_context1_boundary_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|60|60|60|60|60|0]
diff --git a/test/shaping/data/aots/tests/gsub_context1_expansion.tests b/test/shaping/data/aots/tests/gsub_context1_expansion.tests
deleted file mode 100644 (file)
index 92714c5..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/gsub_context1_expansion_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0000:[0|20|61|62|63|22|0]
diff --git a/test/shaping/data/aots/tests/gsub_context1_lookupflag.tests b/test/shaping/data/aots/tests/gsub_context1_lookupflag.tests
deleted file mode 100644 (file)
index c5d9760..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-../fonts/gsub_context1_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+005A,U+0015,U+005B,U+005C,U+0016,U+0000:[0|60|90|61|91|92|62|0]
-../fonts/gsub_context1_lookupflag_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+005A,U+0015,U+005B,U+005C,U+0016,U+0000:[0|20|90|61|91|92|0]
diff --git a/test/shaping/data/aots/tests/gsub_context1_multiple_subrules.tests b/test/shaping/data/aots/tests/gsub_context1_multiple_subrules.tests
deleted file mode 100644 (file)
index febc419..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-../fonts/gsub_context1_multiple_subrules_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0000,U+0014,U+0015,U+0000:[0|60|21|22|0|20|61|0]
-../fonts/gsub_context1_multiple_subrules_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0000,U+0014,U+0015,U+0000:[0|20|61|22|0|20|61|0]
diff --git a/test/shaping/data/aots/tests/gsub_context1_next_glyph.tests b/test/shaping/data/aots/tests/gsub_context1_next_glyph.tests
deleted file mode 100644 (file)
index 12414c3..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/gsub_context1_next_glyph_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|60|20|60|20|20|0]
diff --git a/test/shaping/data/aots/tests/gsub_context1_simple.tests b/test/shaping/data/aots/tests/gsub_context1_simple.tests
deleted file mode 100644 (file)
index 44252ec..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-../fonts/gsub_context1_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0000:[0|60|61|62|0]
-../fonts/gsub_context1_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0000,U+0014,U+0015,U+0000:[0|20|0|20|21|0]
-../fonts/gsub_context1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|20|60|20|20|20|0]
diff --git a/test/shaping/data/aots/tests/gsub_context1_successive.tests b/test/shaping/data/aots/tests/gsub_context1_successive.tests
deleted file mode 100644 (file)
index e68d6b2..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/gsub_context1_successive_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|61|63|0]
diff --git a/test/shaping/data/aots/tests/gsub_context2_boundary.tests b/test/shaping/data/aots/tests/gsub_context2_boundary.tests
deleted file mode 100644 (file)
index 2054277..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-../fonts/gsub_context2_boundary_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|20|20|20|20|20|0]
-../fonts/gsub_context2_boundary_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|60|60|60|60|60|0]
diff --git a/test/shaping/data/aots/tests/gsub_context2_classes.tests b/test/shaping/data/aots/tests/gsub_context2_classes.tests
deleted file mode 100644 (file)
index 2e44007..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-../fonts/gsub_context2_classes_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+001A,U+001C,U+0018,U+0000,U+0015,U+001B,U+001A,U+0018,U+0000,U+0016,U+001B,U+001A,U+0018:[0|20|66|28|24|0|21|67|26|24|0|22|27|26|24]
-../fonts/gsub_context2_classes_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0016,U+001B,U+001A,U+0018,U+0000,U+0018,U+0018,U+001D,U+0016,U+0000,U+0016,U+001B,U+001A,U+0018:[0|22|67|26|24|0|24|24|69|22|0|22|67|26|24]
diff --git a/test/shaping/data/aots/tests/gsub_context2_expansion.tests b/test/shaping/data/aots/tests/gsub_context2_expansion.tests
deleted file mode 100644 (file)
index af0ce71..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/gsub_context2_expansion_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0000:[0|20|61|62|63|22|0]
diff --git a/test/shaping/data/aots/tests/gsub_context2_lookupflag.tests b/test/shaping/data/aots/tests/gsub_context2_lookupflag.tests
deleted file mode 100644 (file)
index ac41949..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-../fonts/gsub_context2_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+005A,U+0015,U+005B,U+005C,U+0016,U+0000:[0|60|90|61|91|92|62|0]
-../fonts/gsub_context2_lookupflag_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+005A,U+0015,U+005B,U+005C,U+0016,U+0000:[0|20|90|61|91|92|0]
diff --git a/test/shaping/data/aots/tests/gsub_context2_multiple_subrules.tests b/test/shaping/data/aots/tests/gsub_context2_multiple_subrules.tests
deleted file mode 100644 (file)
index 75225cd..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-../fonts/gsub_context2_multiple_subrules_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0000,U+0014,U+0015,U+0000:[0|60|21|22|0|20|61|0]
-../fonts/gsub_context2_multiple_subrules_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0000,U+0014,U+0015,U+0000:[0|20|61|22|0|20|61|0]
diff --git a/test/shaping/data/aots/tests/gsub_context2_next_glyph.tests b/test/shaping/data/aots/tests/gsub_context2_next_glyph.tests
deleted file mode 100644 (file)
index 020d05f..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/gsub_context2_next_glyph_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|60|20|60|20|20|0]
diff --git a/test/shaping/data/aots/tests/gsub_context2_simple.tests b/test/shaping/data/aots/tests/gsub_context2_simple.tests
deleted file mode 100644 (file)
index 5863605..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-../fonts/gsub_context2_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0000:[0|60|61|62|0]
-../fonts/gsub_context2_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0000,U+0014,U+0015,U+0000:[0|20|0|20|21|0]
-../fonts/gsub_context2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|20|60|20|20|20|0]
diff --git a/test/shaping/data/aots/tests/gsub_context2_successive.tests b/test/shaping/data/aots/tests/gsub_context2_successive.tests
deleted file mode 100644 (file)
index 9aeeac7..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/gsub_context2_successive_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|61|63|0]
diff --git a/test/shaping/data/aots/tests/gsub_context3_boundary.tests b/test/shaping/data/aots/tests/gsub_context3_boundary.tests
deleted file mode 100644 (file)
index 8b40afd..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-../fonts/gsub_context3_boundary_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|20|20|20|20|20|0]
-../fonts/gsub_context3_boundary_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|60|60|60|60|60|0]
diff --git a/test/shaping/data/aots/tests/gsub_context3_lookupflag.tests b/test/shaping/data/aots/tests/gsub_context3_lookupflag.tests
deleted file mode 100644 (file)
index 03c0647..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-../fonts/gsub_context3_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+005A,U+0015,U+005B,U+005C,U+0016,U+0000:[0|60|90|61|91|92|62|0]
-../fonts/gsub_context3_lookupflag_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+005A,U+0015,U+005B,U+005C,U+0016,U+0000:[0|20|90|61|91|92|0]
diff --git a/test/shaping/data/aots/tests/gsub_context3_next_glyph.tests b/test/shaping/data/aots/tests/gsub_context3_next_glyph.tests
deleted file mode 100644 (file)
index b28381b..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/gsub_context3_next_glyph_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|60|20|60|20|20|0]
diff --git a/test/shaping/data/aots/tests/gsub_context3_simple.tests b/test/shaping/data/aots/tests/gsub_context3_simple.tests
deleted file mode 100644 (file)
index ec264ea..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-../fonts/gsub_context3_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0000:[0|60|61|62|0]
-../fonts/gsub_context3_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0000,U+0014,U+0015,U+0000,U+0014,U+0015,U+0016,U+0000:[0|20|0|20|21|0|60|61|62|0]
diff --git a/test/shaping/data/aots/tests/gsub_context3_successive.tests b/test/shaping/data/aots/tests/gsub_context3_successive.tests
deleted file mode 100644 (file)
index b987a61..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/gsub_context3_successive_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|61|63|0]
diff --git a/test/shaping/data/aots/tests/lookupflag_ignore_attach.tests b/test/shaping/data/aots/tests/lookupflag_ignore_attach.tests
deleted file mode 100644 (file)
index 55ae538..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-#../fonts/lookupflag_ignore_attach_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+000A,U+000B,U+000D,U+001A,U+000A:[10|15|10]
-#../fonts/lookupflag_ignore_attach_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+000A,U+000B,U+0015,U+000D,U+0016,U+0017,U+001D,U+001A,U+000A:[10|15|21|22|23|29|10]
-#../fonts/lookupflag_ignore_attach_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+000A,U+000B,U+0015,U+000D,U+0016,U+001B,U+001A,U+000A:[10|11|21|13|22|27|26|10]
-#../fonts/lookupflag_ignore_attach_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+000A,U+000B,U+001B,U+000D,U+0016,U+0017,U+001A,U+000A:[10|11|27|13|22|23|26|10]
-#../fonts/lookupflag_ignore_attach_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+000A,U+000B,U+001B,U+000D,U+000E,U+0017,U+001A,U+000A:[10|11|27|13|14|23|26|10]
diff --git a/test/shaping/data/aots/tests/lookupflag_ignore_base.tests b/test/shaping/data/aots/tests/lookupflag_ignore_base.tests
deleted file mode 100644 (file)
index 5f0bfdb..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-../fonts/lookupflag_ignore_base_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0015:[17|23|21]
-../fonts/lookupflag_ignore_base_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0018,U+0018,U+0013,U+0019,U+0014,U+0015:[17|23|24|24|25|21]
diff --git a/test/shaping/data/aots/tests/lookupflag_ignore_combination.tests b/test/shaping/data/aots/tests/lookupflag_ignore_combination.tests
deleted file mode 100644 (file)
index d34f16a..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-../fonts/lookupflag_ignore_combination_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+001A,U+0013,U+0014,U+0015:[17|23|26|21]
-../fonts/lookupflag_ignore_combination_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+001A,U+0013,U+0018,U+001E,U+001F,U+0014,U+0015:[17|23|26|24|30|31|21]
-../fonts/lookupflag_ignore_combination_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+001A,U+0013,U+0018,U+001E,U+0020,U+0014,U+0015:[17|18|26|19|24|30|32|20|21]
diff --git a/test/shaping/data/aots/tests/lookupflag_ignore_ligatures.tests b/test/shaping/data/aots/tests/lookupflag_ignore_ligatures.tests
deleted file mode 100644 (file)
index feb31d8..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-../fonts/lookupflag_ignore_ligatures_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+001A,U+001B,U+0013,U+001B,U+0014,U+0015:[17|23|26|27|27|21]
-../fonts/lookupflag_ignore_ligatures_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+001A,U+0018,U+0013,U+001B,U+0014,U+0015:[17|18|26|24|19|27|20|21]
-../fonts/lookupflag_ignore_ligatures_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+001A,U+002A,U+0013,U+001B,U+0014,U+0015:[17|18|26|42|19|27|20|21]
diff --git a/test/shaping/data/aots/tests/lookupflag_ignore_marks.tests b/test/shaping/data/aots/tests/lookupflag_ignore_marks.tests
deleted file mode 100644 (file)
index 9626599..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/lookupflag_ignore_marks_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+001C,U+001D,U+0013,U+001D,U+0014,U+0015:[17|23|28|29|29|21]
diff --git a/test/shaping/data/aots/update.py b/test/shaping/data/aots/update.py
deleted file mode 100755 (executable)
index 8446df7..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/usr/bin/env python3
-
-import sys, os, subprocess, shutil
-
-os.chdir (os.environ.get ('srcdir', os.path.dirname (__file__)))
-
-git = shutil.which ('git'); assert git
-make = shutil.which ('make'); assert make
-java = shutil.which ('java'); assert java
-gcc = shutil.which ('gcc'); assert gcc
-
-pull = False
-if not os.path.exists ('aots'):
-       subprocess.run ([git, 'clone', 'https://github.com/adobe-type-tools/aots'], check=True)
-       pull = True
-
-if pull or 'pull' in sys.argv:
-       subprocess.run ([git, 'pull'], cwd='aots', check=True)
-       subprocess.run ([make, '-C', 'aots'], check=True)
-       subprocess.run ([make, '-C', 'aots/harfbuzz'], check=True)
-
-shutil.copy ('hb-aots-tester.cpp', 'aots/harfbuzz')
-# TODO: remove *nix assumptions
-subprocess.run ([gcc, '-Wno-narrowing', 'aots/harfbuzz/hb-aots-tester.cpp',
-       '../../../../src/harfbuzz.cc', '-DHB_NO_MT', '-fno-exceptions', '-lm',
-       '-I../../../../src', '-o', 'aots/harfbuzz/aots'], check=True)
-shutil.rmtree ('tests')
-os.mkdir ('tests')
-subprocess.run (['./aots'], cwd='aots/harfbuzz', check=True)
diff --git a/test/shaping/data/in-house/Makefile.am b/test/shaping/data/in-house/Makefile.am
deleted file mode 100644 (file)
index 8a2a076..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-# Process this file with automake to produce Makefile.in
-
-NULL =
-
-# Convenience targets:
-lib:
-       @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
-
-EXTRA_DIST = \
-       COPYING \
-       fonts \
-       $(TESTS) \
-       $(NULL)
-
-TEST_EXTENSIONS = .tests
-TESTS_LOG_COMPILER = $(srcdir)/../../run-tests.py $(top_builddir)/util/hb-shape$(EXEEXT)
-
-include Makefile.sources
-
--include $(top_srcdir)/git.mk
diff --git a/test/shaping/data/in-house/Makefile.in b/test/shaping/data/in-house/Makefile.in
deleted file mode 100644 (file)
index a58d36d..0000000
+++ /dev/null
@@ -1,934 +0,0 @@
-# Makefile.in generated by automake 1.16.2 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994-2020 Free Software Foundation, Inc.
-
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-# Process this file with automake to produce Makefile.in
-VPATH = @srcdir@
-am__is_gnu_make = { \
-  if test -z '$(MAKELEVEL)'; then \
-    false; \
-  elif test -n '$(MAKE_HOST)'; then \
-    true; \
-  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
-    true; \
-  else \
-    false; \
-  fi; \
-}
-am__make_running_with_option = \
-  case $${target_option-} in \
-      ?) ;; \
-      *) echo "am__make_running_with_option: internal error: invalid" \
-              "target option '$${target_option-}' specified" >&2; \
-         exit 1;; \
-  esac; \
-  has_opt=no; \
-  sane_makeflags=$$MAKEFLAGS; \
-  if $(am__is_gnu_make); then \
-    sane_makeflags=$$MFLAGS; \
-  else \
-    case $$MAKEFLAGS in \
-      *\\[\ \  ]*) \
-        bs=\\; \
-        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
-          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
-    esac; \
-  fi; \
-  skip_next=no; \
-  strip_trailopt () \
-  { \
-    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
-  }; \
-  for flg in $$sane_makeflags; do \
-    test $$skip_next = yes && { skip_next=no; continue; }; \
-    case $$flg in \
-      *=*|--*) continue;; \
-        -*I) strip_trailopt 'I'; skip_next=yes;; \
-      -*I?*) strip_trailopt 'I';; \
-        -*O) strip_trailopt 'O'; skip_next=yes;; \
-      -*O?*) strip_trailopt 'O';; \
-        -*l) strip_trailopt 'l'; skip_next=yes;; \
-      -*l?*) strip_trailopt 'l';; \
-      -[dEDm]) skip_next=yes;; \
-      -[JT]) skip_next=yes;; \
-    esac; \
-    case $$flg in \
-      *$$target_option*) has_opt=yes; break;; \
-    esac; \
-  done; \
-  test $$has_opt = yes
-am__make_dryrun = (target_option=n; $(am__make_running_with_option))
-am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-TESTS = tests/aat-trak.tests tests/aat-morx.tests \
-       tests/arabic-fallback-shaping.tests \
-       tests/arabic-feature-order.tests \
-       tests/arabic-like-joining.tests tests/arabic-mark-attach.tests \
-       tests/arabic-mark-order.tests tests/arabic-stch.tests \
-       tests/automatic-fractions.tests tests/cluster.tests \
-       tests/collections.tests tests/color-fonts.tests \
-       tests/context-matching.tests tests/cursive-positioning.tests \
-       tests/default-ignorables.tests tests/emoji.tests \
-       tests/fallback-positioning.tests tests/hangul-jamo.tests \
-       tests/hyphens.tests tests/indic-consonant-with-stacker.tests \
-       tests/indic-decompose.tests tests/indic-init.tests \
-       tests/indic-joiner-candrabindu.tests tests/indic-joiners.tests \
-       tests/indic-old-spec.tests tests/indic-pref-blocking.tests \
-       tests/indic-script-extensions.tests \
-       tests/indic-special-cases.tests tests/indic-syllable.tests \
-       tests/indic-vowel-letter-spoofing.tests \
-       tests/kern-format2.tests tests/khmer-mark-order.tests \
-       tests/khmer-misc.tests tests/language-tags.tests \
-       tests/ligature-id.tests tests/macos.tests \
-       tests/mark-attachment.tests tests/mark-filtering-sets.tests \
-       tests/mongolian-variation-selector.tests \
-       tests/myanmar-syllable.tests tests/myanmar-zawgyi.tests \
-       tests/none-directional.tests tests/positioning-features.tests \
-       tests/rand.tests tests/rotation.tests tests/spaces.tests \
-       tests/simple.tests tests/sinhala.tests \
-       tests/tibetan-contractions-1.tests \
-       tests/tibetan-contractions-2.tests tests/tibetan-vowels.tests \
-       tests/use.tests tests/use-indic3.tests tests/use-marchen.tests \
-       tests/use-syllable.tests tests/variations-rvrn.tests \
-       tests/vertical.tests tests/zero-width-marks.tests \
-       $(am__EXEEXT_1)
-subdir = test/shaping/data/in-house
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_link_flag.m4 \
-       $(top_srcdir)/m4/ax_code_coverage.m4 \
-       $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \
-       $(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/gtk-doc.m4 \
-       $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
-       $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
-       $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-       $(ACLOCAL_M4)
-DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-AM_V_P = $(am__v_P_@AM_V@)
-am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
-am__v_P_0 = false
-am__v_P_1 = :
-AM_V_GEN = $(am__v_GEN_@AM_V@)
-am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
-am__v_GEN_0 = @echo "  GEN     " $@;
-am__v_GEN_1 = 
-AM_V_at = $(am__v_at_@AM_V@)
-am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
-am__v_at_0 = @
-am__v_at_1 = 
-SOURCES =
-DIST_SOURCES =
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
-am__tty_colors_dummy = \
-  mgn= red= grn= lgn= blu= brg= std=; \
-  am__color_tests=no
-am__tty_colors = { \
-  $(am__tty_colors_dummy); \
-  if test "X$(AM_COLOR_TESTS)" = Xno; then \
-    am__color_tests=no; \
-  elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
-    am__color_tests=yes; \
-  elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
-    am__color_tests=yes; \
-  fi; \
-  if test $$am__color_tests = yes; then \
-    red='\e[0;31m'; \
-    grn='\e[0;32m'; \
-    lgn='\e[1;32m'; \
-    blu='\e[1;34m'; \
-    mgn='\e[0;35m'; \
-    brg='\e[1m'; \
-    std='\e[m'; \
-  fi; \
-}
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
-  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
-  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
-  for p in $$list; do echo "$$p $$p"; done | \
-  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
-  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
-    if (++n[$$2] == $(am__install_max)) \
-      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
-    END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
-  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
-  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
-  test -z "$$files" \
-    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
-    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
-         $(am__cd) "$$dir" && rm -f $$files; }; \
-  }
-am__recheck_rx = ^[    ]*:recheck:[    ]*
-am__global_test_result_rx = ^[         ]*:global-test-result:[         ]*
-am__copy_in_global_log_rx = ^[         ]*:copy-in-global-log:[         ]*
-# A command that, given a newline-separated list of test names on the
-# standard input, print the name of the tests that are to be re-run
-# upon "make recheck".
-am__list_recheck_tests = $(AWK) '{ \
-  recheck = 1; \
-  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
-    { \
-      if (rc < 0) \
-        { \
-          if ((getline line2 < ($$0 ".log")) < 0) \
-           recheck = 0; \
-          break; \
-        } \
-      else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
-        { \
-          recheck = 0; \
-          break; \
-        } \
-      else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
-        { \
-          break; \
-        } \
-    }; \
-  if (recheck) \
-    print $$0; \
-  close ($$0 ".trs"); \
-  close ($$0 ".log"); \
-}'
-# A command that, given a newline-separated list of test names on the
-# standard input, create the global log from their .trs and .log files.
-am__create_global_log = $(AWK) ' \
-function fatal(msg) \
-{ \
-  print "fatal: making $@: " msg | "cat >&2"; \
-  exit 1; \
-} \
-function rst_section(header) \
-{ \
-  print header; \
-  len = length(header); \
-  for (i = 1; i <= len; i = i + 1) \
-    printf "="; \
-  printf "\n\n"; \
-} \
-{ \
-  copy_in_global_log = 1; \
-  global_test_result = "RUN"; \
-  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
-    { \
-      if (rc < 0) \
-         fatal("failed to read from " $$0 ".trs"); \
-      if (line ~ /$(am__global_test_result_rx)/) \
-        { \
-          sub("$(am__global_test_result_rx)", "", line); \
-          sub("[       ]*$$", "", line); \
-          global_test_result = line; \
-        } \
-      else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
-        copy_in_global_log = 0; \
-    }; \
-  if (copy_in_global_log) \
-    { \
-      rst_section(global_test_result ": " $$0); \
-      while ((rc = (getline line < ($$0 ".log"))) != 0) \
-      { \
-        if (rc < 0) \
-          fatal("failed to read from " $$0 ".log"); \
-        print line; \
-      }; \
-      printf "\n"; \
-    }; \
-  close ($$0 ".trs"); \
-  close ($$0 ".log"); \
-}'
-# Restructured Text title.
-am__rst_title = { sed 's/.*/   &   /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
-# Solaris 10 'make', and several other traditional 'make' implementations,
-# pass "-e" to $(SHELL), and POSIX 2008 even requires this.  Work around it
-# by disabling -e (using the XSI extension "set +e") if it's set.
-am__sh_e_setup = case $$- in *e*) set +e;; esac
-# Default flags passed to test drivers.
-am__common_driver_flags = \
-  --color-tests "$$am__color_tests" \
-  --enable-hard-errors "$$am__enable_hard_errors" \
-  --expect-failure "$$am__expect_failure"
-# To be inserted before the command running the test.  Creates the
-# directory for the log if needed.  Stores in $dir the directory
-# containing $f, in $tst the test, in $log the log.  Executes the
-# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
-# passes TESTS_ENVIRONMENT.  Set up options for the wrapper that
-# will run the test scripts (or their associated LOG_COMPILER, if
-# thy have one).
-am__check_pre = \
-$(am__sh_e_setup);                                     \
-$(am__vpath_adj_setup) $(am__vpath_adj)                        \
-$(am__tty_colors);                                     \
-srcdir=$(srcdir); export srcdir;                       \
-case "$@" in                                           \
-  */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;;   \
-    *) am__odir=.;;                                    \
-esac;                                                  \
-test "x$$am__odir" = x"." || test -d "$$am__odir"      \
-  || $(MKDIR_P) "$$am__odir" || exit $$?;              \
-if test -f "./$$f"; then dir=./;                       \
-elif test -f "$$f"; then dir=;                         \
-else dir="$(srcdir)/"; fi;                             \
-tst=$$dir$$f; log='$@';                                \
-if test -n '$(DISABLE_HARD_ERRORS)'; then              \
-  am__enable_hard_errors=no;                           \
-else                                                   \
-  am__enable_hard_errors=yes;                          \
-fi;                                                    \
-case " $(XFAIL_TESTS) " in                             \
-  *[\ \        ]$$f[\ \        ]* | *[\ \      ]$$dir$$f[\ \   ]*) \
-    am__expect_failure=yes;;                           \
-  *)                                                   \
-    am__expect_failure=no;;                            \
-esac;                                                  \
-$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
-# A shell command to get the names of the tests scripts with any registered
-# extension removed (i.e., equivalently, the names of the test logs, with
-# the '.log' extension removed).  The result is saved in the shell variable
-# '$bases'.  This honors runtime overriding of TESTS and TEST_LOGS.  Sadly,
-# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
-# since that might cause problem with VPATH rewrites for suffix-less tests.
-# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
-am__set_TESTS_bases = \
-  bases='$(TEST_LOGS)'; \
-  bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
-  bases=`echo $$bases`
-RECHECK_LOGS = $(TEST_LOGS)
-AM_RECURSIVE_TARGETS = check recheck
-am__EXEEXT_1 =
-TEST_SUITE_LOG = test-suite.log
-am__test_logs1 = $(TESTS:=.log)
-am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
-TEST_LOGS = $(am__test_logs2:.tests.log=.log)
-TESTS_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
-TESTS_LOG_COMPILE = $(TESTS_LOG_COMPILER) $(AM_TESTS_LOG_FLAGS) \
-       $(TESTS_LOG_FLAGS)
-am__set_b = \
-  case '$@' in \
-    */*) \
-      case '$*' in \
-        */*) b='$*';; \
-          *) b=`echo '$@' | sed 's/\.log$$//'`; \
-       esac;; \
-    *) \
-      b='$*';; \
-  esac
-am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.sources \
-       $(top_srcdir)/test-driver COPYING
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CAIRO_CFLAGS = @CAIRO_CFLAGS@
-CAIRO_FT_CFLAGS = @CAIRO_FT_CFLAGS@
-CAIRO_FT_LIBS = @CAIRO_FT_LIBS@
-CAIRO_LIBS = @CAIRO_LIBS@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
-CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
-CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
-CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
-CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
-CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
-CORETEXT_CFLAGS = @CORETEXT_CFLAGS@
-CORETEXT_LIBS = @CORETEXT_LIBS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DIRECTWRITE_CXXFLAGS = @DIRECTWRITE_CXXFLAGS@
-DIRECTWRITE_LIBS = @DIRECTWRITE_LIBS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-FGREP = @FGREP@
-FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@
-FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
-FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
-FREETYPE_DEPS = @FREETYPE_DEPS@
-FREETYPE_LIBS = @FREETYPE_LIBS@
-GCOV = @GCOV@
-GDI_CFLAGS = @GDI_CFLAGS@
-GDI_LIBS = @GDI_LIBS@
-GENHTML = @GENHTML@
-GIT = @GIT@
-GLIB_CFLAGS = @GLIB_CFLAGS@
-GLIB_DEPS = @GLIB_DEPS@
-GLIB_LIBS = @GLIB_LIBS@
-GLIB_MKENUMS = @GLIB_MKENUMS@
-GOBJECT_CFLAGS = @GOBJECT_CFLAGS@
-GOBJECT_LIBS = @GOBJECT_LIBS@
-GRAPHITE2_CFLAGS = @GRAPHITE2_CFLAGS@
-GRAPHITE2_DEPS = @GRAPHITE2_DEPS@
-GRAPHITE2_LIBS = @GRAPHITE2_LIBS@
-GREP = @GREP@
-GTKDOC_CHECK = @GTKDOC_CHECK@
-GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@
-GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
-GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
-GTKDOC_MKPDF = @GTKDOC_MKPDF@
-GTKDOC_REBASE = @GTKDOC_REBASE@
-HAVE_CXX11 = @HAVE_CXX11@
-HB_LIBTOOL_VERSION_INFO = @HB_LIBTOOL_VERSION_INFO@
-HB_VERSION = @HB_VERSION@
-HB_VERSION_MAJOR = @HB_VERSION_MAJOR@
-HB_VERSION_MICRO = @HB_VERSION_MICRO@
-HB_VERSION_MINOR = @HB_VERSION_MINOR@
-HTML_DIR = @HTML_DIR@
-ICU_CFLAGS = @ICU_CFLAGS@
-ICU_CONFIG = @ICU_CONFIG@
-ICU_LIBS = @ICU_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
-INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
-INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
-INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
-INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
-INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
-INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
-INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
-LCOV = @LCOV@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MKDIR_P = @MKDIR_P@
-NM = @NM@
-NMEDIT = @NMEDIT@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PKG_CONFIG = @PKG_CONFIG@
-PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
-PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
-PTHREAD_CC = @PTHREAD_CC@
-PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
-PTHREAD_LIBS = @PTHREAD_LIBS@
-RAGEL = @RAGEL@
-RANLIB = @RANLIB@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-UNISCRIBE_CFLAGS = @UNISCRIBE_CFLAGS@
-UNISCRIBE_LIBS = @UNISCRIBE_LIBS@
-VERSION = @VERSION@
-_GI_EXP_DATADIR = @_GI_EXP_DATADIR@
-_GI_EXP_LIBDIR = @_GI_EXP_LIBDIR@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-ax_pthread_config = @ax_pthread_config@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-have_gobject = @have_gobject@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-NULL = 
-EXTRA_DIST = \
-       COPYING \
-       fonts \
-       $(TESTS) \
-       $(NULL)
-
-TEST_EXTENSIONS = .tests
-TESTS_LOG_COMPILER = $(srcdir)/../../run-tests.py $(top_builddir)/util/hb-shape$(EXEEXT)
-DISABLED_TESTS = \
-       $(NULL)
-
-all: all-am
-
-.SUFFIXES:
-.SUFFIXES: .log .tests .tests$(EXEEXT) .trs
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am $(srcdir)/Makefile.sources $(am__configure_deps)
-       @for dep in $?; do \
-         case '$(am__configure_deps)' in \
-           *$$dep*) \
-             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-               && { if test -f $@; then exit 0; else break; fi; }; \
-             exit 1;; \
-         esac; \
-       done; \
-       echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits test/shaping/data/in-house/Makefile'; \
-       $(am__cd) $(top_srcdir) && \
-         $(AUTOMAKE) --gnits test/shaping/data/in-house/Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-       @case '$?' in \
-         *config.status*) \
-           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-         *) \
-           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
-           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
-       esac;
-$(srcdir)/Makefile.sources $(am__empty):
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
-       -rm -f *.lo
-
-clean-libtool:
-       -rm -rf .libs _libs
-tags TAGS:
-
-ctags CTAGS:
-
-cscope cscopelist:
-
-
-# Recover from deleted '.trs' file; this should ensure that
-# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
-# both 'foo.log' and 'foo.trs'.  Break the recipe in two subshells
-# to avoid problems with "make -n".
-.log.trs:
-       rm -f $< $@
-       $(MAKE) $(AM_MAKEFLAGS) $<
-
-# Leading 'am--fnord' is there to ensure the list of targets does not
-# expand to empty, as could happen e.g. with make check TESTS=''.
-am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
-am--force-recheck:
-       @:
-
-$(TEST_SUITE_LOG): $(TEST_LOGS)
-       @$(am__set_TESTS_bases); \
-       am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
-       redo_bases=`for i in $$bases; do \
-                     am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
-                   done`; \
-       if test -n "$$redo_bases"; then \
-         redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
-         redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
-         if $(am__make_dryrun); then :; else \
-           rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
-         fi; \
-       fi; \
-       if test -n "$$am__remaking_logs"; then \
-         echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
-              "recursion detected" >&2; \
-       elif test -n "$$redo_logs"; then \
-         am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
-       fi; \
-       if $(am__make_dryrun); then :; else \
-         st=0;  \
-         errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
-         for i in $$redo_bases; do \
-           test -f $$i.trs && test -r $$i.trs \
-             || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
-           test -f $$i.log && test -r $$i.log \
-             || { echo "$$errmsg $$i.log" >&2; st=1; }; \
-         done; \
-         test $$st -eq 0 || exit 1; \
-       fi
-       @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
-       ws='[   ]'; \
-       results=`for b in $$bases; do echo $$b.trs; done`; \
-       test -n "$$results" || results=/dev/null; \
-       all=`  grep "^$$ws*:test-result:"           $$results | wc -l`; \
-       pass=` grep "^$$ws*:test-result:$$ws*PASS"  $$results | wc -l`; \
-       fail=` grep "^$$ws*:test-result:$$ws*FAIL"  $$results | wc -l`; \
-       skip=` grep "^$$ws*:test-result:$$ws*SKIP"  $$results | wc -l`; \
-       xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
-       xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
-       error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
-       if test `expr $$fail + $$xpass + $$error` -eq 0; then \
-         success=true; \
-       else \
-         success=false; \
-       fi; \
-       br='==================='; br=$$br$$br$$br$$br; \
-       result_count () \
-       { \
-           if test x"$$1" = x"--maybe-color"; then \
-             maybe_colorize=yes; \
-           elif test x"$$1" = x"--no-color"; then \
-             maybe_colorize=no; \
-           else \
-             echo "$@: invalid 'result_count' usage" >&2; exit 4; \
-           fi; \
-           shift; \
-           desc=$$1 count=$$2; \
-           if test $$maybe_colorize = yes && test $$count -gt 0; then \
-             color_start=$$3 color_end=$$std; \
-           else \
-             color_start= color_end=; \
-           fi; \
-           echo "$${color_start}# $$desc $$count$${color_end}"; \
-       }; \
-       create_testsuite_report () \
-       { \
-         result_count $$1 "TOTAL:" $$all   "$$brg"; \
-         result_count $$1 "PASS: " $$pass  "$$grn"; \
-         result_count $$1 "SKIP: " $$skip  "$$blu"; \
-         result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
-         result_count $$1 "FAIL: " $$fail  "$$red"; \
-         result_count $$1 "XPASS:" $$xpass "$$red"; \
-         result_count $$1 "ERROR:" $$error "$$mgn"; \
-       }; \
-       {                                                               \
-         echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" |       \
-           $(am__rst_title);                                           \
-         create_testsuite_report --no-color;                           \
-         echo;                                                         \
-         echo ".. contents:: :depth: 2";                               \
-         echo;                                                         \
-         for b in $$bases; do echo $$b; done                           \
-           | $(am__create_global_log);                                 \
-       } >$(TEST_SUITE_LOG).tmp || exit 1;                             \
-       mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG);                     \
-       if $$success; then                                              \
-         col="$$grn";                                                  \
-        else                                                           \
-         col="$$red";                                                  \
-         test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG);               \
-       fi;                                                             \
-       echo "$${col}$$br$${std}";                                      \
-       echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}";   \
-       echo "$${col}$$br$${std}";                                      \
-       create_testsuite_report --maybe-color;                          \
-       echo "$$col$$br$$std";                                          \
-       if $$success; then :; else                                      \
-         echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}";         \
-         if test -n "$(PACKAGE_BUGREPORT)"; then                       \
-           echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
-         fi;                                                           \
-         echo "$$col$$br$$std";                                        \
-       fi;                                                             \
-       $$success || exit 1
-
-check-TESTS: 
-       @list='$(RECHECK_LOGS)';           test -z "$$list" || rm -f $$list
-       @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
-       @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
-       @set +e; $(am__set_TESTS_bases); \
-       log_list=`for i in $$bases; do echo $$i.log; done`; \
-       trs_list=`for i in $$bases; do echo $$i.trs; done`; \
-       log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
-       $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
-       exit $$?;
-recheck: all 
-       @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
-       @set +e; $(am__set_TESTS_bases); \
-       bases=`for i in $$bases; do echo $$i; done \
-                | $(am__list_recheck_tests)` || exit 1; \
-       log_list=`for i in $$bases; do echo $$i.log; done`; \
-       log_list=`echo $$log_list`; \
-       $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
-               am__force_recheck=am--force-recheck \
-               TEST_LOGS="$$log_list"; \
-       exit $$?
-.tests.log:
-       @p='$<'; \
-       $(am__set_b); \
-       $(am__check_pre) $(TESTS_LOG_DRIVER) --test-name "$$f" \
-       --log-file $$b.log --trs-file $$b.trs \
-       $(am__common_driver_flags) $(AM_TESTS_LOG_DRIVER_FLAGS) $(TESTS_LOG_DRIVER_FLAGS) -- $(TESTS_LOG_COMPILE) \
-       "$$tst" $(AM_TESTS_FD_REDIRECT)
-@am__EXEEXT_TRUE@.tests$(EXEEXT).log:
-@am__EXEEXT_TRUE@      @p='$<'; \
-@am__EXEEXT_TRUE@      $(am__set_b); \
-@am__EXEEXT_TRUE@      $(am__check_pre) $(TESTS_LOG_DRIVER) --test-name "$$f" \
-@am__EXEEXT_TRUE@      --log-file $$b.log --trs-file $$b.trs \
-@am__EXEEXT_TRUE@      $(am__common_driver_flags) $(AM_TESTS_LOG_DRIVER_FLAGS) $(TESTS_LOG_DRIVER_FLAGS) -- $(TESTS_LOG_COMPILE) \
-@am__EXEEXT_TRUE@      "$$tst" $(AM_TESTS_FD_REDIRECT)
-
-distdir: $(BUILT_SOURCES)
-       $(MAKE) $(AM_MAKEFLAGS) distdir-am
-
-distdir-am: $(DISTFILES)
-       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-       list='$(DISTFILES)'; \
-         dist_files=`for file in $$list; do echo $$file; done | \
-         sed -e "s|^$$srcdirstrip/||;t" \
-             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-       case $$dist_files in \
-         */*) $(MKDIR_P) `echo "$$dist_files" | \
-                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-                          sort -u` ;; \
-       esac; \
-       for file in $$dist_files; do \
-         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-         if test -d $$d/$$file; then \
-           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-           if test -d "$(distdir)/$$file"; then \
-             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-           fi; \
-           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-           fi; \
-           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-         else \
-           test -f "$(distdir)/$$file" \
-           || cp -p $$d/$$file "$(distdir)/$$file" \
-           || exit 1; \
-         fi; \
-       done
-check-am: all-am
-       $(MAKE) $(AM_MAKEFLAGS) check-TESTS
-check: check-am
-all-am: Makefile
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-       if test -z '$(STRIP)'; then \
-         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-             install; \
-       else \
-         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-       fi
-mostlyclean-generic:
-       -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
-       -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
-       -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
-
-clean-generic:
-
-distclean-generic:
-       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-       @echo "This command is intended for maintainers to use"
-       @echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
-       -rm -f Makefile
-distclean-am: clean-am distclean-generic
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-       -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: check-am install-am install-strip
-
-.PHONY: all all-am check check-TESTS check-am clean clean-generic \
-       clean-libtool cscopelist-am ctags-am distclean \
-       distclean-generic distclean-libtool distdir dvi dvi-am html \
-       html-am info info-am install install-am install-data \
-       install-data-am install-dvi install-dvi-am install-exec \
-       install-exec-am install-html install-html-am install-info \
-       install-info-am install-man install-pdf install-pdf-am \
-       install-ps install-ps-am install-strip installcheck \
-       installcheck-am installdirs maintainer-clean \
-       maintainer-clean-generic mostlyclean mostlyclean-generic \
-       mostlyclean-libtool pdf pdf-am ps ps-am recheck tags-am \
-       uninstall uninstall-am
-
-.PRECIOUS: Makefile
-
-
-# Convenience targets:
-lib:
-       @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
-
--include $(top_srcdir)/git.mk
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/test/shaping/data/in-house/Makefile.sources b/test/shaping/data/in-house/Makefile.sources
deleted file mode 100644 (file)
index 3c1b48e..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-TESTS = \
-       tests/aat-trak.tests \
-       tests/aat-morx.tests \
-       tests/arabic-fallback-shaping.tests \
-       tests/arabic-feature-order.tests \
-       tests/arabic-like-joining.tests \
-       tests/arabic-mark-attach.tests \
-       tests/arabic-mark-order.tests \
-       tests/arabic-stch.tests \
-       tests/automatic-fractions.tests \
-       tests/cluster.tests \
-       tests/collections.tests \
-       tests/color-fonts.tests \
-       tests/context-matching.tests \
-       tests/cursive-positioning.tests \
-       tests/default-ignorables.tests \
-       tests/emoji.tests \
-       tests/fallback-positioning.tests \
-       tests/hangul-jamo.tests \
-       tests/hyphens.tests \
-       tests/indic-consonant-with-stacker.tests \
-       tests/indic-decompose.tests \
-       tests/indic-init.tests \
-       tests/indic-joiner-candrabindu.tests \
-       tests/indic-joiners.tests \
-       tests/indic-old-spec.tests \
-       tests/indic-pref-blocking.tests \
-       tests/indic-script-extensions.tests \
-       tests/indic-special-cases.tests \
-       tests/indic-syllable.tests \
-       tests/indic-vowel-letter-spoofing.tests \
-       tests/kern-format2.tests \
-       tests/khmer-mark-order.tests \
-       tests/khmer-misc.tests \
-       tests/language-tags.tests \
-       tests/ligature-id.tests \
-       tests/macos.tests \
-       tests/mark-attachment.tests \
-       tests/mark-filtering-sets.tests \
-       tests/mongolian-variation-selector.tests \
-       tests/myanmar-syllable.tests \
-       tests/myanmar-zawgyi.tests \
-       tests/none-directional.tests \
-       tests/positioning-features.tests \
-       tests/rand.tests \
-       tests/rotation.tests \
-       tests/spaces.tests \
-       tests/simple.tests \
-       tests/sinhala.tests \
-       tests/tibetan-contractions-1.tests \
-       tests/tibetan-contractions-2.tests \
-       tests/tibetan-vowels.tests \
-       tests/use.tests \
-       tests/use-indic3.tests \
-       tests/use-marchen.tests \
-       tests/use-syllable.tests \
-       tests/variations-rvrn.tests \
-       tests/vertical.tests \
-       tests/zero-width-marks.tests \
-       $(NULL)
-
-DISABLED_TESTS = \
-       $(NULL)
diff --git a/test/shaping/data/in-house/tests/aat-morx.tests b/test/shaping/data/in-house/tests/aat-morx.tests
deleted file mode 100644 (file)
index 27f5bcc..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/MORXTwentyeight.ttf::U+0041,U+0078,U+0045,U+0079,U+0044,U+0079,U+0079:[A_E_D=0+1394|x=0+529|y=0+510|y=5+510|y=6+510]
diff --git a/test/shaping/data/in-house/tests/aat-trak.tests b/test/shaping/data/in-house/tests/aat-trak.tests
deleted file mode 100644 (file)
index 6da3ba8..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-../fonts/TRAK.ttf::U+0041,U+0042,U+0043:[A.alt=0+1000|B=1+1000|C.alt=2+1000]
-../fonts/TRAK.ttf:--font-ptem=.5:U+0041,U+0042,U+0043:[A.alt=0@100,0+1200|B=1@100,0+1200|C.alt=2@100,0+1200]
-../fonts/TRAK.ttf:--font-ptem=1:U+0041,U+0042,U+0043:[A.alt=0@100,0+1200|B=1@100,0+1200|C.alt=2@100,0+1200]
-../fonts/TRAK.ttf:--font-ptem=2:U+0041,U+0042,U+0043:[A.alt=0@100,0+1200|B=1@100,0+1200|C.alt=2@100,0+1200]
-../fonts/TRAK.ttf:--font-ptem=9:U+0041,U+0042,U+0043:[A.alt=0@30,0+1060|B=1@30,0+1060|C.alt=2@30,0+1060]
-../fonts/TRAK.ttf:--font-ptem=24:U+0041,U+0042,U+0043:[A.alt=0@-7,0+986|B=1@-7,0+986|C.alt=2@-7,0+986]
-../fonts/TRAK.ttf:--font-ptem=72:U+0041,U+0042,U+0043:[A.alt=0@-35,0+929|B=1@-35,0+929|C.alt=2@-35,0+929]
-../fonts/TRAK.ttf:--font-ptem=144:U+0041,U+0042,U+0043:[A.alt=0@-78,0+843|B=1@-78,0+843|C.alt=2@-78,0+843]
-../fonts/TRAK.ttf:--font-ptem=144:U+0041,U+0042,U+0043:[A.alt=0@-78,0+843|B=1@-78,0+843|C.alt=2@-78,0+843]
-../fonts/TRAK.ttf:--font-ptem=144 --features=-trak:U+0041,U+0042,U+0043:[A.alt=0+1000|B=1+1000|C.alt=2+1000]
-../fonts/TRAK.ttf:--font-ptem=144 --features=-trak[1;3]:U+0041,U+0042,U+0043,U+0041,U+0042,U+0043:[A.alt=0@-78,0+843|B=1+1000|C.alt=2+1000|A.alt=3@-78,0+843|B=4@-78,0+843|C.alt=5@-78,0+843]
diff --git a/test/shaping/data/in-house/tests/arabic-fallback-shaping.tests b/test/shaping/data/in-house/tests/arabic-fallback-shaping.tests
deleted file mode 100644 (file)
index 8b7ced0..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/df768b9c257e0c9c35786c47cae15c46571d56be.ttf::U+0633,U+064F,U+0644,U+064E,U+0651,U+0627,U+0651,U+0650,U+0645,U+062A,U+06CC:[uni06CC.fina=10+1655|uni062A.medi=9+868|uni0645.init=8+1098|uni0650=2@148,0+0|uni0651=2@187,736+0|uni064E=2@883,1259+0|uni0651=2@922,736+0|uni06440627.fina=2+1470|uni064F=0@629,-10+0|uni0633.init=0+1585]
diff --git a/test/shaping/data/in-house/tests/arabic-feature-order.tests b/test/shaping/data/in-house/tests/arabic-feature-order.tests
deleted file mode 100644 (file)
index 0f7f58e..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-../fonts/813c2f8e5512187fd982417a7fb4286728e6f4a8.ttf::U+1820,U+180B:[uni2048.E81A=0+1550]
-../fonts/8a9fea2a7384f2116e5b84a9b31f83be7850ce21.ttf::U+1820,U+180B:[uni2048.E81A=0+1550]
-../fonts/a919b33197965846f21074b24e30250d67277bce.ttf::U+0644,U+0644,U+0647:[Lellah=0+1503]
-../fonts/bf39b0e91ef9807f15a9e283a21a14a209fd2cfc.ttf::U+0644,U+064E,U+0670,U+0653,U+0626:[afii57414.zz04=4+1202|uni0670_uni0653=0@50,350+0|afii57454=0@550,1425+0|afii57444.calt=0+1065]
diff --git a/test/shaping/data/in-house/tests/arabic-like-joining.tests b/test/shaping/data/in-house/tests/arabic-like-joining.tests
deleted file mode 100644 (file)
index 2e34186..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/5dfad7735c6a67085f1b90d4d497e32907db4c78.ttf::U+1E922,U+1E923,U+1E924,U+1E925,U+1E926,U+1E927,U+1E928,U+1E929,U+1E92A,U+1E92B,U+1E92C,U+1E92D,U+1E92E,U+1E92F,U+1E930,U+1E931,U+1E932,U+1E933,U+1E934,U+1E935,U+1E936,U+1E937,U+1E938,U+1E939,U+1E93A,U+1E93B,U+1E93C,U+1E93D,U+1E93E,U+1E93F,U+1E940,U+1E941,U+1E942,U+1E943:[sha_adlam.fina=33+711|kpo_adlam.medi=32+573|zal_adlam.medi=31+773|gbe_adlam.medi=30+594|kha_adlam.medi=29+686|va_adlam.medi=28+621|nha_adlam.medi=27+587|tu_adlam.medi=26+772|nya_adlam.medi=25+577|ga_adlam.medi=24+552|qaaf_adlam.medi=23+694|ha_adlam.medi=22+600|chi_adlam.medi=21+662|jiim_adlam.medi=20+781|u_adlam.medi=19+678|ya_adlam.medi=18+553|kaf_adlam.medi=17+808|nun_adlam.medi=16+561|waw_adlam.medi=15+651|yhe_adlam.medi=14+674|dha_adlam.medi=13+674|o_adlam.medi=12+640|i_adlam.medi=11+657|fa_adlam.medi=10+590|e_adlam.medi=9+628|ra_adlam.medi=8+599|bhe_adlam.medi=7+594|pe_adlam.medi=6+492|sinnyiiyhe_adlam.medi=5+777|ba_adlam.medi=4+655|miim_adlam.medi=3+525|laam_adlam.medi=2+554|daali_adlam.medi=1+600|alif_adlam.init=0+597]
diff --git a/test/shaping/data/in-house/tests/arabic-mark-attach.tests b/test/shaping/data/in-house/tests/arabic-mark-attach.tests
deleted file mode 100644 (file)
index a577e51..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/641ca9d7808b01cafa9a666c13811c9b56eb9c52.ttf::U+064A,U+0633,U+06E1,U+200D,U+0654,U+064E,U+0644:[afii57444.zz04=6+1091|afii57454=1@75,925+0|uni0654=1+0|space=1+0|uni06E1=1@950,1115+0|afii57427.zz03_calt=1+1847|afii57450.zz21=0+345]
diff --git a/test/shaping/data/in-house/tests/arabic-mark-order.tests b/test/shaping/data/in-house/tests/arabic-mark-order.tests
deleted file mode 100644 (file)
index 18ddb88..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-../fonts/94a5d6fb15a27521fba9ea4aee9cb39b2d03322a.ttf::U+064A,U+064E,U+0670,U+0653,U+0640,U+0654,U+064E,U+0627:[afii57415.zz04=7+481|afii57454=4@25,975+0|uni0654=4@-50,50+0|afii57440=4+650|uni0670_uni0653=0@75,400+0|afii57454=0@750,1125+0|afii57450.calt=0+1331]
-../fonts/24b8d24d00ae86f49791b746da4c9d3f717a51a8.ttf::U+0628,U+0618,U+0619,U+064E,U+064F,U+0654,U+0658,U+0653,U+0654,U+0651,U+0656,U+0651,U+065C,U+0655,U+0650:[uni0653.small=0@266,2508+0|uni0654=0@308,2151+0|uni0655=0@518,-1544+0|uni065C=0@501,-1453+0|uni0656=0@573,-659+0|uni0650=0@500,133+0|uni0619=0@300,1807+0|uni0618=0@357,1674+0|uni0651064E=0@387,1178+0|uni0651=0@402,764+0|uni0658=0@424,404+0|uni0654064F=0@540,-435+0|uni0628=0+1352]
-../fonts/21b7fb9c1eeae260473809fbc1fe330f66a507cd.ttf::U+0649,U+0655,U+034F,U+0650:[uni0650.small2=0@727,-774+0|space=0+0|uni0655=0@727,-209+0|uni0649=0+1566]
-../fonts/21b7fb9c1eeae260473809fbc1fe330f66a507cd.ttf::U+0649,U+0655,U+0650:[uni0650.small2=0@727,-774+0|uni0655=0@727,-209+0|uni0649=0+1566]
-../fonts/21b7fb9c1eeae260473809fbc1fe330f66a507cd.ttf::U+0649,U+0650,U+0655:[uni0650.small2=0@727,-774+0|uni0655=0@727,-209+0|uni0649=0+1566]
-../fonts/21b7fb9c1eeae260473809fbc1fe330f66a507cd.ttf::U+0649,U+0650,U+034F,U+0655:[uni0655=0+0|space=0+0|uni0650=0@166,0+0|uni0649=0+1566]
diff --git a/test/shaping/data/in-house/tests/arabic-stch.tests b/test/shaping/data/in-house/tests/arabic-stch.tests
deleted file mode 100644 (file)
index 1ba8f60..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/d9b8bc10985f24796826c29f7ccba3d0ae11ec02.ttf:--no-glyph-names:U+0718,U+070F,U+0718,U+0718,U+002E:[1=4+168|3=3+502|3=2+502|4=1@-1004,0+0|5=1@-876,0+0|5=1@-799,0+0|5=1@-722,0+0|5=1@-645,0+0|4=1@-566,0+0|5=1@-438,0+0|5=1@-361,0+0|5=1@-284,0+0|5=1@-207,0+0|4=1@-128,0+0|3=0+502]
diff --git a/test/shaping/data/in-house/tests/automatic-fractions.tests b/test/shaping/data/in-house/tests/automatic-fractions.tests
deleted file mode 100644 (file)
index 58ec26c..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-../fonts/15dfc433a135a658b9f4b1a861b5cdd9658ccbb9.ttf::U+0031,U+0032,U+0033,U+2044,U+0034,U+0035,U+0036:[one.numr=0+600|two.numr=1+600|three.numr=2+600|fraction=3+252|four.small=4+600|five.small=5+600|six.small=6+600]
-../fonts/15dfc433a135a658b9f4b1a861b5cdd9658ccbb9.ttf:--direction=l --script=arab:U+0031,U+0032,U+0033,U+2044,U+0034,U+0035,U+0036:[one.numr=0+600|two.numr=1+600|three.numr=2+600|fraction=3+252|four.small=4+600|five.small=5+600|six.small=6+600]
-../fonts/15dfc433a135a658b9f4b1a861b5cdd9658ccbb9.ttf:--direction=l:U+0661,U+0662,U+0663,U+2044,U+0664,U+0665,U+0666:[uni0661.numr=0+600|uni0662.numr=1+600|uni0663.numr=2+600|fraction=3+252|uni0664.small=4+600|uni0665.small=5+600|uni0666.small=6+600]
diff --git a/test/shaping/data/in-house/tests/cluster.tests b/test/shaping/data/in-house/tests/cluster.tests
deleted file mode 100644 (file)
index 928843f..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-../fonts/4fac3929fc3332834e93673780ec0fe94342d193.ttf:--cluster-level=2:U+0078,U+030A,U+0058,U+030A:[gid2=0+1083|gid3=1@-1132,-8+0|gid1=2+1200|gid3=3@-1190,349+0]
-../fonts/43ef465752be9af900745f72fe29cb853a1401a5.ttf:--cluster-level=1:U+05D4,U+05B7,U+05E9,U+05BC,U+05C1,U+05B8,U+05DE,U+05B4,U+05DD:[uni05DD=8+1359|uni05B4=7@111,0+0|uni05DE=6+1391|uni05B8=5+0|uni05BC=3+0|uni05C1=3+0|uni05E9=2+1451|uni05B7=1@28,0+0|uni05D4=0+1338]
diff --git a/test/shaping/data/in-house/tests/collections.tests b/test/shaping/data/in-house/tests/collections.tests
deleted file mode 100644 (file)
index 07dac9d..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-../fonts/DFONT.dfont:--face-index=0 --font-funcs=ot:U+2026,U+0020,U+002E:[ellipsis=0+723|space=1+250|period=2+241]
-../fonts/DFONT.dfont:--face-index=1 --font-funcs=ot:U+2026,U+0020,U+002E:[gid0=0+1000|gid0=1+1000|gid0=2+1000]
-../fonts/DFONT.dfont:--face-index=2 --font-funcs=ot:U+2026,U+0020,U+002E:[gid0=0+1000|gid0=1+1000|gid0=2+1000]
-../fonts/TTC.ttc:--face-index=0 --font-funcs=ot:U+2026,U+0020,U+002E:[ellipsis=0+723|space=1+250|period=2+241]
-../fonts/TTC.ttc:--face-index=1 --font-funcs=ot:U+2026,U+0020,U+002E:[ellipsis=0+723|space=1+250|period=2+241]
-../fonts/TTC.ttc:--face-index=2 --font-funcs=ot:U+2026,U+0020,U+002E:[gid0=0+1000|gid0=1+1000|gid0=2+1000]
diff --git a/test/shaping/data/in-house/tests/color-fonts.tests b/test/shaping/data/in-house/tests/color-fonts.tests
deleted file mode 100644 (file)
index bf0005c..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-../fonts/ee39587d13b2afa5499cc79e45780aa79293bbd4.ttf:--font-funcs=ot --show-extents:U+1F42F:[gid1=0+2963<0,2179,2963,-2789>]
-../fonts/fcbaa518d3cce441ed37ae3b1fed6a19e9b54efd.ttf:--font-funcs=ot --show-extents:U+1F600:[gid4=0+2550<0,1898,2555,-2405>]
diff --git a/test/shaping/data/in-house/tests/context-matching.tests b/test/shaping/data/in-house/tests/context-matching.tests
deleted file mode 100644 (file)
index 5673edc..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-../fonts/4cce528e99f600ed9c25a2b69e32eb94a03b4ae8.ttf::U+1A48,U+1A58,U+1A25,U+1A48,U+1A58,U+1A25,U+1A6E,U+1A63:[uni1A48=0+1212|uni1A25=0+1912|uni1A58=0+0|uni1A48=3+1212|uni1A6E=3+0|uni1A25=3+1912|uni1A58=3+0|uni1A63=3+1212]
-../fonts/d629e7fedc0b350222d7987345fe61613fa3929a.ttf::U+0915,U+093F,U+0915,U+093F:[ivowelsign03deva=0+530|kadeva=0+1561|ivowelsign03deva=2+530|kadeva=2+1561]
-../fonts/f499fbc23865022234775c43503bba2e63978fe1.ttf::U+09B0,U+09CD,U+09A5,U+09CD,U+09AF,U+09C0:[gid1=0+1320|gid13=0+523|gid18=0+545]
diff --git a/test/shaping/data/in-house/tests/cursive-positioning.tests b/test/shaping/data/in-house/tests/cursive-positioning.tests
deleted file mode 100644 (file)
index 15a1ffc..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-../fonts/c4e48b0886ef460f532fb49f00047ec92c432ec0.ttf::U+0643,U+0645,U+0645,U+062B,U+0644:[gid8=4+738|gid5=3@441,1197+0|gid6=3@0,432+405|gid9=2@0,477+452|gid9=1@0,977+452|gid10=0@20,1577+207]
-../fonts/298c9e1d955f10f6f72c6915c3c6ff9bf9695cec.ttf::U+0643,U+0645,U+0645,U+062B,U+0644:[gid8=4+738|gid5=3@441,1197+0|gid6=3@0,432+405|gid9=2@0,477+500|gid9=1@0,577+452|gid10=0@20,1177+207]
-#../fonts/706c5d7b625f207bc0d874c67237aad6f1e9cd6f.ttf::U+0B1F,U+0B4D,U+0B1A,U+0B4D,U+0B1A:[ttaorya=0+1307|casubscriptorya=0@-242,104+-231|casubscriptnarroworya=0@20,104+507]
-../fonts/07f054357ff8638bac3711b422a1e31180bba863.ttf:--font-funcs=ot --no-glyph-names:U+0606,U+06E1:[2=0@40,502+0|1=0+1000]
-../fonts/9fc3e6960b3520e5304033ef5fd540285f72f14d.ttf::U+16F0A,U+16F57,U+16F8F:[u16F0A=0+422|u16F57=0@0,209+338|u16F8F=0+0]
diff --git a/test/shaping/data/in-house/tests/default-ignorables.tests b/test/shaping/data/in-house/tests/default-ignorables.tests
deleted file mode 100644 (file)
index a27b67a..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-../fonts/051d92f8bc6ff724511b296c27623f824de256e9.ttf::U+0075,U+0361,U+034F,U+0301,U+0069:[gid2=0+1266|gid7=0@-617,442+0|gid5=0@-7,0+0|gid1=4+528]
-../fonts/bf962d3202883a820aed019d9b5c1838c2ff69c6.ttf::U+0020,U+06CC,U+064E,U+034F,U+0651:[uni0651=1+0|space=1+0|uni064E=1@236,-432+0|uni06CC=1+1266|space=0+452]
diff --git a/test/shaping/data/in-house/tests/emoji.tests b/test/shaping/data/in-house/tests/emoji.tests
deleted file mode 100644 (file)
index 7ee01f3..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-../fonts/53374c7ca3657be37efde7ed02ae34229a56ae1f.ttf::U+1F3F4,U+E0055,U+E0053,U+E0064,U+E0065,U+E007F:[u1F3F4=0+2126|space=0+0|space=0+0|space=0+0|space=0+0|space=0+0]
-../fonts/53374c7ca3657be37efde7ed02ae34229a56ae1f.ttf::U+1F3F4,U+E0064,U+E0065,U+E007F:[de=0+3200]
-../fonts/3cf6f8ac6d647473a43a3100e7494b202b2cfafe.ttf:--font-funcs=ot --direction=l:U+1F481,U+1F3FB,U+200D,U+2642,U+FE0F:[gid7=0+2550]
-../fonts/3cf6f8ac6d647473a43a3100e7494b202b2cfafe.ttf:--font-funcs=ot --direction=r:U+1F481,U+1F3FB,U+200D,U+2642,U+FE0F:[gid7=0+2550]
-../fonts/8d9c4b193808b8bde94389ba7831c1fc6f9e794e.ttf::U+1F3F4,U+E0067,U+E0062,U+E0077,U+E006C,U+E0073,U+E007F:[.notdef=0+1229|space=0+0|space=0+0|space=0+0|space=0+0|space=0+0|space=0+0]
diff --git a/test/shaping/data/in-house/tests/fallback-positioning.tests b/test/shaping/data/in-house/tests/fallback-positioning.tests
deleted file mode 100644 (file)
index 0ffee50..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-../fonts/8228d035fcd65d62ec9728fb34f42c63be93a5d3.ttf::U+0078,U+0301,U+0058,U+0301:[x=0+1030|acutecomb=0@-19,-27+0|X=2+1295|acutecomb=2@-151,320+0]
-../fonts/856ff9562451293cbeff6f396d4e3877c4f0a436.ttf::U+0061,U+035C,U+0062:[uni0061=0+512|uni035C=0@0,-128+0|uni0062=2+512]
diff --git a/test/shaping/data/in-house/tests/hangul-jamo.tests b/test/shaping/data/in-house/tests/hangul-jamo.tests
deleted file mode 100644 (file)
index 6e2fecc..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-../fonts/757ebd573617a24aa9dfbf0b885c54875c6fe06b.ttf::U+115F,U+11A2:[gid3=0+920|gid4=0+0]
-../fonts/7e14e7883ed152baa158b80e207b66114c823a8b.ttf::U+11A2:[gid1=0+920]
diff --git a/test/shaping/data/in-house/tests/hyphens.tests b/test/shaping/data/in-house/tests/hyphens.tests
deleted file mode 100644 (file)
index acfe8f4..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-../fonts/1c04a16f32a39c26c851b7fc014d2e8d298ba2b8.ttf::U+2010:[gid1=0+739]
-../fonts/1c04a16f32a39c26c851b7fc014d2e8d298ba2b8.ttf::U+2011:[gid1=0+739]
diff --git a/test/shaping/data/in-house/tests/indic-consonant-with-stacker.tests b/test/shaping/data/in-house/tests/indic-consonant-with-stacker.tests
deleted file mode 100644 (file)
index 43a3f27..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-../fonts/a014549f766436cf55b2ceb40e462038938ee899.ttf:--no-glyph-names:U+0CF1,U+0C95:[2=0+1129|3=1+358]
-../fonts/55c88ebbe938680b08f92c3de20713183e0c7481.ttf:--no-glyph-names:U+0CF2,U+0CAA:[2=0+1539|3=1+245]
-../fonts/341421e629668b1a1242245d39238ca48432d35d.ttf:--no-glyph-names:U+0CF1:[1=0+1129]
-../fonts/663aef6b019dbf45ffd74089e2b5f2496ceceb18.ttf:--no-glyph-names:U+0CF2:[1=0+1539]
diff --git a/test/shaping/data/in-house/tests/indic-decompose.tests b/test/shaping/data/in-house/tests/indic-decompose.tests
deleted file mode 100644 (file)
index ca887be..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/932ad5132c2761297c74e9976fe25b08e5ffa10b.ttf:--font-funcs=ot:U+09DC,U+0020,U+09DD,U+0020,U+09A1,U+09BC,U+0020,U+09A2,U+09BC:[bn_rha=0+1024|space=1+1024|bn_yya=2+1024|space=3+1024|bn_dda=4+1024|bn_nukta=4+1024|space=6+1024|bn_ddha=7+1024|bn_nukta=7+1024]
diff --git a/test/shaping/data/in-house/tests/indic-init.tests b/test/shaping/data/in-house/tests/indic-init.tests
deleted file mode 100644 (file)
index fee8635..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/1a3d8f381387dd29be1e897e4b5100ac8b4829e1.ttf:--no-glyph-names:U+09AC,U+09C7,U+09AC,U+09C7:[3=0+273|1=0+460|2=2+307|1=2+460]
diff --git a/test/shaping/data/in-house/tests/indic-joiner-candrabindu.tests b/test/shaping/data/in-house/tests/indic-joiner-candrabindu.tests
deleted file mode 100644 (file)
index 6b75137..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-../fonts/5028afb650b1bb718ed2131e872fbcce57828fff.ttf::U+0B13,U+200D,U+0B01:[omorya=0+1450]
-../fonts/5028afb650b1bb718ed2131e872fbcce57828fff.ttf::U+0B13,U+200C,U+0B01:[oorya=0+1309|space=1+0|candrabinduorya=1+0]
diff --git a/test/shaping/data/in-house/tests/indic-joiners.tests b/test/shaping/data/in-house/tests/indic-joiners.tests
deleted file mode 100644 (file)
index 455742d..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-../fonts/f443753e8ffe8e8aae606cfba158e00334b6efb1.ttf::U+179A,U+1784,U+17D2,U+179F,U+200C,U+17CA,U+17B8,U+0020:[uni179a=0+775|uni1784=1+1550|uni179f.sub=1+775|space=4+0|uni17ca=4+0|uni17b8=4@0,300+0|space=7+600]
-../fonts/f443753e8ffe8e8aae606cfba158e00334b6efb1.ttf::U+179A,U+1784,U+17D2,U+179F,U+17CA,U+17B8:[uni179a=0+775|uni1784=1+1550|uni179f.sub=1+775|uni17bb=1@-75,-700+0|uni17b8=1+0]
-../fonts/8116e5d8fedfbec74e45dc350d2416d810bed8c4.ttf::U+091F,U+094D,U+200C,U+092F,U+093F:[uni091F=0+876|uni094D=0@4,0+0|space=2+0|uni093F.750=3+397|uni092F=3+924]
-../fonts/8116e5d8fedfbec74e45dc350d2416d810bed8c4.ttf::U+091F,U+094D,U+200D,U+092F,U+093F:[uni093F=0+398|uni091F=0+876|uni094D=0@4,0+0|space=0+0|uni092F=0+924]
-../fonts/8116e5d8fedfbec74e45dc350d2416d810bed8c4.ttf::U+091F,U+094D,U+200D,U+091F,U+094D,U+200C,U+091F,U+094D,U+200D,U+092F,U+093F:[uni091F=0+876|uni094D=0@4,0+0|space=0+0|uni091F=3+876|uni094D=3@4,0+0|space=5+0|uni093F=6+398|uni091F=6+876|uni094D=6@4,0+0|space=6+0|uni092F=6+924]
-../fonts/8116e5d8fedfbec74e45dc350d2416d810bed8c4.ttf::U+091F,U+094D,U+200D,U+091F,U+094D,U+200D,U+091F,U+094D,U+200D,U+092F,U+093F:[uni093F=0+398|uni091F=0+876|uni094D=0@4,0+0|space=0+0|uni091F=0+876|uni094D=0@4,0+0|space=0+0|uni091F=0+876|uni094D=0@4,0+0|space=0+0|uni092F=0+924]
diff --git a/test/shaping/data/in-house/tests/indic-old-spec.tests b/test/shaping/data/in-house/tests/indic-old-spec.tests
deleted file mode 100644 (file)
index eb967ad..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-../fonts/57a9d9f83020155cbb1d2be1f43d82388cbecc88.ttf::U+0C9A,U+0CCD,U+0C9A,U+0CCD:[U0C9A_U0CCD.haln=0+1066|U0C9A_0CCD.blwf=0+0]
-../fonts/270b89df543a7e48e206a2d830c0e10e5265c630.ttf::U+0D38,U+0D4D,U+0D31,U+0D4D,U+0D31,U+0D4D:[glyph201=0+1183|U0D4D=0+0]
-../fonts/b722a7d09e60421f3efbc706ad348ab47b88567b.ttf::U+091F,U+094D,U+0930,U+094D,U+0020:[Tra=0+550|virAma=0@-73,-110+0|space=4+500]
-../fonts/b722a7d09e60421f3efbc706ad348ab47b88567b.ttf::U+091F,U+094D,U+0930,U+0942:[Tra=0+550|UT=0@42,-150+0]
diff --git a/test/shaping/data/in-house/tests/indic-pref-blocking.tests b/test/shaping/data/in-house/tests/indic-pref-blocking.tests
deleted file mode 100644 (file)
index 516753d..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-../fonts/226bc2deab3846f1a682085f70c67d0421014144.ttf::U+0D2F,U+0D4D,U+0D30,U+0D46:[evowelsignmlym=0+1465|rapostmlym=0+499|yamlym=0+2120]
-../fonts/e207635780b42f898d58654b65098763e340f5c7.ttf::U+0D2F,U+0D4D,U+0D30,U+0D46:[yamlym=0+2120|viramamlym=0+0|evowelsignmlym=0+1465|ramlym=0+1507]
diff --git a/test/shaping/data/in-house/tests/indic-script-extensions.tests b/test/shaping/data/in-house/tests/indic-script-extensions.tests
deleted file mode 100644 (file)
index 0589627..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-../fonts/3493e92eaded2661cadde752a39f9d58b11f0326.ttf::U+0BA4,U+0BC6,U+1133C,U+0BAA,U+1133C,U+0BC6,U+1133C:[u0BC6=0+2093|u1133C=0+0|u0BA4=0+1863|u0BC6=3+2093|u1133C=3+0|u0BAA=3+1706|u1133C=3+0]
-../fonts/b151cfcdaa77585d77f17a42158e0873fc8e2633.ttf:--no-glyph-names:U+0BAA,U+11301,U+11303:[1=0+535|2=0+0|3=0+310]
diff --git a/test/shaping/data/in-house/tests/indic-special-cases.tests b/test/shaping/data/in-house/tests/indic-special-cases.tests
deleted file mode 100644 (file)
index f51651f..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-../fonts/3cae6bfe5b57c07ba81ddbd54c02fe4f3a1e3bf6.ttf::U+0CB0,U+0CCD,U+0C95:[gid1=0+1176|gid5=0+1161]
-../fonts/3cae6bfe5b57c07ba81ddbd54c02fe4f3a1e3bf6.ttf::U+0CB0,U+200D,U+0CCD,U+0C95:[gid2=0+1334|gid6=0+358]
-../fonts/3cae6bfe5b57c07ba81ddbd54c02fe4f3a1e3bf6.ttf::U+0CB0,U+0CCD,U+200D,U+0C95:[gid2=0+1334|gid6=0+358]
diff --git a/test/shaping/data/in-house/tests/indic-syllable.tests b/test/shaping/data/in-house/tests/indic-syllable.tests
deleted file mode 100644 (file)
index 264983b..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-../fonts/54674a3111d209fb6be0ed31745314b7a8d2c244.ttf::U+0BA4,U+0BCD,U+00B3:[taprehalftamil=0+1509|uni00B3=2+674]
-../fonts/3d0b77a2360aa6faa1385aaa510509ab70dfbeff.ttf::U+0CF1:[gid1=0+1129]
-../fonts/3d0b77a2360aa6faa1385aaa510509ab70dfbeff.ttf::U+0CF2:[gid2=0+1539]
-../fonts/87f85d17d26f1fe9ad28d7365101958edaefb967.ttf:--font-funcs=ot:U+0980,U+0981:[anjibeng=0+520|candrabindubeng=0+0]
-../fonts/85fe0be440c64ac77699e21c2f1bd933a919167e.ttf::U+0A15,U+0A51,U+0A47:[kaguru=0+1273|udaatguru=0@75,0+0|eematraguru=0@-40,0+0]
-../fonts/1735326da89f0818cd8c51a0600e9789812c0f94.ttf::U+0A51:[uni25CC=0+1044|udaatguru=0+0]
-../fonts/1735326da89f0818cd8c51a0600e9789812c0f94.ttf::U+25CC,U+0A51:[uni25CC=0+1044|udaatguru=0+0]
-../fonts/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]
diff --git a/test/shaping/data/in-house/tests/indic-vowel-letter-spoofing.tests b/test/shaping/data/in-house/tests/indic-vowel-letter-spoofing.tests
deleted file mode 100644 (file)
index f8305a3..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf::U+0904,U+0020,U+0905,U+0946:[ashortdeva=0+764|space=1+260|adeva=2+764|uni25CC=2+510|eshortvowelsigndeva=2+0]
-../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf::U+0906,U+0020,U+0905,U+093E:[aadeva=0+1023|space=1+260|adeva=2+764|uni25CC=2+510|aavowelsigndeva=2+259]
-../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf::U+0908,U+0020,U+0930,U+094D,U+0907:[iideva=0+491|space=1+260|uni25CC=2+510|rephdeva=2+0|ideva=2+491]
-../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf::U+090A,U+0020,U+0909,U+0941:[uudeva=0+765|space=1+260|udeva=2+548|uni25CC=2+510|uvowelsigndeva=2+0]
-../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf::U+090D,U+0020,U+090F,U+0945:[ecandradeva=0+553|space=1+260|edeva=2+553|uni25CC=2+510|ecandravowelsigndeva=2+0]
-../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf::U+090E,U+0020,U+090F,U+0946:[eshortdeva=0+553|space=1+260|edeva=2+553|uni25CC=2+510|eshortvowelsigndeva=2+0]
-../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf::U+0910,U+0020,U+090F,U+0947:[aideva=0+553|space=1+260|edeva=2+553|uni25CC=2+510|evowelsigndeva=2+0]
-../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf::U+0911,U+0020,U+0905,U+0949,U+0020,U+0906,U+0945:[ocandradeva=0+1023|space=1+260|adeva=2+764|uni25CC=2+510|ocandravowelsigndeva=2+259|space=4+260|aadeva=5+1023|uni25CC=5+510|ecandravowelsigndeva=5+0]
-../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf::U+0912,U+0020,U+0905,U+094A,U+0020,U+0906,U+0946:[oshortdeva=0+1023|space=1+260|adeva=2+764|uni25CC=2+510|oshortvowelsigndeva=2+259|space=4+260|aadeva=5+1023|uni25CC=5+510|eshortvowelsigndeva=5+0]
-../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf::U+0913,U+0020,U+0905,U+094B,U+0020,U+0906,U+0947:[odeva=0+1023|space=1+260|adeva=2+764|uni25CC=2+510|ovowelsigndeva=2+259|space=4+260|aadeva=5+1023|uni25CC=5+510|evowelsigndeva=5+0]
-../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf::U+0914,U+0020,U+0905,U+094C,U+0020,U+0906,U+0948:[audeva=0+1023|space=1+260|adeva=2+764|uni25CC=2+510|auvowelsigndeva=2+259|space=4+260|aadeva=5+1023|uni25CC=5+510|aivowelsigndeva=5+0]
-../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf::U+0972,U+0020,U+0905,U+0945:[acandradeva=0+764|space=1+260|adeva=2+764|uni25CC=2+510|ecandravowelsigndeva=2+0]
-../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf::U+0973,U+0020,U+0905,U+093A:[oedeva=0+764|space=1+260|adeva=2+764|uni25CC=2+510|oevowelsigndeva=2+0]
-../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf::U+0974,U+0020,U+0905,U+093B,U+0020,U+0906,U+093A:[ooedeva=0+1023|space=1+260|adeva=2+764|uni25CC=2+510|ooevowelsigndeva=2+259|space=4+260|aadeva=5+1023|uni25CC=5+510|oevowelsigndeva=5+0]
-../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf::U+0975,U+0020,U+0905,U+094F:[awdeva=0+1023|space=1+260|adeva=2+764|uni25CC=2+510|awvowelsigndeva=2+259]
-../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf::U+0976,U+0020,U+0905,U+0956:[uedeva=0+764|space=1+260|adeva=2+764|uni25CC=2+510|uevowelsigndeva=2@50,0+0]
-../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf::U+0977,U+0020,U+0905,U+0957:[uuedeva=0+764|space=1+260|adeva=2+764|uni25CC=2+510|uuevowelsigndeva=2@50,0+0]
-../fonts/881642af1667ae30a54e58de8be904566d00508f.ttf::U+0986,U+0020,U+0985,U+09BE:[aabeng=0+1158|space=1+260|abeng=2+893|uni25CC=2+510|aavowelsignbeng=2+266]
-../fonts/881642af1667ae30a54e58de8be904566d00508f.ttf::U+09E0,U+0020,U+098B,U+09C3:[rrvocalicbeng=0+853|space=1+260|rvocalicbeng=2+853|uni25CC=2+510|rvocalicvowelsignbeng=2+0]
-../fonts/881642af1667ae30a54e58de8be904566d00508f.ttf::U+09E1,U+0020,U+098C,U+09E2:[llvocalicbeng=0+639|space=1+260|lvocalicbeng=2+639|uni25CC=2+510|lvocalicvowelsignbeng=2+0]
-../fonts/604026ae5aaca83c49cd8416909d71ba3e1c1194.ttf::U+0A06,U+0020,U+0A05,U+0A3E:[aaguru=0+2001|space=1+532|aguru=2+1520|uni25CC=2+1044|aamatraguru=2+481]
-../fonts/604026ae5aaca83c49cd8416909d71ba3e1c1194.ttf::U+0A07,U+0020,U+0A72,U+0A3F:[iguru=0+1671|space=1+532|iriguru=2+1141|imatraguru=2+530|uni25CC=2+1044]
-../fonts/604026ae5aaca83c49cd8416909d71ba3e1c1194.ttf::U+0A08,U+0020,U+0A72,U+0A40:[iiguru=0+1671|space=1+532|iriguru=2+1141|uni25CC=2+1044|iimatraguru=2+530]
-../fonts/604026ae5aaca83c49cd8416909d71ba3e1c1194.ttf::U+0A09,U+0020,U+0A73,U+0A41:[uguru=0+1356|space=1+532|uraguru=2+1356|uni25CC=2+1044|umatraguru=2@102,0+0]
-../fonts/604026ae5aaca83c49cd8416909d71ba3e1c1194.ttf::U+0A0A,U+0020,U+0A73,U+0A42:[uuguru=0+1356|space=1+532|uraguru=2+1356|uni25CC=2+1044|uumatraguru=2@102,0+0]
-../fonts/604026ae5aaca83c49cd8416909d71ba3e1c1194.ttf::U+0A0F,U+0020,U+0A72,U+0A47:[eeguru=0+1141|space=1+532|iriguru=2+1141|uni25CC=2+1044|eematraguru=2+0]
-../fonts/604026ae5aaca83c49cd8416909d71ba3e1c1194.ttf::U+0A10,U+0020,U+0A05,U+0A48:[aiguru=0+1520|space=1+532|aguru=2+1520|uni25CC=2+1044|aimatraguru=2+0]
-../fonts/604026ae5aaca83c49cd8416909d71ba3e1c1194.ttf::U+0A13,U+0020,U+0A73,U+0A4B:[ooguru=0+1356|space=1+532|uraguru=2+1356|uni25CC=2+1044|oomatraguru=2+0]
-../fonts/604026ae5aaca83c49cd8416909d71ba3e1c1194.ttf::U+0A14,U+0020,U+0A05,U+0A4C:[auguru=0+1520|space=1+532|aguru=2+1520|uni25CC=2+1044|aumatraguru=2+0]
-../fonts/738d9f3b8c2dfd03875bf35a61d28fd78faf17c8.ttf::U+0A86,U+0020,U+0A85,U+0ABE:[gid3=0+2351|gid1=1+612|gid2=2+1808|gid17=2+1044|gid10=2+543]
-../fonts/738d9f3b8c2dfd03875bf35a61d28fd78faf17c8.ttf::U+0A8D,U+0020,U+0A85,U+0AC5:[gid4=0+1808|gid1=1+612|gid2=2+1808|gid17=2+1044|gid11=2+0]
-../fonts/738d9f3b8c2dfd03875bf35a61d28fd78faf17c8.ttf::U+0A8F,U+0020,U+0A85,U+0AC7:[gid5=0+1808|gid1=1+612|gid2=2+1808|gid17=2+1044|gid12=2+0]
-../fonts/738d9f3b8c2dfd03875bf35a61d28fd78faf17c8.ttf::U+0A90,U+0020,U+0A85,U+0AC8:[gid6=0+1808|gid1=1+612|gid2=2+1808|gid17=2+1044|gid13=2+0]
-../fonts/738d9f3b8c2dfd03875bf35a61d28fd78faf17c8.ttf::U+0A91,U+0020,U+0A85,U+0AC9:[gid7=0+2351|gid1=1+612|gid2=2+1808|gid17=2+1044|gid14=2+543]
-../fonts/738d9f3b8c2dfd03875bf35a61d28fd78faf17c8.ttf::U+0A93,U+0020,U+0A85,U+0ACB,U+0020,U+0A85,U+0ABE,U+0AC5:[gid8=0+2351|gid1=1+612|gid2=2+1808|gid17=2+1044|gid15=2+543|gid1=4+612|gid2=5+1808|gid17=5+1044|gid11=5+0|gid10=5+543]
-../fonts/738d9f3b8c2dfd03875bf35a61d28fd78faf17c8.ttf::U+0A94,U+0020,U+0A85,U+0ACC,U+0020,U+0A85,U+0ABE,U+0AC8:[gid9=0+2351|gid1=1+612|gid2=2+1808|gid17=2+1044|gid16=2+543|gid1=4+612|gid2=5+1808|gid17=5+1044|gid13=5+0|gid10=5+543]
-../fonts/738d9f3b8c2dfd03875bf35a61d28fd78faf17c8.ttf::U+0AC9,U+0020,U+0AC5,U+0ABE:[gid17=0+1044|gid14=0+543|gid1=1+612|gid17=1+1044|gid11=1+0|gid17=1+1044|gid10=1+543]
-../fonts/2c25beb56d9c556622d56b0b5d02b4670c034f89.ttf::U+0B06,U+0020,U+0B05,U+0B3E:[aaorya=0+1681|space=1+881|aorya=2+1284|uni25CC=2+1044|aavowelsignorya=2+387]
-../fonts/2c25beb56d9c556622d56b0b5d02b4670c034f89.ttf::U+0B10,U+0020,U+0B0F,U+0B57:[aiorya=0+1681|space=1+881|eorya=2+1315|uni25CC=2+1044|aulengthmarkorya=2+387]
-../fonts/2c25beb56d9c556622d56b0b5d02b4670c034f89.ttf::U+0B14,U+0020,U+0B13,U+0B57:[auorya=0+1679|space=1+881|oorya=2+1309|uni25CC=2+1044|aulengthmarkorya=2+387]
-../fonts/03e3f463c3a985bc42096620cc415342818454fb.ttf::U+0C13,U+0020,U+0C12,U+0C55:[gid3=0+1497|gid1=1+580|gid2=2+1497|gid13=2+1184|gid12=2+0]
-../fonts/03e3f463c3a985bc42096620cc415342818454fb.ttf::U+0C14,U+0020,U+0C12,U+0C4C:[gid4=0+1497|gid1=1+580|gid2=2+1497|gid13=2+1184|gid11=2+634]
-../fonts/03e3f463c3a985bc42096620cc415342818454fb.ttf::U+0C40,U+0020,U+0C3F,U+0C55:[gid13=0+1184|gid6=0+0|gid1=1+580|gid13=1+1184|gid5=1+0|gid13=1+1184|gid12=1+0]
-../fonts/03e3f463c3a985bc42096620cc415342818454fb.ttf::U+0C47,U+0020,U+0C46,U+0C55:[gid13=0+1184|gid8=0+0|gid1=1+580|gid13=1+1184|gid7=1+0|gid13=1+1184|gid12=1+0]
-../fonts/03e3f463c3a985bc42096620cc415342818454fb.ttf::U+0C4B,U+0020,U+0C4A,U+0C55:[gid13=0+1184|gid10=0+634|gid1=1+580|gid13=1+1184|gid9=1+634|gid13=1+1184|gid12=1+0]
-../fonts/7d18685e1529e4ceaad5b6095dfab2f9789e5bce.ttf::U+0C8A,U+0020,U+0C89,U+0CBE:[gid3=0+3269|gid1=1+590|gid2=2+2502|gid10=2+1184|gid7=2+919]
-../fonts/7d18685e1529e4ceaad5b6095dfab2f9789e5bce.ttf::U+0C94,U+0020,U+0C92,U+0CCC:[gid6=0+1596|gid1=1+590|gid5=2+1590|gid10=2+1184|gid8=2+880]
-../fonts/7d18685e1529e4ceaad5b6095dfab2f9789e5bce.ttf::U+0CE0,U+0020,U+0C8B,U+0CBE:[gid9=0+3214|gid1=1+590|gid4=2+2440|gid10=2+1184|gid7=2+919]
-../fonts/af85624080af5627fb050f570d148a62f04fda74.ttf::U+0D08,U+0020,U+0D07,U+0D57:[gid3=0+3574|gid1=1+632|gid2=2+2019|gid14=2+1184|gid13=2+1555]
-../fonts/af85624080af5627fb050f570d148a62f04fda74.ttf::U+0D0A,U+0020,U+0D09,U+0D57:[gid5=0+2972|gid1=1+632|gid4=2+1417|gid14=2+1184|gid13=2+1555]
-../fonts/af85624080af5627fb050f570d148a62f04fda74.ttf::U+0D10,U+0020,U+0D0E,U+0D46:[gid7=0+4073|gid1=1+632|gid6=2+2608|gid12=2+1465|gid14=2+1184]
-../fonts/af85624080af5627fb050f570d148a62f04fda74.ttf::U+0D13,U+0020,U+0D12,U+0D3E:[gid9=0+2557|gid1=1+632|gid8=2+1524|gid14=2+1184|gid11=2+1033]
-../fonts/af85624080af5627fb050f570d148a62f04fda74.ttf::U+0D14,U+0020,U+0D12,U+0D57:[gid10=0+3073|gid1=1+632|gid8=2+1524|gid14=2+1184|gid13=2+1555]
diff --git a/test/shaping/data/in-house/tests/kern-format2.tests b/test/shaping/data/in-house/tests/kern-format2.tests
deleted file mode 100644 (file)
index f7cd840..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-../fonts/e39391c77a6321c2ac7a2d644de0396470cd4bfe.ttf::U+0061,U+0062,U+0063,U+0064,U+0065,U+0066,U+0067,U+0068,U+0069,U+006A,U+006B,U+006C,U+006D,U+006E,U+006F,U+0070:[a=0+626|b=1+672|c=2+564|d=3@-15,0+657|e=4+621|f=5+403|g=6@-10,0+662|h=7+666|i=8+316|j=9+316|k=10+591|l=11+316|m=12+1021|n=13+666|o=14+644|p=15+672]
-../fonts/e39391c77a6321c2ac7a2d644de0396470cd4bfe.ttf::U+0063,U+006B,U+0063,U+006B,U+0063,U+006B:[c=0+579|k=1+591|c=2+579|k=3+591|c=4+579|k=5+591]
-../fonts/e39391c77a6321c2ac7a2d644de0396470cd4bfe.ttf::U+0041,U+0056:[A=0+701|V=1@-40,0+703]
diff --git a/test/shaping/data/in-house/tests/khmer-mark-order.tests b/test/shaping/data/in-house/tests/khmer-mark-order.tests
deleted file mode 100644 (file)
index d581dd1..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf::U+179F,U+17CA,U+17BE,U+1794:[uni17C1=0+288|uni179F=0+928|uni17BB=0@-6,-26+0|uni17B8=0@-32,-29+0|uni1794=3+635]
-../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf::U+179F,U+17C9,U+17BE,U+17BB,U+1794:[uni17C1=0+288|uni179F=0+928|uni17C9=0@-32,-29+0|uni17B8=0@-32,237+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=4+635]
-../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf::U+179F,U+17C9,U+17C1,U+17B8,U+17BB,U+1794:[uni17C1=0+288|uni179F=0+928|uni17C9=0@-32,-29+0|uni17B8=0@-32,237+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=5+635]
-../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf::U+179F,U+17C9,U+17B8,U+17C1,U+17BB,U+1794:[uni179F=0+928|uni17C9=0@-32,-29+0|uni17B8=0@-32,237+0|uni17C1=0+288|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=5+635]
-../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf::U+179F,U+17C9,U+17BE,U+17BB,U+17BB,U+1794:[uni17C1=0+288|uni179F=0+928|uni17C9=0@-32,-29+0|uni17B8=0@-32,237+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=5+635]
-../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf::U+179F,U+17C9,U+17C1,U+17B8,U+17BB,U+17BB,U+1794:[uni17C1=0+288|uni179F=0+928|uni17C9=0@-32,-29+0|uni17B8=0@-32,237+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=6+635]
-../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf::U+179F,U+17C9,U+17B8,U+17C1,U+17BB,U+17BB,U+1794:[uni179F=0+928|uni17C9=0@-32,-29+0|uni17B8=0@-32,237+0|uni17C1=0+288|uni25CC=0+635|uni17BB=0@-20,-26+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=6+635]
-../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf::U+179F,U+17CA,U+17BE,U+17BB,U+1794:[uni17C1=0+288|uni179F=0+928|uni17BB=0@-6,-26+0|uni17B8=0@-32,-29+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=4+635]
-../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf::U+179F,U+17CA,U+17C1,U+17B8,U+17BB,U+1794:[uni17C1=0+288|uni179F=0+928|uni17BB=0@-6,-26+0|uni17B8=0@-32,-29+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=5+635]
-../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf::U+179F,U+17CA,U+17B8,U+17C1,U+17BB,U+1794:[uni179F=0+928|uni17BB=0@-6,-26+0|uni17B8=0@-32,-29+0|uni17C1=0+288|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=5+635]
-../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf::U+179F,U+17CA,U+17BE,U+17BB,U+17BB,U+1794:[uni17C1=0+288|uni179F=0+928|uni17BB=0@-6,-26+0|uni17B8=0@-32,-29+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=5+635]
-../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf::U+179F,U+17CA,U+17C1,U+17B8,U+17BB,U+17BB,U+1794:[uni17C1=0+288|uni179F=0+928|uni17BB=0@-6,-26+0|uni17B8=0@-32,-29+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=6+635]
-../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf::U+179F,U+17CA,U+17B8,U+17C1,U+17BB,U+17BB,U+1794:[uni179F=0+928|uni17BB=0@-6,-26+0|uni17B8=0@-32,-29+0|uni17C1=0+288|uni25CC=0+635|uni17BB=0@-20,-26+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=6+635]
-../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf::U+179F,U+17C9,U+17BE,U+17B8,U+1794:[uni17C1=0+288|uni179F=0+928|uni17C9=0@-32,-29+0|uni17B8=0@-32,237+0|uni25CC=0+635|uni17B8=0@-20,-84+0|uni1794=4+635]
-../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf::U+179F,U+17C9,U+17B8,U+17BE,U+1794:[uni179F=0+928|uni17C9=0@-32,-29+0|uni17B8=0@-32,237+0|uni17C1=0+288|uni25CC=0+635|uni17B8=0@-20,-84+0|uni1794=4+635]
-../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf::U+179F,U+17C9,U+17BE,U+17B8,U+17BB,U+1794:[uni17C1=0+288|uni179F=0+928|uni17C9=0@-32,-29+0|uni17B8=0@-32,237+0|uni25CC=0+635|uni17B8=0@-20,-84+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=5+635]
-../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf::U+179F,U+17C9,U+17B8,U+17BE,U+17BB,U+1794:[uni179F=0+928|uni17C9=0@-32,-29+0|uni17B8=0@-32,237+0|uni17C1=0+288|uni25CC=0+635|uni17B8=0@-20,-84+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=5+635]
-../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf::U+179F,U+17CA,U+17BE,U+17B8,U+1794:[uni17C1=0+288|uni179F=0+928|uni17BB=0@-6,-26+0|uni17B8=0@-32,-29+0|uni25CC=0+635|uni17B8=0@-20,-84+0|uni1794=4+635]
-../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf::U+179F,U+17CA,U+17B8,U+17BE,U+1794:[uni179F=0+928|uni17BB=0@-6,-26+0|uni17B8=0@-32,-29+0|uni17C1=0+288|uni25CC=0+635|uni17B8=0@-20,-84+0|uni1794=4+635]
-../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf::U+179F,U+17CA,U+17BE,U+17B8,U+17BB,U+1794:[uni17C1=0+288|uni179F=0+928|uni17BB=0@-6,-26+0|uni17B8=0@-32,-29+0|uni25CC=0+635|uni17B8=0@-20,-84+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=5+635]
-../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf::U+179F,U+17CA,U+17B8,U+17BE,U+17BB,U+1794:[uni179F=0+928|uni17BB=0@-6,-26+0|uni17B8=0@-32,-29+0|uni17C1=0+288|uni25CC=0+635|uni17B8=0@-20,-84+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=5+635]
-../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf::U+179F,U+17BE,U+17B8,U+17BB,U+1794:[uni17C1=0+288|uni179F=0+928|uni17B8=0@-32,-29+0|uni25CC=0+635|uni17B8=0@-20,-84+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=4+635]
-../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf::U+179F,U+17BE,U+17BB,U+17B8,U+1794:[uni17C1=0+288|uni179F=0+928|uni17B8=0@-32,-29+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni17B8=0@-20,-84+0|uni1794=4+635]
-../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf::U+179F,U+17B8,U+17BE,U+17BB,U+1794:[uni179F=0+928|uni17B8=0@-32,-29+0|uni17C1=0+288|uni25CC=0+635|uni17B8=0@-20,-84+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=4+635]
-../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf::U+179F,U+17B8,U+17BB,U+17BE,U+1794:[uni179F=0+928|uni17B8=0@-32,-29+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni17C1=0+288|uni25CC=0+635|uni17B8=0@-20,-84+0|uni1794=4+635]
diff --git a/test/shaping/data/in-house/tests/khmer-misc.tests b/test/shaping/data/in-house/tests/khmer-misc.tests
deleted file mode 100644 (file)
index 1ea7609..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1781,U+17D2,U+1798,U+17C2:[uni17C2=0+288|uni1781=0+635|uni17D21798=0@22,-26+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1787,U+17B6:[uni178717B6=0+923]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1790,U+17D2,U+1784,U+17C3:[uni17C3=0+288|uni1790=0+635|uni17D21784=0@-1,-26+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1798,U+17B6:[uni179817B6=0+923]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1798,U+17D2,U+1796,U+17BB:[uni1798=0+635|uni17D21796=0@-1,-26+0|uni17BB=0@-22,-296+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+179A:[uni179A=0+288]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+179A,U+17B8:[uni179A=0+288|uni17B8.r=0@76,-29+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+179A,U+17CD:[uni179A=0+288|uni17CD.r=0@18,-29+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+179F,U+17C5:[uni17C1=0+288|uni179F17C5=0+1216]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+179A,U+17D2,U+17A5:[uni179A=0+288|uni17D2=0+0|uni17A5=2+635]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1784,U+17B9,U+17D2,U+1788:[uni1784=0+635|uni17B9=0@-46,30+0|uni17D21788=0+234]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1784,U+17D2,U+1788,U+17B9:[uni1784=0+635|uni17D21788=0+234|uni17B9=0@8,30+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1784,U+17D2,U+1782,U+17D2,U+179A:[uni17D2179A.low=0+287|uni1784=0+635|uni17D21782=0@0,-26+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1784,U+17D2,U+179A,U+17D2,U+1782:[uni17D2179A.low=0+287|uni1784=0+635|uni17D21782=0@0,-26+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1798,U+17C9,U+17D2,U+179B,U+17C1,U+17C7:[uni17C1=0+288|uni1798=0+635|uni17C9=0@-46,-29+0|uni17D2179B=0@-1,-26+0|uni17C7=0+386]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1798,U+200C,U+17C9,U+17D2,U+179B,U+17C1,U+17C7:[uni17C1=0+288|uni1798=0+635|space=0+0|uni17C9=0@-46,-29+0|uni17D2179B=0@-1,-26+0|uni17C7=0+386]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1794,U+17CA,U+17D0:[uni1794=0+635|uni17CA=0@-46,-29+0|uni17D0=0@-46,113+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1793,U+17C2,U+17CE:[uni17C2=0+288|uni1793=0+635|uni17CE=0@-36,-29+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1780,U+17C1,U+17D2,U+179A:[uni17D2179A=0+287|uni17C1=0+288|uni1780=0+636]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1780,U+17C0,U+17D2,U+179A:[uni17D2179A=0+287|uni17C1=0+288|uni1780=0+636|uni17C0.right1=0+288]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1780,U+17C4,U+17D2,U+179A:[uni17D2179A=0+287|uni17C1=0+288|uni178017B6=0+924]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1780,U+17C5,U+17D2,U+179A:[uni17D2179A=0+287|uni17C1=0+288|uni178017C5=0+924]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1796,U+17D1,U+17B6:[uni179617B6=0+923|uni17D1=0@-311,-19+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1780,U+1793,U+17D2,U+178F,U+17D2,U+179A,U+17B6,U+1780,U+17CB:[uni1780=0+636|uni17D2179A.low=1+287|uni179317B6=1+924|uni17D2178F=1@-290,-26+0|uni1780=7+636|uni17CB=7@-23,-29+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1780,U+1793,U+17D2,U+179A,U+17D2,U+179F,U+17B7,U+1780,U+17CB:[uni1780=0+636|uni17D2179A=1+287|uni1793=1+635|uni17D2179F=1+302|uni17B7=1@-4,30+0|uni1780=7+636|uni17CB=7@-23,-29+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1780,U+1793,U+17D2,U+179A,U+17D2,U+179F,U+17B8,U+1780,U+17CB:[uni1780=0+636|uni17D2179A=1+287|uni1793=1+635|uni17D2179F=1+302|uni17B8=1@-4,30+0|uni1780=7+636|uni17CB=7@-23,-29+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1780,U+17D2,U+179F,U+17B6,U+1793,U+17D2,U+178F:[uni1780=0+636|uni17D2179F17B6=0+584|uni1793=4+635|uni17D2178F=4@-1,-26+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1780,U+17D2,U+179F,U+17B7,U+1793,U+17D2,U+178F:[uni1780=0+636|uni17D2179F=0+302|uni17B7=0@-4,30+0|uni1793=4+635|uni17D2178F=4@-1,-26+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1780,U+17D2,U+179F,U+17B8,U+1793,U+17D2,U+178F:[uni1780=0+636|uni17D2179F=0+302|uni17B8=0@-4,30+0|uni1793=4+635|uni17D2178F=4@-1,-26+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1780,U+17D2,U+179F,U+17B9,U+1793,U+17D2,U+178F:[uni1780=0+636|uni17D2179F=0+302|uni17B9=0@-4,30+0|uni1793=4+635|uni17D2178F=4@-1,-26+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1780,U+17D2,U+179F,U+17BA,U+1793,U+17D2,U+178F:[uni1780=0+636|uni17D2179F=0+302|uni17BA=0@-4,30+0|uni1793=4+635|uni17D2178F=4@-1,-26+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1780,U+17D2,U+179F,U+17BB,U+1793,U+17D2,U+178F:[uni1780=0+636|uni17D2179F=0+302|uni17BB=0@1,-260+0|uni1793=4+635|uni17D2178F=4@-1,-26+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1780,U+17D2,U+179F,U+17BC,U+1793,U+17D2,U+178F:[uni1780=0+636|uni17D2179F=0+302|uni17BC=0@1,-260+0|uni1793=4+635|uni17D2178F=4@-1,-26+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1780,U+17D2,U+179F,U+17BD,U+1793,U+17D2,U+178F:[uni1780=0+636|uni17D2179F=0+302|uni17BD=0@1,-260+0|uni1793=4+635|uni17D2178F=4@-1,-26+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1780,U+17D2,U+179F,U+17BF,U+1793,U+17D2,U+178F:[uni17C1=0+288|uni1780=0+636|uni17D2179F=0+302|uni17BF.right2=0+288|uni1793=4+635|uni17D2178F=4@-1,-26+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1783,U+17D2,U+179B,U+17D2,U+179F,U+17B6,U+17C6:[uni1783=0+928|uni17D2179B=0@15,-26+0|uni17D2179F17B6.low=0+584|uni17C6=0@39,-29+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1783,U+17D2,U+179B,U+17D2,U+179F,U+17B7,U+17C7:[uni1783=0+928|uni17D2179B=0@15,-26+0|uni17D2179F.low=0+302|uni17B7=0@-4,30+0|uni17C7=0+386]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1783,U+17D2,U+179B,U+17D2,U+179F,U+17BB,U+17C6:[uni1783=0+928|uni17D2179B=0@15,-26+0|uni17D2179F.low=0+302|uni17BB=0+0|uni17C6=0@-4,30+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1783,U+17D2,U+179B,U+17D2,U+179F,U+17BB,U+17C7:[uni1783=0+928|uni17D2179B=0@15,-26+0|uni17D2179F.low=0+302|uni17BB=0+0|uni17C7=0+386]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1783,U+17D2,U+179B,U+17D2,U+179F,U+17C1,U+17C7:[uni17C1=0+288|uni1783=0+928|uni17D2179B=0@15,-26+0|uni17D2179F.low=0+302|uni17C7=0+386]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1783,U+17D2,U+179B,U+17D2,U+179F,U+17C4,U+17C7:[uni17C1=0+288|uni1783=0+928|uni17D2179B=0@15,-26+0|uni17D2179F17B6.low=0+584|uni17C7=0+386]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1783,U+17D2,U+179B,U+17D2,U+179F,U+17C6:[uni1783=0+928|uni17D2179B=0@15,-26+0|uni17D2179F.low=0+302|uni17C6=0@-4,30+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1783,U+17D2,U+179B,U+17D2,U+179F,U+17C7:[uni1783=0+928|uni17D2179B=0@15,-26+0|uni17D2179F.low=0+302|uni17C7=0+386]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1789,U+17BC:[uni1789=0+952|uni17BC=0@-173,-260+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1789,U+17D2,U+1789:[uni1789.a=0+952|uni17D21789.a=0@19,-22+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1789,U+17D2,U+1789,U+17BB:[uni1789.a=0+952|uni17D21789.a=0@19,-22+0|uni17BB=0@-160,-296+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1789,U+17D2,U+1789,U+17BC:[uni1789.a=0+952|uni17D21789.a=0@19,-22+0|uni17BC=0@-160,-296+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1789,U+17D2,U+1789,U+17BD:[uni1789.a=0+952|uni17D21789.a=0@19,-22+0|uni17BD=0@-160,-296+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+178F,U+17D2,U+179A,U+17D2,U+179F,U+17C0:[uni17C1=0+288|uni17D2179A=0+287|uni178F=0+635|uni17D2179F=0+302|uni17C0.right2=0+288]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+178F,U+17D2,U+179A,U+17D2,U+179F,U+17C1:[uni17C1=0+288|uni17D2179A=0+287|uni178F=0+635|uni17D2179F=0+302]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+178F,U+17D2,U+179A,U+17D2,U+179F,U+17C2:[uni17C2=0+288|uni17D2179A=0+287|uni178F=0+635|uni17D2179F=0+302]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+178F,U+17D2,U+179A,U+17D2,U+179F,U+17C3:[uni17C3=0+288|uni17D2179A=0+287|uni178F=0+635|uni17D2179F=0+302]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+178F,U+17D2,U+179A,U+17D2,U+179F,U+17C4:[uni17C1=0+288|uni17D2179A=0+287|uni178F=0+635|uni17D2179F17B6=0+584]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+178F,U+17D2,U+179A,U+17D2,U+179F,U+17C5:[uni17C1=0+288|uni17D2179A=0+287|uni178F=0+635|uni17D2179F17C5=0+584]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1792,U+17D2,U+179B,U+17BB,U+17C6,U+1780,U+17CB:[uni1792=0+635|uni17D2179B=0@-2,-26+0|uni17BB=0@-19,-296+0|uni17C6=0@-46,-29+0|uni1780=5+636|uni17CB=5@-23,-29+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1792,U+17D2,U+179B,U+17C4,U+1780,U+17CB:[uni17C1=0+288|uni179217B6=0+923|uni17D2179B=0@-290,-26+0|uni1780=4+636|uni17CB=4@-23,-29+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1792,U+17D2,U+179B,U+17C5,U+1780,U+17CB:[uni17C1=0+288|uni179217C5=0+923|uni17D2179B=0@-290,-26+0|uni1780=4+636|uni17CB=4@-23,-29+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1792,U+17D2,U+179B,U+17C6,U+1780,U+17CB:[uni1792=0+635|uni17D2179B=0@-2,-26+0|uni17C6=0@-46,-29+0|uni1780=4+636|uni17CB=4@-23,-29+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1798,U+17D2,U+178F,U+17D2,U+179B,U+17C9,U+17B6:[uni179817B6=0+923|uni17D2178F=0@-289,-26+0|uni17D2179B=0@-289,-296+0|uni17C9=0@-334,-29+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1798,U+17D2,U+178F,U+17D2,U+179B,U+17C9,U+17BB:[uni1798=0+635|uni17D2178F=0@-1,-26+0|uni17D2179B=0@-1,-296+0|uni17C9=0@-46,-29+0|uni17BB=0@-18,-566+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1798,U+17D2,U+178F,U+17D2,U+179B,U+17C9,U+17BF:[uni17C1=0+288|uni1798=0+635|uni17D2178F=0@-1,-26+0|uni17D2179B=0@-1,-296+0|uni17C9=0@-46,-29+0|uni17BF.right1=0+288]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1798,U+17D2,U+178F,U+17D2,U+179B,U+17C9,U+17C0:[uni17C1=0+288|uni1798=0+635|uni17D2178F=0@-1,-26+0|uni17D2179B=0@-1,-296+0|uni17C9=0@-46,-29+0|uni17C0.right1=0+288]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1799,U+17D2,U+1799,U+17BE,U+17A0,U+17D2,U+179C,U+17D2,U+179B,U+17C3:[uni17C1=0+288|uni1799=0+953|uni17D21799=0+298|uni17B8=0@1,30+0|uni17C3=4+288|uni17A0=4+928|uni17D2179C=4@20,-26+0|uni17D2179B=4@19,-296+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+179A,U+17D2,U+179A:[uni17D2179A=0+287|uni179A=0+288]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+179F,U+17B6,U+179F,U+17D2,U+178F,U+17D2,U+179A,U+1783,U+17D2,U+1788,U+1784,U+17B6:[uni179F17B6=0+1216|uni17D2179A=2+287|uni179F=2+928|uni17D2178F=2@14,-26+0|uni1783=7+928|uni17D21788=7+234|uni178417B6=10+923]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+179F,U+17B6,U+179F,U+17D2,U+178F,U+17D2,U+179A,U+1783,U+17D2,U+1788,U+1784,U+17B7:[uni179F17B6=0+1216|uni17D2179A=2+287|uni179F=2+928|uni17D2178F=2@14,-26+0|uni1783=7+928|uni17D21788=7+234|uni1784=10+635|uni17B7=10@-46,30+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+179F,U+17B6,U+179F,U+17D2,U+178F,U+17D2,U+179A,U+1783,U+17D2,U+1788,U+1784,U+17B8:[uni179F17B6=0+1216|uni17D2179A=2+287|uni179F=2+928|uni17D2178F=2@14,-26+0|uni1783=7+928|uni17D21788=7+234|uni1784=10+635|uni17B8=10@-46,30+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+179F,U+17D2,U+178F,U+17D2,U+179A,U+17B8,U+179C,U+17D0,U+1781,U+17D2,U+1789,U+17D2,U+179F,U+17B6:[uni17D2179A=0+287|uni179F=0+928|uni17D2178F=0@14,-26+0|uni17B8=0@-32,-29+0|uni179C=6+326|uni17D0=6@139,40+0|uni1781=8+635|uni17D21789=8@-4,-26+0|uni17D2179F17B6.low=8+584]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+179F,U+17D2,U+179A,U+17D2,U+178F,U+17B6:[uni17D2179A=0+287|uni179F17B6=0+1216|uni17D2178F=0@-274,-26+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+179F,U+17D2,U+179A,U+17D2,U+178F,U+17B7:[uni17D2179A=0+287|uni179F=0+928|uni17D2178F=0@14,-26+0|uni17B7=0@-32,-29+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+179F,U+17D2,U+179A,U+17D2,U+178F,U+17B8:[uni17D2179A=0+287|uni179F=0+928|uni17D2178F=0@14,-26+0|uni17B8=0@-32,-29+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+179F,U+17D2,U+179A,U+17D2,U+178F,U+17B9:[uni17D2179A=0+287|uni179F=0+928|uni17D2178F=0@14,-26+0|uni17B9=0@-32,-29+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+179F,U+17D2,U+179A,U+17D2,U+178F,U+17BA:[uni17D2179A=0+287|uni179F=0+928|uni17D2178F=0@14,-26+0|uni17BA=0@-32,-29+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+179F,U+17D2,U+179A,U+17D2,U+178F,U+17BB:[uni17D2179A=0+287|uni179F=0+928|uni17D2178F=0@14,-26+0|uni17BB=0@-6,-296+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+179F,U+17D2,U+179A,U+17D2,U+178F,U+17BC:[uni17D2179A=0+287|uni179F=0+928|uni17D2178F=0@14,-26+0|uni17BC=0@-6,-296+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+179F,U+17D2,U+179A,U+17D2,U+178F,U+17BD:[uni17D2179A=0+287|uni179F=0+928|uni17D2178F=0@14,-26+0|uni17BD=0@-6,-296+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+179F,U+17D2,U+179A,U+17D2,U+178F,U+17BE:[uni17C1=0+288|uni17D2179A=0+287|uni179F=0+928|uni17D2178F=0@14,-26+0|uni17B8=0@-32,-29+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+179F,U+17D2,U+179A,U+17D2,U+178F,U+17BF:[uni17C1=0+288|uni17D2179A=0+287|uni179F=0+928|uni17D2178F=0@14,-26+0|uni17BF.right2=0+288]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+179F,U+17D2,U+179A,U+17D2,U+178F,U+17CA,U+17BF:[uni17C1=0+288|uni17D2179A=0+287|uni179F=0+928|uni17D2178F=0@14,-26+0|uni17CA=0@-32,-29+0|uni17BF.right1=0+288]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+179F,U+17D2,U+179A,U+17D2,U+178F,U+17CA,U+17C0:[uni17C1=0+288|uni17D2179A=0+287|uni179F=0+928|uni17D2178F=0@14,-26+0|uni17CA=0@-32,-29+0|uni17C0.right1.high=0+288]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+179F,U+17D2,U+179A,U+17D2,U+178F,U+17CA,U+17C1:[uni17C1=0+288|uni17D2179A=0+287|uni179F=0+928|uni17D2178F=0@14,-26+0|uni17CA=0@-32,-29+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+179F,U+17D2,U+179A,U+17D2,U+178F,U+17CA,U+17C2:[uni17C2=0+288|uni17D2179A=0+287|uni179F=0+928|uni17D2178F=0@14,-26+0|uni17CA=0@-32,-29+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+179F,U+17D2,U+179A,U+17D2,U+178F,U+17CA,U+17C3:[uni17C3=0+288|uni17D2179A=0+287|uni179F=0+928|uni17D2178F=0@14,-26+0|uni17CA=0@-32,-29+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+179F,U+17D2,U+179A,U+17D2,U+178F,U+17CA,U+17C6:[uni17D2179A=0+287|uni179F=0+928|uni17D2178F=0@14,-26+0|uni17CA=0@-32,-29+0|uni17C6=0@-32,113+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+17A0,U+17D2,U+1782,U+17D2,U+179F,U+17CA,U+17BE:[uni17C1=0+288|uni17A0=0+928|uni17D21782=0@20,-26+0|uni17D2179F.low=0+302|uni17BB=0+0|uni17B8=0@-4,30+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+17A0,U+17D2,U+1782,U+17D2,U+179F,U+17CA,U+17BF:[uni17C1=0+288|uni17A0=0+928|uni17D21782=0@20,-26+0|uni17D2179F.low=0+302|uni17CA=0@-4,30+0|uni17BF.right1=0+288]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+17A0,U+17D2,U+1782,U+17D2,U+179F,U+17CA,U+17C0:[uni17C1=0+288|uni17A0=0+928|uni17D21782=0@20,-26+0|uni17D2179F.low=0+302|uni17CA=0@-4,30+0|uni17C0.right1.high=0+288]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+17A0,U+17D2,U+179A,U+17D2,U+179C,U+1784,U+17D2,U+1780:[uni17D2179A=0+287|uni17A0=0+928|uni17D2179C=0@20,-26+0|uni1784=5+635|uni17D21780=5@0,-26+0]
-../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+17A0,U+17D2,U+179A,U+17D2,U+179C,U+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]
diff --git a/test/shaping/data/in-house/tests/language-tags.tests b/test/shaping/data/in-house/tests/language-tags.tests
deleted file mode 100644 (file)
index c7be180..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-../fonts/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf:--language=fa:U+004A:[gid2=0+1000]
-../fonts/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf:--language=ja:U+004A:[gid2=0+1000]
-../fonts/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf:--language=zh:U+004A:[gid4=0+1000]
-../fonts/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf:--language=zh-cn:U+004A:[gid4=0+1000]
-../fonts/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf:--language=zh-sg:U+004A:[gid4=0+1000]
-../fonts/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf:--language=zh-tw:U+004A:[gid5=0+1000]
-../fonts/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf:--language=zh-hans:U+004A:[gid4=0+1000]
-../fonts/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf:--language=zh-hant:U+004A:[gid5=0+1000]
-../fonts/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf:--language=zh-hant-hk:U+004A:[gid6=0+1000]
-../fonts/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf:--language=zh-HK:U+004A:[gid6=0+1000]
-../fonts/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf:--language=zh-mo:U+004A:[gid6=0+1000]
-../fonts/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf:--language=zh-Hant-mo:U+004A:[gid6=0+1000]
-../fonts/d3129450fafe5e5c98cfc25a4e71809b1b4d2855.ttf:--language=dv --no-glyph-names:U+007C:[2=0+156]
diff --git a/test/shaping/data/in-house/tests/ligature-id.tests b/test/shaping/data/in-house/tests/ligature-id.tests
deleted file mode 100644 (file)
index 3daaca3..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|space=3+213|u0995_u09B0_u09CD.blwf.vatu=4+643|u0995_u09CD.half_u09B2.pres=7+602]
-../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|space=6+213|u0995_u09B0_u09CD.blwf.vatu=7+643|u0995_u09CD.half_u09B2.pres=10+602]
-../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|space=9+213|u0995_u09B0_u09CD.blwf.vatu=10+643|u0995_u09CD.half_u09B2.pres=13+602]
-../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|space=12+213|u0995_u09B0_u09CD.blwf.vatu=13+643|u0995_u09CD.half_u09B2.pres=16+602]
-../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|space=15+213|u0995_u09B0_u09CD.blwf.vatu=16+643|u0995_u09CD.half_u09B2.pres=19+602]
-../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|space=18+213|u0995_u09B0_u09CD.blwf.vatu=19+643|u0995_u09CD.half_u09B2.pres=22+602]
-../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|space=21+213|u0995_u09B0_u09CD.blwf.vatu=22+643|u0995_u09CD.half_u09B2.pres=25+602]
-../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|space=24+213|u0995_u09B0_u09CD.blwf.vatu=25+643|u0995_u09CD.half_u09B2.pres=28+602]
-../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|space=27+213|u0995_u09B0_u09CD.blwf.vatu=28+643|u0995_u09CD.half_u09B2.pres=31+602]
-../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|space=30+213|u0995_u09B0_u09CD.blwf.vatu=31+643|u0995_u09CD.half_u09B2.pres=34+602]
-../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|space=33+213|u0995_u09B0_u09CD.blwf.vatu=34+643|u0995_u09CD.half_u09B2.pres=37+602]
-../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|space=36+213|u0995_u09B0_u09CD.blwf.vatu=37+643|u0995_u09CD.half_u09B2.pres=40+602]
-../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|space=39+213|u0995_u09B0_u09CD.blwf.vatu=40+643|u0995_u09CD.half_u09B2.pres=43+602]
-../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|space=42+213|u0995_u09B0_u09CD.blwf.vatu=43+643|u0995_u09CD.half_u09B2.pres=46+602]
-../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|space=45+213|u0995_u09B0_u09CD.blwf.vatu=46+643|u0995_u09CD.half_u09B2.pres=49+602]
-../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|space=48+213|u0995_u09B0_u09CD.blwf.vatu=49+643|u0995_u09CD.half_u09B2.pres=52+602]
-../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|space=51+213|u0995_u09B0_u09CD.blwf.vatu=52+643|u0995_u09CD.half_u09B2.pres=55+602]
-../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|space=54+213|u0995_u09B0_u09CD.blwf.vatu=55+643|u0995_u09CD.half_u09B2.pres=58+602]
-../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|space=57+213|u0995_u09B0_u09CD.blwf.vatu=58+643|u0995_u09CD.half_u09B2.pres=61+602]
-../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|space=60+213|u0995_u09B0_u09CD.blwf.vatu=61+643|u0995_u09CD.half_u09B2.pres=64+602]
-../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|space=63+213|u0995_u09B0_u09CD.blwf.vatu=64+643|u0995_u09CD.half_u09B2.pres=67+602]
-../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|space=66+213|u0995_u09B0_u09CD.blwf.vatu=67+643|u0995_u09CD.half_u09B2.pres=70+602]
-../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|u0995_u09CD.half_u0995.pres=66+566|space=69+213|u0995_u09B0_u09CD.blwf.vatu=70+643|u0995_u09CD.half_u09B2.pres=73+602]
-../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|u0995_u09CD.half_u0995.pres=66+566|u0995_u09CD.half_u0995.pres=69+566|space=72+213|u0995_u09B0_u09CD.blwf.vatu=73+643|u0995_u09CD.half_u09B2.pres=76+602]
-../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|u0995_u09CD.half_u0995.pres=66+566|u0995_u09CD.half_u0995.pres=69+566|u0995_u09CD.half_u0995.pres=72+566|space=75+213|u0995_u09B0_u09CD.blwf.vatu=76+643|u0995_u09CD.half_u09B2.pres=79+602]
-../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|u0995_u09CD.half_u0995.pres=66+566|u0995_u09CD.half_u0995.pres=69+566|u0995_u09CD.half_u0995.pres=72+566|u0995_u09CD.half_u0995.pres=75+566|space=78+213|u0995_u09B0_u09CD.blwf.vatu=79+643|u0995_u09CD.half_u09B2.pres=82+602]
-../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|u0995_u09CD.half_u0995.pres=66+566|u0995_u09CD.half_u0995.pres=69+566|u0995_u09CD.half_u0995.pres=72+566|u0995_u09CD.half_u0995.pres=75+566|u0995_u09CD.half_u0995.pres=78+566|space=81+213|u0995_u09B0_u09CD.blwf.vatu=82+643|u0995_u09CD.half_u09B2.pres=85+602]
-../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|u0995_u09CD.half_u0995.pres=66+566|u0995_u09CD.half_u0995.pres=69+566|u0995_u09CD.half_u0995.pres=72+566|u0995_u09CD.half_u0995.pres=75+566|u0995_u09CD.half_u0995.pres=78+566|u0995_u09CD.half_u0995.pres=81+566|space=84+213|u0995_u09B0_u09CD.blwf.vatu=85+643|u0995_u09CD.half_u09B2.pres=88+602]
-../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|u0995_u09CD.half_u0995.pres=66+566|u0995_u09CD.half_u0995.pres=69+566|u0995_u09CD.half_u0995.pres=72+566|u0995_u09CD.half_u0995.pres=75+566|u0995_u09CD.half_u0995.pres=78+566|u0995_u09CD.half_u0995.pres=81+566|u0995_u09CD.half_u0995.pres=84+566|space=87+213|u0995_u09B0_u09CD.blwf.vatu=88+643|u0995_u09CD.half_u09B2.pres=91+602]
-../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|u0995_u09CD.half_u0995.pres=66+566|u0995_u09CD.half_u0995.pres=69+566|u0995_u09CD.half_u0995.pres=72+566|u0995_u09CD.half_u0995.pres=75+566|u0995_u09CD.half_u0995.pres=78+566|u0995_u09CD.half_u0995.pres=81+566|u0995_u09CD.half_u0995.pres=84+566|u0995_u09CD.half_u0995.pres=87+566|space=90+213|u0995_u09B0_u09CD.blwf.vatu=91+643|u0995_u09CD.half_u09B2.pres=94+602]
-../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|u0995_u09CD.half_u0995.pres=66+566|u0995_u09CD.half_u0995.pres=69+566|u0995_u09CD.half_u0995.pres=72+566|u0995_u09CD.half_u0995.pres=75+566|u0995_u09CD.half_u0995.pres=78+566|u0995_u09CD.half_u0995.pres=81+566|u0995_u09CD.half_u0995.pres=84+566|u0995_u09CD.half_u0995.pres=87+566|u0995_u09CD.half_u0995.pres=90+566|space=93+213|u0995_u09B0_u09CD.blwf.vatu=94+643|u0995_u09CD.half_u09B2.pres=97+602]
-../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|u0995_u09CD.half_u0995.pres=66+566|u0995_u09CD.half_u0995.pres=69+566|u0995_u09CD.half_u0995.pres=72+566|u0995_u09CD.half_u0995.pres=75+566|u0995_u09CD.half_u0995.pres=78+566|u0995_u09CD.half_u0995.pres=81+566|u0995_u09CD.half_u0995.pres=84+566|u0995_u09CD.half_u0995.pres=87+566|u0995_u09CD.half_u0995.pres=90+566|u0995_u09CD.half_u0995.pres=93+566|space=96+213|u0995_u09B0_u09CD.blwf.vatu=97+643|u0995_u09CD.half_u09B2.pres=100+602]
-../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|u0995_u09CD.half_u0995.pres=66+566|u0995_u09CD.half_u0995.pres=69+566|u0995_u09CD.half_u0995.pres=72+566|u0995_u09CD.half_u0995.pres=75+566|u0995_u09CD.half_u0995.pres=78+566|u0995_u09CD.half_u0995.pres=81+566|u0995_u09CD.half_u0995.pres=84+566|u0995_u09CD.half_u0995.pres=87+566|u0995_u09CD.half_u0995.pres=90+566|u0995_u09CD.half_u0995.pres=93+566|u0995_u09CD.half_u0995.pres=96+566|space=99+213|u0995_u09B0_u09CD.blwf.vatu=100+643|u0995_u09CD.half_u09B2.pres=103+602]
-../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|u0995_u09CD.half_u0995.pres=66+566|u0995_u09CD.half_u0995.pres=69+566|u0995_u09CD.half_u0995.pres=72+566|u0995_u09CD.half_u0995.pres=75+566|u0995_u09CD.half_u0995.pres=78+566|u0995_u09CD.half_u0995.pres=81+566|u0995_u09CD.half_u0995.pres=84+566|u0995_u09CD.half_u0995.pres=87+566|u0995_u09CD.half_u0995.pres=90+566|u0995_u09CD.half_u0995.pres=93+566|u0995_u09CD.half_u0995.pres=96+566|u0995_u09CD.half_u0995.pres=99+566|space=102+213|u0995_u09B0_u09CD.blwf.vatu=103+643|u0995_u09CD.half_u09B2.pres=106+602]
-../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|u0995_u09CD.half_u0995.pres=66+566|u0995_u09CD.half_u0995.pres=69+566|u0995_u09CD.half_u0995.pres=72+566|u0995_u09CD.half_u0995.pres=75+566|u0995_u09CD.half_u0995.pres=78+566|u0995_u09CD.half_u0995.pres=81+566|u0995_u09CD.half_u0995.pres=84+566|u0995_u09CD.half_u0995.pres=87+566|u0995_u09CD.half_u0995.pres=90+566|u0995_u09CD.half_u0995.pres=93+566|u0995_u09CD.half_u0995.pres=96+566|u0995_u09CD.half_u0995.pres=99+566|u0995_u09CD.half_u0995.pres=102+566|space=105+213|u0995_u09B0_u09CD.blwf.vatu=106+643|u0995_u09CD.half_u09B2.pres=109+602]
-../fonts/a6c76d1bafde4a0b1026ebcc932d2e5c6fd02442.ttf::U+1004,U+103A,U+1039,U+101B,U+103D,U+102D:[uni101B103D=0+450|uni1004103A1039102D=0@-50,0+0]
diff --git a/test/shaping/data/in-house/tests/macos.tests b/test/shaping/data/in-house/tests/macos.tests
deleted file mode 100644 (file)
index daa4497..0000000
+++ /dev/null
@@ -1,130 +0,0 @@
-# 10.12.6 https://gist.github.com/ebraminio/1704341fa16b06979e605aafd88198cf
-/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:--font-funcs ot:U+006D,U+0300:[mgrave=0+1912]
-/System/Library/Fonts/Times.dfont@39c954614d3f3317b28564db06d5b7b7a6ff0e39:--font-funcs ot:U+0066,U+0069:[fi=0+1139]
-/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:--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:--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@d89a9d7e57767bfe3b5a4cfd22bb1e9dbe03a062:--font-funcs ot:U+05E1,U+05B0:[shevahebrew=0@51,0+0|samekhhebrew=0+1361]
-/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]
-/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:--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@-372,120+-372|u0644_u0623.isolated.lamHamzaOnAlef=1@120,0+1282|u0627.alef=0+647]
-/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:--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+064F:[u064f.damma=0@250,-250+250|u0628.beh=0@-250,0+1165]
-/System/Library/Fonts/GeezaPro.ttc@f43ee7151c2e9f1dddfbc26cfc148609eb5c5820:--font-funcs ot:U+0644,U+064E,U+0645,U+064E,U+0651,U+0627:[u0627.final.alef=5+647|u064e.fatha=0@-80,160+-80|u064e_u0651.shaddaFatha=0@490,250+490|u0644_u0645.initial.lamMeem=0@-410,0+415]
-/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@65,0+1235|gid584=1@-40,0+1109|gid3=2@65,0+620|gid4=3@65,0+1357|gid265=4+1357|gid3=5@65,0+620|gid225=6@65,0+1260|gid728=7@-15,0+699|gid3=8@65,0+620|gid265=9@65,0+1357|gid505=10+1127|gid3=11@65,0+620|gid728=12@65,0+739|gid225=13@25,0+1300|gid3=14@65,0+620|gid584=15@65,0+1134|gid225=16@-15,0+1260|gid3=17@65,0+620|gid225=18@65,0+1235|gid576=19@-40,0+1198]
-/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]
-/Library/Fonts/Zapfino.ttf@9ee799ffb09516ead6b0cf6f2ca807276e150748:--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]
-# https://github.com/harfbuzz/harfbuzz/pull/2130
-/System/Library/Fonts/ヒラギノ明朝 ProN W3.ttc@e3bd65c7209ceab2c70ef22d3ebe0967ab319ed3:--font-funcs ot --direction=ttb:U+005B,U+0048,U+0065,U+006C,U+006C,U+006F,U+0034,U+005D:[gid60=0@-157,-880+0,-1000|gid41=1@-398,-880+0,-1000|gid70=2@-267,-880+0,-1000|gid77=3@-148,-880+0,-1000|gid77=4@-148,-880+0,-1000|gid80=5@-291,-880+0,-1000|gid21=6@-294,-880+0,-1000|gid62=7@-157,-880+0,-1000]
-/System/Library/Fonts/Times.dfont@39c954614d3f3317b28564db06d5b7b7a6ff0e39:--font-funcs ot:U+0066,U+0069,U+006e,U+0065:[fi=0+1139|n=2+1024|e=3+909]
-/System/Library/Fonts/Times.dfont@39c954614d3f3317b28564db06d5b7b7a6ff0e39:--font-funcs ot --features liga=0:U+0066,U+0069,U+006e,U+0065:[f=0+682|i=1+569|n=2+1024|e=3+909]
-/Library/Fonts/Kokonor.ttf@fe9d518bb4e20e77f7a0444c82f4d41467dd714d:--font-funcs ot:U+0F62,U+0F92,U+0FB1,U+0F74:[r_g_y_u=0+1579]
-/Library/Fonts/Kokonor.ttf@fe9d518bb4e20e77f7a0444c82f4d41467dd714d:--font-funcs ot --features liga=0:U+0F62,U+0F92,U+0FB1,U+0F74:[r_g_y_u=0+1579]
-/Library/Fonts/Apple Chancery.ttf@5fc49ae9bce39e2105864323183b68ea34c9e562:--font-funcs ot:U+0066,U+0069,U+0072,U+0073,U+0074:[f_i=0+1097|r=2+853|s=3+728|t=4+725]
-/Library/Fonts/Apple Chancery.ttf@5fc49ae9bce39e2105864323183b68ea34c9e562:--font-funcs ot --features dlig=1:U+0066,U+0069,U+0072,U+0073,U+0074:[f_i=0+1097|r=2+853|s_t=3+1438]
-/Library/Fonts/Apple Chancery.ttf@5fc49ae9bce39e2105864323183b68ea34c9e562:--font-funcs ot --features liga=0:U+0066,U+0069,U+0072,U+0073,U+0074:[f=0+639|i=1+606|r=2+853|s=3+728|t=4+725]
-/Library/Fonts/Apple Chancery.ttf@5fc49ae9bce39e2105864323183b68ea34c9e562:--font-funcs ot --features dlig=1,sups=0,tnum=0:U+0066,U+0069,U+0072,U+0073,U+0074:[f_i=0+1097|r=2+853|s_t=3+1438]
-/Library/Fonts/Apple Chancery.ttf@5fc49ae9bce39e2105864323183b68ea34c9e562:--font-funcs ot --features liga=0,sups=0,tnum=0:U+0066,U+0069,U+0072,U+0073,U+0074:[f=0+639|i=1+606|r=2+853|s=3+728|t=4+725]
-/Library/Fonts/Apple Chancery.ttf@5fc49ae9bce39e2105864323183b68ea34c9e562:--font-funcs ot --features smcp=1:U+0066,U+0069,U+0072,U+0073,U+0074:[F.small=0+903|I.small=1+634|R.small=2+1113|S.small=3+911|T.small=4+1075]
-/Library/Fonts/Apple Chancery.ttf@5fc49ae9bce39e2105864323183b68ea34c9e562:--font-funcs ot --features liga=0,dlig=1:U+0066,U+0069,U+0072,U+0073,U+0074:[f=0+639|i=1+606|r=2+853|s_t=3+1438]
-
-# 10.13.6 https://gist.github.com/ebraminio/d432e831b3f7ebe30245dde5775e1c7e
-/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:--font-funcs ot:U+006D,U+0300:[mgrave=0+1912]
-/System/Library/Fonts/Times.ttc@896098b6979306ad84355025459f7c68b029139c:--font-funcs ot:U+0066,U+0069:[fi=0+1139]
-/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:--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:--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@-372,120+-372|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/GeezaPro.ttc@ab26ea45dcaa5e1c5a958e42af10e10d330e7334:--font-funcs ot:U+0644,U+064E,U+0645,U+064E,U+0651,U+0627:[u0627.final.alef=5+647|u064e.fatha=0@-80,160+-80|u064e_u0651.shaddaFatha=0@490,250+490|u0644_u0645.initial.lamMeem=0@-410,0+415]
-/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@65,0+1185|gid658=1@-70,0+1044|gid3=2@65,0+550|gid4=3@65,0+1357|gid332=4+1357|gid3=5@65,0+550|gid282=6@65,0+1205|gid813=7@-50,0+646|gid3=8@65,0+550|gid332=9@65,0+1347|gid572=10@-10,0+1083|gid3=11@65,0+550|gid813=12@65,0+676|gid282=13@-20,0+1235|gid3=14@65,0+550|gid658=15@65,0+1044|gid282=16@-70,0+1185|gid3=17@65,0+550|gid282=18@65,0+1185|gid649=19@-70,0+1129]
-/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]
-/System/Library/Fonts/Thonburi.ttc@bb080e01e45f7f6699d2df09a03b3b6d13804897:--font-funcs ot:U+0E17,U+0E35,U+0E48,U+0E4A:[thothahanthai_saraiithai_maiekthai=0+1616|maitrithai.key=0+1300]
-/System/Library/Fonts/Times.ttc@896098b6979306ad84355025459f7c68b029139c:--font-funcs ot:U+0066,U+0069,U+006e,U+0065:[fi=0+1139|n=2+1024|e=3+909]
-/System/Library/Fonts/Times.ttc@896098b6979306ad84355025459f7c68b029139c:--font-funcs ot --features liga=0:U+0066,U+0069,U+006e,U+0065:[f=0+682|i=1+569|n=2+1024|e=3+909]
-/Library/Fonts/Kokonor.ttf@14a5c850ba917d9ec9f6bb9b1fc59b1d95512da4:--font-funcs ot:U+0F62,U+0F92,U+0FB1,U+0F74:[r_g_y_u=0+1579]
-/Library/Fonts/Kokonor.ttf@14a5c850ba917d9ec9f6bb9b1fc59b1d95512da4:--font-funcs ot --features liga=0:U+0F62,U+0F92,U+0FB1,U+0F74:[r_g_y_u=0+1579]
-/Library/Fonts/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac:--font-funcs ot:U+0066,U+0069,U+0072,U+0073,U+0074:[f_i=0+1097|r=2+853|s=3+728|t=4+725]
-/Library/Fonts/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac:--font-funcs ot --features dlig=1:U+0066,U+0069,U+0072,U+0073,U+0074:[f_i=0+1097|r=2+853|s_t=3+1438]
-/Library/Fonts/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac:--font-funcs ot --features liga=0:U+0066,U+0069,U+0072,U+0073,U+0074:[f=0+639|i=1+606|r=2+853|s=3+728|t=4+725]
-/Library/Fonts/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac:--font-funcs ot --features dlig=1,sups=0,tnum=0:U+0066,U+0069,U+0072,U+0073,U+0074:[f_i=0+1097|r=2+853|s_t=3+1438]
-/Library/Fonts/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac:--font-funcs ot --features liga=0,sups=0,tnum=0:U+0066,U+0069,U+0072,U+0073,U+0074:[f=0+639|i=1+606|r=2+853|s=3+728|t=4+725]
-/Library/Fonts/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac:--font-funcs ot --features smcp=1:U+0066,U+0069,U+0072,U+0073,U+0074:[F.small=0+903|I.small=1+634|R.small=2+1113|S.small=3+911|T.small=4+1075]
-/Library/Fonts/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac:--font-funcs ot --features liga=0,dlig=1:U+0066,U+0069,U+0072,U+0073,U+0074:[f=0+639|i=1+606|r=2+853|s_t=3+1438]
-
-# 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@-372,120+-372|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/GeezaPro.ttc@ab26ea45dcaa5e1c5a958e42af10e10d330e7334:--font-funcs ot:U+0644,U+064E,U+0645,U+064E,U+0651,U+0627:[u0627.final.alef=5+647|u064e.fatha=0@-80,160+-80|u064e_u0651.shaddaFatha=0@490,250+490|u0644_u0645.initial.lamMeem=0@-410,0+415]
-/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@65,0+1185|gid659=1@-70,0+1044|gid3=2@65,0+550|gid4=3@65,0+1357|gid333=4+1357|gid3=5@65,0+550|gid283=6@65,0+1205|gid815=7@-50,0+646|gid3=8@65,0+550|gid333=9@65,0+1347|gid573=10@-10,0+1083|gid3=11@65,0+550|gid815=12@65,0+676|gid283=13@-20,0+1235|gid3=14@65,0+550|gid659=15@65,0+1044|gid283=16@-70,0+1185|gid3=17@65,0+550|gid283=18@65,0+1185|gid650=19@-70,0+1129]
-/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]
-/System/Library/Fonts/Thonburi.ttc@bb080e01e45f7f6699d2df09a03b3b6d13804897:--font-funcs ot:U+0E17,U+0E35,U+0E48,U+0E4A:[thothahanthai_saraiithai_maiekthai=0+1616|maitrithai.key=0+1300]
-/System/Library/Fonts/Times.ttc@ebb050e4fcaaebe9992efbc7b5660b60ba18b518:--font-funcs ot:U+0066,U+0069,U+006e,U+0065:[fi=0+1139|n=2+1024|e=3+909]
-/System/Library/Fonts/Times.ttc@ebb050e4fcaaebe9992efbc7b5660b60ba18b518:--font-funcs ot --features liga=0:U+0066,U+0069,U+006e,U+0065:[f=0+682|i=1+569|n=2+1024|e=3+909]
-/Library/Fonts/Kokonor.ttf@14a5c850ba917d9ec9f6bb9b1fc59b1d95512da4:--font-funcs ot:U+0F62,U+0F92,U+0FB1,U+0F74:[r_g_y_u=0+1579]
-/Library/Fonts/Kokonor.ttf@14a5c850ba917d9ec9f6bb9b1fc59b1d95512da4:--font-funcs ot --features liga=0:U+0F62,U+0F92,U+0FB1,U+0F74:[r_g_y_u=0+1579]
-/Library/Fonts/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac:--font-funcs ot:U+0066,U+0069,U+0072,U+0073,U+0074:[f_i=0+1097|r=2+853|s=3+728|t=4+725]
-/Library/Fonts/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac:--font-funcs ot --features dlig=1:U+0066,U+0069,U+0072,U+0073,U+0074:[f_i=0+1097|r=2+853|s_t=3+1438]
-/Library/Fonts/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac:--font-funcs ot --features liga=0:U+0066,U+0069,U+0072,U+0073,U+0074:[f=0+639|i=1+606|r=2+853|s=3+728|t=4+725]
-/Library/Fonts/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac:--font-funcs ot --features dlig=1,sups=0,tnum=0:U+0066,U+0069,U+0072,U+0073,U+0074:[f_i=0+1097|r=2+853|s_t=3+1438]
-/Library/Fonts/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac:--font-funcs ot --features liga=0,sups=0,tnum=0:U+0066,U+0069,U+0072,U+0073,U+0074:[f=0+639|i=1+606|r=2+853|s=3+728|t=4+725]
-/Library/Fonts/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac:--font-funcs ot --features smcp=1:U+0066,U+0069,U+0072,U+0073,U+0074:[F.small=0+903|I.small=1+634|R.small=2+1113|S.small=3+911|T.small=4+1075]
-/Library/Fonts/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac:--font-funcs ot --features liga=0,dlig=1:U+0066,U+0069,U+0072,U+0073,U+0074:[f=0+639|i=1+606|r=2+853|s_t=3+1438]
-
-# 10.15 https://gist.github.com/ebraminio/d52dd780fec59f8e2dfffe8e1a841823
-/System/Library/Fonts/Helvetica.ttc@98c12f0d63168b20635fb51d638929753b4e6aed:--font-funcs ot:U+006D,U+0300:[m=0+1706|gravecmb=0@-284,10+0]
-/System/Library/Fonts/LucidaGrande.ttc@b2b9aa73d0d9ddabbe73549949fc7444b8528cc2:--font-funcs ot:U+006D,U+0300:[mgrave=0+1912]
-/System/Library/Fonts/Times.ttc@e9b4f626133de3b22787ee025218c6c799cc3ceb:--font-funcs ot:U+0066,U+0069:[fi=0+1139]
-/System/Library/Fonts/Supplemental/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]
-/System/Library/Fonts/Supplemental/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@e9b4f626133de3b22787ee025218c6c799cc3ceb:--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@b2b9aa73d0d9ddabbe73549949fc7444b8528cc2:--font-funcs ot:U+05E1,U+05B0:[shevahebrew=0@51,0+0|samekhhebrew=0+1361]
-/System/Library/Fonts/Supplemental/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/Supplemental/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@-372,120+-372|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/GeezaPro.ttc@ab26ea45dcaa5e1c5a958e42af10e10d330e7334:--font-funcs ot:U+0644,U+064E,U+0645,U+064E,U+0651,U+0627:[u0627.final.alef=5+647|u064e.fatha=0@-80,160+-80|u064e_u0651.shaddaFatha=0@490,250+490|u0644_u0645.initial.lamMeem=0@-410,0+415]
-# SFNS uses opsz variation axis which isn't invoked here, see https://crbug.com/1005969#c37
-/System/Library/Fonts/SFNS.ttf@253b4b28662acc1de4a86350fd2b26d620ea213c:--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+920|e=1+1049|space=2+420|A=3+1162|V=4+1292|space=5+420|T=6+960|r=7+631|space=8+420|V=9+1142|a=10+1028|space=11+420|r=12+461|T=13+1190|space=14+420|e=15+779|T=16+1190|space=17+420|T=18+920|d=19+1134]
-/System/Library/Fonts/SFNS.ttf@253b4b28662acc1de4a86350fd2b26d620ea213c:--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:[T=0@19,0+958|e=1@19,0+1087|space=2@19,0+458|A=3@19,0+1200|V=4@19,0+1330|space=5@19,0+458|T=6@19,0+998|r=7@19,0+669|space=8@19,0+458|V=9@19,0+1180|a=10@19,0+1066|space=11@19,0+458|r=12@19,0+499|T=13@19,0+1228|space=14@19,0+458|e=15@19,0+817|T=16@19,0+1228|space=17@19,0+458|T=18@19,0+958|d=19@19,0+1172]
-/System/Library/Fonts/Apple Color Emoji.ttc@ef22d55c551e2af0193d75105346c6e7e21af389:--remove-default-ignorables --font-funcs ot:U+1F468,U+200D,U+1F469,U+200D,U+1F467,U+200D,U+1F466:[u1F46A.MWGB=0+800]
-/System/Library/Fonts/Supplemental/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]
-/System/Library/Fonts/Thonburi.ttc@bb080e01e45f7f6699d2df09a03b3b6d13804897:--font-funcs ot:U+0E17,U+0E35,U+0E48,U+0E4A:[thothahanthai_saraiithai_maiekthai=0+1616|maitrithai.key=0+1300]
-/System/Library/Fonts/Times.ttc@e9b4f626133de3b22787ee025218c6c799cc3ceb:--font-funcs ot:U+0066,U+0069,U+006e,U+0065:[fi=0+1139|n=2+1024|e=3+909]
-/System/Library/Fonts/Times.ttc@e9b4f626133de3b22787ee025218c6c799cc3ceb:--font-funcs ot --features liga=0:U+0066,U+0069,U+006e,U+0065:[f=0+682|i=1+569|n=2+1024|e=3+909]
-/System/Library/Fonts/Supplemental/Kokonor.ttf@14a5c850ba917d9ec9f6bb9b1fc59b1d95512da4:--font-funcs ot:U+0F62,U+0F92,U+0FB1,U+0F74:[r_g_y_u=0+1579]
-/System/Library/Fonts/Supplemental/Kokonor.ttf@14a5c850ba917d9ec9f6bb9b1fc59b1d95512da4:--font-funcs ot --features liga=0:U+0F62,U+0F92,U+0FB1,U+0F74:[r_g_y_u=0+1579]
-/System/Library/Fonts/Supplemental/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac:--font-funcs ot:U+0066,U+0069,U+0072,U+0073,U+0074:[f_i=0+1097|r=2+853|s=3+728|t=4+725]
-/System/Library/Fonts/Supplemental/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac:--font-funcs ot --features dlig=1:U+0066,U+0069,U+0072,U+0073,U+0074:[f_i=0+1097|r=2+853|s_t=3+1438]
-/System/Library/Fonts/Supplemental/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac:--font-funcs ot --features liga=0:U+0066,U+0069,U+0072,U+0073,U+0074:[f=0+639|i=1+606|r=2+853|s=3+728|t=4+725]
-/System/Library/Fonts/Supplemental/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac:--font-funcs ot --features dlig=1,sups=0,tnum=0:U+0066,U+0069,U+0072,U+0073,U+0074:[f_i=0+1097|r=2+853|s_t=3+1438]
-/System/Library/Fonts/Supplemental/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac:--font-funcs ot --features liga=0,sups=0,tnum=0:U+0066,U+0069,U+0072,U+0073,U+0074:[f=0+639|i=1+606|r=2+853|s=3+728|t=4+725]
-/System/Library/Fonts/Supplemental/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac:--font-funcs ot --features smcp=1:U+0066,U+0069,U+0072,U+0073,U+0074:[F.small=0+903|I.small=1+634|R.small=2+1113|S.small=3+911|T.small=4+1075]
-/System/Library/Fonts/Supplemental/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac:--font-funcs ot --features liga=0,dlig=1:U+0066,U+0069,U+0072,U+0073,U+0074:[f=0+639|i=1+606|r=2+853|s_t=3+1438]
-/System/Library/Fonts/Supplemental/Skia.ttf@caee56fc4085009c1a29a863500908050ea6248f:--font-funcs ot:U+0041,U+0056:[A=0+1345|V=1@-12,0+1346]
diff --git a/test/shaping/data/in-house/tests/mark-attachment.tests b/test/shaping/data/in-house/tests/mark-attachment.tests
deleted file mode 100644 (file)
index 9a9b8ff..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/98b7887cff91f722b92a8ff800120954606354f9.ttf::U+100F,U+103C,U+102F,U+1036:[uni103C102F=0+150|uni100F=0+550|uni1036=0@-150,0+0]
diff --git a/test/shaping/data/in-house/tests/mark-filtering-sets.tests b/test/shaping/data/in-house/tests/mark-filtering-sets.tests
deleted file mode 100644 (file)
index d30e021..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-../fonts/f22416c692720a7d46fadf4af99f4c9e094f00b9.ttf::U+062A,U+062E,U+062A,U+0629:[glyph837=3@299,1170+0|uni06C1.1=3+502|glyph837=2@149,690+0|uni0628.8=2+532|glyph836=1@-51,1259+0|glyph514=1+196|glyph837=0@655,1751+0|glyph112=0@0,-358+905]
-../fonts/f22416c692720a7d46fadf4af99f4c9e094f00b9.ttf::U+062A,U+062E,U+0646,U+0629:[glyph837=3@299,1170+0|uni06C1.1=3+502|glyph836=2@149,690+0|uni0628.8=2+532|glyph836=1@-51,1259+0|glyph514=1+196|glyph837=0@655,1751+0|glyph112=0@0,-358+905]
-../fonts/f22416c692720a7d46fadf4af99f4c9e094f00b9.ttf::U+062A,U+062E,U+0626,U+0629:[glyph837=3@299,1170+0|uni06C1.1=3+502|glyph847=2@149,690+0|uni0628.8=2+532|glyph836=1@-51,1259+0|glyph514=1+196|glyph837=0@655,1751+0|glyph112=0@0,-358+905]
-../fonts/f22416c692720a7d46fadf4af99f4c9e094f00b9.ttf::U+062A,U+062E,U+062B,U+0629:[glyph837=3@299,1520+0|uni06C1.1=3+502|glyph838=2@149,690+0|uni0628.8=2+532|glyph836=1@-51,1259+0|glyph514=1+196|glyph837=0@655,1751+0|glyph112=0@0,-358+905]
-../fonts/f22416c692720a7d46fadf4af99f4c9e094f00b9.ttf::U+062A,U+062E,U+0679,U+0629:[glyph837=3@299,1520+0|uni06C1.1=3+502|glyph842=2@149,690+0|uni0628.8=2+532|glyph836=1@-51,1259+0|glyph514=1+196|glyph837=0@655,1751+0|glyph112=0@0,-358+905]
diff --git a/test/shaping/data/in-house/tests/mongolian-variation-selector.tests b/test/shaping/data/in-house/tests/mongolian-variation-selector.tests
deleted file mode 100644 (file)
index c5e35c8..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-../fonts/37033cc5cf37bb223d7355153016b6ccece93b28.ttf::U+1826,U+180B,U+1826:[uni1826.E85E_ue.init1=0+599|uni1826.E856_ue.fina=2+750]
-../fonts/ef86fe710cfea877bbe0dbb6946a1f88d0661031.ttf::U+1820,U+180B:[uni1820.E821_a.isol1=0+1199]
-../fonts/a34a7b00f22ffb5fd7eef6933b81c7e71bc2cdfb.ttf::U+180A,U+1868,U+180A,U+1868,U+180B,U+180A,U+1868,U+180C,U+180A,U+1868,U+180D,U+180A:[gid1=0+268|gid10=1+778|gid1=2+268|gid9=3+575|gid1=5+268|gid10=6+778|gid1=8+268|gid8=9+575|gid1=11+268]
-../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+183A,U+1823,U+182E,U+182B,U+1822,U+1826,U+180B,U+1832,U+180B,U+1827,U+1837:[uni183A1823.E971_ko.init=0+950|uni182E.E904_m.medi=2+400|uni182B1822.E8A6_pi.medi=3+1150|uni1826.E854_ue.medi1=5+1100|uni1832.E916_t.medi1=7+1000|uni1827.E85C_ee.medi=9+750|uni1837.E931_r.fina=10+750]
-../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+182D,U+182D,U+180B:[uni182D.E8E2_g.init=0+1000|uni182D.E8E8_g.fina1=1+1250]
-../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+182D,U+180C:[uni182D.EA1B_g.isol2=0+1000]
-../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+182D,U+180D,U+200D:[uni182D.EA1E_g.init3=0+650|space=0+0]
-../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+182D,U+200D,U+182D,U+180B,U+200D:[uni182D.E8E2_g.init=0+1000|space=0+0|uni182D.E8E5_g.medi1=2+800|space=2+0]
-../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+182D,U+180C,U+200D:[uni182D.EA1D_g.init2=0+950|space=0+0]
-../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+182D,U+180D,U+200D:[uni182D.EA1E_g.init3=0+650|space=0+0]
-../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+200D,U+182D,U+200D,U+200D,U+182D,U+180B,U+200D:[space=0+0|uni182D.E8E4_g.medi=1+800|space=1+0|space=1+0|uni182D.E8E5_g.medi1=4+800|space=4+0]
-../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+200D,U+182D,U+180C,U+200D:[space=0+0|uni182D.E8E6_g.medi2=1+650|space=1+0]
-../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+200D,U+182D,U+180D,U+200D:[space=0+0|uni182D.E8E6_g.medi2=1+650|space=1+0]
-../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+200D,U+182D,U+200D,U+182D,U+180B:[space=0+0|uni182D.E8E4_g.medi=1+800|space=1+0|uni182D.E8E8_g.fina1=3+1250]
-../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+200D,U+182D,U+180C:[space=0+0|uni182D.E8E9_g.fina2=1+1050]
-../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+1820,U+200C,U+182D,U+1820,U+1837:[uni1820.E820_a.isol=0+1550|space=1+0|uni182D.E8E2_g.init=2+1000|uni1820.E823_a.medi=3+400|uni1837.E931_r.fina=4+750]
-../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+1830,U+1824,U+1837,U+200D,U+200D,U+182D,U+1820,U+200D:[uni1830.E90B_s.init=0+850|uni1824.E844_u.medi=1+600|uni1837.E930_r.medi=2+600|space=2+0|space=2+0|uni182D.E8E5_g.medi1=5+800|uni1820.E823_a.medi=6+400|space=6+0]
-../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+200D,U+182D,U+1824,U+182F,U+1822:[space=0+0|uni182D.E8E5_g.medi1=1+800|uni1824.E844_u.medi=2+600|uni182F.E908_l.medi=3+400|uni1822.E837_i.fina=4+600]
-../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+182A,U+1820,U+1822,U+182D,U+180E,U+1820,U+202F,U+1836,U+1822,U+1828:[uni182A1820.E875_ba.init=0+1000|uni1822.E836_i.medi2=2+1000|uni182D.E8E8_g.fina1=3+1250|space=4+0|uni1820.E827_a.fina2=5+600|uni202F.nobreak=6+500|uni1836.E92B_y.init1=7+500|uni1822.E834_i.medi=8+500|uni1828.E866_n.fina=9+850]
diff --git a/test/shaping/data/in-house/tests/myanmar-syllable.tests b/test/shaping/data/in-house/tests/myanmar-syllable.tests
deleted file mode 100644 (file)
index 4666ef9..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/af3086380b743099c54a3b11b96766039ea62fcd.ttf:--no-glyph-names:U+101D,U+FE00,U+1031,U+FE00,U+1031,U+FE00:[6=0+465|6=0+465|5=0+502]
diff --git a/test/shaping/data/in-house/tests/myanmar-zawgyi.tests b/test/shaping/data/in-house/tests/myanmar-zawgyi.tests
deleted file mode 100644 (file)
index b79d4fb..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/ab14b4eb9d7a67e293f51d30d719add06c9d6e06.ttf:--script=Qaag:U+1000,U+103A,U+1004,U+1037,U+1039,U+1041:[Ka=0+2217|Ya-Semivowel=0+286|Nga=2+1247|Dot Below=2+0|Virama-Killer=2+0|One-Myanmar=5+1247]
diff --git a/test/shaping/data/in-house/tests/none-directional.tests b/test/shaping/data/in-house/tests/none-directional.tests
deleted file mode 100644 (file)
index e59946d..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-../fonts/73e84dac2fc6a2d1bc9250d1414353661088937d.ttf::U+10300,U+10301:[u10300=0+1470|u10301=1+1284]
-../fonts/73e84dac2fc6a2d1bc9250d1414353661088937d.ttf:--direction=ltr:U+10300,U+10301:[u10300=0+1470|u10301=1+1284]
-../fonts/73e84dac2fc6a2d1bc9250d1414353661088937d.ttf:--direction=rtl:U+10300,U+10301:[u10301_r=1+1284|u10300_r=0+1470]
diff --git a/test/shaping/data/in-house/tests/positioning-features.tests b/test/shaping/data/in-house/tests/positioning-features.tests
deleted file mode 100644 (file)
index 8cab9d8..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-../fonts/53a91c20e33a596f2be17fb68b382d6b7eb85d5c.ttf::U+0041,U+0056:[A=0+625|V=1+675]
-../fonts/f79eb71df4e4c9c273b67b89a06e5ff9e3c1f834.ttf::U+006D,U+0315:[m=0+945|uni0315=0@32,-178+0]
-../fonts/ea3f63620511b2097200d23774ffef197e829e69.ttf::U+0079,U+0325:[y=0+565|uni0325=0@-422,-240+0]
diff --git a/test/shaping/data/in-house/tests/rand.tests b/test/shaping/data/in-house/tests/rand.tests
deleted file mode 100644 (file)
index df324b9..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-../fonts/5bb74492f5e0ffa1fbb72e4c881be035120b6513.ttf:--no-glyph-names --features=-rand:U+0054,U+0055,U+0056:[1=0+560|2=1+602|3=2+602]
-../fonts/5bb74492f5e0ffa1fbb72e4c881be035120b6513.ttf:--no-glyph-names --features=rand=2:U+0054,U+0055,U+0056:[5=0+560|8=1+602|11=2+602]
-../fonts/5bb74492f5e0ffa1fbb72e4c881be035120b6513.ttf:--no-glyph-names:U+0054,U+0055,U+0056,U+0054,U+0055,U+0056,U+0054,U+0055,U+0056,U+0054,U+0055,U+0056:[5=0+560|7=1+602|10=2+602|4=3+560|7=4+602|10=5+602|6=6+560|9=7+602|10=8+602|5=9+560|8=10+602|12=11+602]
diff --git a/test/shaping/data/in-house/tests/rotation.tests b/test/shaping/data/in-house/tests/rotation.tests
deleted file mode 100644 (file)
index 6ecad26..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-../fonts/2681c1c72d6484ed3410417f521b1b819b4e2392.ttf:--no-clusters --no-positions --direction=l:U+3008:[uni3008]
-../fonts/2681c1c72d6484ed3410417f521b1b819b4e2392.ttf:--no-clusters --no-positions --direction=r:U+3008:[uni3009]
-../fonts/2681c1c72d6484ed3410417f521b1b819b4e2392.ttf:--no-clusters --no-positions --direction=t:U+3008:[uniFE3F]
-../fonts/2681c1c72d6484ed3410417f521b1b819b4e2392.ttf:--no-clusters --no-positions --direction=b:U+3008:[uniFE40]
diff --git a/test/shaping/data/in-house/tests/simple.tests b/test/shaping/data/in-house/tests/simple.tests
deleted file mode 100644 (file)
index 64cae0e..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-../fonts/49c9f7485c1392fa09a1b801bc2ffea79275f22e.ttf:--shaper=ot:U+0056,U+0041,U+0042,U+0045,U+0061,U+0062,U+0063,U+0064:[V=0+1142|A=1+1295|B=2+1295|E=3+1123|a=4+1126|b=5+1164|c=6+1072|d=7+1164]
-../fonts/49c9f7485c1392fa09a1b801bc2ffea79275f22e.ttf:--shaper=fallback:U+0056,U+0041,U+0042,U+0045,U+0061,U+0062,U+0063,U+0064:[V=0+1295|A=1+1295|B=2+1295|E=3+1123|a=4+1126|b=5+1164|c=6+1072|d=7+1164]
diff --git a/test/shaping/data/in-house/tests/sinhala.tests b/test/shaping/data/in-house/tests/sinhala.tests
deleted file mode 100644 (file)
index 9541754..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/5af5361ed4d1e8305780b100e1730cb09132f8d1.ttf::U+0DBB,U+0DCA,U+200D,U+0DBA,U+0DCA,U+200D,U+0DBA:[gid8=0+1343|gid4=0+1130]
diff --git a/test/shaping/data/in-house/tests/spaces.tests b/test/shaping/data/in-house/tests/spaces.tests
deleted file mode 100644 (file)
index ea90998..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+0020:[gid1=0+560]
-../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+00A0:[gid1=0+560]
-../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+1680:[gid0=0+692]
-../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+2000:[gid1=0+1024]
-../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+2001:[gid1=0+2048]
-../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+2002:[gid1=0+1024]
-../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+2003:[gid1=0+2048]
-../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+2004:[gid1=0+683]
-../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+2005:[gid1=0+512]
-../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+2006:[gid1=0+341]
-../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+2007:[gid1=0+560]
-../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+2008:[gid1=0+560]
-../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+2009:[gid1=0+410]
-../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+200A:[gid1=0+128]
-../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+202F:[gid1=0+280]
-../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+205F:[gid1=0+455]
-../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+3000:[gid1=0+2048]
-../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot --direction=ttb:U+0020:[gid1=0@-280,0+0,-2048]
-../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot --direction=ttb:U+00A0:[gid1=0@-280,0+0,-2048]
-../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot --direction=ttb:U+1680:[gid0=0@-346,0+0,-2048]
-../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot --direction=ttb:U+2000:[gid1=0@-280,0+0,-1024]
-../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot --direction=ttb:U+2001:[gid1=0@-280,0+0,-2048]
-../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot --direction=ttb:U+2002:[gid1=0@-280,0+0,-1024]
-../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot --direction=ttb:U+2003:[gid1=0@-280,0+0,-2048]
-../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot --direction=ttb:U+2004:[gid1=0@-280,0+0,-683]
-../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot --direction=ttb:U+2005:[gid1=0@-280,0+0,-512]
-../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot --direction=ttb:U+2006:[gid1=0@-280,0+0,-341]
-../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot --direction=ttb:U+2007:[gid1=0@-280,0+0,-2048]
-../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot --direction=ttb:U+2008:[gid1=0@-280,0+0,-2048]
-../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot --direction=ttb:U+2009:[gid1=0@-280,0+0,-410]
-../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot --direction=ttb:U+200A:[gid1=0@-280,0+0,-128]
-../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot --direction=ttb:U+202F:[gid1=0@-280,0+0,-1024]
-../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot --direction=ttb:U+205F:[gid1=0@-280,0+0,-455]
-../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot --direction=ttb:U+3000:[gid1=0@-280,0+0,-2048]
diff --git a/test/shaping/data/in-house/tests/tibetan-contractions-1.tests b/test/shaping/data/in-house/tests/tibetan-contractions-1.tests
deleted file mode 100644 (file)
index ccc0c9c..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+FEFF,U+0F40,U+0F72,U+0F72,U+0F0B,U+0F66,U+0FAD,U+0F7C,U+0F7C,U+0F0B:[uni0F40=0+680|uni0F720F72=0+0|uni0F0B=4+190|uni0F660FAD=5+680|uni0F7D=5+0|uni0F0B=9+190]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F40,U+0F74,U+0F72,U+0F66,U+0F0B:[uni0F400F740F72=0+680|uni0F66=3+680|uni0F0B=4+190]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F40,U+0F74,U+0F7A,U+0F53,U+0F0B:[uni0F400F74=0+680|uni0F7A=0+0|uni0F53=3+590|uni0F0B=4@-30,0+160]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F40,U+0F74,U+0F7C,U+0F56,U+0F39,U+0F0B:[uni0F400F74=0+680|uni0F7C=0+0|uni0F56=3+610|uni0F39=3+0|uni0F0B=5+190]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F40,U+0F74,U+0F72,U+0F42,U+0F66,U+0F0B:[uni0F400F740F72=0+680|uni0F42=3+680|uni0F66=4+680|uni0F0B=5+190]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F40,U+0F74,U+0F7A,U+0F66,U+0F0B:[uni0F400F74=0+680|uni0F7A=0+0|uni0F66=3+680|uni0F0B=4+190]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F40,U+0FB3,U+0F74,U+0F7A,U+0F56,U+0F66,U+0F0B:[uni0F400FB30F740F7A=0+660|uni0F56=4+610|uni0F66=5+680|uni0F0B=6+190]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F40,U+0FB3,U+0F74,U+0F7C,U+0F42,U+0F0B:[uni0F400FB30F74=0+660|uni0F7C=0+0|uni0F42=4+680|uni0F0B=5+190]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F51,U+0F40,U+0F7C,U+0F7C,U+0F42,U+0F0B:[uni0F51=0+600|uni0F400F7D=1+680|uni0F42=4+680|uni0F0B=5+190]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F51,U+0F40,U+0F7C,U+0F7C,U+0F62,U+0F0B:[uni0F51=0+600|uni0F400F7D=1+680|uni0F62=4+620|uni0F0B=5@-65,0+130]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F51,U+0F40,U+0FB1,U+0F7C,U+0F72,U+0F62,U+0F0B:[uni0F51=0+600|uni0F400FB10F7C0F72=1+660|uni0F62=5+620|uni0F0B=6@-65,0+130]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F66,U+0F90,U+0FB1,U+0F74,U+0F7A,U+0F0B:[uni0F660F900FB10F74=0+680|uni0F7A=0+0|uni0F0B=5+190]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F56,U+0F66,U+0F90,U+0FB1,U+0F7A,U+0F7A,U+0F51,U+0F0B:[uni0F56=0+610|uni0F660F900FB1=1+660|uni0F7B=1+0|uni0F51=6+600|uni0F0B=7@-70,0+106]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F56,U+0F66,U+0F90,U+0FB1,U+0F7A,U+0F7A,U+0F7A,U+0F51,U+0F0B:[uni0F56=0+610|uni0F660F900FB1=1+660|uni0F7B0F7A=1+0|uni0F51=7+600|uni0F0B=8@-70,0+106]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F41,U+0F58,U+0F66,U+0F74,U+0F7E,U+0F0B:[uni0F41=0+660|uni0F58=1+660|uni0F660F740F7E=2+680|uni0F0B=5+190]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F41,U+0F74,U+0F7C,U+0F66,U+0F39,U+0F0B:[uni0F410F74=0+680|uni0F7C=0+0|uni0F66=3+680|uni0F39=3+0|uni0F0B=5+190]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F41,U+0FB1,U+0F74,U+0F7C,U+0F42,U+0F0B:[uni0F410FB10F74=0+670|uni0F7C=0+0|uni0F42=4+680|uni0F0B=5+190]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F41,U+0FB2,U+0F74,U+0F7A,U+0F51,U+0F0B:[uni0F410FB20F74=0+660|uni0F7A=0+0|uni0F51=4+600|uni0F0B=5@-70,0+106]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F41,U+0FB2,U+0F74,U+0F72,U+0F44,U+0F0B:[uni0F410FB20F74=0+660|uni0F72=0+0|uni0F44=4+560|uni0F0B=5@-20,0+110]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F41,U+0FB2,U+0F74,U+0F7C,U+0F51,U+0F0B:[uni0F410FB20F74=0+660|uni0F7C=0+0|uni0F51=4+600|uni0F0B=5@-70,0+106]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F41,U+0FB2,U+0F74,U+0F7E,U+0F51,U+0F0B:[uni0F410FB20F740F7E=0+660|uni0F51=4+600|uni0F0B=5@-70,0+106]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F58,U+0F41,U+0FB1,U+0F7A,U+0F7A,U+0F7A,U+0F53,U+0F0B:[uni0F58=0+660|uni0F410FB1=1+680|uni0F7B0F7A=1+0|uni0F53=6+590|uni0F0B=7@-30,0+160]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F60,U+0F41,U+0F7C,U+0F7C,U+0F62,U+0F0B:[uni0F60=0+600|uni0F410F7D=1+660|uni0F62=4+620|uni0F0B=5@-65,0+130]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F42,U+0F74,U+0F7C,U+0F42,U+0F0B:[uni0F420F74=0+680|uni0F7C=0+0|uni0F42=3+680|uni0F0B=4+190]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F42,U+0FB1,U+0F74,U+0F72,U+0F42,U+0F0B:[uni0F420FB10F74=0+700|uni0F72=0+0|uni0F42=4+680|uni0F0B=5+190]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F42,U+0FB2,U+0F74,U+0F72,U+0F53,U+0F0B:[uni0F420FB20F74=0+680|uni0F72=0+0|uni0F53=4+590|uni0F0B=5@-30,0+160]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F42,U+0FB2,U+0F74,U+0F72,U+0F0B:[uni0F420FB20F74=0+680|uni0F72=0+0|uni0F0B=4+190]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F42,U+0FB2,U+0F74,U+0F7C,U+0F53,U+0F0B:[uni0F420FB20F74=0+680|uni0F7C=0+0|uni0F53=4+590|uni0F0B=5@-30,0+160]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F42,U+0FB2,U+0F74,U+0F7C,U+0F56,U+0F0B:[uni0F420FB20F74=0+680|uni0F7C=0+0|uni0F56=4+610|uni0F0B=5+190]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F42,U+0FB2,U+0F7C,U+0F72,U+0F53,U+0F0B:[uni0F420FB2=0+680|uni0F7C0F72=0+0|uni0F53=4+590|uni0F0B=5@-30,0+160]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F42,U+0FB2,U+0F7C,U+0F7A,U+0F62,U+0F0B:[uni0F420FB2=0+680|uni0F7C0F7A=0+0|uni0F62=4+620|uni0F0B=5@-65,0+130]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F51,U+0F42,U+0F74,U+0F72,U+0F42,U+0F0B:[uni0F51=0+600|uni0F420F740F72=1+680|uni0F42=4+680|uni0F0B=5+190]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F51,U+0F42,U+0F74,U+0F7A,U+0F53,U+0F0B:[uni0F51=0+600|uni0F420F74=1+680|uni0F7A=1+0|uni0F53=4+590|uni0F0B=5@-30,0+160]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F51,U+0F42,U+0F74,U+0F7A,U+0F42,U+0F66,U+0F0B:[uni0F51=0+600|uni0F420F74=1+680|uni0F7A=1+0|uni0F42=4+680|uni0F66=5+680|uni0F0B=6+190]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F51,U+0F42,U+0FB3,U+0F7C,U+0F7A,U+0F44,U+0F0B:[uni0F51=0+600|uni0F420FB3=1+680|uni0F7C0F7A=1+0|uni0F44=5+560|uni0F0B=6@-20,0+110]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F58,U+0F42,U+0F7C,U+0F7C,U+0F53,U+0F0B:[uni0F58=0+660|uni0F420F7D=1+680|uni0F53=4+590|uni0F0B=5@-30,0+160]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F44,U+0F74,U+0F72,U+0F42,U+0F0B:[uni0F440F74=0+610|uni0F72=0+0|uni0F42=3+680|uni0F0B=4+190]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F51,U+0F42,U+0FB2,U+0F74,U+0F7C,U+0F56,U+0F0B:[uni0F51=0+600|uni0F420FB20F74=1+680|uni0F7C=1+0|uni0F56=5+610|uni0F0B=6+190]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F56,U+0F45,U+0F74,U+0F72,U+0F42,U+0F0B:[uni0F56=0+610|uni0F450F740F72=1+630|uni0F42=4+680|uni0F0B=5+190]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F56,U+0F45,U+0F74,U+0F72,U+0F66,U+0F0B:[uni0F56=0+610|uni0F450F740F72=1+630|uni0F66=4+680|uni0F0B=5+190]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F56,U+0F45,U+0FB2,U+0F74,U+0F42,U+0F0B:[uni0F56=0+610|uni0F450FB20F74=1+640|uni0F42=4+680|uni0F0B=5+190]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F56,U+0F45,U+0F74,U+0F72,U+0F0B:[uni0F56=0+610|uni0F450F740F72=1+630|uni0F0B=4+190]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F56,U+0F45,U+0F74,U+0F7E,U+0F0B:[uni0F56=0+610|uni0F450F740F7E=1+630|uni0F0B=4+190]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F46,U+0F74,U+0F72,U+0F63,U+0F0B:[uni0F460F74=0+650|uni0F72=0+0|uni0F63=3+700|uni0F0B=4+190]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F46,U+0F74,U+0F7C,U+0F51,U+0F0B:[uni0F460F74=0+650|uni0F7C=0+0|uni0F51=3+600|uni0F0B=4@-70,0+106]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F46,U+0F74,U+0F7C,U+0F51,U+0F0B:[uni0F460F74=0+650|uni0F7C=0+0|uni0F51=3+600|uni0F0B=4@-70,0+106]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F46,U+0F74,U+0F7E,U+0F51,U+0F0B:[uni0F460F740F7E=0+650|uni0F51=3+600|uni0F0B=4@-70,0+106]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F46,U+0F39,U+0F74,U+0F7C,U+0F51,U+0F0B:[uni0F46=0+620|uni0F39=0+0|uni0F74=0+0|uni0F7C=0+0|uni0F51=4+600|uni0F0B=5@-70,0+106]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F46,U+0FB2,U+0F74,U+0F72,U+0F53,U+0F0B:[uni0F460FB20F740F72=0+660|uni0F53=4+590|uni0F0B=5@-30,0+160]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F46,U+0FB2,U+0F74,U+0F7C,U+0F63,U+0F0B:[uni0F460FB20F74=0+660|uni0F7C=0+0|uni0F63=4+700|uni0F0B=5+190]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F58,U+0F46,U+0F7C,U+0F7A,U+0F53,U+0F0B:[uni0F58=0+660|uni0F46=1+620|uni0F7C0F7A=1+0|uni0F53=4+590|uni0F0B=5@-30,0+160]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F60,U+0F46,U+0FB1,U+0F7C,U+0F72,U+0F62,U+0F0B:[uni0F60=0+600|uni0F460FB10F7C0F72=1+660|uni0F62=5+620|uni0F0B=6@-65,0+130]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F47,U+0F7C,U+0F7C,U+0F0B:[uni0F470F7D=0+570|uni0F0B=3+190]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F62,U+0F97,U+0F74,U+0F7A,U+0F53,U+0F39,U+0F0B:[uni0F620F970F74=0+600|uni0F7A=0+0|uni0F53=4+590|uni0F39=4+0|uni0F0B=6+190]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F49,U+0F74,U+0F72,U+0F0B:[uni0F490F74=0+580|uni0F72=0+0|uni0F0B=3+190]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F49,U+0F74,U+0F72,U+0F44,U+0F0B:[uni0F490F74=0+580|uni0F72=0+0|uni0F44=3+560|uni0F0B=4@-20,0+110]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F58,U+0F49,U+0F72,U+0F7E,U+0F51,U+0F0B:[uni0F58=0+660|uni0F49=1+580|uni0F720F7E=1+0|uni0F51=4+600|uni0F0B=5@-70,0+106]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F42,U+0F4F,U+0F74,U+0F72,U+0F42,U+0F0B:[uni0F42=0+680|uni0F4F0F740F72=1+600|uni0F42=4+680|uni0F0B=5+190]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F56,U+0F4F,U+0F44,U+0F7C,U+0F7E,U+0F66,U+0F0B:[uni0F56=0+610|uni0F4F=1+560|uni0F44=2+560|uni0F7C0F7E=2+0|uni0F66=5+680|uni0F0B=6+190]
-../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F50,U+0F39,U+0F74,U+0F7A,U+0F4A,U+0F0B:[uni0F50=0+600|uni0F39=0+0|uni0F74=0+0|uni0F7A=0+0|uni0F4A=4+590|uni0F0B=5+190]
diff --git a/test/shaping/data/in-house/tests/tibetan-contractions-2.tests b/test/shaping/data/in-house/tests/tibetan-contractions-2.tests
deleted file mode 100644 (file)
index b44445c..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F50,U+0F74,U+0F72,U+0F53,U+0F0B:[uni0F500F74=0+600|uni0F72=0+0|uni0F53=3+590|uni0F0B=4@-30,0+160]
-../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F58,U+0F50,U+0F74,U+0F7C,U+0F44,U+0F0B:[uni0F58=0+660|uni0F500F74=1+600|uni0F7C=1+0|uni0F44=4+560|uni0F0B=5@-20,0+110]
-../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F58,U+0F50,U+0F7C,U+0F7A,U+0F44,U+0F0B:[uni0F58=0+660|uni0F50=1+600|uni0F7C0F7A=1+0|uni0F44=4+560|uni0F0B=5@-20,0+110]
-../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F58,U+0F50,U+0F7C,U+0F72,U+0F66,U+0F0B:[uni0F58=0+660|uni0F50=1+600|uni0F7C0F72=1+0|uni0F66=4+680|uni0F0B=5+190]
-../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F51,U+0F74,U+0F62,U+0FB2,U+0F7C,U+0F51,U+0F0B:[uni0F510F74=0+600|uni0F620FB2=2+600|uni0F7C=2+0|uni0F51=5+600|uni0F0B=6@-70,0+106]
-../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F51,U+0FB2,U+0F74,U+0F72,U+0F42,U+0F0B:[uni0F510FB20F74=0+600|uni0F72=0+0|uni0F42=4+680|uni0F0B=5+190]
-../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F42,U+0F51,U+0F74,U+0F7A,U+0F53,U+0F0B:[uni0F42=0+680|uni0F510F740F7A=1+600|uni0F53=4+590|uni0F0B=5@-30,0+160]
-../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F56,U+0F51,U+0F7B,U+0F42,U+0F66,U+0F0B:[uni0F56=0+610|uni0F510F7B=1+579|uni0F42=3+680|uni0F66=4+680|uni0F0B=5+190]
-../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F60,U+0F51,U+0F74,U+0F7A,U+0F51,U+0F0B:[uni0F60=0+600|uni0F510F740F7A=1+600|uni0F51=4+600|uni0F0B=5@-70,0+106]
-../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F62,U+0FA1,U+0F7C,U+0F7A,U+0F0B:[uni0F620FA10F7C0F7A=0+580|uni0F0B=4+190]
-../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F66,U+0FA1,U+0F74,U+0F72,U+0F56,U+0F0B:[uni0F660FA10F74=0+680|uni0F72=0+0|uni0F56=4+610|uni0F0B=5+190]
-../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F53,U+0F74,U+0F7C,U+0F42,U+0F66,U+0F0B:[uni0F530F74=0+600|uni0F7C=0+0|uni0F42=3+680|uni0F66=4+680|uni0F0B=5+190]
-../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F53,U+0F74,U+0F7C,U+0F62,U+0F0B:[uni0F530F74=0+600|uni0F7C=0+0|uni0F62=3+620|uni0F0B=4@-65,0+130]
-../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F42,U+0F53,U+0FB1,U+0F7C,U+0F7E,U+0F62,U+0F0B:[uni0F42=0+680|uni0F530FB1=1+600|uni0F7C0F7E=1+0|uni0F62=5+620|uni0F0B=6@-65,0+130]
-../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F51,U+0F54,U+0F74,U+0F7C,U+0F42,U+0F66,U+0F0B:[uni0F51=0+600|uni0F540F74=1+610|uni0F7C=1+0|uni0F42=4+680|uni0F66=5+680|uni0F0B=6+190]
-../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F56,U+0FB1,U+0F74,U+0F7E,U+0F56,U+0F0B:[uni0F560FB10F74=0+620|uni0F7E=0+0|uni0F56=4+610|uni0F0B=5+190]
-../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F56,U+0FB3,U+0F74,U+0F7C,U+0F53,U+0F0B:[uni0F560FB30F74=0+650|uni0F7C=0+0|uni0F53=4+590|uni0F0B=5@-30,0+160]
-../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F56,U+0FB3,U+0F7C,U+0F7C,U+0F53,U+0F0B:[uni0F560FB3=0+650|uni0F7D=0+0|uni0F53=4+590|uni0F0B=5@-30,0+160]
-../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F51,U+0F56,U+0F74,U+0F7C,U+0F51,U+0F0B:[uni0F51=0+600|uni0F560F74=1+610|uni0F7C=1+0|uni0F51=4+600|uni0F0B=5@-70,0+106]
-../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F51,U+0F56,U+0F74,U+0F7C,U+0F56,U+0F66,U+0F0B:[uni0F51=0+600|uni0F560F74=1+610|uni0F7C=1+0|uni0F56=4+610|uni0F66=5+680|uni0F0B=6+190]
-../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F58,U+0F74,U+0F7A,U+0F42,U+0F66,U+0F0B:[uni0F580F74=0+680|uni0F7A=0+0|uni0F42=3+680|uni0F66=4+680|uni0F0B=5+190]
-../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F58,U+0F74,U+0F72,U+0F42,U+0F0B:[uni0F580F74=0+680|uni0F72=0+0|uni0F42=3+680|uni0F0B=4+190]
-../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F58,U+0F74,U+0F7A,U+0F42,U+0F66,U+0F0B:[uni0F580F74=0+680|uni0F7A=0+0|uni0F42=3+680|uni0F66=4+680|uni0F0B=5+190]
-../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F58,U+0F74,U+0F7A,U+0F53,U+0F0B:[uni0F580F74=0+680|uni0F7A=0+0|uni0F53=3+590|uni0F0B=4@-30,0+160]
-../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F58,U+0F9F,U+0F7C,U+0F7A,U+0F42,U+0F0B:[uni0F580F9F0F7C0F7A=0+660|uni0F42=4+680|uni0F0B=5+190]
-../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F58,U+0F7C,U+0F7A,U+0F44,U+0F0B:[uni0F58=0+660|uni0F7C0F7A=0+0|uni0F44=3+560|uni0F0B=4@-20,0+110]
-../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F42,U+0F59,U+0F74,U+0F7C,U+0F62,U+0F0B:[uni0F42=0+680|uni0F590F74=1+620|uni0F7C=1+0|uni0F62=4+620|uni0F0B=5@-65,0+130]
-../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F58,U+0F5A,U+0FAE,U+0F74,U+0F7E,U+0F66,U+0F0B:[uni0F58=0+660|uni0F5A0FAE0F740F7E=1+620|uni0F66=5+680|uni0F0B=6+190]
-../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F62,U+0FAB,U+0F74,U+0F7A,U+0F66,U+0F0B:[uni0F620FAB0F74=0+660|uni0F7A=0+0|uni0F66=4+680|uni0F0B=5+190]
-../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F62,U+0FAB,U+0F74,U+0F7A,U+0F53,U+0F0B:[uni0F620FAB0F74=0+660|uni0F7A=0+0|uni0F53=4+590|uni0F0B=5@-30,0+160]
-../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F5E,U+0F74,U+0F7C,U+0F63,U+0F0B:[uni0F5E0F74=0+660|uni0F7C=0+0|uni0F63=3+700|uni0F0B=4+190]
-../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F42,U+0F5E,U+0F74,U+0F7C,U+0F42,U+0F0B:[uni0F42=0+680|uni0F5E0F74=1+660|uni0F7C=1+0|uni0F42=4+680|uni0F0B=5+190]
-../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F42,U+0F5E,U+0F74,U+0F7C,U+0F58,U+0F66,U+0F0B:[uni0F42=0+680|uni0F5E0F74=1+660|uni0F7C=1+0|uni0F58=4+660|uni0F66=5+680|uni0F0B=6+190]
-../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F42,U+0F5F,U+0F74,U+0F7C,U+0F0B:[uni0F42=0+680|uni0F5F0F74=1+610|uni0F7C=1+0|uni0F0B=4+190]
-../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F42,U+0F5F,U+0F74,U+0F72,U+0F44,U+0F0B:[uni0F42=0+680|uni0F5F0F740F72=1+610|uni0F44=4+560|uni0F0B=5@-20,0+110]
-../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F42,U+0F5F,U+0F74,U+0F7A,U+0F62,U+0F0B:[uni0F42=0+680|uni0F5F0F74=1+610|uni0F7A=1+0|uni0F62=4+620|uni0F0B=5@-65,0+130]
-../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F42,U+0F5F,U+0F74,U+0F7A,U+0F62,U+0F0B:[uni0F42=0+680|uni0F5F0F74=1+610|uni0F7A=1+0|uni0F62=4+620|uni0F0B=5@-65,0+130]
-../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F42,U+0F5F,U+0F74,U+0F7A,U+0F51,U+0F0B:[uni0F42=0+680|uni0F5F0F74=1+610|uni0F7A=1+0|uni0F51=4+600|uni0F0B=5@-70,0+106]
-../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F60,U+0F7C,U+0F7A,U+0F62,U+0F0B:[uni0F60=0+600|uni0F7C0F7A=0+0|uni0F62=3+620|uni0F0B=4@-65,0+130]
-../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F61,U+0F72,U+0F7A,U+0F0B:[uni0F61=0+700|uni0F720F7A=0+0|uni0F0B=3+190]
-../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F61,U+0F7A,U+0F7A,U+0F66,U+0F0B:[uni0F61=0+700|uni0F7B=0+0|uni0F66=3+680|uni0F0B=4+190]
-../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F62,U+0F72,U+0F53,U+0F7C,U+0F7A,U+0F0B:[uni0F620F72=0+620|uni0F530F7C0F7A=2+590|uni0F0B=5+190]
-../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F62,U+0F74,U+0F7C,U+0F63,U+0F0B:[uni0F620F74=0+601|uni0F7C=0+0|uni0F63=3+700|uni0F0B=4+190]
-../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F66,U+0F7A,U+0F7E,U+0F53,U+0F0B:[uni0F66=0+680|uni0F7A0F7E=0+0|uni0F53=3+590|uni0F0B=4@-30,0+160]
-../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F66,U+0F7A,U+0F7E,U+0F51,U+0F60,U+0F0B:[uni0F66=0+680|uni0F7A0F7E=0+0|uni0F51=3+600|uni0F60=4+600|uni0F0B=5@-40,0+150]
-../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F66,U+0F7C,U+0F7C,U+0F56,U+0F0B:[uni0F660F7D=0+680|uni0F56=3+610|uni0F0B=4+190]
-../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F66,U+0F7C,U+0F7C,U+0F62,U+0F0B:[uni0F660F7D=0+680|uni0F62=3+620|uni0F0B=4@-65,0+130]
-../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F66,U+0FB2,U+0F7C,U+0F7A,U+0F66,U+0F0B:[uni0F660FB2=0+680|uni0F7C0F7A=0+0|uni0F66=4+680|uni0F0B=5+190]
-../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F66,U+0FB3,U+0F7C,U+0F7C,U+0F51,U+0F0B:[uni0F660FB3=0+680|uni0F7D=0+0|uni0F51=4+600|uni0F0B=5@-70,0+106]
-../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F66,U+0FB3,U+0F7C,U+0F7C,U+0F53,U+0F0B:[uni0F660FB3=0+680|uni0F7D=0+0|uni0F53=4+590|uni0F0B=5@-30,0+160]
-../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F56,U+0F66,U+0F99,U+0F7C,U+0F7E,U+0F51,U+0F66,U+0F0B:[uni0F56=0+610|uni0F660F99=1+670|uni0F7C0F7E=1+0|uni0F51=5+600|uni0F66=6+680|uni0F0B=7+190]
-../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F63,U+0FB7,U+0FB1,U+0F7C,U+0F42,U+0F66,U+0F0B:[uni0F630FB70FB1=0+680|uni0F7C=0+0|uni0F42=4+680|uni0F66=5+680|uni0F0B=6+190]
-../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F68,U+0FB1,U+0F7C,U+0F53,U+0F0B:[uni0F680FB1=0+740|uni0F7C=0+0|uni0F53=3+590|uni0F0B=4@-30,0+160]
diff --git a/test/shaping/data/in-house/tests/tibetan-vowels.tests b/test/shaping/data/in-house/tests/tibetan-vowels.tests
deleted file mode 100644 (file)
index 0bb0743..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-../fonts/82f4f3b57bb55344e72e70231380202a52af5805.ttf::U+0F68,U+0F72:[uni0F680F72=0+730]
-../fonts/82f4f3b57bb55344e72e70231380202a52af5805.ttf::U+0F68,U+0F74:[uni0F680F74=0+730]
-../fonts/82f4f3b57bb55344e72e70231380202a52af5805.ttf::U+0F68,U+0F7A:[uni0F680F7A=0+730]
-../fonts/82f4f3b57bb55344e72e70231380202a52af5805.ttf::U+0F68,U+0F7C:[uni0F680F7C=0+730]
-../fonts/82f4f3b57bb55344e72e70231380202a52af5805.ttf::U+0F68,U+0F71,U+0F72:[uni0F680F710F72=0+720]
-../fonts/82f4f3b57bb55344e72e70231380202a52af5805.ttf::U+0F68,U+0F71,U+0F74:[uni0F680F75=0+720]
-../fonts/82f4f3b57bb55344e72e70231380202a52af5805.ttf::U+0F68,U+0F7B:[uni0F680F7B=0+720]
-../fonts/82f4f3b57bb55344e72e70231380202a52af5805.ttf::U+0F68,U+0F7D:[uni0F680F7D=0+730]
-../fonts/82f4f3b57bb55344e72e70231380202a52af5805.ttf::U+0F68,U+0F7E:[uni0F680F7E=0+730]
-../fonts/82f4f3b57bb55344e72e70231380202a52af5805.ttf::U+0F68,U+0F7F:[uni0F68=0+730|uni0F7F=0+408]
-../fonts/82f4f3b57bb55344e72e70231380202a52af5805.ttf::U+0F00:[uni0F00=0+730]
diff --git a/test/shaping/data/in-house/tests/use-indic3.tests b/test/shaping/data/in-house/tests/use-indic3.tests
deleted file mode 100644 (file)
index 8c3ae13..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/3c96e7a303c58475a8c750bf4289bbe73784f37d.ttf::U+0C95,U+0CCD,U+0CB0:[uni0C95=0+1176|uni0CB0_uni0CCD.blwf=0+275]
diff --git a/test/shaping/data/in-house/tests/use-marchen.tests b/test/shaping/data/in-house/tests/use-marchen.tests
deleted file mode 100644 (file)
index 850c3e7..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8F:[u11C8F=0+3000]
-../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C71:[u11C71=0+1600]
-../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8A,U+11CB5:[u11C8A=0+2000|u11CB5=0@-2000,0+0]
-../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C84,U+11C71:[u11C84=0+2200|u11C71=1+1600]
-../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C7E,U+11C8A:[u11C7E=0+2600|u11C8A=1+2000]
-../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8A,U+11C92,U+11CA9:[u11C8A.11C92.11CA9=0+2600]
-../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8A,U+11C94,U+11CA9:[u11C8A.11C94.11CA9=0+2600]
-../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8D,U+11C92,U+11CA9:[u11C8D.11C92.11CA9=0+2600]
-../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8D,U+11C94,U+11CA9:[u11C8D.11C94.11CA9=0+2600]
-../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8D,U+11C9E,U+11CA9:[u11C8D.11C9E.11CA9=0+3200]
-../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8D,U+11CA0,U+11CA9:[u11C8D.11CA0.11CA9=0+3000]
-../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8D,U+11C92,U+11CAA:[u11C8D.11C92.11CAA=0+2000]
-../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8D,U+11C94,U+11CAA:[u11C8D.11C94.11CAA=0+2000]
-../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8D,U+11C9D,U+11CAA:[u11C8D.11C9D.11CAA=0+2000]
-../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8D,U+11C9E,U+11CAA:[u11C8D.11C9E.11CAA=0+2600]
-../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8D,U+11CA0,U+11CAA:[u11C8D.11CA0.11CAA=0+2400]
-../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C80,U+11C72,U+11CAA:[u11C80=0+2400|u11C72.11CAA=1+2000]
-../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8C,U+11CB1,U+11C8D:[u11C8C.11CB1=0+2793|u11C8D=2+2000]
-../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C80,U+11C7C,U+11CB3:[u11C80=0+2400|u11C7C.11CB3=1+2200]
-../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C7F,U+11CB2,U+11C7D:[u11C7F.11CB2=0+2400|u11C7D=2+2000]
-../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8D,U+11CB2,U+11C81:[u11C8D.11CB2=0+2000|u11C81=2+2400]
-../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8C,U+11CB4,U+11C74:[u11C8C.11CB4=0+2800|u11C74=2+2000]
-../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8A,U+11CA1,U+11CA9,U+11C71:[u11C8A.11CA1.11CA9=0+3000|u11C71=3+1600]
-../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8D,U+11CA1,U+11CA9,U+11C71:[u11C8D.11CA1.11CA9=0+3000|u11C71=3+1600]
-../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8D,U+11CA1,U+11CAA,U+11C71:[u11C8D.11CA1.11CAA=0+2400|u11C71=3+1600]
-../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8F,U+11CB0,U+11CB4,U+11CB6:[u11C8F.11CB0.11CB4=0+3600|u11CB6=0@-3200,0+0]
-../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8E,U+11CB0,U+11CB2,U+11CB5:[u11C8E.11CB0.11CB2=0+2000|u11CB5=0@-2000,0+0]
-../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C74,U+11C89,U+11CB2,U+11C75:[u11C74=0+2000|u11C89.11CB2=1+2000|u11C75=3+2000]
-../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C7C,U+11CAA,U+11CB2,U+11C75:[u11C7C.11CAA.11CB2=0+2200|u11C75=3+2000]
-../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C81,U+11C74,U+11CB2,U+11C8B:[u11C81=0+2400|u11C74.11CB2=1+2000|u11C8B=3+2400]
-../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8B,U+11CB3,U+11C74,U+11C8D:[u11C8B.11CB3=0+2400|u11C74=2+2000|u11C8D=3+2000]
-../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C83,U+11CB4,U+11C74,U+11C8D:[u11C83.11CB4=0+2800|u11C74=2+2000|u11C8D=3+2000]
-../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8B,U+11CB3,U+11C74,U+11C8D,U+11C71:[u11C8B.11CB3=0+2400|u11C74=2+2000|u11C8D=3+2000|u11C71=4+1600]
-../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C80,U+11C76,U+11CB1,U+11C75,U+11C8D:[u11C80=0+2400|u11C76.11CB1=1+3200|u11C75=3+2000|u11C8D=4+2000]
-../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C80,U+11C8D,U+11C94,U+11CAA,U+11CB1,U+11C74,U+11C8D:[u11C80=0+2400|u11C8D.11C94.11CAA.11CB1.shorti=1+2600|u11C74=5+2000|u11C8D=6+2000]
diff --git a/test/shaping/data/in-house/tests/use-syllable.tests b/test/shaping/data/in-house/tests/use-syllable.tests
deleted file mode 100644 (file)
index 9056008..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-../fonts/96490dd2ff81233b335a650e7eb660e0e7b2eeea.ttf::U+AA00,U+AA2D,U+AA29:[a_cham=0+1121|uSign_cham=0@14,0+0|.notdef=0+600]
-../fonts/e68a88939e0f06e34d2bc911f09b70890289c8fd.ttf::U+AA00,U+AA34,U+AA36:[raMedial_cham_pre=0+400|a_cham=0+1121|waMedial_cham=0@-32,0+0]
-../fonts/e68a88939e0f06e34d2bc911f09b70890289c8fd.ttf::U+AA00,U+AA35,U+AA33:[a_cham=0+1121|laMedial_cham=0@-32,0+0|yaMedial_cham=0+542]
-../fonts/e68a88939e0f06e34d2bc911f09b70890289c8fd.ttf::U+AA00,U+AA35,U+AA36:[a_cham=0+1121|laMedial_waMedial_cham=0@43,0+0]
-../fonts/074a5ae6b19de8f29772fdd5df2d3d833f81f5e6.ttf:--no-glyph-names:U+11320,U+20F0,U+11367:[3=0+502|1=0@33,0+0|4=0@300,8+0]
-../fonts/373e67bf41ca264e260a9716162b71a23549e885.ttf:--no-glyph-names:U+A8AC,U+A8B4,U+A8B5:[2=0+377|3=0+242|4=0+210]
-../fonts/59a585a63b3df608fbeef00956c8c108deec7de6.ttf:--no-glyph-names:U+1BC7,U+1BEA,U+1BF3:[1=0+749|2=0+402|4=0+535|3=0+401]
-../fonts/1ed7e9064f008f62de6ff0207bb4dd29409597a5.ttf::U+11064,U+1107F,U+11052,U+11065,U+1107F,U+11053:[brm_num100.1=0+2224|brm_num1000.2=3+1834]
-../fonts/28f497629c04ceb15546c9a70e0730125ed6698d.ttf::U+11013,U+11042,U+11046:[brm_KA=0+754|brm_vowelEE=0@-383,0+0|brm_virama=0@-524,0+0]
-../fonts/28f497629c04ceb15546c9a70e0730125ed6698d.ttf::U+11013,U+11044,U+11046:[brm_KA=0+754|brm_vowelOO=0@-647,0+0|brm_virama=0@-524,0+0]
-../fonts/28f497629c04ceb15546c9a70e0730125ed6698d.ttf::U+11013,U+1103C:[brm_KA=0+754|brm_vowelU=0@-403,0+0]
-../fonts/86cdd983c4e4c4d7f27dd405d6ceb7d4b9ed3d35.ttf::U+111C8,U+111C9,U+111C9:[u111C8=0+500|u111C9=0@-500,0+0|u111C9=0@-500,0+0]
-../fonts/3cc01fede4debd4b7794ccb1b16cdb9987ea7571.ttf::U+1A3D,U+1A5A,U+1A63:[uni1A3D=0+250|uni1A5A=0+0|uni1A63=0+250]
-../fonts/3cc01fede4debd4b7794ccb1b16cdb9987ea7571.ttf::U+1A3D,U+1A60,U+1A3D,U+1A63,U+1A60,U+1A3D,U+1A59:[uni1A3D=0+250|uni1A60=0+0|uni1A3D=2+250|uni1A63=2+250|uni1A60=2+0|uni1A3D=5+250|uni1A59=5+0]
-../fonts/3cc01fede4debd4b7794ccb1b16cdb9987ea7571.ttf::U+1A3D,U+1A60,U+1A3D,U+1A63,U+1A60,U+1A3D,U+1A5A:[uni1A3D=0+250|uni1A60=0+0|uni1A3D=2+250|uni1A63=2+250|uni1A60=2+0|uni1A3D=5+250|uni25CC=5+250|uni1A5A=5+0]
-../fonts/3cc01fede4debd4b7794ccb1b16cdb9987ea7571.ttf::U+1A3D,U+1A60,U+1A3D,U+1A63,U+1A60,U+1A3D,U+1A60:[uni1A3D=0+250|uni1A60=0+0|uni1A3D=2+250|uni1A63=2+250|uni1A60=2+0|uni1A3D=5+250|uni1A60=5+0]
diff --git a/test/shaping/data/in-house/tests/use.tests b/test/shaping/data/in-house/tests/use.tests
deleted file mode 100644 (file)
index 7631c3b..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-../fonts/fbb6c84c9e1fe0c39e152fbe845e51fd81f6748e.ttf::U+1B1B,U+1B44,U+1B13,U+1B3E:[gid3=0+990|gid7=0+2473|gid5=0@-293,-400+0]
-../fonts/4cce528e99f600ed9c25a2b69e32eb94a03b4ae8.ttf::U+1A48,U+1A58,U+1A25,U+1A48,U+1A58,U+1A25,U+1A6E,U+1A63:[uni1A48=0+1212|uni1A25=0+1912|uni1A58=0+0|uni1A48=3+1212|uni1A6E=3+0|uni1A25=3+1912|uni1A58=3+0|uni1A63=3+1212]
-../fonts/f518eb6f6b5eec2946c9fbbbde44e45d46f5e2ac.ttf::U+1A48,U+1A58,U+1A25,U+1A48,U+1A58,U+1A25,U+1A6E,U+1A63:[uni1A48=0+1212|uni1A25=0+1912|uni1A58=0+0|uni1A48=3+1212|uni1A6E=3+1211|uni1A25=3+1912|uni1A58=3+0|uni1A63=3+1212]
-../fonts/6ff0fbead4462d9f229167b4e6839eceb8465058.ttf:--font-funcs=ot:U+11103,U+11128:[u11103=0+837|u11128=0+0]
-../fonts/2a670df15b73a5dc75a5cc491bde5ac93c5077dc.ttf::U+11124,U+1112E:[u11124=0+514|u11131=0+0|u11127=0+0]
-../fonts/2a670df15b73a5dc75a5cc491bde5ac93c5077dc.ttf::U+11124,U+11131,U+11127:[u11124=0+514|u11131=0+0|u11127=0+0]
-../fonts/2a670df15b73a5dc75a5cc491bde5ac93c5077dc.ttf::U+11124,U+11127,U+11131:[u11124=0+514|u11127=0+0|uni25CC=0+547|u11131=0+0]
-../fonts/2a670df15b73a5dc75a5cc491bde5ac93c5077dc.ttf::U+11124,U+11134,U+11131:[u11124=0+514|u11134=0+0|u11131=0+0]
-../fonts/2a670df15b73a5dc75a5cc491bde5ac93c5077dc.ttf::U+11124,U+11131,U+11134:[u11124=0+514|u11131=0+0|uni25CC=0+547|u11134=0+0]
-../fonts/573d3a3177c9a8646e94c8a0d7b224334340946a.ttf::U+11410,U+11442,U+11411,U+11440,U+11443,U+11410,U+11442,U+11411,U+11441,U+11443:[E_dv.alt=0+275|Ga.icd=0+367|Gha.diag=0@100,0+386|AA_dv.alt=0+208|Candrabindu=0@17,-8+0|E_dv.alt=5+275|Ga.icd=5+367|Gha.diag=5@100,0+386|AU_dv_part.alt=5+213|Candrabindu.sm=5@-52,179+0]
-../fonts/dcf774ca21062e7439f98658b18974ea8b956d0c.ttf::U+11328,U+1134D,U+1CF4:[gid1=0+793|gid2=0+0|gid3=0+0]
-../fonts/4afb0e8b9a86bb9bd73a1247de4e33fbe3c1fd93.ttf::U+1C00,U+1C27,U+1C28,U+1C34,U+1C35:[uni1C35=0+500|uni1C34=0+500|uni1C28=0+500|uni1C27=0+500|uni1C00=0+500]
-../fonts/4afb0e8b9a86bb9bd73a1247de4e33fbe3c1fd93.ttf::U+0D4E,U+0D15,U+0D4D,U+0D15,U+0D46:[uni0D15=0+500|uni0D4E=0+500|uni0D4D=0+500|uni0D46=3+500|uni0D15=3+500]
-../fonts/4afb0e8b9a86bb9bd73a1247de4e33fbe3c1fd93.ttf::U+1102D,U+11046,U+11013,U+11046,U+11013,U+11046:[u11013=0+500|u11046_u11013=0+500|u1102D_u11046=0+500|u11046=0+500]
diff --git a/test/shaping/data/in-house/tests/variations-rvrn.tests b/test/shaping/data/in-house/tests/variations-rvrn.tests
deleted file mode 100644 (file)
index 78ebb92..0000000
+++ /dev/null
@@ -1,100 +0,0 @@
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=1:U+0072:[rvrn_base=0+1529]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=11:U+0072:[rvrn_base=0+1529]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=21:U+0072:[rvrn_base=0+1529]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=31:U+0072:[rvrn_base=0+1529]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=41:U+0072:[rvrn_base=0+1529]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=51:U+0072:[rvrn_base=0+1529]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=61:U+0072:[rvrn_base=0+1529]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=71:U+0072:[rvrn_base=0+1529]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=81:U+0072:[rvrn_base=0+1529]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=91:U+0072:[rvrn_base=0+1529]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=101:U+0072:[rvrn_base=0+1529]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=111:U+0072:[rvrn_base=0+1529]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=121:U+0072:[rvrn_base=0+1529]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=131:U+0072:[rvrn_base=0+1529]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=141:U+0072:[rvrn_base=0+1529]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=151:U+0072:[rvrn_base=0+1529]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=161:U+0072:[rvrn_base=0+1529]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=171:U+0072:[rvrn_base=0+1529]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=181:U+0072:[rvrn_base=0+1529]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=191:U+0072:[rvrn_base=0+1529]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=201:U+0072:[rvrn_base=0+1529]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=211:U+0072:[rvrn_base=0+1529]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=221:U+0072:[rvrn_base=0+1529]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=231:U+0072:[rvrn_base=0+1529]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=241:U+0072:[rvrn_base=0+1529]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=251:U+0072:[rvrn_base=0+1529]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=261:U+0072:[rvrn_base=0+1529]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=271:U+0072:[rvrn_base=0+1529]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=281:U+0072:[rvrn_base=0+1529]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=291:U+0072:[rvrn_base=0+1529]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=301:U+0072:[rvrn_base=0+1529]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=311:U+0072:[rvrn_base=0+1529]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=321:U+0072:[rvrn_base=0+1529]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=331:U+0072:[rvrn_base=0+1529]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=341:U+0072:[rvrn_base=0+1529]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=351:U+0072:[rvrn_base=0+1529]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=361:U+0072:[rvrn_base=0+1529]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=371:U+0072:[rvrn_base=0+1529]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=381:U+0072:[rvrn_base=0+1529]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=391:U+0072:[rvrn_base=0+1529]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=401:U+0072:[rvrn_base=0+1529]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=411:U+0072:[rvrn_base=0+1529]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=421:U+0072:[rvrn_base=0+1529]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=431:U+0072:[rvrn_base=0+1529]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=441:U+0072:[rvrn_base=0+1529]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=451:U+0072:[rvrn_base=0+1529]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=461:U+0072:[rvrn_base=0+1529]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=471:U+0072:[rvrn_base=0+1529]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=481:U+0072:[rvrn_base=0+1529]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=491:U+0072:[rvrn_subst=0+1825]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=501:U+0072:[rvrn_subst=0+1825]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=511:U+0072:[rvrn_subst=0+1825]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=521:U+0072:[rvrn_subst=0+1825]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=531:U+0072:[rvrn_subst=0+1825]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=541:U+0072:[rvrn_subst=0+1825]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=551:U+0072:[rvrn_subst=0+1825]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=561:U+0072:[rvrn_subst=0+1825]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=571:U+0072:[rvrn_subst=0+1825]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=581:U+0072:[rvrn_subst=0+1825]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=591:U+0072:[rvrn_subst=0+1825]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=601:U+0072:[rvrn_subst=0+1825]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=611:U+0072:[rvrn_subst=0+1825]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=621:U+0072:[rvrn_subst=0+1825]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=631:U+0072:[rvrn_subst=0+1825]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=641:U+0072:[rvrn_subst=0+1825]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=651:U+0072:[rvrn_subst=0+1825]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=661:U+0072:[rvrn_subst=0+1825]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=671:U+0072:[rvrn_subst=0+1825]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=681:U+0072:[rvrn_subst=0+1825]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=691:U+0072:[rvrn_subst=0+1825]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=701:U+0072:[rvrn_subst=0+1825]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=711:U+0072:[rvrn_subst=0+1825]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=721:U+0072:[rvrn_subst=0+1825]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=731:U+0072:[rvrn_subst=0+1825]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=741:U+0072:[rvrn_subst=0+1825]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=751:U+0072:[rvrn_subst=0+1825]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=761:U+0072:[rvrn_subst=0+1825]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=771:U+0072:[rvrn_subst=0+1825]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=781:U+0072:[rvrn_subst=0+1825]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=791:U+0072:[rvrn_subst=0+1825]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=801:U+0072:[rvrn_subst=0+1825]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=811:U+0072:[rvrn_subst=0+1825]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=821:U+0072:[rvrn_subst=0+1825]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=831:U+0072:[rvrn_subst=0+1825]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=841:U+0072:[rvrn_subst=0+1825]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=851:U+0072:[rvrn_subst=0+1825]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=861:U+0072:[rvrn_subst=0+1825]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=871:U+0072:[rvrn_subst=0+1825]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=881:U+0072:[rvrn_subst=0+1825]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=891:U+0072:[rvrn_subst=0+1825]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=901:U+0072:[rvrn_subst=0+1825]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=911:U+0072:[rvrn_subst=0+1825]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=921:U+0072:[rvrn_subst=0+1825]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=931:U+0072:[rvrn_subst=0+1825]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=941:U+0072:[rvrn_subst=0+1825]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=951:U+0072:[rvrn_subst=0+1825]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=961:U+0072:[rvrn_subst=0+1825]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=971:U+0072:[rvrn_subst=0+1825]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=981:U+0072:[rvrn_subst=0+1825]
-../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=991:U+0072:[rvrn_subst=0+1825]
diff --git a/test/shaping/data/in-house/tests/vertical.tests b/test/shaping/data/in-house/tests/vertical.tests
deleted file mode 100644 (file)
index 3958813..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-../fonts/191826b9643e3f124d865d617ae609db6a2ce203.ttf:--direction=t --font-funcs=ft:U+300C:[uni300C.vert=0@-512,-578+0,-1024]
-../fonts/f9b1dd4dcb515e757789a22cb4241107746fd3d0.ttf:--direction=t --font-funcs=ft:U+0041,U+0042:[gid1=0@-654,-2128+0,-2789|gid2=1@-665,-2125+0,-2789]
-../fonts/f9b1dd4dcb515e757789a22cb4241107746fd3d0.ttf:--direction=t --font-funcs=ot:U+0041,U+0042:[gid1=0@-654,-1468+0,-2048|gid2=1@-665,-1462+0,-2048]
-../fonts/4cbbc461be066fccc611dcc634af6e8cb2705537.ttf:--direction=t --font-funcs=ot:U+FF38:[gid2=0@-500,-867+0,-1000]
diff --git a/test/shaping/data/in-house/tests/zero-width-marks.tests b/test/shaping/data/in-house/tests/zero-width-marks.tests
deleted file mode 100644 (file)
index 1a3474a..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-../fonts/bb9473d2403488714043bcfb946c9f78b86ad627.ttf::U+1030:[circledash=0+636|u1030.med=0@-162,0+0]
-../fonts/8454d22037f892e76614e1645d066689a0200e61.ttf::U+05E0,U+05B8,U+0591,U+05DA,U+05B0:[uni05DA05B0=3+991|uni2009=0+200|uni0591=0@75,0+0|uni05B8=0@495,0+0|uni05E0=0+683]
-../fonts/45855bc8d46332b39c4ab9e2ee1a26b1f896da6b.ttf::U+0E01,U+0E34,U+0E01:[gid1=0+1264|gid2=0@20,0+0|gid1=2+1264]
-../fonts/7a37dc4d5bf018456aea291cee06daf004c0221c.ttf::U+0E01,U+0E34,U+0E01:[gid1=0+1264|gid2=0@20,0+1000|gid1=2+1264]
-../fonts/8099955657a54e9ee38a6ba1d6f950ce58e3cc25.ttf::U+0E01,U+0E34,U+0E01:[gid1=0+1264|gid2=0+0|gid1=2+1264]
-../fonts/bb0c53752e85c3d28973ebc913287b8987d3dfe8.ttf::U+0E01,U+0E34,U+0E01:[gid1=0+1264|gid2=0+0|gid1=2+1264]
-../fonts/ffa0f5d2d9025486d8469d8b1fdd983e7632499b.ttf::U+0058,U+0303,U+0078,U+0303,U+006A,U+006A,U+006A,U+0303,U+006A,U+0303,U+006A,U+006A:[gid1=0+1200|gid6=0@-1029,340+0|gid3=2+1083|gid6=2@-992,0+0|gid2=4+528|gid2=5+528|gid5=6+528|gid6=6@-693,0+0|gid5=8+528|gid6=8@-693,0+0|gid2=10+528|gid2=11+528]
-../fonts/cc5f3d2d717fb6bd4dfae1c16d48a2cb8e12233b.ttf::U+0058,U+0303,U+0078,U+0303,U+006A,U+006A,U+006A,U+0303,U+006A,U+0303,U+006A,U+006A:[gid1=0+1200|gid6=0@-1029,340+1200|gid3=2+1083|gid6=2@-992,0+1200|gid2=4+528|gid2=5+528|gid5=6+528|gid6=6@-693,0+1200|gid5=8+528|gid6=8@-693,0+1200|gid2=10+528|gid2=11+528]
-../fonts/fcdcffbdf1c4c97c05308d7600e4c283eb47dbca.ttf::U+0058,U+0303,U+0078,U+0303,U+006A,U+006A,U+006A,U+0303,U+006A,U+0303,U+006A,U+006A:[gid1=0+1200|gid6=0+0|gid3=2+1083|gid6=2+0|gid2=4+528|gid2=5+528|gid5=6+528|gid6=6+0|gid5=8+528|gid6=8+0|gid2=10+528|gid2=11+528]
-../fonts/56cfd0e18d07f41c38e9598545a6d369127fc6f9.ttf::U+0058,U+0303,U+0078,U+0303,U+006A,U+006A,U+006A,U+0303,U+006A,U+0303,U+006A,U+006A:[gid1=0+1200|gid6=0@-1029,340+0|gid3=2+1083|gid6=2@-992,0+0|gid2=4+528|gid2=5+528|gid5=6+528|gid6=6@-693,0+0|gid5=8+528|gid6=8@-693,0+0|gid2=10+528|gid2=11+528]
-../fonts/a98e908e2ed21b22228ea59ebcc0f05034c86f2e.ttf::U+0041,U+0042,U+0041:[A=0+1368|B=1+0|A=2+1368]
diff --git a/test/shaping/data/text-rendering-tests/Makefile.am b/test/shaping/data/text-rendering-tests/Makefile.am
deleted file mode 100644 (file)
index 17d7ba5..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-# Process this file with automake to produce Makefile.in
-
-NULL =
-
-# Convenience targets:
-lib:
-       @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
-
-update:
-       (cd $(srcdir) && ./update.sh)
-
-EXTRA_DIST = \
-       README \
-       COPYING \
-       DISABLED \
-       update.py \
-       meson.build \
-       fonts \
-       $(TESTS) \
-       $(NULL)
-
-TEST_EXTENSIONS = .tests
-TESTS_LOG_COMPILER = $(srcdir)/../../run-tests.py $(top_builddir)/util/hb-shape$(EXEEXT)
-
-include Makefile.sources
-
--include $(top_srcdir)/git.mk
diff --git a/test/shaping/data/text-rendering-tests/Makefile.in b/test/shaping/data/text-rendering-tests/Makefile.in
deleted file mode 100644 (file)
index bebe203..0000000
+++ /dev/null
@@ -1,950 +0,0 @@
-# Makefile.in generated by automake 1.16.2 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994-2020 Free Software Foundation, Inc.
-
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-# Process this file with automake to produce Makefile.in
-VPATH = @srcdir@
-am__is_gnu_make = { \
-  if test -z '$(MAKELEVEL)'; then \
-    false; \
-  elif test -n '$(MAKE_HOST)'; then \
-    true; \
-  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
-    true; \
-  else \
-    false; \
-  fi; \
-}
-am__make_running_with_option = \
-  case $${target_option-} in \
-      ?) ;; \
-      *) echo "am__make_running_with_option: internal error: invalid" \
-              "target option '$${target_option-}' specified" >&2; \
-         exit 1;; \
-  esac; \
-  has_opt=no; \
-  sane_makeflags=$$MAKEFLAGS; \
-  if $(am__is_gnu_make); then \
-    sane_makeflags=$$MFLAGS; \
-  else \
-    case $$MAKEFLAGS in \
-      *\\[\ \  ]*) \
-        bs=\\; \
-        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
-          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
-    esac; \
-  fi; \
-  skip_next=no; \
-  strip_trailopt () \
-  { \
-    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
-  }; \
-  for flg in $$sane_makeflags; do \
-    test $$skip_next = yes && { skip_next=no; continue; }; \
-    case $$flg in \
-      *=*|--*) continue;; \
-        -*I) strip_trailopt 'I'; skip_next=yes;; \
-      -*I?*) strip_trailopt 'I';; \
-        -*O) strip_trailopt 'O'; skip_next=yes;; \
-      -*O?*) strip_trailopt 'O';; \
-        -*l) strip_trailopt 'l'; skip_next=yes;; \
-      -*l?*) strip_trailopt 'l';; \
-      -[dEDm]) skip_next=yes;; \
-      -[JT]) skip_next=yes;; \
-    esac; \
-    case $$flg in \
-      *$$target_option*) has_opt=yes; break;; \
-    esac; \
-  done; \
-  test $$has_opt = yes
-am__make_dryrun = (target_option=n; $(am__make_running_with_option))
-am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-TESTS = tests/AVAR-1.tests tests/CFF-1.tests tests/CFF-2.tests \
-       tests/CFF2-1.tests tests/CMAP-1.tests tests/CMAP-2.tests \
-       tests/CVAR-1.tests tests/CVAR-2.tests tests/GLYF-1.tests \
-       tests/GPOS-1.tests tests/GPOS-2.tests tests/GPOS-3.tests \
-       tests/GPOS-4.tests tests/GPOS-5.tests tests/GSUB-1.tests \
-       tests/GSUB-2.tests tests/GSUB-3.tests tests/GVAR-1.tests \
-       tests/GVAR-2.tests tests/GVAR-3.tests tests/GVAR-4.tests \
-       tests/GVAR-5.tests tests/GVAR-6.tests tests/GVAR-7.tests \
-       tests/GVAR-8.tests tests/GVAR-9.tests tests/HVAR-1.tests \
-       tests/HVAR-2.tests tests/KERN-1.tests tests/KERN-2.tests \
-       tests/MORX-1.tests tests/MORX-10.tests tests/MORX-11.tests \
-       tests/MORX-12.tests tests/MORX-13.tests tests/MORX-14.tests \
-       tests/MORX-16.tests tests/MORX-17.tests tests/MORX-18.tests \
-       tests/MORX-19.tests tests/MORX-2.tests tests/MORX-20.tests \
-       tests/MORX-21.tests tests/MORX-22.tests tests/MORX-23.tests \
-       tests/MORX-24.tests tests/MORX-25.tests tests/MORX-26.tests \
-       tests/MORX-27.tests tests/MORX-28.tests tests/MORX-29.tests \
-       tests/MORX-3.tests tests/MORX-30.tests tests/MORX-31.tests \
-       tests/MORX-32.tests tests/MORX-33.tests tests/MORX-34.tests \
-       tests/MORX-35.tests tests/MORX-36.tests tests/MORX-37.tests \
-       tests/MORX-38.tests tests/MORX-39.tests tests/MORX-4.tests \
-       tests/MORX-40.tests tests/MORX-41.tests tests/MORX-5.tests \
-       tests/MORX-6.tests tests/MORX-7.tests tests/MORX-8.tests \
-       tests/MORX-9.tests tests/SFNT-1.tests tests/SFNT-2.tests \
-       tests/SHBALI-3.tests tests/SHKNDA-1.tests $(am__EXEEXT_1)
-subdir = test/shaping/data/text-rendering-tests
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_link_flag.m4 \
-       $(top_srcdir)/m4/ax_code_coverage.m4 \
-       $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \
-       $(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/gtk-doc.m4 \
-       $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
-       $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
-       $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-       $(ACLOCAL_M4)
-DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-AM_V_P = $(am__v_P_@AM_V@)
-am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
-am__v_P_0 = false
-am__v_P_1 = :
-AM_V_GEN = $(am__v_GEN_@AM_V@)
-am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
-am__v_GEN_0 = @echo "  GEN     " $@;
-am__v_GEN_1 = 
-AM_V_at = $(am__v_at_@AM_V@)
-am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
-am__v_at_0 = @
-am__v_at_1 = 
-SOURCES =
-DIST_SOURCES =
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
-am__tty_colors_dummy = \
-  mgn= red= grn= lgn= blu= brg= std=; \
-  am__color_tests=no
-am__tty_colors = { \
-  $(am__tty_colors_dummy); \
-  if test "X$(AM_COLOR_TESTS)" = Xno; then \
-    am__color_tests=no; \
-  elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
-    am__color_tests=yes; \
-  elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
-    am__color_tests=yes; \
-  fi; \
-  if test $$am__color_tests = yes; then \
-    red='\e[0;31m'; \
-    grn='\e[0;32m'; \
-    lgn='\e[1;32m'; \
-    blu='\e[1;34m'; \
-    mgn='\e[0;35m'; \
-    brg='\e[1m'; \
-    std='\e[m'; \
-  fi; \
-}
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
-  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
-  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
-  for p in $$list; do echo "$$p $$p"; done | \
-  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
-  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
-    if (++n[$$2] == $(am__install_max)) \
-      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
-    END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
-  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
-  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
-  test -z "$$files" \
-    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
-    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
-         $(am__cd) "$$dir" && rm -f $$files; }; \
-  }
-am__recheck_rx = ^[    ]*:recheck:[    ]*
-am__global_test_result_rx = ^[         ]*:global-test-result:[         ]*
-am__copy_in_global_log_rx = ^[         ]*:copy-in-global-log:[         ]*
-# A command that, given a newline-separated list of test names on the
-# standard input, print the name of the tests that are to be re-run
-# upon "make recheck".
-am__list_recheck_tests = $(AWK) '{ \
-  recheck = 1; \
-  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
-    { \
-      if (rc < 0) \
-        { \
-          if ((getline line2 < ($$0 ".log")) < 0) \
-           recheck = 0; \
-          break; \
-        } \
-      else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
-        { \
-          recheck = 0; \
-          break; \
-        } \
-      else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
-        { \
-          break; \
-        } \
-    }; \
-  if (recheck) \
-    print $$0; \
-  close ($$0 ".trs"); \
-  close ($$0 ".log"); \
-}'
-# A command that, given a newline-separated list of test names on the
-# standard input, create the global log from their .trs and .log files.
-am__create_global_log = $(AWK) ' \
-function fatal(msg) \
-{ \
-  print "fatal: making $@: " msg | "cat >&2"; \
-  exit 1; \
-} \
-function rst_section(header) \
-{ \
-  print header; \
-  len = length(header); \
-  for (i = 1; i <= len; i = i + 1) \
-    printf "="; \
-  printf "\n\n"; \
-} \
-{ \
-  copy_in_global_log = 1; \
-  global_test_result = "RUN"; \
-  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
-    { \
-      if (rc < 0) \
-         fatal("failed to read from " $$0 ".trs"); \
-      if (line ~ /$(am__global_test_result_rx)/) \
-        { \
-          sub("$(am__global_test_result_rx)", "", line); \
-          sub("[       ]*$$", "", line); \
-          global_test_result = line; \
-        } \
-      else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
-        copy_in_global_log = 0; \
-    }; \
-  if (copy_in_global_log) \
-    { \
-      rst_section(global_test_result ": " $$0); \
-      while ((rc = (getline line < ($$0 ".log"))) != 0) \
-      { \
-        if (rc < 0) \
-          fatal("failed to read from " $$0 ".log"); \
-        print line; \
-      }; \
-      printf "\n"; \
-    }; \
-  close ($$0 ".trs"); \
-  close ($$0 ".log"); \
-}'
-# Restructured Text title.
-am__rst_title = { sed 's/.*/   &   /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
-# Solaris 10 'make', and several other traditional 'make' implementations,
-# pass "-e" to $(SHELL), and POSIX 2008 even requires this.  Work around it
-# by disabling -e (using the XSI extension "set +e") if it's set.
-am__sh_e_setup = case $$- in *e*) set +e;; esac
-# Default flags passed to test drivers.
-am__common_driver_flags = \
-  --color-tests "$$am__color_tests" \
-  --enable-hard-errors "$$am__enable_hard_errors" \
-  --expect-failure "$$am__expect_failure"
-# To be inserted before the command running the test.  Creates the
-# directory for the log if needed.  Stores in $dir the directory
-# containing $f, in $tst the test, in $log the log.  Executes the
-# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
-# passes TESTS_ENVIRONMENT.  Set up options for the wrapper that
-# will run the test scripts (or their associated LOG_COMPILER, if
-# thy have one).
-am__check_pre = \
-$(am__sh_e_setup);                                     \
-$(am__vpath_adj_setup) $(am__vpath_adj)                        \
-$(am__tty_colors);                                     \
-srcdir=$(srcdir); export srcdir;                       \
-case "$@" in                                           \
-  */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;;   \
-    *) am__odir=.;;                                    \
-esac;                                                  \
-test "x$$am__odir" = x"." || test -d "$$am__odir"      \
-  || $(MKDIR_P) "$$am__odir" || exit $$?;              \
-if test -f "./$$f"; then dir=./;                       \
-elif test -f "$$f"; then dir=;                         \
-else dir="$(srcdir)/"; fi;                             \
-tst=$$dir$$f; log='$@';                                \
-if test -n '$(DISABLE_HARD_ERRORS)'; then              \
-  am__enable_hard_errors=no;                           \
-else                                                   \
-  am__enable_hard_errors=yes;                          \
-fi;                                                    \
-case " $(XFAIL_TESTS) " in                             \
-  *[\ \        ]$$f[\ \        ]* | *[\ \      ]$$dir$$f[\ \   ]*) \
-    am__expect_failure=yes;;                           \
-  *)                                                   \
-    am__expect_failure=no;;                            \
-esac;                                                  \
-$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
-# A shell command to get the names of the tests scripts with any registered
-# extension removed (i.e., equivalently, the names of the test logs, with
-# the '.log' extension removed).  The result is saved in the shell variable
-# '$bases'.  This honors runtime overriding of TESTS and TEST_LOGS.  Sadly,
-# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
-# since that might cause problem with VPATH rewrites for suffix-less tests.
-# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
-am__set_TESTS_bases = \
-  bases='$(TEST_LOGS)'; \
-  bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
-  bases=`echo $$bases`
-RECHECK_LOGS = $(TEST_LOGS)
-AM_RECURSIVE_TARGETS = check recheck
-am__EXEEXT_1 =
-TEST_SUITE_LOG = test-suite.log
-am__test_logs1 = $(TESTS:=.log)
-am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
-TEST_LOGS = $(am__test_logs2:.tests.log=.log)
-TESTS_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
-TESTS_LOG_COMPILE = $(TESTS_LOG_COMPILER) $(AM_TESTS_LOG_FLAGS) \
-       $(TESTS_LOG_FLAGS)
-am__set_b = \
-  case '$@' in \
-    */*) \
-      case '$*' in \
-        */*) b='$*';; \
-          *) b=`echo '$@' | sed 's/\.log$$//'`; \
-       esac;; \
-    *) \
-      b='$*';; \
-  esac
-am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.sources \
-       $(top_srcdir)/test-driver COPYING README
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CAIRO_CFLAGS = @CAIRO_CFLAGS@
-CAIRO_FT_CFLAGS = @CAIRO_FT_CFLAGS@
-CAIRO_FT_LIBS = @CAIRO_FT_LIBS@
-CAIRO_LIBS = @CAIRO_LIBS@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
-CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
-CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
-CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
-CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
-CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
-CORETEXT_CFLAGS = @CORETEXT_CFLAGS@
-CORETEXT_LIBS = @CORETEXT_LIBS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DIRECTWRITE_CXXFLAGS = @DIRECTWRITE_CXXFLAGS@
-DIRECTWRITE_LIBS = @DIRECTWRITE_LIBS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-FGREP = @FGREP@
-FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@
-FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
-FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
-FREETYPE_DEPS = @FREETYPE_DEPS@
-FREETYPE_LIBS = @FREETYPE_LIBS@
-GCOV = @GCOV@
-GDI_CFLAGS = @GDI_CFLAGS@
-GDI_LIBS = @GDI_LIBS@
-GENHTML = @GENHTML@
-GIT = @GIT@
-GLIB_CFLAGS = @GLIB_CFLAGS@
-GLIB_DEPS = @GLIB_DEPS@
-GLIB_LIBS = @GLIB_LIBS@
-GLIB_MKENUMS = @GLIB_MKENUMS@
-GOBJECT_CFLAGS = @GOBJECT_CFLAGS@
-GOBJECT_LIBS = @GOBJECT_LIBS@
-GRAPHITE2_CFLAGS = @GRAPHITE2_CFLAGS@
-GRAPHITE2_DEPS = @GRAPHITE2_DEPS@
-GRAPHITE2_LIBS = @GRAPHITE2_LIBS@
-GREP = @GREP@
-GTKDOC_CHECK = @GTKDOC_CHECK@
-GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@
-GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
-GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
-GTKDOC_MKPDF = @GTKDOC_MKPDF@
-GTKDOC_REBASE = @GTKDOC_REBASE@
-HAVE_CXX11 = @HAVE_CXX11@
-HB_LIBTOOL_VERSION_INFO = @HB_LIBTOOL_VERSION_INFO@
-HB_VERSION = @HB_VERSION@
-HB_VERSION_MAJOR = @HB_VERSION_MAJOR@
-HB_VERSION_MICRO = @HB_VERSION_MICRO@
-HB_VERSION_MINOR = @HB_VERSION_MINOR@
-HTML_DIR = @HTML_DIR@
-ICU_CFLAGS = @ICU_CFLAGS@
-ICU_CONFIG = @ICU_CONFIG@
-ICU_LIBS = @ICU_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
-INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
-INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
-INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
-INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
-INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
-INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
-INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
-LCOV = @LCOV@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MKDIR_P = @MKDIR_P@
-NM = @NM@
-NMEDIT = @NMEDIT@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PKG_CONFIG = @PKG_CONFIG@
-PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
-PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
-PTHREAD_CC = @PTHREAD_CC@
-PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
-PTHREAD_LIBS = @PTHREAD_LIBS@
-RAGEL = @RAGEL@
-RANLIB = @RANLIB@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-UNISCRIBE_CFLAGS = @UNISCRIBE_CFLAGS@
-UNISCRIBE_LIBS = @UNISCRIBE_LIBS@
-VERSION = @VERSION@
-_GI_EXP_DATADIR = @_GI_EXP_DATADIR@
-_GI_EXP_LIBDIR = @_GI_EXP_LIBDIR@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-ax_pthread_config = @ax_pthread_config@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-have_gobject = @have_gobject@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-NULL = 
-EXTRA_DIST = \
-       README \
-       COPYING \
-       DISABLED \
-       update.py \
-       meson.build \
-       fonts \
-       $(TESTS) \
-       $(NULL)
-
-TEST_EXTENSIONS = .tests
-TESTS_LOG_COMPILER = $(srcdir)/../../run-tests.py $(top_builddir)/util/hb-shape$(EXEEXT)
-DISBALED_TESTS = \
-       tests/CMAP-3.tests \
-       tests/SHARAN-1.tests \
-       tests/SHBALI-1.tests \
-       tests/SHBALI-2.tests \
-       tests/SHKNDA-2.tests \
-       tests/SHKNDA-3.tests \
-       tests/SHLANA-1.tests \
-       tests/SHLANA-10.tests \
-       tests/SHLANA-2.tests \
-       tests/SHLANA-3.tests \
-       tests/SHLANA-4.tests \
-       tests/SHLANA-5.tests \
-       tests/SHLANA-6.tests \
-       tests/SHLANA-7.tests \
-       tests/SHLANA-8.tests \
-       tests/SHLANA-9.tests \
-       $(NULL)
-
-all: all-am
-
-.SUFFIXES:
-.SUFFIXES: .log .tests .tests$(EXEEXT) .trs
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am $(srcdir)/Makefile.sources $(am__configure_deps)
-       @for dep in $?; do \
-         case '$(am__configure_deps)' in \
-           *$$dep*) \
-             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-               && { if test -f $@; then exit 0; else break; fi; }; \
-             exit 1;; \
-         esac; \
-       done; \
-       echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits test/shaping/data/text-rendering-tests/Makefile'; \
-       $(am__cd) $(top_srcdir) && \
-         $(AUTOMAKE) --gnits test/shaping/data/text-rendering-tests/Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-       @case '$?' in \
-         *config.status*) \
-           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-         *) \
-           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
-           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
-       esac;
-$(srcdir)/Makefile.sources $(am__empty):
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
-       -rm -f *.lo
-
-clean-libtool:
-       -rm -rf .libs _libs
-tags TAGS:
-
-ctags CTAGS:
-
-cscope cscopelist:
-
-
-# Recover from deleted '.trs' file; this should ensure that
-# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
-# both 'foo.log' and 'foo.trs'.  Break the recipe in two subshells
-# to avoid problems with "make -n".
-.log.trs:
-       rm -f $< $@
-       $(MAKE) $(AM_MAKEFLAGS) $<
-
-# Leading 'am--fnord' is there to ensure the list of targets does not
-# expand to empty, as could happen e.g. with make check TESTS=''.
-am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
-am--force-recheck:
-       @:
-
-$(TEST_SUITE_LOG): $(TEST_LOGS)
-       @$(am__set_TESTS_bases); \
-       am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
-       redo_bases=`for i in $$bases; do \
-                     am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
-                   done`; \
-       if test -n "$$redo_bases"; then \
-         redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
-         redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
-         if $(am__make_dryrun); then :; else \
-           rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
-         fi; \
-       fi; \
-       if test -n "$$am__remaking_logs"; then \
-         echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
-              "recursion detected" >&2; \
-       elif test -n "$$redo_logs"; then \
-         am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
-       fi; \
-       if $(am__make_dryrun); then :; else \
-         st=0;  \
-         errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
-         for i in $$redo_bases; do \
-           test -f $$i.trs && test -r $$i.trs \
-             || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
-           test -f $$i.log && test -r $$i.log \
-             || { echo "$$errmsg $$i.log" >&2; st=1; }; \
-         done; \
-         test $$st -eq 0 || exit 1; \
-       fi
-       @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
-       ws='[   ]'; \
-       results=`for b in $$bases; do echo $$b.trs; done`; \
-       test -n "$$results" || results=/dev/null; \
-       all=`  grep "^$$ws*:test-result:"           $$results | wc -l`; \
-       pass=` grep "^$$ws*:test-result:$$ws*PASS"  $$results | wc -l`; \
-       fail=` grep "^$$ws*:test-result:$$ws*FAIL"  $$results | wc -l`; \
-       skip=` grep "^$$ws*:test-result:$$ws*SKIP"  $$results | wc -l`; \
-       xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
-       xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
-       error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
-       if test `expr $$fail + $$xpass + $$error` -eq 0; then \
-         success=true; \
-       else \
-         success=false; \
-       fi; \
-       br='==================='; br=$$br$$br$$br$$br; \
-       result_count () \
-       { \
-           if test x"$$1" = x"--maybe-color"; then \
-             maybe_colorize=yes; \
-           elif test x"$$1" = x"--no-color"; then \
-             maybe_colorize=no; \
-           else \
-             echo "$@: invalid 'result_count' usage" >&2; exit 4; \
-           fi; \
-           shift; \
-           desc=$$1 count=$$2; \
-           if test $$maybe_colorize = yes && test $$count -gt 0; then \
-             color_start=$$3 color_end=$$std; \
-           else \
-             color_start= color_end=; \
-           fi; \
-           echo "$${color_start}# $$desc $$count$${color_end}"; \
-       }; \
-       create_testsuite_report () \
-       { \
-         result_count $$1 "TOTAL:" $$all   "$$brg"; \
-         result_count $$1 "PASS: " $$pass  "$$grn"; \
-         result_count $$1 "SKIP: " $$skip  "$$blu"; \
-         result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
-         result_count $$1 "FAIL: " $$fail  "$$red"; \
-         result_count $$1 "XPASS:" $$xpass "$$red"; \
-         result_count $$1 "ERROR:" $$error "$$mgn"; \
-       }; \
-       {                                                               \
-         echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" |       \
-           $(am__rst_title);                                           \
-         create_testsuite_report --no-color;                           \
-         echo;                                                         \
-         echo ".. contents:: :depth: 2";                               \
-         echo;                                                         \
-         for b in $$bases; do echo $$b; done                           \
-           | $(am__create_global_log);                                 \
-       } >$(TEST_SUITE_LOG).tmp || exit 1;                             \
-       mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG);                     \
-       if $$success; then                                              \
-         col="$$grn";                                                  \
-        else                                                           \
-         col="$$red";                                                  \
-         test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG);               \
-       fi;                                                             \
-       echo "$${col}$$br$${std}";                                      \
-       echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}";   \
-       echo "$${col}$$br$${std}";                                      \
-       create_testsuite_report --maybe-color;                          \
-       echo "$$col$$br$$std";                                          \
-       if $$success; then :; else                                      \
-         echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}";         \
-         if test -n "$(PACKAGE_BUGREPORT)"; then                       \
-           echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
-         fi;                                                           \
-         echo "$$col$$br$$std";                                        \
-       fi;                                                             \
-       $$success || exit 1
-
-check-TESTS: 
-       @list='$(RECHECK_LOGS)';           test -z "$$list" || rm -f $$list
-       @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
-       @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
-       @set +e; $(am__set_TESTS_bases); \
-       log_list=`for i in $$bases; do echo $$i.log; done`; \
-       trs_list=`for i in $$bases; do echo $$i.trs; done`; \
-       log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
-       $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
-       exit $$?;
-recheck: all 
-       @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
-       @set +e; $(am__set_TESTS_bases); \
-       bases=`for i in $$bases; do echo $$i; done \
-                | $(am__list_recheck_tests)` || exit 1; \
-       log_list=`for i in $$bases; do echo $$i.log; done`; \
-       log_list=`echo $$log_list`; \
-       $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
-               am__force_recheck=am--force-recheck \
-               TEST_LOGS="$$log_list"; \
-       exit $$?
-.tests.log:
-       @p='$<'; \
-       $(am__set_b); \
-       $(am__check_pre) $(TESTS_LOG_DRIVER) --test-name "$$f" \
-       --log-file $$b.log --trs-file $$b.trs \
-       $(am__common_driver_flags) $(AM_TESTS_LOG_DRIVER_FLAGS) $(TESTS_LOG_DRIVER_FLAGS) -- $(TESTS_LOG_COMPILE) \
-       "$$tst" $(AM_TESTS_FD_REDIRECT)
-@am__EXEEXT_TRUE@.tests$(EXEEXT).log:
-@am__EXEEXT_TRUE@      @p='$<'; \
-@am__EXEEXT_TRUE@      $(am__set_b); \
-@am__EXEEXT_TRUE@      $(am__check_pre) $(TESTS_LOG_DRIVER) --test-name "$$f" \
-@am__EXEEXT_TRUE@      --log-file $$b.log --trs-file $$b.trs \
-@am__EXEEXT_TRUE@      $(am__common_driver_flags) $(AM_TESTS_LOG_DRIVER_FLAGS) $(TESTS_LOG_DRIVER_FLAGS) -- $(TESTS_LOG_COMPILE) \
-@am__EXEEXT_TRUE@      "$$tst" $(AM_TESTS_FD_REDIRECT)
-
-distdir: $(BUILT_SOURCES)
-       $(MAKE) $(AM_MAKEFLAGS) distdir-am
-
-distdir-am: $(DISTFILES)
-       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-       list='$(DISTFILES)'; \
-         dist_files=`for file in $$list; do echo $$file; done | \
-         sed -e "s|^$$srcdirstrip/||;t" \
-             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-       case $$dist_files in \
-         */*) $(MKDIR_P) `echo "$$dist_files" | \
-                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-                          sort -u` ;; \
-       esac; \
-       for file in $$dist_files; do \
-         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-         if test -d $$d/$$file; then \
-           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-           if test -d "$(distdir)/$$file"; then \
-             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-           fi; \
-           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-           fi; \
-           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-         else \
-           test -f "$(distdir)/$$file" \
-           || cp -p $$d/$$file "$(distdir)/$$file" \
-           || exit 1; \
-         fi; \
-       done
-check-am: all-am
-       $(MAKE) $(AM_MAKEFLAGS) check-TESTS
-check: check-am
-all-am: Makefile
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-       if test -z '$(STRIP)'; then \
-         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-             install; \
-       else \
-         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-       fi
-mostlyclean-generic:
-       -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
-       -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
-       -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
-
-clean-generic:
-
-distclean-generic:
-       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-       @echo "This command is intended for maintainers to use"
-       @echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
-       -rm -f Makefile
-distclean-am: clean-am distclean-generic
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-       -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: check-am install-am install-strip
-
-.PHONY: all all-am check check-TESTS check-am clean clean-generic \
-       clean-libtool cscopelist-am ctags-am distclean \
-       distclean-generic distclean-libtool distdir dvi dvi-am html \
-       html-am info info-am install install-am install-data \
-       install-data-am install-dvi install-dvi-am install-exec \
-       install-exec-am install-html install-html-am install-info \
-       install-info-am install-man install-pdf install-pdf-am \
-       install-ps install-ps-am install-strip installcheck \
-       installcheck-am installdirs maintainer-clean \
-       maintainer-clean-generic mostlyclean mostlyclean-generic \
-       mostlyclean-libtool pdf pdf-am ps ps-am recheck tags-am \
-       uninstall uninstall-am
-
-.PRECIOUS: Makefile
-
-
-# Convenience targets:
-lib:
-       @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
-
-update:
-       (cd $(srcdir) && ./update.sh)
-
--include $(top_srcdir)/git.mk
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/test/shaping/data/text-rendering-tests/tests/AVAR-1.tests b/test/shaping/data/text-rendering-tests/tests/AVAR-1.tests
deleted file mode 100644 (file)
index 19223eb..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-../fonts/TestAVAR.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=100:U+2A01:[gid1]
-../fonts/TestAVAR.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=150:U+2A01:[gid1]
-../fonts/TestAVAR.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=200:U+2A01:[gid1]
-../fonts/TestAVAR.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=250:U+2A01:[gid1]
-../fonts/TestAVAR.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=300:U+2A01:[gid1]
-../fonts/TestAVAR.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=350:U+2A01:[gid1]
-../fonts/TestAVAR.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=400:U+2A01:[gid1]
-../fonts/TestAVAR.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=450:U+2A01:[gid1]
-../fonts/TestAVAR.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=500:U+2A01:[gid1]
-../fonts/TestAVAR.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=550:U+2A01:[gid1]
-../fonts/TestAVAR.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=600:U+2A01:[gid1]
-../fonts/TestAVAR.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=650:U+2A01:[gid1]
-../fonts/TestAVAR.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=700:U+2A01:[gid1]
-../fonts/TestAVAR.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=750:U+2A01:[gid1]
-../fonts/TestAVAR.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=800:U+2A01:[gid1]
-../fonts/TestAVAR.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=850:U+2A01:[gid1]
-../fonts/TestAVAR.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=900:U+2A01:[gid1]
diff --git a/test/shaping/data/text-rendering-tests/tests/CFF-1.tests b/test/shaping/data/text-rendering-tests/tests/CFF-1.tests
deleted file mode 100644 (file)
index 6788253..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-../fonts/FDArrayTest257.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041:[gid66]
-../fonts/FDArrayTest257.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+211D:[gid30]
-../fonts/FDArrayTest257.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+24EA:[gid235]
-../fonts/FDArrayTest257.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+2460:[gid97]
-../fonts/FDArrayTest257.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+2461:[gid98]
-../fonts/FDArrayTest257.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+4EFF:[gid256]
-../fonts/FDArrayTest257.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+FF21:[gid34]
-../fonts/FDArrayTest257.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+10133:[gid52]
-../fonts/FDArrayTest257.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1D4D0:[gid209]
-../fonts/FDArrayTest257.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1F33A:[gid59]
-../fonts/FDArrayTest257.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1F33B:[gid60]
-../fonts/FDArrayTest257.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1F4A7:[gid168]
-../fonts/FDArrayTest257.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1F95D:[gid94]
diff --git a/test/shaping/data/text-rendering-tests/tests/CFF-2.tests b/test/shaping/data/text-rendering-tests/tests/CFF-2.tests
deleted file mode 100644 (file)
index 6f190a8..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-../fonts/FDArrayTest65535.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041:[gid66]
-../fonts/FDArrayTest65535.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+211D:[gid8478]
-../fonts/FDArrayTest65535.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+24EA:[gid9451]
-../fonts/FDArrayTest65535.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+2460:[gid9313]
-../fonts/FDArrayTest65535.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+2461:[gid9314]
-../fonts/FDArrayTest65535.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+4EFF:[gid20224]
-../fonts/FDArrayTest65535.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+FF21:[gid65314]
-../fonts/FDArrayTest65535.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+10133:[gid308]
-../fonts/FDArrayTest65535.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1D4D0:[gid54481]
-../fonts/FDArrayTest65535.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1F33A:[gid62267]
-../fonts/FDArrayTest65535.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1F33B:[gid62268]
-../fonts/FDArrayTest65535.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1F4A7:[gid62632]
-../fonts/FDArrayTest65535.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1F95D:[gid63838]
diff --git a/test/shaping/data/text-rendering-tests/tests/CFF2-1.tests b/test/shaping/data/text-rendering-tests/tests/CFF2-1.tests
deleted file mode 100644 (file)
index 84cb14d..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-../fonts/AdobeVFPrototype-Subset.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=100:U+0024:[dollar]
-../fonts/AdobeVFPrototype-Subset.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=200:U+0024:[dollar]
-../fonts/AdobeVFPrototype-Subset.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=300:U+0024:[dollar]
-../fonts/AdobeVFPrototype-Subset.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=400:U+0024:[dollar]
-../fonts/AdobeVFPrototype-Subset.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=500:U+0024:[dollar]
-../fonts/AdobeVFPrototype-Subset.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=600:U+0024:[dollar]
-../fonts/AdobeVFPrototype-Subset.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=700:U+0024:[dollar]
-../fonts/AdobeVFPrototype-Subset.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=800:U+0024:[dollar.nostroke]
-../fonts/AdobeVFPrototype-Subset.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=900:U+0024:[dollar.nostroke]
diff --git a/test/shaping/data/text-rendering-tests/tests/CMAP-1.tests b/test/shaping/data/text-rendering-tests/tests/CMAP-1.tests
deleted file mode 100644 (file)
index 337b9f8..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-../fonts/TestCMAP14.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+82A6:[uni82A6_uE0100]
-../fonts/TestCMAP14.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+82A6,U+E0100:[uni82A6_uE0100]
-../fonts/TestCMAP14.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+82A6,U+E0101:[uni82A6_uE0101]
-../fonts/TestCMAP14.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+82A6,U+E0102:[uni82A6_uE0100]
diff --git a/test/shaping/data/text-rendering-tests/tests/CMAP-2.tests b/test/shaping/data/text-rendering-tests/tests/CMAP-2.tests
deleted file mode 100644 (file)
index 861f2e4..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-../fonts/TestCMAP14.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+2269:[uni2269]
-../fonts/TestCMAP14.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+2269,U+FE00:[uni2269FE00]
diff --git a/test/shaping/data/text-rendering-tests/tests/CVAR-1.tests b/test/shaping/data/text-rendering-tests/tests/CVAR-1.tests
deleted file mode 100644 (file)
index c874a14..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-../fonts/TestCVARGVARTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=28,wdth=100,opsz=72:U+0068,U+006F,U+006E:[uni0068|uni006F@595,0|uni006E@1126,0]
-../fonts/TestCVARGVARTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=94,wdth=100,opsz=72:U+0068,U+006F,U+006E:[uni0068|uni006F@635,0|uni006E@1212,0]
-../fonts/TestCVARGVARTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=194,wdth=100,opsz=72:U+0068,U+006F,U+006E:[uni0068|uni006F@691,0|uni006E@1331,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/CVAR-2.tests b/test/shaping/data/text-rendering-tests/tests/CVAR-2.tests
deleted file mode 100644 (file)
index 6bd42e1..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-../fonts/TestCVARGVAROne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=28,wdth=100,opsz=72:U+0068,U+006F,U+006E:[uni0068|uni006F@595,0|uni006E@1126,0]
-../fonts/TestCVARGVAROne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=94,wdth=100,opsz=72:U+0068,U+006F,U+006E:[uni0068|uni006F@635,0|uni006E@1212,0]
-../fonts/TestCVARGVAROne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=194,wdth=100,opsz=72:U+0068,U+006F,U+006E:[uni0068|uni006F@691,0|uni006E@1331,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/GLYF-1.tests b/test/shaping/data/text-rendering-tests/tests/GLYF-1.tests
deleted file mode 100644 (file)
index bdc0346..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/TestGLYFOne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0123:[gcommaabove]
diff --git a/test/shaping/data/text-rendering-tests/tests/GPOS-1.tests b/test/shaping/data/text-rendering-tests/tests/GPOS-1.tests
deleted file mode 100644 (file)
index 221d16b..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-../fonts/TestGPOSOne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0104,U+004A:[Aogonek|J@732,0]
-../fonts/TestGPOSOne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0104,U+0067:[Aogonek|g@692,0]
-../fonts/TestGPOSOne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0104,U+0123:[Aogonek|gcommaabove@692,0]
-../fonts/TestGPOSOne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0104,U+006A:[Aogonek|j@752,0]
-../fonts/TestGPOSOne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0104,U+0237:[Aogonek|dotlessj@752,0]
-../fonts/TestGPOSOne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0051,U+0237:[Q|dotlessj@734,0]
-../fonts/TestGPOSOne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0105,U+006A:[aogonek|j@588,0]
-../fonts/TestGPOSOne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0105,U+0237:[aogonek|dotlessj@588,0]
-../fonts/TestGPOSOne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0067,U+0237:[g|dotlessj@563,0]
-../fonts/TestGPOSOne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0123,U+0237:[gcommaabove|dotlessj@563,0]
-../fonts/TestGPOSOne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0131,U+0237:[dotlessi|dotlessj@334,0]
-../fonts/TestGPOSOne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0173,U+0237:[uogonek|dotlessj@656,0]
-../fonts/TestGPOSOne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0076,U+0237:[v|dotlessj@587,0]
-../fonts/TestGPOSOne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0056,U+0061:[V|a@594,0]
-../fonts/TestGPOSOne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0056,U+00E1:[V|aacute@594,0]
-../fonts/TestGPOSOne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0056,U+0105:[V|aogonek@594,0]
-../fonts/TestGPOSOne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0056,U+0066:[V|f@634,0]
-../fonts/TestGPOSOne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0056,U+FB02:[V|fl@634,0]
-../fonts/TestGPOSOne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0056,U+002E:[V|period@504,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/GPOS-2.tests b/test/shaping/data/text-rendering-tests/tests/GPOS-2.tests
deleted file mode 100644 (file)
index 03fcc36..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-../fonts/TestGPOSTwo.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+25EF:[uni25EF]
-../fonts/TestGPOSTwo.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+263C:[sun]
-../fonts/TestGPOSTwo.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+25EF,U+263C:[uni25EF|sun]
diff --git a/test/shaping/data/text-rendering-tests/tests/GPOS-3.tests b/test/shaping/data/text-rendering-tests/tests/GPOS-3.tests
deleted file mode 100644 (file)
index 32aeb6e..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-../fonts/TestShapeEthi.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1208:[uni1208]
-../fonts/TestShapeEthi.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1208,U+135E:[uni1208|uni135E@303,0]
-../fonts/TestShapeEthi.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1208,U+135F:[uni1208|uni135F@303,0]
-../fonts/TestShapeEthi.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1208,U+135D:[uni1208|uni135D@303,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/GPOS-4.tests b/test/shaping/data/text-rendering-tests/tests/GPOS-4.tests
deleted file mode 100644 (file)
index fd77542..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-../fonts/TestGPOSThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0075,U+0308,U+0301:[u|uni0308@529,-31|acutecomb@537,138]
-../fonts/TestGPOSThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0075,U+0308,U+0304:[u|uni0308@529,-31|uni0304@526,138]
-../fonts/TestGPOSThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0075,U+0308,U+0308:[u|uni0308@529,-31|uni0308@529,138]
-../fonts/TestGPOSThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0075,U+0308,U+0308,U+0308:[u|uni0308@529,-31|uni0308@529,138|uni0308@529,307]
diff --git a/test/shaping/data/text-rendering-tests/tests/GPOS-5.tests b/test/shaping/data/text-rendering-tests/tests/GPOS-5.tests
deleted file mode 100644 (file)
index 2d7ce14..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-../fonts/TestGPOSFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=100:U+0634,U+0652:[uni0652@663,144|uni0634]
-../fonts/TestGPOSFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=300:U+0634,U+0652:[uni0652@680,165|uni0634]
-../fonts/TestGPOSFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=600:U+0634,U+0652:[uni0652@730,246|uni0634]
-../fonts/TestGPOSFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=700:U+0634,U+0652:[uni0652@750,282|uni0634]
-../fonts/TestGPOSFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=900:U+0634,U+0652:[uni0652@784,351|uni0634]
diff --git a/test/shaping/data/text-rendering-tests/tests/GSUB-1.tests b/test/shaping/data/text-rendering-tests/tests/GSUB-1.tests
deleted file mode 100644 (file)
index e33a6f1..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/TestGSUBOne.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0061,U+0020,U+0061:[a.alt|space@500,0|a@1000,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/GSUB-2.tests b/test/shaping/data/text-rendering-tests/tests/GSUB-2.tests
deleted file mode 100644 (file)
index 34c8deb..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-../fonts/TestShapeEthi.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1373:[uni1373]
-../fonts/TestShapeEthi.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+136B:[uni136B]
-../fonts/TestShapeEthi.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1375:[uni1375]
-../fonts/TestShapeEthi.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+136D:[uni136D]
-../fonts/TestShapeEthi.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1373,U+136B:[uni1373.init|uni136B.fina@621,0]
-../fonts/TestShapeEthi.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1375,U+136D:[uni1375.init|uni136D.fina@662,0]
-../fonts/TestShapeEthi.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+137B:[uni137B]
-../fonts/TestShapeEthi.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1373,U+136B,U+137B:[uni1373.init|uni136B.medi@621,0|uni137B.fina@1102,0]
-../fonts/TestShapeEthi.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1373,U+136B,U+137B,U+1373,U+136B:[uni1373.init|uni136B.medi@621,0|uni137B.medi@1102,0|uni1373.medi@1489,0|uni136B.fina@2110,0]
-../fonts/TestShapeEthi.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1373,U+136B,U+137B,U+1375,U+136D:[uni1373.init|uni136B.medi@621,0|uni137B.medi@1102,0|uni1375.medi@1489,0|uni136D.fina@2157,0]
-../fonts/TestShapeEthi.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1375,U+136D,U+137B,U+1373,U+136B:[uni1375.init|uni136D.medi@662,0|uni137B.medi@1203,0|uni1373.medi@1590,0|uni136B.fina@2211,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/GSUB-3.tests b/test/shaping/data/text-rendering-tests/tests/GSUB-3.tests
deleted file mode 100644 (file)
index c2f7e6e..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/TestGSUBThree.ttf::U+006C,U+006F,U+006C:*
diff --git a/test/shaping/data/text-rendering-tests/tests/GVAR-1.tests b/test/shaping/data/text-rendering-tests/tests/GVAR-1.tests
deleted file mode 100644 (file)
index fc00a4e..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-../fonts/TestGVAROne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=300:U+5F4C:[gid2]
-../fonts/TestGVAROne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=350:U+5F4C:[gid2]
-../fonts/TestGVAROne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=400:U+5F4C:[gid2]
-../fonts/TestGVAROne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=450:U+5F4C:[gid2]
-../fonts/TestGVAROne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=500:U+5F4C:[gid2]
-../fonts/TestGVAROne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=550:U+5F4C:[gid2]
-../fonts/TestGVAROne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=600:U+5F4C:[gid2]
-../fonts/TestGVAROne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=650:U+5F4C:[gid2]
-../fonts/TestGVAROne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=700:U+5F4C:[gid2]
diff --git a/test/shaping/data/text-rendering-tests/tests/GVAR-2.tests b/test/shaping/data/text-rendering-tests/tests/GVAR-2.tests
deleted file mode 100644 (file)
index 10e22e4..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-../fonts/TestGVARTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=300:U+5F4C:[gid2]
-../fonts/TestGVARTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=350:U+5F4C:[gid2]
-../fonts/TestGVARTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=400:U+5F4C:[gid2]
-../fonts/TestGVARTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=450:U+5F4C:[gid2]
-../fonts/TestGVARTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=500:U+5F4C:[gid2]
-../fonts/TestGVARTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=550:U+5F4C:[gid2]
-../fonts/TestGVARTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=600:U+5F4C:[gid2]
-../fonts/TestGVARTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=650:U+5F4C:[gid2]
-../fonts/TestGVARTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=700:U+5F4C:[gid2]
diff --git a/test/shaping/data/text-rendering-tests/tests/GVAR-3.tests b/test/shaping/data/text-rendering-tests/tests/GVAR-3.tests
deleted file mode 100644 (file)
index c3b8049..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-../fonts/TestGVARThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=300:U+5F4C:[gid2]
-../fonts/TestGVARThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=350:U+5F4C:[gid2]
-../fonts/TestGVARThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=400:U+5F4C:[gid2]
-../fonts/TestGVARThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=450:U+5F4C:[gid2]
-../fonts/TestGVARThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=500:U+5F4C:[gid2]
-../fonts/TestGVARThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=550:U+5F4C:[gid2]
-../fonts/TestGVARThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=600:U+5F4C:[gid2]
-../fonts/TestGVARThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=650:U+5F4C:[gid2]
-../fonts/TestGVARThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=700:U+5F4C:[gid2]
diff --git a/test/shaping/data/text-rendering-tests/tests/GVAR-4.tests b/test/shaping/data/text-rendering-tests/tests/GVAR-4.tests
deleted file mode 100644 (file)
index 1c0964d..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=-1.0,T1=0.0:U+1F98E:[gid5]
-../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=-0.8,T1=0.1:U+1F98E:[gid5]
-../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=-0.6,T1=0.2:U+1F98E:[gid5]
-../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=-0.4,T1=0.3:U+1F98E:[gid5]
-../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=-0.2,T1=0.4:U+1F98E:[gid5]
-../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=0.0,T1=0.5:U+1F98E:[gid5]
-../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=0.2,T1=0.6:U+1F98E:[gid5]
-../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=0.4,T1=0.7:U+1F98E:[gid5]
-../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=0.6,T1=0.8:U+1F98E:[gid5]
-../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=0.8,T1=0.9:U+1F98E:[gid5]
-../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=1.0,T1=1.0:U+1F98E:[gid5]
diff --git a/test/shaping/data/text-rendering-tests/tests/GVAR-5.tests b/test/shaping/data/text-rendering-tests/tests/GVAR-5.tests
deleted file mode 100644 (file)
index b2ff710..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=-1.0:U+1F31D:[gid15]
-../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=-0.8:U+1F31D:[gid15]
-../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=-0.6:U+1F31D:[gid15]
-../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=-0.4:U+1F31D:[gid15]
-../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=-0.2:U+1F31D:[gid15]
-../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=0.0:U+1F31D:[gid15]
-../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=0.2:U+1F31D:[gid15]
-../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=0.4:U+1F31D:[gid15]
-../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=0.6:U+1F31D:[gid15]
-../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=0.8:U+1F31D:[gid15]
-../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=1.0:U+1F31D:[gid15]
diff --git a/test/shaping/data/text-rendering-tests/tests/GVAR-6.tests b/test/shaping/data/text-rendering-tests/tests/GVAR-6.tests
deleted file mode 100644 (file)
index f96292b..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=T1=0.0:U+1F422:[gid12]
-../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=T1=0.1:U+1F422:[gid12]
-../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=T1=0.2:U+1F422:[gid12]
-../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=T1=0.3:U+1F422:[gid12]
-../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=T1=0.4:U+1F422:[gid12]
-../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=T1=0.5:U+1F422:[gid12]
-../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=T1=0.6:U+1F422:[gid12]
-../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=T1=0.7:U+1F422:[gid12]
-../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=T1=0.8:U+1F422:[gid12]
-../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=T1=0.9:U+1F422:[gid12]
-../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=T1=1.0:U+1F422:[gid12]
diff --git a/test/shaping/data/text-rendering-tests/tests/GVAR-7.tests b/test/shaping/data/text-rendering-tests/tests/GVAR-7.tests
deleted file mode 100644 (file)
index 594da3b..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-../fonts/TestGVARFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=150:U+004F,U+0049,U+004F:[uni004F|uni0049@706,0|uni004F@1072,0]
-../fonts/TestGVARFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=200:U+004F,U+0049,U+004F:[uni004F|uni0049@707,0|uni004F@1074,0]
-../fonts/TestGVARFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=250:U+004F,U+0049,U+004F:[uni004F|uni0049@707,0|uni004F@1075,0]
-../fonts/TestGVARFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=300:U+004F,U+0049,U+004F:[uni004F|uni0049@707,0|uni004F@1076,0]
-../fonts/TestGVARFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=350:U+004F,U+0049,U+004F:[uni004F|uni0049@707,0|uni004F@1077,0]
-../fonts/TestGVARFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=400:U+004F,U+0049,U+004F:[uni004F|uni0049@707,0|uni004F@1078,0]
-../fonts/TestGVARFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=450:U+004F,U+0049,U+004F:[uni004F|uni0049@706,0|uni004F@1079,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/GVAR-8.tests b/test/shaping/data/text-rendering-tests/tests/GVAR-8.tests
deleted file mode 100644 (file)
index e5c8209..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-../fonts/TestGVAREight.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=HV=0.0:U+0048:[H]
-../fonts/TestGVAREight.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=HV=-0.2:U+0048:[H]
-../fonts/TestGVAREight.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=HV=-0.4:U+0048:[H]
-../fonts/TestGVAREight.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=HV=-0.6:U+0048:[H]
-../fonts/TestGVAREight.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=HV=-0.8:U+0048:[H]
-../fonts/TestGVAREight.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=HV=-1.0:U+0048:[H]
diff --git a/test/shaping/data/text-rendering-tests/tests/GVAR-9.tests b/test/shaping/data/text-rendering-tests/tests/GVAR-9.tests
deleted file mode 100644 (file)
index 19e2ed8..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-../fonts/TestGVARNine.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=-1.0:U+0041:[A]
-../fonts/TestGVARNine.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=-0.5:U+0041:[A]
-../fonts/TestGVARNine.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=0.0:U+0041:[A]
-../fonts/TestGVARNine.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=0.5:U+0041:[A]
-../fonts/TestGVARNine.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=0.6:U+0041:[A]
-../fonts/TestGVARNine.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=0.7:U+0041:[A]
-../fonts/TestGVARNine.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=0.8:U+0041:[A]
-../fonts/TestGVARNine.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=0.9:U+0041:[A]
-../fonts/TestGVARNine.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=0.944444:U+0041:[A]
-../fonts/TestGVARNine.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=1.0:U+0041:[A]
diff --git a/test/shaping/data/text-rendering-tests/tests/HVAR-1.tests b/test/shaping/data/text-rendering-tests/tests/HVAR-1.tests
deleted file mode 100644 (file)
index 189d9f0..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-../fonts/TestHVAROne.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=0:U+0041,U+0042,U+0043:[A|B@520,0|C@1094,0]
-../fonts/TestHVAROne.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=200:U+0041,U+0042,U+0043:[A|B@533,0|C@1115,0]
-../fonts/TestHVAROne.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=400:U+0041,U+0042,U+0043:[A|B@546,0|C@1135,0]
-../fonts/TestHVAROne.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=600:U+0041,U+0042,U+0043:[A|B@558,0|C@1155,0]
-../fonts/TestHVAROne.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=800:U+0041,U+0042,U+0043:[A|B@571,0|C@1175,0]
-../fonts/TestHVAROne.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=1000:U+0041,U+0042,U+0043:[A|B@584,0|C@1196,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/HVAR-2.tests b/test/shaping/data/text-rendering-tests/tests/HVAR-2.tests
deleted file mode 100644 (file)
index db93be9..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-../fonts/TestHVARTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=0:U+0041,U+0042:[uni0041|uni0042@450,0]
-../fonts/TestHVARTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=200:U+0041,U+0042:[uni0041|uni0042@515,0]
-../fonts/TestHVARTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=400:U+0041,U+0042:[uni0041|uni0042@584,0]
-../fonts/TestHVARTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=600:U+0041,U+0042:[uni0041|uni0042@673,0]
-../fonts/TestHVARTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=800:U+0041,U+0042:[uni0041|uni0042@761,0]
-../fonts/TestHVARTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=1000:U+0041,U+0042:[uni0041|uni0042@850,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/KERN-1.tests b/test/shaping/data/text-rendering-tests/tests/KERN-1.tests
deleted file mode 100644 (file)
index f0c0214..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/TestKERNOne.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0131,U+0054,U+0075,U+0054,U+0075,U+0054,U+0131:[dotlessi|T|u@400,0|T@600,0|u@1000,0|T@1200,0|dotlessi@1600,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/KERN-2.tests b/test/shaping/data/text-rendering-tests/tests/KERN-2.tests
deleted file mode 100644 (file)
index fdffa4a..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/TestKERNOne.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0075,U+0131,U+0131,U+0054,U+0131,U+0131,U+0054,U+0131,U+0131,U+0075:[u|dotlessi@400,0|dotlessi@1100,0|T@1100,0|dotlessi@1500,0|dotlessi@2200,0|T@2200,0|dotlessi@2600,0|dotlessi@3300,0|u@3500,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-1.tests b/test/shaping/data/text-rendering-tests/tests/MORX-1.tests
deleted file mode 100644 (file)
index 794b01b..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/TestMORXOne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0043:[A.alt|B@1000,0|C.alt@2000,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-10.tests b/test/shaping/data/text-rendering-tests/tests/MORX-10.tests
deleted file mode 100644 (file)
index a6a5444..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/TestMORXTen.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0041,U+0042,U+0041,U+0042:[A|B@638,0|A@1288,0|B@1926,0|B@2576,0|A@3226,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-11.tests b/test/shaping/data/text-rendering-tests/tests/MORX-11.tests
deleted file mode 100644 (file)
index 1fce69b..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/TestMORXEleven.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0042,U+0041,U+0042,U+0042,U+0041,U+0041,U+0042,U+0058:[B|A@650,0|B@1288,0|B@1938,0|A@2588,0|X@3226,0|A@3812,0|B@4450,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-12.tests b/test/shaping/data/text-rendering-tests/tests/MORX-12.tests
deleted file mode 100644 (file)
index 8b9886f..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-../fonts/TestMORXTwelve.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0058,U+0041,U+0042,U+0043,U+0058,U+0031:[X|C@598,0|A@1230,0|B@1868,0|X@2518,0|one@3116,0]
-../fonts/TestMORXTwelve.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0058,U+0041,U+0042,U+0043,U+0058,U+0032:[X|C@598,0|A@1230,0|B@1868,0|X@2518,0|two@3116,0]
-../fonts/TestMORXTwelve.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0058,U+0041,U+0042,U+0043,U+0058,U+0033:[X|B@598,0|C@1248,0|A@1880,0|X@2518,0|three@3116,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-13.tests b/test/shaping/data/text-rendering-tests/tests/MORX-13.tests
deleted file mode 100644 (file)
index 42d8107..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/TestMORXThirteen.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0043,U+0044,U+0045:[B|C@626,0|D@1222,0|E@1896,0|A@2452,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-14.tests b/test/shaping/data/text-rendering-tests/tests/MORX-14.tests
deleted file mode 100644 (file)
index d01f2e9..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-../fonts/TestMORXFourteen.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0043,U+0044,U+0045:[B|C@626,0|D@1222,0|E@1896,0|A@2452,0]
-../fonts/TestMORXFourteen.ttf::U+0041,U+0042,U+0042,U+0042,U+0043,U+0043,U+0043,U+0044,U+0044,U+0044,U+0042,U+0043,U+0044,U+0043,U+0045:*
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-16.tests b/test/shaping/data/text-rendering-tests/tests/MORX-16.tests
deleted file mode 100644 (file)
index ce0d5b2..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/TestMORXSixteen.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0043,U+0044,U+0045:[B|C@626,0|D@1222,0|E@1896,0|A@2452,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-17.tests b/test/shaping/data/text-rendering-tests/tests/MORX-17.tests
deleted file mode 100644 (file)
index 6e1c94c..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/TestMORXSeventeen.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042:[B|A@626,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-18.tests b/test/shaping/data/text-rendering-tests/tests/MORX-18.tests
deleted file mode 100644 (file)
index b032a76..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-../fonts/TestMORXEighteen.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0043,U+0044,U+0045:[A|B.alt@639,0|C@1639,0|D.alt1@2235,0|E@3235,0]
-../fonts/TestMORXEighteen.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0042,U+0042,U+0044,U+0045:[A|B@639,0|B@1265,0|B.alt@1891,0|D.alt1@2891,0|E@3891,0]
-../fonts/TestMORXEighteen.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0044,U+0045:[A|B.alt@639,0|D.alt1@1639,0|E@2639,0]
-../fonts/TestMORXEighteen.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0045:[A|B@639,0|E@1265,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-19.tests b/test/shaping/data/text-rendering-tests/tests/MORX-19.tests
deleted file mode 100644 (file)
index e9b9dc4..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-../fonts/TestMORXEighteen.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0043,U+0044,U+0045:[A.alt|C@1000,0|D.alt1@1596,0|E@2596,0]
-../fonts/TestMORXEighteen.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0044:[D.alt]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-2.tests b/test/shaping/data/text-rendering-tests/tests/MORX-2.tests
deleted file mode 100644 (file)
index 3e64d23..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-../fonts/TestMORXTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+004F,U+004F,U+004F,U+0041,U+0042,U+0058,U+0059,U+005A,U+0043,U+0044,U+004F,U+004F,U+004F,U+24FF:[O|O@418,0|O@836,0|A@1254,0|B@2084,0|X@2914,0|Y@3744,0|Z@4574,0|C@5404,0|D@6234,0|O@7064,0|O@7482,0|O@7900,0|zero@8318,0]
-../fonts/TestMORXTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+004F,U+004F,U+004F,U+0041,U+0042,U+0058,U+0059,U+005A,U+0043,U+0044,U+004F,U+004F,U+004F,U+278A:[O|O@418,0|O@836,0|B@1254,0|X@2084,0|Y@2914,0|Z@3744,0|C@4574,0|D@5404,0|A@6234,0|O@7064,0|O@7482,0|O@7900,0|one@8318,0]
-../fonts/TestMORXTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+004F,U+004F,U+004F,U+0041,U+0042,U+0058,U+0059,U+005A,U+0043,U+0044,U+004F,U+004F,U+004F,U+278B:[O|O@418,0|O@836,0|D@1254,0|A@2084,0|B@2914,0|X@3744,0|Y@4574,0|Z@5404,0|C@6234,0|O@7064,0|O@7482,0|O@7900,0|two@8318,0]
-../fonts/TestMORXTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+004F,U+004F,U+004F,U+0041,U+0042,U+0058,U+0059,U+005A,U+0043,U+0044,U+004F,U+004F,U+004F,U+0033:[O|O@418,0|O@836,0|D@1254,0|B@2084,0|X@2914,0|Y@3744,0|Z@4574,0|C@5404,0|A@6234,0|O@7064,0|O@7482,0|O@7900,0|three@8318,0]
-../fonts/TestMORXTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+004F,U+004F,U+004F,U+0041,U+0042,U+0058,U+0059,U+005A,U+0043,U+0044,U+004F,U+004F,U+004F,U+0034:[O|O@418,0|O@836,0|X@1254,0|Y@2084,0|Z@2914,0|C@3744,0|D@4574,0|A@5404,0|B@6234,0|O@7064,0|O@7482,0|O@7900,0|four@8318,0]
-../fonts/TestMORXTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+004F,U+004F,U+004F,U+0041,U+0042,U+0058,U+0059,U+005A,U+0043,U+0044,U+004F,U+004F,U+004F,U+0035:[O|O@418,0|O@836,0|X@1254,0|Y@2084,0|Z@2914,0|C@3744,0|D@4574,0|B@5404,0|A@6234,0|O@7064,0|O@7482,0|O@7900,0|five@8318,0]
-../fonts/TestMORXTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+004F,U+004F,U+004F,U+0041,U+0042,U+0058,U+0059,U+005A,U+0043,U+0044,U+004F,U+004F,U+004F,U+0036:[O|O@418,0|O@836,0|C@1254,0|D@2084,0|A@2914,0|B@3744,0|X@4574,0|Y@5404,0|Z@6234,0|O@7064,0|O@7482,0|O@7900,0|six@8318,0]
-../fonts/TestMORXTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+004F,U+004F,U+004F,U+0041,U+0042,U+0058,U+0059,U+005A,U+0043,U+0044,U+004F,U+004F,U+004F,U+0037:[O|O@418,0|O@836,0|D@1254,0|C@2084,0|A@2914,0|B@3744,0|X@4574,0|Y@5404,0|Z@6234,0|O@7064,0|O@7482,0|O@7900,0|seven@8318,0]
-../fonts/TestMORXTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+004F,U+004F,U+004F,U+0041,U+0042,U+0058,U+0059,U+005A,U+0043,U+0044,U+004F,U+004F,U+004F,U+0038:[O|O@418,0|O@836,0|C@1254,0|D@2084,0|B@2914,0|X@3744,0|Y@4574,0|Z@5404,0|A@6234,0|O@7064,0|O@7482,0|O@7900,0|eight@8318,0]
-../fonts/TestMORXTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+004F,U+004F,U+004F,U+0041,U+0042,U+0058,U+0059,U+005A,U+0043,U+0044,U+004F,U+004F,U+004F,U+0039:[O|O@418,0|O@836,0|D@1254,0|C@2084,0|B@2914,0|X@3744,0|Y@4574,0|Z@5404,0|A@6234,0|O@7064,0|O@7482,0|O@7900,0|nine@8318,0]
-../fonts/TestMORXTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+004F,U+004F,U+004F,U+0041,U+0042,U+0058,U+0059,U+005A,U+0043,U+0044,U+004F,U+004F,U+004F,U+2793:[O|O@418,0|O@836,0|D@1254,0|X@2084,0|Y@2914,0|Z@3744,0|C@4574,0|A@5404,0|B@6234,0|O@7064,0|O@7482,0|O@7900,0|one_zero@8318,0]
-../fonts/TestMORXTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+004F,U+004F,U+004F,U+0041,U+0042,U+0058,U+0059,U+005A,U+0043,U+0044,U+004F,U+004F,U+004F,U+24EB:[O|O@418,0|O@836,0|D@1254,0|X@2084,0|Y@2914,0|Z@3744,0|C@4574,0|B@5404,0|A@6234,0|O@7064,0|O@7482,0|O@7900,0|one_one@8318,0]
-../fonts/TestMORXTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+004F,U+004F,U+004F,U+0041,U+0042,U+0058,U+0059,U+005A,U+0043,U+0044,U+004F,U+004F,U+004F,U+24EC:[O|O@418,0|O@836,0|C@1254,0|D@2084,0|X@2914,0|Y@3744,0|Z@4574,0|A@5404,0|B@6234,0|O@7064,0|O@7482,0|O@7900,0|one_two@8318,0]
-../fonts/TestMORXTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+004F,U+004F,U+004F,U+0041,U+0042,U+0058,U+0059,U+005A,U+0043,U+0044,U+004F,U+004F,U+004F,U+24ED:[O|O@418,0|O@836,0|C@1254,0|D@2084,0|X@2914,0|Y@3744,0|Z@4574,0|B@5404,0|A@6234,0|O@7064,0|O@7482,0|O@7900,0|one_three@8318,0]
-../fonts/TestMORXTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+004F,U+004F,U+004F,U+0041,U+0042,U+0058,U+0059,U+005A,U+0043,U+0044,U+004F,U+004F,U+004F,U+24EE:[O|O@418,0|O@836,0|D@1254,0|C@2084,0|X@2914,0|Y@3744,0|Z@4574,0|A@5404,0|B@6234,0|O@7064,0|O@7482,0|O@7900,0|one_four@8318,0]
-../fonts/TestMORXTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+004F,U+004F,U+004F,U+0041,U+0042,U+0058,U+0059,U+005A,U+0043,U+0044,U+004F,U+004F,U+004F,U+24EF:[O|O@418,0|O@836,0|D@1254,0|C@2084,0|X@2914,0|Y@3744,0|Z@4574,0|B@5404,0|A@6234,0|O@7064,0|O@7482,0|O@7900,0|one_five@8318,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-20.tests b/test/shaping/data/text-rendering-tests/tests/MORX-20.tests
deleted file mode 100644 (file)
index 8d04192..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-../fonts/TestMORXTwenty.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0043,U+0044,U+0045:[A|B@639,0|C.alt@1265,0|D@2265,0|E.alt1@2939,0]
-../fonts/TestMORXTwenty.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0043:[A|B@639,0|C.alt@1265,0]
-../fonts/TestMORXTwenty.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0045:[A|B.alt@639,0|E.alt1@1639,0]
-../fonts/TestMORXTwenty.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0045:[A.alt|E.alt1@1000,0]
-../fonts/TestMORXTwenty.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0045,U+0045:[E|E@556,0]
-../fonts/TestMORXTwenty.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041:[A.alt]
-../fonts/TestMORXTwenty.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0045:[E]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-21.tests b/test/shaping/data/text-rendering-tests/tests/MORX-21.tests
deleted file mode 100644 (file)
index a608755..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/TestMORXTwentyone.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0043,U+0044,U+0045:[A|B.alt@639,0|C@1639,0|D@2235,0|E@2909,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-22.tests b/test/shaping/data/text-rendering-tests/tests/MORX-22.tests
deleted file mode 100644 (file)
index 960874c..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/TestMORXTwentytwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041:[C]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-23.tests b/test/shaping/data/text-rendering-tests/tests/MORX-23.tests
deleted file mode 100644 (file)
index 9575a80..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/TestMORXTwentythree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0043,U+0044,U+0045:[E|E@556,0|E@1112,0|E@1668,0|E@2224,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-24.tests b/test/shaping/data/text-rendering-tests/tests/MORX-24.tests
deleted file mode 100644 (file)
index 79a3d7b..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/TestMORXTwentyfour.ttf::U+0041,U+0042,U+0043,U+0044,U+0045:*
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-25.tests b/test/shaping/data/text-rendering-tests/tests/MORX-25.tests
deleted file mode 100644 (file)
index ccd0563..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-../fonts/TestMORXTwentyfive.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0043,U+0044,U+0045:[A.alt|B.alt@1000,0|C.alt@2000,0|D.alt@3000,0|E.alt@4000,0]
-../fonts/TestMORXTwentyfive.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0045,U+0042,U+0043,U+0044,U+0041:[E|B@556,0|C@1182,0|D@1778,0|A@2452,0]
-../fonts/TestMORXTwentyfive.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0043,U+0042,U+0041,U+0042,U+0043:[C|B@596,0|A.alt@1222,0|B.alt@2222,0|C.alt@3222,0]
-../fonts/TestMORXTwentyfive.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0043:[A.alt|B.alt@1000,0|C.alt@2000,0]
-../fonts/TestMORXTwentyfive.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0043,U+0042,U+0041:[C|B@596,0|A@1222,0]
-../fonts/TestMORXTwentyfive.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042:[A.alt|B.alt@1000,0]
-../fonts/TestMORXTwentyfive.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0042,U+0041:[B|A@626,0]
-../fonts/TestMORXTwentyfive.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041:[A]
-../fonts/TestMORXTwentyfive.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0042:[B]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-26.tests b/test/shaping/data/text-rendering-tests/tests/MORX-26.tests
deleted file mode 100644 (file)
index bebae60..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-../fonts/TestMORXTwentysix.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042:[A|B@639,0]
-../fonts/TestMORXTwentysix.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0042:[B.alt]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-27.tests b/test/shaping/data/text-rendering-tests/tests/MORX-27.tests
deleted file mode 100644 (file)
index 1ec96a2..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-../fonts/TestMORXTwentyseven.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0045,U+0042:[A_E_B]
-../fonts/TestMORXTwentyseven.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0045,U+0043:[A_E_C]
-../fonts/TestMORXTwentyseven.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0045,U+0044:[A_E_D]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-28.tests b/test/shaping/data/text-rendering-tests/tests/MORX-28.tests
deleted file mode 100644 (file)
index 59f5d25..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-../fonts/TestMORXTwentyeight.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0045,U+0044:[A_E_D]
-../fonts/TestMORXTwentyeight.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0078,U+0045,U+0044:[A_E_D|x@1394,0]
-../fonts/TestMORXTwentyeight.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0045,U+0079,U+0044:[A_E_D|y@1394,0]
-../fonts/TestMORXTwentyeight.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0078,U+0045,U+0079,U+0044:[A_E_D|x@1394,0|y@1923,0]
-../fonts/TestMORXTwentyeight.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0078,U+0078,U+0078,U+0045,U+0079,U+0079,U+0079,U+0044:[A_E_D|x@1394,0|x@1923,0|x@2452,0|y@2981,0|y@3491,0|y@4001,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-29.tests b/test/shaping/data/text-rendering-tests/tests/MORX-29.tests
deleted file mode 100644 (file)
index 82fd963..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-../fonts/TestMORXTwentynine.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+004D,U+004D,U+0058,U+0058,U+004D,U+004D,U+0059,U+0059,U+0041,U+005A,U+005A:[P|Q@333,0|R@699,0|M@1050,0|M@1880,0|X@2710,0|X@3074,0|M@3438,0|I@4268,0|N@5098,0|S@5928,0|M@6758,0|Y@7588,0|Y@7920,0|A@8252,0|Z@9082,0|Z@9404,0]
-../fonts/TestMORXTwentynine.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+004D,U+004D,U+0058,U+0058,U+004D,U+004D,U+0059,U+0059,U+0042,U+005A,U+005A:[P|Q@333,0|R@699,0|M@1050,0|M@1880,0|X@2710,0|X@3074,0|M@3438,0|M@4268,0|I@5098,0|N@5928,0|S@6758,0|Y@7588,0|Y@7920,0|B@8252,0|Z@9082,0|Z@9404,0]
-../fonts/TestMORXTwentynine.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+004D,U+004D,U+0058,U+0058,U+004D,U+004D,U+0059,U+0059,U+0043,U+005A,U+005A:[P|Q@333,0|R@699,0|M@1050,0|M@1880,0|X@2710,0|X@3074,0|M@3438,0|M@4268,0|Y@5098,0|Y@5430,0|I@5762,0|N@6592,0|S@7422,0|C@8252,0|Z@9082,0|Z@9404,0]
-../fonts/TestMORXTwentynine.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+004D,U+004D,U+0058,U+0058,U+004D,U+004D,U+0059,U+0059,U+0044,U+005A,U+005A:[P|Q@333,0|R@699,0|M@1050,0|M@1880,0|X@2710,0|X@3074,0|M@3438,0|M@4268,0|Y@5098,0|Y@5430,0|D@5762,0|I@6592,0|N@7422,0|S@8252,0|Z@9082,0|Z@9404,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-3.tests b/test/shaping/data/text-rendering-tests/tests/MORX-3.tests
deleted file mode 100644 (file)
index fc7fe94..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-../fonts/TestMORXThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0058,U+0043,U+0044,U+0030:[A|B@363,0|X@722,0|C@1086,0|D@1402,0|zero@1793,0]
-../fonts/TestMORXThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0058,U+0043,U+0044,U+0031:[A|B@363,0|X@722,0|C@1086,0|D@1402,0|one@1793,0]
-../fonts/TestMORXThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0058,U+0043,U+0044,U+0032:[A|B@363,0|X@722,0|C@1086,0|D@1402,0|two@1793,0]
-../fonts/TestMORXThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0058,U+0043,U+0044,U+0033:[A|B@363,0|X@722,0|C@1086,0|D@1402,0|three@1793,0]
-../fonts/TestMORXThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0058,U+0043,U+0044,U+0034:[A|B@363,0|X@722,0|C@1086,0|D@1402,0|four@1793,0]
-../fonts/TestMORXThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0058,U+0043,U+0044,U+0035:[A|B@363,0|X@722,0|C@1086,0|D@1402,0|five@1793,0]
-../fonts/TestMORXThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0058,U+0043,U+0044,U+0036:[A|B@363,0|X@722,0|C@1086,0|D@1402,0|six@1793,0]
-../fonts/TestMORXThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0058,U+0043,U+0044,U+0037:[A|B@363,0|X@722,0|C@1086,0|D@1402,0|seven@1793,0]
-../fonts/TestMORXThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0058,U+0043,U+0044,U+0038:[A|B@363,0|X@722,0|C@1086,0|D@1402,0|eight@1793,0]
-../fonts/TestMORXThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0058,U+0043,U+0044,U+0039:[A|B@363,0|X@722,0|C@1086,0|D@1402,0|nine@1793,0]
-../fonts/TestMORXThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0058,U+0043,U+0044,U+2793:[A|B@363,0|X@722,0|C@1086,0|D@1402,0|one_zero@1793,0]
-../fonts/TestMORXThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0058,U+0043,U+0044,U+24EB:[A|B@363,0|X@722,0|C@1086,0|D@1402,0|one_one@1793,0]
-../fonts/TestMORXThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0058,U+0043,U+0044,U+24EC:[A|B@363,0|X@722,0|C@1086,0|D@1402,0|one_two@1793,0]
-../fonts/TestMORXThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0058,U+0043,U+0044,U+24ED:[A|B@363,0|X@722,0|C@1086,0|D@1402,0|one_three@1793,0]
-../fonts/TestMORXThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0058,U+0043,U+0044,U+24EE:[A|B@363,0|X@722,0|C@1086,0|D@1402,0|one_four@1793,0]
-../fonts/TestMORXThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0058,U+0043,U+0044,U+24EF:[A|B@363,0|X@722,0|C@1086,0|D@1402,0|one_five@1793,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-30.tests b/test/shaping/data/text-rendering-tests/tests/MORX-30.tests
deleted file mode 100644 (file)
index ad4ab21..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-../fonts/TestMORXTwentynine.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+004D,U+004D,U+0058,U+0058,U+0058,U+0041,U+0059,U+0059,U+0041,U+005A,U+005A:[P|Q@333,0|R@699,0|M@1050,0|I@1880,0|N@2710,0|S@3540,0|I@4370,0|N@5200,0|S@6030,0|M@6860,0|X@7690,0|X@8054,0|X@8418,0|A@8782,0|Y@9612,0|Y@9944,0|A@10276,0|Z@11106,0|Z@11428,0]
-../fonts/TestMORXTwentynine.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+004D,U+004D,U+0058,U+0058,U+0058,U+0041,U+0059,U+0059,U+0042,U+005A,U+005A:[P|Q@333,0|R@699,0|M@1050,0|I@1880,0|I@2710,0|N@3540,0|S@4370,0|N@5200,0|S@6030,0|M@6860,0|X@7690,0|X@8054,0|X@8418,0|A@8782,0|Y@9612,0|Y@9944,0|B@10276,0|Z@11106,0|Z@11428,0]
-../fonts/TestMORXTwentynine.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+004D,U+004D,U+0058,U+0058,U+0058,U+0042,U+0059,U+0059,U+0041,U+005A,U+005A:[P|Q@333,0|R@699,0|M@1050,0|I@1880,0|N@2710,0|S@3540,0|M@4370,0|I@5200,0|N@6030,0|S@6860,0|X@7690,0|X@8054,0|X@8418,0|B@8782,0|Y@9612,0|Y@9944,0|A@10276,0|Z@11106,0|Z@11428,0]
-../fonts/TestMORXTwentynine.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+004D,U+004D,U+0058,U+0058,U+0058,U+0042,U+0059,U+0059,U+0042,U+005A,U+005A:[P|Q@333,0|R@699,0|M@1050,0|M@1880,0|I@2710,0|N@3540,0|S@4370,0|I@5200,0|N@6030,0|S@6860,0|X@7690,0|X@8054,0|X@8418,0|B@8782,0|Y@9612,0|Y@9944,0|B@10276,0|Z@11106,0|Z@11428,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-31.tests b/test/shaping/data/text-rendering-tests/tests/MORX-31.tests
deleted file mode 100644 (file)
index ac09e27..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-../fonts/TestMORXThirtyone.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0058,U+0058,U+0041,U+0059,U+0059,U+0041,U+005A,U+005A:[I|N@830,0|I@1660,0|N@2490,0|S@3320,0|S@4150,0|X@4980,0|X@5344,0|A@5708,0|Y@6538,0|Y@6870,0|A@7202,0|Z@8032,0|Z@8354,0]
-../fonts/TestMORXThirtyone.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0058,U+0058,U+0041,U+0059,U+0059,U+0042,U+0059,U+0059:[I|N@830,0|S@1660,0|I@2490,0|N@3320,0|S@4150,0|X@4980,0|X@5344,0|A@5708,0|Y@6538,0|Y@6870,0|B@7202,0|Y@8032,0|Y@8364,0]
-../fonts/TestMORXThirtyone.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0058,U+0058,U+0042,U+0059,U+0059,U+0041,U+005A,U+005A:[X|I@364,0|I@1194,0|N@2024,0|S@2854,0|N@3684,0|S@4514,0|X@5344,0|B@5708,0|Y@6538,0|Y@6870,0|A@7202,0|Z@8032,0|Z@8354,0]
-../fonts/TestMORXThirtyone.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0058,U+0058,U+0042,U+0059,U+0059,U+0042,U+005A,U+005A:[X|I@364,0|N@1194,0|I@2024,0|N@2854,0|S@3684,0|S@4514,0|X@5344,0|B@5708,0|Y@6538,0|Y@6870,0|B@7202,0|Z@8032,0|Z@8354,0]
-../fonts/TestMORXThirtyone.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+004D,U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+0041:[I|N@830,0|S@1660,0|M@2490,0|I@3320,0|N@4150,0|S@4980,0|P@5810,0|Q@6143,0|R@6509,0|A@6860,0|X@7690,0|Y@8054,0|Z@8386,0|A@8708,0]
-../fonts/TestMORXThirtyone.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+004D,U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+0042:[I|N@830,0|S@1660,0|M@2490,0|P@3320,0|I@3653,0|N@4483,0|S@5313,0|Q@6143,0|R@6509,0|A@6860,0|X@7690,0|Y@8054,0|Z@8386,0|B@8708,0]
-../fonts/TestMORXThirtyone.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+004D,U+0050,U+0051,U+0052,U+0042,U+0058,U+0059,U+005A,U+0041:[M|I@830,0|N@1660,0|S@2490,0|I@3320,0|N@4150,0|S@4980,0|P@5810,0|Q@6143,0|R@6509,0|B@6860,0|X@7690,0|Y@8054,0|Z@8386,0|A@8708,0]
-../fonts/TestMORXThirtyone.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+004D,U+0050,U+0051,U+0052,U+0042,U+0058,U+0059,U+005A,U+0042:[M|I@830,0|N@1660,0|S@2490,0|P@3320,0|I@3653,0|N@4483,0|S@5313,0|Q@6143,0|R@6509,0|B@6860,0|X@7690,0|Y@8054,0|Z@8386,0|B@8708,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-32.tests b/test/shaping/data/text-rendering-tests/tests/MORX-32.tests
deleted file mode 100644 (file)
index 6f3ae88..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-../fonts/TestMORXThirtytwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041:[I|N@830,0|S@1660,0|A@2490,0]
-../fonts/TestMORXThirtytwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0058,U+0041,U+0059:[I|N@830,0|S@1660,0|X@2490,0|A@2854,0|Y@3684,0]
-../fonts/TestMORXThirtytwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0042:[B|I@830,0|N@1660,0|S@2490,0]
-../fonts/TestMORXThirtytwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0058,U+0042,U+0059:[X|I@364,0|N@1194,0|S@2024,0|B@2854,0|Y@3684,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-33.tests b/test/shaping/data/text-rendering-tests/tests/MORX-33.tests
deleted file mode 100644 (file)
index 17d080a..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-../fonts/TestMORXThirtythree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0068,U+0061:[h|a@618,0|h@1179,0|a@1797,0]
-../fonts/TestMORXThirtythree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0068,U+0061,U+0068,U+0061:[h|a@618,0|h@1179,0|a@1797,0|h@2358,0|a@2976,0|h@3537,0|a@4155,0]
-../fonts/TestMORXThirtythree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0061,U+0068:[a|h@561,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-34.tests b/test/shaping/data/text-rendering-tests/tests/MORX-34.tests
deleted file mode 100644 (file)
index 8c309df..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/TestMORXThirtyfour.ttf::U+0068,U+0061:*
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-35.tests b/test/shaping/data/text-rendering-tests/tests/MORX-35.tests
deleted file mode 100644 (file)
index a033185..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-../fonts/TestMORXThirtyfive.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041:[A|B@639,0|C@1265,0|E@1861,0]
-../fonts/TestMORXThirtyfive.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0058,U+0041,U+0059:[X|A@586,0|B@1225,0|C@1851,0|E@2447,0|Y@3003,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-36.tests b/test/shaping/data/text-rendering-tests/tests/MORX-36.tests
deleted file mode 100644 (file)
index 6b2340e..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/TestMORXThirtysix.ttf::U+0041:*
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-37.tests b/test/shaping/data/text-rendering-tests/tests/MORX-37.tests
deleted file mode 100644 (file)
index f28c5e2..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-../fonts/TestMORXThirtyseven.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042:[A.alt|B.alt@1000,0]
-../fonts/TestMORXThirtyseven.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0042,U+0041:[B|A@650,0]
-../fonts/TestMORXThirtyseven.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+05D0,U+05D1:[uni05D1|uni05D0@542,0]
-../fonts/TestMORXThirtyseven.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+05D1,U+05D0:[uni05D0.alt|uni05D1.alt@1000,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-38.tests b/test/shaping/data/text-rendering-tests/tests/MORX-38.tests
deleted file mode 100644 (file)
index abefe29..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-../fonts/TestMORXThirtyeight.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042:[A.alt|B.alt@1000,0]
-../fonts/TestMORXThirtyeight.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0042,U+0041:[B|A@650,0]
-../fonts/TestMORXThirtyeight.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+05D0,U+05D1:[uni05D1.alt|uni05D0.alt@1000,0]
-../fonts/TestMORXThirtyeight.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+05D1,U+05D0:[uni05D0|uni05D1@606,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-39.tests b/test/shaping/data/text-rendering-tests/tests/MORX-39.tests
deleted file mode 100644 (file)
index 83bfa52..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-../fonts/TestMORXThirtynine.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042:[A|B@639,0]
-../fonts/TestMORXThirtynine.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0042,U+0041:[B.alt|A.alt@1000,0]
-../fonts/TestMORXThirtynine.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+05D0,U+05D1:[uni05D1.alt|uni05D0.alt@1000,0]
-../fonts/TestMORXThirtynine.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+05D1,U+05D0:[uni05D0|uni05D1@606,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-4.tests b/test/shaping/data/text-rendering-tests/tests/MORX-4.tests
deleted file mode 100644 (file)
index cbb1ce8..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+0031:[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|one@2898,0]
-../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+0032:[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|two@2898,0]
-../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0044,U+0058,U+0059,U+005A,U+0033:[P|Q@333,0|R@699,0|D@1050,0|A@1880,0|X@2710,0|Y@3074,0|Z@3406,0|three@3728,0]
-../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0058,U+0059,U+005A,U+0034:[P|Q@333,0|R@699,0|A@1050,0|B@1880,0|X@2710,0|Y@3074,0|Z@3406,0|four@3728,0]
-../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0058,U+0059,U+005A,U+0035:[P|Q@333,0|R@699,0|B@1050,0|A@1880,0|X@2710,0|Y@3074,0|Z@3406,0|five@3728,0]
-../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0058,U+0059,U+005A,U+0036:[P|Q@333,0|R@699,0|A@1050,0|B@1880,0|X@2710,0|Y@3074,0|Z@3406,0|six@3728,0]
-../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0058,U+0059,U+005A,U+0037:[P|Q@333,0|R@699,0|B@1050,0|A@1880,0|X@2710,0|Y@3074,0|Z@3406,0|seven@3728,0]
-../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0043,U+0044,U+0058,U+0059,U+005A,U+0038:[P|Q@333,0|R@699,0|C@1050,0|D@1880,0|A@2710,0|X@3540,0|Y@3904,0|Z@4236,0|eight@4558,0]
-../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0043,U+0044,U+0058,U+0059,U+005A,U+0039:[P|Q@333,0|R@699,0|D@1050,0|C@1880,0|A@2710,0|X@3540,0|Y@3904,0|Z@4236,0|nine@4558,0]
-../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0044,U+0058,U+0059,U+005A,U+2793:[P|Q@333,0|R@699,0|D@1050,0|A@1880,0|B@2710,0|X@3540,0|Y@3904,0|Z@4236,0|one_zero@4558,0]
-../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0044,U+0058,U+0059,U+005A,U+24EB:[P|Q@333,0|R@699,0|D@1050,0|B@1880,0|A@2710,0|X@3540,0|Y@3904,0|Z@4236,0|one_one@4558,0]
-../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0043,U+0044,U+0058,U+0059,U+005A,U+24EC:[P|Q@333,0|R@699,0|C@1050,0|D@1880,0|A@2710,0|B@3540,0|X@4370,0|Y@4734,0|Z@5066,0|one_two@5388,0]
-../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0043,U+0044,U+0058,U+0059,U+005A,U+24ED:[P|Q@333,0|R@699,0|C@1050,0|D@1880,0|B@2710,0|A@3540,0|X@4370,0|Y@4734,0|Z@5066,0|one_three@5388,0]
-../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0043,U+0044,U+0058,U+0059,U+005A,U+24EE:[P|Q@333,0|R@699,0|D@1050,0|C@1880,0|A@2710,0|B@3540,0|X@4370,0|Y@4734,0|Z@5066,0|one_four@5388,0]
-../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0043,U+0044,U+0058,U+0059,U+005A,U+24EF:[P|Q@333,0|R@699,0|D@1050,0|C@1880,0|B@2710,0|A@3540,0|X@4370,0|Y@4734,0|Z@5066,0|one_five@5388,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-40.tests b/test/shaping/data/text-rendering-tests/tests/MORX-40.tests
deleted file mode 100644 (file)
index c99155e..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-../fonts/TestMORXForty.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042:[A|B@639,0]
-../fonts/TestMORXForty.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0042,U+0041:[B.alt|A.alt@1000,0]
-../fonts/TestMORXForty.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+05D0,U+05D1:[uni05D1|uni05D0@542,0]
-../fonts/TestMORXForty.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+05D1,U+05D0:[uni05D0.alt|uni05D1.alt@1000,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-41.tests b/test/shaping/data/text-rendering-tests/tests/MORX-41.tests
deleted file mode 100644 (file)
index 815bebe..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-../fonts/TestMORXFourtyone.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0061,U+0063:[a_c]
-../fonts/TestMORXFourtyone.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0062,U+0063:[b_c]
-../fonts/TestMORXFourtyone.ttf::U+0063,U+0063:*
-../fonts/TestMORXFourtyone.ttf::U+0061,U+0062,U+0063,U+0063:*
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-5.tests b/test/shaping/data/text-rendering-tests/tests/MORX-5.tests
deleted file mode 100644 (file)
index ca8d086..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+0033:[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|three@2898,0]
-../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+0034:[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|four@2898,0]
-../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+0035:[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|five@2898,0]
-../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+0036:[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|six@2898,0]
-../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+0037:[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|seven@2898,0]
-../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+0038:[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|eight@2898,0]
-../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0058,U+0059,U+005A,U+0038:[P|Q@333,0|R@699,0|A@1050,0|B@1880,0|X@2710,0|Y@3074,0|Z@3406,0|eight@3728,0]
-../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+0039:[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|nine@2898,0]
-../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0058,U+0059,U+005A,U+0039:[P|Q@333,0|R@699,0|A@1050,0|B@1880,0|X@2710,0|Y@3074,0|Z@3406,0|nine@3728,0]
-../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+2793:[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|one_zero@2898,0]
-../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0058,U+0059,U+005A,U+2793:[P|Q@333,0|R@699,0|A@1050,0|B@1880,0|X@2710,0|Y@3074,0|Z@3406,0|one_zero@3728,0]
-../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+24EB:[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|one_one@2898,0]
-../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0058,U+0059,U+005A,U+24EB:[P|Q@333,0|R@699,0|A@1050,0|B@1880,0|X@2710,0|Y@3074,0|Z@3406,0|one_one@3728,0]
-../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+24EC:[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|one_two@2898,0]
-../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0058,U+0059,U+005A,U+24EC:[P|Q@333,0|R@699,0|A@1050,0|B@1880,0|X@2710,0|Y@3074,0|Z@3406,0|one_two@3728,0]
-../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0043,U+0058,U+0059,U+005A,U+24EC:[P|Q@333,0|R@699,0|A@1050,0|B@1880,0|C@2710,0|X@3540,0|Y@3904,0|Z@4236,0|one_two@4558,0]
-../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+24ED:[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|one_three@2898,0]
-../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0058,U+0059,U+005A,U+24ED:[P|Q@333,0|R@699,0|A@1050,0|B@1880,0|X@2710,0|Y@3074,0|Z@3406,0|one_three@3728,0]
-../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0043,U+0058,U+0059,U+005A,U+24ED:[P|Q@333,0|R@699,0|A@1050,0|B@1880,0|C@2710,0|X@3540,0|Y@3904,0|Z@4236,0|one_three@4558,0]
-../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+24EE:[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|one_four@2898,0]
-../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0058,U+0059,U+005A,U+24EE:[P|Q@333,0|R@699,0|A@1050,0|B@1880,0|X@2710,0|Y@3074,0|Z@3406,0|one_four@3728,0]
-../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0043,U+0058,U+0059,U+005A,U+24EE:[P|Q@333,0|R@699,0|A@1050,0|B@1880,0|C@2710,0|X@3540,0|Y@3904,0|Z@4236,0|one_four@4558,0]
-../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+24EF:[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|one_five@2898,0]
-../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0058,U+0059,U+005A,U+24EF:[P|Q@333,0|R@699,0|A@1050,0|B@1880,0|X@2710,0|Y@3074,0|Z@3406,0|one_five@3728,0]
-../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0043,U+0058,U+0059,U+005A,U+24EF:[P|Q@333,0|R@699,0|A@1050,0|B@1880,0|C@2710,0|X@3540,0|Y@3904,0|Z@4236,0|one_five@4558,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-6.tests b/test/shaping/data/text-rendering-tests/tests/MORX-6.tests
deleted file mode 100644 (file)
index ff9c061..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/TestMORXTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+004F,U+004F,U+004F,U+0041,U+0042,U+0043,U+0044,U+0045,U+0046,U+0047,U+004F,U+004F,U+004F,U+0033,U+0031,U+0034,U+0031:[O|O@418,0|O@836,0|E@1254,0|F@2084,0|A@2914,0|G@3744,0|B@4574,0|C@5404,0|D@6234,0|O@7064,0|O@7482,0|O@7900,0|three@8318,0|one@9168,0|four@10018,0|one@10868,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-7.tests b/test/shaping/data/text-rendering-tests/tests/MORX-7.tests
deleted file mode 100644 (file)
index f250848..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/TestMORXTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+004F,U+0042,U+0043,U+0044,U+0031:[B|C@830,0|D@1660,0|O@2490,0|one@2908,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-8.tests b/test/shaping/data/text-rendering-tests/tests/MORX-8.tests
deleted file mode 100644 (file)
index aa0d28b..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-../fonts/TestMORXEight.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0030,U+0041,U+0042,U+0043:[zero|A@914,0|B@1552,0|C@2202,0]
-../fonts/TestMORXEight.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0031,U+0041,U+0042,U+0043:[one|B@914,0|C@1564,0|A@2196,0]
-../fonts/TestMORXEight.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0032,U+0041,U+0042,U+0043:[two|C@914,0|A@1546,0|B@2184,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-9.tests b/test/shaping/data/text-rendering-tests/tests/MORX-9.tests
deleted file mode 100644 (file)
index a899908..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../fonts/TestMORXNine.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0058,U+0041,U+0042:[B|A@650,0|X@1288,0|A@1874,0|B@2512,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/SFNT-1.tests b/test/shaping/data/text-rendering-tests/tests/SFNT-1.tests
deleted file mode 100644 (file)
index 7a6feeb..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-../fonts/TestSFNTOne.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041:[A]
-../fonts/TestSFNTOne.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0042:[B]
diff --git a/test/shaping/data/text-rendering-tests/tests/SFNT-2.tests b/test/shaping/data/text-rendering-tests/tests/SFNT-2.tests
deleted file mode 100644 (file)
index 2c952b5..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-../fonts/TestSFNTTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041:[A]
-../fonts/TestSFNTTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0042:[B]
diff --git a/test/shaping/data/text-rendering-tests/tests/SHBALI-3.tests b/test/shaping/data/text-rendering-tests/tests/SHBALI-3.tests
deleted file mode 100644 (file)
index a0f3a32..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-../fonts/NotoSansBalinese-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1B66,U+1B6B:[gid102|gid107@560,-10]
-../fonts/NotoSansBalinese-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1B66,U+1B6C:[gid102|gid108@573,49]
-../fonts/NotoSansBalinese-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1B66,U+1B6D:[gid102|gid109@652,-10]
-../fonts/NotoSansBalinese-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1B66,U+1B6E:[gid102|gid110@652,-98]
-../fonts/NotoSansBalinese-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1B66,U+1B6F:[gid102|gid111@667,-10]
-../fonts/NotoSansBalinese-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1B66,U+1B70:[gid102|gid112@667,-10]
-../fonts/NotoSansBalinese-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1B66,U+1B71:[gid102|gid113@667,-10]
-../fonts/NotoSansBalinese-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1B66,U+1B72:[gid102|gid114@667,-10]
-../fonts/NotoSansBalinese-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1B66,U+1B73:[gid102|gid115@599,-10]
diff --git a/test/shaping/data/text-rendering-tests/tests/SHKNDA-1.tests b/test/shaping/data/text-rendering-tests/tests/SHKNDA-1.tests
deleted file mode 100644 (file)
index adb5aa7..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0CB2,U+0CCD,U+0CB2,U+0CBF:[knLI|knLAc2@757,0]
-../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0C9F,U+0CCD,U+0CB8,U+0CCD:[knTT|knSAc2@1021,0]
-../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0CB3,U+0CBF:[knLLI]
-../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0CA1,U+0CBF:[knDDI]
-../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0CAE,U+0CC6:[knME]
-../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0CB0,U+0CBF:[knRI]
-../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0C96,U+0CCD,U+0CAF,U+0CC6:[knKHE|knYAc2@846,0]
-../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0CAB,U+0CCD,U+0CB0,U+0CBF:[knPHI|knRAc2@735,0]
-../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0CA8,U+0CC6:[knNE]
-../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0C97,U+0CBF:[knGI]
-../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0CB7,U+0CCD,U+0C9F,U+0CBF:[knSSI|knTTAc2@746,0]
-../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0CAF,U+0CBF,U+0C82:[knYI|knAnusvara@1252,0]
-../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0C9A,U+0CC0:[knCI|knLengthmark@766,0]
-../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0CA8,U+0CBF:[knNI]
-../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0C97,U+0CCD,U+0CB2,U+0CBF:[knGI|knLAc2@621,0]
-../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0CB7,U+0CBF:[knSSI]
-../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0C97,U+0CC6:[knGE]
-../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0CA6,U+0CCD,U+0CB5,U+0CBF:[knDI|knVAc2@740,0]
-../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0CA4,U+0CC0:[knTI|knLengthmark@613,0]
-../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0CAE,U+0CBF:[knMI]
-../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0CB2,U+0CBF:[knLI]
-../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0C97,U+0CBF:[knGI]
-../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0CA8,U+0CCD:[knN]
-../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0CAC,U+0CBF:[knBI]
-../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0CB2,U+0CBF:[knLI]
-../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0CA8,U+0CCD,U+0CA8,U+0CBF,U+0C82:[knNI|knNAc2@678,0|knAnusvara@755,0]
-../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0CB2,U+0CCD,U+0CB2,U+0CBF:[knLI|knLAc2@757,0]
-../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0CA7,U+0CBF:[knDHI]
-../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0CAA,U+0CCC:[knPA.base|knmAU@739,0]
-../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0CB5,U+0CBF,U+0C82:[knVI|knAnusvara@749,0]
-../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0CA1,U+0CBF:[knDDI]
-../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0C9F,U+0CBF:[knTTI]
-../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0CA8,U+0CBF:[knNI]
-../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0CA7,U+0CBF:[knDHI]
diff --git a/test/shaping/data/text-rendering-tests/update.py b/test/shaping/data/text-rendering-tests/update.py
deleted file mode 100755 (executable)
index fe5db16..0000000
+++ /dev/null
@@ -1,120 +0,0 @@
-#!/usr/bin/env python3
-
-import sys, os, subprocess, shutil, glob
-import xml.etree.ElementTree as ET
-
-# Can we extract this from HTML element itself? I couldn't.
-namespaces = {
-       'ft': 'https://github.com/OpenType/fonttest',
-       'xlink': 'http://www.w3.org/1999/xlink',
-}
-def ns (s):
-       ns,s = s.split(':')
-       return '{%s}%s' % (namespaces[ns], s)
-
-def unistr (s):
-       return ','.join('U+%04X' % ord(c) for c in s)
-
-def glyphstr (glyphs):
-       out = []
-       for glyphname, x, y in glyphs:
-               if x or y:
-                       out.append ('%s@%d,%d' % (glyphname, x, y))
-               else:
-                       out.append (glyphname)
-       return '[' + '|'.join (out) + ']'
-
-def extract_tests (input):
-       html = ET.fromstring (input)
-       found = False
-
-       result = []
-
-       for elt in html.findall (".//*[@class='expected'][@ft:id]", namespaces):
-               found = True
-               name = elt.get (ns ('ft:id'))
-               text = elt.get (ns ('ft:render'))
-               font = elt.get (ns ('ft:font'))
-               variations = elt.get (ns ('ft:var'), '').replace (':', '=').replace (';', ',')
-               glyphs = []
-               for use in elt.findall (".//use"):
-                       x = int (use.get ('x'))
-                       y = int (use.get ('y'))
-                       href = use.get (ns ('xlink:href'))
-                       assert href[0] == '#'
-                       glyphname = '.'.join (href[1:].split ('/')[1].split ('.')[1:])
-                       glyphs.append ((glyphname, x, y))
-               opts = '--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft'
-               if variations:
-                       opts = opts + ' --variations=%s' % variations
-               result.append ("../fonts/%s:%s:%s:%s" % (font, opts, unistr(text), glyphstr(glyphs)))
-
-       for elt in html.findall (".//*[@class='expected-no-crash'][@ft:id]", namespaces):
-               found = True
-               name = elt.get (ns ('ft:id'))
-               text = elt.get (ns ('ft:render'))
-               font = elt.get (ns ('ft:font'))
-               variations = elt.get (ns ('ft:var'), '').replace (':', '=').replace (';', ',')
-               opts = ''
-               if variations:
-                       opts = '--variations=%s' % variations
-               result.append ("../fonts/%s:%s:%s:*" % (font, opts, unistr (text)))
-
-       assert found
-       return '\n'.join (result) + '\n'
-
-os.chdir (os.environ.get ('srcdir', os.path.dirname (__file__)))
-
-git = shutil.which ('git')
-assert git
-
-if os.path.isdir ('./text-rendering-tests'):
-       subprocess.run ([git, 'pull'], cwd='text-rendering-tests', check=True)
-else:
-       subprocess.run ([git, 'clone', 'https://github.com/unicode-org/text-rendering-tests'], check=True)
-
-shutil.rmtree ('fonts', ignore_errors=True)
-assert not os.path.exists ('fonts')
-shutil.copytree ('text-rendering-tests/fonts', 'fonts')
-subprocess.run([git, 'add', 'fonts'], check=True)
-
-shutil.rmtree ('tests', ignore_errors=True)
-assert not os.path.isdir('tests')
-os.mkdir ('tests')
-
-with open ('DISABLED', 'r') as f: disabled = f.read ()
-
-tests = []
-disabled_tests = []
-
-for x in sorted (os.listdir ('text-rendering-tests/testcases')):
-       if not x.endswith ('.html') or x == 'index.html': continue
-       out = 'tests/%s.tests' % x.split('.html')[0]
-       with open ('text-rendering-tests/testcases/' + x, 'r') as f: content = f.read ()
-       with open (out, 'w') as f: f.write (extract_tests (content))
-       if out in disabled:
-               disabled_tests.append (out)
-       else:
-               tests.append (out)
-
-subprocess.run([git, 'add', 'tests'], check=True)
-
-with open ('meson.build', 'w') as f: f.write ('\n'.join (
-       ['text_rendering_tests = ['] +
-       ['  \'%s\',' % x.split('tests/')[1] for x in tests] +
-       [']', '', 'disabled_text_rendering_tests = ['] +
-       ['  \'%s\',' % x.split('tests/')[1] for x in disabled_tests] +
-       [']', '']
-))
-
-with open ('Makefile.sources', 'w') as f: f.write ('\n'.join (
-       ['TESTS = \\'] +
-       ['      %s \\' % x for x in tests] +
-       ['      $(NULL)', '', 'DISBALED_TESTS = \\'] +
-       ['      %s \\' % x for x in disabled_tests] +
-       ['      $(NULL)', '']
-))
-
-subprocess.run([git, 'add', 'Makefile.sources'], check=True)
-
-print ('Updated the testsuit, now run `git commit -e -m "[test/text-rendering-tests] Update from upstream"`')
diff --git a/test/shaping/hb_test_tools.py b/test/shaping/hb_test_tools.py
deleted file mode 100644 (file)
index a9368ad..0000000
+++ /dev/null
@@ -1,491 +0,0 @@
-#!/usr/bin/env python3
-
-import sys, os, re, difflib, unicodedata, errno, cgi, itertools
-from itertools import *
-
-diff_symbols = "-+=*&^%$#@!~/"
-diff_colors = ['red', 'green', 'blue']
-
-def codepoints(s):
-       return (ord (u) for u in s)
-
-class ColorFormatter:
-
-       class Null:
-               @staticmethod
-               def start_color (c): return ''
-               @staticmethod
-               def end_color (): return ''
-               @staticmethod
-               def escape (s): return s
-               @staticmethod
-               def newline (): return '\n'
-
-       class ANSI:
-               @staticmethod
-               def start_color (c):
-                       return {
-                               'red': '\033[41;37;1m',
-                               'green': '\033[42;37;1m',
-                               'blue': '\033[44;37;1m',
-                       }[c]
-               @staticmethod
-               def end_color ():
-                       return '\033[m'
-               @staticmethod
-               def escape (s): return s
-               @staticmethod
-               def newline (): return '\n'
-
-       class HTML:
-               @staticmethod
-               def start_color (c):
-                       return '<span style="background:%s">' % c
-               @staticmethod
-               def end_color ():
-                       return '</span>'
-               @staticmethod
-               def escape (s): return cgi.escape (s)
-               @staticmethod
-               def newline (): return '<br/>\n'
-
-       @staticmethod
-       def Auto (argv = [], out = sys.stdout):
-               format = ColorFormatter.ANSI
-               if "--format" in argv:
-                       argv.remove ("--format")
-                       format = ColorFormatter.ANSI
-               if "--format=ansi" in argv:
-                       argv.remove ("--format=ansi")
-                       format = ColorFormatter.ANSI
-               if "--format=html" in argv:
-                       argv.remove ("--format=html")
-                       format = ColorFormatter.HTML
-               if "--no-format" in argv:
-                       argv.remove ("--no-format")
-                       format = ColorFormatter.Null
-               return format
-
-
-class DiffColorizer:
-
-       diff_regex = re.compile ('([a-za-z0-9_]*)([^a-za-z0-9_]?)')
-
-       def __init__ (self, formatter, colors=diff_colors, symbols=diff_symbols):
-               self.formatter = formatter
-               self.colors = colors
-               self.symbols = symbols
-
-       def colorize_lines (self, lines):
-               lines = (l if l else '' for l in lines)
-               ss = [self.diff_regex.sub (r'\1\n\2\n', l).splitlines (True) for l in lines]
-               oo = ["",""]
-               st = [False, False]
-               for l in difflib.Differ().compare (*ss):
-                       if l[0] == '?':
-                               continue
-                       if l[0] == ' ':
-                               for i in range(2):
-                                       if st[i]:
-                                               oo[i] += self.formatter.end_color ()
-                                               st[i] = False
-                               oo = [o + self.formatter.escape (l[2:]) for o in oo]
-                               continue
-                       if l[0] in self.symbols:
-                               i = self.symbols.index (l[0])
-                               if not st[i]:
-                                       oo[i] += self.formatter.start_color (self.colors[i])
-                                       st[i] = True
-                               oo[i] += self.formatter.escape (l[2:])
-                               continue
-               for i in range(2):
-                       if st[i]:
-                               oo[i] += self.formatter.end_color ()
-                               st[i] = False
-               oo = [o.replace ('\n', '') for o in oo]
-               return [s1+s2+self.formatter.newline () for (s1,s2) in zip (self.symbols, oo) if s2]
-
-       def colorize_diff (self, f):
-               lines = [None, None]
-               for l in f:
-                       if l[0] not in self.symbols:
-                               yield self.formatter.escape (l).replace ('\n', self.formatter.newline ())
-                               continue
-                       i = self.symbols.index (l[0])
-                       if lines[i]:
-                               # Flush
-                               for line in self.colorize_lines (lines):
-                                       yield line
-                               lines = [None, None]
-                       lines[i] = l[1:]
-                       if (all (lines)):
-                               # Flush
-                               for line in self.colorize_lines (lines):
-                                       yield line
-                               lines = [None, None]
-               if (any (lines)):
-                       # Flush
-                       for line in self.colorize_lines (lines):
-                               yield line
-
-
-class ZipDiffer:
-
-       @staticmethod
-       def diff_files (files, symbols=diff_symbols):
-               files = tuple (files) # in case it's a generator, copy it
-               try:
-                       for lines in itertools.zip_longest (*files):
-                               if all (lines[0] == line for line in lines[1:]):
-                                       sys.stdout.writelines ([" ", lines[0]])
-                                       continue
-
-                               for i, l in enumerate (lines):
-                                       if l:
-                                               sys.stdout.writelines ([symbols[i], l])
-               except IOError as e:
-                       if e.errno != errno.EPIPE:
-                               sys.exit ("%s: %s: %s" % (sys.argv[0], e.filename, e.strerror))
-
-
-class DiffFilters:
-
-       @staticmethod
-       def filter_failures (f):
-               for key, lines in DiffHelpers.separate_test_cases (f):
-                       lines = list (lines)
-                       if not DiffHelpers.test_passed (lines):
-                               for l in lines: yield l
-
-class Stat:
-
-       def __init__ (self):
-               self.count = 0
-               self.freq = 0
-
-       def add (self, test):
-               self.count += 1
-               self.freq += test.freq
-
-class Stats:
-
-       def __init__ (self):
-               self.passed = Stat ()
-               self.failed = Stat ()
-               self.total  = Stat ()
-
-       def add (self, test):
-               self.total.add (test)
-               if test.passed:
-                       self.passed.add (test)
-               else:
-                       self.failed.add (test)
-
-       def mean (self):
-               return float (self.passed.count) / self.total.count
-
-       def variance (self):
-               return (float (self.passed.count) / self.total.count) * \
-                      (float (self.failed.count) / self.total.count)
-
-       def stddev (self):
-               return self.variance () ** .5
-
-       def zscore (self, population):
-               """Calculate the standard score.
-                  Population is the Stats for population.
-                  Self is Stats for sample.
-                  Returns larger absolute value if sample is highly unlikely to be random.
-                  Anything outside of -3..+3 is very unlikely to be random.
-                  See: https://en.wikipedia.org/wiki/Standard_score"""
-
-               return (self.mean () - population.mean ()) / population.stddev ()
-
-
-
-
-class DiffSinks:
-
-       @staticmethod
-       def print_stat (f):
-               passed = 0
-               failed = 0
-               # XXX port to Stats, but that would really slow us down here
-               for key, lines in DiffHelpers.separate_test_cases (f):
-                       if DiffHelpers.test_passed (lines):
-                               passed += 1
-                       else:
-                               failed += 1
-               total = passed + failed
-               print ("%d out of %d tests passed.  %d failed (%g%%)" % (passed, total, failed, 100. * failed / total))
-
-
-class Test:
-
-       def __init__ (self, lines):
-               self.freq = 1
-               self.passed = True
-               self.identifier = None
-               self.text = None
-               self.unicodes = None
-               self.glyphs = None
-               for l in lines:
-                       symbol = l[0]
-                       if symbol != ' ':
-                               self.passed = False
-                       i = 1
-                       if ':' in l:
-                               i = l.index (':')
-                               if not self.identifier:
-                                       self.identifier = l[1:i]
-                               i = i + 2 # Skip colon and space
-                       j = -1
-                       if l[j] == '\n':
-                               j -= 1
-                       brackets = l[i] + l[j]
-                       l = l[i+1:-2]
-                       if brackets == '()':
-                               self.text = l
-                       elif brackets == '<>':
-                               self.unicodes = Unicode.parse (l)
-                       elif brackets == '[]':
-                               # XXX we don't handle failed tests here
-                               self.glyphs = l
-
-
-class DiffHelpers:
-
-       @staticmethod
-       def separate_test_cases (f):
-               '''Reads lines from f, and if the lines have identifiers, ie.
-                  have a colon character, groups them by identifier,
-                  yielding lists of all lines with the same identifier.'''
-
-               def identifier (l):
-                       if ':' in l[1:]:
-                               return l[1:l.index (':')]
-                       return l
-               return groupby (f, key=identifier)
-
-       @staticmethod
-       def test_passed (lines):
-               lines = list (lines)
-               # XXX This is a hack, but does the job for now.
-               if any (l.find("space+0|space+0") >= 0 for l in lines if l[0] == '+'): return True
-               if any (l.find("uni25CC") >= 0 for l in lines if l[0] == '+'): return True
-               if any (l.find("dottedcircle") >= 0 for l in lines if l[0] == '+'): return True
-               if any (l.find("glyph0") >= 0 for l in lines if l[0] == '+'): return True
-               if any (l.find("gid0") >= 0 for l in lines if l[0] == '+'): return True
-               if any (l.find("notdef") >= 0 for l in lines if l[0] == '+'): return True
-               return all (l[0] == ' ' for l in lines)
-
-
-class FilterHelpers:
-
-       @staticmethod
-       def filter_printer_function (filter_callback):
-               def printer (f):
-                       for line in filter_callback (f):
-                               print (line)
-               return printer
-
-       @staticmethod
-       def filter_printer_function_no_newline (filter_callback):
-               def printer (f):
-                       for line in filter_callback (f):
-                               sys.stdout.writelines ([line])
-               return printer
-
-
-class Ngram:
-
-       @staticmethod
-       def generator (n):
-
-               def gen (f):
-                       l = []
-                       for x in f:
-                               l.append (x)
-                               if len (l) == n:
-                                       yield tuple (l)
-                                       l[:1] = []
-
-               gen.n = n
-               return gen
-
-
-class UtilMains:
-
-       @staticmethod
-       def process_multiple_files (callback, mnemonic = "FILE"):
-
-               if "--help" in sys.argv:
-                       sys.exit ("Usage: %s %s..." % (sys.argv[0], mnemonic))
-
-               try:
-                       files = sys.argv[1:] if len (sys.argv) > 1 else ['-']
-                       for s in files:
-                               callback (FileHelpers.open_file_or_stdin (s))
-               except IOError as e:
-                       if e.errno != errno.EPIPE:
-                               sys.exit ("%s: %s: %s" % (sys.argv[0], e.filename, e.strerror))
-
-       @staticmethod
-       def process_multiple_args (callback, mnemonic):
-
-               if len (sys.argv) == 1 or "--help" in sys.argv:
-                       sys.exit ("Usage: %s %s..." % (sys.argv[0], mnemonic))
-
-               try:
-                       for s in sys.argv[1:]:
-                               callback (s)
-               except IOError as e:
-                       if e.errno != errno.EPIPE:
-                               sys.exit ("%s: %s: %s" % (sys.argv[0], e.filename, e.strerror))
-
-       @staticmethod
-       def filter_multiple_strings_or_stdin (callback, mnemonic, \
-                                             separator = " ", \
-                                             concat_separator = False):
-
-               if "--help" in sys.argv:
-                       sys.exit ("""Usage:
-  %s %s...
-or:
-  %s
-When called with no arguments, input is read from standard input.
-""" % (sys.argv[0], mnemonic, sys.argv[0]))
-
-               try:
-                       if len (sys.argv) == 1:
-                               while (1):
-                                       line = sys.stdin.readline ()
-                                       if not len (line):
-                                               break
-                                       if line[-1] == '\n':
-                                               line = line[:-1]
-                                       print (callback (line))
-                       else:
-                               args = sys.argv[1:]
-                               if concat_separator != False:
-                                       args = [concat_separator.join (args)]
-                               print (separator.join (callback (x) for x in (args)))
-               except IOError as e:
-                       if e.errno != errno.EPIPE:
-                               sys.exit ("%s: %s: %s" % (sys.argv[0], e.filename, e.strerror))
-
-
-class Unicode:
-
-       @staticmethod
-       def decode (s):
-               return ','.join ("U+%04X" % cp for cp in codepoints (s))
-
-       @staticmethod
-       def parse (s):
-               s = re.sub (r"0[xX]", " ", s)
-               s = re.sub (r"[<+>{},;&#\\xXuUnNiI\n\t]", " ", s)
-               return [int (x, 16) for x in s.split ()]
-
-       @staticmethod
-       def encode (s):
-               return ''.join (chr (x) for x in Unicode.parse (s))
-
-       shorthands = {
-               "ZERO WIDTH NON-JOINER": "ZWNJ",
-               "ZERO WIDTH JOINER": "ZWJ",
-               "NARROW NO-BREAK SPACE": "NNBSP",
-               "COMBINING GRAPHEME JOINER": "CGJ",
-               "LEFT-TO-RIGHT MARK": "LRM",
-               "RIGHT-TO-LEFT MARK": "RLM",
-               "LEFT-TO-RIGHT EMBEDDING": "LRE",
-               "RIGHT-TO-LEFT EMBEDDING": "RLE",
-               "POP DIRECTIONAL FORMATTING": "PDF",
-               "LEFT-TO-RIGHT OVERRIDE": "LRO",
-               "RIGHT-TO-LEFT OVERRIDE": "RLO",
-       }
-
-       @staticmethod
-       def pretty_name (u):
-               try:
-                       s = unicodedata.name (u)
-               except ValueError:
-                       return "XXX"
-               s = re.sub (".* LETTER ", "", s)
-               s = re.sub (".* VOWEL SIGN (.*)", r"\1-MATRA", s)
-               s = re.sub (".* SIGN ", "", s)
-               s = re.sub (".* COMBINING ", "", s)
-               if re.match (".* VIRAMA", s):
-                       s = "HALANT"
-               if s in Unicode.shorthands:
-                       s = Unicode.shorthands[s]
-               return s
-
-       @staticmethod
-       def pretty_names (s):
-               s = re.sub (r"[<+>\\uU]", " ", s)
-               s = re.sub (r"0[xX]", " ", s)
-               s = [chr (int (x, 16)) for x in re.split ('[, \n]', s) if len (x)]
-               return ' + '.join (Unicode.pretty_name (x) for x in s)
-
-
-class FileHelpers:
-
-       @staticmethod
-       def open_file_or_stdin (f):
-               if f == '-':
-                       return sys.stdin
-               return open (f)
-
-
-class Manifest:
-
-       @staticmethod
-       def read (s, strict = True):
-
-               if not os.path.exists (s):
-                       if strict:
-                               sys.exit ("%s: %s does not exist" % (sys.argv[0], s))
-                       return
-
-               s = os.path.normpath (s)
-
-               if os.path.isdir (s):
-
-                       try:
-                               m = open (os.path.join (s, "MANIFEST"))
-                               items = [x.strip () for x in m.readlines ()]
-                               for f in items:
-                                       for p in Manifest.read (os.path.join (s, f)):
-                                               yield p
-                       except IOError:
-                               if strict:
-                                       sys.exit ("%s: %s does not exist" % (sys.argv[0], os.path.join (s, "MANIFEST")))
-                               return
-               else:
-                       yield s
-
-       @staticmethod
-       def update_recursive (s):
-
-               for dirpath, dirnames, filenames in os.walk (s, followlinks=True):
-
-                       for f in ["MANIFEST", "README", "LICENSE", "COPYING", "AUTHORS", "SOURCES", "ChangeLog"]:
-                               if f in dirnames:
-                                       dirnames.remove (f)
-                               if f in filenames:
-                                       filenames.remove (f)
-                       dirnames.sort ()
-                       filenames.sort ()
-                       ms = os.path.join (dirpath, "MANIFEST")
-                       print ("  GEN    %s" % ms)
-                       m = open (ms, "w")
-                       for f in filenames:
-                               print (f, file=m)
-                       for f in dirnames:
-                               print (f, file=m)
-                       for f in dirnames:
-                               Manifest.update_recursive (os.path.join (dirpath, f))
-
-if __name__ == '__main__':
-       pass
diff --git a/test/shaping/meson.build b/test/shaping/meson.build
deleted file mode 100644 (file)
index d301585..0000000
+++ /dev/null
@@ -1,228 +0,0 @@
-in_house_tests = [
-  'aat-trak.tests',
-  'aat-morx.tests',
-  'arabic-fallback-shaping.tests',
-  'arabic-feature-order.tests',
-  'arabic-like-joining.tests',
-  'arabic-mark-attach.tests',
-  'arabic-mark-order.tests',
-  'arabic-stch.tests',
-  'automatic-fractions.tests',
-  'cluster.tests',
-  'collections.tests',
-  'color-fonts.tests',
-  'context-matching.tests',
-  'cursive-positioning.tests',
-  'default-ignorables.tests',
-  'emoji.tests',
-  'fallback-positioning.tests',
-  'hangul-jamo.tests',
-  'hyphens.tests',
-  'indic-consonant-with-stacker.tests',
-  'indic-decompose.tests',
-  'indic-init.tests',
-  'indic-joiner-candrabindu.tests',
-  'indic-joiners.tests',
-  'indic-old-spec.tests',
-  'indic-pref-blocking.tests',
-  'indic-script-extensions.tests',
-  'indic-special-cases.tests',
-  'indic-syllable.tests',
-  'indic-vowel-letter-spoofing.tests',
-  'kern-format2.tests',
-  'khmer-mark-order.tests',
-  'khmer-misc.tests',
-  'language-tags.tests',
-  'ligature-id.tests',
-  'macos.tests',
-  'mark-attachment.tests',
-  'mark-filtering-sets.tests',
-  'mongolian-variation-selector.tests',
-  'myanmar-syllable.tests',
-  'myanmar-zawgyi.tests',
-  'none-directional.tests',
-  'positioning-features.tests',
-  'rand.tests',
-  'rotation.tests',
-  'spaces.tests',
-  'simple.tests',
-  'sinhala.tests',
-  'tibetan-contractions-1.tests',
-  'tibetan-contractions-2.tests',
-  'tibetan-vowels.tests',
-  'use.tests',
-  'use-indic3.tests',
-  'use-marchen.tests',
-  'use-syllable.tests',
-  'variations-rvrn.tests',
-  'vertical.tests',
-  'zero-width-marks.tests',
-]
-
-aots_tests = [
-  'classdef1_empty.tests',
-  'classdef1_multiple.tests',
-  'classdef1_single.tests',
-  'classdef1.tests',
-  'classdef2_empty.tests',
-  'classdef2_multiple.tests',
-  'classdef2_single.tests',
-  'classdef2.tests',
-  'gpos_chaining1_boundary.tests',
-  'gpos_chaining1_lookupflag.tests',
-  'gpos_chaining1_multiple_subrules.tests',
-  'gpos_chaining1_next_glyph.tests',
-  'gpos_chaining1_simple.tests',
-  'gpos_chaining1_successive.tests',
-  'gpos_chaining2_boundary.tests',
-  'gpos_chaining2_lookupflag.tests',
-  'gpos_chaining2_multiple_subrules.tests',
-  'gpos_chaining2_next_glyph.tests',
-  'gpos_chaining2_simple.tests',
-  'gpos_chaining2_successive.tests',
-  'gpos_chaining3_boundary.tests',
-  'gpos_chaining3_lookupflag.tests',
-  'gpos_chaining3_next_glyph.tests',
-  'gpos_chaining3_simple.tests',
-  'gpos_chaining3_successive.tests',
-  'gpos_context1_boundary.tests',
-  'gpos_context1_expansion.tests',
-  'gpos_context1_lookupflag.tests',
-  'gpos_context1_multiple_subrules.tests',
-  'gpos_context1_next_glyph.tests',
-  'gpos_context1_simple.tests',
-  'gpos_context1_successive.tests',
-  'gpos_context2_boundary.tests',
-  'gpos_context2_classes.tests',
-  'gpos_context2_expansion.tests',
-  'gpos_context2_lookupflag.tests',
-  'gpos_context2_multiple_subrules.tests',
-  'gpos_context2_next_glyph.tests',
-  'gpos_context2_simple.tests',
-  'gpos_context2_successive.tests',
-  'gpos_context3_boundary.tests',
-  'gpos_context3_lookupflag.tests',
-  'gpos_context3_next_glyph.tests',
-  'gpos_context3_simple.tests',
-  'gpos_context3_successive.tests',
-  'gpos1_1_lookupflag.tests',
-  'gpos1_1_simple.tests',
-  'gpos1_2_lookupflag.tests',
-  'gpos1_2.tests',
-  'gpos2_1_lookupflag.tests',
-  'gpos2_1_next_glyph.tests',
-  'gpos2_1_simple.tests',
-  'gpos2_1.tests',
-  'gpos2_2.tests',
-  'gpos3_lookupflag.tests',
-  'gpos3.tests',
-  'gpos4_lookupflag.tests',
-  'gpos4_multiple_anchors.tests',
-  'gpos4_simple.tests',
-  'gpos5.tests',
-  'gpos6.tests',
-  'gpos7_1.tests',
-  'gpos9.tests',
-  'gsub_chaining1_boundary.tests',
-  'gsub_chaining1_lookupflag.tests',
-  'gsub_chaining1_multiple_subrules.tests',
-  'gsub_chaining1_next_glyph.tests',
-  'gsub_chaining1_simple.tests',
-  'gsub_chaining1_successive.tests',
-  'gsub_chaining2_boundary.tests',
-  'gsub_chaining2_lookupflag.tests',
-  'gsub_chaining2_multiple_subrules.tests',
-  'gsub_chaining2_next_glyph.tests',
-  'gsub_chaining2_simple.tests',
-  'gsub_chaining2_successive.tests',
-  'gsub_chaining3_boundary.tests',
-  'gsub_chaining3_lookupflag.tests',
-  'gsub_chaining3_next_glyph.tests',
-  'gsub_chaining3_simple.tests',
-  'gsub_chaining3_successive.tests',
-  'gsub_context1_boundary.tests',
-  'gsub_context1_expansion.tests',
-  'gsub_context1_lookupflag.tests',
-  'gsub_context1_multiple_subrules.tests',
-  'gsub_context1_next_glyph.tests',
-  'gsub_context1_simple.tests',
-  'gsub_context1_successive.tests',
-  'gsub_context2_boundary.tests',
-  'gsub_context2_classes.tests',
-  'gsub_context2_expansion.tests',
-  'gsub_context2_lookupflag.tests',
-  'gsub_context2_multiple_subrules.tests',
-  'gsub_context2_next_glyph.tests',
-  'gsub_context2_simple.tests',
-  'gsub_context2_successive.tests',
-  'gsub_context3_boundary.tests',
-  'gsub_context3_lookupflag.tests',
-  'gsub_context3_next_glyph.tests',
-  'gsub_context3_simple.tests',
-  'gsub_context3_successive.tests',
-  'gsub1_1_lookupflag.tests',
-  'gsub1_1_modulo.tests',
-  'gsub1_1_simple.tests',
-  'gsub1_2_lookupflag.tests',
-  'gsub1_2_simple.tests',
-  'gsub2_1_lookupflag.tests',
-  'gsub2_1_multiple_sequences.tests',
-  'gsub2_1_simple.tests',
-  'gsub3_1_lookupflag.tests',
-  'gsub3_1_multiple.tests',
-  'gsub3_1_simple.tests',
-  'gsub4_1_lookupflag.tests',
-  'gsub4_1_multiple_ligatures.tests',
-  'gsub4_1_multiple_ligsets.tests',
-  'gsub4_1_simple.tests',
-  'gsub7.tests',
-  'lookupflag_ignore_attach.tests',
-  'lookupflag_ignore_base.tests',
-  'lookupflag_ignore_combination.tests',
-  'lookupflag_ignore_ligatures.tests',
-  'lookupflag_ignore_marks.tests',
-]
-
-# to import text_rendering_tests from data/text-rendering-tests/meson.build
-subdir('data/text-rendering-tests')
-
-shaping_run_tests_py = find_program('run-tests.py')
-
-foreach file_name : in_house_tests
-  test_name = file_name.split('.')[0].underscorify()
-
-  test(test_name, shaping_run_tests_py,
-    args: [
-      hb_shape,
-      meson.current_source_dir() / 'data' / 'in-house' / 'tests' / file_name,
-    ],
-    workdir: meson.current_build_dir() / '..' / '..',
-    suite: ['shaping', 'in-house'],
-  )
-endforeach
-
-foreach file_name : aots_tests
-  test_name = file_name.split('.')[0].underscorify()
-
-  test(test_name, shaping_run_tests_py,
-    args: [
-      hb_shape,
-      meson.current_source_dir() / 'data' / 'aots' / 'tests' / file_name,
-    ],
-    workdir: meson.current_build_dir() / '..' / '..',
-    suite: ['shaping', 'aots'],
-  )
-endforeach
-
-foreach file_name : text_rendering_tests
-  test_name = file_name.split('.')[0].underscorify()
-
-  test(test_name, shaping_run_tests_py,
-    args: [
-      hb_shape,
-      meson.current_source_dir() / 'data' / 'text-rendering-tests' / 'tests' / file_name,
-    ],
-    workdir: meson.current_build_dir() / '..' / '..',
-    suite: ['shaping', 'text-rendering-tests'],
-  )
-endforeach
diff --git a/test/shaping/record-test.sh b/test/shaping/record-test.sh
deleted file mode 100755 (executable)
index 62a4795..0000000
+++ /dev/null
@@ -1,126 +0,0 @@
-#!/bin/bash
-
-dir=`mktemp -d`
-
-if which sha1sum 2>/dev/null >/dev/null; then
-       SHA1SUM=sha1sum
-elif which shasum 2>/dev/null >/dev/null; then
-       SHA1SUM='shasum -a 1'
-elif which digest 2>/dev/null >/dev/null; then
-       SHA1SUM='digest -a sha1'
-else
-       echo "'sha1sum' not found"
-       exit 2
-fi
-
-out=/dev/stdout
-if test "x$1" == 'x-o'; then
-       shift
-       out=$1
-       shift
-fi
-hb_shape=$1
-shift
-fontfile=$1
-if test "x${fontfile:0:1}" == 'x-'; then
-       echo "Specify font file before other options." >&2
-       exit 1
-fi
-shift
-if ! echo "$hb_shape" | grep -q 'hb-shape'; then
-       echo "Specify hb-shape (not hb-view, etc): got "$hb_shape"." >&2
-       exit 1
-fi
-options=
-have_text=false
-for arg in "$@"; do
-       if test "x${arg:0:1}" == 'x-'; then
-               if echo "$arg" | grep -q ' '; then
-                       echo "Space in argument is not supported: '$arg'." >&2
-                       exit 1
-               fi
-               options="$options${options:+ }$arg"
-               continue
-       fi
-       if $have_text; then
-               echo "Too many arguments found...  Use '=' notation for options: '$arg'" >&2
-               exit 1;
-       fi
-       text="$arg"
-       have_text=true
-done
-if ! $have_text; then
-       text=`cat`
-fi
-unicodes=`echo "$text" | ./hb-unicode-decode`
-glyphs=`echo "$text" | $hb_shape $options "$fontfile"`
-if test $? != 0; then
-       echo "hb-shape failed." >&2
-       exit 2
-fi
-glyph_ids=`echo "$text" | $hb_shape $options --no-glyph-names --no-clusters --no-positions "$fontfile" | sed 's/[][]//g; s/|/,/g'`
-
-cp "$fontfile" "$dir/font.ttf"
-echo fonttools subset \
-       --glyph-names \
-       --no-hinting \
-       --layout-features='*' \
-       "$dir/font.ttf" \
-       --gids="$glyph_ids" \
-       --text="$text"
-fonttools subset \
-       --glyph-names \
-       --no-hinting \
-       --layout-features='*' \
-       "$dir/font.ttf" \
-       --gids="$glyph_ids" \
-       --text="$text"
-if ! test -s "$dir/font.subset.ttf"; then
-       echo "Subsetter didn't produce nonempty subset font in $dir/font.subset.ttf" >&2
-       exit 2
-fi
-
-# Verify that subset font produces same glyphs!
-glyphs_subset=`echo "$text" | $hb_shape $options "$dir/font.subset.ttf"`
-
-if ! test "x$glyphs" = "x$glyphs_subset"; then
-       echo "Subset font produced different glyphs!" >&2
-       echo "Perhaps font doesn't have glyph names; checking visually..." >&2
-       hb_view=${hb_shape/shape/view}
-       echo "$text" | $hb_view $options "$dir/font.ttf" --output-format=png --output-file="$dir/orig.png"
-       echo "$text" | $hb_view $options "$dir/font.subset.ttf" --output-format=png --output-file="$dir/subset.png"
-       if ! cmp "$dir/orig.png" "$dir/subset.png"; then
-               echo "Images differ.  Please inspect $dir/*.png." >&2
-               echo "$glyphs" >> "$out"
-               echo "$glyphs_subset" >> "$out"
-               exit 2
-       fi
-       echo "Yep; all good." >&2
-       rm -f "$dir/orig.png"
-       rm -f "$dir/subset.png"
-       glyphs=$glyphs_subset
-fi
-
-sha1sum=`$SHA1SUM "$dir/font.subset.ttf" | cut -d' ' -f1`
-subset="data/in-house/fonts/$sha1sum.ttf"
-mv "$dir/font.subset.ttf" "$subset"
-
-# There ought to be an easier way to do this, but it escapes me...
-unicodes_file=`mktemp`
-glyphs_file=`mktemp`
-echo "$unicodes" > "$unicodes_file"
-echo "$glyphs" > "$glyphs_file"
-# Open the "file"s
-exec 3<"$unicodes_file"
-exec 4<"$glyphs_file"
-relative_subset="$subset"
-if test "$out" != "/dev/stdout"; then
-       relative_subset="$(/usr/bin/env python3 -c 'import os, sys; print (os.path.relpath (sys.argv[1], sys.argv[2]))' "$subset" "$(dirname "$out")")"
-fi
-while read uline <&3 && read gline <&4; do
-       echo "$relative_subset:$options:$uline:$gline" >> "$out"
-done
-
-
-rm -f "$dir/font.ttf"
-rmdir "$dir"
diff --git a/test/shaping/run-tests.py b/test/shaping/run-tests.py
deleted file mode 100755 (executable)
index 9731067..0000000
+++ /dev/null
@@ -1,155 +0,0 @@
-#!/usr/bin/env python3
-
-import sys, os, subprocess, hashlib, tempfile, shutil
-
-
-args = sys.argv[1:]
-
-reference = False
-if len (args) and args[0] == "--reference":
-       reference = True
-       args = args[1:]
-
-if not args or args[0].find('hb-shape') == -1 or not os.path.exists (args[0]):
-       sys.exit ("""First argument does not seem to point to usable hb-shape.""")
-hb_shape, args = args[0], args[1:]
-
-def cmd(command):
-       process = subprocess.Popen ([hb_shape, '--batch'],
-                           stdin=subprocess.PIPE,
-                           stdout=subprocess.PIPE,
-                           stderr=subprocess.PIPE)
-       process.stdin.write ((' '.join (command) + '\n').encode ("utf-8"))
-       process.stdin.flush ()
-       ret_stdout = None
-       ret_stderr = None
-       ret_stdout, ret_stderr = process.communicate ()
-       if ret_stdout is not None:
-               ret_stdout = ret_stdout.decode ("utf-8").strip ()
-       if ret_stderr is not None:
-               ret_stderr = ret_stderr.decode ("utf-8").strip ()
-       return (ret_stdout, ret_stderr)
-
-passes = 0
-fails = 0
-skips = 0
-
-if not len (args):
-       args = ['-']
-
-for filename in args:
-       if not reference:
-               if filename == '-':
-                       print ("Running tests from standard input")
-               else:
-                       print ("Running tests in " + filename)
-
-       if filename == '-':
-               f = sys.stdin
-       else:
-               f = open (filename, encoding='utf8')
-
-       for line in f:
-               comment = False
-               if line.startswith ("#"):
-                       comment = True
-                       line = line[1:]
-
-                       if line.startswith (' '):
-                               if not reference:
-                                       print ("#%s" % line)
-                               continue
-
-               line = line.strip ()
-               if not line:
-                       continue
-
-               fontfile, options, unicodes, glyphs_expected = line.split (":")
-               if fontfile.startswith ('/') or fontfile.startswith ('"/'):
-                       if os.name == 'nt': # Skip on Windows
-                               continue
-
-                       fontfile, expected_hash = fontfile.split('@')
-
-                       try:
-                               with open (fontfile, 'rb') as ff:
-                                       actual_hash = hashlib.sha1 (ff.read()).hexdigest ().strip ()
-                                       if actual_hash != expected_hash:
-                                               print ('different version of %s found; Expected hash %s, got %s; skipping.' %
-                                                          (fontfile, expected_hash, actual_hash))
-                                               skips += 1
-                                               continue
-                       except:
-                               print ('%s not found, skip.' % fontfile)
-                               skips += 1
-                               continue
-               else:
-                       cwd = os.path.dirname(filename)
-                       fontfile = os.path.normpath (os.path.join (cwd, fontfile))
-
-               extra_options = ["--shaper=ot"]
-               if glyphs_expected != '*':
-                       extra_options.append("--verify")
-
-               if comment:
-                       if not reference:
-                               print ('# %s "%s" --unicodes %s' % (hb_shape, fontfile, unicodes))
-                       continue
-
-               if not reference:
-                       print ('%s "%s" %s %s --unicodes %s' %
-                                        (hb_shape, fontfile, ' '.join(extra_options), options, unicodes))
-
-               # hack to support fonts with space on run-tests.py, after several other tries...
-               if ' ' in fontfile:
-                       new_fontfile = os.path.join (tempfile.gettempdir (), 'tmpfile')
-                       shutil.copyfile(fontfile, new_fontfile)
-                       fontfile = new_fontfile
-
-               glyphs1 = cmd ([hb_shape, "--font-funcs=ft",
-                       fontfile] + extra_options + ["--unicodes",
-                       unicodes] + (options.split (' ') if options else []))
-
-               if glyphs1[1] is not None or glyphs1[1] != '':
-                       check_string = hb_shape[hb_shape.find(os.path.sep) + 1:] + \
-                                      ': Unknown font function implementation `ft\''
-                       if glyphs1[1].startswith(check_string):
-                               skips += 1
-                               print ("Skipping test due to lack of FreeType support")
-                               continue
-
-               glyphs2 = cmd ([hb_shape, "--font-funcs=ot",
-                       fontfile] + extra_options + ["--unicodes",
-                       unicodes] + (options.split (' ') if options else []))
-
-               if glyphs1[0] != glyphs2[0] and glyphs_expected != '*':
-                       print ("FT funcs: " + glyphs1[0], file=sys.stderr)
-                       print ("OT funcs: " + glyphs2[0], file=sys.stderr)
-                       fails += 1
-               else:
-                       passes += 1
-
-               if reference:
-                       print (":".join ([fontfile, options, unicodes, glyphs1[0]]))
-                       continue
-
-               if glyphs1[0].strip() != glyphs_expected and glyphs_expected != '*':
-                       print ("Actual:   " + glyphs1[0], file=sys.stderr)
-                       print ("Expected: " + glyphs_expected, file=sys.stderr)
-                       fails += 1
-               else:
-                       passes += 1
-
-if not reference:
-       print ("%d tests passed; %d failed; %d skipped." % (passes, fails, skips), file=sys.stderr)
-       if not (fails + passes):
-               print ("No tests ran.")
-       elif not (fails + skips):
-               print ("All tests passed.")
-
-if fails:
-       sys.exit (1)
-elif passes:
-       sys.exit (0)
-else:
-       sys.exit (77)
index 47b0039..cfd739b 100644 (file)
@@ -13,7 +13,9 @@ libs:
 EXTRA_DIST += \
        meson.build \
        run-tests.py \
+       run-repack-tests.py \
        subset_test_suite.py \
+       repack_test.py \
        $(NULL)
 
 CLEANFILES += \
index 652e410..b80cef5 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.16.2 from Makefile.am.
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2020 Free Software Foundation, Inc.
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -202,6 +202,8 @@ CAIRO_LIBS = @CAIRO_LIBS@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
+CHAFA_CFLAGS = @CHAFA_CFLAGS@
+CHAFA_LIBS = @CHAFA_LIBS@
 CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
 CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
 CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
@@ -230,8 +232,6 @@ ECHO_T = @ECHO_T@
 EGREP = @EGREP@
 EXEEXT = @EXEEXT@
 FGREP = @FGREP@
-FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@
-FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
 FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
 FREETYPE_DEPS = @FREETYPE_DEPS@
 FREETYPE_LIBS = @FREETYPE_LIBS@
@@ -264,7 +264,6 @@ HB_VERSION_MICRO = @HB_VERSION_MICRO@
 HB_VERSION_MINOR = @HB_VERSION_MINOR@
 HTML_DIR = @HTML_DIR@
 ICU_CFLAGS = @ICU_CFLAGS@
-ICU_CONFIG = @ICU_CONFIG@
 ICU_LIBS = @ICU_LIBS@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
@@ -370,6 +369,7 @@ pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -379,7 +379,8 @@ top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 NULL = 
-EXTRA_DIST = meson.build run-tests.py subset_test_suite.py $(NULL)
+EXTRA_DIST = meson.build run-tests.py run-repack-tests.py \
+       subset_test_suite.py repack_test.py $(NULL)
 CLEANFILES = subset_test_suite.py[co] $(NULL)
 SUBDIRS = data
 all: all-recursive
index beb0a04..337e1cf 100644 (file)
@@ -3,37 +3,66 @@
 NULL =
 EXTRA_DIST =
 CLEANFILES =
-SUBDIRS =
+SUBDIRS = repack_tests
 
 EXTRA_DIST += \
        $(TESTS) \
        expected/basics \
        expected/full-font \
+       expected/glyf_bug_3131 \
        expected/cff-full-font \
        expected/japanese \
        expected/cff-japanese \
+       expected/cff.notoserifmyanmar \
        expected/layout \
        expected/layout.gpos \
        expected/layout.gpos2 \
        expected/layout.gpos3 \
        expected/layout.gpos4 \
+       expected/layout.gpos5 \
        expected/layout.gpos6 \
        expected/layout.gpos8 \
+       expected/layout.gpos8.amiri \
+       expected/layout.gpos9 \
        expected/layout.gsub3 \
+       expected/layout.gsub5 \
+       expected/layout.gsub5_format2 \
        expected/layout.gsub6 \
+       expected/layout.gsub8 \
+       expected/layout.khmer \
        expected/layout.gdef \
+       expected/layout.gdef.glyphset \
        expected/layout.context \
+       expected/layout.context_format2 \
        expected/layout.gdef-varstore \
        expected/layout.gdef-attachlist \
+       expected/layout.notonastaliqurdu \
+       expected/layout.tinos \
+       expected/layout.default_features \
+       expected/layout.duplicate_features \
+       expected/layout.unsorted_featurelist \
+       expected/layout.drop_feature \
        expected/cmap \
        expected/cmap14 \
        expected/sbix \
        expected/colr \
+       expected/colr_glyphs \
+       expected/colrv1 \
+       expected/colr_with_components \
        expected/cbdt \
+       expected/variable \
+       expected/glyph_names \
+       expected/math \
+       expected/math_coverage_offset \
+       expected/post \
        fonts \
        profiles \
        $(NULL)
 
+# TODO: re-able once colrv1 subsetting is stabilized.
+#              expected/colrv1
+#      expected/colrv1.notoemoji
+
 # Convenience targets:
 lib:
        @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
index 7fb7174..898cf12 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.16.2 from Makefile.am.
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2020 Free Software Foundation, Inc.
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -89,10 +89,30 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-TESTS = tests/basics.tests tests/full-font.tests \
-       tests/cff-full-font.tests tests/japanese.tests \
-       tests/cff-japanese.tests tests/cmap.tests tests/cmap14.tests \
-       tests/sbix.tests tests/colr.tests tests/cbdt.tests \
+TESTS = tests/basics.tests tests/cbdt.tests tests/cff-full-font.tests \
+       tests/cff-japanese.tests tests/cff.notoserifmyanmar.tests \
+       tests/cmap.tests tests/cmap14.tests tests/colr.tests \
+       tests/colr_glyphs.tests tests/colrv1.tests \
+       tests/colr_with_components.tests tests/full-font.tests \
+       tests/glyf_bug_3131.tests tests/japanese.tests \
+       tests/layout.context.tests tests/layout.context_format2.tests \
+       tests/layout.gdef-attachlist.tests \
+       tests/layout.gdef-varstore.tests tests/layout.gdef.tests \
+       tests/layout.gdef.glyphset.tests tests/layout.gpos.tests \
+       tests/layout.gpos2.tests tests/layout.gpos3.tests \
+       tests/layout.gpos4.tests tests/layout.gpos5.tests \
+       tests/layout.gpos6.tests tests/layout.gpos8.tests \
+       tests/layout.gpos8.amiri.tests tests/layout.gpos9.tests \
+       tests/layout.gsub3.tests tests/layout.gsub5.tests \
+       tests/layout.gsub5_format2.tests tests/layout.gsub6.tests \
+       tests/layout.gsub8.tests tests/layout.khmer.tests \
+       tests/layout.notonastaliqurdu.tests tests/layout.tests \
+       tests/layout.tinos.tests tests/layout.default_features.tests \
+       tests/layout.duplicate_features.tests \
+       tests/layout.unsorted_featurelist.tests \
+       tests/layout.drop_feature.tests tests/sbix.tests \
+       tests/variable.tests tests/glyph_names.tests tests/math.tests \
+       tests/math_coverage_offset.tests tests/post.tests \
        $(am__EXEEXT_1)
 XFAIL_TESTS = $(am__EXEEXT_1)
 subdir = test/subset/data
@@ -410,6 +430,8 @@ CAIRO_LIBS = @CAIRO_LIBS@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
+CHAFA_CFLAGS = @CHAFA_CFLAGS@
+CHAFA_LIBS = @CHAFA_LIBS@
 CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
 CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
 CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
@@ -438,8 +460,6 @@ ECHO_T = @ECHO_T@
 EGREP = @EGREP@
 EXEEXT = @EXEEXT@
 FGREP = @FGREP@
-FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@
-FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
 FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
 FREETYPE_DEPS = @FREETYPE_DEPS@
 FREETYPE_LIBS = @FREETYPE_LIBS@
@@ -472,7 +492,6 @@ HB_VERSION_MICRO = @HB_VERSION_MICRO@
 HB_VERSION_MINOR = @HB_VERSION_MINOR@
 HTML_DIR = @HTML_DIR@
 ICU_CFLAGS = @ICU_CFLAGS@
-ICU_CONFIG = @ICU_CONFIG@
 ICU_LIBS = @ICU_LIBS@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
@@ -578,6 +597,7 @@ pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -588,17 +608,32 @@ top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 NULL = 
 EXTRA_DIST = $(TESTS) expected/basics expected/full-font \
-       expected/cff-full-font expected/japanese expected/cff-japanese \
-       expected/layout expected/layout.gpos expected/layout.gpos2 \
+       expected/glyf_bug_3131 expected/cff-full-font \
+       expected/japanese expected/cff-japanese \
+       expected/cff.notoserifmyanmar expected/layout \
+       expected/layout.gpos expected/layout.gpos2 \
        expected/layout.gpos3 expected/layout.gpos4 \
-       expected/layout.gpos6 expected/layout.gpos8 \
-       expected/layout.gsub3 expected/layout.gsub6 \
-       expected/layout.gdef expected/layout.context \
-       expected/layout.gdef-varstore expected/layout.gdef-attachlist \
-       expected/cmap expected/cmap14 expected/sbix expected/colr \
-       expected/cbdt fonts profiles $(NULL)
+       expected/layout.gpos5 expected/layout.gpos6 \
+       expected/layout.gpos8 expected/layout.gpos8.amiri \
+       expected/layout.gpos9 expected/layout.gsub3 \
+       expected/layout.gsub5 expected/layout.gsub5_format2 \
+       expected/layout.gsub6 expected/layout.gsub8 \
+       expected/layout.khmer expected/layout.gdef \
+       expected/layout.gdef.glyphset expected/layout.context \
+       expected/layout.context_format2 expected/layout.gdef-varstore \
+       expected/layout.gdef-attachlist \
+       expected/layout.notonastaliqurdu expected/layout.tinos \
+       expected/layout.default_features \
+       expected/layout.duplicate_features \
+       expected/layout.unsorted_featurelist \
+       expected/layout.drop_feature expected/cmap expected/cmap14 \
+       expected/sbix expected/colr expected/colr_glyphs \
+       expected/colrv1 expected/colr_with_components expected/cbdt \
+       expected/variable expected/glyph_names expected/math \
+       expected/math_coverage_offset expected/post fonts profiles \
+       $(NULL)
 CLEANFILES = 
-SUBDIRS = 
+SUBDIRS = repack_tests
 TEST_EXTENSIONS = .tests
 TESTS_LOG_COMPILER = $(srcdir)/../run-tests.py $(top_builddir)/util/hb-subset$(EXEEXT)
 DISABLED_TESTS = \
@@ -1083,6 +1118,10 @@ uninstall-am:
 .PRECIOUS: Makefile
 
 
+# TODO: re-able once colrv1 subsetting is stabilized.
+#              expected/colrv1
+#      expected/colrv1.notoemoji
+
 # Convenience targets:
 lib:
        @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
index a6b8659..94a910c 100644 (file)
@@ -1,32 +1,59 @@
 TESTS = \
        tests/basics.tests \
-       tests/full-font.tests \
+       tests/cbdt.tests \
        tests/cff-full-font.tests \
-       tests/japanese.tests \
        tests/cff-japanese.tests \
+       tests/cff.notoserifmyanmar.tests \
        tests/cmap.tests \
        tests/cmap14.tests \
-       tests/sbix.tests \
        tests/colr.tests \
-       tests/cbdt.tests \
-       $(NULL)
-
-DISABLED_TESTS = \
-       tests/layout.tests \
+       tests/colr_glyphs.tests \
+       tests/colrv1.tests \
+       tests/colr_with_components.tests \
+       tests/full-font.tests \
+       tests/glyf_bug_3131.tests \
+       tests/japanese.tests \
+       tests/layout.context.tests \
+       tests/layout.context_format2.tests \
+       tests/layout.gdef-attachlist.tests \
+       tests/layout.gdef-varstore.tests \
+       tests/layout.gdef.tests \
+       tests/layout.gdef.glyphset.tests \
        tests/layout.gpos.tests \
        tests/layout.gpos2.tests \
        tests/layout.gpos3.tests \
        tests/layout.gpos4.tests \
+       tests/layout.gpos5.tests \
        tests/layout.gpos6.tests \
        tests/layout.gpos8.tests \
+       tests/layout.gpos8.amiri.tests \
+       tests/layout.gpos9.tests \
        tests/layout.gsub3.tests \
+       tests/layout.gsub5.tests \
+       tests/layout.gsub5_format2.tests \
        tests/layout.gsub6.tests \
-       tests/layout.gdef.tests \
-       tests/layout.context.tests \
-       tests/layout.gdef-varstore.tests \
-       tests/layout.gdef-attachlist.tests \
+       tests/layout.gsub8.tests \
+       tests/layout.khmer.tests \
+       tests/layout.notonastaliqurdu.tests \
+       tests/layout.tests \
+       tests/layout.tinos.tests \
+       tests/layout.default_features.tests \
+       tests/layout.duplicate_features.tests \
+       tests/layout.unsorted_featurelist.tests \
+       tests/layout.drop_feature.tests \
+        tests/sbix.tests \
+       tests/variable.tests \
+       tests/glyph_names.tests \
+       tests/math.tests \
+       tests/math_coverage_offset.tests \
+       tests/post.tests \
        $(NULL)
 
+# TODO: re-enable once colrv1 subsetting is stabilized.
+#      tests/colrv1.notoemoji.tests
+#      tests/colrv1.tests
+
+
 XFAIL_TESTS = \
        $(NULL)
 
index 31a4093..61564e1 100644 (file)
Binary files a/test/subset/data/expected/basics/Comfortaa-Regular-new.default.61,62,63.ttf and b/test/subset/data/expected/basics/Comfortaa-Regular-new.default.61,62,63.ttf differ
index 31b8d9a..c5d1ca5 100644 (file)
Binary files a/test/subset/data/expected/basics/Comfortaa-Regular-new.default.61,63.ttf and b/test/subset/data/expected/basics/Comfortaa-Regular-new.default.61,63.ttf differ
index 9411e46..2fa7d5d 100644 (file)
Binary files a/test/subset/data/expected/basics/Comfortaa-Regular-new.default.61.ttf and b/test/subset/data/expected/basics/Comfortaa-Regular-new.default.61.ttf differ
index 8d561d5..210d224 100644 (file)
Binary files a/test/subset/data/expected/basics/Comfortaa-Regular-new.default.62.ttf and b/test/subset/data/expected/basics/Comfortaa-Regular-new.default.62.ttf differ
index 88ab0e1..9f840d0 100644 (file)
Binary files a/test/subset/data/expected/basics/Comfortaa-Regular-new.default.63.ttf and b/test/subset/data/expected/basics/Comfortaa-Regular-new.default.63.ttf differ
index a29c708..749ef45 100644 (file)
Binary files a/test/subset/data/expected/basics/Comfortaa-Regular-new.default.retain-all-codepoint.ttf and b/test/subset/data/expected/basics/Comfortaa-Regular-new.default.retain-all-codepoint.ttf differ
index 7582995..5b5033d 100644 (file)
Binary files a/test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints-retain-gids.61,62,63.ttf and b/test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints-retain-gids.61,62,63.ttf differ
index 1f83796..29b2dc9 100644 (file)
Binary files a/test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints-retain-gids.61,63.ttf and b/test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints-retain-gids.61,63.ttf differ
index 354ee07..ac14d56 100644 (file)
Binary files a/test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints-retain-gids.61.ttf and b/test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints-retain-gids.61.ttf differ
index 68c21bf..eae3a89 100644 (file)
Binary files a/test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints-retain-gids.62.ttf and b/test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints-retain-gids.62.ttf differ
index c2d90fc..63690d0 100644 (file)
Binary files a/test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints-retain-gids.63.ttf and b/test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints-retain-gids.63.ttf differ
index 41a6bee..8a7e828 100644 (file)
Binary files a/test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints-retain-gids.retain-all-codepoint.ttf and b/test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints-retain-gids.retain-all-codepoint.ttf differ
index 345b9c9..f9a7acb 100644 (file)
Binary files a/test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints.61,62,63.ttf and b/test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints.61,62,63.ttf differ
index d6fab9b..3bba719 100644 (file)
Binary files a/test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints.61,63.ttf and b/test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints.61,63.ttf differ
index 84313ca..1759c85 100644 (file)
Binary files a/test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints.61.ttf and b/test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints.61.ttf differ
index c41f61b..7accc1d 100644 (file)
Binary files a/test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints.62.ttf and b/test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints.62.ttf differ
index 01482f0..02fc4c5 100644 (file)
Binary files a/test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints.63.ttf and b/test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints.63.ttf differ
index eaadf25..711c070 100644 (file)
Binary files a/test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints.retain-all-codepoint.ttf and b/test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints.retain-all-codepoint.ttf differ
index f720295..a12408b 100644 (file)
Binary files a/test/subset/data/expected/basics/Comfortaa-Regular-new.gids.61,62,63.ttf and b/test/subset/data/expected/basics/Comfortaa-Regular-new.gids.61,62,63.ttf differ
index e711246..ae965b8 100644 (file)
Binary files a/test/subset/data/expected/basics/Comfortaa-Regular-new.gids.61,63.ttf and b/test/subset/data/expected/basics/Comfortaa-Regular-new.gids.61,63.ttf differ
index 8936629..2bc4119 100644 (file)
Binary files a/test/subset/data/expected/basics/Comfortaa-Regular-new.gids.61.ttf and b/test/subset/data/expected/basics/Comfortaa-Regular-new.gids.61.ttf differ
index a8b6914..045a564 100644 (file)
Binary files a/test/subset/data/expected/basics/Comfortaa-Regular-new.gids.62.ttf and b/test/subset/data/expected/basics/Comfortaa-Regular-new.gids.62.ttf differ
index 4a53bb2..127a085 100644 (file)
Binary files a/test/subset/data/expected/basics/Comfortaa-Regular-new.gids.63.ttf and b/test/subset/data/expected/basics/Comfortaa-Regular-new.gids.63.ttf differ
index a29c708..749ef45 100644 (file)
Binary files a/test/subset/data/expected/basics/Comfortaa-Regular-new.gids.retain-all-codepoint.ttf and b/test/subset/data/expected/basics/Comfortaa-Regular-new.gids.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.glyph-names.61,62,63.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.glyph-names.61,62,63.ttf
new file mode 100644 (file)
index 0000000..50d5176
Binary files /dev/null and b/test/subset/data/expected/basics/Comfortaa-Regular-new.glyph-names.61,62,63.ttf differ
diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.glyph-names.61,63.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.glyph-names.61,63.ttf
new file mode 100644 (file)
index 0000000..8389377
Binary files /dev/null and b/test/subset/data/expected/basics/Comfortaa-Regular-new.glyph-names.61,63.ttf differ
diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.glyph-names.61.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.glyph-names.61.ttf
new file mode 100644 (file)
index 0000000..6de5862
Binary files /dev/null and b/test/subset/data/expected/basics/Comfortaa-Regular-new.glyph-names.61.ttf differ
diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.glyph-names.62.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.glyph-names.62.ttf
new file mode 100644 (file)
index 0000000..86e9c79
Binary files /dev/null and b/test/subset/data/expected/basics/Comfortaa-Regular-new.glyph-names.62.ttf differ
diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.glyph-names.63.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.glyph-names.63.ttf
new file mode 100644 (file)
index 0000000..c50cb5b
Binary files /dev/null and b/test/subset/data/expected/basics/Comfortaa-Regular-new.glyph-names.63.ttf differ
diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.glyph-names.retain-all-codepoint.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.glyph-names.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..56cba1b
Binary files /dev/null and b/test/subset/data/expected/basics/Comfortaa-Regular-new.glyph-names.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.keep-all-layout-features.61,62,63.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.keep-all-layout-features.61,62,63.ttf
new file mode 100644 (file)
index 0000000..f86a38f
Binary files /dev/null and b/test/subset/data/expected/basics/Comfortaa-Regular-new.keep-all-layout-features.61,62,63.ttf differ
diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.keep-all-layout-features.61,63.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.keep-all-layout-features.61,63.ttf
new file mode 100644 (file)
index 0000000..8a8dfab
Binary files /dev/null and b/test/subset/data/expected/basics/Comfortaa-Regular-new.keep-all-layout-features.61,63.ttf differ
diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.keep-all-layout-features.61.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.keep-all-layout-features.61.ttf
new file mode 100644 (file)
index 0000000..c2ac34c
Binary files /dev/null and b/test/subset/data/expected/basics/Comfortaa-Regular-new.keep-all-layout-features.61.ttf differ
diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.keep-all-layout-features.62.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.keep-all-layout-features.62.ttf
new file mode 100644 (file)
index 0000000..210d224
Binary files /dev/null and b/test/subset/data/expected/basics/Comfortaa-Regular-new.keep-all-layout-features.62.ttf differ
diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.keep-all-layout-features.63.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.keep-all-layout-features.63.ttf
new file mode 100644 (file)
index 0000000..9f840d0
Binary files /dev/null and b/test/subset/data/expected/basics/Comfortaa-Regular-new.keep-all-layout-features.63.ttf differ
diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.keep-all-layout-features.retain-all-codepoint.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.keep-all-layout-features.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..e2fe5f9
Binary files /dev/null and b/test/subset/data/expected/basics/Comfortaa-Regular-new.keep-all-layout-features.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.layout-features.61,62,63.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.layout-features.61,62,63.ttf
new file mode 100644 (file)
index 0000000..61564e1
Binary files /dev/null and b/test/subset/data/expected/basics/Comfortaa-Regular-new.layout-features.61,62,63.ttf differ
diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.layout-features.61,63.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.layout-features.61,63.ttf
new file mode 100644 (file)
index 0000000..c5d1ca5
Binary files /dev/null and b/test/subset/data/expected/basics/Comfortaa-Regular-new.layout-features.61,63.ttf differ
diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.layout-features.61.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.layout-features.61.ttf
new file mode 100644 (file)
index 0000000..2fa7d5d
Binary files /dev/null and b/test/subset/data/expected/basics/Comfortaa-Regular-new.layout-features.61.ttf differ
diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.layout-features.62.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.layout-features.62.ttf
new file mode 100644 (file)
index 0000000..210d224
Binary files /dev/null and b/test/subset/data/expected/basics/Comfortaa-Regular-new.layout-features.62.ttf differ
diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.layout-features.63.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.layout-features.63.ttf
new file mode 100644 (file)
index 0000000..9f840d0
Binary files /dev/null and b/test/subset/data/expected/basics/Comfortaa-Regular-new.layout-features.63.ttf differ
diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.layout-features.retain-all-codepoint.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.layout-features.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..509ba2a
Binary files /dev/null and b/test/subset/data/expected/basics/Comfortaa-Regular-new.layout-features.retain-all-codepoint.ttf differ
index 748b6d9..edc2749 100644 (file)
Binary files a/test/subset/data/expected/basics/Comfortaa-Regular-new.name-ids.61,62,63.ttf and b/test/subset/data/expected/basics/Comfortaa-Regular-new.name-ids.61,62,63.ttf differ
index c639e4d..7f21708 100644 (file)
Binary files a/test/subset/data/expected/basics/Comfortaa-Regular-new.name-ids.61,63.ttf and b/test/subset/data/expected/basics/Comfortaa-Regular-new.name-ids.61,63.ttf differ
index 2cf7df7..b5167c9 100644 (file)
Binary files a/test/subset/data/expected/basics/Comfortaa-Regular-new.name-ids.61.ttf and b/test/subset/data/expected/basics/Comfortaa-Regular-new.name-ids.61.ttf differ
index 4890c3b..4240265 100644 (file)
Binary files a/test/subset/data/expected/basics/Comfortaa-Regular-new.name-ids.62.ttf and b/test/subset/data/expected/basics/Comfortaa-Regular-new.name-ids.62.ttf differ
index 13fc238..f7ae43d 100644 (file)
Binary files a/test/subset/data/expected/basics/Comfortaa-Regular-new.name-ids.63.ttf and b/test/subset/data/expected/basics/Comfortaa-Regular-new.name-ids.63.ttf differ
index 4128989..660c052 100644 (file)
Binary files a/test/subset/data/expected/basics/Comfortaa-Regular-new.name-ids.retain-all-codepoint.ttf and b/test/subset/data/expected/basics/Comfortaa-Regular-new.name-ids.retain-all-codepoint.ttf differ
index 31a4093..61564e1 100644 (file)
Binary files a/test/subset/data/expected/basics/Comfortaa-Regular-new.name-languages.61,62,63.ttf and b/test/subset/data/expected/basics/Comfortaa-Regular-new.name-languages.61,62,63.ttf differ
index 31b8d9a..c5d1ca5 100644 (file)
Binary files a/test/subset/data/expected/basics/Comfortaa-Regular-new.name-languages.61,63.ttf and b/test/subset/data/expected/basics/Comfortaa-Regular-new.name-languages.61,63.ttf differ
index 9411e46..2fa7d5d 100644 (file)
Binary files a/test/subset/data/expected/basics/Comfortaa-Regular-new.name-languages.61.ttf and b/test/subset/data/expected/basics/Comfortaa-Regular-new.name-languages.61.ttf differ
index 8d561d5..210d224 100644 (file)
Binary files a/test/subset/data/expected/basics/Comfortaa-Regular-new.name-languages.62.ttf and b/test/subset/data/expected/basics/Comfortaa-Regular-new.name-languages.62.ttf differ
index 88ab0e1..9f840d0 100644 (file)
Binary files a/test/subset/data/expected/basics/Comfortaa-Regular-new.name-languages.63.ttf and b/test/subset/data/expected/basics/Comfortaa-Regular-new.name-languages.63.ttf differ
index a29c708..749ef45 100644 (file)
Binary files a/test/subset/data/expected/basics/Comfortaa-Regular-new.name-languages.retain-all-codepoint.ttf and b/test/subset/data/expected/basics/Comfortaa-Regular-new.name-languages.retain-all-codepoint.ttf differ
index 31a4093..61564e1 100644 (file)
Binary files a/test/subset/data/expected/basics/Comfortaa-Regular-new.name-legacy.61,62,63.ttf and b/test/subset/data/expected/basics/Comfortaa-Regular-new.name-legacy.61,62,63.ttf differ
index 31b8d9a..c5d1ca5 100644 (file)
Binary files a/test/subset/data/expected/basics/Comfortaa-Regular-new.name-legacy.61,63.ttf and b/test/subset/data/expected/basics/Comfortaa-Regular-new.name-legacy.61,63.ttf differ
index 9411e46..2fa7d5d 100644 (file)
Binary files a/test/subset/data/expected/basics/Comfortaa-Regular-new.name-legacy.61.ttf and b/test/subset/data/expected/basics/Comfortaa-Regular-new.name-legacy.61.ttf differ
index 8d561d5..210d224 100644 (file)
Binary files a/test/subset/data/expected/basics/Comfortaa-Regular-new.name-legacy.62.ttf and b/test/subset/data/expected/basics/Comfortaa-Regular-new.name-legacy.62.ttf differ
index 88ab0e1..9f840d0 100644 (file)
Binary files a/test/subset/data/expected/basics/Comfortaa-Regular-new.name-legacy.63.ttf and b/test/subset/data/expected/basics/Comfortaa-Regular-new.name-legacy.63.ttf differ
index a29c708..749ef45 100644 (file)
Binary files a/test/subset/data/expected/basics/Comfortaa-Regular-new.name-legacy.retain-all-codepoint.ttf and b/test/subset/data/expected/basics/Comfortaa-Regular-new.name-legacy.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.no-prune-unicode-ranges.61,62,63.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.no-prune-unicode-ranges.61,62,63.ttf
new file mode 100644 (file)
index 0000000..47315bd
Binary files /dev/null and b/test/subset/data/expected/basics/Comfortaa-Regular-new.no-prune-unicode-ranges.61,62,63.ttf differ
diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.no-prune-unicode-ranges.61,63.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.no-prune-unicode-ranges.61,63.ttf
new file mode 100644 (file)
index 0000000..807f21d
Binary files /dev/null and b/test/subset/data/expected/basics/Comfortaa-Regular-new.no-prune-unicode-ranges.61,63.ttf differ
diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.no-prune-unicode-ranges.61.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.no-prune-unicode-ranges.61.ttf
new file mode 100644 (file)
index 0000000..8de6489
Binary files /dev/null and b/test/subset/data/expected/basics/Comfortaa-Regular-new.no-prune-unicode-ranges.61.ttf differ
diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.no-prune-unicode-ranges.62.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.no-prune-unicode-ranges.62.ttf
new file mode 100644 (file)
index 0000000..09396e2
Binary files /dev/null and b/test/subset/data/expected/basics/Comfortaa-Regular-new.no-prune-unicode-ranges.62.ttf differ
diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.no-prune-unicode-ranges.63.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.no-prune-unicode-ranges.63.ttf
new file mode 100644 (file)
index 0000000..1a62c02
Binary files /dev/null and b/test/subset/data/expected/basics/Comfortaa-Regular-new.no-prune-unicode-ranges.63.ttf differ
diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.no-prune-unicode-ranges.retain-all-codepoint.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.no-prune-unicode-ranges.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..749ef45
Binary files /dev/null and b/test/subset/data/expected/basics/Comfortaa-Regular-new.no-prune-unicode-ranges.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.notdef-outline.61,62,63.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.notdef-outline.61,62,63.ttf
new file mode 100644 (file)
index 0000000..876398a
Binary files /dev/null and b/test/subset/data/expected/basics/Comfortaa-Regular-new.notdef-outline.61,62,63.ttf differ
diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.notdef-outline.61,63.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.notdef-outline.61,63.ttf
new file mode 100644 (file)
index 0000000..c1ffb6f
Binary files /dev/null and b/test/subset/data/expected/basics/Comfortaa-Regular-new.notdef-outline.61,63.ttf differ
diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.notdef-outline.61.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.notdef-outline.61.ttf
new file mode 100644 (file)
index 0000000..daba7e3
Binary files /dev/null and b/test/subset/data/expected/basics/Comfortaa-Regular-new.notdef-outline.61.ttf differ
diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.notdef-outline.62.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.notdef-outline.62.ttf
new file mode 100644 (file)
index 0000000..30087b5
Binary files /dev/null and b/test/subset/data/expected/basics/Comfortaa-Regular-new.notdef-outline.62.ttf differ
diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.notdef-outline.63.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.notdef-outline.63.ttf
new file mode 100644 (file)
index 0000000..1a084d5
Binary files /dev/null and b/test/subset/data/expected/basics/Comfortaa-Regular-new.notdef-outline.63.ttf differ
diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.notdef-outline.retain-all-codepoint.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.notdef-outline.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..e33f66c
Binary files /dev/null and b/test/subset/data/expected/basics/Comfortaa-Regular-new.notdef-outline.retain-all-codepoint.ttf differ
index fbe8501..727239c 100644 (file)
Binary files a/test/subset/data/expected/basics/Comfortaa-Regular-new.retain-gids.61,62,63.ttf and b/test/subset/data/expected/basics/Comfortaa-Regular-new.retain-gids.61,62,63.ttf differ
index be4e5b4..02d67aa 100644 (file)
Binary files a/test/subset/data/expected/basics/Comfortaa-Regular-new.retain-gids.61,63.ttf and b/test/subset/data/expected/basics/Comfortaa-Regular-new.retain-gids.61,63.ttf differ
index 89f37bf..4eda654 100644 (file)
Binary files a/test/subset/data/expected/basics/Comfortaa-Regular-new.retain-gids.61.ttf and b/test/subset/data/expected/basics/Comfortaa-Regular-new.retain-gids.61.ttf differ
index e299483..cd321b7 100644 (file)
Binary files a/test/subset/data/expected/basics/Comfortaa-Regular-new.retain-gids.62.ttf and b/test/subset/data/expected/basics/Comfortaa-Regular-new.retain-gids.62.ttf differ
index 5787e50..7b88b55 100644 (file)
Binary files a/test/subset/data/expected/basics/Comfortaa-Regular-new.retain-gids.63.ttf and b/test/subset/data/expected/basics/Comfortaa-Regular-new.retain-gids.63.ttf differ
index 75f4803..93aa982 100644 (file)
Binary files a/test/subset/data/expected/basics/Comfortaa-Regular-new.retain-gids.retain-all-codepoint.ttf and b/test/subset/data/expected/basics/Comfortaa-Regular-new.retain-gids.retain-all-codepoint.ttf differ
index dbed582..5f0d98c 100644 (file)
Binary files a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.default.61,62,63.ttf and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.default.61,62,63.ttf differ
index 5913420..d2a94dd 100644 (file)
Binary files a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.default.61,63.ttf and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.default.61,63.ttf differ
index 3635f68..e5f08c7 100644 (file)
Binary files a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.default.61.ttf and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.default.61.ttf differ
index 91fcad8..6637064 100644 (file)
Binary files a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.default.62.ttf and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.default.62.ttf differ
index 737cbdc..8efd69b 100644 (file)
Binary files a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.default.63.ttf and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.default.63.ttf differ
index 9744bc3..f17e9fb 100644 (file)
Binary files a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.default.retain-all-codepoint.ttf and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.default.retain-all-codepoint.ttf differ
index bf8264b..f07052a 100644 (file)
Binary files a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints-retain-gids.61,62,63.ttf and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints-retain-gids.61,62,63.ttf differ
index c64172a..3d67628 100644 (file)
Binary files a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints-retain-gids.61,63.ttf and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints-retain-gids.61,63.ttf differ
index 9b26144..15dfc01 100644 (file)
Binary files a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints-retain-gids.61.ttf and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints-retain-gids.61.ttf differ
index d737cd7..f5d668e 100644 (file)
Binary files a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints-retain-gids.62.ttf and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints-retain-gids.62.ttf differ
index 5e4d494..1298f53 100644 (file)
Binary files a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints-retain-gids.63.ttf and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints-retain-gids.63.ttf differ
index 892ccb8..b3d2945 100644 (file)
Binary files a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints-retain-gids.retain-all-codepoint.ttf and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints-retain-gids.retain-all-codepoint.ttf differ
index bf8264b..f07052a 100644 (file)
Binary files a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints.61,62,63.ttf and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints.61,62,63.ttf differ
index bc54940..0bfa6ca 100644 (file)
Binary files a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints.61,63.ttf and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints.61,63.ttf differ
index 9b26144..15dfc01 100644 (file)
Binary files a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints.61.ttf and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints.61.ttf differ
index 32cf9f7..7358857 100644 (file)
Binary files a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints.62.ttf and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints.62.ttf differ
index 776e758..245b20f 100644 (file)
Binary files a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints.63.ttf and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints.63.ttf differ
index 892ccb8..b3d2945 100644 (file)
Binary files a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints.retain-all-codepoint.ttf and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints.retain-all-codepoint.ttf differ
index dbed582..5f0d98c 100644 (file)
Binary files a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.gids.61,62,63.ttf and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.gids.61,62,63.ttf differ
index dbed582..5f0d98c 100644 (file)
Binary files a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.gids.61,63.ttf and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.gids.61,63.ttf differ
index dbed582..5f0d98c 100644 (file)
Binary files a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.gids.61.ttf and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.gids.61.ttf differ
index dbed582..5f0d98c 100644 (file)
Binary files a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.gids.62.ttf and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.gids.62.ttf differ
index dbed582..5f0d98c 100644 (file)
Binary files a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.gids.63.ttf and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.gids.63.ttf differ
index 9744bc3..f17e9fb 100644 (file)
Binary files a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.gids.retain-all-codepoint.ttf and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.gids.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.glyph-names.61,62,63.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.glyph-names.61,62,63.ttf
new file mode 100644 (file)
index 0000000..5f0d98c
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.glyph-names.61,62,63.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.glyph-names.61,63.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.glyph-names.61,63.ttf
new file mode 100644 (file)
index 0000000..d2a94dd
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.glyph-names.61,63.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.glyph-names.61.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.glyph-names.61.ttf
new file mode 100644 (file)
index 0000000..e5f08c7
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.glyph-names.61.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.glyph-names.62.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.glyph-names.62.ttf
new file mode 100644 (file)
index 0000000..6637064
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.glyph-names.62.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.glyph-names.63.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.glyph-names.63.ttf
new file mode 100644 (file)
index 0000000..8efd69b
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.glyph-names.63.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.glyph-names.retain-all-codepoint.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.glyph-names.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..f17e9fb
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.glyph-names.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.keep-all-layout-features.61,62,63.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.keep-all-layout-features.61,62,63.ttf
new file mode 100644 (file)
index 0000000..5f0d98c
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.keep-all-layout-features.61,62,63.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.keep-all-layout-features.61,63.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.keep-all-layout-features.61,63.ttf
new file mode 100644 (file)
index 0000000..d2a94dd
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.keep-all-layout-features.61,63.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.keep-all-layout-features.61.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.keep-all-layout-features.61.ttf
new file mode 100644 (file)
index 0000000..e5f08c7
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.keep-all-layout-features.61.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.keep-all-layout-features.62.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.keep-all-layout-features.62.ttf
new file mode 100644 (file)
index 0000000..6637064
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.keep-all-layout-features.62.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.keep-all-layout-features.63.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.keep-all-layout-features.63.ttf
new file mode 100644 (file)
index 0000000..8efd69b
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.keep-all-layout-features.63.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.keep-all-layout-features.retain-all-codepoint.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.keep-all-layout-features.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..f17e9fb
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.keep-all-layout-features.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.layout-features.61,62,63.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.layout-features.61,62,63.ttf
new file mode 100644 (file)
index 0000000..5f0d98c
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.layout-features.61,62,63.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.layout-features.61,63.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.layout-features.61,63.ttf
new file mode 100644 (file)
index 0000000..d2a94dd
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.layout-features.61,63.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.layout-features.61.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.layout-features.61.ttf
new file mode 100644 (file)
index 0000000..e5f08c7
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.layout-features.61.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.layout-features.62.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.layout-features.62.ttf
new file mode 100644 (file)
index 0000000..6637064
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.layout-features.62.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.layout-features.63.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.layout-features.63.ttf
new file mode 100644 (file)
index 0000000..8efd69b
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.layout-features.63.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.layout-features.retain-all-codepoint.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.layout-features.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..f17e9fb
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.layout-features.retain-all-codepoint.ttf differ
index a7af973..a9ab96e 100644 (file)
Binary files a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-ids.61,62,63.ttf and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-ids.61,62,63.ttf differ
index ac780db..a7b8d17 100644 (file)
Binary files a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-ids.61,63.ttf and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-ids.61,63.ttf differ
index c4321d1..69c51c3 100644 (file)
Binary files a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-ids.61.ttf and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-ids.61.ttf differ
index 4c553ca..b3dce53 100644 (file)
Binary files a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-ids.62.ttf and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-ids.62.ttf differ
index 5234b74..afc5a93 100644 (file)
Binary files a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-ids.63.ttf and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-ids.63.ttf differ
index 9d22541..262804c 100644 (file)
Binary files a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-ids.retain-all-codepoint.ttf and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-ids.retain-all-codepoint.ttf differ
index 9bb2a9d..414c962 100644 (file)
Binary files a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-languages.61,62,63.ttf and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-languages.61,62,63.ttf differ
index 7373aa3..6759ce3 100644 (file)
Binary files a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-languages.61,63.ttf and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-languages.61,63.ttf differ
index 26fe19e..d185267 100644 (file)
Binary files a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-languages.61.ttf and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-languages.61.ttf differ
index 02cd270..a7a9c05 100644 (file)
Binary files a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-languages.62.ttf and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-languages.62.ttf differ
index 64a892e..30aa18c 100644 (file)
Binary files a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-languages.63.ttf and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-languages.63.ttf differ
index d5d4238..23feb15 100644 (file)
Binary files a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-languages.retain-all-codepoint.ttf and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-languages.retain-all-codepoint.ttf differ
index dbed582..5f0d98c 100644 (file)
Binary files a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-legacy.61,62,63.ttf and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-legacy.61,62,63.ttf differ
index 5913420..d2a94dd 100644 (file)
Binary files a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-legacy.61,63.ttf and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-legacy.61,63.ttf differ
index 3635f68..e5f08c7 100644 (file)
Binary files a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-legacy.61.ttf and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-legacy.61.ttf differ
index 91fcad8..6637064 100644 (file)
Binary files a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-legacy.62.ttf and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-legacy.62.ttf differ
index 737cbdc..8efd69b 100644 (file)
Binary files a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-legacy.63.ttf and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-legacy.63.ttf differ
index 9744bc3..f17e9fb 100644 (file)
Binary files a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-legacy.retain-all-codepoint.ttf and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-legacy.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.no-prune-unicode-ranges.61,62,63.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.no-prune-unicode-ranges.61,62,63.ttf
new file mode 100644 (file)
index 0000000..9854d47
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.no-prune-unicode-ranges.61,62,63.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.no-prune-unicode-ranges.61,63.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.no-prune-unicode-ranges.61,63.ttf
new file mode 100644 (file)
index 0000000..c33b4cb
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.no-prune-unicode-ranges.61,63.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.no-prune-unicode-ranges.61.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.no-prune-unicode-ranges.61.ttf
new file mode 100644 (file)
index 0000000..fefbfaf
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.no-prune-unicode-ranges.61.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.no-prune-unicode-ranges.62.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.no-prune-unicode-ranges.62.ttf
new file mode 100644 (file)
index 0000000..a951a4c
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.no-prune-unicode-ranges.62.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.no-prune-unicode-ranges.63.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.no-prune-unicode-ranges.63.ttf
new file mode 100644 (file)
index 0000000..349899d
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.no-prune-unicode-ranges.63.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.no-prune-unicode-ranges.retain-all-codepoint.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.no-prune-unicode-ranges.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..f17e9fb
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.no-prune-unicode-ranges.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.notdef-outline.61,62,63.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.notdef-outline.61,62,63.ttf
new file mode 100644 (file)
index 0000000..5f0d98c
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.notdef-outline.61,62,63.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.notdef-outline.61,63.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.notdef-outline.61,63.ttf
new file mode 100644 (file)
index 0000000..d2a94dd
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.notdef-outline.61,63.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.notdef-outline.61.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.notdef-outline.61.ttf
new file mode 100644 (file)
index 0000000..e5f08c7
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.notdef-outline.61.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.notdef-outline.62.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.notdef-outline.62.ttf
new file mode 100644 (file)
index 0000000..6637064
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.notdef-outline.62.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.notdef-outline.63.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.notdef-outline.63.ttf
new file mode 100644 (file)
index 0000000..8efd69b
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.notdef-outline.63.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.notdef-outline.retain-all-codepoint.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.notdef-outline.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..f17e9fb
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.notdef-outline.retain-all-codepoint.ttf differ
index dbed582..5f0d98c 100644 (file)
Binary files a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.retain-gids.61,62,63.ttf and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.retain-gids.61,62,63.ttf differ
index 47e72c6..e8b3955 100644 (file)
Binary files a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.retain-gids.61,63.ttf and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.retain-gids.61,63.ttf differ
index 3635f68..e5f08c7 100644 (file)
Binary files a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.retain-gids.61.ttf and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.retain-gids.61.ttf differ
index 57f7ec7..c329cea 100644 (file)
Binary files a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.retain-gids.62.ttf and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.retain-gids.62.ttf differ
index d0426a0..6e399ee 100644 (file)
Binary files a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.retain-gids.63.ttf and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.retain-gids.63.ttf differ
index 9744bc3..f17e9fb 100644 (file)
Binary files a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.retain-gids.retain-all-codepoint.ttf and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.retain-gids.retain-all-codepoint.ttf differ
index 12d9208..8b2c634 100644 (file)
Binary files a/test/subset/data/expected/basics/Roboto-Regular.abc.default.61,62,63.ttf and b/test/subset/data/expected/basics/Roboto-Regular.abc.default.61,62,63.ttf differ
index 1af233f..1f017da 100644 (file)
Binary files a/test/subset/data/expected/basics/Roboto-Regular.abc.default.61,63.ttf and b/test/subset/data/expected/basics/Roboto-Regular.abc.default.61,63.ttf differ
index a699eea..d35619a 100644 (file)
Binary files a/test/subset/data/expected/basics/Roboto-Regular.abc.default.61.ttf and b/test/subset/data/expected/basics/Roboto-Regular.abc.default.61.ttf differ
index 52706dc..5d73ef6 100644 (file)
Binary files a/test/subset/data/expected/basics/Roboto-Regular.abc.default.62.ttf and b/test/subset/data/expected/basics/Roboto-Regular.abc.default.62.ttf differ
index 3de7c77..b384aed 100644 (file)
Binary files a/test/subset/data/expected/basics/Roboto-Regular.abc.default.63.ttf and b/test/subset/data/expected/basics/Roboto-Regular.abc.default.63.ttf differ
index 12d9208..8b2c634 100644 (file)
Binary files a/test/subset/data/expected/basics/Roboto-Regular.abc.default.retain-all-codepoint.ttf and b/test/subset/data/expected/basics/Roboto-Regular.abc.default.retain-all-codepoint.ttf differ
index 52dc474..508510c 100644 (file)
Binary files a/test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints-retain-gids.61,62,63.ttf and b/test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints-retain-gids.61,62,63.ttf differ
index d6c516e..b59987e 100644 (file)
Binary files a/test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints-retain-gids.61,63.ttf and b/test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints-retain-gids.61,63.ttf differ
index 128eae0..36dd105 100644 (file)
Binary files a/test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints-retain-gids.61.ttf and b/test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints-retain-gids.61.ttf differ
index 2d2b65b..8d9ffa4 100644 (file)
Binary files a/test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints-retain-gids.62.ttf and b/test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints-retain-gids.62.ttf differ
index ac735b3..3bc6e78 100644 (file)
Binary files a/test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints-retain-gids.63.ttf and b/test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints-retain-gids.63.ttf differ
index 52dc474..508510c 100644 (file)
Binary files a/test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints-retain-gids.retain-all-codepoint.ttf and b/test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints-retain-gids.retain-all-codepoint.ttf differ
index 52dc474..508510c 100644 (file)
Binary files a/test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints.61,62,63.ttf and b/test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints.61,62,63.ttf differ
index 1873672..ac634f8 100644 (file)
Binary files a/test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints.61,63.ttf and b/test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints.61,63.ttf differ
index 128eae0..36dd105 100644 (file)
Binary files a/test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints.61.ttf and b/test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints.61.ttf differ
index 122b109..8d0d8dd 100644 (file)
Binary files a/test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints.62.ttf and b/test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints.62.ttf differ
index 381e97e..54cd503 100644 (file)
Binary files a/test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints.63.ttf and b/test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints.63.ttf differ
index 52dc474..508510c 100644 (file)
Binary files a/test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints.retain-all-codepoint.ttf and b/test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints.retain-all-codepoint.ttf differ
index 12d9208..8b2c634 100644 (file)
Binary files a/test/subset/data/expected/basics/Roboto-Regular.abc.gids.61,62,63.ttf and b/test/subset/data/expected/basics/Roboto-Regular.abc.gids.61,62,63.ttf differ
index 12d9208..8b2c634 100644 (file)
Binary files a/test/subset/data/expected/basics/Roboto-Regular.abc.gids.61,63.ttf and b/test/subset/data/expected/basics/Roboto-Regular.abc.gids.61,63.ttf differ
index 12d9208..8b2c634 100644 (file)
Binary files a/test/subset/data/expected/basics/Roboto-Regular.abc.gids.61.ttf and b/test/subset/data/expected/basics/Roboto-Regular.abc.gids.61.ttf differ
index 12d9208..8b2c634 100644 (file)
Binary files a/test/subset/data/expected/basics/Roboto-Regular.abc.gids.62.ttf and b/test/subset/data/expected/basics/Roboto-Regular.abc.gids.62.ttf differ
index 12d9208..8b2c634 100644 (file)
Binary files a/test/subset/data/expected/basics/Roboto-Regular.abc.gids.63.ttf and b/test/subset/data/expected/basics/Roboto-Regular.abc.gids.63.ttf differ
index 12d9208..8b2c634 100644 (file)
Binary files a/test/subset/data/expected/basics/Roboto-Regular.abc.gids.retain-all-codepoint.ttf and b/test/subset/data/expected/basics/Roboto-Regular.abc.gids.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.glyph-names.61,62,63.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.glyph-names.61,62,63.ttf
new file mode 100644 (file)
index 0000000..8b2c634
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.glyph-names.61,62,63.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.glyph-names.61,63.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.glyph-names.61,63.ttf
new file mode 100644 (file)
index 0000000..1f017da
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.glyph-names.61,63.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.glyph-names.61.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.glyph-names.61.ttf
new file mode 100644 (file)
index 0000000..d35619a
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.glyph-names.61.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.glyph-names.62.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.glyph-names.62.ttf
new file mode 100644 (file)
index 0000000..5d73ef6
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.glyph-names.62.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.glyph-names.63.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.glyph-names.63.ttf
new file mode 100644 (file)
index 0000000..b384aed
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.glyph-names.63.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.glyph-names.retain-all-codepoint.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.glyph-names.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..8b2c634
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.glyph-names.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.keep-all-layout-features.61,62,63.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.keep-all-layout-features.61,62,63.ttf
new file mode 100644 (file)
index 0000000..8b2c634
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.keep-all-layout-features.61,62,63.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.keep-all-layout-features.61,63.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.keep-all-layout-features.61,63.ttf
new file mode 100644 (file)
index 0000000..1f017da
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.keep-all-layout-features.61,63.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.keep-all-layout-features.61.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.keep-all-layout-features.61.ttf
new file mode 100644 (file)
index 0000000..d35619a
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.keep-all-layout-features.61.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.keep-all-layout-features.62.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.keep-all-layout-features.62.ttf
new file mode 100644 (file)
index 0000000..5d73ef6
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.keep-all-layout-features.62.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.keep-all-layout-features.63.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.keep-all-layout-features.63.ttf
new file mode 100644 (file)
index 0000000..b384aed
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.keep-all-layout-features.63.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.keep-all-layout-features.retain-all-codepoint.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.keep-all-layout-features.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..8b2c634
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.keep-all-layout-features.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.layout-features.61,62,63.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.layout-features.61,62,63.ttf
new file mode 100644 (file)
index 0000000..8b2c634
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.layout-features.61,62,63.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.layout-features.61,63.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.layout-features.61,63.ttf
new file mode 100644 (file)
index 0000000..1f017da
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.layout-features.61,63.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.layout-features.61.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.layout-features.61.ttf
new file mode 100644 (file)
index 0000000..d35619a
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.layout-features.61.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.layout-features.62.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.layout-features.62.ttf
new file mode 100644 (file)
index 0000000..5d73ef6
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.layout-features.62.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.layout-features.63.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.layout-features.63.ttf
new file mode 100644 (file)
index 0000000..b384aed
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.layout-features.63.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.layout-features.retain-all-codepoint.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.layout-features.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..8b2c634
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.layout-features.retain-all-codepoint.ttf differ
index 12d9208..8b2c634 100644 (file)
Binary files a/test/subset/data/expected/basics/Roboto-Regular.abc.name-ids.61,62,63.ttf and b/test/subset/data/expected/basics/Roboto-Regular.abc.name-ids.61,62,63.ttf differ
index 1af233f..1f017da 100644 (file)
Binary files a/test/subset/data/expected/basics/Roboto-Regular.abc.name-ids.61,63.ttf and b/test/subset/data/expected/basics/Roboto-Regular.abc.name-ids.61,63.ttf differ
index a699eea..d35619a 100644 (file)
Binary files a/test/subset/data/expected/basics/Roboto-Regular.abc.name-ids.61.ttf and b/test/subset/data/expected/basics/Roboto-Regular.abc.name-ids.61.ttf differ
index 52706dc..5d73ef6 100644 (file)
Binary files a/test/subset/data/expected/basics/Roboto-Regular.abc.name-ids.62.ttf and b/test/subset/data/expected/basics/Roboto-Regular.abc.name-ids.62.ttf differ
index 3de7c77..b384aed 100644 (file)
Binary files a/test/subset/data/expected/basics/Roboto-Regular.abc.name-ids.63.ttf and b/test/subset/data/expected/basics/Roboto-Regular.abc.name-ids.63.ttf differ
index 12d9208..8b2c634 100644 (file)
Binary files a/test/subset/data/expected/basics/Roboto-Regular.abc.name-ids.retain-all-codepoint.ttf and b/test/subset/data/expected/basics/Roboto-Regular.abc.name-ids.retain-all-codepoint.ttf differ
index 12d9208..8b2c634 100644 (file)
Binary files a/test/subset/data/expected/basics/Roboto-Regular.abc.name-languages.61,62,63.ttf and b/test/subset/data/expected/basics/Roboto-Regular.abc.name-languages.61,62,63.ttf differ
index 1af233f..1f017da 100644 (file)
Binary files a/test/subset/data/expected/basics/Roboto-Regular.abc.name-languages.61,63.ttf and b/test/subset/data/expected/basics/Roboto-Regular.abc.name-languages.61,63.ttf differ
index a699eea..d35619a 100644 (file)
Binary files a/test/subset/data/expected/basics/Roboto-Regular.abc.name-languages.61.ttf and b/test/subset/data/expected/basics/Roboto-Regular.abc.name-languages.61.ttf differ
index 52706dc..5d73ef6 100644 (file)
Binary files a/test/subset/data/expected/basics/Roboto-Regular.abc.name-languages.62.ttf and b/test/subset/data/expected/basics/Roboto-Regular.abc.name-languages.62.ttf differ
index 3de7c77..b384aed 100644 (file)
Binary files a/test/subset/data/expected/basics/Roboto-Regular.abc.name-languages.63.ttf and b/test/subset/data/expected/basics/Roboto-Regular.abc.name-languages.63.ttf differ
index 12d9208..8b2c634 100644 (file)
Binary files a/test/subset/data/expected/basics/Roboto-Regular.abc.name-languages.retain-all-codepoint.ttf and b/test/subset/data/expected/basics/Roboto-Regular.abc.name-languages.retain-all-codepoint.ttf differ
index 12d9208..8b2c634 100644 (file)
Binary files a/test/subset/data/expected/basics/Roboto-Regular.abc.name-legacy.61,62,63.ttf and b/test/subset/data/expected/basics/Roboto-Regular.abc.name-legacy.61,62,63.ttf differ
index 1af233f..1f017da 100644 (file)
Binary files a/test/subset/data/expected/basics/Roboto-Regular.abc.name-legacy.61,63.ttf and b/test/subset/data/expected/basics/Roboto-Regular.abc.name-legacy.61,63.ttf differ
index a699eea..d35619a 100644 (file)
Binary files a/test/subset/data/expected/basics/Roboto-Regular.abc.name-legacy.61.ttf and b/test/subset/data/expected/basics/Roboto-Regular.abc.name-legacy.61.ttf differ
index 52706dc..5d73ef6 100644 (file)
Binary files a/test/subset/data/expected/basics/Roboto-Regular.abc.name-legacy.62.ttf and b/test/subset/data/expected/basics/Roboto-Regular.abc.name-legacy.62.ttf differ
index 3de7c77..b384aed 100644 (file)
Binary files a/test/subset/data/expected/basics/Roboto-Regular.abc.name-legacy.63.ttf and b/test/subset/data/expected/basics/Roboto-Regular.abc.name-legacy.63.ttf differ
index 12d9208..8b2c634 100644 (file)
Binary files a/test/subset/data/expected/basics/Roboto-Regular.abc.name-legacy.retain-all-codepoint.ttf and b/test/subset/data/expected/basics/Roboto-Regular.abc.name-legacy.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.no-prune-unicode-ranges.61,62,63.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.no-prune-unicode-ranges.61,62,63.ttf
new file mode 100644 (file)
index 0000000..8b2c634
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.no-prune-unicode-ranges.61,62,63.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.no-prune-unicode-ranges.61,63.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.no-prune-unicode-ranges.61,63.ttf
new file mode 100644 (file)
index 0000000..1f017da
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.no-prune-unicode-ranges.61,63.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.no-prune-unicode-ranges.61.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.no-prune-unicode-ranges.61.ttf
new file mode 100644 (file)
index 0000000..617e9fd
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.no-prune-unicode-ranges.61.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.no-prune-unicode-ranges.62.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.no-prune-unicode-ranges.62.ttf
new file mode 100644 (file)
index 0000000..91d71fd
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.no-prune-unicode-ranges.62.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.no-prune-unicode-ranges.63.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.no-prune-unicode-ranges.63.ttf
new file mode 100644 (file)
index 0000000..c66b0b2
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.no-prune-unicode-ranges.63.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.no-prune-unicode-ranges.retain-all-codepoint.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.no-prune-unicode-ranges.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..8b2c634
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.no-prune-unicode-ranges.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.notdef-outline.61,62,63.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.notdef-outline.61,62,63.ttf
new file mode 100644 (file)
index 0000000..8b2c634
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.notdef-outline.61,62,63.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.notdef-outline.61,63.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.notdef-outline.61,63.ttf
new file mode 100644 (file)
index 0000000..1f017da
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.notdef-outline.61,63.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.notdef-outline.61.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.notdef-outline.61.ttf
new file mode 100644 (file)
index 0000000..d35619a
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.notdef-outline.61.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.notdef-outline.62.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.notdef-outline.62.ttf
new file mode 100644 (file)
index 0000000..5d73ef6
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.notdef-outline.62.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.notdef-outline.63.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.notdef-outline.63.ttf
new file mode 100644 (file)
index 0000000..b384aed
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.notdef-outline.63.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.notdef-outline.retain-all-codepoint.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.notdef-outline.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..8b2c634
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.notdef-outline.retain-all-codepoint.ttf differ
index 12d9208..8b2c634 100644 (file)
Binary files a/test/subset/data/expected/basics/Roboto-Regular.abc.retain-gids.61,62,63.ttf and b/test/subset/data/expected/basics/Roboto-Regular.abc.retain-gids.61,62,63.ttf differ
index f545375..accefc9 100644 (file)
Binary files a/test/subset/data/expected/basics/Roboto-Regular.abc.retain-gids.61,63.ttf and b/test/subset/data/expected/basics/Roboto-Regular.abc.retain-gids.61,63.ttf differ
index a699eea..d35619a 100644 (file)
Binary files a/test/subset/data/expected/basics/Roboto-Regular.abc.retain-gids.61.ttf and b/test/subset/data/expected/basics/Roboto-Regular.abc.retain-gids.61.ttf differ
index eb84f9c..d4e5508 100644 (file)
Binary files a/test/subset/data/expected/basics/Roboto-Regular.abc.retain-gids.62.ttf and b/test/subset/data/expected/basics/Roboto-Regular.abc.retain-gids.62.ttf differ
index efd7c16..350b166 100644 (file)
Binary files a/test/subset/data/expected/basics/Roboto-Regular.abc.retain-gids.63.ttf and b/test/subset/data/expected/basics/Roboto-Regular.abc.retain-gids.63.ttf differ
index 12d9208..8b2c634 100644 (file)
Binary files a/test/subset/data/expected/basics/Roboto-Regular.abc.retain-gids.retain-all-codepoint.ttf and b/test/subset/data/expected/basics/Roboto-Regular.abc.retain-gids.retain-all-codepoint.ttf differ
index b577752..fdd7aed 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.default.2049.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.default.2049.ttf differ
index 6f4814c..80bba05 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.default.38,2049.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.default.38,2049.ttf differ
index 1872d24..860a9de 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.default.38,20E3.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.default.38,20E3.ttf differ
index 14a544a..f9521e1 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.default.38,39,AE,2049,38,20E3.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.default.38,39,AE,2049,38,20E3.ttf differ
index 5631ded..2129fde 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.default.38,AE,2049.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.default.38,AE,2049.ttf differ
index 34e878e..5b78e35 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.default.39.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.default.39.ttf differ
index 1764f93..2402c69 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.default.AE.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.default.AE.ttf differ
index c9d65cc..ecc75f2 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints-retain-gids.2049.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints-retain-gids.2049.ttf differ
index 9b25457..9be8e29 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints-retain-gids.38,2049.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints-retain-gids.38,2049.ttf differ
index 7b36e6f..7161196 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints-retain-gids.38,20E3.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints-retain-gids.38,20E3.ttf differ
index a1fcc8c..77e275b 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints-retain-gids.38,39,AE,2049,38,20E3.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints-retain-gids.38,39,AE,2049,38,20E3.ttf differ
index 1596444..262dfcf 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints-retain-gids.38,AE,2049.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints-retain-gids.38,AE,2049.ttf differ
index f7075d2..b7bd7d9 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints-retain-gids.39.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints-retain-gids.39.ttf differ
index 8a68548..9cf2a3f 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints-retain-gids.AE.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints-retain-gids.AE.ttf differ
index 073edc9..2db03c9 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints.2049.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints.2049.ttf differ
index 3d9c782..0c7e212 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints.38,2049.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints.38,2049.ttf differ
index b8eadb0..b330fd1 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints.38,20E3.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints.38,20E3.ttf differ
index a1fcc8c..77e275b 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints.38,39,AE,2049,38,20E3.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints.38,39,AE,2049,38,20E3.ttf differ
index eabf61a..efdc225 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints.38,AE,2049.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints.38,AE,2049.ttf differ
index 936bb3c..e601a06 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints.39.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints.39.ttf differ
index 77f4be2..16ebd04 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints.AE.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints.AE.ttf differ
index 79e2d5d..947c5ee 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.default.2049.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.default.2049.ttf differ
index 8183201..7754895 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.default.38,2049.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.default.38,2049.ttf differ
index b465c5e..18c7138 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.default.38,20E3.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.default.38,20E3.ttf differ
index 4b7649d..3e65d5c 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.default.38,39,AE,2049,38,20E3.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.default.38,39,AE,2049,38,20E3.ttf differ
index 3074fb3..f7e0d96 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.default.38,AE,2049.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.default.38,AE,2049.ttf differ
index 18b002f..d59b841 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.default.39.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.default.39.ttf differ
index c627676..7f54597 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.default.AE.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.default.AE.ttf differ
index 129e7f9..5d989cb 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints-retain-gids.2049.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints-retain-gids.2049.ttf differ
index ac58380..b574032 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints-retain-gids.38,2049.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints-retain-gids.38,2049.ttf differ
index 128da7c..8245fa3 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints-retain-gids.38,20E3.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints-retain-gids.38,20E3.ttf differ
index b2f7f73..9c7b087 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints-retain-gids.38,39,AE,2049,38,20E3.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints-retain-gids.38,39,AE,2049,38,20E3.ttf differ
index a79bd91..6f3eb6c 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints-retain-gids.38,AE,2049.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints-retain-gids.38,AE,2049.ttf differ
index e663b7b..3b5140d 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints-retain-gids.39.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints-retain-gids.39.ttf differ
index c568252..0008afd 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints-retain-gids.AE.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints-retain-gids.AE.ttf differ
index fe772c9..f00ff0f 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints.2049.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints.2049.ttf differ
index 45b4ded..a4b45e0 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints.38,2049.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints.38,2049.ttf differ
index 1306b06..0743e25 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints.38,20E3.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints.38,20E3.ttf differ
index b2f7f73..9c7b087 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints.38,39,AE,2049,38,20E3.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints.38,39,AE,2049,38,20E3.ttf differ
index abd10a6..ac7e339 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints.38,AE,2049.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints.38,AE,2049.ttf differ
index 36e4096..38b7934 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints.39.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints.39.ttf differ
index 8659f8b..ef84731 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints.AE.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints.AE.ttf differ
index 2cee950..ff4acba 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.retain-gids.2049.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.retain-gids.2049.ttf differ
index 70c9f1b..5ebeb2b 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.retain-gids.38,2049.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.retain-gids.38,2049.ttf differ
index de9ec81..24bdc31 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.retain-gids.38,20E3.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.retain-gids.38,20E3.ttf differ
index 4b7649d..3e65d5c 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.retain-gids.38,39,AE,2049,38,20E3.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.retain-gids.38,39,AE,2049,38,20E3.ttf differ
index 17a8911..768acab 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.retain-gids.38,AE,2049.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.retain-gids.38,AE,2049.ttf differ
index c63734d..b0b9bf9 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.retain-gids.39.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.retain-gids.39.ttf differ
index 981fdac..dd378c3 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.retain-gids.AE.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.retain-gids.AE.ttf differ
index 5d8b04f..0b4f45a 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.default.2049.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.default.2049.ttf differ
index 058cc2a..ce7fda2 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.default.38,2049.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.default.38,2049.ttf differ
index 11e4412..716db34 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.default.38,20E3.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.default.38,20E3.ttf differ
index a53a3c6..2151697 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.default.38,39,AE,2049,38,20E3.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.default.38,39,AE,2049,38,20E3.ttf differ
index a6be214..5dc41bb 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.default.38,AE,2049.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.default.38,AE,2049.ttf differ
index b3d8000..7a57b83 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.default.39.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.default.39.ttf differ
index 6eda40d..25cc44e 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.default.AE.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.default.AE.ttf differ
index 516edf2..ad359c3 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints-retain-gids.2049.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints-retain-gids.2049.ttf differ
index 75307b5..1970859 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints-retain-gids.38,2049.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints-retain-gids.38,2049.ttf differ
index 232d48a..79b338b 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints-retain-gids.38,20E3.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints-retain-gids.38,20E3.ttf differ
index cafcec2..46ffded 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints-retain-gids.38,39,AE,2049,38,20E3.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints-retain-gids.38,39,AE,2049,38,20E3.ttf differ
index 13bebcb..0934fec 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints-retain-gids.38,AE,2049.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints-retain-gids.38,AE,2049.ttf differ
index 681723c..2630dfb 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints-retain-gids.39.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints-retain-gids.39.ttf differ
index b2f3346..68574c3 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints-retain-gids.AE.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints-retain-gids.AE.ttf differ
index 1974057..1052bd3 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints.2049.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints.2049.ttf differ
index 346df61..ad1aa83 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints.38,2049.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints.38,2049.ttf differ
index d01e7e0..d2d389f 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints.38,20E3.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints.38,20E3.ttf differ
index cafcec2..46ffded 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints.38,39,AE,2049,38,20E3.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints.38,39,AE,2049,38,20E3.ttf differ
index 967397c..db416ff 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints.38,AE,2049.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints.38,AE,2049.ttf differ
index 07faf3d..81b0b43 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints.39.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints.39.ttf differ
index b23af82..bcd08f1 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints.AE.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints.AE.ttf differ
index 76911a5..abefa6b 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.retain-gids.2049.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.retain-gids.2049.ttf differ
index 77422d0..94c2d0a 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.retain-gids.38,2049.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.retain-gids.38,2049.ttf differ
index 60a94b8..8dba70f 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.retain-gids.38,20E3.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.retain-gids.38,20E3.ttf differ
index a53a3c6..2151697 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.retain-gids.38,39,AE,2049,38,20E3.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.retain-gids.38,39,AE,2049,38,20E3.ttf differ
index ee3d5cf..f4eb909 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.retain-gids.38,AE,2049.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.retain-gids.38,AE,2049.ttf differ
index 40208c0..5e595a6 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.retain-gids.39.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.retain-gids.39.ttf differ
index f9b5d53..29348ac 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.retain-gids.AE.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.retain-gids.AE.ttf differ
index 91135db..f050646 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.default.2049.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.default.2049.ttf differ
index 327b5a9..740ea15 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.default.38,2049.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.default.38,2049.ttf differ
index 90509e0..9f2baca 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.default.38,20E3.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.default.38,20E3.ttf differ
index dc414bc..661ce52 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.default.38,39,AE,2049,38,20E3.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.default.38,39,AE,2049,38,20E3.ttf differ
index e560bcb..3ce9056 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.default.38,AE,2049.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.default.38,AE,2049.ttf differ
index 5e6fe09..3ac9fe2 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.default.39.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.default.39.ttf differ
index 2395fbc..56ba35f 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.default.AE.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.default.AE.ttf differ
index 1579c3c..265df72 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints-retain-gids.2049.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints-retain-gids.2049.ttf differ
index 6601691..0c2f8da 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints-retain-gids.38,2049.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints-retain-gids.38,2049.ttf differ
index 9777dba..d0e194b 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints-retain-gids.38,20E3.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints-retain-gids.38,20E3.ttf differ
index 4f684e1..2864095 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints-retain-gids.38,39,AE,2049,38,20E3.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints-retain-gids.38,39,AE,2049,38,20E3.ttf differ
index 7d5f7c4..41efe9d 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints-retain-gids.38,AE,2049.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints-retain-gids.38,AE,2049.ttf differ
index c675123..aab2fc7 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints-retain-gids.39.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints-retain-gids.39.ttf differ
index 40ab37f..19ebe2e 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints-retain-gids.AE.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints-retain-gids.AE.ttf differ
index 3314ada..58c0225 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints.2049.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints.2049.ttf differ
index 11481e0..925d61e 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints.38,2049.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints.38,2049.ttf differ
index 66a5ce9..310748e 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints.38,20E3.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints.38,20E3.ttf differ
index 4f684e1..2864095 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints.38,39,AE,2049,38,20E3.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints.38,39,AE,2049,38,20E3.ttf differ
index aff5f6c..b1c64b3 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints.38,AE,2049.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints.38,AE,2049.ttf differ
index 359c37f..f4f76b6 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints.39.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints.39.ttf differ
index f456bdb..69fcb6c 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints.AE.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints.AE.ttf differ
index 9bbbfc1..bce746f 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.retain-gids.2049.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.retain-gids.2049.ttf differ
index 129b0c7..8c64701 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.retain-gids.38,2049.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.retain-gids.38,2049.ttf differ
index 6bcdf40..7cfc9c2 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.retain-gids.38,20E3.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.retain-gids.38,20E3.ttf differ
index dc414bc..661ce52 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.retain-gids.38,39,AE,2049,38,20E3.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.retain-gids.38,39,AE,2049,38,20E3.ttf differ
index c55b0a7..c23b53d 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.retain-gids.38,AE,2049.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.retain-gids.38,AE,2049.ttf differ
index 6d5fa0e..3754c86 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.retain-gids.39.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.retain-gids.39.ttf differ
index 82e9d84..b62b7c6 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.retain-gids.AE.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.retain-gids.AE.ttf differ
index 968ed75..9ae2122 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.retain-gids.2049.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.retain-gids.2049.ttf differ
index 2f14cad..a16c8f3 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.retain-gids.38,2049.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.retain-gids.38,2049.ttf differ
index 8e211fd..7b52513 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.retain-gids.38,20E3.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.retain-gids.38,20E3.ttf differ
index 14a544a..f9521e1 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.retain-gids.38,39,AE,2049,38,20E3.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.retain-gids.38,39,AE,2049,38,20E3.ttf differ
index 06fbe73..b78fd9c 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.retain-gids.38,AE,2049.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.retain-gids.38,AE,2049.ttf differ
index dc003fe..34a9750 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.retain-gids.39.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.retain-gids.39.ttf differ
index c990eca..6288dd4 100644 (file)
Binary files a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.retain-gids.AE.ttf and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.retain-gids.AE.ttf differ
diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.default.1FC,21,41,20,62,63.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.default.1FC,21,41,20,62,63.otf
deleted file mode 100644 (file)
index 780b278..0000000
Binary files a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.default.1FC,21,41,20,62,63.otf and /dev/null differ
diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.default.61,62,63.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.default.61,62,63.otf
deleted file mode 100644 (file)
index 655f8c2..0000000
Binary files a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.default.61,62,63.otf and /dev/null differ
diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.default.D7,D8,D9,DA,DE.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.default.D7,D8,D9,DA,DE.otf
deleted file mode 100644 (file)
index bbc29ed..0000000
Binary files a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.default.D7,D8,D9,DA,DE.otf and /dev/null differ
diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.desubroutinize-retain-gids.1FC,21,41,20,62,63.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.desubroutinize-retain-gids.1FC,21,41,20,62,63.otf
deleted file mode 100644 (file)
index 012e843..0000000
Binary files a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.desubroutinize-retain-gids.1FC,21,41,20,62,63.otf and /dev/null differ
diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.desubroutinize-retain-gids.61,62,63.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.desubroutinize-retain-gids.61,62,63.otf
deleted file mode 100644 (file)
index eaafafe..0000000
Binary files a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.desubroutinize-retain-gids.61,62,63.otf and /dev/null differ
diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf
deleted file mode 100644 (file)
index 4449e0e..0000000
Binary files a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf and /dev/null differ
diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.desubroutinize.1FC,21,41,20,62,63.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.desubroutinize.1FC,21,41,20,62,63.otf
deleted file mode 100644 (file)
index de556b5..0000000
Binary files a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.desubroutinize.1FC,21,41,20,62,63.otf and /dev/null differ
diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.desubroutinize.61,62,63.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.desubroutinize.61,62,63.otf
deleted file mode 100644 (file)
index 85e2711..0000000
Binary files a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.desubroutinize.61,62,63.otf and /dev/null differ
diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.desubroutinize.D7,D8,D9,DA,DE.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.desubroutinize.D7,D8,D9,DA,DE.otf
deleted file mode 100644 (file)
index 98a856e..0000000
Binary files a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.desubroutinize.D7,D8,D9,DA,DE.otf and /dev/null differ
diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize-retain-gids.1FC,21,41,20,62,63.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize-retain-gids.1FC,21,41,20,62,63.otf
deleted file mode 100644 (file)
index 86b849a..0000000
Binary files a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize-retain-gids.1FC,21,41,20,62,63.otf and /dev/null differ
diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize-retain-gids.61,62,63.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize-retain-gids.61,62,63.otf
deleted file mode 100644 (file)
index 08b023c..0000000
Binary files a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize-retain-gids.61,62,63.otf and /dev/null differ
diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf
deleted file mode 100644 (file)
index 1c246c1..0000000
Binary files a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf and /dev/null differ
diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize.1FC,21,41,20,62,63.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize.1FC,21,41,20,62,63.otf
deleted file mode 100644 (file)
index d409eab..0000000
Binary files a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize.1FC,21,41,20,62,63.otf and /dev/null differ
diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize.61,62,63.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize.61,62,63.otf
deleted file mode 100644 (file)
index 910216e..0000000
Binary files a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize.61,62,63.otf and /dev/null differ
diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize.D7,D8,D9,DA,DE.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize.D7,D8,D9,DA,DE.otf
deleted file mode 100644 (file)
index c1d8776..0000000
Binary files a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize.D7,D8,D9,DA,DE.otf and /dev/null differ
diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-retain-gids.1FC,21,41,20,62,63.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-retain-gids.1FC,21,41,20,62,63.otf
deleted file mode 100644 (file)
index 76505a0..0000000
Binary files a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-retain-gids.1FC,21,41,20,62,63.otf and /dev/null differ
diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-retain-gids.61,62,63.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-retain-gids.61,62,63.otf
deleted file mode 100644 (file)
index 87a279f..0000000
Binary files a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-retain-gids.61,62,63.otf and /dev/null differ
diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-retain-gids.D7,D8,D9,DA,DE.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-retain-gids.D7,D8,D9,DA,DE.otf
deleted file mode 100644 (file)
index edb013e..0000000
Binary files a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-retain-gids.D7,D8,D9,DA,DE.otf and /dev/null differ
diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints.1FC,21,41,20,62,63.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints.1FC,21,41,20,62,63.otf
deleted file mode 100644 (file)
index 2cf6200..0000000
Binary files a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints.1FC,21,41,20,62,63.otf and /dev/null differ
diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints.61,62,63.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints.61,62,63.otf
deleted file mode 100644 (file)
index 3e500ab..0000000
Binary files a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints.61,62,63.otf and /dev/null differ
diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints.D7,D8,D9,DA,DE.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints.D7,D8,D9,DA,DE.otf
deleted file mode 100644 (file)
index 02edb95..0000000
Binary files a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints.D7,D8,D9,DA,DE.otf and /dev/null differ
diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-desubroutinize-retain-gids.1FC,21,41,20,62,63.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-desubroutinize-retain-gids.1FC,21,41,20,62,63.otf
new file mode 100644 (file)
index 0000000..a06d900
Binary files /dev/null and b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-desubroutinize-retain-gids.1FC,21,41,20,62,63.otf differ
diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-desubroutinize-retain-gids.61,62,63.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-desubroutinize-retain-gids.61,62,63.otf
new file mode 100644 (file)
index 0000000..1af511d
Binary files /dev/null and b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-desubroutinize-retain-gids.61,62,63.otf differ
diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf
new file mode 100644 (file)
index 0000000..48ec219
Binary files /dev/null and b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf differ
diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-desubroutinize.1FC,21,41,20,62,63.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-desubroutinize.1FC,21,41,20,62,63.otf
new file mode 100644 (file)
index 0000000..179fc28
Binary files /dev/null and b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-desubroutinize.1FC,21,41,20,62,63.otf differ
diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-desubroutinize.61,62,63.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-desubroutinize.61,62,63.otf
new file mode 100644 (file)
index 0000000..7a5e3ba
Binary files /dev/null and b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-desubroutinize.61,62,63.otf differ
diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-desubroutinize.D7,D8,D9,DA,DE.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-desubroutinize.D7,D8,D9,DA,DE.otf
new file mode 100644 (file)
index 0000000..61999cb
Binary files /dev/null and b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-desubroutinize.D7,D8,D9,DA,DE.otf differ
diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-desubroutinize-retain-gids.1FC,21,41,20,62,63.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-desubroutinize-retain-gids.1FC,21,41,20,62,63.otf
new file mode 100644 (file)
index 0000000..7b881e0
Binary files /dev/null and b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-desubroutinize-retain-gids.1FC,21,41,20,62,63.otf differ
diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-desubroutinize-retain-gids.61,62,63.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-desubroutinize-retain-gids.61,62,63.otf
new file mode 100644 (file)
index 0000000..59be7c3
Binary files /dev/null and b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-desubroutinize-retain-gids.61,62,63.otf differ
diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf
new file mode 100644 (file)
index 0000000..4b0aeeb
Binary files /dev/null and b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf differ
diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-desubroutinize.1FC,21,41,20,62,63.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-desubroutinize.1FC,21,41,20,62,63.otf
new file mode 100644 (file)
index 0000000..b60efdc
Binary files /dev/null and b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-desubroutinize.1FC,21,41,20,62,63.otf differ
diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-desubroutinize.61,62,63.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-desubroutinize.61,62,63.otf
new file mode 100644 (file)
index 0000000..a2a8d1a
Binary files /dev/null and b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-desubroutinize.61,62,63.otf differ
diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-desubroutinize.D7,D8,D9,DA,DE.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-desubroutinize.D7,D8,D9,DA,DE.otf
new file mode 100644 (file)
index 0000000..895b69d
Binary files /dev/null and b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-desubroutinize.D7,D8,D9,DA,DE.otf differ
diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-retain-gids.1FC,21,41,20,62,63.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-retain-gids.1FC,21,41,20,62,63.otf
new file mode 100644 (file)
index 0000000..4024ffa
Binary files /dev/null and b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-retain-gids.1FC,21,41,20,62,63.otf differ
diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-retain-gids.61,62,63.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-retain-gids.61,62,63.otf
new file mode 100644 (file)
index 0000000..514ec3c
Binary files /dev/null and b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-retain-gids.61,62,63.otf differ
diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-retain-gids.D7,D8,D9,DA,DE.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-retain-gids.D7,D8,D9,DA,DE.otf
new file mode 100644 (file)
index 0000000..f6d838c
Binary files /dev/null and b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints-retain-gids.D7,D8,D9,DA,DE.otf differ
diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints.1FC,21,41,20,62,63.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints.1FC,21,41,20,62,63.otf
new file mode 100644 (file)
index 0000000..3c66f6d
Binary files /dev/null and b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints.1FC,21,41,20,62,63.otf differ
diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints.61,62,63.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints.61,62,63.otf
new file mode 100644 (file)
index 0000000..4308642
Binary files /dev/null and b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints.61,62,63.otf differ
diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints.D7,D8,D9,DA,DE.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints.D7,D8,D9,DA,DE.otf
new file mode 100644 (file)
index 0000000..54dbd8f
Binary files /dev/null and b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-drop-hints.D7,D8,D9,DA,DE.otf differ
diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-retain-gids.1FC,21,41,20,62,63.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-retain-gids.1FC,21,41,20,62,63.otf
new file mode 100644 (file)
index 0000000..268cefd
Binary files /dev/null and b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-retain-gids.1FC,21,41,20,62,63.otf differ
diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-retain-gids.61,62,63.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-retain-gids.61,62,63.otf
new file mode 100644 (file)
index 0000000..88c7b33
Binary files /dev/null and b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-retain-gids.61,62,63.otf differ
diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-retain-gids.D7,D8,D9,DA,DE.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-retain-gids.D7,D8,D9,DA,DE.otf
new file mode 100644 (file)
index 0000000..dd85287
Binary files /dev/null and b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline-retain-gids.D7,D8,D9,DA,DE.otf differ
diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline.1FC,21,41,20,62,63.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline.1FC,21,41,20,62,63.otf
new file mode 100644 (file)
index 0000000..d5992f7
Binary files /dev/null and b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline.1FC,21,41,20,62,63.otf differ
diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline.61,62,63.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline.61,62,63.otf
new file mode 100644 (file)
index 0000000..de13277
Binary files /dev/null and b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline.61,62,63.otf differ
diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline.D7,D8,D9,DA,DE.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline.D7,D8,D9,DA,DE.otf
new file mode 100644 (file)
index 0000000..90fdd95
Binary files /dev/null and b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.notdef-outline.D7,D8,D9,DA,DE.otf differ
diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.retain-gids.1FC,21,41,20,62,63.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.retain-gids.1FC,21,41,20,62,63.otf
deleted file mode 100644 (file)
index def021f..0000000
Binary files a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.retain-gids.1FC,21,41,20,62,63.otf and /dev/null differ
diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.retain-gids.61,62,63.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.retain-gids.61,62,63.otf
deleted file mode 100644 (file)
index 8ca5055..0000000
Binary files a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.retain-gids.61,62,63.otf and /dev/null differ
diff --git a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.retain-gids.D7,D8,D9,DA,DE.otf b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.retain-gids.D7,D8,D9,DA,DE.otf
deleted file mode 100644 (file)
index 0529b72..0000000
Binary files a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.retain-gids.D7,D8,D9,DA,DE.otf and /dev/null differ
index 6065be4..028434d 100644 (file)
Binary files a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.default.3042,3044,3046,3048,304A,304B.otf and b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.default.3042,3044,3046,3048,304A,304B.otf differ
index cee7584..73b2f01 100644 (file)
Binary files a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.default.3042,3044,3046,73E0,5EA6,8F38.otf and b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.default.3042,3044,3046,73E0,5EA6,8F38.otf differ
index 0f13fa5..3c99fb5 100644 (file)
Binary files a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.default.61,63,65,6B.otf and b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.default.61,63,65,6B.otf differ
index 6db56f4..f803b3e 100644 (file)
Binary files a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.default.660E,6975,73E0,5EA6,8F38,6E05.otf and b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.default.660E,6975,73E0,5EA6,8F38,6E05.otf differ
index 1b216cc..d3b97c1 100644 (file)
Binary files a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.default.660E.otf and b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.default.660E.otf differ
index 690fe90..2fd4d01 100644 (file)
Binary files a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.desubroutinize-retain-gids.3042,3044,3046,3048,304A,304B.otf and b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.desubroutinize-retain-gids.3042,3044,3046,3048,304A,304B.otf differ
index f1f0cb1..8104df8 100644 (file)
Binary files a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.desubroutinize-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf and b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.desubroutinize-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf differ
index b353d43..2eaaff3 100644 (file)
Binary files a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.desubroutinize-retain-gids.61,63,65,6B.otf and b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.desubroutinize-retain-gids.61,63,65,6B.otf differ
index 7d96667..02b738b 100644 (file)
Binary files a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.desubroutinize-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf and b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.desubroutinize-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf differ
index afd9c33..2e1aafe 100644 (file)
Binary files a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.desubroutinize-retain-gids.660E.otf and b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.desubroutinize-retain-gids.660E.otf differ
index 1a47c85..e377284 100644 (file)
Binary files a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.desubroutinize.3042,3044,3046,3048,304A,304B.otf and b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.desubroutinize.3042,3044,3046,3048,304A,304B.otf differ
index b69448b..0e613b7 100644 (file)
Binary files a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.desubroutinize.3042,3044,3046,73E0,5EA6,8F38.otf and b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.desubroutinize.3042,3044,3046,73E0,5EA6,8F38.otf differ
index 3682a0d..d6a6ae7 100644 (file)
Binary files a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.desubroutinize.61,63,65,6B.otf and b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.desubroutinize.61,63,65,6B.otf differ
index 6f98c8f..839a963 100644 (file)
Binary files a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.desubroutinize.660E,6975,73E0,5EA6,8F38,6E05.otf and b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.desubroutinize.660E,6975,73E0,5EA6,8F38,6E05.otf differ
index 1497979..71d39df 100644 (file)
Binary files a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.desubroutinize.660E.otf and b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.desubroutinize.660E.otf differ
index c728315..4c48a5a 100644 (file)
Binary files a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize-retain-gids.3042,3044,3046,3048,304A,304B.otf and b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize-retain-gids.3042,3044,3046,3048,304A,304B.otf differ
index 9a0e726..4e7e817 100644 (file)
Binary files a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf and b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf differ
index 513d47e..093927c 100644 (file)
Binary files a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize-retain-gids.61,63,65,6B.otf and b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize-retain-gids.61,63,65,6B.otf differ
index b10526d..4471395 100644 (file)
Binary files a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf and b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf differ
index 2684381..0ca639a 100644 (file)
Binary files a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize-retain-gids.660E.otf and b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize-retain-gids.660E.otf differ
index 68a254e..ddd99b8 100644 (file)
Binary files a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize.3042,3044,3046,3048,304A,304B.otf and b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize.3042,3044,3046,3048,304A,304B.otf differ
index b900d92..af0b861 100644 (file)
Binary files a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize.3042,3044,3046,73E0,5EA6,8F38.otf and b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize.3042,3044,3046,73E0,5EA6,8F38.otf differ
index 6b7cc2e..5aa7cc0 100644 (file)
Binary files a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize.61,63,65,6B.otf and b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize.61,63,65,6B.otf differ
index 69b6b2e..47e085e 100644 (file)
Binary files a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize.660E,6975,73E0,5EA6,8F38,6E05.otf and b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize.660E,6975,73E0,5EA6,8F38,6E05.otf differ
index 460bace..7112ccc 100644 (file)
Binary files a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize.660E.otf and b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-desubroutinize.660E.otf differ
index ecdd5d6..edd4687 100644 (file)
Binary files a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-retain-gids.3042,3044,3046,3048,304A,304B.otf and b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-retain-gids.3042,3044,3046,3048,304A,304B.otf differ
index 77b1f95..9c4a8f5 100644 (file)
Binary files a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf and b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf differ
index 8a1bc96..81e2f2f 100644 (file)
Binary files a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-retain-gids.61,63,65,6B.otf and b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-retain-gids.61,63,65,6B.otf differ
index 7d943fd..165e7f5 100644 (file)
Binary files a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf and b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf differ
index eb01e55..b3f7767 100644 (file)
Binary files a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-retain-gids.660E.otf and b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints-retain-gids.660E.otf differ
index 19c8ed8..ad18ccc 100644 (file)
Binary files a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints.3042,3044,3046,3048,304A,304B.otf and b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints.3042,3044,3046,3048,304A,304B.otf differ
index 5c7ac1a..e8df0b0 100644 (file)
Binary files a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints.3042,3044,3046,73E0,5EA6,8F38.otf and b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints.3042,3044,3046,73E0,5EA6,8F38.otf differ
index abac3dd..7de6715 100644 (file)
Binary files a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints.61,63,65,6B.otf and b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints.61,63,65,6B.otf differ
index e593d6d..db8db37 100644 (file)
Binary files a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints.660E,6975,73E0,5EA6,8F38,6E05.otf and b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints.660E,6975,73E0,5EA6,8F38,6E05.otf differ
index e586904..d896e2f 100644 (file)
Binary files a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints.660E.otf and b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.drop-hints.660E.otf differ
index 75f1613..24d8fae 100644 (file)
Binary files a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.retain-gids.3042,3044,3046,3048,304A,304B.otf and b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.retain-gids.3042,3044,3046,3048,304A,304B.otf differ
index 6f3794c..47af163 100644 (file)
Binary files a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf and b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf differ
index 7c5f648..1503185 100644 (file)
Binary files a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.retain-gids.61,63,65,6B.otf and b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.retain-gids.61,63,65,6B.otf differ
index 2dcd75b..4b08011 100644 (file)
Binary files a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf and b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf differ
index a5d40d0..40ef924 100644 (file)
Binary files a/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.retain-gids.660E.otf and b/test/subset/data/expected/cff-japanese/SourceHanSans-Regular_subset.retain-gids.660E.otf differ
diff --git a/test/subset/data/expected/cff.notoserifmyanmar/NotoSerifMyanmar-Regular.notdef-outline.1092.otf b/test/subset/data/expected/cff.notoserifmyanmar/NotoSerifMyanmar-Regular.notdef-outline.1092.otf
new file mode 100644 (file)
index 0000000..5935868
Binary files /dev/null and b/test/subset/data/expected/cff.notoserifmyanmar/NotoSerifMyanmar-Regular.notdef-outline.1092.otf differ
index 5eb324e..6c594ee 100644 (file)
Binary files a/test/subset/data/expected/cmap/AdobeBlank-Regular.default.61,62.ttf and b/test/subset/data/expected/cmap/AdobeBlank-Regular.default.61,62.ttf differ
index f992c46..6738685 100644 (file)
Binary files a/test/subset/data/expected/cmap/AdobeBlank-Regular.default.61,FEFA.ttf and b/test/subset/data/expected/cmap/AdobeBlank-Regular.default.61,FEFA.ttf differ
index dd44a81..7a49c16 100644 (file)
Binary files a/test/subset/data/expected/cmap/AdobeBlank-Regular.default.FEE6,FECF.ttf and b/test/subset/data/expected/cmap/AdobeBlank-Regular.default.FEE6,FECF.ttf differ
index bb09c4d..120ea52 100644 (file)
Binary files a/test/subset/data/expected/cmap/AdobeBlank-Regular.default.FEF9,FEFA.ttf and b/test/subset/data/expected/cmap/AdobeBlank-Regular.default.FEF9,FEFA.ttf differ
index 209f039..f38f951 100644 (file)
Binary files a/test/subset/data/expected/cmap/AdobeBlank-Regular.default.FEFA.ttf and b/test/subset/data/expected/cmap/AdobeBlank-Regular.default.FEFA.ttf differ
index b61474d..1f39a65 100644 (file)
Binary files a/test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints-retain-gids.61,62.ttf and b/test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints-retain-gids.61,62.ttf differ
index 675e2d3..45a872c 100644 (file)
Binary files a/test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints-retain-gids.61,FEFA.ttf and b/test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints-retain-gids.61,FEFA.ttf differ
index 12a9fb2..2a9054f 100644 (file)
Binary files a/test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints-retain-gids.FEE6,FECF.ttf and b/test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints-retain-gids.FEE6,FECF.ttf differ
index 82ce49d..c7d4754 100644 (file)
Binary files a/test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints-retain-gids.FEF9,FEFA.ttf and b/test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints-retain-gids.FEF9,FEFA.ttf differ
index 46ec429..acad1db 100644 (file)
Binary files a/test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints-retain-gids.FEFA.ttf and b/test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints-retain-gids.FEFA.ttf differ
index bdba814..a8f0daa 100644 (file)
Binary files a/test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints.61,62.ttf and b/test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints.61,62.ttf differ
index 2678e54..373027a 100644 (file)
Binary files a/test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints.61,FEFA.ttf and b/test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints.61,FEFA.ttf differ
index dc1e50c..dedad90 100644 (file)
Binary files a/test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints.FEE6,FECF.ttf and b/test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints.FEE6,FECF.ttf differ
index 7b2add8..955e4c0 100644 (file)
Binary files a/test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints.FEF9,FEFA.ttf and b/test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints.FEF9,FEFA.ttf differ
index 1aa367c..67f2473 100644 (file)
Binary files a/test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints.FEFA.ttf and b/test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints.FEFA.ttf differ
index b2e4657..7fed7b2 100644 (file)
Binary files a/test/subset/data/expected/cmap/AdobeBlank-Regular.name-ids.61,62.ttf and b/test/subset/data/expected/cmap/AdobeBlank-Regular.name-ids.61,62.ttf differ
index 76dd00d..d94e366 100644 (file)
Binary files a/test/subset/data/expected/cmap/AdobeBlank-Regular.name-ids.61,FEFA.ttf and b/test/subset/data/expected/cmap/AdobeBlank-Regular.name-ids.61,FEFA.ttf differ
index 4f5cdbf..2f52892 100644 (file)
Binary files a/test/subset/data/expected/cmap/AdobeBlank-Regular.name-ids.FEE6,FECF.ttf and b/test/subset/data/expected/cmap/AdobeBlank-Regular.name-ids.FEE6,FECF.ttf differ
index ce964fd..211b26d 100644 (file)
Binary files a/test/subset/data/expected/cmap/AdobeBlank-Regular.name-ids.FEF9,FEFA.ttf and b/test/subset/data/expected/cmap/AdobeBlank-Regular.name-ids.FEF9,FEFA.ttf differ
index 859a7f1..feb7d5c 100644 (file)
Binary files a/test/subset/data/expected/cmap/AdobeBlank-Regular.name-ids.FEFA.ttf and b/test/subset/data/expected/cmap/AdobeBlank-Regular.name-ids.FEFA.ttf differ
index 745e32d..cdab53e 100644 (file)
Binary files a/test/subset/data/expected/cmap/AdobeBlank-Regular.retain-gids.61,62.ttf and b/test/subset/data/expected/cmap/AdobeBlank-Regular.retain-gids.61,62.ttf differ
index 6faea20..1d35e58 100644 (file)
Binary files a/test/subset/data/expected/cmap/AdobeBlank-Regular.retain-gids.61,FEFA.ttf and b/test/subset/data/expected/cmap/AdobeBlank-Regular.retain-gids.61,FEFA.ttf differ
index 77fa170..7ad50fc 100644 (file)
Binary files a/test/subset/data/expected/cmap/AdobeBlank-Regular.retain-gids.FEE6,FECF.ttf and b/test/subset/data/expected/cmap/AdobeBlank-Regular.retain-gids.FEE6,FECF.ttf differ
index 54620ed..762e33d 100644 (file)
Binary files a/test/subset/data/expected/cmap/AdobeBlank-Regular.retain-gids.FEF9,FEFA.ttf and b/test/subset/data/expected/cmap/AdobeBlank-Regular.retain-gids.FEF9,FEFA.ttf differ
index 06d379b..6b2570d 100644 (file)
Binary files a/test/subset/data/expected/cmap/AdobeBlank-Regular.retain-gids.FEFA.ttf and b/test/subset/data/expected/cmap/AdobeBlank-Regular.retain-gids.FEFA.ttf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.default.4E00,4E02,4E03.otf b/test/subset/data/expected/cmap14/cmap14_font1.default.4E00,4E02,4E03.otf
deleted file mode 100644 (file)
index fb41408..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.default.4E00,4E02,4E03.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.default.4E00,4E03.otf b/test/subset/data/expected/cmap14/cmap14_font1.default.4E00,4E03.otf
deleted file mode 100644 (file)
index e50256d..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.default.4E00,4E03.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.default.4E00,4E05,4E07.otf b/test/subset/data/expected/cmap14/cmap14_font1.default.4E00,4E05,4E07.otf
deleted file mode 100644 (file)
index 24f3871..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.default.4E00,4E05,4E07.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.default.4E02,4E03,4E08.otf b/test/subset/data/expected/cmap14/cmap14_font1.default.4E02,4E03,4E08.otf
deleted file mode 100644 (file)
index 38672ba..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.default.4E02,4E03,4E08.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.default.4E02.otf b/test/subset/data/expected/cmap14/cmap14_font1.default.4E02.otf
deleted file mode 100644 (file)
index c5f898e..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.default.4E02.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.default.4E03.otf b/test/subset/data/expected/cmap14/cmap14_font1.default.4E03.otf
deleted file mode 100644 (file)
index 03cae07..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.default.4E03.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.default.4E05,4E07,4E08,4E09.otf b/test/subset/data/expected/cmap14/cmap14_font1.default.4E05,4E07,4E08,4E09.otf
deleted file mode 100644 (file)
index 2506a41..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.default.4E05,4E07,4E08,4E09.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.default.4E08,4E09.otf b/test/subset/data/expected/cmap14/cmap14_font1.default.4E08,4E09.otf
deleted file mode 100644 (file)
index e8ebeb4..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.default.4E08,4E09.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.default.4E08.otf b/test/subset/data/expected/cmap14/cmap14_font1.default.4E08.otf
deleted file mode 100644 (file)
index 910cc0f..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.default.4E08.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.default.retain-all-codepoint.otf b/test/subset/data/expected/cmap14/cmap14_font1.default.retain-all-codepoint.otf
deleted file mode 100644 (file)
index d7d6972..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.default.retain-all-codepoint.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.drop-hints-retain-gids.4E00,4E02,4E03.otf b/test/subset/data/expected/cmap14/cmap14_font1.drop-hints-retain-gids.4E00,4E02,4E03.otf
deleted file mode 100644 (file)
index a1c001c..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.drop-hints-retain-gids.4E00,4E02,4E03.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.drop-hints-retain-gids.4E00,4E03.otf b/test/subset/data/expected/cmap14/cmap14_font1.drop-hints-retain-gids.4E00,4E03.otf
deleted file mode 100644 (file)
index 5b41802..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.drop-hints-retain-gids.4E00,4E03.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.drop-hints-retain-gids.4E00,4E05,4E07.otf b/test/subset/data/expected/cmap14/cmap14_font1.drop-hints-retain-gids.4E00,4E05,4E07.otf
deleted file mode 100644 (file)
index b88e288..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.drop-hints-retain-gids.4E00,4E05,4E07.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.drop-hints-retain-gids.4E02,4E03,4E08.otf b/test/subset/data/expected/cmap14/cmap14_font1.drop-hints-retain-gids.4E02,4E03,4E08.otf
deleted file mode 100644 (file)
index 6d95272..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.drop-hints-retain-gids.4E02,4E03,4E08.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.drop-hints-retain-gids.4E02.otf b/test/subset/data/expected/cmap14/cmap14_font1.drop-hints-retain-gids.4E02.otf
deleted file mode 100644 (file)
index 251568f..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.drop-hints-retain-gids.4E02.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.drop-hints-retain-gids.4E03.otf b/test/subset/data/expected/cmap14/cmap14_font1.drop-hints-retain-gids.4E03.otf
deleted file mode 100644 (file)
index 2b1d7a7..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.drop-hints-retain-gids.4E03.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.drop-hints-retain-gids.4E05,4E07,4E08,4E09.otf b/test/subset/data/expected/cmap14/cmap14_font1.drop-hints-retain-gids.4E05,4E07,4E08,4E09.otf
deleted file mode 100644 (file)
index dce7f14..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.drop-hints-retain-gids.4E05,4E07,4E08,4E09.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.drop-hints-retain-gids.4E08,4E09.otf b/test/subset/data/expected/cmap14/cmap14_font1.drop-hints-retain-gids.4E08,4E09.otf
deleted file mode 100644 (file)
index e1e2245..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.drop-hints-retain-gids.4E08,4E09.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.drop-hints-retain-gids.4E08.otf b/test/subset/data/expected/cmap14/cmap14_font1.drop-hints-retain-gids.4E08.otf
deleted file mode 100644 (file)
index f72cdc9..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.drop-hints-retain-gids.4E08.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.drop-hints-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/cmap14/cmap14_font1.drop-hints-retain-gids.retain-all-codepoint.otf
deleted file mode 100644 (file)
index 4efa2e2..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.drop-hints-retain-gids.retain-all-codepoint.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.drop-hints.4E00,4E02,4E03.otf b/test/subset/data/expected/cmap14/cmap14_font1.drop-hints.4E00,4E02,4E03.otf
deleted file mode 100644 (file)
index a440b96..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.drop-hints.4E00,4E02,4E03.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.drop-hints.4E00,4E03.otf b/test/subset/data/expected/cmap14/cmap14_font1.drop-hints.4E00,4E03.otf
deleted file mode 100644 (file)
index c503e38..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.drop-hints.4E00,4E03.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.drop-hints.4E00,4E05,4E07.otf b/test/subset/data/expected/cmap14/cmap14_font1.drop-hints.4E00,4E05,4E07.otf
deleted file mode 100644 (file)
index d36d155..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.drop-hints.4E00,4E05,4E07.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.drop-hints.4E02,4E03,4E08.otf b/test/subset/data/expected/cmap14/cmap14_font1.drop-hints.4E02,4E03,4E08.otf
deleted file mode 100644 (file)
index 34a8469..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.drop-hints.4E02,4E03,4E08.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.drop-hints.4E02.otf b/test/subset/data/expected/cmap14/cmap14_font1.drop-hints.4E02.otf
deleted file mode 100644 (file)
index d695329..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.drop-hints.4E02.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.drop-hints.4E03.otf b/test/subset/data/expected/cmap14/cmap14_font1.drop-hints.4E03.otf
deleted file mode 100644 (file)
index 1c4d2b5..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.drop-hints.4E03.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.drop-hints.4E05,4E07,4E08,4E09.otf b/test/subset/data/expected/cmap14/cmap14_font1.drop-hints.4E05,4E07,4E08,4E09.otf
deleted file mode 100644 (file)
index e5981f0..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.drop-hints.4E05,4E07,4E08,4E09.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.drop-hints.4E08,4E09.otf b/test/subset/data/expected/cmap14/cmap14_font1.drop-hints.4E08,4E09.otf
deleted file mode 100644 (file)
index 4b76f1c..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.drop-hints.4E08,4E09.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.drop-hints.4E08.otf b/test/subset/data/expected/cmap14/cmap14_font1.drop-hints.4E08.otf
deleted file mode 100644 (file)
index cf60215..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.drop-hints.4E08.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.drop-hints.retain-all-codepoint.otf b/test/subset/data/expected/cmap14/cmap14_font1.drop-hints.retain-all-codepoint.otf
deleted file mode 100644 (file)
index bf353ed..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.drop-hints.retain-all-codepoint.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.gids.4E00,4E02,4E03.otf b/test/subset/data/expected/cmap14/cmap14_font1.gids.4E00,4E02,4E03.otf
deleted file mode 100644 (file)
index aecfd1c..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.gids.4E00,4E02,4E03.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.gids.4E00,4E03.otf b/test/subset/data/expected/cmap14/cmap14_font1.gids.4E00,4E03.otf
deleted file mode 100644 (file)
index 3249149..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.gids.4E00,4E03.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.gids.4E00,4E05,4E07.otf b/test/subset/data/expected/cmap14/cmap14_font1.gids.4E00,4E05,4E07.otf
deleted file mode 100644 (file)
index 1c17acf..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.gids.4E00,4E05,4E07.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.gids.4E02,4E03,4E08.otf b/test/subset/data/expected/cmap14/cmap14_font1.gids.4E02,4E03,4E08.otf
deleted file mode 100644 (file)
index 4a66226..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.gids.4E02,4E03,4E08.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.gids.4E02.otf b/test/subset/data/expected/cmap14/cmap14_font1.gids.4E02.otf
deleted file mode 100644 (file)
index 806f689..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.gids.4E02.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.gids.4E03.otf b/test/subset/data/expected/cmap14/cmap14_font1.gids.4E03.otf
deleted file mode 100644 (file)
index 55f28d4..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.gids.4E03.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.gids.4E05,4E07,4E08,4E09.otf b/test/subset/data/expected/cmap14/cmap14_font1.gids.4E05,4E07,4E08,4E09.otf
deleted file mode 100644 (file)
index d17a22a..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.gids.4E05,4E07,4E08,4E09.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.gids.4E08,4E09.otf b/test/subset/data/expected/cmap14/cmap14_font1.gids.4E08,4E09.otf
deleted file mode 100644 (file)
index cc4305d..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.gids.4E08,4E09.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.gids.4E08.otf b/test/subset/data/expected/cmap14/cmap14_font1.gids.4E08.otf
deleted file mode 100644 (file)
index f2093c9..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.gids.4E08.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.gids.retain-all-codepoint.otf b/test/subset/data/expected/cmap14/cmap14_font1.gids.retain-all-codepoint.otf
deleted file mode 100644 (file)
index 09c8f8d..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.gids.retain-all-codepoint.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.name-ids.4E00,4E02,4E03.otf b/test/subset/data/expected/cmap14/cmap14_font1.name-ids.4E00,4E02,4E03.otf
deleted file mode 100644 (file)
index a7b67bf..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.name-ids.4E00,4E02,4E03.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.name-ids.4E00,4E03.otf b/test/subset/data/expected/cmap14/cmap14_font1.name-ids.4E00,4E03.otf
deleted file mode 100644 (file)
index 7c6805d..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.name-ids.4E00,4E03.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.name-ids.4E00,4E05,4E07.otf b/test/subset/data/expected/cmap14/cmap14_font1.name-ids.4E00,4E05,4E07.otf
deleted file mode 100644 (file)
index b1876b6..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.name-ids.4E00,4E05,4E07.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.name-ids.4E02,4E03,4E08.otf b/test/subset/data/expected/cmap14/cmap14_font1.name-ids.4E02,4E03,4E08.otf
deleted file mode 100644 (file)
index b07778f..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.name-ids.4E02,4E03,4E08.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.name-ids.4E02.otf b/test/subset/data/expected/cmap14/cmap14_font1.name-ids.4E02.otf
deleted file mode 100644 (file)
index fb77632..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.name-ids.4E02.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.name-ids.4E03.otf b/test/subset/data/expected/cmap14/cmap14_font1.name-ids.4E03.otf
deleted file mode 100644 (file)
index 4ec322c..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.name-ids.4E03.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.name-ids.4E05,4E07,4E08,4E09.otf b/test/subset/data/expected/cmap14/cmap14_font1.name-ids.4E05,4E07,4E08,4E09.otf
deleted file mode 100644 (file)
index ec20755..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.name-ids.4E05,4E07,4E08,4E09.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.name-ids.4E08,4E09.otf b/test/subset/data/expected/cmap14/cmap14_font1.name-ids.4E08,4E09.otf
deleted file mode 100644 (file)
index bf2c086..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.name-ids.4E08,4E09.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.name-ids.4E08.otf b/test/subset/data/expected/cmap14/cmap14_font1.name-ids.4E08.otf
deleted file mode 100644 (file)
index 0a3721e..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.name-ids.4E08.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.name-ids.retain-all-codepoint.otf b/test/subset/data/expected/cmap14/cmap14_font1.name-ids.retain-all-codepoint.otf
deleted file mode 100644 (file)
index eaaa56d..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.name-ids.retain-all-codepoint.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints-retain-gids.4E00,4E02,4E03.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints-retain-gids.4E00,4E02,4E03.otf
new file mode 100644 (file)
index 0000000..9a7689e
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints-retain-gids.4E00,4E02,4E03.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints-retain-gids.4E00,4E03.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints-retain-gids.4E00,4E03.otf
new file mode 100644 (file)
index 0000000..0e41c75
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints-retain-gids.4E00,4E03.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints-retain-gids.4E00,4E05,4E07.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints-retain-gids.4E00,4E05,4E07.otf
new file mode 100644 (file)
index 0000000..5830ba8
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints-retain-gids.4E00,4E05,4E07.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints-retain-gids.4E02,4E03,4E08.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints-retain-gids.4E02,4E03,4E08.otf
new file mode 100644 (file)
index 0000000..2b59c26
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints-retain-gids.4E02,4E03,4E08.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints-retain-gids.4E02.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints-retain-gids.4E02.otf
new file mode 100644 (file)
index 0000000..7883f60
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints-retain-gids.4E02.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints-retain-gids.4E03.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints-retain-gids.4E03.otf
new file mode 100644 (file)
index 0000000..0c61722
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints-retain-gids.4E03.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints-retain-gids.4E05,4E07,4E08,4E09.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints-retain-gids.4E05,4E07,4E08,4E09.otf
new file mode 100644 (file)
index 0000000..6be7ed3
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints-retain-gids.4E05,4E07,4E08,4E09.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints-retain-gids.4E08,4E09.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints-retain-gids.4E08,4E09.otf
new file mode 100644 (file)
index 0000000..7ff9072
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints-retain-gids.4E08,4E09.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints-retain-gids.4E08.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints-retain-gids.4E08.otf
new file mode 100644 (file)
index 0000000..4aac45a
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints-retain-gids.4E08.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints-retain-gids.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..0c8bdd4
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints-retain-gids.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints.4E00,4E02,4E03.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints.4E00,4E02,4E03.otf
new file mode 100644 (file)
index 0000000..bc44565
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints.4E00,4E02,4E03.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints.4E00,4E03.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints.4E00,4E03.otf
new file mode 100644 (file)
index 0000000..095724d
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints.4E00,4E03.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints.4E00,4E05,4E07.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints.4E00,4E05,4E07.otf
new file mode 100644 (file)
index 0000000..8deb80f
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints.4E00,4E05,4E07.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints.4E02,4E03,4E08.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints.4E02,4E03,4E08.otf
new file mode 100644 (file)
index 0000000..e03436c
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints.4E02,4E03,4E08.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints.4E02.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints.4E02.otf
new file mode 100644 (file)
index 0000000..6042d7e
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints.4E02.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints.4E03.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints.4E03.otf
new file mode 100644 (file)
index 0000000..e49657f
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints.4E03.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints.4E05,4E07,4E08,4E09.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints.4E05,4E07,4E08,4E09.otf
new file mode 100644 (file)
index 0000000..e4e2ad6
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints.4E05,4E07,4E08,4E09.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints.4E08,4E09.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints.4E08,4E09.otf
new file mode 100644 (file)
index 0000000..0187125
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints.4E08,4E09.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints.4E08.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints.4E08.otf
new file mode 100644 (file)
index 0000000..97cbc62
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints.4E08.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints.retain-all-codepoint.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..eda7a1f
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-drop-hints.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-gids.4E00,4E02,4E03.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-gids.4E00,4E02,4E03.otf
new file mode 100644 (file)
index 0000000..21cfd22
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-gids.4E00,4E02,4E03.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-gids.4E00,4E03.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-gids.4E00,4E03.otf
new file mode 100644 (file)
index 0000000..7bda9a9
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-gids.4E00,4E03.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-gids.4E00,4E05,4E07.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-gids.4E00,4E05,4E07.otf
new file mode 100644 (file)
index 0000000..7557554
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-gids.4E00,4E05,4E07.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-gids.4E02,4E03,4E08.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-gids.4E02,4E03,4E08.otf
new file mode 100644 (file)
index 0000000..4dc196a
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-gids.4E02,4E03,4E08.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-gids.4E02.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-gids.4E02.otf
new file mode 100644 (file)
index 0000000..bc54e22
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-gids.4E02.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-gids.4E03.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-gids.4E03.otf
new file mode 100644 (file)
index 0000000..c1de48f
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-gids.4E03.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-gids.4E05,4E07,4E08,4E09.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-gids.4E05,4E07,4E08,4E09.otf
new file mode 100644 (file)
index 0000000..d8d6f58
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-gids.4E05,4E07,4E08,4E09.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-gids.4E08,4E09.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-gids.4E08,4E09.otf
new file mode 100644 (file)
index 0000000..094a965
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-gids.4E08,4E09.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-gids.4E08.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-gids.4E08.otf
new file mode 100644 (file)
index 0000000..7128ec4
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-gids.4E08.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-gids.retain-all-codepoint.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-gids.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..89866d8
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-gids.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-name-ids.4E00,4E02,4E03.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-name-ids.4E00,4E02,4E03.otf
new file mode 100644 (file)
index 0000000..8d49034
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-name-ids.4E00,4E02,4E03.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-name-ids.4E00,4E03.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-name-ids.4E00,4E03.otf
new file mode 100644 (file)
index 0000000..10e0362
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-name-ids.4E00,4E03.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-name-ids.4E00,4E05,4E07.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-name-ids.4E00,4E05,4E07.otf
new file mode 100644 (file)
index 0000000..1e91545
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-name-ids.4E00,4E05,4E07.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-name-ids.4E02,4E03,4E08.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-name-ids.4E02,4E03,4E08.otf
new file mode 100644 (file)
index 0000000..0c60f01
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-name-ids.4E02,4E03,4E08.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-name-ids.4E02.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-name-ids.4E02.otf
new file mode 100644 (file)
index 0000000..ce7842c
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-name-ids.4E02.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-name-ids.4E03.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-name-ids.4E03.otf
new file mode 100644 (file)
index 0000000..da265e6
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-name-ids.4E03.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-name-ids.4E05,4E07,4E08,4E09.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-name-ids.4E05,4E07,4E08,4E09.otf
new file mode 100644 (file)
index 0000000..52018d6
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-name-ids.4E05,4E07,4E08,4E09.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-name-ids.4E08,4E09.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-name-ids.4E08,4E09.otf
new file mode 100644 (file)
index 0000000..0ba8353
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-name-ids.4E08,4E09.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-name-ids.4E08.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-name-ids.4E08.otf
new file mode 100644 (file)
index 0000000..4db7283
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-name-ids.4E08.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-name-ids.retain-all-codepoint.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-name-ids.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..803cbb6
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-name-ids.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-retain-gids.4E00,4E02,4E03.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-retain-gids.4E00,4E02,4E03.otf
new file mode 100644 (file)
index 0000000..62c8632
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-retain-gids.4E00,4E02,4E03.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-retain-gids.4E00,4E03.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-retain-gids.4E00,4E03.otf
new file mode 100644 (file)
index 0000000..1daaef8
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-retain-gids.4E00,4E03.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-retain-gids.4E00,4E05,4E07.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-retain-gids.4E00,4E05,4E07.otf
new file mode 100644 (file)
index 0000000..59f3b72
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-retain-gids.4E00,4E05,4E07.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-retain-gids.4E02,4E03,4E08.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-retain-gids.4E02,4E03,4E08.otf
new file mode 100644 (file)
index 0000000..1827c3f
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-retain-gids.4E02,4E03,4E08.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-retain-gids.4E02.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-retain-gids.4E02.otf
new file mode 100644 (file)
index 0000000..3e8d1d3
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-retain-gids.4E02.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-retain-gids.4E03.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-retain-gids.4E03.otf
new file mode 100644 (file)
index 0000000..ba0dbd2
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-retain-gids.4E03.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-retain-gids.4E05,4E07,4E08,4E09.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-retain-gids.4E05,4E07,4E08,4E09.otf
new file mode 100644 (file)
index 0000000..dafe03c
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-retain-gids.4E05,4E07,4E08,4E09.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-retain-gids.4E08,4E09.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-retain-gids.4E08,4E09.otf
new file mode 100644 (file)
index 0000000..e779116
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-retain-gids.4E08,4E09.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-retain-gids.4E08.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-retain-gids.4E08.otf
new file mode 100644 (file)
index 0000000..7497dae
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-retain-gids.4E08.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-retain-gids.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..22c1ca8
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline-retain-gids.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline.4E00,4E02,4E03.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline.4E00,4E02,4E03.otf
new file mode 100644 (file)
index 0000000..159a573
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline.4E00,4E02,4E03.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline.4E00,4E03.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline.4E00,4E03.otf
new file mode 100644 (file)
index 0000000..e21ca4f
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline.4E00,4E03.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline.4E00,4E05,4E07.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline.4E00,4E05,4E07.otf
new file mode 100644 (file)
index 0000000..fbd6256
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline.4E00,4E05,4E07.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline.4E02,4E03,4E08.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline.4E02,4E03,4E08.otf
new file mode 100644 (file)
index 0000000..1dc8d26
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline.4E02,4E03,4E08.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline.4E02.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline.4E02.otf
new file mode 100644 (file)
index 0000000..82fc8b4
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline.4E02.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline.4E03.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline.4E03.otf
new file mode 100644 (file)
index 0000000..b3f15b5
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline.4E03.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline.4E05,4E07,4E08,4E09.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline.4E05,4E07,4E08,4E09.otf
new file mode 100644 (file)
index 0000000..b9ef00e
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline.4E05,4E07,4E08,4E09.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline.4E08,4E09.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline.4E08,4E09.otf
new file mode 100644 (file)
index 0000000..77955aa
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline.4E08,4E09.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline.4E08.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline.4E08.otf
new file mode 100644 (file)
index 0000000..5b4433e
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline.4E08.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline.retain-all-codepoint.otf b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..b6a6e84
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.notdef-outline.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.retain-gids.4E00,4E02,4E03.otf b/test/subset/data/expected/cmap14/cmap14_font1.retain-gids.4E00,4E02,4E03.otf
deleted file mode 100644 (file)
index 5c5ce5c..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.retain-gids.4E00,4E02,4E03.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.retain-gids.4E00,4E03.otf b/test/subset/data/expected/cmap14/cmap14_font1.retain-gids.4E00,4E03.otf
deleted file mode 100644 (file)
index 3b87f54..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.retain-gids.4E00,4E03.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.retain-gids.4E00,4E05,4E07.otf b/test/subset/data/expected/cmap14/cmap14_font1.retain-gids.4E00,4E05,4E07.otf
deleted file mode 100644 (file)
index e06a24d..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.retain-gids.4E00,4E05,4E07.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.retain-gids.4E02,4E03,4E08.otf b/test/subset/data/expected/cmap14/cmap14_font1.retain-gids.4E02,4E03,4E08.otf
deleted file mode 100644 (file)
index aabdc5e..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.retain-gids.4E02,4E03,4E08.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.retain-gids.4E02.otf b/test/subset/data/expected/cmap14/cmap14_font1.retain-gids.4E02.otf
deleted file mode 100644 (file)
index 4183c9f..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.retain-gids.4E02.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.retain-gids.4E03.otf b/test/subset/data/expected/cmap14/cmap14_font1.retain-gids.4E03.otf
deleted file mode 100644 (file)
index 66ef901..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.retain-gids.4E03.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.retain-gids.4E05,4E07,4E08,4E09.otf b/test/subset/data/expected/cmap14/cmap14_font1.retain-gids.4E05,4E07,4E08,4E09.otf
deleted file mode 100644 (file)
index 4bee46f..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.retain-gids.4E05,4E07,4E08,4E09.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.retain-gids.4E08,4E09.otf b/test/subset/data/expected/cmap14/cmap14_font1.retain-gids.4E08,4E09.otf
deleted file mode 100644 (file)
index 6e8baa9..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.retain-gids.4E08,4E09.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.retain-gids.4E08.otf b/test/subset/data/expected/cmap14/cmap14_font1.retain-gids.4E08.otf
deleted file mode 100644 (file)
index f6191da..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.retain-gids.4E08.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font1.retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/cmap14/cmap14_font1.retain-gids.retain-all-codepoint.otf
deleted file mode 100644 (file)
index bf2746b..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font1.retain-gids.retain-all-codepoint.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.default.4E00,4E02,4E03.otf b/test/subset/data/expected/cmap14/cmap14_font2.default.4E00,4E02,4E03.otf
deleted file mode 100644 (file)
index 460e81b..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.default.4E00,4E02,4E03.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.default.4E00,4E03.otf b/test/subset/data/expected/cmap14/cmap14_font2.default.4E00,4E03.otf
deleted file mode 100644 (file)
index f6df4cf..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.default.4E00,4E03.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.default.4E00,4E05,4E07.otf b/test/subset/data/expected/cmap14/cmap14_font2.default.4E00,4E05,4E07.otf
deleted file mode 100644 (file)
index 5d15cd7..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.default.4E00,4E05,4E07.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.default.4E02,4E03,4E08.otf b/test/subset/data/expected/cmap14/cmap14_font2.default.4E02,4E03,4E08.otf
deleted file mode 100644 (file)
index 71bc4d6..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.default.4E02,4E03,4E08.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.default.4E02.otf b/test/subset/data/expected/cmap14/cmap14_font2.default.4E02.otf
deleted file mode 100644 (file)
index f28bd1d..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.default.4E02.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.default.4E03.otf b/test/subset/data/expected/cmap14/cmap14_font2.default.4E03.otf
deleted file mode 100644 (file)
index d4401c7..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.default.4E03.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.default.4E05,4E07,4E08,4E09.otf b/test/subset/data/expected/cmap14/cmap14_font2.default.4E05,4E07,4E08,4E09.otf
deleted file mode 100644 (file)
index 65c74c4..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.default.4E05,4E07,4E08,4E09.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.default.4E08,4E09.otf b/test/subset/data/expected/cmap14/cmap14_font2.default.4E08,4E09.otf
deleted file mode 100644 (file)
index 9794277..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.default.4E08,4E09.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.default.4E08.otf b/test/subset/data/expected/cmap14/cmap14_font2.default.4E08.otf
deleted file mode 100644 (file)
index dea9124..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.default.4E08.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.default.retain-all-codepoint.otf b/test/subset/data/expected/cmap14/cmap14_font2.default.retain-all-codepoint.otf
deleted file mode 100644 (file)
index 12365f4..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.default.retain-all-codepoint.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E00,4E02,4E03.otf b/test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E00,4E02,4E03.otf
deleted file mode 100644 (file)
index f7679f5..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E00,4E02,4E03.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E00,4E03.otf b/test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E00,4E03.otf
deleted file mode 100644 (file)
index 327f83f..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E00,4E03.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E00,4E05,4E07.otf b/test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E00,4E05,4E07.otf
deleted file mode 100644 (file)
index a3289fd..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E00,4E05,4E07.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E02,4E03,4E08.otf b/test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E02,4E03,4E08.otf
deleted file mode 100644 (file)
index d0ba860..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E02,4E03,4E08.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E02.otf b/test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E02.otf
deleted file mode 100644 (file)
index 9707490..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E02.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E03.otf b/test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E03.otf
deleted file mode 100644 (file)
index f5de519..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E03.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E05,4E07,4E08,4E09.otf b/test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E05,4E07,4E08,4E09.otf
deleted file mode 100644 (file)
index 9203411..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E05,4E07,4E08,4E09.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E08,4E09.otf b/test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E08,4E09.otf
deleted file mode 100644 (file)
index d7b13af..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E08,4E09.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E08.otf b/test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E08.otf
deleted file mode 100644 (file)
index ae141a6..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E08.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.retain-all-codepoint.otf
deleted file mode 100644 (file)
index 646ed6f..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.retain-all-codepoint.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E00,4E02,4E03.otf b/test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E00,4E02,4E03.otf
deleted file mode 100644 (file)
index 0493452..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E00,4E02,4E03.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E00,4E03.otf b/test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E00,4E03.otf
deleted file mode 100644 (file)
index 2322e5d..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E00,4E03.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E00,4E05,4E07.otf b/test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E00,4E05,4E07.otf
deleted file mode 100644 (file)
index 6b9edac..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E00,4E05,4E07.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E02,4E03,4E08.otf b/test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E02,4E03,4E08.otf
deleted file mode 100644 (file)
index 9f243b8..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E02,4E03,4E08.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E02.otf b/test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E02.otf
deleted file mode 100644 (file)
index 8954cd7..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E02.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E03.otf b/test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E03.otf
deleted file mode 100644 (file)
index e623928..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E03.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E05,4E07,4E08,4E09.otf b/test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E05,4E07,4E08,4E09.otf
deleted file mode 100644 (file)
index 51237ad..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E05,4E07,4E08,4E09.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E08,4E09.otf b/test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E08,4E09.otf
deleted file mode 100644 (file)
index e219c39..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E08,4E09.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E08.otf b/test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E08.otf
deleted file mode 100644 (file)
index 9fc0bda..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E08.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.drop-hints.retain-all-codepoint.otf b/test/subset/data/expected/cmap14/cmap14_font2.drop-hints.retain-all-codepoint.otf
deleted file mode 100644 (file)
index 02232ea..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.drop-hints.retain-all-codepoint.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.gids.4E00,4E02,4E03.otf b/test/subset/data/expected/cmap14/cmap14_font2.gids.4E00,4E02,4E03.otf
deleted file mode 100644 (file)
index f902287..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.gids.4E00,4E02,4E03.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.gids.4E00,4E03.otf b/test/subset/data/expected/cmap14/cmap14_font2.gids.4E00,4E03.otf
deleted file mode 100644 (file)
index 426f769..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.gids.4E00,4E03.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.gids.4E00,4E05,4E07.otf b/test/subset/data/expected/cmap14/cmap14_font2.gids.4E00,4E05,4E07.otf
deleted file mode 100644 (file)
index 0c2674a..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.gids.4E00,4E05,4E07.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.gids.4E02,4E03,4E08.otf b/test/subset/data/expected/cmap14/cmap14_font2.gids.4E02,4E03,4E08.otf
deleted file mode 100644 (file)
index a59de5d..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.gids.4E02,4E03,4E08.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.gids.4E02.otf b/test/subset/data/expected/cmap14/cmap14_font2.gids.4E02.otf
deleted file mode 100644 (file)
index 6a5a3a7..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.gids.4E02.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.gids.4E03.otf b/test/subset/data/expected/cmap14/cmap14_font2.gids.4E03.otf
deleted file mode 100644 (file)
index df159d0..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.gids.4E03.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.gids.4E05,4E07,4E08,4E09.otf b/test/subset/data/expected/cmap14/cmap14_font2.gids.4E05,4E07,4E08,4E09.otf
deleted file mode 100644 (file)
index 9b9f2b4..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.gids.4E05,4E07,4E08,4E09.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.gids.4E08,4E09.otf b/test/subset/data/expected/cmap14/cmap14_font2.gids.4E08,4E09.otf
deleted file mode 100644 (file)
index bbac4f5..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.gids.4E08,4E09.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.gids.4E08.otf b/test/subset/data/expected/cmap14/cmap14_font2.gids.4E08.otf
deleted file mode 100644 (file)
index 38b3fa8..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.gids.4E08.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.gids.retain-all-codepoint.otf b/test/subset/data/expected/cmap14/cmap14_font2.gids.retain-all-codepoint.otf
deleted file mode 100644 (file)
index 3996080..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.gids.retain-all-codepoint.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E00,4E02,4E03.otf b/test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E00,4E02,4E03.otf
deleted file mode 100644 (file)
index 021c980..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E00,4E02,4E03.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E00,4E03.otf b/test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E00,4E03.otf
deleted file mode 100644 (file)
index cf3a5b3..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E00,4E03.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E00,4E05,4E07.otf b/test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E00,4E05,4E07.otf
deleted file mode 100644 (file)
index 7c537c1..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E00,4E05,4E07.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E02,4E03,4E08.otf b/test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E02,4E03,4E08.otf
deleted file mode 100644 (file)
index f24488b..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E02,4E03,4E08.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E02.otf b/test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E02.otf
deleted file mode 100644 (file)
index 8d9e65a..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E02.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E03.otf b/test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E03.otf
deleted file mode 100644 (file)
index f2f5ba0..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E03.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E05,4E07,4E08,4E09.otf b/test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E05,4E07,4E08,4E09.otf
deleted file mode 100644 (file)
index aef4bd3..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E05,4E07,4E08,4E09.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E08,4E09.otf b/test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E08,4E09.otf
deleted file mode 100644 (file)
index f24ad1f..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E08,4E09.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E08.otf b/test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E08.otf
deleted file mode 100644 (file)
index 00c466f..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E08.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.name-ids.retain-all-codepoint.otf b/test/subset/data/expected/cmap14/cmap14_font2.name-ids.retain-all-codepoint.otf
deleted file mode 100644 (file)
index 86fe67b..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.name-ids.retain-all-codepoint.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints-retain-gids.4E00,4E02,4E03.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints-retain-gids.4E00,4E02,4E03.otf
new file mode 100644 (file)
index 0000000..b63b9e2
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints-retain-gids.4E00,4E02,4E03.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints-retain-gids.4E00,4E03.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints-retain-gids.4E00,4E03.otf
new file mode 100644 (file)
index 0000000..15818ed
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints-retain-gids.4E00,4E03.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints-retain-gids.4E00,4E05,4E07.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints-retain-gids.4E00,4E05,4E07.otf
new file mode 100644 (file)
index 0000000..74e2804
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints-retain-gids.4E00,4E05,4E07.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints-retain-gids.4E02,4E03,4E08.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints-retain-gids.4E02,4E03,4E08.otf
new file mode 100644 (file)
index 0000000..b7e6b17
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints-retain-gids.4E02,4E03,4E08.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints-retain-gids.4E02.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints-retain-gids.4E02.otf
new file mode 100644 (file)
index 0000000..a342c31
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints-retain-gids.4E02.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints-retain-gids.4E03.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints-retain-gids.4E03.otf
new file mode 100644 (file)
index 0000000..e4fcb04
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints-retain-gids.4E03.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints-retain-gids.4E05,4E07,4E08,4E09.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints-retain-gids.4E05,4E07,4E08,4E09.otf
new file mode 100644 (file)
index 0000000..04312b7
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints-retain-gids.4E05,4E07,4E08,4E09.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints-retain-gids.4E08,4E09.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints-retain-gids.4E08,4E09.otf
new file mode 100644 (file)
index 0000000..3b7cf7a
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints-retain-gids.4E08,4E09.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints-retain-gids.4E08.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints-retain-gids.4E08.otf
new file mode 100644 (file)
index 0000000..fdd065b
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints-retain-gids.4E08.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints-retain-gids.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..1cfbc63
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints-retain-gids.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints.4E00,4E02,4E03.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints.4E00,4E02,4E03.otf
new file mode 100644 (file)
index 0000000..27805f7
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints.4E00,4E02,4E03.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints.4E00,4E03.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints.4E00,4E03.otf
new file mode 100644 (file)
index 0000000..c54052f
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints.4E00,4E03.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints.4E00,4E05,4E07.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints.4E00,4E05,4E07.otf
new file mode 100644 (file)
index 0000000..ea4ea20
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints.4E00,4E05,4E07.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints.4E02,4E03,4E08.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints.4E02,4E03,4E08.otf
new file mode 100644 (file)
index 0000000..6e74624
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints.4E02,4E03,4E08.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints.4E02.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints.4E02.otf
new file mode 100644 (file)
index 0000000..e7992bf
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints.4E02.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints.4E03.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints.4E03.otf
new file mode 100644 (file)
index 0000000..f31ed37
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints.4E03.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints.4E05,4E07,4E08,4E09.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints.4E05,4E07,4E08,4E09.otf
new file mode 100644 (file)
index 0000000..6c3b011
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints.4E05,4E07,4E08,4E09.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints.4E08,4E09.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints.4E08,4E09.otf
new file mode 100644 (file)
index 0000000..dc5c3f7
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints.4E08,4E09.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints.4E08.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints.4E08.otf
new file mode 100644 (file)
index 0000000..516dd0e
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints.4E08.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints.retain-all-codepoint.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..31a1023
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-drop-hints.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-gids.4E00,4E02,4E03.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-gids.4E00,4E02,4E03.otf
new file mode 100644 (file)
index 0000000..3dcee76
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-gids.4E00,4E02,4E03.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-gids.4E00,4E03.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-gids.4E00,4E03.otf
new file mode 100644 (file)
index 0000000..8ce23a5
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-gids.4E00,4E03.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-gids.4E00,4E05,4E07.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-gids.4E00,4E05,4E07.otf
new file mode 100644 (file)
index 0000000..e2b6cf9
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-gids.4E00,4E05,4E07.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-gids.4E02,4E03,4E08.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-gids.4E02,4E03,4E08.otf
new file mode 100644 (file)
index 0000000..7aea89a
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-gids.4E02,4E03,4E08.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-gids.4E02.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-gids.4E02.otf
new file mode 100644 (file)
index 0000000..6156ca9
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-gids.4E02.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-gids.4E03.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-gids.4E03.otf
new file mode 100644 (file)
index 0000000..eb132d1
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-gids.4E03.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-gids.4E05,4E07,4E08,4E09.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-gids.4E05,4E07,4E08,4E09.otf
new file mode 100644 (file)
index 0000000..434d6d6
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-gids.4E05,4E07,4E08,4E09.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-gids.4E08,4E09.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-gids.4E08,4E09.otf
new file mode 100644 (file)
index 0000000..0dfaad4
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-gids.4E08,4E09.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-gids.4E08.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-gids.4E08.otf
new file mode 100644 (file)
index 0000000..6d72bbd
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-gids.4E08.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-gids.retain-all-codepoint.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-gids.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..76ecdba
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-gids.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-name-ids.4E00,4E02,4E03.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-name-ids.4E00,4E02,4E03.otf
new file mode 100644 (file)
index 0000000..387a7cc
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-name-ids.4E00,4E02,4E03.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-name-ids.4E00,4E03.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-name-ids.4E00,4E03.otf
new file mode 100644 (file)
index 0000000..c232dec
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-name-ids.4E00,4E03.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-name-ids.4E00,4E05,4E07.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-name-ids.4E00,4E05,4E07.otf
new file mode 100644 (file)
index 0000000..35b2f8d
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-name-ids.4E00,4E05,4E07.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-name-ids.4E02,4E03,4E08.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-name-ids.4E02,4E03,4E08.otf
new file mode 100644 (file)
index 0000000..b043082
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-name-ids.4E02,4E03,4E08.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-name-ids.4E02.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-name-ids.4E02.otf
new file mode 100644 (file)
index 0000000..3df697a
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-name-ids.4E02.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-name-ids.4E03.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-name-ids.4E03.otf
new file mode 100644 (file)
index 0000000..5719734
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-name-ids.4E03.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-name-ids.4E05,4E07,4E08,4E09.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-name-ids.4E05,4E07,4E08,4E09.otf
new file mode 100644 (file)
index 0000000..a15a74a
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-name-ids.4E05,4E07,4E08,4E09.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-name-ids.4E08,4E09.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-name-ids.4E08,4E09.otf
new file mode 100644 (file)
index 0000000..05bc0fb
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-name-ids.4E08,4E09.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-name-ids.4E08.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-name-ids.4E08.otf
new file mode 100644 (file)
index 0000000..26d7721
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-name-ids.4E08.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-name-ids.retain-all-codepoint.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-name-ids.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..7294e69
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-name-ids.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-retain-gids.4E00,4E02,4E03.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-retain-gids.4E00,4E02,4E03.otf
new file mode 100644 (file)
index 0000000..908dfd6
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-retain-gids.4E00,4E02,4E03.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-retain-gids.4E00,4E03.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-retain-gids.4E00,4E03.otf
new file mode 100644 (file)
index 0000000..4da6787
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-retain-gids.4E00,4E03.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-retain-gids.4E00,4E05,4E07.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-retain-gids.4E00,4E05,4E07.otf
new file mode 100644 (file)
index 0000000..dad8165
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-retain-gids.4E00,4E05,4E07.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-retain-gids.4E02,4E03,4E08.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-retain-gids.4E02,4E03,4E08.otf
new file mode 100644 (file)
index 0000000..7788698
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-retain-gids.4E02,4E03,4E08.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-retain-gids.4E02.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-retain-gids.4E02.otf
new file mode 100644 (file)
index 0000000..85c157f
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-retain-gids.4E02.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-retain-gids.4E03.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-retain-gids.4E03.otf
new file mode 100644 (file)
index 0000000..8ffddaa
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-retain-gids.4E03.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-retain-gids.4E05,4E07,4E08,4E09.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-retain-gids.4E05,4E07,4E08,4E09.otf
new file mode 100644 (file)
index 0000000..1fb7a4c
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-retain-gids.4E05,4E07,4E08,4E09.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-retain-gids.4E08,4E09.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-retain-gids.4E08,4E09.otf
new file mode 100644 (file)
index 0000000..f446067
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-retain-gids.4E08,4E09.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-retain-gids.4E08.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-retain-gids.4E08.otf
new file mode 100644 (file)
index 0000000..7c2ea2e
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-retain-gids.4E08.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-retain-gids.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..10e5374
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline-retain-gids.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline.4E00,4E02,4E03.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline.4E00,4E02,4E03.otf
new file mode 100644 (file)
index 0000000..e4d4b36
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline.4E00,4E02,4E03.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline.4E00,4E03.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline.4E00,4E03.otf
new file mode 100644 (file)
index 0000000..31dbcd9
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline.4E00,4E03.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline.4E00,4E05,4E07.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline.4E00,4E05,4E07.otf
new file mode 100644 (file)
index 0000000..8a708ba
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline.4E00,4E05,4E07.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline.4E02,4E03,4E08.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline.4E02,4E03,4E08.otf
new file mode 100644 (file)
index 0000000..dee6213
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline.4E02,4E03,4E08.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline.4E02.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline.4E02.otf
new file mode 100644 (file)
index 0000000..b8d991e
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline.4E02.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline.4E03.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline.4E03.otf
new file mode 100644 (file)
index 0000000..a939f5a
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline.4E03.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline.4E05,4E07,4E08,4E09.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline.4E05,4E07,4E08,4E09.otf
new file mode 100644 (file)
index 0000000..ef379a0
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline.4E05,4E07,4E08,4E09.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline.4E08,4E09.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline.4E08,4E09.otf
new file mode 100644 (file)
index 0000000..aac127a
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline.4E08,4E09.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline.4E08.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline.4E08.otf
new file mode 100644 (file)
index 0000000..b4461a4
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline.4E08.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline.retain-all-codepoint.otf b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..2c3cfd4
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.notdef-outline.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E00,4E02,4E03.otf b/test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E00,4E02,4E03.otf
deleted file mode 100644 (file)
index 0bc930a..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E00,4E02,4E03.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E00,4E03.otf b/test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E00,4E03.otf
deleted file mode 100644 (file)
index 9746b45..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E00,4E03.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E00,4E05,4E07.otf b/test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E00,4E05,4E07.otf
deleted file mode 100644 (file)
index 2d378d8..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E00,4E05,4E07.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E02,4E03,4E08.otf b/test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E02,4E03,4E08.otf
deleted file mode 100644 (file)
index 42ada2e..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E02,4E03,4E08.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E02.otf b/test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E02.otf
deleted file mode 100644 (file)
index 7e4cf58..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E02.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E03.otf b/test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E03.otf
deleted file mode 100644 (file)
index 846fee5..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E03.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E05,4E07,4E08,4E09.otf b/test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E05,4E07,4E08,4E09.otf
deleted file mode 100644 (file)
index 018805c..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E05,4E07,4E08,4E09.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E08,4E09.otf b/test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E08,4E09.otf
deleted file mode 100644 (file)
index 1945b0b..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E08,4E09.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E08.otf b/test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E08.otf
deleted file mode 100644 (file)
index f45fda1..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E08.otf and /dev/null differ
diff --git a/test/subset/data/expected/cmap14/cmap14_font2.retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/cmap14/cmap14_font2.retain-gids.retain-all-codepoint.otf
deleted file mode 100644 (file)
index ac622b6..0000000
Binary files a/test/subset/data/expected/cmap14/cmap14_font2.retain-gids.retain-all-codepoint.otf and /dev/null differ
index d8165b3..5045cb3 100644 (file)
Binary files a/test/subset/data/expected/colr/TwemojiMozilla.subset.default.32,3297,3299.ttf and b/test/subset/data/expected/colr/TwemojiMozilla.subset.default.32,3297,3299.ttf differ
index a1c29de..f911e0e 100644 (file)
Binary files a/test/subset/data/expected/colr/TwemojiMozilla.subset.default.32,3297.ttf and b/test/subset/data/expected/colr/TwemojiMozilla.subset.default.32,3297.ttf differ
index be3a53d..ea7411a 100644 (file)
Binary files a/test/subset/data/expected/colr/TwemojiMozilla.subset.default.32,3299.ttf and b/test/subset/data/expected/colr/TwemojiMozilla.subset.default.32,3299.ttf differ
index 136e15d..9ac8407 100644 (file)
Binary files a/test/subset/data/expected/colr/TwemojiMozilla.subset.default.32.ttf and b/test/subset/data/expected/colr/TwemojiMozilla.subset.default.32.ttf differ
index 3ebe1c9..d3fc1d2 100644 (file)
Binary files a/test/subset/data/expected/colr/TwemojiMozilla.subset.default.3297,3299.ttf and b/test/subset/data/expected/colr/TwemojiMozilla.subset.default.3297,3299.ttf differ
index 09e5056..7119a37 100644 (file)
Binary files a/test/subset/data/expected/colr/TwemojiMozilla.subset.default.3297.ttf and b/test/subset/data/expected/colr/TwemojiMozilla.subset.default.3297.ttf differ
index f11b8c3..98a36ef 100644 (file)
Binary files a/test/subset/data/expected/colr/TwemojiMozilla.subset.default.3299.ttf and b/test/subset/data/expected/colr/TwemojiMozilla.subset.default.3299.ttf differ
index 07968d0..65547c3 100644 (file)
Binary files a/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints-retain-gids.32,3297,3299.ttf and b/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints-retain-gids.32,3297,3299.ttf differ
index add6a09..00eb43e 100644 (file)
Binary files a/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints-retain-gids.32,3297.ttf and b/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints-retain-gids.32,3297.ttf differ
index f9b9c7d..7d6e3c0 100644 (file)
Binary files a/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints-retain-gids.32,3299.ttf and b/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints-retain-gids.32,3299.ttf differ
index f69b0c5..81e540e 100644 (file)
Binary files a/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints-retain-gids.32.ttf and b/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints-retain-gids.32.ttf differ
index 78ae5ce..7e87237 100644 (file)
Binary files a/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints-retain-gids.3297,3299.ttf and b/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints-retain-gids.3297,3299.ttf differ
index cce38b5..b1c100e 100644 (file)
Binary files a/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints-retain-gids.3297.ttf and b/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints-retain-gids.3297.ttf differ
index 0abccae..1e63412 100644 (file)
Binary files a/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints-retain-gids.3299.ttf and b/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints-retain-gids.3299.ttf differ
index 07968d0..65547c3 100644 (file)
Binary files a/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints.32,3297,3299.ttf and b/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints.32,3297,3299.ttf differ
index a3c6c89..7cc71b1 100644 (file)
Binary files a/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints.32,3297.ttf and b/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints.32,3297.ttf differ
index 378c04a..2c5d33c 100644 (file)
Binary files a/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints.32,3299.ttf and b/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints.32,3299.ttf differ
index f69b0c5..81e540e 100644 (file)
Binary files a/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints.32.ttf and b/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints.32.ttf differ
index bde72d8..275d198 100644 (file)
Binary files a/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints.3297,3299.ttf and b/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints.3297,3299.ttf differ
index f412189..73e6b97 100644 (file)
Binary files a/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints.3297.ttf and b/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints.3297.ttf differ
index 3e92ac2..30ed3b8 100644 (file)
Binary files a/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints.3299.ttf and b/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints.3299.ttf differ
index d8165b3..5045cb3 100644 (file)
Binary files a/test/subset/data/expected/colr/TwemojiMozilla.subset.retain-gids.32,3297,3299.ttf and b/test/subset/data/expected/colr/TwemojiMozilla.subset.retain-gids.32,3297,3299.ttf differ
index ab9f5d3..1fad08b 100644 (file)
Binary files a/test/subset/data/expected/colr/TwemojiMozilla.subset.retain-gids.32,3297.ttf and b/test/subset/data/expected/colr/TwemojiMozilla.subset.retain-gids.32,3297.ttf differ
index 4e7fdba..adb431c 100644 (file)
Binary files a/test/subset/data/expected/colr/TwemojiMozilla.subset.retain-gids.32,3299.ttf and b/test/subset/data/expected/colr/TwemojiMozilla.subset.retain-gids.32,3299.ttf differ
index 136e15d..9ac8407 100644 (file)
Binary files a/test/subset/data/expected/colr/TwemojiMozilla.subset.retain-gids.32.ttf and b/test/subset/data/expected/colr/TwemojiMozilla.subset.retain-gids.32.ttf differ
index dd78315..3d01daa 100644 (file)
Binary files a/test/subset/data/expected/colr/TwemojiMozilla.subset.retain-gids.3297,3299.ttf and b/test/subset/data/expected/colr/TwemojiMozilla.subset.retain-gids.3297,3299.ttf differ
index d440ba0..7823ed8 100644 (file)
Binary files a/test/subset/data/expected/colr/TwemojiMozilla.subset.retain-gids.3297.ttf and b/test/subset/data/expected/colr/TwemojiMozilla.subset.retain-gids.3297.ttf differ
index 7f256e0..c8d4ccd 100644 (file)
Binary files a/test/subset/data/expected/colr/TwemojiMozilla.subset.retain-gids.3299.ttf and b/test/subset/data/expected/colr/TwemojiMozilla.subset.retain-gids.3299.ttf differ
diff --git a/test/subset/data/expected/colr_glyphs/BungeeColor-Regular.default.41.ttf b/test/subset/data/expected/colr_glyphs/BungeeColor-Regular.default.41.ttf
new file mode 100644 (file)
index 0000000..0c9c42f
Binary files /dev/null and b/test/subset/data/expected/colr_glyphs/BungeeColor-Regular.default.41.ttf differ
diff --git a/test/subset/data/expected/colr_glyphs/BungeeColor-Regular.drop-hints-retain-gids.41.ttf b/test/subset/data/expected/colr_glyphs/BungeeColor-Regular.drop-hints-retain-gids.41.ttf
new file mode 100644 (file)
index 0000000..d676e52
Binary files /dev/null and b/test/subset/data/expected/colr_glyphs/BungeeColor-Regular.drop-hints-retain-gids.41.ttf differ
diff --git a/test/subset/data/expected/colr_glyphs/BungeeColor-Regular.drop-hints.41.ttf b/test/subset/data/expected/colr_glyphs/BungeeColor-Regular.drop-hints.41.ttf
new file mode 100644 (file)
index 0000000..96c0396
Binary files /dev/null and b/test/subset/data/expected/colr_glyphs/BungeeColor-Regular.drop-hints.41.ttf differ
diff --git a/test/subset/data/expected/colr_glyphs/BungeeColor-Regular.retain-gids.41.ttf b/test/subset/data/expected/colr_glyphs/BungeeColor-Regular.retain-gids.41.ttf
new file mode 100644 (file)
index 0000000..d15499e
Binary files /dev/null and b/test/subset/data/expected/colr_glyphs/BungeeColor-Regular.retain-gids.41.ttf differ
diff --git a/test/subset/data/expected/colr_with_components/colr-table.default.6B.ttf b/test/subset/data/expected/colr_with_components/colr-table.default.6B.ttf
new file mode 100644 (file)
index 0000000..67020e2
Binary files /dev/null and b/test/subset/data/expected/colr_with_components/colr-table.default.6B.ttf differ
diff --git a/test/subset/data/expected/colr_with_components/colr-table.drop-hints-retain-gids.6B.ttf b/test/subset/data/expected/colr_with_components/colr-table.drop-hints-retain-gids.6B.ttf
new file mode 100644 (file)
index 0000000..a2be484
Binary files /dev/null and b/test/subset/data/expected/colr_with_components/colr-table.drop-hints-retain-gids.6B.ttf differ
diff --git a/test/subset/data/expected/colr_with_components/colr-table.drop-hints.6B.ttf b/test/subset/data/expected/colr_with_components/colr-table.drop-hints.6B.ttf
new file mode 100644 (file)
index 0000000..67020e2
Binary files /dev/null and b/test/subset/data/expected/colr_with_components/colr-table.drop-hints.6B.ttf differ
diff --git a/test/subset/data/expected/colr_with_components/colr-table.retain-gids.6B.ttf b/test/subset/data/expected/colr_with_components/colr-table.retain-gids.6B.ttf
new file mode 100644 (file)
index 0000000..a2be484
Binary files /dev/null and b/test/subset/data/expected/colr_with_components/colr-table.retain-gids.6B.ttf differ
diff --git a/test/subset/data/expected/colrv1/TestCOLRv1.default.E000,E001,E002,E003.ttf b/test/subset/data/expected/colrv1/TestCOLRv1.default.E000,E001,E002,E003.ttf
new file mode 100644 (file)
index 0000000..c7fafc1
Binary files /dev/null and b/test/subset/data/expected/colrv1/TestCOLRv1.default.E000,E001,E002,E003.ttf differ
diff --git a/test/subset/data/expected/colrv1/TestCOLRv1.default.E000,E001,E002.ttf b/test/subset/data/expected/colrv1/TestCOLRv1.default.E000,E001,E002.ttf
new file mode 100644 (file)
index 0000000..78634bb
Binary files /dev/null and b/test/subset/data/expected/colrv1/TestCOLRv1.default.E000,E001,E002.ttf differ
diff --git a/test/subset/data/expected/colrv1/TestCOLRv1.default.E000,E001.ttf b/test/subset/data/expected/colrv1/TestCOLRv1.default.E000,E001.ttf
new file mode 100644 (file)
index 0000000..7a490cb
Binary files /dev/null and b/test/subset/data/expected/colrv1/TestCOLRv1.default.E000,E001.ttf differ
diff --git a/test/subset/data/expected/colrv1/TestCOLRv1.default.E000,E004.ttf b/test/subset/data/expected/colrv1/TestCOLRv1.default.E000,E004.ttf
new file mode 100644 (file)
index 0000000..bab0b4f
Binary files /dev/null and b/test/subset/data/expected/colrv1/TestCOLRv1.default.E000,E004.ttf differ
diff --git a/test/subset/data/expected/colrv1/TestCOLRv1.default.E000.ttf b/test/subset/data/expected/colrv1/TestCOLRv1.default.E000.ttf
new file mode 100644 (file)
index 0000000..764be9b
Binary files /dev/null and b/test/subset/data/expected/colrv1/TestCOLRv1.default.E000.ttf differ
diff --git a/test/subset/data/expected/colrv1/TestCOLRv1.default.E001.ttf b/test/subset/data/expected/colrv1/TestCOLRv1.default.E001.ttf
new file mode 100644 (file)
index 0000000..0a381b7
Binary files /dev/null and b/test/subset/data/expected/colrv1/TestCOLRv1.default.E001.ttf differ
diff --git a/test/subset/data/expected/colrv1/TestCOLRv1.default.E002,E003,E004.ttf b/test/subset/data/expected/colrv1/TestCOLRv1.default.E002,E003,E004.ttf
new file mode 100644 (file)
index 0000000..7d094e0
Binary files /dev/null and b/test/subset/data/expected/colrv1/TestCOLRv1.default.E002,E003,E004.ttf differ
diff --git a/test/subset/data/expected/colrv1/TestCOLRv1.default.E002,E003.ttf b/test/subset/data/expected/colrv1/TestCOLRv1.default.E002,E003.ttf
new file mode 100644 (file)
index 0000000..82dd4b9
Binary files /dev/null and b/test/subset/data/expected/colrv1/TestCOLRv1.default.E002,E003.ttf differ
diff --git a/test/subset/data/expected/colrv1/TestCOLRv1.default.E002.ttf b/test/subset/data/expected/colrv1/TestCOLRv1.default.E002.ttf
new file mode 100644 (file)
index 0000000..c2e76cc
Binary files /dev/null and b/test/subset/data/expected/colrv1/TestCOLRv1.default.E002.ttf differ
diff --git a/test/subset/data/expected/colrv1/TestCOLRv1.default.E003,E004.ttf b/test/subset/data/expected/colrv1/TestCOLRv1.default.E003,E004.ttf
new file mode 100644 (file)
index 0000000..af8c79b
Binary files /dev/null and b/test/subset/data/expected/colrv1/TestCOLRv1.default.E003,E004.ttf differ
diff --git a/test/subset/data/expected/colrv1/TestCOLRv1.default.E003.ttf b/test/subset/data/expected/colrv1/TestCOLRv1.default.E003.ttf
new file mode 100644 (file)
index 0000000..2ea7578
Binary files /dev/null and b/test/subset/data/expected/colrv1/TestCOLRv1.default.E003.ttf differ
diff --git a/test/subset/data/expected/colrv1/TestCOLRv1.default.E004.ttf b/test/subset/data/expected/colrv1/TestCOLRv1.default.E004.ttf
new file mode 100644 (file)
index 0000000..d547667
Binary files /dev/null and b/test/subset/data/expected/colrv1/TestCOLRv1.default.E004.ttf differ
diff --git a/test/subset/data/expected/colrv1/TestCOLRv1.default.retain-all-codepoint.ttf b/test/subset/data/expected/colrv1/TestCOLRv1.default.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..b0e9865
Binary files /dev/null and b/test/subset/data/expected/colrv1/TestCOLRv1.default.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints-retain-gids.E000,E001,E002,E003.ttf b/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints-retain-gids.E000,E001,E002,E003.ttf
new file mode 100644 (file)
index 0000000..929a9ed
Binary files /dev/null and b/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints-retain-gids.E000,E001,E002,E003.ttf differ
diff --git a/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints-retain-gids.E000,E001,E002.ttf b/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints-retain-gids.E000,E001,E002.ttf
new file mode 100644 (file)
index 0000000..5516df3
Binary files /dev/null and b/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints-retain-gids.E000,E001,E002.ttf differ
diff --git a/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints-retain-gids.E000,E001.ttf b/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints-retain-gids.E000,E001.ttf
new file mode 100644 (file)
index 0000000..d529046
Binary files /dev/null and b/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints-retain-gids.E000,E001.ttf differ
diff --git a/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints-retain-gids.E000,E004.ttf b/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints-retain-gids.E000,E004.ttf
new file mode 100644 (file)
index 0000000..3e9abac
Binary files /dev/null and b/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints-retain-gids.E000,E004.ttf differ
diff --git a/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints-retain-gids.E000.ttf b/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints-retain-gids.E000.ttf
new file mode 100644 (file)
index 0000000..f5f0e0b
Binary files /dev/null and b/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints-retain-gids.E000.ttf differ
diff --git a/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints-retain-gids.E001.ttf b/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints-retain-gids.E001.ttf
new file mode 100644 (file)
index 0000000..a98ed2e
Binary files /dev/null and b/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints-retain-gids.E001.ttf differ
diff --git a/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints-retain-gids.E002,E003,E004.ttf b/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints-retain-gids.E002,E003,E004.ttf
new file mode 100644 (file)
index 0000000..25b5aed
Binary files /dev/null and b/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints-retain-gids.E002,E003,E004.ttf differ
diff --git a/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints-retain-gids.E002,E003.ttf b/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints-retain-gids.E002,E003.ttf
new file mode 100644 (file)
index 0000000..b8b3e90
Binary files /dev/null and b/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints-retain-gids.E002,E003.ttf differ
diff --git a/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints-retain-gids.E002.ttf b/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints-retain-gids.E002.ttf
new file mode 100644 (file)
index 0000000..85e2f68
Binary files /dev/null and b/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints-retain-gids.E002.ttf differ
diff --git a/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints-retain-gids.E003,E004.ttf b/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints-retain-gids.E003,E004.ttf
new file mode 100644 (file)
index 0000000..f983408
Binary files /dev/null and b/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints-retain-gids.E003,E004.ttf differ
diff --git a/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints-retain-gids.E003.ttf b/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints-retain-gids.E003.ttf
new file mode 100644 (file)
index 0000000..907da5f
Binary files /dev/null and b/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints-retain-gids.E003.ttf differ
diff --git a/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints-retain-gids.E004.ttf b/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints-retain-gids.E004.ttf
new file mode 100644 (file)
index 0000000..66528df
Binary files /dev/null and b/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints-retain-gids.E004.ttf differ
diff --git a/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints-retain-gids.retain-all-codepoint.ttf b/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints-retain-gids.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..ec3ddec
Binary files /dev/null and b/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints-retain-gids.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints.E000,E001,E002,E003.ttf b/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints.E000,E001,E002,E003.ttf
new file mode 100644 (file)
index 0000000..714c9c8
Binary files /dev/null and b/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints.E000,E001,E002,E003.ttf differ
diff --git a/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints.E000,E001,E002.ttf b/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints.E000,E001,E002.ttf
new file mode 100644 (file)
index 0000000..437a67d
Binary files /dev/null and b/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints.E000,E001,E002.ttf differ
diff --git a/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints.E000,E001.ttf b/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints.E000,E001.ttf
new file mode 100644 (file)
index 0000000..2729c8d
Binary files /dev/null and b/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints.E000,E001.ttf differ
diff --git a/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints.E000,E004.ttf b/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints.E000,E004.ttf
new file mode 100644 (file)
index 0000000..2c87b3d
Binary files /dev/null and b/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints.E000,E004.ttf differ
diff --git a/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints.E000.ttf b/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints.E000.ttf
new file mode 100644 (file)
index 0000000..56e3835
Binary files /dev/null and b/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints.E000.ttf differ
diff --git a/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints.E001.ttf b/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints.E001.ttf
new file mode 100644 (file)
index 0000000..80d281f
Binary files /dev/null and b/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints.E001.ttf differ
diff --git a/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints.E002,E003,E004.ttf b/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints.E002,E003,E004.ttf
new file mode 100644 (file)
index 0000000..dde87f7
Binary files /dev/null and b/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints.E002,E003,E004.ttf differ
diff --git a/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints.E002,E003.ttf b/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints.E002,E003.ttf
new file mode 100644 (file)
index 0000000..b06cf18
Binary files /dev/null and b/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints.E002,E003.ttf differ
diff --git a/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints.E002.ttf b/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints.E002.ttf
new file mode 100644 (file)
index 0000000..89520f0
Binary files /dev/null and b/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints.E002.ttf differ
diff --git a/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints.E003,E004.ttf b/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints.E003,E004.ttf
new file mode 100644 (file)
index 0000000..50be561
Binary files /dev/null and b/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints.E003,E004.ttf differ
diff --git a/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints.E003.ttf b/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints.E003.ttf
new file mode 100644 (file)
index 0000000..b05b82b
Binary files /dev/null and b/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints.E003.ttf differ
diff --git a/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints.E004.ttf b/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints.E004.ttf
new file mode 100644 (file)
index 0000000..f6a12e2
Binary files /dev/null and b/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints.E004.ttf differ
diff --git a/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints.retain-all-codepoint.ttf b/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..ec3ddec
Binary files /dev/null and b/test/subset/data/expected/colrv1/TestCOLRv1.drop-hints.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/colrv1/TestCOLRv1.retain-gids.E000,E001,E002,E003.ttf b/test/subset/data/expected/colrv1/TestCOLRv1.retain-gids.E000,E001,E002,E003.ttf
new file mode 100644 (file)
index 0000000..ff537f1
Binary files /dev/null and b/test/subset/data/expected/colrv1/TestCOLRv1.retain-gids.E000,E001,E002,E003.ttf differ
diff --git a/test/subset/data/expected/colrv1/TestCOLRv1.retain-gids.E000,E001,E002.ttf b/test/subset/data/expected/colrv1/TestCOLRv1.retain-gids.E000,E001,E002.ttf
new file mode 100644 (file)
index 0000000..e548a8b
Binary files /dev/null and b/test/subset/data/expected/colrv1/TestCOLRv1.retain-gids.E000,E001,E002.ttf differ
diff --git a/test/subset/data/expected/colrv1/TestCOLRv1.retain-gids.E000,E001.ttf b/test/subset/data/expected/colrv1/TestCOLRv1.retain-gids.E000,E001.ttf
new file mode 100644 (file)
index 0000000..cb5a94d
Binary files /dev/null and b/test/subset/data/expected/colrv1/TestCOLRv1.retain-gids.E000,E001.ttf differ
diff --git a/test/subset/data/expected/colrv1/TestCOLRv1.retain-gids.E000,E004.ttf b/test/subset/data/expected/colrv1/TestCOLRv1.retain-gids.E000,E004.ttf
new file mode 100644 (file)
index 0000000..5d72345
Binary files /dev/null and b/test/subset/data/expected/colrv1/TestCOLRv1.retain-gids.E000,E004.ttf differ
diff --git a/test/subset/data/expected/colrv1/TestCOLRv1.retain-gids.E000.ttf b/test/subset/data/expected/colrv1/TestCOLRv1.retain-gids.E000.ttf
new file mode 100644 (file)
index 0000000..fe1a85c
Binary files /dev/null and b/test/subset/data/expected/colrv1/TestCOLRv1.retain-gids.E000.ttf differ
diff --git a/test/subset/data/expected/colrv1/TestCOLRv1.retain-gids.E001.ttf b/test/subset/data/expected/colrv1/TestCOLRv1.retain-gids.E001.ttf
new file mode 100644 (file)
index 0000000..f25586a
Binary files /dev/null and b/test/subset/data/expected/colrv1/TestCOLRv1.retain-gids.E001.ttf differ
diff --git a/test/subset/data/expected/colrv1/TestCOLRv1.retain-gids.E002,E003,E004.ttf b/test/subset/data/expected/colrv1/TestCOLRv1.retain-gids.E002,E003,E004.ttf
new file mode 100644 (file)
index 0000000..549b52d
Binary files /dev/null and b/test/subset/data/expected/colrv1/TestCOLRv1.retain-gids.E002,E003,E004.ttf differ
diff --git a/test/subset/data/expected/colrv1/TestCOLRv1.retain-gids.E002,E003.ttf b/test/subset/data/expected/colrv1/TestCOLRv1.retain-gids.E002,E003.ttf
new file mode 100644 (file)
index 0000000..bc43627
Binary files /dev/null and b/test/subset/data/expected/colrv1/TestCOLRv1.retain-gids.E002,E003.ttf differ
diff --git a/test/subset/data/expected/colrv1/TestCOLRv1.retain-gids.E002.ttf b/test/subset/data/expected/colrv1/TestCOLRv1.retain-gids.E002.ttf
new file mode 100644 (file)
index 0000000..f99b3dd
Binary files /dev/null and b/test/subset/data/expected/colrv1/TestCOLRv1.retain-gids.E002.ttf differ
diff --git a/test/subset/data/expected/colrv1/TestCOLRv1.retain-gids.E003,E004.ttf b/test/subset/data/expected/colrv1/TestCOLRv1.retain-gids.E003,E004.ttf
new file mode 100644 (file)
index 0000000..ec25389
Binary files /dev/null and b/test/subset/data/expected/colrv1/TestCOLRv1.retain-gids.E003,E004.ttf differ
diff --git a/test/subset/data/expected/colrv1/TestCOLRv1.retain-gids.E003.ttf b/test/subset/data/expected/colrv1/TestCOLRv1.retain-gids.E003.ttf
new file mode 100644 (file)
index 0000000..4e6ef19
Binary files /dev/null and b/test/subset/data/expected/colrv1/TestCOLRv1.retain-gids.E003.ttf differ
diff --git a/test/subset/data/expected/colrv1/TestCOLRv1.retain-gids.E004.ttf b/test/subset/data/expected/colrv1/TestCOLRv1.retain-gids.E004.ttf
new file mode 100644 (file)
index 0000000..756ea5f
Binary files /dev/null and b/test/subset/data/expected/colrv1/TestCOLRv1.retain-gids.E004.ttf differ
diff --git a/test/subset/data/expected/colrv1/TestCOLRv1.retain-gids.retain-all-codepoint.ttf b/test/subset/data/expected/colrv1/TestCOLRv1.retain-gids.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..b0e9865
Binary files /dev/null and b/test/subset/data/expected/colrv1/TestCOLRv1.retain-gids.retain-all-codepoint.ttf differ
index cf126ce..95852e3 100644 (file)
Binary files a/test/subset/data/expected/full-font/Roboto-Regular.default.1FC,21,41,20,62,63.ttf and b/test/subset/data/expected/full-font/Roboto-Regular.default.1FC,21,41,20,62,63.ttf differ
index 0bc7d80..e2fe6e6 100644 (file)
Binary files a/test/subset/data/expected/full-font/Roboto-Regular.default.61,62,63.ttf and b/test/subset/data/expected/full-font/Roboto-Regular.default.61,62,63.ttf differ
index 1dae8e5..372c13b 100644 (file)
Binary files a/test/subset/data/expected/full-font/Roboto-Regular.default.D7,D8,D9,DA,DE.ttf and b/test/subset/data/expected/full-font/Roboto-Regular.default.D7,D8,D9,DA,DE.ttf differ
index 03459bc..d1fd6d5 100644 (file)
Binary files a/test/subset/data/expected/full-font/Roboto-Regular.drop-hints.1FC,21,41,20,62,63.ttf and b/test/subset/data/expected/full-font/Roboto-Regular.drop-hints.1FC,21,41,20,62,63.ttf differ
index 46d88cf..429e4ce 100644 (file)
Binary files a/test/subset/data/expected/full-font/Roboto-Regular.drop-hints.61,62,63.ttf and b/test/subset/data/expected/full-font/Roboto-Regular.drop-hints.61,62,63.ttf differ
index 91f4682..6f7c0c1 100644 (file)
Binary files a/test/subset/data/expected/full-font/Roboto-Regular.drop-hints.D7,D8,D9,DA,DE.ttf and b/test/subset/data/expected/full-font/Roboto-Regular.drop-hints.D7,D8,D9,DA,DE.ttf differ
index 91da5dd..43edc2c 100644 (file)
Binary files a/test/subset/data/expected/full-font/SourceSerifVariable-Roman.default.1FC,21,41,20,62,63.ttf and b/test/subset/data/expected/full-font/SourceSerifVariable-Roman.default.1FC,21,41,20,62,63.ttf differ
index 175e856..d049757 100644 (file)
Binary files a/test/subset/data/expected/full-font/SourceSerifVariable-Roman.default.61,62,63.ttf and b/test/subset/data/expected/full-font/SourceSerifVariable-Roman.default.61,62,63.ttf differ
index b966f04..205e9a8 100644 (file)
Binary files a/test/subset/data/expected/full-font/SourceSerifVariable-Roman.default.D7,D8,D9,DA,DE.ttf and b/test/subset/data/expected/full-font/SourceSerifVariable-Roman.default.D7,D8,D9,DA,DE.ttf differ
index 91da5dd..930d871 100644 (file)
Binary files a/test/subset/data/expected/full-font/SourceSerifVariable-Roman.drop-hints.1FC,21,41,20,62,63.ttf and b/test/subset/data/expected/full-font/SourceSerifVariable-Roman.drop-hints.1FC,21,41,20,62,63.ttf differ
index 175e856..d049757 100644 (file)
Binary files a/test/subset/data/expected/full-font/SourceSerifVariable-Roman.drop-hints.61,62,63.ttf and b/test/subset/data/expected/full-font/SourceSerifVariable-Roman.drop-hints.61,62,63.ttf differ
index b966f04..205e9a8 100644 (file)
Binary files a/test/subset/data/expected/full-font/SourceSerifVariable-Roman.drop-hints.D7,D8,D9,DA,DE.ttf and b/test/subset/data/expected/full-font/SourceSerifVariable-Roman.drop-hints.D7,D8,D9,DA,DE.ttf differ
diff --git a/test/subset/data/expected/glyf_bug_3131/glyf_bug_3131.drop-hints-retain-gids.63,64,65,6F,70,71,72.ttf b/test/subset/data/expected/glyf_bug_3131/glyf_bug_3131.drop-hints-retain-gids.63,64,65,6F,70,71,72.ttf
new file mode 100644 (file)
index 0000000..8ba3b02
Binary files /dev/null and b/test/subset/data/expected/glyf_bug_3131/glyf_bug_3131.drop-hints-retain-gids.63,64,65,6F,70,71,72.ttf differ
diff --git a/test/subset/data/expected/glyf_bug_3131/glyf_bug_3131.drop-hints-retain-gids.retain-all-codepoint.ttf b/test/subset/data/expected/glyf_bug_3131/glyf_bug_3131.drop-hints-retain-gids.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..8ba3b02
Binary files /dev/null and b/test/subset/data/expected/glyf_bug_3131/glyf_bug_3131.drop-hints-retain-gids.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/glyf_bug_3131/glyf_bug_3131.retain-gids.63,64,65,6F,70,71,72.ttf b/test/subset/data/expected/glyf_bug_3131/glyf_bug_3131.retain-gids.63,64,65,6F,70,71,72.ttf
new file mode 100644 (file)
index 0000000..cc0e68f
Binary files /dev/null and b/test/subset/data/expected/glyf_bug_3131/glyf_bug_3131.retain-gids.63,64,65,6F,70,71,72.ttf differ
diff --git a/test/subset/data/expected/glyf_bug_3131/glyf_bug_3131.retain-gids.retain-all-codepoint.ttf b/test/subset/data/expected/glyf_bug_3131/glyf_bug_3131.retain-gids.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..cc0e68f
Binary files /dev/null and b/test/subset/data/expected/glyf_bug_3131/glyf_bug_3131.retain-gids.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/glyph_names/Ubuntu-Regular.glyph-names.0x0,0x8,0x9,0x1d,0x20,0xb7.ttf b/test/subset/data/expected/glyph_names/Ubuntu-Regular.glyph-names.0x0,0x8,0x9,0x1d,0x20,0xb7.ttf
new file mode 100644 (file)
index 0000000..dd2bf2c
Binary files /dev/null and b/test/subset/data/expected/glyph_names/Ubuntu-Regular.glyph-names.0x0,0x8,0x9,0x1d,0x20,0xb7.ttf differ
diff --git a/test/subset/data/expected/glyph_names/Ubuntu-Regular.glyph-names.retain-all-codepoint.ttf b/test/subset/data/expected/glyph_names/Ubuntu-Regular.glyph-names.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..d2a2db9
Binary files /dev/null and b/test/subset/data/expected/glyph_names/Ubuntu-Regular.glyph-names.retain-all-codepoint.ttf differ
index 7232004..5b6005d 100644 (file)
Binary files a/test/subset/data/expected/japanese/Mplus1p-Regular.default.1D715,1D7D8,41,42.ttf and b/test/subset/data/expected/japanese/Mplus1p-Regular.default.1D715,1D7D8,41,42.ttf differ
index 1dcfeec..c8cefe9 100644 (file)
Binary files a/test/subset/data/expected/japanese/Mplus1p-Regular.default.25771.ttf and b/test/subset/data/expected/japanese/Mplus1p-Regular.default.25771.ttf differ
index 92e2feb..b009502 100644 (file)
Binary files a/test/subset/data/expected/japanese/Mplus1p-Regular.default.3042,3044,3046,3048,304A,304B.ttf and b/test/subset/data/expected/japanese/Mplus1p-Regular.default.3042,3044,3046,3048,304A,304B.ttf differ
index 8b9ec31..5fda0ef 100644 (file)
Binary files a/test/subset/data/expected/japanese/Mplus1p-Regular.default.3042,3044,3046,73E0,5EA6,8F38.ttf and b/test/subset/data/expected/japanese/Mplus1p-Regular.default.3042,3044,3046,73E0,5EA6,8F38.ttf differ
index a02fec6..76e7dd9 100644 (file)
Binary files a/test/subset/data/expected/japanese/Mplus1p-Regular.default.61,63,65,6B.ttf and b/test/subset/data/expected/japanese/Mplus1p-Regular.default.61,63,65,6B.ttf differ
index fb20dc7..6ce2200 100644 (file)
Binary files a/test/subset/data/expected/japanese/Mplus1p-Regular.default.660E,6975,73E0,5EA6,8F38,6E05.ttf and b/test/subset/data/expected/japanese/Mplus1p-Regular.default.660E,6975,73E0,5EA6,8F38,6E05.ttf differ
index c1c2f51..722d033 100644 (file)
Binary files a/test/subset/data/expected/japanese/Mplus1p-Regular.default.660E.ttf and b/test/subset/data/expected/japanese/Mplus1p-Regular.default.660E.ttf differ
index f98c029..a6685d8 100644 (file)
Binary files a/test/subset/data/expected/japanese/Mplus1p-Regular.drop-hints.1D715,1D7D8,41,42.ttf and b/test/subset/data/expected/japanese/Mplus1p-Regular.drop-hints.1D715,1D7D8,41,42.ttf differ
index 5bdc97b..5e28a0d 100644 (file)
Binary files a/test/subset/data/expected/japanese/Mplus1p-Regular.drop-hints.25771.ttf and b/test/subset/data/expected/japanese/Mplus1p-Regular.drop-hints.25771.ttf differ
index cf97a83..f9d7a81 100644 (file)
Binary files a/test/subset/data/expected/japanese/Mplus1p-Regular.drop-hints.3042,3044,3046,3048,304A,304B.ttf and b/test/subset/data/expected/japanese/Mplus1p-Regular.drop-hints.3042,3044,3046,3048,304A,304B.ttf differ
index b3dba2e..d4c020c 100644 (file)
Binary files a/test/subset/data/expected/japanese/Mplus1p-Regular.drop-hints.3042,3044,3046,73E0,5EA6,8F38.ttf and b/test/subset/data/expected/japanese/Mplus1p-Regular.drop-hints.3042,3044,3046,73E0,5EA6,8F38.ttf differ
index 1ba361a..5a8a939 100644 (file)
Binary files a/test/subset/data/expected/japanese/Mplus1p-Regular.drop-hints.61,63,65,6B.ttf and b/test/subset/data/expected/japanese/Mplus1p-Regular.drop-hints.61,63,65,6B.ttf differ
index 6c54f62..7074f54 100644 (file)
Binary files a/test/subset/data/expected/japanese/Mplus1p-Regular.drop-hints.660E,6975,73E0,5EA6,8F38,6E05.ttf and b/test/subset/data/expected/japanese/Mplus1p-Regular.drop-hints.660E,6975,73E0,5EA6,8F38,6E05.ttf differ
index 08bbbdc..54baae4 100644 (file)
Binary files a/test/subset/data/expected/japanese/Mplus1p-Regular.drop-hints.660E.ttf and b/test/subset/data/expected/japanese/Mplus1p-Regular.drop-hints.660E.ttf differ
index 8b6ddd8..5b6005d 100644 (file)
Binary files a/test/subset/data/expected/japanese/Mplus1p-Regular.keep-gdef.1D715,1D7D8,41,42.ttf and b/test/subset/data/expected/japanese/Mplus1p-Regular.keep-gdef.1D715,1D7D8,41,42.ttf differ
index cce2d36..c8cefe9 100644 (file)
Binary files a/test/subset/data/expected/japanese/Mplus1p-Regular.keep-gdef.25771.ttf and b/test/subset/data/expected/japanese/Mplus1p-Regular.keep-gdef.25771.ttf differ
index beb4e52..b009502 100644 (file)
Binary files a/test/subset/data/expected/japanese/Mplus1p-Regular.keep-gdef.3042,3044,3046,3048,304A,304B.ttf and b/test/subset/data/expected/japanese/Mplus1p-Regular.keep-gdef.3042,3044,3046,3048,304A,304B.ttf differ
index 178989a..5fda0ef 100644 (file)
Binary files a/test/subset/data/expected/japanese/Mplus1p-Regular.keep-gdef.3042,3044,3046,73E0,5EA6,8F38.ttf and b/test/subset/data/expected/japanese/Mplus1p-Regular.keep-gdef.3042,3044,3046,73E0,5EA6,8F38.ttf differ
index 5fa32f3..76e7dd9 100644 (file)
Binary files a/test/subset/data/expected/japanese/Mplus1p-Regular.keep-gdef.61,63,65,6B.ttf and b/test/subset/data/expected/japanese/Mplus1p-Regular.keep-gdef.61,63,65,6B.ttf differ
index 17d4d07..6ce2200 100644 (file)
Binary files a/test/subset/data/expected/japanese/Mplus1p-Regular.keep-gdef.660E,6975,73E0,5EA6,8F38,6E05.ttf and b/test/subset/data/expected/japanese/Mplus1p-Regular.keep-gdef.660E,6975,73E0,5EA6,8F38,6E05.ttf differ
index b715f26..722d033 100644 (file)
Binary files a/test/subset/data/expected/japanese/Mplus1p-Regular.keep-gdef.660E.ttf and b/test/subset/data/expected/japanese/Mplus1p-Regular.keep-gdef.660E.ttf differ
diff --git a/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout-retain-gids.41,42,43.otf b/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout-retain-gids.41,42,43.otf
deleted file mode 100644 (file)
index 41f4ff4..0000000
Binary files a/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout-retain-gids.41,42,43.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout-retain-gids.41,42.otf b/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout-retain-gids.41,42.otf
deleted file mode 100644 (file)
index 67e87dc..0000000
Binary files a/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout-retain-gids.41,42.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout-retain-gids.41,43.otf b/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout-retain-gids.41,43.otf
deleted file mode 100644 (file)
index 47fe5d0..0000000
Binary files a/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout-retain-gids.41,43.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout-retain-gids.41.otf b/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout-retain-gids.41.otf
deleted file mode 100644 (file)
index 48e0524..0000000
Binary files a/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout-retain-gids.41.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout-retain-gids.retain-all-codepoint.otf
deleted file mode 100644 (file)
index eff7821..0000000
Binary files a/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout-retain-gids.retain-all-codepoint.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout.41,42,43.otf b/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout.41,42,43.otf
deleted file mode 100644 (file)
index b1a0b3c..0000000
Binary files a/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout.41,42,43.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout.41,42.otf b/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout.41,42.otf
deleted file mode 100644 (file)
index b070e2b..0000000
Binary files a/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout.41,42.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout.41,43.otf b/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout.41,43.otf
deleted file mode 100644 (file)
index a2715ef..0000000
Binary files a/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout.41,43.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout.41.otf b/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout.41.otf
deleted file mode 100644 (file)
index c94a78f..0000000
Binary files a/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout.41.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout.retain-all-codepoint.otf b/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout.retain-all-codepoint.otf
deleted file mode 100644 (file)
index eff7821..0000000
Binary files a/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout.retain-all-codepoint.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.layout-test-retain-gids.41,42,43.otf b/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.layout-test-retain-gids.41,42,43.otf
new file mode 100644 (file)
index 0000000..ca18f67
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.layout-test-retain-gids.41,42,43.otf differ
diff --git a/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.layout-test-retain-gids.41,42.otf b/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.layout-test-retain-gids.41,42.otf
new file mode 100644 (file)
index 0000000..5fe0af5
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.layout-test-retain-gids.41,42.otf differ
diff --git a/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.layout-test-retain-gids.41,43.otf b/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.layout-test-retain-gids.41,43.otf
new file mode 100644 (file)
index 0000000..29e9b9c
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.layout-test-retain-gids.41,43.otf differ
diff --git a/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.layout-test-retain-gids.41.otf b/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.layout-test-retain-gids.41.otf
new file mode 100644 (file)
index 0000000..cecfb20
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.layout-test-retain-gids.41.otf differ
diff --git a/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.layout-test-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.layout-test-retain-gids.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..d2507fa
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.layout-test-retain-gids.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.layout-test.41,42,43.otf b/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.layout-test.41,42,43.otf
new file mode 100644 (file)
index 0000000..dcc3e3f
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.layout-test.41,42,43.otf differ
diff --git a/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.layout-test.41,42.otf b/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.layout-test.41,42.otf
new file mode 100644 (file)
index 0000000..801a547
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.layout-test.41,42.otf differ
diff --git a/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.layout-test.41,43.otf b/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.layout-test.41,43.otf
new file mode 100644 (file)
index 0000000..ccc8d06
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.layout-test.41,43.otf differ
diff --git a/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.layout-test.41.otf b/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.layout-test.41.otf
new file mode 100644 (file)
index 0000000..2045896
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.layout-test.41.otf differ
diff --git a/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.layout-test.retain-all-codepoint.otf b/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.layout-test.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..d2507fa
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.layout-test.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout-retain-gids.41,42,43.otf b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout-retain-gids.41,42,43.otf
deleted file mode 100644 (file)
index 520a373..0000000
Binary files a/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout-retain-gids.41,42,43.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout-retain-gids.41,42.otf b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout-retain-gids.41,42.otf
deleted file mode 100644 (file)
index b9e8c99..0000000
Binary files a/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout-retain-gids.41,42.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout-retain-gids.41,43.otf b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout-retain-gids.41,43.otf
deleted file mode 100644 (file)
index 52fcc8c..0000000
Binary files a/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout-retain-gids.41,43.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout-retain-gids.41.otf b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout-retain-gids.41.otf
deleted file mode 100644 (file)
index ae6325f..0000000
Binary files a/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout-retain-gids.41.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout-retain-gids.retain-all-codepoint.otf
deleted file mode 100644 (file)
index 339bfe8..0000000
Binary files a/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout-retain-gids.retain-all-codepoint.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout.41,42,43.otf b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout.41,42,43.otf
deleted file mode 100644 (file)
index 3deac41..0000000
Binary files a/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout.41,42,43.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout.41,42.otf b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout.41,42.otf
deleted file mode 100644 (file)
index 5f0ded3..0000000
Binary files a/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout.41,42.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout.41,43.otf b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout.41,43.otf
deleted file mode 100644 (file)
index 5c14c1b..0000000
Binary files a/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout.41,43.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout.41.otf b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout.41.otf
deleted file mode 100644 (file)
index 2152ca7..0000000
Binary files a/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout.41.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout.retain-all-codepoint.otf b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout.retain-all-codepoint.otf
deleted file mode 100644 (file)
index 339bfe8..0000000
Binary files a/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout.retain-all-codepoint.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test-retain-gids.41,42,43.otf b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test-retain-gids.41,42,43.otf
new file mode 100644 (file)
index 0000000..70dd0fd
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test-retain-gids.41,42,43.otf differ
diff --git a/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test-retain-gids.41,42.otf b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test-retain-gids.41,42.otf
new file mode 100644 (file)
index 0000000..f9349f6
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test-retain-gids.41,42.otf differ
diff --git a/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test-retain-gids.41,43.otf b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test-retain-gids.41,43.otf
new file mode 100644 (file)
index 0000000..0ec5c0b
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test-retain-gids.41,43.otf differ
diff --git a/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test-retain-gids.41.otf b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test-retain-gids.41.otf
new file mode 100644 (file)
index 0000000..531d6e2
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test-retain-gids.41.otf differ
diff --git a/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test-retain-gids.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..07e6ad5
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test-retain-gids.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test.41,42,43.otf b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test.41,42,43.otf
new file mode 100644 (file)
index 0000000..070f9ec
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test.41,42,43.otf differ
diff --git a/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test.41,42.otf b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test.41,42.otf
new file mode 100644 (file)
index 0000000..60fd45c
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test.41,42.otf differ
diff --git a/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test.41,43.otf b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test.41,43.otf
new file mode 100644 (file)
index 0000000..0ff1503
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test.41,43.otf differ
diff --git a/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test.41.otf b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test.41.otf
new file mode 100644 (file)
index 0000000..b3b1e4b
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test.41.otf differ
diff --git a/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test.retain-all-codepoint.otf b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..07e6ad5
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout-retain-gids.41,42,43.otf b/test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout-retain-gids.41,42,43.otf
deleted file mode 100644 (file)
index ab85997..0000000
Binary files a/test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout-retain-gids.41,42,43.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout-retain-gids.41,42.otf b/test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout-retain-gids.41,42.otf
deleted file mode 100644 (file)
index ca3494f..0000000
Binary files a/test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout-retain-gids.41,42.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout-retain-gids.41,43.otf b/test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout-retain-gids.41,43.otf
deleted file mode 100644 (file)
index 58c9bf4..0000000
Binary files a/test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout-retain-gids.41,43.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout-retain-gids.41.otf b/test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout-retain-gids.41.otf
deleted file mode 100644 (file)
index 84bae1a..0000000
Binary files a/test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout-retain-gids.41.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout-retain-gids.retain-all-codepoint.otf
deleted file mode 100644 (file)
index 5588fd3..0000000
Binary files a/test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout-retain-gids.retain-all-codepoint.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout.41,42,43.otf b/test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout.41,42,43.otf
deleted file mode 100644 (file)
index 7c11995..0000000
Binary files a/test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout.41,42,43.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout.41,42.otf b/test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout.41,42.otf
deleted file mode 100644 (file)
index 2ee02fe..0000000
Binary files a/test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout.41,42.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout.41,43.otf b/test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout.41,43.otf
deleted file mode 100644 (file)
index 6e881ee..0000000
Binary files a/test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout.41,43.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout.41.otf b/test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout.41.otf
deleted file mode 100644 (file)
index a4c8c42..0000000
Binary files a/test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout.41.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout.retain-all-codepoint.otf b/test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout.retain-all-codepoint.otf
deleted file mode 100644 (file)
index 5588fd3..0000000
Binary files a/test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout.retain-all-codepoint.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.context/gpos_context3_simple_f1.layout-test-retain-gids.41,42,43.otf b/test/subset/data/expected/layout.context/gpos_context3_simple_f1.layout-test-retain-gids.41,42,43.otf
new file mode 100644 (file)
index 0000000..8ecfac1
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context3_simple_f1.layout-test-retain-gids.41,42,43.otf differ
diff --git a/test/subset/data/expected/layout.context/gpos_context3_simple_f1.layout-test-retain-gids.41,42.otf b/test/subset/data/expected/layout.context/gpos_context3_simple_f1.layout-test-retain-gids.41,42.otf
new file mode 100644 (file)
index 0000000..9969bd5
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context3_simple_f1.layout-test-retain-gids.41,42.otf differ
diff --git a/test/subset/data/expected/layout.context/gpos_context3_simple_f1.layout-test-retain-gids.41,43.otf b/test/subset/data/expected/layout.context/gpos_context3_simple_f1.layout-test-retain-gids.41,43.otf
new file mode 100644 (file)
index 0000000..1072cdc
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context3_simple_f1.layout-test-retain-gids.41,43.otf differ
diff --git a/test/subset/data/expected/layout.context/gpos_context3_simple_f1.layout-test-retain-gids.41.otf b/test/subset/data/expected/layout.context/gpos_context3_simple_f1.layout-test-retain-gids.41.otf
new file mode 100644 (file)
index 0000000..3a8173b
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context3_simple_f1.layout-test-retain-gids.41.otf differ
diff --git a/test/subset/data/expected/layout.context/gpos_context3_simple_f1.layout-test-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/layout.context/gpos_context3_simple_f1.layout-test-retain-gids.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..fc0dcbb
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context3_simple_f1.layout-test-retain-gids.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/layout.context/gpos_context3_simple_f1.layout-test.41,42,43.otf b/test/subset/data/expected/layout.context/gpos_context3_simple_f1.layout-test.41,42,43.otf
new file mode 100644 (file)
index 0000000..51340dd
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context3_simple_f1.layout-test.41,42,43.otf differ
diff --git a/test/subset/data/expected/layout.context/gpos_context3_simple_f1.layout-test.41,42.otf b/test/subset/data/expected/layout.context/gpos_context3_simple_f1.layout-test.41,42.otf
new file mode 100644 (file)
index 0000000..72cf50c
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context3_simple_f1.layout-test.41,42.otf differ
diff --git a/test/subset/data/expected/layout.context/gpos_context3_simple_f1.layout-test.41,43.otf b/test/subset/data/expected/layout.context/gpos_context3_simple_f1.layout-test.41,43.otf
new file mode 100644 (file)
index 0000000..157c302
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context3_simple_f1.layout-test.41,43.otf differ
diff --git a/test/subset/data/expected/layout.context/gpos_context3_simple_f1.layout-test.41.otf b/test/subset/data/expected/layout.context/gpos_context3_simple_f1.layout-test.41.otf
new file mode 100644 (file)
index 0000000..662a36f
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context3_simple_f1.layout-test.41.otf differ
diff --git a/test/subset/data/expected/layout.context/gpos_context3_simple_f1.layout-test.retain-all-codepoint.otf b/test/subset/data/expected/layout.context/gpos_context3_simple_f1.layout-test.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..fc0dcbb
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context3_simple_f1.layout-test.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/layout.context_format2/NotoSansNewa-Regular.layout-test-retain-gids.retain-all-codepoint.ttf b/test/subset/data/expected/layout.context_format2/NotoSansNewa-Regular.layout-test-retain-gids.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..c2ef8fe
Binary files /dev/null and b/test/subset/data/expected/layout.context_format2/NotoSansNewa-Regular.layout-test-retain-gids.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/layout.context_format2/NotoSansNewa-Regular.layout-test.retain-all-codepoint.ttf b/test/subset/data/expected/layout.context_format2/NotoSansNewa-Regular.layout-test.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..c2ef8fe
Binary files /dev/null and b/test/subset/data/expected/layout.context_format2/NotoSansNewa-Regular.layout-test.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/layout.default_features/FranklinGothic-Regular.default.61,63,68,69.ttf b/test/subset/data/expected/layout.default_features/FranklinGothic-Regular.default.61,63,68,69.ttf
new file mode 100644 (file)
index 0000000..4e7ce29
Binary files /dev/null and b/test/subset/data/expected/layout.default_features/FranklinGothic-Regular.default.61,63,68,69.ttf differ
diff --git a/test/subset/data/expected/layout.default_features/FranklinGothic-Regular.default.retain-all-codepoint.ttf b/test/subset/data/expected/layout.default_features/FranklinGothic-Regular.default.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..566cac6
Binary files /dev/null and b/test/subset/data/expected/layout.default_features/FranklinGothic-Regular.default.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/layout.default_features/FranklinGothic-Regular.layout-test.61,63,68,69.ttf b/test/subset/data/expected/layout.default_features/FranklinGothic-Regular.layout-test.61,63,68,69.ttf
new file mode 100644 (file)
index 0000000..b0ee6ab
Binary files /dev/null and b/test/subset/data/expected/layout.default_features/FranklinGothic-Regular.layout-test.61,63,68,69.ttf differ
diff --git a/test/subset/data/expected/layout.default_features/FranklinGothic-Regular.layout-test.retain-all-codepoint.ttf b/test/subset/data/expected/layout.default_features/FranklinGothic-Regular.layout-test.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..c341ab8
Binary files /dev/null and b/test/subset/data/expected/layout.default_features/FranklinGothic-Regular.layout-test.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/layout.default_features/FranklinGothic-Regular.retain-gids.61,63,68,69.ttf b/test/subset/data/expected/layout.default_features/FranklinGothic-Regular.retain-gids.61,63,68,69.ttf
new file mode 100644 (file)
index 0000000..9e1167f
Binary files /dev/null and b/test/subset/data/expected/layout.default_features/FranklinGothic-Regular.retain-gids.61,63,68,69.ttf differ
diff --git a/test/subset/data/expected/layout.default_features/FranklinGothic-Regular.retain-gids.retain-all-codepoint.ttf b/test/subset/data/expected/layout.default_features/FranklinGothic-Regular.retain-gids.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..0f89424
Binary files /dev/null and b/test/subset/data/expected/layout.default_features/FranklinGothic-Regular.retain-gids.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/layout.drop_feature/SpectralSC-ExtraLightItalic.default.retain-all-codepoint.ttf b/test/subset/data/expected/layout.drop_feature/SpectralSC-ExtraLightItalic.default.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..7dcb3ec
Binary files /dev/null and b/test/subset/data/expected/layout.drop_feature/SpectralSC-ExtraLightItalic.default.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/layout.drop_feature/SpectralSC-ExtraLightItalic.glyph-names.retain-all-codepoint.ttf b/test/subset/data/expected/layout.drop_feature/SpectralSC-ExtraLightItalic.glyph-names.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..f17c609
Binary files /dev/null and b/test/subset/data/expected/layout.drop_feature/SpectralSC-ExtraLightItalic.glyph-names.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/layout.drop_feature/SpectralSC-ExtraLightItalic.notdef-outline.retain-all-codepoint.ttf b/test/subset/data/expected/layout.drop_feature/SpectralSC-ExtraLightItalic.notdef-outline.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..490ab70
Binary files /dev/null and b/test/subset/data/expected/layout.drop_feature/SpectralSC-ExtraLightItalic.notdef-outline.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.default.20,2f,38,49,4c,51,53,66,67,6f,b4,2044.ttf b/test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.default.20,2f,38,49,4c,51,53,66,67,6f,b4,2044.ttf
new file mode 100644 (file)
index 0000000..d53abcb
Binary files /dev/null and b/test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.default.20,2f,38,49,4c,51,53,66,67,6f,b4,2044.ttf differ
diff --git a/test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.default.retain-all-codepoint.ttf b/test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.default.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..c590621
Binary files /dev/null and b/test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.default.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.glyph-names.20,2f,38,49,4c,51,53,66,67,6f,b4,2044.ttf b/test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.glyph-names.20,2f,38,49,4c,51,53,66,67,6f,b4,2044.ttf
new file mode 100644 (file)
index 0000000..f3ca7d8
Binary files /dev/null and b/test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.glyph-names.20,2f,38,49,4c,51,53,66,67,6f,b4,2044.ttf differ
diff --git a/test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.glyph-names.retain-all-codepoint.ttf b/test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.glyph-names.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..97948b0
Binary files /dev/null and b/test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.glyph-names.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.notdef-outline.20,2f,38,49,4c,51,53,66,67,6f,b4,2044.ttf b/test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.notdef-outline.20,2f,38,49,4c,51,53,66,67,6f,b4,2044.ttf
new file mode 100644 (file)
index 0000000..d53abcb
Binary files /dev/null and b/test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.notdef-outline.20,2f,38,49,4c,51,53,66,67,6f,b4,2044.ttf differ
diff --git a/test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.notdef-outline.retain-all-codepoint.ttf b/test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.notdef-outline.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..c590621
Binary files /dev/null and b/test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.notdef-outline.retain-all-codepoint.ttf differ
index 598a105..de9a5ee 100644 (file)
Binary files a/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.default.A01.ttf and b/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.default.A01.ttf differ
index ccb6de8..af784fe 100644 (file)
Binary files a/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.default.A05,A06.ttf and b/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.default.A05,A06.ttf differ
index 92548f4..3ee2ab5 100644 (file)
Binary files a/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.default.A07,A1B.ttf and b/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.default.A07,A1B.ttf differ
index bba2499..ab0c1d1 100644 (file)
Binary files a/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.default.retain-all-codepoint.ttf and b/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.default.retain-all-codepoint.ttf differ
index 2caaad7..4e138dd 100644 (file)
Binary files a/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.drop-hints.A01.ttf and b/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.drop-hints.A01.ttf differ
index a8b8b8b..ac0c32d 100644 (file)
Binary files a/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.drop-hints.A05,A06.ttf and b/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.drop-hints.A05,A06.ttf differ
index 33ce18b..00abf00 100644 (file)
Binary files a/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.drop-hints.A07,A1B.ttf and b/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.drop-hints.A07,A1B.ttf differ
index 6e6bca5..2306381 100644 (file)
Binary files a/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.drop-hints.retain-all-codepoint.ttf and b/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.drop-hints.retain-all-codepoint.ttf differ
index c298dec..de9a5ee 100644 (file)
Binary files a/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.keep-gdef.A01.ttf and b/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.keep-gdef.A01.ttf differ
index cc4b514..af784fe 100644 (file)
Binary files a/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.keep-gdef.A05,A06.ttf and b/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.keep-gdef.A05,A06.ttf differ
index a47466a..3ee2ab5 100644 (file)
Binary files a/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.keep-gdef.A07,A1B.ttf and b/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.keep-gdef.A07,A1B.ttf differ
index ae02f3f..ab0c1d1 100644 (file)
Binary files a/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.keep-gdef.retain-all-codepoint.ttf and b/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.keep-gdef.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.default.41,42,43,57.otf b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.default.41,42,43,57.otf
deleted file mode 100644 (file)
index 745b740..0000000
Binary files a/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.default.41,42,43,57.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.default.41,42,43.otf b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.default.41,42,43.otf
deleted file mode 100644 (file)
index 729b23c..0000000
Binary files a/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.default.41,42,43.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.default.41,42.otf b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.default.41,42.otf
deleted file mode 100644 (file)
index 0689b4e..0000000
Binary files a/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.default.41,42.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.default.41,56,57.otf b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.default.41,56,57.otf
deleted file mode 100644 (file)
index 8263d78..0000000
Binary files a/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.default.41,56,57.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.default.41.otf b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.default.41.otf
deleted file mode 100644 (file)
index 2396fc4..0000000
Binary files a/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.default.41.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.default.42,57.otf b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.default.42,57.otf
deleted file mode 100644 (file)
index 2315ed9..0000000
Binary files a/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.default.42,57.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.drop-hints.41,42,43,57.otf b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.drop-hints.41,42,43,57.otf
deleted file mode 100644 (file)
index 1e691e3..0000000
Binary files a/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.drop-hints.41,42,43,57.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.drop-hints.41,42,43.otf b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.drop-hints.41,42,43.otf
deleted file mode 100644 (file)
index cc1f15d..0000000
Binary files a/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.drop-hints.41,42,43.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.drop-hints.41,42.otf b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.drop-hints.41,42.otf
deleted file mode 100644 (file)
index 965dc97..0000000
Binary files a/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.drop-hints.41,42.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.drop-hints.41,56,57.otf b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.drop-hints.41,56,57.otf
deleted file mode 100644 (file)
index 6b2063d..0000000
Binary files a/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.drop-hints.41,56,57.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.drop-hints.41.otf b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.drop-hints.41.otf
deleted file mode 100644 (file)
index c828aca..0000000
Binary files a/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.drop-hints.41.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.drop-hints.42,57.otf b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.drop-hints.42,57.otf
deleted file mode 100644 (file)
index 0a31696..0000000
Binary files a/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.drop-hints.42,57.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.keep-gdef-gpos.41,42,43,57.otf b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.keep-gdef-gpos.41,42,43,57.otf
deleted file mode 100644 (file)
index cf686c3..0000000
Binary files a/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.keep-gdef-gpos.41,42,43,57.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.keep-gdef-gpos.41,42,43.otf b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.keep-gdef-gpos.41,42,43.otf
deleted file mode 100644 (file)
index dc41ad4..0000000
Binary files a/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.keep-gdef-gpos.41,42,43.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.keep-gdef-gpos.41,42.otf b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.keep-gdef-gpos.41,42.otf
deleted file mode 100644 (file)
index 749daaf..0000000
Binary files a/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.keep-gdef-gpos.41,42.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.keep-gdef-gpos.41,56,57.otf b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.keep-gdef-gpos.41,56,57.otf
deleted file mode 100644 (file)
index a178115..0000000
Binary files a/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.keep-gdef-gpos.41,56,57.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.keep-gdef-gpos.41.otf b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.keep-gdef-gpos.41.otf
deleted file mode 100644 (file)
index 96374c4..0000000
Binary files a/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.keep-gdef-gpos.41.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.keep-gdef-gpos.42,57.otf b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.keep-gdef-gpos.42,57.otf
deleted file mode 100644 (file)
index e17e1ec..0000000
Binary files a/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.keep-gdef-gpos.42,57.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.layout-test-retain-gids.41,42,43,57.otf b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.layout-test-retain-gids.41,42,43,57.otf
new file mode 100644 (file)
index 0000000..e939b0b
Binary files /dev/null and b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.layout-test-retain-gids.41,42,43,57.otf differ
diff --git a/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.layout-test-retain-gids.41,42,43.otf b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.layout-test-retain-gids.41,42,43.otf
new file mode 100644 (file)
index 0000000..798b856
Binary files /dev/null and b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.layout-test-retain-gids.41,42,43.otf differ
diff --git a/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.layout-test-retain-gids.41,42.otf b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.layout-test-retain-gids.41,42.otf
new file mode 100644 (file)
index 0000000..a0d7fee
Binary files /dev/null and b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.layout-test-retain-gids.41,42.otf differ
diff --git a/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.layout-test-retain-gids.41,56,57.otf b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.layout-test-retain-gids.41,56,57.otf
new file mode 100644 (file)
index 0000000..68654ea
Binary files /dev/null and b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.layout-test-retain-gids.41,56,57.otf differ
diff --git a/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.layout-test-retain-gids.41.otf b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.layout-test-retain-gids.41.otf
new file mode 100644 (file)
index 0000000..6e0aa21
Binary files /dev/null and b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.layout-test-retain-gids.41.otf differ
diff --git a/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.layout-test-retain-gids.42,57.otf b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.layout-test-retain-gids.42,57.otf
new file mode 100644 (file)
index 0000000..600edf9
Binary files /dev/null and b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.layout-test-retain-gids.42,57.otf differ
diff --git a/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.layout-test.41,42,43,57.otf b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.layout-test.41,42,43,57.otf
new file mode 100644 (file)
index 0000000..0606b02
Binary files /dev/null and b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.layout-test.41,42,43,57.otf differ
diff --git a/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.layout-test.41,42,43.otf b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.layout-test.41,42,43.otf
new file mode 100644 (file)
index 0000000..76fb186
Binary files /dev/null and b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.layout-test.41,42,43.otf differ
diff --git a/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.layout-test.41,42.otf b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.layout-test.41,42.otf
new file mode 100644 (file)
index 0000000..13437bc
Binary files /dev/null and b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.layout-test.41,42.otf differ
diff --git a/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.layout-test.41,56,57.otf b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.layout-test.41,56,57.otf
new file mode 100644 (file)
index 0000000..64e299a
Binary files /dev/null and b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.layout-test.41,56,57.otf differ
diff --git a/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.layout-test.41.otf b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.layout-test.41.otf
new file mode 100644 (file)
index 0000000..ada8cb6
Binary files /dev/null and b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.layout-test.41.otf differ
diff --git a/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.layout-test.42,57.otf b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.layout-test.42,57.otf
new file mode 100644 (file)
index 0000000..e38300e
Binary files /dev/null and b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.layout-test.42,57.otf differ
diff --git a/test/subset/data/expected/layout.gdef.glyphset/IndicTestHowrah-Regular.default.9dd.ttf b/test/subset/data/expected/layout.gdef.glyphset/IndicTestHowrah-Regular.default.9dd.ttf
new file mode 100644 (file)
index 0000000..3110b2e
Binary files /dev/null and b/test/subset/data/expected/layout.gdef.glyphset/IndicTestHowrah-Regular.default.9dd.ttf differ
diff --git a/test/subset/data/expected/layout.gdef.glyphset/IndicTestHowrah-Regular.default.retain-all-codepoint.ttf b/test/subset/data/expected/layout.gdef.glyphset/IndicTestHowrah-Regular.default.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..615474b
Binary files /dev/null and b/test/subset/data/expected/layout.gdef.glyphset/IndicTestHowrah-Regular.default.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/layout.gdef.glyphset/IndicTestHowrah-Regular.drop-hints.9dd.ttf b/test/subset/data/expected/layout.gdef.glyphset/IndicTestHowrah-Regular.drop-hints.9dd.ttf
new file mode 100644 (file)
index 0000000..731dae6
Binary files /dev/null and b/test/subset/data/expected/layout.gdef.glyphset/IndicTestHowrah-Regular.drop-hints.9dd.ttf differ
diff --git a/test/subset/data/expected/layout.gdef.glyphset/IndicTestHowrah-Regular.drop-hints.retain-all-codepoint.ttf b/test/subset/data/expected/layout.gdef.glyphset/IndicTestHowrah-Regular.drop-hints.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..47ae513
Binary files /dev/null and b/test/subset/data/expected/layout.gdef.glyphset/IndicTestHowrah-Regular.drop-hints.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/layout.gdef.glyphset/IndicTestHowrah-Regular.retain-gids.9dd.ttf b/test/subset/data/expected/layout.gdef.glyphset/IndicTestHowrah-Regular.retain-gids.9dd.ttf
new file mode 100644 (file)
index 0000000..16355fe
Binary files /dev/null and b/test/subset/data/expected/layout.gdef.glyphset/IndicTestHowrah-Regular.retain-gids.9dd.ttf differ
diff --git a/test/subset/data/expected/layout.gdef.glyphset/IndicTestHowrah-Regular.retain-gids.retain-all-codepoint.ttf b/test/subset/data/expected/layout.gdef.glyphset/IndicTestHowrah-Regular.retain-gids.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..240cb05
Binary files /dev/null and b/test/subset/data/expected/layout.gdef.glyphset/IndicTestHowrah-Regular.retain-gids.retain-all-codepoint.ttf differ
index d505524..863fce8 100644 (file)
Binary files a/test/subset/data/expected/layout.gdef/Roboto-Regular.default.1E00,303.ttf and b/test/subset/data/expected/layout.gdef/Roboto-Regular.default.1E00,303.ttf differ
index c710e19..efc3e47 100644 (file)
Binary files a/test/subset/data/expected/layout.gdef/Roboto-Regular.default.303.ttf and b/test/subset/data/expected/layout.gdef/Roboto-Regular.default.303.ttf differ
index c4f5e02..9d794ef 100644 (file)
Binary files a/test/subset/data/expected/layout.gdef/Roboto-Regular.default.309,20,30F.ttf and b/test/subset/data/expected/layout.gdef/Roboto-Regular.default.309,20,30F.ttf differ
index 134a7dd..e1d1605 100644 (file)
Binary files a/test/subset/data/expected/layout.gdef/Roboto-Regular.default.323.ttf and b/test/subset/data/expected/layout.gdef/Roboto-Regular.default.323.ttf differ
index b037840..1f5721d 100644 (file)
Binary files a/test/subset/data/expected/layout.gdef/Roboto-Regular.default.41,42,43.ttf and b/test/subset/data/expected/layout.gdef/Roboto-Regular.default.41,42,43.ttf differ
index 5b1077f..0a8dcb0 100644 (file)
Binary files a/test/subset/data/expected/layout.gdef/Roboto-Regular.drop-hints.1E00,303.ttf and b/test/subset/data/expected/layout.gdef/Roboto-Regular.drop-hints.1E00,303.ttf differ
index 665a3ec..b3fc9df 100644 (file)
Binary files a/test/subset/data/expected/layout.gdef/Roboto-Regular.drop-hints.303.ttf and b/test/subset/data/expected/layout.gdef/Roboto-Regular.drop-hints.303.ttf differ
index cb041bd..d553a87 100644 (file)
Binary files a/test/subset/data/expected/layout.gdef/Roboto-Regular.drop-hints.309,20,30F.ttf and b/test/subset/data/expected/layout.gdef/Roboto-Regular.drop-hints.309,20,30F.ttf differ
index eea77c1..edaadc5 100644 (file)
Binary files a/test/subset/data/expected/layout.gdef/Roboto-Regular.drop-hints.323.ttf and b/test/subset/data/expected/layout.gdef/Roboto-Regular.drop-hints.323.ttf differ
index dcf5653..7098c08 100644 (file)
Binary files a/test/subset/data/expected/layout.gdef/Roboto-Regular.drop-hints.41,42,43.ttf and b/test/subset/data/expected/layout.gdef/Roboto-Regular.drop-hints.41,42,43.ttf differ
index b7411bb..863fce8 100644 (file)
Binary files a/test/subset/data/expected/layout.gdef/Roboto-Regular.keep-gdef-gpos.1E00,303.ttf and b/test/subset/data/expected/layout.gdef/Roboto-Regular.keep-gdef-gpos.1E00,303.ttf differ
index 1f5cb5c..efc3e47 100644 (file)
Binary files a/test/subset/data/expected/layout.gdef/Roboto-Regular.keep-gdef-gpos.303.ttf and b/test/subset/data/expected/layout.gdef/Roboto-Regular.keep-gdef-gpos.303.ttf differ
index 5f10399..9d794ef 100644 (file)
Binary files a/test/subset/data/expected/layout.gdef/Roboto-Regular.keep-gdef-gpos.309,20,30F.ttf and b/test/subset/data/expected/layout.gdef/Roboto-Regular.keep-gdef-gpos.309,20,30F.ttf differ
index 9562cc3..e1d1605 100644 (file)
Binary files a/test/subset/data/expected/layout.gdef/Roboto-Regular.keep-gdef-gpos.323.ttf and b/test/subset/data/expected/layout.gdef/Roboto-Regular.keep-gdef-gpos.323.ttf differ
index 0ad2532..1f5721d 100644 (file)
Binary files a/test/subset/data/expected/layout.gdef/Roboto-Regular.keep-gdef-gpos.41,42,43.ttf and b/test/subset/data/expected/layout.gdef/Roboto-Regular.keep-gdef-gpos.41,42,43.ttf differ
diff --git a/test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout-retain-gids.41,43.otf b/test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout-retain-gids.41,43.otf
deleted file mode 100644 (file)
index 6b2879f..0000000
Binary files a/test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout-retain-gids.41,43.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout-retain-gids.41,46.otf b/test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout-retain-gids.41,46.otf
deleted file mode 100644 (file)
index eebb3e1..0000000
Binary files a/test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout-retain-gids.41,46.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout-retain-gids.41.otf b/test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout-retain-gids.41.otf
deleted file mode 100644 (file)
index e56bbf4..0000000
Binary files a/test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout-retain-gids.41.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout-retain-gids.42,44.otf b/test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout-retain-gids.42,44.otf
deleted file mode 100644 (file)
index eb8f88c..0000000
Binary files a/test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout-retain-gids.42,44.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout-retain-gids.43,46.otf b/test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout-retain-gids.43,46.otf
deleted file mode 100644 (file)
index c271bde..0000000
Binary files a/test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout-retain-gids.43,46.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout-retain-gids.retain-all-codepoint.otf
deleted file mode 100644 (file)
index 2d6962b..0000000
Binary files a/test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout-retain-gids.retain-all-codepoint.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout.41,43.otf b/test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout.41,43.otf
deleted file mode 100644 (file)
index 5277309..0000000
Binary files a/test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout.41,43.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout.41,46.otf b/test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout.41,46.otf
deleted file mode 100644 (file)
index 5a74887..0000000
Binary files a/test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout.41,46.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout.41.otf b/test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout.41.otf
deleted file mode 100644 (file)
index 1caeeab..0000000
Binary files a/test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout.41.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout.42,44.otf b/test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout.42,44.otf
deleted file mode 100644 (file)
index 09e38d5..0000000
Binary files a/test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout.42,44.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout.43,46.otf b/test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout.43,46.otf
deleted file mode 100644 (file)
index c429dc9..0000000
Binary files a/test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout.43,46.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout.retain-all-codepoint.otf b/test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout.retain-all-codepoint.otf
deleted file mode 100644 (file)
index 2d6962b..0000000
Binary files a/test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout.retain-all-codepoint.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos/gpos1_2_font.layout-test-retain-gids.41,43.otf b/test/subset/data/expected/layout.gpos/gpos1_2_font.layout-test-retain-gids.41,43.otf
new file mode 100644 (file)
index 0000000..1e59c75
Binary files /dev/null and b/test/subset/data/expected/layout.gpos/gpos1_2_font.layout-test-retain-gids.41,43.otf differ
diff --git a/test/subset/data/expected/layout.gpos/gpos1_2_font.layout-test-retain-gids.41,46.otf b/test/subset/data/expected/layout.gpos/gpos1_2_font.layout-test-retain-gids.41,46.otf
new file mode 100644 (file)
index 0000000..67d882b
Binary files /dev/null and b/test/subset/data/expected/layout.gpos/gpos1_2_font.layout-test-retain-gids.41,46.otf differ
diff --git a/test/subset/data/expected/layout.gpos/gpos1_2_font.layout-test-retain-gids.41.otf b/test/subset/data/expected/layout.gpos/gpos1_2_font.layout-test-retain-gids.41.otf
new file mode 100644 (file)
index 0000000..77ab03a
Binary files /dev/null and b/test/subset/data/expected/layout.gpos/gpos1_2_font.layout-test-retain-gids.41.otf differ
diff --git a/test/subset/data/expected/layout.gpos/gpos1_2_font.layout-test-retain-gids.42,44.otf b/test/subset/data/expected/layout.gpos/gpos1_2_font.layout-test-retain-gids.42,44.otf
new file mode 100644 (file)
index 0000000..35f81e5
Binary files /dev/null and b/test/subset/data/expected/layout.gpos/gpos1_2_font.layout-test-retain-gids.42,44.otf differ
diff --git a/test/subset/data/expected/layout.gpos/gpos1_2_font.layout-test-retain-gids.43,46.otf b/test/subset/data/expected/layout.gpos/gpos1_2_font.layout-test-retain-gids.43,46.otf
new file mode 100644 (file)
index 0000000..148c9ca
Binary files /dev/null and b/test/subset/data/expected/layout.gpos/gpos1_2_font.layout-test-retain-gids.43,46.otf differ
diff --git a/test/subset/data/expected/layout.gpos/gpos1_2_font.layout-test-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/layout.gpos/gpos1_2_font.layout-test-retain-gids.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..24f1c46
Binary files /dev/null and b/test/subset/data/expected/layout.gpos/gpos1_2_font.layout-test-retain-gids.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/layout.gpos/gpos1_2_font.layout-test.41,43.otf b/test/subset/data/expected/layout.gpos/gpos1_2_font.layout-test.41,43.otf
new file mode 100644 (file)
index 0000000..21a9b63
Binary files /dev/null and b/test/subset/data/expected/layout.gpos/gpos1_2_font.layout-test.41,43.otf differ
diff --git a/test/subset/data/expected/layout.gpos/gpos1_2_font.layout-test.41,46.otf b/test/subset/data/expected/layout.gpos/gpos1_2_font.layout-test.41,46.otf
new file mode 100644 (file)
index 0000000..78e4ab8
Binary files /dev/null and b/test/subset/data/expected/layout.gpos/gpos1_2_font.layout-test.41,46.otf differ
diff --git a/test/subset/data/expected/layout.gpos/gpos1_2_font.layout-test.41.otf b/test/subset/data/expected/layout.gpos/gpos1_2_font.layout-test.41.otf
new file mode 100644 (file)
index 0000000..8a17ae6
Binary files /dev/null and b/test/subset/data/expected/layout.gpos/gpos1_2_font.layout-test.41.otf differ
diff --git a/test/subset/data/expected/layout.gpos/gpos1_2_font.layout-test.42,44.otf b/test/subset/data/expected/layout.gpos/gpos1_2_font.layout-test.42,44.otf
new file mode 100644 (file)
index 0000000..6bb5293
Binary files /dev/null and b/test/subset/data/expected/layout.gpos/gpos1_2_font.layout-test.42,44.otf differ
diff --git a/test/subset/data/expected/layout.gpos/gpos1_2_font.layout-test.43,46.otf b/test/subset/data/expected/layout.gpos/gpos1_2_font.layout-test.43,46.otf
new file mode 100644 (file)
index 0000000..354ace8
Binary files /dev/null and b/test/subset/data/expected/layout.gpos/gpos1_2_font.layout-test.43,46.otf differ
diff --git a/test/subset/data/expected/layout.gpos/gpos1_2_font.layout-test.retain-all-codepoint.otf b/test/subset/data/expected/layout.gpos/gpos1_2_font.layout-test.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..24f1c46
Binary files /dev/null and b/test/subset/data/expected/layout.gpos/gpos1_2_font.layout-test.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/layout.gpos2/gpos2_1_font7.keep-layout-retain-gids.21,23,25.otf b/test/subset/data/expected/layout.gpos2/gpos2_1_font7.keep-layout-retain-gids.21,23,25.otf
deleted file mode 100644 (file)
index 49039fe..0000000
Binary files a/test/subset/data/expected/layout.gpos2/gpos2_1_font7.keep-layout-retain-gids.21,23,25.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos2/gpos2_1_font7.keep-layout-retain-gids.21,23.otf b/test/subset/data/expected/layout.gpos2/gpos2_1_font7.keep-layout-retain-gids.21,23.otf
deleted file mode 100644 (file)
index 68cb0ec..0000000
Binary files a/test/subset/data/expected/layout.gpos2/gpos2_1_font7.keep-layout-retain-gids.21,23.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos2/gpos2_1_font7.keep-layout-retain-gids.41,42,43.otf b/test/subset/data/expected/layout.gpos2/gpos2_1_font7.keep-layout-retain-gids.41,42,43.otf
deleted file mode 100644 (file)
index 5972234..0000000
Binary files a/test/subset/data/expected/layout.gpos2/gpos2_1_font7.keep-layout-retain-gids.41,42,43.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos2/gpos2_1_font7.keep-layout-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/layout.gpos2/gpos2_1_font7.keep-layout-retain-gids.retain-all-codepoint.otf
deleted file mode 100644 (file)
index 8f18b89..0000000
Binary files a/test/subset/data/expected/layout.gpos2/gpos2_1_font7.keep-layout-retain-gids.retain-all-codepoint.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos2/gpos2_1_font7.keep-layout.21,23,25.otf b/test/subset/data/expected/layout.gpos2/gpos2_1_font7.keep-layout.21,23,25.otf
deleted file mode 100644 (file)
index 47fea1a..0000000
Binary files a/test/subset/data/expected/layout.gpos2/gpos2_1_font7.keep-layout.21,23,25.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos2/gpos2_1_font7.keep-layout.21,23.otf b/test/subset/data/expected/layout.gpos2/gpos2_1_font7.keep-layout.21,23.otf
deleted file mode 100644 (file)
index 99e813f..0000000
Binary files a/test/subset/data/expected/layout.gpos2/gpos2_1_font7.keep-layout.21,23.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos2/gpos2_1_font7.keep-layout.41,42,43.otf b/test/subset/data/expected/layout.gpos2/gpos2_1_font7.keep-layout.41,42,43.otf
deleted file mode 100644 (file)
index 852808e..0000000
Binary files a/test/subset/data/expected/layout.gpos2/gpos2_1_font7.keep-layout.41,42,43.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos2/gpos2_1_font7.keep-layout.retain-all-codepoint.otf b/test/subset/data/expected/layout.gpos2/gpos2_1_font7.keep-layout.retain-all-codepoint.otf
deleted file mode 100644 (file)
index 8f18b89..0000000
Binary files a/test/subset/data/expected/layout.gpos2/gpos2_1_font7.keep-layout.retain-all-codepoint.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos2/gpos2_1_font7.layout-test-retain-gids.21,23,25.otf b/test/subset/data/expected/layout.gpos2/gpos2_1_font7.layout-test-retain-gids.21,23,25.otf
new file mode 100644 (file)
index 0000000..e56914e
Binary files /dev/null and b/test/subset/data/expected/layout.gpos2/gpos2_1_font7.layout-test-retain-gids.21,23,25.otf differ
diff --git a/test/subset/data/expected/layout.gpos2/gpos2_1_font7.layout-test-retain-gids.21,23.otf b/test/subset/data/expected/layout.gpos2/gpos2_1_font7.layout-test-retain-gids.21,23.otf
new file mode 100644 (file)
index 0000000..3c6c260
Binary files /dev/null and b/test/subset/data/expected/layout.gpos2/gpos2_1_font7.layout-test-retain-gids.21,23.otf differ
diff --git a/test/subset/data/expected/layout.gpos2/gpos2_1_font7.layout-test-retain-gids.2E,23.otf b/test/subset/data/expected/layout.gpos2/gpos2_1_font7.layout-test-retain-gids.2E,23.otf
new file mode 100644 (file)
index 0000000..2250037
Binary files /dev/null and b/test/subset/data/expected/layout.gpos2/gpos2_1_font7.layout-test-retain-gids.2E,23.otf differ
diff --git a/test/subset/data/expected/layout.gpos2/gpos2_1_font7.layout-test-retain-gids.41,42,43.otf b/test/subset/data/expected/layout.gpos2/gpos2_1_font7.layout-test-retain-gids.41,42,43.otf
new file mode 100644 (file)
index 0000000..e32d342
Binary files /dev/null and b/test/subset/data/expected/layout.gpos2/gpos2_1_font7.layout-test-retain-gids.41,42,43.otf differ
diff --git a/test/subset/data/expected/layout.gpos2/gpos2_1_font7.layout-test-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/layout.gpos2/gpos2_1_font7.layout-test-retain-gids.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..a047174
Binary files /dev/null and b/test/subset/data/expected/layout.gpos2/gpos2_1_font7.layout-test-retain-gids.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/layout.gpos2/gpos2_1_font7.layout-test.21,23,25.otf b/test/subset/data/expected/layout.gpos2/gpos2_1_font7.layout-test.21,23,25.otf
new file mode 100644 (file)
index 0000000..99f8761
Binary files /dev/null and b/test/subset/data/expected/layout.gpos2/gpos2_1_font7.layout-test.21,23,25.otf differ
diff --git a/test/subset/data/expected/layout.gpos2/gpos2_1_font7.layout-test.21,23.otf b/test/subset/data/expected/layout.gpos2/gpos2_1_font7.layout-test.21,23.otf
new file mode 100644 (file)
index 0000000..2fc6e5f
Binary files /dev/null and b/test/subset/data/expected/layout.gpos2/gpos2_1_font7.layout-test.21,23.otf differ
diff --git a/test/subset/data/expected/layout.gpos2/gpos2_1_font7.layout-test.2E,23.otf b/test/subset/data/expected/layout.gpos2/gpos2_1_font7.layout-test.2E,23.otf
new file mode 100644 (file)
index 0000000..e7dead8
Binary files /dev/null and b/test/subset/data/expected/layout.gpos2/gpos2_1_font7.layout-test.2E,23.otf differ
diff --git a/test/subset/data/expected/layout.gpos2/gpos2_1_font7.layout-test.41,42,43.otf b/test/subset/data/expected/layout.gpos2/gpos2_1_font7.layout-test.41,42,43.otf
new file mode 100644 (file)
index 0000000..969d156
Binary files /dev/null and b/test/subset/data/expected/layout.gpos2/gpos2_1_font7.layout-test.41,42,43.otf differ
diff --git a/test/subset/data/expected/layout.gpos2/gpos2_1_font7.layout-test.retain-all-codepoint.otf b/test/subset/data/expected/layout.gpos2/gpos2_1_font7.layout-test.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..a047174
Binary files /dev/null and b/test/subset/data/expected/layout.gpos2/gpos2_1_font7.layout-test.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/layout.gpos2/gpos2_2_font5.keep-layout-retain-gids.21,23,25.otf b/test/subset/data/expected/layout.gpos2/gpos2_2_font5.keep-layout-retain-gids.21,23,25.otf
deleted file mode 100644 (file)
index b34a49f..0000000
Binary files a/test/subset/data/expected/layout.gpos2/gpos2_2_font5.keep-layout-retain-gids.21,23,25.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos2/gpos2_2_font5.keep-layout-retain-gids.21,23.otf b/test/subset/data/expected/layout.gpos2/gpos2_2_font5.keep-layout-retain-gids.21,23.otf
deleted file mode 100644 (file)
index 2ad1d29..0000000
Binary files a/test/subset/data/expected/layout.gpos2/gpos2_2_font5.keep-layout-retain-gids.21,23.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos2/gpos2_2_font5.keep-layout-retain-gids.41,42,43.otf b/test/subset/data/expected/layout.gpos2/gpos2_2_font5.keep-layout-retain-gids.41,42,43.otf
deleted file mode 100644 (file)
index 5d9fe77..0000000
Binary files a/test/subset/data/expected/layout.gpos2/gpos2_2_font5.keep-layout-retain-gids.41,42,43.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos2/gpos2_2_font5.keep-layout-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/layout.gpos2/gpos2_2_font5.keep-layout-retain-gids.retain-all-codepoint.otf
deleted file mode 100644 (file)
index 88e6046..0000000
Binary files a/test/subset/data/expected/layout.gpos2/gpos2_2_font5.keep-layout-retain-gids.retain-all-codepoint.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos2/gpos2_2_font5.keep-layout.21,23,25.otf b/test/subset/data/expected/layout.gpos2/gpos2_2_font5.keep-layout.21,23,25.otf
deleted file mode 100644 (file)
index 195c8dc..0000000
Binary files a/test/subset/data/expected/layout.gpos2/gpos2_2_font5.keep-layout.21,23,25.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos2/gpos2_2_font5.keep-layout.21,23.otf b/test/subset/data/expected/layout.gpos2/gpos2_2_font5.keep-layout.21,23.otf
deleted file mode 100644 (file)
index d10d362..0000000
Binary files a/test/subset/data/expected/layout.gpos2/gpos2_2_font5.keep-layout.21,23.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos2/gpos2_2_font5.keep-layout.41,42,43.otf b/test/subset/data/expected/layout.gpos2/gpos2_2_font5.keep-layout.41,42,43.otf
deleted file mode 100644 (file)
index 83e2e61..0000000
Binary files a/test/subset/data/expected/layout.gpos2/gpos2_2_font5.keep-layout.41,42,43.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos2/gpos2_2_font5.keep-layout.retain-all-codepoint.otf b/test/subset/data/expected/layout.gpos2/gpos2_2_font5.keep-layout.retain-all-codepoint.otf
deleted file mode 100644 (file)
index 88e6046..0000000
Binary files a/test/subset/data/expected/layout.gpos2/gpos2_2_font5.keep-layout.retain-all-codepoint.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos2/gpos2_2_font5.layout-test-retain-gids.21,23,25.otf b/test/subset/data/expected/layout.gpos2/gpos2_2_font5.layout-test-retain-gids.21,23,25.otf
new file mode 100644 (file)
index 0000000..2c67f99
Binary files /dev/null and b/test/subset/data/expected/layout.gpos2/gpos2_2_font5.layout-test-retain-gids.21,23,25.otf differ
diff --git a/test/subset/data/expected/layout.gpos2/gpos2_2_font5.layout-test-retain-gids.21,23.otf b/test/subset/data/expected/layout.gpos2/gpos2_2_font5.layout-test-retain-gids.21,23.otf
new file mode 100644 (file)
index 0000000..267bec4
Binary files /dev/null and b/test/subset/data/expected/layout.gpos2/gpos2_2_font5.layout-test-retain-gids.21,23.otf differ
diff --git a/test/subset/data/expected/layout.gpos2/gpos2_2_font5.layout-test-retain-gids.2E,23.otf b/test/subset/data/expected/layout.gpos2/gpos2_2_font5.layout-test-retain-gids.2E,23.otf
new file mode 100644 (file)
index 0000000..ee13a7f
Binary files /dev/null and b/test/subset/data/expected/layout.gpos2/gpos2_2_font5.layout-test-retain-gids.2E,23.otf differ
diff --git a/test/subset/data/expected/layout.gpos2/gpos2_2_font5.layout-test-retain-gids.41,42,43.otf b/test/subset/data/expected/layout.gpos2/gpos2_2_font5.layout-test-retain-gids.41,42,43.otf
new file mode 100644 (file)
index 0000000..b2ec05c
Binary files /dev/null and b/test/subset/data/expected/layout.gpos2/gpos2_2_font5.layout-test-retain-gids.41,42,43.otf differ
diff --git a/test/subset/data/expected/layout.gpos2/gpos2_2_font5.layout-test-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/layout.gpos2/gpos2_2_font5.layout-test-retain-gids.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..b9c03f0
Binary files /dev/null and b/test/subset/data/expected/layout.gpos2/gpos2_2_font5.layout-test-retain-gids.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/layout.gpos2/gpos2_2_font5.layout-test.21,23,25.otf b/test/subset/data/expected/layout.gpos2/gpos2_2_font5.layout-test.21,23,25.otf
new file mode 100644 (file)
index 0000000..693e784
Binary files /dev/null and b/test/subset/data/expected/layout.gpos2/gpos2_2_font5.layout-test.21,23,25.otf differ
diff --git a/test/subset/data/expected/layout.gpos2/gpos2_2_font5.layout-test.21,23.otf b/test/subset/data/expected/layout.gpos2/gpos2_2_font5.layout-test.21,23.otf
new file mode 100644 (file)
index 0000000..2c0626a
Binary files /dev/null and b/test/subset/data/expected/layout.gpos2/gpos2_2_font5.layout-test.21,23.otf differ
diff --git a/test/subset/data/expected/layout.gpos2/gpos2_2_font5.layout-test.2E,23.otf b/test/subset/data/expected/layout.gpos2/gpos2_2_font5.layout-test.2E,23.otf
new file mode 100644 (file)
index 0000000..bac77bb
Binary files /dev/null and b/test/subset/data/expected/layout.gpos2/gpos2_2_font5.layout-test.2E,23.otf differ
diff --git a/test/subset/data/expected/layout.gpos2/gpos2_2_font5.layout-test.41,42,43.otf b/test/subset/data/expected/layout.gpos2/gpos2_2_font5.layout-test.41,42,43.otf
new file mode 100644 (file)
index 0000000..82d4b3a
Binary files /dev/null and b/test/subset/data/expected/layout.gpos2/gpos2_2_font5.layout-test.41,42,43.otf differ
diff --git a/test/subset/data/expected/layout.gpos2/gpos2_2_font5.layout-test.retain-all-codepoint.otf b/test/subset/data/expected/layout.gpos2/gpos2_2_font5.layout-test.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..b9c03f0
Binary files /dev/null and b/test/subset/data/expected/layout.gpos2/gpos2_2_font5.layout-test.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/layout.gpos3/gpos3_font3.keep-layout-retain-gids.28,29.otf b/test/subset/data/expected/layout.gpos3/gpos3_font3.keep-layout-retain-gids.28,29.otf
deleted file mode 100644 (file)
index 17aa6d8..0000000
Binary files a/test/subset/data/expected/layout.gpos3/gpos3_font3.keep-layout-retain-gids.28,29.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos3/gpos3_font3.keep-layout-retain-gids.28,2B.otf b/test/subset/data/expected/layout.gpos3/gpos3_font3.keep-layout-retain-gids.28,2B.otf
deleted file mode 100644 (file)
index 9e6f2eb..0000000
Binary files a/test/subset/data/expected/layout.gpos3/gpos3_font3.keep-layout-retain-gids.28,2B.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos3/gpos3_font3.keep-layout-retain-gids.29,2B.otf b/test/subset/data/expected/layout.gpos3/gpos3_font3.keep-layout-retain-gids.29,2B.otf
deleted file mode 100644 (file)
index 0187ed7..0000000
Binary files a/test/subset/data/expected/layout.gpos3/gpos3_font3.keep-layout-retain-gids.29,2B.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos3/gpos3_font3.keep-layout-retain-gids.41,42,43.otf b/test/subset/data/expected/layout.gpos3/gpos3_font3.keep-layout-retain-gids.41,42,43.otf
deleted file mode 100644 (file)
index 5c6dcee..0000000
Binary files a/test/subset/data/expected/layout.gpos3/gpos3_font3.keep-layout-retain-gids.41,42,43.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos3/gpos3_font3.keep-layout-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/layout.gpos3/gpos3_font3.keep-layout-retain-gids.retain-all-codepoint.otf
deleted file mode 100644 (file)
index d9b5dfb..0000000
Binary files a/test/subset/data/expected/layout.gpos3/gpos3_font3.keep-layout-retain-gids.retain-all-codepoint.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos3/gpos3_font3.keep-layout.28,29.otf b/test/subset/data/expected/layout.gpos3/gpos3_font3.keep-layout.28,29.otf
deleted file mode 100644 (file)
index f3ca19a..0000000
Binary files a/test/subset/data/expected/layout.gpos3/gpos3_font3.keep-layout.28,29.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos3/gpos3_font3.keep-layout.28,2B.otf b/test/subset/data/expected/layout.gpos3/gpos3_font3.keep-layout.28,2B.otf
deleted file mode 100644 (file)
index 2a8114a..0000000
Binary files a/test/subset/data/expected/layout.gpos3/gpos3_font3.keep-layout.28,2B.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos3/gpos3_font3.keep-layout.29,2B.otf b/test/subset/data/expected/layout.gpos3/gpos3_font3.keep-layout.29,2B.otf
deleted file mode 100644 (file)
index 1426d50..0000000
Binary files a/test/subset/data/expected/layout.gpos3/gpos3_font3.keep-layout.29,2B.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos3/gpos3_font3.keep-layout.41,42,43.otf b/test/subset/data/expected/layout.gpos3/gpos3_font3.keep-layout.41,42,43.otf
deleted file mode 100644 (file)
index aea6a56..0000000
Binary files a/test/subset/data/expected/layout.gpos3/gpos3_font3.keep-layout.41,42,43.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos3/gpos3_font3.keep-layout.retain-all-codepoint.otf b/test/subset/data/expected/layout.gpos3/gpos3_font3.keep-layout.retain-all-codepoint.otf
deleted file mode 100644 (file)
index d9b5dfb..0000000
Binary files a/test/subset/data/expected/layout.gpos3/gpos3_font3.keep-layout.retain-all-codepoint.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos3/gpos3_font3.layout-test-retain-gids.28,29.otf b/test/subset/data/expected/layout.gpos3/gpos3_font3.layout-test-retain-gids.28,29.otf
new file mode 100644 (file)
index 0000000..4784f61
Binary files /dev/null and b/test/subset/data/expected/layout.gpos3/gpos3_font3.layout-test-retain-gids.28,29.otf differ
diff --git a/test/subset/data/expected/layout.gpos3/gpos3_font3.layout-test-retain-gids.28,2B.otf b/test/subset/data/expected/layout.gpos3/gpos3_font3.layout-test-retain-gids.28,2B.otf
new file mode 100644 (file)
index 0000000..25ab8a0
Binary files /dev/null and b/test/subset/data/expected/layout.gpos3/gpos3_font3.layout-test-retain-gids.28,2B.otf differ
diff --git a/test/subset/data/expected/layout.gpos3/gpos3_font3.layout-test-retain-gids.29,2B.otf b/test/subset/data/expected/layout.gpos3/gpos3_font3.layout-test-retain-gids.29,2B.otf
new file mode 100644 (file)
index 0000000..f6225b2
Binary files /dev/null and b/test/subset/data/expected/layout.gpos3/gpos3_font3.layout-test-retain-gids.29,2B.otf differ
diff --git a/test/subset/data/expected/layout.gpos3/gpos3_font3.layout-test-retain-gids.41,42,43.otf b/test/subset/data/expected/layout.gpos3/gpos3_font3.layout-test-retain-gids.41,42,43.otf
new file mode 100644 (file)
index 0000000..2742c80
Binary files /dev/null and b/test/subset/data/expected/layout.gpos3/gpos3_font3.layout-test-retain-gids.41,42,43.otf differ
diff --git a/test/subset/data/expected/layout.gpos3/gpos3_font3.layout-test-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/layout.gpos3/gpos3_font3.layout-test-retain-gids.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..308dcb8
Binary files /dev/null and b/test/subset/data/expected/layout.gpos3/gpos3_font3.layout-test-retain-gids.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/layout.gpos3/gpos3_font3.layout-test.28,29.otf b/test/subset/data/expected/layout.gpos3/gpos3_font3.layout-test.28,29.otf
new file mode 100644 (file)
index 0000000..1111175
Binary files /dev/null and b/test/subset/data/expected/layout.gpos3/gpos3_font3.layout-test.28,29.otf differ
diff --git a/test/subset/data/expected/layout.gpos3/gpos3_font3.layout-test.28,2B.otf b/test/subset/data/expected/layout.gpos3/gpos3_font3.layout-test.28,2B.otf
new file mode 100644 (file)
index 0000000..a0f56c9
Binary files /dev/null and b/test/subset/data/expected/layout.gpos3/gpos3_font3.layout-test.28,2B.otf differ
diff --git a/test/subset/data/expected/layout.gpos3/gpos3_font3.layout-test.29,2B.otf b/test/subset/data/expected/layout.gpos3/gpos3_font3.layout-test.29,2B.otf
new file mode 100644 (file)
index 0000000..9e882c1
Binary files /dev/null and b/test/subset/data/expected/layout.gpos3/gpos3_font3.layout-test.29,2B.otf differ
diff --git a/test/subset/data/expected/layout.gpos3/gpos3_font3.layout-test.41,42,43.otf b/test/subset/data/expected/layout.gpos3/gpos3_font3.layout-test.41,42,43.otf
new file mode 100644 (file)
index 0000000..c7a4eb4
Binary files /dev/null and b/test/subset/data/expected/layout.gpos3/gpos3_font3.layout-test.41,42,43.otf differ
diff --git a/test/subset/data/expected/layout.gpos3/gpos3_font3.layout-test.retain-all-codepoint.otf b/test/subset/data/expected/layout.gpos3/gpos3_font3.layout-test.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..308dcb8
Binary files /dev/null and b/test/subset/data/expected/layout.gpos3/gpos3_font3.layout-test.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,42,43,44.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,42,43,44.otf
deleted file mode 100644 (file)
index 1c2e5a4..0000000
Binary files a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,42,43,44.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,42,43,45.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,42,43,45.otf
deleted file mode 100644 (file)
index 2fed45d..0000000
Binary files a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,42,43,45.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,42,43.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,42,43.otf
deleted file mode 100644 (file)
index 0007615..0000000
Binary files a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,42,43.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,42.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,42.otf
deleted file mode 100644 (file)
index 8eb6ace..0000000
Binary files a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,42.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,43,44,45,46.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,43,44,45,46.otf
deleted file mode 100644 (file)
index 73315f3..0000000
Binary files a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,43,44,45,46.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,43,44.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,43,44.otf
deleted file mode 100644 (file)
index 4005a0d..0000000
Binary files a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,43,44.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,43,45.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,43,45.otf
deleted file mode 100644 (file)
index c9f261c..0000000
Binary files a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,43,45.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,43.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,43.otf
deleted file mode 100644 (file)
index 9ed6a9b..0000000
Binary files a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,43.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41.otf
deleted file mode 100644 (file)
index f50cc90..0000000
Binary files a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.retain-all-codepoint.otf
deleted file mode 100644 (file)
index d4f9fc0..0000000
Binary files a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.retain-all-codepoint.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,42,43,44.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,42,43,44.otf
deleted file mode 100644 (file)
index 5447973..0000000
Binary files a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,42,43,44.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,42,43,45.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,42,43,45.otf
deleted file mode 100644 (file)
index e6c891b..0000000
Binary files a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,42,43,45.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,42,43.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,42,43.otf
deleted file mode 100644 (file)
index 127f798..0000000
Binary files a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,42,43.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,42.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,42.otf
deleted file mode 100644 (file)
index 6cafcb8..0000000
Binary files a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,42.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,43,44,45,46.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,43,44,45,46.otf
deleted file mode 100644 (file)
index 5f47542..0000000
Binary files a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,43,44,45,46.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,43,44.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,43,44.otf
deleted file mode 100644 (file)
index 8fe4d63..0000000
Binary files a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,43,44.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,43,45.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,43,45.otf
deleted file mode 100644 (file)
index 147ed57..0000000
Binary files a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,43,45.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,43.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,43.otf
deleted file mode 100644 (file)
index 1b0f243..0000000
Binary files a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,43.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41.otf
deleted file mode 100644 (file)
index 657b686..0000000
Binary files a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.retain-all-codepoint.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.retain-all-codepoint.otf
deleted file mode 100644 (file)
index d4f9fc0..0000000
Binary files a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.retain-all-codepoint.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test-retain-gids.41,42,43,44.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test-retain-gids.41,42,43,44.otf
new file mode 100644 (file)
index 0000000..af2af9f
Binary files /dev/null and b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test-retain-gids.41,42,43,44.otf differ
diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test-retain-gids.41,42,43,45.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test-retain-gids.41,42,43,45.otf
new file mode 100644 (file)
index 0000000..9a74dd1
Binary files /dev/null and b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test-retain-gids.41,42,43,45.otf differ
diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test-retain-gids.41,42,43.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test-retain-gids.41,42,43.otf
new file mode 100644 (file)
index 0000000..2c72bad
Binary files /dev/null and b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test-retain-gids.41,42,43.otf differ
diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test-retain-gids.41,42.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test-retain-gids.41,42.otf
new file mode 100644 (file)
index 0000000..dab6fdd
Binary files /dev/null and b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test-retain-gids.41,42.otf differ
diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test-retain-gids.41,43,44,45,46.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test-retain-gids.41,43,44,45,46.otf
new file mode 100644 (file)
index 0000000..9c0853b
Binary files /dev/null and b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test-retain-gids.41,43,44,45,46.otf differ
diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test-retain-gids.41,43,44.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test-retain-gids.41,43,44.otf
new file mode 100644 (file)
index 0000000..5f57975
Binary files /dev/null and b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test-retain-gids.41,43,44.otf differ
diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test-retain-gids.41,43,45.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test-retain-gids.41,43,45.otf
new file mode 100644 (file)
index 0000000..3dcc084
Binary files /dev/null and b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test-retain-gids.41,43,45.otf differ
diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test-retain-gids.41,43.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test-retain-gids.41,43.otf
new file mode 100644 (file)
index 0000000..ada1a54
Binary files /dev/null and b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test-retain-gids.41,43.otf differ
diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test-retain-gids.41.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test-retain-gids.41.otf
new file mode 100644 (file)
index 0000000..656c6e3
Binary files /dev/null and b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test-retain-gids.41.otf differ
diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test-retain-gids.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..8dd5444
Binary files /dev/null and b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test-retain-gids.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test.41,42,43,44.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test.41,42,43,44.otf
new file mode 100644 (file)
index 0000000..58889d6
Binary files /dev/null and b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test.41,42,43,44.otf differ
diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test.41,42,43,45.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test.41,42,43,45.otf
new file mode 100644 (file)
index 0000000..8c0c211
Binary files /dev/null and b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test.41,42,43,45.otf differ
diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test.41,42,43.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test.41,42,43.otf
new file mode 100644 (file)
index 0000000..3aff353
Binary files /dev/null and b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test.41,42,43.otf differ
diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test.41,42.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test.41,42.otf
new file mode 100644 (file)
index 0000000..cb75819
Binary files /dev/null and b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test.41,42.otf differ
diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test.41,43,44,45,46.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test.41,43,44,45,46.otf
new file mode 100644 (file)
index 0000000..9776758
Binary files /dev/null and b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test.41,43,44,45,46.otf differ
diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test.41,43,44.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test.41,43,44.otf
new file mode 100644 (file)
index 0000000..bc06070
Binary files /dev/null and b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test.41,43,44.otf differ
diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test.41,43,45.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test.41,43,45.otf
new file mode 100644 (file)
index 0000000..3d87498
Binary files /dev/null and b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test.41,43,45.otf differ
diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test.41,43.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test.41,43.otf
new file mode 100644 (file)
index 0000000..fc99dd8
Binary files /dev/null and b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test.41,43.otf differ
diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test.41.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test.41.otf
new file mode 100644 (file)
index 0000000..6395a87
Binary files /dev/null and b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test.41.otf differ
diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test.retain-all-codepoint.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..8dd5444
Binary files /dev/null and b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.layout-test.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test-retain-gids.41,42,43,44.otf b/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test-retain-gids.41,42,43,44.otf
new file mode 100644 (file)
index 0000000..0313313
Binary files /dev/null and b/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test-retain-gids.41,42,43,44.otf differ
diff --git a/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test-retain-gids.41,42,43,45.otf b/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test-retain-gids.41,42,43,45.otf
new file mode 100644 (file)
index 0000000..99116b4
Binary files /dev/null and b/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test-retain-gids.41,42,43,45.otf differ
diff --git a/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test-retain-gids.41,42,43.otf b/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test-retain-gids.41,42,43.otf
new file mode 100644 (file)
index 0000000..564d0c5
Binary files /dev/null and b/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test-retain-gids.41,42,43.otf differ
diff --git a/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test-retain-gids.41,42,44.otf b/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test-retain-gids.41,42,44.otf
new file mode 100644 (file)
index 0000000..1dcc5bd
Binary files /dev/null and b/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test-retain-gids.41,42,44.otf differ
diff --git a/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test-retain-gids.41,42,45.otf b/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test-retain-gids.41,42,45.otf
new file mode 100644 (file)
index 0000000..9c330c7
Binary files /dev/null and b/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test-retain-gids.41,42,45.otf differ
diff --git a/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test-retain-gids.41,42.otf b/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test-retain-gids.41,42.otf
new file mode 100644 (file)
index 0000000..1965933
Binary files /dev/null and b/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test-retain-gids.41,42.otf differ
diff --git a/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test-retain-gids.41,43.otf b/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test-retain-gids.41,43.otf
new file mode 100644 (file)
index 0000000..8ee98e9
Binary files /dev/null and b/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test-retain-gids.41,43.otf differ
diff --git a/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test-retain-gids.41.otf b/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test-retain-gids.41.otf
new file mode 100644 (file)
index 0000000..10c7629
Binary files /dev/null and b/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test-retain-gids.41.otf differ
diff --git a/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test-retain-gids.42.otf b/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test-retain-gids.42.otf
new file mode 100644 (file)
index 0000000..f7e92d6
Binary files /dev/null and b/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test-retain-gids.42.otf differ
diff --git a/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test-retain-gids.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..32ffff9
Binary files /dev/null and b/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test-retain-gids.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test.41,42,43,44.otf b/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test.41,42,43,44.otf
new file mode 100644 (file)
index 0000000..6ff7711
Binary files /dev/null and b/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test.41,42,43,44.otf differ
diff --git a/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test.41,42,43,45.otf b/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test.41,42,43,45.otf
new file mode 100644 (file)
index 0000000..bf8265e
Binary files /dev/null and b/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test.41,42,43,45.otf differ
diff --git a/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test.41,42,43.otf b/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test.41,42,43.otf
new file mode 100644 (file)
index 0000000..8f41e96
Binary files /dev/null and b/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test.41,42,43.otf differ
diff --git a/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test.41,42,44.otf b/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test.41,42,44.otf
new file mode 100644 (file)
index 0000000..63d5b1a
Binary files /dev/null and b/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test.41,42,44.otf differ
diff --git a/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test.41,42,45.otf b/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test.41,42,45.otf
new file mode 100644 (file)
index 0000000..2d5de06
Binary files /dev/null and b/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test.41,42,45.otf differ
diff --git a/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test.41,42.otf b/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test.41,42.otf
new file mode 100644 (file)
index 0000000..aecd96a
Binary files /dev/null and b/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test.41,42.otf differ
diff --git a/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test.41,43.otf b/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test.41,43.otf
new file mode 100644 (file)
index 0000000..19b6c7b
Binary files /dev/null and b/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test.41,43.otf differ
diff --git a/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test.41.otf b/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test.41.otf
new file mode 100644 (file)
index 0000000..81b6196
Binary files /dev/null and b/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test.41.otf differ
diff --git a/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test.42.otf b/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test.42.otf
new file mode 100644 (file)
index 0000000..4ac9a09
Binary files /dev/null and b/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test.42.otf differ
diff --git a/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test.retain-all-codepoint.otf b/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..32ffff9
Binary files /dev/null and b/test/subset/data/expected/layout.gpos5/gpos5_font1.layout-test.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.41,42,43,44.otf b/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.41,42,43,44.otf
deleted file mode 100644 (file)
index 92d1e28..0000000
Binary files a/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.41,42,43,44.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.41,42,43,45.otf b/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.41,42,43,45.otf
deleted file mode 100644 (file)
index 28d5cb4..0000000
Binary files a/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.41,42,43,45.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.41,42,43.otf b/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.41,42,43.otf
deleted file mode 100644 (file)
index 7d58a98..0000000
Binary files a/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.41,42,43.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.41,42.otf b/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.41,42.otf
deleted file mode 100644 (file)
index 4261081..0000000
Binary files a/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.41,42.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.41,43,44,45,46.otf b/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.41,43,44,45,46.otf
deleted file mode 100644 (file)
index d944ebf..0000000
Binary files a/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.41,43,44,45,46.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.41,43,44.otf b/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.41,43,44.otf
deleted file mode 100644 (file)
index 7dc3d62..0000000
Binary files a/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.41,43,44.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.41,43,45.otf b/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.41,43,45.otf
deleted file mode 100644 (file)
index f7727d4..0000000
Binary files a/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.41,43,45.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.41,43.otf b/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.41,43.otf
deleted file mode 100644 (file)
index 7e564d5..0000000
Binary files a/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.41,43.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.41.otf b/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.41.otf
deleted file mode 100644 (file)
index c9ae1c7..0000000
Binary files a/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.41.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.retain-all-codepoint.otf
deleted file mode 100644 (file)
index f636342..0000000
Binary files a/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.retain-all-codepoint.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41,42,43,44.otf b/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41,42,43,44.otf
deleted file mode 100644 (file)
index 106c55a..0000000
Binary files a/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41,42,43,44.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41,42,43,45.otf b/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41,42,43,45.otf
deleted file mode 100644 (file)
index ba37625..0000000
Binary files a/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41,42,43,45.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41,42,43.otf b/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41,42,43.otf
deleted file mode 100644 (file)
index 8a6aa87..0000000
Binary files a/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41,42,43.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41,42.otf b/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41,42.otf
deleted file mode 100644 (file)
index 1b8a1ca..0000000
Binary files a/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41,42.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41,43,44,45,46.otf b/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41,43,44,45,46.otf
deleted file mode 100644 (file)
index 09e27e6..0000000
Binary files a/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41,43,44,45,46.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41,43,44.otf b/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41,43,44.otf
deleted file mode 100644 (file)
index 48e8928..0000000
Binary files a/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41,43,44.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41,43,45.otf b/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41,43,45.otf
deleted file mode 100644 (file)
index e4656fe..0000000
Binary files a/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41,43,45.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41,43.otf b/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41,43.otf
deleted file mode 100644 (file)
index 5527d9f..0000000
Binary files a/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41,43.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41.otf b/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41.otf
deleted file mode 100644 (file)
index c151b9d..0000000
Binary files a/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.retain-all-codepoint.otf b/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.retain-all-codepoint.otf
deleted file mode 100644 (file)
index f636342..0000000
Binary files a/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.retain-all-codepoint.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test-retain-gids.41,42,43,44.otf b/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test-retain-gids.41,42,43,44.otf
new file mode 100644 (file)
index 0000000..8f46239
Binary files /dev/null and b/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test-retain-gids.41,42,43,44.otf differ
diff --git a/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test-retain-gids.41,42,43,45.otf b/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test-retain-gids.41,42,43,45.otf
new file mode 100644 (file)
index 0000000..e1ae2bc
Binary files /dev/null and b/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test-retain-gids.41,42,43,45.otf differ
diff --git a/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test-retain-gids.41,42,43.otf b/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test-retain-gids.41,42,43.otf
new file mode 100644 (file)
index 0000000..42b332e
Binary files /dev/null and b/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test-retain-gids.41,42,43.otf differ
diff --git a/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test-retain-gids.41,42.otf b/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test-retain-gids.41,42.otf
new file mode 100644 (file)
index 0000000..8028c9d
Binary files /dev/null and b/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test-retain-gids.41,42.otf differ
diff --git a/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test-retain-gids.41,43,44,45,46.otf b/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test-retain-gids.41,43,44,45,46.otf
new file mode 100644 (file)
index 0000000..3e9f1e7
Binary files /dev/null and b/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test-retain-gids.41,43,44,45,46.otf differ
diff --git a/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test-retain-gids.41,43,44.otf b/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test-retain-gids.41,43,44.otf
new file mode 100644 (file)
index 0000000..ea47831
Binary files /dev/null and b/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test-retain-gids.41,43,44.otf differ
diff --git a/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test-retain-gids.41,43,45.otf b/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test-retain-gids.41,43,45.otf
new file mode 100644 (file)
index 0000000..79206e8
Binary files /dev/null and b/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test-retain-gids.41,43,45.otf differ
diff --git a/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test-retain-gids.41,43.otf b/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test-retain-gids.41,43.otf
new file mode 100644 (file)
index 0000000..db066b7
Binary files /dev/null and b/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test-retain-gids.41,43.otf differ
diff --git a/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test-retain-gids.41.otf b/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test-retain-gids.41.otf
new file mode 100644 (file)
index 0000000..7019ee3
Binary files /dev/null and b/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test-retain-gids.41.otf differ
diff --git a/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test-retain-gids.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..59c911d
Binary files /dev/null and b/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test-retain-gids.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test.41,42,43,44.otf b/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test.41,42,43,44.otf
new file mode 100644 (file)
index 0000000..b4d50a9
Binary files /dev/null and b/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test.41,42,43,44.otf differ
diff --git a/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test.41,42,43,45.otf b/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test.41,42,43,45.otf
new file mode 100644 (file)
index 0000000..e39e1b9
Binary files /dev/null and b/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test.41,42,43,45.otf differ
diff --git a/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test.41,42,43.otf b/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test.41,42,43.otf
new file mode 100644 (file)
index 0000000..a328c7e
Binary files /dev/null and b/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test.41,42,43.otf differ
diff --git a/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test.41,42.otf b/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test.41,42.otf
new file mode 100644 (file)
index 0000000..5b6424a
Binary files /dev/null and b/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test.41,42.otf differ
diff --git a/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test.41,43,44,45,46.otf b/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test.41,43,44,45,46.otf
new file mode 100644 (file)
index 0000000..21b1983
Binary files /dev/null and b/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test.41,43,44,45,46.otf differ
diff --git a/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test.41,43,44.otf b/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test.41,43,44.otf
new file mode 100644 (file)
index 0000000..c23f81b
Binary files /dev/null and b/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test.41,43,44.otf differ
diff --git a/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test.41,43,45.otf b/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test.41,43,45.otf
new file mode 100644 (file)
index 0000000..69b2e46
Binary files /dev/null and b/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test.41,43,45.otf differ
diff --git a/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test.41,43.otf b/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test.41,43.otf
new file mode 100644 (file)
index 0000000..d533fa0
Binary files /dev/null and b/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test.41,43.otf differ
diff --git a/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test.41.otf b/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test.41.otf
new file mode 100644 (file)
index 0000000..3cbf9fd
Binary files /dev/null and b/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test.41.otf differ
diff --git a/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test.retain-all-codepoint.otf b/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..59c911d
Binary files /dev/null and b/test/subset/data/expected/layout.gpos6/gpos6_font1.layout-test.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/layout.gpos8.amiri/Amiri-Regular.default.627,644,623,62D,644,627,645,2E.ttf b/test/subset/data/expected/layout.gpos8.amiri/Amiri-Regular.default.627,644,623,62D,644,627,645,2E.ttf
new file mode 100644 (file)
index 0000000..8c905f6
Binary files /dev/null and b/test/subset/data/expected/layout.gpos8.amiri/Amiri-Regular.default.627,644,623,62D,644,627,645,2E.ttf differ
diff --git a/test/subset/data/expected/layout.gpos8.amiri/Amiri-Regular.default.627,644,62D,628.ttf b/test/subset/data/expected/layout.gpos8.amiri/Amiri-Regular.default.627,644,62D,628.ttf
new file mode 100644 (file)
index 0000000..b286e53
Binary files /dev/null and b/test/subset/data/expected/layout.gpos8.amiri/Amiri-Regular.default.627,644,62D,628.ttf differ
diff --git a/test/subset/data/expected/layout.gpos8.amiri/Amiri-Regular.default.627,644.ttf b/test/subset/data/expected/layout.gpos8.amiri/Amiri-Regular.default.627,644.ttf
new file mode 100644 (file)
index 0000000..dd9e475
Binary files /dev/null and b/test/subset/data/expected/layout.gpos8.amiri/Amiri-Regular.default.627,644.ttf differ
diff --git a/test/subset/data/expected/layout.gpos8.amiri/Amiri-Regular.default.633,645,627,621,20,644,627.ttf b/test/subset/data/expected/layout.gpos8.amiri/Amiri-Regular.default.633,645,627,621,20,644,627.ttf
new file mode 100644 (file)
index 0000000..6c8c557
Binary files /dev/null and b/test/subset/data/expected/layout.gpos8.amiri/Amiri-Regular.default.633,645,627,621,20,644,627.ttf differ
diff --git a/test/subset/data/expected/layout.gpos8.amiri/Amiri-Regular.default.63A,64A,631.ttf b/test/subset/data/expected/layout.gpos8.amiri/Amiri-Regular.default.63A,64A,631.ttf
new file mode 100644 (file)
index 0000000..f04f721
Binary files /dev/null and b/test/subset/data/expected/layout.gpos8.amiri/Amiri-Regular.default.63A,64A,631.ttf differ
diff --git a/test/subset/data/expected/layout.gpos8.amiri/Amiri-Regular.retain-gids.627,644,623,62D,644,627,645,2E.ttf b/test/subset/data/expected/layout.gpos8.amiri/Amiri-Regular.retain-gids.627,644,623,62D,644,627,645,2E.ttf
new file mode 100644 (file)
index 0000000..c37f0b6
Binary files /dev/null and b/test/subset/data/expected/layout.gpos8.amiri/Amiri-Regular.retain-gids.627,644,623,62D,644,627,645,2E.ttf differ
diff --git a/test/subset/data/expected/layout.gpos8.amiri/Amiri-Regular.retain-gids.627,644,62D,628.ttf b/test/subset/data/expected/layout.gpos8.amiri/Amiri-Regular.retain-gids.627,644,62D,628.ttf
new file mode 100644 (file)
index 0000000..5559015
Binary files /dev/null and b/test/subset/data/expected/layout.gpos8.amiri/Amiri-Regular.retain-gids.627,644,62D,628.ttf differ
diff --git a/test/subset/data/expected/layout.gpos8.amiri/Amiri-Regular.retain-gids.627,644.ttf b/test/subset/data/expected/layout.gpos8.amiri/Amiri-Regular.retain-gids.627,644.ttf
new file mode 100644 (file)
index 0000000..c1c9fa3
Binary files /dev/null and b/test/subset/data/expected/layout.gpos8.amiri/Amiri-Regular.retain-gids.627,644.ttf differ
diff --git a/test/subset/data/expected/layout.gpos8.amiri/Amiri-Regular.retain-gids.633,645,627,621,20,644,627.ttf b/test/subset/data/expected/layout.gpos8.amiri/Amiri-Regular.retain-gids.633,645,627,621,20,644,627.ttf
new file mode 100644 (file)
index 0000000..fd99ae3
Binary files /dev/null and b/test/subset/data/expected/layout.gpos8.amiri/Amiri-Regular.retain-gids.633,645,627,621,20,644,627.ttf differ
diff --git a/test/subset/data/expected/layout.gpos8.amiri/Amiri-Regular.retain-gids.63A,64A,631.ttf b/test/subset/data/expected/layout.gpos8.amiri/Amiri-Regular.retain-gids.63A,64A,631.ttf
new file mode 100644 (file)
index 0000000..b5a7b43
Binary files /dev/null and b/test/subset/data/expected/layout.gpos8.amiri/Amiri-Regular.retain-gids.63A,64A,631.ttf differ
diff --git a/test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.keep-layout-retain-gids.30,31,32,33.otf b/test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.keep-layout-retain-gids.30,31,32,33.otf
deleted file mode 100644 (file)
index 61f41df..0000000
Binary files a/test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.keep-layout-retain-gids.30,31,32,33.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.keep-layout-retain-gids.41,42,43.otf b/test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.keep-layout-retain-gids.41,42,43.otf
deleted file mode 100644 (file)
index 3190942..0000000
Binary files a/test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.keep-layout-retain-gids.41,42,43.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.keep-layout-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.keep-layout-retain-gids.retain-all-codepoint.otf
deleted file mode 100644 (file)
index 3fabe71..0000000
Binary files a/test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.keep-layout-retain-gids.retain-all-codepoint.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.keep-layout.30,31,32,33.otf b/test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.keep-layout.30,31,32,33.otf
deleted file mode 100644 (file)
index 34966da..0000000
Binary files a/test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.keep-layout.30,31,32,33.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.keep-layout.41,42,43.otf b/test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.keep-layout.41,42,43.otf
deleted file mode 100644 (file)
index 206062b..0000000
Binary files a/test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.keep-layout.41,42,43.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.keep-layout.retain-all-codepoint.otf b/test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.keep-layout.retain-all-codepoint.otf
deleted file mode 100644 (file)
index 3fabe71..0000000
Binary files a/test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.keep-layout.retain-all-codepoint.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.layout-test-retain-gids.30,31,32,33.otf b/test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.layout-test-retain-gids.30,31,32,33.otf
new file mode 100644 (file)
index 0000000..445f567
Binary files /dev/null and b/test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.layout-test-retain-gids.30,31,32,33.otf differ
diff --git a/test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.layout-test-retain-gids.41,42,43.otf b/test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.layout-test-retain-gids.41,42,43.otf
new file mode 100644 (file)
index 0000000..456575a
Binary files /dev/null and b/test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.layout-test-retain-gids.41,42,43.otf differ
diff --git a/test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.layout-test-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.layout-test-retain-gids.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..f1d3e43
Binary files /dev/null and b/test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.layout-test-retain-gids.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.layout-test.30,31,32,33.otf b/test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.layout-test.30,31,32,33.otf
new file mode 100644 (file)
index 0000000..bc47f58
Binary files /dev/null and b/test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.layout-test.30,31,32,33.otf differ
diff --git a/test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.layout-test.41,42,43.otf b/test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.layout-test.41,42,43.otf
new file mode 100644 (file)
index 0000000..babb9d5
Binary files /dev/null and b/test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.layout-test.41,42,43.otf differ
diff --git a/test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.layout-test.retain-all-codepoint.otf b/test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.layout-test.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..f1d3e43
Binary files /dev/null and b/test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.layout-test.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.keep-layout-retain-gids.30,31,32,33.otf b/test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.keep-layout-retain-gids.30,31,32,33.otf
deleted file mode 100644 (file)
index 4c3af13..0000000
Binary files a/test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.keep-layout-retain-gids.30,31,32,33.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.keep-layout-retain-gids.41,42,43.otf b/test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.keep-layout-retain-gids.41,42,43.otf
deleted file mode 100644 (file)
index 4a10c76..0000000
Binary files a/test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.keep-layout-retain-gids.41,42,43.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.keep-layout-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.keep-layout-retain-gids.retain-all-codepoint.otf
deleted file mode 100644 (file)
index 53dccf9..0000000
Binary files a/test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.keep-layout-retain-gids.retain-all-codepoint.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.keep-layout.30,31,32,33.otf b/test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.keep-layout.30,31,32,33.otf
deleted file mode 100644 (file)
index 7130a4c..0000000
Binary files a/test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.keep-layout.30,31,32,33.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.keep-layout.41,42,43.otf b/test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.keep-layout.41,42,43.otf
deleted file mode 100644 (file)
index b64fb14..0000000
Binary files a/test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.keep-layout.41,42,43.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.keep-layout.retain-all-codepoint.otf b/test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.keep-layout.retain-all-codepoint.otf
deleted file mode 100644 (file)
index 53dccf9..0000000
Binary files a/test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.keep-layout.retain-all-codepoint.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.layout-test-retain-gids.30,31,32,33.otf b/test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.layout-test-retain-gids.30,31,32,33.otf
new file mode 100644 (file)
index 0000000..77f9ce0
Binary files /dev/null and b/test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.layout-test-retain-gids.30,31,32,33.otf differ
diff --git a/test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.layout-test-retain-gids.41,42,43.otf b/test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.layout-test-retain-gids.41,42,43.otf
new file mode 100644 (file)
index 0000000..60bf6f0
Binary files /dev/null and b/test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.layout-test-retain-gids.41,42,43.otf differ
diff --git a/test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.layout-test-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.layout-test-retain-gids.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..7d4dea0
Binary files /dev/null and b/test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.layout-test-retain-gids.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.layout-test.30,31,32,33.otf b/test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.layout-test.30,31,32,33.otf
new file mode 100644 (file)
index 0000000..e57101a
Binary files /dev/null and b/test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.layout-test.30,31,32,33.otf differ
diff --git a/test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.layout-test.41,42,43.otf b/test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.layout-test.41,42,43.otf
new file mode 100644 (file)
index 0000000..41bc343
Binary files /dev/null and b/test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.layout-test.41,42,43.otf differ
diff --git a/test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.layout-test.retain-all-codepoint.otf b/test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.layout-test.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..7d4dea0
Binary files /dev/null and b/test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.layout-test.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.keep-layout-retain-gids.30,31,32,33.otf b/test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.keep-layout-retain-gids.30,31,32,33.otf
deleted file mode 100644 (file)
index 9bc50e5..0000000
Binary files a/test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.keep-layout-retain-gids.30,31,32,33.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.keep-layout-retain-gids.41,42,43.otf b/test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.keep-layout-retain-gids.41,42,43.otf
deleted file mode 100644 (file)
index 66b1941..0000000
Binary files a/test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.keep-layout-retain-gids.41,42,43.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.keep-layout-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.keep-layout-retain-gids.retain-all-codepoint.otf
deleted file mode 100644 (file)
index e7cc68d..0000000
Binary files a/test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.keep-layout-retain-gids.retain-all-codepoint.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.keep-layout.30,31,32,33.otf b/test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.keep-layout.30,31,32,33.otf
deleted file mode 100644 (file)
index 55f3f66..0000000
Binary files a/test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.keep-layout.30,31,32,33.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.keep-layout.41,42,43.otf b/test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.keep-layout.41,42,43.otf
deleted file mode 100644 (file)
index 5f69d87..0000000
Binary files a/test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.keep-layout.41,42,43.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.keep-layout.retain-all-codepoint.otf b/test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.keep-layout.retain-all-codepoint.otf
deleted file mode 100644 (file)
index e7cc68d..0000000
Binary files a/test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.keep-layout.retain-all-codepoint.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.layout-test-retain-gids.30,31,32,33.otf b/test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.layout-test-retain-gids.30,31,32,33.otf
new file mode 100644 (file)
index 0000000..09452d9
Binary files /dev/null and b/test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.layout-test-retain-gids.30,31,32,33.otf differ
diff --git a/test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.layout-test-retain-gids.41,42,43.otf b/test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.layout-test-retain-gids.41,42,43.otf
new file mode 100644 (file)
index 0000000..66edc45
Binary files /dev/null and b/test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.layout-test-retain-gids.41,42,43.otf differ
diff --git a/test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.layout-test-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.layout-test-retain-gids.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..554fb54
Binary files /dev/null and b/test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.layout-test-retain-gids.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.layout-test.30,31,32,33.otf b/test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.layout-test.30,31,32,33.otf
new file mode 100644 (file)
index 0000000..f72d0cc
Binary files /dev/null and b/test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.layout-test.30,31,32,33.otf differ
diff --git a/test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.layout-test.41,42,43.otf b/test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.layout-test.41,42,43.otf
new file mode 100644 (file)
index 0000000..33abe62
Binary files /dev/null and b/test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.layout-test.41,42,43.otf differ
diff --git a/test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.layout-test.retain-all-codepoint.otf b/test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.layout-test.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..554fb54
Binary files /dev/null and b/test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.layout-test.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/layout.gpos9/gpos9_font2.layout-test-retain-gids.41,42.otf b/test/subset/data/expected/layout.gpos9/gpos9_font2.layout-test-retain-gids.41,42.otf
new file mode 100644 (file)
index 0000000..c382ed2
Binary files /dev/null and b/test/subset/data/expected/layout.gpos9/gpos9_font2.layout-test-retain-gids.41,42.otf differ
diff --git a/test/subset/data/expected/layout.gpos9/gpos9_font2.layout-test-retain-gids.41.otf b/test/subset/data/expected/layout.gpos9/gpos9_font2.layout-test-retain-gids.41.otf
new file mode 100644 (file)
index 0000000..0ff63b9
Binary files /dev/null and b/test/subset/data/expected/layout.gpos9/gpos9_font2.layout-test-retain-gids.41.otf differ
diff --git a/test/subset/data/expected/layout.gpos9/gpos9_font2.layout-test-retain-gids.42.otf b/test/subset/data/expected/layout.gpos9/gpos9_font2.layout-test-retain-gids.42.otf
new file mode 100644 (file)
index 0000000..7981553
Binary files /dev/null and b/test/subset/data/expected/layout.gpos9/gpos9_font2.layout-test-retain-gids.42.otf differ
diff --git a/test/subset/data/expected/layout.gpos9/gpos9_font2.layout-test.41,42.otf b/test/subset/data/expected/layout.gpos9/gpos9_font2.layout-test.41,42.otf
new file mode 100644 (file)
index 0000000..f2406c5
Binary files /dev/null and b/test/subset/data/expected/layout.gpos9/gpos9_font2.layout-test.41,42.otf differ
diff --git a/test/subset/data/expected/layout.gpos9/gpos9_font2.layout-test.41.otf b/test/subset/data/expected/layout.gpos9/gpos9_font2.layout-test.41.otf
new file mode 100644 (file)
index 0000000..32f8025
Binary files /dev/null and b/test/subset/data/expected/layout.gpos9/gpos9_font2.layout-test.41.otf differ
diff --git a/test/subset/data/expected/layout.gpos9/gpos9_font2.layout-test.42.otf b/test/subset/data/expected/layout.gpos9/gpos9_font2.layout-test.42.otf
new file mode 100644 (file)
index 0000000..da45812
Binary files /dev/null and b/test/subset/data/expected/layout.gpos9/gpos9_font2.layout-test.42.otf differ
diff --git a/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.keep-layout-retain-gids.53A9,53F1.otf b/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.keep-layout-retain-gids.53A9,53F1.otf
deleted file mode 100644 (file)
index 1d67ee4..0000000
Binary files a/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.keep-layout-retain-gids.53A9,53F1.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.keep-layout-retain-gids.53A9.otf b/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.keep-layout-retain-gids.53A9.otf
deleted file mode 100644 (file)
index 31fc761..0000000
Binary files a/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.keep-layout-retain-gids.53A9.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.keep-layout-retain-gids.53F1.otf b/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.keep-layout-retain-gids.53F1.otf
deleted file mode 100644 (file)
index 2fd89a4..0000000
Binary files a/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.keep-layout-retain-gids.53F1.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.keep-layout-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.keep-layout-retain-gids.retain-all-codepoint.otf
deleted file mode 100644 (file)
index e737ed1..0000000
Binary files a/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.keep-layout-retain-gids.retain-all-codepoint.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.keep-layout.53A9,53F1.otf b/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.keep-layout.53A9,53F1.otf
deleted file mode 100644 (file)
index 685c2c9..0000000
Binary files a/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.keep-layout.53A9,53F1.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.keep-layout.53A9.otf b/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.keep-layout.53A9.otf
deleted file mode 100644 (file)
index fc1f61b..0000000
Binary files a/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.keep-layout.53A9.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.keep-layout.53F1.otf b/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.keep-layout.53F1.otf
deleted file mode 100644 (file)
index 367edeb..0000000
Binary files a/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.keep-layout.53F1.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.keep-layout.retain-all-codepoint.otf b/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.keep-layout.retain-all-codepoint.otf
deleted file mode 100644 (file)
index c55b233..0000000
Binary files a/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.keep-layout.retain-all-codepoint.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.layout-test-retain-gids.53A9,53F1.otf b/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.layout-test-retain-gids.53A9,53F1.otf
new file mode 100644 (file)
index 0000000..9a58fee
Binary files /dev/null and b/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.layout-test-retain-gids.53A9,53F1.otf differ
diff --git a/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.layout-test-retain-gids.53A9.otf b/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.layout-test-retain-gids.53A9.otf
new file mode 100644 (file)
index 0000000..c5c9146
Binary files /dev/null and b/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.layout-test-retain-gids.53A9.otf differ
diff --git a/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.layout-test-retain-gids.53F1.otf b/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.layout-test-retain-gids.53F1.otf
new file mode 100644 (file)
index 0000000..1b11e10
Binary files /dev/null and b/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.layout-test-retain-gids.53F1.otf differ
diff --git a/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.layout-test-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.layout-test-retain-gids.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..7249c5a
Binary files /dev/null and b/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.layout-test-retain-gids.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.layout-test.53A9,53F1.otf b/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.layout-test.53A9,53F1.otf
new file mode 100644 (file)
index 0000000..91357c9
Binary files /dev/null and b/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.layout-test.53A9,53F1.otf differ
diff --git a/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.layout-test.53A9.otf b/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.layout-test.53A9.otf
new file mode 100644 (file)
index 0000000..df08b73
Binary files /dev/null and b/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.layout-test.53A9.otf differ
diff --git a/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.layout-test.53F1.otf b/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.layout-test.53F1.otf
new file mode 100644 (file)
index 0000000..39da89b
Binary files /dev/null and b/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.layout-test.53F1.otf differ
diff --git a/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.layout-test.retain-all-codepoint.otf b/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.layout-test.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..51afa40
Binary files /dev/null and b/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.layout-test.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/layout.gsub5/gsub_context1_multiple_subrules_f2.layout-test-retain-gids.41,42,43.otf b/test/subset/data/expected/layout.gsub5/gsub_context1_multiple_subrules_f2.layout-test-retain-gids.41,42,43.otf
new file mode 100644 (file)
index 0000000..ed8a98b
Binary files /dev/null and b/test/subset/data/expected/layout.gsub5/gsub_context1_multiple_subrules_f2.layout-test-retain-gids.41,42,43.otf differ
diff --git a/test/subset/data/expected/layout.gsub5/gsub_context1_multiple_subrules_f2.layout-test-retain-gids.41,42.otf b/test/subset/data/expected/layout.gsub5/gsub_context1_multiple_subrules_f2.layout-test-retain-gids.41,42.otf
new file mode 100644 (file)
index 0000000..33c8824
Binary files /dev/null and b/test/subset/data/expected/layout.gsub5/gsub_context1_multiple_subrules_f2.layout-test-retain-gids.41,42.otf differ
diff --git a/test/subset/data/expected/layout.gsub5/gsub_context1_multiple_subrules_f2.layout-test-retain-gids.41,43.otf b/test/subset/data/expected/layout.gsub5/gsub_context1_multiple_subrules_f2.layout-test-retain-gids.41,43.otf
new file mode 100644 (file)
index 0000000..8148021
Binary files /dev/null and b/test/subset/data/expected/layout.gsub5/gsub_context1_multiple_subrules_f2.layout-test-retain-gids.41,43.otf differ
diff --git a/test/subset/data/expected/layout.gsub5/gsub_context1_multiple_subrules_f2.layout-test-retain-gids.41.otf b/test/subset/data/expected/layout.gsub5/gsub_context1_multiple_subrules_f2.layout-test-retain-gids.41.otf
new file mode 100644 (file)
index 0000000..24e6b78
Binary files /dev/null and b/test/subset/data/expected/layout.gsub5/gsub_context1_multiple_subrules_f2.layout-test-retain-gids.41.otf differ
diff --git a/test/subset/data/expected/layout.gsub5/gsub_context1_multiple_subrules_f2.layout-test-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/layout.gsub5/gsub_context1_multiple_subrules_f2.layout-test-retain-gids.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..0ff250b
Binary files /dev/null and b/test/subset/data/expected/layout.gsub5/gsub_context1_multiple_subrules_f2.layout-test-retain-gids.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/layout.gsub5/gsub_context1_multiple_subrules_f2.layout-test.41,42,43.otf b/test/subset/data/expected/layout.gsub5/gsub_context1_multiple_subrules_f2.layout-test.41,42,43.otf
new file mode 100644 (file)
index 0000000..bde0da1
Binary files /dev/null and b/test/subset/data/expected/layout.gsub5/gsub_context1_multiple_subrules_f2.layout-test.41,42,43.otf differ
diff --git a/test/subset/data/expected/layout.gsub5/gsub_context1_multiple_subrules_f2.layout-test.41,42.otf b/test/subset/data/expected/layout.gsub5/gsub_context1_multiple_subrules_f2.layout-test.41,42.otf
new file mode 100644 (file)
index 0000000..d34cc87
Binary files /dev/null and b/test/subset/data/expected/layout.gsub5/gsub_context1_multiple_subrules_f2.layout-test.41,42.otf differ
diff --git a/test/subset/data/expected/layout.gsub5/gsub_context1_multiple_subrules_f2.layout-test.41,43.otf b/test/subset/data/expected/layout.gsub5/gsub_context1_multiple_subrules_f2.layout-test.41,43.otf
new file mode 100644 (file)
index 0000000..e62f795
Binary files /dev/null and b/test/subset/data/expected/layout.gsub5/gsub_context1_multiple_subrules_f2.layout-test.41,43.otf differ
diff --git a/test/subset/data/expected/layout.gsub5/gsub_context1_multiple_subrules_f2.layout-test.41.otf b/test/subset/data/expected/layout.gsub5/gsub_context1_multiple_subrules_f2.layout-test.41.otf
new file mode 100644 (file)
index 0000000..649e446
Binary files /dev/null and b/test/subset/data/expected/layout.gsub5/gsub_context1_multiple_subrules_f2.layout-test.41.otf differ
diff --git a/test/subset/data/expected/layout.gsub5/gsub_context1_multiple_subrules_f2.layout-test.retain-all-codepoint.otf b/test/subset/data/expected/layout.gsub5/gsub_context1_multiple_subrules_f2.layout-test.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..0ff250b
Binary files /dev/null and b/test/subset/data/expected/layout.gsub5/gsub_context1_multiple_subrules_f2.layout-test.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test-retain-gids.41,42,43.otf b/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test-retain-gids.41,42,43.otf
new file mode 100644 (file)
index 0000000..1d3f3cd
Binary files /dev/null and b/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test-retain-gids.41,42,43.otf differ
diff --git a/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test-retain-gids.41,42.otf b/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test-retain-gids.41,42.otf
new file mode 100644 (file)
index 0000000..5a0d0c4
Binary files /dev/null and b/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test-retain-gids.41,42.otf differ
diff --git a/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test-retain-gids.41,43.otf b/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test-retain-gids.41,43.otf
new file mode 100644 (file)
index 0000000..27b29e5
Binary files /dev/null and b/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test-retain-gids.41,43.otf differ
diff --git a/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test-retain-gids.41.otf b/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test-retain-gids.41.otf
new file mode 100644 (file)
index 0000000..f4fa0e9
Binary files /dev/null and b/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test-retain-gids.41.otf differ
diff --git a/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test-retain-gids.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..b3d6ae9
Binary files /dev/null and b/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test-retain-gids.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test.41,42,43.otf b/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test.41,42,43.otf
new file mode 100644 (file)
index 0000000..0a693c6
Binary files /dev/null and b/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test.41,42,43.otf differ
diff --git a/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test.41,42.otf b/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test.41,42.otf
new file mode 100644 (file)
index 0000000..128c1d4
Binary files /dev/null and b/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test.41,42.otf differ
diff --git a/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test.41,43.otf b/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test.41,43.otf
new file mode 100644 (file)
index 0000000..f4a46ef
Binary files /dev/null and b/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test.41,43.otf differ
diff --git a/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test.41.otf b/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test.41.otf
new file mode 100644 (file)
index 0000000..00d4707
Binary files /dev/null and b/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test.41.otf differ
diff --git a/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test.retain-all-codepoint.otf b/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..b3d6ae9
Binary files /dev/null and b/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/layout.gsub5/gsub_context3_successive_f1.layout-test-retain-gids.41,42,43.otf b/test/subset/data/expected/layout.gsub5/gsub_context3_successive_f1.layout-test-retain-gids.41,42,43.otf
new file mode 100644 (file)
index 0000000..bfe6624
Binary files /dev/null and b/test/subset/data/expected/layout.gsub5/gsub_context3_successive_f1.layout-test-retain-gids.41,42,43.otf differ
diff --git a/test/subset/data/expected/layout.gsub5/gsub_context3_successive_f1.layout-test-retain-gids.41,42.otf b/test/subset/data/expected/layout.gsub5/gsub_context3_successive_f1.layout-test-retain-gids.41,42.otf
new file mode 100644 (file)
index 0000000..808ba68
Binary files /dev/null and b/test/subset/data/expected/layout.gsub5/gsub_context3_successive_f1.layout-test-retain-gids.41,42.otf differ
diff --git a/test/subset/data/expected/layout.gsub5/gsub_context3_successive_f1.layout-test-retain-gids.41,43.otf b/test/subset/data/expected/layout.gsub5/gsub_context3_successive_f1.layout-test-retain-gids.41,43.otf
new file mode 100644 (file)
index 0000000..5bb167e
Binary files /dev/null and b/test/subset/data/expected/layout.gsub5/gsub_context3_successive_f1.layout-test-retain-gids.41,43.otf differ
diff --git a/test/subset/data/expected/layout.gsub5/gsub_context3_successive_f1.layout-test-retain-gids.41.otf b/test/subset/data/expected/layout.gsub5/gsub_context3_successive_f1.layout-test-retain-gids.41.otf
new file mode 100644 (file)
index 0000000..8844949
Binary files /dev/null and b/test/subset/data/expected/layout.gsub5/gsub_context3_successive_f1.layout-test-retain-gids.41.otf differ
diff --git a/test/subset/data/expected/layout.gsub5/gsub_context3_successive_f1.layout-test-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/layout.gsub5/gsub_context3_successive_f1.layout-test-retain-gids.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..a012ff1
Binary files /dev/null and b/test/subset/data/expected/layout.gsub5/gsub_context3_successive_f1.layout-test-retain-gids.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/layout.gsub5/gsub_context3_successive_f1.layout-test.41,42,43.otf b/test/subset/data/expected/layout.gsub5/gsub_context3_successive_f1.layout-test.41,42,43.otf
new file mode 100644 (file)
index 0000000..a00ab82
Binary files /dev/null and b/test/subset/data/expected/layout.gsub5/gsub_context3_successive_f1.layout-test.41,42,43.otf differ
diff --git a/test/subset/data/expected/layout.gsub5/gsub_context3_successive_f1.layout-test.41,42.otf b/test/subset/data/expected/layout.gsub5/gsub_context3_successive_f1.layout-test.41,42.otf
new file mode 100644 (file)
index 0000000..0cfcad6
Binary files /dev/null and b/test/subset/data/expected/layout.gsub5/gsub_context3_successive_f1.layout-test.41,42.otf differ
diff --git a/test/subset/data/expected/layout.gsub5/gsub_context3_successive_f1.layout-test.41,43.otf b/test/subset/data/expected/layout.gsub5/gsub_context3_successive_f1.layout-test.41,43.otf
new file mode 100644 (file)
index 0000000..3d96d48
Binary files /dev/null and b/test/subset/data/expected/layout.gsub5/gsub_context3_successive_f1.layout-test.41,43.otf differ
diff --git a/test/subset/data/expected/layout.gsub5/gsub_context3_successive_f1.layout-test.41.otf b/test/subset/data/expected/layout.gsub5/gsub_context3_successive_f1.layout-test.41.otf
new file mode 100644 (file)
index 0000000..51c6316
Binary files /dev/null and b/test/subset/data/expected/layout.gsub5/gsub_context3_successive_f1.layout-test.41.otf differ
diff --git a/test/subset/data/expected/layout.gsub5/gsub_context3_successive_f1.layout-test.retain-all-codepoint.otf b/test/subset/data/expected/layout.gsub5/gsub_context3_successive_f1.layout-test.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..a012ff1
Binary files /dev/null and b/test/subset/data/expected/layout.gsub5/gsub_context3_successive_f1.layout-test.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/layout.gsub5_format2/Molengo-Regular.layout-test-retain-gids.268,301,302,324.ttf b/test/subset/data/expected/layout.gsub5_format2/Molengo-Regular.layout-test-retain-gids.268,301,302,324.ttf
new file mode 100644 (file)
index 0000000..82cc953
Binary files /dev/null and b/test/subset/data/expected/layout.gsub5_format2/Molengo-Regular.layout-test-retain-gids.268,301,302,324.ttf differ
diff --git a/test/subset/data/expected/layout.gsub5_format2/Molengo-Regular.layout-test-retain-gids.retain-all-codepoint.ttf b/test/subset/data/expected/layout.gsub5_format2/Molengo-Regular.layout-test-retain-gids.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..06d1fad
Binary files /dev/null and b/test/subset/data/expected/layout.gsub5_format2/Molengo-Regular.layout-test-retain-gids.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/layout.gsub5_format2/Molengo-Regular.layout-test.268,301,302,324.ttf b/test/subset/data/expected/layout.gsub5_format2/Molengo-Regular.layout-test.268,301,302,324.ttf
new file mode 100644 (file)
index 0000000..ceafb38
Binary files /dev/null and b/test/subset/data/expected/layout.gsub5_format2/Molengo-Regular.layout-test.268,301,302,324.ttf differ
diff --git a/test/subset/data/expected/layout.gsub5_format2/Molengo-Regular.layout-test.retain-all-codepoint.ttf b/test/subset/data/expected/layout.gsub5_format2/Molengo-Regular.layout-test.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..895a035
Binary files /dev/null and b/test/subset/data/expected/layout.gsub5_format2/Molengo-Regular.layout-test.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.keep-layout-retain-gids.30,31,32,33.otf b/test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.keep-layout-retain-gids.30,31,32,33.otf
deleted file mode 100644 (file)
index e10d863..0000000
Binary files a/test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.keep-layout-retain-gids.30,31,32,33.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.keep-layout-retain-gids.41,42,43.otf b/test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.keep-layout-retain-gids.41,42,43.otf
deleted file mode 100644 (file)
index 30e98e0..0000000
Binary files a/test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.keep-layout-retain-gids.41,42,43.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.keep-layout-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.keep-layout-retain-gids.retain-all-codepoint.otf
deleted file mode 100644 (file)
index 1f90754..0000000
Binary files a/test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.keep-layout-retain-gids.retain-all-codepoint.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.keep-layout.30,31,32,33.otf b/test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.keep-layout.30,31,32,33.otf
deleted file mode 100644 (file)
index bdaa805..0000000
Binary files a/test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.keep-layout.30,31,32,33.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.keep-layout.41,42,43.otf b/test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.keep-layout.41,42,43.otf
deleted file mode 100644 (file)
index e87cfff..0000000
Binary files a/test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.keep-layout.41,42,43.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.keep-layout.retain-all-codepoint.otf b/test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.keep-layout.retain-all-codepoint.otf
deleted file mode 100644 (file)
index 1f90754..0000000
Binary files a/test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.keep-layout.retain-all-codepoint.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.layout-test-retain-gids.30,31,32,33.otf b/test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.layout-test-retain-gids.30,31,32,33.otf
new file mode 100644 (file)
index 0000000..c38bb18
Binary files /dev/null and b/test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.layout-test-retain-gids.30,31,32,33.otf differ
diff --git a/test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.layout-test-retain-gids.41,42,43.otf b/test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.layout-test-retain-gids.41,42,43.otf
new file mode 100644 (file)
index 0000000..ea05697
Binary files /dev/null and b/test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.layout-test-retain-gids.41,42,43.otf differ
diff --git a/test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.layout-test-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.layout-test-retain-gids.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..be5c742
Binary files /dev/null and b/test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.layout-test-retain-gids.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.layout-test.30,31,32,33.otf b/test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.layout-test.30,31,32,33.otf
new file mode 100644 (file)
index 0000000..9c6cf18
Binary files /dev/null and b/test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.layout-test.30,31,32,33.otf differ
diff --git a/test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.layout-test.41,42,43.otf b/test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.layout-test.41,42,43.otf
new file mode 100644 (file)
index 0000000..e5e4cfb
Binary files /dev/null and b/test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.layout-test.41,42,43.otf differ
diff --git a/test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.layout-test.retain-all-codepoint.otf b/test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.layout-test.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..be5c742
Binary files /dev/null and b/test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.layout-test.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.keep-layout-retain-gids.30,31,32,33.otf b/test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.keep-layout-retain-gids.30,31,32,33.otf
deleted file mode 100644 (file)
index 856249e..0000000
Binary files a/test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.keep-layout-retain-gids.30,31,32,33.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.keep-layout-retain-gids.41,42,43.otf b/test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.keep-layout-retain-gids.41,42,43.otf
deleted file mode 100644 (file)
index 90634d6..0000000
Binary files a/test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.keep-layout-retain-gids.41,42,43.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.keep-layout-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.keep-layout-retain-gids.retain-all-codepoint.otf
deleted file mode 100644 (file)
index e764393..0000000
Binary files a/test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.keep-layout-retain-gids.retain-all-codepoint.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.keep-layout.30,31,32,33.otf b/test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.keep-layout.30,31,32,33.otf
deleted file mode 100644 (file)
index a53b114..0000000
Binary files a/test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.keep-layout.30,31,32,33.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.keep-layout.41,42,43.otf b/test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.keep-layout.41,42,43.otf
deleted file mode 100644 (file)
index 80da795..0000000
Binary files a/test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.keep-layout.41,42,43.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.keep-layout.retain-all-codepoint.otf b/test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.keep-layout.retain-all-codepoint.otf
deleted file mode 100644 (file)
index e764393..0000000
Binary files a/test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.keep-layout.retain-all-codepoint.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.layout-test-retain-gids.30,31,32,33.otf b/test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.layout-test-retain-gids.30,31,32,33.otf
new file mode 100644 (file)
index 0000000..e5b9d6e
Binary files /dev/null and b/test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.layout-test-retain-gids.30,31,32,33.otf differ
diff --git a/test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.layout-test-retain-gids.41,42,43.otf b/test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.layout-test-retain-gids.41,42,43.otf
new file mode 100644 (file)
index 0000000..dcf5a16
Binary files /dev/null and b/test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.layout-test-retain-gids.41,42,43.otf differ
diff --git a/test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.layout-test-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.layout-test-retain-gids.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..3072df6
Binary files /dev/null and b/test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.layout-test-retain-gids.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.layout-test.30,31,32,33.otf b/test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.layout-test.30,31,32,33.otf
new file mode 100644 (file)
index 0000000..ef1bc2d
Binary files /dev/null and b/test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.layout-test.30,31,32,33.otf differ
diff --git a/test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.layout-test.41,42,43.otf b/test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.layout-test.41,42,43.otf
new file mode 100644 (file)
index 0000000..f89f5b8
Binary files /dev/null and b/test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.layout-test.41,42,43.otf differ
diff --git a/test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.layout-test.retain-all-codepoint.otf b/test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.layout-test.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..3072df6
Binary files /dev/null and b/test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.layout-test.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.keep-layout-retain-gids.30,31,32,33.otf b/test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.keep-layout-retain-gids.30,31,32,33.otf
deleted file mode 100644 (file)
index 2d08eb0..0000000
Binary files a/test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.keep-layout-retain-gids.30,31,32,33.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.keep-layout-retain-gids.41,42,43.otf b/test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.keep-layout-retain-gids.41,42,43.otf
deleted file mode 100644 (file)
index d87455d..0000000
Binary files a/test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.keep-layout-retain-gids.41,42,43.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.keep-layout-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.keep-layout-retain-gids.retain-all-codepoint.otf
deleted file mode 100644 (file)
index 737f85a..0000000
Binary files a/test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.keep-layout-retain-gids.retain-all-codepoint.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.keep-layout.30,31,32,33.otf b/test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.keep-layout.30,31,32,33.otf
deleted file mode 100644 (file)
index fbd9a44..0000000
Binary files a/test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.keep-layout.30,31,32,33.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.keep-layout.41,42,43.otf b/test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.keep-layout.41,42,43.otf
deleted file mode 100644 (file)
index 45bc0be..0000000
Binary files a/test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.keep-layout.41,42,43.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.keep-layout.retain-all-codepoint.otf b/test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.keep-layout.retain-all-codepoint.otf
deleted file mode 100644 (file)
index 737f85a..0000000
Binary files a/test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.keep-layout.retain-all-codepoint.otf and /dev/null differ
diff --git a/test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.layout-test-retain-gids.30,31,32,33.otf b/test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.layout-test-retain-gids.30,31,32,33.otf
new file mode 100644 (file)
index 0000000..eb573b0
Binary files /dev/null and b/test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.layout-test-retain-gids.30,31,32,33.otf differ
diff --git a/test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.layout-test-retain-gids.41,42,43.otf b/test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.layout-test-retain-gids.41,42,43.otf
new file mode 100644 (file)
index 0000000..f5dd384
Binary files /dev/null and b/test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.layout-test-retain-gids.41,42,43.otf differ
diff --git a/test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.layout-test-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.layout-test-retain-gids.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..73d92d4
Binary files /dev/null and b/test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.layout-test-retain-gids.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.layout-test.30,31,32,33.otf b/test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.layout-test.30,31,32,33.otf
new file mode 100644 (file)
index 0000000..16d2b34
Binary files /dev/null and b/test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.layout-test.30,31,32,33.otf differ
diff --git a/test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.layout-test.41,42,43.otf b/test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.layout-test.41,42,43.otf
new file mode 100644 (file)
index 0000000..6623508
Binary files /dev/null and b/test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.layout-test.41,42,43.otf differ
diff --git a/test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.layout-test.retain-all-codepoint.otf b/test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.layout-test.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..73d92d4
Binary files /dev/null and b/test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.layout-test.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test-retain-gids.41,42,43,44,45,46,47,48,49.otf b/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test-retain-gids.41,42,43,44,45,46,47,48,49.otf
new file mode 100644 (file)
index 0000000..4e0b307
Binary files /dev/null and b/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test-retain-gids.41,42,43,44,45,46,47,48,49.otf differ
diff --git a/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test-retain-gids.41,42,43,44,45,46,47.otf b/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test-retain-gids.41,42,43,44,45,46,47.otf
new file mode 100644 (file)
index 0000000..28bc409
Binary files /dev/null and b/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test-retain-gids.41,42,43,44,45,46,47.otf differ
diff --git a/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test-retain-gids.41,42,43,44,45,46,4D.otf b/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test-retain-gids.41,42,43,44,45,46,4D.otf
new file mode 100644 (file)
index 0000000..90e1cdf
Binary files /dev/null and b/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test-retain-gids.41,42,43,44,45,46,4D.otf differ
diff --git a/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test-retain-gids.41,42,43,44,45,46,51.otf b/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test-retain-gids.41,42,43,44,45,46,51.otf
new file mode 100644 (file)
index 0000000..1b07a7a
Binary files /dev/null and b/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test-retain-gids.41,42,43,44,45,46,51.otf differ
diff --git a/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test-retain-gids.41,42,43,44,45,46.otf b/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test-retain-gids.41,42,43,44,45,46.otf
new file mode 100644 (file)
index 0000000..ef2bd57
Binary files /dev/null and b/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test-retain-gids.41,42,43,44,45,46.otf differ
diff --git a/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test-retain-gids.41,42,43.otf b/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test-retain-gids.41,42,43.otf
new file mode 100644 (file)
index 0000000..ecc3c41
Binary files /dev/null and b/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test-retain-gids.41,42,43.otf differ
diff --git a/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test-retain-gids.41.otf b/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test-retain-gids.41.otf
new file mode 100644 (file)
index 0000000..eb60c6b
Binary files /dev/null and b/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test-retain-gids.41.otf differ
diff --git a/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test-retain-gids.61.otf b/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test-retain-gids.61.otf
new file mode 100644 (file)
index 0000000..275b11b
Binary files /dev/null and b/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test-retain-gids.61.otf differ
diff --git a/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test-retain-gids.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..d29304c
Binary files /dev/null and b/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test-retain-gids.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test.41,42,43,44,45,46,47,48,49.otf b/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test.41,42,43,44,45,46,47,48,49.otf
new file mode 100644 (file)
index 0000000..f149bbf
Binary files /dev/null and b/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test.41,42,43,44,45,46,47,48,49.otf differ
diff --git a/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test.41,42,43,44,45,46,47.otf b/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test.41,42,43,44,45,46,47.otf
new file mode 100644 (file)
index 0000000..3475f4e
Binary files /dev/null and b/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test.41,42,43,44,45,46,47.otf differ
diff --git a/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test.41,42,43,44,45,46,4D.otf b/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test.41,42,43,44,45,46,4D.otf
new file mode 100644 (file)
index 0000000..8e8c4de
Binary files /dev/null and b/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test.41,42,43,44,45,46,4D.otf differ
diff --git a/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test.41,42,43,44,45,46,51.otf b/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test.41,42,43,44,45,46,51.otf
new file mode 100644 (file)
index 0000000..cd519a5
Binary files /dev/null and b/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test.41,42,43,44,45,46,51.otf differ
diff --git a/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test.41,42,43,44,45,46.otf b/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test.41,42,43,44,45,46.otf
new file mode 100644 (file)
index 0000000..063ac99
Binary files /dev/null and b/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test.41,42,43,44,45,46.otf differ
diff --git a/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test.41,42,43.otf b/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test.41,42,43.otf
new file mode 100644 (file)
index 0000000..9ee6ccf
Binary files /dev/null and b/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test.41,42,43.otf differ
diff --git a/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test.41.otf b/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test.41.otf
new file mode 100644 (file)
index 0000000..0cb632a
Binary files /dev/null and b/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test.41.otf differ
diff --git a/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test.61.otf b/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test.61.otf
new file mode 100644 (file)
index 0000000..ec09bf0
Binary files /dev/null and b/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test.61.otf differ
diff --git a/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test.retain-all-codepoint.otf b/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test.retain-all-codepoint.otf
new file mode 100644 (file)
index 0000000..d29304c
Binary files /dev/null and b/test/subset/data/expected/layout.gsub8/gsub8_manually_created.layout-test.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/layout.khmer/Khmer.default.1780.ttf b/test/subset/data/expected/layout.khmer/Khmer.default.1780.ttf
new file mode 100644 (file)
index 0000000..d6544fb
Binary files /dev/null and b/test/subset/data/expected/layout.khmer/Khmer.default.1780.ttf differ
diff --git a/test/subset/data/expected/layout.khmer/Khmer.default.1789,17BB,17C6,1794,17B6,1793,1798,17BE.ttf b/test/subset/data/expected/layout.khmer/Khmer.default.1789,17BB,17C6,1794,17B6,1793,1798,17BE.ttf
new file mode 100644 (file)
index 0000000..65c84c3
Binary files /dev/null and b/test/subset/data/expected/layout.khmer/Khmer.default.1789,17BB,17C6,1794,17B6,1793,1798,17BE.ttf differ
diff --git a/test/subset/data/expected/layout.khmer/Khmer.default.31.ttf b/test/subset/data/expected/layout.khmer/Khmer.default.31.ttf
new file mode 100644 (file)
index 0000000..4a6b93d
Binary files /dev/null and b/test/subset/data/expected/layout.khmer/Khmer.default.31.ttf differ
diff --git a/test/subset/data/expected/layout.khmer/Khmer.retain-gids.1780.ttf b/test/subset/data/expected/layout.khmer/Khmer.retain-gids.1780.ttf
new file mode 100644 (file)
index 0000000..7d1c5ec
Binary files /dev/null and b/test/subset/data/expected/layout.khmer/Khmer.retain-gids.1780.ttf differ
diff --git a/test/subset/data/expected/layout.khmer/Khmer.retain-gids.1789,17BB,17C6,1794,17B6,1793,1798,17BE.ttf b/test/subset/data/expected/layout.khmer/Khmer.retain-gids.1789,17BB,17C6,1794,17B6,1793,1798,17BE.ttf
new file mode 100644 (file)
index 0000000..07c8389
Binary files /dev/null and b/test/subset/data/expected/layout.khmer/Khmer.retain-gids.1789,17BB,17C6,1794,17B6,1793,1798,17BE.ttf differ
diff --git a/test/subset/data/expected/layout.khmer/Khmer.retain-gids.31.ttf b/test/subset/data/expected/layout.khmer/Khmer.retain-gids.31.ttf
new file mode 100644 (file)
index 0000000..0c03905
Binary files /dev/null and b/test/subset/data/expected/layout.khmer/Khmer.retain-gids.31.ttf differ
diff --git a/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.default.627,644,623,62D,644,627,645,2E.ttf b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.default.627,644,623,62D,644,627,645,2E.ttf
new file mode 100644 (file)
index 0000000..8d5bdcf
Binary files /dev/null and b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.default.627,644,623,62D,644,627,645,2E.ttf differ
diff --git a/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.default.627,644,62D,628.ttf b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.default.627,644,62D,628.ttf
new file mode 100644 (file)
index 0000000..5fbab25
Binary files /dev/null and b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.default.627,644,62D,628.ttf differ
diff --git a/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.default.627,644.ttf b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.default.627,644.ttf
new file mode 100644 (file)
index 0000000..ad9c497
Binary files /dev/null and b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.default.627,644.ttf differ
diff --git a/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.default.633,645,627,621,20,644,627.ttf b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.default.633,645,627,621,20,644,627.ttf
new file mode 100644 (file)
index 0000000..8827127
Binary files /dev/null and b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.default.633,645,627,621,20,644,627.ttf differ
diff --git a/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.default.633,6D2.ttf b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.default.633,6D2.ttf
new file mode 100644 (file)
index 0000000..39f534d
Binary files /dev/null and b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.default.633,6D2.ttf differ
diff --git a/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.default.63A,64A,631.ttf b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.default.63A,64A,631.ttf
new file mode 100644 (file)
index 0000000..0f992dc
Binary files /dev/null and b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.default.63A,64A,631.ttf differ
diff --git a/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.default.retain-all-codepoint.ttf b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.default.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..a49c63e
Binary files /dev/null and b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.default.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.retain-gids.627,644,623,62D,644,627,645,2E.ttf b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.retain-gids.627,644,623,62D,644,627,645,2E.ttf
new file mode 100644 (file)
index 0000000..440b786
Binary files /dev/null and b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.retain-gids.627,644,623,62D,644,627,645,2E.ttf differ
diff --git a/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.retain-gids.627,644,62D,628.ttf b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.retain-gids.627,644,62D,628.ttf
new file mode 100644 (file)
index 0000000..d31f884
Binary files /dev/null and b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.retain-gids.627,644,62D,628.ttf differ
diff --git a/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.retain-gids.627,644.ttf b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.retain-gids.627,644.ttf
new file mode 100644 (file)
index 0000000..33ef61f
Binary files /dev/null and b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.retain-gids.627,644.ttf differ
diff --git a/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.retain-gids.633,645,627,621,20,644,627.ttf b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.retain-gids.633,645,627,621,20,644,627.ttf
new file mode 100644 (file)
index 0000000..eb473b4
Binary files /dev/null and b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.retain-gids.633,645,627,621,20,644,627.ttf differ
diff --git a/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.retain-gids.633,6D2.ttf b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.retain-gids.633,6D2.ttf
new file mode 100644 (file)
index 0000000..ff3a816
Binary files /dev/null and b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.retain-gids.633,6D2.ttf differ
diff --git a/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.retain-gids.63A,64A,631.ttf b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.retain-gids.63A,64A,631.ttf
new file mode 100644 (file)
index 0000000..57470a7
Binary files /dev/null and b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.retain-gids.63A,64A,631.ttf differ
diff --git a/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.retain-gids.retain-all-codepoint.ttf b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.retain-gids.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..a49c63e
Binary files /dev/null and b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Bold.retain-gids.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.default.627,644,623,62D,644,627,645,2E.ttf b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.default.627,644,623,62D,644,627,645,2E.ttf
new file mode 100644 (file)
index 0000000..7d58b3c
Binary files /dev/null and b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.default.627,644,623,62D,644,627,645,2E.ttf differ
diff --git a/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.default.627,644,62D,628.ttf b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.default.627,644,62D,628.ttf
new file mode 100644 (file)
index 0000000..cbfad3d
Binary files /dev/null and b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.default.627,644,62D,628.ttf differ
diff --git a/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.default.627,644.ttf b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.default.627,644.ttf
new file mode 100644 (file)
index 0000000..17ad7cd
Binary files /dev/null and b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.default.627,644.ttf differ
diff --git a/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.default.633,645,627,621,20,644,627.ttf b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.default.633,645,627,621,20,644,627.ttf
new file mode 100644 (file)
index 0000000..29166f7
Binary files /dev/null and b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.default.633,645,627,621,20,644,627.ttf differ
diff --git a/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.default.633,6D2.ttf b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.default.633,6D2.ttf
new file mode 100644 (file)
index 0000000..f4938d8
Binary files /dev/null and b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.default.633,6D2.ttf differ
diff --git a/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.default.63A,64A,631.ttf b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.default.63A,64A,631.ttf
new file mode 100644 (file)
index 0000000..6ac7bcd
Binary files /dev/null and b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.default.63A,64A,631.ttf differ
diff --git a/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.default.retain-all-codepoint.ttf b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.default.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..ba99d30
Binary files /dev/null and b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.default.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.retain-gids.627,644,623,62D,644,627,645,2E.ttf b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.retain-gids.627,644,623,62D,644,627,645,2E.ttf
new file mode 100644 (file)
index 0000000..4df2620
Binary files /dev/null and b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.retain-gids.627,644,623,62D,644,627,645,2E.ttf differ
diff --git a/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.retain-gids.627,644,62D,628.ttf b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.retain-gids.627,644,62D,628.ttf
new file mode 100644 (file)
index 0000000..81ee9e8
Binary files /dev/null and b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.retain-gids.627,644,62D,628.ttf differ
diff --git a/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.retain-gids.627,644.ttf b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.retain-gids.627,644.ttf
new file mode 100644 (file)
index 0000000..1ef5e8d
Binary files /dev/null and b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.retain-gids.627,644.ttf differ
diff --git a/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.retain-gids.633,645,627,621,20,644,627.ttf b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.retain-gids.633,645,627,621,20,644,627.ttf
new file mode 100644 (file)
index 0000000..5e2dee1
Binary files /dev/null and b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.retain-gids.633,645,627,621,20,644,627.ttf differ
diff --git a/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.retain-gids.633,6D2.ttf b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.retain-gids.633,6D2.ttf
new file mode 100644 (file)
index 0000000..3f5367a
Binary files /dev/null and b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.retain-gids.633,6D2.ttf differ
diff --git a/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.retain-gids.63A,64A,631.ttf b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.retain-gids.63A,64A,631.ttf
new file mode 100644 (file)
index 0000000..2610a64
Binary files /dev/null and b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.retain-gids.63A,64A,631.ttf differ
diff --git a/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.retain-gids.retain-all-codepoint.ttf b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.retain-gids.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..e41720c
Binary files /dev/null and b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.retain-gids.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/layout.tinos/Tinos-Italic.default.5bf,5f0,5f1,5f2,fb21,fb22,fb23,fb24,fb25,fb26,fb27,fb28.ttf b/test/subset/data/expected/layout.tinos/Tinos-Italic.default.5bf,5f0,5f1,5f2,fb21,fb22,fb23,fb24,fb25,fb26,fb27,fb28.ttf
new file mode 100644 (file)
index 0000000..d289df2
Binary files /dev/null and b/test/subset/data/expected/layout.tinos/Tinos-Italic.default.5bf,5f0,5f1,5f2,fb21,fb22,fb23,fb24,fb25,fb26,fb27,fb28.ttf differ
diff --git a/test/subset/data/expected/layout.tinos/Tinos-Italic.default.retain-all-codepoint.ttf b/test/subset/data/expected/layout.tinos/Tinos-Italic.default.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..b1c5769
Binary files /dev/null and b/test/subset/data/expected/layout.tinos/Tinos-Italic.default.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/layout.tinos/Tinos-Italic.glyph-names.5bf,5f0,5f1,5f2,fb21,fb22,fb23,fb24,fb25,fb26,fb27,fb28.ttf b/test/subset/data/expected/layout.tinos/Tinos-Italic.glyph-names.5bf,5f0,5f1,5f2,fb21,fb22,fb23,fb24,fb25,fb26,fb27,fb28.ttf
new file mode 100644 (file)
index 0000000..31b87ec
Binary files /dev/null and b/test/subset/data/expected/layout.tinos/Tinos-Italic.glyph-names.5bf,5f0,5f1,5f2,fb21,fb22,fb23,fb24,fb25,fb26,fb27,fb28.ttf differ
diff --git a/test/subset/data/expected/layout.tinos/Tinos-Italic.glyph-names.retain-all-codepoint.ttf b/test/subset/data/expected/layout.tinos/Tinos-Italic.glyph-names.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..9b703f4
Binary files /dev/null and b/test/subset/data/expected/layout.tinos/Tinos-Italic.glyph-names.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/layout.tinos/Tinos-Italic.notdef-outline.5bf,5f0,5f1,5f2,fb21,fb22,fb23,fb24,fb25,fb26,fb27,fb28.ttf b/test/subset/data/expected/layout.tinos/Tinos-Italic.notdef-outline.5bf,5f0,5f1,5f2,fb21,fb22,fb23,fb24,fb25,fb26,fb27,fb28.ttf
new file mode 100644 (file)
index 0000000..d289df2
Binary files /dev/null and b/test/subset/data/expected/layout.tinos/Tinos-Italic.notdef-outline.5bf,5f0,5f1,5f2,fb21,fb22,fb23,fb24,fb25,fb26,fb27,fb28.ttf differ
diff --git a/test/subset/data/expected/layout.tinos/Tinos-Italic.notdef-outline.retain-all-codepoint.ttf b/test/subset/data/expected/layout.tinos/Tinos-Italic.notdef-outline.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..b1c5769
Binary files /dev/null and b/test/subset/data/expected/layout.tinos/Tinos-Italic.notdef-outline.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/layout.tinos/Tinos-Italic.retain-gids.5bf,5f0,5f1,5f2,fb21,fb22,fb23,fb24,fb25,fb26,fb27,fb28.ttf b/test/subset/data/expected/layout.tinos/Tinos-Italic.retain-gids.5bf,5f0,5f1,5f2,fb21,fb22,fb23,fb24,fb25,fb26,fb27,fb28.ttf
new file mode 100644 (file)
index 0000000..6c9e2d3
Binary files /dev/null and b/test/subset/data/expected/layout.tinos/Tinos-Italic.retain-gids.5bf,5f0,5f1,5f2,fb21,fb22,fb23,fb24,fb25,fb26,fb27,fb28.ttf differ
diff --git a/test/subset/data/expected/layout.tinos/Tinos-Italic.retain-gids.retain-all-codepoint.ttf b/test/subset/data/expected/layout.tinos/Tinos-Italic.retain-gids.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..edf54a3
Binary files /dev/null and b/test/subset/data/expected/layout.tinos/Tinos-Italic.retain-gids.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/layout.unsorted_featurelist/NotoIKEAHebrewLatin-Regular.default.392,3a7,3b2,3c7.ttf b/test/subset/data/expected/layout.unsorted_featurelist/NotoIKEAHebrewLatin-Regular.default.392,3a7,3b2,3c7.ttf
new file mode 100644 (file)
index 0000000..3fb42c6
Binary files /dev/null and b/test/subset/data/expected/layout.unsorted_featurelist/NotoIKEAHebrewLatin-Regular.default.392,3a7,3b2,3c7.ttf differ
diff --git a/test/subset/data/expected/layout.unsorted_featurelist/NotoIKEAHebrewLatin-Regular.default.retain-all-codepoint.ttf b/test/subset/data/expected/layout.unsorted_featurelist/NotoIKEAHebrewLatin-Regular.default.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..8bf70ed
Binary files /dev/null and b/test/subset/data/expected/layout.unsorted_featurelist/NotoIKEAHebrewLatin-Regular.default.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/layout.unsorted_featurelist/NotoIKEAHebrewLatin-Regular.layout-test.392,3a7,3b2,3c7.ttf b/test/subset/data/expected/layout.unsorted_featurelist/NotoIKEAHebrewLatin-Regular.layout-test.392,3a7,3b2,3c7.ttf
new file mode 100644 (file)
index 0000000..a0b6145
Binary files /dev/null and b/test/subset/data/expected/layout.unsorted_featurelist/NotoIKEAHebrewLatin-Regular.layout-test.392,3a7,3b2,3c7.ttf differ
diff --git a/test/subset/data/expected/layout.unsorted_featurelist/NotoIKEAHebrewLatin-Regular.layout-test.retain-all-codepoint.ttf b/test/subset/data/expected/layout.unsorted_featurelist/NotoIKEAHebrewLatin-Regular.layout-test.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..770b359
Binary files /dev/null and b/test/subset/data/expected/layout.unsorted_featurelist/NotoIKEAHebrewLatin-Regular.layout-test.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/layout.unsorted_featurelist/NotoIKEAHebrewLatin-Regular.retain-gids.392,3a7,3b2,3c7.ttf b/test/subset/data/expected/layout.unsorted_featurelist/NotoIKEAHebrewLatin-Regular.retain-gids.392,3a7,3b2,3c7.ttf
new file mode 100644 (file)
index 0000000..012bb16
Binary files /dev/null and b/test/subset/data/expected/layout.unsorted_featurelist/NotoIKEAHebrewLatin-Regular.retain-gids.392,3a7,3b2,3c7.ttf differ
diff --git a/test/subset/data/expected/layout.unsorted_featurelist/NotoIKEAHebrewLatin-Regular.retain-gids.retain-all-codepoint.ttf b/test/subset/data/expected/layout.unsorted_featurelist/NotoIKEAHebrewLatin-Regular.retain-gids.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..c7e0040
Binary files /dev/null and b/test/subset/data/expected/layout.unsorted_featurelist/NotoIKEAHebrewLatin-Regular.retain-gids.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/layout/Roboto-Regular.smallcaps.default.41,42,43.ttf b/test/subset/data/expected/layout/Roboto-Regular.smallcaps.default.41,42,43.ttf
new file mode 100644 (file)
index 0000000..908d200
Binary files /dev/null and b/test/subset/data/expected/layout/Roboto-Regular.smallcaps.default.41,42,43.ttf differ
diff --git a/test/subset/data/expected/layout/Roboto-Regular.smallcaps.default.41,43.ttf b/test/subset/data/expected/layout/Roboto-Regular.smallcaps.default.41,43.ttf
new file mode 100644 (file)
index 0000000..483e409
Binary files /dev/null and b/test/subset/data/expected/layout/Roboto-Regular.smallcaps.default.41,43.ttf differ
diff --git a/test/subset/data/expected/layout/Roboto-Regular.smallcaps.default.41.ttf b/test/subset/data/expected/layout/Roboto-Regular.smallcaps.default.41.ttf
new file mode 100644 (file)
index 0000000..f3685e4
Binary files /dev/null and b/test/subset/data/expected/layout/Roboto-Regular.smallcaps.default.41.ttf differ
diff --git a/test/subset/data/expected/layout/Roboto-Regular.smallcaps.default.43.ttf b/test/subset/data/expected/layout/Roboto-Regular.smallcaps.default.43.ttf
new file mode 100644 (file)
index 0000000..b33c28f
Binary files /dev/null and b/test/subset/data/expected/layout/Roboto-Regular.smallcaps.default.43.ttf differ
diff --git a/test/subset/data/expected/layout/Roboto-Regular.smallcaps.default.CA,CB.ttf b/test/subset/data/expected/layout/Roboto-Regular.smallcaps.default.CA,CB.ttf
new file mode 100644 (file)
index 0000000..c6098b2
Binary files /dev/null and b/test/subset/data/expected/layout/Roboto-Regular.smallcaps.default.CA,CB.ttf differ
diff --git a/test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout-retain-gids.41,42,43.ttf b/test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout-retain-gids.41,42,43.ttf
deleted file mode 100644 (file)
index aa007ba..0000000
Binary files a/test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout-retain-gids.41,42,43.ttf and /dev/null differ
diff --git a/test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout-retain-gids.41,43.ttf b/test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout-retain-gids.41,43.ttf
deleted file mode 100644 (file)
index f3be30c..0000000
Binary files a/test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout-retain-gids.41,43.ttf and /dev/null differ
diff --git a/test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout-retain-gids.41.ttf b/test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout-retain-gids.41.ttf
deleted file mode 100644 (file)
index 44c329e..0000000
Binary files a/test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout-retain-gids.41.ttf and /dev/null differ
diff --git a/test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout-retain-gids.43.ttf b/test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout-retain-gids.43.ttf
deleted file mode 100644 (file)
index b0a1ea3..0000000
Binary files a/test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout-retain-gids.43.ttf and /dev/null differ
diff --git a/test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout-retain-gids.CA,CB.ttf b/test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout-retain-gids.CA,CB.ttf
deleted file mode 100644 (file)
index 16ad9d5..0000000
Binary files a/test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout-retain-gids.CA,CB.ttf and /dev/null differ
diff --git a/test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout.41,42,43.ttf b/test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout.41,42,43.ttf
deleted file mode 100644 (file)
index d0d9d5a..0000000
Binary files a/test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout.41,42,43.ttf and /dev/null differ
diff --git a/test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout.41,43.ttf b/test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout.41,43.ttf
deleted file mode 100644 (file)
index f4d881f..0000000
Binary files a/test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout.41,43.ttf and /dev/null differ
diff --git a/test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout.41.ttf b/test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout.41.ttf
deleted file mode 100644 (file)
index 9e6dd28..0000000
Binary files a/test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout.41.ttf and /dev/null differ
diff --git a/test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout.43.ttf b/test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout.43.ttf
deleted file mode 100644 (file)
index 50260c5..0000000
Binary files a/test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout.43.ttf and /dev/null differ
diff --git a/test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout.CA,CB.ttf b/test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout.CA,CB.ttf
deleted file mode 100644 (file)
index 22d5b61..0000000
Binary files a/test/subset/data/expected/layout/Roboto-Regular.smallcaps.keep-layout.CA,CB.ttf and /dev/null differ
diff --git a/test/subset/data/expected/layout/Roboto-Regular.smallcaps.retain-gids.41,42,43.ttf b/test/subset/data/expected/layout/Roboto-Regular.smallcaps.retain-gids.41,42,43.ttf
new file mode 100644 (file)
index 0000000..fb0bbad
Binary files /dev/null and b/test/subset/data/expected/layout/Roboto-Regular.smallcaps.retain-gids.41,42,43.ttf differ
diff --git a/test/subset/data/expected/layout/Roboto-Regular.smallcaps.retain-gids.41,43.ttf b/test/subset/data/expected/layout/Roboto-Regular.smallcaps.retain-gids.41,43.ttf
new file mode 100644 (file)
index 0000000..6d30e6d
Binary files /dev/null and b/test/subset/data/expected/layout/Roboto-Regular.smallcaps.retain-gids.41,43.ttf differ
diff --git a/test/subset/data/expected/layout/Roboto-Regular.smallcaps.retain-gids.41.ttf b/test/subset/data/expected/layout/Roboto-Regular.smallcaps.retain-gids.41.ttf
new file mode 100644 (file)
index 0000000..24bfcaf
Binary files /dev/null and b/test/subset/data/expected/layout/Roboto-Regular.smallcaps.retain-gids.41.ttf differ
diff --git a/test/subset/data/expected/layout/Roboto-Regular.smallcaps.retain-gids.43.ttf b/test/subset/data/expected/layout/Roboto-Regular.smallcaps.retain-gids.43.ttf
new file mode 100644 (file)
index 0000000..37b6cee
Binary files /dev/null and b/test/subset/data/expected/layout/Roboto-Regular.smallcaps.retain-gids.43.ttf differ
diff --git a/test/subset/data/expected/layout/Roboto-Regular.smallcaps.retain-gids.CA,CB.ttf b/test/subset/data/expected/layout/Roboto-Regular.smallcaps.retain-gids.CA,CB.ttf
new file mode 100644 (file)
index 0000000..0445fd8
Binary files /dev/null and b/test/subset/data/expected/layout/Roboto-Regular.smallcaps.retain-gids.CA,CB.ttf differ
diff --git a/test/subset/data/expected/math/STIXTwoMath-Regular.default.2f,7c,305.ttf b/test/subset/data/expected/math/STIXTwoMath-Regular.default.2f,7c,305.ttf
new file mode 100644 (file)
index 0000000..e662f4c
Binary files /dev/null and b/test/subset/data/expected/math/STIXTwoMath-Regular.default.2f,7c,305.ttf differ
diff --git a/test/subset/data/expected/math/STIXTwoMath-Regular.default.retain-all-codepoint.ttf b/test/subset/data/expected/math/STIXTwoMath-Regular.default.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..a17ff41
Binary files /dev/null and b/test/subset/data/expected/math/STIXTwoMath-Regular.default.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/math/STIXTwoMath-Regular.glyph-names.2f,7c,305.ttf b/test/subset/data/expected/math/STIXTwoMath-Regular.glyph-names.2f,7c,305.ttf
new file mode 100644 (file)
index 0000000..b757c5c
Binary files /dev/null and b/test/subset/data/expected/math/STIXTwoMath-Regular.glyph-names.2f,7c,305.ttf differ
diff --git a/test/subset/data/expected/math/STIXTwoMath-Regular.glyph-names.retain-all-codepoint.ttf b/test/subset/data/expected/math/STIXTwoMath-Regular.glyph-names.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..ca9aa25
Binary files /dev/null and b/test/subset/data/expected/math/STIXTwoMath-Regular.glyph-names.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/math/STIXTwoMath-Regular.notdef-outline.2f,7c,305.ttf b/test/subset/data/expected/math/STIXTwoMath-Regular.notdef-outline.2f,7c,305.ttf
new file mode 100644 (file)
index 0000000..a93fdbb
Binary files /dev/null and b/test/subset/data/expected/math/STIXTwoMath-Regular.notdef-outline.2f,7c,305.ttf differ
diff --git a/test/subset/data/expected/math/STIXTwoMath-Regular.notdef-outline.retain-all-codepoint.ttf b/test/subset/data/expected/math/STIXTwoMath-Regular.notdef-outline.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..15d3496
Binary files /dev/null and b/test/subset/data/expected/math/STIXTwoMath-Regular.notdef-outline.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/math/STIXTwoMath-Regular.retain-gids.2f,7c,305.ttf b/test/subset/data/expected/math/STIXTwoMath-Regular.retain-gids.2f,7c,305.ttf
new file mode 100644 (file)
index 0000000..77a8636
Binary files /dev/null and b/test/subset/data/expected/math/STIXTwoMath-Regular.retain-gids.2f,7c,305.ttf differ
diff --git a/test/subset/data/expected/math/STIXTwoMath-Regular.retain-gids.retain-all-codepoint.ttf b/test/subset/data/expected/math/STIXTwoMath-Regular.retain-gids.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..d7ee94a
Binary files /dev/null and b/test/subset/data/expected/math/STIXTwoMath-Regular.retain-gids.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/math_coverage_offset/Caudex-Regular.default.retain-all-codepoint.ttf b/test/subset/data/expected/math_coverage_offset/Caudex-Regular.default.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..0df9dca
Binary files /dev/null and b/test/subset/data/expected/math_coverage_offset/Caudex-Regular.default.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/math_coverage_offset/Caudex-Regular.glyph-names.retain-all-codepoint.ttf b/test/subset/data/expected/math_coverage_offset/Caudex-Regular.glyph-names.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..6686d48
Binary files /dev/null and b/test/subset/data/expected/math_coverage_offset/Caudex-Regular.glyph-names.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/math_coverage_offset/Caudex-Regular.keep-all-layout-features.retain-all-codepoint.ttf b/test/subset/data/expected/math_coverage_offset/Caudex-Regular.keep-all-layout-features.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..0df9dca
Binary files /dev/null and b/test/subset/data/expected/math_coverage_offset/Caudex-Regular.keep-all-layout-features.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/math_coverage_offset/Caudex-Regular.notdef-outline.retain-all-codepoint.ttf b/test/subset/data/expected/math_coverage_offset/Caudex-Regular.notdef-outline.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..1ce1535
Binary files /dev/null and b/test/subset/data/expected/math_coverage_offset/Caudex-Regular.notdef-outline.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/math_coverage_offset/Caudex-Regular.retain-gids.retain-all-codepoint.ttf b/test/subset/data/expected/math_coverage_offset/Caudex-Regular.retain-gids.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..f46479b
Binary files /dev/null and b/test/subset/data/expected/math_coverage_offset/Caudex-Regular.retain-gids.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/post/SreeKrushnadevaraya-Regular.default.c30,c36,c40,c4d.ttf b/test/subset/data/expected/post/SreeKrushnadevaraya-Regular.default.c30,c36,c40,c4d.ttf
new file mode 100644 (file)
index 0000000..89bbc99
Binary files /dev/null and b/test/subset/data/expected/post/SreeKrushnadevaraya-Regular.default.c30,c36,c40,c4d.ttf differ
diff --git a/test/subset/data/expected/post/SreeKrushnadevaraya-Regular.default.retain-all-codepoint.ttf b/test/subset/data/expected/post/SreeKrushnadevaraya-Regular.default.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..6d4ea77
Binary files /dev/null and b/test/subset/data/expected/post/SreeKrushnadevaraya-Regular.default.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/post/SreeKrushnadevaraya-Regular.glyph-names.c30,c36,c40,c4d.ttf b/test/subset/data/expected/post/SreeKrushnadevaraya-Regular.glyph-names.c30,c36,c40,c4d.ttf
new file mode 100644 (file)
index 0000000..48ca1c5
Binary files /dev/null and b/test/subset/data/expected/post/SreeKrushnadevaraya-Regular.glyph-names.c30,c36,c40,c4d.ttf differ
diff --git a/test/subset/data/expected/post/SreeKrushnadevaraya-Regular.glyph-names.retain-all-codepoint.ttf b/test/subset/data/expected/post/SreeKrushnadevaraya-Regular.glyph-names.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..d96dd36
Binary files /dev/null and b/test/subset/data/expected/post/SreeKrushnadevaraya-Regular.glyph-names.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/post/SreeKrushnadevaraya-Regular.notdef-outline.c30,c36,c40,c4d.ttf b/test/subset/data/expected/post/SreeKrushnadevaraya-Regular.notdef-outline.c30,c36,c40,c4d.ttf
new file mode 100644 (file)
index 0000000..ae3f659
Binary files /dev/null and b/test/subset/data/expected/post/SreeKrushnadevaraya-Regular.notdef-outline.c30,c36,c40,c4d.ttf differ
diff --git a/test/subset/data/expected/post/SreeKrushnadevaraya-Regular.notdef-outline.retain-all-codepoint.ttf b/test/subset/data/expected/post/SreeKrushnadevaraya-Regular.notdef-outline.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..3163b3c
Binary files /dev/null and b/test/subset/data/expected/post/SreeKrushnadevaraya-Regular.notdef-outline.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/post/SreeKrushnadevaraya-Regular.retain-gids.c30,c36,c40,c4d.ttf b/test/subset/data/expected/post/SreeKrushnadevaraya-Regular.retain-gids.c30,c36,c40,c4d.ttf
new file mode 100644 (file)
index 0000000..7b15499
Binary files /dev/null and b/test/subset/data/expected/post/SreeKrushnadevaraya-Regular.retain-gids.c30,c36,c40,c4d.ttf differ
diff --git a/test/subset/data/expected/post/SreeKrushnadevaraya-Regular.retain-gids.retain-all-codepoint.ttf b/test/subset/data/expected/post/SreeKrushnadevaraya-Regular.retain-gids.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..3927219
Binary files /dev/null and b/test/subset/data/expected/post/SreeKrushnadevaraya-Regular.retain-gids.retain-all-codepoint.ttf differ
index d99bfc9..e34206f 100644 (file)
Binary files a/test/subset/data/expected/sbix/sbix.default.58,59.ttf and b/test/subset/data/expected/sbix/sbix.default.58,59.ttf differ
index 6960f8f..1a341f2 100644 (file)
Binary files a/test/subset/data/expected/sbix/sbix.default.58.ttf and b/test/subset/data/expected/sbix/sbix.default.58.ttf differ
index 1a4ac97..fa8b291 100644 (file)
Binary files a/test/subset/data/expected/sbix/sbix.default.59.ttf and b/test/subset/data/expected/sbix/sbix.default.59.ttf differ
index 96f03e6..b6996f2 100644 (file)
Binary files a/test/subset/data/expected/sbix/sbix.drop-hints-retain-gids.58,59.ttf and b/test/subset/data/expected/sbix/sbix.drop-hints-retain-gids.58,59.ttf differ
index d88e416..ea593b2 100644 (file)
Binary files a/test/subset/data/expected/sbix/sbix.drop-hints-retain-gids.58.ttf and b/test/subset/data/expected/sbix/sbix.drop-hints-retain-gids.58.ttf differ
index 0de61a8..7ad2194 100644 (file)
Binary files a/test/subset/data/expected/sbix/sbix.drop-hints-retain-gids.59.ttf and b/test/subset/data/expected/sbix/sbix.drop-hints-retain-gids.59.ttf differ
index 96f03e6..b6996f2 100644 (file)
Binary files a/test/subset/data/expected/sbix/sbix.drop-hints.58,59.ttf and b/test/subset/data/expected/sbix/sbix.drop-hints.58,59.ttf differ
index d88e416..ea593b2 100644 (file)
Binary files a/test/subset/data/expected/sbix/sbix.drop-hints.58.ttf and b/test/subset/data/expected/sbix/sbix.drop-hints.58.ttf differ
index a3c09e9..6e7b201 100644 (file)
Binary files a/test/subset/data/expected/sbix/sbix.drop-hints.59.ttf and b/test/subset/data/expected/sbix/sbix.drop-hints.59.ttf differ
index d99bfc9..e34206f 100644 (file)
Binary files a/test/subset/data/expected/sbix/sbix.retain-gids.58,59.ttf and b/test/subset/data/expected/sbix/sbix.retain-gids.58,59.ttf differ
index 6960f8f..1a341f2 100644 (file)
Binary files a/test/subset/data/expected/sbix/sbix.retain-gids.58.ttf and b/test/subset/data/expected/sbix/sbix.retain-gids.58.ttf differ
index 21d014b..32379ea 100644 (file)
Binary files a/test/subset/data/expected/sbix/sbix.retain-gids.59.ttf and b/test/subset/data/expected/sbix/sbix.retain-gids.59.ttf differ
diff --git a/test/subset/data/expected/variable/Fraunces.default.26,66,69,124,125.ttf b/test/subset/data/expected/variable/Fraunces.default.26,66,69,124,125.ttf
new file mode 100644 (file)
index 0000000..10e5fe3
Binary files /dev/null and b/test/subset/data/expected/variable/Fraunces.default.26,66,69,124,125.ttf differ
diff --git a/test/subset/data/expected/variable/Fraunces.default.61.ttf b/test/subset/data/expected/variable/Fraunces.default.61.ttf
new file mode 100644 (file)
index 0000000..bc03e40
Binary files /dev/null and b/test/subset/data/expected/variable/Fraunces.default.61.ttf differ
diff --git a/test/subset/data/fonts/AlegreyaSans-BlackItalic.ttf b/test/subset/data/fonts/AlegreyaSans-BlackItalic.ttf
new file mode 100644 (file)
index 0000000..76a389d
Binary files /dev/null and b/test/subset/data/fonts/AlegreyaSans-BlackItalic.ttf differ
diff --git a/test/subset/data/fonts/Amiri-Regular.ttf b/test/subset/data/fonts/Amiri-Regular.ttf
new file mode 100644 (file)
index 0000000..508a1bf
Binary files /dev/null and b/test/subset/data/fonts/Amiri-Regular.ttf differ
diff --git a/test/subset/data/fonts/BungeeColor-Regular.ttf b/test/subset/data/fonts/BungeeColor-Regular.ttf
new file mode 100644 (file)
index 0000000..d8eabb3
Binary files /dev/null and b/test/subset/data/fonts/BungeeColor-Regular.ttf differ
diff --git a/test/subset/data/fonts/Caudex-Regular.ttf b/test/subset/data/fonts/Caudex-Regular.ttf
new file mode 100644 (file)
index 0000000..669f9f8
Binary files /dev/null and b/test/subset/data/fonts/Caudex-Regular.ttf differ
diff --git a/test/subset/data/fonts/FranklinGothic-Regular.ttf b/test/subset/data/fonts/FranklinGothic-Regular.ttf
new file mode 100644 (file)
index 0000000..9779739
Binary files /dev/null and b/test/subset/data/fonts/FranklinGothic-Regular.ttf differ
diff --git a/test/subset/data/fonts/Fraunces.ttf b/test/subset/data/fonts/Fraunces.ttf
new file mode 100644 (file)
index 0000000..8210f94
Binary files /dev/null and b/test/subset/data/fonts/Fraunces.ttf differ
diff --git a/test/subset/data/fonts/Harmattan-Regular.ttf b/test/subset/data/fonts/Harmattan-Regular.ttf
new file mode 100644 (file)
index 0000000..0100cf4
Binary files /dev/null and b/test/subset/data/fonts/Harmattan-Regular.ttf differ
diff --git a/test/subset/data/fonts/IndicTestHowrah-Regular.ttf b/test/subset/data/fonts/IndicTestHowrah-Regular.ttf
new file mode 100644 (file)
index 0000000..f761b7f
Binary files /dev/null and b/test/subset/data/fonts/IndicTestHowrah-Regular.ttf differ
diff --git a/test/subset/data/fonts/Khmer.ttf b/test/subset/data/fonts/Khmer.ttf
new file mode 100644 (file)
index 0000000..4c37487
Binary files /dev/null and b/test/subset/data/fonts/Khmer.ttf differ
diff --git a/test/subset/data/fonts/Molengo-Regular.ttf b/test/subset/data/fonts/Molengo-Regular.ttf
new file mode 100644 (file)
index 0000000..da82a52
Binary files /dev/null and b/test/subset/data/fonts/Molengo-Regular.ttf differ
diff --git a/test/subset/data/fonts/NotoColrEmojiGlyf-Regular.subset.ttf b/test/subset/data/fonts/NotoColrEmojiGlyf-Regular.subset.ttf
new file mode 100644 (file)
index 0000000..76f565b
Binary files /dev/null and b/test/subset/data/fonts/NotoColrEmojiGlyf-Regular.subset.ttf differ
diff --git a/test/subset/data/fonts/NotoIKEAHebrewLatin-Regular.ttf b/test/subset/data/fonts/NotoIKEAHebrewLatin-Regular.ttf
new file mode 100644 (file)
index 0000000..7566808
Binary files /dev/null and b/test/subset/data/fonts/NotoIKEAHebrewLatin-Regular.ttf differ
diff --git a/test/subset/data/fonts/NotoNastaliqUrdu-Bold.ttf b/test/subset/data/fonts/NotoNastaliqUrdu-Bold.ttf
new file mode 100644 (file)
index 0000000..ef4c60f
Binary files /dev/null and b/test/subset/data/fonts/NotoNastaliqUrdu-Bold.ttf differ
diff --git a/test/subset/data/fonts/NotoNastaliqUrdu-Regular.ttf b/test/subset/data/fonts/NotoNastaliqUrdu-Regular.ttf
new file mode 100644 (file)
index 0000000..205192c
Binary files /dev/null and b/test/subset/data/fonts/NotoNastaliqUrdu-Regular.ttf differ
diff --git a/test/subset/data/fonts/NotoSansNewa-Regular.ttf b/test/subset/data/fonts/NotoSansNewa-Regular.ttf
new file mode 100644 (file)
index 0000000..b79b9cb
Binary files /dev/null and b/test/subset/data/fonts/NotoSansNewa-Regular.ttf differ
diff --git a/test/subset/data/fonts/NotoSerifMyanmar-Regular.otf b/test/subset/data/fonts/NotoSerifMyanmar-Regular.otf
new file mode 100644 (file)
index 0000000..ec4ed44
Binary files /dev/null and b/test/subset/data/fonts/NotoSerifMyanmar-Regular.otf differ
diff --git a/test/subset/data/fonts/STIXTwoMath-Regular.ttf b/test/subset/data/fonts/STIXTwoMath-Regular.ttf
new file mode 100644 (file)
index 0000000..351bfab
Binary files /dev/null and b/test/subset/data/fonts/STIXTwoMath-Regular.ttf differ
diff --git a/test/subset/data/fonts/SpectralSC-ExtraLightItalic.ttf b/test/subset/data/fonts/SpectralSC-ExtraLightItalic.ttf
new file mode 100644 (file)
index 0000000..e5b0f47
Binary files /dev/null and b/test/subset/data/fonts/SpectralSC-ExtraLightItalic.ttf differ
diff --git a/test/subset/data/fonts/SreeKrushnadevaraya-Regular.ttf b/test/subset/data/fonts/SreeKrushnadevaraya-Regular.ttf
new file mode 100644 (file)
index 0000000..4620792
Binary files /dev/null and b/test/subset/data/fonts/SreeKrushnadevaraya-Regular.ttf differ
diff --git a/test/subset/data/fonts/TestCOLRv1.ttf b/test/subset/data/fonts/TestCOLRv1.ttf
new file mode 100644 (file)
index 0000000..631da66
Binary files /dev/null and b/test/subset/data/fonts/TestCOLRv1.ttf differ
diff --git a/test/subset/data/fonts/Tinos-Italic.ttf b/test/subset/data/fonts/Tinos-Italic.ttf
new file mode 100644 (file)
index 0000000..851621e
Binary files /dev/null and b/test/subset/data/fonts/Tinos-Italic.ttf differ
diff --git a/test/subset/data/fonts/Ubuntu-Regular.ttf b/test/subset/data/fonts/Ubuntu-Regular.ttf
new file mode 100644 (file)
index 0000000..2001d6e
Binary files /dev/null and b/test/subset/data/fonts/Ubuntu-Regular.ttf differ
diff --git a/test/subset/data/fonts/colr-table.ttf b/test/subset/data/fonts/colr-table.ttf
new file mode 100644 (file)
index 0000000..c4b2a55
Binary files /dev/null and b/test/subset/data/fonts/colr-table.ttf differ
diff --git a/test/subset/data/fonts/glyf_bug_3131.ttf b/test/subset/data/fonts/glyf_bug_3131.ttf
new file mode 100644 (file)
index 0000000..a251936
Binary files /dev/null and b/test/subset/data/fonts/glyf_bug_3131.ttf differ
index 63af3bc..19833cf 100644 (file)
Binary files a/test/subset/data/fonts/gpos2_2_font5.otf and b/test/subset/data/fonts/gpos2_2_font5.otf differ
diff --git a/test/subset/data/fonts/gpos5_font1.otf b/test/subset/data/fonts/gpos5_font1.otf
new file mode 100644 (file)
index 0000000..c7e2132
Binary files /dev/null and b/test/subset/data/fonts/gpos5_font1.otf differ
diff --git a/test/subset/data/fonts/gpos9_font2.otf b/test/subset/data/fonts/gpos9_font2.otf
new file mode 100644 (file)
index 0000000..1378f81
Binary files /dev/null and b/test/subset/data/fonts/gpos9_font2.otf differ
diff --git a/test/subset/data/fonts/gsub8_manually_created.otf b/test/subset/data/fonts/gsub8_manually_created.otf
new file mode 100644 (file)
index 0000000..00cbb4b
Binary files /dev/null and b/test/subset/data/fonts/gsub8_manually_created.otf differ
diff --git a/test/subset/data/fonts/gsub_context1_multiple_subrules_f2.otf b/test/subset/data/fonts/gsub_context1_multiple_subrules_f2.otf
new file mode 100644 (file)
index 0000000..cb62adb
Binary files /dev/null and b/test/subset/data/fonts/gsub_context1_multiple_subrules_f2.otf differ
diff --git a/test/subset/data/fonts/gsub_context2_multiple_subrules_f2.otf b/test/subset/data/fonts/gsub_context2_multiple_subrules_f2.otf
new file mode 100644 (file)
index 0000000..fe5b94b
Binary files /dev/null and b/test/subset/data/fonts/gsub_context2_multiple_subrules_f2.otf differ
diff --git a/test/subset/data/fonts/gsub_context3_successive_f1.otf b/test/subset/data/fonts/gsub_context3_successive_f1.otf
new file mode 100644 (file)
index 0000000..682520a
Binary files /dev/null and b/test/subset/data/fonts/gsub_context3_successive_f1.otf differ
diff --git a/test/subset/data/profiles/glyph-names.txt b/test/subset/data/profiles/glyph-names.txt
new file mode 100644 (file)
index 0000000..57df5af
--- /dev/null
@@ -0,0 +1 @@
+--glyph-names
diff --git a/test/subset/data/profiles/keep-all-layout-features.txt b/test/subset/data/profiles/keep-all-layout-features.txt
new file mode 100644 (file)
index 0000000..97241e0
--- /dev/null
@@ -0,0 +1 @@
+--layout-features=*
diff --git a/test/subset/data/profiles/keep-layout-retain-gids.txt b/test/subset/data/profiles/keep-layout-retain-gids.txt
deleted file mode 100644 (file)
index f4787ad..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
---drop-tables-=GSUB,GPOS
---retain-gids
diff --git a/test/subset/data/profiles/keep-layout.txt b/test/subset/data/profiles/keep-layout.txt
deleted file mode 100644 (file)
index 56da0ff..0000000
+++ /dev/null
@@ -1 +0,0 @@
---drop-tables-=GSUB,GPOS
diff --git a/test/subset/data/profiles/layout-features.txt b/test/subset/data/profiles/layout-features.txt
new file mode 100644 (file)
index 0000000..15456e6
--- /dev/null
@@ -0,0 +1 @@
+--layout-features=kern,mark,liga
diff --git a/test/subset/data/profiles/layout-test-retain-gids.txt b/test/subset/data/profiles/layout-test-retain-gids.txt
new file mode 100644 (file)
index 0000000..63c67eb
--- /dev/null
@@ -0,0 +1,3 @@
+--layout-features=*
+--notdef-outline
+--retain-gids
diff --git a/test/subset/data/profiles/layout-test.txt b/test/subset/data/profiles/layout-test.txt
new file mode 100644 (file)
index 0000000..d98633a
--- /dev/null
@@ -0,0 +1,2 @@
+--layout-features=*
+--notdef-outline
diff --git a/test/subset/data/profiles/no-prune-unicode-ranges.txt b/test/subset/data/profiles/no-prune-unicode-ranges.txt
new file mode 100644 (file)
index 0000000..4d6872a
--- /dev/null
@@ -0,0 +1 @@
+--no-prune-unicode-ranges
diff --git a/test/subset/data/profiles/notdef-outline-desubroutinize-retain-gids.txt b/test/subset/data/profiles/notdef-outline-desubroutinize-retain-gids.txt
new file mode 100644 (file)
index 0000000..8648705
--- /dev/null
@@ -0,0 +1,3 @@
+--notdef-outline
+--desubroutinize
+--retain-gids
diff --git a/test/subset/data/profiles/notdef-outline-desubroutinize.txt b/test/subset/data/profiles/notdef-outline-desubroutinize.txt
new file mode 100644 (file)
index 0000000..c5f0ac5
--- /dev/null
@@ -0,0 +1,2 @@
+--notdef-outline
+--desubroutinize
diff --git a/test/subset/data/profiles/notdef-outline-drop-hints-desubroutinize-retain-gids.txt b/test/subset/data/profiles/notdef-outline-drop-hints-desubroutinize-retain-gids.txt
new file mode 100644 (file)
index 0000000..22236be
--- /dev/null
@@ -0,0 +1,4 @@
+--notdef-outline
+--no-hinting
+--desubroutinize
+--retain-gids
diff --git a/test/subset/data/profiles/notdef-outline-drop-hints-desubroutinize.txt b/test/subset/data/profiles/notdef-outline-drop-hints-desubroutinize.txt
new file mode 100644 (file)
index 0000000..a1fd783
--- /dev/null
@@ -0,0 +1,3 @@
+--notdef-outline
+--no-hinting
+--desubroutinize
diff --git a/test/subset/data/profiles/notdef-outline-drop-hints-retain-gids.txt b/test/subset/data/profiles/notdef-outline-drop-hints-retain-gids.txt
new file mode 100644 (file)
index 0000000..1f98591
--- /dev/null
@@ -0,0 +1,3 @@
+--notdef-outline
+--no-hinting
+--retain-gids
diff --git a/test/subset/data/profiles/notdef-outline-drop-hints.txt b/test/subset/data/profiles/notdef-outline-drop-hints.txt
new file mode 100644 (file)
index 0000000..10fb10c
--- /dev/null
@@ -0,0 +1,2 @@
+--notdef-outline
+--no-hinting
diff --git a/test/subset/data/profiles/notdef-outline-gids.txt b/test/subset/data/profiles/notdef-outline-gids.txt
new file mode 100644 (file)
index 0000000..ab9c86a
--- /dev/null
@@ -0,0 +1,2 @@
+--notdef-outline
+--gids=1,2,3
diff --git a/test/subset/data/profiles/notdef-outline-name-ids.txt b/test/subset/data/profiles/notdef-outline-name-ids.txt
new file mode 100644 (file)
index 0000000..8f66494
--- /dev/null
@@ -0,0 +1,2 @@
+--notdef-outline
+--name-IDs=0,1,2
diff --git a/test/subset/data/profiles/notdef-outline-retain-gids.txt b/test/subset/data/profiles/notdef-outline-retain-gids.txt
new file mode 100644 (file)
index 0000000..277308e
--- /dev/null
@@ -0,0 +1,2 @@
+--notdef-outline
+--retain-gids
diff --git a/test/subset/data/profiles/notdef-outline.txt b/test/subset/data/profiles/notdef-outline.txt
new file mode 100644 (file)
index 0000000..3a5e4f5
--- /dev/null
@@ -0,0 +1 @@
+--notdef-outline
diff --git a/test/subset/data/repack_tests/Makefile.am b/test/subset/data/repack_tests/Makefile.am
new file mode 100644 (file)
index 0000000..f85af6a
--- /dev/null
@@ -0,0 +1,21 @@
+# Process this file with automake to produce Makefile.in
+
+NULL =
+EXTRA_DIST =
+CLEANFILES =
+SUBDIRS =
+
+# Convenience targets:
+lib: libs # Always build subsetter lib in this subdir
+libs:
+       @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libs
+
+TEST_EXTENSIONS = .tests
+TESTS_LOG_COMPILER = $(srcdir)/../../run-repack-tests.py $(top_builddir)/util/hb-subset$(EXEEXT)
+include Makefile.sources
+
+EXTRA_DIST += \
+       $(TESTS) \
+       $(NULL)
+
+-include $(top_srcdir)/git.mk
diff --git a/test/subset/data/repack_tests/Makefile.in b/test/subset/data/repack_tests/Makefile.in
new file mode 100644 (file)
index 0000000..b2973e1
--- /dev/null
@@ -0,0 +1,1084 @@
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Process this file with automake to produce Makefile.in
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+TESTS = basic.tests prioritization.tests table_duplication.tests \
+       isolation.tests advanced_prioritization.tests \
+       space_splitting.tests $(am__EXEEXT_1)
+XFAIL_TESTS = $(am__EXEEXT_1)
+subdir = test/subset/data/repack_tests
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_link_flag.m4 \
+       $(top_srcdir)/m4/ax_code_coverage.m4 \
+       $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \
+       $(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/gtk-doc.m4 \
+       $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
+       $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+       $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+       ctags-recursive dvi-recursive html-recursive info-recursive \
+       install-data-recursive install-dvi-recursive \
+       install-exec-recursive install-html-recursive \
+       install-info-recursive install-pdf-recursive \
+       install-ps-recursive install-recursive installcheck-recursive \
+       installdirs-recursive pdf-recursive ps-recursive \
+       tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive        \
+  distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+  $(RECURSIVE_TARGETS) \
+  $(RECURSIVE_CLEAN_TARGETS) \
+  $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+       check recheck distdir distdir-am
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__tty_colors_dummy = \
+  mgn= red= grn= lgn= blu= brg= std=; \
+  am__color_tests=no
+am__tty_colors = { \
+  $(am__tty_colors_dummy); \
+  if test "X$(AM_COLOR_TESTS)" = Xno; then \
+    am__color_tests=no; \
+  elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+    am__color_tests=yes; \
+  elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+    am__color_tests=yes; \
+  fi; \
+  if test $$am__color_tests = yes; then \
+    red='\e[0;31m'; \
+    grn='\e[0;32m'; \
+    lgn='\e[1;32m'; \
+    blu='\e[1;34m'; \
+    mgn='\e[0;35m'; \
+    brg='\e[1m'; \
+    std='\e[m'; \
+  fi; \
+}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__recheck_rx = ^[    ]*:recheck:[    ]*
+am__global_test_result_rx = ^[         ]*:global-test-result:[         ]*
+am__copy_in_global_log_rx = ^[         ]*:copy-in-global-log:[         ]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+  recheck = 1; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+        { \
+          if ((getline line2 < ($$0 ".log")) < 0) \
+           recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+        { \
+          recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+        { \
+          break; \
+        } \
+    }; \
+  if (recheck) \
+    print $$0; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+  print "fatal: making $@: " msg | "cat >&2"; \
+  exit 1; \
+} \
+function rst_section(header) \
+{ \
+  print header; \
+  len = length(header); \
+  for (i = 1; i <= len; i = i + 1) \
+    printf "="; \
+  printf "\n\n"; \
+} \
+{ \
+  copy_in_global_log = 1; \
+  global_test_result = "RUN"; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+         fatal("failed to read from " $$0 ".trs"); \
+      if (line ~ /$(am__global_test_result_rx)/) \
+        { \
+          sub("$(am__global_test_result_rx)", "", line); \
+          sub("[       ]*$$", "", line); \
+          global_test_result = line; \
+        } \
+      else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+        copy_in_global_log = 0; \
+    }; \
+  if (copy_in_global_log) \
+    { \
+      rst_section(global_test_result ": " $$0); \
+      while ((rc = (getline line < ($$0 ".log"))) != 0) \
+      { \
+        if (rc < 0) \
+          fatal("failed to read from " $$0 ".log"); \
+        print line; \
+      }; \
+      printf "\n"; \
+    }; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/   &   /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this.  Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+  --color-tests "$$am__color_tests" \
+  --enable-hard-errors "$$am__enable_hard_errors" \
+  --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test.  Creates the
+# directory for the log if needed.  Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log.  Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT.  Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup);                                     \
+$(am__vpath_adj_setup) $(am__vpath_adj)                        \
+$(am__tty_colors);                                     \
+srcdir=$(srcdir); export srcdir;                       \
+case "$@" in                                           \
+  */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;;   \
+    *) am__odir=.;;                                    \
+esac;                                                  \
+test "x$$am__odir" = x"." || test -d "$$am__odir"      \
+  || $(MKDIR_P) "$$am__odir" || exit $$?;              \
+if test -f "./$$f"; then dir=./;                       \
+elif test -f "$$f"; then dir=;                         \
+else dir="$(srcdir)/"; fi;                             \
+tst=$$dir$$f; log='$@';                                \
+if test -n '$(DISABLE_HARD_ERRORS)'; then              \
+  am__enable_hard_errors=no;                           \
+else                                                   \
+  am__enable_hard_errors=yes;                          \
+fi;                                                    \
+case " $(XFAIL_TESTS) " in                             \
+  *[\ \        ]$$f[\ \        ]* | *[\ \      ]$$dir$$f[\ \   ]*) \
+    am__expect_failure=yes;;                           \
+  *)                                                   \
+    am__expect_failure=no;;                            \
+esac;                                                  \
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed).  The result is saved in the shell variable
+# '$bases'.  This honors runtime overriding of TESTS and TEST_LOGS.  Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+  bases='$(TEST_LOGS)'; \
+  bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+  bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+am__EXEEXT_1 =
+TEST_SUITE_LOG = test-suite.log
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
+TEST_LOGS = $(am__test_logs2:.tests.log=.log)
+TESTS_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+TESTS_LOG_COMPILE = $(TESTS_LOG_COMPILER) $(AM_TESTS_LOG_FLAGS) \
+       $(TESTS_LOG_FLAGS)
+am__set_b = \
+  case '$@' in \
+    */*) \
+      case '$*' in \
+        */*) b='$*';; \
+          *) b=`echo '$@' | sed 's/\.log$$//'`; \
+       esac;; \
+    *) \
+      b='$*';; \
+  esac
+DIST_SUBDIRS = $(SUBDIRS)
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.sources \
+       $(top_srcdir)/test-driver
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CAIRO_CFLAGS = @CAIRO_CFLAGS@
+CAIRO_FT_CFLAGS = @CAIRO_FT_CFLAGS@
+CAIRO_FT_LIBS = @CAIRO_FT_LIBS@
+CAIRO_LIBS = @CAIRO_LIBS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHAFA_CFLAGS = @CHAFA_CFLAGS@
+CHAFA_LIBS = @CHAFA_LIBS@
+CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
+CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
+CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
+CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
+CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
+CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
+CORETEXT_CFLAGS = @CORETEXT_CFLAGS@
+CORETEXT_LIBS = @CORETEXT_LIBS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DIRECTWRITE_CXXFLAGS = @DIRECTWRITE_CXXFLAGS@
+DIRECTWRITE_LIBS = @DIRECTWRITE_LIBS@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
+FREETYPE_DEPS = @FREETYPE_DEPS@
+FREETYPE_LIBS = @FREETYPE_LIBS@
+GCOV = @GCOV@
+GDI_CFLAGS = @GDI_CFLAGS@
+GDI_LIBS = @GDI_LIBS@
+GENHTML = @GENHTML@
+GIT = @GIT@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_DEPS = @GLIB_DEPS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GOBJECT_CFLAGS = @GOBJECT_CFLAGS@
+GOBJECT_LIBS = @GOBJECT_LIBS@
+GRAPHITE2_CFLAGS = @GRAPHITE2_CFLAGS@
+GRAPHITE2_DEPS = @GRAPHITE2_DEPS@
+GRAPHITE2_LIBS = @GRAPHITE2_LIBS@
+GREP = @GREP@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@
+GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
+GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
+GTKDOC_MKPDF = @GTKDOC_MKPDF@
+GTKDOC_REBASE = @GTKDOC_REBASE@
+HAVE_CXX11 = @HAVE_CXX11@
+HB_LIBTOOL_VERSION_INFO = @HB_LIBTOOL_VERSION_INFO@
+HB_VERSION = @HB_VERSION@
+HB_VERSION_MAJOR = @HB_VERSION_MAJOR@
+HB_VERSION_MICRO = @HB_VERSION_MICRO@
+HB_VERSION_MINOR = @HB_VERSION_MINOR@
+HTML_DIR = @HTML_DIR@
+ICU_CFLAGS = @ICU_CFLAGS@
+ICU_LIBS = @ICU_LIBS@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+LCOV = @LCOV@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
+RAGEL = @RAGEL@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+UNISCRIBE_CFLAGS = @UNISCRIBE_CFLAGS@
+UNISCRIBE_LIBS = @UNISCRIBE_LIBS@
+VERSION = @VERSION@
+_GI_EXP_DATADIR = @_GI_EXP_DATADIR@
+_GI_EXP_LIBDIR = @_GI_EXP_LIBDIR@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+have_gobject = @have_gobject@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+NULL = 
+EXTRA_DIST = $(TESTS) $(NULL)
+CLEANFILES = 
+SUBDIRS = 
+TEST_EXTENSIONS = .tests
+TESTS_LOG_COMPILER = $(srcdir)/../../run-repack-tests.py $(top_builddir)/util/hb-subset$(EXEEXT)
+DISABLED_TESTS = \
+       $(NULL)
+
+all: all-recursive
+
+.SUFFIXES:
+.SUFFIXES: .log .tests .tests$(EXEEXT) .trs
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am $(srcdir)/Makefile.sources $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+               && { if test -f $@; then exit 0; else break; fi; }; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits test/subset/data/repack_tests/Makefile'; \
+       $(am__cd) $(top_srcdir) && \
+         $(AUTOMAKE) --gnits test/subset/data/repack_tests/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+       esac;
+$(srcdir)/Makefile.sources $(am__empty):
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+       -rm -f *.lo
+
+clean-libtool:
+       -rm -rf .libs _libs
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+#     (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+       @fail=; \
+       if $(am__make_keepgoing); then \
+         failcom='fail=yes'; \
+       else \
+         failcom='exit 1'; \
+       fi; \
+       dot_seen=no; \
+       target=`echo $@ | sed s/-recursive//`; \
+       case "$@" in \
+         distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+         *) list='$(SUBDIRS)' ;; \
+       esac; \
+       for subdir in $$list; do \
+         echo "Making $$target in $$subdir"; \
+         if test "$$subdir" = "."; then \
+           dot_seen=yes; \
+           local_target="$$target-am"; \
+         else \
+           local_target="$$target"; \
+         fi; \
+         ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+         || eval $$failcom; \
+       done; \
+       if test "$$dot_seen" = "no"; then \
+         $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+       fi; test -z "$$fail"
+
+ID: $(am__tagged_files)
+       $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+       set x; \
+       here=`pwd`; \
+       if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+         include_option=--etags-include; \
+         empty_fix=.; \
+       else \
+         include_option=--include; \
+         empty_fix=; \
+       fi; \
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         if test "$$subdir" = .; then :; else \
+           test ! -f $$subdir/TAGS || \
+             set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+         fi; \
+       done; \
+       $(am__define_uniq_tagged_files); \
+       shift; \
+       if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+         test -n "$$unique" || unique=$$empty_fix; \
+         if test $$# -gt 0; then \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             "$$@" $$unique; \
+         else \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             $$unique; \
+         fi; \
+       fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+       $(am__define_uniq_tagged_files); \
+       test -z "$(CTAGS_ARGS)$$unique" \
+         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+            $$unique
+
+GTAGS:
+       here=`$(am__cd) $(top_builddir) && pwd` \
+         && $(am__cd) $(top_srcdir) \
+         && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+       list='$(am__tagged_files)'; \
+       case "$(srcdir)" in \
+         [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+         *) sdir=$(subdir)/$(srcdir) ;; \
+       esac; \
+       for i in $$list; do \
+         if test -f "$$i"; then \
+           echo "$(subdir)/$$i"; \
+         else \
+           echo "$$sdir/$$i"; \
+         fi; \
+       done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'.  Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+       rm -f $< $@
+       $(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+       @:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+       @$(am__set_TESTS_bases); \
+       am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+       redo_bases=`for i in $$bases; do \
+                     am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+                   done`; \
+       if test -n "$$redo_bases"; then \
+         redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+         redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+         if $(am__make_dryrun); then :; else \
+           rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+         fi; \
+       fi; \
+       if test -n "$$am__remaking_logs"; then \
+         echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+              "recursion detected" >&2; \
+       elif test -n "$$redo_logs"; then \
+         am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+       fi; \
+       if $(am__make_dryrun); then :; else \
+         st=0;  \
+         errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+         for i in $$redo_bases; do \
+           test -f $$i.trs && test -r $$i.trs \
+             || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+           test -f $$i.log && test -r $$i.log \
+             || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+         done; \
+         test $$st -eq 0 || exit 1; \
+       fi
+       @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+       ws='[   ]'; \
+       results=`for b in $$bases; do echo $$b.trs; done`; \
+       test -n "$$results" || results=/dev/null; \
+       all=`  grep "^$$ws*:test-result:"           $$results | wc -l`; \
+       pass=` grep "^$$ws*:test-result:$$ws*PASS"  $$results | wc -l`; \
+       fail=` grep "^$$ws*:test-result:$$ws*FAIL"  $$results | wc -l`; \
+       skip=` grep "^$$ws*:test-result:$$ws*SKIP"  $$results | wc -l`; \
+       xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+       xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+       error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+       if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+         success=true; \
+       else \
+         success=false; \
+       fi; \
+       br='==================='; br=$$br$$br$$br$$br; \
+       result_count () \
+       { \
+           if test x"$$1" = x"--maybe-color"; then \
+             maybe_colorize=yes; \
+           elif test x"$$1" = x"--no-color"; then \
+             maybe_colorize=no; \
+           else \
+             echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+           fi; \
+           shift; \
+           desc=$$1 count=$$2; \
+           if test $$maybe_colorize = yes && test $$count -gt 0; then \
+             color_start=$$3 color_end=$$std; \
+           else \
+             color_start= color_end=; \
+           fi; \
+           echo "$${color_start}# $$desc $$count$${color_end}"; \
+       }; \
+       create_testsuite_report () \
+       { \
+         result_count $$1 "TOTAL:" $$all   "$$brg"; \
+         result_count $$1 "PASS: " $$pass  "$$grn"; \
+         result_count $$1 "SKIP: " $$skip  "$$blu"; \
+         result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+         result_count $$1 "FAIL: " $$fail  "$$red"; \
+         result_count $$1 "XPASS:" $$xpass "$$red"; \
+         result_count $$1 "ERROR:" $$error "$$mgn"; \
+       }; \
+       {                                                               \
+         echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" |       \
+           $(am__rst_title);                                           \
+         create_testsuite_report --no-color;                           \
+         echo;                                                         \
+         echo ".. contents:: :depth: 2";                               \
+         echo;                                                         \
+         for b in $$bases; do echo $$b; done                           \
+           | $(am__create_global_log);                                 \
+       } >$(TEST_SUITE_LOG).tmp || exit 1;                             \
+       mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG);                     \
+       if $$success; then                                              \
+         col="$$grn";                                                  \
+        else                                                           \
+         col="$$red";                                                  \
+         test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG);               \
+       fi;                                                             \
+       echo "$${col}$$br$${std}";                                      \
+       echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}";   \
+       echo "$${col}$$br$${std}";                                      \
+       create_testsuite_report --maybe-color;                          \
+       echo "$$col$$br$$std";                                          \
+       if $$success; then :; else                                      \
+         echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}";         \
+         if test -n "$(PACKAGE_BUGREPORT)"; then                       \
+           echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
+         fi;                                                           \
+         echo "$$col$$br$$std";                                        \
+       fi;                                                             \
+       $$success || exit 1
+
+check-TESTS: 
+       @list='$(RECHECK_LOGS)';           test -z "$$list" || rm -f $$list
+       @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+       @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+       @set +e; $(am__set_TESTS_bases); \
+       log_list=`for i in $$bases; do echo $$i.log; done`; \
+       trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+       log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+       $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+       exit $$?;
+recheck: all 
+       @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+       @set +e; $(am__set_TESTS_bases); \
+       bases=`for i in $$bases; do echo $$i; done \
+                | $(am__list_recheck_tests)` || exit 1; \
+       log_list=`for i in $$bases; do echo $$i.log; done`; \
+       log_list=`echo $$log_list`; \
+       $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+               am__force_recheck=am--force-recheck \
+               TEST_LOGS="$$log_list"; \
+       exit $$?
+.tests.log:
+       @p='$<'; \
+       $(am__set_b); \
+       $(am__check_pre) $(TESTS_LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_TESTS_LOG_DRIVER_FLAGS) $(TESTS_LOG_DRIVER_FLAGS) -- $(TESTS_LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+@am__EXEEXT_TRUE@.tests$(EXEEXT).log:
+@am__EXEEXT_TRUE@      @p='$<'; \
+@am__EXEEXT_TRUE@      $(am__set_b); \
+@am__EXEEXT_TRUE@      $(am__check_pre) $(TESTS_LOG_DRIVER) --test-name "$$f" \
+@am__EXEEXT_TRUE@      --log-file $$b.log --trs-file $$b.trs \
+@am__EXEEXT_TRUE@      $(am__common_driver_flags) $(AM_TESTS_LOG_DRIVER_FLAGS) $(TESTS_LOG_DRIVER_FLAGS) -- $(TESTS_LOG_COMPILE) \
+@am__EXEEXT_TRUE@      "$$tst" $(AM_TESTS_FD_REDIRECT)
+
+distdir: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       list='$(DISTFILES)'; \
+         dist_files=`for file in $$list; do echo $$file; done | \
+         sed -e "s|^$$srcdirstrip/||;t" \
+             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+       case $$dist_files in \
+         */*) $(MKDIR_P) `echo "$$dist_files" | \
+                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+                          sort -u` ;; \
+       esac; \
+       for file in $$dist_files; do \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         if test -d $$d/$$file; then \
+           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+           if test -d "$(distdir)/$$file"; then \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+         else \
+           test -f "$(distdir)/$$file" \
+           || cp -p $$d/$$file "$(distdir)/$$file" \
+           || exit 1; \
+         fi; \
+       done
+       @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+         if test "$$subdir" = .; then :; else \
+           $(am__make_dryrun) \
+             || test -d "$(distdir)/$$subdir" \
+             || $(MKDIR_P) "$(distdir)/$$subdir" \
+             || exit 1; \
+           dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+           $(am__relativize); \
+           new_distdir=$$reldir; \
+           dir1=$$subdir; dir2="$(top_distdir)"; \
+           $(am__relativize); \
+           new_top_distdir=$$reldir; \
+           echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+           echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+           ($(am__cd) $$subdir && \
+             $(MAKE) $(AM_MAKEFLAGS) \
+               top_distdir="$$new_top_distdir" \
+               distdir="$$new_distdir" \
+               am__remove_distdir=: \
+               am__skip_length_check=: \
+               am__skip_mode_fix=: \
+               distdir) \
+             || exit 1; \
+         fi; \
+       done
+check-am: all-am
+       $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-recursive
+all-am: Makefile
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
+mostlyclean-generic:
+       -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+       -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+       -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+
+clean-generic:
+       -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+       -rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: $(am__recursive_targets) check-am install-am install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
+       check-TESTS check-am clean clean-generic clean-libtool \
+       cscopelist-am ctags ctags-am distclean distclean-generic \
+       distclean-libtool distclean-tags distdir dvi dvi-am html \
+       html-am info info-am install install-am install-data \
+       install-data-am install-dvi install-dvi-am install-exec \
+       install-exec-am install-html install-html-am install-info \
+       install-info-am install-man install-pdf install-pdf-am \
+       install-ps install-ps-am install-strip installcheck \
+       installcheck-am installdirs installdirs-am maintainer-clean \
+       maintainer-clean-generic mostlyclean mostlyclean-generic \
+       mostlyclean-libtool pdf pdf-am ps ps-am recheck tags tags-am \
+       uninstall uninstall-am
+
+.PRECIOUS: Makefile
+
+
+# Convenience targets:
+lib: libs # Always build subsetter lib in this subdir
+libs:
+       @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libs
+
+-include $(top_srcdir)/git.mk
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/test/subset/data/repack_tests/Makefile.sources b/test/subset/data/repack_tests/Makefile.sources
new file mode 100644 (file)
index 0000000..9e85174
--- /dev/null
@@ -0,0 +1,14 @@
+TESTS = \
+       basic.tests \
+       prioritization.tests \
+       table_duplication.tests \
+        isolation.tests \
+       advanced_prioritization.tests \
+       space_splitting.tests \
+       $(NULL)
+
+XFAIL_TESTS = \
+       $(NULL)
+
+DISABLED_TESTS = \
+       $(NULL)
diff --git a/test/subset/data/repack_tests/advanced_prioritization.tests b/test/subset/data/repack_tests/advanced_prioritization.tests
new file mode 100644 (file)
index 0000000..adcbb00
--- /dev/null
@@ -0,0 +1,72 @@
+NotoNastaliqUrdu-Bold.ttf
+0x0020
+0x0028
+0x0029
+0x002C
+0x002D
+0x002E
+0x0030
+0x0031
+0x0032
+0x0033
+0x0034
+0x0035
+0x0036
+0x0037
+0x0038
+0x0039
+0x003A
+0x060C
+0x061F
+0x0621
+0x0622
+0x0623
+0x0624
+0x0625
+0x0626
+0x0627
+0x0628
+0x0629
+0x062A
+0x062B
+0x062C
+0x062D
+0x062E
+0x062F
+0x0630
+0x0631
+0x0632
+0x0633
+0x0634
+0x0635
+0x0636
+0x0637
+0x0638
+0x0639
+0x063A
+0x0640
+0x0641
+0x0642
+0x0643
+0x0644
+0x0645
+0x0646
+0x0647
+0x0648
+0x0649
+0x064A
+0x064B
+0x064C
+0x064F
+0x0651
+0x067E
+0x0686
+0x0698
+0x06A9
+0x06AF
+0x06BE
+0x06CC
+0x200C
+0x200D
+0x200E
+
diff --git a/test/subset/data/repack_tests/basic.tests b/test/subset/data/repack_tests/basic.tests
new file mode 100644 (file)
index 0000000..896cc9b
--- /dev/null
@@ -0,0 +1,52 @@
+NotoNastaliqUrdu-Bold.ttf
+0x060C
+0x061F
+0x0621
+0x0622
+0x0623
+0x0624
+0x0625
+0x0626
+0x0627
+0x0628
+0x0629
+0x062A
+0x062B
+0x062C
+0x062D
+0x062E
+0x062F
+0x0630
+0x0631
+0x0632
+0x0633
+0x0634
+0x0635
+0x0636
+0x0637
+0x0638
+0x0639
+0x063A
+0x0640
+0x0641
+0x0642
+0x0643
+0x0644
+0x0645
+0x0646
+0x0647
+0x0648
+0x0649
+0x064A
+0x064B
+0x064F
+0x0651
+0x067E
+0x0686
+0x0698
+0x06A9
+0x06AF
+0x06CC
+0x200C
+0x200D
+0x200E
diff --git a/test/subset/data/repack_tests/isolation.tests b/test/subset/data/repack_tests/isolation.tests
new file mode 100644 (file)
index 0000000..46317b5
--- /dev/null
@@ -0,0 +1,96 @@
+NotoNastaliqUrdu-Regular.ttf
+0x0020
+0x060b
+0x0621
+0x0622
+0x0623
+0x0624
+0x0625
+0x0626
+0x0627
+0x0628
+0x0629
+0x062a
+0x062b
+0x062c
+0x062d
+0x062e
+0x062f
+0x0630
+0x0631
+0x0632
+0x0633
+0x0634
+0x0635
+0x0636
+0x0637
+0x0638
+0x0639
+0x063a
+0x0641
+0x0642
+0x0643
+0x0644
+0x0645
+0x0646
+0x0647
+0x0648
+0x0649
+0x064a
+0x0653
+0x0654
+0x0655
+0x0671
+0x0679
+0x067a
+0x067b
+0x067c
+0x067d
+0x067e
+0x067f
+0x0680
+0x0681
+0x0683
+0x0684
+0x0685
+0x0686
+0x0687
+0x0688
+0x0689
+0x068a
+0x068c
+0x068d
+0x068f
+0x0691
+0x0693
+0x0696
+0x0698
+0x0699
+0x069a
+0x06a4
+0x06a6
+0x06a9
+0x06ab
+0x06af
+0x06b1
+0x06b3
+0x06ba
+0x06bb
+0x06bc
+0x06be
+0x06c0
+0x06c1
+0x06c2
+0x06c3
+0x06cc
+0x06cd
+0x06d0
+0x06d2
+0x06d3
+0x06d5
+0x06de
+0x06e9
+0xfdf2
+0xfdfa
+0xfdfc
+0xfdfd
diff --git a/test/subset/data/repack_tests/prioritization.tests b/test/subset/data/repack_tests/prioritization.tests
new file mode 100644 (file)
index 0000000..63b437c
--- /dev/null
@@ -0,0 +1,77 @@
+NotoNastaliqUrdu-Bold.ttf
+0x0020
+0x0028
+0x0029
+0x002C
+0x002D
+0x002E
+0x0030
+0x0031
+0x0032
+0x0033
+0x0034
+0x0035
+0x0036
+0x0037
+0x0038
+0x0039
+0x003A
+0x060C
+0x061F
+0x0621
+0x0622
+0x0623
+0x0624
+0x0625
+0x0626
+0x0627
+0x0628
+0x0629
+0x062A
+0x062B
+0x062C
+0x062D
+0x062E
+0x062F
+0x0630
+0x0631
+0x0632
+0x0633
+0x0634
+0x0635
+0x0636
+0x0637
+0x0638
+0x0639
+0x063A
+0x0640
+0x0641
+0x0642
+0x0643
+0x0644
+0x0645
+0x0646
+0x0647
+0x0648
+0x0649
+0x064A
+0x064B
+0x064F
+0x0651
+0x0653
+0x0679
+0x067E
+0x0686
+0x0688
+0x0691
+0x0698
+0x06A9
+0x06AF
+0x06BA
+0x06BE
+0x06C1
+0x06CC
+0x06D2
+0x200C
+0x200D
+0x200E
diff --git a/test/subset/data/repack_tests/space_splitting.tests b/test/subset/data/repack_tests/space_splitting.tests
new file mode 100644 (file)
index 0000000..0c1f179
--- /dev/null
@@ -0,0 +1,2 @@
+Harmattan-Regular.ttf
+*
diff --git a/test/subset/data/repack_tests/table_duplication.tests b/test/subset/data/repack_tests/table_duplication.tests
new file mode 100644 (file)
index 0000000..3cc90d6
--- /dev/null
@@ -0,0 +1,97 @@
+NotoNastaliqUrdu-Bold.ttf
+0x0028
+0x0029
+0x002C
+0x002D
+0x002E
+0x0030
+0x0031
+0x0032
+0x0033
+0x0034
+0x0035
+0x0036
+0x0037
+0x0038
+0x0039
+0x003A
+0x0041
+0x0042
+0x0043
+0x0044
+0x0045
+0x0046
+0x0047
+0x0048
+0x0049
+0x004C
+0x004D
+0x004E
+0x004F
+0x0050
+0x0052
+0x0053
+0x0054
+0x0055
+0x0056
+0x0057
+0x0061
+0x0062
+0x0063
+0x0064
+0x0065
+0x0066
+0x0067
+0x0068
+0x0069
+0x006B
+0x006C
+0x006D
+0x006E
+0x006F
+0x0070
+0x0072
+0x0073
+0x0074
+0x0075
+0x0076
+0x0077
+0x0078
+0x0079
+0x060C
+0x0626
+0x0627
+0x0628
+0x062A
+0x062C
+0x062D
+0x062E
+0x062F
+0x0631
+0x0632
+0x0633
+0x0634
+0x0635
+0x0636
+0x0637
+0x0638
+0x0639
+0x0641
+0x0642
+0x0644
+0x0645
+0x0646
+0x0648
+0x0653
+0x0679
+0x067E
+0x0686
+0x0688
+0x0691
+0x06A9
+0x06AF
+0x06BA
+0x06BE
+0x06C1
+0x06CC
+0x06D2
index c5aa136..12ac8b0 100644 (file)
@@ -8,10 +8,15 @@ default.txt
 drop-hints.txt
 drop-hints-retain-gids.txt
 retain-gids.txt
+notdef-outline.txt
 name-ids.txt
 name-languages.txt
 name-legacy.txt
 gids.txt
+layout-features.txt
+keep-all-layout-features.txt
+no-prune-unicode-ranges.txt
+glyph-names.txt
 
 SUBSETS:
 abc
index e55f21e..babcacd 100644 (file)
@@ -2,17 +2,16 @@ FONTS:
 SourceSansPro-Regular.otf
 
 PROFILES:
-default.txt
-drop-hints.txt
-drop-hints-retain-gids.txt
-retain-gids.txt
-desubroutinize.txt
-desubroutinize-retain-gids.txt
-drop-hints-desubroutinize.txt
-drop-hints-desubroutinize-retain-gids.txt
+notdef-outline.txt
+notdef-outline-drop-hints.txt
+notdef-outline-drop-hints-retain-gids.txt
+notdef-outline-retain-gids.txt
+notdef-outline-desubroutinize.txt
+notdef-outline-desubroutinize-retain-gids.txt
+notdef-outline-drop-hints-desubroutinize.txt
+notdef-outline-drop-hints-desubroutinize-retain-gids.txt
 
 SUBSETS:
 abc
 Ǽ!A bc
 ×ØÙÚÞ
-
index d69396f..a0a9c6f 100644 (file)
@@ -17,6 +17,3 @@ acek
 明極珠度輸清
 あいうえおか
 あいう珠度輸
-
-
-
diff --git a/test/subset/data/tests/cff.notoserifmyanmar.tests b/test/subset/data/tests/cff.notoserifmyanmar.tests
new file mode 100644 (file)
index 0000000..155d062
--- /dev/null
@@ -0,0 +1,9 @@
+FONTS:
+NotoSerifMyanmar-Regular.otf
+
+PROFILES:
+notdef-outline.txt
+
+SUBSETS:
+႒
+#စက်ပစ္စည်းတွေ၊
index 0ed4fb8..abfec32 100644 (file)
@@ -3,12 +3,12 @@ cmap14_font1.otf
 cmap14_font2.otf
 
 PROFILES:
-default.txt
-drop-hints.txt
-drop-hints-retain-gids.txt
-retain-gids.txt
-name-ids.txt
-gids.txt
+notdef-outline.txt
+notdef-outline-drop-hints.txt
+notdef-outline-drop-hints-retain-gids.txt
+notdef-outline-retain-gids.txt
+notdef-outline-name-ids.txt
+notdef-outline-gids.txt
 
 SUBSETS:
 一丂七
diff --git a/test/subset/data/tests/colr_glyphs.tests b/test/subset/data/tests/colr_glyphs.tests
new file mode 100644 (file)
index 0000000..005b550
--- /dev/null
@@ -0,0 +1,11 @@
+FONTS:
+BungeeColor-Regular.ttf
+
+PROFILES:
+default.txt
+drop-hints.txt
+drop-hints-retain-gids.txt
+retain-gids.txt
+
+SUBSETS:
+A
diff --git a/test/subset/data/tests/colr_with_components.tests b/test/subset/data/tests/colr_with_components.tests
new file mode 100644 (file)
index 0000000..5d7c66e
--- /dev/null
@@ -0,0 +1,11 @@
+FONTS:
+colr-table.ttf
+
+PROFILES:
+default.txt
+drop-hints.txt
+drop-hints-retain-gids.txt
+retain-gids.txt
+
+SUBSETS:
+k
diff --git a/test/subset/data/tests/colrv1.tests b/test/subset/data/tests/colrv1.tests
new file mode 100644 (file)
index 0000000..a15ad92
--- /dev/null
@@ -0,0 +1,23 @@
+FONTS:
+TestCOLRv1.ttf
+
+PROFILES:
+default.txt
+drop-hints.txt
+drop-hints-retain-gids.txt
+retain-gids.txt
+
+SUBSETS:
+U+E000
+U+E001
+U+E002
+U+E003
+U+E004
+U+E000,U+E001
+U+E002,U+E003
+U+E000,U+E004
+U+E003,U+E004
+U+E000,U+E001,U+E002
+U+E000,U+E001,U+E002,U+E003
+U+E002,U+E003,U+E004
+*
diff --git a/test/subset/data/tests/glyf_bug_3131.tests b/test/subset/data/tests/glyf_bug_3131.tests
new file mode 100644 (file)
index 0000000..d0fd5dc
--- /dev/null
@@ -0,0 +1,11 @@
+# Tests for https://github.com/harfbuzz/harfbuzz/issues/3131
+FONTS:
+glyf_bug_3131.ttf
+
+PROFILES:
+drop-hints-retain-gids.txt
+retain-gids.txt
+
+SUBSETS:
+cdeopqr
+*
diff --git a/test/subset/data/tests/glyph_names.tests b/test/subset/data/tests/glyph_names.tests
new file mode 100644 (file)
index 0000000..a710a39
--- /dev/null
@@ -0,0 +1,9 @@
+FONTS:
+Ubuntu-Regular.ttf
+
+PROFILES:
+glyph-names.txt
+
+SUBSETS:
+U+0x0,U+0x8,U+0x9,U+0x1d,U+0x20,U+0xb7
+*
diff --git a/test/subset/data/tests/layout.context.tests b/test/subset/data/tests/layout.context.tests
new file mode 100644 (file)
index 0000000..dacd555
--- /dev/null
@@ -0,0 +1,15 @@
+FONTS:
+gpos_context1_multiple_subrules_f1.otf
+gpos_context2_multiple_subrules_f1.otf
+gpos_context3_simple_f1.otf
+
+PROFILES:
+layout-test.txt
+layout-test-retain-gids.txt
+
+SUBSETS:
+A
+AB
+AC
+ABC
+*
diff --git a/test/subset/data/tests/layout.context_format2.tests b/test/subset/data/tests/layout.context_format2.tests
new file mode 100644 (file)
index 0000000..019fb94
--- /dev/null
@@ -0,0 +1,9 @@
+FONTS:
+NotoSansNewa-Regular.ttf
+
+PROFILES:
+layout-test.txt
+layout-test-retain-gids.txt
+
+SUBSETS:
+*
diff --git a/test/subset/data/tests/layout.default_features.tests b/test/subset/data/tests/layout.default_features.tests
new file mode 100644 (file)
index 0000000..30a4b00
--- /dev/null
@@ -0,0 +1,11 @@
+FONTS:
+FranklinGothic-Regular.ttf
+
+PROFILES:
+layout-test.txt
+default.txt
+retain-gids.txt
+
+SUBSETS:
+achi
+*
diff --git a/test/subset/data/tests/layout.drop_feature.tests b/test/subset/data/tests/layout.drop_feature.tests
new file mode 100644 (file)
index 0000000..9d15ce2
--- /dev/null
@@ -0,0 +1,10 @@
+FONTS:
+SpectralSC-ExtraLightItalic.ttf
+
+PROFILES:
+default.txt
+glyph-names.txt
+notdef-outline.txt
+
+SUBSETS:
+*
diff --git a/test/subset/data/tests/layout.duplicate_features.tests b/test/subset/data/tests/layout.duplicate_features.tests
new file mode 100644 (file)
index 0000000..d6bc9a2
--- /dev/null
@@ -0,0 +1,11 @@
+FONTS:
+AlegreyaSans-BlackItalic.ttf
+
+PROFILES:
+default.txt
+glyph-names.txt
+notdef-outline.txt
+
+SUBSETS:
+U+20,U+2f,U+38,U+49,U+4c,U+51,U+53,U+66,U+67,U+6f,U+b4,U+2044
+*
diff --git a/test/subset/data/tests/layout.gdef-attachlist.tests b/test/subset/data/tests/layout.gdef-attachlist.tests
new file mode 100644 (file)
index 0000000..b380ac1
--- /dev/null
@@ -0,0 +1,13 @@
+FONTS:
+IndicTestJalandhar-Regular.ttf
+
+PROFILES:
+default.txt
+drop-hints.txt
+keep-gdef.txt
+
+SUBSETS:
+ਁ
+ਅਆ
+ਇਛ
+*
diff --git a/test/subset/data/tests/layout.gdef-varstore.tests b/test/subset/data/tests/layout.gdef-varstore.tests
new file mode 100644 (file)
index 0000000..45b9065
--- /dev/null
@@ -0,0 +1,14 @@
+FONTS:
+AdobeVFPrototype.otf
+
+PROFILES:
+layout-test.txt
+layout-test-retain-gids.txt
+
+SUBSETS:
+A
+AB
+ABC
+BW
+AVW
+ABCW
diff --git a/test/subset/data/tests/layout.gdef.glyphset.tests b/test/subset/data/tests/layout.gdef.glyphset.tests
new file mode 100644 (file)
index 0000000..b5591ef
--- /dev/null
@@ -0,0 +1,11 @@
+FONTS:
+IndicTestHowrah-Regular.ttf
+
+PROFILES:
+default.txt
+drop-hints.txt
+retain-gids.txt
+
+SUBSETS:
+U+9dd
+*
diff --git a/test/subset/data/tests/layout.gdef.tests b/test/subset/data/tests/layout.gdef.tests
new file mode 100644 (file)
index 0000000..def862f
--- /dev/null
@@ -0,0 +1,14 @@
+FONTS:
+Roboto-Regular.ttf
+
+PROFILES:
+default.txt
+drop-hints.txt
+keep-gdef-gpos.txt
+
+SUBSETS:
+Ḁ̃
+̣ 
+̃ 
+̉ ̏ 
+ABC
diff --git a/test/subset/data/tests/layout.gpos.tests b/test/subset/data/tests/layout.gpos.tests
new file mode 100644 (file)
index 0000000..a6d3b83
--- /dev/null
@@ -0,0 +1,14 @@
+FONTS:
+gpos1_2_font.otf
+
+PROFILES:
+layout-test.txt
+layout-test-retain-gids.txt
+
+SUBSETS:
+A
+AC
+CF
+AF
+BD
+*
diff --git a/test/subset/data/tests/layout.gpos2.tests b/test/subset/data/tests/layout.gpos2.tests
new file mode 100644 (file)
index 0000000..98c9c92
--- /dev/null
@@ -0,0 +1,14 @@
+FONTS:
+gpos2_1_font7.otf
+gpos2_2_font5.otf
+
+PROFILES:
+layout-test.txt
+layout-test-retain-gids.txt
+
+SUBSETS:
+!#
+!#%
+.#
+ABC
+*
diff --git a/test/subset/data/tests/layout.gpos3.tests b/test/subset/data/tests/layout.gpos3.tests
new file mode 100644 (file)
index 0000000..7a129df
--- /dev/null
@@ -0,0 +1,13 @@
+FONTS:
+gpos3_font3.otf
+
+PROFILES:
+layout-test.txt
+layout-test-retain-gids.txt
+
+SUBSETS:
+()
+(+
+)+
+ABC
+*
diff --git a/test/subset/data/tests/layout.gpos4.tests b/test/subset/data/tests/layout.gpos4.tests
new file mode 100644 (file)
index 0000000..307a877
--- /dev/null
@@ -0,0 +1,18 @@
+FONTS:
+gpos4_multiple_anchors_1.otf
+
+PROFILES:
+layout-test.txt
+layout-test-retain-gids.txt
+
+SUBSETS:
+A
+AB
+AC
+ABC
+ACE
+ABCE
+ACD
+ACDEF
+ABCD
+*
diff --git a/test/subset/data/tests/layout.gpos5.tests b/test/subset/data/tests/layout.gpos5.tests
new file mode 100644 (file)
index 0000000..490e34e
--- /dev/null
@@ -0,0 +1,18 @@
+FONTS:
+gpos5_font1.otf
+
+PROFILES:
+layout-test.txt
+layout-test-retain-gids.txt
+
+SUBSETS:
+A
+B
+AB
+AC
+ABC
+ABE
+ABCE
+ABD
+ABCD
+*
diff --git a/test/subset/data/tests/layout.gpos6.tests b/test/subset/data/tests/layout.gpos6.tests
new file mode 100644 (file)
index 0000000..27202d2
--- /dev/null
@@ -0,0 +1,18 @@
+FONTS:
+gpos6_font1.otf
+
+PROFILES:
+layout-test.txt
+layout-test-retain-gids.txt
+
+SUBSETS:
+A
+AB
+AC
+ABC
+ACE
+ABCE
+ACD
+ACDEF
+ABCD
+*
diff --git a/test/subset/data/tests/layout.gpos8.amiri.tests b/test/subset/data/tests/layout.gpos8.amiri.tests
new file mode 100644 (file)
index 0000000..183d8a9
--- /dev/null
@@ -0,0 +1,13 @@
+FONTS:
+Amiri-Regular.ttf
+
+PROFILES:
+default.txt
+retain-gids.txt
+
+SUBSETS:
+ال
+الأحلام.
+غير
+سماء لا
+الحب
diff --git a/test/subset/data/tests/layout.gpos8.tests b/test/subset/data/tests/layout.gpos8.tests
new file mode 100644 (file)
index 0000000..5ba9db0
--- /dev/null
@@ -0,0 +1,13 @@
+FONTS:
+gpos_chaining1_multiple_subrules_f1.otf
+gpos_chaining2_multiple_subrules_f1.otf
+gpos_chaining3_simple_f1.otf
+
+PROFILES:
+layout-test.txt
+layout-test-retain-gids.txt
+
+SUBSETS:
+0123
+ABC
+*
diff --git a/test/subset/data/tests/layout.gpos9.tests b/test/subset/data/tests/layout.gpos9.tests
new file mode 100644 (file)
index 0000000..e1fd928
--- /dev/null
@@ -0,0 +1,11 @@
+FONTS:
+gpos9_font2.otf
+
+PROFILES:
+layout-test.txt
+layout-test-retain-gids.txt
+
+SUBSETS:
+A
+B
+AB
diff --git a/test/subset/data/tests/layout.gsub3.tests b/test/subset/data/tests/layout.gsub3.tests
new file mode 100644 (file)
index 0000000..35d02fb
--- /dev/null
@@ -0,0 +1,12 @@
+FONTS:
+gsub_alternate_substitution.otf
+
+PROFILES:
+layout-test.txt
+layout-test-retain-gids.txt
+
+SUBSETS:
+厩
+叱
+厩叱
+*
diff --git a/test/subset/data/tests/layout.gsub5.tests b/test/subset/data/tests/layout.gsub5.tests
new file mode 100644 (file)
index 0000000..152a037
--- /dev/null
@@ -0,0 +1,15 @@
+FONTS:
+gsub_context1_multiple_subrules_f2.otf
+gsub_context2_multiple_subrules_f2.otf
+gsub_context3_successive_f1.otf
+
+PROFILES:
+layout-test.txt
+layout-test-retain-gids.txt
+
+SUBSETS:
+A
+AB
+AC
+ABC
+*
diff --git a/test/subset/data/tests/layout.gsub5_format2.tests b/test/subset/data/tests/layout.gsub5_format2.tests
new file mode 100644 (file)
index 0000000..8b3d68e
--- /dev/null
@@ -0,0 +1,10 @@
+FONTS:
+Molengo-Regular.ttf
+
+PROFILES:
+layout-test.txt
+layout-test-retain-gids.txt
+
+SUBSETS:
+U+268,U+301,U+302,U+324
+*
diff --git a/test/subset/data/tests/layout.gsub6.tests b/test/subset/data/tests/layout.gsub6.tests
new file mode 100644 (file)
index 0000000..755f71d
--- /dev/null
@@ -0,0 +1,13 @@
+FONTS:
+gsub_chaining1_multiple_subrules_f1.otf
+gsub_chaining2_multiple_subrules_f1.otf
+gsub_chaining3_simple_f2.otf
+
+PROFILES:
+layout-test.txt
+layout-test-retain-gids.txt
+
+SUBSETS:
+0123
+ABC
+*
diff --git a/test/subset/data/tests/layout.gsub8.tests b/test/subset/data/tests/layout.gsub8.tests
new file mode 100644 (file)
index 0000000..dc17be4
--- /dev/null
@@ -0,0 +1,17 @@
+FONTS:
+gsub8_manually_created.otf
+
+PROFILES:
+layout-test.txt
+layout-test-retain-gids.txt
+
+SUBSETS:
+a
+A
+ABC
+ABCDEF
+ABCDEFG
+ABCDEFGHI
+ABCDEFM
+ABCDEFQ
+*
diff --git a/test/subset/data/tests/layout.khmer.tests b/test/subset/data/tests/layout.khmer.tests
new file mode 100644 (file)
index 0000000..8c94482
--- /dev/null
@@ -0,0 +1,11 @@
+FONTS:
+Khmer.ttf
+
+PROFILES:
+default.txt
+retain-gids.txt
+
+SUBSETS:
+1
+ក
+ញុំបានមើ
diff --git a/test/subset/data/tests/layout.notonastaliqurdu.tests b/test/subset/data/tests/layout.notonastaliqurdu.tests
new file mode 100644 (file)
index 0000000..c298f54
--- /dev/null
@@ -0,0 +1,16 @@
+FONTS:
+NotoNastaliqUrdu-Bold.ttf
+NotoNastaliqUrdu-Regular.ttf
+
+PROFILES:
+default.txt
+retain-gids.txt
+
+SUBSETS:
+ال
+الأحلام.
+غير
+سماء لا
+الحب
+سے
+*
diff --git a/test/subset/data/tests/layout.tests b/test/subset/data/tests/layout.tests
new file mode 100644 (file)
index 0000000..20e6152
--- /dev/null
@@ -0,0 +1,13 @@
+FONTS:
+Roboto-Regular.smallcaps.ttf
+
+PROFILES:
+default.txt
+retain-gids.txt
+
+SUBSETS:
+ABC
+AC
+C
+A
+ÊË
diff --git a/test/subset/data/tests/layout.tinos.tests b/test/subset/data/tests/layout.tinos.tests
new file mode 100644 (file)
index 0000000..64a9dab
--- /dev/null
@@ -0,0 +1,12 @@
+FONTS:
+Tinos-Italic.ttf
+
+PROFILES:
+default.txt
+retain-gids.txt
+glyph-names.txt
+notdef-outline.txt
+
+SUBSETS:
+U+5bf,U+5f0,U+5f1,U+5f2,U+fb21,U+fb22,U+fb23,U+fb24,U+fb25,U+fb26,U+fb27,U+fb28
+*
diff --git a/test/subset/data/tests/layout.unsorted_featurelist.tests b/test/subset/data/tests/layout.unsorted_featurelist.tests
new file mode 100644 (file)
index 0000000..9c77a7a
--- /dev/null
@@ -0,0 +1,11 @@
+FONTS:
+NotoIKEAHebrewLatin-Regular.ttf
+
+PROFILES:
+layout-test.txt
+default.txt
+retain-gids.txt
+
+SUBSETS:
+U+392,U+3a7,U+3b2,U+3c7
+*
diff --git a/test/subset/data/tests/math.tests b/test/subset/data/tests/math.tests
new file mode 100644 (file)
index 0000000..91a2405
--- /dev/null
@@ -0,0 +1,12 @@
+FONTS:
+STIXTwoMath-Regular.ttf
+
+PROFILES:
+default.txt
+retain-gids.txt
+glyph-names.txt
+notdef-outline.txt
+
+SUBSETS:
+U+2f,U+7c,U+305
+*
diff --git a/test/subset/data/tests/math_coverage_offset.tests b/test/subset/data/tests/math_coverage_offset.tests
new file mode 100644 (file)
index 0000000..ac333b7
--- /dev/null
@@ -0,0 +1,12 @@
+FONTS:
+Caudex-Regular.ttf
+
+PROFILES:
+default.txt
+retain-gids.txt
+glyph-names.txt
+notdef-outline.txt
+keep-all-layout-features.txt
+
+SUBSETS:
+*
diff --git a/test/subset/data/tests/post.tests b/test/subset/data/tests/post.tests
new file mode 100644 (file)
index 0000000..d6c6a35
--- /dev/null
@@ -0,0 +1,12 @@
+FONTS:
+SreeKrushnadevaraya-Regular.ttf
+
+PROFILES:
+default.txt
+retain-gids.txt
+glyph-names.txt
+notdef-outline.txt
+
+SUBSETS:
+U+c30,U+c36,U+c40,U+c4d
+*
diff --git a/test/subset/data/tests/variable.tests b/test/subset/data/tests/variable.tests
new file mode 100644 (file)
index 0000000..bda5875
--- /dev/null
@@ -0,0 +1,9 @@
+FONTS:
+Fraunces.ttf
+
+PROFILES:
+default.txt
+
+SUBSETS:
+a
+&fiĤĥ
index a75b8f7..780144a 100644 (file)
@@ -4,32 +4,68 @@ tests = [
   'cff-full-font',
   'japanese',
   'cff-japanese',
+  'cff.notoserifmyanmar',
+  'glyf_bug_3131',
   'layout',
   'layout.gpos',
   'layout.gpos2',
   'layout.gpos3',
   'layout.gpos4',
+  'layout.gpos5',
   'layout.gpos6',
+  'layout.gpos8',
+  'layout.gpos8.amiri',
+  'layout.gpos9',
   'layout.gsub3',
+  'layout.gsub5',
+  'layout.gsub5_format2',
   'layout.gsub6',
+  'layout.gsub8',
   'layout.gdef',
+  'layout.gdef.glyphset',
+  'layout.khmer',
+  'layout.context',
+  'layout.context_format2',
+  'layout.gdef-varstore',
+  'layout.gdef-attachlist',
+  'layout.notonastaliqurdu',
+  'layout.tinos',
+  'layout.duplicate_features',
+  'layout.unsorted_featurelist',
+  'layout.drop_feature',
+  'layout.default_features',
   'cmap',
   'cmap14',
   'sbix',
   'colr',
+  'colr_glyphs',
+  'math',
+  'math_coverage_offset',
+# TODO: re-enable once colrv1 subsetting is stabilized.
+# 'colrv1.notoemoji',
+  'colrv1',
+  'colr_with_components',
   'cbdt',
+  'variable',
+  'glyph_names',
+  'post',
 ]
 
+repack_tests = [
+  'basic',
+  'prioritization',
+  'table_duplication',
+  'isolation',
+  'advanced_prioritization',
+  'space_splitting',
+]
+
+
 run_test = find_program('run-tests.py')
 
 foreach t : tests
   fname = '@0@.tests'.format(t)
 
-  # layout test are enabled only under experimental API flag for now
-  if t.contains('layout') and not get_option('experimental_api')
-    continue
-  endif
-
   test(t, run_test,
     args: [
       hb_subset,
@@ -39,6 +75,21 @@ foreach t : tests
     # ideally better to break and let meson handles them in parallel
     timeout: 500,
     workdir: meson.current_build_dir() / '..' / '..',
-    suite: ['subset'],
+    suite: 'subset',
+  )
+endforeach
+
+run_repack_test = find_program('run-repack-tests.py')
+
+foreach t : repack_tests
+  fname = '@0@.tests'.format(t)
+
+  test(t, run_repack_test,
+    args: [
+      hb_subset,
+      meson.current_source_dir() / 'data' / 'repack_tests' / fname,
+    ],
+    workdir: meson.current_build_dir() / '..' / '..',
+    suite: ['subset', 'repack'],
   )
 endforeach
diff --git a/test/subset/repack_test.py b/test/subset/repack_test.py
new file mode 100644 (file)
index 0000000..2b53dd3
--- /dev/null
@@ -0,0 +1,36 @@
+#!/usr/bin/env python3
+
+import os
+
+# Parses a single repacking test file. The first line of the file is
+# the name of the font to use and the remaining lines define the set of
+# codepoints in the subset.
+class RepackTest:
+
+       def __init__(self, test_path, definition):
+               self.test_path = test_path
+               self.font_name = None
+               self.codepoints = set ()
+               self._parse(definition)
+
+       def font_path(self):
+               return os.path.join (self._base_path (), "fonts", self.font_name)
+
+       def codepoints_string (self):
+               return ",".join (self.codepoints)
+
+       def _base_path(self):
+               return os.path.join(
+                   os.path.dirname(self.test_path),
+                   "../")
+
+
+       def _parse(self, definition):
+               lines = definition.splitlines ()
+               self.font_name = lines.pop (0)
+               for line in lines:
+                       line = line.strip()
+                       if not line:
+                               continue
+
+                       self.codepoints.add (line)
diff --git a/test/subset/run-repack-tests.py b/test/subset/run-repack-tests.py
new file mode 100755 (executable)
index 0000000..9c25b2b
--- /dev/null
@@ -0,0 +1,115 @@
+#!/usr/bin/env python3
+
+# Runs a subsetting test suite. Compares the results of subsetting via harfbuzz
+# to subsetting via fonttools.
+
+from difflib import unified_diff
+import os
+import re
+import subprocess
+import sys
+import tempfile
+import shutil
+import io
+
+from repack_test import RepackTest
+
+try:
+       from fontTools.ttLib import TTFont
+except ImportError:
+       print ("fonttools is not present, skipping test.")
+       sys.exit (77)
+
+ots_sanitize = shutil.which ("ots-sanitize")
+
+def subset_cmd (command):
+       global hb_subset, process
+       print (hb_subset + ' ' + " ".join(command))
+       process.stdin.write ((';'.join (command) + '\n').encode ("utf-8"))
+       process.stdin.flush ()
+       return process.stdout.readline().decode ("utf-8").strip ()
+
+def cmd (command):
+       p = subprocess.Popen (
+               command, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
+               universal_newlines=True)
+       (stdoutdata, stderrdata) = p.communicate ()
+       print (stderrdata, end="", file=sys.stderr)
+       return stdoutdata, p.returncode
+
+def fail_test (test, cli_args, message):
+       print ('ERROR: %s' % message)
+       print ('Test State:')
+       print ('  test.font_name    %s' % test.font_name)
+       print ('  test.test_path %s' % os.path.abspath (test.test_path))
+       return 1
+
+def run_test (test, should_check_ots):
+       out_file = os.path.join (tempfile.mkdtemp (), test.font_name + '-subset.ttf')
+       cli_args = ["--font-file=" + test.font_path (),
+                   "--output-file=" + out_file,
+                   "--unicodes=%s" % test.codepoints_string (),
+                   "--drop-tables-=GPOS,GSUB,GDEF",]
+       print (' '.join (cli_args))
+       ret = subset_cmd (cli_args)
+
+       if ret != "success":
+               return fail_test (test, cli_args, "%s failed" % ' '.join (cli_args))
+
+       try:
+               with TTFont (out_file) as font:
+                       pass
+       except Exception as e:
+               print (e)
+               return fail_test (test, cli_args, "ttx failed to parse the result")
+
+       if should_check_ots:
+               print ("Checking output with ots-sanitize.")
+               if not check_ots (out_file):
+                       return fail_test (test, cli_args, 'ots for subsetted file fails.')
+
+       return 0
+
+def has_ots ():
+       if not ots_sanitize:
+               print ("OTS is not present, skipping all ots checks.")
+               return False
+       return True
+
+def check_ots (path):
+       ots_report, returncode = cmd ([ots_sanitize, path])
+       if returncode:
+               print ("OTS Failure: %s" % ots_report)
+               return False
+       return True
+
+args = sys.argv[1:]
+if not args or sys.argv[1].find ('hb-subset') == -1 or not os.path.exists (sys.argv[1]):
+       sys.exit ("First argument does not seem to point to usable hb-subset.")
+hb_subset, args = args[0], args[1:]
+
+if len (args) != 1:
+       sys.exit ("No tests supplied.")
+
+has_ots = has_ots()
+
+process = subprocess.Popen ([hb_subset, '--batch'],
+                            stdin=subprocess.PIPE,
+                            stdout=subprocess.PIPE,
+                            stderr=sys.stdout)
+
+fails = 0
+
+path = args[0]
+if not path.endswith(".tests"):
+        sys.exit ("Not a valid test case path.")
+
+with open (path, mode="r", encoding="utf-8") as f:
+       # TODO(garretrieger): re-enable OTS checking.
+       fails += run_test (RepackTest (path, f.read ()), False)
+
+
+if fails != 0:
+       sys.exit ("%d test(s) failed." % fails)
+else:
+       print ("All tests passed.")
index f32a4fa..75f8738 100755 (executable)
@@ -10,15 +10,23 @@ import subprocess
 import sys
 import tempfile
 import shutil
+import io
 
 from subset_test_suite import SubsetTestSuite
 
-fonttools = shutil.which ("fonttools")
+try:
+       from fontTools.ttLib import TTFont
+except ImportError:
+    TTFont = None
+
 ots_sanitize = shutil.which ("ots-sanitize")
 
-if not fonttools:
-       print ("fonttools is not present, skipping test.")
-       sys.exit (77)
+def subset_cmd (command):
+       global hb_subset, process
+       print (hb_subset + ' ' + " ".join(command))
+       process.stdin.write ((';'.join (command) + '\n').encode ("utf-8"))
+       process.stdin.flush ()
+       return process.stdout.readline().decode ("utf-8").strip ()
 
 def cmd (command):
        p = subprocess.Popen (
@@ -28,92 +36,78 @@ def cmd (command):
        print (stderrdata, end="", file=sys.stderr)
        return stdoutdata, p.returncode
 
-def read_binary (file_path):
-       with open (file_path, 'rb') as f:
-               return f.read ()
-
 def fail_test (test, cli_args, message):
        print ('ERROR: %s' % message)
        print ('Test State:')
        print ('  test.font_path    %s' % os.path.abspath (test.font_path))
        print ('  test.profile_path %s' % os.path.abspath (test.profile_path))
        print ('  test.unicodes     %s' % test.unicodes ())
-       expected_file = os.path.join(test_suite.get_output_directory (),
-                                    test.get_font_name ())
+       expected_file = os.path.join (test_suite.get_output_directory (),
+                                     test.get_font_name ())
        print ('  expected_file     %s' % os.path.abspath (expected_file))
        return 1
 
 def run_test (test, should_check_ots):
        out_file = os.path.join (tempfile.mkdtemp (), test.get_font_name () + '-subset' + test.get_font_extension ())
-       cli_args = [hb_subset,
-                   "--font-file=" + test.font_path,
+       cli_args = ["--font-file=" + test.font_path,
                    "--output-file=" + out_file,
                    "--unicodes=%s" % test.unicodes (),
-                   "--drop-tables+=DSIG,GPOS,GSUB,GDEF",
-                    "--drop-tables-=sbix"]
+                   "--drop-tables+=DSIG",
+                   "--drop-tables-=sbix"]
        cli_args.extend (test.get_profile_flags ())
-       print (' '.join (cli_args))
-       _, return_code = cmd (cli_args)
-
-       if return_code:
-               return fail_test (test, cli_args, "%s returned %d" % (' '.join (cli_args), return_code))
-
-       expected_ttx = tempfile.mktemp ()
-       _, return_code = run_ttx (os.path.join (test_suite.get_output_directory (),
-                                                                               test.get_font_name ()),
-                                                         expected_ttx)
-       if return_code:
-               if os.path.exists (expected_ttx): os.remove (expected_ttx)
-               return fail_test (test, cli_args, "ttx (expected) returned %d" % (return_code))
-
-       actual_ttx = tempfile.mktemp ()
-       _, return_code = run_ttx (out_file, actual_ttx)
-       if return_code:
-               if os.path.exists (expected_ttx): os.remove (expected_ttx)
-               if os.path.exists (actual_ttx): os.remove (actual_ttx)
-               return fail_test (test, cli_args, "ttx (actual) returned %d" % (return_code))
-
-       with open (expected_ttx, encoding='utf-8') as f:
-               expected_ttx_text = f.read ()
-       with open (actual_ttx, encoding='utf-8') as f:
-               actual_ttx_text = f.read ()
-
-       # cleanup
-       try:
-               os.remove (expected_ttx)
-               os.remove (actual_ttx)
-       except:
-               pass
-
-       print ("stripping checksums.")
-       expected_ttx_text = strip_check_sum (expected_ttx_text)
-       actual_ttx_text = strip_check_sum (actual_ttx_text)
-
-       if not actual_ttx_text == expected_ttx_text:
-               for line in unified_diff (expected_ttx_text.splitlines (1), actual_ttx_text.splitlines (1)):
+       ret = subset_cmd (cli_args)
+
+       if ret != "success":
+               return fail_test (test, cli_args, "%s failed" % ' '.join (cli_args))
+
+       expected_file = os.path.join (test_suite.get_output_directory (), test.get_font_name ())
+       with open (expected_file, "rb") as fp:
+               expected_contents = fp.read()
+       with open (out_file, "rb") as fp:
+               actual_contents = fp.read()
+
+       if expected_contents == actual_contents:
+               if should_check_ots:
+                       print ("Checking output with ots-sanitize.")
+                       if not check_ots (out_file):
+                               return fail_test (test, cli_args, 'ots for subsetted file fails.')
+               return 0
+
+       if TTFont is None:
+               print ("fonttools is not present, skipping TTX diff.")
+               return fail_test (test, cli_args, "hash for expected and actual does not match.")
+
+       with io.StringIO () as fp:
+               try:
+                       with TTFont (expected_file) as font:
+                               font.saveXML (fp)
+               except Exception as e:
+                       print (e)
+                       return fail_test (test, cli_args, "ttx failed to parse the expected result")
+               expected_ttx = fp.getvalue ()
+
+       with io.StringIO () as fp:
+               try:
+                       with TTFont (out_file) as font:
+                               font.saveXML (fp)
+               except Exception as e:
+                       print (e)
+                       return fail_test (test, cli_args, "ttx failed to parse the actual result")
+               actual_ttx = fp.getvalue ()
+
+       if actual_ttx != expected_ttx:
+               for line in unified_diff (expected_ttx.splitlines (1), actual_ttx.splitlines (1)):
                        sys.stdout.write (line)
                sys.stdout.flush ()
                return fail_test (test, cli_args, 'ttx for expected and actual does not match.')
 
-       if should_check_ots:
-               print ("Checking output with ots-sanitize.")
-               if not check_ots (out_file):
-                       return fail_test (test, cli_args, 'ots for subsetted file fails.')
-
-       return 0
+       return fail_test (test, cli_args, 'hash for expected and actual does not match, '
+                                         'but the ttx matches. Expected file needs to be updated?')
 
-def run_ttx (font_path, ttx_output_path):
-       print ("fonttools ttx %s" % font_path)
-       return cmd ([fonttools, "ttx", "-q", "-o", ttx_output_path, font_path])
-
-def strip_check_sum (ttx_string):
-       return re.sub ('checkSumAdjustment value=["]0x([0-9a-fA-F])+["]',
-                      'checkSumAdjustment value="0x00000000"',
-                      ttx_string, count=1)
 
 def has_ots ():
        if not ots_sanitize:
-               print("OTS is not present, skipping all ots checks.")
+               print ("OTS is not present, skipping all ots checks.")
                return False
        return True
 
@@ -134,6 +128,11 @@ if not len (args):
 
 has_ots = has_ots()
 
+process = subprocess.Popen ([hb_subset, '--batch'],
+                            stdin=subprocess.PIPE,
+                            stdout=subprocess.PIPE,
+                            stderr=sys.stdout)
+
 fails = 0
 for path in args:
        with open (path, mode="r", encoding="utf-8") as f:
index b7fd105..a58d017 100644 (file)
@@ -11,8 +11,12 @@ class Test:
                self.subset = subset
 
        def unicodes(self):
+               import re
                if self.subset == '*':
                        return self.subset[0]
+               elif re.match("^U\+", self.subset):
+                       s = re.sub (r"U\+", "", self.subset)
+                       return s
                else:
                        return ",".join("%X" % ord(c) for (i, c) in enumerate(self.subset))
 
index 29f6909..cabb9ef 100644 (file)
@@ -25,6 +25,7 @@ AM_CPPFLAGS = \
        $(GLIB_CFLAGS) \
        $(FREETYPE_CFLAGS) \
        $(CAIRO_FT_CFLAGS) \
+       $(CHAFA_CFLAGS) \
        $(NULL)
 LDADD = \
        $(top_builddir)/src/libharfbuzz.la \
@@ -42,6 +43,7 @@ hb_view_LDADD = \
        $(LDADD) \
        $(CAIRO_LIBS) \
        $(CAIRO_FT_LIBS) \
+       $(CHAFA_LIBS) \
        $(NULL)
 bin_PROGRAMS += hb-view
 endif # HAVE_CAIRO_FT
index fae6cf2..8983736 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.16.2 from Makefile.am.
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2020 Free Software Foundation, Inc.
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -114,11 +114,11 @@ CONFIG_CLEAN_VPATH_FILES =
 @HAVE_GLIB_TRUE@       hb-ot-shape-closure$(EXEEXT)
 am__installdirs = "$(DESTDIR)$(bindir)"
 PROGRAMS = $(bin_PROGRAMS)
-am__hb_ot_shape_closure_SOURCES_DIST = hb-ot-shape-closure.cc \
-       options.cc options.hh main-font-text.hh
+am__hb_ot_shape_closure_SOURCES_DIST = face-options.hh font-options.hh \
+       hb-ot-shape-closure.cc main-font-text.hh options.hh \
+       text-options.hh
 am__objects_1 =
-am__objects_2 = hb-ot-shape-closure.$(OBJEXT) options.$(OBJEXT) \
-       $(am__objects_1)
+am__objects_2 = hb-ot-shape-closure.$(OBJEXT) $(am__objects_1)
 @HAVE_GLIB_TRUE@am_hb_ot_shape_closure_OBJECTS = $(am__objects_2)
 hb_ot_shape_closure_OBJECTS = $(am_hb_ot_shape_closure_OBJECTS)
 hb_ot_shape_closure_LDADD = $(LDADD)
@@ -130,19 +130,20 @@ AM_V_lt = $(am__v_lt_@AM_V@)
 am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
 am__v_lt_0 = --silent
 am__v_lt_1 = 
-am__hb_shape_SOURCES_DIST = hb-shape.cc options.cc options.hh \
-       main-font-text.hh shape-consumer.hh
-am__objects_3 = hb-shape.$(OBJEXT) options.$(OBJEXT) $(am__objects_1)
+am__hb_shape_SOURCES_DIST = batch.hh face-options.hh font-options.hh \
+       hb-shape.cc main-font-text.hh options.hh output-options.hh \
+       shape-consumer.hh shape-format.hh shape-options.hh \
+       text-options.hh
+am__objects_3 = hb-shape.$(OBJEXT) $(am__objects_1)
 @HAVE_GLIB_TRUE@am_hb_shape_OBJECTS = $(am__objects_3)
 hb_shape_OBJECTS = $(am_hb_shape_OBJECTS)
 hb_shape_LDADD = $(LDADD)
 hb_shape_DEPENDENCIES = $(top_builddir)/src/libharfbuzz.la \
        $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
        $(am__DEPENDENCIES_1)
-am__hb_subset_SOURCES_DIST = hb-subset.cc options.cc options-subset.cc \
-       options.hh main-font-text.hh
-am__objects_4 = hb-subset.$(OBJEXT) options.$(OBJEXT) \
-       options-subset.$(OBJEXT) $(am__objects_1)
+am__hb_subset_SOURCES_DIST = batch.hh face-options.hh hb-subset.cc \
+       main-font-text.hh options.hh output-options.hh text-options.hh
+am__objects_4 = hb-subset.$(OBJEXT) $(am__objects_1)
 @HAVE_GLIB_TRUE@am_hb_subset_OBJECTS = $(am__objects_4)
 hb_subset_OBJECTS = $(am_hb_subset_OBJECTS)
 am__DEPENDENCIES_2 = $(top_builddir)/src/libharfbuzz.la \
@@ -151,20 +152,18 @@ am__DEPENDENCIES_2 = $(top_builddir)/src/libharfbuzz.la \
 @HAVE_GLIB_TRUE@hb_subset_DEPENDENCIES =  \
 @HAVE_GLIB_TRUE@       $(top_builddir)/src/libharfbuzz-subset.la \
 @HAVE_GLIB_TRUE@       $(am__DEPENDENCIES_2)
-am__hb_view_SOURCES_DIST = hb-view.cc options.cc options.hh \
-       main-font-text.hh shape-consumer.hh ansi-print.cc \
-       ansi-print.hh helper-cairo.cc helper-cairo.hh \
-       helper-cairo-ansi.cc helper-cairo-ansi.hh view-cairo.cc \
-       view-cairo.hh
-am__objects_5 = hb-view.$(OBJEXT) options.$(OBJEXT) \
-       ansi-print.$(OBJEXT) helper-cairo.$(OBJEXT) \
-       helper-cairo-ansi.$(OBJEXT) view-cairo.$(OBJEXT) \
-       $(am__objects_1)
+am__hb_view_SOURCES_DIST = ansi-print.hh face-options.hh \
+       font-options.hh hb-view.cc helper-cairo-ansi.hh \
+       helper-cairo.hh main-font-text.hh options.hh output-options.hh \
+       shape-consumer.hh shape-options.hh text-options.hh \
+       view-cairo.hh view-options.hh
+am__objects_5 = hb-view.$(OBJEXT) $(am__objects_1)
 @HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@am_hb_view_OBJECTS = $(am__objects_5)
 hb_view_OBJECTS = $(am_hb_view_OBJECTS)
 @HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@hb_view_DEPENDENCIES = $(am__DEPENDENCIES_2) \
 @HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@       $(am__DEPENDENCIES_1) \
 @HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@       $(am__DEPENDENCIES_1) \
+@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@       $(am__DEPENDENCIES_1) \
 @HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@       $(am__DEPENDENCIES_1)
 AM_V_P = $(am__v_P_@AM_V@)
 am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
@@ -181,12 +180,9 @@ am__v_at_1 =
 DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
 depcomp = $(SHELL) $(top_srcdir)/depcomp
 am__maybe_remake_depfiles = depfiles
-am__depfiles_remade = ./$(DEPDIR)/ansi-print.Po \
-       ./$(DEPDIR)/hb-ot-shape-closure.Po ./$(DEPDIR)/hb-shape.Po \
-       ./$(DEPDIR)/hb-subset.Po ./$(DEPDIR)/hb-view.Po \
-       ./$(DEPDIR)/helper-cairo-ansi.Po ./$(DEPDIR)/helper-cairo.Po \
-       ./$(DEPDIR)/options-subset.Po ./$(DEPDIR)/options.Po \
-       ./$(DEPDIR)/view-cairo.Po
+am__depfiles_remade = ./$(DEPDIR)/hb-ot-shape-closure.Po \
+       ./$(DEPDIR)/hb-shape.Po ./$(DEPDIR)/hb-subset.Po \
+       ./$(DEPDIR)/hb-view.Po
 am__mv = mv -f
 CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
        $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
@@ -271,6 +267,8 @@ CAIRO_LIBS = @CAIRO_LIBS@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
+CHAFA_CFLAGS = @CHAFA_CFLAGS@
+CHAFA_LIBS = @CHAFA_LIBS@
 CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
 CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
 CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
@@ -299,8 +297,6 @@ ECHO_T = @ECHO_T@
 EGREP = @EGREP@
 EXEEXT = @EXEEXT@
 FGREP = @FGREP@
-FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@
-FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
 FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
 FREETYPE_DEPS = @FREETYPE_DEPS@
 FREETYPE_LIBS = @FREETYPE_LIBS@
@@ -333,7 +329,6 @@ HB_VERSION_MICRO = @HB_VERSION_MICRO@
 HB_VERSION_MINOR = @HB_VERSION_MINOR@
 HTML_DIR = @HTML_DIR@
 ICU_CFLAGS = @ICU_CFLAGS@
-ICU_CONFIG = @ICU_CONFIG@
 ICU_LIBS = @ICU_LIBS@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
@@ -439,6 +434,7 @@ pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -453,42 +449,53 @@ CLEANFILES =
 DISTCLEANFILES = 
 MAINTAINERCLEANFILES = 
 HB_VIEW_sources = \
+       ansi-print.hh \
+       face-options.hh \
+       font-options.hh \
        hb-view.cc \
-       options.cc \
-       options.hh \
+       helper-cairo-ansi.hh \
+       helper-cairo.hh \
        main-font-text.hh \
+       options.hh \
+       output-options.hh \
        shape-consumer.hh \
-       ansi-print.cc \
-       ansi-print.hh \
-       helper-cairo.cc \
-       helper-cairo.hh \
-       helper-cairo-ansi.cc \
-       helper-cairo-ansi.hh \
-       view-cairo.cc \
+       shape-options.hh \
+       text-options.hh \
        view-cairo.hh \
+       view-options.hh \
        $(NULL)
 
 HB_SHAPE_sources = \
+       batch.hh \
+       face-options.hh \
+       font-options.hh \
        hb-shape.cc \
-       options.cc \
-       options.hh \
        main-font-text.hh \
-       shape-consumer.hh \
-       $(NULL)
-
-HB_OT_SHAPE_CLOSURE_sources = \
-       hb-ot-shape-closure.cc \
-       options.cc \
        options.hh \
-       main-font-text.hh \
+       output-options.hh \
+       shape-consumer.hh \
+       shape-format.hh \
+       shape-options.hh \
+       text-options.hh \
        $(NULL)
 
 HB_SUBSET_CLI_sources = \
+       batch.hh \
+       face-options.hh \
        hb-subset.cc \
-       options.cc \
-       options-subset.cc \
+       main-font-text.hh \
        options.hh \
+       output-options.hh \
+       text-options.hh \
+       $(NULL)
+
+HB_OT_SHAPE_CLOSURE_sources = \
+       face-options.hh \
+       font-options.hh \
+       hb-ot-shape-closure.cc \
        main-font-text.hh \
+       options.hh \
+       text-options.hh \
        $(NULL)
 
 AM_CPPFLAGS = \
@@ -498,6 +505,7 @@ AM_CPPFLAGS = \
        $(GLIB_CFLAGS) \
        $(FREETYPE_CFLAGS) \
        $(CAIRO_FT_CFLAGS) \
+       $(CHAFA_CFLAGS) \
        $(NULL)
 
 LDADD = \
@@ -512,6 +520,7 @@ LDADD = \
 @HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@       $(LDADD) \
 @HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@       $(CAIRO_LIBS) \
 @HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@       $(CAIRO_FT_LIBS) \
+@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@       $(CHAFA_LIBS) \
 @HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@       $(NULL)
 
 @HAVE_GLIB_TRUE@hb_shape_SOURCES = $(HB_SHAPE_sources)
@@ -643,16 +652,10 @@ mostlyclean-compile:
 distclean-compile:
        -rm -f *.tab.c
 
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ansi-print.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hb-ot-shape-closure.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hb-shape.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hb-subset.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hb-view.Po@am__quote@ # am--include-marker
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/helper-cairo-ansi.Po@am__quote@ # am--include-marker
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/helper-cairo.Po@am__quote@ # am--include-marker
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/options-subset.Po@am__quote@ # am--include-marker
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/options.Po@am__quote@ # am--include-marker
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/view-cairo.Po@am__quote@ # am--include-marker
 
 $(am__depfiles_remade):
        @$(MKDIR_P) $(@D)
@@ -817,16 +820,10 @@ clean: clean-am
 clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am
 
 distclean: distclean-am
-               -rm -f ./$(DEPDIR)/ansi-print.Po
-       -rm -f ./$(DEPDIR)/hb-ot-shape-closure.Po
+               -rm -f ./$(DEPDIR)/hb-ot-shape-closure.Po
        -rm -f ./$(DEPDIR)/hb-shape.Po
        -rm -f ./$(DEPDIR)/hb-subset.Po
        -rm -f ./$(DEPDIR)/hb-view.Po
-       -rm -f ./$(DEPDIR)/helper-cairo-ansi.Po
-       -rm -f ./$(DEPDIR)/helper-cairo.Po
-       -rm -f ./$(DEPDIR)/options-subset.Po
-       -rm -f ./$(DEPDIR)/options.Po
-       -rm -f ./$(DEPDIR)/view-cairo.Po
        -rm -f Makefile
 distclean-am: clean-am distclean-compile distclean-generic \
        distclean-tags
@@ -872,16 +869,10 @@ install-ps-am:
 installcheck-am: installcheck-binPROGRAMS
 
 maintainer-clean: maintainer-clean-am
-               -rm -f ./$(DEPDIR)/ansi-print.Po
-       -rm -f ./$(DEPDIR)/hb-ot-shape-closure.Po
+               -rm -f ./$(DEPDIR)/hb-ot-shape-closure.Po
        -rm -f ./$(DEPDIR)/hb-shape.Po
        -rm -f ./$(DEPDIR)/hb-subset.Po
        -rm -f ./$(DEPDIR)/hb-view.Po
-       -rm -f ./$(DEPDIR)/helper-cairo-ansi.Po
-       -rm -f ./$(DEPDIR)/helper-cairo.Po
-       -rm -f ./$(DEPDIR)/options-subset.Po
-       -rm -f ./$(DEPDIR)/options.Po
-       -rm -f ./$(DEPDIR)/view-cairo.Po
        -rm -f Makefile
 maintainer-clean-am: distclean-am maintainer-clean-generic
 
index bcf85f5..df3ad4a 100644 (file)
@@ -1,38 +1,49 @@
 HB_VIEW_sources = \
+       ansi-print.hh \
+       face-options.hh \
+       font-options.hh \
        hb-view.cc \
-       options.cc \
-       options.hh \
+       helper-cairo-ansi.hh \
+       helper-cairo.hh \
        main-font-text.hh \
+       options.hh \
+       output-options.hh \
        shape-consumer.hh \
-       ansi-print.cc \
-       ansi-print.hh \
-       helper-cairo.cc \
-       helper-cairo.hh \
-       helper-cairo-ansi.cc \
-       helper-cairo-ansi.hh \
-       view-cairo.cc \
+       shape-options.hh \
+       text-options.hh \
        view-cairo.hh \
+       view-options.hh \
        $(NULL)
 
 HB_SHAPE_sources = \
+       batch.hh \
+       face-options.hh \
+       font-options.hh \
        hb-shape.cc \
-       options.cc \
-       options.hh \
        main-font-text.hh \
-       shape-consumer.hh \
-       $(NULL)
-
-HB_OT_SHAPE_CLOSURE_sources = \
-       hb-ot-shape-closure.cc \
-       options.cc \
        options.hh \
-       main-font-text.hh \
+       output-options.hh \
+       shape-consumer.hh \
+       shape-format.hh \
+       shape-options.hh \
+       text-options.hh \
        $(NULL)
 
 HB_SUBSET_CLI_sources = \
+       batch.hh \
+       face-options.hh \
        hb-subset.cc \
-       options.cc \
-       options-subset.cc \
+       main-font-text.hh \
        options.hh \
+       output-options.hh \
+       text-options.hh \
+       $(NULL)
+
+HB_OT_SHAPE_CLOSURE_sources = \
+       face-options.hh \
+       font-options.hh \
+       hb-ot-shape-closure.cc \
        main-font-text.hh \
+       options.hh \
+       text-options.hh \
        $(NULL)
diff --git a/util/ansi-print.cc b/util/ansi-print.cc
deleted file mode 100644 (file)
index 80b3704..0000000
+++ /dev/null
@@ -1,427 +0,0 @@
-/*
- * Copyright © 2012  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
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "ansi-print.hh"
-
-#include <assert.h>
-#include <stdlib.h>
-#include <stddef.h>
-#include <string.h>
-#include <stdio.h>
-#include <math.h>
-#include <fcntl.h>
-#ifdef HAVE_UNISTD_H
-#include <unistd.h> /* for isatty() */
-#endif
-
-#if defined (_MSC_VER) && (_MSC_VER < 1800)
-static inline long int
-lround (double x)
-{
-  if (x >= 0)
-    return floor (x + 0.5);
-  else
-    return ceil (x - 0.5);
-}
-#endif
-
-#define ESC_E (char)27
-
-#define MIN(a,b) ((a) < (b) ? (a) : (b))
-
-#define CELL_W 8
-#define CELL_H (2 * CELL_W)
-
-struct color_diff_t
-{
-  int dot (const color_diff_t &o)
-  { return v[0]*o.v[0] + v[1]*o.v[1] + v[2]*o.v[2] + v[3]*o.v[3]; }
-
-  int v[4];
-};
-
-struct color_t
-{
-  static color_t from_ansi (unsigned int x)
-  {
-    color_t c = {(0xFFu<<24) | ((0xFFu*(x&1))<<16) | ((0xFFu*((x >> 1)&1))<<8) | (0xFFu*((x >> 2)&1))};
-    return c;
-  }
-  unsigned int to_ansi ()
-  {
-    return ((v >> 23) & 1) | ((v >> 14)&2) | ((v >> 5)&4);
-  }
-
-  color_diff_t diff (const color_t &o)
-  {
-    color_diff_t d;
-    for (unsigned int i = 0; i < 4; i++)
-      d.v[i] = (int) ((v >> (i*8))&0xFF) - (int) ((o.v >> (i*8))&0xFF);
-    return d;
-  }
-
-  uint32_t v;
-};
-
-struct image_t
-{
-  public:
-
-  image_t (unsigned int width_,
-          unsigned int height_,
-          const uint32_t *data_,
-          unsigned int stride_) :
-               width (width_),
-               height (height_),
-               own_data (false),
-               data ((color_t *) data_),
-               stride (stride_) {}
-  image_t (unsigned int width_,
-          unsigned int height_) :
-               width (width_),
-               height (height_),
-               own_data (true),
-               data ((color_t *) malloc (sizeof (data[0]) * width * height)),
-               stride (width) {}
-  ~image_t ()
-  { if (own_data) free (data); }
-
-  color_t &operator () (unsigned int x, unsigned int y)
-  { return data[x + y * stride]; }
-
-  color_t operator () (unsigned int x, unsigned int y) const
-  { return data[x + y * stride]; }
-
-  void
-  copy_sub_image (const image_t &s,
-                 unsigned int x, unsigned int y,
-                 unsigned int w, unsigned int h)
-  {
-    assert (x < width);
-    assert (y < height);
-    for (unsigned int row = 0; row < h; row++) {
-      color_t *p = data + x + MIN (y + row, height - 1) * stride;
-      color_t *q = s.data + row * s.stride;
-      if (x + w <= width)
-       for (unsigned int col = 0; col < w; col++)
-         *q++ = *p++;
-      else {
-       unsigned int limit = width - x;
-       for (unsigned int col = 0; col < limit; col++)
-         *q++ = *p++;
-       p--;
-       for (unsigned int col = limit; col < w; col++)
-         *q++ = *p;
-      }
-    }
-  }
-
-  const unsigned int width;
-  const unsigned int height;
-
-  private:
-  bool own_data;
-  color_t * const data;
-  const unsigned int stride;
-};
-
-struct biimage_t
-{
-  public:
-
-  biimage_t (unsigned int width, unsigned int height) :
-               width (width),
-               height (height),
-               bg (0), fg (0), unicolor (true),
-               data ((uint8_t *) malloc (sizeof (data[0]) * width * height)) {}
-  ~biimage_t ()
-  { free (data); }
-
-  void set (const image_t &image)
-  {
-    assert (image.width == width);
-    assert (image.height == height);
-    int freq[8] = {0};
-    for (unsigned int y = 0; y < height; y++)
-      for (unsigned int x = 0; x < width; x++) {
-       color_t c = image (x, y);
-       freq[c.to_ansi ()]++;
-      }
-    bg = 0;
-    for (unsigned int i = 1; i < 8; i++)
-      if (freq[bg] < freq[i])
-       bg = i;
-    fg = 0;
-    for (unsigned int i = 1; i < 8; i++)
-      if (i != bg && freq[fg] < freq[i])
-       fg = i;
-    if (fg == bg || freq[fg] == 0) {
-      fg = bg;
-      unicolor = true;
-    }
-    else
-      unicolor = false;
-
-    /* Set the data... */
-
-    if (unicolor) {
-      memset (data, 0, sizeof (data[0]) * width * height);
-      return;
-    }
-
-    color_t bgc = color_t::from_ansi (bg);
-    color_t fgc = color_t::from_ansi (fg);
-    color_diff_t diff = fgc.diff (bgc);
-    int dd = diff.dot (diff);
-    for (unsigned int y = 0; y < height; y++)
-      for (unsigned int x = 0; x < width; x++) {
-       int d = diff.dot (image (x, y).diff (bgc));
-       (*this)(x, y) = d < 0 ? 0 : d > dd ? 255 : lround (d * 255. / dd);
-      }
-  }
-
-  uint8_t &operator () (unsigned int x, unsigned int y)
-  { return data[x + y * width]; }
-
-  uint8_t operator () (unsigned int x, unsigned int y) const
-  { return data[x + y * width]; }
-
-  const unsigned int width;
-  const unsigned int height;
-  unsigned int bg;
-  unsigned int fg;
-  bool unicolor;
-
-  private:
-  uint8_t * const data;
-};
-
-static const char *
-block_best (const biimage_t &bi, bool *inverse)
-{
-  assert (bi.width  <= CELL_W);
-  assert (bi.height <= CELL_H);
-
-  unsigned int score = UINT_MAX;
-  unsigned int row_sum[CELL_H] = {0};
-  unsigned int col_sum[CELL_W] = {0};
-  unsigned int row_sum_i[CELL_H] = {0};
-  unsigned int col_sum_i[CELL_W] = {0};
-  unsigned int quad[2][2] = {{0}};
-  unsigned int quad_i[2][2] = {{0}};
-  unsigned int total = 0;
-  unsigned int total_i = 0;
-  for (unsigned int y = 0; y < bi.height; y++)
-    for (unsigned int x = 0; x < bi.width; x++) {
-      unsigned int c = bi (x, y);
-      unsigned int c_i = 255 - c;
-      row_sum[y] += c;
-      row_sum_i[y] += c_i;
-      col_sum[x] += c;
-      col_sum_i[x] += c_i;
-      quad[2 * y / bi.height][2 * x / bi.width] += c;
-      quad_i[2 * y / bi.height][2 * x / bi.width] += c_i;
-      total += c;
-      total_i += c_i;
-    }
-
-  /* Make the sums cummulative */
-  for (unsigned int i = 1; i < bi.height; i++) {
-    row_sum[i] += row_sum[i - 1];
-    row_sum_i[i] += row_sum_i[i - 1];
-  }
-  for (unsigned int i = 1; i < bi.width;  i++) {
-    col_sum[i] += col_sum[i - 1];
-    col_sum_i[i] += col_sum_i[i - 1];
-  }
-
-  const char *best_c = " ";
-
-  /* Maybe empty is better! */
-  if (total < score) {
-    score = total;
-    *inverse = false;
-    best_c = " ";
-  }
-  /* Maybe full is better! */
-  if (total_i < score) {
-    score = total_i;
-    *inverse = true;
-    best_c = " ";
-  }
-
-  /* Find best lower line */
-  if (1) {
-    unsigned int best_s = UINT_MAX;
-    bool best_inv = false;
-    int best_i = 0;
-    for (unsigned int i = 0; i < bi.height - 1; i++)
-    {
-      unsigned int s;
-      s = row_sum[i] + total_i - row_sum_i[i];
-      if (s < best_s) {
-       best_s = s;
-       best_i = i;
-       best_inv = false;
-      }
-      s = row_sum_i[i] + total - row_sum[i];
-      if (s < best_s) {
-       best_s = s;
-       best_i = i;
-       best_inv = true;
-      }
-    }
-    if (best_s < score) {
-      static const char *lower[7] = {"▁", "▂", "▃", "▄", "▅", "▆", "▇"};
-      unsigned int which = lround ((double) ((best_i + 1) * 8) / bi.height);
-      if (1 <= which && which <= 7) {
-       score = best_s;
-       *inverse = best_inv;
-       best_c = lower[7 - which];
-      }
-    }
-  }
-
-  /* Find best left line */
-  if (1) {
-    unsigned int best_s = UINT_MAX;
-    bool best_inv = false;
-    int best_i = 0;
-    for (unsigned int i = 0; i < bi.width - 1; i++)
-    {
-      unsigned int s;
-      s = col_sum[i] + total_i - col_sum_i[i];
-      if (s < best_s) {
-       best_s = s;
-       best_i = i;
-       best_inv = true;
-      }
-      s = col_sum_i[i] + total - col_sum[i];
-      if (s < best_s) {
-       best_s = s;
-       best_i = i;
-       best_inv = false;
-      }
-    }
-    if (best_s < score) {
-      static const char *left [7] = {"▏", "▎", "▍", "▌", "▋", "▊", "▉"};
-      unsigned int which = lround ((double) ((best_i + 1) * 8) / bi.width);
-      if (1 <= which && which <= 7) {
-       score = best_s;
-       *inverse = best_inv;
-       best_c = left[which - 1];
-      }
-    }
-  }
-
-  /* Find best quadrant */
-  if (1) {
-    unsigned int q = 0;
-    unsigned int qs = 0;
-    for (unsigned int i = 0; i < 2; i++)
-      for (unsigned int j = 0; j < 2; j++)
-       if (quad[i][j] > quad_i[i][j]) {
-         q += 1 << (2 * i + j);
-         qs += quad_i[i][j];
-       } else
-         qs += quad[i][j];
-    if (qs < score) {
-      const char *c = nullptr;
-      bool inv = false;
-      switch (q) {
-       case 1:  c = "▟"; inv = true;  break;
-       case 2:  c = "▙"; inv = true;  break;
-       case 4:  c = "▖"; inv = false; break;
-       case 8:  c = "▗"; inv = false; break;
-       case 9:  c = "▚"; inv = false; break;
-       case 6:  c = "▞"; inv = false; break;
-       case 7:  c = "▜"; inv = true;  break;
-       case 11: c = "▜"; inv = true;  break;
-       case 13: c = "▙"; inv = true;  break;
-       case 14: c = "▟"; inv = true;  break;
-      }
-      if (c) {
-       score = qs;
-       *inverse = inv;
-       best_c = c;
-      }
-    }
-  }
-
-  return best_c;
-}
-
-void
-ansi_print_image_rgb24 (const uint32_t *data,
-                       unsigned int width,
-                       unsigned int height,
-                       unsigned int stride)
-{
-  image_t image (width, height, data, stride);
-
-  unsigned int rows = (height + CELL_H - 1) / CELL_H;
-  unsigned int cols = (width +  CELL_W - 1) / CELL_W;
-  image_t cell (CELL_W, CELL_H);
-  biimage_t bi (CELL_W, CELL_H);
-  unsigned int last_bg = -1, last_fg = -1;
-  for (unsigned int row = 0; row < rows; row++) {
-    for (unsigned int col = 0; col < cols; col++) {
-      image.copy_sub_image (cell, col * CELL_W, row * CELL_H, CELL_W, CELL_H);
-      bi.set (cell);
-      if (bi.unicolor) {
-       if (last_bg != bi.bg) {
-         printf ("%c[%dm", ESC_E, 40 + bi.bg);
-         last_bg = bi.bg;
-       }
-       printf (" ");
-      } else {
-       /* Figure out the closest character to the biimage */
-       bool inverse = false;
-       const char *c = block_best (bi, &inverse);
-       if (inverse) {
-         if (last_bg != bi.fg || last_fg != bi.bg) {
-           printf ("%c[%d;%dm", ESC_E, 30 + bi.bg, 40 + bi.fg);
-           last_bg = bi.fg;
-           last_fg = bi.bg;
-         }
-       } else {
-         if (last_bg != bi.bg || last_fg != bi.fg) {
-           printf ("%c[%d;%dm", ESC_E, 40 + bi.bg, 30 + bi.fg);
-           last_bg = bi.bg;
-           last_fg = bi.fg;
-         }
-       }
-       printf ("%s", c);
-      }
-    }
-    printf ("%c[0m\n", ESC_E); /* Reset */
-    last_bg = last_fg = -1;
-  }
-}
index 9640d89..6476668 100644 (file)
 
 #include "hb.hh"
 
-void
+#include <assert.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <string.h>
+#include <stdio.h>
+#include <math.h>
+#include <fcntl.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h> /* for isatty() */
+#endif
+
+#if defined (_MSC_VER) && (_MSC_VER < 1800)
+static inline long int
+lround (double x)
+{
+  if (x >= 0)
+    return floor (x + 0.5);
+  else
+    return ceil (x - 0.5);
+}
+#endif
+
+#define ESC_E (char)27
+
+#define CELL_W 8
+#define CELL_H (2 * CELL_W)
+
+struct color_diff_t
+{
+  int dot (const color_diff_t &o)
+  { return v[0]*o.v[0] + v[1]*o.v[1] + v[2]*o.v[2] + v[3]*o.v[3]; }
+
+  int v[4];
+};
+
+struct color_t
+{
+  static color_t from_ansi (unsigned int x)
+  {
+    color_t c = {(0xFFu<<24) | ((0xFFu*(x&1))<<16) | ((0xFFu*((x >> 1)&1))<<8) | (0xFFu*((x >> 2)&1))};
+    return c;
+  }
+  unsigned int to_ansi ()
+  {
+    return ((v >> 23) & 1) | ((v >> 14)&2) | ((v >> 5)&4);
+  }
+
+  color_diff_t diff (const color_t &o)
+  {
+    color_diff_t d;
+    for (unsigned int i = 0; i < 4; i++)
+      d.v[i] = (int) ((v >> (i*8))&0xFF) - (int) ((o.v >> (i*8))&0xFF);
+    return d;
+  }
+
+  uint32_t v;
+};
+
+struct image_t
+{
+  public:
+
+  image_t (unsigned int width_,
+          unsigned int height_,
+          const uint32_t *data_,
+          unsigned int stride_) :
+               width (width_),
+               height (height_),
+               own_data (false),
+               data ((color_t *) data_),
+               stride (stride_) {}
+  image_t (unsigned int width_,
+          unsigned int height_) :
+               width (width_),
+               height (height_),
+               own_data (true),
+               data ((color_t *) malloc (sizeof (data[0]) * width * height)),
+               stride (width) {}
+  ~image_t ()
+  { if (own_data) free (data); }
+
+  color_t &operator () (unsigned int x, unsigned int y)
+  { return data[x + y * stride]; }
+
+  color_t operator () (unsigned int x, unsigned int y) const
+  { return data[x + y * stride]; }
+
+  void
+  copy_sub_image (const image_t &s,
+                 unsigned int x, unsigned int y,
+                 unsigned int w, unsigned int h)
+  {
+    assert (x < width);
+    assert (y < height);
+    for (unsigned int row = 0; row < h; row++) {
+      color_t *p = data + x + hb_min (y + row, height - 1) * stride;
+      color_t *q = s.data + row * s.stride;
+      if (x + w <= width)
+       for (unsigned int col = 0; col < w; col++)
+         *q++ = *p++;
+      else {
+       unsigned int limit = width - x;
+       for (unsigned int col = 0; col < limit; col++)
+         *q++ = *p++;
+       p--;
+       for (unsigned int col = limit; col < w; col++)
+         *q++ = *p;
+      }
+    }
+  }
+
+  const unsigned int width;
+  const unsigned int height;
+
+  private:
+  bool own_data;
+  color_t * const data;
+  const unsigned int stride;
+};
+
+struct biimage_t
+{
+  public:
+
+  biimage_t (unsigned int width, unsigned int height) :
+               width (width),
+               height (height),
+               bg (0), fg (0), unicolor (true),
+               data ((uint8_t *) malloc (sizeof (data[0]) * width * height)) {}
+  ~biimage_t ()
+  { free (data); }
+
+  void set (const image_t &image)
+  {
+    assert (image.width == width);
+    assert (image.height == height);
+    int freq[8] = {0};
+    for (unsigned int y = 0; y < height; y++)
+      for (unsigned int x = 0; x < width; x++) {
+       color_t c = image (x, y);
+       freq[c.to_ansi ()]++;
+      }
+    bg = 0;
+    for (unsigned int i = 1; i < 8; i++)
+      if (freq[bg] < freq[i])
+       bg = i;
+    fg = 0;
+    for (unsigned int i = 1; i < 8; i++)
+      if (i != bg && freq[fg] < freq[i])
+       fg = i;
+    if (fg == bg || freq[fg] == 0) {
+      fg = bg;
+      unicolor = true;
+    }
+    else
+      unicolor = false;
+
+    /* Set the data... */
+
+    if (unicolor) {
+      memset (data, 0, sizeof (data[0]) * width * height);
+      return;
+    }
+
+    color_t bgc = color_t::from_ansi (bg);
+    color_t fgc = color_t::from_ansi (fg);
+    color_diff_t diff = fgc.diff (bgc);
+    int dd = diff.dot (diff);
+    for (unsigned int y = 0; y < height; y++)
+      for (unsigned int x = 0; x < width; x++) {
+       int d = diff.dot (image (x, y).diff (bgc));
+       (*this)(x, y) = d < 0 ? 0 : d > dd ? 255 : lround (d * 255. / dd);
+      }
+  }
+
+  uint8_t &operator () (unsigned int x, unsigned int y)
+  { return data[x + y * width]; }
+
+  uint8_t operator () (unsigned int x, unsigned int y) const
+  { return data[x + y * width]; }
+
+  const unsigned int width;
+  const unsigned int height;
+  unsigned int bg;
+  unsigned int fg;
+  bool unicolor;
+
+  private:
+  uint8_t * const data;
+};
+
+static const char *
+block_best (const biimage_t &bi, bool *inverse)
+{
+  assert (bi.width  <= CELL_W);
+  assert (bi.height <= CELL_H);
+
+  unsigned int score = UINT_MAX;
+  unsigned int row_sum[CELL_H] = {0};
+  unsigned int col_sum[CELL_W] = {0};
+  unsigned int row_sum_i[CELL_H] = {0};
+  unsigned int col_sum_i[CELL_W] = {0};
+  unsigned int quad[2][2] = {{0}};
+  unsigned int quad_i[2][2] = {{0}};
+  unsigned int total = 0;
+  unsigned int total_i = 0;
+  for (unsigned int y = 0; y < bi.height; y++)
+    for (unsigned int x = 0; x < bi.width; x++) {
+      unsigned int c = bi (x, y);
+      unsigned int c_i = 255 - c;
+      row_sum[y] += c;
+      row_sum_i[y] += c_i;
+      col_sum[x] += c;
+      col_sum_i[x] += c_i;
+      quad[2 * y / bi.height][2 * x / bi.width] += c;
+      quad_i[2 * y / bi.height][2 * x / bi.width] += c_i;
+      total += c;
+      total_i += c_i;
+    }
+
+  /* Make the sums cumulative */
+  for (unsigned int i = 1; i < bi.height; i++) {
+    row_sum[i] += row_sum[i - 1];
+    row_sum_i[i] += row_sum_i[i - 1];
+  }
+  for (unsigned int i = 1; i < bi.width;  i++) {
+    col_sum[i] += col_sum[i - 1];
+    col_sum_i[i] += col_sum_i[i - 1];
+  }
+
+  const char *best_c = " ";
+
+  /* Maybe empty is better! */
+  if (total < score) {
+    score = total;
+    *inverse = false;
+    best_c = " ";
+  }
+  /* Maybe full is better! */
+  if (total_i < score) {
+    score = total_i;
+    *inverse = true;
+    best_c = " ";
+  }
+
+  /* Find best lower line */
+  if (1) {
+    unsigned int best_s = UINT_MAX;
+    bool best_inv = false;
+    int best_i = 0;
+    for (unsigned int i = 0; i < bi.height - 1; i++)
+    {
+      unsigned int s;
+      s = row_sum[i] + total_i - row_sum_i[i];
+      if (s < best_s) {
+       best_s = s;
+       best_i = i;
+       best_inv = false;
+      }
+      s = row_sum_i[i] + total - row_sum[i];
+      if (s < best_s) {
+       best_s = s;
+       best_i = i;
+       best_inv = true;
+      }
+    }
+    if (best_s < score) {
+      static const char *lower[7] = {"▁", "▂", "▃", "▄", "▅", "▆", "▇"};
+      unsigned int which = lround ((double) ((best_i + 1) * 8) / bi.height);
+      if (1 <= which && which <= 7) {
+       score = best_s;
+       *inverse = best_inv;
+       best_c = lower[7 - which];
+      }
+    }
+  }
+
+  /* Find best left line */
+  if (1) {
+    unsigned int best_s = UINT_MAX;
+    bool best_inv = false;
+    int best_i = 0;
+    for (unsigned int i = 0; i < bi.width - 1; i++)
+    {
+      unsigned int s;
+      s = col_sum[i] + total_i - col_sum_i[i];
+      if (s < best_s) {
+       best_s = s;
+       best_i = i;
+       best_inv = true;
+      }
+      s = col_sum_i[i] + total - col_sum[i];
+      if (s < best_s) {
+       best_s = s;
+       best_i = i;
+       best_inv = false;
+      }
+    }
+    if (best_s < score) {
+      static const char *left [7] = {"▏", "▎", "▍", "▌", "▋", "▊", "▉"};
+      unsigned int which = lround ((double) ((best_i + 1) * 8) / bi.width);
+      if (1 <= which && which <= 7) {
+       score = best_s;
+       *inverse = best_inv;
+       best_c = left[which - 1];
+      }
+    }
+  }
+
+  /* Find best quadrant */
+  if (1) {
+    unsigned int q = 0;
+    unsigned int qs = 0;
+    for (unsigned int i = 0; i < 2; i++)
+      for (unsigned int j = 0; j < 2; j++)
+       if (quad[i][j] > quad_i[i][j]) {
+         q += 1 << (2 * i + j);
+         qs += quad_i[i][j];
+       } else
+         qs += quad[i][j];
+    if (qs < score) {
+      const char *c = nullptr;
+      bool inv = false;
+      switch (q) {
+       case 1:  c = "▟"; inv = true;  break;
+       case 2:  c = "▙"; inv = true;  break;
+       case 4:  c = "▖"; inv = false; break;
+       case 8:  c = "▗"; inv = false; break;
+       case 9:  c = "▚"; inv = false; break;
+       case 6:  c = "▞"; inv = false; break;
+       case 7:  c = "▜"; inv = true;  break;
+       case 11: c = "▜"; inv = true;  break;
+       case 13: c = "▙"; inv = true;  break;
+       case 14: c = "▟"; inv = true;  break;
+      }
+      if (c) {
+       score = qs;
+       *inverse = inv;
+       best_c = c;
+      }
+    }
+  }
+
+  return best_c;
+}
+
+static inline void
 ansi_print_image_rgb24 (const uint32_t *data,
                        unsigned int width,
                        unsigned int height,
-                       unsigned int stride);
+                       unsigned int stride)
+{
+  image_t image (width, height, data, stride);
 
+  unsigned int rows = (height + CELL_H - 1) / CELL_H;
+  unsigned int cols = (width +  CELL_W - 1) / CELL_W;
+  image_t cell (CELL_W, CELL_H);
+  biimage_t bi (CELL_W, CELL_H);
+  unsigned int last_bg = -1, last_fg = -1;
+  for (unsigned int row = 0; row < rows; row++) {
+    for (unsigned int col = 0; col < cols; col++) {
+      image.copy_sub_image (cell, col * CELL_W, row * CELL_H, CELL_W, CELL_H);
+      bi.set (cell);
+      if (bi.unicolor) {
+       if (last_bg != bi.bg) {
+         printf ("%c[%dm", ESC_E, 40 + bi.bg);
+         last_bg = bi.bg;
+       }
+       printf (" ");
+      } else {
+       /* Figure out the closest character to the biimage */
+       bool inverse = false;
+       const char *c = block_best (bi, &inverse);
+       if (inverse) {
+         if (last_bg != bi.fg || last_fg != bi.bg) {
+           printf ("%c[%d;%dm", ESC_E, 30 + bi.bg, 40 + bi.fg);
+           last_bg = bi.fg;
+           last_fg = bi.bg;
+         }
+       } else {
+         if (last_bg != bi.bg || last_fg != bi.fg) {
+           printf ("%c[%d;%dm", ESC_E, 40 + bi.bg, 30 + bi.fg);
+           last_bg = bi.bg;
+           last_fg = bi.fg;
+         }
+       }
+       printf ("%s", c);
+      }
+    }
+    printf ("%c[0m\n", ESC_E); /* Reset */
+    last_bg = last_fg = -1;
+  }
+}
 
 #endif
diff --git a/util/batch.hh b/util/batch.hh
new file mode 100644 (file)
index 0000000..8c0217d
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ * Copyright © 2021  Behdad Esfahbod
+ *
+ *  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.
+ */
+
+#ifndef BATCH_HH
+#define BATCH_HH
+
+#include "options.hh"
+
+typedef int (*main_func_t) (int argc, char **argv);
+
+template <typename main_t, bool report_status=false>
+int
+batch_main (int argc, char **argv)
+{
+  if (argc == 2 && !strcmp (argv[1], "--batch"))
+  {
+    int ret = 0;
+    char buf[4092];
+    while (fgets (buf, sizeof (buf), stdin))
+    {
+      size_t l = strlen (buf);
+      if (l && buf[l - 1] == '\n') buf[l - 1] = '\0';
+
+      char *args[64];
+      argc = 0;
+      args[argc++] = argv[0];
+      char *p = buf, *e;
+      args[argc++] = p;
+      while ((e = strchr (p, ';')) && argc < (int) ARRAY_LENGTH (args))
+      {
+       *e++ = '\0';
+       while (*e == ';')
+         e++;
+       args[argc++] = p = e;
+      }
+
+      int result = main_t () (argc, args);
+
+      if (report_status)
+       fprintf (stdout, result == 0 ? "success\n" : "failure\n");
+      fflush (stdout);
+
+      ret = MAX (ret, result);
+    }
+    return ret;
+  }
+
+  int ret = main_t () (argc, argv);
+  if (report_status && ret != 0)
+    fprintf (stdout, "error: Operation failed. Probably a bug. File github issue.\n");
+  return ret;
+}
+
+#endif
diff --git a/util/face-options.hh b/util/face-options.hh
new file mode 100644 (file)
index 0000000..f680e05
--- /dev/null
@@ -0,0 +1,142 @@
+/*
+ * Copyright © 2011  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 FACE_OPTIONS_HH
+#define FACE_OPTIONS_HH
+
+#include "options.hh"
+
+struct face_options_t
+{
+  ~face_options_t ()
+  {
+    g_free (font_file);
+  }
+
+  void set_face (hb_face_t *face_)
+  { face = face_; }
+
+  void add_options (option_parser_t *parser);
+
+  void post_parse (GError **error);
+
+  static struct cache_t
+  {
+    ~cache_t ()
+    {
+      g_free (font_path);
+      hb_blob_destroy (blob);
+      hb_face_destroy (face);
+    }
+
+    char *font_path = nullptr;
+    hb_blob_t *blob = nullptr;
+    unsigned face_index = (unsigned) -1;
+    hb_face_t *face = nullptr;
+  } cache;
+
+  char *font_file = nullptr;
+  unsigned face_index = 0;
+
+  hb_blob_t *blob = nullptr;
+  hb_face_t *face = nullptr;
+};
+
+
+face_options_t::cache_t face_options_t::cache {};
+
+void
+face_options_t::post_parse (GError **error)
+{
+  if (!font_file)
+  {
+    g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_FAILED,
+                "No font file set");
+    return;
+  }
+
+  assert (font_file);
+
+  const char *font_path = font_file;
+
+  if (0 == strcmp (font_path, "-"))
+  {
+#if defined(_WIN32) || defined(__CYGWIN__)
+    setmode (fileno (stdin), O_BINARY);
+    font_path = "STDIN";
+#else
+    font_path = "/dev/stdin";
+#endif
+  }
+
+  if (!cache.font_path || 0 != strcmp (cache.font_path, font_path))
+  {
+    hb_blob_destroy (cache.blob);
+    cache.blob = hb_blob_create_from_file_or_fail (font_path);
+
+    free ((char *) cache.font_path);
+    cache.font_path = g_strdup (font_path);
+
+    if (!cache.blob)
+    {
+      g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_FAILED,
+                  "%s: Failed reading file", font_path);
+      return;
+    }
+
+    hb_face_destroy (cache.face);
+    cache.face = nullptr;
+    cache.face_index = (unsigned) -1;
+  }
+
+  if (cache.face_index != face_index)
+  {
+    hb_face_destroy (cache.face);
+    cache.face = hb_face_create (cache.blob, face_index);
+    cache.face_index = face_index;
+  }
+
+  blob = cache.blob;
+  face = cache.face;
+}
+
+void
+face_options_t::add_options (option_parser_t *parser)
+{
+  GOptionEntry entries[] =
+  {
+    {"font-file",      0, 0, G_OPTION_ARG_STRING,      &this->font_file,               "Set font file-name",                           "filename"},
+    {"face-index",     0, 0, G_OPTION_ARG_INT,         &this->face_index,              "Set face index (default: 0)",                  "index"},
+    {nullptr}
+  };
+  parser->add_group (entries,
+                    "face",
+                    "Font-face options:",
+                    "Options for the font face",
+                    this);
+}
+
+#endif
diff --git a/util/font-options.hh b/util/font-options.hh
new file mode 100644 (file)
index 0000000..fa1cffa
--- /dev/null
@@ -0,0 +1,303 @@
+/*
+ * Copyright © 2011  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 FONT_OPTIONS_HH
+#define FONT_OPTIONS_HH
+
+#include "face-options.hh"
+
+#ifdef HAVE_FREETYPE
+#include <hb-ft.h>
+#endif
+#include <hb-ot.h>
+
+#define FONT_SIZE_UPEM 0x7FFFFFFF
+#define FONT_SIZE_NONE 0
+
+extern const unsigned DEFAULT_FONT_SIZE;
+extern const unsigned SUBPIXEL_BITS;
+
+struct font_options_t : face_options_t
+{
+  ~font_options_t ()
+  {
+    free (variations);
+    g_free (font_funcs);
+    hb_font_destroy (font);
+  }
+
+  void add_options (option_parser_t *parser);
+
+  void post_parse (GError **error);
+
+  hb_variation_t *variations = nullptr;
+  unsigned int num_variations = 0;
+  int x_ppem = 0;
+  int y_ppem = 0;
+  double ptem = 0.;
+  unsigned int subpixel_bits = SUBPIXEL_BITS;
+  mutable double font_size_x = DEFAULT_FONT_SIZE;
+  mutable double font_size_y = DEFAULT_FONT_SIZE;
+  char *font_funcs = nullptr;
+  int ft_load_flags = 2;
+
+  hb_font_t *font = nullptr;
+};
+
+
+static struct supported_font_funcs_t {
+       char name[4];
+       void (*func) (hb_font_t *);
+} supported_font_funcs[] =
+{
+#ifdef HAVE_FREETYPE
+  {"ft",       hb_ft_font_set_funcs},
+#endif
+  {"ot",       hb_ot_font_set_funcs},
+};
+
+
+void
+font_options_t::post_parse (GError **error)
+{
+  assert (!font);
+  font = hb_font_create (face);
+
+  if (font_size_x == FONT_SIZE_UPEM)
+    font_size_x = hb_face_get_upem (face);
+  if (font_size_y == FONT_SIZE_UPEM)
+    font_size_y = hb_face_get_upem (face);
+
+  hb_font_set_ppem (font, x_ppem, y_ppem);
+  hb_font_set_ptem (font, ptem);
+
+  int scale_x = (int) scalbnf (font_size_x, subpixel_bits);
+  int scale_y = (int) scalbnf (font_size_y, subpixel_bits);
+  hb_font_set_scale (font, scale_x, scale_y);
+
+  hb_font_set_variations (font, variations, num_variations);
+
+  void (*set_font_funcs) (hb_font_t *) = nullptr;
+  if (!font_funcs)
+  {
+    set_font_funcs = supported_font_funcs[0].func;
+  }
+  else
+  {
+    for (unsigned int i = 0; i < ARRAY_LENGTH (supported_font_funcs); i++)
+      if (0 == g_ascii_strcasecmp (font_funcs, supported_font_funcs[i].name))
+      {
+       set_font_funcs = supported_font_funcs[i].func;
+       break;
+      }
+    if (!set_font_funcs)
+    {
+      GString *s = g_string_new (nullptr);
+      for (unsigned int i = 0; i < ARRAY_LENGTH (supported_font_funcs); i++)
+      {
+       if (i)
+         g_string_append_c (s, '/');
+       g_string_append (s, supported_font_funcs[i].name);
+      }
+      g_string_append_c (s, '\n');
+      char *p = g_string_free (s, FALSE);
+      g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
+                  "Unknown font function implementation `%s'; supported values are: %s; default is %s",
+                  font_funcs,
+                  p,
+                  supported_font_funcs[0].name);
+      free (p);
+      return;
+    }
+  }
+  set_font_funcs (font);
+#ifdef HAVE_FREETYPE
+  hb_ft_font_set_load_flags (font, ft_load_flags);
+#endif
+}
+
+
+static gboolean
+parse_variations (const char *name G_GNUC_UNUSED,
+                 const char *arg,
+                 gpointer    data,
+                 GError    **error G_GNUC_UNUSED)
+{
+  font_options_t *font_opts = (font_options_t *) data;
+  char *s = (char *) arg;
+  char *p;
+
+  font_opts->num_variations = 0;
+  g_free (font_opts->variations);
+  font_opts->variations = nullptr;
+
+  if (!*s)
+    return true;
+
+  /* count the variations first, so we can allocate memory */
+  p = s;
+  do {
+    font_opts->num_variations++;
+    p = strchr (p, ',');
+    if (p)
+      p++;
+  } while (p);
+
+  font_opts->variations = (hb_variation_t *) calloc (font_opts->num_variations, sizeof (*font_opts->variations));
+  if (!font_opts->variations)
+    return false;
+
+  /* now do the actual parsing */
+  p = s;
+  font_opts->num_variations = 0;
+  while (p && *p) {
+    char *end = strchr (p, ',');
+    if (hb_variation_from_string (p, end ? end - p : -1, &font_opts->variations[font_opts->num_variations]))
+      font_opts->num_variations++;
+    p = end ? end + 1 : nullptr;
+  }
+
+  return true;
+}
+
+static gboolean
+parse_font_size (const char *name G_GNUC_UNUSED,
+                const char *arg,
+                gpointer    data,
+                GError    **error G_GNUC_UNUSED)
+{
+  font_options_t *font_opts = (font_options_t *) data;
+  if (0 == strcmp (arg, "upem"))
+  {
+    font_opts->font_size_y = font_opts->font_size_x = FONT_SIZE_UPEM;
+    return true;
+  }
+  switch (sscanf (arg, "%lf%*[ ,]%lf", &font_opts->font_size_x, &font_opts->font_size_y)) {
+    case 1: font_opts->font_size_y = font_opts->font_size_x; HB_FALLTHROUGH;
+    case 2: return true;
+    default:
+      g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
+                  "%s argument should be one or two space-separated numbers",
+                  name);
+      return false;
+  }
+}
+
+static gboolean
+parse_font_ppem (const char *name G_GNUC_UNUSED,
+                const char *arg,
+                gpointer    data,
+                GError    **error G_GNUC_UNUSED)
+{
+  font_options_t *font_opts = (font_options_t *) data;
+  switch (sscanf (arg, "%d%*[ ,]%d", &font_opts->x_ppem, &font_opts->y_ppem)) {
+    case 1: font_opts->y_ppem = font_opts->x_ppem; HB_FALLTHROUGH;
+    case 2: return true;
+    default:
+      g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
+                  "%s argument should be one or two space-separated numbers",
+                  name);
+      return false;
+  }
+}
+
+void
+font_options_t::add_options (option_parser_t *parser)
+{
+  face_options_t::add_options (parser);
+
+  char *text = nullptr;
+
+  {
+    static_assert ((ARRAY_LENGTH_CONST (supported_font_funcs) > 0),
+                  "No supported font-funcs found.");
+    GString *s = g_string_new (nullptr);
+    g_string_printf (s, "Set font functions implementation to use (default: %s)\n\n    Supported font function implementations are: %s",
+                    supported_font_funcs[0].name,
+                    supported_font_funcs[0].name);
+    for (unsigned int i = 1; i < ARRAY_LENGTH (supported_font_funcs); i++)
+    {
+      g_string_append_c (s, '/');
+      g_string_append (s, supported_font_funcs[i].name);
+    }
+    text = g_string_free (s, FALSE);
+    parser->free_later (text);
+  }
+
+  char *font_size_text;
+  if (DEFAULT_FONT_SIZE == FONT_SIZE_UPEM)
+    font_size_text = (char *) "Font size (default: upem)";
+  else
+  {
+    font_size_text = g_strdup_printf ("Font size (default: %d)", DEFAULT_FONT_SIZE);
+    parser->free_later (font_size_text);
+  }
+
+  int font_size_flags = DEFAULT_FONT_SIZE == FONT_SIZE_NONE ? G_OPTION_FLAG_HIDDEN : 0;
+  GOptionEntry entries[] =
+  {
+    {"font-size",      0, font_size_flags,
+                             G_OPTION_ARG_CALLBACK,    (gpointer) &parse_font_size,    font_size_text,                                 "1/2 integers or 'upem'"},
+    {"font-ppem",      0, font_size_flags,
+                             G_OPTION_ARG_CALLBACK,    (gpointer) &parse_font_ppem,    "Set x,y pixels per EM (default: 0; disabled)", "1/2 integers"},
+    {"font-ptem",      0, 0,
+                             G_OPTION_ARG_DOUBLE,      &this->ptem,                    "Set font point-size (default: 0; disabled)",   "point-size"},
+    {"font-funcs",     0, 0, G_OPTION_ARG_STRING,      &this->font_funcs,              text,                                           "impl"},
+    {"ft-load-flags",  0, 0, G_OPTION_ARG_INT,         &this->ft_load_flags,           "Set FreeType load-flags (default: 2)",         "integer"},
+    {nullptr}
+  };
+  parser->add_group (entries,
+                    "font",
+                    "Font-instance options:",
+                    "Options for the font instance",
+                    this,
+                    false /* We add below. */);
+
+  const gchar *variations_help = "Comma-separated list of font variations\n"
+    "\n"
+    "    Variations are set globally. The format for specifying variation settings\n"
+    "    follows.  All valid CSS font-variation-settings values other than 'normal'\n"
+    "    and 'inherited' are also accepted, though, not documented below.\n"
+    "\n"
+    "    The format is a tag, optionally followed by an equals sign, followed by a\n"
+    "    number. For example:\n"
+    "\n"
+    "      \"wght=500\"\n"
+    "      \"slnt=-7.5\"";
+
+  GOptionEntry entries2[] =
+  {
+    {"variations",     0, 0, G_OPTION_ARG_CALLBACK,    (gpointer) &parse_variations,   variations_help,        "list"},
+    {nullptr}
+  };
+  parser->add_group (entries2,
+                    "variations",
+                    "Variations options:",
+                    "Options for font variations used",
+                    this);
+}
+
+#endif
index 33f531b..7321f93 100644 (file)
  * Google Author(s): Behdad Esfahbod
  */
 
+#include "batch.hh"
+#include "font-options.hh"
 #include "main-font-text.hh"
+#include "shape-options.hh"
+#include "text-options.hh"
 
-#ifdef HAVE_FREETYPE
-#include <hb-ft.h>
-#endif
+const unsigned DEFAULT_FONT_SIZE = FONT_SIZE_NONE;
+const unsigned SUBPIXEL_BITS = 0;
 
-struct shape_closure_consumer_t : option_group_t
+struct shape_closure_consumer_t
 {
-  shape_closure_consumer_t (option_parser_t *parser) :
-                           shaper (parser),
-                           show_glyph_names (true)
+  void add_options (struct option_parser_t *parser)
   {
-    add_options (parser);
-  }
+    parser->set_summary ("Find glyph set from input text under shaping closure.");
+    shaper.add_options (parser);
 
-  void add_options (struct option_parser_t *parser) override
-  {
     GOptionEntry entries[] =
     {
       {"no-glyph-names",       0, G_OPTION_FLAG_REVERSE, G_OPTION_ARG_NONE,    &this->show_glyph_names,        "Use glyph indices instead of names",   nullptr},
@@ -53,24 +52,26 @@ struct shape_closure_consumer_t : option_group_t
                       this);
   }
 
-  void init (hb_buffer_t  *buffer_,
-            const font_options_t *font_opts)
+  void init (const font_options_t *font_opts)
   {
     glyphs = hb_set_create ();
-    font = hb_font_reference (font_opts->get_font ());
+    font = hb_font_reference (font_opts->font);
     failed = false;
-    buffer = hb_buffer_reference (buffer_);
+    buffer = hb_buffer_create ();
   }
-  void consume_line (const char   *text,
-                    unsigned int  text_len,
-                    const char   *text_before,
-                    const char   *text_after)
+  template <typename text_options_t>
+  bool consume_line (text_options_t &text_opts)
   {
+    unsigned int text_len;
+    const char *text;
+    if (!(text = text_opts.get_line (&text_len)))
+      return false;
+
     hb_set_clear (glyphs);
     shaper.shape_closure (text, text_len, font, buffer, glyphs);
 
     if (hb_set_is_empty (glyphs))
-      return;
+      return true;
 
     /* Print it out! */
     bool first = true;
@@ -88,6 +89,8 @@ struct shape_closure_consumer_t : option_group_t
       } else
        printf ("%u", i);
     }
+
+    return true;
   }
   void finish (const font_options_t *font_opts)
   {
@@ -104,16 +107,16 @@ struct shape_closure_consumer_t : option_group_t
 
   protected:
   shape_options_t shaper;
-  hb_bool_t show_glyph_names;
+  hb_bool_t show_glyph_names = false;
 
-  hb_set_t *glyphs;
-  hb_font_t *font;
-  hb_buffer_t *buffer;
+  hb_set_t *glyphs = nullptr;
+  hb_font_t *font = nullptr;
+  hb_buffer_t *buffer = nullptr;
 };
 
 int
 main (int argc, char **argv)
 {
-  main_font_text_t<shape_closure_consumer_t, FONT_SIZE_NONE, 0> driver;
-  return driver.main (argc, argv);
+  using main_t = main_font_text_t<shape_closure_consumer_t, font_options_t, text_options_t>;
+  return batch_main<main_t> (argc, argv);
 }
index bab5cba..13c277a 100644 (file)
  * Google Author(s): Behdad Esfahbod
  */
 
+#include "batch.hh"
+#include "font-options.hh"
 #include "main-font-text.hh"
+#include "output-options.hh"
 #include "shape-consumer.hh"
+#include "shape-format.hh"
+#include "text-options.hh"
 
-struct output_buffer_t
+const unsigned DEFAULT_FONT_SIZE = FONT_SIZE_UPEM;
+const unsigned SUBPIXEL_BITS = 0;
+
+struct output_buffer_t : output_options_t<>
 {
-  output_buffer_t (option_parser_t *parser)
-                 : options (parser, hb_buffer_serialize_list_formats ()),
-                   format (parser),
-                   gs (nullptr),
-                   line_no (0),
-                   font (nullptr),
-                   output_format (HB_BUFFER_SERIALIZE_FORMAT_INVALID),
-                   format_flags (HB_BUFFER_SERIALIZE_FLAG_DEFAULT) {}
+  void add_options (option_parser_t *parser)
+  {
+    parser->set_summary ("Shape text with given font.");
+    output_options_t::add_options (parser, hb_buffer_serialize_list_formats ());
+    format.add_options (parser);
+  }
 
   void init (hb_buffer_t *buffer, const font_options_t *font_opts)
   {
-    options.get_file_handle ();
     gs = g_string_new (nullptr);
     line_no = 0;
-    font = hb_font_reference (font_opts->get_font ());
+    font = hb_font_reference (font_opts->font);
 
-    if (!options.output_format)
-      output_format = HB_BUFFER_SERIALIZE_FORMAT_TEXT;
+    if (!output_format)
+      serialize_format = HB_BUFFER_SERIALIZE_FORMAT_TEXT;
     else
-      output_format = hb_buffer_serialize_format_from_string (options.output_format, -1);
+      serialize_format = hb_buffer_serialize_format_from_string (output_format, -1);
     /* An empty "output_format" parameter basically skips output generating.
      * Useful for benchmarking. */
-    if ((!options.output_format || *options.output_format) &&
-       !hb_buffer_serialize_format_to_string (output_format))
+    if ((!output_format || *output_format) &&
+       !hb_buffer_serialize_format_to_string (serialize_format))
     {
-      if (options.explicit_output_format)
+      if (explicit_output_format)
        fail (false, "Unknown output format `%s'; supported formats are: %s",
-             options.output_format,
-             g_strjoinv ("/", const_cast<char**> (options.supported_formats)));
+             output_format,
+             g_strjoinv ("/", const_cast<char**> (hb_buffer_serialize_list_formats ())));
       else
        /* Just default to TEXT if not explicitly requested and the
         * file extension is not recognized. */
-       output_format = HB_BUFFER_SERIALIZE_FORMAT_TEXT;
+       serialize_format = HB_BUFFER_SERIALIZE_FORMAT_TEXT;
     }
 
     unsigned int flags = HB_BUFFER_SERIALIZE_FLAG_DEFAULT;
@@ -78,7 +83,7 @@ struct output_buffer_t
       flags |= HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS;
     if (format.show_flags)
       flags |= HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS;
-    format_flags = (hb_buffer_serialize_flags_t) flags;
+    serialize_flags = (hb_buffer_serialize_flags_t) flags;
 
     if (format.trace)
       hb_buffer_set_message_func (buffer, message_func, this, nullptr);
@@ -91,13 +96,13 @@ struct output_buffer_t
   {
     g_string_set_size (gs, 0);
     format.serialize_buffer_of_text (buffer, line_no, text, text_len, font, gs);
-    fprintf (options.fp, "%s", gs->str);
+    fprintf (out_fp, "%s", gs->str);
   }
   void error (const char *message)
   {
     g_string_set_size (gs, 0);
     format.serialize_message (line_no, "error", message, gs);
-    fprintf (options.fp, "%s", gs->str);
+    fprintf (out_fp, "%s", gs->str);
   }
   void consume_glyphs (hb_buffer_t  *buffer,
                       const char   *text,
@@ -106,8 +111,8 @@ struct output_buffer_t
   {
     g_string_set_size (gs, 0);
     format.serialize_buffer_of_glyphs (buffer, line_no, text, text_len, font,
-                                      output_format, format_flags, gs);
-    fprintf (options.fp, "%s", gs->str);
+                                      serialize_format, serialize_flags, gs);
+    fprintf (out_fp, "%s", gs->str);
   }
   void finish (hb_buffer_t *buffer, const font_options_t *font_opts)
   {
@@ -137,54 +142,26 @@ struct output_buffer_t
     g_string_set_size (gs, 0);
     format.serialize_line_no (line_no, gs);
     g_string_append_printf (gs, "trace: %s     buffer: ", message);
-    format.serialize_glyphs (buffer, font, output_format, format_flags, gs);
+    format.serialize (buffer, font, serialize_format, serialize_flags, gs);
     g_string_append_c (gs, '\n');
-    fprintf (options.fp, "%s", gs->str);
+    fprintf (out_fp, "%s", gs->str);
   }
 
 
   protected:
-  output_options_t options;
-  format_options_t format;
 
-  GString *gs;
-  unsigned int line_no;
-  hb_font_t *font;
-  hb_buffer_serialize_format_t output_format;
-  hb_buffer_serialize_flags_t format_flags;
+  shape_format_options_t format;
+
+  GString *gs = nullptr;
+  unsigned int line_no = 0;
+  hb_font_t *font = nullptr;
+  hb_buffer_serialize_format_t serialize_format = HB_BUFFER_SERIALIZE_FORMAT_INVALID;
+  hb_buffer_serialize_flags_t serialize_flags = HB_BUFFER_SERIALIZE_FLAG_DEFAULT;
 };
 
 int
 main (int argc, char **argv)
 {
-  if (argc == 2 && !strcmp (argv[1], "--batch"))
-  {
-    unsigned int ret = 0;
-    char buf[4092];
-    while (fgets (buf, sizeof (buf), stdin))
-    {
-      size_t l = strlen (buf);
-      if (l && buf[l - 1] == '\n') buf[l - 1] = '\0';
-      main_font_text_t<shape_consumer_t<output_buffer_t>, FONT_SIZE_UPEM, 0> driver;
-      char *args[32];
-      argc = 0;
-      char *p = buf, *e;
-      args[argc++] = p;
-      while ((e = strchr (p, ' ')) && argc < (int) (int) ARRAY_LENGTH (args))
-      {
-       *e++ = '\0';
-       while (*e == ' ')
-         e++;
-       args[argc++] = p = e;
-      }
-      ret |= driver.main (argc, args);
-      fflush (stdout);
-
-      if (ret)
-       break;
-    }
-    return ret;
-  }
-  main_font_text_t<shape_consumer_t<output_buffer_t>, FONT_SIZE_UPEM, 0> driver;
-  return driver.main (argc, argv);
+  using main_t = main_font_text_t<shape_consumer_t<output_buffer_t>, font_options_t, shape_text_options_t>;
+  return batch_main<main_t> (argc, argv);
 }
index 253e48a..82216d3 100644 (file)
  * Google Author(s): Garret Rieger, Rod Sheeter
  */
 
-#include <stdio.h>
-
+#include "batch.hh"
+#include "face-options.hh"
 #include "main-font-text.hh"
-#include "hb-subset.h"
+#include "output-options.hh"
+
+#include <hb-subset.h>
 
 /*
  * Command line interface to the harfbuzz font subsetter.
  */
 
-struct subset_consumer_t
+struct subset_main_t : option_parser_t, face_options_t, output_options_t<false>
+{
+  subset_main_t ()
+  : input (hb_subset_input_create_or_fail ())
+  {}
+  ~subset_main_t ()
+  {
+    hb_subset_input_destroy (input);
+  }
+
+  void parse_face (int argc, const char * const *argv)
+  {
+    option_parser_t parser;
+    face_options_t face_opts;
+
+    face_opts.add_options (&parser);
+
+    GOptionEntry entries[] =
+    {
+      {G_OPTION_REMAINING,     0, G_OPTION_FLAG_IN_MAIN,
+                               G_OPTION_ARG_CALLBACK,  (gpointer) &collect_face,       nullptr,        "[FONT-FILE] [TEXT]"},
+      {nullptr}
+    };
+    parser.add_main_group (entries, &face_opts);
+    parser.add_options ();
+
+    g_option_context_set_ignore_unknown_options (parser.context, true);
+    g_option_context_set_help_enabled (parser.context, false);
+
+    char **args = (char **)
+#if GLIB_CHECK_VERSION (2, 68, 0)
+      g_memdup2
+#else
+      g_memdup
+#endif
+      (argv, argc * sizeof (*argv));
+    parser.parse (&argc, &args);
+    g_free (args);
+
+    set_face (face_opts.face);
+  }
+
+  void parse (int argc, char **argv)
+  {
+    bool help = false;
+    for (auto i = 1; i < argc; i++)
+      if (!strncmp ("--help", argv[i], 6))
+      {
+       help = true;
+       break;
+      }
+
+    if (likely (!help))
+    {
+      /* Do a preliminary parse to load font-face, such that we can use it
+       * during main option parsing. */
+      parse_face (argc, argv);
+    }
+
+    add_options ();
+    option_parser_t::parse (&argc, &argv);
+  }
+
+  int operator () (int argc, char **argv)
+  {
+    parse (argc, argv);
+
+    hb_face_t *new_face = nullptr;
+    for (unsigned i = 0; i < num_iterations; i++)
+    {
+      hb_face_destroy (new_face);
+      new_face = hb_subset_or_fail (face, input);
+    }
+
+    bool success = new_face;
+    if (success)
+    {
+      hb_blob_t *result = hb_face_reference_blob (new_face);
+      write_file (output_file, result);
+      hb_blob_destroy (result);
+    }
+
+    hb_face_destroy (new_face);
+
+    return success ? 0 : 1;
+  }
+
+  bool
+  write_file (const char *output_file, hb_blob_t *blob)
+  {
+    assert (out_fp);
+
+    unsigned int size;
+    const char* data = hb_blob_get_data (blob, &size);
+
+    while (size)
+    {
+      size_t ret = fwrite (data, 1, size, out_fp);
+      size -= ret;
+      data += ret;
+      if (size && ferror (out_fp))
+        fail (false, "Failed to write output: %s", strerror (errno));
+    }
+
+    return true;
+  }
+
+  void add_options ();
+
+  protected:
+  static gboolean
+  collect_face (const char *name,
+               const char *arg,
+               gpointer    data,
+               GError    **error);
+  static gboolean
+  collect_rest (const char *name,
+               const char *arg,
+               gpointer    data,
+               GError    **error);
+
+  public:
+
+  unsigned num_iterations = 1;
+  hb_subset_input_t *input = nullptr;
+};
+
+static gboolean
+parse_gids (const char *name G_GNUC_UNUSED,
+           const char *arg,
+           gpointer    data,
+           GError    **error)
+{
+  subset_main_t *subset_main = (subset_main_t *) data;
+  hb_bool_t is_remove = (name[strlen (name) - 1] == '-');
+  hb_bool_t is_add = (name[strlen (name) - 1] == '+');
+  hb_set_t *gids = hb_subset_input_glyph_set (subset_main->input);
+
+  if (!is_remove && !is_add) hb_set_clear (gids);
+
+  if (0 == strcmp (arg, "*"))
+  {
+    hb_set_clear (gids);
+    if (!is_remove)
+      hb_set_invert (gids);
+    return true;
+  }
+
+  char *s = (char *) arg;
+  char *p;
+
+  while (s && *s)
+  {
+    while (*s && strchr (", ", *s))
+      s++;
+    if (!*s)
+      break;
+
+    errno = 0;
+    hb_codepoint_t start_code = strtoul (s, &p, 10);
+    if (s[0] == '-' || errno || s == p)
+    {
+      g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
+                  "Failed parsing glyph-index at: '%s'", s);
+      return false;
+    }
+
+    if (p && p[0] == '-') // ranges
+    {
+      s = ++p;
+      hb_codepoint_t end_code = strtoul (s, &p, 10);
+      if (s[0] == '-' || errno || s == p)
+      {
+       g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
+                    "Failed parsing glyph-index at: '%s'", s);
+       return false;
+      }
+
+      if (end_code < start_code)
+      {
+       g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
+                    "Invalid glyph-index range %u-%u", start_code, end_code);
+       return false;
+      }
+      if (!is_remove)
+        hb_set_add_range (gids, start_code, end_code);
+      else
+        hb_set_del_range (gids, start_code, end_code);
+    }
+    else
+    {
+      if (!is_remove)
+        hb_set_add (gids, start_code);
+      else
+        hb_set_del (gids, start_code);
+    }
+
+    s = p;
+  }
+
+  return true;
+}
+
+static gboolean
+parse_glyphs (const char *name G_GNUC_UNUSED,
+             const char *arg,
+             gpointer    data,
+             GError    **error G_GNUC_UNUSED)
 {
-  subset_consumer_t (option_parser_t *parser)
-      : failed (false), options (parser), subset_options (parser), font (nullptr), input (nullptr) {}
+  subset_main_t *subset_main = (subset_main_t *) data;
+  hb_bool_t is_remove = (name[strlen (name) - 1] == '-');
+  hb_bool_t is_add = (name[strlen (name) - 1] == '+');
+  hb_set_t *gids = hb_subset_input_glyph_set (subset_main->input);
+
+  if (!is_remove && !is_add) hb_set_clear (gids);
 
-  void init (hb_buffer_t  *buffer_,
-            const font_options_t *font_opts)
+  if (0 == strcmp (arg, "*"))
   {
-    font = hb_font_reference (font_opts->get_font ());
-    input = hb_subset_input_reference (subset_options.input);
+    hb_set_clear (gids);
+    if (!is_remove)
+      hb_set_invert (gids);
+    return true;
   }
 
-  void consume_line (const char   *text,
-                    unsigned int  text_len,
-                    const char   *text_before,
-                    const char   *text_after)
+  const char *p = arg;
+  const char *p_end = arg + strlen (arg);
+
+  hb_font_t *font = hb_font_create (subset_main->face);
+  while (p < p_end)
   {
-    // TODO(Q1) does this only get called with at least 1 codepoint?
-    hb_set_t *codepoints = hb_subset_input_unicode_set (input);
-    if (0 == strcmp (text, "*"))
+    while (p < p_end && (*p == ' ' || *p == ','))
+      p++;
+
+    const char *end = p;
+    while (end < p_end && *end != ' ' && *end != ',')
+      end++;
+
+    if (p < end)
     {
-      hb_face_t *face = hb_font_get_face (font);
-      hb_face_collect_unicodes (face, codepoints);
-      return;
+      hb_codepoint_t gid;
+      if (!hb_font_get_glyph_from_name (font, p, end - p, &gid))
+      {
+       g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
+                    "Failed parsing glyph name: '%s'", p);
+       return false;
+      }
+
+      if (!is_remove)
+        hb_set_add (gids, gid);
+      else
+        hb_set_del (gids, gid);
     }
 
-    gchar *c = (gchar *)text;
-    do {
-      gunichar cp = g_utf8_get_char(c);
-      hb_codepoint_t hb_cp = cp;
-      hb_set_add (codepoints, hb_cp);
-    } while ((c = g_utf8_find_next_char(c, text + text_len)));
+    p = end + 1;
+  }
+  hb_font_destroy (font);
+
+  return true;
+}
+
+static gboolean
+parse_text (const char *name G_GNUC_UNUSED,
+           const char *arg,
+           gpointer    data,
+           GError    **error G_GNUC_UNUSED)
+{
+  subset_main_t *subset_main = (subset_main_t *) data;
+  hb_bool_t is_remove = (name[strlen (name) - 1] == '-');
+  hb_bool_t is_add = (name[strlen (name) - 1] == '+');
+  hb_set_t *unicodes = hb_subset_input_unicode_set (subset_main->input);
+
+  if (!is_remove && !is_add) hb_set_clear (unicodes);
+
+  if (0 == strcmp (arg, "*"))
+  {
+    hb_set_clear (unicodes);
+    if (!is_remove)
+      hb_set_invert (unicodes);
+    return true;
+  }
+
+  for (gchar *c = (gchar *) arg;
+       *c;
+       c = g_utf8_find_next_char(c, nullptr))
+  {
+    gunichar cp = g_utf8_get_char(c);
+    if (!is_remove)
+      hb_set_add (unicodes, cp);
+    else
+      hb_set_del (unicodes, cp);
+  }
+  return true;
+}
+
+static gboolean
+parse_unicodes (const char *name G_GNUC_UNUSED,
+               const char *arg,
+               gpointer    data,
+               GError    **error)
+{
+  subset_main_t *subset_main = (subset_main_t *) data;
+  hb_bool_t is_remove = (name[strlen (name) - 1] == '-');
+  hb_bool_t is_add = (name[strlen (name) - 1] == '+');
+  hb_set_t *unicodes = hb_subset_input_unicode_set (subset_main->input);
+
+  if (!is_remove && !is_add) hb_set_clear (unicodes);
+
+  if (0 == strcmp (arg, "*"))
+  {
+    hb_set_clear (unicodes);
+    if (!is_remove)
+      hb_set_invert (unicodes);
+    return true;
+  }
+
+  // XXX TODO Ranges
+#define DELIMITERS "<+->{},;&#\\xXuUnNiI\n\t\v\f\r "
+
+  char *s = (char *) arg;
+  char *p;
+
+  while (s && *s)
+  {
+    while (*s && strchr (DELIMITERS, *s))
+      s++;
+    if (!*s)
+      break;
+
+    errno = 0;
+    hb_codepoint_t start_code = strtoul (s, &p, 16);
+    if (errno || s == p)
+    {
+      g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
+                  "Failed parsing Unicode at: '%s'", s);
+      return false;
+    }
+
+    if (p && p[0] == '-') // ranges
+    {
+      s = ++p;
+      hb_codepoint_t end_code = strtoul (s, &p, 16);
+      if (s[0] == '-' || errno || s == p)
+      {
+       g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
+                    "Failed parsing Unicode at: '%s'", s);
+       return false;
+      }
+
+      if (end_code < start_code)
+      {
+       g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
+                    "Invalid Unicode range %u-%u", start_code, end_code);
+       return false;
+      }
+      if (!is_remove)
+        hb_set_add_range (unicodes, start_code, end_code);
+      else
+        hb_set_del_range (unicodes, start_code, end_code);
+    }
+    else
+    {
+      if (!is_remove)
+        hb_set_add (unicodes, start_code);
+      else
+        hb_set_del (unicodes, start_code);
+    }
+
+    s = p;
+  }
+
+  return true;
+}
+
+static gboolean
+parse_nameids (const char *name,
+              const char *arg,
+              gpointer    data,
+              GError    **error)
+{
+  subset_main_t *subset_main = (subset_main_t *) data;
+  hb_bool_t is_remove = (name[strlen (name) - 1] == '-');
+  hb_bool_t is_add = (name[strlen (name) - 1] == '+');
+  hb_set_t *name_ids = hb_subset_input_set (subset_main->input, HB_SUBSET_SETS_NAME_ID);
+
+
+  if (!is_remove && !is_add) hb_set_clear (name_ids);
+
+  if (0 == strcmp (arg, "*"))
+  {
+    hb_set_clear (name_ids);
+    if (!is_remove)
+      hb_set_invert (name_ids);
+    return true;
   }
 
-  hb_bool_t
-  write_file (const char *output_file, hb_blob_t *blob) {
-    unsigned int data_length;
-    const char* data = hb_blob_get_data (blob, &data_length);
+  char *s = (char *) arg;
+  char *p;
 
-    FILE *fp_out = fopen(output_file, "wb");
-    if (!fp_out) {
-      fprintf(stderr, "Unable to open output file\n");
+  while (s && *s)
+  {
+    while (*s && strchr (", ", *s))
+      s++;
+    if (!*s)
+      break;
+
+    errno = 0;
+    hb_codepoint_t u = strtoul (s, &p, 10);
+    if (errno || s == p)
+    {
+      g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
+                  "Failed parsing nameID at: '%s'", s);
       return false;
     }
-    int bytes_written = fwrite(data, 1, data_length, fp_out);
 
-    fclose (fp_out);
+    if (!is_remove)
+    {
+      hb_set_add (name_ids, u);
+    } else {
+      hb_set_del (name_ids, u);
+    }
+
+    s = p;
+  }
+
+  return true;
+}
+
+static gboolean
+parse_name_languages (const char *name,
+                     const char *arg,
+                     gpointer    data,
+                     GError    **error)
+{
+  subset_main_t *subset_main = (subset_main_t *) data;
+  hb_bool_t is_remove = (name[strlen (name) - 1] == '-');
+  hb_bool_t is_add = (name[strlen (name) - 1] == '+');
+  hb_set_t *name_languages = hb_subset_input_set (subset_main->input, HB_SUBSET_SETS_NAME_LANG_ID);
+
+  if (!is_remove && !is_add) hb_set_clear (name_languages);
 
-    if (bytes_written == -1) {
-      fprintf(stderr, "Unable to write output file\n");
+  if (0 == strcmp (arg, "*"))
+  {
+    hb_set_clear (name_languages);
+    if (!is_remove)
+      hb_set_invert (name_languages);
+    return true;
+  }
+
+  char *s = (char *) arg;
+  char *p;
+
+  while (s && *s)
+  {
+    while (*s && strchr (", ", *s))
+      s++;
+    if (!*s)
+      break;
+
+    errno = 0;
+    hb_codepoint_t u = strtoul (s, &p, 10);
+    if (errno || s == p)
+    {
+      g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
+                  "Failed parsing name-language code at: '%s'", s);
       return false;
     }
-    if ((unsigned int) bytes_written != data_length) {
-      fprintf(stderr, "Expected %u bytes written, got %d\n", data_length,
-             bytes_written);
+
+    if (!is_remove)
+    {
+      hb_set_add (name_languages, u);
+    } else {
+      hb_set_del (name_languages, u);
+    }
+
+    s = p;
+  }
+
+  return true;
+}
+
+template <hb_subset_flags_t flag>
+static gboolean
+set_flag (const char *name,
+         const char *arg,
+         gpointer    data,
+         GError    **error G_GNUC_UNUSED)
+{
+  subset_main_t *subset_main = (subset_main_t *) data;
+
+  hb_subset_input_set_flags (subset_main->input,
+                            hb_subset_input_get_flags (subset_main->input) | flag);
+
+  return true;
+}
+
+static gboolean
+parse_layout_features (const char *name,
+                      const char *arg,
+                      gpointer    data,
+                      GError    **error G_GNUC_UNUSED)
+{
+  subset_main_t *subset_main = (subset_main_t *) data;
+  hb_bool_t is_remove = (name[strlen (name) - 1] == '-');
+  hb_bool_t is_add = (name[strlen (name) - 1] == '+');
+  hb_set_t *layout_features = hb_subset_input_set (subset_main->input, HB_SUBSET_SETS_LAYOUT_FEATURE_TAG);
+
+  if (!is_remove && !is_add) hb_set_clear (layout_features);
+
+  if (0 == strcmp (arg, "*"))
+  {
+    hb_set_clear (layout_features);
+    if (!is_remove)
+      hb_set_invert (layout_features);
+    return true;
+  }
+
+  char *s = strtok((char *) arg, ", ");
+  while (s)
+  {
+    if (strlen (s) > 4) // table tags are at most 4 bytes
+    {
+      g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
+                   "Failed parsing table tag at: '%s'", s);
       return false;
     }
+
+    hb_tag_t tag = hb_tag_from_string (s, strlen (s));
+
+    if (!is_remove)
+      hb_set_add (layout_features, tag);
+    else
+      hb_set_del (layout_features, tag);
+
+    s = strtok(nullptr, ", ");
+  }
+
+  return true;
+}
+
+static gboolean
+parse_drop_tables (const char *name,
+                  const char *arg,
+                  gpointer    data,
+                  GError    **error)
+{
+  subset_main_t *subset_main = (subset_main_t *) data;
+  hb_bool_t is_remove = (name[strlen (name) - 1] == '-');
+  hb_bool_t is_add = (name[strlen (name) - 1] == '+');
+  hb_set_t *drop_tables = hb_subset_input_set (subset_main->input, HB_SUBSET_SETS_DROP_TABLE_TAG);
+
+  if (!is_remove && !is_add) hb_set_clear (drop_tables);
+
+  if (0 == strcmp (arg, "*"))
+  {
+    hb_set_clear (drop_tables);
+    if (!is_remove)
+      hb_set_invert (drop_tables);
     return true;
   }
 
-  void finish (const font_options_t *font_opts)
+  char *s = strtok((char *) arg, ", ");
+  while (s)
   {
-    hb_face_t *face = hb_font_get_face (font);
+    if (strlen (s) > 4) // Table tags are at most 4 bytes.
+    {
+      g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
+                  "Failed parsing table tag at: '%s'", s);
+      return false;
+    }
 
-    hb_face_t *new_face = hb_subset (face, input);
-    hb_blob_t *result = hb_face_reference_blob (new_face);
+    hb_tag_t tag = hb_tag_from_string (s, strlen (s));
 
-    failed = !hb_blob_get_length (result);
-    if (!failed)
-      write_file (options.output_file, result);
+    if (!is_remove)
+      hb_set_add (drop_tables, tag);
+    else
+      hb_set_del (drop_tables, tag);
 
-    hb_subset_input_destroy (input);
-    hb_blob_destroy (result);
-    hb_face_destroy (new_face);
-    hb_font_destroy (font);
+    s = strtok(nullptr, ", ");
   }
 
-  public:
-  bool failed;
+  return true;
+}
 
-  private:
-  output_options_t options;
-  subset_options_t subset_options;
-  hb_font_t *font;
-  hb_subset_input_t *input;
-};
+template <GOptionArgFunc line_parser, bool allow_comments=true>
+static gboolean
+parse_file_for (const char *name,
+               const char *arg,
+               gpointer    data,
+               GError    **error)
+{
+  FILE *fp = nullptr;
+  if (0 != strcmp (arg, "-"))
+    fp = fopen (arg, "r");
+  else
+    fp = stdin;
+
+  if (!fp)
+  {
+    g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_FAILED,
+                "Failed opening file `%s': %s",
+                arg, strerror (errno));
+    return false;
+  }
+
+  GString *gs = g_string_new (nullptr);
+  do
+  {
+    g_string_set_size (gs, 0);
+    char buf[BUFSIZ];
+    while (fgets (buf, sizeof (buf), fp))
+    {
+      unsigned bytes = strlen (buf);
+      if (bytes && buf[bytes - 1] == '\n')
+      {
+       bytes--;
+       g_string_append_len (gs, buf, bytes);
+       break;
+      }
+      g_string_append_len (gs, buf, bytes);
+    }
+    if (ferror (fp))
+    {
+      g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_FAILED,
+                  "Failed reading file `%s': %s",
+                  arg, strerror (errno));
+      return false;
+    }
+    g_string_append_c (gs, '\0');
+
+    if (allow_comments)
+    {
+      char *comment = strchr (gs->str, '#');
+      if (comment)
+        *comment = '\0';
+    }
+
+    line_parser ("+", gs->str, data, error);
+
+    if (*error)
+      break;
+  }
+  while (!feof (fp));
+
+  g_string_free (gs, false);
+
+  return true;
+}
+
+gboolean
+subset_main_t::collect_face (const char *name,
+                            const char *arg,
+                            gpointer    data,
+                            GError    **error)
+{
+  face_options_t *thiz = (face_options_t *) data;
+
+  if (!thiz->font_file)
+  {
+    thiz->font_file = g_strdup (arg);
+    return true;
+  }
+
+  return true;
+}
+
+gboolean
+subset_main_t::collect_rest (const char *name,
+                            const char *arg,
+                            gpointer    data,
+                            GError    **error)
+{
+  subset_main_t *thiz = (subset_main_t *) data;
+
+  if (!thiz->font_file)
+  {
+    thiz->font_file = g_strdup (arg);
+    return true;
+  }
+
+  parse_text (name, arg, data, error);
+  return true;
+}
+
+void
+subset_main_t::add_options ()
+{
+  set_summary ("Subset fonts to specification.");
+
+  face_options_t::add_options (this);
+
+  GOptionEntry glyphset_entries[] =
+  {
+    {"gids",           0, 0, G_OPTION_ARG_CALLBACK, (gpointer) &parse_gids,
+     "Specify glyph IDs or ranges to include in the subset.\n"
+     "                                                       "
+     "Use --gids-=... to subtract codepoints from the current set.", "list of glyph indices/ranges or *"},
+    {"gids-",          0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_CALLBACK, (gpointer) &parse_gids,                 "Specify glyph IDs or ranges to remove from the subset", "list of glyph indices/ranges or *"},
+    {"gids+",          0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_CALLBACK, (gpointer) &parse_gids,                 "Specify glyph IDs or ranges to include in the subset", "list of glyph indices/ranges or *"},
+    {"gids-file",      0, 0, G_OPTION_ARG_CALLBACK, (gpointer) &parse_file_for<parse_gids>,    "Specify file to read glyph IDs or ranges from", "filename"},
+    {"glyphs",         0, 0, G_OPTION_ARG_CALLBACK, (gpointer) &parse_glyphs,                  "Specify glyph names to include in the subset. Use --glyphs-=... to subtract glyphs from the current set.", "list of glyph names or *"},
+    {"glyphs+",                0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_CALLBACK, (gpointer) &parse_glyphs,                       "Specify glyph names to include in the subset", "list of glyph names"},
+    {"glyphs-",                0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_CALLBACK, (gpointer) &parse_glyphs,                       "Specify glyph names to remove from the subset", "list of glyph names"},
+
+
+    {"glyphs-file",    0, 0, G_OPTION_ARG_CALLBACK, (gpointer) &parse_file_for<parse_glyphs>,  "Specify file to read glyph names from", "filename"},
+
+    {"text",           0, 0, G_OPTION_ARG_CALLBACK, (gpointer) &parse_text,                    "Specify text to include in the subset. Use --text-=... to subtract codepoints from the current set.", "string"},
+    {"text-",          0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_CALLBACK, (gpointer) &parse_text,                 "Specify text to remove from the subset", "string"},
+    {"text+",          0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_CALLBACK, (gpointer) &parse_text,                 "Specify text to include in the subset", "string"},
+
+
+    {"text-file",      0, 0, G_OPTION_ARG_CALLBACK, (gpointer) &parse_file_for<parse_text, false>,"Specify file to read text from", "filename"},
+    {"unicodes",       0, 0, G_OPTION_ARG_CALLBACK, (gpointer) &parse_unicodes,
+     "Specify Unicode codepoints or ranges to include in the subset. Use * to include all codepoints.\n"
+     "                                                       "
+     "--unicodes-=... can be used to subtract codepoints from the current set.\n"
+     "                                                       "
+     "For example: --unicodes=* --unicodes-=41,42,43 would create a subset with all codepoints\n"
+     "                                                       "
+     "except for 41, 42, 43.",
+     "list of hex numbers/ranges or *"},
+    {"unicodes-",      0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_CALLBACK, (gpointer) &parse_unicodes, "Specify Unicode codepoints or ranges to remove from the subset", "list of hex numbers/ranges or *"},
+    {"unicodes+",      0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_CALLBACK, (gpointer) &parse_unicodes, "Specify Unicode codepoints or ranges to include in the subset", "list of hex numbers/ranges or *"},
+
+    {"unicodes-file",  0, 0, G_OPTION_ARG_CALLBACK, (gpointer) &parse_file_for<parse_unicodes>,"Specify file to read Unicode codepoints or ranges from", "filename"},
+    {nullptr}
+  };
+  add_group (glyphset_entries,
+            "subset-glyphset",
+            "Subset glyph-set option:",
+            "Subsetting glyph-set options",
+            this);
+
+  GOptionEntry other_entries[] =
+  {
+    {"name-IDs",       0, 0, G_OPTION_ARG_CALLBACK, (gpointer) &parse_nameids,         "Subset specified nameids. Use --name-IDs-=... to substract from the current set.", "list of int numbers or *"},
+    {"name-IDs-",      0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_CALLBACK, (gpointer) &parse_nameids,              "Subset specified nameids", "list of int numbers or *"},
+    {"name-IDs+",      0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_CALLBACK, (gpointer) &parse_nameids,              "Subset specified nameids", "list of int numbers or *"},
+    {"name-languages", 0, 0, G_OPTION_ARG_CALLBACK, (gpointer) &parse_name_languages,  "Subset nameRecords with specified language IDs. Use --name-languages-=... to substract from the current set.", "list of int numbers or *"},
+    {"name-languages-",        0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_CALLBACK, (gpointer) &parse_name_languages,       "Subset nameRecords with specified language IDs", "list of int numbers or *"},
+    {"name-languages+",        0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_CALLBACK, (gpointer) &parse_name_languages,       "Subset nameRecords with specified language IDs", "list of int numbers or *"},
+    {"layout-features",        0, 0, G_OPTION_ARG_CALLBACK, (gpointer) &parse_layout_features, "Specify set of layout feature tags that will be preserved. Use --layout-features-=... to substract from the current set.", "list of string table tags or *"},
+    {"layout-features+",0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_CALLBACK, (gpointer) &parse_layout_features,     "Specify set of layout feature tags that will be preserved", "list of string table tags or *"},
+    {"layout-features-",0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_CALLBACK, (gpointer) &parse_layout_features,     "Specify set of layout feature tags that will be preserved", "list of string table tags or *"},
+    {"drop-tables",    0, 0, G_OPTION_ARG_CALLBACK, (gpointer) &parse_drop_tables,     "Drop the specified tables. Use --drop-tables-=... to substract from the current set.", "list of string table tags or *"},
+    {"drop-tables+",   0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_CALLBACK, (gpointer) &parse_drop_tables,  "Drop the specified tables.", "list of string table tags or *"},
+    {"drop-tables-",   0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_CALLBACK, (gpointer) &parse_drop_tables,  "Drop the specified tables.", "list of string table tags or *"},
+    {nullptr}
+  };
+  add_group (other_entries,
+            "subset-other",
+            "Subset other option:",
+            "Subsetting other options",
+            this);
+
+  GOptionEntry flag_entries[] =
+  {
+    {"no-hinting",             0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, (gpointer) &set_flag<HB_SUBSET_FLAGS_NO_HINTING>,               "Whether to drop hints", nullptr},
+    {"retain-gids",            0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, (gpointer) &set_flag<HB_SUBSET_FLAGS_RETAIN_GIDS>,              "If set don't renumber glyph ids in the subset.", nullptr},
+    {"desubroutinize",         0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, (gpointer) &set_flag<HB_SUBSET_FLAGS_DESUBROUTINIZE>,           "Remove CFF/CFF2 use of subroutines", nullptr},
+    {"name-legacy",            0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, (gpointer) &set_flag<HB_SUBSET_FLAGS_NAME_LEGACY>,              "Keep legacy (non-Unicode) 'name' table entries", nullptr},
+    {"set-overlaps-flag",      0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, (gpointer) &set_flag<HB_SUBSET_FLAGS_SET_OVERLAPS_FLAG>,        "Set the overlaps flag on each glyph.", nullptr},
+    {"notdef-outline",         0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, (gpointer) &set_flag<HB_SUBSET_FLAGS_NOTDEF_OUTLINE>,           "Keep the outline of \'.notdef\' glyph", nullptr},
+    {"no-prune-unicode-ranges",        0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, (gpointer) &set_flag<HB_SUBSET_FLAGS_NO_PRUNE_UNICODE_RANGES>,  "Don't change the 'OS/2 ulUnicodeRange*' bits.", nullptr},
+    {"glyph-names",            0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, (gpointer) &set_flag<HB_SUBSET_FLAGS_GLYPH_NAMES>,              "Keep PS glyph names in TT-flavored fonts. ", nullptr},
+    {nullptr}
+  };
+  add_group (flag_entries,
+            "subset-flags",
+            "Subset boolean option:",
+            "Subsetting boolean options",
+            this);
+
+  GOptionEntry app_entries[] =
+  {
+    {"num-iterations", 'n', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_INT,
+     &this->num_iterations,
+     "Run subsetter N times (default: 1)", "N"},
+    {nullptr}
+  };
+  add_group (app_entries,
+            "subset-app",
+            "Subset app option:",
+            "Subsetting application options",
+            this);
+
+  output_options_t::add_options (this);
+
+  GOptionEntry entries[] =
+  {
+    {G_OPTION_REMAINING,       0, G_OPTION_FLAG_IN_MAIN,
+                             G_OPTION_ARG_CALLBACK,    (gpointer) &collect_rest,       nullptr,        "[FONT-FILE] [TEXT]"},
+    {nullptr}
+  };
+  add_main_group (entries, this);
+  option_parser_t::add_options ();
+}
 
 int
 main (int argc, char **argv)
 {
-  main_font_text_t<subset_consumer_t, 10, 0> driver;
-  return driver.main (argc, argv);
+  return batch_main<subset_main_t, true> (argc, argv);
 }
index 69a4c95..82761fb 100644 (file)
  * Google Author(s): Behdad Esfahbod
  */
 
+#include "batch.hh"
+#include "font-options.hh"
 #include "main-font-text.hh"
 #include "shape-consumer.hh"
+#include "text-options.hh"
 #include "view-cairo.hh"
 
-#define DEFAULT_FONT_SIZE 256
-#define SUBPIXEL_BITS 6
+const unsigned DEFAULT_FONT_SIZE = 256;
+const unsigned SUBPIXEL_BITS = 6;
 
 int
 main (int argc, char **argv)
 {
-  main_font_text_t<shape_consumer_t<view_cairo_t>, DEFAULT_FONT_SIZE, SUBPIXEL_BITS> driver;
-  return driver.main (argc, argv);
+  using main_t = main_font_text_t<shape_consumer_t<view_cairo_t>, font_options_t, shape_text_options_t>;
+  return batch_main<main_t> (argc, argv);
 }
diff --git a/util/helper-cairo-ansi.cc b/util/helper-cairo-ansi.cc
deleted file mode 100644 (file)
index cbda493..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright © 2012  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
- */
-
-#include "helper-cairo-ansi.hh"
-#include "options.hh"
-
-#include "ansi-print.hh"
-
-
-cairo_status_t
-helper_cairo_surface_write_to_ansi_stream (cairo_surface_t     *surface,
-                                          cairo_write_func_t   write_func,
-                                          void                 *closure)
-{
-  unsigned int width = cairo_image_surface_get_width (surface);
-  unsigned int height = cairo_image_surface_get_height (surface);
-  if (cairo_image_surface_get_format (surface) != CAIRO_FORMAT_RGB24) {
-    cairo_surface_t *new_surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, width, height);
-    cairo_t *cr = cairo_create (new_surface);
-    if (cairo_image_surface_get_format (surface) == CAIRO_FORMAT_A8) {
-      cairo_set_source_rgb (cr, 0., 0., 0.);
-      cairo_paint (cr);
-      cairo_set_source_rgb (cr, 1., 1., 1.);
-      cairo_mask_surface (cr, surface, 0, 0);
-    } else {
-      cairo_set_source_rgb (cr, 1., 1., 1.);
-      cairo_paint (cr);
-      cairo_set_source_surface (cr, surface, 0, 0);
-      cairo_paint (cr);
-    }
-    cairo_destroy (cr);
-    surface = new_surface;
-  } else
-    cairo_surface_reference (surface);
-
-  unsigned int stride = cairo_image_surface_get_stride (surface);
-  const uint32_t *data = (uint32_t *) (void *) cairo_image_surface_get_data (surface);
-
-  /* We don't have rows to spare on the terminal window...
-   * Find the tight image top/bottom and only print in between. */
-
-  /* Use corner color as background color. */
-  uint32_t bg_color = data ? * (uint32_t *) data : 0;
-
-  /* Drop first row while empty */
-  while (height)
-  {
-    unsigned int i;
-    for (i = 0; i < width; i++)
-      if (data[i] != bg_color)
-       break;
-    if (i < width)
-      break;
-    data += stride / 4;
-    height--;
-  }
-
-  /* Drop last row while empty */
-  unsigned int orig_height = height;
-  while (height)
-  {
-    const uint32_t *row = data + (height - 1) * stride / 4;
-    unsigned int i;
-    for (i = 0; i < width; i++)
-      if (row[i] != bg_color)
-       break;
-    if (i < width)
-      break;
-    height--;
-  }
-  if (height < orig_height)
-    height++; /* Add one last blank row for padding. */
-
-  if (width && height)
-    ansi_print_image_rgb24 (data, width, height, stride / 4);
-
-  cairo_surface_destroy (surface);
-  return CAIRO_STATUS_SUCCESS;
-}
index bc23132..8c8a1ee 100644 (file)
 
 #include <cairo.h>
 
-cairo_status_t
+#include "ansi-print.hh"
+
+#ifdef HAVE_CHAFA
+# include <chafa.h>
+
+/* Similar to ansi-print.cc */
+# define CELL_W 8
+# define CELL_H (2 * CELL_W)
+
+static void
+chafa_print_image_rgb24 (const void *data, int width, int height, int stride)
+{
+  ChafaTermInfo *term_info;
+  ChafaSymbolMap *symbol_map;
+  ChafaCanvasConfig *config;
+  ChafaCanvas *canvas;
+  GString *gs;
+  unsigned int cols = (width +  CELL_W - 1) / CELL_W;
+  unsigned int rows = (height + CELL_H - 1) / CELL_H;
+  gchar **environ;
+  ChafaCanvasMode mode;
+  ChafaPixelMode pixel_mode;
+
+  /* Adapt to terminal; use sixels if available, and fall back to symbols
+   * with as many colors as are supported */
+
+  environ = g_get_environ ();
+  term_info = chafa_term_db_detect (chafa_term_db_get_default (),
+                                    environ);
+
+  pixel_mode = CHAFA_PIXEL_MODE_SYMBOLS;
+
+  if (chafa_term_info_have_seq (term_info, CHAFA_TERM_SEQ_BEGIN_SIXELS))
+  {
+    pixel_mode = CHAFA_PIXEL_MODE_SIXELS;
+    mode = CHAFA_CANVAS_MODE_TRUECOLOR;
+  }
+//  else if (chafa_term_info_have_seq (term_info, CHAFA_TERM_SEQ_SET_COLOR_FGBG_DIRECT))
+//    mode = CHAFA_CANVAS_MODE_TRUECOLOR;
+  else if (chafa_term_info_have_seq (term_info, CHAFA_TERM_SEQ_SET_COLOR_FGBG_256))
+    mode = CHAFA_CANVAS_MODE_INDEXED_240;
+  else if (chafa_term_info_have_seq (term_info, CHAFA_TERM_SEQ_SET_COLOR_FGBG_16))
+    mode = CHAFA_CANVAS_MODE_INDEXED_16;
+  else if (chafa_term_info_have_seq (term_info, CHAFA_TERM_SEQ_INVERT_COLORS))
+    mode = CHAFA_CANVAS_MODE_FGBG_BGFG;
+  else
+    mode = CHAFA_CANVAS_MODE_FGBG;
+
+  /* Create the configuration */
+
+  symbol_map = chafa_symbol_map_new ();
+  chafa_symbol_map_add_by_tags (symbol_map,
+                                (ChafaSymbolTags) (CHAFA_SYMBOL_TAG_BLOCK
+                                                   | CHAFA_SYMBOL_TAG_SPACE));
+
+  config = chafa_canvas_config_new ();
+  chafa_canvas_config_set_canvas_mode (config, mode);
+  chafa_canvas_config_set_pixel_mode (config, pixel_mode);
+  chafa_canvas_config_set_cell_geometry (config, 10, 20);
+  chafa_canvas_config_set_geometry (config, cols, rows);
+  chafa_canvas_config_set_symbol_map (config, symbol_map);
+  chafa_canvas_config_set_color_extractor (config, CHAFA_COLOR_EXTRACTOR_MEDIAN);
+  chafa_canvas_config_set_work_factor (config, 1.0f);
+
+  /* Create canvas, draw to it and render output string */
+
+  canvas = chafa_canvas_new (config);
+  chafa_canvas_draw_all_pixels (canvas,
+                                /* Cairo byte order is host native */
+                                G_BYTE_ORDER == G_LITTLE_ENDIAN
+                                  ? CHAFA_PIXEL_BGRA8_PREMULTIPLIED
+                                  : CHAFA_PIXEL_ARGB8_PREMULTIPLIED,
+                                (const guint8 *) data,
+                                width,
+                                height,
+                                stride);
+  gs = chafa_canvas_print (canvas, term_info);
+
+  /* Print the string */
+
+  fwrite (gs->str, sizeof (char), gs->len, stdout);
+
+  if (pixel_mode != CHAFA_PIXEL_MODE_SIXELS)
+    fputc ('\n', stdout);
+
+  /* Free resources */
+
+  g_string_free (gs, TRUE);
+  chafa_canvas_unref (canvas);
+  chafa_canvas_config_unref (config);
+  chafa_symbol_map_unref (symbol_map);
+  chafa_term_info_unref (term_info);
+  g_strfreev (environ);
+}
+
+#endif /* HAVE_CHAFA */
+
+static inline cairo_status_t
 helper_cairo_surface_write_to_ansi_stream (cairo_surface_t     *surface,
                                           cairo_write_func_t   write_func,
-                                          void                 *closure);
+                                          void                 *closure)
+{
+  unsigned int width = cairo_image_surface_get_width (surface);
+  unsigned int height = cairo_image_surface_get_height (surface);
+  if (cairo_image_surface_get_format (surface) != CAIRO_FORMAT_RGB24) {
+    cairo_surface_t *new_surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, width, height);
+    cairo_t *cr = cairo_create (new_surface);
+    if (cairo_image_surface_get_format (surface) == CAIRO_FORMAT_A8) {
+      cairo_set_source_rgb (cr, 0., 0., 0.);
+      cairo_paint (cr);
+      cairo_set_source_rgb (cr, 1., 1., 1.);
+      cairo_mask_surface (cr, surface, 0, 0);
+    } else {
+      cairo_set_source_rgb (cr, 1., 1., 1.);
+      cairo_paint (cr);
+      cairo_set_source_surface (cr, surface, 0, 0);
+      cairo_paint (cr);
+    }
+    cairo_destroy (cr);
+    surface = new_surface;
+  } else
+    cairo_surface_reference (surface);
+
+  unsigned int stride = cairo_image_surface_get_stride (surface);
+  const uint32_t *data = (uint32_t *) (void *) cairo_image_surface_get_data (surface);
+
+  /* We don't have rows to spare on the terminal window...
+   * Find the tight image top/bottom and only print in between. */
+
+  /* Use corner color as background color. */
+  uint32_t bg_color = data ? * (uint32_t *) data : 0;
+
+  /* Drop first row while empty */
+  while (height)
+  {
+    unsigned int i;
+    for (i = 0; i < width; i++)
+      if (data[i] != bg_color)
+       break;
+    if (i < width)
+      break;
+    data += stride / 4;
+    height--;
+  }
+
+  /* Drop last row while empty */
+  unsigned int orig_height = height;
+  while (height)
+  {
+    const uint32_t *row = data + (height - 1) * stride / 4;
+    unsigned int i;
+    for (i = 0; i < width; i++)
+      if (row[i] != bg_color)
+       break;
+    if (i < width)
+      break;
+    height--;
+  }
+  if (height < orig_height)
+    height++; /* Add one last blank row for padding. */
+
+  if (width && height)
+  {
+#ifdef HAVE_CHAFA
+    if (true)
+      chafa_print_image_rgb24 (data, width, height, stride);
+    else
+#endif
+      ansi_print_image_rgb24 (data, width, height, stride / 4);
+  }
+
+  cairo_surface_destroy (surface);
+  return CAIRO_STATUS_SUCCESS;
+}
 
 
 #endif
diff --git a/util/helper-cairo.cc b/util/helper-cairo.cc
deleted file mode 100644 (file)
index 42cce71..0000000
+++ /dev/null
@@ -1,561 +0,0 @@
-/*
- * Copyright © 2011  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
- */
-
-#include "helper-cairo.hh"
-
-#include <cairo-ft.h>
-#include <hb-ft.h>
-#include FT_MULTIPLE_MASTERS_H
-
-#include "helper-cairo-ansi.hh"
-#ifdef CAIRO_HAS_SVG_SURFACE
-#  include <cairo-svg.h>
-#endif
-#ifdef CAIRO_HAS_PDF_SURFACE
-#  include <cairo-pdf.h>
-#endif
-#ifdef CAIRO_HAS_PS_SURFACE
-#  include <cairo-ps.h>
-#  if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1,6,0)
-#    define HAS_EPS 1
-
-static cairo_surface_t *
-_cairo_eps_surface_create_for_stream (cairo_write_func_t  write_func,
-                                     void               *closure,
-                                     double              width,
-                                     double              height)
-{
-  cairo_surface_t *surface;
-
-  surface = cairo_ps_surface_create_for_stream (write_func, closure, width, height);
-  cairo_ps_surface_set_eps (surface, true);
-
-  return surface;
-}
-
-#  else
-#    undef HAS_EPS
-#  endif
-#endif
-
-
-static FT_Library ft_library;
-
-#ifdef HAVE_ATEXIT
-static inline
-void free_ft_library ()
-{
-  FT_Done_FreeType (ft_library);
-}
-#endif
-
-cairo_scaled_font_t *
-helper_cairo_create_scaled_font (const font_options_t *font_opts)
-{
-  hb_font_t *font = hb_font_reference (font_opts->get_font ());
-
-  cairo_font_face_t *cairo_face;
-  /* We cannot use the FT_Face from hb_font_t, as doing so will confuse hb_font_t because
-   * cairo will reset the face size.  As such, create new face...
-   * TODO Perhaps add API to hb-ft to encapsulate this code. */
-  FT_Face ft_face = nullptr;//hb_ft_font_get_face (font);
-  if (!ft_face)
-  {
-    if (!ft_library)
-    {
-      FT_Init_FreeType (&ft_library);
-#ifdef HAVE_ATEXIT
-      atexit (free_ft_library);
-#endif
-    }
-
-    unsigned int blob_length;
-    const char *blob_data = hb_blob_get_data (font_opts->blob, &blob_length);
-
-    if (FT_New_Memory_Face (ft_library,
-                           (const FT_Byte *) blob_data,
-                           blob_length,
-                           font_opts->face_index,
-                           &ft_face))
-      fail (false, "FT_New_Memory_Face fail");
-  }
-  if (!ft_face)
-  {
-    /* This allows us to get some boxes at least... */
-    cairo_face = cairo_toy_font_face_create ("@cairo:sans",
-                                            CAIRO_FONT_SLANT_NORMAL,
-                                            CAIRO_FONT_WEIGHT_NORMAL);
-  }
-  else
-  {
-#ifdef HAVE_FT_SET_VAR_BLEND_COORDINATES
-    unsigned int num_coords;
-    const int *coords = hb_font_get_var_coords_normalized (font, &num_coords);
-    if (num_coords)
-    {
-      FT_Fixed *ft_coords = (FT_Fixed *) calloc (num_coords, sizeof (FT_Fixed));
-      if (ft_coords)
-      {
-       for (unsigned int i = 0; i < num_coords; i++)
-         ft_coords[i] = coords[i] << 2;
-       FT_Set_Var_Blend_Coordinates (ft_face, num_coords, ft_coords);
-       free (ft_coords);
-      }
-    }
-#endif
-
-    cairo_face = cairo_ft_font_face_create_for_ft_face (ft_face, font_opts->ft_load_flags);
-  }
-  cairo_matrix_t ctm, font_matrix;
-  cairo_font_options_t *font_options;
-
-  cairo_matrix_init_identity (&ctm);
-  cairo_matrix_init_scale (&font_matrix,
-                          font_opts->font_size_x,
-                          font_opts->font_size_y);
-  font_options = cairo_font_options_create ();
-  cairo_font_options_set_hint_style (font_options, CAIRO_HINT_STYLE_NONE);
-  cairo_font_options_set_hint_metrics (font_options, CAIRO_HINT_METRICS_OFF);
-
-  cairo_scaled_font_t *scaled_font = cairo_scaled_font_create (cairo_face,
-                                                              &font_matrix,
-                                                              &ctm,
-                                                              font_options);
-
-  cairo_font_options_destroy (font_options);
-  cairo_font_face_destroy (cairo_face);
-
-  static cairo_user_data_key_t key;
-  if (cairo_scaled_font_set_user_data (scaled_font,
-                                      &key,
-                                      (void *) font,
-                                      (cairo_destroy_func_t) hb_font_destroy))
-    hb_font_destroy (font);
-
-  return scaled_font;
-}
-
-bool
-helper_cairo_scaled_font_has_color (cairo_scaled_font_t *scaled_font)
-{
-  bool ret = false;
-#ifdef FT_HAS_COLOR
-  FT_Face ft_face = cairo_ft_scaled_font_lock_face (scaled_font);
-  if (ft_face)
-  {
-    if (FT_HAS_COLOR (ft_face))
-      ret = true;
-    cairo_ft_scaled_font_unlock_face (scaled_font);
-  }
-#endif
-  return ret;
-}
-
-
-struct finalize_closure_t {
-  void (*callback)(finalize_closure_t *);
-  cairo_surface_t *surface;
-  cairo_write_func_t write_func;
-  void *closure;
-};
-static cairo_user_data_key_t finalize_closure_key;
-
-
-static void
-finalize_ansi (finalize_closure_t *closure)
-{
-  cairo_status_t status;
-  status = helper_cairo_surface_write_to_ansi_stream (closure->surface,
-                                                     closure->write_func,
-                                                     closure->closure);
-  if (status != CAIRO_STATUS_SUCCESS)
-    fail (false, "Failed to write output: %s",
-         cairo_status_to_string (status));
-}
-
-static cairo_surface_t *
-_cairo_ansi_surface_create_for_stream (cairo_write_func_t write_func,
-                                      void *closure,
-                                      double width,
-                                      double height,
-                                      cairo_content_t content)
-{
-  cairo_surface_t *surface;
-  int w = ceil (width);
-  int h = ceil (height);
-
-  switch (content) {
-    case CAIRO_CONTENT_ALPHA:
-      surface = cairo_image_surface_create (CAIRO_FORMAT_A8, w, h);
-      break;
-    default:
-    case CAIRO_CONTENT_COLOR:
-      surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, w, h);
-      break;
-    case CAIRO_CONTENT_COLOR_ALPHA:
-      surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, w, h);
-      break;
-  }
-  cairo_status_t status = cairo_surface_status (surface);
-  if (status != CAIRO_STATUS_SUCCESS)
-    fail (false, "Failed to create cairo surface: %s",
-         cairo_status_to_string (status));
-
-  finalize_closure_t *ansi_closure = g_new0 (finalize_closure_t, 1);
-  ansi_closure->callback = finalize_ansi;
-  ansi_closure->surface = surface;
-  ansi_closure->write_func = write_func;
-  ansi_closure->closure = closure;
-
-  if (cairo_surface_set_user_data (surface,
-                                  &finalize_closure_key,
-                                  (void *) ansi_closure,
-                                  (cairo_destroy_func_t) g_free))
-    g_free ((void *) closure);
-
-  return surface;
-}
-
-
-#ifdef CAIRO_HAS_PNG_FUNCTIONS
-
-static void
-finalize_png (finalize_closure_t *closure)
-{
-  cairo_status_t status;
-  status = cairo_surface_write_to_png_stream (closure->surface,
-                                             closure->write_func,
-                                             closure->closure);
-  if (status != CAIRO_STATUS_SUCCESS)
-    fail (false, "Failed to write output: %s",
-         cairo_status_to_string (status));
-}
-
-static cairo_surface_t *
-_cairo_png_surface_create_for_stream (cairo_write_func_t write_func,
-                                     void *closure,
-                                     double width,
-                                     double height,
-                                     cairo_content_t content)
-{
-  cairo_surface_t *surface;
-  int w = ceil (width);
-  int h = ceil (height);
-
-  switch (content) {
-    case CAIRO_CONTENT_ALPHA:
-      surface = cairo_image_surface_create (CAIRO_FORMAT_A8, w, h);
-      break;
-    default:
-    case CAIRO_CONTENT_COLOR:
-      surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, w, h);
-      break;
-    case CAIRO_CONTENT_COLOR_ALPHA:
-      surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, w, h);
-      break;
-  }
-  cairo_status_t status = cairo_surface_status (surface);
-  if (status != CAIRO_STATUS_SUCCESS)
-    fail (false, "Failed to create cairo surface: %s",
-         cairo_status_to_string (status));
-
-  finalize_closure_t *png_closure = g_new0 (finalize_closure_t, 1);
-  png_closure->callback = finalize_png;
-  png_closure->surface = surface;
-  png_closure->write_func = write_func;
-  png_closure->closure = closure;
-
-  if (cairo_surface_set_user_data (surface,
-                                  &finalize_closure_key,
-                                  (void *) png_closure,
-                                  (cairo_destroy_func_t) g_free))
-    g_free ((void *) closure);
-
-  return surface;
-}
-
-#endif
-
-static cairo_status_t
-stdio_write_func (void                *closure,
-                 const unsigned char *data,
-                 unsigned int         size)
-{
-  FILE *fp = (FILE *) closure;
-
-  while (size) {
-    size_t ret = fwrite (data, 1, size, fp);
-    size -= ret;
-    data += ret;
-    if (size && ferror (fp))
-      fail (false, "Failed to write output: %s", strerror (errno));
-  }
-
-  return CAIRO_STATUS_SUCCESS;
-}
-
-const char *helper_cairo_supported_formats[] =
-{
-  "ansi",
-  #ifdef CAIRO_HAS_PNG_FUNCTIONS
-  "png",
-  #endif
-  #ifdef CAIRO_HAS_SVG_SURFACE
-  "svg",
-  #endif
-  #ifdef CAIRO_HAS_PDF_SURFACE
-  "pdf",
-  #endif
-  #ifdef CAIRO_HAS_PS_SURFACE
-  "ps",
-   #ifdef HAS_EPS
-    "eps",
-   #endif
-  #endif
-  nullptr
-};
-
-cairo_t *
-helper_cairo_create_context (double w, double h,
-                            view_options_t *view_opts,
-                            output_options_t *out_opts,
-                            cairo_content_t content)
-{
-  cairo_surface_t *(*constructor) (cairo_write_func_t write_func,
-                                  void *closure,
-                                  double width,
-                                  double height) = nullptr;
-  cairo_surface_t *(*constructor2) (cairo_write_func_t write_func,
-                                   void *closure,
-                                   double width,
-                                   double height,
-                                   cairo_content_t content) = nullptr;
-
-  const char *extension = out_opts->output_format;
-  if (!extension) {
-#if HAVE_ISATTY
-    if (isatty (fileno (out_opts->get_file_handle ())))
-      extension = "ansi";
-    else
-#endif
-    {
-#ifdef CAIRO_HAS_PNG_FUNCTIONS
-      extension = "png";
-#else
-      extension = "ansi";
-#endif
-    }
-  }
-  if (0)
-    ;
-    else if (0 == g_ascii_strcasecmp (extension, "ansi"))
-      constructor2 = _cairo_ansi_surface_create_for_stream;
-  #ifdef CAIRO_HAS_PNG_FUNCTIONS
-    else if (0 == g_ascii_strcasecmp (extension, "png"))
-      constructor2 = _cairo_png_surface_create_for_stream;
-  #endif
-  #ifdef CAIRO_HAS_SVG_SURFACE
-    else if (0 == g_ascii_strcasecmp (extension, "svg"))
-      constructor = cairo_svg_surface_create_for_stream;
-  #endif
-  #ifdef CAIRO_HAS_PDF_SURFACE
-    else if (0 == g_ascii_strcasecmp (extension, "pdf"))
-      constructor = cairo_pdf_surface_create_for_stream;
-  #endif
-  #ifdef CAIRO_HAS_PS_SURFACE
-    else if (0 == g_ascii_strcasecmp (extension, "ps"))
-      constructor = cairo_ps_surface_create_for_stream;
-   #ifdef HAS_EPS
-    else if (0 == g_ascii_strcasecmp (extension, "eps"))
-      constructor = _cairo_eps_surface_create_for_stream;
-   #endif
-  #endif
-
-
-  unsigned int fr, fg, fb, fa, br, bg, bb, ba;
-  const char *color;
-  br = bg = bb = 0; ba = 255;
-  color = view_opts->back ? view_opts->back : DEFAULT_BACK;
-  sscanf (color + (*color=='#'), "%2x%2x%2x%2x", &br, &bg, &bb, &ba);
-  fr = fg = fb = 0; fa = 255;
-  color = view_opts->fore ? view_opts->fore : DEFAULT_FORE;
-  sscanf (color + (*color=='#'), "%2x%2x%2x%2x", &fr, &fg, &fb, &fa);
-
-  if (content == CAIRO_CONTENT_ALPHA)
-  {
-    if (view_opts->annotate ||
-       br != bg || bg != bb ||
-       fr != fg || fg != fb)
-      content = CAIRO_CONTENT_COLOR;
-  }
-  if (ba != 255)
-    content = CAIRO_CONTENT_COLOR_ALPHA;
-
-  cairo_surface_t *surface;
-  FILE *f = out_opts->get_file_handle ();
-  if (constructor)
-    surface = constructor (stdio_write_func, f, w, h);
-  else if (constructor2)
-    surface = constructor2 (stdio_write_func, f, w, h, content);
-  else
-    fail (false, "Unknown output format `%s'; supported formats are: %s%s",
-         extension,
-         g_strjoinv ("/", const_cast<char**> (helper_cairo_supported_formats)),
-         out_opts->explicit_output_format ? "" :
-         "\nTry setting format using --output-format");
-
-  cairo_t *cr = cairo_create (surface);
-  content = cairo_surface_get_content (surface);
-
-  switch (content) {
-    case CAIRO_CONTENT_ALPHA:
-      cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
-      cairo_set_source_rgba (cr, 1., 1., 1., br / 255.);
-      cairo_paint (cr);
-      cairo_set_source_rgba (cr, 1., 1., 1.,
-                            (fr / 255.) * (fa / 255.) + (br / 255) * (1 - (fa / 255.)));
-      break;
-    default:
-    case CAIRO_CONTENT_COLOR:
-    case CAIRO_CONTENT_COLOR_ALPHA:
-      cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
-      cairo_set_source_rgba (cr, br / 255., bg / 255., bb / 255., ba / 255.);
-      cairo_paint (cr);
-      cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
-      cairo_set_source_rgba (cr, fr / 255., fg / 255., fb / 255., fa / 255.);
-      break;
-  }
-
-  cairo_surface_destroy (surface);
-  return cr;
-}
-
-void
-helper_cairo_destroy_context (cairo_t *cr)
-{
-  finalize_closure_t *closure = (finalize_closure_t *)
-                               cairo_surface_get_user_data (cairo_get_target (cr),
-                                                            &finalize_closure_key);
-  if (closure)
-    closure->callback (closure);
-
-  cairo_status_t status = cairo_status (cr);
-  if (status != CAIRO_STATUS_SUCCESS)
-    fail (false, "Failed: %s",
-         cairo_status_to_string (status));
-  cairo_destroy (cr);
-}
-
-
-void
-helper_cairo_line_from_buffer (helper_cairo_line_t *l,
-                              hb_buffer_t         *buffer,
-                              const char          *text,
-                              unsigned int         text_len,
-                              int                  scale_bits,
-                              hb_bool_t            utf8_clusters)
-{
-  memset (l, 0, sizeof (*l));
-
-  l->num_glyphs = hb_buffer_get_length (buffer);
-  hb_glyph_info_t *hb_glyph = hb_buffer_get_glyph_infos (buffer, nullptr);
-  hb_glyph_position_t *hb_position = hb_buffer_get_glyph_positions (buffer, nullptr);
-  l->glyphs = cairo_glyph_allocate (l->num_glyphs + 1);
-
-  if (text) {
-    l->utf8 = g_strndup (text, text_len);
-    l->utf8_len = text_len;
-    l->num_clusters = l->num_glyphs ? 1 : 0;
-    for (unsigned int i = 1; i < l->num_glyphs; i++)
-      if (hb_glyph[i].cluster != hb_glyph[i-1].cluster)
-       l->num_clusters++;
-    l->clusters = cairo_text_cluster_allocate (l->num_clusters);
-  }
-
-  if ((l->num_glyphs && !l->glyphs) ||
-      (l->utf8_len && !l->utf8) ||
-      (l->num_clusters && !l->clusters))
-  {
-    l->finish ();
-    return;
-  }
-
-  hb_position_t x = 0, y = 0;
-  int i;
-  for (i = 0; i < (int) l->num_glyphs; i++)
-  {
-    l->glyphs[i].index = hb_glyph[i].codepoint;
-    l->glyphs[i].x = scalbn ((double)  hb_position->x_offset + x, scale_bits);
-    l->glyphs[i].y = scalbn ((double) -hb_position->y_offset + y, scale_bits);
-    x +=  hb_position->x_advance;
-    y += -hb_position->y_advance;
-
-    hb_position++;
-  }
-  l->glyphs[i].index = -1;
-  l->glyphs[i].x = scalbn ((double) x, scale_bits);
-  l->glyphs[i].y = scalbn ((double) y, scale_bits);
-
-  if (l->num_clusters) {
-    memset ((void *) l->clusters, 0, l->num_clusters * sizeof (l->clusters[0]));
-    hb_bool_t backward = HB_DIRECTION_IS_BACKWARD (hb_buffer_get_direction (buffer));
-    l->cluster_flags = backward ? CAIRO_TEXT_CLUSTER_FLAG_BACKWARD : (cairo_text_cluster_flags_t) 0;
-    unsigned int cluster = 0;
-    const char *start = l->utf8, *end;
-    l->clusters[cluster].num_glyphs++;
-    if (backward) {
-      for (i = l->num_glyphs - 2; i >= 0; i--) {
-       if (hb_glyph[i].cluster != hb_glyph[i+1].cluster) {
-         g_assert (hb_glyph[i].cluster > hb_glyph[i+1].cluster);
-         if (utf8_clusters)
-           end = start + hb_glyph[i].cluster - hb_glyph[i+1].cluster;
-         else
-           end = g_utf8_offset_to_pointer (start, hb_glyph[i].cluster - hb_glyph[i+1].cluster);
-         l->clusters[cluster].num_bytes = end - start;
-         start = end;
-         cluster++;
-       }
-       l->clusters[cluster].num_glyphs++;
-      }
-      l->clusters[cluster].num_bytes = l->utf8 + text_len - start;
-    } else {
-      for (i = 1; i < (int) l->num_glyphs; i++) {
-       if (hb_glyph[i].cluster != hb_glyph[i-1].cluster) {
-         g_assert (hb_glyph[i].cluster > hb_glyph[i-1].cluster);
-         if (utf8_clusters)
-           end = start + hb_glyph[i].cluster - hb_glyph[i-1].cluster;
-         else
-           end = g_utf8_offset_to_pointer (start, hb_glyph[i].cluster - hb_glyph[i-1].cluster);
-         l->clusters[cluster].num_bytes = end - start;
-         start = end;
-         cluster++;
-       }
-       l->clusters[cluster].num_glyphs++;
-      }
-      l->clusters[cluster].num_bytes = l->utf8 + text_len - start;
-    }
-  }
-}
index 5bfbf7b..b8d4612 100644 (file)
 #ifndef HELPER_CAIRO_HH
 #define HELPER_CAIRO_HH
 
-#include "hb.hh"
-#include "options.hh"
+#include "view-options.hh"
+#include "output-options.hh"
 
-#include <cairo.h>
+#include <cairo-ft.h>
+#include <hb-ft.h>
+#include FT_MULTIPLE_MASTERS_H
 
+#include "helper-cairo-ansi.hh"
+#ifdef CAIRO_HAS_SVG_SURFACE
+#  include <cairo-svg.h>
+#endif
+#ifdef CAIRO_HAS_PDF_SURFACE
+#  include <cairo-pdf.h>
+#endif
+#ifdef CAIRO_HAS_PS_SURFACE
+#  include <cairo-ps.h>
+#  if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1,6,0)
+#    define HAS_EPS 1
+
+static cairo_surface_t *
+_cairo_eps_surface_create_for_stream (cairo_write_func_t  write_func,
+                                     void               *closure,
+                                     double              width,
+                                     double              height)
+{
+  cairo_surface_t *surface;
+
+  surface = cairo_ps_surface_create_for_stream (write_func, closure, width, height);
+  cairo_ps_surface_set_eps (surface, true);
+
+  return surface;
+}
+
+#  else
+#    undef HAS_EPS
+#  endif
+#endif
+
+
+static FT_Library ft_library;
+
+#ifdef HAVE_ATEXIT
+static inline
+void free_ft_library ()
+{
+  FT_Done_FreeType (ft_library);
+}
+#endif
+
+static inline cairo_scaled_font_t *
+helper_cairo_create_scaled_font (const font_options_t *font_opts)
+{
+  hb_font_t *font = hb_font_reference (font_opts->font);
+
+  cairo_font_face_t *cairo_face;
+  /* We cannot use the FT_Face from hb_font_t, as doing so will confuse hb_font_t because
+   * cairo will reset the face size.  As such, create new face...
+   * TODO Perhaps add API to hb-ft to encapsulate this code. */
+  FT_Face ft_face = nullptr;//hb_ft_font_get_face (font);
+  if (!ft_face)
+  {
+    if (!ft_library)
+    {
+      FT_Init_FreeType (&ft_library);
+#ifdef HAVE_ATEXIT
+      atexit (free_ft_library);
+#endif
+    }
+
+    unsigned int blob_length;
+    const char *blob_data = hb_blob_get_data (font_opts->blob, &blob_length);
+
+    if (FT_New_Memory_Face (ft_library,
+                           (const FT_Byte *) blob_data,
+                           blob_length,
+                           font_opts->face_index,
+                           &ft_face))
+      fail (false, "FT_New_Memory_Face fail");
+  }
+  if (!ft_face)
+  {
+    /* This allows us to get some boxes at least... */
+    cairo_face = cairo_toy_font_face_create ("@cairo:sans",
+                                            CAIRO_FONT_SLANT_NORMAL,
+                                            CAIRO_FONT_WEIGHT_NORMAL);
+  }
+  else
+  {
+#ifdef HAVE_FT_SET_VAR_BLEND_COORDINATES
+    unsigned int num_coords;
+    const int *coords = hb_font_get_var_coords_normalized (font, &num_coords);
+    if (num_coords)
+    {
+      FT_Fixed *ft_coords = (FT_Fixed *) calloc (num_coords, sizeof (FT_Fixed));
+      if (ft_coords)
+      {
+       for (unsigned int i = 0; i < num_coords; i++)
+         ft_coords[i] = coords[i] << 2;
+       FT_Set_Var_Blend_Coordinates (ft_face, num_coords, ft_coords);
+       free (ft_coords);
+      }
+    }
+#endif
+
+    cairo_face = cairo_ft_font_face_create_for_ft_face (ft_face, font_opts->ft_load_flags);
+  }
+  cairo_matrix_t ctm, font_matrix;
+  cairo_font_options_t *font_options;
+
+  cairo_matrix_init_identity (&ctm);
+  cairo_matrix_init_scale (&font_matrix,
+                          font_opts->font_size_x,
+                          font_opts->font_size_y);
+  font_options = cairo_font_options_create ();
+  cairo_font_options_set_hint_style (font_options, CAIRO_HINT_STYLE_NONE);
+  cairo_font_options_set_hint_metrics (font_options, CAIRO_HINT_METRICS_OFF);
+
+  cairo_scaled_font_t *scaled_font = cairo_scaled_font_create (cairo_face,
+                                                              &font_matrix,
+                                                              &ctm,
+                                                              font_options);
+
+  cairo_font_options_destroy (font_options);
+  cairo_font_face_destroy (cairo_face);
+
+  static cairo_user_data_key_t key;
+  if (cairo_scaled_font_set_user_data (scaled_font,
+                                      &key,
+                                      (void *) font,
+                                      (cairo_destroy_func_t) hb_font_destroy))
+    hb_font_destroy (font);
+
+  return scaled_font;
+}
+
+static inline bool
+helper_cairo_scaled_font_has_color (cairo_scaled_font_t *scaled_font)
+{
+  bool ret = false;
+#ifdef FT_HAS_COLOR
+  FT_Face ft_face = cairo_ft_scaled_font_lock_face (scaled_font);
+  if (ft_face)
+  {
+    if (FT_HAS_COLOR (ft_face))
+      ret = true;
+    cairo_ft_scaled_font_unlock_face (scaled_font);
+  }
+#endif
+  return ret;
+}
+
+
+enum class image_protocol_t {
+  NONE = 0,
+  ITERM2,
+  KITTY,
+};
+
+struct finalize_closure_t {
+  void (*callback)(finalize_closure_t *);
+  cairo_surface_t *surface;
+  cairo_write_func_t write_func;
+  void *closure;
+  image_protocol_t protocol;
+};
+static cairo_user_data_key_t finalize_closure_key;
+
+
+static void
+finalize_ansi (finalize_closure_t *closure)
+{
+  cairo_status_t status;
+  status = helper_cairo_surface_write_to_ansi_stream (closure->surface,
+                                                     closure->write_func,
+                                                     closure->closure);
+  if (status != CAIRO_STATUS_SUCCESS)
+    fail (false, "Failed to write output: %s",
+         cairo_status_to_string (status));
+}
+
+static cairo_surface_t *
+_cairo_ansi_surface_create_for_stream (cairo_write_func_t write_func,
+                                      void *closure,
+                                      double width,
+                                      double height,
+                                      cairo_content_t content,
+                                      image_protocol_t protocol HB_UNUSED)
+{
+  cairo_surface_t *surface;
+  int w = ceil (width);
+  int h = ceil (height);
+
+  switch (content) {
+    case CAIRO_CONTENT_ALPHA:
+      surface = cairo_image_surface_create (CAIRO_FORMAT_A8, w, h);
+      break;
+    default:
+    case CAIRO_CONTENT_COLOR:
+      surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, w, h);
+      break;
+    case CAIRO_CONTENT_COLOR_ALPHA:
+      surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, w, h);
+      break;
+  }
+  cairo_status_t status = cairo_surface_status (surface);
+  if (status != CAIRO_STATUS_SUCCESS)
+    fail (false, "Failed to create cairo surface: %s",
+         cairo_status_to_string (status));
+
+  finalize_closure_t *ansi_closure = g_new0 (finalize_closure_t, 1);
+  ansi_closure->callback = finalize_ansi;
+  ansi_closure->surface = surface;
+  ansi_closure->write_func = write_func;
+  ansi_closure->closure = closure;
+
+  if (cairo_surface_set_user_data (surface,
+                                  &finalize_closure_key,
+                                  (void *) ansi_closure,
+                                  (cairo_destroy_func_t) g_free))
+    g_free ((void *) closure);
+
+  return surface;
+}
+
+
+#ifdef CAIRO_HAS_PNG_FUNCTIONS
+
+static cairo_status_t
+byte_array_write_func (void                *closure,
+                      const unsigned char *data,
+                      unsigned int         size)
+{
+  g_byte_array_append ((GByteArray *) closure, data, size);
+  return CAIRO_STATUS_SUCCESS;
+}
+
+static void
+finalize_png (finalize_closure_t *closure)
+{
+  cairo_status_t status;
+  GByteArray *bytes = nullptr;
+  GString *string;
+  gchar *base64;
+  size_t base64_len;
+
+  if (closure->protocol == image_protocol_t::NONE)
+  {
+    status = cairo_surface_write_to_png_stream (closure->surface,
+                                               closure->write_func,
+                                               closure->closure);
+  }
+  else
+  {
+    bytes = g_byte_array_new ();
+    status = cairo_surface_write_to_png_stream (closure->surface,
+                                               byte_array_write_func,
+                                               bytes);
+  }
+
+  if (status != CAIRO_STATUS_SUCCESS)
+    fail (false, "Failed to write output: %s",
+         cairo_status_to_string (status));
+
+  if (closure->protocol == image_protocol_t::NONE)
+    return;
+
+  base64 = g_base64_encode (bytes->data, bytes->len);
+  base64_len = strlen (base64);
+
+  string = g_string_new (NULL);
+  if (closure->protocol == image_protocol_t::ITERM2)
+  {
+    /* https://iterm2.com/documentation-images.html */
+    g_string_printf (string, "\033]1337;File=inline=1;size=%zu:%s\a\n",
+                    base64_len, base64);
+  }
+  else if (closure->protocol == image_protocol_t::KITTY)
+  {
+#define CHUNK_SIZE 4096
+    /* https://sw.kovidgoyal.net/kitty/graphics-protocol.html */
+    for (size_t pos = 0; pos < base64_len; pos += CHUNK_SIZE)
+    {
+      size_t len = base64_len - pos;
+
+      if (pos == 0)
+       g_string_append (string, "\033_Ga=T,f=100,m=");
+      else
+       g_string_append (string, "\033_Gm=");
+
+      if (len > CHUNK_SIZE)
+      {
+       g_string_append (string, "1;");
+       g_string_append_len (string, base64 + pos, CHUNK_SIZE);
+      }
+      else
+      {
+       g_string_append (string, "0;");
+       g_string_append_len (string, base64 + pos, len);
+      }
+
+      g_string_append (string, "\033\\");
+    }
+    g_string_append (string, "\n");
+#undef CHUNK_SIZE
+  }
+
+  closure->write_func (closure->closure, (unsigned char *) string->str, string->len);
+
+  g_byte_array_unref (bytes);
+  g_free (base64);
+  g_string_free (string, TRUE);
+}
 
-cairo_scaled_font_t *
-helper_cairo_create_scaled_font (const font_options_t *font_opts);
+static cairo_surface_t *
+_cairo_png_surface_create_for_stream (cairo_write_func_t write_func,
+                                     void *closure,
+                                     double width,
+                                     double height,
+                                     cairo_content_t content,
+                                     image_protocol_t protocol)
+{
+  cairo_surface_t *surface;
+  int w = ceil (width);
+  int h = ceil (height);
 
-bool
-helper_cairo_scaled_font_has_color (cairo_scaled_font_t *scaled_font);
+  switch (content) {
+    case CAIRO_CONTENT_ALPHA:
+      surface = cairo_image_surface_create (CAIRO_FORMAT_A8, w, h);
+      break;
+    default:
+    case CAIRO_CONTENT_COLOR:
+      surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, w, h);
+      break;
+    case CAIRO_CONTENT_COLOR_ALPHA:
+      surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, w, h);
+      break;
+  }
+  cairo_status_t status = cairo_surface_status (surface);
+  if (status != CAIRO_STATUS_SUCCESS)
+    fail (false, "Failed to create cairo surface: %s",
+         cairo_status_to_string (status));
+
+  finalize_closure_t *png_closure = g_new0 (finalize_closure_t, 1);
+  png_closure->callback = finalize_png;
+  png_closure->surface = surface;
+  png_closure->write_func = write_func;
+  png_closure->closure = closure;
+  png_closure->protocol = protocol;
+
+  if (cairo_surface_set_user_data (surface,
+                                  &finalize_closure_key,
+                                  (void *) png_closure,
+                                  (cairo_destroy_func_t) g_free))
+    g_free ((void *) closure);
+
+  return surface;
+}
+
+#endif
 
-extern const char *helper_cairo_supported_formats[];
+static cairo_status_t
+stdio_write_func (void                *closure,
+                 const unsigned char *data,
+                 unsigned int         size)
+{
+  FILE *fp = (FILE *) closure;
 
-cairo_t *
+  while (size) {
+    size_t ret = fwrite (data, 1, size, fp);
+    size -= ret;
+    data += ret;
+    if (size && ferror (fp))
+      fail (false, "Failed to write output: %s", strerror (errno));
+  }
+
+  return CAIRO_STATUS_SUCCESS;
+}
+
+static const char *helper_cairo_supported_formats[] =
+{
+  "ansi",
+  #ifdef CAIRO_HAS_PNG_FUNCTIONS
+  "png",
+  #endif
+  #ifdef CAIRO_HAS_SVG_SURFACE
+  "svg",
+  #endif
+  #ifdef CAIRO_HAS_PDF_SURFACE
+  "pdf",
+  #endif
+  #ifdef CAIRO_HAS_PS_SURFACE
+  "ps",
+   #ifdef HAS_EPS
+    "eps",
+   #endif
+  #endif
+  nullptr
+};
+
+template <typename view_options_t,
+        typename output_options_t>
+static inline cairo_t *
 helper_cairo_create_context (double w, double h,
                             view_options_t *view_opts,
                             output_options_t *out_opts,
-                            cairo_content_t content);
+                            cairo_content_t content)
+{
+  cairo_surface_t *(*constructor) (cairo_write_func_t write_func,
+                                  void *closure,
+                                  double width,
+                                  double height) = nullptr;
+  cairo_surface_t *(*constructor2) (cairo_write_func_t write_func,
+                                   void *closure,
+                                   double width,
+                                   double height,
+                                   cairo_content_t content,
+                                   image_protocol_t protocol) = nullptr;
+
+  image_protocol_t protocol = image_protocol_t::NONE;
+  const char *extension = out_opts->output_format;
+  if (!extension) {
+#if HAVE_ISATTY
+    if (isatty (fileno (out_opts->out_fp)))
+    {
+#ifdef CAIRO_HAS_PNG_FUNCTIONS
+      const char *name;
+      /* https://gitlab.com/gnachman/iterm2/-/issues/7154 */
+      if ((name = getenv ("LC_TERMINAL")) != nullptr &&
+         0 == g_ascii_strcasecmp (name, "iTerm2"))
+      {
+       extension = "png";
+       protocol = image_protocol_t::ITERM2;
+      }
+      else if ((name = getenv ("TERM")) != nullptr &&
+              0 == g_ascii_strcasecmp (name, "xterm-kitty"))
+      {
+       extension = "png";
+       protocol = image_protocol_t::KITTY;
+      }
+      else
+       extension = "ansi";
+#else
+      extension = "ansi";
+#endif
+    }
+    else
+#endif
+    {
+#ifdef CAIRO_HAS_PNG_FUNCTIONS
+      extension = "png";
+#else
+      extension = "ansi";
+#endif
+    }
+  }
+  if (0)
+    ;
+    else if (0 == g_ascii_strcasecmp (extension, "ansi"))
+      constructor2 = _cairo_ansi_surface_create_for_stream;
+  #ifdef CAIRO_HAS_PNG_FUNCTIONS
+    else if (0 == g_ascii_strcasecmp (extension, "png"))
+      constructor2 = _cairo_png_surface_create_for_stream;
+  #endif
+  #ifdef CAIRO_HAS_SVG_SURFACE
+    else if (0 == g_ascii_strcasecmp (extension, "svg"))
+      constructor = cairo_svg_surface_create_for_stream;
+  #endif
+  #ifdef CAIRO_HAS_PDF_SURFACE
+    else if (0 == g_ascii_strcasecmp (extension, "pdf"))
+      constructor = cairo_pdf_surface_create_for_stream;
+  #endif
+  #ifdef CAIRO_HAS_PS_SURFACE
+    else if (0 == g_ascii_strcasecmp (extension, "ps"))
+      constructor = cairo_ps_surface_create_for_stream;
+   #ifdef HAS_EPS
+    else if (0 == g_ascii_strcasecmp (extension, "eps"))
+      constructor = _cairo_eps_surface_create_for_stream;
+   #endif
+  #endif
+
+
+  unsigned int fr, fg, fb, fa, br, bg, bb, ba;
+  const char *color;
+  br = bg = bb = 0; ba = 255;
+  color = view_opts->back ? view_opts->back : DEFAULT_BACK;
+  sscanf (color + (*color=='#'), "%2x%2x%2x%2x", &br, &bg, &bb, &ba);
+  fr = fg = fb = 0; fa = 255;
+  color = view_opts->fore ? view_opts->fore : DEFAULT_FORE;
+  sscanf (color + (*color=='#'), "%2x%2x%2x%2x", &fr, &fg, &fb, &fa);
+
+  if (content == CAIRO_CONTENT_ALPHA)
+  {
+    if (view_opts->annotate ||
+       br != bg || bg != bb ||
+       fr != fg || fg != fb)
+      content = CAIRO_CONTENT_COLOR;
+  }
+  if (ba != 255)
+    content = CAIRO_CONTENT_COLOR_ALPHA;
+
+  cairo_surface_t *surface;
+  FILE *f = out_opts->out_fp;
+  if (constructor)
+    surface = constructor (stdio_write_func, f, w, h);
+  else if (constructor2)
+    surface = constructor2 (stdio_write_func, f, w, h, content, protocol);
+  else
+    fail (false, "Unknown output format `%s'; supported formats are: %s%s",
+         extension,
+         g_strjoinv ("/", const_cast<char**> (helper_cairo_supported_formats)),
+         out_opts->explicit_output_format ? "" :
+         "\nTry setting format using --output-format");
+
+  cairo_t *cr = cairo_create (surface);
+  content = cairo_surface_get_content (surface);
+
+  switch (content) {
+    case CAIRO_CONTENT_ALPHA:
+      cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
+      cairo_set_source_rgba (cr, 1., 1., 1., br / 255.);
+      cairo_paint (cr);
+      cairo_set_source_rgba (cr, 1., 1., 1.,
+                            (fr / 255.) * (fa / 255.) + (br / 255) * (1 - (fa / 255.)));
+      break;
+    default:
+    case CAIRO_CONTENT_COLOR:
+    case CAIRO_CONTENT_COLOR_ALPHA:
+      cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
+      cairo_set_source_rgba (cr, br / 255., bg / 255., bb / 255., ba / 255.);
+      cairo_paint (cr);
+      cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
+      cairo_set_source_rgba (cr, fr / 255., fg / 255., fb / 255., fa / 255.);
+      break;
+  }
 
-void
-helper_cairo_destroy_context (cairo_t *cr);
+  cairo_surface_destroy (surface);
+  return cr;
+}
+
+static inline void
+helper_cairo_destroy_context (cairo_t *cr)
+{
+  finalize_closure_t *closure = (finalize_closure_t *)
+                               cairo_surface_get_user_data (cairo_get_target (cr),
+                                                            &finalize_closure_key);
+  if (closure)
+    closure->callback (closure);
+
+  cairo_status_t status = cairo_status (cr);
+  if (status != CAIRO_STATUS_SUCCESS)
+    fail (false, "Failed: %s",
+         cairo_status_to_string (status));
+  cairo_destroy (cr);
+}
 
 
 struct helper_cairo_line_t {
@@ -75,12 +607,94 @@ struct helper_cairo_line_t {
   }
 };
 
-void
+static inline void
 helper_cairo_line_from_buffer (helper_cairo_line_t *l,
                               hb_buffer_t         *buffer,
                               const char          *text,
                               unsigned int         text_len,
                               int                  scale_bits,
-                              hb_bool_t            utf8_clusters);
+                              hb_bool_t            utf8_clusters)
+{
+  memset (l, 0, sizeof (*l));
+
+  l->num_glyphs = hb_buffer_get_length (buffer);
+  hb_glyph_info_t *hb_glyph = hb_buffer_get_glyph_infos (buffer, nullptr);
+  hb_glyph_position_t *hb_position = hb_buffer_get_glyph_positions (buffer, nullptr);
+  l->glyphs = cairo_glyph_allocate (l->num_glyphs + 1);
+
+  if (text) {
+    l->utf8 = g_strndup (text, text_len);
+    l->utf8_len = text_len;
+    l->num_clusters = l->num_glyphs ? 1 : 0;
+    for (unsigned int i = 1; i < l->num_glyphs; i++)
+      if (hb_glyph[i].cluster != hb_glyph[i-1].cluster)
+       l->num_clusters++;
+    l->clusters = cairo_text_cluster_allocate (l->num_clusters);
+  }
+
+  if ((l->num_glyphs && !l->glyphs) ||
+      (l->utf8_len && !l->utf8) ||
+      (l->num_clusters && !l->clusters))
+  {
+    l->finish ();
+    return;
+  }
+
+  hb_position_t x = 0, y = 0;
+  int i;
+  for (i = 0; i < (int) l->num_glyphs; i++)
+  {
+    l->glyphs[i].index = hb_glyph[i].codepoint;
+    l->glyphs[i].x = scalbn ((double)  hb_position->x_offset + x, scale_bits);
+    l->glyphs[i].y = scalbn ((double) -hb_position->y_offset + y, scale_bits);
+    x +=  hb_position->x_advance;
+    y += -hb_position->y_advance;
+
+    hb_position++;
+  }
+  l->glyphs[i].index = -1;
+  l->glyphs[i].x = scalbn ((double) x, scale_bits);
+  l->glyphs[i].y = scalbn ((double) y, scale_bits);
+
+  if (l->num_clusters) {
+    memset ((void *) l->clusters, 0, l->num_clusters * sizeof (l->clusters[0]));
+    hb_bool_t backward = HB_DIRECTION_IS_BACKWARD (hb_buffer_get_direction (buffer));
+    l->cluster_flags = backward ? CAIRO_TEXT_CLUSTER_FLAG_BACKWARD : (cairo_text_cluster_flags_t) 0;
+    unsigned int cluster = 0;
+    const char *start = l->utf8, *end;
+    l->clusters[cluster].num_glyphs++;
+    if (backward) {
+      for (i = l->num_glyphs - 2; i >= 0; i--) {
+       if (hb_glyph[i].cluster != hb_glyph[i+1].cluster) {
+         g_assert (hb_glyph[i].cluster > hb_glyph[i+1].cluster);
+         if (utf8_clusters)
+           end = start + hb_glyph[i].cluster - hb_glyph[i+1].cluster;
+         else
+           end = g_utf8_offset_to_pointer (start, hb_glyph[i].cluster - hb_glyph[i+1].cluster);
+         l->clusters[cluster].num_bytes = end - start;
+         start = end;
+         cluster++;
+       }
+       l->clusters[cluster].num_glyphs++;
+      }
+      l->clusters[cluster].num_bytes = l->utf8 + text_len - start;
+    } else {
+      for (i = 1; i < (int) l->num_glyphs; i++) {
+       if (hb_glyph[i].cluster != hb_glyph[i-1].cluster) {
+         g_assert (hb_glyph[i].cluster > hb_glyph[i-1].cluster);
+         if (utf8_clusters)
+           end = start + hb_glyph[i].cluster - hb_glyph[i-1].cluster;
+         else
+           end = g_utf8_offset_to_pointer (start, hb_glyph[i].cluster - hb_glyph[i-1].cluster);
+         l->clusters[cluster].num_bytes = end - start;
+         start = end;
+         cluster++;
+       }
+       l->clusters[cluster].num_glyphs++;
+      }
+      l->clusters[cluster].num_bytes = l->utf8 + text_len - start;
+    }
+  }
+}
 
 #endif
index 36b654b..dabbd32 100644 (file)
 #ifndef HB_MAIN_FONT_TEXT_HH
 #define HB_MAIN_FONT_TEXT_HH
 
-#include "hb.hh"
 #include "options.hh"
 
 /* main() body for utilities taking font and processing text.*/
 
-static char *
-locale_to_utf8 (char *s)
+template <typename consumer_t, typename font_options_t, typename text_options_t>
+struct main_font_text_t : option_parser_t, font_options_t, text_options_t, consumer_t
 {
-  char *t;
-  GError *error = nullptr;
-
-  t = g_locale_to_utf8 (s, -1, nullptr, nullptr, &error);
-  if (!t)
+  int operator () (int argc, char **argv)
   {
-     fail (true, "Failed converting text to UTF-8");
+    add_options ();
+    parse (&argc, &argv);
+
+    this->init (this);
+
+    while (this->consume_line (*this))
+      ;
+
+    this->finish (this);
+
+    return this->failed ? 1 : 0;
   }
 
-  return t;
-}
+  protected:
 
-template <typename consumer_t, int default_font_size, int subpixel_bits>
-struct main_font_text_t
-{
-  main_font_text_t ()
-                 : options ("[FONT-FILE] [TEXT]"),
-                   font_opts (&options, default_font_size, subpixel_bits),
-                   input (&options),
-                   consumer (&options) {}
-
-  int
-  main (int argc, char **argv)
+  void add_options ()
   {
-    options.parse (&argc, &argv);
-
-    argc--, argv++;
-    if (argc && !font_opts.font_file) font_opts.font_file = locale_to_utf8 (argv[0]), argc--, argv++;
-    if (argc && !input.text && !input.text_file) input.text = locale_to_utf8 (argv[0]), argc--, argv++;
-    if (argc)
-      fail (true, "Too many arguments on the command line");
-    if (!font_opts.font_file)
-      options.usage ();
-    if (!input.text && !input.text_file)
-      input.text_file = g_strdup ("-");
-
-    hb_buffer_t *buffer = hb_buffer_create ();
-    consumer.init (buffer, &font_opts);
-    hb_buffer_destroy (buffer);
-
-    unsigned int text_len;
-    const char *text;
-    while ((text = input.get_line (&text_len)))
-      consumer.consume_line (text, text_len, input.text_before, input.text_after);
-
-    consumer.finish (&font_opts);
-
-    return consumer.failed ? 1 : 0;
+    font_options_t::add_options (this);
+    text_options_t::add_options (this);
+    consumer_t::add_options (this);
+
+    GOptionEntry entries[] =
+    {
+      {G_OPTION_REMAINING,     0, G_OPTION_FLAG_IN_MAIN,
+                               G_OPTION_ARG_CALLBACK,  (gpointer) &collect_rest,       nullptr,        "[FONT-FILE] [TEXT]"},
+      {nullptr}
+    };
+    add_main_group (entries, this);
+    option_parser_t::add_options ();
   }
 
-  protected:
-  option_parser_t options;
-  font_options_t font_opts;
-  text_options_t input;
-  consumer_t consumer;
+  private:
+
+  static gboolean
+  collect_rest (const char *name G_GNUC_UNUSED,
+               const char *arg,
+               gpointer    data,
+               GError    **error)
+  {
+    main_font_text_t *thiz = (main_font_text_t *) data;
+
+    if (!thiz->font_file)
+    {
+      thiz->font_file = g_strdup (arg);
+      return true;
+    }
+
+    if (!thiz->text && !thiz->text_file)
+    {
+      thiz->text = g_strdup (arg);
+      return true;
+    }
+
+    g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_FAILED,
+                "Too many arguments on the command line");
+    return false;
+  }
 };
 
 #endif
-
index 59fde47..fdab620 100644 (file)
@@ -1,35 +1,28 @@
 hb_view_sources = [
   'hb-view.cc',
-  'options.cc',
-  'ansi-print.cc',
-  'helper-cairo.cc',
-  'helper-cairo-ansi.cc',
-  'view-cairo.cc',
 ]
 
 hb_shape_sources = [
   'hb-shape.cc',
-  'options.cc',
 ]
 
 hb_ot_shape_closure_sources = [
   'hb-ot-shape-closure.cc',
-  'options.cc',
 ]
 
 hb_subset_cli_sources = [
   'hb-subset.cc',
-  'options.cc',
-  'options-subset.cc',
 ]
 
+util_deps = [freetype_dep, cairo_dep, cairo_ft_dep, glib_dep]
+
 if conf.get('HAVE_GLIB', 0) == 1
   if conf.get('HAVE_FREETYPE', 0) == 1 and conf.get('HAVE_CAIRO_FT', 0) == 1
 
     hb_view = executable('hb-view', hb_view_sources,
       cpp_args: cpp_args,
       include_directories: [incconfig, incsrc],
-      dependencies: deps,
+      dependencies: [util_deps, chafa_dep],
       link_with: [libharfbuzz],
       install: true,
     )
@@ -38,7 +31,7 @@ if conf.get('HAVE_GLIB', 0) == 1
   hb_shape = executable('hb-shape', hb_shape_sources,
     cpp_args: cpp_args,
     include_directories: [incconfig, incsrc],
-    dependencies: deps,
+    dependencies: util_deps,
     link_with: [libharfbuzz],
     install: true,
   )
@@ -46,7 +39,7 @@ if conf.get('HAVE_GLIB', 0) == 1
   hb_subset = executable('hb-subset', hb_subset_cli_sources,
     cpp_args: cpp_args,
     include_directories: [incconfig, incsrc],
-    dependencies: deps,
+    dependencies: util_deps,
     link_with: [libharfbuzz, libharfbuzz_subset],
     install: true,
   )
@@ -54,7 +47,7 @@ if conf.get('HAVE_GLIB', 0) == 1
   hb_ot_shape_closure = executable('hb-ot-shape-closure', hb_ot_shape_closure_sources,
     cpp_args: cpp_args,
     include_directories: [incconfig, incsrc],
-    dependencies: deps,
+    dependencies: util_deps,
     link_with: [libharfbuzz],
     install: true,
   )
diff --git a/util/options-subset.cc b/util/options-subset.cc
deleted file mode 100644 (file)
index 9c3954c..0000000
+++ /dev/null
@@ -1,263 +0,0 @@
-/*
- * Copyright © 2019  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): Garret Rieger
- */
-
-#include "options.hh"
-
-#include "hb-subset-input.hh"
-
-static gboolean
-parse_gids (const char *name G_GNUC_UNUSED,
-           const char *arg,
-           gpointer    data,
-           GError    **error G_GNUC_UNUSED)
-{
-  subset_options_t *subset_opts = (subset_options_t *) data;
-  hb_set_t *gids = subset_opts->input->glyphs;
-
-  char *s = (char *) arg;
-  char *p;
-
-  while (s && *s)
-  {
-    while (*s && strchr (", ", *s))
-      s++;
-    if (!*s)
-      break;
-
-    errno = 0;
-    hb_codepoint_t start_code = strtoul (s, &p, 10);
-    if (s[0] == '-' || errno || s == p)
-    {
-      hb_set_destroy (gids);
-      g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
-                   "Failed parsing gids values at: '%s'", s);
-      return false;
-    }
-
-    if (p && p[0] == '-') //gid ranges
-    {
-      s = ++p;
-      hb_codepoint_t end_code = strtoul (s, &p, 10);
-      if (s[0] == '-' || errno || s == p)
-      {
-        hb_set_destroy (gids);
-        g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
-                     "Failed parsing gids values at: '%s'", s);
-        return false;
-      }
-
-      if (end_code < start_code)
-      {
-        hb_set_destroy (gids);
-        g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
-                     "Invalid gids range value %u-%u", start_code, end_code);
-        return false;
-      }
-      hb_set_add_range (gids, start_code, end_code);
-    }
-    else
-    {
-      hb_set_add (gids, start_code);
-    }
-    s = p;
-  }
-
-  return true;
-}
-
-static gboolean
-parse_nameids (const char *name,
-              const char *arg,
-              gpointer    data,
-              GError    **error G_GNUC_UNUSED)
-{
-  subset_options_t *subset_opts = (subset_options_t *) data;
-  hb_set_t *name_ids = subset_opts->input->name_ids;
-
-  char last_name_char = name[strlen (name) - 1];
-
-  if (last_name_char != '+' && last_name_char != '-')
-    hb_set_clear (name_ids);
-
-  if (0 == strcmp (arg, "*"))
-  {
-    if (last_name_char == '-')
-      hb_set_del_range (name_ids, 0, 0x7FFF);
-    else
-      hb_set_add_range (name_ids, 0, 0x7FFF);
-    return true;
-  }
-
-  char *s = (char *) arg;
-  char *p;
-
-  while (s && *s)
-  {
-    while (*s && strchr (", ", *s))
-      s++;
-    if (!*s)
-      break;
-
-    errno = 0;
-    hb_codepoint_t u = strtoul (s, &p, 10);
-    if (errno || s == p)
-    {
-      hb_set_destroy (name_ids);
-      g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
-                  "Failed parsing nameID values at: '%s'", s);
-      return false;
-    }
-
-    if (last_name_char != '-')
-    {
-      hb_set_add (name_ids, u);
-    } else {
-      hb_set_del (name_ids, u);
-    }
-
-    s = p;
-  }
-
-  return true;
-}
-
-static gboolean
-parse_name_languages (const char *name,
-                     const char *arg,
-                     gpointer    data,
-                     GError    **error G_GNUC_UNUSED)
-{
-  subset_options_t *subset_opts = (subset_options_t *) data;
-  hb_set_t *name_languages = subset_opts->input->name_languages;
-
-  char last_name_char = name[strlen (name) - 1];
-
-  if (last_name_char != '+' && last_name_char != '-')
-    hb_set_clear (name_languages);
-
-  if (0 == strcmp (arg, "*"))
-  {
-    if (last_name_char == '-')
-      hb_set_del_range (name_languages, 0, 0x5FFF);
-    else
-      hb_set_add_range (name_languages, 0, 0x5FFF);
-    return true;
-  }
-
-  char *s = (char *) arg;
-  char *p;
-
-  while (s && *s)
-  {
-    while (*s && strchr (", ", *s))
-      s++;
-    if (!*s)
-      break;
-
-    errno = 0;
-    hb_codepoint_t u = strtoul (s, &p, 10);
-    if (errno || s == p)
-    {
-      hb_set_destroy (name_languages);
-      g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
-                  "Failed parsing name_languages values at: '%s'", s);
-      return false;
-    }
-
-    if (last_name_char != '-')
-    {
-      hb_set_add (name_languages, u);
-    } else {
-      hb_set_del (name_languages, u);
-    }
-
-    s = p;
-  }
-
-  return true;
-}
-
-static gboolean
-parse_drop_tables (const char *name,
-                  const char *arg,
-                  gpointer    data,
-                  GError    **error G_GNUC_UNUSED)
-{
-  subset_options_t *subset_opts = (subset_options_t *) data;
-  hb_set_t *drop_tables = subset_opts->input->drop_tables;
-
-  char last_name_char = name[strlen (name) - 1];
-
-  if (last_name_char != '+' && last_name_char != '-')
-    hb_set_clear (drop_tables);
-
-  char *s = strtok((char *) arg, ", ");
-  while (s)
-  {
-    if (strlen (s) > 4) // Table tags are at most 4 bytes.
-    {
-      g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
-                  "Failed parsing table tag values at: '%s'", s);
-      return false;
-    }
-
-    hb_tag_t tag = hb_tag_from_string (s, strlen (s));
-
-    if (last_name_char != '-')
-      hb_set_add (drop_tables, tag);
-    else
-      hb_set_del (drop_tables, tag);
-
-    s = strtok(nullptr, ", ");
-  }
-
-  return true;
-}
-
-void
-subset_options_t::add_options (option_parser_t *parser)
-{
-  GOptionEntry entries[] =
-  {
-    {"no-hinting", 0, 0, G_OPTION_ARG_NONE,  &this->input->drop_hints,   "Whether to drop hints",   nullptr},
-    {"retain-gids", 0, 0, G_OPTION_ARG_NONE,  &this->input->retain_gids,   "If set don't renumber glyph ids in the subset.",   nullptr},
-    {"gids", 0, 0, G_OPTION_ARG_CALLBACK,  (gpointer) &parse_gids,  "Specify glyph IDs or ranges to include in the subset", "list of comma/whitespace-separated int numbers or ranges"},
-    {"desubroutinize", 0, 0, G_OPTION_ARG_NONE,  &this->input->desubroutinize,   "Remove CFF/CFF2 use of subroutines",   nullptr},
-    {"name-IDs", 0, 0, G_OPTION_ARG_CALLBACK,  (gpointer) &parse_nameids,  "Subset specified nameids", "list of int numbers"},
-    {"name-legacy", 0, 0, G_OPTION_ARG_NONE,  &this->input->name_legacy,   "Keep legacy (non-Unicode) 'name' table entries",   nullptr},
-    {"name-languages", 0, 0, G_OPTION_ARG_CALLBACK,  (gpointer) &parse_name_languages,  "Subset nameRecords with specified language IDs", "list of int numbers"},
-    {"drop-tables", 0, 0, G_OPTION_ARG_CALLBACK,  (gpointer) &parse_drop_tables,  "Drop the specified tables.", "list of string table tags."},
-    {"drop-tables+", 0, 0, G_OPTION_ARG_CALLBACK,  (gpointer) &parse_drop_tables,  "Drop the specified tables.", "list of string table tags."},
-    {"drop-tables-", 0, 0, G_OPTION_ARG_CALLBACK,  (gpointer) &parse_drop_tables,  "Drop the specified tables.", "list of string table tags."},
-
-    {nullptr}
-  };
-  parser->add_group (entries,
-        "subset",
-        "Subset options:",
-        "Options subsetting",
-        this);
-}
diff --git a/util/options.cc b/util/options.cc
deleted file mode 100644 (file)
index ee09ac5..0000000
+++ /dev/null
@@ -1,1008 +0,0 @@
-/*
- * Copyright © 2011,2012  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
- */
-
-#include "options.hh"
-
-#ifdef HAVE_FREETYPE
-#include <hb-ft.h>
-#endif
-#include <hb-ot.h>
-
-#define DELIMITERS "<+>{},;&#\\xXuUnNiI\n\t\v\f\r "
-
-static struct supported_font_funcs_t {
-       char name[4];
-       void (*func) (hb_font_t *);
-} supported_font_funcs[] =
-{
-#ifdef HAVE_FREETYPE
-  {"ft",       hb_ft_font_set_funcs},
-#endif
-  {"ot",       hb_ot_font_set_funcs},
-};
-
-
-void
-fail (hb_bool_t suggest_help, const char *format, ...)
-{
-  const char *msg;
-
-  va_list vap;
-  va_start (vap, format);
-  msg = g_strdup_vprintf (format, vap);
-  va_end (vap);
-  const char *prgname = g_get_prgname ();
-  g_printerr ("%s: %s\n", prgname, msg);
-  if (suggest_help)
-    g_printerr ("Try `%s --help' for more information.\n", prgname);
-
-  exit (1);
-}
-
-
-static gchar *
-shapers_to_string ()
-{
-  GString *shapers = g_string_new (nullptr);
-  const char **shaper_list = hb_shape_list_shapers ();
-
-  for (; *shaper_list; shaper_list++) {
-    g_string_append (shapers, *shaper_list);
-    g_string_append_c (shapers, ',');
-  }
-  g_string_truncate (shapers, MAX (0, (gint)shapers->len - 1));
-
-  return g_string_free (shapers, false);
-}
-
-static G_GNUC_NORETURN gboolean
-show_version (const char *name G_GNUC_UNUSED,
-             const char *arg G_GNUC_UNUSED,
-             gpointer    data G_GNUC_UNUSED,
-             GError    **error G_GNUC_UNUSED)
-{
-  g_printf ("%s (%s) %s\n", g_get_prgname (), PACKAGE_NAME, PACKAGE_VERSION);
-
-  char *shapers = shapers_to_string ();
-  g_printf ("Available shapers: %s\n", shapers);
-  g_free (shapers);
-  if (strcmp (HB_VERSION_STRING, hb_version_string ()))
-    g_printf ("Linked HarfBuzz library has a different version: %s\n", hb_version_string ());
-
-  exit(0);
-}
-
-
-void
-option_parser_t::add_main_options ()
-{
-  GOptionEntry entries[] =
-  {
-    {"version",                0, G_OPTION_FLAG_NO_ARG,
-                             G_OPTION_ARG_CALLBACK,    (gpointer) &show_version,       "Show version numbers",                 nullptr},
-    {nullptr}
-  };
-  g_option_context_add_main_entries (context, entries, nullptr);
-}
-
-static gboolean
-pre_parse (GOptionContext *context G_GNUC_UNUSED,
-          GOptionGroup *group G_GNUC_UNUSED,
-          gpointer data,
-          GError **error)
-{
-  option_group_t *option_group = (option_group_t *) data;
-  option_group->pre_parse (error);
-  return !*error;
-}
-
-static gboolean
-post_parse (GOptionContext *context G_GNUC_UNUSED,
-           GOptionGroup *group G_GNUC_UNUSED,
-           gpointer data,
-           GError **error)
-{
-  option_group_t *option_group = static_cast<option_group_t *>(data);
-  option_group->post_parse (error);
-  return !*error;
-}
-
-void
-option_parser_t::add_group (GOptionEntry   *entries,
-                           const gchar    *name,
-                           const gchar    *description,
-                           const gchar    *help_description,
-                           option_group_t *option_group)
-{
-  GOptionGroup *group = g_option_group_new (name, description, help_description,
-                                           static_cast<gpointer>(option_group), nullptr);
-  g_option_group_add_entries (group, entries);
-  g_option_group_set_parse_hooks (group, pre_parse, post_parse);
-  g_option_context_add_group (context, group);
-}
-
-void
-option_parser_t::parse (int *argc, char ***argv)
-{
-  setlocale (LC_ALL, "");
-
-  GError *parse_error = nullptr;
-  if (!g_option_context_parse (context, argc, argv, &parse_error))
-  {
-    if (parse_error)
-    {
-      fail (true, "%s", parse_error->message);
-      //g_error_free (parse_error);
-    }
-    else
-      fail (true, "Option parse error");
-  }
-}
-
-
-static gboolean
-parse_font_extents (const char *name G_GNUC_UNUSED,
-                   const char *arg,
-                   gpointer    data,
-                   GError    **error G_GNUC_UNUSED)
-{
-  view_options_t *view_opts = (view_options_t *) data;
-  view_options_t::font_extents_t &e = view_opts->font_extents;
-  switch (sscanf (arg, "%lf%*[ ,]%lf%*[ ,]%lf", &e.ascent, &e.descent, &e.line_gap)) {
-    case 1: HB_FALLTHROUGH;
-    case 2: HB_FALLTHROUGH;
-    case 3:
-      view_opts->have_font_extents = true;
-      return true;
-    default:
-      g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
-                  "%s argument should be one to three space-separated numbers",
-                  name);
-      return false;
-  }
-}
-
-static gboolean
-parse_margin (const char *name G_GNUC_UNUSED,
-             const char *arg,
-             gpointer    data,
-             GError    **error G_GNUC_UNUSED)
-{
-  view_options_t *view_opts = (view_options_t *) data;
-  view_options_t::margin_t &m = view_opts->margin;
-  switch (sscanf (arg, "%lf%*[ ,]%lf%*[ ,]%lf%*[ ,]%lf", &m.t, &m.r, &m.b, &m.l)) {
-    case 1: m.r = m.t; HB_FALLTHROUGH;
-    case 2: m.b = m.t; HB_FALLTHROUGH;
-    case 3: m.l = m.r; HB_FALLTHROUGH;
-    case 4: return true;
-    default:
-      g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
-                  "%s argument should be one to four space-separated numbers",
-                  name);
-      return false;
-  }
-}
-
-
-static gboolean
-parse_shapers (const char *name G_GNUC_UNUSED,
-              const char *arg,
-              gpointer    data,
-              GError    **error)
-{
-  shape_options_t *shape_opts = (shape_options_t *) data;
-  char **shapers = g_strsplit (arg, ",", 0);
-
-  for (char **shaper = shapers; *shaper; shaper++) {
-    bool found = false;
-    for (const char **hb_shaper = hb_shape_list_shapers (); *hb_shaper; hb_shaper++) {
-      if (strcmp (*shaper, *hb_shaper) == 0) {
-       found = true;
-       break;
-      }
-    }
-    if (!found) {
-      g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
-                  "Unknown or unsupported shaper: %s", *shaper);
-      g_strfreev (shapers);
-      return false;
-    }
-  }
-
-  g_strfreev (shape_opts->shapers);
-  shape_opts->shapers = shapers;
-  return true;
-}
-
-static G_GNUC_NORETURN gboolean
-list_shapers (const char *name G_GNUC_UNUSED,
-             const char *arg G_GNUC_UNUSED,
-             gpointer    data G_GNUC_UNUSED,
-             GError    **error G_GNUC_UNUSED)
-{
-  for (const char **shaper = hb_shape_list_shapers (); *shaper; shaper++)
-    g_printf ("%s\n", *shaper);
-
-  exit(0);
-}
-
-
-static gboolean
-parse_features (const char *name G_GNUC_UNUSED,
-               const char *arg,
-               gpointer    data,
-               GError    **error G_GNUC_UNUSED)
-{
-  shape_options_t *shape_opts = (shape_options_t *) data;
-  char *s = (char *) arg;
-  char *p;
-
-  shape_opts->num_features = 0;
-  g_free (shape_opts->features);
-  shape_opts->features = nullptr;
-
-  if (!*s)
-    return true;
-
-  /* count the features first, so we can allocate memory */
-  p = s;
-  do {
-    shape_opts->num_features++;
-    p = strchr (p, ',');
-    if (p)
-      p++;
-  } while (p);
-
-  shape_opts->features = (hb_feature_t *) calloc (shape_opts->num_features, sizeof (*shape_opts->features));
-  if (!shape_opts->features)
-    return false;
-
-  /* now do the actual parsing */
-  p = s;
-  shape_opts->num_features = 0;
-  while (p && *p) {
-    char *end = strchr (p, ',');
-    if (hb_feature_from_string (p, end ? end - p : -1, &shape_opts->features[shape_opts->num_features]))
-      shape_opts->num_features++;
-    p = end ? end + 1 : nullptr;
-  }
-
-  return true;
-}
-
-static gboolean
-parse_variations (const char *name G_GNUC_UNUSED,
-                 const char *arg,
-                 gpointer    data,
-                 GError    **error G_GNUC_UNUSED)
-{
-  font_options_t *font_opts = (font_options_t *) data;
-  char *s = (char *) arg;
-  char *p;
-
-  font_opts->num_variations = 0;
-  g_free (font_opts->variations);
-  font_opts->variations = nullptr;
-
-  if (!*s)
-    return true;
-
-  /* count the variations first, so we can allocate memory */
-  p = s;
-  do {
-    font_opts->num_variations++;
-    p = strchr (p, ',');
-    if (p)
-      p++;
-  } while (p);
-
-  font_opts->variations = (hb_variation_t *) calloc (font_opts->num_variations, sizeof (*font_opts->variations));
-  if (!font_opts->variations)
-    return false;
-
-  /* now do the actual parsing */
-  p = s;
-  font_opts->num_variations = 0;
-  while (p && *p) {
-    char *end = strchr (p, ',');
-    if (hb_variation_from_string (p, end ? end - p : -1, &font_opts->variations[font_opts->num_variations]))
-      font_opts->num_variations++;
-    p = end ? end + 1 : nullptr;
-  }
-
-  return true;
-}
-
-static gboolean
-parse_text (const char *name G_GNUC_UNUSED,
-           const char *arg,
-           gpointer    data,
-           GError    **error G_GNUC_UNUSED)
-{
-  text_options_t *text_opts = (text_options_t *) data;
-
-  if (text_opts->text)
-  {
-    g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
-                "Either --text or --unicodes can be provided but not both");
-    return false;
-  }
-
-  text_opts->text_len = -1;
-  text_opts->text = g_strdup (arg);
-  return true;
-}
-
-
-static gboolean
-parse_unicodes (const char *name G_GNUC_UNUSED,
-               const char *arg,
-               gpointer    data,
-               GError    **error G_GNUC_UNUSED)
-{
-  text_options_t *text_opts = (text_options_t *) data;
-
-  if (text_opts->text)
-  {
-    g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
-                "Either --text or --unicodes can be provided but not both");
-    return false;
-  }
-
-  GString *gs = g_string_new (nullptr);
-  if (0 == strcmp (arg, "*"))
-  {
-    g_string_append_c (gs, '*');
-  }
-  else
-  {
-
-    char *s = (char *) arg;
-    char *p;
-
-    while (s && *s)
-    {
-      while (*s && strchr (DELIMITERS, *s))
-       s++;
-      if (!*s)
-       break;
-
-      errno = 0;
-      hb_codepoint_t u = strtoul (s, &p, 16);
-      if (errno || s == p)
-      {
-       g_string_free (gs, TRUE);
-       g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
-                    "Failed parsing Unicode values at: '%s'", s);
-       return false;
-      }
-
-      g_string_append_unichar (gs, u);
-
-      s = p;
-    }
-  }
-
-  text_opts->text_len = gs->len;
-  text_opts->text = g_string_free (gs, FALSE);
-  return true;
-}
-
-
-void
-view_options_t::add_options (option_parser_t *parser)
-{
-  GOptionEntry entries[] =
-  {
-    {"annotate",       0, 0, G_OPTION_ARG_NONE,        &this->annotate,                "Annotate output rendering",                            nullptr},
-    {"background",     0, 0, G_OPTION_ARG_STRING,      &this->back,                    "Set background color (default: " DEFAULT_BACK ")",     "rrggbb/rrggbbaa"},
-    {"foreground",     0, 0, G_OPTION_ARG_STRING,      &this->fore,                    "Set foreground color (default: " DEFAULT_FORE ")",     "rrggbb/rrggbbaa"},
-    {"line-space",     0, 0, G_OPTION_ARG_DOUBLE,      &this->line_space,              "Set space between lines (default: 0)",                 "units"},
-    {"font-extents",   0, 0, G_OPTION_ARG_CALLBACK,    (gpointer) &parse_font_extents, "Set font ascent/descent/line-gap (default: auto)","one to three numbers"},
-    {"margin",         0, 0, G_OPTION_ARG_CALLBACK,    (gpointer) &parse_margin,       "Margin around output (default: " G_STRINGIFY(DEFAULT_MARGIN) ")","one to four numbers"},
-    {nullptr}
-  };
-  parser->add_group (entries,
-                    "view",
-                    "View options:",
-                    "Options for output rendering",
-                    this);
-}
-
-void
-shape_options_t::add_options (option_parser_t *parser)
-{
-  GOptionEntry entries[] =
-  {
-    {"list-shapers",   0, G_OPTION_FLAG_NO_ARG,
-                             G_OPTION_ARG_CALLBACK,    (gpointer) &list_shapers,       "List available shapers and quit",      nullptr},
-    {"shaper",         0, G_OPTION_FLAG_HIDDEN,
-                             G_OPTION_ARG_CALLBACK,    (gpointer) &parse_shapers,      "Hidden duplicate of --shapers",        nullptr},
-    {"shapers",                0, 0, G_OPTION_ARG_CALLBACK,    (gpointer) &parse_shapers,      "Set comma-separated list of shapers to try","list"},
-    {"direction",      0, 0, G_OPTION_ARG_STRING,      &this->direction,               "Set text direction (default: auto)",   "ltr/rtl/ttb/btt"},
-    {"language",       0, 0, G_OPTION_ARG_STRING,      &this->language,                "Set text language (default: $LANG)",   "langstr"},
-    {"script",         0, 0, G_OPTION_ARG_STRING,      &this->script,                  "Set text script (default: auto)",      "ISO-15924 tag"},
-    {"bot",            0, 0, G_OPTION_ARG_NONE,        &this->bot,                     "Treat text as beginning-of-paragraph", nullptr},
-    {"eot",            0, 0, G_OPTION_ARG_NONE,        &this->eot,                     "Treat text as end-of-paragraph",       nullptr},
-    {"preserve-default-ignorables",0, 0, G_OPTION_ARG_NONE,    &this->preserve_default_ignorables,     "Preserve Default-Ignorable characters",        nullptr},
-    {"remove-default-ignorables",0, 0, G_OPTION_ARG_NONE,      &this->remove_default_ignorables,       "Remove Default-Ignorable characters",  nullptr},
-    {"invisible-glyph",        0, 0, G_OPTION_ARG_INT,         &this->invisible_glyph,         "Glyph value to replace Default-Ignorables with",       nullptr},
-    {"utf8-clusters",  0, 0, G_OPTION_ARG_NONE,        &this->utf8_clusters,           "Use UTF8 byte indices, not char indices",      nullptr},
-    {"cluster-level",  0, 0, G_OPTION_ARG_INT,         &this->cluster_level,           "Cluster merging level (default: 0)",   "0/1/2"},
-    {"normalize-glyphs",0, 0, G_OPTION_ARG_NONE,       &this->normalize_glyphs,        "Rearrange glyph clusters in nominal order",    nullptr},
-    {"verify",         0, 0, G_OPTION_ARG_NONE,        &this->verify,                  "Perform sanity checks on shaping results",     nullptr},
-    {"num-iterations", 'n', 0, G_OPTION_ARG_INT,               &this->num_iterations,          "Run shaper N times (default: 1)",      "N"},
-    {nullptr}
-  };
-  parser->add_group (entries,
-                    "shape",
-                    "Shape options:",
-                    "Options for the shaping process",
-                    this);
-
-  const gchar *features_help = "Comma-separated list of font features\n"
-    "\n"
-    "    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 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"
-    "    refer to UTF-8 byte indices. The position before the first character\n"
-    "    is always 0.\n"
-    "\n"
-    "    The format is Python-esque.  Here is how it all works:\n"
-    "\n"
-    "      Syntax:       Value:    Start:    End:\n"
-    "\n"
-    "    Setting value:\n"
-    "      \"kern\"        1         0         ∞         # Turn feature on\n"
-    "      \"+kern\"       1         0         ∞         # Turn feature on\n"
-    "      \"-kern\"       0         0         ∞         # Turn feature off\n"
-    "      \"kern=0\"      0         0         ∞         # Turn feature off\n"
-    "      \"kern=1\"      1         0         ∞         # Turn feature on\n"
-    "      \"aalt=2\"      2         0         ∞         # Choose 2nd alternate\n"
-    "\n"
-    "    Setting index:\n"
-    "      \"kern[]\"      1         0         ∞         # Turn feature on\n"
-    "      \"kern[:]\"     1         0         ∞         # Turn feature on\n"
-    "      \"kern[5:]\"    1         5         ∞         # Turn feature on, partial\n"
-    "      \"kern[:5]\"    1         0         5         # Turn feature on, partial\n"
-    "      \"kern[3:5]\"   1         3         5         # Turn feature on, range\n"
-    "      \"kern[3]\"     1         3         3+1       # Turn feature on, single char\n"
-    "\n"
-    "    Mixing it all:\n"
-    "\n"
-    "      \"aalt[3:5]=2\" 2         3         5         # Turn 2nd alternate on for range";
-
-  GOptionEntry entries2[] =
-  {
-    {"features",       0, 0, G_OPTION_ARG_CALLBACK,    (gpointer) &parse_features,     features_help,  "list"},
-    {nullptr}
-  };
-  parser->add_group (entries2,
-                    "features",
-                    "Features options:",
-                    "Options for font features used",
-                    this);
-}
-
-static gboolean
-parse_font_size (const char *name G_GNUC_UNUSED,
-                const char *arg,
-                gpointer    data,
-                GError    **error G_GNUC_UNUSED)
-{
-  font_options_t *font_opts = (font_options_t *) data;
-  if (0 == strcmp (arg, "upem"))
-  {
-    font_opts->font_size_y = font_opts->font_size_x = FONT_SIZE_UPEM;
-    return true;
-  }
-  switch (sscanf (arg, "%lf%*[ ,]%lf", &font_opts->font_size_x, &font_opts->font_size_y)) {
-    case 1: font_opts->font_size_y = font_opts->font_size_x; HB_FALLTHROUGH;
-    case 2: return true;
-    default:
-      g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
-                  "%s argument should be one or two space-separated numbers",
-                  name);
-      return false;
-  }
-}
-
-static gboolean
-parse_font_ppem (const char *name G_GNUC_UNUSED,
-                const char *arg,
-                gpointer    data,
-                GError    **error G_GNUC_UNUSED)
-{
-  font_options_t *font_opts = (font_options_t *) data;
-  switch (sscanf (arg, "%d%*[ ,]%d", &font_opts->x_ppem, &font_opts->y_ppem)) {
-    case 1: font_opts->y_ppem = font_opts->x_ppem; HB_FALLTHROUGH;
-    case 2: return true;
-    default:
-      g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
-                  "%s argument should be one or two space-separated numbers",
-                  name);
-      return false;
-  }
-}
-
-void
-font_options_t::add_options (option_parser_t *parser)
-{
-  char *text = nullptr;
-
-  {
-    static_assert ((ARRAY_LENGTH_CONST (supported_font_funcs) > 0),
-                  "No supported font-funcs found.");
-    GString *s = g_string_new (nullptr);
-    g_string_printf (s, "Set font functions implementation to use (default: %s)\n\n    Supported font function implementations are: %s",
-                    supported_font_funcs[0].name,
-                    supported_font_funcs[0].name);
-    for (unsigned int i = 1; i < ARRAY_LENGTH (supported_font_funcs); i++)
-    {
-      g_string_append_c (s, '/');
-      g_string_append (s, supported_font_funcs[i].name);
-    }
-    text = g_string_free (s, FALSE);
-    parser->free_later (text);
-  }
-
-  char *font_size_text;
-  if (default_font_size == FONT_SIZE_UPEM)
-    font_size_text = (char *) "Font size (default: upem)";
-  else
-  {
-    font_size_text = g_strdup_printf ("Font size (default: %d)", default_font_size);
-    parser->free_later (font_size_text);
-  }
-
-  GOptionEntry entries[] =
-  {
-    {"font-file",      0, 0, G_OPTION_ARG_STRING,      &this->font_file,               "Set font file-name",                           "filename"},
-    {"face-index",     0, 0, G_OPTION_ARG_INT,         &this->face_index,              "Set face index (default: 0)",                  "index"},
-    {"font-size",      0, default_font_size ? 0 : G_OPTION_FLAG_HIDDEN,
-                             G_OPTION_ARG_CALLBACK,    (gpointer) &parse_font_size,    font_size_text,                                 "1/2 integers or 'upem'"},
-    {"font-ppem",      0, 0, G_OPTION_ARG_CALLBACK,    (gpointer) &parse_font_ppem,    "Set x,y pixels per EM (default: 0; disabled)", "1/2 integers"},
-    {"font-ptem",      0, 0, G_OPTION_ARG_DOUBLE,      &this->ptem,                    "Set font point-size (default: 0; disabled)",   "point-size"},
-    {"font-funcs",     0, 0, G_OPTION_ARG_STRING,      &this->font_funcs,              text,                                           "impl"},
-    {"ft-load-flags",  0, 0, G_OPTION_ARG_INT,         &this->ft_load_flags,           "Set FreeType load-flags (default: 2)",         "integer"},
-    {nullptr}
-  };
-  parser->add_group (entries,
-                    "font",
-                    "Font options:",
-                    "Options for the font",
-                    this);
-
-  const gchar *variations_help = "Comma-separated list of font variations\n"
-    "\n"
-    "    Variations are set globally. The format for specifying variation settings\n"
-    "    follows.  All valid CSS font-variation-settings values other than 'normal'\n"
-    "    and 'inherited' are also accepted, though, not documented below.\n"
-    "\n"
-    "    The format is a tag, optionally followed by an equals sign, followed by a\n"
-    "    number. For example:\n"
-    "\n"
-    "      \"wght=500\"\n"
-    "      \"slnt=-7.5\"\n";
-
-  GOptionEntry entries2[] =
-  {
-    {"variations",     0, 0, G_OPTION_ARG_CALLBACK,    (gpointer) &parse_variations,   variations_help,        "list"},
-    {nullptr}
-  };
-  parser->add_group (entries2,
-                    "variations",
-                    "Variations options:",
-                    "Options for font variations used",
-                    this);
-}
-
-void
-text_options_t::add_options (option_parser_t *parser)
-{
-  GOptionEntry entries[] =
-  {
-    {"text",           0, 0, G_OPTION_ARG_CALLBACK,    (gpointer) &parse_text,         "Set input text",                       "string"},
-    {"text-file",      0, 0, G_OPTION_ARG_STRING,      &this->text_file,               "Set input text file-name\n\n    If no text is provided, standard input is used for input.\n",          "filename"},
-    {"unicodes",      'u', 0, G_OPTION_ARG_CALLBACK,   (gpointer) &parse_unicodes,             "Set input Unicode codepoints",         "list of hex numbers"},
-    {"text-before",    0, 0, G_OPTION_ARG_STRING,      &this->text_before,             "Set text context before each line",    "string"},
-    {"text-after",     0, 0, G_OPTION_ARG_STRING,      &this->text_after,              "Set text context after each line",     "string"},
-    {nullptr}
-  };
-  parser->add_group (entries,
-                    "text",
-                    "Text options:",
-                    "Options for the input text",
-                    this);
-}
-
-void
-output_options_t::add_options (option_parser_t *parser)
-{
-  const char *text;
-
-  if (!supported_formats)
-    text = "Set output serialization format";
-  else
-  {
-    char *items = g_strjoinv ("/", const_cast<char **> (supported_formats));
-    text = g_strdup_printf ("Set output format\n\n    Supported output formats are: %s", items);
-    g_free (items);
-    parser->free_later ((char *) text);
-  }
-
-  GOptionEntry entries[] =
-  {
-    {"output-file",   'o', 0, G_OPTION_ARG_STRING,     &this->output_file,             "Set output file-name (default: stdout)","filename"},
-    {"output-format", 'O', 0, G_OPTION_ARG_STRING,     &this->output_format,           text,                                   "format"},
-    {nullptr}
-  };
-  parser->add_group (entries,
-                    "output",
-                    "Output destination & format options:",
-                    "Options for the destination & form of the output",
-                    this);
-}
-
-
-
-hb_font_t *
-font_options_t::get_font () const
-{
-  if (font)
-    return font;
-
-  /* Create the blob */
-  if (!font_file)
-    fail (true, "No font file set");
-
-  const char *font_path = font_file;
-
-  if (0 == strcmp (font_path, "-"))
-  {
-#if defined(_WIN32) || defined(__CYGWIN__)
-    setmode (fileno (stdin), O_BINARY);
-    font_path = "STDIN";
-#else
-    font_path = "/dev/stdin";
-#endif
-  }
-
-  blob = hb_blob_create_from_file (font_path);
-
-  if (blob == hb_blob_get_empty ())
-    fail (false, "Couldn't read or find %s, or it was empty.", font_path);
-
-  /* Create the face */
-  hb_face_t *face = hb_face_create (blob, face_index);
-  hb_blob_destroy (blob);
-
-
-  font = hb_font_create (face);
-
-  if (font_size_x == FONT_SIZE_UPEM)
-    font_size_x = hb_face_get_upem (face);
-  if (font_size_y == FONT_SIZE_UPEM)
-    font_size_y = hb_face_get_upem (face);
-
-  hb_font_set_ppem (font, x_ppem, y_ppem);
-  hb_font_set_ptem (font, ptem);
-
-  int scale_x = (int) scalbnf (font_size_x, subpixel_bits);
-  int scale_y = (int) scalbnf (font_size_y, subpixel_bits);
-  hb_font_set_scale (font, scale_x, scale_y);
-  hb_face_destroy (face);
-
-  hb_font_set_variations (font, variations, num_variations);
-
-  void (*set_font_funcs) (hb_font_t *) = nullptr;
-  if (!font_funcs)
-  {
-    set_font_funcs = supported_font_funcs[0].func;
-  }
-  else
-  {
-    for (unsigned int i = 0; i < ARRAY_LENGTH (supported_font_funcs); i++)
-      if (0 == g_ascii_strcasecmp (font_funcs, supported_font_funcs[i].name))
-      {
-       set_font_funcs = supported_font_funcs[i].func;
-       break;
-      }
-    if (!set_font_funcs)
-    {
-      GString *s = g_string_new (nullptr);
-      for (unsigned int i = 0; i < ARRAY_LENGTH (supported_font_funcs); i++)
-      {
-       if (i)
-         g_string_append_c (s, '/');
-       g_string_append (s, supported_font_funcs[i].name);
-      }
-      char *p = g_string_free (s, FALSE);
-      fail (false, "Unknown font function implementation `%s'; supported values are: %s; default is %s",
-           font_funcs,
-           p,
-           supported_font_funcs[0].name);
-      //free (p);
-    }
-  }
-  set_font_funcs (font);
-#ifdef HAVE_FREETYPE
-  hb_ft_font_set_load_flags (font, ft_load_flags);
-#endif
-
-  return font;
-}
-
-
-const char *
-text_options_t::get_line (unsigned int *len)
-{
-  if (text) {
-    if (!line)
-    {
-      line = text;
-      line_len = text_len;
-    }
-    if (line_len == UINT_MAX)
-      line_len = strlen (line);
-
-    if (!line_len) {
-      *len = 0;
-      return nullptr;
-    }
-
-    const char *ret = line;
-    const char *p = (const char *) memchr (line, '\n', line_len);
-    unsigned int ret_len;
-    if (!p) {
-      ret_len = line_len;
-      line += ret_len;
-      line_len = 0;
-    } else {
-      ret_len = p - ret;
-      line += ret_len + 1;
-      line_len -= ret_len + 1;
-    }
-
-    *len = ret_len;
-    return ret;
-  }
-
-  if (!fp) {
-    if (!text_file)
-      fail (true, "At least one of text or text-file must be set");
-
-    if (0 != strcmp (text_file, "-"))
-      fp = fopen (text_file, "r");
-    else
-      fp = stdin;
-
-    if (!fp)
-      fail (false, "Failed opening text file `%s': %s",
-           text_file, strerror (errno));
-
-    gs = g_string_new (nullptr);
-  }
-
-  g_string_set_size (gs, 0);
-  char buf[BUFSIZ];
-  while (fgets (buf, sizeof (buf), fp)) {
-    unsigned int bytes = strlen (buf);
-    if (bytes && buf[bytes - 1] == '\n') {
-      bytes--;
-      g_string_append_len (gs, buf, bytes);
-      break;
-    }
-      g_string_append_len (gs, buf, bytes);
-  }
-  if (ferror (fp))
-    fail (false, "Failed reading text: %s",
-         strerror (errno));
-  *len = gs->len;
-  return !*len && feof (fp) ? nullptr : gs->str;
-}
-
-
-FILE *
-output_options_t::get_file_handle ()
-{
-  if (fp)
-    return fp;
-
-  if (output_file)
-    fp = fopen (output_file, "wb");
-  else {
-#if defined(_WIN32) || defined(__CYGWIN__)
-    setmode (fileno (stdout), O_BINARY);
-#endif
-    fp = stdout;
-  }
-  if (!fp)
-    fail (false, "Cannot open output file `%s': %s",
-         g_filename_display_name (output_file), strerror (errno));
-
-  return fp;
-}
-
-static gboolean
-parse_verbose (const char *name G_GNUC_UNUSED,
-              const char *arg G_GNUC_UNUSED,
-              gpointer    data G_GNUC_UNUSED,
-              GError    **error G_GNUC_UNUSED)
-{
-  format_options_t *format_opts = (format_options_t *) data;
-  format_opts->show_text = format_opts->show_unicode = format_opts->show_line_num = true;
-  return true;
-}
-
-static gboolean
-parse_ned (const char *name G_GNUC_UNUSED,
-          const char *arg G_GNUC_UNUSED,
-          gpointer    data G_GNUC_UNUSED,
-          GError    **error G_GNUC_UNUSED)
-{
-  format_options_t *format_opts = (format_options_t *) data;
-  format_opts->show_clusters = format_opts->show_advances = false;
-  return true;
-}
-
-void
-format_options_t::add_options (option_parser_t *parser)
-{
-  GOptionEntry entries[] =
-  {
-    {"show-text",      0, 0, G_OPTION_ARG_NONE,        &this->show_text,               "Prefix each line of output with its corresponding input text",         nullptr},
-    {"show-unicode",   0, 0, G_OPTION_ARG_NONE,        &this->show_unicode,            "Prefix each line of output with its corresponding input codepoint(s)", nullptr},
-    {"show-line-num",  0, 0, G_OPTION_ARG_NONE,        &this->show_line_num,           "Prefix each line of output with its corresponding input line number",  nullptr},
-    {"verbose",              'v', G_OPTION_FLAG_NO_ARG,
-                             G_OPTION_ARG_CALLBACK,    (gpointer) &parse_verbose,      "Prefix each line of output with all of the above",                     nullptr},
-    {"no-glyph-names", 0, G_OPTION_FLAG_REVERSE,
-                             G_OPTION_ARG_NONE,        &this->show_glyph_names,        "Output glyph indices instead of names",                                nullptr},
-    {"no-positions",   0, G_OPTION_FLAG_REVERSE,
-                             G_OPTION_ARG_NONE,        &this->show_positions,          "Do not output glyph positions",                                        nullptr},
-    {"no-advances",    0, G_OPTION_FLAG_REVERSE,
-                             G_OPTION_ARG_NONE,        &this->show_advances,           "Do not output glyph advances",                                         nullptr},
-    {"no-clusters",    0, G_OPTION_FLAG_REVERSE,
-                             G_OPTION_ARG_NONE,        &this->show_clusters,           "Do not output cluster indices",                                        nullptr},
-    {"show-extents",   0, 0, G_OPTION_ARG_NONE,        &this->show_extents,            "Output glyph extents",                                                 nullptr},
-    {"show-flags",     0, 0, G_OPTION_ARG_NONE,        &this->show_flags,              "Output glyph flags",                                                   nullptr},
-    {"ned",          'v', G_OPTION_FLAG_NO_ARG,
-                             G_OPTION_ARG_CALLBACK,    (gpointer) &parse_ned,          "No Extra Data; Do not output clusters or advances",                    nullptr},
-    {"trace",        'V', 0, G_OPTION_ARG_NONE,        &this->trace,                   "Output interim shaping results",                                       nullptr},
-    {nullptr}
-  };
-  parser->add_group (entries,
-                    "output-syntax",
-                    "Output syntax:\n"
-        "    text: [<glyph name or index>=<glyph cluster index within input>@<horizontal displacement>,<vertical displacement>+<horizontal advance>,<vertical advance>|...]\n"
-        "    json: [{\"g\": <glyph name or index>, \"ax\": <horizontal advance>, \"ay\": <vertical advance>, \"dx\": <horizontal displacement>, \"dy\": <vertical displacement>, \"cl\": <glyph cluster index within input>}, ...]\n"
-        "\nOutput syntax options:",
-                    "Options for the syntax of the output",
-                    this);
-}
-
-void
-format_options_t::serialize_unicode (hb_buffer_t *buffer,
-                                    GString     *gs)
-{
-  unsigned int num_glyphs = hb_buffer_get_length (buffer);
-  hb_glyph_info_t *info = hb_buffer_get_glyph_infos (buffer, nullptr);
-
-  g_string_append_c (gs, '<');
-  for (unsigned int i = 0; i < num_glyphs; i++)
-  {
-    if (i)
-      g_string_append_c (gs, ',');
-    g_string_append_printf (gs, "U+%04X", info->codepoint);
-    info++;
-  }
-  g_string_append_c (gs, '>');
-}
-
-void
-format_options_t::serialize_glyphs (hb_buffer_t *buffer,
-                                   hb_font_t   *font,
-                                   hb_buffer_serialize_format_t output_format,
-                                   hb_buffer_serialize_flags_t flags,
-                                   GString     *gs)
-{
-  g_string_append_c (gs, '[');
-  unsigned int num_glyphs = hb_buffer_get_length (buffer);
-  unsigned int start = 0;
-
-  while (start < num_glyphs)
-  {
-    char buf[32768];
-    unsigned int consumed;
-    start += hb_buffer_serialize_glyphs (buffer, start, num_glyphs,
-                                        buf, sizeof (buf), &consumed,
-                                        font, output_format, flags);
-    if (!consumed)
-      break;
-    g_string_append (gs, buf);
-  }
-  g_string_append_c (gs, ']');
-}
-void
-format_options_t::serialize_line_no (unsigned int  line_no,
-                                    GString      *gs)
-{
-  if (show_line_num)
-    g_string_append_printf (gs, "%d: ", line_no);
-}
-void
-format_options_t::serialize_buffer_of_text (hb_buffer_t  *buffer,
-                                           unsigned int  line_no,
-                                           const char   *text,
-                                           unsigned int  text_len,
-                                           hb_font_t    *font,
-                                           GString      *gs)
-{
-  if (show_text)
-  {
-    serialize_line_no (line_no, gs);
-    g_string_append_c (gs, '(');
-    g_string_append_len (gs, text, text_len);
-    g_string_append_c (gs, ')');
-    g_string_append_c (gs, '\n');
-  }
-
-  if (show_unicode)
-  {
-    serialize_line_no (line_no, gs);
-    serialize_unicode (buffer, gs);
-    g_string_append_c (gs, '\n');
-  }
-}
-void
-format_options_t::serialize_message (unsigned int  line_no,
-                                    const char   *type,
-                                    const char   *msg,
-                                    GString      *gs)
-{
-  serialize_line_no (line_no, gs);
-  g_string_append_printf (gs, "%s: %s", type, msg);
-  g_string_append_c (gs, '\n');
-}
-void
-format_options_t::serialize_buffer_of_glyphs (hb_buffer_t  *buffer,
-                                             unsigned int  line_no,
-                                             const char   *text,
-                                             unsigned int  text_len,
-                                             hb_font_t    *font,
-                                             hb_buffer_serialize_format_t output_format,
-                                             hb_buffer_serialize_flags_t format_flags,
-                                             GString      *gs)
-{
-  serialize_line_no (line_no, gs);
-  serialize_glyphs (buffer, font, output_format, format_flags, gs);
-  g_string_append_c (gs, '\n');
-}
index 2c10578..790650b 100644 (file)
@@ -28,7 +28,6 @@
 #define OPTIONS_HH
 
 #include "hb.hh"
-#include "hb-subset.h"
 
 #include <stdlib.h>
 #include <stddef.h>
 #include <glib.h>
 #include <glib/gprintf.h>
 
-void fail (hb_bool_t suggest_help, const char *format, ...) G_GNUC_NORETURN G_GNUC_PRINTF (2, 3);
 
-struct option_group_t
-{
-  virtual ~option_group_t () {}
-
-  virtual void add_options (struct option_parser_t *parser) = 0;
-
-  virtual void pre_parse (GError **error G_GNUC_UNUSED) {}
-  virtual void post_parse (GError **error G_GNUC_UNUSED) {}
-};
+static inline void fail (hb_bool_t suggest_help, const char *format, ...) G_GNUC_NORETURN G_GNUC_PRINTF (2, 3);
 
+static inline void
+fail (hb_bool_t suggest_help, const char *format, ...)
+{
+  const char *msg;
+
+  va_list vap;
+  va_start (vap, format);
+  msg = g_strdup_vprintf (format, vap);
+  va_end (vap);
+  const char *prgname = g_get_prgname ();
+  g_printerr ("%s: %s\n", prgname, msg);
+  if (suggest_help)
+    g_printerr ("Try `%s --help' for more information.\n", prgname);
+
+  exit (1);
+}
 
 struct option_parser_t
 {
-  option_parser_t (const char *usage)
-  {
-    memset (this, 0, sizeof (*this));
-    usage_str = usage;
-    context = g_option_context_new (usage);
-    to_free = g_ptr_array_new ();
-
-    add_main_options ();
-  }
+  option_parser_t (const char *parameter_string = nullptr)
+  : context (g_option_context_new (parameter_string)),
+    to_free (g_ptr_array_new ())
+  {}
 
   static void _g_free_g_func (void *p, void * G_GNUC_UNUSED) { g_free (p); }
 
@@ -85,614 +86,142 @@ struct option_parser_t
     g_ptr_array_free (to_free, TRUE);
   }
 
-  void add_main_options ();
+  void add_options ();
 
+  static void
+  post_parse_ (void *thiz, GError **error) {}
+  template <typename Type>
+  static auto
+  post_parse_ (Type *thiz, GError **error) -> decltype (thiz->post_parse (error))
+  { thiz->post_parse (error); }
+  template <typename Type>
+  static gboolean
+  post_parse (GOptionContext *context G_GNUC_UNUSED,
+             GOptionGroup *group G_GNUC_UNUSED,
+             gpointer data,
+             GError **error)
+  {
+    option_parser_t::post_parse_ (static_cast<Type *> (data), error);
+    return !*error;
+  }
+
+  template <typename Type>
   void add_group (GOptionEntry   *entries,
                  const gchar    *name,
                  const gchar    *description,
                  const gchar    *help_description,
-                 option_group_t *option_group);
-
-  void free_later (char *p) {
-    g_ptr_array_add (to_free, p);
-  }
-
-  void parse (int *argc, char ***argv);
-
-  G_GNUC_NORETURN void usage () {
-    g_printerr ("Usage: %s [OPTION...] %s\n", g_get_prgname (), usage_str);
-    exit (1);
-  }
-
-  private:
-  const char *usage_str;
-  GOptionContext *context;
-  GPtrArray *to_free;
-};
-
-
-#define DEFAULT_MARGIN 16
-#define DEFAULT_FORE "#000000"
-#define DEFAULT_BACK "#FFFFFF"
-#define FONT_SIZE_UPEM 0x7FFFFFFF
-#define FONT_SIZE_NONE 0
-
-struct view_options_t : option_group_t
-{
-  view_options_t (option_parser_t *parser)
-  {
-    annotate = false;
-    fore = nullptr;
-    back = nullptr;
-    line_space = 0;
-    have_font_extents = false;
-    font_extents.ascent = font_extents.descent = font_extents.line_gap = 0;
-    margin.t = margin.r = margin.b = margin.l = DEFAULT_MARGIN;
-
-    add_options (parser);
-  }
-  ~view_options_t () override
-  {
-    g_free (fore);
-    g_free (back);
-  }
-
-  void add_options (option_parser_t *parser) override;
-
-  hb_bool_t annotate;
-  char *fore;
-  char *back;
-  double line_space;
-  bool have_font_extents;
-  struct font_extents_t {
-    double ascent, descent, line_gap;
-  } font_extents;
-  struct margin_t {
-    double t, r, b, l;
-  } margin;
-};
-
-
-struct shape_options_t : option_group_t
-{
-  shape_options_t (option_parser_t *parser)
+                 Type           *closure,
+                 bool            add_parse_hooks = true)
   {
-    direction = language = script = nullptr;
-    bot = eot = preserve_default_ignorables = remove_default_ignorables = false;
-    features = nullptr;
-    num_features = 0;
-    shapers = nullptr;
-    utf8_clusters = false;
-    invisible_glyph = 0;
-    cluster_level = HB_BUFFER_CLUSTER_LEVEL_DEFAULT;
-    normalize_glyphs = false;
-    verify = false;
-    num_iterations = 1;
-
-    add_options (parser);
-  }
-  ~shape_options_t () override
-  {
-    g_free (direction);
-    g_free (language);
-    g_free (script);
-    free (features);
-    g_strfreev (shapers);
-  }
-
-  void add_options (option_parser_t *parser) override;
-
-  void setup_buffer (hb_buffer_t *buffer)
-  {
-    hb_buffer_set_direction (buffer, hb_direction_from_string (direction, -1));
-    hb_buffer_set_script (buffer, hb_script_from_string (script, -1));
-    hb_buffer_set_language (buffer, hb_language_from_string (language, -1));
-    hb_buffer_set_flags (buffer, (hb_buffer_flags_t)
-                                (HB_BUFFER_FLAG_DEFAULT |
-                                 (bot ? HB_BUFFER_FLAG_BOT : 0) |
-                                 (eot ? HB_BUFFER_FLAG_EOT : 0) |
-                                 (preserve_default_ignorables ? HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES : 0) |
-                                 (remove_default_ignorables ? HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES : 0) |
-                                 0));
-    hb_buffer_set_invisible_glyph (buffer, invisible_glyph);
-    hb_buffer_set_cluster_level (buffer, cluster_level);
-    hb_buffer_guess_segment_properties (buffer);
-  }
-
-  static void copy_buffer_properties (hb_buffer_t *dst, hb_buffer_t *src)
-  {
-    hb_segment_properties_t props;
-    hb_buffer_get_segment_properties (src, &props);
-    hb_buffer_set_segment_properties (dst, &props);
-    hb_buffer_set_flags (dst, hb_buffer_get_flags (src));
-    hb_buffer_set_cluster_level (dst, hb_buffer_get_cluster_level (src));
+    GOptionGroup *group = g_option_group_new (name, description, help_description,
+                                             static_cast<gpointer>(closure), nullptr);
+    g_option_group_add_entries (group, entries);
+    if (add_parse_hooks)
+      g_option_group_set_parse_hooks (group, nullptr, post_parse<Type>);
+    g_option_context_add_group (context, group);
   }
 
-  void populate_buffer (hb_buffer_t *buffer, const char *text, int text_len,
-                       const char *text_before, const char *text_after)
+  template <typename Type>
+  void add_main_group (GOptionEntry   *entries,
+                      Type           *closure)
   {
-    hb_buffer_clear_contents (buffer);
-    if (text_before) {
-      unsigned int len = strlen (text_before);
-      hb_buffer_add_utf8 (buffer, text_before, len, len, 0);
-    }
-    hb_buffer_add_utf8 (buffer, text, text_len, 0, text_len);
-    if (text_after) {
-      hb_buffer_add_utf8 (buffer, text_after, -1, 0, 0);
-    }
-
-    if (!utf8_clusters) {
-      /* Reset cluster values to refer to Unicode character index
-       * instead of UTF-8 index. */
-      unsigned int num_glyphs = hb_buffer_get_length (buffer);
-      hb_glyph_info_t *info = hb_buffer_get_glyph_infos (buffer, nullptr);
-      for (unsigned int i = 0; i < num_glyphs; i++)
-      {
-       info->cluster = i;
-       info++;
-      }
-    }
-
-    setup_buffer (buffer);
-  }
-
-  hb_bool_t shape (hb_font_t *font, hb_buffer_t *buffer, const char **error=nullptr)
-  {
-    hb_buffer_t *text_buffer = nullptr;
-    if (verify)
-    {
-      text_buffer = hb_buffer_create ();
-      hb_buffer_append (text_buffer, buffer, 0, -1);
-    }
-
-    if (!hb_shape_full (font, buffer, features, num_features, shapers))
-    {
-      if (error)
-       *error = "all shapers failed.";
-      goto fail;
-    }
-
-    if (normalize_glyphs)
-      hb_buffer_normalize_glyphs (buffer);
-
-    if (verify && !verify_buffer (buffer, text_buffer, font, error))
-      goto fail;
-
-    if (text_buffer)
-      hb_buffer_destroy (text_buffer);
-
-    return true;
-
-  fail:
-    if (text_buffer)
-      hb_buffer_destroy (text_buffer);
-
-    return false;
+    GOptionGroup *group = g_option_group_new (nullptr, nullptr, nullptr,
+                                             static_cast<gpointer>(closure), nullptr);
+    g_option_group_add_entries (group, entries);
+    /* https://gitlab.gnome.org/GNOME/glib/-/issues/2460 */
+    //g_option_group_set_parse_hooks (group, nullptr, post_parse<Type>);
+    g_option_context_set_main_group (context, group);
   }
 
-  bool verify_buffer (hb_buffer_t  *buffer,
-                     hb_buffer_t  *text_buffer,
-                     hb_font_t    *font,
-                     const char  **error=nullptr)
+  void set_summary (const char *summary)
   {
-    if (!verify_buffer_monotone (buffer, error))
-      return false;
-    if (!verify_buffer_safe_to_break (buffer, text_buffer, font, error))
-      return false;
-    return true;
+    g_option_context_set_summary (context, summary);
   }
-
-  bool verify_buffer_monotone (hb_buffer_t *buffer, const char **error=nullptr)
+  void set_description (const char *description)
   {
-    /* Check that clusters are monotone. */
-    if (cluster_level == HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES ||
-       cluster_level == HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS)
-    {
-      bool is_forward = HB_DIRECTION_IS_FORWARD (hb_buffer_get_direction (buffer));
-
-      unsigned int num_glyphs;
-      hb_glyph_info_t *info = hb_buffer_get_glyph_infos (buffer, &num_glyphs);
-
-      for (unsigned int i = 1; i < num_glyphs; i++)
-       if (info[i-1].cluster != info[i].cluster &&
-           (info[i-1].cluster < info[i].cluster) != is_forward)
-       {
-         if (error)
-           *error = "clusters are not monotone.";
-         return false;
-       }
-    }
-
-    return true;
+    g_option_context_set_description (context, description);
   }
 
-  bool verify_buffer_safe_to_break (hb_buffer_t  *buffer,
-                                   hb_buffer_t  *text_buffer,
-                                   hb_font_t    *font,
-                                   const char  **error=nullptr)
-  {
-    if (cluster_level != HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES &&
-       cluster_level != HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS)
-    {
-      /* Cannot perform this check without monotone clusters.
-       * Then again, unsafe-to-break flag is much harder to use without
-       * monotone clusters. */
-      return true;
-    }
-
-    /* Check that breaking up shaping at safe-to-break is indeed safe. */
-
-    hb_buffer_t *fragment = hb_buffer_create ();
-    hb_buffer_t *reconstruction = hb_buffer_create ();
-    copy_buffer_properties (reconstruction, buffer);
-
-    unsigned int num_glyphs;
-    hb_glyph_info_t *info = hb_buffer_get_glyph_infos (buffer, &num_glyphs);
-
-    unsigned int num_chars;
-    hb_glyph_info_t *text = hb_buffer_get_glyph_infos (text_buffer, &num_chars);
-
-    /* Chop text and shape fragments. */
-    bool forward = HB_DIRECTION_IS_FORWARD (hb_buffer_get_direction (buffer));
-    unsigned int start = 0;
-    unsigned int text_start = forward ? 0 : num_chars;
-    unsigned int text_end = text_start;
-    for (unsigned int end = 1; end < num_glyphs + 1; end++)
-    {
-      if (end < num_glyphs &&
-         (info[end].cluster == info[end-1].cluster ||
-          info[end-(forward?0:1)].mask & HB_GLYPH_FLAG_UNSAFE_TO_BREAK))
-         continue;
-
-      /* Shape segment corresponding to glyphs start..end. */
-      if (end == num_glyphs)
-      {
-       if (forward)
-         text_end = num_chars;
-       else
-         text_start = 0;
-      }
-      else
-      {
-       if (forward)
-       {
-         unsigned int cluster = info[end].cluster;
-         while (text_end < num_chars && text[text_end].cluster < cluster)
-           text_end++;
-       }
-       else
-       {
-         unsigned int cluster = info[end - 1].cluster;
-         while (text_start && text[text_start - 1].cluster >= cluster)
-           text_start--;
-       }
-      }
-      assert (text_start < text_end);
-
-      if (0)
-       printf("start %d end %d text start %d end %d\n", start, end, text_start, text_end);
-
-      hb_buffer_clear_contents (fragment);
-      copy_buffer_properties (fragment, buffer);
-
-      /* TODO: Add pre/post context text. */
-      hb_buffer_flags_t flags = hb_buffer_get_flags (fragment);
-      if (0 < text_start)
-       flags = (hb_buffer_flags_t) (flags & ~HB_BUFFER_FLAG_BOT);
-      if (text_end < num_chars)
-       flags = (hb_buffer_flags_t) (flags & ~HB_BUFFER_FLAG_EOT);
-      hb_buffer_set_flags (fragment, flags);
-
-      hb_buffer_append (fragment, text_buffer, text_start, text_end);
-      if (!hb_shape_full (font, fragment, features, num_features, shapers))
-      {
-       if (error)
-         *error = "all shapers failed while shaping fragment.";
-       hb_buffer_destroy (reconstruction);
-       hb_buffer_destroy (fragment);
-       return false;
-      }
-      hb_buffer_append (reconstruction, fragment, 0, -1);
-
-      start = end;
-      if (forward)
-       text_start = text_end;
-      else
-       text_end = text_start;
-    }
-
-    bool ret = true;
-    hb_buffer_diff_flags_t diff = hb_buffer_diff (reconstruction, buffer, (hb_codepoint_t) -1, 0);
-    if (diff)
-    {
-      if (error)
-       *error = "Safe-to-break test failed.";
-      ret = false;
-
-      /* Return the reconstructed result instead so it can be inspected. */
-      hb_buffer_set_length (buffer, 0);
-      hb_buffer_append (buffer, reconstruction, 0, -1);
-    }
-
-    hb_buffer_destroy (reconstruction);
-    hb_buffer_destroy (fragment);
-
-    return ret;
-  }
-
-  void shape_closure (const char *text, int text_len,
-                     hb_font_t *font, hb_buffer_t *buffer,
-                     hb_set_t *glyphs)
-  {
-    hb_buffer_reset (buffer);
-    hb_buffer_add_utf8 (buffer, text, text_len, 0, text_len);
-    setup_buffer (buffer);
-    hb_ot_shape_glyphs_closure (font, buffer, features, num_features, glyphs);
+  void free_later (char *p) {
+    g_ptr_array_add (to_free, p);
   }
 
-  /* Buffer properties */
-  char *direction;
-  char *language;
-  char *script;
-
-  /* Buffer flags */
-  hb_bool_t bot;
-  hb_bool_t eot;
-  hb_bool_t preserve_default_ignorables;
-  hb_bool_t remove_default_ignorables;
-
-  hb_feature_t *features;
-  unsigned int num_features;
-  char **shapers;
-  hb_bool_t utf8_clusters;
-  hb_codepoint_t invisible_glyph;
-  hb_buffer_cluster_level_t cluster_level;
-  hb_bool_t normalize_glyphs;
-  hb_bool_t verify;
-  unsigned int num_iterations;
-};
-
+  bool parse (int *argc, char ***argv, bool ignore_error = false);
 
-struct font_options_t : option_group_t
-{
-  font_options_t (option_parser_t *parser,
-                 int default_font_size_,
-                 unsigned int subpixel_bits_)
-  {
-    variations = nullptr;
-    num_variations = 0;
-    default_font_size = default_font_size_;
-    x_ppem = 0;
-    y_ppem = 0;
-    ptem = 0.;
-    subpixel_bits = subpixel_bits_;
-    font_file = nullptr;
-    face_index = 0;
-    font_size_x = font_size_y = default_font_size;
-    font_funcs = nullptr;
-    ft_load_flags = 2;
-
-    blob = nullptr;
-    font = nullptr;
-
-    add_options (parser);
-  }
-  ~font_options_t () override
-  {
-    g_free (font_file);
-    free (variations);
-    g_free (font_funcs);
-    hb_font_destroy (font);
-  }
-
-  void add_options (option_parser_t *parser) override;
-
-  hb_font_t *get_font () const;
-
-  char *font_file;
-  mutable hb_blob_t *blob;
-  int face_index;
-  hb_variation_t *variations;
-  unsigned int num_variations;
-  int default_font_size;
-  int x_ppem;
-  int y_ppem;
-  double ptem;
-  unsigned int subpixel_bits;
-  mutable double font_size_x;
-  mutable double font_size_y;
-  char *font_funcs;
-  int ft_load_flags;
-
-  private:
-  mutable hb_font_t *font;
+  GOptionContext *context;
+  protected:
+  GPtrArray *to_free;
 };
 
 
-struct text_options_t : option_group_t
+static inline gchar *
+shapers_to_string ()
 {
-  text_options_t (option_parser_t *parser)
-  {
-    text_before = nullptr;
-    text_after = nullptr;
-
-    text_len = -1;
-    text = nullptr;
-    text_file = nullptr;
-
-    fp = nullptr;
-    gs = nullptr;
-    line = nullptr;
-    line_len = UINT_MAX;
-
-    add_options (parser);
-  }
-  ~text_options_t () override
-  {
-    g_free (text_before);
-    g_free (text_after);
-    g_free (text);
-    g_free (text_file);
-    if (gs)
-      g_string_free (gs, true);
-    if (fp && fp != stdin)
-      fclose (fp);
-  }
-
-  void add_options (option_parser_t *parser) override;
+  GString *shapers = g_string_new (nullptr);
+  const char **shaper_list = hb_shape_list_shapers ();
 
-  void post_parse (GError **error G_GNUC_UNUSED) override {
-    if (text && text_file)
-      g_set_error (error,
-                  G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
-                  "Only one of text and text-file can be set");
+  for (; *shaper_list; shaper_list++) {
+    g_string_append (shapers, *shaper_list);
+    g_string_append_c (shapers, ',');
   }
+  g_string_truncate (shapers, MAX (0, (gint)shapers->len - 1));
 
-  const char *get_line (unsigned int *len);
-
-  char *text_before;
-  char *text_after;
-
-  int text_len;
-  char *text;
-  char *text_file;
-
-  private:
-  FILE *fp;
-  GString *gs;
-  char *line;
-  unsigned int line_len;
-};
+  return g_string_free (shapers, false);
+}
 
-struct output_options_t : option_group_t
+static G_GNUC_NORETURN gboolean
+show_version (const char *name G_GNUC_UNUSED,
+             const char *arg G_GNUC_UNUSED,
+             gpointer    data G_GNUC_UNUSED,
+             GError    **error G_GNUC_UNUSED)
 {
-  output_options_t (option_parser_t *parser,
-                   const char **supported_formats_ = nullptr)
-  {
-    output_file = nullptr;
-    output_format = nullptr;
-    supported_formats = supported_formats_;
-    explicit_output_format = false;
-
-    fp = nullptr;
-
-    add_options (parser);
-  }
-  ~output_options_t () override
-  {
-    g_free (output_file);
-    g_free (output_format);
-    if (fp && fp != stdout)
-      fclose (fp);
-  }
-
-  void add_options (option_parser_t *parser) override;
-
-  void post_parse (GError **error G_GNUC_UNUSED) override
-  {
-    if (output_format)
-      explicit_output_format = true;
-
-    if (output_file && !output_format) {
-      output_format = strrchr (output_file, '.');
-      if (output_format)
-      {
-         output_format++; /* skip the dot */
-         output_format = g_strdup (output_format);
-      }
-    }
-
-    if (output_file && 0 == strcmp (output_file, "-"))
-      output_file = nullptr; /* STDOUT */
-  }
-
-  FILE *get_file_handle ();
+  g_printf ("%s (%s) %s\n", g_get_prgname (), PACKAGE_NAME, PACKAGE_VERSION);
 
-  char *output_file;
-  char *output_format;
-  const char **supported_formats;
-  bool explicit_output_format;
+  char *shapers = shapers_to_string ();
+  g_printf ("Available shapers: %s\n", shapers);
+  g_free (shapers);
+  if (strcmp (HB_VERSION_STRING, hb_version_string ()))
+    g_printf ("Linked HarfBuzz library has a different version: %s\n", hb_version_string ());
 
-  mutable FILE *fp;
-};
+  exit(0);
+}
 
-struct format_options_t : option_group_t
+inline void
+option_parser_t::add_options ()
 {
-  format_options_t (option_parser_t *parser) {
-    show_glyph_names = true;
-    show_positions = true;
-    show_advances = true;
-    show_clusters = true;
-    show_text = false;
-    show_unicode = false;
-    show_line_num = false;
-    show_extents = false;
-    show_flags = false;
-    trace = false;
-
-    add_options (parser);
-  }
-
-  void add_options (option_parser_t *parser) override;
-
-  void serialize_unicode (hb_buffer_t  *buffer,
-                         GString      *gs);
-  void serialize_glyphs (hb_buffer_t  *buffer,
-                        hb_font_t    *font,
-                        hb_buffer_serialize_format_t format,
-                        hb_buffer_serialize_flags_t flags,
-                        GString      *gs);
-  void serialize_line_no (unsigned int  line_no,
-                         GString      *gs);
-  void serialize_buffer_of_text (hb_buffer_t  *buffer,
-                                unsigned int  line_no,
-                                const char   *text,
-                                unsigned int  text_len,
-                                hb_font_t    *font,
-                                GString      *gs);
-  void serialize_message (unsigned int  line_no,
-                         const char   *type,
-                         const char   *msg,
-                         GString      *gs);
-  void serialize_buffer_of_glyphs (hb_buffer_t  *buffer,
-                                  unsigned int  line_no,
-                                  const char   *text,
-                                  unsigned int  text_len,
-                                  hb_font_t    *font,
-                                  hb_buffer_serialize_format_t output_format,
-                                  hb_buffer_serialize_flags_t format_flags,
-                                  GString      *gs);
-
-
-  hb_bool_t show_glyph_names;
-  hb_bool_t show_positions;
-  hb_bool_t show_advances;
-  hb_bool_t show_clusters;
-  hb_bool_t show_text;
-  hb_bool_t show_unicode;
-  hb_bool_t show_line_num;
-  hb_bool_t show_extents;
-  hb_bool_t show_flags;
-  hb_bool_t trace;
-};
+  GOptionEntry entries[] =
+  {
+    {"version",                0, G_OPTION_FLAG_NO_ARG,
+                             G_OPTION_ARG_CALLBACK,    (gpointer) &show_version,       "Show version numbers",                 nullptr},
+    {nullptr}
+  };
+  g_option_context_add_main_entries (context, entries, nullptr);
+}
 
-struct subset_options_t : option_group_t
+inline bool
+option_parser_t::parse (int *argc, char ***argv, bool ignore_error)
 {
-  subset_options_t (option_parser_t *parser)
-  {
-    input = hb_subset_input_create_or_fail ();
-    add_options (parser);
-  }
+  setlocale (LC_ALL, "");
 
-  ~subset_options_t () override
+  GError *parse_error = nullptr;
+  if (!g_option_context_parse (context, argc, argv, &parse_error))
   {
-    hb_subset_input_destroy (input);
+    if (parse_error)
+    {
+      if (!ignore_error)
+       fail (true, "%s", parse_error->message);
+      g_error_free (parse_error);
+    }
+    else
+    {
+      if (!ignore_error)
+       fail (true, "Option parse error");
+    }
+    return false;
   }
+  return true;
+}
 
-  void add_options (option_parser_t *parser) override;
-
-  hb_subset_input_t *input;
-};
 
 /* fallback implementation for scalbn()/scalbnf() for pre-2013 MSVC */
 #if defined (_MSC_VER) && (_MSC_VER < 1800)
diff --git a/util/output-options.hh b/util/output-options.hh
new file mode 100644 (file)
index 0000000..270e9f1
--- /dev/null
@@ -0,0 +1,117 @@
+/*
+ * Copyright © 2011  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 OUTPUT_OPTIONS_HH
+#define OUTPUT_OPTIONS_HH
+
+#include "options.hh"
+
+template <bool default_stdout = true>
+struct output_options_t
+{
+  ~output_options_t ()
+  {
+    g_free (output_file);
+    g_free (output_format);
+    if (out_fp && out_fp != stdout)
+      fclose (out_fp);
+  }
+
+  void add_options (option_parser_t *parser,
+                   const char **supported_formats = nullptr)
+  {
+    const char *text = nullptr;
+
+    if (supported_formats)
+    {
+      char *items = g_strjoinv ("/", const_cast<char **> (supported_formats));
+      text = g_strdup_printf ("Set output format\n\n    Supported output formats are: %s", items);
+      g_free (items);
+      parser->free_later ((char *) text);
+    }
+
+    GOptionEntry entries[] =
+    {
+      {"output-file",   'o', 0, G_OPTION_ARG_STRING,   &this->output_file,             "Set output file-name (default: stdout)","filename"},
+      {"output-format", 'O', supported_formats ? 0 : G_OPTION_FLAG_HIDDEN,
+                               G_OPTION_ARG_STRING,    &this->output_format,           text,                                   "format"},
+      {nullptr}
+    };
+    parser->add_group (entries,
+                      "output",
+                      "Output destination & format options:",
+                      "Options for the destination & form of the output",
+                      this);
+  }
+
+  void post_parse (GError **error)
+  {
+    if (output_format)
+      explicit_output_format = true;
+
+    if (output_file && !output_format)
+    {
+      output_format = strrchr (output_file, '.');
+      if (output_format)
+      {
+         output_format++; /* skip the dot */
+         output_format = g_strdup (output_format);
+      }
+    }
+
+    if (output_file && 0 != strcmp (output_file, "-"))
+      out_fp = fopen (output_file, "wb");
+    else
+    {
+      if (!default_stdout && !output_file)
+      {
+       g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_FAILED,
+                    "No output file was specified");
+        return;
+      }
+
+#if defined(_WIN32) || defined(__CYGWIN__)
+      setmode (fileno (stdout), O_BINARY);
+#endif
+      out_fp = stdout;
+    }
+    if (!out_fp)
+    {
+      g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_FAILED,
+                  "Cannot open output file `%s': %s",
+                  g_filename_display_name (output_file), strerror (errno));
+      return;
+    }
+  }
+
+  char *output_file = nullptr;
+  char *output_format = nullptr;
+
+  bool explicit_output_format = false;
+  FILE *out_fp = nullptr;
+};
+
+#endif
index da0d880..2115189 100644 (file)
 #ifndef HB_SHAPE_CONSUMER_HH
 #define HB_SHAPE_CONSUMER_HH
 
-#include "hb.hh"
-#include "options.hh"
+#include "font-options.hh"
+#include "shape-options.hh"
+#include "text-options.hh"
 
 
 template <typename output_t>
-struct shape_consumer_t
+struct shape_consumer_t : shape_options_t
 {
-  shape_consumer_t (option_parser_t *parser)
-                 : failed (false),
-                   shaper (parser),
-                   output (parser),
-                   font (nullptr),
-                   buffer (nullptr) {}
+  void add_options (option_parser_t *parser)
+  {
+    shape_options_t::add_options (parser);
+    output.add_options (parser);
+  }
 
-  void init (hb_buffer_t  *buffer_,
-            const font_options_t *font_opts)
+  template <typename app_t>
+  void init (const app_t *app)
   {
-    font = hb_font_reference (font_opts->get_font ());
     failed = false;
-    buffer = hb_buffer_reference (buffer_);
+    buffer = hb_buffer_create ();
 
-    output.init (buffer, font_opts);
+    output.init (buffer, app);
   }
-  void consume_line (const char   *text,
-                    unsigned int  text_len,
-                    const char   *text_before,
-                    const char   *text_after)
+  template <typename app_t>
+  bool consume_line (app_t &app)
   {
+    unsigned int text_len;
+    const char *text;
+    if (!(text = app.get_line (&text_len)))
+      return false;
+
     output.new_line ();
 
-    for (unsigned int n = shaper.num_iterations; n; n--)
+    for (unsigned int n = num_iterations; n; n--)
     {
       const char *error = nullptr;
 
-      shaper.populate_buffer (buffer, text, text_len, text_before, text_after);
+      populate_buffer (buffer, text, text_len, app.text_before, app.text_after);
       if (n == 1)
-       output.consume_text (buffer, text, text_len, shaper.utf8_clusters);
-      if (!shaper.shape (font, buffer, &error))
+       output.consume_text (buffer, text, text_len, utf8_clusters);
+      if (!shape (app.font, buffer, &error))
       {
        failed = true;
        output.error (error);
        if (hb_buffer_get_content_type (buffer) == HB_BUFFER_CONTENT_TYPE_GLYPHS)
          break;
        else
-         return;
+         return true;
       }
     }
 
-    output.consume_glyphs (buffer, text, text_len, shaper.utf8_clusters);
+    output.consume_glyphs (buffer, text, text_len, utf8_clusters);
+    return true;
   }
-  void finish (const font_options_t *font_opts)
+  template <typename app_t>
+  void finish (const app_t *app)
   {
-    output.finish (buffer, font_opts);
-    hb_font_destroy (font);
-    font = nullptr;
+    output.finish (buffer, app);
     hb_buffer_destroy (buffer);
     buffer = nullptr;
   }
 
   public:
-  bool failed;
+  bool failed = false;
 
   protected:
-  shape_options_t shaper;
   output_t output;
 
-  hb_font_t *font;
-  hb_buffer_t *buffer;
+  hb_buffer_t *buffer = nullptr;
 };
 
 
diff --git a/util/shape-format.hh b/util/shape-format.hh
new file mode 100644 (file)
index 0000000..18b0b96
--- /dev/null
@@ -0,0 +1,214 @@
+/*
+ * Copyright © 2011  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 SHAPE_FORMAT_OPTIONS_HH
+#define SHAPE_FORMAT_OPTIONS_HH
+
+#include "options.hh"
+
+
+struct shape_format_options_t
+{
+  void add_options (option_parser_t *parser);
+
+  void serialize (hb_buffer_t  *buffer,
+                        hb_font_t    *font,
+                        hb_buffer_serialize_format_t format,
+                        hb_buffer_serialize_flags_t flags,
+                        GString      *gs);
+  void serialize_line_no (unsigned int  line_no,
+                         GString      *gs);
+  void serialize_buffer_of_text (hb_buffer_t  *buffer,
+                                unsigned int  line_no,
+                                const char   *text,
+                                unsigned int  text_len,
+                                hb_font_t    *font,
+                                GString      *gs);
+  void serialize_message (unsigned int  line_no,
+                         const char   *type,
+                         const char   *msg,
+                         GString      *gs);
+  void serialize_buffer_of_glyphs (hb_buffer_t  *buffer,
+                                  unsigned int  line_no,
+                                  const char   *text,
+                                  unsigned int  text_len,
+                                  hb_font_t    *font,
+                                  hb_buffer_serialize_format_t output_format,
+                                  hb_buffer_serialize_flags_t format_flags,
+                                  GString      *gs);
+
+
+  hb_bool_t show_glyph_names = true;
+  hb_bool_t show_positions = true;
+  hb_bool_t show_advances = true;
+  hb_bool_t show_clusters = true;
+  hb_bool_t show_text = false;
+  hb_bool_t show_unicode = false;
+  hb_bool_t show_line_num = false;
+  hb_bool_t show_extents = false;
+  hb_bool_t show_flags = false;
+  hb_bool_t trace = false;
+};
+
+
+static gboolean
+parse_verbose (const char *name G_GNUC_UNUSED,
+              const char *arg G_GNUC_UNUSED,
+              gpointer    data G_GNUC_UNUSED,
+              GError    **error G_GNUC_UNUSED)
+{
+  shape_format_options_t *format_opts = (shape_format_options_t *) data;
+  format_opts->show_text = format_opts->show_unicode = format_opts->show_line_num = true;
+  return true;
+}
+
+static gboolean
+parse_ned (const char *name G_GNUC_UNUSED,
+          const char *arg G_GNUC_UNUSED,
+          gpointer    data G_GNUC_UNUSED,
+          GError    **error G_GNUC_UNUSED)
+{
+  shape_format_options_t *format_opts = (shape_format_options_t *) data;
+  format_opts->show_clusters = format_opts->show_advances = false;
+  return true;
+}
+
+inline void
+shape_format_options_t::serialize (hb_buffer_t *buffer,
+                                  hb_font_t   *font,
+                                  hb_buffer_serialize_format_t output_format,
+                                  hb_buffer_serialize_flags_t flags,
+                                  GString     *gs)
+{
+  unsigned int num_glyphs = hb_buffer_get_length (buffer);
+  unsigned int start = 0;
+
+  while (start < num_glyphs)
+  {
+    char buf[32768];
+    unsigned int consumed;
+    start += hb_buffer_serialize (buffer, start, num_glyphs,
+                                 buf, sizeof (buf), &consumed,
+                                 font, output_format, flags);
+    if (!consumed)
+      break;
+    g_string_append (gs, buf);
+  }
+}
+
+inline void
+shape_format_options_t::serialize_line_no (unsigned int  line_no,
+                                          GString      *gs)
+{
+  if (show_line_num)
+    g_string_append_printf (gs, "%d: ", line_no);
+}
+inline void
+shape_format_options_t::serialize_buffer_of_text (hb_buffer_t  *buffer,
+                                                 unsigned int  line_no,
+                                                 const char   *text,
+                                                 unsigned int  text_len,
+                                                 hb_font_t    *font,
+                                                 GString      *gs)
+{
+  if (show_text)
+  {
+    serialize_line_no (line_no, gs);
+    g_string_append_c (gs, '(');
+    g_string_append_len (gs, text, text_len);
+    g_string_append_c (gs, ')');
+    g_string_append_c (gs, '\n');
+  }
+
+  if (show_unicode)
+  {
+    serialize_line_no (line_no, gs);
+    serialize (buffer, font, HB_BUFFER_SERIALIZE_FORMAT_TEXT, HB_BUFFER_SERIALIZE_FLAG_DEFAULT, gs);
+    g_string_append_c (gs, '\n');
+  }
+}
+inline void
+shape_format_options_t::serialize_message (unsigned int  line_no,
+                                          const char   *type,
+                                          const char   *msg,
+                                          GString      *gs)
+{
+  serialize_line_no (line_no, gs);
+  g_string_append_printf (gs, "%s: %s", type, msg);
+  g_string_append_c (gs, '\n');
+}
+inline void
+shape_format_options_t::serialize_buffer_of_glyphs (hb_buffer_t  *buffer,
+                                                   unsigned int  line_no,
+                                                   const char   *text,
+                                                   unsigned int  text_len,
+                                                   hb_font_t    *font,
+                                                   hb_buffer_serialize_format_t output_format,
+                                                   hb_buffer_serialize_flags_t format_flags,
+                                                   GString      *gs)
+{
+  serialize_line_no (line_no, gs);
+  serialize (buffer, font, output_format, format_flags, gs);
+  g_string_append_c (gs, '\n');
+}
+
+
+void
+shape_format_options_t::add_options (option_parser_t *parser)
+{
+  GOptionEntry entries[] =
+  {
+    {"show-text",      0, 0, G_OPTION_ARG_NONE,        &this->show_text,               "Prefix each line of output with its corresponding input text",         nullptr},
+    {"show-unicode",   0, 0, G_OPTION_ARG_NONE,        &this->show_unicode,            "Prefix each line of output with its corresponding input codepoint(s)", nullptr},
+    {"show-line-num",  0, 0, G_OPTION_ARG_NONE,        &this->show_line_num,           "Prefix each line of output with its corresponding input line number",  nullptr},
+    {"verbose",              'v', G_OPTION_FLAG_NO_ARG,
+                             G_OPTION_ARG_CALLBACK,    (gpointer) &parse_verbose,      "Prefix each line of output with all of the above",                     nullptr},
+    {"no-glyph-names", 0, G_OPTION_FLAG_REVERSE,
+                             G_OPTION_ARG_NONE,        &this->show_glyph_names,        "Output glyph indices instead of names",                                nullptr},
+    {"no-positions",   0, G_OPTION_FLAG_REVERSE,
+                             G_OPTION_ARG_NONE,        &this->show_positions,          "Do not output glyph positions",                                        nullptr},
+    {"no-advances",    0, G_OPTION_FLAG_REVERSE,
+                             G_OPTION_ARG_NONE,        &this->show_advances,           "Do not output glyph advances",                                         nullptr},
+    {"no-clusters",    0, G_OPTION_FLAG_REVERSE,
+                             G_OPTION_ARG_NONE,        &this->show_clusters,           "Do not output cluster indices",                                        nullptr},
+    {"show-extents",   0, 0, G_OPTION_ARG_NONE,        &this->show_extents,            "Output glyph extents",                                                 nullptr},
+    {"show-flags",     0, 0, G_OPTION_ARG_NONE,        &this->show_flags,              "Output glyph flags",                                                   nullptr},
+    {"ned",          'v', G_OPTION_FLAG_NO_ARG,
+                             G_OPTION_ARG_CALLBACK,    (gpointer) &parse_ned,          "No Extra Data; Do not output clusters or advances",                    nullptr},
+    {"trace",        'V', 0, G_OPTION_ARG_NONE,        &this->trace,                   "Output interim shaping results",                                       nullptr},
+    {nullptr}
+  };
+  parser->add_group (entries,
+                    "output-syntax",
+                    "Output syntax:\n"
+        "    text: [<glyph name or index>=<glyph cluster index within input>@<horizontal displacement>,<vertical displacement>+<horizontal advance>,<vertical advance>|...]\n"
+        "    json: [{\"g\": <glyph name or index>, \"ax\": <horizontal advance>, \"ay\": <vertical advance>, \"dx\": <horizontal displacement>, \"dy\": <vertical displacement>, \"cl\": <glyph cluster index within input>}, ...]\n"
+        "\nOutput syntax options:",
+                    "Options for the syntax of the output",
+                    this);
+}
+
+#endif
diff --git a/util/shape-options.hh b/util/shape-options.hh
new file mode 100644 (file)
index 0000000..806b34b
--- /dev/null
@@ -0,0 +1,323 @@
+/*
+ * Copyright © 2011  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 SHAPE_OPTIONS_HH
+#define SHAPE_OPTIONS_HH
+
+#include "options.hh"
+
+struct shape_options_t
+{
+  ~shape_options_t ()
+  {
+    g_free (direction);
+    g_free (language);
+    g_free (script);
+    free (features);
+    g_strfreev (shapers);
+  }
+
+  void add_options (option_parser_t *parser);
+
+  void setup_buffer (hb_buffer_t *buffer)
+  {
+    hb_buffer_set_direction (buffer, hb_direction_from_string (direction, -1));
+    hb_buffer_set_script (buffer, hb_script_from_string (script, -1));
+    hb_buffer_set_language (buffer, hb_language_from_string (language, -1));
+    hb_buffer_set_flags (buffer, (hb_buffer_flags_t)
+                                (HB_BUFFER_FLAG_DEFAULT |
+                                 (bot ? HB_BUFFER_FLAG_BOT : 0) |
+                                 (eot ? HB_BUFFER_FLAG_EOT : 0) |
+                                 (verify ? HB_BUFFER_FLAG_VERIFY : 0) |
+                                 (preserve_default_ignorables ? HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES : 0) |
+                                 (remove_default_ignorables ? HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES : 0) |
+                                 0));
+    hb_buffer_set_invisible_glyph (buffer, invisible_glyph);
+    hb_buffer_set_not_found_glyph (buffer, not_found_glyph);
+    hb_buffer_set_cluster_level (buffer, cluster_level);
+    hb_buffer_guess_segment_properties (buffer);
+  }
+
+  void populate_buffer (hb_buffer_t *buffer, const char *text, int text_len,
+                       const char *text_before, const char *text_after)
+  {
+    hb_buffer_clear_contents (buffer);
+    if (text_before) {
+      unsigned int len = strlen (text_before);
+      hb_buffer_add_utf8 (buffer, text_before, len, len, 0);
+    }
+    hb_buffer_add_utf8 (buffer, text, text_len, 0, text_len);
+    if (text_after) {
+      hb_buffer_add_utf8 (buffer, text_after, -1, 0, 0);
+    }
+
+    if (!utf8_clusters) {
+      /* Reset cluster values to refer to Unicode character index
+       * instead of UTF-8 index. */
+      unsigned int num_glyphs = hb_buffer_get_length (buffer);
+      hb_glyph_info_t *info = hb_buffer_get_glyph_infos (buffer, nullptr);
+      for (unsigned int i = 0; i < num_glyphs; i++)
+      {
+       info->cluster = i;
+       info++;
+      }
+    }
+
+    setup_buffer (buffer);
+  }
+
+  hb_bool_t shape (hb_font_t *font, hb_buffer_t *buffer, const char **error=nullptr)
+  {
+    if (!hb_shape_full (font, buffer, features, num_features, shapers))
+    {
+      if (error)
+       *error = "Shaping failed.";
+      goto fail;
+    }
+
+    if (normalize_glyphs)
+      hb_buffer_normalize_glyphs (buffer);
+
+    return true;
+
+  fail:
+    return false;
+  }
+
+  void shape_closure (const char *text, int text_len,
+                     hb_font_t *font, hb_buffer_t *buffer,
+                     hb_set_t *glyphs)
+  {
+    hb_buffer_reset (buffer);
+    hb_buffer_add_utf8 (buffer, text, text_len, 0, text_len);
+    setup_buffer (buffer);
+    hb_ot_shape_glyphs_closure (font, buffer, features, num_features, glyphs);
+  }
+
+  /* Buffer properties */
+  char *direction = nullptr;
+  char *language = nullptr;
+  char *script = nullptr;
+
+  /* Buffer flags */
+  hb_bool_t bot = false;
+  hb_bool_t eot = false;
+  hb_bool_t preserve_default_ignorables = false;
+  hb_bool_t remove_default_ignorables = false;
+
+  hb_feature_t *features = nullptr;
+  unsigned int num_features = 0;
+  char **shapers = nullptr;
+  hb_bool_t utf8_clusters = false;
+  hb_codepoint_t invisible_glyph = 0;
+  hb_codepoint_t not_found_glyph = 0;
+  hb_buffer_cluster_level_t cluster_level = HB_BUFFER_CLUSTER_LEVEL_DEFAULT;
+  hb_bool_t normalize_glyphs = false;
+  hb_bool_t verify = false;
+  unsigned int num_iterations = 1;
+};
+
+
+static gboolean
+parse_shapers (const char *name G_GNUC_UNUSED,
+              const char *arg,
+              gpointer    data,
+              GError    **error)
+{
+  shape_options_t *shape_opts = (shape_options_t *) data;
+  char **shapers = g_strsplit (arg, ",", 0);
+
+  for (char **shaper = shapers; *shaper; shaper++)
+  {
+    bool found = false;
+    for (const char **hb_shaper = hb_shape_list_shapers (); *hb_shaper; hb_shaper++) {
+      if (strcmp (*shaper, *hb_shaper) == 0)
+      {
+       found = true;
+       break;
+      }
+    }
+    if (!found)
+    {
+      g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
+                  "Unknown or unsupported shaper: %s", *shaper);
+      g_strfreev (shapers);
+      return false;
+    }
+  }
+
+  g_strfreev (shape_opts->shapers);
+  shape_opts->shapers = shapers;
+  return true;
+}
+
+static G_GNUC_NORETURN gboolean
+list_shapers (const char *name G_GNUC_UNUSED,
+             const char *arg G_GNUC_UNUSED,
+             gpointer    data G_GNUC_UNUSED,
+             GError    **error G_GNUC_UNUSED)
+{
+  for (const char **shaper = hb_shape_list_shapers (); *shaper; shaper++)
+    g_printf ("%s\n", *shaper);
+
+  exit(0);
+}
+
+
+static gboolean
+parse_features (const char *name G_GNUC_UNUSED,
+               const char *arg,
+               gpointer    data,
+               GError    **error G_GNUC_UNUSED)
+{
+  shape_options_t *shape_opts = (shape_options_t *) data;
+  char *s = (char *) arg;
+  size_t l = strlen (s);
+  char *p;
+
+  shape_opts->num_features = 0;
+  g_free (shape_opts->features);
+  shape_opts->features = nullptr;
+
+  /* if the string is quoted, strip the quotes */
+  if (s[0] == s[l - 1] && (s[0] == '\"' || s[0] == '\''))
+  {
+    s[l - 1] = '\0';
+    s++;
+  }
+
+  if (!*s)
+    return true;
+
+  /* count the features first, so we can allocate memory */
+  p = s;
+  do {
+    shape_opts->num_features++;
+    p = strchr (p, ',');
+    if (p)
+      p++;
+  } while (p);
+
+  shape_opts->features = (hb_feature_t *) calloc (shape_opts->num_features, sizeof (*shape_opts->features));
+  if (!shape_opts->features)
+    return false;
+
+  /* now do the actual parsing */
+  p = s;
+  shape_opts->num_features = 0;
+  while (p && *p) {
+    char *end = strchr (p, ',');
+    if (hb_feature_from_string (p, end ? end - p : -1, &shape_opts->features[shape_opts->num_features]))
+      shape_opts->num_features++;
+    p = end ? end + 1 : nullptr;
+  }
+
+  return true;
+}
+
+void
+shape_options_t::add_options (option_parser_t *parser)
+{
+  GOptionEntry entries[] =
+  {
+    {"list-shapers",   0, G_OPTION_FLAG_NO_ARG,
+                             G_OPTION_ARG_CALLBACK,    (gpointer) &list_shapers,       "List available shapers and quit",      nullptr},
+    {"shaper",         0, G_OPTION_FLAG_HIDDEN,
+                             G_OPTION_ARG_CALLBACK,    (gpointer) &parse_shapers,      "Hidden duplicate of --shapers",        nullptr},
+    {"shapers",                0, 0, G_OPTION_ARG_CALLBACK,    (gpointer) &parse_shapers,      "Set comma-separated list of shapers to try","list"},
+    {"direction",      0, 0, G_OPTION_ARG_STRING,      &this->direction,               "Set text direction (default: auto)",   "ltr/rtl/ttb/btt"},
+    {"language",       0, 0, G_OPTION_ARG_STRING,      &this->language,                "Set text language (default: $LANG)",   "BCP 47 tag"},
+    {"script",         0, 0, G_OPTION_ARG_STRING,      &this->script,                  "Set text script (default: auto)",      "ISO-15924 tag"},
+    {"bot",            0, 0, G_OPTION_ARG_NONE,        &this->bot,                     "Treat text as beginning-of-paragraph", nullptr},
+    {"eot",            0, 0, G_OPTION_ARG_NONE,        &this->eot,                     "Treat text as end-of-paragraph",       nullptr},
+    {"preserve-default-ignorables",0, 0, G_OPTION_ARG_NONE,    &this->preserve_default_ignorables,     "Preserve Default-Ignorable characters",        nullptr},
+    {"remove-default-ignorables",0, 0, G_OPTION_ARG_NONE,      &this->remove_default_ignorables,       "Remove Default-Ignorable characters",  nullptr},
+    {"invisible-glyph",        0, 0, G_OPTION_ARG_INT,         &this->invisible_glyph,         "Glyph value to replace Default-Ignorables with",       nullptr},
+    {"not-found-glyph",        0, 0, G_OPTION_ARG_INT,         &this->not_found_glyph,         "Glyph value to replace not-found characters with",     nullptr},
+    {"utf8-clusters",  0, 0, G_OPTION_ARG_NONE,        &this->utf8_clusters,           "Use UTF8 byte indices, not char indices",      nullptr},
+    {"cluster-level",  0, 0, G_OPTION_ARG_INT,         &this->cluster_level,           "Cluster merging level (default: 0)",   "0/1/2"},
+    {"normalize-glyphs",0, 0, G_OPTION_ARG_NONE,       &this->normalize_glyphs,        "Rearrange glyph clusters in nominal order",    nullptr},
+    {"verify",         0, 0, G_OPTION_ARG_NONE,        &this->verify,                  "Perform sanity checks on shaping results",     nullptr},
+    {"num-iterations", 'n', G_OPTION_FLAG_IN_MAIN,
+                             G_OPTION_ARG_INT,         &this->num_iterations,          "Run shaper N times (default: 1)",      "N"},
+    {nullptr}
+  };
+  parser->add_group (entries,
+                    "shape",
+                    "Shape options:",
+                    "Options for the shaping process",
+                    this);
+
+  const gchar *features_help = "Comma-separated list of font features\n"
+    "\n"
+    "    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 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"
+    "    refer to UTF-8 byte indices. The position before the first character\n"
+    "    is always 0.\n"
+    "\n"
+    "    The format is Python-esque.  Here is how it all works:\n"
+    "\n"
+    "      Syntax:       Value:    Start:    End:\n"
+    "\n"
+    "    Setting value:\n"
+    "      \"kern\"        1         0         ∞         # Turn feature on\n"
+    "      \"+kern\"       1         0         ∞         # Turn feature on\n"
+    "      \"-kern\"       0         0         ∞         # Turn feature off\n"
+    "      \"kern=0\"      0         0         ∞         # Turn feature off\n"
+    "      \"kern=1\"      1         0         ∞         # Turn feature on\n"
+    "      \"aalt=2\"      2         0         ∞         # Choose 2nd alternate\n"
+    "\n"
+    "    Setting index:\n"
+    "      \"kern[]\"      1         0         ∞         # Turn feature on\n"
+    "      \"kern[:]\"     1         0         ∞         # Turn feature on\n"
+    "      \"kern[5:]\"    1         5         ∞         # Turn feature on, partial\n"
+    "      \"kern[:5]\"    1         0         5         # Turn feature on, partial\n"
+    "      \"kern[3:5]\"   1         3         5         # Turn feature on, range\n"
+    "      \"kern[3]\"     1         3         3+1       # Turn feature on, single char\n"
+    "\n"
+    "    Mixing it all:\n"
+    "\n"
+    "      \"aalt[3:5]=2\" 2         3         5         # Turn 2nd alternate on for range";
+
+  GOptionEntry entries2[] =
+  {
+    {"features",       0, 0, G_OPTION_ARG_CALLBACK,    (gpointer) &parse_features,     features_help,  "list"},
+    {nullptr}
+  };
+  parser->add_group (entries2,
+                    "features",
+                    "Features options:",
+                    "Options for font features used",
+                    this);
+}
+
+#endif
diff --git a/util/text-options.hh b/util/text-options.hh
new file mode 100644 (file)
index 0000000..5ea0a2d
--- /dev/null
@@ -0,0 +1,370 @@
+/*
+ * Copyright © 2011  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 TEXT_OPTIONS_HH
+#define TEXT_OPTIONS_HH
+
+#include "options.hh"
+
+struct text_options_t
+{
+  text_options_t ()
+  : gs (g_string_new (nullptr))
+  {}
+  ~text_options_t ()
+  {
+    g_free (text);
+    g_free (text_file);
+    if (gs)
+      g_string_free (gs, true);
+    if (in_fp && in_fp != stdin)
+      fclose (in_fp);
+  }
+
+  void add_options (option_parser_t *parser);
+
+  void post_parse (GError **error G_GNUC_UNUSED)
+  {
+    if (!text && !text_file)
+      text_file = g_strdup ("-");
+
+    if (text && text_file)
+    {
+      g_set_error (error,
+                  G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
+                  "Only one of text and text-file can be set");
+      return;
+    }
+
+    if (text_file)
+    {
+      if (0 != strcmp (text_file, "-"))
+       in_fp = fopen (text_file, "r");
+      else
+       in_fp = stdin;
+
+      if (!in_fp)
+       g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_FAILED,
+                    "Failed opening text file `%s': %s",
+                    text_file, strerror (errno));
+    }
+  }
+
+  const char *get_line (unsigned int *len);
+
+  int text_len = -1;
+  char *text = nullptr;
+  char *text_file = nullptr;
+
+  private:
+  FILE *in_fp = nullptr;
+  GString *gs = nullptr;
+  char *line = nullptr;
+  unsigned line_len = UINT_MAX;
+  hb_bool_t single_par = false;
+};
+
+struct shape_text_options_t : text_options_t
+{
+  ~shape_text_options_t ()
+  {
+    g_free (text_before);
+    g_free (text_after);
+  }
+
+  void add_options (option_parser_t *parser);
+
+  char *text_before = nullptr;
+  char *text_after = nullptr;
+};
+
+
+static gboolean
+parse_text (const char *name G_GNUC_UNUSED,
+           const char *arg,
+           gpointer    data,
+           GError    **error G_GNUC_UNUSED)
+{
+  text_options_t *text_opts = (text_options_t *) data;
+
+  if (text_opts->text)
+  {
+    g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
+                "Either --text or --unicodes can be provided but not both");
+    return false;
+  }
+
+  text_opts->text_len = -1;
+  text_opts->text = g_strdup (arg);
+  return true;
+}
+
+static bool
+encode_unicodes (const char *unicodes,
+                GString    *gs,
+                GError    **error)
+{
+#define DELIMITERS "<+->{},;&#\\xXuUnNiI\n\t\v\f\r "
+
+  char *s = (char *) unicodes;
+  char *p;
+
+  while (s && *s)
+  {
+    while (*s && strchr (DELIMITERS, *s))
+      s++;
+    if (!*s)
+      break;
+
+    errno = 0;
+    hb_codepoint_t u = strtoul (s, &p, 16);
+    if (errno || s == p)
+    {
+      g_string_free (gs, TRUE);
+      g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
+                  "Failed parsing Unicode value at: '%s'", s);
+      return false;
+    }
+
+    g_string_append_unichar (gs, u);
+
+    s = p;
+  }
+
+#undef DELIMITERS
+
+  return true;
+}
+
+static gboolean
+parse_unicodes (const char *name G_GNUC_UNUSED,
+               const char *arg,
+               gpointer    data,
+               GError    **error G_GNUC_UNUSED)
+{
+  text_options_t *text_opts = (text_options_t *) data;
+
+  if (text_opts->text)
+  {
+    g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
+                "Either --text or --unicodes can be provided but not both");
+    return false;
+  }
+
+  GString *gs = g_string_new (nullptr);
+  if (0 == strcmp (arg, "*"))
+    g_string_append_c (gs, '*');
+  else
+    if (!encode_unicodes (arg, gs, error))
+      return false;
+
+  text_opts->text_len = gs->len;
+  text_opts->text = g_string_free (gs, FALSE);
+  return true;
+}
+
+static gboolean
+parse_text_before (const char *name G_GNUC_UNUSED,
+                  const char *arg,
+                  gpointer    data,
+                  GError    **error)
+{
+  auto *opts = (shape_text_options_t *) data;
+
+  if (opts->text_before)
+  {
+    g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
+                "Either --text-before or --unicodes-before can be provided but not both");
+    return false;
+  }
+
+  opts->text_before = g_strdup (arg);
+  fprintf(stderr, "%s\n", opts->text_before);
+  return true;
+}
+
+static gboolean
+parse_unicodes_before (const char *name G_GNUC_UNUSED,
+                      const char *arg,
+                      gpointer    data,
+                      GError    **error)
+{
+  auto *opts = (shape_text_options_t *) data;
+
+  if (opts->text_before)
+  {
+    g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
+                "Either --text-before or --unicodes-before can be provided but not both");
+    return false;
+  }
+
+  GString *gs = g_string_new (nullptr);
+  if (!encode_unicodes (arg, gs, error))
+    return false;
+
+  opts->text_before = g_string_free (gs, FALSE);
+  return true;
+}
+
+static gboolean
+parse_text_after (const char *name G_GNUC_UNUSED,
+                 const char *arg,
+                 gpointer    data,
+                 GError    **error)
+{
+  auto *opts = (shape_text_options_t *) data;
+
+  if (opts->text_after)
+  {
+    g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
+                "Either --text-after or --unicodes-after can be provided but not both");
+    return false;
+  }
+
+  opts->text_after = g_strdup (arg);
+  return true;
+}
+
+static gboolean
+parse_unicodes_after (const char *name G_GNUC_UNUSED,
+                     const char *arg,
+                     gpointer    data,
+                     GError    **error)
+{
+  auto *opts = (shape_text_options_t *) data;
+
+  if (opts->text_after)
+  {
+    g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
+                "Either --text-after or --unicodes-after can be provided but not both");
+    return false;
+  }
+
+  GString *gs = g_string_new (nullptr);
+  if (!encode_unicodes (arg, gs, error))
+    return false;
+
+  opts->text_after = g_string_free (gs, FALSE);
+  return true;
+}
+
+const char *
+text_options_t::get_line (unsigned int *len)
+{
+  if (text)
+  {
+    if (!line)
+    {
+      line = text;
+      line_len = text_len;
+    }
+    if (line_len == UINT_MAX)
+      line_len = strlen (line);
+
+    if (!line_len)
+    {
+      *len = 0;
+      return nullptr;
+    }
+
+    const char *ret = line;
+    const char *p = single_par ? nullptr : (const char *) memchr (line, '\n', line_len);
+    unsigned int ret_len;
+    if (!p)
+    {
+      ret_len = line_len;
+      line += ret_len;
+      line_len = 0;
+    }
+    else
+    {
+      ret_len = p - ret;
+      line += ret_len + 1;
+      line_len -= ret_len + 1;
+    }
+
+    *len = ret_len;
+    return ret;
+  }
+
+  g_string_set_size (gs, 0);
+  char buf[BUFSIZ];
+  while (fgets (buf, sizeof (buf), in_fp))
+  {
+    unsigned bytes = strlen (buf);
+    if (!single_par && bytes && buf[bytes - 1] == '\n')
+    {
+      bytes--;
+      g_string_append_len (gs, buf, bytes);
+      break;
+    }
+    g_string_append_len (gs, buf, bytes);
+  }
+  if (ferror (in_fp))
+    fail (false, "Failed reading text: %s", strerror (errno));
+  *len = gs->len;
+  return !*len && feof (in_fp) ? nullptr : gs->str;
+}
+
+void
+text_options_t::add_options (option_parser_t *parser)
+{
+  GOptionEntry entries[] =
+  {
+    {"text",           0, 0, G_OPTION_ARG_CALLBACK,    (gpointer) &parse_text,         "Set input text",                       "string"},
+    {"text-file",      0, 0, G_OPTION_ARG_STRING,      &this->text_file,               "Set input text file-name",             "filename"},
+    {"unicodes",      'u', 0, G_OPTION_ARG_CALLBACK,   (gpointer) &parse_unicodes,     "Set input Unicode codepoints",         "list of hex numbers"},
+    {"single-par",     0, 0, G_OPTION_ARG_NONE,        &this->single_par,              "Treat text as single paragraph",       nullptr},
+    {nullptr}
+  };
+  parser->add_group (entries,
+                    "text",
+                    "Text options:\n\nIf no text is provided, standard input is used for input.\n",
+                    "Options for the input text",
+                    this);
+}
+
+void
+shape_text_options_t::add_options (option_parser_t *parser)
+{
+  text_options_t::add_options (parser);
+
+  GOptionEntry entries[] =
+  {
+    {"text-before",    0, 0, G_OPTION_ARG_CALLBACK,    (gpointer) &parse_text_before,          "Set text context before each line",    "string"},
+    {"text-after",     0, 0, G_OPTION_ARG_CALLBACK,    (gpointer) &parse_text_after,           "Set text context after each line",     "string"},
+    {"unicodes-before",        0, 0, G_OPTION_ARG_CALLBACK,    (gpointer) &parse_unicodes_before,      "Set Unicode codepoints context before each line",      "list of hex numbers"},
+    {"unicodes-after", 0, 0, G_OPTION_ARG_CALLBACK,    (gpointer) &parse_unicodes_after,       "Set Unicode codepoints context after each line",       "list of hex numbers"},
+    {nullptr}
+  };
+  parser->add_group (entries,
+                    "text-context",
+                    "Textual context options:",
+                    "Options for the input context text",
+                    this);
+}
+
+#endif
diff --git a/util/view-cairo.cc b/util/view-cairo.cc
deleted file mode 100644 (file)
index 0db3306..0000000
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Copyright © 2011  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
- */
-
-#include "view-cairo.hh"
-
-#include <assert.h>
-
-
-void
-view_cairo_t::render (const font_options_t *font_opts)
-{
-  bool vertical = HB_DIRECTION_IS_VERTICAL (direction);
-  int vert  = vertical ? 1 : 0;
-  int horiz = vertical ? 0 : 1;
-
-  int x_sign = font_opts->font_size_x < 0 ? -1 : +1;
-  int y_sign = font_opts->font_size_y < 0 ? -1 : +1;
-
-  hb_font_t *font = font_opts->get_font();
-
-  view_options_t::font_extents_t extents = view_options.font_extents;
-  if (!view_options.have_font_extents)
-  {
-    hb_font_extents_t hb_extents;
-    hb_font_get_extents_for_direction (font, direction, &hb_extents);
-    extents.ascent = scalbn ((double) hb_extents.ascender, scale_bits);
-    extents.descent = -scalbn ((double) hb_extents.descender, scale_bits);
-    extents.line_gap = scalbn ((double) hb_extents.line_gap, scale_bits);
-  }
-
-  double ascent = y_sign * extents.ascent;
-  double descent = y_sign * extents.descent;
-  double line_gap = y_sign * extents.line_gap + view_options.line_space;
-  double leading = ascent + descent + line_gap;
-
-  /* Calculate surface size. */
-  double w = 0, h = 0;
-  (vertical ? w : h) = (int) lines->len * leading - (extents.line_gap + view_options.line_space);
-  (vertical ? h : w) = 0;
-  for (unsigned int i = 0; i < lines->len; i++) {
-    helper_cairo_line_t &line = g_array_index (lines, helper_cairo_line_t, i);
-    double x_advance, y_advance;
-    line.get_advance (&x_advance, &y_advance);
-    if (vertical)
-      h =  MAX (h, y_sign * y_advance);
-    else
-      w =  MAX (w, x_sign * x_advance);
-  }
-
-  cairo_scaled_font_t *scaled_font = helper_cairo_create_scaled_font (font_opts);
-
-  /* See if font needs color. */
-  cairo_content_t content = CAIRO_CONTENT_ALPHA;
-  if (helper_cairo_scaled_font_has_color (scaled_font))
-    content = CAIRO_CONTENT_COLOR;
-
-  /* Create surface. */
-  cairo_t *cr = helper_cairo_create_context (w + view_options.margin.l + view_options.margin.r,
-                                            h + view_options.margin.t + view_options.margin.b,
-                                            &view_options, &output_options, content);
-  cairo_set_scaled_font (cr, scaled_font);
-
-  /* Setup coordinate system. */
-  cairo_translate (cr, view_options.margin.l, view_options.margin.t);
-  if (vertical)
-    cairo_translate (cr,
-                    w - ascent, /* We currently always stack lines right to left */
-                    y_sign < 0 ? h : 0);
-  else
-   {
-    cairo_translate (cr,
-                    x_sign < 0 ? w : 0,
-                    y_sign < 0 ? descent : ascent);
-   }
-
-  /* Draw. */
-  cairo_translate (cr, +vert * leading, -horiz * leading);
-  for (unsigned int i = 0; i < lines->len; i++)
-  {
-    helper_cairo_line_t &l = g_array_index (lines, helper_cairo_line_t, i);
-
-    cairo_translate (cr, -vert * leading, +horiz * leading);
-
-    if (view_options.annotate) {
-      cairo_save (cr);
-
-      /* Draw actual glyph origins */
-      cairo_set_source_rgba (cr, 1., 0., 0., .5);
-      cairo_set_line_width (cr, 5);
-      cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND);
-      for (unsigned i = 0; i < l.num_glyphs; i++) {
-       cairo_move_to (cr, l.glyphs[i].x, l.glyphs[i].y);
-       cairo_rel_line_to (cr, 0, 0);
-      }
-      cairo_stroke (cr);
-
-      cairo_restore (cr);
-    }
-
-    if (0 && cairo_surface_get_type (cairo_get_target (cr)) == CAIRO_SURFACE_TYPE_IMAGE) {
-      /* cairo_show_glyphs() doesn't support subpixel positioning */
-      cairo_glyph_path (cr, l.glyphs, l.num_glyphs);
-      cairo_fill (cr);
-    } else if (l.num_clusters)
-      cairo_show_text_glyphs (cr,
-                             l.utf8, l.utf8_len,
-                             l.glyphs, l.num_glyphs,
-                             l.clusters, l.num_clusters,
-                             l.cluster_flags);
-    else
-      cairo_show_glyphs (cr, l.glyphs, l.num_glyphs);
-  }
-
-  /* Clean up. */
-  helper_cairo_destroy_context (cr);
-  cairo_scaled_font_destroy (scaled_font);
-}
index 1f51f0e..1578f13 100644 (file)
 #ifndef VIEW_CAIRO_HH
 #define VIEW_CAIRO_HH
 
-#include "hb.hh"
-#include "options.hh"
+#include "view-options.hh"
+#include "output-options.hh"
 #include "helper-cairo.hh"
 
-
-struct view_cairo_t
+struct view_cairo_t : view_options_t, output_options_t<>
 {
-  view_cairo_t (option_parser_t *parser)
-              : output_options (parser, helper_cairo_supported_formats),
-                view_options (parser),
-                direction (HB_DIRECTION_INVALID),
-                lines (0), scale_bits (0) {}
-  ~view_cairo_t () {
+  ~view_cairo_t ()
+  {
     cairo_debug_reset_static_data ();
   }
 
+  void add_options (option_parser_t *parser)
+  {
+    parser->set_summary ("View text with given font.");
+    view_options_t::add_options (parser);
+    output_options_t::add_options (parser, helper_cairo_supported_formats);
+  }
+
   void init (hb_buffer_t *buffer, const font_options_t *font_opts)
   {
     lines = g_array_new (false, false, sizeof (helper_cairo_line_t));
@@ -82,14 +84,123 @@ struct view_cairo_t
 
   protected:
 
-  output_options_t output_options;
-  view_options_t view_options;
-
   void render (const font_options_t *font_opts);
 
-  hb_direction_t direction; // Remove this, make segment_properties accessible
-  GArray *lines;
-  int scale_bits;
+  hb_direction_t direction = HB_DIRECTION_INVALID; // Remove this, make segment_properties accessible
+  GArray *lines = nullptr;
+  int scale_bits = 0;
 };
 
+inline void
+view_cairo_t::render (const font_options_t *font_opts)
+{
+  bool vertical = HB_DIRECTION_IS_VERTICAL (direction);
+  int vert  = vertical ? 1 : 0;
+  int horiz = vertical ? 0 : 1;
+
+  int x_sign = font_opts->font_size_x < 0 ? -1 : +1;
+  int y_sign = font_opts->font_size_y < 0 ? -1 : +1;
+
+  hb_font_t *font = font_opts->font;
+
+  if (!have_font_extents)
+  {
+    hb_font_extents_t hb_extents;
+    hb_font_get_extents_for_direction (font, direction, &hb_extents);
+    font_extents.ascent = scalbn ((double) hb_extents.ascender, scale_bits);
+    font_extents.descent = -scalbn ((double) hb_extents.descender, scale_bits);
+    font_extents.line_gap = scalbn ((double) hb_extents.line_gap, scale_bits);
+    have_font_extents = true;
+  }
+
+  double ascent = y_sign * font_extents.ascent;
+  double descent = y_sign * font_extents.descent;
+  double line_gap = y_sign * font_extents.line_gap + line_space;
+  double leading = ascent + descent + line_gap;
+
+  /* Calculate surface size. */
+  double w = 0, h = 0;
+  (vertical ? w : h) = (int) lines->len * leading - (font_extents.line_gap + line_space);
+  (vertical ? h : w) = 0;
+  for (unsigned int i = 0; i < lines->len; i++) {
+    helper_cairo_line_t &line = g_array_index (lines, helper_cairo_line_t, i);
+    double x_advance, y_advance;
+    line.get_advance (&x_advance, &y_advance);
+    if (vertical)
+      h =  MAX (h, y_sign * y_advance);
+    else
+      w =  MAX (w, x_sign * x_advance);
+  }
+
+  cairo_scaled_font_t *scaled_font = helper_cairo_create_scaled_font (font_opts);
+
+  /* See if font needs color. */
+  cairo_content_t content = CAIRO_CONTENT_ALPHA;
+  if (helper_cairo_scaled_font_has_color (scaled_font))
+    content = CAIRO_CONTENT_COLOR;
+
+  /* Create surface. */
+  cairo_t *cr = helper_cairo_create_context (w + margin.l + margin.r,
+                                            h + margin.t + margin.b,
+                                            this,
+                                            this,
+                                            content);
+  cairo_set_scaled_font (cr, scaled_font);
+
+  /* Setup coordinate system. */
+  cairo_translate (cr, margin.l, margin.t);
+  if (vertical)
+    cairo_translate (cr,
+                    w - ascent, /* We currently always stack lines right to left */
+                    y_sign < 0 ? h : 0);
+  else
+   {
+    cairo_translate (cr,
+                    x_sign < 0 ? w : 0,
+                    y_sign < 0 ? descent : ascent);
+   }
+
+  /* Draw. */
+  cairo_translate (cr, +vert * leading, -horiz * leading);
+  for (unsigned int i = 0; i < lines->len; i++)
+  {
+    helper_cairo_line_t &l = g_array_index (lines, helper_cairo_line_t, i);
+
+    cairo_translate (cr, -vert * leading, +horiz * leading);
+
+    if (annotate) {
+      cairo_save (cr);
+
+      /* Draw actual glyph origins */
+      cairo_set_source_rgba (cr, 1., 0., 0., .5);
+      cairo_set_line_width (cr, 5);
+      cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND);
+      for (unsigned i = 0; i < l.num_glyphs; i++) {
+       cairo_move_to (cr, l.glyphs[i].x, l.glyphs[i].y);
+       cairo_rel_line_to (cr, 0, 0);
+      }
+      cairo_stroke (cr);
+
+      cairo_restore (cr);
+    }
+
+    if (0 && cairo_surface_get_type (cairo_get_target (cr)) == CAIRO_SURFACE_TYPE_IMAGE) {
+      /* cairo_show_glyphs() doesn't support subpixel positioning */
+      cairo_glyph_path (cr, l.glyphs, l.num_glyphs);
+      cairo_fill (cr);
+    } else if (l.num_clusters)
+      cairo_show_text_glyphs (cr,
+                             l.utf8, l.utf8_len,
+                             l.glyphs, l.num_glyphs,
+                             l.clusters, l.num_clusters,
+                             l.cluster_flags);
+    else
+      cairo_show_glyphs (cr, l.glyphs, l.num_glyphs);
+  }
+
+  /* Clean up. */
+  helper_cairo_destroy_context (cr);
+  cairo_scaled_font_destroy (scaled_font);
+}
+
 #endif
diff --git a/util/view-options.hh b/util/view-options.hh
new file mode 100644 (file)
index 0000000..322009a
--- /dev/null
@@ -0,0 +1,123 @@
+/*
+ * Copyright © 2011  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 VIEW_OPTIONS_HH
+#define VIEW_OPTIONS_HH
+
+#include "options.hh"
+
+#define DEFAULT_MARGIN 16
+#define DEFAULT_FORE "#000000"
+#define DEFAULT_BACK "#FFFFFF"
+
+struct view_options_t
+{
+  ~view_options_t ()
+  {
+    g_free (fore);
+    g_free (back);
+  }
+
+  void add_options (option_parser_t *parser);
+
+  hb_bool_t annotate = false;
+  char *fore = nullptr;
+  char *back = nullptr;
+  double line_space = 0;
+  bool have_font_extents = false;
+  struct font_extents_t {
+    double ascent, descent, line_gap;
+  } font_extents = {0., 0., 0.};
+  struct margin_t {
+    double t, r, b, l;
+  } margin = {DEFAULT_MARGIN, DEFAULT_MARGIN, DEFAULT_MARGIN, DEFAULT_MARGIN};
+};
+
+
+static gboolean
+parse_font_extents (const char *name G_GNUC_UNUSED,
+                   const char *arg,
+                   gpointer    data,
+                   GError    **error G_GNUC_UNUSED)
+{
+  view_options_t *view_opts = (view_options_t *) data;
+  view_options_t::font_extents_t &e = view_opts->font_extents;
+  switch (sscanf (arg, "%lf%*[ ,]%lf%*[ ,]%lf", &e.ascent, &e.descent, &e.line_gap)) {
+    case 1: HB_FALLTHROUGH;
+    case 2: HB_FALLTHROUGH;
+    case 3:
+      view_opts->have_font_extents = true;
+      return true;
+    default:
+      g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
+                  "%s argument should be one to three space-separated numbers",
+                  name);
+      return false;
+  }
+}
+
+static gboolean
+parse_margin (const char *name G_GNUC_UNUSED,
+             const char *arg,
+             gpointer    data,
+             GError    **error G_GNUC_UNUSED)
+{
+  view_options_t *view_opts = (view_options_t *) data;
+  view_options_t::margin_t &m = view_opts->margin;
+  switch (sscanf (arg, "%lf%*[ ,]%lf%*[ ,]%lf%*[ ,]%lf", &m.t, &m.r, &m.b, &m.l)) {
+    case 1: m.r = m.t; HB_FALLTHROUGH;
+    case 2: m.b = m.t; HB_FALLTHROUGH;
+    case 3: m.l = m.r; HB_FALLTHROUGH;
+    case 4: return true;
+    default:
+      g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
+                  "%s argument should be one to four space-separated numbers",
+                  name);
+      return false;
+  }
+}
+
+void
+view_options_t::add_options (option_parser_t *parser)
+{
+  GOptionEntry entries[] =
+  {
+    {"annotate",       0, 0, G_OPTION_ARG_NONE,        &this->annotate,                "Annotate output rendering",                            nullptr},
+    {"background",     0, 0, G_OPTION_ARG_STRING,      &this->back,                    "Set background color (default: " DEFAULT_BACK ")",     "rrggbb/rrggbbaa"},
+    {"foreground",     0, 0, G_OPTION_ARG_STRING,      &this->fore,                    "Set foreground color (default: " DEFAULT_FORE ")",     "rrggbb/rrggbbaa"},
+    {"line-space",     0, 0, G_OPTION_ARG_DOUBLE,      &this->line_space,              "Set space between lines (default: 0)",                 "units"},
+    {"font-extents",   0, 0, G_OPTION_ARG_CALLBACK,    (gpointer) &parse_font_extents, "Set font ascent/descent/line-gap (default: auto)","one to three numbers"},
+    {"margin",         0, 0, G_OPTION_ARG_CALLBACK,    (gpointer) &parse_margin,       "Margin around output (default: " G_STRINGIFY(DEFAULT_MARGIN) ")","one to four numbers"},
+    {nullptr}
+  };
+  parser->add_group (entries,
+                    "view",
+                    "View options:",
+                    "Options for output rendering",
+                    this);
+}
+
+#endif